Lucas DE AMORIM Posté(e) le 24 octobre 2023 Posté(e) le 24 octobre 2023 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
(gile) Posté(e) le 24 octobre 2023 Posté(e) le 24 octobre 2023 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
Luna Posté(e) le 24 octobre 2023 Posté(e) le 24 octobre 2023 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
Lucas DE AMORIM Posté(e) le 31 octobre 2023 Auteur Posté(e) le 31 octobre 2023 Merci beaucoup pour vos réponses ! J'avais également un problème au niveau de la selection "MTEXT" que j'écrivais "TEXTMULT". @Luna effectivement il est plus confortable d'avoir un suivi pendant l'éxecution du LISP c'est une très bonne idée. Encore merci !
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