Aller au contenu

Messages recommandés

Posté(e)

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 pas

ou 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 ;)

 

 

 

Posté(e)

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]

  • 3 semaines après...
Posté(e)

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 blocs

par 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]

  • 2 semaines après...
Posté(e)

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...... :(

 

 

Posté(e)

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

  • 1 an après...
Posté(e)

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

  • 1 an après...
Posté(e)

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

Posté(e)

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

Posté(e)

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.

Posté(e)

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.

Posté(e)
J'ai inversé nouveau texte et ancien texte

Oui, 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

Posté(e)

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.

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é