Aller au contenu

[Résolu] J'aimerais comprendre les "initget".


Messages recommandés

Posté(e)

Bonjour à la communauté.

Voilà, je suis en pleine programmation (oui, je trouve le terme grand, comparativement à mes compétences) et j'ai écris ça dans en Lisp "temporaire" :

(setq LiGbBtOld "Oui")
(initget "Oui Non")
(or (setq Rep (getkword (strcat "\nLiaison en attente sur semelle [Oui/Non] <" LiGbBtOld "> : ") ;_ Fin de strcat
              ) ;_ Fin de getkword
    ) ;_ Fin de setq
) ;_ Fin de or
(princ (strcat "\nRep=" Rep))
(princ (strcat "\nLiGbBtOld=" LiGbBtOld))
(setq LiGbBt Rep)
(princ (strcat "\nLiGbBt=" LiGbBt))

Mais j'ai un souci, quand la réponse et "rien" (en fait [Enter]) voici le résultat :

Commande: 'VLIDE
Liaison en attente sur semelle [Oui/Non] <Oui> : O
Rep=Oui
LiGbBtOld=Oui
LiGbBt=Oui
Commande:

Je ne comprend pas pourquoi, quelle que soit ma réponse, Rep=Oui... Car j'aimerais qu'elle soit, s'il n'y a pas de réponse à la question, égale à LiGbBt

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)

Salut,

Tu utilises une expression (or ...) mais il n'y a qu'une seule expression (setq ...) dans cette expression. en mauvais français, ça revient à dire : "l'utilisateur spécifie une option ou".

Plutôt que d'utiliser une expression logique (or ...) que tu ne semble pas complètement maitriser, essaye plutôt avec son équivalent dans ce cas précis : (if (not ...) ...)
Algo : si l'utilisateur ne spécifie pas d'options on affecte à Rep la valeur de LiGbBtOld, puis on affecte à LiGbBt la valeur de Ref.
 

(initget "Oui Non")
(if (not (setq Rep (getkword (strcat "\nLiaison en attente sur semelle [Oui/Non] <" LiGbBtOld "> : ") ;_ Fin de strcat
		   ) ;_ Fin de getkword
	 ) ;_ Fin de setq
    ) ;_ fin de not
  (setq Rep LiGbBtOld)
) ;_ Fin de if
(setq LiGbBt Rep)

 

Mais on peut écrire les choses de façon plus simple sans multiplier les variables.
Algo : si l'utilisateur spécifie une option, on l'affecte à LiGbBt).

(initget "Oui Non")
(if (setq tmp (getkword	(strcat "\nLiaison en attente sur semelle [Oui/Non] <" LiGbBt "> : ") ;_ Fin de strcat
	      ) ;_ Fin de getkword
    ) ;_ Fin de setq
  (setq LiGbBt tmp)
) ;_ Fin de if

Tout ça n'est que de la logique binaire qu'il est toujours préférable d'exprimer le plus simplement possible.

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

Posté(e)

Salut (gile), et merci pour ton aide.
Donc, depuis le temps qu'on se "connait", tu n'as toujours pas compris...

Tu dis : "que tu ne semble pas complètement maitriser", ne sais-tu pas encore que je ne maitrise absolument rien en LiSP ? ? 😉 

Je vois que je me suis mal exprimé (encore une fois), je cherche à savoir si Oui, Non ou rien, et si rien, l'ancienne valeur est bonne.
Je continu : LiGbBtOld  est l'ancienne réponse (Old).

Si maintenant on répond Oui ou Non, c'est cette nouvelle valeur qui prime, mais s'il n'y a pas de valeur entrée, donc [ENTER], c'est LiGbBtOld qui sera la bonne réponse.

Je ne sais toujours pas si j'ai été clair...

Mais 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)

Posté(e)
((lambda ( / Rep)
	(if (not LiGbBt) (setq LiGbBt "Oui"))
	(initget "Oui Non")
	(while (or (setq Rep (getkword (strcat "\nLiaison en attente sur semelle [Oui/Non] <" LiGbBt "> : "))) (null Rep))
		(if (not Rep)
			(setq Rep LiGbBt)
		)
		(set 'LiGbBt Rep)
		(princ (strcat "\nLiGbBt=" LiGbBt))
		(initget "Oui Non")
	)
	(prin1)
))

Pour tester et comprendre la fonction (Esc pour sortir de la boucle)

(if (not LiGbBt) (setq LiGbBt "Oui"))
(initget "Oui Non")
(if (not (setq rep (getkword (strcat "\nLiaison en attente sur semelle [Oui/Non] <" LiGbBt "> : "))))
  (setq Rep LiGbBt)
)
(set 'LiGbBt Rep)
(princ (strcat "\nLiGbBt=" LiGbBt))
(prin1)

Le code simple à intégrer dans ton code

Note l'usage de (set 'LiGbBt Rep)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)
il y a une heure, DenisHen a dit :

Je vois que je me suis mal exprimé (encore une fois), je cherche à savoir si Oui, Non ou rien, et si rien, l'ancienne valeur est bonne.
Je continu : LiGbBtOld  est l'ancienne réponse (Old).

Si maintenant on répond Oui ou Non, c'est cette nouvelle valeur qui prime, mais s'il n'y a pas de valeur entrée, donc [ENTER], c'est LiGbBtOld qui sera la bonne réponse.

en quoi est-ce différent de :

Il y a 2 heures, (gile) a dit :

si l'utilisateur ne spécifie pas d'options on affecte à Rep la valeur de LiGbBtOld, puis on affecte à LiGbBt la valeur de Ref.

ou :

Il y a 2 heures, (gile) a dit :

si l'utilisateur spécifie une option, on l'affecte à LiGbBt).

 

Ce qui donne en code testable :

(defun c:test1 (/ Rep LiGbBt)
  ;; initialisation et stockage de la valeur par défaut dans une variable globale
  (if (not LiGbBtOld)
    (setq LiGbBtOld "Oui")
  )
  (initget "Oui Non")
  (if (not (setq Rep
		  (getkword
		       (strcat "\nLiaison en attente sur semelle [Oui/Non] <" LiGbBtOld "> : ") ;_ Fin de strcat
		     ) ;_ Fin de getkword
	   ) ;_ Fin de setq
      ) ;_ fin de not
    (setq Rep LiGbBtOld)
  ) ;_ Fin de if
  (setq LiGbBt Rep)
  ;; mise à jour de la valeur par défaut
  (setq LiGbBtOld Rep)
  (prompt (strcat "\nLiGbBt: " LiGbBt))
  (princ)
)

ou :

(defun c:test2 (/ Rep)
  ;; initialisation et stockage de la valeur par défaut dans une variable globale
  (if (not *LiGbBt*)
    (setq *LiGbBt* "Oui")
  )
  (initget "Oui Non")
  (if (setq Rep
	     (getkword
		  (strcat "\nLiaison en attente sur semelle [Oui/Non] <" *LiGbBt* "> : ") ;_ Fin de strcat
		) ;_ Fin de getkword
      ) ;_ Fin de setq
    (setq *LiGbBt* Rep)
  ) ;_ Fin de if
  (prompt (strcat "\n*LiGbBt*: " *LiGbBt*))
  (princ)
)

 

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

Posté(e)

Bonjour à tous.

Mille mercis à vous, je comprends mieux maintenant...
Et vos codes m'aide beaucoup...

@(gile) : je pensais m'être mal fais comprendre, tant mieux si c'est faux, c'est que je progresse en explication de "problèmes".
@bonuscad : je ne sais pas utiliser lambda (je ne l'ai fais qu'une fois, et je ne sais toujours pas comment j'ai réussi...).

Encore merci à vous...

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é