Parlez-vous binaire ?

Synthèse de la Discussion : Les Opérations Binaires en AutoLISP sur CADxp

1.0 Introduction : Thèmes et Contexte de la Discussion

Ce document propose une synthèse d’une discussion technique qui s’est déroulée sur le forum de la communauté *CADxp*. Le thème principal de cet échange, initié par un membre expérimenté, était l’explication et l’utilisation des opérations binaires (ou « bit à bit ») en langage AutoLISP, un sujet fondamental mais souvent méconnu des développeurs. Au fil des contributions, un thème connexe majeur a émergé : l’application pratique de ces concepts pour décoder des codes DXF complexes, en particulier celui gérant la transparence des objets dans AutoCAD® (code 440), dont le fonctionnement n’est pas documenté de manière explicite. Le déroulé qui suit retrace la progression de cet échange, de l’exposé théorique initial à la résolution collaborative d’un problème concret.

2.0 Déroulement Chronologique de la Discussion

Cette section retrace l’évolution de la conversation, en partant d’un exposé didactique initial pour aboutir à la résolution collaborative d’un problème technique pointu. Ce déroulé met en lumière la valeur de l’échange communautaire, où les connaissances théoriques sont mises au service de défis pratiques rencontrés par les utilisateurs. L’analyse débute par le message qui a servi de fondation à toute la discussion.

2.1 L’Initiation : Le Tutoriel Fondamental de (gile)

La discussion a été initiée le 5 avril 2021 par l’utilisateur (gile), qui a publié une série de messages à vocation pédagogique. Son objectif était de démystifier les opérations binaires en AutoLISP pour les programmeurs moins familiers avec ces concepts de bas niveau. Il a méthodiquement introduit les concepts fondamentaux suivants :

  • Les bases des nombres entiers signés sur 32 bits en AutoLISP, incluant le rôle du bit de poids fort pour le signe.
  • L’opérateur ~ (tilde) pour effectuer le complément à 1, c’est-à-dire l’inversion de tous les bits d’un nombre.
  • La fonction générale boole, qui, via un premier argument entier de 0 à 15, permet de réaliser l’ensemble des 16 opérations logiques possibles, en se concentrant sur les plus courantes comme AND (opérateur 1), XOR (opérateur 6) et OR (opérateur 7).
  • Les fonctions de commodité logand et logior, qui sont des équivalents plus lisibles pour les opérations AND et OR les plus courantes.
  • La fonction lsh pour effectuer des décalages de bits vers la gauche ou vers la droite, une opération essentielle pour manipuler des groupes de bits spécifiques au sein d’un entier.

Pour illustrer l’importance concrète de ces fonctions, (gile) a fourni deux applications pratiques immédiates :

  1. La gestion des modes d’accrochage aux objets via la variable système OSMODE, où chaque mode est représenté par un bit. Les opérations logior et logand permettent d’activer ou de désactiver des modes de manière fiable.
  2. La conversion des trois valeurs d’une couleur RVB (Rouge, Vert, Bleu) en un entier unique, tel qu’utilisé par le code DXF 420, en utilisant les décalages de bits (lsh) pour compacter les trois octets de couleur en un seul entier.

Cette base théorique solide et bien illustrée a rapidement trouvé un champ d’application concret grâce à l’intervention d’un autre membre de la communauté.

2.2 L’Émergence d’un Problème Concret : Le Cas du Code DXF 440 (Transparence)

La discussion a pivoté d’un tutoriel à une session de résolution de problème suite à une question posée par l’utilisatrice Luna, initialement le 5 avril puis développée en détail le 28 avril 2021. Son défi était de comprendre la logique binaire sous-jacente aux valeurs du code DXF 440, qui contrôle la transparence des objets. Elle cherchait à créer des fonctions fiables pour convertir une valeur de transparence (ex: 90%) en son code DXF correspondant, et inversement. Son message ne se contentait pas de poser une question ; il incluait une analyse empirique détaillée, listant les codes DXF 440 et leurs représentations binaires pour dix niveaux de transparence distincts, de 0% à 90%. Elle avait correctement identifié que la valeur était encodée dans les bits de poids faible et avait même proposé une première fonction de conversion, mais elle était bloquée pour réaliser l’opération inverse. Cette question précise et bien documentée a servi de catalyseur pour la phase collaborative de l’échange.

2.3 La Résolution Collaborative : Décodage et Fonctions Finales

Le tournant décisif de la discussion a eu lieu les 28 et 29 avril 2021, lorsque (gile) a apporté une réponse directe et complète au problème de Luna. Son analyse a permis de décoder la structure du code DXF 440 de la manière suivante :

  • L’octet de poids fort (les bits les plus à gauche) est utilisé comme un drapeau pour identifier le statut DuBloc (ByBlock) ou une transparence explicite.
  • L’octet de poids faible (les bits les plus à droite) représente non pas la transparence, mais son inverse, l’opacité, sur une échelle de 0 (transparent) à 255 (opaque). Cette distinction a été la clé du décodage.

Sur la base de cette analyse, (gile) a proposé deux fonctions AutoLISP finales et robustes pour effectuer les conversions :

;; Conversion de la valeur DXF 440 en pourcentage de transparence (0-100)
(defun dec->transparency (d)
  (if (= 1 (lsh d -24))
    100 ; DuBloc
    (fix (/ (- 255 (lsh (lsh d 24) -24)) 2.55))
  )
)

;; Conversion du pourcentage de transparence (0-100) en valeur DXF 440
;; NOTE : Cette fonction associe une transparence de 100% à la propriété 'DuBloc'.
(defun transparency->dec (transp)
  (if (>= transp 100) ; Gère le cas 'DuBloc' pour 100% ou plus
    (lsh 1 24)        ; Code DXF 440 pour 'DuBloc' (16777216)
    (logior 
      (lsh 2 24)      ; Drapeau pour une valeur de transparence explicite
      (fix (* 2.55 (- 100 transp))) ; Calcul de l'opacité (0-255)
    )
  )
)

En complément, l’utilisateur lrdb@home a suggéré une méthode alternative pour extraire la valeur de l’octet de droite. Au lieu d’une double opération de décalage (lsh), il a proposé d’utiliser un AND logique (boole 1 ou logand) avec un masque de 255. Cette technique, validée par (gile), est une méthode plus directe et standard dans certains domaines de la programmation pour isoler des octets, jugée plus rapide que les opérations de décalage. Cependant, cette solution élégante contenait une subtilité importante qui a nécessité une clarification immédiate.

2.4 Le Point Clé de la Résolution : La Gestion des Cas Particuliers

Cette résolution a été immédiatement suivie d’une précision cruciale de la part de (gile), qui a clarifié une ambiguïté potentielle dans la fonction transparency->dec concernant la gestion d’une transparence de 100%. Il a expliqué la distinction fondamentale entre une transparence de 100% et la propriété DuBloc. Bien que, pour l’utilisateur final, les deux se traduisent par un objet entièrement transparent, ils correspondent à des codes DXF 440 distincts :

  • Propriété DuBloc : 16777216
  • Transparence de 100% : 33554432

Il a souligné que même si l’octet de droite est à 0 dans les deux cas (opacité nulle), l’octet de gauche est différent (drapeau 1 pour DuBloc, 2 pour la transparence explicite), permettant à AutoCAD® de distinguer les deux états. Cette précision est fondamentale pour une programmation robuste, car elle garantit une gestion correcte des propriétés des objets et évite toute ambiguïté lors de la lecture ou de l’écriture de données DXF.

3.0 Conclusion et Référence à la Source

En conclusion, cet échange sur le forum CADxp démontre de manière exemplaire la puissance d’une communauté technique. Une discussion initiée comme un tutoriel sur un sujet de programmation de bas niveau a naturellement évolué vers l’analyse approfondie et la résolution collaborative d’un problème pratique et non documenté d’AutoCAD®. Le partage des connaissances, l’investigation empirique et l’expertise collective des membres comme (gile), Luna et lrdb@home ont permis de transformer une interrogation individuelle en une solution robuste et documentée, bénéfique pour tous les développeurs AutoLISP. Pour consulter l’intégralité des échanges, des explications détaillées et des exemples de code, les lecteurs peuvent se référer à la discussion originale via le lien ci-dessous.

Source de la discussion sur le forum CADxp : https://web.archive.org/web/20250215210606/https://cadxp.com/topic/49804-il-y-a-10-types-de-personnes-dans-le-monde-celles-qui-comptent-en-binaire-et-les-autres/