Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  BricsCAD
  XData, APPID und Lisp

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 BricsCAD
Autor Thema:  XData, APPID und Lisp (1991 mal gelesen)
Arcuso
Mitglied
Vermessung


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

Beiträge: 70
Registriert: 25.07.2011

Windows 7/64 prof.
AutoCAD 2011
BricsCad v12

erstellt am: 23. Mai. 2014 07:50    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

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



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

Beiträge: 4171
Registriert: 17.05.2001

ACAD; defun-tools

erstellt am: 23. Mai. 2014 08:44    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 Nur für Arcuso 10 Unities + Antwort hilfreich

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


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

Beiträge: 70
Registriert: 25.07.2011

Windows 7/64 prof.
AutoCAD 2011
BricsCad v12

erstellt am: 23. Mai. 2014 09:09    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

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



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

Beiträge: 4171
Registriert: 17.05.2001

ACAD; defun-tools

erstellt am: 23. Mai. 2014 14:13    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 Nur für Arcuso 10 Unities + Antwort hilfreich

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


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

Beiträge: 70
Registriert: 25.07.2011

Windows 7/64 prof.
AutoCAD 2011
BricsCad v12

erstellt am: 25. Mai. 2014 16:07    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

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



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

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 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 Nur für Arcuso 10 Unities + Antwort hilfreich

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


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

Beiträge: 70
Registriert: 25.07.2011

Windows 7/64 prof.
AutoCAD 2011
BricsCad v12

erstellt am: 26. Mai. 2014 10:12    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

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 >>)

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