Aller au contenu

Codes DXF et noms d'entités


VDH-Bruno

Messages recommandés

Bonjour,

 

Voilà, lorsque l’on interroge une entitée de dessin au moyen d’entget, on obtient en -1 le nom d’entité (ename), son type en 0 et souvent d’autres noms d’entités suivent dans les codes 330 à 369 et -2. Que l'on peut interroger avec la séquence suivante par exemple :

(entget (cdr (assoc 330 (entget (car (entsel))))))

et ainsi de suite…

 

 

En pensant finalement me promener dans la base de données du dessin via les noms d’entités contenues dans les codes dxf des entités interrogés.. (un peu comme on le ferait en Visual Lisp avec le modèle objet pour faire une analogie).

 

Pour proposer un exemple, et une base de discussion, j’ai ouvert un dessin vierge et dessiné une ligne que j'ai interrogé. Pour éviter les expressions à rallonge du type :

(entget (cdr (assoc 330 (entget (cdr (assoc 330 (entget (entlast))))))))

 

J’ai rapidement écrit la petite fonction suivante :

(defun exploredxf (l e)
 (if l
   (entget (cdr (assoc (car l) (exploredxf (cdr l) e))))
   (entget e)
 )
)

 

 

Donc en interrogeant les noms d’entités inclut dans les définitions d’entités voilà un peu ce que cela donne :

 

1 – LINE (Liste dxf de l’entité)

_$ (entget (entlast)))

((-1 . <Nom d 'entité: 7ef92078>)

(0 . "LINE")

(330 . <Nom d 'entité: 7ef90cf8>); 1.1 (entget (cdr (assoc 330 (entget (entlast)))))

....

)

 

 

1.1 - LINE -> BLOCK_RECORD

_$ (entget (cdr (assoc 330 (entget (entlast)))))

((-1 . <Nom d 'entité: 7ef90cf8>)

(0 . "BLOCK_RECORD")

(330 . <Nom d 'entité: 7ef90c08>); 1.1.1 (exploredxf '(330 330) (entlast))

....

(2 . "*Model_Space")

(360 . <Nom d 'entité: 7ef90d00>); 1.1.2 (exploredxf '(360 330) (entlast))

(340 . <Nom d 'entité: 7ef90d10>); 1.1.3 (exploredxf '(340 330) (entlast))

....

)

 

 

1.1.1 - LINE -> BLOCK_RECORD -> TABLE

_$ (exploredxf '(330 330) (entlast))

((-1 . <Nom d 'entité: 7ef90c08>)

(0 . "TABLE")

(2 . "BLOCK_RECORD")

(330 . <Nom d 'entité: 0>); 1.1.1.1 (exploredxf '(330 330 330) (entlast))

....

)

 

 

1.1.1.1 - LINE -> BLOCK_RECORD -> TABLE -> nil

_$ (exploredxf '(330 330 330) (entlast))

nil

 

 

1.1.2 - LINE -> BLOCK_RECORD -> BLOCK

_$ (exploredxf '(360 330) (entlast))

((-1 . <Nom d 'entité: 7ef90d00>)

(0 . "BLOCK")

(330 . <Nom d 'entité: 7ef90cf8>); renvoie au BLOCK_RECORD du 1.1 (boucle)

....

(-2 . <Nom d 'entité: 7ef92078>); renvoie à la LINE du 1 (boucle)

(2 . "*Model_Space")

....

)

 

 

1.1.3 - LINE -> BLOCK_RECORD -> LAYOUT

_$ (exploredxf '(340 330) (entlast))

((-1 . <Nom d 'entité: 7ef90d10>)

(0 . "LAYOUT")

(5 . "22")

(102 . "{ACAD_REACTORS")

(330 . <Nom d 'entité: 7ef90cd0>) ; 1.1.3.1 (exploredxf '(330 340 330) (entlast))

(102 . "}")

(330 . <Nom d 'entité: 7ef90cd0>) ; 1.1.3.1 (exploredxf '(330 340 330) (entlast))

....

....

(76 . 0)

(330 . <Nom d 'entité: 7ef90cf8>) ; renvoie au BLOCK_RECORD du 1.1 (boucle)

(331 . <Nom d 'entité: 7ef90f50>) ; 1.1.3.2 (exploredxf '(331 340 330) (entlast))

)

 

 

1.1.3.1 - LINE -> BLOCK_RECORD -> LAYOUT -> DICTIONARY

_$ (exploredxf '(330 340 330) (entlast))

((-1 . <Nom d 'entité: 7ef90cd0>)

(0 . "DICTIONARY")

....

(102 . "{ACAD_REACTORS")

(330 . <Nom d 'entité: 7ef90c60>); 1.1.3.1.1 (exploredxf '(330 330 340 330) (entlast))

(102 . "}")

(330 . <Nom d 'entité: 7ef90c60>); 1.1.3.1.1 (exploredxf '(330 330 340 330) (entlast))

....

(350 . <Nom d 'entité: 7ef90d10>); renvoie au LAYOUT du 1.1.3 (boucle)

(3 . "Présentation1")

(350 . <Nom d 'entité: 7ef90ed8>); 1.1.3.1.2 (entget (cdr (assoc 350 (cddr (reverse (exploredxf '(330 340 330) (entlast)))))))

(3 . "Présentation2")

(350 . <Nom d 'entité: 7ef90ef8>); renvoie au BLOCK_RECORD du 1.1 (boucle)

)

 

 

1.1.3.1.1 - LINE -> BLOCK_RECORD -> LAYOUT -> DICTIONARY -> DICTIONARY

_$ (exploredxf '(330 330 340 330) (entlast))

((-1 . <Nom d 'entité: 7ef90c60>)

(0 . "DICTIONARY")

(330 . <Nom d 'entité: 0>) ; renvoie au 1.1.1.1 c.a.d à nil

....

(3 . "ACAD_COLOR")

(350 . <Nom d 'entité: 7ef90dd8>) ; 1.1.3.1.1.1 (exploredxf '(350 330 330 340 330) (entlast))

(3 . "ACAD_GROUP")

(350 . <Nom d 'entité: 7ef90c68>) ; ...

(3 . "ACAD_LAYOUT")

(350 . <Nom d 'entité: 7ef90cd0>) ; ...

(3 . "ACAD_MATERIAL")

(350 . <Nom d 'entité: 7ef90dd0>) ; ...

(3 . "ACAD_MLINESTYLE")

(350 . <Nom d 'entité: 7ef90cb8>) ; ...

(3 . "ACAD_PLOTSETTINGS")

(350 . <Nom d 'entité: 7ef90cc8>) ; ...

(3 . "ACAD_PLOTSTYLENAME")

(350 . <Nom d 'entité: 7ef90c70>) ; ...

(3 . "ACAD_TABLESTYLE")

(350 . <Nom d 'entité: 7ef90e30>) ; ...

(3 . "ACAD_VISUALSTYLE")

(350 . <Nom d 'entité: 7ef90f78>) ; ...

(3 . "AcDbVariableDictionary")

(350 . <Nom d 'entité: 7ef90d70>) ; ...

)

 

 

1.1.3.1.2 - LINE -> BLOCK_RECORD -> LAYOUT -> DICTIONARY -> LAYOUT

_$ (entget (cdr (assoc 350 (cddr (reverse (exploredxf '(330 340 330) (entlast)))))))

((-1 . <Nom d 'entité: 7ef90ed8>)

(0 . "LAYOUT")

(5 . "D3")

(102 . "{ACAD_REACTORS")

(330 . <Nom d 'entité: 7ef90cd0>) ; ...

(102 . "}")

(330 . <Nom d 'entité: 7ef90cd0>) ; ...

....

(330 . <Nom d 'entité: 7ef90ed0>) ; ...

)

 

 

1.1.3.2 - LINE -> BLOCK_RECORD -> LAYOUT -> VPORT

_$ (exploredxf '(331 340 330) (entlast))

((-1 . <Nom d 'entité: 7ef90f50>)

(0 . "VPORT")

(330 . <Nom d 'entité: 7ef90c40>) ; 1.1.3.2.1 (exploredxf '(330 331 340 330) (entlast))

....

(348 . <Nom d 'entité: 7ef90fa8>) ; 1.1.3.2.2 (exploredxf '(348 331 340 330) (entlast))

....

)

 

 

1.1.3.2.1 - LINE -> BLOCK_RECORD -> LAYOUT -> VPORT -> TABLE

_$ (exploredxf '(330 331 340 330) (entlast))

((-1 . <Nom d 'entité: 7ef90c40>)

(0 . "TABLE")

(2 . "VPORT")

(330 . <Nom d 'entité: 0>)

....

)

 

 

1.1.3.2.2 - LINE -> BLOCK_RECORD -> LAYOUT -> VPORT -> VISUALSTYLE

_$ (exploredxf '(348 331 340 330) (entlast))

((-1 . <Nom d 'entité: 7ef90fa8>)

(0 . "VISUALSTYLE")

(5 . "F5")

(102 . "{ACAD_REACTORS")

(330 . <Nom d 'entité: 7ef90f78>) ; 1.1.3.2.2.1 (exploredxf '(330 348 331 340 330) (entlast))

(102 . "}")

(330 . <Nom d 'entité: 7ef90f78>) ; 1.1.3.2.2.1 (exploredxf '(330 348 331 340 330) (entlast))

(100 . "AcDbVisualStyle")

(2 . "2dWireframe")

....

)

 

 

1.1.3.2.2.1 - LINE -> BLOCK_RECORD -> LAYOUT -> VPORT -> VISUALSTYLE -> DICTIONARY

(exploredxf '(330 348 331 340 330) (entlast))

((-1 . <Nom d 'entité: 7ef90f78>)

(0 . "DICTIONARY")

(5 . "EF")

(102 . "{ACAD_REACTORS")

(330 . <Nom d 'entité: 7ef90c60>) ; 1.1.3.2.2.1.1 (exploredxf '(330 330 348 331 340 330) (entlast))

(102 . "}")

(330 . <Nom d 'entité: 7ef90c60>) ; 1.1.3.2.2.1.1 (exploredxf '(330 330 348 331 340 330) (entlast))

....

(3 . "2dWireframe")

(350 . <Nom d 'entité: 7ef90fa8>) ; renvoie au VISUALSTYLE du 1.1.3.2.2 (boucle)

(3 . "3D Hidden")

(350 . <Nom d 'entité: 7ef90fb8>) ; ...

(3 . "3dWireframe")

(350 . <Nom d 'entité: 7ef90fb0>) ; ...

(3 . "Basic")

(350 . <Nom d 'entité: 7ef90fa0>) ; ...

(3 . "Brighten")

(350 . <Nom d 'entité: 7ef92018>) ; ...

(3 . "ColorChange")

(350 . <Nom d 'entité: 7ef92038>) ; ...

(3 . "Conceptual")

(350 . <Nom d 'entité: 7ef92000>) ; ...

(3 . "Dim")

(350 . <Nom d 'entité: 7ef92010>) ; ...

(3 . "Facepattern")

(350 . <Nom d 'entité: 7ef92030>) ; ...

(3 . "Flat")

(350 . <Nom d 'entité: 7ef90f80>) ; ...

(3 . "FlatWithEdges")

(350 . <Nom d 'entité: 7ef90f88>) ; ...

(3 . "Gouraud")

(350 . <Nom d 'entité: 7ef90f90>) ; ...

(3 . "GouraudWithEdges")

(350 . <Nom d 'entité: 7ef90f98>) ; ...

(3 . "Linepattern")

(350 . <Nom d 'entité: 7ef92028>) ; ...

(3 . "Realistic")

(350 . <Nom d 'entité: 7ef92008>) ; ...

(3 . "Thicken")

(350 . <Nom d 'entité: 7ef92020>) ; ...

)

 

 

Bon j’ai pas eu le courage d’aller complètement au bout de la démarche, et je ne suis pas certain d’avoir bien compris la logique de tout cela, donc en attendant que je murisse ceci dans mon esprit...

 

Je souhaitais savoir si certain sur le forum avait déjà planché sur ces questions, et si oui qu’elles étaient les enseignements qu’ils en avaient tiré, car j’ai personnellement l’impression de ne pas être plus avancé...

 

Merci

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Je comprends pas très bien ton bloc de citation car tu insères les appels 'exploredxf' dans les listes entget ..

 

Le principe général est qu'en interrogeant le code 330 tu récupères l'objet propriétaire (le conteneur) et qu'en interrogeant le code 360 tu interroge un contenu (dictionnaire), donc 330 tu montes et 360 tu descends.

 

Par exemple avec une entité imbriquée (sélectionnée avec nentsel) le code 330 renvoie la RefBloc, dont le code 330 est la RefBloc de niveau supérieur si elle est elle même imbriquée .. ainsi de suite jusqu'à l'espace Objet/Papier.

 

Pour le reste il faut voir la signification des codes au cas par cas dans l'aide.

 

Autre chose : le VLisp me semble plus facile pour "explorer" en sachant où on est, en se référant à l'Object Model de l'aide (par exemple on 'monte' de façon plus continue jusqu'à l'objet Application avec la propriété OwnerID)

Lien vers le commentaire
Partager sur d’autres sites

le VLisp me semble plus facile pour "explorer"

Oui c'est plus facile quand les objets, méthodes, propriétés existent, mais ce n'est pas toujours le cas. L'API COM d'AutoCAD est relativement "pauvre" comparée au diagramme des classe .NET (a fortiori celui d'ObjectARX).

 

En théorie on peut tout atteindre via DXF puisqu'un fichier DXF décrit complètement un DWG, les chemins sont parfois tortueux mais on y arrive. J'avais réussi à retrouver l'entité liée à un champ depuis l'entité mtext contenant le champ ou encore récupérer toutes les références depuis une définition chose qu'on ne peut faire (ou que je ne suis pas arrivé à faire) avec Visual LISP.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

J'avais réussi à retrouver l'entité liée à un champ depuis l'entité mtext

Justement j'ai la tête dans les champs ...

(and (member (cdr (assoc 0 (entget ent))) '("ATTRIB" "MTEXT" "TEXT"))
    (setq get (cdr (assoc 360 (entget ent))))
    (setq get (dictsearch get "ACAD_FIELD"))
    (setq get (cdr (assoc 360 get)))
    (setq get (cdr (assoc 360 get)))
    (setq get (assoc 330 (reverse get))) ; ou code 331
)

D'ailleurs c'est justement un contre-exemple de ce que je disais, puisque le code 330 n'est pas un "propriétaire" dans ce cas !

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

 

Je ne comprends pas très bien ton bloc de citation

C’est un peu normal, car je ne pose pas vraiment de questions, j’essaie de comprendre et de me faire une représentation de l’organisation de tout ceci, cela me semble effectivement tortueux et me pose des difficultés qui trouveront certainement leurs solutions au fil du temps (si j'arrive à me dégager suffisamment de temps pour... ).

 

 

Pour le reste il faut voir la signification des codes au cas par cas dans l'aide.

Ce n’est pas tant la signification des codes, mais bien le pourquoi /comment de leurs organisations au sein des listes entget que j’aimerai mieux saisir.

 

 

En théorie on peut tout atteindre via DXF puisqu'un fichier DXF décrit complètement un DWG

Un bon résumé de ce que je veux me démontrer. :)

 

Merci de vos retour.

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

pourquoi /comment

 

Le 'pourquoi' c'est toujours la nécessité : il faut coder les infos pour pouvoir les retrouver.

 

Mais le 'comment' n'a pas l'air d'obéir à une logique prédéfinie : il évolue au gré des améliorations..

Par exemple le passage des polys 'old style' aux LW, les champs et les comportements annotatifs, les blocs dynamiques ... je dis pas que c'est nul, mais au final il vaut mieux pas chercher la cohérence dans le codage de tout ça !

 

Au final le dxf est un ensemble de cas particuliers, il faut juste faire avec et regarder dans l'aide...

Lien vers le commentaire
Partager sur d’autres sites

Mais le 'comment' n'a pas l'air d'obéir à une logique prédéfinie

 

Si quand même !

Les groupes 330 à 369 sont utilisés pour les identificateurs persistants de références entre objets, c'est à dire que ces références sont conservées lors des opérations d'insertion, de xref, de wblock (c'est le lien qui est conservé puisque le ename des objets peut changer).

Ces références se partagent en 4 groupes définissant 4 types d'identificateurs différents :

330-339 : identificateur de pointeur logiciel

340-349 : identificateur de pointeur matériel

350-359 : identificateur de propriétaire logiciel

360-369 : identificateur de propriétaire logiciel

 

Pour en savoir plus sur les différences entre pointeur/propriétaire et logiciel/matériel voir l'aide aux développeurs > Manuel d'utilisation DXF > Concepts DXF avancés > Identificateurs persistants de références inter-objets et les sous-rubriques.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Par exemple avec une entité imbriquée (sélectionnée avec nentsel) le code 330 renvoie la RefBloc

Je reviens sur ce que j'ai écrit parce que c'est faux ..

 

Quand on récupère le code 330 d'une entité renvoyée par nentsel on obtient :

- si c'est un ATTRIB : la Référence de bloc de l'attrib

- si c'est un VERTEX (de Poly3D etc ..) : le Poly3D etc ..

- sinon : un BLOCK_RECORD (du bloc contenant, ou de l'espace Objet/Papier)

 

C'est pourtant simple :)

Lien vers le commentaire
Partager sur d’autres sites

Merci à toi et à (gile), pour le retour, vos réflexions mon permis d’avancer un peu sur le sujet, je me suis aperçu qu’une relecture voir plus du manuel d’utilisation DXF > Concepts DXF avancés me serai des plus profitables..

 

Je n’ai plus trop le temps matériels pour continuer sur le sujet, mais je pense bien revenir dessus avec des interrogations plus ciblé.

 

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité