Synthèse de la discussion sur les dictionnaires AutoCAD avec AutoLISP sur CADxp

Synthèse de la discussion sur les dictionnaires AutoCAD® avec AutoLISP sur CADxp

Ce document est une synthèse d’une discussion technique qui a été créé le 21 octobre 2011 sur le forum du site CADxp. Elle s’adresse à un public connaissant les logiciels de CAO Autodesk® et les bases du langage AutoLISP.

Le thème principal de la discussion est l’accès et la manipulation des dictionnaires AutoCAD® via le langage AutoLISP/Visual LISP.

Les thèmes connexes abordés incluent :

  • La distinction fondamentale entre les dictionnaires nommés et les dictionnaires d’extension.
  • L’utilisation des objets XRecord pour le stockage de données personnalisées.
  • La présentation des fonctions AutoLISP natives (dictadd, dictsearch, etc.) et des fonctions Visual LISP (vlax-ldata-*).
  • La résolution d’un cas pratique : l’accès au dictionnaire des filtres de calques (ACAD_LAYERFILTERS).

Résumé Chronologique de la Discussion

La discussion s’étend sur plusieurs années, débutant par un tutoriel détaillé et se concluant par la résolution d’un problème spécifique.

Introduction aux Dictionnaires (Octobre 2011)

L’utilisateur et modérateur (gile) initie la discussion en publiant un guide complet sur les dictionnaires AutoCAD®. Il établit les concepts fondamentaux :

  1. Généralités : Les dictionnaires sont un moyen de lier des données arbitraires (sans limite de taille, contrairement aux XData) à un dessin ou à des objets spécifiques (graphiques ou non). Les données y sont stockées via des objets XRecord.
  2. Types de Dictionnaires :
  • Dictionnaires Nommés : Chaque dessin possède un dictionnaire racine, le Named Object Dictionary (NOD), accessible via la fonction (namedobjdict). AutoCAD® y stocke de nombreuses configurations (styles, groupes, etc.).
  • Dictionnaires d’Extension : Tout objet AutoCAD® peut posséder un unique dictionnaire d’extension, qui n’a pas de nom propre. On le retrouve via les données DXF de l’objet auquel il est rattaché (code de groupe 360 après le groupe (102 . "{ACAD_XDICTIONARY")).
  1. Fonctions AutoLISP dédiées : (gile) présente et illustre les fonctions natives pour manipuler les dictionnaires standards :
  • namedobjdict : Retourne l’ename du NOD.
  • dictadd : Ajoute une entrée (Dictionnaire ou XRecord) à un dictionnaire.
  • dictsearch : Recherche une entrée par sa clé et retourne sa liste DXF.
  • dictnext : Parcourt les entrées d’un dictionnaire.
  • dictrmove : Supprime une entrée.
  • dictrename : Renomme une entrée.

Pour illustrer la manipulation des dictionnaires d’extension, il fournit dès ce premier message des fonctions utilitaires clés, dont gc:GetExtDict et gc:GetDictEntries, qui seront essentielles pour la résolution du problème final des années plus tard.

Introduction aux Données LISP (ldata) (Octobre 2011)

Dans un second message, (gile) introduit l’alternative offerte par Visual LISP : les ldata.

  • Avantages : Leur mise en œuvre est considérée comme plus simple que celle des dictionnaires classiques. Une donnée peut être de n’importe quel type LISP.
  • Inconvénients : Elles ne sont accessibles qu’en LISP (et ObjectARX), et ont connu des problèmes de compatibilité dans les anciennes versions d’AutoCAD® (avant 2002).

Les fonctions vlax-ldata-* sont présentées :

  • vlax-ldata-put : Stocke une donnée.
  • vlax-ldata-get : Récupère une donnée.
  • vlax-ldata-list : Liste toutes les paires clé/donnée.
  • vlax-ldata-delete : Supprime une donnée.

Il démontre également une technique avancée permettant de lier un fichier VLX à un dessin pour qu’il se charge automatiquement à chaque ouverture, en utilisant l’argument private de la fonction vlax-ldata-put.

Échanges et Clarifications (2011-2013)

La discussion se poursuit avec des questions et des contributions d’autres membres :

  • krunch (2012) apporte une correction à la fonction gc:GetOrCreateExtDict en notant que les entités MTEXT sont plus « capricieuses » avec entmod et que le dictionnaire d’extension doit être placé juste après les codes de groupe 0 ou 5.
  • (gile) (2013) poste une bibliothèque consolidée de fonctions LISP pour manipuler les dictionnaires nommés, d’extension et les XRecords, incluant des versions mises à jour de ses routines.

Cas Pratique : Accès aux Filtres de Calques (Novembre 2023)

Plus de dix ans après le début du sujet, l’utilisateur PHILPHIL pose une question concrète qui réactive la discussion.

  • Le problème : Il cherche à accéder au dictionnaire contenant les filtres de calques, ACAD_LAYERFILTERS. Sa tentative d’utiliser une fonction gc:dictdatalist sur le dictionnaire des objets nommés (namedobjdict) échoue, car le dictionnaire « ACAD™_LAYERFILTERS » n’y est pas trouvé, bien que des filtres existent dans son dessin.
  • La solution : (gile) apporte la clarification décisive. Il explique :
  • Pour résoudre le problème, il propose une séquence logique en utilisant les fonctions qu’il avait partagées au début de la discussion :
    1. Obtenir l’ename de la table des calques :
    2. Obtenir l’ename du dictionnaire d’extension de cette table :
    3. Rechercher le dictionnaire « ACAD™_LAYERFILTERS » dans ce dictionnaire d’extension :
    4. Lister les entrées (les filtres) de ce dictionnaire :
  • Conclusion du cas pratique : PHILPHIL confirme que cette approche fonctionne parfaitement, marquant ainsi la résolution de son problème grâce aux explications et aux outils fournis initialement.

Points Clés de la Résolution

La solution au problème posé en 2023 repose sur plusieurs points fondamentaux expliqués au fil de la discussion :

  1. La Localisation des Dictionnaires : Le point crucial est de comprendre que toutes les données ne sont pas stockées dans le dictionnaire principal (namedobjdict). Certaines configurations, comme les filtres de calques, sont attachées à des objets de la base de données (ici, la table des calques) via leur dictionnaire d’extension.
  2. L’Utilisation de Fonctions Spécifiques : L’accès à un dictionnaire d’extension n’est pas direct. Il nécessite de parcourir la liste DXF de l’objet parent pour trouver le code de groupe (102 . "{ACAD_XDICTIONARY") et récupérer l’ename du dictionnaire (code 360), une tâche grandement simplifiée par la fonction gc:GetExtDict.
  3. Une Méthodologie Séquentielle : La résolution a suivi une démarche logique : identifier l’objet propriétaire (la table des calques), récupérer son dictionnaire d’extension, puis rechercher l’entrée spécifique (ACAD_LAYERFILTERS) à l’intérieur de celui-ci.

Pour une compréhension complète et l’accès aux codes sources originaux, les lecteurs peuvent se référer à la source de cette discussion via le lien fourni en début d’article.

1 « J'aime »