# Comment changer le style d'une multiligne

**URL:** https://dessein-tech.com/t/comment-changer-le-style-dune-multiligne/10941
**Category:** AutoCAD support
**Tags:** lisp, programmation
**Created:** 2026-07-17T11:46:30Z
**Posts:** 4

## Post 1 by @cedric — 2026-07-17T11:46:30Z

Bonjour,  
sur autocad 2025, je dessine une multiligne. J’essaie de changer son style dans le menu propriété de la multiligne dessinée, et c’est grisé, je ne peux pas modifier.  
Quelqu’un a une explication et une astuce pour changer le style des multilignes déjà dessinées?  
Merci d’avance.

---

## Post 2 by @Patrick — 2026-07-17T14:22:08Z

Bonjour @cedric pourriez vous joindre le dessin où vous avez le problème ?

---

## Post 3 by @Patrick — 2026-07-17T14:49:00Z

> [@cedric](#):
>
> Bonjour,  
> sur autocad 2025, je dessine une multiligne. J’essaie de changer son style dans le menu propriété de la multiligne dessinée, et c’est grisé, je ne peux pas modifier.  
> Quelqu’un a une explication et une astuce pour changer le style des multilignes déjà dessinées?  
> Merci d’avance.

C’est un grand classique d’AutoCAD qui frustre les utilisateurs depuis des années.

### Pourquoi est-ce grisé ?

Dans AutoCAD, le style d’une multiligne (`MLINE`) est figé dans le marbre dès sa création. Au moment où vous la dessinez, AutoCAD génère et «&nbsp;imbrique&nbsp;» toute la géométrie (les décalages, les couleurs des lignes, les jonctions) directement dans les données de l’objet en se basant sur le style actif. Modifier le style via la palette des propriétés demanderait à AutoCAD de recalculer entièrement cette géométrie interne, ce que l’interface standard ne permet tout simplement pas de faire.

Pour contourner cela sans devoir tout redessiner, l’utilisation de Visual LISP est parfaite : elle force la mise à jour de la propriété `StyleName` et recalcule proprement la géométrie en arrière-plan.

[CHGMLSTYLE.lsp](/uploads/short-url/46b9zduPJOdp6yCASkCOTLzfuTd.lsp) (3,8 Ko)

```
(defun c:CHGMLSTYLE ( / styleName ss i ent dxf pts oldCmlstyle oldCmlscale oldCmljust oldClayer oldOsmode oldCmdecho )
  (vl-load-com)
  
  ;; 1. Demander le nom du nouveau style
  (setq styleName (getstring t "\nEntrez le nom du nouveau style de multiligne : "))
  
  (if (and styleName (/= styleName ""))
    (progn
      ;; Vérification stricte de l'existence du style dans le dictionnaire d'AutoCAD
      (if (not (dictsearch (cdr (assoc -1 (dictsearch (namedobjdict) "ACAD_MLINESTYLE"))) styleName))
        (princ (strcat "\n[Erreur] Le style '" styleName "' n'existe pas dans ce dessin. Créez-le ou chargez-le d'abord."))
        (progn
          ;; 2. Sélection des multilignes
          (princ "\nSélectionnez les multilignes à modifier : ")
          (if (setq ss (ssget '((0 . "MLINE"))))
            (progn
              ;; Sauvegarde complète de l'environnement de l'utilisateur
              (setq oldCmlstyle (getvar "CMLSTYLE")
                    oldCmlscale (getvar "CMLSCALE")
                    oldCmljust (getvar "CMLJUST")
                    oldClayer (getvar "CLAYER")
                    oldOsmode (getvar "OSMODE")
                    oldCmdecho (getvar "CMDECHO")
              )
              
              ;; Paramétrage temporaire pour éviter les interférences
              (setvar "CMDECHO" 0)
              (setvar "OSMODE" 0) ;; Coupe les accrochages pour que les points soient exacts
              (setvar "CMLSTYLE" styleName)
              
              (setq i 0)
              ;; 3. Boucle de reconstruction
              (while (< i (sslength ss))
                (setq ent (ssname ss i))
                (setq dxf (entget ent))
                
                ;; Extraction de tous les sommets (code DXF 11) et conversion SCG -> SCU
                (setq pts nil)
                (foreach item dxf
                  (if (= (car item) 11)
                    (setq pts (cons (trans (cdr item) 0 1) pts))
                  )
                )
                (setq pts (reverse pts))
                
                ;; Aligner les variables sur l'ancienne multiligne pour la copie
                (setvar "CMLSCALE" (cdr (assoc 40 dxf)))
                (setvar "CMLJUST" (cdr (assoc 70 dxf)))
                (setvar "CLAYER" (cdr (assoc 8 dxf)))
                
                ;; Simulation de la commande MLINE
                (if (= (logand (cdr (assoc 71 dxf)) 2) 2)
                  (apply 'command (append '("_.mline") pts '("_C"))) ;; Si elle était fermée
                  (apply 'command (append '("_.mline") pts '(""))) ;; Si elle était ouverte
                )
                
                ;; Optionnel : Conserver la couleur forcée si elle n'est pas "DuCalque"
                (if (assoc 62 dxf)
                  (entmod (subst (assoc 62 dxf) (assoc 62 (entget (entlast))) (entget (entlast))))
                )
                
                ;; Suppression de l'original
                (entdel ent)
                
                (setq i (1+ i))
              )
              
              ;; Restauration parfaite de l'environnement utilisateur
              (setvar "CMLSTYLE" oldCmlstyle)
              (setvar "CMLSCALE" oldCmlscale)
              (setvar "CMLJUST" oldCmljust)
              (setvar "CLAYER" oldClayer)
              (setvar "OSMODE" oldOsmode)
              (setvar "CMDECHO" oldCmdecho)
              
              (princ (strcat "\nOpération réussie. " (itoa (sslength ss)) " multiligne(s) recréée(s) avec le style '" styleName "'."))
            )
            (princ "\nAucune multiligne sélectionnée.")
          )
        )
      )
    )
    (princ "\nAucun nom de style saisi.")
  )
  (princ)
)

(princ "\nRoutine CHGMLSTYLE (V3) chargée. Tapez CHGMLSTYLE pour l'exécuter.")
(princ)
```

---

## Post 4 by @Patrick — 2026-07-17T15:03:15Z

Si vous êtes débutant en AutoLISP voici une version très commentée qui vous permettra de comprendre le code.

```
;; ==============================================================================
;; NOM DE LA COMMANDE : CHGMLSTYLE
;; BUT : Remplacer le style de multilignes existantes par un nouveau style, 
;; tout en conservant leur position, échelle, calque et justification.
;; ==============================================================================

;; 'defun' signifie "Define Function" (Définir une fonction).
;; 'c:' indique à AutoCAD que cette fonction doit être traitée comme une 
;; commande classique que l'on peut taper au clavier.
;; Tout ce qui suit la barre oblique '/' correspond aux "variables locales". 
;; Elles sont temporaires et seront vidées de la mémoire à la fin du programme.
(defun c:CHGMLSTYLE ( / styleName ss i ent dxf pts oldCmlstyle oldCmlscale oldCmljust oldClayer oldOsmode oldCmdecho )
  
  ;; Charge les fonctions étendues "Visual LISP" (qui commencent par vl-, vla-, etc.).
  ;; C'est une bonne pratique de la mettre, même si ce code spécifique utilise surtout de l'AutoLISP classique.
  (vl-load-com)
  
  ;; ----------------------------------------------------------------------------
  ;; ÉTAPE 1 : DEMANDER LE NOM DU NOUVEAU STYLE À L'UTILISATEUR
  ;; ----------------------------------------------------------------------------
  
  ;; 'setq' (Set Quote) est la fonction pour assigner une valeur à une variable.
  ;; 'getstring' demande à l'utilisateur de taper du texte. 
  ;; Le 't' (True/Vrai) autorise l'utilisateur à mettre des espaces dans le nom du style.
  ;; Le texte entre guillemets ("\n...") est le message affiché. \n sert à sauter une ligne dans la console.
  (setq styleName (getstring t "\nEntrez le nom du nouveau style de multiligne : "))
  
  ;; 'if' vérifie une condition. 
  ;; 'and' vérifie que TOUTES les conditions suivantes sont vraies :
  ;; 1. styleName existe (l'utilisateur n'a pas juste fait Echap)
  ;; 2. (/= styleName "") : le nom n'est pas (!= ou /=) une chaîne de texte vide.
  (if (and styleName (/= styleName ""))
    
    ;; 'progn' est essentiel ici. Un 'if' en LISP n'accepte normalement qu'une seule 
    ;; instruction si c'est "Vrai" et une seule si c'est "Faux". 
    ;; 'progn' permet de regrouper plusieurs instructions en un seul bloc.
    (progn
      
      ;; ----------------------------------------------------------------------------
      ;; ÉTAPE 1 BIS : VÉRIFIER SI LE STYLE EXISTE DANS LE DESSIN
      ;; ----------------------------------------------------------------------------
      
      ;; Ici, on fouille dans la base de données interne d'AutoCAD (les dictionnaires).
      ;; 'namedobjdict' accède au dictionnaire principal.
      ;; On y cherche "ACAD_MLINESTYLE" (le registre des styles de multilignes).
      ;; Puis on cherche le nom tapé par l'utilisateur (styleName) à l'intérieur.
      ;; 'not' inverse le résultat : si on ne le trouve PAS, la condition est vraie.
      (if (not (dictsearch (cdr (assoc -1 (dictsearch (namedobjdict) "ACAD_MLINESTYLE"))) styleName))
        
        ;; Si le style n'existe pas : on affiche un message d'erreur avec 'princ'.
        ;; 'strcat' sert à coller (concaténer) plusieurs morceaux de texte ensemble.
        (princ (strcat "\n[Erreur] Le style '" styleName "' n'existe pas dans ce dessin. Créez-le ou chargez-le d'abord."))
        
        ;; Si le style existe, on continue avec un nouveau bloc d'instructions (progn).
        (progn
          
          ;; ----------------------------------------------------------------------------
          ;; ÉTAPE 2 : SÉLECTION DES MULTILIGNES
          ;; ----------------------------------------------------------------------------
          (princ "\nSélectionnez les multilignes à modifier : ")
          
          ;; 'ssget' demande à l'utilisateur de sélectionner des objets à l'écran.
          ;; La liste '((0 . "MLINE")) est un "filtre" : AutoCAD ignorera tout ce 
          ;; qui n'est pas une multiligne (lignes, cercles, textes, etc.).
          ;; Le résultat est stocké dans la variable 'ss' (Selection Set).
          (if (setq ss (ssget '((0 . "MLINE"))))
            (progn
              
              ;; ----------------------------------------------------------------------------
              ;; ÉTAPE 2 BIS : SAUVEGARDE DES PARAMÈTRES DE L'UTILISATEUR
              ;; ----------------------------------------------------------------------------
              ;; Avant de modifier quoi que ce soit, on sauvegarde l'environnement 
              ;; d'AutoCAD en lisant les variables système avec 'getvar'.
              (setq oldCmlstyle (getvar "CMLSTYLE") ;; Style de multiligne par défaut
                    oldCmlscale (getvar "CMLSCALE") ;; Échelle
                    oldCmljust (getvar "CMLJUST") ;; Justification
                    oldClayer (getvar "CLAYER") ;; Calque courant
                    oldOsmode (getvar "OSMODE") ;; Accrochages aux objets (F3)
                    oldCmdecho (getvar "CMDECHO") ;; Affichage des commandes dans la console
              )
              
              ;; 'setvar' modifie les variables système de façon temporaire.
              (setvar "CMDECHO" 0) ;; 0 = Cache le texte des commandes pour ne pas polluer l'écran.
              (setvar "OSMODE" 0) ;; 0 = Désactive les accrochages (important pour que le script clique au millimètre près, sans s'accrocher à un mauvais point).
              (setvar "CMLSTYLE" styleName) ;; On définit le style courant avec celui choisi.
              
              ;; On prépare un compteur (i) qui commence à 0.
              (setq i 0)
              
              ;; ----------------------------------------------------------------------------
              ;; ÉTAPE 3 : LA BOUCLE (TRAITEMENT DE CHAQUE MULTILIGNE SÉLECTIONNÉE)
              ;; ----------------------------------------------------------------------------
              
              ;; 'while' (tant que) tourne en boucle tant que 'i' est inférieur 
              ;; au nombre total d'objets dans la sélection ('sslength ss').
              (while (< i (sslength ss))
                
                ;; 'ssname' extrait l'objet numéro 'i' de la sélection 'ss'.
                ;; 'ent' devient l'identifiant (le nom) de l'entité.
                (setq ent (ssname ss i))
                
                ;; 'entget' récupère TOUTE la définition de l'objet (ses codes DXF).
                ;; Ça ressemble à une longue liste comme : ((0 . "MLINE") (8 . "Calque1") (11 10.0 20.0 0.0) ...)
                (setq dxf (entget ent))
                
                ;; On vide la variable 'pts' (Points) pour la nouvelle multiligne.
                (setq pts nil)
                
                ;; 'foreach' parcourt chaque élément de la liste 'dxf'.
                (foreach item dxf
                  ;; En AutoLISP, les listes associatives utilisent des codes. 
                  ;; Le code 11 correspond aux sommets (les points) d'une multiligne.
                  ;; 'car' lit le premier élément (le code), on vérifie s'il vaut 11.
                  (if (= (car item) 11)
                    ;; Si oui, on extrait les coordonnées (avec 'cdr').
                    ;; 'trans' traduit ces coordonnées du système global (0) au système local (1) 
                    ;; pour éviter les bugs si l'utilisateur a tourné sa vue (SCU).
                    ;; 'cons' ajoute ce point à notre liste 'pts'.
                    (setq pts (cons (trans (cdr item) 0 1) pts))
                  )
                )
                ;; Comme 'cons' empile les points à l'envers, on utilise 'reverse' 
                ;; pour les remettre dans l'ordre de dessin initial.
                (setq pts (reverse pts))
                
                ;; On aligne les variables courantes d'AutoCAD sur les caractéristiques 
                ;; de l'ancienne multiligne qu'on est en train d'analyser (code 40=Échelle, 70=Justification, 8=Calque).
                (setvar "CMLSCALE" (cdr (assoc 40 dxf)))
                (setvar "CMLJUST" (cdr (assoc 70 dxf)))
                (setvar "CLAYER" (cdr (assoc 8 dxf)))
                
                ;; ----------------------------------------------------------------------------
                ;; ÉTAPE 4 : REDESSINER LA NOUVELLE MULTILIGNE
                ;; ----------------------------------------------------------------------------
                
                ;; Le code DXF 71 contient des drapeaux (flags) mathématiques. 
                ;; (logand ... 2) est une opération binaire pour vérifier si la multiligne était fermée (bouclée sur elle-même).
                (if (= (logand (cdr (assoc 71 dxf)) 2) 2)
                  ;; Si elle était fermée, on lance la commande MLINE avec nos points, puis l'option "_C" (Close / Clore).
                  ;; 'apply' et 'append' servent à construire la commande avec notre liste de points variable.
                  (apply 'command (append '("_.mline") pts '("_C"))) 
                  
                  ;; Si elle était ouverte, on lance MLINE, on met les points, puis "" (Entrée) pour terminer.
                  (apply 'command (append '("_.mline") pts '("")))   
                )
                
                ;; Optionnel : Si l'ancienne multiligne avait une couleur "forcée" (différente de "DuCalque", code 62).
                ;; 'assoc' vérifie si ce code 62 existe.
                (if (assoc 62 dxf)
                  ;; Si oui, on modifie ('entmod') la petite dernière entité dessinée ('entlast') 
                  ;; en lui injectant ('subst') la couleur de l'ancienne.
                  (entmod (subst (assoc 62 dxf) (assoc 62 (entget (entlast))) (entget (entlast))))
                )
                
                ;; ----------------------------------------------------------------------------
                ;; ÉTAPE 5 : SUPPRESSION DE L'ANCIENNE MULTILIGNE
                ;; ----------------------------------------------------------------------------
                (entdel ent) ;; 'entdel' supprime l'entité originale de l'espace de dessin.
                
                ;; On ajoute +1 au compteur (i) pour passer à l'objet suivant de la sélection.
                ;; '1+' est un raccourci AutoLISP pour (+ i 1).
                (setq i (1+ i))
              )
              
              ;; ----------------------------------------------------------------------------
              ;; ÉTAPE 6 : RESTAURATION DE L'ENVIRONNEMENT
              ;; ----------------------------------------------------------------------------
              ;; La boucle est finie, on remet AutoCAD dans l'état exact où il 
              ;; était avant que l'utilisateur lance le script. C'est très important pour l'expérience utilisateur !
              (setvar "CMLSTYLE" oldCmlstyle)
              (setvar "CMLSCALE" oldCmlscale)
              (setvar "CMLJUST" oldCmljust)
              (setvar "CLAYER" oldClayer)
              (setvar "OSMODE" oldOsmode)
              (setvar "CMDECHO" oldCmdecho)
              
              ;; On prévient l'utilisateur que tout s'est bien passé.
              ;; 'itoa' convertit un nombre (Integer) en texte (Ascii) pour pouvoir l'afficher.
              (princ (strcat "\nOpération réussie. " (itoa (sslength ss)) " multiligne(s) recréée(s) avec le style '" styleName "'."))
            )
            
            ;; Ce message correspond au cas où la sélection 'ssget' est vide.
            (princ "\nAucune multiligne sélectionnée.")
          )
        )
      )
    )
    
    ;; Ce message correspond au cas où l'utilisateur n'a rien tapé pour le nom du style.
    (princ "\nAucun nom de style saisi.")
  )
  
  ;; Un 'princ' vide à la fin de la fonction permet de "sortir proprement" sans
  ;; qu'AutoCAD n'affiche la dernière valeur calculée dans la console.
  (princ)
)

;; Ces deux lignes s'affichent automatiquement quand on glisse le fichier .lsp dans AutoCAD
;; pour indiquer à l'utilisateur que le script est bien chargé et comment le lancer.
(princ "\nRoutine CHGMLSTYLE (V3) chargée. Tapez CHGMLSTYLE pour l'exécuter.")
(princ)
```

### :light_bulb: Quelques notions clés AutoLISP abordées dans ce script :

- **L’approche «&nbsp;LISP&nbsp;» (LISt Processing) :** Dans ce langage, _tout_ est basé sur des listes (ce qui se trouve entre parenthèses). La première chose juste après la parenthèse ouvrante est **toujours** l’action (le verbe), et ce qui suit, ce sont les éléments sur lesquels on agit (les compléments).

- _Exemple :_ `(+ 2 3)` au lieu de `2 + 3`.

- **Les codes DXF :** Quand tu utilises `entget`, AutoCAD te renvoie «&nbsp;l’ADN&nbsp;» géométrique de l’objet sous forme de liste. Chaque attribut a un numéro (le code DXF). Par exemple :

- `0` = Type d’objet (ex: «&nbsp;MLINE&nbsp;»)

- `8` = Nom du calque

- `40` = Valeur d’échelle

- `11` = Coordonnées X,Y,Z d’un point

- **`car` et `cdr` :** Ce sont de vieux termes informatiques fondamentaux en LISP.

- `car` lit le _premier_ élément d’une liste. Si la liste est `(8 . "Calque1")`, le `car` est `8`.

- `cdr` lit _le reste_ de la liste. Le `cdr` sera `"Calque1"`. C’est grâce à cela que le script isole les données utiles !

---

## Post 5 by @system — 2026-07-19T15:03:55Z

Ce sujet a été automatiquement fermé après 2 jours. Aucune réponse n’est permise dorénavant.
