Aller au contenu

Lisp pour enlever les solides ou les hachures à l\'intérieur des blocs


autospeed

Messages recommandés

Bonjour ,

Lors des opérations de nettoyage de plans , je rencontre souvent des blocs contenant des solides ou des hachures. Ex un ascenceur ou une voiture.

J'aimerais bien trouver un petit lisp qui permette d'explorer tous les blocs d'un dessins .. même les blocs de blocs et qui enlève tout ce qui est hachures ou solides à l'intérieur des blocs.

Est ce que cela existe déja ?

 

Auteur du logiciel Autospeed

Auteur de la théorie du site www.kheops.biz

Auteur de nombreux livres

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

essaye cela

 

 (defun c:deleteSolidHathInBlocks (/ AcDoc)
(vl-load-com)
 (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)))


 (vla-StartUndoMark AcDoc)
 (vlax-for b (vla-get-Blocks AcDoc)
   (vlax-for e	b
     (if (and (= "AcDbHatch" (vla-get-ObjectName e))
       (= "SOLID" (vla-get-PatternName e))
  )
(vla-delete e)
     )
   )
 )
 (vla-EndUndoMark AcDoc)
 (vla-regen AcDoc acActiveViewport)
 (princ)
) 

il me semble que c'est (gile) qui en est l'auteur merci

 

[Edité le 24/2/2011 par Fraid]

Lien vers le commentaire
Partager sur d’autres sites

Merci Fraid .. j'ai testé surun plan hyper lourd et ça plante :-) cela sélectionne des solides puis

voici le message d'erreur

 

Commande: _appload delsol.lsp correctement chargé(s)

delsol.lsp correctement chargé(s)

Commande: delsol

_undo Paramètres courants: Auto = Activé, Contrôle = Tous, Associer = Oui

Entrez le nombre d'opérations à annuler ou

[Auto/Contrôle/Début/Fin/Marque/Retour] <1>: _e

Commande: ; erreur: une erreur est survenue dans la fonction *erreur*paramètre

de la variable AutoCAD rejeté: "pickadd" nil

 

par contre sur des plans plus légers , ça marche nickel ..

super même ! exactement ce que je cherchais

 

 

 

[Edité le 24/2/2011 par autospeed]

Auteur du logiciel Autospeed

Auteur de la théorie du site www.kheops.biz

Auteur de nombreux livres

Lien vers le commentaire
Partager sur d’autres sites

 

Hello Fraid

 

C une routine interessante qui devrait permettre (a terme) de nettoyer les blocs (symboles) de TOUTE Hachure et de TOUT Solid

 

Par contre j'aimerais bien de pouvoir faire une selection AutoCAD classique et non pas de traiter TOUS les blocs (symboles) du dessin, y compris ceux utilises pour faire du decor (avec donc des hachures et solides) que l'on utilise souvent dans les cartouches !

 

Merci d'avance, Le Decapode

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Pour Le Crabe

 

 


(defun c:DeleteSolidHathInBlocks (/ AcDoc listBlocs vlalistbloc)
(vl-load-com)
 (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
 
           listBlocs (ssget  (list (cons 0 "INSERT")))
    vlalistbloc (vlax-ename->vla-object listBlocs)
 )
 (vla-StartUndoMark AcDoc)
 (vlax-for b 	vlalistbloc
   (vlax-for e	b
     (if (and (= "AcDbHatch" (vla-get-ObjectName e))
       (= "SOLID" (vla-get-PatternName e))
  )
(vla-delete e)
     )
   )
 )
 (vla-EndUndoMark AcDoc)
 (vla-regen AcDoc acActiveViewport)
 (princ)
) 

 

par contre je n'ai pas le temps de testé

 

[Edité le 24/2/2011 par Fraid]

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Je crois que tu ne peux pas transformer un jeu de sélection ssget avec (vlax-ename->vla-object), il faut passer par (vla-get-activeselectionset).

Ensuite tu ne peux pas parcourir les entités de la référence de bloc, il faut accéder à la définition du bloc.

 

(defun c:dsh (/ AcDoc listBlocs vlalistbloc blocks)
(vl-load-com)
(setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
	listBlocs (ssget  (list (cons 0 "INSERT")))
	vlalistbloc (vla-get-activeselectionset AcDoc)
)
(setq blocks (vla-get-blocks AcDoc))
(vla-StartUndoMark AcDoc)
(vlax-for b vlalistbloc
	(vlax-for e	(vla-item blocks (vla-get-effectivename b))
		(if (and (= "AcDbHatch" (vla-get-ObjectName e))
			(= "SOLID" (vla-get-PatternName e))
			)
		(vla-delete e)
		)
	)
)
(vla-EndUndoMark AcDoc)
(vla-regen AcDoc acActiveViewport)
(princ)
)

 

Comme ça ça fonctionne, mais il n'y a aucune gestion d'erreurs ou vérifications des doublons (plusieurs occurrences du même bloc sélectionnées =le bloc sera traité plusieurs fois inutilement).

 

Edit: corrigé la 2e phrase.

 

[Edité le 24/2/2011 par bryce]

Lien vers le commentaire
Partager sur d’autres sites

Je crois que tu ne peux pas transformer un jeu de sélection ssget avec (vlax-ename->vla-object)

 

ba oui, il faut passé par un ssname.... :P

 

je suis en train d'apprendre le VLA

 

et grace a vous je fais des progrés tout les jours,

 

merci Bryce car aujourd'huis je sais faire une selection en VLA !!

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Juste pour être pédagogique

 

(defun c:dsh (/ AcDoc listBlocs vlalistbloc blocks)
 (vl-load-com)
 (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
blocks (vla-get-blocks AcDoc)
 )
 (vla-StartUndoMark AcDoc)
 (and (ssget  (list (cons 0 "INSERT")))
   (progn
     (vlax-for b (setq vlalistbloc (vla-get-activeselectionset AcDoc))
(or (member (vla-get-effectivename b) listBlocs)
  (setq listBlocs (cons (vla-get-effectivename b) listBlocs))
)
     )
     (vla-delete vlalistbloc)
     (mapcar '(lambda(e)
	(vlax-for e (vla-item blocks e)
	  (and	(= "AcDbHatch" (vla-get-ObjectName e))
		(= "SOLID" (vla-get-PatternName e))
	    (vla-delete e)
	  )
	)
      )
      listBlocs
     )
     (vla-regen AcDoc acActiveViewport)
   )
 )
 (vla-EndUndoMark AcDoc)
 (princ)
)

 

ps : non testé

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

Lien vers le commentaire
Partager sur d’autres sites

ps : non testé

 

Ça fonctionne, merci pour la démonstration ! :P

 

J'ai une question sur cette partie :

 

(mapcar
'(lambda(e)
	(vlax-for e (vla-item blocks e)
		(and	
			(= "AcDbHatch" (vla-get-ObjectName e))
			(= "SOLID" (vla-get-PatternName e))
			(vla-delete e)
		)
	)
)
listBlocs
)

 

et en particulier sur

 

(vlax-for e (vla-item blocks e)

 

Y a-t-il une raison pour utiliser la même variable e pour 2 choses différentes ?

J'aurais eu tendance à utiliser 2 variables différentes :

 

(vlax-for ent (vla-item blocks e)

 

J'ai un peu de mal à comprendre pourquoi ta méthode fonctionne...

Lien vers le commentaire
Partager sur d’autres sites

Bryce :

Tu as raison, utiliser deux variables est plus simple pour la compréhension.

Maintenant, il faut aussi voir les différents niveaux d'imbrication de cette ligne

(vlax-for e (vla-item blocks e)

La première évaluation se situe dans (vla-item blocks e) et donne la définition du bloc.

Une fois cette définition trouvée, je n'ai plus besoin de cette variable et je peux donc l'utiliser à nouveau dans une boucle qui parcoure cette définition.

J'ai juste gagné une variable.

 

Fraid :

La fonction AND à la particularité de faire l'évaluation du 1er argument et s'il est non-nil, de passer au suivant et ainsi de suite; de s'arrêter à ma fonction (dernier argument) ou un argument retournant nil

 

Donc, si j'écris

(and var_1 var_2 var_3 ma_fonction)

ma fonction sera lancée si var_1+var_2+var_3 sont non-nil

Cela revient à écrire de manière plus traditionnelle

(if (and var_1 var_2 var_3) ma_fonction)

Le gain, une fonction if qui n'est pas réellement nécessaire, sauf si on désire utiliser le else/ou/autrement (qui est implicite dans la fonction if)

 

La logique est la même avec le OR

Quand j'écris

(or (member (vla-get-effectivename b) listBlocs) ...)

cela revient à écrire

(if (not (member (vla-get-effectivename b) listBlocs) ...)

ou encore

(and (not (member (vla-get-effectivename b) listBlocs) ...)

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

La première évaluation se situe dans (vla-item blocks e) et donne la définition du bloc.

Une fois cette définition trouvée, je n'ai plus besoin de cette variable et je peux donc l'utiliser à nouveau dans une boucle qui parcoure cette définition.

Et comme elle est redéfinie à chaque nouvelle exécution de lambda, il n'y aucun problème de "téléscopage"...

Merci :)

Lien vers le commentaire
Partager sur d’autres sites

  • 3 ans après...
  • 4 mois après...

hello

esk'un bienfaiteur pourrait ajouter une ligne ou deux pour que ce splendide lisp marche sur les blcos imbriqués

sur mon ficheir je dois avoir 6 "lignées" de blcoa vant d'atteindre les hachures!! :/

Merci papa Noël!! :)

Phil

 

Salut Philsogood,

 

Tu trouveras ce que tu cherches ici. Puis si tu veux aussi la même chose pour les Wipeouts, c'est ici, aussi ;)

 

N'oublie pas de faire une regen après avoir lancer la commande.

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

  • 3 ans après...

Bonjour à vous, ce lisp est super mais si il y a des contraintes paramétriques dans le bloc alors la hachure ne s'efface pas - il faut editer le bloc le fermer et repondre oui a l'enregistrement, et là, la modification est prise en compte - y a t'il moyen de faire en sorte que ce super lisp fonctionne de la meme façon avec les blocs paramétriques qu'avec les autres ?

 

Merci à vous tous..

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é