Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  XRefs entfernen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  XRefs entfernen (1408 mal gelesen)
Ontario70
Mitglied


Sehen Sie sich das Profil von Ontario70 an!   Senden Sie eine Private Message an Ontario70  Schreiben Sie einen Gästebucheintrag für Ontario70

Beiträge: 2
Registriert: 02.02.2010

erstellt am: 02. Feb. 2010 18:42    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hi,

vor mir liegen ca. 6.000(!) DWGs, die zum Teil XRefs enthalten, meist verwaist.
Diese Dateien sollen in einem anderen Prozess weiterverarbeitet werden, der aber mit XRefs nix anfangen kann und die auch nicht braucht - bei den XRefs in diesem Fall handelt es sich primär um Logos und Bilder.

Ich habe folgendes versucht:

Code:
public void DetachXrefs()
        {
            FolderBrowserDialog fldFolder = new FolderBrowserDialog();
            if (fldFolder.ShowDialog() == DialogResult.OK)
            {
                string[] DWGs = Directory.GetFiles(fldFolder.SelectedPath, "*.dwg");
                if (DWGs.Length > 0)
                {
                    string strWorkDir = Path.Combine(fldFolder.SelectedPath, "stripped");
                    if (Directory.Exists(strWorkDir) == false)
                    {
                        Directory.CreateDirectory(strWorkDir);
                    }

                    DocumentCollection dcDocMan = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager;
                    for (int i = 0; i < DWGs.Length; i++)
                    {
                   
                        Database docDB = new Database();
                        docDB.ReadDwgFile(DWGs[i], FileShare.None, false, "");
                        using (Transaction trDWG = docDB.TransactionManager.StartTransaction())
                        {
                            XrefGraph dbXRGraph = docDB.GetHostDwgXrefGraph(true);
                            for (int j = 0; j < dbXRGraph.NumNodes; j++)
                            {
                                XrefGraphNode xnGraphNode = dbXRGraph.GetXrefNode(j);
                               
                                if (xnGraphNode.IsNested == false)
                                {
                                    BlockTableRecord btrGrphNode = (BlockTableRecord)trDWG.GetObject(xnGraphNode.BlockTableRecordId, OpenMode.ForRead);

                                    BlockTableRecordEnumerator itEnumerator = btrGrphNode.GetEnumerator();
                                    int intCounter = 0;
                                    while (itEnumerator.MoveNext())
                                    {
                                        try
                                        {
                                            ObjectId idObj = itEnumerator.Current;
                                            Entity entObj = (Entity)trDWG.GetObject(idObj, OpenMode.ForWrite);
                                            if (entObj is BlockReference)
                                            {
                                                BlockReference brObj = (BlockReference)trDWG.GetObject(entObj.ObjectId, OpenMode.ForWrite);
                                                BlockTableRecord btrObj = (BlockTableRecord)trDWG.GetObject(brObj.BlockTableRecord, OpenMode.ForRead);

                                                if (btrObj.IsFromExternalReference)
                                                {
                                                    if (btrObj.IsResolved == false)
                                                    {
                                                        if (brObj.IsWriteEnabled)
                                                        {
                                                            brObj.Erase();
                                                            brObj.Dispose();
                                                            intCounter++;
                                                        }
                                                        entObj.Dispose();
                                                    }
                                                }
                                            }
                                        }
                                        catch (System.Exception)
                                        {

                                        }
                                    }
                                    if (intCounter > 0)
                                    {
                                        trDWG.Commit();
                                        docDB.SaveAs(Path.Combine(strWorkDir, Path.GetFileName(DWGs[i])), DwgVersion.Current);
                                    }
                                }
                            }
                        }
                       
                        docDB.Dispose();
                    }
                }
            }
}


Funktioniert aber nicht, weil

Code:
xnGraphNode.IsNested
immer True ist. Außerdem xnGraphNode.BlockTableRecordId = 0 und liefert eInvalidObjectId, falls man's ignoriert.

Was ist falsch an dem Code? Was bedeutet "nested" genau?

Und wichtiger:
Wie werde ich alle XRefs los?

Danke
Ontario

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 06. Feb. 2010 13:17    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Ontario,

sorry für späte Rückmeldung.

>> Was bedeutet "nested" genau?

Das bedeutet, dass das XRef, das Du gerade in der Hand hast, seinerseits wieder Referenzen enthält.

Hier mal ein Beispiel, angelehnt an Deine Code-Basis. Zu Testzwecken hab ich es so umgebaut, dass die Zeichnung tatsächlich in den Editor geladen wird. Das kannst Du natürlich wieder zu Deinem Modus (nicht in den Editor laden) wieder umbauen:

Code:
      static public void CADde_DetachXrefs()
      {
        Document tDoc = null;
        DocumentLock tDocLock = null; //nur gebraucht, wenn die Zeichnung im Editor geöffnet wird
        Database docDB = null;
        Transaction trDWG = null;
        XrefGraph dbXRGraph = null;

        try
        {
            tDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            tDocLock = tDoc.LockDocument();
            docDB = tDoc.Database;
            trDWG = docDB.TransactionManager.StartTransaction();
            dbXRGraph = docDB.GetHostDwgXrefGraph(true);
            if (dbXRGraph != null)
            {
              for (int j = 0; j < dbXRGraph.NumNodes; j++)
              {
                  XrefGraphNode xnGraphNode = dbXRGraph.GetXrefNode(j);
                  BlockTableRecord btrGrphNode = (BlockTableRecord)trDWG.GetObject(xnGraphNode.BlockTableRecordId, OpenMode.ForWrite);

                  if (xnGraphNode.IsNested)
                  {
                    if (btrGrphNode.XrefStatus == XrefStatus.NotAnXref)
                    {
                        // dann ist es die Zeichnung selbst (die leider auch in der Funktion GetHostDwgXrefGraph retourniert wird)
                        // also nix machen
                    }
                    else
                    {
                        //ist ein XRef, das bereits einem anderen untergeordnet ist, dann nur die Definition löschen
                        btrGrphNode.Erase();
                    }
                  }
                  else
                  {

                    ObjectIdCollection tXRefReferences = btrGrphNode.GetBlockReferenceIds(true, false);
                    if (tXRefReferences == null)
                    {
                        // zwar als XRef vorhanden, aber nicht in Modell- bzw. Papierbereich eingefügt
                    }
                    else if (tXRefReferences.Count > 0)
                    {
                        // dann müssen wir vorher die Einfügungen löschen
                        System.Collections.IEnumerator tEnum = tXRefReferences.GetEnumerator();
                        while (tEnum.MoveNext())
                        {
                          Entity tEnt = (Entity)trDWG.GetObject((ObjectId)tEnum.Current, OpenMode.ForWrite);
                          tEnt.Erase();
                        }
                    }
                    // und jetzt können wir die XRef-Definition aus der BlockTable entfernen
                    btrGrphNode.Erase();

                  }
              }
              trDWG.Commit();
            }
        }
        catch
        {
        }
        finally
        {
            if (trDWG != null)
            {
              trDWG.Dispose();
              trDWG = null;
            }
            if (tDocLock != null)
            {
              tDocLock.Dispose();
              tDocLock = null;
            }
        }

        //docDB.CloseInput(true);
        //docDB.Dispose();
      }



Wieso betone ich 'angelehnt an Deine Code-Basis' ==> Ich hätte einfach die Blocktable genommen, wäre mit einem Iterator durch die Blockdefinitionen durchgefahren und hätte auf isXRef geprüft und dann gehandelt. Mit '.GetHostDwgXrefGraph' habe ich bisher noch nicht gearbeitet, kann daher auch Zustände nicht ausschliessen, die von mir vielleicht noch nicht getestet sind.

HTH, - alfred -

------------------
www.hollaus.at

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz