Aller au contenu

Messages recommandés

Posté(e)

Salut

En lisp est-il possible de :

1- supprimer tous les textes dans un fichier dwg.

2- modifier toutes les occurences d'un mot.

 

j'ai lu dans l'aide, qselect n'a pas d'options en ligne de commande, filter également.

Merci de votre aide

Posté(e)

Salut,

 

1- supprimer tous les textes dans un fichier dwg.

 

Fonctionne avec les textes et textes multiligne, pour ne traiter que les textes supprimer l'astérsque dans "*TEXT", pour ne traiter que mes mtextes remplacer l'astérisque par M ("MTEXT")

 

(command "_erase" (ssget "_X" '((0 . "*TEXT"))) "") 

 

Ou, si tu répugnes à utiliser la fonction command :

 

(mapcar	'entdel
(mapcar	'cadr
	(ssnamex (ssget "_X" '((0 . "*TEXT"))))
)
) 

 

 

2- modifier toutes les occurences d'un mot.

 

Change toutes les occurences de "ancien texte" en "nouveau texte" (à remplacer par les valeurs que tu veux) dans tous les textes et mtextes, idem que précédemment pour la sélection.

 

(mapcar	'(lambda (x)
   (while (vl-string-search "ancien texte" (cdr (assoc 1 x)))
     (setq x (subst
	       (cons 1
		     (vl-string-subst
		       "nouveau texte"
		       "ancien texte"
		       (cdr (assoc 1 x))
		     )
	       )
	       (assoc 1 x)
	       x
	     )
     )
   )
   (entmod x)
 )
(mapcar	'entget
	(mapcar 'cadr (ssnamex (ssget "_X" '((0 . "*TEXT")))))
)
) 

 

[Edité le 8/2/2007 par (gile)]

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

Posté(e)

(mapcar	'entdel
(mapcar	'cadr
	(ssnamex (ssget "_X" '((0 . "*TEXT"))))
)
)

 

bonjour à tous

oui ça fonctionne, mais comme c'est l'objet du forum, je vais continuer dans le coté pinaillement :)

 

a)

(ssget "_X" '((0 . "*TEXT"))) retourne nil si aucun texte n'est trouvé => ssnamex plante.

je ne pense pas qu'on puisse s'affranchir d'une structure classique de sélection :

(if (setq ss (ssget "_X" '((0 . "*TEXT"))))
......

 

b)

De manière générale, la fonction mapcar exécute une fonction sur chacun des éléments d'une liste et retourne une liste de même longueur, ce qui veut dire qu'après un mapcar on a en mémoire 2 listes. Même l'écriture :

(setq listA (mapcar 'fonction listA)) ocuppe l'espace de 2 listA en mémoire puisque la réaffection à listA de la liste retournée par mapcar intervient après la création de la liste de retour de mapcar.

 

Une liste issue d'une sélection sur l'ensemble d'un dessin peut être très grande (ne considérons plus ce cas particulier des textes à effacer) 10000, 100 000, 1 000 000 d'éléments ?

dans une structure :

(mapcar 'entdel

(mapcar 'cadr

(ssnamex (ssget "_X" '((0 . "*TEXT"))))

)

)

 

on a en mémoire :

1 jeu de sélectoin complet

1 liste compléte pour ssnamex

1 liste compléte pour le premier mapcar

1 liste compléte pour le second mapcar

 

la première raison d'être d'un mapcar est de récupérer une liste après le balayage d'une liste, or ici l'objet du balayage de la liste n'est pas de récupérer une liste mais simplement de la parcourir.

Donc, on peut au moins fusionner les 2 mapcar via une fonction lambda

ou utiliser des structures classiques :

(repeat (sslength ss)

.....

)

(surtout pas de while qui oblige à un test non justifié quand le nombre de répétitions d'une boucle est connu)

 

oui je sais, c'est moins beau que des mapcars enchainés les uns dans les autres ;)

 

Bruno Toniutti[Edité le 14/2/2007 par BTO]

 

[Edité le 20/2/2007 par BTO]

Posté(e)

Merci encore, je me doutais bien de tout ça, mais je me laisse trop souvent tenter par les figures de style (une seule expression, pas de variables ...)

 

Donc, une version moins "élégante" mais plus "performante"

 

(if (setq ss (ssget "_X" '((0 . "*TEXT"))))
 (repeat (setq n (sslength ss))
   (setq elst (entget (ssname ss (setq n (1- n)))))
   (while (vl-string-search "ancien texte" (cdr (assoc 1 elst)))
     (setq elst (subst
	       (cons 1
		     (vl-string-subst
		       "nouveau texte"
		       "ancien texte"
		       (cdr (assoc 1 elst))
		     )
	       )
	       (assoc 1 elst)
	       elst
	     )
     )
   )
   (entmod elst)
   )
 ) 

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é