PhilOctet Posté(e) le 29 mars 2011 Posté(e) le 29 mars 2011 Bonsoir, Lorsque le dessin est ouvert, j'arrive à recharger les xrefs dont j'ai modifiées le chemin. Imports AcBdd = Autodesk.AutoCAD.DatabaseServices...Dim acDb As AcBdd.Database = doc.DatabaseDim LstUnloadXRefs As New AcBdd.ObjectIdCollection()Dim btr As New AcBdd.BlockTableRecordDim xrgn As AcBdd.XrefGraphNode...btr = tr.GetObject(xrgn.BlockTableRecordId, AcBdd.OpenMode.ForWrite)...LstUnloadXRefs.Add(btr.ObjectId)...acDb.UnloadXrefs(LstUnloadXRefs) Par contre, si je veux faire la même chose alors que le dessin n'est pas ouvert. Cela ne fonctionne plus. Pire, il plante et déclanche le catch.J'accède à la base du dessin par un dtb.ReadDwgFile(). J'ai peut-être une solution mais il me manque la bonne fonction.Dans la collection LstUnloadXRefs, j'ai toutes les xrefs à recharger mais je ne sais pas récupérer le btr correspondant.Peux-tu m'aider ? Soit en me donnant la bonne fonction ou en me dirigeant vers une autre voie. Je t'en remercie.
(gile) Posté(e) le 30 mars 2011 Posté(e) le 30 mars 2011 Difficile de répondre avec aussi peu d'informations. Essaye de localiser plus précisément l'erreur en multipliant les groupes try/catch avec des messages de retour différents. Et, s'il te plait, fais un petit effort de présentation du code que tu postes, j'ai déjà du mal à lire le VB. Par exemple, utilise les bbcodes : [code] ici le code [/code] donne : ici le code Accessible via l'icône [#] : http://img94.imageshack.us/img94/8380/bbcode.png Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
PhilOctet Posté(e) le 30 mars 2011 Auteur Posté(e) le 30 mars 2011 Bonjour, J'ai créé une collection ObjectIdCollection remplie avec des objets btr.ObjectId. btr est un BlockTableRecord. Lorsqu'AutoCAD est ouvert, je peux décharger les xrefs de cette collection. Tout va bien. Mais lorsque je traite en masse les dwg par l'intermédiaire ReadDwgFile(), la routine provoque une erreur sur l'instruction UnloadXrefs. Donc je cherche :soit un fonction plus généraliste qui répondrait aux deux cas,soit un moyen de récupérer le btr à partir d'un ObjectId contenu dans la collection. et de faire une boucle qui changerait le status de la Xref. Je me semble démuni face à ce genre de problème. Je n'ai pas trouvé de documentations .net pour AutoCAD. Et comme je ne suis pas ADN, je ne peux accéder à un support. Il y a d'autres forums mais faire des recherches et trouver une réponse cohérente relève de l'exploit. Toutefois, je pense que le problème ne vient pas d'AutoCAD mais de mon incompétence en VB.net. Merci de votre aide.
(gile) Posté(e) le 30 mars 2011 Posté(e) le 30 mars 2011 Est-ce que tu crées bien une ObjectIdCollection pour chaque Database ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 30 mars 2011 Posté(e) le 30 mars 2011 Re, Je viens de faire un petit essai, je n'ai pas de problème avec les codes ci-dessous. C# using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Windows; using Autodesk.AutoCAD.EditorInput; using AcAp = Autodesk.AutoCAD.ApplicationServices.Application; namespace XrefSample { public class UnloadXrefsClass { [CommandMethod("ULXR")] public void ulxr() { Editor ed = AcAp.DocumentManager.MdiActiveDocument.Editor; OpenFileDialog ofd = new OpenFileDialog( "Sélectionnez un fichier DWG", "", "dwg", "", OpenFileDialog.OpenFileDialogFlags.AllowMultiple); if (ofd.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; foreach (string filename in ofd.GetFilenames()) { try { using (Database db = new Database()) { db.ReadDwgFile(filename, FileOpenMode.OpenForReadAndAllShare, false, ""); UnloadXrefs(db); db.SaveAs(filename, DwgVersion.Current); } } catch (System.Exception e) { ed.WriteMessage("\n{0} : {1}\n{2}", filename, e.Message, e.StackTrace); } } } private void UnloadXrefs(Database db) { ObjectIdCollection col = new ObjectIdCollection(); XrefGraph xrg = db.GetHostDwgXrefGraph(true); for (int i = 1; i < xrg.NumNodes; i++) { XrefGraphNode xrgn = xrg.GetXrefNode(i); if (!xrgn.IsNested) { col.Add(xrgn.BlockTableRecordId); } } db.UnloadXrefs(col); } } } F# module XrefSample open Autodesk.AutoCAD.DatabaseServices open Autodesk.AutoCAD.EditorInput open Autodesk.AutoCAD.Runtime open Autodesk.AutoCAD.Windows type AcAp = Autodesk.AutoCAD.ApplicationServices.Application let unloadXrefs (db:Database) = let col = new ObjectIdCollection() let xrg = db.GetHostDwgXrefGraph(false) for i= 0 to xrg.NumNodes-1 do let xrgn = xrg.GetXrefNode(i) if not xrgn.IsNested then col.Add(xrgn.BlockTableRecordId) |> ignore db.UnloadXrefs(col) [<CommandMethod("ULXR")>] let ulxr() = let ed = AcAp.DocumentManager.MdiActiveDocument.Editor let ofd = new OpenFileDialog( "Sélectionnez un fichier DWG", "", "dwg", "", OpenFileDialog.OpenFileDialogFlags.AllowMultiple) if ofd.ShowDialog() = System.Windows.Forms.DialogResult.OK then for x in ofd.GetFilenames() do try use db = new Database() db.ReadDwgFile(x, FileOpenMode.OpenForReadAndAllShare, false, "") unloadXrefs db db.SaveAs(x, DwgVersion.Current) with | e -> ed.WriteMessage("\n{0} : {1}\n{2}", x, e.Message, e.StackTrace) 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