Maîtriser LOGOR et LOGAND pour les manipulations binaires en AutoLISP

Je cherche à comprendre comment utiliser les fonctions LOGOR et LOGAND en AutoLISP pour manipuler des variables système comme OSMODE ou des codes DXF, notamment pour ajouter, vérifier ou supprimer des options binaires.

Les fonctions AutoLISP LOGOR et LOGAND sont fondamentales pour la manipulation binaire (bit à bit) des entiers, permettant de gérer efficacement les variables système à options multiples et les codes DXF. Elles agissent sur les bits individuels des nombres.

Voici comment les comprendre et les utiliser concrètement :

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

    • Logique : Si un bit est à 1 dans l’un OU l’autre des nombres comparés, le bit correspondant du résultat est 1.
    • Usage : Permet d’ajouter une option ou de forcer un état sans se soucier des options déjà activées. C’est l’équivalent d’une union d’ensembles de bits.
    • Exemple : Pour ajouter l’accrochage « Extrémité » (valeur binaire 1) à la variable système OSMODE sans désactiver les autres accrochages :
      (setvar "OSMODE" (logor (getvar "OSMODE") 1))
  2. LOGAND (Le Filtre / Le Vérificateur)

    • Logique : Si un bit est à 1 dans l’un ET l’autre des nombres comparés, le bit correspondant du résultat est 1. Sinon, il est 0.
    • Usage : Sert à vérifier si une option spécifique est active ou à isoler une propriété. Le résultat sera non nul si l’option est active.
    • Exemple : Pour vérifier si l’accrochage « Extrémité » (valeur binaire 1) est actif dans OSMODE, quelle que soit la valeur totale de OSMODE :
      (logand (getvar "OSMODE") 1)
      Si le résultat est supérieur à 0, l’accrochage « Extrémité » est actif.
  3. L’Astuce Expert : Supprimer une option (Le masque inversé)

    • Problème : Une simple soustraction ne fonctionne pas pour désactiver une option binaire, car elle pourrait créer des incohérences si l’option n’était pas active initialement.
    • Solution : Il faut combiner LOGAND avec l’opérateur LOGNOT (Bitwise NOT / Complément). LOGNOT inverse tous les bits d’un nombre, créant un masque où l’option à supprimer est à 0 et tous les autres bits sont à 1.
    • Exemple : Pour enlever l’accrochage « Proche » (valeur binaire 512) sans affecter les autres accrochages :
      (setvar "OSMODE" (logand (getvar "OSMODE") (lognot 512)))
      Cette opération garde toutes les options actives dans OSMODE À CONDITION qu’elles soient également actives dans le masque « tout sauf 512 ».

En résumé, pour un développeur AutoLISP :

  • Activer un drapeau (option) : (setvar "VARIABLE" (logor (getvar "VARIABLE") VALEUR_DRAPEAU))
  • Vérifier un drapeau : (logand (getvar "VARIABLE") VALEUR_DRAPEAU) (le résultat est > 0 si actif)
  • Désactiver un drapeau : (setvar "VARIABLE" (logand (getvar "VARIABLE") (lognot VALEUR_DRAPEAU)))