Rendre tous les blocs décomposables en AutoLISP

Il existe principalement trois raisons techniques pour lesquelles un bloc refuse de se décomposer (commande DECOMPOS) :

1. Le paramètre de création (Le plus fréquent)

Lorsqu’un utilisateur crée un bloc via la commande BLOC, il y a une case à cocher dans la boîte de dialogue nommée « Autoriser la décomposition ».

  • Si cette case a été décochée par le créateur, le bloc est verrouillé pour empêcher les modifications accidentelles.

  • C’est précisément ce verrou que ma routine Lisp précédente fait sauter en modifiant la propriété interne du bloc. (voir LISP ci-après)

2. Les insertions multiples (MINSERT)

Si le bloc a été inséré avec la commande MINSERT (et non INSERER), il est considéré comme un tableau rectangulaire d’un seul bloc.

  • Même s’il n’y a qu’une seule rangée et une seule colonne, un bloc MINSERT est indécomposable par nature.

  • C’est une méthode souvent utilisée intentionnellement pour « protéger » un dessin, car il n’existe pas de commande native pour convertir un MINSERT en bloc normal.

3. Les échelles non uniformes (Variable EXPLMODE)

Si un bloc a été inséré avec des échelles X, Y et Z différentes (ex: X=1, Y=2), il peut être impossible de le décomposer si la variable système EXPLMODE est mal réglée.

  • Si EXPLMODE est à 0, AutoCAD® interdit la décomposition des blocs à échelle non uniforme pour éviter de créer des géométries invalides.

  • Si elle est à 1 (valeur par défaut), cela fonctionne généralement.

Ci-après un programme AutoLISP pour rendre les blocs non décomposables, décomposables (cas de figure N°1 expliqué ci-dessus)

RendreDecomposable.lsp (1,2 Ko)

(defun c:RendreDecomposable (/ doc blocks)
  (vl-load-com)
  (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  (setq blocks (vla-get-blocks doc))
  
  (vlax-for blk blocks
    ;; On ignore les Xrefs et les blocs systèmes (Espace Objet/Papier)
    (if (and (= (vla-get-isxref blk) :vlax-false)
             (= (vla-get-islayout blk) :vlax-false))
      ;; On force la propriété Explodable à Vrai (True)
      ;; Utilisation de catch-all-apply pour éviter un arrêt sur erreur si un bloc est protégé
      (vl-catch-all-apply 'vla-put-explodable (list blk :vlax-true))
    )
  )
  
  (vla-regen doc acAllViewports)
  (princ "\nToutes les définitions de blocs sont maintenant décomposables.")
  (princ)
)