| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: externe Referenzen prüfen (2418 mal gelesen)
|
PeterF Mitglied
Beiträge: 30 Registriert: 11.08.2008
|
erstellt am: 06. Nov. 2008 19:52 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich möchte Pläne per VB Code auf das Vorhandensein von exteren Referenzen prüfen. Auf dem ersten Blick bietet sich dafür ja die AcadFileDependencies Collection an. Das funktioniert aber nur, wenn alle Dateien auch existieren. Ansonsten kommt beim Durchlaufen der Collection Dim myFD As AcadFileDependency For Each myFD In ActiveDocument.FileDependencies .... Next direkt ein Fehler ("Das aufgerufene Object wurde von den Clients getrennt"). Die Count-Eigenschaft der Collection zeigt die zu erwartende Anzahl der Dateien an. Wenn ich aber das Element 0 (z.b. ActiveDocument.FileDependencies(0).Feature) aufrufe, kommt auch sofort eine Fehlermeldung ("Schlüssel nicht gefunden"). Alle vorhandenen Dateiabhängigkeiten kann ich mir über den Index aufrufen. Der zweite Weg wäre ja über die Blocks Collection mit der Prüfung auf die ISXref-Eigenschaft. Das kann aber unter Umständen recht lange dauern. Dann habe ich aber immer noch den Aufwand zu testen, ob die externe Referenz überhaupt existiert, Dann weiß ich immer noch nicht, ob diese geladen wurde (wenn nämlich ein Fehler beim Laden aufgetreten ist).
Nun endlich mein Fragen: 1. gibt es eine DXF-Code für die Selection von Xrefs 2. wie kann ich das ACAD Object AcadExternalReference für bereits vorhandene Xrefs benutzen (in der ACAD-Hilfe habe ich nur gefunden, dass man neue Referenzen erzeugen kann) 3. gibt es ein anderes Objekt was mir, wie der Xref-Manager sagen kann, welche Xrefs überhaupt in der Zeichnung vorhanden sein müssten, ob diese geladen wurden usw. 4. oder gibt es eine komplett anderen Weg? Danke schon mal für Eure Antworten! ------------------ Viele Grüße aus dem Münsterland! PeterF -------------------------------------------- Der Horizont vieler Menschen ist ein Kreis mit dem Radius Null. Das nennen sie dann ihren Standpunkt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 06. Nov. 2008 20:04 <-- editieren / zitieren -->
Hi, lade Dir mal mein Beispiel von http://ww3.cad.de/foren/ubb/Forum54/HTML/020951.shtml#000009 da ist Code vorhanden, der gleichzeitig auch prüft, ob ein XRef geladen ist oder nicht. Die FileDependencies beinhalten mehr als nur XRef's, da gehören CTB-Files, Fonts, ... sprich alles, was auch bei 'etransmit' mitübertragen werden müsste (damit bin ich aber nicht wirklich vertraut). Hoffe es hilft Dir (zumindest in den meisten Punkten) weiter, wenn noch etwas offen ist, (fast) jederzeit und gerne. - alfred -
|
PeterF Mitglied
Beiträge: 30 Registriert: 11.08.2008
|
erstellt am: 06. Nov. 2008 20:28 <-- editieren / zitieren --> Unities abgeben:
Hi alfred, danke für die rasche Antwort. Dein Code ist ja schon mal prima und hilft mir auch weiter. Die Eigenschaft XRefDatabase war das fehlende Rädchen im Getriebe, was aber immer noch schwer läuft. Ich sehe ein Problem auf mich zukommen, wenn es keinen dxf-Code gibt, der direkt externe Referenzen anspricht. "Insert" selektiert ja alle Blockreferenzen. In meinen Zeichnungen sind möglicherweise tausende davon drin. Da ist eine for each Schleife besser als nichts, aber auch nicht der schnellste Weg. Also noch mal vielen Dank mit der Hoffnung, daß jemand einen Weg kennt, Xrefs direkt zu selektieren. ------------------ Viele Grüße aus dem Münsterland! PeterF -------------------------------------------- Der Horizont vieler Menschen ist ein Kreis mit dem Radius Null. Das nennen sie dann ihren Standpunkt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 06. Nov. 2008 20:34 <-- editieren / zitieren -->
Hi, Du kannst natürlich statt der Selektion auf alle BlockReferences auch die Liste der Blocks (BlockDefinitionen) durchgehen, solange Du nicht wissen willst, ob diese überhaupt verwendet sind. Dim tBl as AcadBlock for each tBl in ThisDrawing.Blocks 'und da hast jetzt die Blockdefinition 'jetzt kann geprüft werden ob es sich um ein XRef handelt next - alfred -
|
PeterF Mitglied
Beiträge: 30 Registriert: 11.08.2008
|
erstellt am: 07. Nov. 2008 08:06 <-- editieren / zitieren --> Unities abgeben:
Hi alfred, Danke für die Antwort. Das habe uch auch schon so gemacht. Aber, wie du schon bemerkt hast, habe ich dann keine Kontrolle, ob die Referenz überhaupt verwendet wird. Was mir gerade dabei einfällt. Man kann ja die Block-Collection durchlaufen. Wenn ein Block.IsXref=true dann ein Selectionset bilden mit dem Blocknamen. So weiß ich, ob die Xref überhaupt verwendet wird. Mal testen, wie das mit den Laufzeitzeiten aussieht. Aber dennoch bleibt die Frage, warum es einen Laufzeitfehler gibt, wenn man die FileDependencies-Collection durchlaufen will und eine Referenz nicht gefunden wurde? Sieht nach nicht abgefangenen Programmfehler aus. Kommunikation erweitert immer wieder den Horizont! Danke!
ps: wiese steht der Topic auf einmal im Forum "Rund um AutoCad". Mir war so, als hätte ich ihn im VBA Forum verfasst. Wennn nicht, wie kann man ihn verschieben?
------------------ Viele Grüße aus dem Münsterland! PeterF -------------------------------------------- Der Horizont vieler Menschen ist ein Kreis mit dem Radius Null. Das nennen sie dann ihren Standpunkt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 07. Nov. 2008 10:15 <-- editieren / zitieren -->
Hi Peter, kannst mir eine Zeichnung zukommen lassen, in der FileDependencies-Collection einen Fehler bringen? Oder kommt das bei Dir in jeder Zeichnung? - alfred - |
PeterF Mitglied
Beiträge: 30 Registriert: 11.08.2008
|
erstellt am: 07. Nov. 2008 11:16 <-- editieren / zitieren --> Unities abgeben:
Hi alfred, der Fehler kommt bei mir in jeder Zeichnung. Egal ob in ACAD-VBA oder extern über COM und VB. Version: ACAD 2006 Version: Z.54.10 ------------------ Viele Grüße aus dem Münsterland! PeterF -------------------------------------------- Der Horizont vieler Menschen ist ein Kreis mit dem Radius Null. Das nennen sie dann ihren Standpunkt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 07. Nov. 2008 11:32 <-- editieren / zitieren -->
Hi Peter, sorry, ich kann es nicht reproduzieren, ich habe eine leere Zeichnung offen, starte die Loop: Dim tObj As AcadFileDependency For Each tObj In ThisDrawing.FileDependencies Debug.Print tObj.Feature Next und fliege dabei nicht ab, das Ergebnis im Output-Fenster: Acad:Text Acad:PlotConfig D.h. ich fürchte, dass es doch zeichnungs- oder konfigurationsabhängig ist. - alfred - |
PeterF Mitglied
Beiträge: 30 Registriert: 11.08.2008
|
erstellt am: 07. Nov. 2008 13:50 <-- editieren / zitieren --> Unities abgeben:
Hi Alfred, mit einer leeren Zeichnung geht es auch. Erstelle mal eine neue Zeichnung und füge eine externe Referenz hinzu. Dann speichere die Zeichnung und benenne die externe Referenz um. Nun öffne die neu erstellte Zeichnung. Da passiert erst mal noch nichts, außer dass die Xref nicht zu sehen ist. Und nun kommt der Moment. Dim myFD As AcadFileDependency For Each myFD In ActiveDocument.FileDependencies 'an diese Stelle knallt es bei mir reproduzierbar. .... Next ------------------ Viele Grüße aus dem Münsterland! PeterF -------------------------------------------- Der Horizont vieler Menschen ist ein Kreis mit dem Radius Null. Das nennen sie dann ihren Standpunkt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 07. Nov. 2008 14:00 <-- editieren / zitieren -->
Hi Peter, ok, so kann ich's auch sehen. Gilt also doch nur in bestimmten Zuständen . Hilft Dir das als Abhilfe? Code: Dim tObj As Object Dim i As Integer For i = 0 To ThisDrawing.FileDependencies.Count - 1 On Error Resume Next Set tObj = ThisDrawing.FileDependencies.Item(i) If (Err.Number <> 0) Or (tObj Is Nothing) Then Debug.Print "Unknown dependency, reference not found" Else 'ok End If On Error GoTo 0 Next
- alfred - |
PeterF Mitglied
Beiträge: 30 Registriert: 11.08.2008
|
erstellt am: 07. Nov. 2008 14:57 <-- editieren / zitieren --> Unities abgeben:
Hi Alfred, ich hab's ja nun schon anders, wie oben beschrieben gemacht. Also erst Blöcke durchlaufen (nicht die Referenzen) wenn IsXref Selectionset mit INSERT und Blocknamen bilden. Wenn dann mind. ein Objekt da ist, wurde die Xref geladen. Laufzeiten gehen bis jetzt auch, da ja nicht alle Blockreferenzen durchlaufen werden sondern nur die Definitionen. Das mit den FileDependencies war dann nur noch aus generellem Interesse. Aber dennoch Danke für Deine Mühe! ------------------ Viele Grüße aus dem Münsterland! PeterF -------------------------------------------- Der Horizont vieler Menschen ist ein Kreis mit dem Radius Null. Das nennen sie dann ihren Standpunkt. 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: 07. Nov. 2008 14:59 <-- editieren / zitieren --> Unities abgeben: Nur für PeterF
Hallo, ich hatte bei den FileDependecies mit For Each auch immer Abbrüche, machte es dann erfolgreich mit .Count und On Error Resume Next, allerdings noch schlimmer als oben dargestellt, nämlich mit GoTo, aber das darf man ja fast nicht sagen. Ich meine, du musst auch die Blocks durchsuchen, nicht nur die ThisDrawing.FileDependencies, also jeweils auch ThisDrawing.Blocks(xxx).XRefDatabase.FileDependencies.Count MfG, wwwilli [Diese Nachricht wurde von wwwilli am 07. Nov. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 07. Nov. 2008 15:07 <-- editieren / zitieren -->
Hi Peter, ein letzter Hinweis sei mir noch gestattet, wenn es denn wirklich mit Laufzeitproblemen zu tun hat: Arbeitest Du mit VB6 oder mit VB.NET, denn wenn Du mit managed-code arbeitest, dann hättest du bei dem BlockTableRecord eine Eigenschaft, die Dir angibt, wieoft ein Element eingesetzt ist. In diesem Fall kannst Du direkt von BlockTableRecord auf die Referenzen hingreifen. - alfred -
[Diese Nachricht wurde von a.n. am 07. Nov. 2008 editiert.] |
PeterF Mitglied
Beiträge: 30 Registriert: 11.08.2008
|
erstellt am: 07. Nov. 2008 16:20 <-- editieren / zitieren --> Unities abgeben:
Hi Alfred, da bin ich aber gespannt! Ich bin für jeden Tip dankbar. Z.z. läuft die Anwendung noch unter VB6, soll aber neu auf VB.NET entwickelt werden. Eine Konvertierung wird leider mehr Aufwand machen, als vernüftigen neuen Coden zu programmieren. Mal nebenbei: Kommst Du manchmal auch zu was anderem, als im Forum auf mehr oder weniger qualifizierte Fragen zu antworten. Ich finde es ja gut, dass es solche wie Dich gibt, hätte aber persönlich nie die Zeit dazu. Bleib uns erhalten! ------------------ Viele Grüße aus dem Münsterland! PeterF -------------------------------------------- Der Horizont vieler Menschen ist ein Kreis mit dem Radius Null. Das nennen sie dann ihren Standpunkt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|