Masquer une case de dialogue
Une chose est certaine dans ce monde où bien des choses sont incertaines :
Les boites de dialogue en DCL ne sont pas modales !
Cela signifie qu'il n'est pas possible d'intervenir dans l'interface graphique d'AutoCAD quand une case de dialogue est ouverte à l'écran.
Ah ben oui m'sieur ! mais moi j'ai besoin de sélectionner des entités depuis ma case de dialogue... Comment je fais si elles ne sont pas modales comme vous dîtes ?
Je vous rassure, une alternative existe…
et je vais vous en parler maintenant
Je vais prendre l'exemple qui se présente le plus souvent :
Demande de sélection d'entités depuis une case de dialogue
Que ce soit pour les effacer, les changer de couleur, de calque...que sais-je ? Vous serez souvent confronté à ce souci.
Voilà le résultat à l'écran :
Ouverture de la case, impossibilité de cliquer dans l'interface graphique,
Clic sur le bouton Sélection, la case se ferme,
on a donc la main (ou plutôt la souris) pour sélectionner des entités,
Une fois que c'est fait on valide classiquement par la touche Enter et la case s'ouvre à nouveau avec le nombre d'entités sélectionnées en renseignement textuel.
C'est bien le but à atteindre, allez on y va ...
Tout d'abord, le fichier DCL (enregistré sous le nom "Case-A-Masquer.DCL")
Case_A_Masquer : dialog { label = "sélection entités";
:boxed_row { : text { label = "en attente..."; key = "MSG"; } }
:boxed_column {: button { label = "Sélection <"; key = "SEL"; }
: button { label = "Ignorer"; key = "ANNUL"; is_cancel = true; }}
}
Ce fichier est classique au possible,
- Le titre de la case "sélection des entités, c'est le label qui se voit dans le titre
- Une ligne de texte "en attente",
- Un cadre contenant les deux boutons, un Sélection et un Ignorer
Et... c'est tout.
Le chevron à la fin du mot "Sélection" sur le bouton est une convention d'affichage qui précise à l'utilisateur que la case peut se fermer (pendant la sélection) et se ré-ouvrir ensuite.
Le fichier LSP :
( defun c:CAM ( / SD Dcl-ID LonJeuSel )
( setq Dcl-ID ( load_dialog "Case-A-Masquer.dcl" ) )
( setq SD 1)
( while ( /= 0 SD )
( new_dialog "Case_A_Masquer" Dcl-ID )
( action_tile "SEL" "( done_dialog 1 )" )
( if LonJeuSel
( if ( = LonJeuSel 1)
( set_tile "MSG" ( strcat ( itoa LonJeuSel ) " seule entité" ) )
( set_tile "MSG" ( strcat ( itoa LonJeuSel ) " entités" ) )
) ; fin du deuxième if
) ; fin du premier if
( setq SD ( start_dialog ) )
( if ( = SD 1 )
( setq LonJeuSel ( sslength ( ssget ) ) )
)
) ; fin du while
( unload_dialog Dcl-ID )
( princ )
) ; fin du defun
Une fois le lisp chargé, lancer la commande CAM (Case à Masquer) et vous devriez voir ce qui est reproduit dans l'animation.
la variable nommée SD sert à stocker ce qui est renvoyé par la fonction (start_dialog).
(start_dialog) renverra 0 (zéro) quand l'utilisateur appuiera sur le bouton de validation,
OK ou autre défini par vos soins.
La fioriture de ce code se trouve dans le (if ...) qui permet de na pas afficher le même texte de renseignement suivant qu'il n'y a qu'une ou plusieurs entités.
C'est assez laid de voir ce genre de texte "0 (s) entité(s)" alors que c'est tellement simple de faire bien ...
Cet exemple ne renvoie rien car ce n'est qu'un exemple explicatif, mais il est possible de retenir le jeu de sélection dans une variable une fois la case définitivement fermée, on en parle plus tard...
En souhaitant avoir fait un peu avancer les choses dans votre utilisation du DCL.
Penser au formulaire de contact en cas de questions ou de demande de correction.
Amicalement...
15 avril 2020