Déméter_33 Posté(e) le 29 août 2023 Posté(e) le 29 août 2023 Bonjour, Comme le titre l'indique, dans la routine suivante, les valeurs par défaut des entrées utilisateur paramétrées à l'aide de GETWORD ne prennent pas en compte la valeur par défaut comprise entre les chevrons lorsqu'on appuie sur ENTREE: (defun FISSURE() (setq OS (getvar "OSMODE" )) ;Enregistre la variable définissant la combinaison d'acroche objets en cours (setq AU (getvar "autosnap")) ;enregistre la valeur de variable autosnap de l'utilisateur (command "accrobj" "proche") ;Définis l'acroche minimale pour le dessin (command "autosnap" "55") (initcommandversion 2) ;exécute la fonction suivante avec les options complètes (command "_spline") ;Lance le dessin de la fissure (while (= (getvar "cmdactive") 1) ;permet à l'utilisateur de tracer plusieurs points sans interrompre la routine (Command pause) ) (command "accrobj" "proche") ;définition de l'accroche objet pour placer la barette (setq D (getpoint "\n Donner la position: ")) ;acquisition de coordonnées d'un point de mise en place de bloc (command "-inserer" "bar" D "1" "") ;insertion du bloc "bar" aux coordonnées capturées précédement (while (= (getvar "cmdactive") 1) ;permet à l'utilisateur d'orienter le bloc sans interrompre la routine (Command pause) ) (Command "osmode" "0") ;désactive tous les accroche objet (if (= Ouv nil) (setq Ouv (getstring "\nDonner la valeur de l'Ouverture O:" "\_space" )) ) (initcommandversion 1) (setq STY "DIADES") (if (not (tblsearch "style" STY)) ;Vérifie l'existence du style Diadès, et le définit comme style de base (command "-style" "DIADES" "ARIAL" "2" "" "" "" "") (command "-style" "DIADES" "" "" "" "" "" "") ) (command "-texte" 0 0 (strcat "O:" Ouv "mm")) ; Renvoie O:Omm (ou le O central est le nombre) en texte (sans retours à la ligne) (setq js (ssadd (entlast)) ;définis le dernier jeu d'entités dans le groupe d'entités nommé js dernier (entlast) ) (command "_copyclip" dernier "") ;Copie le dernier jeu d'entités (command "_erase" dernier "") ;supprime le dernier jeu d'entités (command "_pasteclip") ;colle le dernier jeu d'entités (while (= (getvar "cmdactive") 1) ;permet a l'utilisateur de placer l'objet avant la continuation de la routine (Command pause) ) (initget "Oui Non") (setq rep1 (getkword "\nContinuer ? [Oui/Non] <Oui>: "));demande si la fonction doit être renouvelée, par défaut sur oui (if (= rep1 "Oui") ;si la réponse est oui, (progn (initget "Oui Non") (setq rep2 (getkword "\nConserver l'ouverture? [Oui/Non] <Oui>: ")) (if (= rep2 "Non") (setq Ouv nil) ) (FISSURE) ;la commande est renouvelée (princ) ) (progn ;sinon (command "osmode" OS) ;Réactive l'ancien mode d'acroche objets de l'utilisateur (command "AUTOSNAP" AU) ;réactive l'ancien ssnapmode de l'utilisateur (setq Ouv nil) (princ) ) ) (princ) ) ;Fin de la fonction de dessin du désordre Ci-dessous mon code complet, tout est fonctionnel si on utilise le clic de souris pour sélectionner les choix. Avez vous une idée de ce pourquoi cela ne fonctionne pas? (J'ai pourtant bien suivi les cours de da-code...) Merci d'avance.
(gile) Posté(e) le 29 août 2023 Posté(e) le 29 août 2023 Si tu entres l'expression suivante dans la console (ou à la ligne de commande) et que tu fais 'Entrée', quelle est la valeur de 'rep1' ? (initget "Oui Non") (setq rep1 (getkword "\nContinuer ? [Oui/Non] <Oui>: ")) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Déméter_33 Posté(e) le 30 août 2023 Auteur Posté(e) le 30 août 2023 En ne mettant que ces deux lignes de code, une fois fait ENTREE, le résultat de la console ci-dessous: Commande: Continuer ? [Oui/Non] <Oui>: Commande: Commande: (princ rep1) nilnil Du coup je n'ai pas d'idée...
VDH-Bruno Posté(e) le 30 août 2023 Posté(e) le 30 août 2023 Bonjour; il y a 33 minutes, Déméter_33 a dit : Du coup je n'ai pas d'idée... Peut être que cela répondra à votre besoin: (initget "Oui Non") (setq rep1 (cond ((getkword "\nContinuer ? [Oui/Non] <Oui>: ")) ("Oui"))) Apprendre => Prendre => Rendre
Déméter_33 Posté(e) le 30 août 2023 Auteur Posté(e) le 30 août 2023 Bonjour VDH-Bruno, il y a 58 minutes, VDH-Bruno a dit : Peut être que cela répondra à votre besoin: (initget "Oui Non") (setq rep1 (cond ((getkword "\nContinuer ? [Oui/Non] <Oui>: ")) ("Oui"))) Tout à fait, cela convient impeccablement, j'ai galéré ailleurs dans le code pour ajouter d'autres éléments mais tout fonctionne à merveille maintenant. Merci beaucoup. Toutefois, cela ne dit pas pour quelle raison le bout de code suivant ne fonctionne pas: (initget "Oui Non") (setq rep1 (getkword "\nContinuer ? [Oui/Non] <Oui>: ")) Des idées là dessus? A des fins d'apprentissage surtout...
Luna Posté(e) le 30 août 2023 Posté(e) le 30 août 2023 Coucou, il y a une heure, Déméter_33 a dit : Du coup je n'ai pas d'idée.. Ce que (gile) cherchait à te faire comprendre ici c'est que faire une validation à vide avec un (getkword), et c'est de même avec la plupart des fonctions (get-) en général, retourne nil ! Autrement dit cela te retourne une entrée vide. Il faut savoir que la manière dont on écrit le texte d'un (getkword) n'est que pure syntaxe, mais cela ne signifie aucunement que c'est programmé nativement pour fonctionner ainsi. C'est simplement ainsi que AutoCAD fait la séparation entre simple texte, options et valeurs par défaut donc pour ne pas perdre l'utilisateur on copie cette syntaxe. Un simple exemple, sur ton (initget "Oui Non") (setq rep1 (getkword "\nContinuer ? [Oui/Non] <Oui>: ")) Écrire les options entre crochets et séparées par un slash est une simple écriture autocadienne vis-à-vis des options. Car en effet si tu écris juste cette ligne (setq rep1 (getkword "\nContinuer ? [Oui/Non] <Oui>: ")) les options vont-elles apparaître comme des options ? Non et ce malgré le fait que la syntaxe soit celle d'AutoCAD, n'est-ce pas ? Donc pour que le programme comprenne que la syntaxe [Oui/Non] doit être un ensemble d'options composé de Oui et Non, il y a besoin de le signifier nous même par de la programmation via (initget "Oui Non") Et bien pour les valeurs par défaut c'est pareil, si on ne programme pas une valeur par défaut, alors le programme ne pourra pas interpréter correctement ta syntaxe pour faire fonctionner ton programme comme souhaité. Or pour cela, il ne faut pas passer par (initget) mais justement comprendre ce que signifie réellement l'action de faire une validation à vide. Car pour (getkword), soit on répond via les options (et cela retourne donc l'option choisie), soit on rentre une chaîne de caractères arbitraire (et cela retourne donc une chaîne de caractères), soit on répond juste entrée (et cela retourne nil). Autrement dit, dans tous les cas un (getkword) retourne une chaîne de caractères SAUF si on fait une validation à vide (équivalent à choisir la valeur par défaut). En comprenant alors cette subtilité, tu peux donc mieux comprendre la réponse de VDH-Bruno : (initget "Oui Non") (setq rep1 (cond ((getkword "\nContinuer ? [Oui/Non] <Oui>: ")) ("Oui"))) impliquant ainsi d'affecter à la variable 'rep1', soit n'importe quelle chaîne de caractères retournée par (getkword) soit la chaîne de caractères "Oui" dans le cas où le (getkword) retourne nil (correspondant à un utilisateur ayant souhaité choisir la valeur par défaut). A titre d'exemple, cela fonctionne également (initget "Oui Non") (setq rep1 (cond ((getkword "\nContinuer ? [Oui/Non] <?>: ")) ("?"))) ici la valeur par défaut "?" n'apparaît pas dans le (initget) et pourtant elle fonctionne et remplie parfaitement sont rôle de valeur par défaut. Bisous, Luna 1
Déméter_33 Posté(e) le 30 août 2023 Auteur Posté(e) le 30 août 2023 Bonjour Luna, il y a 16 minutes, Luna a dit : En comprenant alors cette subtilité, tu peux donc mieux comprendre la réponse de VDH-Bruno : En effet, je comprend désormais sa réponse, ton explication est plus explicite aussi que le site da-code qui ne rentre pas vraiment dans le détail. Merci beaucoup j'en apprend tous les jours en ce moment...
(gile) Posté(e) le 30 août 2023 Posté(e) le 30 août 2023 À l'expression : (initget "Oui Non") (setq rep1 (getkword "\nContinuer ? [Oui/Non] <Oui>: ")) On peut répondre : - soit "Oui" (ou "O") ce qui met la valeur de rep1 à "Oui" ; - soit "Non" (ou "N") ce qui met la valeur de rep1 à "Non" ; - soit faire "Entrée" ce qui met la valeur de rep1 à nil. On voit donc que si l'utilisateur veut continuer rep1 est égal à "Oui" ou nil. C'est dans le traitement conditionnel de cette entrée qu'il faut prendre en compte toutes les possibilités donc écrire : (if (or (= rep1 "Oui") (null rep1)) (progn ;si la réponse est oui ou nil, (initget "Oui Non") (setq rep2 (getkword "\nConserver l'ouverture? [Oui/Non] <Oui>: ")) (if (= rep2 "Non") (setq Ouv nil) ) (FISSURE) ;la commande est renouvelée (princ) ) (progn ;sinon (command "osmode" OS) ;Réactive l'ancien mode d'acroche objets de l'utilisateur (command "AUTOSNAP" AU) ;réactive l'ancien ssnapmode de l'utilisateur (setq Ouv nil) (princ) ) ) Ou plus simplement, parce que pour "Non" il n'y a qu'une réponse possible : (if (= rep1 "Non") (progn ;si la réponse est non, (command "osmode" OS) ;Réactive l'ancien mode d'acroche objets de l'utilisateur (command "AUTOSNAP" AU) ;réactive l'ancien ssnapmode de l'utilisateur (setq Ouv nil) (princ) ) (progn ;sinon (initget "Oui Non") (setq rep2 (getkword "\nConserver l'ouverture? [Oui/Non] <Oui>: ")) (if (= rep2 "Non") (setq Ouv nil) ) (FISSURE) ;la commande est renouvelée (princ) ) ) 1 Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Déméter_33 Posté(e) le 30 août 2023 Auteur Posté(e) le 30 août 2023 Merci beaucoup (gile), ta réponse vient compléter différemment celles précédentes, mais avec une approche à laquelle je ne pouvais en effet penser sans avoir compris que il y a 41 minutes, (gile) a dit : On peut répondre : - soit "Oui" (ou "O") ce qui met la valeur de rep1 à "Oui" ; - soit "Non" (ou "N") ce qui met la valeur de rep1 à "Non" ; - soit faire "Entrée" ce qui met la valeur de rep1 à nil. Du coup cette méthode: il y a 43 minutes, (gile) a dit : (if (or (= rep1 "Oui") (null rep1)) (progn ;si la réponse est oui ou nil, (initget "Oui Non") (setq rep2 (getkword "\nConserver l'ouverture? [Oui/Non] <Oui>: ")) (if (= rep2 "Non") (setq Ouv nil) ) (FISSURE) ;la commande est renouvelée (princ) ) (progn ;sinon (command "osmode" OS) ;Réactive l'ancien mode d'acroche objets de l'utilisateur (command "AUTOSNAP" AU) ;réactive l'ancien ssnapmode de l'utilisateur (setq Ouv nil) (princ) ) ) Bien que tout aussi efficace dans cette configuration m'emmène à penser à des moyens d'optimiser encore cette partie du code. Merci encore à vous trois VDH-Bruno , Luna et (gile) pour vos éclaircissements et solutions.
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