Manu12 Posté(e) le 7 novembre 2012 Posté(e) le 7 novembre 2012 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 "") ) )
Patrick_35 Posté(e) le 8 novembre 2012 Posté(e) le 8 novembre 2012 Salut Regarde ce site, tu devrais y trouver ton bonheur. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
philsogood Posté(e) le 8 novembre 2012 Posté(e) le 8 novembre 2012 super ton lien patrick_35je n'y connais rien en DCL mais avec un site comme ça je devrais arriver a faire mes premières boitesmerciPhil Projeteur Revit Indépendant - traitement des eaux/CVC
alala Posté(e) le 8 novembre 2012 Posté(e) le 8 novembre 2012 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!
Manu12 Posté(e) le 8 novembre 2012 Auteur Posté(e) le 8 novembre 2012 à Patrick_35:Merci pour l'adresse du site, je vais fouiller. à alala:Je vais essayer ta méthode. A+
Patrick_35 Posté(e) le 8 novembre 2012 Posté(e) le 8 novembre 2012 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Manu12 Posté(e) le 8 novembre 2012 Auteur Posté(e) le 8 novembre 2012 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.
Patrick_35 Posté(e) le 8 novembre 2012 Posté(e) le 8 novembre 2012 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
alala Posté(e) le 8 novembre 2012 Posté(e) le 8 novembre 2012 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!
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant