Aller au contenu

RATIO_BUTTON CODE


steelbe

Messages recommandés

Bonjour à tous

 

J'ai crée une boite de dialogue avec un boxed_ration_column qui comporte deux ration_buttons

et six edit_box. Je souhaite choisir entre dessiner un élément sur mon coté droit ou cote gauche. Les six edit_box sont utilisés dans les deux cas.

La seul différence est que si je selectionne le ration_button:

(droit) Pi sera utilisé dans le code sens de depart de la pline

(gauche) 0 sera utilisé dans le code sens de départ de la pline.

 

Mon probleme est de définir le code qui déterminera le ration_button choisi puis exécutera le code approprié.

 

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Le plus simple est de définir une clé pour le contrôle boxed_radio_button et, dans le action_tile de "accept" récupérer le get_tile de cette clé qui sera la clé du radio_button sélectionné.

 

Un petit exemple tout simple

 

Le DCL

Toto:dialog{
 label = "Toto";
 :boxed_radio_column{
   label = "Oui ou Non ?";
   key = "rep";
   :radio_button{
     label = "Oui"; 
     key = "yes";
   }
   :radio_button{
     label = "Non"; 
     key = "no";
   }
 }
 ok_cancel;
}

 

Le LISP

(defun c:test (/ dcl_id status result)
 (setq dcl_id (load_dialog tmp))
 (if (new_dialog "Toto" dcl_id)
   (progn
     (set_tile "brc" "yes")
     (action_tile "accept" "(setq result (get_tile \"brc\")) (done_dialog 1)")
     (setq status (start_dialog))
     (unload_dialog dcl_id)
   )
 )
 (if (= status 1)
   (alert result)
   (alert " Annulé")
 )
 (princ)
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Suite à la réponse il y a un peux de confusion, entre temps,

j'ai essayé la fonction iniget qui fonctionne puis je suis revenu au radio_button

et j'ai essayé de le faire fonctionner en ajoutant;

la sub-fun :

(chxradio)

ainsi que :

(action_tile "accept" "(setq ddiag1 T) (chxradio $value) (done_dialog 1)")

mais le fichier ne fonctionne toujours pas.

 

DCL est:

 GOUSSETform: dialog {
label = "GOUSSET SHAPE";
spacer;
spacer;
:column{
:row{
:boxed_radio_column {fixed_width = true; label = " CHOIX DU GOUSSET "; key = "CHOIXDUGOUSSET";
spacer;
:row {
:radio_button {
label = "   Gousset Droit ";
key = "GD";
value = "1";
}
:radio_button {
label = "   Gousset Gauche ";
key = "GG";
}}
:edit_box {
label = "Largeur  :";
key = "L";
edit_width = 10;
value = " ";
}
:edit_box {
label = "Hauteur  :";
key = "H";
edit_width = 10;
value = " ";
}
:edit_box {
label = "Chanfrein  X  :";
key = "EL";
edit_width = 10;
value = " ";
}
:edit_box {
label = "Chanfrein  Y  :";
key = "EH";
edit_width = 10;
value = " ";
}
:edit_box {
label = "Chanfrein  X1  :";
key = "X1";
edit_width = 10;
value = " ";
}
:edit_box {
label = "Epaisseur  mm  :";
key = "EP";
edit_width = 10;
value = " ";
}
spacer_1;
}
:row {
:image {
key = "cliche";
height = 10;
width = 30;
alignment = right;
color = -2;
aspect_ratio = 0;
is_enabled = false;
}
}

}
}
spacer;
:row {
spacer;
spacer;
spacer;
ok_cancel;
}
}

 

LSP :

 

 (defun C:GOUSSET_connect (/ foo chxradio id GD GG L H XL YH X1 EP)

 (defun foo (key val /)
   (if (distof val)
     (set (read key) (distof val))
     (progn
       (alert "Nécessite un nombre valide")
       (mode_tile key 2)
     )
   )
 )
 ;/////////////////////////////////////////////
 
 ;///////////////////////////////////////////////////////////////////////////////////////////////
 (setq id (load_dialog "GOUSSETform.dcl"))
 (if (not (new_dialog "GOUSSETform" id))
   (exit)
 )
 ;////////////
 (setq L 140)
 (setq H 150)
 (setq EL 30)
 (setq EH 40)
 (setq X1 100)
 (setq EP 12)
 ;////////////////////////
 (set_tile "L" (rtos L))
 (set_tile "H" (rtos H))
 (set_tile "EL" (rtos EL))
 (set_tile "EH" (rtos EH))
 (set_tile "X1" (rtos X1))
 (set_tile "EP" (rtos EP))
 ;/////////////////////////////
 (action_tile "L" "(foo \"L\" $value)")
 (action_tile "H" "(foo \"H\" $value)")
 (action_tile "EL" "(foo \"EL\" $value)")
 (action_tile "EH" "(foo \"EH\" $value)")
 (action_tile "X1" "(foo \"X1\" $value)")
 (action_tile "EP" "(foo \"EP\" $value)")
 (action_tile "accept" "(setq ddiag1 T) (chxradio $value) (done_dialog 1)")
 (action_tile "annuler" "(done_dialog 0)")
 ;////////////////////////////////////////////////////////////
 (start_dialog)
 (unload_dialog id)
 ;////////////////////////////////
 (defun chxradio (chx)
   (cond
     ((= chx "GD")
      (Setq bp (getpoint "\nBase point of Gousset :"))
      ;;Retrieve gousset dimensions
      (Setq RCH1 (polar bp Pi L))
      (Setq RCH2 (polar RCH1 (/ Pi 2) H))
      ; Draw gousset shape right
      ;;-----------------------------------------------------
      ;; Shape coordonnate according to the following points.
      ;;-----------------------------------------------------
      (Setq G1 (polar bp Pi (- L EL)))
      (Setq G2 (polar RCH1 (/ Pi 2) EH))
      (Setq G3 (polar RCH2 0 X1))
      (Setq G4 (polar G3 0 (- L X1)))
      (Command "_pline" bp G1 G2 G3 G4 bp "")
      (command "_extrude" "D" "" EP "")
      )

     ((= chx "GG")
      (Setq bp (getpoint "\nBase point of Gousset :"))
      ;;Retrieve gousset dimensions
      (Setq RCH1 (polar bp 0 L))
      (Setq RCH2 (polar RCH1 (/ Pi 2) H))
      ; Draw gousset shape left
      ;;-----------------------------------------------------
      ;; Shape coordonnate according to the following points.
      ;;-----------------------------------------------------
      (Setq G1 (polar bp 0 (- L EL)))
      (Setq G2 (polar RCH1 (/ Pi 2) EH))
      (Setq G3 (polar RCH2 Pi X1))
      (Setq G4 (polar G3 Pi (- L X1)))
      (Command "_pline" bp G1 G2 G3 G4 bp "")
      (command "_extrude" "D" "" EP "")
      )
     )
   )
 ) 

 

Je pense qu'il manque un bout de code pour le faire fonctionner

et je n'ai pas encore compris comment m'y prendre.

L'exemple me parle mais n'arrive pas à l'insérer dans mon code.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Le problème vient de là :

(action_tile "accept" "(setq ddiag1 T) (chxradio $value) (done_dialog 1)")

 

Dans une expression (action_tile ...) $value fait référence à la valeur du contrôle (tile) dont la clé (key) est le premier argument : ici "accept" (le bouton OK).

Or c'est la valeur du contrôle dont la clé est "CHOIXDUGOUSSET" que tu veux passer à chxradio.

 

2 solutions :

 

- remplacer $value par (get_tile "CHOIXDUGOUSSET") dans le (action_tile "accept" ...) : (get_tile key) récupère la valeur du contrôle dont key est la clé.

 

- attribuer la valeur de "CHOIXDUGOUSSET" à une variable dans un action_tile pour ce contrôle. Dans ce cas la variable devra être initialisée au cas où l'utilisateur ne modifie pas les radio_button.

 

Dans tous les cas,

 

(action_tile "annuler" ...) est :

- inopérant : il n'y a aucun contrôle qui ait "annuler" comme clé (la clé du bouton "Annuler" est : "cancel")

- inutile : le bouton "cancel" provoque (done_dialog 0) par défaut.

 

À partir du moment où tu spécifie la valeur que retournera (start_dialog) suivant le bouton cliqué avec :

(action_tile "accept" "(done_dialog 1)")

tu n'as pas besoin d'utiliser (setq ddiag1 T), il suffit d'attribuer à ddiag1 la valeur retournée par (start_dialog) qui sera 1 si la boite a été fermée avec OK ou 0 si elle a été fermée avec "Annuler".

 

Donc, solution 1 :

 ...
 (action_tile "accept" "(chxradio (get_tile \"CHOIXDUGOUSSET\")) (done_dialog)")
 ;////////////////////////////////////////////////////////////
 (start_dialog)
 (unload_dialog id)
 ;////////////////////////////////
...

 

Solution 2 :

 ...
 (setq gousset "GD") ; valeur initiale correspondant au radio_button coché par défaut
 ...
 (action_tile "CHOIXDUGOUSSET" "(setq gousset $value)")
 (action_tile "accept" "(done_dialog 1)")
 ;////////////////////////////////////////////////////////////
 (setq ddiag1 (start_dialog))
 (unload_dialog id)
 (if (= ddiag1 1)
   (chxradio gousset)
 )
 ;///////////////////////////////
.../

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Salut gile,

 

J'ai résolu le problème en passant par deux boite de dialogue.

Une pour choisir le type

Une autre pour définir les dimensions.

 

Concernant les deux solutions que tu m'as proposé, il y a des messages d'erreurs.

 

1er solution:

(lambda ($KEY $VALUE $DATA $REASON $X $Y)
 (chxradio (get_tile "CHOIXDUGOUSSET")) (done_dialog)
 ) 

 

2eme solution:

 (chxradio gousset)

 

Cependant, je continue à travailler sur le problème car cela serait mieux si une seul boite de dialogue pouvait être utilisé.

Lien vers le commentaire
Partager sur d’autres sites

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é