Lösungen zu den Übungsaufgaben
Schauen Sie sich diese Funktion an. Finden Sie heraus, was
Sie tut, kritisieren Sie sie, und schreiben Sie dann eine
neue Version, die den gleichen Zweck erfüllt (lassen Sie
aber das weg, was nicht hineingehört).
(defun abcde(zzz / liste elem pkt1 pkt2 pliste)
(setq pliste nil)
(setq elem zzz)
(command "_UCS" "_W")
(setq pkt1 (cdr (assoc 10 elem)))
(setq pkt2 (cdr (assoc 11 elem)))
(setq pliste (append pliste (list pkt1)))
(setq pliste (append pliste (list pkt2)))
(setq ppliste (append ppliste (list pliste)))
)
Vermutlicher Zweck:
Diese Funktion soll zu einem gegebenen Entity vom Typ Linie
den Anfangs- und den Endpunkt zurückgeben - zusammen in einer
Liste. Es wird aber (da kein
(entget) vorkommt) nicht
der Entityname, sondern die Datenliste als Argument übergeben.
Ein Nebeneffekt ist aber auch noch, dass jeder Aufruf dieser
Funktion das BKS auf 'Welt' umschaltet.
Kritik:
Zunächst einmal gehört die BKS-Umschaltung überhaupt nicht
in diese Funktion! Warum sollte man ein BKS umschalten, um
die Koordinaten aus der Datenliste eines Entities zu lesen?
Dann krankt die Funktion an hochgradiger Setqitis: Nicht
eine einzige dieser
(setq)-Anweisungen ist von irgendeinem
Nutzen. Zum Dritten findet man hier einen Wust von unnötigen
Funktionsaufrufen, die offensichtlich auf sehr mangelhafte
AutoLisp-Kenntnisse zurückzuführen sind.
pliste wird
noch einmal auf
nil gesetzt, obwohl es das schon ist,
das Argument
zzz wird nochmal in eine andere Variable
umkopiert - warum?
Eine lokale Variable wird zwar deklariert, aber nie benutzt -
eine andere Variable wird benutzt, aber nicht lokal deklariert:
Globaler Datenmüll? Oder soll hier eine globale Variable
verwendet werden? Wenn ja, warum? Das muss offen bleiben.
Falls dies der Fall sein sollte, wäre dies auf jeden Fall
der falsche Ort: Es muss ja auch möglich sein, die beiden
Punkte zu extrahieren, ohne dass gleich eine globale Variable
erzeugt wird.
Die letzten Zeilen lassen sich übrigens durch ein einziges
(list) zusammenfassen. Und die Namen sind auch nicht
deskriptiv!
Verbesserungsvorschlag (Die BKS-Umschaltung ist hier erstmal
weggelassen):
(defun linien-endpunkte(daten / )
(list
(cdr(assoc 10 daten))
(cdr(assoc 11 daten))
)
)
Sollte da wirklich an eine globale Variable angefügt werden,
dann sollte der Ablauf jetzt so aussehen:
...
...
(setq *ppliste*
(append *ppliste*)
(list(linien-endpunkte(entget...)))
)
...
...
; jetzt soll was gezeichnet werden
(command "_UCS" "_W")
...
...