Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

Je me forme à AutoLisp et donc je débute depuis peu.

J'essaie d'utiliser les boites de dialogue DCL pour saisir des données utilisées dans un Lisp.

L'exemple ci-dessous est celui de la saisie d'un rectanlge.

 

Mais il y a un problème lorsque je valide : Autocad 'ne répond pas', le sablier reste actif indéfiniement.

Je dois avoir un problème avec mes variables mais je ne trouve pas.

 

Une explication me permettrait d'avancer. merci d'avance.

 

La boite DCL test.dcl:

Diag1 : dialog {
label = "Saisie d'un Rectangle";
: column {
: row {

: boxed_column {
label = "Dimensions Totales";
fixed_width = true;
width = 22;

: edit_box {
label = "Hauteur :";
mnemonic = "H";
key = "HTot";
edit_width = 5;
}

: edit_box {
label = "Largeur :";
mnemonic = "L";
key = "LTot";
edit_width = 5;
}
}


}
ok_cancel;
}
}

 

Le LISP:

;;;Fonction LISP Test

(defun c:TestDiag ()
   

 ;Chargement de la boite de dialogue
 (setq id (load_dialog "Test.dcl"))
 (new_dialog "Diag1" id)

 ; actions en fonction des choix dans la boite de dialogue
 (action_tile "cancel" "(done_dialog)")
 (action_tile "accept" "(Rectangle) (done_dialog)")
 (start_dialog)
 )

 ; Fonction Rectangle
 (defun Rectangle ()
   (progn
   (setq H (atoi(get_tile "HTot")))
   (setq L (atoi(get_tile "LTot")))
   (setq pt1 (list 0 0))
   (setq pt2 (list H L))
   
   (command "_.rectang" pt1 pt2 "")
   )
   )

Posté(e)

super ton lien patrick_35

je n'y connais rien en DCL mais avec un site comme ça je devrais arriver a faire mes premières boites

merci

Phil

Projeteur Revit Indépendant - traitement des eaux/CVC

Posté(e)

Il ne manquerais pas un (unload_dialog id) juste après ton (start_dialog)?!*

 

perso j'applique ceci :

 

(setq dcl_id (load_dialog temp)) ;on charger le DCL
(if (new_dialog "Mon_dcl" dcl_id)
(progn
	(set_tile "..." "...")
	(action_tile "accept" "(setq ...)(done_dialog 1)") ;clic sur "OK"
	(action_tile "cancel" "(done_dialog 0)(setq sortie 1)") ;clic sur "Cancel"
	(setq status (start_dialog))
	(unload_dialog dcl_id)
)
)
(if (= sortie 1)
(progn
	(prompt "\n...ABANDON" )
	(quit)
	(princ)
)
)

C'est en forgeant que l'on devient forgerons.

Et c'est en sciant que Léonard DeVinci!

Posté(e)

Salut

 

alala:

 

A la lecture de ton exemple, je vais juste apporter deux ou trois précisions.

Pour quitter la boite de dialogue, tu indiques done_dialog 0 ou 1 et ensuite, tu récupères dans une variable (status) la valeur renvoyé par la boite de dialogue, tu peux donc éviter l'utilisation de la variable sortie.

Tu peux utiliser cette valeur pour savoir sur quel bouton tu as cliqué pour sortir de ta boite de dialogue (status = 0 pour done_dialog 0, 1 pour done_dialog 1, etc..)

Ensuite, unload_dialog et là pour vider de la mémoire, le chargement de la boite de dialogue.

Ne pas utiliser unload_dialog systématiquement car on peut avoir besoin de l'utiliser par la suite (cas d'une sélection à l'écran)

Pour pousser plus loin, tu peux aussi éviter d'utiliser la variable status en utilisant un if.

 

En reprennant ton exemple

(setq dcl_id (load_dialog temp)) ;on charger le DCL
(if (new_dialog "Mon_dcl" dcl_id)
 (progn
   (set_tile "..." "...")
   (action_tile "accept" "(done_dialog 1)") ;clic sur "OK"
   (action_tile "cancel" "(done_dialog 0) ;clic sur "Cancel"
   (if (= (start_dialog) 0)
     (progn
(prompt "\n...ABANDON" )
(quit)
(princ)
     )
     (progn
(mes_actions)
     )
   )
   (unload_dialog dcl_id)
 )
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Merci à vous 2.

 

Après quelques manip. voici le lisp qui fonctionne.

(setq dcl_id (load_dialog "test.dcl")) ;on charger le DCL 
(if (new_dialog "Diag1" dcl_id) 
       (progn 
               (action_tile "accept" "(setq H (atoi(get_tile \"HTot\"))) (setq L (atoi(get_tile \"LTot\")))(done_dialog 1)") ;clic sur "OK" 
               (action_tile "cancel" "(done_dialog 0)") ;clic sur "Cancel" 

(if (= (start_dialog) 0)
       	(progn 
               	(prompt "\n...ABANDON" ) 
               	(quit) 
               	(princ) 
       	)

 		(progn
  		(setq pt1 (list 0 0))
   			(setq pt2 (list H L))
   			(command "_.rectang" pt1 pt2)
  		(princ)
	)
)
)
(unload_dialog dcl_id) 
)

 

Mais apparemment il faut définir les variables setq... dans la parenthèse Action_Tile "accept".

si je le fais dans le progn de la commande rectangle, ça ne fonctionne pas.

 

Je crois que mon problème du départ viens de là (à confirmer).

 

Bye.

Posté(e)

Vu que tu mets un get_tile pour lire la valeur, si jamais tu lances ta boite de dialogue et que tu confirmes par ok que la valeur va bien, il faut bien au départ mettre un set_tile pour retrouver tes petits

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Merci Patrick.

j'avoue utiliser la méthode d'appel et de déchargement sans réelement la comprendre, avec tes explications ça marche mieux est, me semble plus logique.

C'est en forgeant que l'on devient forgerons.

Et c'est en sciant que Léonard DeVinci!

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é