Aller au contenu

eLockViolation


sam-123

Messages recommandés

Bonjour aux acadiens, acadiennes

 

Voilà après quelque procédures crées et exécuter tous fonctionné très bien.

Alors j’ai commencé à définir mes types de lignes.

En les créant dans une fonction et on appelant la fonction par la ligne de commande pas de problème

Mais en les appelants par un bouton_poussoir ca cloche !

 

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button.Click

 

Dim myDWG As Autodesk.AutoCAD.ApplicationServices.Document

Dim myDB As Autodesk.AutoCAD.DatabaseServices.Database

Dim myTransMan As Autodesk.AutoCAD.DatabaseServices.TransactionManager

Dim myTrans As Autodesk.AutoCAD.DatabaseServices.Transaction

myDWG = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument

myDB = myDWG.Database

myTransMan = myDWG.TransactionManager

myTrans = myTransMan.StartTransaction

Dim myLT As Autodesk.AutoCAD.DatabaseServices.LinetypeTable

''’’ à la ligne suivante il dit qu’il y a une erreur

myLT = myDB.LinetypeTableId.GetObject(Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite)

 

Dim ltypTbl As LinetypeTable = myTrans.GetObject(myDB.LinetypeTableId, OpenMode.ForRead, False)

Dim Lt1 As Autodesk.AutoCAD.DatabaseServices.LinetypeTableRecord

Lt1 = New Autodesk.AutoCAD.DatabaseServices.LinetypeTableRecord

Lt1.Name = "MonTypedeLigne"

Lt1.Comments = "MonTypedeLigne"

Lt1.NumDashes = 4

Lt1.SetDashLengthAt(0, 1.25)

Lt1.SetDashLengthAt(1, -0.25)

Lt1.SetDashLengthAt(2, 0.25)

Lt1.SetDashLengthAt(3, -0.25)

Lt1.PatternLength = 0.2

myLT.Add(Lt1)

myTrans.AddNewlyCreatedDBObject(Lt1, True)

myTrans.Commit()

myTrans.Dispose()

myTransMan.Dispose()

end sub

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Si tu mets ton code entre des balises bbcode, il sera plus lisible : [code] le code ici [/code] (tu peux utiliser l'icône [#])

 

Si tu utilises des instructions Imports en début de code, tu n'auras pas besoin de répéter toute l'arborescence des espaces de nom dans le code (et ton code sera plus lisible) :

 

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
...
Dim myDWG As Document
Dim myDB As Database
Dim myTransMan As TransactionManager
Dim myTrans As Transaction
myDWG = Application.DocumentManager.MdiActiveDocument
...
Dim myLT As LinetypeTable

Tu ouvres deux fois la table des types de lignes :

myLT = myDB.LinetypeTableId.GetObject(Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite)

Dim ltypTbl As LinetypeTable = myTrans.GetObject(myDB.LinetypeTableId, OpenMode.ForRead, False)

La première fois directement depuis son ObjectId (ce qui est plutôt à éviter), la seconde avec la transaction (c'est la bonne méthode) mais en lecture seule...

 

Fais plutôt :

Dim ltypTbl As LinetypeTable = myTrans.GetObject(myDB.LinetypeTableId, OpenMode.ForWrite)
...
ltypTbl.Add(Lt1)

 

Une dernière chose, regarde dans l'aide > Create and Edit AutoCAD Entities > Open and Close Objects > Use Transactions with the Transaction Manager > Use Transactions with the Transaction Manager comment on utilise un bloc Using / EndUsing qui garantit que la transaction et tous les objets ouvert avec elle seront libérés (évite d'invoquer Dispose()).

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

 

Voilà le code un peu raccourcis

Mais il donne toujours une erreur au n°4

 

 

 

 

Private Sub Cmdltgen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdLTGen.Click

1[ Dim MyDoc As Document = Application.DocumentManager.MdiActiveDocument$]

2[ Dim MyDb As Database = MyDoc.Database]

3[Dim myTrans As Transaction = MyDb.TransactionManager.StartTransaction()]

4[Dim LtypTbl As LinetypeTable = myTrans.GetObject(MyDb.LinetypeTableId, OpenMode.ForRead)]

5[Dim Lt1 As LinetypeTableRecord = New LinetypeTableRecord]

6[Lt1.Name = "Center12"]

7[Lt1.Comments = "Center12"]

8[Lt1.NumDashes = 4]

9[Lt1.SetDashLengthAt(0, 1.25)]

10[Lt1.SetDashLengthAt(1, -0.25)]

11[Lt1.SetDashLengthAt(2, 0.25)]

12[Lt1.SetDashLengthAt(3, -0.25)]

13[Lt1.PatternLength = 0.2]

14[LtypTbl.Add(Lt1)]

15[MYTrans.AddNewlyCreatedDBObject(Lt1, True)]

16[MYTrans.Commit()]

End Sub

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Ce que je ne comprends pas, c’est que quand j’appelle la même fonction dans le commande-line

Cela fonctionne sans problème

Mais une fois que je passe par l’intermédiaire d’une Form ça bloque ?

 

Ma procédure de base :

 

_

Public Sub CrateLineTypes()

Dim myDWG As Autodesk.AutoCAD.ApplicationServices.Document

Dim myDB As Autodesk.AutoCAD.DatabaseServices.Database

Dim myTransMan As Autodesk.AutoCAD.DatabaseServices.TransactionManager

Dim myTrans As Autodesk.AutoCAD.DatabaseServices.Transaction

myDWG = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument

myDB = myDWG.Database

myTransMan = myDWG.TransactionManager

myTrans = myTransMan.StartTransaction

Dim myLT As Autodesk.AutoCAD.DatabaseServices.LinetypeTable

myLT = myDB.LinetypeTableId.GetObject(Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite)

Dim ltypTbl As LinetypeTable = myTrans.GetObject(myDB.LinetypeTableId, OpenMode.ForRead, False)

If Not ltypTbl.Has("Axe") Then

Dim Lt1 As Autodesk.AutoCAD.DatabaseServices.LinetypeTableRecord

Lt1 = New Autodesk.AutoCAD.DatabaseServices.LinetypeTableRecord

Lt1.Name = "Axe"

Lt1.Comments = "Axe"

Lt1.NumDashes = 4

Lt1.SetDashLengthAt(0, 1.25)

Lt1.SetDashLengthAt(1, -0.25)

Lt1.SetDashLengthAt(2, 0.25)

Lt1.SetDashLengthAt(3, -0.25)

Lt1.PatternLength = 0.2

myLT.Add(Lt1)

myTrans.AddNewlyCreatedDBObject(Lt1, True)

myTrans.Commit()

myTrans.Dispose()

myTransMan.Dispose()

End If

End sub

 

Lien vers le commentaire
Partager sur d’autres sites

Les balises bbcodes s'il te plait !...

 

J'ai déjà du mal à lire le VB, alors présenté comme ça sans indentations...

 

Ce que je ne comprends pas, c’est que quand j’appelle la même fonction dans le commande-line

Cela fonctionne sans problème

Mais une fois que je passe par l’intermédiaire d’une Form ça bloque ?

 

C'est que ça vient du code de la Form ou du passage de l'information entre les classes.

 

Qu'est ce que tu as comme message d'erreur ?

As tu essayé d'attraper l'erreur avec un Try/Catch ?

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

OK, ta boite de dialogue doit être Modeless.

Dans ce cas (ainsi que pour les commande en mode Session et l'accès aux documents ouverts autres que le document actif, il faut verrouiller le document. Voir l'aide (AutoCAD .NET Developer's Guide, lien donné plus haut) > Control the AutoCAD Environment > Lock and Unlock a Document

 

Using lockDoc As DocumentLock = myDWG.LockDocument() '' verrouille le document
   Using myTrans As Transaction = myDb.TransactionManager.StartTransaction()

       '' le reste du code dans la transaction ne change pas

       myTrans.Commit()
   End Using '' libère la transaction (remplace myTrans.Dispose()
End Using '' déverrouille le document

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

J’ai réécris avec l’USING mais je crois que j’ai fait une bêtise quelque part.

 

1# Dim MyDoc As Document = Application.DocumentManager.MdiActiveDocument

2# Dim MyDb As Database = MyDoc.Database

3# Using lockDoc As DocumentLock = MyDoc.LockDocument()

4# Dim MyTransMan As Autodesk.AutoCAD.DatabaseServices.TransactionManager

5# Dim MyTrans As Transaction = MyDb.TransactionManager.StartTransaction()

6# MyTransMan = MyDoc.TransactionManager

7# MyTrans = MyTransMan.StartTransaction

8# Using MyTransDoc As Transaction = MyTransMan.StartTransaction()

9# Dim LtypTbl As LinetypeTable

11# LtypTbl = MyDb.LinetypeTableId.GetObject(Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite)

12# Dim Lt1 As Autodesk.AutoCAD.DatabaseServices.LinetypeTableRecord

13# Lt1 = New Autodesk.AutoCAD.DatabaseServices.LinetypeTableRecord

14# Lt1.Name = "Abced"

15# Lt1.Comments = "Abced"

16# Lt1.NumDashes = 4

17# Lt1.SetDashLengthAt(0, 1.25)

18# Lt1.SetDashLengthAt(1, -0.25)

19# Lt1.SetDashLengthAt(2, 0.25)

20# Lt1.SetDashLengthAt(3, -0.25)

21# Lt1.PatternLength = 0.2

22# LtypTbl.Add(Lt1)

23# MyTrans.AddNewlyCreatedDBObject(Lt1, True)

24# End Using

25# End Using

 

Lien vers le commentaire
Partager sur d’autres sites

Lis tu attentivement les réponses que je te fais ?

Lis tu les liens que je te donnes ?

 

Je prends le temps de te faire des réponses lisibles, correctement présentées, avec des liens vers une documentation qui t'aiderait très certainement, et toi tu postes des messages toujours aussi difficiles à lire qui semblent être des assemblages approximatifs de bouts code.

Ceci semble montrer que tu ne comprends pas vraiment ce que tu fais.

 

La programmation est une discipline très exigeante qui demande énormément de rigueur.

Si tu ne fais pas un effort dans ce sens (présentation de tes messages et mise en pratique des conseils donnés) je vais cesser d'essayer de t'aider.

 

Si tu avais bien lu et compris ce que j'ai dit auparavant, au lieu d'écrire 5 lignes de codes redondantes et souvent inutiles:

Dim MyTransMan As Autodesk.AutoCAD.DatabaseServices.TransactionManager
Dim MyTrans As Transaction = MyDb.TransactionManager.StartTransaction()
MyTransMan = MyDoc.TransactionManager
MyTrans = MyTransMan.StartTransaction
Using MyTransDoc As Transaction = MyTransMan.StartTransaction()

 

tu aurais écrit simplement :

Using myTrans As Transaction = myDb.TransactionManager.StartTransaction()

 

Si tu ne fais pas :

myTrans.Commit()

Les changements dans la base de donnée ne sont pas sauvés.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Salut Bazoul,

 

ne sert a rien a part poluer le code

Permet moi de ne pas être d'accord du tout.

 

Une fois les modification faites dans la base de donnée il est impératif de libérer le document précédemment verrouillé.

Pour ce faire, on peut utiliser la méthode Dispose() ou une instruction Using.

Dans les deux cas, il faut bien définir un objet (lockDoc dans l'exemple), pour pouvoir faire soit :

lockDoc.Dispose()

soit

Using (lockDoc As DocumentLock = MyDoc.LockDocument())

 

L'utilisation d'un bloc Using présente l'avantage de garantir que lockDoc sera libéré même si le code est interrompu (exception) avant la fin du bloc.

 

Pour avoir la même garantie en utilisant lockDoc.Dispose(), il faudrait faire un Try / Finally.

 

Je te renvoie à la même source d'information : AutoCAD .NET Developer's Guide > Control the AutoCAD Environment > Lock and Unlock a Document

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je ne sais pas ce que fait exactement le programme de sam-123, mais si je comprends bien, il ouvre une Form Modeless (type boite de dialogue ou palette).

Pour exécuter une procédure à partir de la Form, il faut verrouiller le document. Mais une fois la procédure exécutée, si on ne déverrouille pas le document, l'utilisateur n'y a plus accès...

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité