Aller au contenu

Comment demander deux choses à l'utilisateur ?


Messages recommandés

Posté(e)

Bonjour DenisH,

 

Je me tiens un peu en retrait de la discussion car en lisp j'ai une approche très différente, qui ne ferais que ajouter de la confusion à la discussion.

 

Néanmoins, si tu as un peu de curiosité dans ta fonction de "Configuration" je t'inviterai à jeter un œil sur cette discussion,ou nous avions à titre d'exemple définie une fonction pour la saisie de mot clé avec une valeur par défaut:

(defun question (msg rep)
   (initget "Oui Non")
   (cond ((getkword (strcat msg " [Oui/Non] <" rep ">: ")))
         (rep)
   )
 )

 

Avec l'expression suivante:

(vlax-ldata-get "DenisH" "EtiqPTRL_XY" "Oui")

 

rappelé hier, on peut aisément créer/modifier la clé dans une même ligne de code:

(vlax-ldata-put
   "DenisH"
   "EtiqPTRL_XY"
   (question "\nÉcrire l'X et l'Y " (vlax-ldata-get "DenisH" "EtiqPTRL_XY" "Oui"))
)

 

A+

 

Edit: Je viens de voir la réponse de _Zebulon, le même raisonnement peut être transposé pour EtiqCalq à toi de voir ce qui te va le mieux.

Apprendre => Prendre => Rendre

Posté(e)

Bonjour VDH-Bruno,

 

Et merci de me répondre...

 

J'ai bien suivi ton raccourci vers la discution, mais j'avoue ne pas trop comprendre le "(defun question" à l'intérieur de "(defun c:cscc".

 

J'ai créé un LiSP avec les prog trouvés sur cette page... Je "m'amuse" à faire des tests...

(defun c:cscc (/ question)
 (defun question (msg rep) (initget "Oui Non") (getkword (strcat msg " [Oui/Non] <" rep ">: ")))
 (alert (strcat "Configuration modifiée: "
                (if (= "Oui" (question "Voulez-vous rapprocher les calques ?" "Oui"))
                  (progn (command "_-LAYER" "_RECONCILE" "*" "") "\n -> Calques rapprochés")
                  "\n -> Calques non rapprochés"
                ) ;_ Fin de if
                (if (= "Oui" (question "Voulez-vous purger votre dessin ?" "Oui"))
                  (progn (command "_-PURGE" "_A" "*" "_N") "\n -> Dessin purgé")
                  "\n -> Dessin non purgé"
                ) ;_ Fin de if
                (if (= "Oui" (question "Voulez-vous sauvegarder votre dessin ?" "Oui"))
                  (progn (command "_QSAVE") "\n -> Dessin sauvegardé")
                  "\n -> Dessin non sauvegardé"
                ) ;_ Fin de if
        ) ;_ Fin de strcat
 ) ;_ Fin de alert
) ;_ Fin de defun

 

Intéressant, c'est hyper condensé et pas facile à lire à mon niveau...

 

Mais j'ai inclu un "(getstring" dans mon LiSP, je ne sais pas me dépatouiller pour l'intégrer dans le "(defun question"... Je pense que ce n'est pas possible. En tous cas à mon niveau...

 

A moins de faire un "(defun questionON" pour l'"(initget "Oui" "Non" et un "(defun questionStr" sans "(initget" pour le "(getstring".

 

Et merci encore,

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Je viens de faire ça :

(defun c:TestEtiq (/ question)
 (defun questionON (msg rep) (initget "Oui Non") (getkword (strcat msg " [Oui/Non] <" rep ">: ")))
 (defun questionStr (msg rep) (getstring T (strcat msg "<" rep ">: ")))
 (alert (strcat "Configuration modifiée : "
                (if (= "Oui"
                       (questionON
                         "Voulez-vous indiquer l'X et l'Y dans l'étiquette ? "
                         (vlax-ldata-get "DenisH" "EtiqPTRL_XY" "Oui")
                       ) ;_ Fin de questionON
                    ) ;_ Fin de =
                  "\n -> Écrire les X et Y"
                  "\n -> Ne pas écrire les X et Y,"
                ) ;_ Fin de if
                (if (= "Oui"
                       (questionON
                         "Voulez-vous indiquer le Z dans l'étiquette ? "
                         (vlax-ldata-get "DenisH" "EtiqPTRL_Z" "Oui")
                       ) ;_ Fin de questionON
                    ) ;_ Fin de =
                  "\n -> Écrire le Z,"
                  "\n -> Ne pas écrire le Z,"
                ) ;_ Fin de if
                (if (= "Oui"
                       (questionStr
                         "Dans quel calque voulez-vous placer l'étiquette ? "
                         (vlax-ldata-get "DenisH" "EtiqPTRL_Calq" "_ETIQ")
                       ) ;_ Fin de questionStr
                    ) ;_ Fin de =
                  (progn "\n -> Écrire l'étiquette dans le calque "
                         (vlax-ldata-get "DenisH" "EtiqPTRL_Calq" "_ETIQ")
                  ) ;_ Fin de progn
                ) ;_ Fin de if
        ) ;_ Fin de strcat
 ) ;_ Fin de alert
) ;_ Fin de defun

 

Mais forcément, le "(defun questionStr" ne fonctionne pas. Normal, "Oui" n'a rien a voir dans l'histoire... Je pense y mettre plustôt un "(cond".

 

Ou alors jongler avec

(setq Temp (getstring 
                  (strcat "Quelle 'extention' du calque utiliser <" EtiqCalq "> ? ")
                ) ;_ Fin de getstring
 ) ;_ Fin de setq
 (if (/= Temp "")
   (setq EtiqCalq Temp)
 ) ;_ Fin de if

Je ne sais pas encore quelle solution choisir... Pour l'instant, j'ai décidé de me noyer dans un verre d'eau...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Merci VDH-Bruno de m'aider.

 

Voilà, pour un certain client, je lance la commande comme ça :

^C^C(c:Rens_PTRL "")

et pour les autres :

^C^C(c:Rens_PTRL "DET_RES_CHA") 

 

Car mon "(defun" est :

(defun c:Rens_PTRL (Calq / Txt_Alti.......)

 

En fait, dans le premier cas, j'aurais le nom du calque "" + EtiqCalq ("R-AS-coord") qui donne le calque "R-AS-coord".

 

Dans les autres cas, j'aurais le nom du calque "DET_RES_CHA" + EtiqCalq ("_ETIQ") qui donne "DET_RES_CHA_ETIQ"

 

J'ai fais une palette de commande avec :

Etiq.Réseaux => ^C^C(c:Rens_PTRL "")

Etiq.Chaleur => ^C^C(c:Rens_PTRL "DET_RES_CHA")

Etiq.ErDF => ^C^C(c:Rens_PTRL "DET_RES_ELEC")

Etiq.Gaz => ^C^C(c:Rens_PTRL "DET_RES_GAZ")

....

 

De cette façon, j'enregistre la Config dans le dessin et je n'ai plus à y retoucher...

 

Voilà pourquoi j'ai un :

(setq CalqCourant (strcat Calq (vlax-ldata-get "DenisH" "EtiqPTRL_Calq")))

 

J'espère être clair.

 

J'ai déjà commencé à changer mon LiSP mais je n'ose pas le poster, de crainte que nos posts se croisent et que l'on n'y comprenne plus rien...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Bonjour Denis,

 

Mais forcément, le "(defun questionStr" ne fonctionne pas. Normal, "Oui" n'a rien a voir dans l'histoire... Je pense y mettre plustôt un "(cond".

 

Ou alors jongler avec

(setq Temp (getstring

(strcat "Quelle 'extention' du calque utiliser <" EtiqCalq "> ? ")

) ;_ Fin de getstring

) ;_ Fin de setq

(if (/= Temp "")

(setq EtiqCalq Temp)

) ;_ Fin de if

 

Je ne sais pas encore quelle solution choisir... Pour l'instant, j'ai décidé de me noyer dans un verre d'eau...

 

Denis...

 

Dans le cas du getstring et la clé "EtiqPTRL_Calq", à la réflexion le mieux est d'utiliser une variable provisoire comme suggéré par _zebulon,

Une proposition de code à décortiquer et tester:

(defun c:DHConfEtiqPTRL (/ question tmp)
 
 ;; Fonction auxiliaire
 (defun question (msg rep)
   (initget "Oui Non")
   (cond ((getkword (strcat msg " [Oui/Non] <" rep ">: ")))
         (rep)
   )
 )
 
 ;; Initialisation/modification des datas
 (vlax-ldata-put
   "DenisH"
   "EtiqPTRL_XY"
   (question "\nVoulez-vous indiquer l'X et l'Y dans l'étiquette"
             (vlax-ldata-get "DenisH" "EtiqPTRL_XY" "Oui")
   )
 )
 (vlax-ldata-put
   "DenisH"
   "EtiqPTRL_Z"
   (question "\nVoulez-vous indiquer le Z dans l'étiquette"
             (vlax-ldata-get "DenisH" "EtiqPTRL_Z" "Oui")
   )
 )
 (setq tmp (getstring
             (strcat "\nDans quel calque voulez-vous placer l'étiquette <"
                     (vlax-ldata-get "DenisH" "EtiqPTRL_Calq" (vlax-ldata-put "DenisH" "EtiqPTRL_Calq" "_ETIQ"))
                     ">: "
             )
           )
 )
 (if (/= "" tmp)
   (vlax-ldata-put "DenisH" "EtiqPTRL_Calq" tmp)
 )

 
 ;; Affichage
 (alert (strcat "Configuration actuelle : \n\tÉtiquette XY \t= "
                (vlax-ldata-get "DenisH" "EtiqPTRL_XY")
                "\n\tÉtiquette Z \t= "
                (vlax-ldata-get "DenisH" "EtiqPTRL_Z")
                "\n\tEtiqPTRL_Calq \t= "
                (vlax-ldata-get "DenisH" "EtiqPTRL_Calq")
        )
 )
 
 ;; Quitte tranquillement
 (princ)
)

 

A+

Apprendre => Prendre => Rendre

Posté(e)

Bonjour,

 

Dans le cas du getstring et la clé "EtiqPTRL_Calq", à la réflexion le mieux est d'utiliser une variable provisoire comme suggéré par _zebulon

parce que getstring ne renvoie pas nil mais "" après un <┘, donc on a du mal à utiliser directement des fonctions booléennes comme ici :

    (cond ((getkword (strcat msg " [Oui/Non] <" rep ">: ")))
         (rep)
   )

 

Amicalement

Vincent

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Bonjour,

 

 

parce que getstring ne renvoie pas nil mais "" après un <┘, donc on a du mal à utiliser directement des fonctions booléennes comme ici :

    (cond ((getkword (strcat msg " [Oui/Non] <" rep ">: ")))
         (rep)
   )

 

Amicalement

Vincent

C'est tout à fait ça, je n'aurais pas mieux dit.

A+

Apprendre => Prendre => Rendre

Posté(e)

Bonjour à tous, et merci,

 

VDH-Bruno, ça fonctionne nikel, j'ai juste rajouté un T après le "(getstring" pour autoriser les espaces dans la réponse (astuce que je connais depuis deux jours grâce à ce forum), merci,

 

Vincent, c'était bien là mon problème, je ne l'avais pas vu comme ça, merci...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

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é