Je cherche à comprendre et utiliser les fonctions LOGIOR et LOGAND en AutoLISP pour manipuler des variables système comme OSMODE ou des codes DXF. Comment fonctionnent ces opérations binaires pour ajouter, vérifier ou supprimer des options spécifiques ?
Les fonctions AutoLISP LOGIOR et LOGAND sont les piliers de la manipulation binaire (bit à bit), indispensables pour gérer efficacement les variables système à options multiples (comme OSMODE) ou les codes DXF. Elles permettent d’interagir avec des drapeaux binaires sans altérer les autres options.
Voici comment les utiliser concrètement :
-
LOGIOR (L’Additionneur / L’Imposeur)
- Logique : Si un bit est à 1 dans l’un OU l’autre nombre, le bit résultant est 1.
- Usage : Cette fonction 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é » (valeur binaire 1) à la variable système OSMODE. Si OSMODE est réglé sur « Centre » (valeur 4), vous voulez ajouter « Extrémité » sans désactiver « Centre ».
- Une simple addition
(+ osm 1)serait incorrecte si « Extrémité » était déjà actif, car elle augmenterait la valeur sans fusionner les bits correctement. - Avec
LOGIOR, vous fusionnez les bits :(setq osm (logior osm 1))
- Une simple addition
-
LOGAND (Le Filtre / Le Vérificateur)
- Logique : Si un bit est à 1 dans l’un ET l’autre nombre, le bit résultant est 1 (sinon 0).
- Usage : Cette fonction sert à VÉRIFIER si une option est active, ou à ISOLER une propriété spécifique.
- Exemple concret : Vérifier si l’accrochage « Extrémité » (valeur binaire 1) est actif dans OSMODE.
- Peu importe la valeur totale de OSMODE (qui peut être 4135 par exemple), vous voulez juste savoir si le bit correspondant à 1 est allumé.
- La vérification s’effectue ainsi :
(= (logand osm 1) 1)
-
L’Astuce Expert : Supprimer une option (Le masque inversé)
- Problème : Il n’est pas possible d’effectuer une soustraction simple pour désactiver une option, car cela pourrait créer des incohérences si l’option n’était pas active initialement.
- Solution : Il faut combiner
LOGANDavec l’opérateurLOGNOT(Bitwise NOT / Complément). - Exemple concret : Enlever l’accrochage « Proche » (valeur 512) sans toucher aux autres options.
- La fonction
(lognot 512)crée un masque où tous les bits sont à 1, sauf celui correspondant à 512. - Ensuite, vous utilisez
LOGANDavec ce masque :(setq osm (logand osm (lognot 512))) - Ceci se traduit par : « Garde tout ce qui est actif dans OSMODE À CONDITION QUE ce soit aussi dans le masque ‹ Tout sauf 512 ›. »
- La fonction
En résumé pour le développeur AutoLISP :
- Activer un drapeau :
(logior variable drapeau) - Vérifier un drapeau :
(= (logand variable drapeau) drapeau) - Désactiver un drapeau :
(logand variable (lognot drapeau))