Renommer blocs AutoCAD par attribut : LISP pour préfixer automatiquement

Je cherche à créer une macro ou un code LISP pour renommer tous les blocs de mon dessin AutoCAD. Je souhaite utiliser la valeur d’un attribut spécifique (par exemple, le ‹ Numéro de Plan › de l’attribut ‹ REFERENCE › dans mon bloc ‹ CARTOUCHE ›) comme préfixe pour tous les noms de blocs existants.

L’automatisation du renommage de vos blocs AutoCAD, en utilisant la valeur d’un attribut comme préfixe, est tout à fait réalisable grâce à une routine LISP. Cette méthode permet de récupérer dynamiquement la valeur de l’attribut désiré et de l’appliquer comme préfixe à tous les blocs du dessin.

Voici la procédure pour mettre en place cette automatisation :

  1. Créer le fichier LISP : Ouvrez un éditeur de texte (comme le Bloc-notes) et copiez le code LISP ci-dessous.
  2. Enregistrer le fichier : Enregistrez le fichier avec une extension .lsp (par exemple, RenommerBlocsParRef.lsp) dans un dossier accessible par AutoCAD (idéalement, un dossier inclus dans les Chemins de recherche des fichiers de support).
  3. Charger la routine LISP : Dans AutoCAD, utilisez la commande APPLOAD (ou _APPLOAD). Naviguez jusqu’à votre fichier .lsp et chargez-le. Pour un chargement automatique à chaque démarrage, ajoutez-le au Jeu de démarrage.
  4. Exécuter la commande : Une fois le LISP chargé, tapez RenommerBlocsParRef (le nom de la fonction c:RenommerBlocsParRef sans le c:) dans la ligne de commande et appuyez sur Entrée.
  5. Sélectionner l’attribut : Le programme vous demandera de sélectionner un attribut du bloc cartouche. Cliquez sur l’attribut dont le Tag est ‹ REFERENCE › et dont la valeur correspond au numéro de plan.
;; Auteur: Olivier Eckmann (adapté)
(defun c:RenommerBlocsParRef (/ ent obj refval)
  (vl-load-com)
  (princ "\nSélectionnez un attribut du bloc cartouche (tag 'REFERENCE')...")
  (if (setq ent (car (entsel)))
    (progn
      (setq obj (vlax-ename->vla-object ent))
      (if (and (eq (vla-get-objectname obj) "AcDbAttribute")
               (eq (strcase (vla-get-tagstring obj)) "REFERENCE")) ; Vérifie le tag en ignorant la casse
        (progn
          (setq refval (vla-get-textstring obj))
          (if (not (vl-string-emptyp refval))
            (progn
              (princ (strcat "\nValeur de référence trouvée : " refval))
              (command "-renommer" "bloc" "*" (strcat refval "-*")) ; Renomme tous les blocs
              (princ (strcat "\nBlocs renommés avec le préfixe : " refval))
            )
            (princ "\nLa valeur de l'attribut REFERENCE est vide.")
          )
        )
        (princ "\nL'objet sélectionné n'est pas un attribut 'REFERENCE'.")
      )
    )
    (princ "\nAucun objet sélectionné.")
  )
  (princ)
)

Points d’attention et améliorations :

  • Sensibilité à la casse : Assurez-vous que le nom du bloc ‹ CARTOUCHE › et le tag de l’attribut ‹ REFERENCE › dans votre dessin correspondent exactement (majuscules/minuscules) à ce qui est attendu par le code, ou utilisez strcase comme dans l’exemple pour ignorer la casse.
  • Renommage du bloc source : La commande _RENAME avec un astérisque (*) renommera tous les blocs, y compris potentiellement le bloc ‹ CARTOUCHE › lui-même. Si vous ne souhaitez pas que le bloc ‹ CARTOUCHE › soit renommé, il faudrait modifier la routine LISP pour exclure spécifiquement ce bloc du renommage, ou renommer tous les blocs sauf le cartouche, puis renommer le cartouche avec un nom spécifique si nécessaire.
  • Autres objets : Pour renommer d’autres types d’objets (comme les styles de cote), il faudrait ajouter des lignes (command "-renommer" "dimstyle" ...) supplémentaires dans le LISP, en prenant soin de l’ordre d’exécution si des dépendances existent.