DICTIONNAIRES

à propos des données stockées ...
... ailleurs

Les dictionnaires fournissent un moyen de lier des données au dessin ou à des entités graphiques.
Ils peuvent contenir des données arbitraires et des objets non graphiques.
De plus, contrairement aux objets "Xdata", leur taille n'est pas limitée.
Les données dans un dictionnaire sont stockées dans des objets Xrecord.
Chaque dictionnaire peut contenir d'autres dictionnaires ainsi que plusieurs entrées Xrecord.
Les dictionnaires se répartissent en deux types :
-- les dictionnaires nommés
-- les dictionnaires d'extension.

Les dictionnaires nommés

Tout fichier DWG possède un "objet dictionnaire nommé"
Named Object Dictionary (NOD) qui est la racine de tous les dictionnaires nommés.
AutoCAD (et plus encore les applications verticales) utilise ces dictionnaires pour stocker des données et des objets non graphiques (présentations, groupes, styles de multiligne, styles visuels, etc.).
Chaque dictionnaire peut être considéré comme une entrée de son dictionnaire parent que ce soit le NOD ou un autre dictionnaire où son nom sert de clé pour le retrouver.

Les dictionnaires d'extension

Tout objet AutoCAD, graphique ou non, peut avoir un et un seul dictionnaire d'extension.
Les dictionnaires d'extension n'ont pas de nom, c'est l'objet auquel ils sont lié qui sert de clé pour les retrouver.
On retrouve le nom d'entité d'un dictionnaire d'extension dans la liste de données DXF de l'objet auquel il appartient, c'est la donnée du groupe 360 suivant le groupe (102 . "{ACAD_XDICTIONARY").
AutoCAD utilise aussi les dictionnaires d'extension, comme dans l'exemple ci-dessous, pour les objets annotatifs.

((-1 . <Nom d'entité: 7ffff706280>)
(0 . "TEXT")
(5 . "1D78")
(102 . "{ACAD_XDICTIONARY")
(360 . <Nom d'entité: 7ffff706290>) ; dictionnaire d'extension
(102 . "}")
(330 . <Nom d'entité: 7ffff7039f0>)
(100 . "AcDbEntity")
...)

Les objets XRecord

Ce sont les conteneurs dans les quels sont stockées les données.
Ce sont aussi des entrées nommées dans le dictionnaire parent, et là encore, leur nom qui sert de clé pour les retrouver dans l'arborescence.
En LISP, les données dans un XRecord apparaissent sous forme de liste d'association dont les paires pointées (dotted pair) utilisent les mêmes codes de groupe que les données DXF.
Ce système offre une très grande souplesse et sa structure en arborescence avec un système de clés permet un accès très rapide aux données.

En résumé, chaque dictionnaire (d'extension ou nommé) peut avoir plusieurs entrées de type Dictionary ou XRecord et chaque XRecord contenir plusieurs données.


Fonctions AutoLISP dédiées
AutoLISP fournit des fonctions qui permettent d'accéder à ces dictionnaires et à leurs données, mais aussi d'en créer de nouveaux.


NAMEDOBJDICT

Ne requiert aucun argument et retourne le nom d'entité du NOD du dessin courant.


DICTADD

Syntaxe : (dictadd dict key entry)
Ajoute une entrée de type Dictionary ou Xrecord à un dictionnaire.
dict : le nom d'entité du dictionnaire auquel est ajouté l'objet.
key : le nom de l'entée du nouvel objet, ce nom doit être unique.
entry : le nom d'entité de l'objet ajouté.

Exemples :

Créer un objet dictionnaire

(setq xname ( entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary"))))

Ajouter le dictionnaire au dictionnaire des objets nommés

(dictadd (namedobjdict) "MON_SUPER_DICO" xname)

Créer un objet XRECORD avec des données

1
2
3
4
5
6
7
(setq xrec (entmakex '((0 . "XRECORD")
                       (100 . "AcDbXrecord")
                       (1 . "Ceci est un test")
                       (40 . 3.14159)
                      )
            )
 )

Ajouter l'objet XRecord au dictionnaire

1
(dictadd xname "SUPER_DATA_1" xrec) dictsearch (dictsearch dict key [setnext])

DICTSEARCH

Syntaxe : (dictsearch dict key [setnext])

Cherche l'entrée spécifiée dans le dictionnaire, et retourne sa liste DXF s'il existe (sinon nil).
dict : le nom d'entité du dictionnaire
key : le nom de l'entrée
setnext : (optionnel) si spécifié et non nil, initialise dictnext avec cette entrée.

Retrouver le dictionnaire

(setq dict (dictsearch (namedobjdict) "MON_SUPER_DICO"))

Retrouver les données

(setq data (dictsearch (cdr (assoc -1 dict)) "SUPER_DATA_1"))
(cdr (assoc 1 data))

Renvoie : "Ceci est un test"

(cdr (assoc 40 data))

Renvoie : 3.14159


DICTNEXT

Syntaxe : (dictnext dict[first])
Valeur renvoyée : la liste DXF de l'entrée suivante du dictionnaire si elle existe, sinon nil.

dict : le nom d'entité du dictionnaire propriétaire.
Si l'argument first est spécifié et non nil, dictnext renvoie la première entrée.

Ajoutons une nouvelle entrée XRecord à notre dictionnaire.

1
2
3
4
5
6
7
8
(setq xname (cdr(assoc -1 (dictsearch (namedobjdict) "MON_SUPER_DICO")))
      xrec (entmakex '((0 . "XRECORD")
                       (100 . "AcDbXrecord")
                       (70 . 256)
                       )
                       )
)
(dictadd xname "SUPER_DATA_2" xrec)
(cdr (member '(280 . 1) (dictnext xname T)))

Renvoie : ((70 . 256))

(cdr (member '(280 . 1) (dictnext xname)))

Renvoie : ((1 . "Ceci est un test") (40 . 3.14159))


DICTREMOVE

Syntaxe : (dictremove dict key)
dict : nom d'entité du dictionnaire parent
key : nom de la clé de lentrée à supprimer

Supprime l'entrée key du dictionnaire et retourne le nom d'entité de l'objet supprimé ou nil si un des arguments
n'est pas valide.


DICTRENAME

Syntaxe : (dictrename dict oldKey newKey)
dict : nom d'entité du dictionnaire parent
oldKey : clé à renommer
newKey : nouvelle clé pour l'entrée

Renomme une entrée d'un dictionnaire.
Si tous les arguments sont valides, l'entrée oldKey est renommée newKey,et newKey est retourné, sinon nil est retourné.


Cette page a été écrite grâce aux explications de Gilles Chanteau
que je remercie sincèrement


Haut de page

Retour vers "DONNÉES ÉTENDUES"


22 décembre 2017