Bosse macht blau, farbliche Darstellung eigener Funktionen im VLIDE - Bosse-engineering Blog - LISP-Programmierung für AutoCAD und BricsCAD

Direkt zum Seiteninhalt

Hauptmenü:

Bosse macht blau, farbliche Darstellung eigener Funktionen im VLIDE

LISP-Programmierung für AutoCAD und BricsCAD
Herausgegeben von in LISP-Codes ·

Im Visual-Lisp-Editor ist den vorhandenen Standardfunktionen die Option „Schützen und zuweisen“ zugewiesen. Alle Funktionen (Symbole) mit dieser Option werden standardmäßig in der Farbe blau dargestellt.

bosse_macht_blau, der vollständige LISP-Code zu diesem Artikel

Beispiel Symbol-Service für die Standard-Funktion MAPCAR:



Jetzt wollte ich auch den selbstdefinierten Funktionen aus meiner Standardbibliothek diese Option zuweisen, damit diese ebenfalls in der Farbe blau dargestellt werden. Damit möchte ich die Lesbarkeit des Codes verbessern.

Beispiel vorher:



Beispiel nacher:



Ich könnte jetzt für jede meiner Funktionen einzeln den Symbol-Service nutzen und die Option „Schützen und zuweisen“ verwenden. Das ist aber erstens sehr mühselig, und zweitens, denke ich bestimmt nicht daran, auch den neuen Funktionen diese Option zuzuweisen, wenn ich meine Funktionsbibliothek irgendwann erweitern werde.

Auf http://www.cad.de bin ich dann im LISP-Forum fündig geworden:
http://ww3.cad.de/foren/ubb/Forum145/HTML/002663.shtml#000003

Dort sind folgende Codezeilen zu finden:

(defun codecolor ()
(setq functionlist (list 'getattrib ....'pline 'islocked?))
(eval (list 'pragma (list 'quote (list (cons 'unprotect-assign functionList)))))
(eval (list 'pragma (list 'quote (list (cons 'protect-assign funct

Es wird eine Funktionsliste definiert mit all den Funktionen, die später blau dargestellt werden sollen.

Dann werden zwei Listen evaluiert in der jeweils die Funktion PRAGMA enthalten ist. In der ersten Liste wird bei allen Funktionen aus der Funktionsliste die Option „Schützen und zuweisen“ deaktiviert, bei der zweiten Funktion aktiviert. Wie die Funktionen jetzt ganz genau arbeiten weiß ich noch nicht, aber ich weiß was ich mit den Codes anfangen kann ;-)

Mein eigentliches Problem ist jetzt aber, dass ich wieder vor scheinbarer Handarbeit stehe, denn ich muss die obere Funktionsliste zusammenstellen. Ich habe in meiner Funktionsbibliothek ca. 300 Funktion, das heißt, in die Hände spucken und los geht’s, oder, der bessere Weg, mir eine Funktion schreiben, die das für mich erledigt.

Voraussetzungen: ich habe die LISP-Biobliotheksdatei „JBfunktionen.lsp“. In dieser Datei sind ca. 300 Funktionen enthalten, die alle mit „(defun JBf“ beginnen, z.B.



Folgende Schritte sind jetzt notwendig:
Lesen der Datei „JBfunktionen.lsp“ in eine Liste (jede Zeile ein Listeneintrag):

(defun JBf_file_read (dateipfad / DATEI LISTE ZEILE)
(if(setq datei (open dateipfad "r"))
(progn
 (while (setq zeile (read-line datei))
(setq liste (cons zeile liste)))
(close datei)))liste)

In der Liste werden alle Einträge gelöscht, die nicht den String „(defun“ enthalten:

(setq liste (vl-remove-if'(lambda(A)(not(vl-string-search "(defun" ...

Jeder Listeneintrag wird jetzt anhand des Zeichens “(“ in einzelne Stringelemente geteilt und wiederum in eine Liste gespeichert:

(defun JBf_string_trennzeichen->list (str str_trenn / list_str)
(if (vl-string-search str_trenn str)
(progn
(while (vl-string-search str_trenn str)
(setq list_str (cons (substr str 1 (vl-string-search str_trenn str))list_str)
str (substr str(+(vl-string-search str_trenn str)(+ (strlen str_trenn)1)))))
(setq list_str (cons str list_str)))
(setq list_str (cons str list_str)))
(reverse list_str))


Die Zeile “(defun JBf_string_trennzeichen->list (str str_trenn / list_str)” würde z.B. folgende Liste ergeben:



Jetzt muß ich aus dem jeweils 2. Eintrag der Liste den String „defun“ und die Leerzeichen entfernen:

(defun Bosse_macht_blau:String (str / )
(while (vl-string-search " " str)
(setq str (vl-string-subst "" " " str)))
(vl-string-subst "" "defun" string))

Als Ergebnis bekomme ich dann jeweils den alleinstehenden Funktionsnamen in einer Liste. Falls in meiner Bibliotheksdatei jetzt aber noch eine Funktion vorhanden sein sollte, die nicht mit „JBf“ beginnt kann ich diese Funktionsnamen jetzt noch herausfiltern:

(vl-remove-if '(lambda(A)(/= (strcase(substr A 1 3))"JBf"...

Auf diese Liste wird noch ein
(mapcar ‘read angewand, und schon habe ich die passende Liste für meine gefundene Funktion:







Kein Kommentar


letzte Posts
Zurück zum Seiteninhalt | Zurück zum Hauptmenü