Aller au contenu

Xrefs non référencées


Messages recommandés

Bonsoir,

 

J'ai un dessin avec de nombreuses xrefs non référencées. J'essaie envain de les détacher mais je n'arrive pas à les sélectionner. J'y vois pourtant les autres Xrefs.

 

        _
       Public Sub ExternalReference()

           Dim doc As Document = Application.DocumentManager.MdiActiveDocument
           Dim db As Database = doc.Database
           Dim xg As XrefGraph = db.GetHostDwgXrefGraph(True)

           For i As Integer = 0 To xg.NumNodes - 1
               Dim xgn As XrefGraphNode = xg.GetXrefNode(i)

               Select Case xgn.XrefStatus
                   Case XrefStatus.Unresolved
                       Debug.Print(vbLf & "Unresolved xref ""{0}""", xgn.Name)
                       Exit Select
                   Case XrefStatus.Unloaded
                       Debug.Print(vbLf & "Unloaded xref ""{0}""", xgn.Name)
                       Exit Select
                   Case XrefStatus.Unreferenced
                       Debug.Print(vbLf & "Unreferenced xref ""{0}""", xgn.Name)
                       Exit Select
                   Case XrefStatus.Resolved
               End Select

           Next
       End Sub

 

Pourquoi je n'arrive pas à traiter les Xrefs non référencées ?

 

merci.

 

[Edité le 1/4/2011 par PhilOctet]

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

 

Tout d'abord, quand tu as des réponses ici ou à des demandes, pense à faire un petit retour avant de poster une nouvelle demande (similaire). Ça fait toujours plaisir...

 

 

C'est la dernière fois...

 

Cette commande purge les xref non référencées :

 

 

C#

 

        [CommandMethod("purgexref")]
       public void PurgeXref()
       {
           Database db = HostApplicationServices.WorkingDatabase;
           using (Transaction tr = db.TransactionManager.StartTransaction())
           {
               BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
               foreach (ObjectId btrId in bt)
               {
                   BlockTableRecord btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead);
                   if (btr.IsFromExternalReference && btr.GetBlockReferenceIds(true, false).Count == 0)
                       db.DetachXref(btr.ObjectId);
               }
               tr.Commit();
           }
       }

 

 

F#

 

[<CommandMethod("purgexref")>]
let purgeXref() =
   let db = HostApplicationServices.WorkingDatabase
   use tr = db.TransactionManager.StartTransaction()
   for id in tr.GetObject(db.BlockTableId, OpenMode.ForRead) :?> BlockTable do
       let btr = tr.GetObject(id, OpenMode.ForRead) :?> BlockTableRecord
       if btr.IsFromExternalReference && btr.GetBlockReferenceIds(true, false).Count = 0 then
           db.DetachXref(btr.ObjectId)
   tr.Commit()

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

 

J'ai bien lu les deux messages précédents. Je n'ai pas vu ou pas compris où les Xrefs non référencées était filtrées.

Les images et les DWF, PDF, DGN sont aussi des Xrefs. Je n'arrive pas non plus à filtrer les non référencées.

Est-ce que c'est

 

 btr.GetBlockReferenceIds(true, false)

qui me permet de distinguer les Xrefs DWG non référencées ?

Et pour les autres types de xrefs ?

 

A part vrai ou faux, que signifie le true et le false dans ce contexte ?

 

Comment as-tu su que c'était cette instruction ? Ou as-tu acquis les infos ?

 

En d'autres termes, je suis en mal de documentation. Quels sont tes sources ?

 

A bientôt,

Lien vers le commentaire
Partager sur d’autres sites

Petites précisions sémantiques, ce n'est que depuis les dernières versions qu'AutoCAD appelle références externes tous les fichiers (DWG, DWF, PDF, DGN et images raster) attachés à un DWG.

En programmation (NET), une Xref correspond à un type de BlockTableRecord particuler et aux éventuels BlockReference insérés, les calques sous-jacents (DWF, PDF et DGN) dérivent des classes UnderlayDefinition et UnderlayReference et les images raster des objets de type RasterImageDef et RasterImage.

Comme il y a 3 types d'objets différents, il faut 3 traitements différents pour les purger.

On en avait déjà longuement parlé ici...

 

La méthode GetBlockReferenceIds s'applique aux objets BlockTableRecord (definitions de blocs et xrefs), donc pas aux calques sous-jacents (DWF,PDF, DGN).

Utiliser un XrefGraph ne te donnera accès qu'aux xrefs (DWG).

Pour les calques sous-jacents, il faut aller dans les dictionnaires : ACAD_DWFDEFINITIONS, ACAD_PDFDEFINITIONS et ACAD_DGNDEFINITIONS. Tu peux récupérer les ObjectId de toutes les entées de ces dictionnaires dans un ObjectIdCollection et passer cet ObjectIdCollection comme argument à la méthode Database.Purge() qui retourne un Array des ObjectId non référencés que tu peux supprimer (à utiliser dans une boucle en cas d'imbrications voir le code de LispPurge).

 

Pour la documentation, tu peux télécharger la version d'ObjectARX qui t'intéresse elle contient un dossier docs\arxmgd.chm ou docs\acad_mgd.chm avec l'aide pour tous les objets de l'API AutoCAD .NET,

Tu as aussi dans Visual Studio, l'Intellisense qui affiche toutes les méthodes et propriétés pour une instance d'objet, l'explorateur d'objets qui permet de parcourir tout ce que contiennent les dll référencées.

Ou encore, internet avec ton moteur de recherche préféré.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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é