| |
| 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: action_tile (1436 mal gelesen)
|
fca_mi2 Mitglied Bauingenieur
Beiträge: 508 Registriert: 10.01.2003 ACAD2018
|
erstellt am: 16. Dez. 2003 10:59 <-- editieren / zitieren --> Unities abgeben:
moin, ich habe in einem dialogfeld ein eingabefeld und ein listenfeld. immer wenn ich in dem eingabefeld bin und mit return bestätige soll der eintrag in das listenfeld übernommen werden. das problem ist nur, wenn ich das dialogfeld verlasse, wird der letzte eintrag nochmals übernommen.
------------------
MfG Frank 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: 16. Dez. 2003 11:23 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
Hallo Frank, was soll man dir dabei helfen? Das ist ein Logik-Problem. Ich vermute, du hat in dem (action-tile ..) vom ok Feld auch diese Anweisung drin, die dir das Listenfeld um diesen Wert erweiteret. Das muss da raus. Bei Fragen ... Grüße Holger ------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fca_mi2 Mitglied Bauingenieur
Beiträge: 508 Registriert: 10.01.2003 ACAD2018
|
erstellt am: 16. Dez. 2003 11:25 <-- editieren / zitieren --> Unities abgeben:
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 16. Dez. 2003 11:30 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
poste mal die Tile-Definition aus der DCL und den zugehörigen (action-tile..) Ein Action-Tile beim Edit Feld wird immer dann ausgeführt, wenn dieses verlassen wird. Dabei ist es egal wohin man mit der Maus klickert. Grüße Holger ------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fca_mi2 Mitglied Bauingenieur
Beiträge: 508 Registriert: 10.01.2003 ACAD2018
|
erstellt am: 16. Dez. 2003 12:25 <-- editieren / zitieren --> Unities abgeben:
hier die dcl : fc_kaefig : dialog { label="Käfig bauen"; :row{ :boxed_column{ :edit_box { key = "DCLEdit1" ; label = "Abstand in x-Richtung" ; value = "0" ; edit_width = 3 ; height = 0.9 ; } : button { key = "DCLButton1" ; label = "x Einfügen" ; width = 10.0 ; height = 2.1 ; is_tab_stop = false ; } :list_box { key = "DCLListLabel1" ; label = "Abtände in x-Richtung" ; width = 10.0 ; height = 10.0 ; is_tab_stop = false ; list = "" ; } } :boxed_column{ :edit_box { key = "DCLEdit2" ; label = "Abstand in y-Richtung" ; value = "0" ; edit_width = 3 ; height = 0.9 ; } : button { key = "DCLButton2" ; label = "y Einfügen" ; width = 10.0 ; height = 2.1 ; is_tab_stop = false ; } :list_box { key = "DCLListLabel2" ; label = "Abtände in y-Richtung" ; width = 10.0 ; height = 10.0 ; is_tab_stop = false ; list = "" ; } } :boxed_column{ :edit_box { key = "DCLEdit3" ; label = "Höhenlage in z-Richtung" ; value = "0" ; edit_width = 3 ; height = 0.9 ; } : button { key = "DCLButton3" ; label = "z Einfügen" ; width = 10.0 ; height = 2.1 ; is_tab_stop = false ; } :list_box { key = "DCLListLabel3" ; label = "Höhenlagen in z-Richtung" ; width = 10.0 ; height = 10.0 ; is_tab_stop = false ; list = "" ; } } } ok_only; } und hier das lisp :
(defun ld_fc_kaefig( / dcl_id) (defun x_einfueg (/) (if (and (= x_liste nil) (/= (get_tile "DCLEdit1") "")) (setq x_liste (list (get_tile "DCLEdit1"))) (setq x_liste (append x_liste (list (get_tile "DCLEdit1")))) );if ;;; (set_tile "DCLEdit1" "") (start_list "DCLListLabel1") (mapcar 'add_list x_liste) (end_list) );defun (defun y_einfueg (/) (if (and (= y_liste nil) (/= (get_tile "DCLEdit2") "")) (setq y_liste (list (get_tile "DCLEdit2"))) (setq y_liste (append y_liste (list (get_tile "DCLEdit2")))) );if ;;; (set_tile "DCLEdit2" "") (start_list "DCLListLabel2") (mapcar 'add_list y_liste) (end_list) );defun (defun z_einfueg (/) (if (and (= z_liste nil) (/= (get_tile "DCLEdit3") "")) (setq z_liste (list (get_tile "DCLEdit3"))) (setq z_liste (append z_liste (list (get_tile "DCLEdit3")))) );if (set_tile "DCLEdit3" "") (start_list "DCLListLabel3") (mapcar 'add_list z_liste) (end_list) );defun (defun init_handler() ;Initialation_Code (setq x_liste nil) (setq y_liste nil) (setq z_liste nil) (princ) );End of Initial Function (defun set_data() ;Start Set function (princ) );End of Set function (defun get_data() ;Start Get function (princ) );End of Get function (if (setq dcl_id (load_dialog "fc_kaefig.DCL")) (if (new_dialog "fc_kaefig" dcl_id) (progn (init_handler) (set_data) (action_tile "accept" "(get_data)(done_dialog)") (action_tile "DCLEdit1" "(x_einfueg)") (action_tile "DCLEdit2" "(y_einfueg)") (action_tile "DCLEdit3" "(z_einfueg)") (start_dialog) (unload_dialog dcl_id) ) ) ) ) (defun c:kae (/ bx by bz n n2 ep epx epy epz zp zpx zpy zpz) (ld_fc_kaefig)
(fc_layer_anlegen "T__KONS_KAEFIG" "cyan" "continuous" "acadiso-lin") (setq bx 0) (setq by 0) (foreach n x_liste (setq bx (+ bx (atof n))) );foreach (princ "\nbx:") (princ bx) (foreach n y_liste (setq by (+ by (atof n))) );foreach (princ "\nby:") (princ by) (setq epz 0.0) (setq zpz 0.0) (foreach n2 z_liste (setq epz (atof n2)) (setq zpz epz) (setq epx 0.0) (setq epy 0.0) (setq zpx 0.0) (setq zpy 0.0) (foreach n x_liste (setq epx (+ epx (atof n))) (setq epy (- 0.0 2.00)) (setq ep (list epx epy epz)) (setq zpx epx) (setq zpy (+ by 2.00)) (setq zp (list zpx zpy zpz)) (fc_linie ep zp "T__KONS_KAEFIG" 256 1.00 "bylayer") );foreach (setq epx 0.0) (setq epy 0.0) (setq zpx 0.0) (setq zpy 0.0) (foreach n y_liste (setq epx (- 2.00)) (setq epy (+ epy (atof n))) (setq ep (list epx epy epz)) (setq zpx (+ bx 2.00)) (setq zpy epy) (setq zp (list zpx zpy zpz)) (fc_linie ep zp "T__KONS_KAEFIG" 256 1.00 "bylayer") );foreach );foreach );defun
------------------
MfG Frank Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 16. Dez. 2003 12:44 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
bin mir nicht ganz sicher , aber du müsstest im action-tile den parameter $REASON deiner lisp-funktion mitgegen, der ist soweit ich noch weiss bei verlassen eines eingabefeldes mit tab oder maus den wert 2 bei enter den wert 1 in etwa so: (action_tile "MeineEingabeBox" "(MeinLispFuerEingabe $REASON)") und im lisp den wert abprüfen, nur bei 1 die liste aktualisieren sonst häng dochmal ein print rein , um die variable zu prüfen ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 16. Dez. 2003 12:55 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
hab jetzt erst gesehen, dass du dein lisp und dcl gepostet hast im action_tile ergäntzt du folgendermassen (action_tile "DCLEdit1" "(x_einfueg $REASON)") un im aufgerufenem programm prüfst du den übergebenen wert (defun x_einfueg ( wie /) (cond ((= wie 1) ; mit enter .... nur hier soller weietrtun ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 16. Dez. 2003 13:03 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
noch ein tipp ich würde die 3 unterprogramme x-einfueg y-einfueg und z-einfueg zusammenlegen auf ein programm in etwa so (action_tile "DCLEdit1" "(einfueg $REASON $value $key)") (action_tile "DCLEdit2" "(einfueg $REASON $value $key)") (action_tile "DCLEdit3" "(einfueg $REASON $value $key)") und zum testen (defun einfueg ( wie wert wer / ) (print wie) (print wert) (print wer) ) mit $REASON bekommst du wie der event zustandekam mit $VALUE bekommst du den inhalt des eingabefeldes mit $KEY bekommst du welches eingabefeld das lisp gestartet hat damit könnte man das ganze etwas übersichtlicher machen ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fca_mi2 Mitglied Bauingenieur
Beiträge: 508 Registriert: 10.01.2003 ACAD2018
|
erstellt am: 16. Dez. 2003 13:10 <-- editieren / zitieren --> Unities abgeben:
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 16. Dez. 2003 13:28 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
Hallo Frank, war zu langsam beim umstellen deines Codes. Dennoch mal ein paar Änderungen, die dir den Umgang mit (defun und der Übergabe von Variablen etwas verdeutlichen. Ich würde das Einfügen eines neuen Listenwertes nur dann machen, wenn der Anwender bewusst den Einfügen-Button drückt. Also nix mit (action-tile ..) beim Edit-Feld. Schau es dir an, und bei Fragen ... Grüße Holger
Code:
(defun ld_fc_kaefig(x_liste y_liste z_liste / dcl_id) (if (setq dcl_id (load_dialog "fc_kaefig.DCL")) (if (new_dialog "fc_kaefig" dcl_id) (progn (dcl:set_list "DCLListLabel1" x_liste) (dcl:set_list "DCLListLabel2" y_liste) (dcl:set_list "DCLListLabel3" z_liste) (action_tile "accept" "(done_dialog)") (action_tile "DCLButton1" "(setq x_liste(xyz_einfueg \"DCLListLabel1\" \"DCLEdit1\" x_liste))") (action_tile "DCLButton2" "(setq y_liste(xyz_einfueg \"DCLListLabel2\" \"DCLEdit2\" y_liste))") (action_tile "DCLButton3" "(setq z_liste(xyz_einfueg \"DCLListLabel3\" \"DCLEdit3\" z_liste))") (start_dialog) (unload_dialog dcl_id) (list x_liste y_liste z_liste) ) ) ) ) (defun xyz_einfueg (key key_von liste / wert) (setq wert (get_tile key_von)) (if (and wert (/= wert "") (not (member wert liste)) ) (setq liste (reverse (cons wert (reverse liste)))) liste ) (dcl:set_list key liste) (set_tile key_von "") (mode_tile key_von 2) liste ) (defun dcl:set_list (key liste) (start_list key 3) (mapcar 'add_list liste) (end_list) ) (defun c:kae (/ bx by bz n n2 ep epx epy epz zp zpx zpy zpz) (setq erg (ld_fc_kaefig nil nil nil) xli (car erg) yli (cadr erg) zli (caddr erg) ) ;;Nur als Bsp -> (setq erg (ld_fc_kaefig xli yli zli) xli (car erg) yli (cadr erg) zli (caddr erg) ) ;;<-Bsp ..... hier weiter dein code (fc_layer_anlegen "T__KONS_KAEFIG" "cyan" "continuous" "acadiso-lin")
------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fca_mi2 Mitglied Bauingenieur
Beiträge: 508 Registriert: 10.01.2003 ACAD2018
|
erstellt am: 17. Dez. 2003 07:09 <-- editieren / zitieren --> Unities abgeben:
moin, erst mal danke für die antwort, habe wieder einiges dazu gelernt. dass der wert in die liste übernommen wird, finde ich ganz gut, denn dann muss man nicht ständig zwischen tastatur und maus hin und her greifen. hier habe auch versucht deinen code zu verstehen, habe aber noch ein paar fragen, die ich in die betreffende zeile geschrieben habe : (defun ld_fc_kaefig(x_liste y_liste z_liste / dcl_id) (if (setq dcl_id (load_dialog "fc_kaefig.DCL")) (if (new_dialog "fc_kaefig" dcl_id) (progn (dcl:set_list "DCLListLabel1" x_liste) (dcl:set_list "DCLListLabel2" y_liste) (dcl:set_list "DCLListLabel3" z_liste) (action_tile "accept" "(done_dialog)") (action_tile "DCLButton1" "(setq x_liste(xyz_einfueg \"DCLListLabel1\" \"DCLEdit1\" x_liste))") (action_tile "DCLButton2" "(setq y_liste(xyz_einfueg \"DCLListLabel2\" \"DCLEdit2\" y_liste))") (action_tile "DCLButton3" "(setq z_liste(xyz_einfueg \"DCLListLabel3\" \"DCLEdit3\" z_liste))") (start_dialog) (unload_dialog dcl_id) (list x_liste y_liste z_liste) ;*********************was erreichst du damit ? ) ) ) ) (defun xyz_einfueg (key key_von liste / wert) (setq wert (get_tile key_von)) (if (and wert (/= wert "") (not (member wert liste)) ) (setq liste (reverse (cons wert (reverse liste)))) liste ;************liste ist doch eine variable, verstehe ich nicht ) (dcl:set_list key liste) (set_tile key_von "") (mode_tile key_von 2) liste ) (defun dcl:set_list (key liste) (start_list key 3) (mapcar 'add_list liste) (end_list) ) (defun c:kae (/ bx by bz n n2 ep epx epy epz zp zpx zpy zpz) (setq erg (ld_fc_kaefig nil nil nil) ;*******************das hier verstehe ich auch nicht xli (car erg) yli (cadr erg) zli (caddr erg) ) ;;Nur als Bsp -> (setq erg (ld_fc_kaefig xli yli zli) xli (car erg) yli (cadr erg) zli (caddr erg) ) ------------------
MfG Frank 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: 17. Dez. 2003 09:43 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
Hallo Frank, jedes Lisp-Funktion hat ein Ergebnis. Mit (defun ..) definiert man eine eigene Lisp-Funktion. Also hat auch diese ein Ergebnis. Welches? Es ist die Rückgabe, der zuletzt in der Routine ausgeführten Funktion.
(defun irgendwas (a / b) (setq b 1) (repeat a (setq b (* 2 b)) ) b )
Die Funktion irgendwas bekommt als Übergabe den Parameter a. Mit diesem werden irgendwelche Berechnungen durchgeführt und irgendwann innerhalb der Funktion die Variable b belegt. Da in der Funktion aber auch noch andere Sachen gemacht werden, so dass das gewünschte Ergebnis, der Wert der Variablen b, nicht als letztes Ergebnis zzur Verfügung steht, wird am Ende einfach die Variable noch einmal hingeschrieben. Somit kann man das Ergebnis des Funktionsaufrufs auch einer Variablen zuweisen.
(setq ergebnis (irgendwas 5))
Möchte man mehrere Ergebnisse einer Funktion erhalten, dann ist es notwendig diese in einer Liste zusammen zu fassen. In unserem Bsp könnte das dann so aussehen:
(defun irgendwas (a / b) (setq b 1) (repeat a (setq b (* 2 b)) (setq a (* 3 b)) ) (list b a) )
Hier sieht man auch, dass man den Wert einer Variablen, der als Parameter übergeben wurde, innerhalb der Funktion wie eine ganz normale Variable nutzen kann. Das Ergebnis ist nun allerdings eine Liste mit 2 Werten.
(setq ergebnis (irgendwas 5) wert1 (car ergebnis) wert2 (cadr ergebnis) )
Bei Fragen ... Grüße Holger ------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fca_mi2 Mitglied Bauingenieur
Beiträge: 508 Registriert: 10.01.2003 ACAD2018
|
erstellt am: 17. Dez. 2003 10:13 <-- editieren / zitieren --> Unities abgeben:
|