comurhex Posté(e) le 6 août 2008 Posté(e) le 6 août 2008 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_PLANMessage: xxxxxValeur: 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_SUITEMessage: xxxxxValeur: 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]
lili2006 Posté(e) le 6 août 2008 Posté(e) le 6 août 2008 Bonjour à toutes et tous, Bienvenue comurhex, Je ne suis pas sur d'avoir bien compris ta demande, mais tu peux toujours tester rech de Patrick_35,... Un peu d'explications ici,... Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
lecrabe Posté(e) le 6 août 2008 Posté(e) le 6 août 2008 Hello Je n'ai pas tout compris mais je penche plutot pour la routine MAT de Patrick_35 ! Le Decapode Autodesk Expert Elite Team
comurhex Posté(e) le 7 août 2008 Auteur Posté(e) le 7 août 2008 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_PLANMessage: xxxxxValeur: 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_SUITEMessage: xxxxxValeur: 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
Patrick_35 Posté(e) le 7 août 2008 Posté(e) le 7 août 2008 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
comurhex Posté(e) le 8 août 2008 Auteur Posté(e) le 8 août 2008 J’ai trouvé "une" solution … un fichier lisp nommé REPSTRING.LSPTrouvé 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]
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