Aller au contenu

Modifier simultanément des TextMult sur l'ensemble d'un projet


Lucas DE AMORIM

Messages recommandés

Bonjour,

Je vais vous donner le contexte. Aujourd'hui, je dois mettre à jour des plans réalisés par un autre bureau d'études. J'utilise la version 2021 d'AutoCAD.

Étant habitué à travailler avec des blocs et des attributs, j'utilise les commandes ATTOUT et ATTIN pour extraire, intégrer et mettre à jour mes données.

Je me trouve aujourd'hui confronté à l'implantation d'une grande quantité d'objets nommés avec des TextMult totalement détachés. Selon un document Excel, je dois renommer chacun de ces textes en suivant une nouvelle codification. Au cas par cas, la fonction "RECHERCHER" n'est donc pas viable, vu la quantité de textes à mettre à jour.

Je recherche donc un programme en LISP capable de mettre à jour tous les textes de mon fichier en se référant à une liste d'anciens et de nouveaux noms.

Voici où j'en suis dans mes recherches :

(defun c:UpdateCameraNamesTest ()
  (setq oldNewNames
        '(("CAM-3-01" . "CAM-SAS-N3-01")
          ("CAM-3-02" . "CAM-SAS-N3-02")
          ("CAM-3-03" . "CAM-UVL-N3-03")
          ("CAM-3-04" . "CAM-SAS-N3-04")
          ("CAM-3-05" . "CAM-PRP-N3-05")
          ("CAM-3-06" . "CAM-DJT-N3-06")
          ("CAM-3-07" . "CAM-UHR-N3-07")
          ("CAM-3-08" . "CAM-PAL-N3-08")
          ("CAM-3-09" . "CAM-PAL-N3-09")
          ; Ajoutez d'autres correspondances ici
        )
  )
 
  (vl-load-com)
  (setq ss (ssget "_M"))
 
  (if ss
    (progn
      (setq i 0)
      (while (< i (sslength ss))
        (setq text (vlax-ename->vla-object (ssname ss i)))
        (setq oldText (vla-get-textstring text))
        (setq newText (assoc oldText oldNewNames))
        (if newText
          (vla-put-textstring text (cdr newText))
        )
        (setq i (1+ i))
      )
    )
  )
 
  (princ "Mise à jour des noms des caméras effectuée.")
)

Une fois le programme chargé dans mon fichier, je le lance, et un message s'affiche : "Mise à jour des noms des caméras effectuée", m'assurant ainsi que le LISP a effectué son travail. Cependant, aucun texte n'a été modifié.

J'ai l'impression qu'il y a un problème lors de la phase de sélection, et que les critères ne tiennent pas compte des textes dont j'ai besoin. C'est pourquoi aucun texte correspondant à ceux de ma liste n'est trouvé, et le LISP se termine. Malheureusement, malgré mes efforts pour résoudre le problème, je n'arrive pas à atteindre mon objectif.

J'espère avoir été clair dans ma description. J'espère également qu'une personne pourra m'aider et que ce post sera utile à d'autres à l'avenir.

Cordialement,

Lucas

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Quelques petites remarques :
Il est toujours préférable de déclarer localement les variables.
Tu devrais utiliser un filtre de sélection.

Par ailleurs, depuis AutoCAD 2012, je préfère utiliser les fonctions getpropertyvalue et setpropertyvalue plutôt que les fonctions vla-get et vla-set (ainsi le code est compatible avec AutoCAD MAC (voir aussi la fonction dumpallproperties).

(defun c:UpdateCameraNamesTest (/ oldNewNames ss i mtext pair)
  (setq	oldNewNames
	 '(("CAM-3-01" . "CAM-SAS-N3-01")
	   ("CAM-3-02" . "CAM-SAS-N3-02")
	   ("CAM-3-03" . "CAM-UVL-N3-03")
	   ("CAM-3-04" . "CAM-SAS-N3-04")
	   ("CAM-3-05" . "CAM-PRP-N3-05")
	   ("CAM-3-06" . "CAM-DJT-N3-06")
	   ("CAM-3-07" . "CAM-UHR-N3-07")
	   ("CAM-3-08" . "CAM-PAL-N3-08")
	   ("CAM-3-09" . "CAM-PAL-N3-09")
	   ;; Ajoutez d'autres correspondances ici
	  )
  )
  (if (setq ss (ssget "_X" '((0 . "MTEXT"))))
    (repeat (setq i (sslength ss))
      (setq mtext (ssname ss (setq i (1- i))))
      (if (setq pair (assoc (getpropertyvalue mtext "Text") oldNewNames))
	(setpropertyvalue mtext "Contents" (cdr pair))
      )
    )
  )
  (princ "Mise à jour des noms des caméras effectuée.")
  (princ)
)

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

J'allais répondre mais apparemment @(gile) a été plus rapide..
Donc juste une petite remarque sans importance : personnellement je préfère insérer les messages d'exécution réussie dans la condition VRAI de la fonction conditionnelle associée. Ainsi le message s'affiche uniquement si modification il y a eut. Et voir même dénombrer le nombre de mises à jour effectuées par rapport au nombre d'objets sélectionnés ou bien créer un jeu de sélection avec uniquement les objets modifiés afin de le rendre actif à la fin de la commande.

Bref, c'est juste du détails sans importance et c'est juste du confort d'utilisation on va dire 🙂

Bisous,
Luna

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é