Hi Leute,
ich will mich hier gar nicht zu der Extrusionsgeschichte auslassen, sondern nur mal wieder zu der eigentlichen Frage nach dem Auswahlsatz usw.
Der Gedankengang war schon völlig OK. Was mich aber immer wieder erstaunt, das ist die Beharrlichkeit, mit der Alle das Rad immer wieder neu erfinden. Das mit der 'Modularität' scheint wohl in diesem Jahrtausend auch keinen Einzug mehr zu halten bei den AutoLisplern. Aber das war ja im vorigen Jahrtausend auch schon so;-)
Eine kleine Zeile an der entscheidenden Stelle einfügen:
(setq markierung(entlast))
Dann _insert, _explode und weissderteufelwas
Und dann:
(ss-nach-markierung(markierung)) => gibt Auswahlsatz zurück
Und so implementiert man die Funktion:
(defun ss-nach-markierung(ent / ss)
(setq ss(ssadd))
(while(setq ent(entnext ent))
(if
(not(member(cdr(assoc 0 ent))'("ATTRIB""SEQEND""VERTEX")))
(ssadd ent ss)
)
)
ss
)
Das Ausfiltern der Sub-Entities ist deshalb wichtig, damit man sie nicht gleichberechtigt mit den Hauptentities im Auswahlsatz hat. Wenn man sich so eine Routine mal geschrieben hat, dann sollte man sie irgendwo ablegen und nur noch benutzen, das schont einfach Zeit und Nerven - das meine ich mit Modularität.
Wo die allerdings völlig fehlt, ist dein Programmcode, Siegfried. Als
Neuling ist das ja verzeihlich, aber mein Gemecker bleibt dir trotzdem nicht erspart: Diese Routine erzeugt zig globale Variablen, die überhaupt keiner braucht. Wahrscheinlich ist keines dieser ganzen setqs wirklich nötig. Eines aber, das echt nötig wäre, fehlt:
(setq nullpunkt '(0 0 0))
Die Strafarbeit (list 0 0 0) lässt du den Interpreter sehr oft machen! (setq ...) verwendet man dann, wenn auf einen Wert mehrfach zugegriffen werden soll - aber man sollte es vermeiden, wenn nur ein Zugriff erfolgt. Das Programm könnte also auf 1/4 des Volumens gekürzt werden (dann wäre es auch leserlich), dafür aber zehnmal so schnell laufen. Und wenn dann die notwendigen Variablen (höchstens 3 für diesen Zweck) auch noch lokal gemacht werden, könnte es sogar sicher und unfallfrei laufen.
Modular wäre es dann, wenn es den Vorgang auch noch auf einem anderen Layer ausführen könnte. Aber so brauchst du eine neue Routine, nur weil sich ein Layername ändert. Du kannst das Ganze auch nicht aus einer anderen Routine heraus aufrufen, weil die Benutzeranfragen (Input) und das Zeichnen (Output) völlig miteinander vermischt sind.
Also, nimm den ersten Teil als Bestätigung für die Richtigkeit deines Ansatzes, und den zweiten als gutgemeinte Ratschläge zur Verbesserung.
Und nun noch eine Frage @Sebastian: Was findest du denn fragwürdig am Aufbau?
Gruss, Axel
------------------
http://www.tutorial.autolisp.info
http://www.advanced.autolisp.info
http://www.activex.autolisp.info
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP