Aller au contenu

modifications des dwg depuis répertoire


pat06

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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 DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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é")

Lien vers le commentaire
Partager sur d’autres sites

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 DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.

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é