DCL-11

image et radio_button

Dans cette page il va être question de "bouton_radio" et d'images.

Dans un souci d'esthétique, voire d'explication pour l"utilisateur les boutons radio afficheront une image différente suivant lequel est choisi comme ce visuel le présente :

 

Animation de la case

Je rappelle que le fichier DCL ne sert qu'à disposer les éléments sur un espace.
Ce fichier est inerte et toutes les modifications dans l'affichage et la présentation se font depuis le fichier LSP qui "commande" cette case de dialogue.
Les "images" qui changent dans la partie droite de la case sont des fichiers SLIDE (extension SLD) créés avec la commande MCLICHE en ligne de commande de l'interface graphique d'AutoCAD.
Ces fichiers doivent être dans un des répertoires de recherche et si ce n'est pas le cas il faudra exprimer le chemin complet pour les trouver pour éviter que la case n'affiche que du blanc.
Cet exemple de programme éducatif insère in fine le bloc choisi pour montrer que depuis un fichier DCL il y a moyen de renseigner des variables dans le LSP et interagir avec le DCL.
C'est assez simpliste car le bloc choisi sera finalement inséré au point (0 0 0) une fois que l'utilisateur aura cliqué sur le bouton OK ce qui lancera l'insertion du bloc et fermera la boîte de dialogue, dans ce cas aussi il faudra que les trois blocs soient définis dans le dessin courant, sinon il faudrait afficher le chemin complet de recherche des fichiers "bloc".
Utilisez le formulaire de CONTACT pour questionner le cas échéant.

 


Allez! c'est parti pour le code ...

Donc comme d'habitude deux fichiers, un DCL, un LSP, le DCL le voici :

ImageOption :dialog{
spacer;
   label = "Test Slide";
   :row{
   :radio_column{ label = "Choix du bloc"; key = "choix";
      :radio_button{ label = "Bloc 1"; key = "rb1"; value = 1;}
      :radio_button{ label = "Bloc 2"; key = "rb2"; }
      :radio_button{ label = "Bloc 3"; key = "rb3"; }
                              }// fin de radio_column
   :column{
      :image{ key = "img"; aspect_ratio = 1.0; height = 10; }
                
}// fin de column
}// fin de row
   spacer;
   ok_cancel;
}// fin de dialog

 

Dans ce cas de DCL vous remarquerez (ou peut-être pas) que j'utilise la notion de cluster, en mettant un key à la radio_column qui contient les trois radio_button il est possible d'interroger ce "groupe", c'est ça la notion de cluster.


Allez ! on s'occupe du LSP qui va gérer cet affichage interactif :

( defun c:imageoption ( / Maj-image affiche dcl_id sd )
   ( defun maj-image ( key / slide x y )
      ( setq slide ( cond (( = key "rb1" ) "Dessin1" )
                                       (( = key "rb2" ) "Dessin2" )
                                       (( = key "rb3" ) "Dessin3" )
                                      ) ; fin du cond
                x ( dimx_tile "img" )
                y ( dimy_tile "img" )
      ) ; fin du setq
     ( setq nombloc ( cond (( = key "rb1" ) "Bloc1" )
                                             (( = key "rb2" ) "Bloc2" )
                                             (( = key "rb3" ) "Bloc3" )
                                 ) ; fin du cond
     ) ; fin du setq
   ( start_image "img" )
   ( fill_image 0 0 x y 0 )
   ( slide_image 0 0 x y slide )
   ( end_image )
) ; fin du defun mise à jour de l'image (slide)

( setq affiche "rb1" ) ; valeur par défaut du bouton allumé par défaut
( if  ( not ( setq dcl_id ( load_dialog "ImageOption.dcl"  )))
   ( progn
      ( prompt "\nLe fichier ImageOption.dcl est introuvable" )
      ( exit )
   ) ; fin du progn pas trouvé le fichier DCL
( if  ( not ( new_dialog "ImageOption" dcl_id ))
   ( progn
      ( prompt "\nLa boite de dialogue ImageOption n'est pas définie." )
      ( exit )
   ) ; fin du progn pas de dialog dans le DCL
) ; fin du if pas de dialog dans le DCL
) ; fin du if pas trouvé le fichier DCL

( set_tile "affiche" affiche )
( maj-image affiche ) ; fonction interne au lsp affichage avec un argument
( action_tile "choix" "(maj-image (setq affiche $value))" )
( setq sd ( start_dialog ))
( unload_dialog dcl_id )

( if ( = sd 1 ) ; si appui sur OK
  ( command "_-insert" nombloc '( 0 0 0 ) "1" "1" "0" )
) ; fin if OK
) ; fin du defun


Alors, c'est OK ?

Comme je vous disais en préambule c'est bel et bien le LSP qui agit sur l'apparence que le DCL ne fait qu'afficher.
Les deux if du début sont là pour vérifier la presence du fichier DCL puis la présence du dialog cité dans ce fichier, rien de rare, que du grand classique dans tous les LSP qui doivent charger des DCL.

Ensuite on va lancer sous forme de chaîne de caractère (string) la fonction maj-image par cette ligne de code :
( action_tile "choix" "(maj-image (setq affiche $value))" )
"choix" étant l'argument donné à action_tile le reste est la commande donnée en "string"

Et pour finir quand la variable sd (définie par la valeur renvoyée par (start_dialog)), qui passe à 1 quand on appuie sur le bouton OK, le programme insère au point ' ( 0 0 0 ) le bloc choisi par le bouton radio.

 

En souhaitant avoir été explicite, je vous encourage à tester...
Amicalement