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
MINSERTest 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
MINSERTen 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)
)