Aller au contenu

[Résolu] Sélection de blocs par les attributs


Steven

Messages recommandés

Salut et bonne année à troutes et à tous.

 

Y a-t-il un moyen de sélectionner des blocs par les attributs?

Je voudrais par exemple sélectionner tous les blocs d'un dessin qui à un attribut CR2.

J'ai regarder par la commande "filter" (que je ne maîtrise pas du tout) et je n'ai rien trouvé de concluant.

 

[Edité le 3/1/2011 par Steven]

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

 

Un lisp de (gile)

 

 

 
(defun c:ssatt (/ doc att elst tag val name ss1 ss2)
 (vl-load-com)
 (and
   (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
   (setq att (car (nentsel "\nSélectionnez l'attribut source: ")))
   (setq att (vlax-ename->vla-object att))
   (= (vla-get-ObjectName att) "AcDbAttribute")
   (setq tag (vla-get-TagString att)
  val (vla-get-TextString att)
  blk (vla-ObjectIDToObject doc (vla-get-OwnerId att))
  name (if (vlax-property-available-p blk 'EffectiveName)
	 (vla-get-EffectiveName blk)
	 (vla-get-Name blk)
       )
  ss2 (ssadd)
   )
   (princ "\nSélectionnez les blocs ou <tout>: ")
   (or
     (ssget (list '(0 . "INSERT")
	   '(66 . 1)
	   (cons 2 (strcat name ",`*U*"))
     )
     )
     (ssget "_X"
     (list '(0 . "INSERT")
	   '(66 . 1)
	   (cons 2 (strcat name ",`*U*"))
     )
     )
   )
   (vlax-for blk (setq ss1 (vla-get-ActiveSelectionSet doc))
     (if (= name
     (if (vlax-property-available-p blk 'EffectiveName)
       (vla-get-EffectiveName blk)
       (vla-get-Name blk)
     )
  )
(foreach a (vlax-invoke blk 'GetAttributes)
  (if (and (= (vla-get-TagString a) tag)
	   (= (vla-get-TextString a) val)
      )
    (ssadd (vlax-vla-object->ename blk) ss2)
    T
  )
)
T
     )
   )
   (not (vla-delete ss1))
   (sssetfirst nil ss2)
 )
 (princ)
)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

 

ssatt sélectionne tous les blocs de même nom ayant la même valeur d'attribut que l'attribut source sélectionné.

 

 

sstag (ci dessous) sélectionne tous les blocs ayant un attribut dont l'étiquette correspond à la chaîne entrée (non sensible à la casse et acceptant les caractères génériques).

 

SSTAG entré en ligne de commande sélectionne et 'gripe' les blocs.

 

(sstag "etiquette") entré à l'invite "Choix des objets: " d'une commande de modification, ajoute les blocs au jeu de sélection.

 

 

(defun sstag (tag / ss res ref name blk)
 (vl-load-com)
 (or *acad* (setq *acad* (vlax-get-acad-object)))
 (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))
 (setq res (ssadd))
 (if (ssget "_X" '((0 . "INSERT") (66 . 1)))
   (progn
     (vlax-for	ref (setq ss (vla-get-ActiveSelectionSet *acdoc*))
(setq has nil)
(foreach att (vlax-invoke ref 'GetAttributes)
  (if (wcmatch (strcase (vla-get-TagString att)) (strcase tag))
    (setq has T)
  )
)
(if has
  (ssadd (vlax-vla-object->ename ref) res)
)
     )
     (vla-delete ss)
   )
 )
 (if (< 0 (sslength res))
   res
 )
)	       

(defun c:sstag (/ tag)
 (if (setq tag (getstring "\Entrez l'étiquette: "))
   (sssetfirst nil (sstag tag))
 )
 (princ)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Encore une fois, je suis épaté par ces lisps magique de chacun de vous :D

 

C'est le ssatt qui est parfait dans le cas présent. Toutefois le sstag rique de me servire prochainement.

 

Merci à vous deux ;)

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

hello

est-il possible de sélectionner des blocs à partir de la valeur d'un attribut

j'ai des blocs avec un attribut classe dans lesquels je renseigne leur classe (moteur, robinetterie, divers...)

idéalement je souhaiterai pouvoir sélectionner l'ensemble des blcos de mon fiochier à partir de moteur, robienetterie... est-ce possible?

Phil

Projeteur Revit Indépendant - traitement des eaux/CVC

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Facile, en modifiant légèrement le Lisp sstag de (gile) ! ;)

(defun ssattval (val / ss res ref name blk)
 (vl-load-com)
 (or *acad* (setq *acad* (vlax-get-acad-object)))
 (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))
 (setq res (ssadd))
 (if (ssget "_X" '((0 . "INSERT") (66 . 1)))
   (progn
     (vlax-for	ref (setq ss (vla-get-ActiveSelectionSet *acdoc*))
       (setq has nil)
       (foreach att (vlax-invoke ref 'GetAttributes)
         (if (wcmatch (strcase (vla-get-TextString att)) (strcase val))
           (setq has T)
         )
       )
       (if has
         (ssadd (vlax-vla-object->ename ref) res)
       )
     )
     (vla-delete ss)
   )
 )
 (if (< 0 (sslength res))
   res
 )
)

(defun c:ssattval (/ val)
 (if (setq val (getstring "\Entrez la valeur d'attribut: "))
   (sssetfirst nil (ssattval val))
 )
 (princ)
)

Lien vers le commentaire
Partager sur d’autres sites

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é