Aller au contenu

Sélection bloc par valeur d'attribut


Begood

Messages recommandés

Ah bon, j'ai pourtant testé avant de poster...

 

Peux-tu donner un lien vers un fichier contenant des blocs dynamiques nommés "Bulle" et préciser ce que tu as spécifié comme valeurs d'attribut ?

 

Re,

Voilà un fichier avec un bloc "Bulle" à gauche et un bloc "Bulle Alu" à droite : Fichier

 

Mot de passe : gilles

 

Si tu cherche "xxx" la fonction ne devrait sélectionner que le bloc de gauche.

Et si tu cherche "b002" c'est pareil.

Merci.

Lien vers le commentaire
Partager sur d’autres sites

Effectivement je n'avais pas testé suffisamment en profondeur.

 

;; Select Blocks by Attribute Value  -  Lee Mac
;; Selects all attributed blocks in the current layout which contain a specified attribute value.

(defun c:selblkbyattval (/ att atx ent idx sel str)
 (vl-load-com)
 (if (/= ""
         (setq str (strcase
                     (getstring t "\nEntrez la ou les valeurs de l'attribut (Séparez les valeurs par une virgule) : ")
                   )
         )
     )
   (if (and
         (setq sel
                (ssget "_X"
                       (list '(0 . "INSERT")
                             '(2 . "Bulle,`*U*")
                             '(66 . 1)
                             (cons 410 (getvar 'ctab))
                       )
                )
         )
         (progn
           (repeat (setq idx (sslength sel))
             (setq ent (ssname sel (setq idx (1- idx))))
             (if (= (vla-get-Effectivename (vlax-ename->vla-object ent)) "Bulle")
               (progn
                 (setq att (entnext ent)
                       atx (entget att)
                 )
                 (while
                   (and (= "ATTRIB" (cdr (assoc 0 atx)))
                        (not (wcmatch (strcase (cdr (assoc 1 atx))) str))
                   )
                    (setq att (entnext att)
                          atx (entget att)
                    )
                 )
                 (if (= "SEQEND" (cdr (assoc 0 atx)))
                   (ssdel ent sel)
                 )
               )
               (ssdel ent sel)
             )
           )
           (< 0 (sslength sel))
         )
       )

;;; Modification by Patrick_35
     (progn
       (zoomobject (mapcar '(lambda (x) (vlax-ename->vla-object (cadr x))) (ssnamex sel)))
       (sssetfirst nil sel)
     )
;;; Fin de la modification by Patrick_35

     (princ (strcat "\nAucun bloc trouvé avec la valeur d'attribut \"" str "\"."))
   )
 )
 (princ)
)

;; ZoomObject Effectue un zoom sur les objets contenus dans la liste
;;
;; Argument
;; objlst : une liste de vla-object
;;
;; Variables
;; dir : normale du plan de la vue courante
;; ang : angle de la vue courante
;; 3x3 : matrice de transformation du SCG vers la vue courante (dimension 3)
;; 4x4 : matrice de transformation du SCG vers la vue courante (dimension 4)
;; ptlst : liste des points minimum et maximum des bounding-boxes des objets sélectionnés (SCG)

(defun ZoomObject (objlst / dir ang 3x3 4x4 ptlst)
 (vl-load-com)
 (setq dir (mapcar '-
                   (trans (getvar "viewdir") 1 0)
                   (trans '(0 0 0) 1 0)
           )
       ang (- (getvar "viewtwist"))
       3x3 (mxm (mapcar '(lambda (x) (trans x 0 dir))
                        '((1 0 0) (0 1 0) (0 0 1))
                )
                (list (list (cos ang) (- (sin ang)) 0)
                      (list (sin ang) (cos ang) 0)
                      '(0 0 1)
                )
           )
       4x4 (append
             (mapcar
               '(lambda (v o)
                  (append v (list o))
                )
               3x3
               '(0 0 0)
             )
             (list '(0 0 0 1))
           )
 )
 (foreach obj objlst
   (vla-TransformBy obj (vlax-tmatrix (trp 4x4)))
   (vla-getBoundingBox obj 'minpt 'maxpt)
   (vla-TransformBy obj (vlax-tmatrix 4x4))
   (setq ptlst (cons (vlax-safearray->list minpt)
                     (cons (vlax-safearray->list maxpt) ptlst)
               )
   )
 )
 (vla-ZoomWindow
   (vlax-get-acad-object)
   (vlax-3d-point (mxv 3x3 (apply 'mapcar (cons 'min ptlst))))
   (vlax-3d-point (mxv 3x3 (apply 'mapcar (cons 'max ptlst))))
 )
)

;; transpose une matrice Doug Wilson

(defun trp (m)
 (apply 'mapcar (cons 'list m))
)

;; Apply a transformation matrix to a vector by Vladimir Nesterovsky

(defun mxv (m v)
 (mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m)
)

;; Multiply two matrices by Vladimir Nesterovsky

(defun mxm (m q)
 (mapcar '(lambda (r) (mxv (trp q) r)) m)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Merci bcp Gilles, ça fonctionne impec.

 

J'ai essayé de modifier la fonction pour permettre la sélection des 2 types de blocs :

'(2 . "Bulle,Bulle Alu,`*U*")

(if (= (vla-get-Effectivename (vlax-ename->vla-object ent)) "Bulle,Bulle Alu")

mais ça ne fonctionne pas.

Est-ce que c'est possible ?

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Regarde la fonction wcmatch, c'est une méthode équivalente qui est utilisée pour le nom du bloc dans le filtre de sélection.

(if (wcmatch (vla-get-Effectivename (vlax-ename->vla-object ent)) "Bulle,Bulle Alu")

 

Bonjour,

C'est bon, ça fonctionne impec.

Merci beaucoup.

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é