pat06 Posté(e) le 14 août 2012 Posté(e) le 14 août 2012 Bonjour,je souhaite appliquer une commande développée en vb net pour un ensemble de fichiers dans un répertoire , mais il semble que cela ne soit pas si simple... si quelqu'un pouvait m'aiguiller...le but de cette commande est de forcer les unités des dwg au centimètre.j'utilise aecbaseMgd.dll dans ce projet.'commande sur le fichier courant : <CommandMethod("CH_CENTIMETRES")> _ Public Sub CH_CENTIMETRES() Dim dwg As Document = Application.DocumentManager.MdiActiveDocument Dim db As Database = dwg.Database Using tr As Transaction = db.TransactionManager.StartTransaction Dim objID As ObjectId = DrawingSetupVariables.GetInstance(db, False) Dim dsv As DrawingSetupVariables = tr.GetObject(objID, OpenMode.ForWrite) Dim unite As String = dsv.LinearUnit.ToString dsv.LinearUnit = Autodesk.Aec.BuiltInUnit.Centimeter Dim echelle As String = dsv.DwgScale.ToString tr.Commit() End Using End Sub ' commande portée pour traitement sur répertoire : Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button.Click Dim dir As String = "C:\plans" For Each fichier As String In System.IO.Directory.GetFiles(dir, "*.dwg", SearchOption.AllDirectories) Using db As Database = New Database(False, True) Try db.ReadDwgFile(fichier, FileShare.ReadWrite, True, vbNullString) Using tr As Transaction = db.TransactionManager.StartTransaction Dim objID As ObjectId = DrawingSetupVariables.GetInstance(db, False) Dim dsv As DrawingSetupVariables = tr.GetObject(objID, OpenMode.ForWrite) Dim unite As String = dsv.LinearUnit.ToString dsv.LinearUnit = Autodesk.Aec.BuiltInUnit.Centimeter Dim echelle As String = dsv.DwgScale.ToString tr.Commit() End Using db.SaveAs(fichier, DwgVersion.Current) Catch ex As Exception End Try End Using Next MsgBox("Traitement terminé") End Sub Merci d'avance
Maxence DELANNOY Posté(e) le 14 août 2012 Posté(e) le 14 août 2012 Quel est le problème ? Tu as une erreur ? A la lecture de ton code, il y a un truc qui me choque. Tu attrapes une exception, sans rien en faire. Il faudrait au moins l'écrire dans la trace. Maxence DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
pat06 Posté(e) le 14 août 2012 Auteur Posté(e) le 14 août 2012 Bonjour, la commande "directe" avec le fichier en cours fonctionne parfaitement bien : les unités sont recalées au cm...par contre lorsque je lance l'équivalent sur un répertoire il ne se passe rien. il semble que ça bloque à ce niveau :-> Dim dsv As DrawingSetupVariables = tr.GetObject(objID, OpenMode.ForWrite) en supprimant try ... ça m'éjecte d'autocad... merci
bazoul Posté(e) le 16 août 2012 Posté(e) le 16 août 2012 Si j'ai compris ce que tu veux faire essaie de faire ça : ( testé sur Acad2013 ) Dim dir As String = "C:\plans" For Each fichier As String In System.IO.Directory.GetFiles(dir, "*.dwg", SearchOption.AllDirectories) Using db As Database = New Database(False, True) Try db.ReadDwgFile(fichier, FileShare.ReadWrite, True, vbNullString) Using tr As Transaction = db.TransactionManager.StartTransaction db.Insunits = UnitsValue.Centimeters tr.Commit() End Using db.SaveAs(fichier, DwgVersion.Current) Catch ex As Exception End Try End Using Next MsgBox("Traitement terminé")
Maxence DELANNOY Posté(e) le 16 août 2012 Posté(e) le 16 août 2012 en supprimant try ... ça m'éjecte d'autocad... Faut consulter le rapport .xml si tu as la fenêtre rapport d'erreur. C'est peut être un problème de verrouillage de document. Maxence DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
(gile) Posté(e) le 16 août 2012 Posté(e) le 16 août 2012 Salut, Comme dit Maxence, faire un Try/Catch sans rien dans le bloc Catch ne fait que masquer une erreur. C'est à mon avis, une fort mauvaise pratique en programmation (souvent issue du détestable On Error Resume Next).Il est pourtant bien simple d'utiliser le Catch pour signifier à l'utilisateur (ou au développeur) qu'une exception est survenue ainsi que le type d'erreur. On peut même utiliser plusieurs expressions Catch successives :Try '... Catch ex As Autodesk.AutoCAD.Runtime.Exception MessageBox.Show("Erreur AutoCAD : " & ex.Message & vbCr & ex.StackTrace) Catch ex As System.Exception MessageBox.Show("Erreur Système : " & ex.Message & vbCr & ex.StackTrace) End Try Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
pat06 Posté(e) le 16 août 2012 Auteur Posté(e) le 16 août 2012 Bonsoir, En fait, bazoul ce n'est pas exactement "db.Insunits = UnitsValue.Centimeters" qui me sert sur ce point.j'ai une tonne de fichiers dwg (12 000) dans le cadre de DOE fournis dans de mauvaises unités.Mais paradoxalement ces fichiers ont été travaillé à la bonne unité (centimètre) mais quand ont les ouvre, ils sont dans des unités "autres" millimètres - pouces - mètres... j'utilise déjà les variables comme "db.Measurement = MeasurementValue.Metric" pour passer en unité métrique et non en anglo-saxon. par contre, le besoin est de préciser également les plans au cm (commande -dwgunits) et là ça coince car cette variable autocad architecture ne semble pas fonctionner de la même manière. sauf en lançant la commande créé en direct. mais compte tenu du nombre de fichiers, mon objectif est de faire un traitement par la "db" de ces fichiers... pour en revenir à l'erreur... j'ai essayé de mettre des points d'arrêt en mode débug mais cela n'a rien donnéje vais donc essayer la piste des messages dans les catch merci
(gile) Posté(e) le 16 août 2012 Posté(e) le 16 août 2012 Re, Le problème vient peut-être de l'utilisation de ReadDwgFile() avec une side Database. Toute les fonctionnalités ne sont pas accessibles (essentiellement l'éditeur, mais il est possible que d'autres non plus). Je ne connais pas bien l'espace de nom AecBaseMgd (ni Architecture ou MEP) mais d'après ce que je vois, tu peux peut-être essayer : Dim objID As ObjectId = DrawingSetupVariables.GetInstance(db, True) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
pat06 Posté(e) le 16 août 2012 Auteur Posté(e) le 16 août 2012 bonsoir Gile, Effectivement il fallait mettre True dans l'instruction. la database est certainement complétée avec autocad architecture par rapport à la database utilisée dans autocad. D'ou le fait de l'erreur sur des fichiers issus d'autocad sans cette base "étendue". merci beaucoup.
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