Aller au contenu

Comment changer du texte dans un bloc avec des attributs


comurhex

Messages recommandés

Voila mon probleme ... Suite à un changement de procedure dans la numerotation de nos plans.

 

J'ai une centaine de PID à modifier au niveau des entrée/sortie de ceux-ci.

Ces E/S sont composée de 2 blocs différents (un bloc entrée, un bloc sortie) ... qui sont eux même composés d'attributs dont les valeurs de certains sont à modifié (N°PID et Va/Vers)

 

Comment le faire de maniere automatisée (sans passer par find et sa célebre boite de dialogue)

 

Merci par avance à ceux ou celles qui me repondrons

 

PS: travaillons encore et toujours dans l'urgence ... comme beaucoup

 

PS Bis : je suis sous Autocad 2005 et "limité" dans ma connaissances du Lisp ou autre ;-)[Edité le 6/8/2008 par comurhex]

 

 

Explication:

 

J'ai un vulgaire bloc composé de lignes et d'attributs visibles et invisibles.

 

Ces blocs sont insérés et renseignés plusieurs fois dans un dessin et aussi dans plusieurs dessins (qui par conséquent deviennent des "référence de bloc").

 

Ce que j'ai à modifier :

 

Les "valeur" de 2 de ces attributs dans ces "référence de bloc".

 

Construit donc comme suit ... Attribut visible

 

Etiquette: NO_PLAN

Message: xxxxx

Valeur: 00.A.A.000.000

 

Donc la "valeur" 00.A.A.000.000 à remplacé par 00.A.P.A.000.000

 

... Attribut invisible

 

Etiquette: NO_PID_SUITE

Message: xxxxx

Valeur: 00AA000

 

Donc la "valeur" 00AA000 à remplacé par 00APA00

 

La commande « FIND » fonctionne très bien …

 

Rechercher : *A.A*

Remplacer par : *A.P.A*

 

… Mais ouvre une boite de dialogue nécessitant de traiter les plans un par un.

 

J’avais trouvé ceci …

 

(or *tch:old (setq *tch:old ""))

(or *tch:new (setq *tch:new ""))

(defun c:tch (/ o n)

(setq o (getstring (strcat "Replace: <" *tch:old ">: ") t))

(setq n (getstring (strcat "with: <" *tch:new ">: ") t))

(if (= "" o)

(setq o *tch:old)

(setq *tch:old o))

(if (= "" n)

(setq n *tch:new)

(setq *tch:new n))

(ssmap '(lambda (x / old new)

(setq old (cdr (assoc 1 (entget x))))

(setq new (vl-string-subst n o old))

(entmod (subst (cons 1 new) (cons 1 old) (entget x))))

(ssget "_X" '((0 . "ACAD_TABLE,INSERT,*TEXT")))))

(defun sslist (ss / n lst)

(if (= 'PICKSET (type ss))

(repeat (setq n (sslength ss)) (setq lst (cons (ssname ss (setq n (1- n))) lst)))))

(defun ssmap (fct ss) (mapcar fct (sslist ss)))

 

… qui fonctionne très bien sur des textes simple, mais pas sur ma problématique.

 

J’ai bien évidemment testé un certain nombre de routine de « Patrick 35 », mais celles-ci ne répondent pas à ma question.

 

Merci à tous

 

 

[Edité le 7/8/2008 par comurhex]

Lien vers le commentaire
Partager sur d’autres sites

Explication:

 

J'ai un vulgaire bloc composé de lignes et d'attributs visibles et invisibles.

 

Ces blocs sont insérés et renseignés plusieurs fois dans un dessin et aussi dans plusieurs dessins (qui par conséquent deviennent des "référence de bloc").

 

Ce que j'ai à modifier :

 

Les "valeur" de 2 de ces attributs dans ces "référence de bloc".

 

Construit donc comme suit ... Attribut visible

 

Etiquette: NO_PLAN

Message: xxxxx

Valeur: 00.A.A.000.000

 

Donc la "valeur" 00.A.A.000.000 à remplacé par 00.A.P.A.000.000

 

... Attribut invisible

 

Etiquette: NO_PID_SUITE

Message: xxxxx

Valeur: 00AA000

 

Donc la "valeur" 00AA000 à remplacé par 00APA00

 

La commande « FIND » fonctionne très bien …

 

Rechercher : *A.A*

Remplacer par : *A.P.A*

 

… Mais ouvre une boite de dialogue nécessitant de traiter les plans un par un.

 

J’avais trouvé ceci …

 

(or *tch:old (setq *tch:old ""))

(or *tch:new (setq *tch:new ""))

(defun c:tch (/ o n)

(setq o (getstring (strcat "Replace: <" *tch:old ">: ") t))

(setq n (getstring (strcat "with: <" *tch:new ">: ") t))

(if (= "" o)

(setq o *tch:old)

(setq *tch:old o))

(if (= "" n)

(setq n *tch:new)

(setq *tch:new n))

(ssmap '(lambda (x / old new)

(setq old (cdr (assoc 1 (entget x))))

(setq new (vl-string-subst n o old))

(entmod (subst (cons 1 new) (cons 1 old) (entget x))))

(ssget "_X" '((0 . "ACAD_TABLE,INSERT,*TEXT")))))

(defun sslist (ss / n lst)

(if (= 'PICKSET (type ss))

(repeat (setq n (sslength ss)) (setq lst (cons (ssname ss (setq n (1- n))) lst)))))

(defun ssmap (fct ss) (mapcar fct (sslist ss)))

 

… qui fonctionne très bien sur des textes simple, mais pas sur ma problématique.

 

J’ai bien évidemment testé un certain nombre de routine de « Patrick 35 », mais celles-ci ne répondent pas à ma question.

 

Merci à tous

 

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

J’ai bien évidemment testé un certain nombre de routine de « Patrick 35 », mais celles-ci ne répondent pas à ma question.

As-tu bien regardé le lisp MAT. Tu peux sélectionner une partie du dessin.

 

@+

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

J’ai trouvé "une" solution … un fichier lisp nommé REPSTRING.LSP

Trouvé grace au forum de http://www.cadtutor.net

 

Un Script …

 

[surligneur] _Open X:\...\01apa001.dwg (load "X:/…/FindAndReplace.lsp") FindAndReplace _Qsave

_Open X:\...\01apa002.dwg (load "X:/…/FindAndReplace.lsp") FindAndReplace _Qsave[/surligneur]

Etc …

 

J’ai créé un lisp pour automatiser les modifications sur ma centaine de plan

 

 

[surligneur] (defun c:FindAndReplace ()

(RepString "A.A" "A.P.A")

(RepString "AA" "APA")

) ; defun

(princ "\n==> FindAndReplace")

(princ)[/surligneur]

 

Le lisp proprement dit :

 

[surligneur] (defun repstring (ostring nstring)

(setq ss (ssget "X" (list (cons 0 "INSERT,TEXT,MTEXT,RTEXT,DTEXT,DIMENSION"))))

(if ss

(progn

(repeat (sslength ss)

(setq ent (ssname ss 0))

(setq en (entget ent))

(setq etype (cdr (Assoc 0 en)))

(if (= etype "INSERT")

(PROGN

(IF (ASSOC 66 EN)

(PROGN

(SETQ SUB1 (ENTNEXT ENT))

(WHILE (= (CDR (ASSOC 0 (ENTGET SUB1))) "ATTRIB")

(SETQ SUBEN (ENTGET SUB1))

(SETQ STG (CDR (aSSOC 1 SUBEN)))

(SETQ STG (vl-string-subst NSTRING OSTRING STG))

(ENTMOD (sUBST (cONS 1 STG) (aSSOC 1 SUBEN) SUBEN))

(SETQ SUB1 (eNTNEXT SUB1))

)

(ENTUPD ENT)

)

)

)

(PROGN

(SETQ STG (CDR (aSSOC 1 EN)))

(SETQ STG (vl-string-subst NSTRING OSTRING STG))

(ENTMOD (SUBST (CONS 1 STG) (ASSOC 1 EN) EN))

)

)

 

 

(ssdel ent ss)

)

)

)

)

 

 

(defun c:repstring ()

(SETQ OSTRING (GETSTRING T "\nSTRING TO BE REPLACED: "))

(SETQ NSTRING (GETSTRING T "\nSTRING TO REPLACE WITH: "))

(REPSTRING OSTRING NSTRING)

)[/surligneur]

 

 

Bien evidemment cela serait certainement plus simple à faire mais ça marche.

Un peu plus de 3mn pour traiter une centaine de plan …

 

 

PS Concernant "Mat.lsp" ... a prioris la commande rechercher d'autocad est au moins tout aussi rapide à utiliser pour le cas qui me concernais. Sauf que je voulais automatiser la routine.

 

 

[Edité le 8/8/2008 par comurhex]

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é