|  |  | 
|  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | 
|  |  | 
|  | Jetzt verfügbar: NVIDIA RTX PRO 6000 Blackwell Server Edition, eine Pressemitteilung 
 | 
| Autor | Thema:  Rückgabe einer Funktion (1655 mal gelesen) | 
 | s.wickel Mitglied
 Bauingenieur Wasserwirtschaft
 
   
 
      Beiträge: 422Registriert: 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:einfügen. Sieht aber nicht schön aus.(setq p p)
 
 
 ------------------Nodda,
 Stefan    Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP | 
                        | CADmium Moderator
 Maschinenbaukonstrukteur
 
         
 
  
 
      Beiträge: 13533Registriert: 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ückgabewertSiehe 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: 422Registriert: 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: 3338Registriert: 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: 422Registriert: 17.12.2001
 Bricscad V7 - V11 |    erstellt am: 26. Sep. 2005 11:09  <-- editieren / zitieren -->    Unities abgeben:            | 
                        | mapcar Mitglied
 CADmin
 
 
  
 
      Beiträge: 1250Registriert: 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: 3338Registriert: 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: 1250Registriert: 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 |