Schon oft wurde hier nach Programmierung für XDATA et al gefragt, und meistens kam dann auch von mir der Hinweis auf Programmbibliothelken, die sich jeder Programmierer selbst dafür zurecht programmiert hat. Das schließt Geegenheitsprogrammierer aus, weil die idR nicht über die notwendige Zeit und die vertieften Kenntnisse der XDATA-Codierung verfügen. Das geht mit CALSCRIPT jetzt anders, weil das eine sehr umfangreiche Programmbibliothek enthält, die unabhängig von CALSCRIPT in allen Lisp-Anwendungen nutzbar ist. CALSCRIPt gibt es als kostenfreie Lizenz von archtools.de/calscript.zip (noch Betaversion, Quellcodelizenz auf Anfrage verfügbar).
Mit den CALSCRIPT Funktionen XDATA-PUT, XDATA-GET, XDICTIONYRA-PUT und -GET, DICTIONARY-PUT und -GET kann jeder sehr einfach beliebige Daten an Zeichnungsobjekte oder in der DWG speichern und wieder abfragen. Dabei werden auch Symbole (Variablennamen), beliebig verschachtelte Listen und auch "Dotted Pairs" (den meisten als ENTGET bzw DXF Listen bekannt) gespeichert und korrekt wieder ausgelesen. Das ermöglicht auch das Speichern kompletter DEFUN bzw LAMBDA-Konstrukte am Objekt. Damit kann jedes von einem Programm erzeugte Objekt auch den Programmcode für seine Modifizierung oder Neuerzeugung an sich speichern.
Die Syntax ist banal und selbsterklärend:
(xdata-put <ename> <appname> <data> )
speichert am Objekt <ename> unter dem Appnamen <appname> die Daten <data>. Als Daten kann alles verwendet werden, was man in einem Lisp-Programm schreeiben kann, also alle Daten außer Entitynamen und Pikcsets (was auch wenig Sinn machen würde, weil diese nur inenrhalb einer AutoCAD-Sitzung Bestand haben). Allerdings gibt es eine mittels XDROOM ermittelbare maximale Menge an Daten (typisch um die 16 kByte), die man als XDATA an ein Objekt anhängen kann.
Gelesen werden die daten wieder via
(xdata-get <ename> <appname>
Man kann also auch sowas speichern:
(xdata-put (entlast) "TEST" '(ABC "DEF" (8 . "LAYERNAME")))
Die Funktionen XDICTIONARY-PUT und XDICTIONARY-GET funktionieren ganz analog. Der einzige Unterschied zu XDATA ist, dass man die Objekte nicht nach dem Appnamen filtern kann, und dass keine prinzipielle Begrenzung für die Datenmenge existiert.
Die Funktion DICTIONARY-PUT speichert Daten direkt in der DWG. Die Syntax lautet:
(dictionary-put <appname> <key> <data> )
Appname und Key sind wieder Strings, und die Daten können so wieder gelesen werden:
(dictionary-get <appname> <key> )
Aufbauend auf einem Dictionary ist in CALSCRIPT auch die Möglichkeit gegeben, über eine eigene "SETVAR" Funktion beliebige eigene Systemvariablen zu speichern:
(cc-setvar <varname> data)
Die Daten können sinnvollerweise so wieder ausgeklesen werden:
(cc-getvar <varname> )
Also etwa so:
(cc-setvar "MYVAR" 123)
Fragen und Verbesserungsvorschläge dazu sind immer willkommen, bitte hier im Forum stellen. Und noch ein Hinweis: in der letzten CALSCRIPT-Betaversion war ein fehler beim Auslesen von verschachtelten Dotted Pairs (die gibt's tatsächlich) enthalten, der in der aktuellen Version von heute behoben ist.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP