Aller au contenu

Messages recommandés

Posté(e)

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.Database

Dim LstUnloadXRefs As New AcBdd.ObjectIdCollection()

Dim btr As New AcBdd.BlockTableRecord

Dim 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.

Posté(e)

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

Posté(e)

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.

Posté(e)

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

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é