Aller au contenu

Messages recommandés

Posté(e)

Salut à tous,

 

Pour la première fois depuis 2ans, je dois faire un bedit d'un bloc dans lequel

je dois supprimer des entités. Mais là je suis un peu dans le flou:

- je pensais faire un ssget "x" et filtrer sur les objets voulus, mais en fait le ssget me renvoie

les objets de tout le dessin et pas ceux uniquement contenus dans le bloc ouvert :(

- et je ne vois pas comment filtrer autrement...

 

Si l'un de vous peut m'éclairer?

 

Merci.

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Salut,

 

ssget ne sélectionnera que des références de bloc insérées dans le dessin.

Il faut que tu agisses sur la définition du bloc.

 

Avec AutoLISP :

- atteindre la définition du bloc :

(setq BlkDef (tblsearch "BLOCK" "NomDuBloc"))

- la première entité dans la définition :

(setq ent (cdr (assoc -2 BlkDef)))

- les entités suivantes :

(setq ent (entnext ent))

 

avec Visual LISP

- atteindre la définition du bloc :

(setq BlkDef (vla-Item (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) "NomDuBloc"))

- parcourir les entités :

(vlax-for ent BlkDef ...)

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

Posté(e)

Ok et merci (gile),

 

je vais alors essayer par la définition du bloc.

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Salut

 

Une méthode plus simple que d'utiliser bedit

 

Sélection de l'objet à effacer dans le bloc

(setq obj (nentsel))

 

Effacer l'objet

(vla-delete (vlax-ename->vla-object (car obj)))

 

Regen, pour éviter une boucle pour mettre à jour les blocs modifiés

(vl-cmdf "_.regen")

 

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Alors là je suis sur le cul :o

 

un simple:


; on parcourt les entités du bloc
(vlax-for vl_ent (vla-Item (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) bl_name)
 	(cond
  	; on teste si c'est un bloc
  	((/= (vla-get-ObjectName vl_ent) VAR_ACAD_DEF_BLOC)
	)
	; on teste si le nom est un de ceux cherchés
	((/= (member (vla-get-EffectiveName vl_ent) lst_ss_bl_name) nil)
	 	(vla-delete vl_ent)
	)
) ; cond
) ; vlax-for

; un regen pour mettre à jour
(vl-cmdf "_.regen")

 

où:

VAR_ACAD_DEF_BLOC = "AcDbBlockReference"

bl_name = nom du bloc à traiter

lst_ss_bl_name = liste de noms de blocs

 

 

Il y a des moments ou je me dit autocad c'est de la bouse, mais pour

ce cas là: c'est super fort :D

 

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Salut,

 

(/= (member (vla-get-EffectiveName vl_ent) lst_ss_bl_name) nil)

peut s'écrire plus simplement :

(member (vla-get-EffectiveName vl_ent) lst_ss_bl_name)

 

En LISP, les procédures de décision (if, cond...) n'évaluent pas si l'expression-test retourne strictement un Booléen (T ou nil) mais simplement une valeur non nil ou nil.

 

 

 

 

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

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é