Bred Posté(e) le 6 mai 2007 Posté(e) le 6 mai 2007 Salut,(gile) m'a montré ici comment "passer en revue" les éléments contituant un bloc. l'exemple ci-dessous est ce à quoi j'arrive en clonant son exemple. (je sais, je n'ai pas de test d'erreur sur l'existence du bloc dans la collection etc..., mais c'est un extrais)taper(test "nom_du_bloc") (defun c:test (/ A ACDOC B BLOCKS LST-B-T NAME-BLOC) (setq lst-B-T nil AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Blocks (vla-get-Blocks AcDoc) name-Bloc (getstring T "\n Nom du bloc :")) (defun Recup-Bloc-Imb (name-Bloc) (if (setq a (assoc name-Bloc lst-B-T)) (progn (setq b (cons (car a) (+ (cdr a) 1)) lst-B-T (subst b a lst-B-T)) ) (setq lst-B-T (append (list (cons name-Bloc 1)) lst-B-T)) ) (vlax-for e (vla-item Blocks name-Bloc) (if (= (vla-get-ObjectName e) "AcDbBlockReference") (Recup-Bloc-Imb (vla-get-Name e)))) ) (Recup-Bloc-Imb name-Bloc) lst-B-T ) Mon problème est le suivant :(vlax-for e (vla-item Blocks name-Bloc) .... passe en revue les bloc de la collection...Le but de mon code est au final de récupérer les attributs.J'arrive trés bien à le faire si les attributs sont fixes.Par contre, si les attributs sont variables, vus que je ne passe en revue que la collection, la valeur des attributs récupérer dans le bloc contenant des attributs renseignés est la valeur "par défaut" !!! (bien sûr ce bloc avec attributs renseignés peut constitué un bloc imbriqués à "X" niveaux...) D'où ma question : est t'il possible de "passer en revue" un bloc dans le documents actif, mais ce passage en revue ne récupère pas les blocs de la collection mais les blocs "exactes" contenus dans ce bloc.... (sans l'exploser bien sûr, ça, je sais faire...) J'espère avoir été clair et je vous remercie par avance. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 8 mai 2007 Posté(e) le 8 mai 2007 Salut, Réponse un peu tardive, j'étais privé d connexion hier. Si je comprends bien, tu veux récupérer les valeurs d'attributs d'une référence de bloc ainsi que celles des blocs qui pouraient être imbriqués dans cette référence. Tout d'abord, vlax-for ne fonctionne que sur une définition de bloc, pas sur une référence, mais si les blocs imbriqués contiennent des attributs ceux-ci conservent leur valeur dans le bloc "parent" et sont comme constants, on peut donc récupérer leurs valeurs dans la définition du bloc parent. (defun c:test (/ ref lst) (vl-load-com) (defun att_test (ref) (vlax-for ent (vla-item (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)) ) (if (vlax-property-available-p ref 'EffectiveName) (vla-get-EffectiveName ref) (vla-get-Name ref) ) ) (if (= (vla-get-ObjectName ent) "AcDbBlockReference") (progn (setq lst (append (mapcar 'vla-get-TextString (vlax-invoke ent 'getAttributes) ) lst ) ) (att_test ent) ) ) ) ) (setq ref (vlax-ename->vla-object (car (entsel)))) (setq lst (mapcar 'vla-get-TextString (vlax-invoke ref 'getAttributes) ) ) (att_test ref) (princ lst) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 8 mai 2007 Auteur Posté(e) le 8 mai 2007 Salut,maintenant que tu me propose la solution, je me rends compte en fait que mon problème venait de la base de mon code : en fait j'attaquais les attributs en partant de la collection de blocs récupérer, et non pas du bloc parent (celui sélectionné)...merci ! Question parrallèle : quel est la différence entre "EffectiveName" et "Name" ? Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 9 mai 2007 Posté(e) le 9 mai 2007 quel est la différence entre "EffectiveName" et "Name" ? Ça concerne essentiellement les blocs dynamiques dont les propriétés ont été modifiées. Exemple : j'insère le bloc dynamique "toto", tant que je ne modifie pas ses propriétés dynamiques (vla-get-EffectiveName ...) et (vla-get-Name ...) retournent "toto".Dès que je modifie ses propriétés la référence devient un bloc anonyme et (vla-get-Name ...) retourne "*U14" quand (vla-get-EffectiveName ...) retourne toujours "toto". En faisant un test sur la disponibiblité de la prpriété "EffectiveName" le code est compatible avec les version d'avant les bloc dynamique commem avec les suivantes. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 9 mai 2007 Auteur Posté(e) le 9 mai 2007 OK, merci ! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
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