Aller au contenu

[Résolu] Première boite de dialogue et lancement de fonction


Messages recommandés

Posté(e)

Bonjour,

 

 

je cherche à lancer depuis la commande "tbp", une boite de dialogue qui me permettra de lancer la fonction "embranchement_f" et bien d'autre si ça fonctionne.

 

boite de dialogue tubpvc.dcl

 

PVC_EVAC :dialog{

 label = "PVC_EVAC";


   :column{

       :button{label = "RESEAU"; key = "reseau"; fixed_width = true;}

       :button{label = "CULOTTE"; key = "culotte"; fixed_width = true;}

       :button{label = "COUDE"; key = "coude"; fixed_width = true;}

       :button{label = "PIED DE CHUTTE"; key = "pied_de_chute"; fixed_width = true;}

       :button{label = "TAMPON"; key = "tampon"; fixed_width = true;}

       :button{label = "ASSEMBLAGE"; key = "assemblage"; fixed_width = true;}

       :button{label = "REGARD"; key = "regard"; fixed_width = true;}



 }

       :button{label = "ANNULER"; key = "cancel"; is_default = false; is_cancel = true;}



} 

 

 

 

 

(defun c:tbp()

(setq id (load_dialog "tubpvc.dcl"))
(new_dialog "PVC_EVAC" id)
(action_tile "cancel" "(done_dialog)")
(action_tile "reseau" "(reseau_f)")
(action_tile "culotte" "(embranchement_f)")
(action_tile "coude" "(coude_f)")


(start_dialog)



(unload_dialog id)
)







(defun embranchement_f ()

(unload_dialog id)


(setq diam_pvc (getint "Diamètre :"))


(setq str_diam_pvc (itoa diam_pvc))



(initget  "Gauche Droite")
(setq choix (getkword "\nGauche/Droite <Gauche> :"))
(if(= choix "Gauche")

 	(command "_insert"
              (cond((= str_diam_pvc "100")"culotte_bt144_back.dwg")
               	((= str_diam_pvc  "110")"culotte_bv144_back.dwg")
               	((= str_diam_pvc  "125")"culotte_bx144_back.dwg")
               	(T"culotte_onsaitjamais.dwg"))
              P2
              -1 1 P1)
)

(if(= choix "Droite")

 	(command "_insert"
              (cond((= str_diam_pvc "100")"culotte_bt144_back.dwg")
               	((= str_diam_pvc  "110")"culotte_bv144_back.dwg")
               	((= str_diam_pvc  "125")"culotte_bx144_back.dwg")
               	(T"culotte_onsaitjamais.dwg"))
              P2
              -1 -1 P1)
)

)

ATEGIE - Bureau d'Études Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Posté(e)

Je n'ai toujours pas trouvé mon erreur. Je suis donc coincé, pouvez-vous m'aider ?

ATEGIE - Bureau d'Études Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Posté(e)

Salut,

 

c'est parce que tu ne peux pas faire de command où de get(int-real-string) dans une fonction appelée par la boite de dialogue.

Aide au téléchargement du cadastre dgfip-download-helper
Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0
Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js

Posté(e)

Merci pour ta réponse, mais je reste coincé,

 

alors est-ce qu'une boite de dialogue peut appeler une procédure plutôt qu'une fonction ?

 

et si oui comment ?

ATEGIE - Bureau d'Études Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Posté(e)

Salut,

 

est-ce qu'une boite de dialogue peut appeler une procédure plutôt qu'une fonction ?

Il n'y a pas de procédures en LISP, que des fonctions (LISP est un langage fonctionnel).

Toute expression LISP évaluée retourne une valeur fusse-t-elle nil ou une valeur invisible comme avec (princ).

 

Ton problème vient de ce que les boites de dialogue DCL pilotées en LISP sont des boites modales : il faut les fermer pour passer le focus à l'éditeur d'AutoCAD.

 

Une solution simple est, dans le callback (retro-appel) du bouton (action_tile), d'assigner l'expression qui appelle la fonction à une variable puis d'appeler (done_dialog) pour fermer le dialogue. Et ensuite d'évaluer l'expression contenue dans la variable.

 

(defun c:tbp (/ id fun)
 (setq id (load_dialog "tubpvc.dcl"))
 (if (new_dialog "PVC_EVAC" id)
   (progn
     (action_tile "cancel" "(done_dialog)")
     (action_tile "reseau" "(setq fun '(reseau_f)) (done_dialog)")
     (action_tile "culotte" "(setq fun '(embranchement_f)) (done_dialog)")
     (action_tile "coude" "(setq fun '(coude_f)) (done_dialog)")
     (start_dialog)
     (unload_dialog id)
   )
 )
 (if fun
   (eval fun)
 )
 (princ)
)

(defun reseau_f () (alert "reseau_f"))

(defun embranchement_f () (alert "embranchement_f"))

(defun coude_f () (alert "coude_f"))

 

Note la déclaration des variables en local et l'utilisation de if pour éviter les erreurs.

Dans la variable fun, l'expression qui appelle la fonction est "quotée" (avec l'apostrophe) pour ne pas être évaluée. L'utilisation de la fonction eval permet de forcer l'évaluation de cette expression.

 

 

On peut aussi ne fermer la boite de dialogue que temporairement le temps de l'exécution de la fonction appelée.

Pour ce faire, on utilise la valeur retournée par (start_dialog) dans une boucle après l'avoir initialisée.

(start_dialog) retourne la valeur passée en argument à done_dialog* cet argument (optionnel) sera différent pour chaque callback pour permettre de lancer la fonction en fonction du bouton cliqué.

 

(defun c:tbp (/ id status fun)
 (setq	id     (load_dialog "tubpvc.dcl")
status 2
 )
 (while (< 1 status)
   (if	(new_dialog "PVC_EVAC" id)
     (progn
(action_tile "cancel" "(done_dialog 0)")
(action_tile "reseau" "(done_dialog 3)")
(action_tile "culotte" "(done_dialog 4)")
(action_tile "coude" "(done_dialog 5)")
(setq status (start_dialog))
(cond
  ((= 3 status) (reseau_f))
  ((= 4 status) (embranchement_f))
  ((= 5 status) (coude_f))
)
     )
   )
 )
 (unload_dialog id)
 (princ)
)

 

* cette valeur est, par défaut, 1 pour le bouton OK (accept) et 0 pour le bouton Annuler (cancel).

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

merci (gile), je suis parti sur la solution 1 qui me convient parfaitement.

 

Je n'hésiterai pas à revenir vous poser des questions sur d'autre point.

 

Je veux diffuser mon code mais comme les pièces sont de marque (TSI TSIT pas de marques) je ne pourrai pas diffuser les blocs, c'est dommage...

ATEGIE - Bureau d'Études Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

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é