Aller au contenu

DCL: Insérer une tuile entre deux radio_button


Fraid

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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 fournis

Un 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 ...

 

itfm.png

Lien vers le commentaire
Partager sur d’autres sites

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)
   )
)

Lien vers le commentaire
Partager sur d’autres sites

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.

 

Amicalement

Vincent

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)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Ç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

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines aprè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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité