Hello tous le monde,
Je sollicite votre aide pour une situation que je rencontre sur un projet
J'ai récupérer une bibliothèque de bloc d'un BE, malheureusement les échelles des blocs sont diverses et variées.
J'ai rechercher des lisp pour corriger cela, j'ai trouver le lisp de MAC LEE , bscl.lsp mais il ne correspond pas vraiment.
La complication est que ces bloc contiennent des attributs, et visuellement, malgré les différences d'échelles le rendu est uniforme.
Est-ce que quelqu'un saurais comment mettre à 1 les échelles de tous les bloc en conservant leur aspect visuel( géométrie + attribut) actuels?
Si joins un petite extrait sur 4 bloc, mais la légende en contient des centaines.
Par avance merci de vos éclaircissements.😁
Jee
Résolu ! Accéder à la solution.
Résolu par Luna1. Accéder à la solution.
Coucou,
Je vais essayer de travailler dessus, normalement il devrait y avoir moyen de faire cela. En revanche je ne peux pas te promettre de te donner une réponse dans la journée donc si cela peut attendre ce WE, c'est bon 😉
Bisous,
Luna
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
Bonjour @Dany.jee
Si une des réponses résout votre problème ou vous a permis de mieux le comprendre, voulez vous avoir l'amabilité de cliquer sur le bouton APPROUVER LA SOLUTION en bas de la réponse qui apporte une solution?
Cela facilitera la navigation de nos utilisateurs qui pourront directement atteindre la solution
Sachez qui si vous avez marqué une réponse comme solution par erreur, vous pouvez annuler ce marquage en cliquant sur le menu du fil (les trois points verticaux) et choisir "pas la solution"
Merci de ne pas accepter comme solution le message que vous êtes en train de lire.
Bonjour, ce lisp fonctionne uniquement avec des blocs avec attribut, est-il possible d'avoir ce lisp pour des blocs sans attribut car j'ai une bibliothèque avec des blocs avec des échelles différentes ?
Hello @miguel.montinho9P3ZS
SVP mais tu fais une toute petite modification dans la Superbe Routine de Luna !
;; (setq BlockRef (ssget '((0 . "INSERT") (66 . 1) )))
devient
(setq BlockRef (ssget '((0 . "INSERT") )))
Et ainsi a priori je pense que cela fonctionnera !
En effet si je me souviens bien , le Flag 66 indique la presence d'Attributs !?
Bye, Patrice
Patrice BRAUD
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.