AutoCAD: Convertir les noms de matériaux RGB en couleurs d'objets

Comment convertir les noms de matériaux d’objets 3D (importés via STEP/Inventor) qui sont des chaînes de caractères représentant des valeurs RGB (ex: « 012,345,678 » ou « 012_345_678 ») en véritables couleurs True Color (RGB) forcées sur les objets dans AutoCAD ?

Lors de l’importation de modèles 3D depuis des formats comme STEP (souvent via Inventor) dans AutoCAD, il est fréquent que les informations de couleur soient perdues ou transformées en noms de matériaux textuels. Ces noms de matériaux peuvent alors contenir les valeurs RGB sous forme de chaînes de caractères (ex: « R,G,B » ou « R_G_B »). Pour visualiser correctement ces objets avec leurs couleurs d’origine, il est nécessaire de convertir ces noms de matériaux en propriétés de couleur True Color directement sur les objets.

Voici une solution LISP pour automatiser ce processus :

1. Comprendre le Problème et la Logique LISP

Le LISP va parcourir les objets sélectionnés, extraire la chaîne de caractères du nom de leur matériau, tenter de la décomposer en trois valeurs numériques (Rouge, Vert, Bleu), puis appliquer ces valeurs comme couleur True Color à l’objet. Le code est conçu pour gérer les séparateurs courants (virgule ou underscore) et pour traiter plusieurs objets simultanément.

2. Le Code LISP Corrigé et Amélioré

Ce code inclut des améliorations pour la sélection multiple, la gestion des séparateurs (virgule ou underscore) et la robustesse.

;; gc:str2lst - Auteur : Tramber
;; Transforme une chaîne avec séparateur en liste de chaînes.
;; Arguments:
;;   str : la chaîne à traiter
;;   sep : le séparateur (ex: "," ou "_")
(defun gc:str2lst (str sep / len lst pos)
  (setq len (strlen sep))
  (while (setq pos (vl-string-search sep str))
    (setq lst (cons (substr str 1 pos) lst)
          str (substr str (+ len pos 1))
    )
  )
  (reverse (cons str lst))
)

(defun c:M2RGB ()
  (vl-load-com) ; Charge les fonctions ActiveX/COM si ce n'est pas déjà fait

  (princ "\nSélectionnez un ou plusieurs objets pour convertir leurs matériaux en couleurs RGB...")
  (if (setq ss (ssget)) ; Permet la sélection de plusieurs objets
    (progn
      (setq i 0)
      (while (< i (sslength ss))
        (setq ent (ssname ss i)
              truc (vlax-ename->vla-object ent)
        )
        (if (and truc (vlax-property-available-p truc 'Material)) ; Vérifie si l'objet a une propriété Matériau
          (let ((mat (vla-get-Material truc))
                (listervb nil))
            (cond
              ((member mat '("ByLayer" "ByBlock" "Global"))) ; Ignore les matériaux standards
              (t
                ;; Tente de séparer par underscore d'abord
                (setq listervb (gc:str2lst mat "_"))
                (if (/= (length listervb) 3)
                  ;; Si pas 3 parties, tente de séparer par virgule
                  (setq listervb (gc:str2lst mat ","))
                )

                (if (= (length listervb) 3)
                  (vl-catch-all-apply
                    (function
                      (lambda ( / c )
                        (and
                          (setq c (vla-get-TrueColor truc)) ; Récupère l'objet TrueColor de l'entité
                          (progn
                            (vla-put-ColorMethod c acColorMethodByRGB) ; Définit la méthode de couleur sur RGB
                            ;; Convertit la liste de chaînes en liste d'entiers pour les valeurs RGB
                            (apply 'vla-SetRGB (cons c (mapcar 'read listervb)))
                            (vla-put-TrueColor truc c) ; Applique l'objet TrueColor modifié à l'entité
                          )
                        )
                      )
                    )
                  )
                  (princ (strcat "\nAttention: Matériau '" mat "' de l'objet (Handle: " (vlax-get-property truc 'Handle) ") n'a pas pu être converti (format RGB non reconnu). \nAssurez-vous qu'il est au format 'R_G_B' ou 'R,G,B'."))
                )
              )
            )
          )
        )
        (setq i (1+ i))
      )
      (princ "\nConversion des matériaux en couleurs RGB terminée.")
    )
    (princ "\nAucun objet sélectionné.")
  )
  (princ)
)

3. Étapes d’Utilisation du LISP

  1. Charger le LISP : Enregistrez le code ci-dessus dans un fichier .lsp (par exemple, M2RGB.lsp). Utilisez la commande APPLOAD dans AutoCAD pour charger ce fichier.
  2. Lancer la Commande : Tapez M2RGB dans la ligne de commande d’AutoCAD et appuyez sur Entrée.
  3. Sélectionner les Objets : Suivez les invites pour sélectionner les objets 3D dont vous souhaitez convertir les matériaux. Vous pouvez sélectionner un ou plusieurs objets.
  4. Vérifier le Résultat : Les objets sélectionnés devraient maintenant afficher les couleurs correspondant aux valeurs RGB de leurs noms de matériaux.

4. Bonnes Pratiques et Considérations

  • Format des Noms de Matériaux : Le LISP est conçu pour gérer les formats R_G_B et R,G,B. Si vos noms de matériaux utilisent un autre séparateur ou un format différent, le LISP devra être adapté.
  • Objets Supportés : Ce LISP fonctionne avec les objets qui ont une propriété Material accessible via l’API ActiveX (VLA-Objects). Cela inclut la plupart des solides 3D et maillages.
  • Performance : Pour un très grand nombre d’objets, le traitement peut prendre un certain temps. Il est conseillé de sauvegarder votre dessin avant d’exécuter le LISP.
  • Gestion des Erreurs : Le vl-catch-all-apply permet de gérer les erreurs potentielles lors de la modification des propriétés de couleur, et des messages sont affichés pour les matériaux non convertis.
  • Matériaux Standards : Les matériaux comme « ByLayer », « ByBlock » ou « Global » sont ignorés par le LISP, car ils ne représentent pas des valeurs RGB directes à convertir.