AutoCAD LISP : Gérer et restaurer les variables système avec gestion d'erreurs

Je cherche une méthode en LISP pour sauvegarder toutes les variables système de mon dessin, les restaurer après exécution, ou les remettre à leurs valeurs par défaut. Existe-t-il une fonction ou une commande pour cela ?

La gestion exhaustive de toutes les variables système d’AutoCAD est complexe et risquée. La meilleure pratique consiste à ne gérer que les variables spécifiques modifiées par votre routine LISP, en assurant leur restauration systématique, même en cas d’interruption.

  1. Identifier et sauvegarder les variables modifiées :

    • Avant de modifier une variable, stockez sa valeur actuelle.
    • Méthode classique : Utilisez (setq old_var (getvar "NOM_VARIABLE")).
    • Avec ai_sysvar (Gilles Chanteau) : Cette fonction, présente dans acad20XXdoc.lsp, gère la sauvegarde interne. Utilisez (ai_sysvar "NOM_VARIABLE" nouvelle_valeur) pour modifier et (ai_sysvar "NOM_VARIABLE" nil) pour restaurer.
    • Attention : Évitez de mélanger les méthodes setq/getvar/setvar et ai_sysvar pour une même variable afin d’éviter toute confusion.
  2. Garantir la restauration avec gestion d’erreurs :

    • Pour assurer que les variables sont restaurées même si le LISP est interrompu (ex: par la touche Échap) ou qu’une erreur survient, intégrez un mécanisme de gestion d’erreurs.
    • Redéfinition locale de *error* : Déclarez une fonction *error* locale au début de votre routine. Cette fonction sera appelée en cas d’erreur et contiendra le code de restauration des variables. (Exemple fourni par Gilles Chanteau)
      (defun C:MA_ROUTINE (/ old_error old_var1 old_var2)
        (setq old_error *error*) ; Sauvegarde l'ancienne fonction d'erreur
        (defun *error* (msg)
          (if old_var1 (setvar "VAR1" old_var1)) ; Restaure VAR1
          (if old_var2 (setvar "VAR2" old_var2)) ; Restaure VAR2
          (setq *error* old_error) ; Restaure l'ancienne fonction d'erreur
          (princ (strcat "\nErreur: " msg))
          (princ)
        )
        ; ... Votre code LISP ici ...
        (setq old_var1 (getvar "VAR1"))
        (setvar "VAR1" nouvelle_valeur)
        ; ...
        (setvar "VAR1" old_var1) ; Restauration normale
        (setq *error* old_error) ; Restaure l'ancienne fonction d'erreur
        (princ)
      )
      
    • Utilisation de vl-catch-all-apply : Cette fonction permet de capturer les erreurs sans interrompre l’exécution du code, offrant une alternative pour gérer les exceptions et exécuter des actions de nettoyage.
  3. Surveillance des variables système :

    • La commande MONITEURVARSYS (_SYSVARMONITOR) permet de suivre les modifications des variables système et de les réinitialiser manuellement, mais ne fournit pas de solution programmatique globale pour toutes les variables.