Communauté
AutoCAD – tous produits - Français
Bienvenue sur les forums AutoCAD d’Autodesk. Partagez vos connaissances, posez des questions, et explorez les sujets AutoCAD populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

AutoCAD : Rechercher et remplacer des textes, dans: des Champs de texte des textmult et des valeurs d' attributs de blocs

4 RÉPONSES 4
RÉSOLU
Répondre
Message 1 sur 5
gricatti
313 Visites, 4 Réponses

AutoCAD : Rechercher et remplacer des textes, dans: des Champs de texte des textmult et des valeurs d' attributs de blocs

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

4 RÉPONSES 4
Message 2 sur 5
Kent1Cooper
en réponse à: gricatti

 Does FIND not do what you want?

Kent1Cooper_0-1687454835383.png

 

Kent Cooper, AIA
Message 3 sur 5
Y.AUBRY
en réponse à: gricatti

Bonjour @gricatti,

 

Regarde ce sujet qui pourra surement t'aider dans ta démarche

https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/pre-defined-find-amp-replace-lisp-fo...

 

A+ Yoan

Yoan AUBRY

EESignature

Message 4 sur 5
gricatti
en réponse à: Kent1Cooper

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.

Message 5 sur 5
gricatti
en réponse à: Y.AUBRY

 

 

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.

Publier dans les forums  

Autodesk Design & Make Report