marionsname Posté(e) le 8 février 2007 Posté(e) le 8 février 2007 SalutEn 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
(gile) Posté(e) le 8 février 2007 Posté(e) le 8 février 2007 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
marionsname Posté(e) le 9 février 2007 Auteur Posté(e) le 9 février 2007 merci gile,je vais tester tout ça.merci infiniment et bon courage
marionsname Posté(e) le 10 février 2007 Auteur Posté(e) le 10 février 2007 ça marche nickelmerci gile :)
BTO Posté(e) le 14 février 2007 Posté(e) le 14 février 2007 (mapcar 'entdel (mapcar 'cadr (ssnamex (ssget "_X" '((0 . "*TEXT")))) ) ) bonjour à tousoui ç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 complet1 liste compléte pour ssnamex 1 liste compléte pour le premier mapcar1 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 lambdaou 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]
(gile) Posté(e) le 14 février 2007 Posté(e) le 14 février 2007 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
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