Invité Cri2VACHE Posté(e) le 25 novembre 2021 Posté(e) le 25 novembre 2021 Bonjour, Je suis sur un bout de code VBA me permettant de récupérer, tous les blocs "machins", dans extraire les attributs dans excel, et 2/3 autres choses à partir de ces attributs. Je souhaite récupérer l'expression d'un champ dans un attribut de bloc pour récupérer l'objet lié au champ, en l'occurrence, une polyligne fermé, pour récupérer les coordonnées des points de cette polyligne. Pour ce faire je récupère les attributs de bloc, je récupère déjà le "TextString" de l’attribut en question, mais au delà du string je voudrais récupérer l'expression du champ de cet attribut, si c'est possible ?? Sinon j'imagine qu'il faudra passer par l'édition de bloc ?? Merci pour l'aide que vous pourrez m'apporter Meuh! Citer
Curlygoth Posté(e) le 25 novembre 2021 Posté(e) le 25 novembre 2021 textstring pour la valeur tagstring pour le nom de l'attribut pour les coordonnées des points d'une polyligne c'est coordinates et ca te donne la listes des coordonnées Citation Pour ce faire je récupère les attributs de bloc, je récupère déjà le "TextString" de l’attribut en question, mais au delà du string je voudrais récupérer l'expression du champ de cet attribut, si c'est possible ?? si c'est possible ?? tout est possible mais moi je ne le fais pas (car vu que je suis full VBA j'ai pas besoin de champs a regen... le code fait ce qu'il faut ^^) Citer Mon site Web (en cours de construction) : Site DA-CODE de @didier
Luna Posté(e) le 25 novembre 2021 Posté(e) le 25 novembre 2021 Coucou, Je ne code pas en VBA, seulement en LISP. Je suppose que la valeur de 'TextString te renvoie uniquement le texte visible mais pas l'expression du champ dynamique ? En AutoLISP j'ai un fonctionnement comme celui-ci : Explore DXF in progress from "ATTRIB" (<Nom d'entité: 1d56876c740>) : | (-1 . <Nom d'entité: 1d56876c740>) | (0 . "ATTRIB") | (5 . "39C") | (102 . "{ACAD_XDICTIONARY") | (360 . <Nom d'entité: 1d56876c750>) | (102 . "}") | (330 . <Nom d'entité: 1d56876c720>) | (100 . "AcDbEntity") | (67 . 0) | (410 . "Model") | (8 . "0") | (100 . "AcDbText") | (10 175.139 102.0 0.0) | (40 . 2.5) | (1 . "Aire = 8 802,45 m²") | (50 . 0.0) | (41 . 1.0) | (51 . 0.0) | (7 . "Standard") | (71 . 0) | (72 . 0) | (11 0.0 0.0 0.0) | (210 0.0 0.0 1.0) | (100 . "AcDbAttribute") | (280 . 0) | (2 . "AIRE") | (70 . 0) | (73 . 0) | (74 . 0) | (280 . 1) | 1. "DICTIONARY" (<Nom d'entité: 1d56876c750>) at 360 code, from "ATTRIB" object : | (-1 . <Nom d'entité: 1d56876c750>) | (0 . "DICTIONARY") | (330 . <Nom d'entité: 1d56876c740>) | (5 . "39D") | (100 . "AcDbDictionary") | (280 . 1) | (281 . 1) | (3 . "ACAD_FIELD") | (360 . <Nom d'entité: 1d56876c760>) | 1.1. "DICTIONARY" (<Nom d'entité: 1d56876c760>) at 360 code, from "DICTIONARY" object : | (-1 . <Nom d'entité: 1d56876c760>) | (0 . "DICTIONARY") | (5 . "39E") | (102 . "{ACAD_REACTORS") | (330 . <Nom d'entité: 1d56876c750>) | (102 . "}") | (330 . <Nom d'entité: 1d56876c750>) | (100 . "AcDbDictionary") | (280 . 1) | (281 . 1) | (3 . "TEXT") | (360 . <Nom d'entité: 1d56876c770>) | 1.1.1. "FIELD" (<Nom d'entité: 1d56876c770>) at 360 code, from "DICTIONARY" object : | (-1 . <Nom d'entité: 1d56876c770>) | (0 . "FIELD") | (5 . "39F") | (102 . "{ACAD_REACTORS") | (330 . <Nom d'entité: 1d56876c760>) | (102 . "}") | (330 . <Nom d'entité: 1d56876c760>) | (100 . "AcDbField") | (1 . "_text") | (2 . "Aire = %<\\_FldIdx 0>%") | (90 . 1) | (360 . <Nom d'entité: 1d568793800>) | (97 . 0) | (91 . 63) | (92 . 0) | (94 . 9) | (95 . 2) | (96 . 0) | (300 . "") | (93 . 1) | (6 . "ACFD_FIELDTEXT_CHECKSUM") | (93 . 2) | (90 . 2) | (140 . 11859.0) | (94 . 0) | (300 . "") | (302 . "") | (304 . "ACVALUE_END") | (7 . "ACFD_FIELD_VALUE") | (93 . 3) | (90 . 0) | (94 . 0) | (300 . "") | (302 . "") | (304 . "ACVALUE_END") | (301 . "") | (98 . 0) | 1.1.1.1. "FIELD" (<Nom d'entité: 1d568793800>) at 360 code, from "FIELD" object : | (-1 . <Nom d'entité: 1d568793800>) | (0 . "FIELD") | (330 . <Nom d'entité: 1d56876c770>) | (5 . "3A0") | (100 . "AcDbField") | (1 . "AcObjProp.16.2") | (2 . "\\AcObjProp.16.2 Object(%<\\_ObjIdx 0>%,1).Area \\f \"%lu2%pr2%ps[, m²]%ds44%th32\"") | (90 . 0) | (97 . 1) | (331 . <Nom d'entité: 1d56876c640>) | (91 . 63) | (92 . 0) | (94 . 59) | (95 . 2) | (96 . 0) | (300 . "") | (93 . 4) | (6 . "ObjectPropertyId") | (93 . 2) | (90 . 64) | (330 . <Nom d'entité: 1d56876c640>) | (94 . 0) | (300 . "") | (302 . "") | (304 . "ACVALUE_END") | (6 . "ObjectPropertyName") | (93 . 2) | (90 . 4) | (1 . "Area") | (94 . 0) | (300 . "") | (302 . "") | (304 . "ACVALUE_END") | (6 . "ObjectPropertyOption") | (93 . 2) | (90 . 1) | (91 . 1) | (94 . 0) | (300 . "") | (302 . "") | (304 . "ACVALUE_END") | (6 . "ObjectPropertyOptionString") | (93 . 2) | (90 . 4) | (1 . "1") | (94 . 0) | (300 . "") | (302 . "") | (304 . "ACVALUE_END") | (7 . "ACFD_FIELD_VALUE") | (93 . 4) | (90 . 2) | (140 . 8802.45) | (94 . 0) | (300 . "%lu2%pr2%ps[, m²]%ds44%th32") | (302 . "8 802,45 m²") | (304 . "ACVALUE_END") | (301 . "8 802,45 m²") | (98 . 11) | End of exploration... Avec le nom d'entité au code DXF 331 correspondant à l'objet polyligne associé au champ de l'attribut. Ainsi le cheminement correspondant serait : (entget (cdr (assoc 331 (entget (cdr (assoc 360 (entget (cdr (assoc 360 (entget (cdr (assoc 360 (entget name))))))))))))) Avec 'name le nom d'entité de l'attribut (on peut récupérer l'attribut via (entnext) à partir de la référence de bloc dont il est issu). Je ne connais cependant pas l'équivalent en Visual LISP (qui est beaucoup plus proche du VBA donc cela te sera plus utile ^^). Mais au moins cela peut te donner des pistes de recherches à partir des listes DXF (sont-elles accessibles en VBA ?). Bisous, Luna Citer
(gile) Posté(e) le 25 novembre 2021 Posté(e) le 25 novembre 2021 Salut, Je ne pratique pas le VBA mais la méthode FieldCode me semble répondre à la question. Citer Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Luna Posté(e) le 26 novembre 2021 Posté(e) le 26 novembre 2021 C'est plus rapide en effet 😉 Je me le note dans un coin ! Bisous, Luna Citer
Invité Cri2vache Posté(e) le 23 décembre 2021 Posté(e) le 23 décembre 2021 Bonjour, Merci pour vos retour, merci aux contributeurs constructif ! 1) merci @luna pour ton approche en lisp, je ne suis malheureusement pas capable de l'utiliser, le lisp étant un langage obscure pour moi ! 2) merci @(gile) j'ai regardé (rapidement) la méthode FieldCode, mais si je comprend bien cette méthode s'applique à des text ou text multiligne, pas a des attributs de blocs. Je pense que je vais changer d'approche, je vais partir des polylignes (il semble que les blocs soient toujours "à l'intérieur" des polylignes auxquelles ils se réfèrent dans les attributs) PS : j'aurais voulu vous mettre en PJ une capture des mes tests, mais je n'ai pas réussi... 😅 Citer
(gile) Posté(e) le 23 décembre 2021 Posté(e) le 23 décembre 2021 Il y a 6 heures, Invité Cri2vache a dit : j'ai regardé (rapidement) la méthode FieldCode, mais si je comprend bien cette méthode s'applique à des text ou text multiligne, pas a des attributs de blocs. Il faut toujours essayer/tester... Le type AcDbAttributeReference dérive (on dit aussi hérite) du type AcDbText donc toutes les propriétés des objets texte se retrouvent dans les objets attributs. 1 Citer Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Messages recommandés