PhilOctet Posté(e) le 1 avril 2011 Posté(e) le 1 avril 2011 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]
(gile) Posté(e) le 4 avril 2011 Posté(e) le 4 avril 2011 Salut, Tout d'abord, quand tu as des réponses ici ou là à 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
PhilOctet Posté(e) le 5 avril 2011 Auteur Posté(e) le 5 avril 2011 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,
(gile) Posté(e) le 5 avril 2011 Posté(e) le 5 avril 2011 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
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