Aller au contenu

Sauvegardes de variables pour restauration après Lisp


Messages recommandés

Posté(e)

Bonsoir à tous,

 

Voilà, je commence à faire des petites routines un peu partout, et par soucis de bonne conduite, je souhaiterais modifier pleins de variables, exécuter me routine, puis, restaurer les variables telles qu'elles étaient avant... Histoire de ne pas faire comme TopoList... Qui supprime l'accroche objet ou autre puis qui laisse le système comme-çà...Après moi, le déluge...

 

Ca dervrait tenir en deux routines, une qui sauve, l'autre qui restaure...

 

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)

Posté(e)

La méthode traditionnelle consiste à, tout simplement récupéprer la valeur initiale de la variable système, l'affecter à une variable locale, et la restaurer en fin de routine.

 

(defun c:ma_routine (/ v1 v2)
(setq v1 (getvar "CMDECHO")
v2 (getvar "OSMODE")
(setvar "CMDECHO" 0)
(setvar "OSMODE" 0)
...
...
...
(setvar "CMDECHO" v1)
(setvar "OSMODE" v2)
(princ)
)

 

Il est aussi possible de faire deux routines, une qui enregistre et change la valeur de la variable et une autre qui restaure leurs valeurs initiales à toutes les variables traitées par la première, les routines devront être chargées à chaque LISP qui les utitlise ou en permanence.

 

;;; SAVE&SET_VAR
;;; Enregistre la valeur initiale de la variable système dans une liste
;;; et lui attribue sa nouvelle valeur (si val est non nil)
;;;
;;; ex: (SAVE&SET_VAR "autosnap" nil) (SAVE&SET_VAR "orthomode" 1)
;;; -> SavedSysVarLst : ((setvar "orthomode" 0) (setvar "autosnap" 63))
;;; -> (getvar "orthomode") : 1
;;; -> (getvar "autosnap") : 55 (63 - 8 : le repérage polaire est désactivé)

(defun SAVE&SET_VAR (var val)
 (cond
   ((getvar var)
    (setq SavedSysVarLst
    (cons (list 'setvar var (getvar var)) SavedSysVarLst)
    )
    (if val
      (setvar var val)
    )
   )
 )
)

;;; RESTORE_VAR
;;; Restaure leurs valeurs initiales aux variables système de "SavedSysVarLst"
;;;
;;; ex: (RESTORE_VAR)
;;; -> (getvar "orthomode") : 0
;;; -> (getvar "autosnap") : 63
;;; -> SavedSysVarLst : nil

(defun restore_var ()
(mapcar 'eval SavedSysVarLst)
(setq SavedSysVarLst nil)
)

 

RESTORE_VAR est donnée ici à titre d'exemple, on peut aussi ne charger que SAVE&SET_VAR, déclarer SavedSysVarLst comme variable locale et faire simplement : (mapcar 'eval SavedSysVarLst) en fin de routine

 

Attention toutefois, en cas d'erreur ou d'annulation en cours d'exécution les variables systèmes ne seraient pas restaurées.

Il faut pour celà redéfinir la fonction *error* le temps de l'exécution du LISP.

 

Ce sujet a été maintes fois traité (par exemple ici) tu peux faire une recherche dans les forums avec *error* ainsi que dans l'aide d'AutoCAD.

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

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é