Fraid Posté(e) le 25 septembre 2010 Posté(e) le 25 septembre 2010 Bonjour, J'utilise depuis longtemps cette routine pour remplacer les textes de façon transparante. (setq Old$ "TOTO" New$ "TATA" ) (setq adoc (vla-get-activedocument (vlax-get-acad-object))) (vlax-for lt (vla-get-layouts adoc) (vlax-for obj (vla-get-block lt) (if (eq "AcDbText" (vla-get-objectname obj)) (while (vl-string-search Old$ (vla-get-textstring obj)) (vla-put-textstring obj (vl-string-subst New$ Old$ (vla-get-textstring obj)) ) ) ) ) ) je ne sais plus ou j'ai récuperer ce bout de code, mais si l'auteur ce reconnait je le remercie. Mais mon souci est qu'il ne remplace que les textes simples.Je voudrai qu'il aille chercher dans:-les MTEXT-les blocs et les blocs imbriqués-les attributs et les etiquettes d'attributs-les noms des calques- et le plus compliqué a mon sens, dans les xrefs Il y a bien RECH de Patrick35, mais il ne remplace pasou alors je n'ai pas reussi a m'en servir :P et l'ideal serai que dans la boite de dialogue, on puisse saisir [surligneur] les [/surligneur] textes a remplacer et le texte de remplacement.C'est une super idée de l'avoir séparer du Lisp principal. Quelqu'un a peut etre un truc tout fait...Je me retrouve a devoir reprendre une grosse quantité de plan suite au rachat d'un client par un autre...Evidement son nom est partout et je ne vais pas etre payé pour sa :mad: Merci pour votre aide ;) https://github.com/Fraiddd
Fraid Posté(e) le 28 septembre 2010 Auteur Posté(e) le 28 septembre 2010 Je vois bien que c'est un gros morceau.... Surtout que je vient de m'apercevoir qu'il faut aussi modifier le nom de certain blocs.... Pas facile de ne pas en oublier...Obliger de me faire un tableau que je rempli au fur et a mesure que je modifie mes plans... Pour les Mtext j'ai le droit de les exploser... (setq smtext (ssget "x" (list (cons 0 "mtext")))) (if smtext (command "_explode" smtext "") (princ "\nPas de MText!") ) comme sa c'est regler :cool: Mais comme il y en a dans les blocs .... :P PS: j'aurai pu remplacer list par ' [Edité le 28/9/2010 par Fraid] https://github.com/Fraiddd
Patrick_35 Posté(e) le 28 septembre 2010 Posté(e) le 28 septembre 2010 Salut Tu as regardé la commande _find ?Tu peux même remplacer du texte des des attributs @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Fraid Posté(e) le 14 octobre 2010 Auteur Posté(e) le 14 octobre 2010 Bonjour, J'ai un peu de temps alors je revient la dessus la commande -find chauffe chez moi C'est pour cela que je cherche du code j'ai glaner sur un post et j'ai essayer de le cuisiner a ma sauce (defun c:sf (/ Old$ New$ ExtVal) (setq RegVar "InitTRI") :lecture d'une variable placées dans le registre (GET-var RegVar) ;fonction qui lit le registre (setq Old$ "[TRI]" New$ ExtVal) (Run-sf) (princ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun rep-txt (elst / str) (setq str (cdr (assoc 1 elst))) (while (vl-string-search Old$ str) (setq str (vl-string-subst New$ Old$ str)) ) (entmod (subst (cons 1 str) (assoc 1 elst) elst)) (entupd (cdr (assoc -1 elst))) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun Run-sf (/ ss n txt elst str) (and (setq ss (ssget "_X" '((0 . "TEXT,MTEXT,INSERT")))) (setq n 0) (while (setq txt (ssname ss n)) (setq elst (entget txt)) (if (= (cdr (assoc 0 elst)) "INSERT") (progn (setq ent (entnext txt)) (while (and ent (/= (cdr (assoc 0 (setq elst (entget ent)))) "SEQEND") ) (if (member (cdr (assoc 0 elst)) '("TEXT" "MTEXT" "ATTRIB" ) ) (rep-txt elst) ) (setq ent (entnext ent)) ) ) (rep-txt elst) ) (setq n (1+ n)) ) ) ) ;;;Récupérer valeur variable (defun GET-var (RegVar) (setq ExtVal (vl-registry-read "HKEY_CURRENT_USER\\Software\\Test" RegVar)) ExtVal ) sa marche hors des blocspar contre les textes des blocs sont extrait (comme copy nested objects) et ceux la seulement sont traiter :exclam: J'ai beau lire et relire le code je ne vois pas pourquoi mes textes sont copier hors des blocs ? [Edité le 23/10/2010 par Fraid] https://github.com/Fraiddd
Fraid Posté(e) le 23 octobre 2010 Auteur Posté(e) le 23 octobre 2010 J'ai bo essayer tout les solutions a chaque fois le texte est copié hors du bloc !!!! Est ce dû a une variable ? la commande find commence a me sortir par les yeux au moins si l'historique de saisie n'etais pas limité a cinq mots ... Je n'arriverai donc pas a changer de simple texte inclu dans des bloc...... :( https://github.com/Fraiddd
(gile) Posté(e) le 24 octobre 2010 Posté(e) le 24 octobre 2010 Salut, Tu utilises des variables globales plutôt que des arguments pour faire communiquer (passer des valeurs) les routines, cette façon de faire peut, du fait des 'effets de bord', provoquer des comportements inattendus (voir ici).Il serait, à mon avis préférable que old$ et new$ soient des arguments des fonction rep-txt et run-sf. Ton code "corrigé" en conséquence fonctionne chez moi. (defun c:sf (/ Old$ New$) (if (setq Old$ "[TRI]" New$ (GET-var "InitTRI") ) (Run-sf Old$ New$) ) (princ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun rep-txt (elst Old New / str) (setq str (cdr (assoc 1 elst))) (while (vl-string-search Old$ str) (setq str (vl-string-subst New$ Old$ str)) ) (entmod (subst (cons 1 str) (assoc 1 elst) elst)) (entupd (cdr (assoc -1 elst))) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun Run-sf (Old New / ss n txt elst str) (and (setq ss (ssget "_X" '((0 . "TEXT,MTEXT,INSERT")))) (setq n 0) (while (setq txt (ssname ss n)) (setq elst (entget txt)) (if (= (cdr (assoc 0 elst)) "INSERT") (progn (setq ent (entnext txt)) (while (and ent (/= (cdr (assoc 0 (setq elst (entget ent)))) "SEQEND") ) (if (member (cdr (assoc 0 elst)) '("TEXT" "MTEXT" "ATTRIB" ) ) (rep-txt elst Old$ New$) ) (setq ent (entnext ent)) ) ) (rep-txt elst Old$ New$) ) (setq n (1+ n)) ) ) ) ;;;Récupérer valeur variable (defun GET-var (RegVar) (vl-registry-read "HKEY_CURRENT_USER\\Software\\Test" RegVar) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 19 janvier 2012 Posté(e) le 19 janvier 2012 Bonjour, Suite à une demande pour faire l'équivalent de la commande RECHERCHER (_FIND), mais applicable dans un script, j'ai pondu le code qui suit.Bien que testé brièvement, il a l'air de fonctionner sur des TEXT, MTEXT, INSERT (avec Attributs), MULTILEADER La substitution ne s'arrête pas à la première correspondance trouvé dans un texte, toutes les occurrences sont remplacées. (cela peut souvent être le cas, surtout dans un texte multiligne) (defun my_replace_text (new_string old_string / js n ename) (vl-load-com) (defun string-subst (nam_obj / value_string nbs tmp_nbs) (setq value_string (vlax-get nam_obj 'TextString) nbs 0) (while nbs (if (setq nbs (vl-string-search old_string value_string (setq tmp_nbs nbs))) (setq value_string (vl-string-subst new_string old_string value_string tmp_nbs) nbs (1+ nbs) ) ) ) (vlax-put nam_obj 'TextString value_string) ) (setq js (ssget "_X" '( (-4 . "<OR") (0 . "*TEXT,MULTILEADER,ATTDEF") (-4 . "<AND") (0 . "INSERT") (66 . 1) (-4 . "AND>") (-4 . "OR>") ) ) ) (cond (js (repeat (setq n (sslength js)) (setq ename (vlax-ename->vla-object (ssname js (setq n (1- n))))) (cond ((vlax-property-available-p ename 'TextString) (string-subst ename) ) (T (mapcar '(lambda (att) (string-subst att) ) (vlax-invoke ename 'GetAttributes) ) ) ) ) ) ) (prin1) ) Usage: (my_replace_text "Nouvelle chaine" "Ancienne chaine")Attention, sensible à la case des caractères (Majuscule, Minuscule) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
serge77 Posté(e) le 16 février 2013 Posté(e) le 16 février 2013 Bonjour Bonuscad, Je vais passer pour un débile mais à te lire, ton code est exactement ce que je recherche.Sauf que quand je le lance, autocad me répond "commande inconnue"....Comment ça se fait ??? Qu'est ce que je dois faire ???Ce programme serait vraiment d'une grande aide, mon client s'est trompé dans la liasse de numéro à prendre et bien sur c'est à moi de corriger donc j'ai un numéro genre "A315-555-xxx" a changer en "B478-555-xxx" sur 300 plans...Merci d'avance
bonuscad Posté(e) le 18 février 2013 Posté(e) le 18 février 2013 Bonjour, quand je le lance, autocad me répond "commande inconnue".... Est tu sur d'avoir utilisé la syntaxe entre parenthèses... car le code est une fonction, pas une commande. c'est à moi de corriger donc j'ai un numéro genre "A315-555-xxx" a changer en "B478-555-xxx" sur 300 plans... Si ce code est enregistrer (dans un dossier de recherche de préférence) sous le nom par exemple de MY_REPLACE.LSP. Dans ton script, il te suffira d'avoir les lignes suivantes: (load "my_replace") (my_replace_text "A315-555-xxx" "B478-555-xxx") Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
serge77 Posté(e) le 18 février 2013 Posté(e) le 18 février 2013 Merci pour cette réponse, j'avais pas compris la manière de l'utiliser.J'essaie de suite.
serge77 Posté(e) le 18 février 2013 Posté(e) le 18 février 2013 Rebonjour, la commande (load "my_replace") me retourne ; erreur: La commande CHARGER n'a pas abouti: "my_replace"Mais pas grave, je l'ai chargée au démarrage.Par contre, la fonction (my_replace_text "A315-555-xxx" "B478-555-xxx") ne me renvoi pas d'erreur mais ne fait rien. J'ai pourtant inscrit le texte dans du texte, dans des attributs, en espace papier et en espace objet pour voir...rien n'y fait.
serge77 Posté(e) le 18 février 2013 Posté(e) le 18 février 2013 Oups, J'ai inversé nouveau texte et ancien texte, ça marche nickel, merci, merci, merci.Petite question subsidiaire, vu que ce n'est pas une fonction, qu'est ce que je dois écrire pour construire un script Ex: (write-line "(my_replace_text "E318" "D214")" fscr)Ca, ça marche pour les commande, pas pour les fonctions. D'avance merci.
bonuscad Posté(e) le 18 février 2013 Posté(e) le 18 février 2013 J'ai inversé nouveau texte et ancien texteOui, je n'avais pas fais attention en te créant l'exemple... Tu as corrigé par toi même, c'est bien. (write-line "(my_replace_text "E318" "D214")" fscr) C'est presque ça, il faut mettre le caractère \ devant certain guillemet pour les écrire comme il faut dans le script.Sans tester, ça doit être proche de ceci:(write-line "(my_replace_text \"E318\" \"D214\")" fscr) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
serge77 Posté(e) le 18 février 2013 Posté(e) le 18 février 2013 J'ai trouvé, Encore une histoire de \ avant les guillemets. Merci Merci Bonuscad, J'avais pas vu ton poste, du coup j'ai cherché et trouvé, ça marche très bien.Je vais gagner deux jours de boulot de m....Cool Merci, ce bout de programme va me resservir à coup sur.
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