Ouvrir et fermer
L'éditeur de programmation fournit les fonctions suivantes pour l'ouverture et la
fermeture des boîtes de dialogue :
done_dialog
load_dialog
new_dialog
start_dialog
term_dialog
unload_dialog
Avant d'utiliser ces fonctions, vous devez avoir un fichier DCL qui définit la boîte de dialogue.
Les lignes de code qui suivent (en code DCL) contiennent les instructions définissant la boîte de dialogue "Premier exemple de boîte de dialogue" contenant un composant de texte et un bouton OK.
Vous allez enregistrer le tout dans un fichier nommé "hello.dcl" placé dans un répertoire de votre chemin de recherche.
1 2 3 4 5 | sample: dialog { label = "Premier exemple de boîte de dialogue"; : text {label = "Bonjour, cher programmeur !";} ok_only; } |
L'affichage d'une boîte de dialogue s'effectue en plusieurs étapes.
En premier lieu, vous devez utiliser la fonction (load_dialog) pour charger le fichier DCL dans la mémoire et obtenir le numéro d'identification DCL.
Une fois le fichier DCL chargé, vous devez appeler (new_dialog) et indiquer le nom de la boîte de dialogue et le numéro d'identification DCL comme arguments. Si (new_dialog) ne renvoie pas nil, appelez (start_dialog) pour restituer le contrôle de la boîte de dialogue à l'utilisateur.
Le composant ok_only (bouton OK) étant prédéfini, son action l'est également.
En principe, vous devez assigner les actions et définir les états et les valeurs des composants avant d'appeler (start_dialog).
(voir "Expressions d'actions et appels en retour (callback)").
L'action assignée au composant ok_only est (done_dialog).
Lorsque vous sélectionnez le bouton OK, AutoCAD transmet l'appel (done_dialog) à l'application AutoLISP et ferme la boîte de dialogue.
Vous devez ensuite transmettre le numéro d'identification à la fonction (unload_dialog), qui décharge le fichier DCL de la mémoire.
(voir "Enchaînement des fonctions").
Si vous avez enregistré le fichier "hello.dcl" dans un répertoire connu de vos chemins de recherches, vous allez devoir utiliser la fonction AutoLISP suivante pour afficher la boîte définie.
1 2 3 4 5 6 7 8 9 10 11 12 | (defun c:hello ( / dcl_id) ;chargement du fichier DCL (setq dcl_id (load_dialog "hello.dcl")) ;initialisation de la boîte de dialogue (if ( not ( new_dialog "hello" dcl_id)) ;quitter si échec (exit) ) (start_dialog) ;affichage (unload_dialog dcl_id) ;;décharge le fichier dcl (princ) ; affiche ligne vide pour la "propreté" ) |
Si tout est correct vous devriez avoir ça à l'écran :
La boîte ouverte sur appel de (start_dialog) reste active jusqu'à ce que
l'utilisateur sélectionne un composant (en principe un bouton) dont
l'expression d'actions associée appelle (done_dialog).
L'appel à (done_dialog) peut être généré explicitement par le composant ou par
l'attribut is_cancel du composant sélectionné (valeur true).
En théorie, la boîte de dialogue prend le contrôle des entrées au moment où vous appelez start_dialog ; mais en fait elle prend le contrôle lorsque vous appelez new_dialog, ceci est sans incidence sur la manière dont vous devez écrire vos programmes.
Néanmoins, si vous appelez ces fonctions en interactif, vous devez les entrer sous la forme d'une instruction sur la ligne de commande d'AutoCAD.
Intégrez-les à une fonction progn ou à une autre fonction. Sinon, l'appel interactif à new_dialog risque de geler l'écran.
Il peut être utile d'appeler new_ dialog et start_dialog en interactif avant le débogage (voir utilisation interactive de ces fonctions, "Gestion des erreurs sous DCL").
Lorsqu'une boîte de dialogue est active (c'est-à-dire pendant l'appel à
start_dialog), vous ne pouvez pas appeler les fonctions d'AutoLISP répertoriées ci-après.
Les boîtes sont dites modales :
Ces fonctions affectent l'affichage, qui ne doit pas changer lorsque la boîte de dialogue est visible, ou nécessitent une entrée utilisateur qui n'implique pas la boîte de dialogue.
command | getdist | grclear | prompt |
entdel | getint | grdraw | redraw |
entmake | getkword | grread | ssget |
entmod | getorient | grtext | textpage |
entsel | getpoint | grvecs | textscr |
entupd | getreal | menucmd | getangle |
getstring | nentsel | getcorner | graphscr |
osnap |
Les fonctions qui écrivent du texte à l'écran comme print, princ et prin1 sont très pratiques pour afficher des informations de débogage pendant le test d'une boîte de dialogue.
Cela permettra de voir l'avancement des retours d'information sur la ligne de commande.
On les effacera une fois le programme prêt à fonctionner.
Si la boîte de dialogue recouvre la zone de la ligne de commande, ces fonctions recouvrent cette partie de la boîte de dialogue.
Les options ssget interactives ne sont pas autorisées, contrairement à d'autres
options.
Si votre programme utilise l'une de ces fonctions entre les appels start_dialog et done_dialog, AutoCAD ferme toutes les boîtes de dialogue et affiche le message d'erreur suivant : Fonction AutoCAD rejetée.
Si la valeur de la variable système CMDACTIVE est supérieure à 7, une
boîte de dialogue est active.
Cette variable prend des valeurs codées au niveau du bit qui donnent des indications sur l'activité d'une commande, d'un script ou d'une boîte de dialogue.
Si l'utilisateur doit entrer des informations depuis l'écran graphique et non depuis la boîte de dialogue (par exemple pour spécifier un point ou sélectionner un objet), vous devez cacher la boîte de dialogue.
Pour ce faire, il suffit d'appeler done_dialog, afin que l'écran graphique
soit à nouveau visible et que la boîte de dialogue soit disponible dès
que l'utilisateur a procédé à une sélection
(voir "Masquage des boîtes de dialogue").
La fonction term _dialog ferme toutes les boîtes de dialogue courantes
comme si l'utilisateur les avait annulées.
Elle peut ainsi servir à annuler des séries de boîtes imbriquées.
05 janvier2018