| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Creo |
| |
| Rückblick: Branchentreffen des Maschinen- und Anlagenbaus, eine Pressemitteilung
|
Autor
|
Thema: Lisp Schleife (2598 mal gelesen)
|
noxx Mitglied Steuerzahler
Beiträge: 801 Registriert: 13.12.2004 OS: Win 7 Ultimate 64 bit SP1 Speicher: 30 GB RAM Grafik: nVidia Quadro 4000 Creo Modelling v17.0
|
erstellt am: 31. Aug. 2011 14:34 <-- editieren / zitieren --> Unities abgeben:
Hallo, versuche gerade ein Makro anzupassen, komme aber nicht mit den Schleifen zurecht. Hatte es mit eine While Schleife probiert, das geht aber im Modelling wohl nicht. Evtl kann mir da einer helfen Dieser Befehl soll 20x durchlaufen werden, die Zahl nach dem Unterstrich (hier die _1) jeweils um 1 erhöht werden: (setf ubogen_1 (* 0.5 Winkel_1 DM_Unten )) Danke schonmal Gruss ------------------ Modelling 17.x WinXP SP3 ------------------------------- Mathcad kostenlos: SMath Studio Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 31. Aug. 2011 17:14 <-- editieren / zitieren --> Unities abgeben: Nur für noxx
|
noxx Mitglied Steuerzahler
Beiträge: 801 Registriert: 13.12.2004 OS: Win 7 Ultimate 64 bit SP1 Speicher: 30 GB RAM Grafik: nVidia Quadro 4000 Creo Modelling v17.0
|
erstellt am: 01. Sep. 2011 08:29 <-- editieren / zitieren --> Unities abgeben:
|
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 01. Sep. 2011 16:32 <-- editieren / zitieren --> Unities abgeben: Nur für noxx
|
der_Wolfgang Moderator Tastenhauer
Beiträge: 2219 Registriert: 3.20. ● PE60+80@home ● W10 Pro Build10.0.19045.4780 ● Drafting V17~V20.7 ● Modeling V17~V20.7 ● Windchill 12.1.2.6 ● UWGM Client 13.0.0.1
|
erstellt am: 01. Sep. 2011 19:36 <-- editieren / zitieren --> Unities abgeben: Nur für noxx
|
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 01. Sep. 2011 20:38 <-- editieren / zitieren --> Unities abgeben: Nur für noxx
Richtig, ob das Feld oder aber das Zuweisen an zwanzig verschiedene Variablen oder etwas ganz anderes der richtige Ansatz ist, kann man erst entscheiden, wenn man weiss, wo und wie das eingesetzt werden soll. Aus dem Bauch heraus würde ich aber sagen, dass der Versuch, den Inhalt von zwanzig verschiedenen Variablen (Winkel_X) auf zwanzig andere Variablen (ubogen_X) zuzuweisen, schon mal nach der falschen Grundidee aussieht. ------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ [Diese Nachricht wurde von clausb am 02. Sep. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
noxx Mitglied Steuerzahler
Beiträge: 801 Registriert: 13.12.2004 OS: Win 7 Ultimate 64 bit SP1 Speicher: 30 GB RAM Grafik: nVidia Quadro 4000 Creo Modelling v17.0
|
erstellt am: 05. Sep. 2011 12:15 <-- editieren / zitieren --> Unities abgeben:
ich habe leider zu selten den kontakt mit lisp, liegt mir auch irgendwie nicht. komme mit VB besser klar, aber das wohl nur am Rande. Sind den andere Funktionen möglich, zb DO ? Hatte hier was probiert, geht aber nicht: Code: (do ((i 1 (1+ i))(> i 20)) (setf ubogen_"~a"(i) (* 0.5 Winkel_"~a"(i) DM_Unten )))
Gruss ------------------ Modelling 17.x WinXP SP3 ------------------------------- Mathcad kostenlos: SMath Studio Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 05. Sep. 2011 13:44 <-- editieren / zitieren --> Unities abgeben: Nur für noxx
|
noxx Mitglied Steuerzahler
Beiträge: 801 Registriert: 13.12.2004 OS: Win 7 Ultimate 64 bit SP1 Speicher: 30 GB RAM Grafik: nVidia Quadro 4000 Creo Modelling v17.0
|
erstellt am: 05. Sep. 2011 13:49 <-- editieren / zitieren --> Unities abgeben:
danke, auch mit Loop habe ich meine Schwierigkeit: Code: (loop for x from 1 to 20 do (setf (ubogen_"~A" x) (* 0.5 (Winkel_"~A" x) DM_Unten )) )
Bekomme immer einen Fehler.....grr Gruss ------------------ Modelling 17.x WinXP SP3 ------------------------------- Mathcad kostenlos: SMath Studio Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 05. Sep. 2011 13:51 <-- editieren / zitieren --> Unities abgeben: Nur für noxx
Zitat: Original erstellt von noxx: Bekomme immer einen Fehler.....grr
*raeusper* Du magst uns nicht zufällig sagen, was das für ein Fehler ist? Wirst schon ein wenig mitarbeiten müssen. Na gut, in diesem Fall ist das trivial: Dein Code behauptet, dass es Funktion namens "winkel_" und "ubogen_" gebe. Die hast Du aber vermutlich nie definiert. Nochmal: Dein Problem ist NICHT die Schleife, sondern der Versuch, zur Laufzeit Variablen zu erzeugen. Lisp ist eine der wenigen Sprachen, in denen das überhaupt möglich ist, wenn auch nicht so, wie Du das gerade probierst. Ich bezweifle aber, dass das in diesem Fall nötig ist. Erklär uns doch mal den Hintergrund und warum Du es so probierst. Claus ------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ [Diese Nachricht wurde von clausb am 05. Sep. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
noxx Mitglied Steuerzahler
Beiträge: 801 Registriert: 13.12.2004 OS: Win 7 Ultimate 64 bit SP1 Speicher: 30 GB RAM Grafik: nVidia Quadro 4000 Creo Modelling v17.0
|
erstellt am: 05. Sep. 2011 13:54 <-- editieren / zitieren --> Unities abgeben:
sorry... Code:
LISP-Fehler: Cannot expand the SETF form (CUSTOM::UBOGEN_"~A" X).
EDIT:
Hintergrund: Ich will ein Makro wo man 20 Werte eingeben kann. Diese werden dann in der Schleife umgerechnet und wieder ausgegeben. Das ganze dann in Annotation auf dem Zeichnungsblatt. ------------------ Modelling 17.x WinXP SP3 ------------------------------- Mathcad kostenlos: SMath Studio [Diese Nachricht wurde von noxx am 05. Sep. 2011 editiert.] [Diese Nachricht wurde von noxx am 05. Sep. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 05. Sep. 2011 14:43 <-- editieren / zitieren --> Unities abgeben: Nur für noxx
|
noxx Mitglied Steuerzahler
Beiträge: 801 Registriert: 13.12.2004 OS: Win 7 Ultimate 64 bit SP1 Speicher: 30 GB RAM Grafik: nVidia Quadro 4000 Creo Modelling v17.0
|
erstellt am: 05. Sep. 2011 14:44 <-- editieren / zitieren --> Unities abgeben:
Im Moment habe ich das so gemacht, das jede Variable einzeln definiert wird, aber wird mit allem Kram zu lang. BSP:
Code:
(setf ubogen_1 (* 0.5 Winkel_1 DM_Unten )) (setf ubogen_2 (* 0.5 Winkel_2 DM_Unten )) (setf ubogen_3 (* 0.5 Winkel_3 DM_Unten )) (setf ubogen_4 (* 0.5 Winkel_4 DM_Unten )) (setf ubogen_5 (* 0.5 Winkel_5 DM_Unten )) (setf ubogen_6 (* 0.5 Winkel_6 DM_Unten )) (setf ubogen_7 (* 0.5 Winkel_7 DM_Unten )) (setf ubogen_8 (* 0.5 Winkel_8 DM_Unten )) (setf ubogen_9 (* 0.5 Winkel_9 DM_Unten )) (setf ubogen_10 (* 0.5 Winkel_10 DM_Unten )) (setf ubogen_11 (* 0.5 Winkel_11 DM_Unten )) (setf ubogen_12 (* 0.5 Winkel_12 DM_Unten )) (setf ubogen_13 (* 0.5 Winkel_13 DM_Unten )) (setf ubogen_14 (* 0.5 Winkel_14 DM_Unten )) (setf ubogen_15 (* 0.5 Winkel_15 DM_Unten )) (setf ubogen_16 (* 0.5 Winkel_16 DM_Unten )) (setf ubogen_17 (* 0.5 Winkel_17 DM_Unten )) (setf ubogen_18 (* 0.5 Winkel_18 DM_Unten )) (setf ubogen_19 (* 0.5 Winkel_19 DM_Unten )) (setf ubogen_20 (* 0.5 Winkel_20 DM_Unten ))
Es muss doch eine leichte Möglichkeit gegen, daraus einen Dreizeiler zu machen... Gruss ------------------ Modelling 17.x WinXP SP3 ------------------------------- Mathcad kostenlos: SMath Studio Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
noxx Mitglied Steuerzahler
Beiträge: 801 Registriert: 13.12.2004 OS: Win 7 Ultimate 64 bit SP1 Speicher: 30 GB RAM Grafik: nVidia Quadro 4000 Creo Modelling v17.0
|
erstellt am: 05. Sep. 2011 14:49 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von clausb: Zur weiteren Klärung: Was genau meinst Du mit "Makro"? Einen Dialog?
Ja, so ne kleine GUI..... Auch die Eingabe ist Ellenlang, da ich jede Wert Einzeln abfrage. Vermutlich viel zu komplex.. Code:
("Winkel in Grad") (Winkel_1 :value-type :angle :title "Winkel 1" rompt-text "1. Winkel angeben." :initial-value 0) (Winkel_2 :value-type :angle :title "Winkel 2" rompt-text "2. Winkel angeben." :initial-value 0) (Winkel_3 :value-type :angle :title "Winkel 3" rompt-text "3. Winkel angeben." :initial-value 0)usw usw
------------------ Modelling 17.x WinXP SP3 ------------------------------- Mathcad kostenlos: SMath Studio Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 05. Sep. 2011 16:59 <-- editieren / zitieren --> Unities abgeben: Nur für noxx
OK, jetzt wird die Sache klarer, danke! Ja, in Lisp könnte man (anders als in vielen anderen Sprachen) sowas in wenigen Zeilen cleveren Code hinschreiben. Kann aber sein, dass ihn hinterher nur Experten verstehen, In diesem konkreten Fall würde ich also die zwanzig Zeilen einfach hinschreiben. Solange Du darauf achtest, dass die Variablen lokal sind, ist damit wenig Schaden angerichtet. Ach ja, was passiert eigentlich mit den umgerechneten Werten, nachdem sie auf ubogen_x zugewiesen wurden?
------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
noxx Mitglied Steuerzahler
Beiträge: 801 Registriert: 13.12.2004 OS: Win 7 Ultimate 64 bit SP1 Speicher: 30 GB RAM Grafik: nVidia Quadro 4000 Creo Modelling v17.0
|
erstellt am: 05. Sep. 2011 17:17 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von clausb:Ach ja, was passiert eigentlich mit den umgerechneten Werten, nachdem sie auf ubogen_x zugewiesen wurden? [/B]
Werden als Text aufs Zeichnungsblatt gepackt. Mich würde aber dennoch interessieren, warum das bei mir mit der Lopp-Do nicht klappt, bzw wie ich den Fehler wegbekomme. Gruss und danke ------------------ Modelling 17.x WinXP SP3 ------------------------------- Mathcad kostenlos: SMath Studio Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 05. Sep. 2011 21:39 <-- editieren / zitieren --> Unities abgeben: Nur für noxx
Zitat: Original erstellt von noxx: Werden als Text aufs Zeichnungsblatt gepackt.
Dann brauchst Du das doch gar nicht mehr in Variablen zwischenspeichern, sondern kannst es sofort als Text-Kommando wegschicken, oder? (Welches Text-Kommando wolltest Du denn verwenden?) Zitat:
Mich würde aber dennoch interessieren, warum das bei mir mit der Lopp-Do nicht klappt, bzw wie ich den Fehler wegbekomme.
Wie gesagt, mit der Schleife hat das NICHTS zu tun. Nimm mal die Anweisung aus Deiner Schleife heraus und versuche sie einzeln auszuführen. Du wirst feststellen, dass das genausowenig geht: Code:
(setf DM_Unten 1) ;; nur zur Demo (setf x 1) ;; nur zur Demo (setf (ubogen_"~A" x) (* 0.5 (Winkel_"~A" x) DM_Unten ))
Das ist gaaaaanz weit weg von einem gültigen Ausdruck in Lisp. Ich fange mal an, ein paar Probleme aufzulisten: Problem Nummer 1: Die Stringkonkatenation geht so in Lisp einfach nicht. Strings konkatentiert man mit (concatenate 'string ...), eventuell auch mit (format). Problem Nummer 2: Du verwendest im literalen String "~A" eine Syntax, wie sie nur innerhalb von (format) verstanden wird. Von einem (format) ist aber weit und breit nichts zu sehen. Problem Nummer 3: Das erste Element einer unqoutierten Liste in Lisp ist immer ein Symbol, das für eine Funktion steht. Weder "ubogen_" noch "winkel_" noch die Versionen mit hinten angehängtem "~A" bezeichnen aber Funktionen (es sei denn, Du würdest welche mit solchen Namen definieren). Problem Nummer 4: Selbst wenn "ubogen_" eine gültige Funktion bezeichnete, müsste diese Funktion etwas zurückliefern, was man in Lisp ein "place" nennt (siehe http://www.lispworks.com/documentation/HyperSpec/Body/m_setf_.htm ). ------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/
[Diese Nachricht wurde von clausb am 05. Sep. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 05. Sep. 2011 22:50 <-- editieren / zitieren --> Unities abgeben: Nur für noxx
Und zur endgültigen Abschreckung jetzt die Schleife samt funktionierender Übersetzung des Zuweisungsversuches: Code:
(setf winkel_1 1) (setf winkel_2 2) (setf winkel_3 3) (setf winkel_4 4) (setf winkel_5 5) (setf winkel_6 6)(setf DM_Unten 42) (loop for i from 1 to 6 do (let ((new-symbol (make-symbol (format nil "UBOGEN_~D" i)))) (setf (symbol-value new-symbol) (* 0.5 (symbol-value (find-symbol (format nil "WINKEL_~D" i))) DM_Unten)) ))
Diese Variante hat aber mehrere Nachteile. Erstens verstehen sie wohl nur wenige. Zweitens sind die Symbole UBOGEN_x nicht lexikal gebunden, sind also auch ausserhalb von (let) noch zugänglich. Drittens ist der Code vor allem wegen (find-symbol) recht langsam. Alternative Implementierung auf Basis von (eval): Code:
(setf winkel_1 1) (setf winkel_2 2) (setf winkel_3 3) (setf winkel_4 4) (setf winkel_5 5) (setf winkel_6 6)(setf DM_Unten 42) (loop for i from 1 to 6 do (eval (read-from-string (format nil "(setf UBOGEN_~D (* 0.5 DM_Unten WINKEL_~D))" i i))))
Auch auf diese Variante treffen die oben erwähnten Nachteile zu.
------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
noxx Mitglied Steuerzahler
Beiträge: 801 Registriert: 13.12.2004 OS: Win 7 Ultimate 64 bit SP1 Speicher: 30 GB RAM Grafik: nVidia Quadro 4000 Creo Modelling v17.0
|
erstellt am: 06. Sep. 2011 09:06 <-- editieren / zitieren --> Unities abgeben:
|
noxx Mitglied Steuerzahler
Beiträge: 801 Registriert: 13.12.2004 OS: Win 7 Ultimate 64 bit SP1 Speicher: 30 GB RAM Grafik: nVidia Quadro 4000 Creo Modelling v17.0
|
erstellt am: 06. Sep. 2011 11:18 <-- editieren / zitieren --> Unities abgeben:
hmm, habs mehrmals gelesen, verstanden habe ich es aber immer noch nicht. ist auch nicht schlimm, solange es läuft aber: beide codes funktionieren irgendwie nicht. beim ersten code kommt: die variable Winkel_1 ist nicht gebunden. Dies kann folgende Ursachen haben..... beim zweiten code kommt: die variable DM_UNTEN ist nicht gebunden. Dies kann folgende Ursachen haben..... Gruss ------------------ Modelling 17.x WinXP SP3 ------------------------------- Mathcad kostenlos: SMath Studio Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 06. Sep. 2011 13:13 <-- editieren / zitieren --> Unities abgeben: Nur für noxx
Ich habe gerade beide Beispiele nochmal in CoCreate Modeling geladen. Keinerlei Fehler. Hab's auch ohne Probleme in zwei alternativen Lisp-Implementierungen ausprobiert (SBCL, CLISP). Vielleicht mag's ja jemand zur Verifikation mal in seinem Modeling ausprobieren (Codebeispiele als Lispdatei abspeichern, reinladen - wenn kein Fehler angezeigt wird, hat es funktioniert). ------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/
[Diese Nachricht wurde von clausb am 07. Sep. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |