Morgul Posté(e) le 28 juin 2007 Posté(e) le 28 juin 2007 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
bseb67 Posté(e) le 28 juin 2007 Posté(e) le 28 juin 2007 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 lisppour 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...
(gile) Posté(e) le 28 juin 2007 Posté(e) le 28 juin 2007 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant