| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: Programmwiederholung (1284 mal gelesen)
|
Karli 99 Mitglied Zimmerer
Beiträge: 17 Registriert: 18.08.2005
|
erstellt am: 22. Aug. 2005 20:23 <-- editieren / zitieren --> Unities abgeben:
Hallo liebe Lisp-freunde, ich habe gleich 2 Anliegen. 1 Frage Ich habe ein Programm geschrieben wo ca. 15 Eingaben zu taetigen sind, nun moechte ich gern dass ich fuer eine Aenderung nicht nochmal alle Eingaben neu taetigen muss. Es sollten bei einem 2,3,.. Progammdurchlauf die Eingaben vom jeweilig vorherigen Durchlauf optional zu aendern sein. Also ist es irgendwie moeglich da sowas wie eine Schleife einzubauen, nachdem das 1 Programm abgelaufen ist, soll mir das 2 die Werte des ersten als Vorschlagswerte geben. Wenn ja wie koennte das ungefaehr aussehen? 2 Frage Wo muss ich meine Lispdatei speichern, dass ich nicht bei jedem neuen Autocadstart das ganze erst laden muss, also dass ich mit meinem Aufrufbefehl direkt in die Befehlzeile gehen kann und das Programm laeuft? Schon mal Danke fuer Eure Hilfe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 22. Aug. 2005 20:41 <-- editieren / zitieren --> Unities abgeben: Nur für Karli 99
zu 1.)denke ein Beispiel erläutert das am besten: Code:
(defun c:Testus ( / Abbruch A B) (setq A 1.0) (setq B '(0.0 0.0 0.0)) (While (not Abbruch) (or(setq A (getreal (strcat"\nEG1 (Real) <"(vl-princ-to-string A)">: "))) A ) (or(setq B (getpoint (strcat"\nEG2(Punkt) <"(vl-princ-to-string B)">: "))) B ) (initget "Ja Nein") (setq Abbruch(=(getkword "\nAbbruch [Ja/Nein]<Nein>?:")"J")) ) )
zu 2.) such mal im Forum bzw. in der Hilfe zu acaddoc.lsp und *.mnl------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." [Diese Nachricht wurde von CADmium am 22. Aug. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karli 99 Mitglied Zimmerer
Beiträge: 17 Registriert: 18.08.2005
|
erstellt am: 23. Aug. 2005 00:21 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas, Danke fuer deine schnelle Hilfe, ich habe dein Bsp. auf mein Programm modifiziert, die Abfragen laufen auch super durch und ich kann die neuen Werte, wenn noetig eingeben, nur fuehrt mir anschliessend das Programm die neuen Eingaben nicht aus, und bei einem weiteren Durchlauf stehen nur die Werte aus meiner 2 Eingabe in der Liste, alle anderen nil. Hast du ne Idee woran das liegen kann?? Leider bin ich mit diesen Ablaeufen noch nicht vertraut, sonst koennte ich mir selbst weiter helfen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 23. Aug. 2005 06:47 <-- editieren / zitieren --> Unities abgeben: Nur für Karli 99
Hallo Karli, das liegt daran, dass die eingegebenen Werte auch dann gespeichert werden, wenn der Anwender den Vorgabewert nur mit Enter bestätigt. Da muss man noch ein wenig ändern. Ich habe die Abfrage mal dahingehend angepasst, dass die letzten Eingaben auch beim nächsten Programmstart zur Verfügung stehen. Dazu verwende ich eine globale Variable. In dieser werden, sofern der User Werte eingegeben hat, die aktuellen Werte ausgetauscht. Ebenfalls habe ich die Funktion zur Ermittlung der Eingaben von der Hauptfunktion getrennt. Bei Fragen ... Grüße Holger
Code:
;;;Globale Variable (setq *TESTUSWERTE* '(("A" . 1.0)("B" . (0.0 0.0 0.0)))) (defun c:Testus () ;Werte ermitteln (Testus:Abfragen) ;Werte verarbeiten (command "_Line" '(0.0 0.0 0.0);Linie von 0,0 zum (cdr(assoc"B"*TESTUSWERTE*));Pickpunkt "" ) (princ) ) (defun Testus:Abfragen ( / Abbruch A B) (While (not Abbruch) (setq A (getreal (strcat"\nEG1 (Real) <"(vl-princ-to-string (cdr (assoc "A" *TESTUSWERTE*)))">: ")) B (getpoint (strcat"\nEG2(Punkt) <"(vl-princ-to-string (cdr (assoc "B" *TESTUSWERTE*)))">: ")) ) (if A (setq *TESTUSWERTE* (subst (cons "A" A)(assoc "A"*TESTUSWERTE*)*TESTUSWERTE*))) (if B (setq *TESTUSWERTE* (subst (cons "B" B)(assoc "B"*TESTUSWERTE*)*TESTUSWERTE*))) (initget "Ja Nein") (setq Abbruch (= (getkword "\nAbbruch [Ja/Nein]<Nein>?:") "Ja")) ) )
------------------ Holger Brischke CAD on demand GmbH Autodesk User Group Central Europe Individuelle Lösungen von Heute auf Morgen. AUGCE Manager Deutschland Jackpot on demand - Wir eröffnen den Spätsommer mit einer Verlosung!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karli 99 Mitglied Zimmerer
Beiträge: 17 Registriert: 18.08.2005
|
erstellt am: 24. Aug. 2005 00:27 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, leider bekomme ich es nicht hin deine Variante auf mein Programm zu modifizieren. Ich moechte eigentlich nur dass ich die Eingaben, die bei dem 2,3, usw. Programmdurchlauf in den < > Klammern stehen mit Enter bestaetigt bzw. uebernommen werden. Leider laeft das nur wenn ich jeden Wert nochmal eintippe. Kann ich das irgendwie machen mit der ersten Variante von Thomas, oder muss ich da mit den globalen Variablen arbeiten (womit ich nicht so richtig warm werde)??? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 24. Aug. 2005 00:37 <-- editieren / zitieren --> Unities abgeben: Nur für Karli 99
|
otterloh Mitglied
Beiträge: 188 Registriert: 27.06.2001 AutoCAD 2008, 2010 Vista, Win7
|
erstellt am: 24. Aug. 2005 10:17 <-- editieren / zitieren --> Unities abgeben: Nur für Karli 99
|
Karli 99 Mitglied Zimmerer
Beiträge: 17 Registriert: 18.08.2005
|
erstellt am: 24. Aug. 2005 18:23 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, hier mal der Ausschnitt (initget "Yes No") (setq Finish(=(getkword "\nFinish [Yes/No]<No>?:")"Yes")) (While (not Finish) (or(setq P1 (getpoint (strcat"\nPosition new <"(vl-princ-to-string P1)">: "))) P1 ) (or(setq S1 (getdist (strcat"\nGablewidth new <"(vl-princ-to-string S1)">: "))) S1 ) (or(setq An (getdist (strcat"\nPitch Rise new <"(vl-princ-to-string An)">: "))) An ) (or(setq St (getdist (strcat"\nStep new <"(vl-princ-to-string St)">: "))) St ) (or(setq S2 (getdist (strcat"\nPitch+ new <"(vl-princ-to-string S2)">: "))) S2 ) (or(setq GF (getdist (strcat"\nRidge Gain new <"(vl-princ-to-string GF)">: "))) GF ) (or(setq GL1 (getdist (strcat"\n1 Purlin Gain left new <"(vl-princ-to-string GL1)">: "))) GL1 ) (or(setq GL2 (getdist (strcat"\n2 Purlin Gain left new <"(vl-princ-to-string GL2)">: "))) GL2 ) (or(setq GL3 (getdist (strcat"\n3 Purlin Gain left new <"(vl-princ-to-string GL3)">: "))) GL3 ) (or(setq GR1 (getdist (strcat"\n1 Purlin Gain right new <"(vl-princ-to-string GR1)">: "))) GR1 ) (or(setq GR2 (getdist (strcat"\n2 Purlin Gain right new <"(vl-princ-to-string GR2)">: "))) GR2 ) (or(setq GR3 (getdist (strcat"\n3 Purlin Gain right new <"(vl-princ-to-string GR3)">: "))) GR3 ) (or(setq S3 (getdist (strcat"\nP1 center new <"(vl-princ-to-string S3)">: "))) S3 ) (or(setq S4 (getdist (strcat"\nP2 center new <"(vl-princ-to-string S4)">: "))) S4 ) (or(setq S5 (getdist (strcat"\nP3 center new <"(vl-princ-to-string S5)">: "))) S5 ) Ich moechte gern dass ich die Zahlenwerte, die aus dem ersten Programmdurchlauf in den < > Klammern stehen einfach mit Enter bestaetigt werden. Und nur wo ich eine Aenderung vornehmen will moechte ich eine neue Eingabe machen (das funktioniert auch super, nur eben kann ich nichts mit Enter durchdrucken, sondern muss alles neu eingeben. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 24. Aug. 2005 20:23 <-- editieren / zitieren --> Unities abgeben: Nur für Karli 99
Hallo Karli, in welcher Entwicklungsumgebung programmierst du denn? Nimm mal den VLIDE und setze an der ersten öffnenden Klammer einen Haltepunkt (F9). Dann lädst du das Programm und startest es. Das Programm stoppt nun an dieser Stelle. Du schaltest dir nun das Überwachungsfenster ein und lässt dir die letzte Rückkabe anzeigen. Du kannst nun mittels F8 im Einzelschritt durch den Code 'wandern' und siehst im Überwachungsfenster das jeweiligen Ergebnis der einzelnen Befehle. Ich denke, wenn du dies gemacht hast, wirst du schlauer sein. Dann wirst du merken, dass (getXXX funktionen ein nil zurück geben, wenn die Eingabeaufforderung nur mit Enter bestätigt wird.
Code: (or(setq P1 (getpoint (strcat"\nPosition new <"(vl-princ-to-string P1)">: "))) P1 )
Diese Zeilen sind 'Käse'. Die Rückgabe vom (or ..) verschwindet im Nirvana, und die Variable P1 wird mit der Rückgabe aus (getpoint ..)=nil überschrieben. Meine Zeilen oben hast du wohl nicht weiter betrachtet? Hier würdest du feststellen, dass ich die Rückgabe der (getXXX..) Funktionen zunächst in einer Variablen speichere. Erst danach prüfe ich den Variableninhalt. Hat die Variable einen Wert, erst dann wird dieser Wert weggeschrieben. Hat sie keinen Wert, bleiben die in einer Liste gespeicherten Eingaben unverändert. Dieses Prinzip auf dein Eingabekonstrukt geändert könnte dann wie folgt aussehen:
Code: (setq P1a (getpoint (strcat"\nPosition new <"(vl-princ-to-string P1)">: "))) (setq P1 (if P1a P1a P1))
Alternativ, da man ja nun nicht unendlich viel schreiben möchte, siehst du nachfolgend eine andere Lösung. Diese hat den Vorteil, dass sie leicht um weitere Abfragen erweitert werden kann, ohne unendlich viel Code zu produzieren.
Code: (setq finish nil) (While (not Finish) (foreach AB '( (P1 getpoint "Position new") (S1 getdist "Gablewidth new") (An getdist "Pitch Rise new") (St getdist "Step new") (S2 getdist "Pitch+ new") (GF getdist "Ridge Gain new") (GL1 getdist "1 Purlin Gain left new") (GL2 getdist "2 Purlin Gain left new") (GL3 getdist "3 Purlin Gain left new") (GR1 getdist "1 Purlin Gain right new") (GR2 getdist "2 Purlin Gain right new") (GR3 getdist "3 Purlin Gain right new") (S3 getdist "P1 center new") (S4 getdist "P2 center new") (S5 getdist "P3 center new") ) (setq temp((eval (cadr AB)) (strcat"\n"(caddr AB)" <"(vl-princ-to-string (eval(car AB)))">: "))) (if temp (set (car AB) temp)) ) (initget "Yes No") (setq Finish(=(getkword "\nFinish [Yes/No]<No>?:")"Yes")) )
Schau dir diese auch im Debugger-Modus (Einzelschritt) an, um sie zu verstehen.Bei Fragen ... Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Autodesk User Group Central Europe Individuelle Lösungen von Heute auf Morgen. AUGCE Manager Deutschland Jackpot on demand - Wir eröffnen den Spätsommer mit einer Verlosung!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karli 99 Mitglied Zimmerer
Beiträge: 17 Registriert: 18.08.2005
|
erstellt am: 25. Aug. 2005 00:34 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, zuerst mal tausend Dank dass du dich so intensiv mit meinem Problem beschaeftigt hast. Selbst haette ich das nicht auf die Reihe bekommen, aber ich lerne immer gern dazu. Habe jetzt mal die beiden Loesungen von dir eingebaut und das Programm laeuft genauso ab wie ich mir vorgestellt habe. Mein Problem ist halt dass ich ein kleines Licht an grossen Lisp-Himmel bin und den Leuten, in der Firma fuer die ich das mache, immer noch ein bisschen mehr eingefallen ist wie das Programm ablaufen koennte. Tja und da hat's dann bei mir die Fragezeichen rausgehauen. Denke bzw. Hoffe dass das jetzt so wie es ist passt und ich dich nicht mehr nerven muss mit solchem "Kinderkram" (-: Was genau meinst du mit Entwicklungsumgebung, ich arbeite hier mit 'Autodesk Arcitectural Desktop 2004' wenn du das wissen wolltest. also dann nochmals vielen Dank fuer deine prima Zuarbeit und ne schoene restliche Woche Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 25. Aug. 2005 05:55 <-- editieren / zitieren --> Unities abgeben: Nur für Karli 99
|
Karli 99 Mitglied Zimmerer
Beiträge: 17 Registriert: 18.08.2005
|
erstellt am: 25. Aug. 2005 06:59 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, in das Programm gehe ich auch immer mit vlide, glaube das heisst Visual Lisp Editor (wusste gar nicht dass es da Unterschiede gibt). Aber morgen frueh (bzw. bei dir heute Nachmittag -> ich bin 9 h hinterher) bin ich wieder auf Arbeit, da kann ich dir nochmal genau bescheid geben mit dem Namen und Version. Ne kleinigkeit haette ich gleich noch und zwar will mein Chef noch einen Text, den ich in dem Programm unterbringe neben der Zeichnung haben, wie kann ich das machen, dass ich den an einem Punkt einfuege den ich definiere. Ach bevor wieder die Frage nach dem Text kommt, er soll genauso wie die Bemassungstexte sein und sich mit dem Bemstil aendern... Ist das dann der Mtext, nachdeim ich das letzte Mal gefragt wurde? Ich muss mich noch bisschen weiter auf den mapcar-Seiten vorarbeiten, dann kann ich mir auch mal was selbst beantworten. Noch nen schoenen Arbeitstag, ich gehe jetzt erstmal schlafen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 25. Aug. 2005 07:27 <-- editieren / zitieren --> Unities abgeben: Nur für Karli 99
Hallo Karli, die Version ist unwichtig. Wichtig ist, dass du mit dem Debuggen zurecht kommst. Das ist eine unwahrscheinliche Erleichterung und Hilfe beim Prüfen, Lernen und Verstehen der Codes. Das, was du als Kleinigkeit siehst, ist es nicht. Soll der Text wirklich so aussehen, wie ein Bemaßungstext, dann musst du zunächst die aktuelle Bemaßung auslesen, und dir von dort die aktuellen Einstellungen des Textes ermitteln. Willst du, dass sich dieser Text auch bei Veränderung des Bem-Stiles ändert, dann wird es noch komplizierter. Da ist zu überlegen, ob man dann nicht eine Bemaßung einsetzt. Du arbeitest mit dem ADT, hier kommt erschwerend hinzu, dass du entweder mit einer AEC-Bemaßung oder der normalen AutoCAD-Bemaßung arbeiten kannst, was die Sache auch nicht einfacher macht. Deine Frage nach dem Punkt, den du selbst definierst, erstaunt mich ein wenig, hast du doch die ganze Zeit mit den (getXXX..)Befehlen gekämpft??? Geh die Sache langsam an, das oben beschriebene ist für eine schnelle Lösung zu komplex bei deinem derzeitigen Wissensstand. Tip: Mache einen einfachen Text, der den Einstellungen des aktuellen Bemaßungsstil entspricht, fertig. Grüße Holger
------------------ Holger Brischke CAD on demand GmbH Autodesk User Group Central Europe Individuelle Lösungen von Heute auf Morgen. AUGCE Manager Deutschland Jackpot on demand - Wir eröffnen den Spätsommer mit einer Verlosung!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|