| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für BricsCAD |
Autor
|
Thema: XData, APPID und Lisp (1991 mal gelesen)
|
Arcuso Mitglied Vermessung
Beiträge: 70 Registriert: 25.07.2011 Windows 7/64 prof. AutoCAD 2011 BricsCad v12
|
erstellt am: 23. Mai. 2014 07:50 <-- editieren / zitieren --> Unities abgeben:
Hallo! Eigentlich hatte ich gehofft, über den GC 70 vom APPID einer Applikation feststellen zu können, ob sie noch von einem Objekt referenziert wird. Dort finde ich aber in jedem Fall 0 vor, auch in AutoCAD. Mit Try & Error komme ich bei meiner Version 12.2.8 jedoch auch nicht weiter, weil sie das Löschen einer APPID per Lisp auch dann ohne Meldung zulässt, wenn sie von Objekten referenziert wird: per (entdel) -> EntityName (in ACAD aber nil) per (vla-Delete) kein Error im Gegensatz zu ACAD mit entspr. Meldung BricsCAD findet nach dem Löschen diese APPID per (tblsearch) oder (tblobjname) zwar nicht mehr; in jenen Objekten, die die APPID referenzieren sind jedoch noch alle XDaten erhalten! Daran ändert auch ein Regenerieren oder Zwischenspeichern nichts. Erst beim Versuch, diese Objekte per Befehl WBLOCK zu exportieren, gelingt dies nicht und es erscheint die Meldung, dass BricsCAD instabil ist und beendet werden sollte. Speichert man die ganze Zeichnung unter einem anderen Namen, bleiben auch da die XDaten erhalten, allerdings unter einem anderen APPID-String. Scheinbar ein Sicherheits-Mechanismus, damit XDaten nicht unbeabsichtigt verloren gehen. Habe ich mit meiner Version noch eine andere Chance, die Referenzierung einer APPID festzustellen bzw. ist das Problem in einer jüngeren Version vielleicht bereits behoben? Grüße Arcuso
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Ehrenmitglied V.I.P. h.c. CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 ACAD; defun-tools
|
erstellt am: 23. Mai. 2014 08:44 <-- editieren / zitieren --> Unities abgeben: Nur für Arcuso
anscheinend programmierst du ja. Dann solltest du die ganze Zeichnungsdatenbank durchlaufen und die EED's mit Namen XXX von den Objekten löschen. Damit wäre das Problem behoben. (Dazu findest du aber bestimmt einige Tools im Netz) Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Arcuso Mitglied Vermessung
Beiträge: 70 Registriert: 25.07.2011 Windows 7/64 prof. AutoCAD 2011 BricsCad v12
|
erstellt am: 23. Mai. 2014 09:09 <-- editieren / zitieren --> Unities abgeben:
Hallo ! Im Gegenteil, ich will XDaten eben nicht löschen, sondern nur feststellen, ob die APPID namens XXX egal wo in der Zeichnung referenziert ist. Das kann ja auch in einem Layer-Table-Objekt sein, das ich per (ssget) ja gar nicht erreichen würde. Ich müsste also die komplette Datenbank bis ins letzte Glied durchforsten, nur um feststellen zu können: nein, die Applikation XXX ist nirgends referenziert und kann sie per Lisp löschen (purgen) bzw. umgekehrt sonstwie verwenden. So, wie ich ja auch in einem Layer mit Property [Used] rausbekomme, ob er von einem Objekt verwendet wird. Grüße Arcuso
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Ehrenmitglied V.I.P. h.c. CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 ACAD; defun-tools
|
erstellt am: 23. Mai. 2014 14:13 <-- editieren / zitieren --> Unities abgeben: Nur für Arcuso
Zitat: Original erstellt von Arcuso: ... Ich müsste also die komplette Datenbank bis ins letzte Glied durchforsten ...
Ja, so ist das. Programmieren hat sehr oft etwas damit zu tun, nicht funktionierende Dinge der API oder des Programms selbst zu umschiffen/Workarounds zu finden. Das kann man nicht ändern. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Arcuso Mitglied Vermessung
Beiträge: 70 Registriert: 25.07.2011 Windows 7/64 prof. AutoCAD 2011 BricsCad v12
|
erstellt am: 25. Mai. 2014 16:07 <-- editieren / zitieren --> Unities abgeben:
Hallo! Habe jetzt eine für uns brauchbare Lösung gefunden, indem zuerst aus der akt. Zeichnung eine DXF exportiert und dann nach allen GC 1001 abgesucht wird. Wenn jeweils die nächste Zeile die gesuchte APPID matcht, wird der Elementname zum vorher passierten Handle bei GC 5 in eine Ass.-Liste aufgenommen, die dann ausgewertet und event. auch der jeweilige Owner ermittelt werden kann. Wermutstropfen war allerdings, dass sowohl BricsCAD alsauch AutoCAD ein DXF erzeugen, in dem die Sonderzeichen beim anschließenden Lesen mit Lisp in ANSI-Zeichen konvertiert werden müssen. Trotzdem funkt die Sache per FSO und "OpenAsTextStream" erstaunlich schnell. Code: ;Durchsucht eine temp. DXF-Kopie der aktuellen Zeichnung nach allen Referenzen ;von XData-Applikationen, die den String [ax] matchen und retourniert eine ;Assoziations-Liste aus APPIDs und Elementnamen der betroffenen Objekte. ;Ist [ax=nil], wird ein eventuell vorhandenes DXF-File gelöscht. (defun AssAPPID (ax / fs fo rf hd al) ((lambda (xf) (if ax (progn (if (not (findfile xf)) (progn (command "DXFOUT" xf "_V" "2010" 2) (while (not (findfile xf)) (princ)) ) ) (if (and (findfile xf) (setq fs (vlax-create-object "Scripting.FileSystemObject")) (setq fo (vlax-invoke fs "GetFile" xf)) (setq rf (vlax-invoke fo "OpenAsTextStream" 1 0)) ) (progn (while (= (vlax-get rf "AtEndOfStream") 0) ((lambda (rl) (if (= rl " 5") (setq hd (vlax-invoke rf "ReadLine"))) (if (= rl "1001") ((lambda (ap) (if (wcmatch ap ax) (setq al (cons (cons ap (handent hd)) al)) ) ) (UTFtrans (vlax-invoke rf "ReadLine")) ) ) ) (vlax-invoke rf "ReadLine") ) ) (vlax-invoke rf "Close") (foreach it (list rf fo fs) (vlax-release-object it)) (if (not al) (progn (print (strcat "Keine Referenzen zu APPID [" ap "].")) (print) ) ) al ) ) ) (if (findfile xf) (progn (vl-file-delete xf) (print (strcat "Datei [" xf "] wurde gelöscht.")) (print) ) ) ) ) (strcat (getvar "dwgprefix") (vl-filename-base (getvar "dwgname")) ".dxf") ) );Konvertiert im String [st] alle Sonderzeichen von UTF-Codes auf ANSI-Zeichen: ;Das z.B. dann notwendig, wenn ab Vista bzw. Win7 mit AutoCAD oder BricsCAD eine ;DXF-Datei erstellt wurde, in der mit (read-line) oder FSO u. "OpenAsTextStream" ;wieder gelesen werden soll. (defun UTFtrans (st / Str-Conv) (defun Str-Conv (al st) ;rekursiv ((lambda (dp) (if dp (if (vl-string-search (car dp) st) (Str-Conv al (vl-string-subst (cadr dp) (car dp) st)) (Str-Conv (cdr al) st) ) st ) ) (car al) ) ) ;Individuell relevante Sonderzeichen UTF->ANSI: (Str-Conv '(("¹" "¹") ("²" "²") ("³" "³") ("Ä" "Ä") ("Ö" "Ö") ("Ãœ" "Ü") ("ä" "ä") ("ö" "ö") ("ü" "ü") ("ß" "ß") ) st ) )
Wer's braucht ... Grüße Arcuso
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
T.Moses Mitglied
Beiträge: 82 Registriert: 16.03.2005 Win10, Core i9-9900k @5.0 GHz, 32 GB Ram, NVidia GT1030
|
erstellt am: 26. Mai. 2014 01:10 <-- editieren / zitieren --> Unities abgeben: Nur für Arcuso
Hallo, Arcuso, eventuell geht es doch einfacher :-) Die APPID SymbolTableRecord (also die Einträge in der APPID SymbolTable) haben einen Einträge 102 “{ACAD_XDICTIONARY” zeigt den Beginn einer Erweiterungswörterbuchgruppe an. Diese Gruppe liegt nur dann vor, wenn dem Objekt Dauerverweise zugeordnet wurden (optional). 360 Hard-Besitzer-ID/Referenz auf Besitzerwörterbuch (optional) 102 Ende der Gruppe, “\}” (optional) Das heisst, man müsste also mit tblnext und (entget (tblobjname)) die vollständife Definitions-Liste erhalten, diese kann dann auf 102+360 durchsucht werden ... habe es nicht probiert, denke aber dies sollte functkionieren. Zumindest schneller + einfacher als per DXF-Datei :-) Hoffe, es klappt & viele Grüsse !
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Arcuso Mitglied Vermessung
Beiträge: 70 Registriert: 25.07.2011 Windows 7/64 prof. AutoCAD 2011 BricsCad v12
|
erstellt am: 26. Mai. 2014 10:12 <-- editieren / zitieren --> Unities abgeben:
Hallo T.Moses ! Danke für den Hinweis. Ich habe in einer Zeichnung, in der mehrfach Blöcke mit XDaten zur APPID "²Herkunft" existieren, folgendes abgefragt: (entget (tblobjname "APPID" "²Herkunft")) und erhalte: ((-1 . <Entity name: 06ca3050> ) (0 . "APPID") (5 . "49") (330 . <Entity name: 06ca32d0> ) (100 . "AcDbSymbolTableRecord") (100 . "AcDbRegAppTableRecord") (2 . "²Herkunft") (70 . 0)) also leider keine Dauerverweise. Beim BitCode in GC 70 hätte ich zuerst eine Info laut DXF-Beschreibung erhofft: 64 = Wenn dieses Bit gesetzt ist, wurde der Tabelleneintrag bei der letzten Bearbeitung der Zeichnung von mindestens einem Element in der Zeichnung referenziert. (Dieses Flag ist für AutoCAD-Befehle vorgesehen. Das Flag kann von den meisten Programmen ignoriert werden, die die DXF-Dateien auslesen; bei Programmen, die in eine DXF-Datei schreiben, erübrigt sich das Setzen des Flags.) Die Info vermisse ich allerdings auch bei AutoCAD 2011. Grüße, Arcuso
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|