Skip Posté(e) le 19 juin Partager Posté(e) le 19 juin Bonjour, Je veux créer une étiquette qui, en cliquant sur le bloc qui se trouve dans la xref, trouvera l'attribut "ASSET_TAG" et l'affichera dans l'etiquette. Ce lisp marche sur les blocs en dur. Mais pas sur les blocs dans les Xref. Si l'attribut est vide l'etiquette indique "TAG_MISSING". Pouvez vous m'aider ? (defun c:BNameLabel (/ obj lastentity ent attrib tagname attribvalue) (vl-load-com) (if (setq obj (car (entsel "\nSélectionnez le bloc : "))) (if (eq (cdr (assoc 0 (entget obj))) "INSERT") (progn (setq lastentity (entlast)) (vl-cmdf "_.mleader" "_non" (trans (vlax-get (setq obj (vlax-ename->vla-object obj)) 'InsertionPoint) 0 1) PAUSE) (while (eq 1 (logand 1 (getvar 'CMDACTIVE))) (vl-cmdf "")) ;; Récupération des attributs du bloc (setq attrib (vlax-invoke obj 'GetAttributes)) ;; Boucle sur chaque attribut pour trouver celui avec le tag spécifié (setq tagname "ASSET_TAG") ; Modifier "ASSET_TAG" par le tag de l'attribut que vous voulez récupérer (setq attribvalue nil) (foreach att attrib (if (eq (vlax-get att 'TagString) tagname) (setq attribvalue (vlax-get att 'TextString)) ) ) ;; Mise à jour du texte du leader en fonction de la valeur de l'attribut (if (and attribvalue (not (equal lastentity (setq ent (entlast))))) (vla-put-textstring (vlax-ename->vla-object ent) attribvalue) (vla-put-textstring (vlax-ename->vla-object ent) "TAG_MISSING") ) (if (and (equal attribvalue "") (not (equal lastentity (setq ent (entlast))))) (vla-put-textstring (vlax-ename->vla-object ent) "TAG_MISSING") ) ) (princ "\nObjet invalide !") ) ) (princ) ) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Fraid Posté(e) le 19 juin Partager Posté(e) le 19 juin Bonjour, Si l'attribut du bloc est visible, c'est possible en cliquant dessus et faire un _ncopy. Tu récupère un texte avec la valeur que tu cherche. (sans avoir besoin de l'etiquette). Par contre, si l'attribut est invisible, c'est possible, mais beaucoup trop long sur des plans contenant beaucoup d'objet., car il faut chercher le bloc le plus proche de l'objet que tu ferais avec aussi un _ncopy. _copy est une clé d'entrée. Il faut faire des essais. Sans un de tes plans en exemples nous ne pourrons pas t'aider en testant nos hypotheses. Cordialement. Citer https://github.com/Fraiddd Lien vers le commentaire Partager sur d’autres sites More sharing options...
Luna Posté(e) le 20 juin Partager Posté(e) le 20 juin Coucou, Pour accéder aux objets dans une XREF, il faut utiliser (nentsel) et non (entsel). Le problème : (entsel) sélectionne un objet donc quand tu as un bloc cela renvoie l'ID du bloc et donc c'est simple de récupérer les infos du bloc (attribut par exemple) mais (nentsel) sélectionne un sous-objet donc dans le cas d'un bloc, si tu cliques sur une polyligne d'un bloc cela te renvoie les données de la polyligne et non ton bloc. Donc soit il faut que ta sélection soit précise (clic sur l'attribut souhaité directement) et cela demande peu de modifications de programmation, soit il faut être capable de remonter les couches de sous-objets pour récupérer les bonnes valeurs, ce qui nécessite beaucoup plus de modifications et programmation complexe car il faut que ton programme fonctionne dans chaque cas (bloc en dur et/ou bloc dans xref..) Bisous, Luna Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Fraid Posté(e) le 21 juin Partager Posté(e) le 21 juin Il y a 22 heures, Luna a dit : clic sur l'attribut souhaité directement Bonjour Luna, Je vois qu'on arrive à la même conclusion, c'est beaucoup plus simple si l'attribut est visible d'une manière ou une autre. On peut imaginer une solution qui fasse apparaitre l'attribut temporairement pendant l'execution du lisp. Mais il faut un plan en exemple. Citer https://github.com/Fraiddd Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés