Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

à la suite de recherches sur la gestion d'erreurs je suis tombé sur ce post, où j'ai trouvé la fonction de (gile) (SAVE&SET_VAR) très inréressante.

 

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

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

 

Seulement si je comprends son fonctionnement dans son ensemble, je ne comprends pas certaines subtilités.

Pourquoi n'écrit t'on pas simplement:

 

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

 

Pourquoi utiliser (cond)?

Pourquoi extraire la valeur de la variable deux fois?

Et pourquoi utilise t'on (if) puisque l'on affectera forcément une valeur à la variable?

 

Merci.

Posté(e)

Salut,

 

 

Les lignes que tu as simplifiées sont tout simplement des contrôles de validité sur les arguments (var et val) de la fonction SAVE&SET_VAR.

 

 

Pourquoi utiliser (cond)?

Pour économiser un progn, la fonction cond suppose un progn implicite, après le calcul du prédicat.

 

Pourquoi extraire la valeur de la variable deux fois?

Pour économiser l’emploie d’un setq et d’une variable, littéralement le premier appel à (getvar var) sert de prédicat, le deuxième appel extrait la valeur.

 

Et pourquoi utilise t'on (if) puisque l'on affectera forcément une valeur à la variable?

Justement on utilise if au cas ou un petit malin appelerai la fonction SAVE&SET_VAR avec nil pour valeur de l’argument val

 

 

Maintenant si tu es intéressé par les changements des valeurs de variables système et leur restauration, je vais paraphraser l’auteur de la routines que tu cite en t’invitant à regarder la routine ai_sysvar définie dans acad20XXdoc.lsp (donc automatiquement chargée dans chaque document).

 

 

A+ Bruno

 

(Ps : Si vraiment la routine SAVE&SET_VAR t’interesse tu en trouvera une autre variante ici toujours de (gile) mais avec cette fois d’avantage de contrôle).

Apprendre => Prendre => Rendre

Posté(e) (modifié)

Salut,

 

Pourquoi utiliser (cond)?

C'est une façon d'éviter une erreur si l'argument var n'était pas une variable système (ou si elle était mal orthographiée). J'avais probablement utilisé cond plutôt que if pour éviter un progn.

 

Pourquoi extraire la valeur de la variable deux fois?

Tu as raison, il aurait été plus efficient de faire :

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

 

Et pourquoi utilise t'on (if) puisque l'on affectera forcément une valeur à la variable?

Et non, comme dit dans le commentaire, la fonction accepte que le second argument soit nil pour sauvegarder la valeur de la variable sans lui affecter une nouvelle valeur.

Par exemple, si dans l'état initial le mode ortho n'est pas activé mais le mode polaire l'est, ORTHOMODE est à 0 et AUTOSNAP contient (entre autre) le code binaire 8. Si on passe ORTHOMODE à 1, 8 est automatiquement soustrait à la valeur de AUTOSNAP. Avec save&set_var, on peut modifier et sauvegarder la valeur initiale d'ORTHOMODE et aussi sauvegarder celle d'AUTOSNAP.

(save&set_var "ORTHOMODE" 1)
(save&set_var "AUTOSNAP" nil)

 

Mais ces fonctions sont vielles et, personnellement, je ne les utilise plus depuis longtemps.

Il y a dans le fichier acaddoc20##.lsp* qui est chargé automatiquement à chaque ouverture d'un document, une routine nommée ai_sysvar qui est beaucoup plus intéressante.

Elle permet de modifier et sauvegarder les valeurs d'une ou plusieurs variables système :

(ai_sysvar  '("cmdecho" . 0)) ; stocke la valeur initiale de cmdecho et la met à 0

(ai_sysvar '(("cmdecho" . 0)("osmode" . 0))) stocke les valeurs initiales de cmdecho et osmode et les met à 0

Les valeurs sont stockée à l'intérieur même de la définition de la fonction qui est redéfinie à chaque appel et peuvent être restaurées en appelant la même fonction avec nil comme argument

(ai_sysvar nil) ; restaure les valeurs des variables modifiées avec ai_sysvar

 

* anciennement, cette routine (qui est utilisée par les routines LISP Autodesk) était dans ai_utils.lsp.

Modifié par (gile)
doublé par VDH- Bruno avec des réponses aussi pertinents que celles que je donne. Respect !

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

Posté(e)
doublé par VDH- Bruno avec des réponses aussi pertinents que celles que je donne. Respect !

Merci (gile) c’est gentil, mon seul mérite est d’avoir un coup d’avance sur Bortch59 pour avoir déjà décortiqué ses lignes de codes par le passé..

Apprendre => Prendre => Rendre

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é