Pour faire suite à un autre sujet, j'expose ma problématique.
J'ai fait une demande d'aide pour la "recherche et remplace" de textes dans autocad + insertion d'un nuage de révision autour des textes mmodifiés. Je livrerai le code ci dessous qui fonctionne très bien.
Ce nouveau sujet complète cela par: Rechercher et remplacer des textes contenus dans des textmult et dans des valeurs d'attributs de blocs.
Pour m'expliquer, je reprend des plans autocad qui ont étés montés de façon disparate. Je me retrouve donc à devoir modifier des textes qui sont soit dans des "textes", soit dans des "textemult" soit en "valeur d'attributs" de blocs.
Le code ci dessous fonctionne pour des "textes", mais pas pour les "textemult" ni si ils sont des "valeurs d'attributs".
Ma question, sauriez vous m'aiguiller pour que le code ci dessous puisse aussi intégrer ses deux autres cas de figure?
(defun c:batch_gricatti (/ work_directory
document_to_process
modelspace_collection
height llc
ruc revcloud_object)
(setq work_directory
(strcat
(acet-ui-pickdir
"Pick directory to process"
"C:\\Users\\gricatti\\DOCS\\01-PRODUCTION\\M428-429 - PA 4780 DK 119070_H\PA 4780 DK 119070_I\\SCRIPT-070")
"\\"))
(setq find_replace_assoc_list
'(("JT01" "ZVJT31")
("DJ01" "ZVDJ52")
("DJ03" "ZVDJ51")
("VALEUR X" "VALEUR Y")
))
(foreach dwg_file (vl-directory-files work_directory "*.dwg" 1)
(princ (strcat "\nDocument \""
(strcat work_directory dwg_file)
"\" opened"))
(setq document_to_process
(vla-open (vla-get-documents
(vlax-get-acad-object))
(strcat work_directory dwg_file))
modelspace_collection
(vla-get-modelspace
(vla-get-database document_to_process))
string_to_replace_found
nil
)
(vlax-map-collection
modelspace_collection
'(lambda (object)
(cond
(
(and (= "AcDbText" (vla-get-objectname object))
(assoc (vla-get-textstring object)
find_replace_assoc_list)
)
(if (null string_to_replace_found)
(setq string_to_replace_found t))
(vla-put-textstring
object
(cadr (assoc (vla-get-textstring object)
find_replace_assoc_list)))
(vla-getboundingbox object 'llc 'ruc)
(setq height (vla-get-height object))
(setq llc (mapcar '-
(vlax-safearray->list llc)
(list height height))
ruc (mapcar '+
(vlax-safearray->list ruc)
(list height height))
)
(initcommandversion)
(command "_revcloud"
"_a"
(* 0.2 (- (car ruc) (car llc)))
llc
ruc)
(vla-put-color
(setq revcloud_object
(vlax-ename->vla-object (entlast)))
1)
(vlax-invoke
(vla-get-database
(vla-get-activedocument (vlax-get-acad-object)))
'copyobjects
(list revcloud_object)
(vla-get-modelspace document_to_process)
)
(vla-erase revcloud_object)
)
(
t
)
)
)
)
(if string_to_replace_found
(vla-save document_to_process))
(vla-close document_to_process)
(princ (strcat "\nDocument\""
(strcat work_directory dwg_file)
"\" closed\n"))
)
(princ)
)
Le titre du sujet a été modifié par un modérateur pour faciliter la recherche. Titre original:
Rechercher et remplacer des textes, dans: des Champs de texte des textmult et des valeurs d' attributs de blocs
Résolu ! Accéder à la solution.
Résolu par Y.AUBRY. Accéder à la solution.
Bonjour, merci pour l'info, oui cela fonctionnerait, mais je souhaites automatiser pour traiter près de 2000 fichiers. Je souhaite qu'il soit intégré à la routine précédemment donnée dans mon premier post. Merci pour votre réponse dans tous les cas.
Super, merci, ne sachant pas coder, j'ai demandé à CHATGPT de réaliser un code à partir du premier qui intègrerait celui donné par vos soins. Cela ne fonctionne pas, sauriez vous m'aiguiller pour que cela fonctionne?
voici ce que ca donne:
(defun c:batch_gricatti ()
(setq os "issued for tender" ; Ancienne chaîne de caractères
ns "issued for construction" ; Nouvelle chaîne de caractères
osp (strcat "*" os "*") ; Modèle de recherche
work_directory (acet-ui-pickdir "Pick directory to process" "C:\\Users\\gricatti\\DOCS\\01-PRODUCTION\\M428-429 - PA 4780 DK 119070_H\\PA 4780 DK 119070_I\\SCRIPT-070")
find_replace_assoc_list '(("JT01" "ZVJT31") ("DJ01" "ZVDJ52") ("DJ03" "ZVDJ51")))
(defun replace-text (object find replace)
(vla-put-textstring object (vl-string-subst replace find (vla-get-textstring object))))
(defun process-attributes (attributes find replace)
(vlax-for att attributes
(setq ts (vla-get-textstring att))
(if (wcmatch ts find)
(replace-text att find replace))))
(defun add-revision-cloud (object)
(vla-getboundingbox object 'llc 'ruc)
(setq height (vla-get-height object))
(setq llc (mapcar '- (vlax-safearray->list llc) (list height height))
ruc (mapcar '+ (vlax-safearray->list ruc) (list height height)))
(initcommandversion)
(command "_revcloud" "_a" (* 0.2 (- (car ruc) (car llc))) llc ruc)
(vla-put-color (setq revcloud_object (vlax-ename->vla-object (entlast))) 1)
(vlax-invoke (vla-get-database (vla-get-activedocument (vlax-get-acad-object))) 'copyobjects (list revcloud_object) (vla-get-modelspace document_to_process))
(vla-erase revcloud_object))
(defun process-objects (objects)
(vlax-for obj objects
(cond
((= (vla-get-objectname obj) "AcDbText")
(setq ts (vla-get-textstring obj))
(if (wcmatch ts osp)
(progn
(replace-text obj os ns)
(add-revision-cloud obj))))
((= (vla-get-objectname obj) "AcDbMText")
(setq ts (vla-get-textstring obj))
(if (wcmatch ts osp)
(progn
(replace-text obj os ns)
(add-revision-cloud obj))))
((= (vla-get-objectname obj) "AcDbBlockReference")
(setq attributes (vlax-invoke obj 'getattributes))
(process-attributes attributes os ns)
(add-revision-cloud obj))))
)
(foreach dwg_file (vl-directory-files work_directory "*.dwg" 1)
(princ (strcat "\nDocument \"" (strcat work_directory dwg_file) "\" opened"))
(setq document_to_process (vla-open (vla-get-documents (vlax-get-acad-object)) (strcat work_directory dwg_file)))
(setq modelspace_collection (vla-get-modelspace (vla-get-database document_to_process)))
(vlax-for obj modelspace_collection
(process-objects (list obj)))
(vla-save document_to_process)
(vla-close document_to_process)
(princ (strcat "\nDocument \"" (strcat work_directory dwg_file) "\" closed\n")))
(princ))
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.