| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | |  | PNY: der unverzichtbare Partner für umfassende KI-Lösungen von Workstations bis zu Edge Computing und KI-Cluster-Bereitstellung, eine Pressemitteilung
|
Autor
|
Thema: Xref-Liste erstellen (2795 mal gelesen)
|
wwwilli Mitglied Ingenieur
 
 Beiträge: 410 Registriert: 21.03.2006 ACAD MAP 3D 2012. VestraCAD. Win 7 64bit SP 1, FD 100 GB, Xeon 2,8 GHz, 12 GB.
|
erstellt am: 01. Dez. 2006 12:39 <-- editieren / zitieren --> Unities abgeben:         
|
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 01. Dez. 2006 15:19 <-- editieren / zitieren --> Unities abgeben:          Nur für wwwilli
Hi Willi, vielleicht so
Code: Dim entity As AcadEntity Dim BlockRef As AcadBlockReference Dim BlockDef As AcadBlockFor Each entity In ThisDrawing.ModelSpace If entity.ObjectName = "AcDbBlockReference" Then Set BlockRef = entity Set BlockDef = ThisDrawing.Blocks(BlockRef.Name) If BlockDef.IsXRef = True Then Debug.Print "X-Ref " & BlockRef.Path End If ElseIf entity.ObjectName = "AcDbRasterImage" Then Debug.Print "Raster: " & entity.ImageFile End If Next entity
Stelli------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wwwilli Mitglied Ingenieur
 
 Beiträge: 410 Registriert: 21.03.2006 ACAD MAP 3D 2012. VestraCAD. Win 7 64bit SP 1, FD 100 GB, Xeon 2,8 GHz, 12 GB.
|
erstellt am: 01. Dez. 2006 18:38 <-- editieren / zitieren --> Unities abgeben:         
Hallo Stelli, danke. Leider will mein VBA die Eigenschaften blockref.path und entity.imagefile nicht kennen. Ich weiß nicht, ob ich eine andere Eigenschaft benutzen kann. Und dann bricht die ganze Sache beim ersten Testbild irgendwo ab, auch wenn ich statt der beiden o.g. Eigenschaften ".Objectname" nehme, was VBA eigentlich kennen sollte. Habe noch nicht raus, wo abbricht. Nehme mal ein ganz kleines DWG. MfG wwwilli
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 Beiträge: 1360 Registriert: 24.07.2002
|
erstellt am: 01. Dez. 2006 19:39 <-- editieren / zitieren --> Unities abgeben:          Nur für wwwilli
Hallo Willi, Ich habe Wilfrieds Code mal etwas abgeändert. So sollte es funktionieren: Option Explicit Public Sub test() Dim Entity As AcadEntity Dim BlockRef As AcadBlockReference Dim BlockDef As AcadBlock For Each Entity In ThisDrawing.ModelSpace If TypeName(Entity) = "IAcadExternalReference" Then Set BlockRef = Entity Set BlockDef = ThisDrawing.Blocks(BlockRef.Name) If BlockDef.IsXRef = True Then MsgBox "X-Ref " & BlockRef.Path End If ElseIf TypeName(Entity) = "IAcadRasterImage" Then MsgBox "Raster: " & Entity.ImageFile End If Next Entity End Sub Gruß, Carsten [Diese Nachricht wurde von Carsten1210 am 01. Dez. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wwwilli Mitglied Ingenieur
 
 Beiträge: 410 Registriert: 21.03.2006 ACAD MAP 3D 2012. VestraCAD. Win 7 64bit SP 1, FD 100 GB, Xeon 2,8 GHz, 12 GB.
|
erstellt am: 01. Dez. 2006 20:16 <-- editieren / zitieren --> Unities abgeben:         
Hallo, Ihr fleißigen, das von Stelli mit entity.Objectname läuft schon auch jetzt bei kleinen Test-DWGs bei mir, aber bei einem größeren DWG hängt sich die Sub nach ca. 90 Objekten bei "Next entity" auf mit Laufzeitfehler '-2147221231(80040111)': Automatisierungsfehler; ClassFactory kann angeforderte Klasse nicht liefern. Ohne Breakpoints haut es die Sub aus den Latschen, dass ich es nicht mehr mit On Error GoTo ... auffangen kann und auch das Hauptprogramm mit Fehler abbricht. So kann ich aber das Programm nicht gut enden lassen, auch wenn das DWG vielleicht Fehler hat, ich muss sie vom Prog wenigstens vernünftig abfangen können. MfG, wwwilli Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 01. Dez. 2006 21:14 <-- editieren / zitieren --> Unities abgeben:          Nur für wwwilli
|
wwwilli Mitglied Ingenieur
 
 Beiträge: 410 Registriert: 21.03.2006 ACAD MAP 3D 2012. VestraCAD. Win 7 64bit SP 1, FD 100 GB, Xeon 2,8 GHz, 12 GB.
|
erstellt am: 01. Dez. 2006 22:05 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich habe es umgebaut, so dass es mit "On Error Resume Next" irgendein Ergebnis bringt. Es siehr dann wieder mehr wie ein Fortran-Programm aus, aber das stört mich ja nicht... Die Suche nach den Xrefs versuche ich abzukürzen, etwa so (auszugsweise): Z1 = ThisDrawing.Blocks.Count Z2 = 0 L4000: If ThisDrawing.Blocks(Z2).IsXRef Then meinPfad = ThisDrawing.Blocks(Z2).Path EndIf Z2 = Z2 + 1 If Z2 <= Z1 Then GoTo L4000 'usw Sorry, wahrscheinlich wird Euch schlecht, wenn Ihr solchen Code seht. Scheint aber zu funktionieren, dann brauche ich nicht eine große Zahl von Objekten zu durchlaufen, das dauert doch ziemlich lange bei 20.000 Stück und mehr, um 2 Xrefs zu finden. So etwas hätte ich dann gerne auch für die Pixelbilder, aber ThisDrawing.Pixelbilder gibts leider nicht, oder? MfG, wwwilli
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 02. Dez. 2006 13:10 <-- editieren / zitieren --> Unities abgeben:          Nur für wwwilli
Hallo Willi, Ist doch eine gute Idee die Block Collection zu durchlaufen um die Xref zu bekommen. Allerdings geht das auch mit einer Schleife ohne On Error. Zitat: Original erstellt von wwwilli: ... So etwas hätte ich dann gerne auch für die Pixelbilder, aber ThisDrawing.Pixelbilder gibts leider nicht, oder? ...
So halb gibt es das. Du musst ein Selectionset mit SelectionAll bilden und dabei einen Filter für die Bilder übergeben. Stelli
------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wwwilli Mitglied Ingenieur
 
 Beiträge: 410 Registriert: 21.03.2006 ACAD MAP 3D 2012. VestraCAD. Win 7 64bit SP 1, FD 100 GB, Xeon 2,8 GHz, 12 GB.
|
erstellt am: 03. Dez. 2006 20:37 <-- editieren / zitieren --> Unities abgeben:         
Hallo und danke, mit "For Each ... Next" scheint mir das Problem zu sein, dass das ganze Ding baden geht, wenn bei einem Element ein Fehler auftritt; und ich meine, ich kriege diese Fehler dann nicht abgefangen. Wahrscheinlich geht es irgendwie, aber ich bin ja auch nur Bauingenieur... Läuft das mit "SelectionAll" nicht auch darauf hinaus, dass 20.000 Elemente abgecheckt werden müssen? Gehören die Pixelbilder nicht zu irgendeinem übergeordneten Objekt, auf das man die Suche beschränken könnte? Oder kann man den "Bildmanager" irgendwie anzapfen? Der sucht ja auch nicht 20.000 Zeichnungselemente durch, um seine Liste mit ein paar Pixelbildern anzuzeigen. Vielleicht komme ich da mit "Sendkeys" und der Zwischenablage schneller dran als mit "SelectionAll". Aber vielleicht habe ich das missverstanden, ich habe erst am Montag oder Dienstag wieder AC in den Händen. MfG, wwwilli Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
GrassHopper Mitglied CAD-Betreuer

 Beiträge: 22 Registriert: 18.03.2006
|
erstellt am: 03. Dez. 2006 23:48 <-- editieren / zitieren --> Unities abgeben:          Nur für wwwilli
Hallo wwwilli, ich hab mir auch mal ein paar Gedanken zu deinem Problem gemacht. Und hierzu ein kurzes VBA-Programm gemacht. Um die Infos der XREFs und Bilder anzuzeigen ist ein kleines Dialogfenster entstanden. hier gibt's auch einen EXPORT-Button der die Infos in eine CSV-Datei speichert. Diese kannst du dann z.B. in MS-Excel einlesen. Mfg GrassHopper Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wwwilli Mitglied Ingenieur
 
 Beiträge: 410 Registriert: 21.03.2006 ACAD MAP 3D 2012. VestraCAD. Win 7 64bit SP 1, FD 100 GB, Xeon 2,8 GHz, 12 GB.
|
erstellt am: 04. Dez. 2006 16:21 <-- editieren / zitieren --> Unities abgeben:         
Hm, grübel, wie kriege ich das jetzt gelesen, habe hier zu Hause kein AC. Kann man .dvb auch mit was anderem aufmachen? Was ich mit dem Editor sehe, ist nicht wirklich ausreichend. UserForms bräuchte ich nicht, das mit der Ausgabe nach CSV habe ich auch schon alles. MfG mal, wwwilli Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
GrassHopper Mitglied CAD-Betreuer

 Beiträge: 22 Registriert: 18.03.2006
|
erstellt am: 05. Dez. 2006 01:59 <-- editieren / zitieren --> Unities abgeben:          Nur für wwwilli
Hallo wwwilli, hab ich total vergessen das man ja vdb-Dateien so nicht lesen kann. Die Macht der Gewohnheit. Im Anhang findest du ein Modul das du dir einfach importieren kannst und es auch einfach im Text-Editor ansehen kannst. Ich hab das Ganze vielleicht ein wenig umständlich gelöst aber es funktioniert. Ich hab noch dazu geschrieben über welche Eigenschaften du an den Namen bzw. den Pfad der Datei ran kommst. Mfg GrassHopper Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wwwilli Mitglied Ingenieur
 
 Beiträge: 410 Registriert: 21.03.2006 ACAD MAP 3D 2012. VestraCAD. Win 7 64bit SP 1, FD 100 GB, Xeon 2,8 GHz, 12 GB.
|
erstellt am: 05. Dez. 2006 10:41 <-- editieren / zitieren --> Unities abgeben:         
Hallo, danke, jetzt kann ich alles lesen, auch das DVB. So etwa habe ich das alles auch schon, ist OK. Auch Du durchläufst mit Code:
Dim element As AcadObject For Each element In aktDoc.ModelSpace For Each element In aktDoc.PaperSpace
alle Objekte des DWG. Das sind dann wie gesagt 20.000 Elemente oder mehr. Da hatte ich gehofft, dass man Zeit (z.B. 5 bis 10 Sekunden) sparen könnte, wenn es wie bei den Blöcken ein geeignetes Objekt gibt, das nur die Pixelbilder enthält. Oder habe ich einen Beschleunigungstrick in Deinem Code übersehen? Auch beim Ausführen Deines Programms kriege ich übrigens "Laufzeitfehler '-2147221231" und das Prog hängt. Wahrscheinlich haben manche meiner DWGs einen Datenfehler, aber damit muss die Routine zur Ermittlung der Xrefs irgendwie zurechtkommen, denn ansonsten arbeitet AC auch damit ohne Widerspruch. Und auch nach "_audit" kommt der genannte Laufzeitfehler wieder. "Stunden später:" Oha, ich habe etwas gefunden: die FileDependencyList. Damit könnte es schneller gehen. Code:
Dim objFDLCol As AutoCAD.AcadFileDependencies Dim objFDL As AutoCAD.AcadFileDependency Dim strFDL As String Set objFDLCol = ThisDrawing.FileDependencies strFDL = "File Dependency List:" + Str(objFDLCol.Count) & " El." For Each objFDL In objFDLCol strFDL = strFDL + vbCr + objFDL.FullFileName Next MsgBox strFDL
Da sind dann SHX, TTF, PC3 und STB mit drin, aber das lässt sich ja bearbeiten... Mal sehen, geht auf jeden Fall schnell. MfG, wwwilli
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 Beiträge: 1360 Registriert: 24.07.2002
|
erstellt am: 05. Dez. 2006 11:08 <-- editieren / zitieren --> Unities abgeben:          Nur für wwwilli
|
wwwilli Mitglied Ingenieur
 
 Beiträge: 410 Registriert: 21.03.2006 ACAD MAP 3D 2012. VestraCAD. Win 7 64bit SP 1, FD 100 GB, Xeon 2,8 GHz, 12 GB.
|
erstellt am: 05. Dez. 2006 12:54 <-- editieren / zitieren --> Unities abgeben:         
|
wwwilli Mitglied Ingenieur
 
 Beiträge: 410 Registriert: 21.03.2006 ACAD MAP 3D 2012. VestraCAD. Win 7 64bit SP 1, FD 100 GB, Xeon 2,8 GHz, 12 GB.
|
erstellt am: 08. Dez. 2006 17:37 <-- editieren / zitieren --> Unities abgeben:         
Hm, naja, sooo super auch wieder nicht, weil die FileDependencies verschachtelte Xrefs nicht aufführen. Z.B. ein DWG als Xref enthält ein Pixelbild. Der Bildmanager führt dieses auf, mit xrefname|bildname ... Aber bei den ThisDrawing.FileDependencies kommt es nicht vor. Jetzt muss ich doch, scheint's, die ThisDrawing.Blocks durchsuchen und bei allen mit .IsXref = True deren .XRefDatabase.FileDependencies untersuchen, womöglich rekursiv... Ob nicht doch der Bildmanager irgendwie mit VBA zu kriegen ist? Schönes WE. MfG, wwwilli
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 08. Dez. 2006 18:33 <-- editieren / zitieren --> Unities abgeben:          Nur für wwwilli
Hey Ho wwwilli, war das jetzt ne Frage Lad dir doch mal die Blockinfo.dvb. Da fügst du in der Funktion FILLBLOCKINFO noch eine Zeile ein die prüft ob es ein Bildchen ist. Wenn du vorher noch ein Node in den Treeview einbaust bis du fertig. In dieser Funktion wird schon rekursiv in der Zeichnung gesucht. Über den Export kannst du das Ganze auch in eine Textdatei bringen. Übringens was willst du damit machen ? Wenn du eine DWG samt aller abhängigen Zeichnungen und Bilder weitergeben willst kannst du das auch mit "publizieren" machen. Da werden alle Dateien automatisch zusammengefaßt. Stelli ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |

| |
wwwilli Mitglied Ingenieur
 
 Beiträge: 410 Registriert: 21.03.2006 ACAD MAP 3D 2012. VestraCAD. Win 7 64bit SP 1, FD 100 GB, Xeon 2,8 GHz, 12 GB.
|
erstellt am: 08. Dez. 2006 19:19 <-- editieren / zitieren --> Unities abgeben:         
Hallo Stelli, das war eine Frage oder vielleicht auch nur mal so eine Stimmungsäußerung im CAD.DE-Chat. Manchmal brauch ich das. Trotzdem danke. Frage: Wo ist Blockinfo.dvb? Antwort zu was will machen: Unsere Dateien werden nach "Projekten" sortiert gespeichert, das können Dutzende oder Hunderte DWGs jeweils sein. Wenn ein Projekt fertig ist, wird es auf DVD gebrannt und gelöscht. Da fiel mir dann ein, dass die DVD nicht vollständig sein kann (und das Projekt später nicht vollständig wieder hergestellt werden kann), wenn die Xrefs außerhalb des Projekts (z.B. auf einem Vorlagen-Laufwerk mit Karten, Logos u.ä.) nicht mitgenommen werden. Dazu möchte ich fortlaufend eine Liste mit den projektbezogenen Xrefs füttern.Es geht also nicht um einzelne DWG, das machen wir mit "etransmit". Aber die Problemstellung ist natürlich ähnlich. MfG, wwwilli
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |