Au lieu de forcer l’utilisateur à retaper une valeur à chaque fois, un expert proposerait la dernière valeur utilisée par défaut.
L’astuce consiste à utiliser une variable globale pour la mémoire et l’opérateur or pour la logique.
(defun c:MaCommande ( / saisie)
;; 1. Initialisation (Ici 'or' fonctionne car on ne récupère pas sa valeur de retour,
;; on profite juste de son évaluation paresseuse pour faire le setq si besoin)
(or *MaValDefaut* (setq *MaValDefaut* 10.0))
;; 2. Saisie
(setq saisie (getdist (strcat "\nEntrez la distance <" (rtos *MaValDefaut*) ">: ")))
;; 3. Validation
;; Si saisie existe, on met à jour la globale.
;; Si saisie est nil (Entrée), on ne fait rien (on garde l'ancienne globale).
(if saisie
(setq *MaValDefaut* saisie)
)
(princ (strcat "\nValeur utilisée : " (rtos *MaValDefaut*)))
(princ)
)
Bonjour,
Il y a une coquille dans cette ligne de code or retourne soit T ou nil, donc le retour d’une saisie nil, mettra à jour la variable global avec la valeur T
(Privilégier if ou cond qui retourne des données et non des valeurs booléens)
1 Like
Oui, personnellement je l’aurais plus vu comme ceci:
;; Version Expert
(defun c:MaCommande (/)
;; 1. Initialisation (Ici 'or' fonctionne car on ne récupère pas sa valeur de retour,
;; on profite juste de son évaluation paresseuse pour faire le setq si besoin)
(or *MaValDefaut* (setq *MaValDefaut* 10.0))
;; 2 & 3. Si saisie autre que nil, elle est mise en mémoire sinon c'est la valeur par défaut
(setq *MaValDefaut* (cond ((getdist (strcat "\nEntrez la distance <" (rtos *MaValDefaut*) ">: "))) (*MaValDefaut*)))
(princ (strcat "\nValeur utilisée : " (rtos *MaValDefaut*)))
(princ)
)
Après tout est une question de préférence…
1 Like
Bonjour,
Voici un lot de 3 fonctions qui sauvegarde/restitue dans une variable les états
(defun BEGINUNDO (/ VAR_UNDO VAR_CMDECHO STANDARD_ERROR)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Fonction à mettre en entête de chaque fonction appelée par ;;;
;;; l'utilisateur (souvent defun c:... () ...) dite parente ;;;
;;; ;;;
;;; cette fonction vient de la brillante intervention de Serge ;;;
;;; et la pugnacité de LUDWIG pour commprendre le BeginUndo ;;;
;;; sur CADXP [url=http://www.cadxp.com/]CADxp[/url] ;;;
;;; ;;;
;;; Retourne : une liste de variable à redéfinir après l'éxécution. ;;;
;;; de la fonction parente ;;;
;;; ;;;
;;; Le "#" en entête prévient que ce sont des variables ;;;
;;; en lecture seule. Il faut donc utiliser un artifice pour les ;;;
;;; restaurer: on définit par un " " pour séparer les commandes des ;;;
;;; choix, pour ceux qui ont un * au début : variable LISP (setq ...);;;
;;; on peut utiliser un (setvar ....) pour les autres ;;;
;;; ;;;
;;; Remarque : CMDECHO doit rester à la fin pour ne pas gêner ;;;
;;; visuellemnt la ligne de commande. ;;;
;;; ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Définition de la fonction Erreur Standard avec la fonction du BE_Error
(setq STANDARD_ERROR *ERROR*
*ERROR* MAXIMILIEN_ERROR
)
(setq VAR_CMDECHO (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
;;; Détermine le Niveau de la Fonction ANNULER
(if (<= (setq VAR_UNDO (getvar "UNDOCTL")) 3)
(command "_.UNDO" "_CONTROL" "3")
(command "_.UNDO" "_BEGIN")
)
;;; ACAD.LSP DOIT ÊTRE CHARGER A CHAQUE DESSIN
(setvar "ACADLSPASDOC" 1)
;;; Definition des limites sur tout le dessin
(if (= (getvar "TILEMODE") 1)
(progn
(setvar "LIMMIN"
(list (car (getvar "EXTMIN")) (cadr (getvar "EXTMIN")))
)
(setvar "LIMMAX"
(list (car (getvar "EXTMAX")) (cadr (getvar "EXTMAX")))
)
)
)
;;; Sauvegarde LES VARIABLES SYSTEMES
(list (cons "#_-DIMSTYLE _restore" (getvar "DIMSTYLE"))
(cons "AFLAGS" (getvar "AFLAGS"))
(cons "ATTDIA" (getvar "ATTDIA"))
(cons "BLIPMODE" (getvar "BLIPMODE"))
(cons "CECOLOR" (getvar "CECOLOR"))
(cons "CELTYPE" (getvar "CELTYPE"))
(cons "CELTSCALE" (getvar "CELTSCALE"))
(cons "CLAYER" (getvar "CLAYER"))
(cons "FILEDIA" (getvar "FILEDIA"))
(cons "ORTHOMODE" (getvar "ORTHOMODE"))
(cons "OSMODE" (getvar "OSMODE"))
(cons "PICKSTYLE" (getvar "PICKSTYLE"))
(cons "TEXTSTYLE" (getvar "TEXTSTYLE"))
(cons "*_*ERROR*" STANDARD_ERROR)
(cons (if (<= VAR_UNDO 3)
"#_.UNDO _CONTROL"
"#_.UNDO"
)
(if (<= VAR_UNDO 3)
"_ONE"
"_END"
)
)
(cons "CMDECHO" VAR_CMDECHO)
)
)
;;; ----------------------------------------------------------------------
(defun CLOSEUNDO (ARG_VARIABLE / POINTEUR COMM1 COMM2)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Fonction à mettre à la fin de chaque fonction appelée par ;;;
;;; l'utilisateur (souvent defun c:... () ...) dite parente ;;;
;;; ;;;
;;; cette fonction vient de la brillante intervention de Serge ;;;
;;; sur CADXP [url=http://www.cadxp.com/]CADxp[/url] ;;;
;;; ;;;
;;; Argument : La liste créée par la fonction BeginUndo ;;;
;;; ;;;
;;; Retourne : nil ;;;
;;; ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Parcours de la liste
;;;
(setvar "CMDECHO" 0)
(foreach POINTEUR ARG_VARIABLE
(progn ;; COMM1 est la commande ou variable définie
(setq COMM1
(vl-string-left-trim
"#"
(substr (car POINTEUR)
1
(vl-string-position (ascii " ") (car POINTEUR))
)
)
)
;; COMM2 est le choix éventuel pour restaurer les variables en lecture seule
(setq COMM2
(vl-string-left-trim
" "
(vl-string-left-trim (strcat "#" COMM1) (car POINTEUR))
)
)
(if (/= COMM2 "")
;; cas des variables en lecture seule
(command COMM1 COMM2 (cdr POINTEUR))
(if (= (chr (vl-string-elt (car POINTEUR) 0)) "#")
;; pour les commande ou variables où un choix est inutile
(command COMM1 (cdr POINTEUR))
;; pour les variables où un setvar est judicieux (pas de CR+LF)
(if (/= (chr (vl-string-elt (car POINTEUR) 0)) "*")
(setvar COMM1 (cdr POINTEUR))
)
)
)
;; cas des variables ou un (SETQ ...) est indispensable
(if (= (chr (vl-string-elt (car POINTEUR) 0)) "*")
(cond ((= (car POINTEUR) "*_*ERROR*")
(setq *ERROR* (cdr POINTEUR))
)
;; Vous avez oubliez de la définir.....
(t (alert "Variable non défini dans le CloseUndo"))
)
)
)
)
(princ)
)
;;; ----------------------------------------------------------------------
(defun MAXIMILIEN_ERROR (VAR_STR)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Fonction de gestion d'erreur ;;;
;;; cette fonction vient de la brillante intervention de bonuscad ;;;
;;; sur CADXP [url=http://www.cadxp.com/]CADxp[/url] ;;;
;;; ;;;
;;; Argument : La valeur d'erreur retournée par AutoCAD ;;;
;;; ;;;
;;; Retourne : nil ;;;
;;; ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(cond ((eq VAR-STR "Function cancelled") NIL)
((eq VAR-STR "quit / exit abort") NIL)
((eq VAR-STR "console break") NIL)
((eq VAR-STR "no function definition") NIL)
(t (princ VAR_STR))
)
(CLOSEUNDO PUBLIC_ERROR)
(princ)
)
Je l’ai ressorti de mes cartons…
Exemple d’utilisation :
(defun ma_fontion (ARG_TYPE / LARGEUR COULEUR PRIVE_BIBLE)
(setvar "CMDECHO" 0)
(setq PUBLIC_ERROR (BEGINUNDO))
...
(CLOSEUNDO PUBLIC_ERROR)
)
1 Like