Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

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é