Aller au contenu

[Résolu] Boucler sur un initget


DenisHen

Messages recommandés

Bonjour à la communauté.
J'ai un (initget avec plusieurs choix. Mais quand j'en choisi un, le prompteur ne revient pas au choix :

(defun c:DH_TestInitGet ()
  (initget 1 "Saisie Épaisseur Type Niveau")
  (setq Choix (getkword "\nChoix de l'option [Saisie/Épaisseur/Type/Niveau] : "))
  (cond ((= Choix "Saisie") (princ "\nChoix : Saisie"))
        ((= Choix "Épaisseur") (princ "\nChoix : Épaisseur"))
        ((= Choix "Type") (princ "\nChoix : Type"))
        ((= Choix "Niveau") (princ "\nChoix : Niveau"))
  ) ;_ Fin de cond
) ;_ Fin de defun

J'ai trouvé un début de solution que j'ai trouvé sur "Google est mon ami" avec un (while :

(defun c:DH_TestInitGet ()
  (while (/= (type Choix) 'LIST)
    (initget 1 "Saisie Épaisseur Type Niveau")
    (setq Choix (getkword "\nChoix de l'option [Saisie/Épaisseur/Type/Niveau] : "))
    (cond ((= Choix "Saisie") (princ "\nChoix : Saisie"))
          ((= Choix "Épaisseur") (princ "\nChoix : Épaisseur"))
          ((= Choix "Type") (princ "\nChoix : Type"))
          ((= Choix "Niveau") (princ "\nChoix : Niveau"))
    ) ;_ Fin de cond
  ) ;_ Fin de while
) ;_ Fin de defun

Mais avec ce code, je n'arrive pas à sortir du (while.
Il y a bien la solution d'ajouter une option "Sortie", mais est-il possible de sortir de la bouble par un [ENTRER] ?
J'ai trouvé d'autres codes, mais que je ne comprends pas.
Bien à toi la communauté.
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)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Il y a 1 heure, DenisHen a dit :

Mais avec ce code, je n'arrive pas à sortir du (while

Encore une fois, fais des test avec des expressions simples (c'est si facile en LISP depuis la console ou la ligne de commande).
Quelle est la valeur renvoyée quand tu fais Entrée en réponse à un getkword ? Pourquoi testes-tu si cette valeur est une liste ?

 

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Salut @(gile) et merci de me répondre.
Je n'arrive pas à savoir quelle est la réponse si je fais [ENTRER]
Mais je viens de voir (dans ton merveilleux "Introduction a AutoLISP") une sorte de "Else" (T...), devrais-je fouiller par là ?
Encore merci pour ton aide.

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)

Lien vers le commentaire
Partager sur d’autres sites

il y a 29 minutes, DenisHen a dit :

Je n'arrive pas à savoir quelle est la réponse si je fais [ENTRER]

Si tu lances l'expression (getkword ...) depuis la console, la réponse s'affiche dans la console, si tu le fais depuis la ligne de commande, la réponse s'affiche sur la ligne de commande.

image.png.4479f1a95ff65c8841a7db2ed89d5937.png

image.png.1e6666bddb482f296fa9a0284e4ebfb9.png

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @(gile) et merci pour ton aide.
Le retour à la touche [ENTRER] est nil. Je pense avoir trouvé, mais je ne trouve pas le (setq Choix "Valeur") très élégant :

(defun c:DH_TestInitGet ( / Choix)
  (setq Choix "Valeur")
  (while (/= Choix nil)
    (initget "Saisie Épaisseur Type Niveau")
    (setq Choix (getkword "\nChoix de l'option [Saisie/Épaisseur/Type/Niveau] : "))
    (cond ((= Choix "Saisie") (princ "\nChoix : Saisie"))
          ((= Choix "Épaisseur") (princ "\nChoix : Épaisseur"))
          ((= Choix "Type") (princ "\nChoix : Type"))
          ((= Choix "Niveau") (princ "\nChoix : Niveau"))
    ) ;_ Fin de cond
  ) ;_ Fin de while
  (princ)
)


Je ne sais pas si j'ai la bonne solution, mais je pense avoir trouvé une parade, mais pas plus élégante pour cela 

(defun c:DH_TestInitGet ( / Choix)
  (while (/= (type Choix) 'LIST)
    (initget "Saisie Épaisseur Type Niveau")
    (setq Choix (getkword "\nChoix de l'option [Saisie/Épaisseur/Type/Niveau] : "))
    (cond ((= Choix "Saisie") (princ "\nChoix : Saisie"))
          ((= Choix "Épaisseur") (princ "\nChoix : Épaisseur"))
          ((= Choix "Type") (princ "\nChoix : Type"))
          ((= Choix "Niveau") (princ "\nChoix : Niveau"))
          (T (setq Choix '("Sortie")))
    ) ;_ Fin de cond
  ) ;_ Fin de while
  (princ)
) ;_ Fin de defun

Encore merci pour ton aide.
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)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @DenisHen

Il semble que tu ne lises pas les réponses, ou si tu le fais tu ne réponds pas aux questions posées.

Pourquoi testes-tu si "choix" n'est pas une liste avec ton while ?
Pourquoi les quatre premières conditions renvoient une chaîne et la dernière une liste ?

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @didier
La dernière condition transforme la variable Choix en liste pour sortir du (while.
Je sais que ça ne doit pas être très académique, mais je l'ai écris comme ça, car je comprends ce code.
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)

Lien vers le commentaire
Partager sur d’autres sites

Et pourquoi ne pas simplement faire :

(defun c:DH_TestInitGet ( / Choix)
  (while (/= Choix "Quitter")
    (initget "Saisie Épaisseur Type Niveau Quitter")
    (setq Choix (getkword "\nChoix de l'option [Saisie/Épaisseur/Type/Niveau/Quitter] <Quitter> : "))
    (cond ((= Choix "Saisie") (princ "\nChoix : Saisie"))
          ((= Choix "Épaisseur") (princ "\nChoix : Épaisseur"))
          ((= Choix "Type") (princ "\nChoix : Type"))
          ((= Choix "Niveau") (princ "\nChoix : Niveau"))
          (T (setq Choix "Quitter"))
    ) ;_ Fin de cond
  ) ;_ Fin de while
  (princ)
) ;_ Fin de defun

J'ai plus l'habitude d'utiliser une variable booléenne différente de mon (getkword) pour mettre fin à la boucle :

(defun c:DH_TestInitGet ( / break Choix)
  (while (not break)
    (initget "Saisie Épaisseur Type Niveau")
    (setq Choix (getkword "\nChoix de l'option [Saisie/Épaisseur/Type/Niveau] <Quitter> : "))
    (cond ((= Choix "Saisie") (princ "\nChoix : Saisie"))
          ((= Choix "Épaisseur") (princ "\nChoix : Épaisseur"))
          ((= Choix "Type") (princ "\nChoix : Type"))
          ((= Choix "Niveau") (princ "\nChoix : Niveau"))
          ((null choix) (setq break T))
    ) ;_ Fin de cond
  ) ;_ Fin de while
  (princ)
) ;_ Fin de defun

Mais l'utilisation d'un type différent n'est pas nécessaire...Je pense surtout que tu as eut l'idée de faire une différenciation via le type mais ce n'est pas nécessaire...
Une autre variante, plus logique serait d'avoir le (getkword) comme condition :

(defun c:DH_TestInitGet ( / Choix)
  (while 
    (progn
      (initget "Saisie Épaisseur Type Niveau")
      (setq Choix (getkword "\nChoix de l'option [Saisie/Épaisseur/Type/Niveau] <Quitter> : "))
    )
    (cond ((= Choix "Saisie") (princ "\nChoix : Saisie"))
          ((= Choix "Épaisseur") (princ "\nChoix : Épaisseur"))
          ((= Choix "Type") (princ "\nChoix : Type"))
          ((= Choix "Niveau") (princ "\nChoix : Niveau"))
    ) ;_ Fin de cond
  ) ;_ Fin de while
  (princ)
) ;_ Fin de defun

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @Luna et un grand merci pour cette leçon et ton aide...
J'ai appris plein de truc...
Et le (not break) et le (null choix) (setq break T)), je trouve ça super élégant...
Mais je pense qu'il y a une parenthèse en trop avant le (null.
En tous cas, un super grand merci...

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)

Lien vers le commentaire
Partager sur d’autres sites

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é