sam-123 Posté(e) le 1 février 2010 Posté(e) le 1 février 2010 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èmeMais 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
(gile) Posté(e) le 1 février 2010 Posté(e) le 1 février 2010 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 LinetypeTableTu 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
sam-123 Posté(e) le 1 février 2010 Auteur Posté(e) le 1 février 2010 Voilà le code un peu raccourcisMais 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
(gile) Posté(e) le 1 février 2010 Posté(e) le 1 février 2010 Normal, relis bien tout ce que je t'ai dit et compare ta ligne 4 avec ce que je proposais...De plus tu ne libères plus la transaction : Dispose(). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
sam-123 Posté(e) le 1 février 2010 Auteur Posté(e) le 1 février 2010 Oui j’ai écris avec ForWriteMais c’est le même problème Dim LtypTbl As LinetypeTable = myTrans.GetObject(MyDb.LinetypeTableId, OpenMode.ForWrite)
sam-123 Posté(e) le 1 février 2010 Auteur Posté(e) le 1 février 2010 Ce que je ne comprends pas, c’est que quand j’appelle la même fonction dans le commande-lineCela fonctionne sans problèmeMais 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 IfEnd sub
(gile) Posté(e) le 1 février 2010 Posté(e) le 1 février 2010 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-lineCela fonctionne sans problèmeMais 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
sam-123 Posté(e) le 2 février 2010 Auteur Posté(e) le 2 février 2010 Avec Try/CathL’erreur renvoyer est (eLockViolation) Y aurait –il pas une propriété ou un événement à rajouter a un bouton-poussoir(ou la windows-Form elle-même)Pour lui permettre d’appeler une procédure ?
(gile) Posté(e) le 2 février 2010 Posté(e) le 2 février 2010 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
sam-123 Posté(e) le 2 février 2010 Auteur Posté(e) le 2 février 2010 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
(gile) Posté(e) le 2 février 2010 Posté(e) le 2 février 2010 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
sam-123 Posté(e) le 2 février 2010 Auteur Posté(e) le 2 février 2010 Désole pour le temps que je t’ais fait perdreMais finalement ça fonctionne. Merci encore ;) [Edité le 2/2/2010 par sam-123]
bazoul Posté(e) le 2 février 2010 Posté(e) le 2 février 2010 3# Using lockDoc As DocumentLock = MyDoc.LockDocument() ne sert a rien a part poluer le code utilise juste MyDoc.LockDocument() tu gagnera en lisibilité ( pas de using inutile )
(gile) Posté(e) le 2 février 2010 Posté(e) le 2 février 2010 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()soitUsing (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
bazoul Posté(e) le 3 février 2010 Posté(e) le 3 février 2010 Je te permet ^^ Je me pose une question,a quoi sert de déverrouiller un document directement aprés avoir modifier des choses plutôt que de le laisser verrouiller pour effectuer peut être X modification et conclure par une fermeture du document ??
(gile) Posté(e) le 3 février 2010 Posté(e) le 3 février 2010 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant