sechanbask Posté(e) le 23 novembre 2011 Posté(e) le 23 novembre 2011 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 Fluideshttp://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.pngExécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffragewww.ategie.fr
sechanbask Posté(e) le 28 novembre 2011 Auteur Posté(e) le 28 novembre 2011 Je n'ai toujours pas trouvé mon erreur. Je suis donc coincé, pouvez-vous m'aider ? ATEGIE - Bureau d'Études Fluideshttp://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.pngExécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffragewww.ategie.fr
vincentp010 Posté(e) le 28 novembre 2011 Posté(e) le 28 novembre 2011 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
sechanbask Posté(e) le 28 novembre 2011 Auteur Posté(e) le 28 novembre 2011 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 Fluideshttp://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.pngExécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffragewww.ategie.fr
(gile) Posté(e) le 28 novembre 2011 Posté(e) le 28 novembre 2011 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
sechanbask Posté(e) le 5 décembre 2011 Auteur Posté(e) le 5 décembre 2011 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 Fluideshttp://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.pngExécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffragewww.ategie.fr
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