Fraid Posté(e) le 15 avril 2020 Posté(e) le 15 avril 2020 Bonjour, J'essai de combler mes lacunes en DCL, n'en programmant pas souvent.Cela devient un peux plus difficile depuis que le site de Terry Miller à disparu,c'étais ma référence.L'aide Autocad bas des record d’obscurantisme à ce sujet,il reste Afralisp,et la page de Didier Da-code,qui à fait un gros effort d'explication.Malgré cela, je ne trouve pas de réponse à ma question qui est dans le titre.Le but est que les tuiles insérées soit grisées si le radio_button est désactivé.Extrait du dcl en exemple :boxed_radio_column {label = \"Calques\"; :radio_button { key = \"rb0\"; label = \"Calque courant : "(getvar "clayer")"\"; } spacer; :radio_button { key = \"rb1\"; label = \"Choisir un calque\"; value = \"1\"; } :popup_list { key = \"list\"; value = \"0\"; edit_width = 29; } spacer; :radio_button { key = \"rb2\"; label = \"Créer un calque\"; } :edit_box { key = \"eb\"; label = \"Nom :\"; edit_width = 30; } spacer; } Les radio_button ne fonctionne pas, ils restent cochés. J'ai bien trouvé la parade en utilisant de simple toggle que je désactive dans l'action_tile de chaque toggle.Mais cela reste une pirouette fatigante quant on à une dizaine de toggle à désactivé à chaque action_tile.Sachant qu'il y a déjà les tuiles insérer à désactiver. J'ai vu des exemples en plaçant les radio_button horizontalement dans une boxed_radio_row.Cela convient si on en a peux et que les tuiles insérées sont petites. Y a t'il une solution sans faire gymnastique? Merci https://github.com/Fraiddd
Luna Posté(e) le 15 avril 2020 Posté(e) le 15 avril 2020 Hiya ! Je ne sais pas si cela pourra t'aider, mes compétences en DCL sont nulles, mais j'avais trouvé ce sujet il y a quelques temps sur un problème similaire : https://cadxp.com/topic/6776-dcl-et-lisp-desactiver-un-bouton/ Désolé,Luna
didier Posté(e) le 15 avril 2020 Posté(e) le 15 avril 2020 Coucou Merci de me citer, à première vue en copiant le code donné en exemple il y a de gros soucis de syntaxe, je ne pense pas que tu aies testé les exemples que je fournisUn peu de nettoyage me donne cette apparence, on est d’accord ?Que faut-il faire ensuite ? décris-moi l'ordre d'allumage des boutons ... Éternel débutant... Mon site perso : Programmer dans AutoCAD
Fraid Posté(e) le 15 avril 2020 Auteur Posté(e) le 15 avril 2020 Désolé du temps de réponse, partage du PC, confinement oblige. Aucun souci de syntaxe, car j’écris le DCL dans le lisp. Exemple complet qui ne fonctionne pas (defun c:dcltestrb (/ listLayers dcl wdcl dcl_id calq flag ebvalue done) (defun listLay (/ lay lst) (setq lay (tblnext "layer" T)) (while lay (setq lst (cons (cdr (assoc 2 lay)) lst) lay (tblnext "layer") ) ) (reverse lst) ) (setq dcl (vl-filename-mktemp "tmp.dcl") wdcl (open dcl "w") listLayers (listLay) ) (write-line (strcat "dcltestrb:dialog {label = \"Test\"; :boxed_radio_column {label = \"Calques\"; :radio_button { key = \"rb0\"; label = \"Calque courant : "(getvar "clayer")"\"; } spacer; :radio_button { key = \"rb1\"; label = \"Choisir un calque\"; value = \"1\"; } :popup_list { key = \"list\"; value = \"0\"; edit_width = 29; } spacer; :radio_button { key = \"rb2\"; label = \"Créer un calque\"; } :edit_box { key = \"eb\"; label = \"Nom :\"; edit_width = 30; } spacer; } spacer; ok_cancel; }") wdcl );write-line (close wdcl) (setq dcl_id (load_dialog dcl) calq "0" ) (if (new_dialog "dcltestrb" dcl_id) (progn (start_list "list") (mapcar 'add_list listLayers) (end_list) (set_tile "eb" "Test") (mode_tile "eb" 1) (mode_tile "list" 2) (action_tile "rb0" "(mode_tile \"eb\" 1) (mode_tile \"list\" 1) (setq calq (getvar \"clayer\") flag 1) ") (action_tile "rb1" "(mode_tile \"eb\" 1) (mode_tile \"list\" 0) ") (action_tile "rb2" "(mode_tile \"list\" 1) (mode_tile \"eb\" 0) ") (action_tile "list" "(setq calq (nth (atoi $value) listLayers) flag 1)") (action_tile "accept" "(setq ebvalue (get_tile \"eb\"))(done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") (setq done (start_dialog)) (unload_dialog dcl_id) (vl-file-delete dcl) (if (= done 1) (if flag (setvar "clayer" calq) (progn (if (not (member ebvalue listLayers))(command "_.layer" "n" ebvalue "")) (setvar "clayer" ebvalue) ) ) (exit) ) ) (exit) ) ) celui qui fonctionne sans les radios (defun c:dcltesttog (/ listLayers dcl wdcl dcl_id calq flag ebvalue done) (defun listLay (/ lay lst) (setq lay (tblnext "layer" T)) (while lay (setq lst (cons (cdr (assoc 2 lay)) lst) lay (tblnext "layer") ) ) (reverse lst) ) (setq dcl (vl-filename-mktemp "tmp.dcl") wdcl (open dcl "w") listLayers (listLay) ) (write-line (strcat "dcltesttog:dialog {label = \"Test\"; :boxed_column {label = \"Calques\"; :boxed_row { :toggle { key = \"tog0\"; label = \"Calque courant : "(getvar "clayer")"\"; } } spacer; :boxed_row { :toggle { key = \"tog1\"; label = \"Choisir un calque\"; value = \"1\"; } :popup_list { key = \"list\"; value = \"0\"; edit_width = 29; } } spacer; :boxed_row { :toggle { key = \"tog2\"; label = \"Créer un calque\"; } :edit_box { key = \"eb\"; label = \"Nom :\"; edit_width = 30; } } spacer; } spacer; ok_cancel; }") wdcl );write-line (close wdcl) (setq dcl_id (load_dialog dcl) calq "0" ) (if (new_dialog "dcltesttog" dcl_id) (progn (start_list "list") (mapcar 'add_list listLayers) (end_list) (set_tile "eb" "Test") (mode_tile "eb" 1) (mode_tile "list" 2) (action_tile "tog0" "(mode_tile \"eb\" 1) (mode_tile \"list\" 1) (set_tile \"tog1\" \"0\") (set_tile \"tog2\" \"0\") (setq calq (getvar \"clayer\") flag 1) ") (action_tile "tog1" "(mode_tile \"eb\" 1) (mode_tile \"list\" 0) (set_tile \"tog0\" \"0\") (set_tile \"tog2\" \"0\") ") (action_tile "tog2" "(mode_tile \"list\" 1) (mode_tile \"eb\" 0) (set_tile \"tog0\" \"0\") (set_tile \"tog1\" \"0\") (setq flag nil) ") (action_tile "list" "(setq calq (nth (atoi $value) listLayers) flag 1)") (action_tile "accept" "(setq ebvalue (get_tile \"eb\"))(done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") (setq done (start_dialog)) (unload_dialog dcl_id) (vl-file-delete dcl) (if (= done 1) (if flag (setvar "clayer" calq) (progn (if (not (member ebvalue listLayers))(command "_.layer" "n" ebvalue "")) (setvar "clayer" ebvalue) ) ) (exit) ) ) (exit) ) ) https://github.com/Fraiddd
zebulon_ Posté(e) le 15 avril 2020 Posté(e) le 15 avril 2020 bonjour, pour faciliter, je préfère faire une fonction par action_tile (action_tile "mon_tile" "(do_mon_tile)") ensuite, dans la fonction appelée par l'action_tile, je commence par mettre dans une variable la valeur du tile (defun do_mon_tile () (setq MON_TILE $value) ... ) Ensuite, à l'intérieur de chaque fonction qui correspond à un action_tile, je peux faire les mode_tile qui vont bien pour allumer et éteindre ce qui est nécessaire. C'est facile quand on a les variables qui donnent l'état de chaque tile. L'intérêt supplémentaire de mettre les valeurs de tile dans des variables, c'est qu'on peut les sauvegarder et les initialiser. C'est incontournable quand on veut faire une boite de dialogue qui se ferme provisoirement pour permettre à l'utilisateur de saisir un point, par exemple. Comme on souhaite retrouver la boite de dialogue comme on l'avait quitté, il faut lui réinjecter les bonnes valeurs de tile et, éventuellement aussi, les mode_tile adéquats. AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Luna Posté(e) le 15 avril 2020 Posté(e) le 15 avril 2020 Salut, Je peux te proposer ceci (fonctionnel) : (defun try (/ laylist dcl_id chx) (setq laylist (flt_tbl "LAYER" "*") dcl_id (load_dialog "Test.dcl") ) (if (not (new_dialog "DBtest" dcl_id)) (exit) ) (start_list "lst") (mapcar 'add_list laylist) (end_list) (set_tile "lst" (itoa (vl-position "0" laylist))) (mode_tile "lst" 1) (mode_tile "eb" 1) (action_tile "rb0" "(mode_tile \"lst\" 1) (mode_tile \"eb\" 1) (set_tile \"rb1\" \"0\") (set_tile \"rb2\" \"0\")") (action_tile "rb1" "(mode_tile \"lst\" 0) (mode_tile \"eb\" 1) (set_tile \"rb0\" \"0\") (set_tile \"rb2\" \"0\")") (action_tile "rb2" "(mode_tile \"lst\" 1) (mode_tile \"eb\" 0) (set_tile \"rb0\" \"0\") (set_tile \"rb1\" \"0\")") (action_tile "cancel" "(done_dialog 0)") (action_tile "accept" "(cond ((= (get_tile \"rb0\") \"1\") (setq chx (getvar \"CLAYER\"))) ((= (get_tile \"rb1\") \"1\") (setq chx (nth (atoi (get_tile \"lst\")) laylist))) ((= (get_tile \"rb2\") \"1\") (setq chx (get_tile \"eb\"))) ) (done_dialog 1) " ) (start_dialog) (unload_dialog dcl_id) chx ) A adapter pour le fichier .dcl temporaire mais c'est une simple piste de recherche ;) En fait en écrivant le code LISP, j'ai remarqué que le souci venait tout simplement du radio_button_column qui, normalement ne s'attend qu'à des radio_button (je rappelle que je maîtrise pas, alors arrêter moi si je dis des bêtises :3), or on a ici une pop-up_list qui sépare le radio_button n°1 et le radio_button n°2 (sachant que le premier correspond au n°0).Ainsi, il ne comprend pas que les 3 radio_button sont liés !Donc il est voit en réalité deux rangées dans une seule box ... en clair, si le "rb2" est activé à un moment ou un autre, il ne se désactivera pas, cependant il y a bien un toggle qui est opéré entre le "rb0" et le "rb1" (comme on s'y attend venant des radio_button) C'est pour ça que j'ai ajouté les (set_tile "rb#" "0") pour être sûre qu'un seul des radio_button est bel est bien sélectionné ! Bisous,Luna
(gile) Posté(e) le 15 avril 2020 Posté(e) le 15 avril 2020 Salut, Juste quelques remarques en passant.Pour gérer les contrôles de type radio_button il est souvent plus facile de gérer le contenant (boxed_radio_column ici) voir cet article.Je suis absolument d'accord avec zebulon_ pour les action_tile (on peut aussi utiliser vl-prin1-to-string pour éviter les \").Le problème ici est dû au fait d'intercaler dans le même cluster (boxed_radio_column) un autre contrôle (popup_list) entre deux radio_button. Je ferais plutôt un boxed_radio_row avec uniquement les radio_button et, en dessous le popup_list et l'edit_box. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 15 avril 2020 Auteur Posté(e) le 15 avril 2020 Merci pour toutes ces pistes, notamment pour simplifier la gestion des réacteurs. Je vais tester tout cela.J'avais mis le DCL de côté, à tord, car même si il paraît dépassé, il est encore d'actualité. https://github.com/Fraiddd
(gile) Posté(e) le 15 avril 2020 Posté(e) le 15 avril 2020 Ça semble fonctionner en faisant un boxed_row qui contient deux colonnes : radio_column uniquement avec les radio_button et column avec les text, popup_list et edit_box. (defun c:dcltestrb (/ listLay dcl wdcl listLayers dcl_id calq ebvalue done) (defun listLay (/ lay lst) (while (setq lay (tblnext "layer" (null lay))) (setq lst (cons (cdr (assoc 2 lay)) lst)) ) (reverse lst) ) (setq dcl (vl-filename-mktemp "tmp.dcl") wdcl (open dcl "w") ) (princ "dcltestrb:dialog{ label = \"Test\"; :boxed_row{ label = \"Calques\"; :radio_column{ key = \"rc\"; :radio_button{ key = \"rb0\"; label = \"Calque courant :\"; } :radio_button{ key = \"rb1\"; label = \"Choisir un calque\"; value = \"1\"; } :radio_button { key = \"rb2\"; label = \"Créer un calque\"; } } :column{ :text{ key = \"clayer\"; } :popup_list { key = \"list\"; value = \"0\"; edit_width = 29; } :edit_box { key = \"eb\"; label = \"Nom :\"; edit_width = 30; } } } spacer; ok_cancel; }" wdcl ) (close wdcl) (setq dcl_id (load_dialog dcl)) (if (new_dialog "dcltestrb" dcl_id) (progn (setq listLayers (listLay) calq "Test" ) (start_list "list") (mapcar 'add_list listLayers) (end_list) (set_tile "clayer" (getvar "clayer")) (set_tile "eb" "Test") (mode_tile "eb" 1) (mode_tile "list" 2) (action_tile "rc" (vl-prin1-to-string '(cond ((= $value "rb0") (mode_tile "eb" 1) (mode_tile "list" 1) (setq calq (getvar "clayer") flag 1 ) ) ((= $value "rb1") (mode_tile "eb" 1) (mode_tile "list" 0) ) ((= $value "rb2") (mode_tile "list" 1) (mode_tile "eb" 0) ) ) ) ) (action_tile "list" "(setq calq (nth (atoi $value) listLayers))") (action_tile "eb" "(setq calq $value)") (action_tile "accept" "(done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") (setq done (start_dialog)) (unload_dialog dcl_id) (vl-file-delete dcl) (if (= done 1) (progn (if (null (tblsearch "LAYER" calq)) (command "_.layer" "n" calq "") ) (setvar "clayer" calq) ) ) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 15 avril 2020 Auteur Posté(e) le 15 avril 2020 super, je n'avais pas pensé à faire 2 colonnes cote à cote. merci https://github.com/Fraiddd
(gile) Posté(e) le 3 mai 2020 Posté(e) le 3 mai 2020 Cela devient un peux plus difficile depuis que le site de Terry Miller à disparu,Je viens d'avoir un échange de mails avec Terry Miller, son site a juste changé d'adresse : https://autolisp-exchange.com/ Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 4 mai 2020 Auteur Posté(e) le 4 mai 2020 Merci Bonne nouvelle :D https://github.com/Fraiddd
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant