Bon...je suis irrécupérable >n<
J'ai pas résisté jusqu'au WE donc voici un programme qui devrait (j'espère) répondre à ton besoin :
(defun c:RESCALEBLOCK (/ make-a-list-properties lst2str BlockDef BlockRef i block name lst)
;; Definition of local functions
(defun make-a-list-properties (lst k-lst value fun flag / key search)
(if (null (cdr k-lst))
(if (setq search (assoc (setq key (car k-lst)) lst))
(subst (cons key (apply fun (if flag (list value (cdr search)) (list (cdr search) value)))) search lst)
(append lst (list (cons key value)))
)
(if (setq search (assoc (setq key (car k-lst)) lst))
(subst (cons key (make-a-list-properties (cdr search) (cdr k-lst) value fun)) search lst)
(append lst (list (cons key (make-a-list-properties (cdr search) (cdr k-lst) value fun))))
)
)
)
(defun lst2str (lst sep)
(if lst
(vl-string-left-trim sep (apply 'strcat (mapcar '(lambda (x) (strcat sep (vl-princ-to-string x))) lst)))
)
)
;; End of the definition of local functions
(vl-load-com)
(and
(setq BlockDef (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object))))
(setq BlockRef (ssget '((0 . "INSERT") (66 . 1))))
(repeat (setq i (sslength BlockRef))
(setq block (ssname BlockRef (setq i (1- i))))
(setq name (vla-get-effectivename (vlax-ename->vla-object block)))
(setq lst
(make-a-list-properties
lst
(list name)
(/ (+ (cdr (assoc 41 (entget block))) (cdr (assoc 42 (entget block))) (cdr (assoc 43 (entget block)))) 3.0)
'(lambda (o n) (/ (+ o n) 2.0))
nil
)
)
)
(vlax-for block BlockDef
(setq name (vla-get-name block))
(if (assoc name lst)
(progn
(vlax-put-property block "units" (getvar "INSUNITS"))
(command "_-BEDIT" name)
(command "_SCALE" "_All" "" "0,0,0" (cdr (assoc name lst)))
(command "_BCLOSE" "_Save")
T
)
T
)
)
(repeat (setq i (sslength BlockRef))
(setq block (vlax-ename->vla-object (ssname BlockRef (setq i (1- i)))))
(vlax-put-property block "XScaleFactor" 1.0)
(vlax-put-property block "YScaleFactor" 1.0)
(vlax-put-property block "ZScaleFactor" 1.0)
T
)
(null (command "_ATTSYNC" "_Name" (lst2str (mapcar 'car lst) ",")))
)
)
Ce LISP va te demander de sélectionner des références de bloc (si tu veux pas t'embêter et sélectionner tout le monde, soit tu fais CTRL+A avant de lancer la commande RESCALEBLOCK, soit tu écris "_All" au lieu de sélectionner les objets) donc cela prend en compte la pré-sélection si jamais. Puis il va récupérer l'échelle moyenne X Y Z pour n'avoir qu'une seule valeur (dans le cas d'échelles non uniformes pour les blocs, car à la fin toutes tes références auront une échelle X Y Z uniforme) pour chaque définition de bloc par rapport aux références de bloc (si tu as plusieurs références de bloc pour une même définition, le programme va calculer une échelle moyenne entre toutes tes références). Puis je redéfini les unités des définitions de bloc par rapport à l'unité du dessin (dans ton cas c'est le millimètre) et je vais, pour chaque définition de bloc dont une référence a été sélectionnée, ouvrir l'éditeur de bloc, appliquer un facteur d'échelle à la totalité des objets, refermer l'éditeur de bloc. Puis redéfinir les échelles X Y Z des références à 1.0 et terminer sur un ATTSYNC pour mettre à jour toutes les références.
J'ai testé sur ton dessin d'exemple et cela me semble cohérent. En revanche je n'ai pas vérifié au-delà de ton exemple donc je ne sais pas comment réagi le programme dans le cas d'un bloc dynamique par exemple... Bref à voir jusqu'où il peut servir. En espérant surtout avoir compris la demande ^^"
Bisous,
Luna