| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Rückgabe einer Funktion (1376 mal gelesen)
|
s.wickel Mitglied Bauingenieur Wasserwirtschaft
Beiträge: 422 Registriert: 17.12.2001 Bricscad V7 - V11
|
erstellt am: 26. Sep. 2005 10:35 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum! Wahrscheinlich zu simpel für lange Antworten. Ich habe eine Funktion geschrieben, die überprüft ob ein übergebenener Punkt auch ein 3D-Punkt ist. Wenn nicht wird eine 0 als Z-Koordinate angehängt. Sonst wird einfach der Punkt zurückgegeben.
Code:
(defun 3D (p /) ;gibt einen Punkt als 3D-Koordinate zurück (if (not (zvon p)) (setq p (list (Xvon p) (Yvon p) 0)) ) p )
Meine Frage: Den Punkte auf diese Weise zurückgeben funktioniert wunderbar. Aber ist das auch in Ordnung? Kann diese Form zu Problemen führen? Die Funktion soll Teil einer Bibliothek werden und sollte deshalb astrein sein. Sonst muss ich mit ein Code: (setq p p)
einfügen. Sieht aber nicht schön aus.
------------------ Nodda, Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 26. Sep. 2005 10:39 <-- editieren / zitieren --> Unities abgeben: Nur für s.wickel
es reicht (defun 3D (p /) ;gibt einen Punkt als 3D-Koordinate zurück (if (not (zvon p)) (setq p (list (Xvon p) (Yvon p) 0)) P ) ) Rückgabewert einer Funktion ist immer der letzte interne Rückgabewert Siehe dazu auch mal bei Mapcar
------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
s.wickel Mitglied Bauingenieur Wasserwirtschaft
Beiträge: 422 Registriert: 17.12.2001 Bricscad V7 - V11
|
erstellt am: 26. Sep. 2005 10:43 <-- editieren / zitieren --> Unities abgeben:
Danke Cadmium für die schnelle Antwort! Bei Mapcar hatte ich schon geschaut, aber das so direkt nicht gefunden, ob ich eine Variable einfach so aufrufen darf. 10 Punkte! ------------------ Nodda, Stefan [Diese Nachricht wurde von s.wickel am 26. Sep. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADchup Ehrenmitglied V.I.P. h.c.
Beiträge: 3336 Registriert: 14.03.2001 Sicher ist, dass nichts sicher ist. Selbst das nicht. Joachim Ringelnatz
|
erstellt am: 26. Sep. 2005 11:05 <-- editieren / zitieren --> Unities abgeben: Nur für s.wickel
Hi, hier noch eine ActiveX-Variante: Der Funktion (vlax-3d-point) ist es egal, ob sie mit 2d- oder 3d-Koordinaten gefüttert wird, sie bastelt immer 3d-Punkte. Fehlt die Z-Koordinate oder ist sie nil, wird 0.0 eingesetzt. Code:
(defun ax-3d (p) (vlax-safearray->list (vlax-variant-value (vlax-3d-point (car p)(cadr p)(caddr p)) ) ) )
Nachteil der AcitveX-Variante: Weil die Funktion den Punkt in einen Variant und wieder zurück konvertiert, wird sie wahrscheinlich ab ein paar tausend Punkten etwas langsamer sein als Deine Lisp-Variante. Gruß CADchup
------------------ www.cadditions.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
s.wickel Mitglied Bauingenieur Wasserwirtschaft
Beiträge: 422 Registriert: 17.12.2001 Bricscad V7 - V11
|
erstellt am: 26. Sep. 2005 11:09 <-- editieren / zitieren --> Unities abgeben:
|
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 29. Sep. 2005 23:07 <-- editieren / zitieren --> Unities abgeben: Nur für s.wickel
Zitat: Original erstellt von s.wickel: Sieht aber nicht schön aus.
Öh, warum denn nicht? Genau das ist der korrekte Weg, um eine Rückgabe zu erzwingen, wenn die Evaluation des letzten Ausdrucks nicht das zurückgibt, was man gerne hätte. Aber etwas anderes am Rande, das wirklich nicht ganz so schön aussieht: AutoLisp verfügt über die beiden Funktionen NOT und NULL, die eigentlich in ihrer Wirkungsweise völlig identisch sind. Dass die Funktion zwei Namen hat, dient dazu, zwei verschiedene Sachverhalte optisch zu trennen: NOT ist die logische NEGATION (true/false), NULL dient der Abfrage aus Vorhandensein(leere Liste, Variable). Beispiele (if(not(or varA varB)... (if(null userinput)... Wenn's also nur um Schönheit geht: Hier wäre NULL statt NOT angesagt, da es nicht um die Negation einer Aussage geht. @cadchup: Dieses minimale 'Problem' auch noch über die COM-Schnittstelle an das Betriebssystem weiterzureichen, dafür sehe ich aber nun wirklich keinen Anlass. Dann doch lieber etwas eleganter: (defun 3D (p /) ;gibt einen Punkt als 3D-Koordinate zurück (list(car p)(cadr p)(if(caddr p)(caddr p)0)) ) Das sollte auch die schnellste Möglichkeit sein. Gruß, Axel Strube-Zettler ------------------ Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze
[Diese Nachricht wurde von mapcar am 29. Sep. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADchup Ehrenmitglied V.I.P. h.c.
Beiträge: 3336 Registriert: 14.03.2001 Sicher ist, dass nichts sicher ist. Selbst das nicht. Joachim Ringelnatz
|
erstellt am: 29. Sep. 2005 23:23 <-- editieren / zitieren --> Unities abgeben: Nur für s.wickel
Hi Axel, Zitat: Original erstellt von mapcar: Dieses minimale 'Problem' auch noch über die COM-Schnittstelle an das Betriebssystem weiterzureichen, dafür sehe ich aber nun wirklich keinen Anlass.
Das ist richtig. Ich wollte mit dem Beitrag nur auf die Möglichkeiten von (vlax-3d-point) hinweisen. (vlax-3d-point) ist natürlich nur dann sinnvoll, wenn man bei der weiteren Verarbeitung den Punkt nicht als Liste sondern als Variant braucht. Gruß CADchup
------------------ www.cadditions.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 02. Okt. 2005 00:33 <-- editieren / zitieren --> Unities abgeben: Nur für s.wickel
Zitat: Original erstellt von CADchup: wenn man bei der weiteren Verarbeitung den Punkt nicht als Liste sondern als Variant braucht.
Zu dieser Annahme bestand aber kein Anlass. Es bringt doch nix, wenn jede kleine und in diesem Fall auch noch präzise gestellte Frage gleich mit einem Wust von anderen Möglichkeiten erschlagen wird, nach denen aber gar nicht gefragt wurde. Nichts, absolut nichts, deutet im OPost darauf hin, dass es sich um eine COM/COM+-Applikation handelt. Warum sollte man also eine daraus machen wollen? Es ist einfach nicht so, das vla-..-Funktionen eine Erweiterung des Lisp-Sprachschatzes sind (im Unterschied zu den vl-...-Funktionen). Was mit vla- anfängt, tanzt auf einer anderen Hochzeit als Lisp. Gruß, Axel Strube-Zettler
------------------ Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |