(logior) et (logand), manipulations binaires en AutoLISP

Ces deux fonctions sont les piliers de la manipulation binaire (bit à bit). Elles sont indispensables pour gérer les variables système à options multiples (comme OSMODE) ou les codes DXF (comme le code 70).

Voici comment les comprendre et les utiliser concrètement.

1. LOGIOR (L’Additionneur / L’Imposeur)

Logique : « Si un bit est à 1 dans l’un OU l’autre nombre, le résultat est 1. »

Usage : Sert à AJOUTER une option ou FORCER un état, sans se soucier de ce qui est déjà activé.

Exemple concret : Ajouter l’accrochage « Extrémité » (Bit 1)

Imaginez que OSMODE soit réglé sur « Centre » (4). Vous voulez ajouter « Extrémité » (1) sans désactiver le Centre.

  • Si vous faites (setvar "OSMODE" 1), vous perdez le Centre.

  • Si vous faites (+ 4 1), ça marche, mais si « Extrémité » était déjà actif, vous obtenez 5 (4+1), ce qui est faux.

Avec logior, on fusionne les bits :

;; Force l'accrochage Extrémité (1) quel que soit le réglage actuel
(setvar "OSMODE" (logior (getvar "OSMODE") 1))

;; Force Extrémité (1) ET Intersection (32) en même temps
(setvar "OSMODE" (logior (getvar "OSMODE") 33))

2. LOGAND (Le Filtre / Le Vérificateur)

Logique : « Si un bit est à 1 dans l’un ET l’autre nombre, le résultat est 1 (sinon 0). »

Usage : Sert à VÉRIFIER si une option est active, ou à ISOLER une propriété.

Exemple concret : Vérifier si « Extrémité » est actif

Peu importe la valeur totale de OSMODE (ça peut être 4135), on veut juste savoir si le bit 1 est allumé.

;; Si le résultat du filtrage par 1 est égal à 1...
(if (= (logand (getvar "OSMODE") 1) 1)
    (princ "\nL'accrochage Extrémité est ACTIF.")
    (princ "\nL'accrochage Extrémité est INACTIF.")
)

3. L’Astuce Expert : SUPPRIMER une option (Le masque inversé)

Comment enlever l’accrochage « Proche » (512) sans toucher au reste ?

On ne peut pas faire une soustraction simple (si l’option n’est pas active, on soustrait dans le vide).

Il faut combiner logand avec l’opérateur ~ (Bitwise NOT / Complément).

(~ 512) crée un masque où tout est à 1 sauf le 512.

;; Enlever "Proche" (512) proprement
(setvar "OSMODE" (logand (getvar "OSMODE") (~ 512)))

Traduction : « Garde tout ce qui est actif (OSMODE) À CONDITION QUE ce soit aussi dans le masque ‹ Tout sauf 512 ›. »

Résumé pour le développeur

  • Activer un drapeau : (logior ValeurActuelle Drapeau)

  • Vérifier un drapeau : (= (logand ValeurActuelle Drapeau) Drapeau)

  • Désactiver un drapeau : (logand ValeurActuelle (~ Drapeau))

Bonjour,
Attention en AutoLisp c’est LOGIOR, une coquille c’est glissé dans l’article il manque le « i » de la fonction.
Cdt

1 « J'aime »

Oui, merci, c’est corrigé.