C’est ce qu’on appelle le « Toggle (ou bascule) Mathématique ». C’est l’équivalent en code de faire un créneau en frein à main : c’est rapide, ça impressionne la galerie, et ça évite de tourner le volant (écrire des if) pendant des heures.
Voici le topo pour briller à la machine à café.
La méthode « J’aime taper au clavier » (Le Junior)
Le débutant voit un interrupteur (0 ou 1). Il se dit : « Je vais faire une condition logique ! ».
Il écrit donc ce pavé :
;; C'est long, c'est lourd, ça prend 4 lignes...
(if (= ma-variable 1)
(setq ma-variable 0)
(setq ma-variable 1)
)
La méthode « Ninja des Maths » (Le Senior)
Le vétéran sait que les ordinateurs aiment les chiffres, pas la philosophie. Il utilise la soustraction pour inverser la réalité.
La formule magique : 1 - x
;; Bam. Une ligne.
(setq ma-variable (- 1 ma-variable))
Pourquoi ça marche ? (La preuve par l’exemple)
C’est de l’arithmétique de base, mais c’est d’une beauté absolue :
- Si votre variable vaut 1 :
1 - 1 = 0 (La lumière s’éteint
)
- Si votre variable vaut 0 :
1 - 0 = 1 (La lumière s’allume
)
Verdict
C’est l’astuce ultime pour gérer des bascules (visibilité, calque gelé/dégelé) sans polluer votre code avec des parenthèses conditionnelles.
Voici comment appliquer cette logique binaire au code DXF 70 (qui gère l’état Gelé/Dégelé) et une variante pour le code 62 (Actif/Inactif).
1. Le Cas du Gel/Dégel (Code DXF 70)
Le code 70 est un champ de bits (bitmask). Le premier bit (valeur 1) détermine si le calque est gelé.
-
0 = Dégelé
-
1 = Gelé
C’est le candidat parfait pour notre soustraction 1 - x.
(defun ToggleFreeze (layerName / ent flags status new_status)
;; 1. On récupère la liste DXF du calque
(setq ent (entget (tblobjname "LAYER" layerName)))
;; 2. On isole le code 70 (les drapeaux)
(setq flags (cdr (assoc 70 ent)))
;; 3. On extrait juste le bit de gel (0 ou 1) avec un ET logique
(setq status (logand 1 flags))
;; 4. LA MAGIE NINJA : On inverse (0 devient 1, 1 devient 0)
(setq new_status (- 1 status))
;; 5. On reconstruit le code 70
;; (On enlève l'ancien bit et on ajoute le nouveau)
(setq ent (subst (cons 70 (+ (- flags status) new_status))
(assoc 70 ent)
ent))
;; 6. On valide la modification
(entmod ent)
)
2. Le Cas Actif/Inactif (Code DXF 62) - Le Cousin « Négatif »
Pour la visibilité (l’ampoule), AutoCAD® n’utilise pas 0 et 1, mais le signe de la couleur (Code 62).
-
Positif (ex: 7) = Calque Actif
-
Négatif (ex: -7) = Calque Inactif
Ici, l’astuce du 1 - x ne marche pas, mais son cousin x * -1 prend le relais. C’est le même principe : une opération mathématique remplace la condition if.
(defun ToggleOnOFF (layerName / ent color)
(setq ent (entget (tblobjname "LAYER" layerName)))
;; On récupère la couleur (ex: 7 ou -7)
(setq color (cdr (assoc 62 ent)))
;; LA MAGIE : On multiplie par -1 pour inverser le signe
;; 7 devient -7 (OFF), -7 devient 7 (ON)
(entmod (subst (cons 62 (* color -1)) (assoc 62 ent) ent))
)
Résumé pour briller en société
-
Si c’est 0 ou 1 (Gelé, Verrouillé) : Utilisez
(- 1 x) -
Si c’est + ou - (Actif, Inactif) : Utilisez
(* x -1)
Pas un seul if à l’horizon. C’est propre, c’est net.
- Malin
- Pas mal
- Ouais bof…
- Ca sert à quoi?
