| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: ACTION_TILE mit liste (602 mal gelesen)
|
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 667 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 28. Okt. 2022 12:57 <-- editieren / zitieren --> Unities abgeben:
Servus! Kann man anstatt (action_tile "A" "(machwas 1") (action_tile "B" "(machwas 2") auch eine Liste verwenden? (FOREACH n '(("A" 1) ("B" 2)) (action_tile (NTH 0 n) "(machwas (NTH 1 n))")) Hintergrund: Ich möchte die keys plus Zusatzinfos aus einer Parameterdatei einlesen und dann eine temp. DCL-Datei schreiben. Die DCL-Auswahl geht noch, dann bricht das Programm ab "Fehlerhafter Argumenttyp: consp nil". Ciao Georg
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 28. Okt. 2022 13:28 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
STRINGs sind fett hervorgehoben (action_tile "A" "(machwas 1")(action_tile "A" "(machwas 1)") (action_tile "B" "(machwas 2")(action_tile "B" "(machwas 2)") (FOREACH n '(("A" 1) ("B" 2)) (action_tile (NTH 0 n) "(machwas (NTH 1 n))"))
(NTH 0 n) => "A" = String, gut "(machwas (NTH 1 n))" = String, gut - aber der Stringinhalt ist halt Mist? "(machwas (NTH 1 n))"
(FOREACH n '(("A" 1) ("B" 2)) (action_tile (NTH 0 n) (strcat "(machwas " (itoa(NTH 1 n)) ")"))) oder gleich (FOREACH n '(("A" "1") ("B" "2")) und (FOREACH n '(("A" 1) ("B" 2)) (action_tile (NTH 0 n) (strcat "(machwas " (NTH 1 n) ")"))) oder
(FOREACH n '(("A" 1) ("B" 2)) (action_tile (NTH 0 n) (vl-princ-to-string (list 'machwas (NTH 1 n))))) (FOREACH n '(("A" 1) ("B" 2)) (action_tile (car n) (vl-princ-to-string (list 'machwas (last n))))) wobei ich "2er Listen nicht leiden kann, dafür gibt es dottedpairs, also (FOREACH n '(("A" . 1) ("B" . 2)) (action_tile (car n) (vl-princ-to-string (list 'machwas (cdr n))))) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 667 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 28. Okt. 2022 14:07 <-- editieren / zitieren --> Unities abgeben:
|
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 667 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 01. Nov. 2022 12:01 <-- editieren / zitieren --> Unities abgeben:
Servus! Muss jetzt doch nochmal zu dem Thema fragen, evtl. kann mir jemand helfen. Warum gibt mir Variante 1 den richtigen Wert für var zurück und Variante 2 nil? Hab ich evtl einen Denkfehler mit foreach und das geht nicht mit action_tile ? (SETQ dcl_id (LOAD_DIALOG "sbem.dcl")) (IF (NOT (NEW_DIALOG "sbem_dcl" dcl_id)) (exit))
;******** Variante 1 ************* ;(ACTION_TILE "1" "(SETQ var \"1\") (DONE_DIALOG)") ;(ACTION_TILE "2" "(SETQ var \"2\") (DONE_DIALOG)") ;(ACTION_TILE "3" "(SETQ var \"3\") (DONE_DIALOG)") ;(ACTION_TILE "cancel" "(SETQ var \"Abbruch\") (DONE_DIALOG)") ;******** Variante 2 ************* (FOREACH n '(("1" 0.305 1) ("2" 0.405 5) ("3" 0.505 7)) (ACTION_TILE (NTH 0 n) "(SETQ var (NTH 0 n)) (DONE_DIALOG)") ) (ACTION_TILE "cancel" "(SETQ var \"Abbruch\") (DONE_DIALOG)") ;********************************* (START_DIALOG) (UNLOAD_DIALOG dcl_id) (ALERT var) Ciao Georg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 823 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 03. Nov. 2022 13:20 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
Zitat: Original erstellt von gmk: Servus!Muss jetzt doch nochmal zu dem Thema fragen, evtl. kann mir jemand helfen. Warum gibt mir Variante 1 den richtigen Wert für var zurück und Variante 2 nil? Hab ich evtl einen Denkfehler mit foreach und das geht nicht mit action_tile ? (SETQ dcl_id (LOAD_DIALOG "sbem.dcl")) (IF (NOT (NEW_DIALOG "sbem_dcl" dcl_id)) (exit))
;******** Variante 1 ************* ;(ACTION_TILE "1" "(SETQ var \"1\") (DONE_DIALOG)") ;(ACTION_TILE "2" "(SETQ var \"2\") (DONE_DIALOG)") ;(ACTION_TILE "3" "(SETQ var \"3\") (DONE_DIALOG)") ;(ACTION_TILE "cancel" "(SETQ var \"Abbruch\") (DONE_DIALOG)") ;******** Variante 2 ************* (FOREACH n '(("1" 0.305 1) ("2" 0.405 5) ("3" 0.505 7)) (ACTION_TILE (NTH 0 n) "(SETQ var (NTH 0 n)) (DONE_DIALOG)") ) (ACTION_TILE "cancel" "(SETQ var \"Abbruch\") (DONE_DIALOG)") ;********************************* (START_DIALOG) (UNLOAD_DIALOG dcl_id) (ALERT var) Ciao Georg
Trivial: die zweite Variante gibt korrekt die Auswertung des letzten Ausdrucks der FOREACH-Schleife zurück, und das dürfte NIL sein. Es geht Dir ja aber nicht um die Rückgabe der FOREACH-Schleife, sondern um die Zuweisung zur Variablen VAR
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 667 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 03. Nov. 2022 13:45 <-- editieren / zitieren --> Unities abgeben:
Servus Tom, ich hatte ja schon die Vermutung dass hier mein Denkfehler liegt. Ich hatte mir das immer so vorgestellt dass sich der Interpreter die ACTION_TILE Funktionen der Reihe nach "merkt" und beim Drücken eines Buttons dann die entsprechende ACTION_TILE Funktion ausführt. Das hätte mit FOREACH ja funktioniert... Wie kann ich denn dann die Liste '(("1" 0.305 1) ("2" 0.405 5) ("3" 0.505 7)), die aus einer Parameterdatei kommen soll, in die einzelnen ACTION_TILE Funktionen einlesen. Hab jetzt nur noch die Idee eine Sublisp-Datei aus der Hauptfunktion zu schreiben und die dann mit APPLOAD zur Laufzeit einzulesen .... oder bin ich da auch auf dem Holzweg? Ciao Georg
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 823 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 03. Nov. 2022 14:16 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
Zitat: Original erstellt von gmk: Servus Tom,ich hatte ja schon die Vermutung dass hier mein Denkfehler liegt.
Sorry, mein Fehler. Natürlich wird durch das ACTION_TILE festgelegt, was beim Drücken des Tiles passiert. Wenn Du das Tile (Button?) mit key "3" drückst, wird dann für VAR NIL ausgegeben? Ein ALERT kann ja kein NIL ausgeben, sondern nur Strings. Was hast Du denn da sonst noch alles an Code vebastelt? Was ist der Rückgabewert welcher Funktion? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 03. Nov. 2022 14:19 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
|
archtools Mitglied
Beiträge: 823 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 03. Nov. 2022 14:31 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
Zitat: Original erstellt von joern bosse: Hallo Georg, Du könntest doch den ganzen String mit STRCAT zusammenbauen, dass müßte funktionieren:
Code:
(foreach n '(("1" 0.305 1) ("2" 0.405 5) ("3" 0.505 7)) (action_tile (car n) (strcat "(setq var \"" (car n) "\")(DONE_DIALOG)")))
Das ist mit Sicherheit der Fehler. Sorry, ist mir nicht aufgefallen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 667 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 03. Nov. 2022 14:49 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von joern bosse: Hallo Georg, Du könntest doch den ganzen String mit STRCAT zusammenbauen, dass müßte funktionieren:
Code:
(foreach n '(("1" 0.305 1) ("2" 0.405 5) ("3" 0.505 7)) (action_tile (car n) (strcat "(setq var \"" (car n) "\")(DONE_DIALOG)")))
Super Jörn, das war die Lösung. Der Sebastian hat es ja in der ersten Antwort auch schon so vorgeschlagen aber ich hab's wohl falsch bei mir umgesetzt.
Danke Euch allen für die Hilfe ! Ciao Georg [Diese Nachricht wurde von gmk am 03. Nov. 2022 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |