Zitat:
Original erstellt von CADmium:
hiermit :(defun AUSLEUCHTEN (AUSWAHLSATZ EIN / ELEMENTNUMMER ELEMENT ZAEHLER)
(if(=(type AUSWAHLSATZ) 'PICKSET)
(progn
(setq ZAEHLER 0)
(while (and AUSWAHLSATZ (setq ELEMENT (ssname AUSWAHLSATZ ZAEHLER)))
(if EIN
(redraw ELEMENT 3)
(redraw ELEMENT 4)
)
(setq ZAEHLER (1+ ZAEHLER))
)
)
)
(princ)
)
ist EIN 'T ..wird ausgeleuchtet sonst wird ausleuchten abgeschaltet
- Funktion bezieht sich auf Auswahlsätze...
bei entsel ... reicht nur (redraw (car(entsel)) 3) usw.
Der Wert für AUSWAHLSATZ in Deiner WHILE Bedingung ist immer "wahr", denn auch ein leerer Auswahlsatz ist nicht NIL, sondern immer noch ein Pickset. Und statt der ständig zu prüfenden WHILE-Bedingung kann man natürlich vereinfachend einmal die Anzahl für eine REPEAT Schleife angeben. Man kann das also beispielsweise so etwas eleganter machen:
(defun AUSLEUCHTEN (AUSWAHLSATZ EIN / ZAEHLER)
(setq ZAEHLER 0)
(if(=(type AUSWAHLSATZ) 'PICKSET)
(repeat (sslength AUSWAHLSATZ)
(if EIN
(redraw (ssname AUSWAHLSATZ ZAEHLER) 3)
(redraw (ssname AUSWAHLSATZ ZAEHLER) 4)
)
(setq ZAEHLER (1+ ZAEHLER))
)
)
)
Das PRINC am Ende der Funktion würde ich immer weglassen, wenn es kein mittels (DEFUN C:function ...) erzeugter Befehl ist. Und eigentlich würde ich die Prüfung des korrekten Datentyps (if(=(type AUSWAHLSATZ) 'PICKSET) ...) immer der aufrufenden Funktion überlassen - bei wie in LISP üblich zahlreich verschachtelten Funktionen würdest Du sonst nämlich ein und denselben Datentyp zigfach prüfen.
Noch eleganter wäre IMO, wenn Du den Auswahlsatz erst in eine Liste umwandelst, und diese dann mit MAPCAR abarbeitest. Das Umwandeln in eine Liste hat viele Vorteile, denn die PICKSETs sind keine echten LISP-Konstrukte und können böse Seiteneffekte (nicht in dem Fall) haben.
(defun sset2list (sset / result counter)
(setq counter 0)
(repeat (sslength sset)
(setq result (cons (ssname sset counter) result))
)
result
)
(defun highlight (sset flag)
(mapcar (function (lambda (entity)
(if flag
(redraw entity 3)
(redraw entity 4)
)
))
(sset2list sset)
)
)
Gruß
Tom Berger
------------------
Architekturwerkzeuge für AutoCAD: http://www.archtools.de