Aller au contenu

récupérer l'expression d'un champs d'un attribut de bloc, VBA


Invité Cri2VACHE

Messages recommandés

Invité Cri2VACHE

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!

Lien vers le commentaire
Partager sur d’autres sites

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 ^^)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...
Invité Cri2vache

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... 😅

Lien vers le commentaire
Partager sur d’autres sites

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.

  • Upvote 1

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

Lien vers le commentaire
Partager sur d’autres sites

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é