VDH-Bruno Posté(e) le 3 octobre 2012 Posté(e) le 3 octobre 2012 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
krunch Posté(e) le 3 octobre 2012 Posté(e) le 3 octobre 2012 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)
(gile) Posté(e) le 3 octobre 2012 Posté(e) le 3 octobre 2012 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
krunch Posté(e) le 3 octobre 2012 Posté(e) le 3 octobre 2012 J'avais réussi à retrouver l'entité liée à un champ depuis l'entité mtextJustement 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 !
VDH-Bruno Posté(e) le 3 octobre 2012 Auteur Posté(e) le 3 octobre 2012 Bonsoir, Je ne comprends pas très bien ton bloc de citationC’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
krunch Posté(e) le 3 octobre 2012 Posté(e) le 3 octobre 2012 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...
(gile) Posté(e) le 4 octobre 2012 Posté(e) le 4 octobre 2012 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 logiciel340-349 : identificateur de pointeur matériel350-359 : identificateur de propriétaire logiciel360-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
krunch Posté(e) le 5 octobre 2012 Posté(e) le 5 octobre 2012 Par exemple avec une entité imbriquée (sélectionnée avec nentsel) le code 330 renvoie la RefBlocJe 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 :)
VDH-Bruno Posté(e) le 5 octobre 2012 Auteur Posté(e) le 5 octobre 2012 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant