Aller au contenu

Au Secour Bloc Dynamique


Morgul

Messages recommandés

Bonjour à tous,

 

J'ai créé un bloc dynamique avec des attributs.

Je veux l'attaquer avec un lisp, mais apparemment, on ne peut l'attaquer comme un bloc normal.

 

En effet, la commande suivante ne le trouve pas :

 

(setq NomEntSel (ssget "X" (list (cons 2 "NomBloc"))))

 

Merci de votre aide.

 

Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent.

 

Maréchal Foch

Lien vers le commentaire
Partager sur d’autres sites

salut morgul!

 

Les blocs dynamiques sont un peu embêtant de ce point de vue, car son nom devient A$....

Donc si tu donne le nom cela ne marche pas. Mais tu as de la chance, car j'ai justement fait un lisp

pour cela il y a quelques mois:

 

;---------------------------------------;

; nom: nom_bloc_ori ;

; role: recherche les blocs dynamiques ;

; ayant pour nom d'origine le nom ;

; nom_rec ;

; param: nom_rec => chaine de caractères;

; retour: la liste des blocs concernés ;

; de: BLAES Sébastien ;

; date: 12/03/2007 ;

;---------------------------------------;

(defun nom_bloc_ori ( nom_rec / res s e l lp lp1 lp2 lp3)

 

; on sélectionne tous les blocs

(setq s (ssget "X" '((0 . "INSERT"))) res nil notfind 1)

 

; on test si la sélection est non nulle

(if s

; on boucle tant que l'on a pas traité tous les insert ou

; trouvé le bloc recherché

(while (setq e (ssname s 0))

(setq l (entget e))

(if (assoc 360 l)

; on fouille pour trouver le nom du bloc

(if (/= (setq lp (entget (cdr(assoc 360 l)))) nil)

(if (and (assoc 360 lp) (/= (setq lp1 (entget (cdr(assoc 360 lp)))) nil))

(if (and (assoc 360 lp1) (/= (setq lp2 (entget (cdr(assoc 360 lp1)))) nil))

(if (and (assoc 340 lp2) (/= (setq lp3 (entget (cdr(assoc 340 lp2)))) nil))

 

(if (= (cdr (assoc 2 lp3)) nom_rec)

; on stocke e

(setq res (append res (list e)))

) ; if

) ; if

) ; if

) ; if

) ; if

) ; if

 

; on retire e de la sélection

(ssdel e s)

) ; while

) ; if

 

; on renvoie res

res

) ; nom_bloc_ori

 

[Edité le 28/6/2007 par bseb67]

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Lien vers le commentaire
Partager sur d’autres sites

Ou encore, en testant la propriété EffctiveName (explication ici).

 

;; ssbname
;; Sélection de références de blocs d'après leurs noms (blocs dynamiques)
;;
;; Argument :
;; fltr : une liste : un filtre de sélection comme pour ssget ou nil
;; lst : la liste des noms de blocs (insensible à la casse, accepte les caractères génériques)
;;
;; Exemple pour sélectionner les blocs sur le calque 0 dont le nom commence par "chassis" :
;; (ssbname '((8 . "0")) '("chassis*"))

(defun ssbname (fltr lst / ss n bl)
 (vl-load-com)
 (and
   (setq lst (mapcar 'strcase lst))
   (setq ss (ssget "X" (cons '(0 . "INSERT") fltr)))
   (repeat (setq n (sslength ss))
     (setq bl (vlax-ename->vla-object (ssname ss (setq n (1- n)))))
     (if (vlax-property-available-p bl 'EffectiveName)
(setq name (vla-get-EffectiveName bl))
(setq name (vla-get-Name bl))
     )
     (if (null
    (vl-member-if '(lambda (x) (wcmatch (strcase name) x)) lst)
  )
(ssdel (vlax-vla-object->ename bl) ss)
     )
   )
 )
 ss
) 

[Edité le 28/6/2007 par (gile)]

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

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é