Communauté
AutoCAD – tous produits - Français
Bienvenue sur les forums AutoCAD d’Autodesk. Partagez vos connaissances, posez des questions, et explorez les sujets AutoCAD populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

Lisp uniformisation echelle bloc avec attributs

8 RÉPONSES 8
RÉSOLU
Répondre
Message 1 sur 9
Dany.jee
726 Visites, 8 Réponses

Lisp uniformisation echelle bloc avec attributs

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

 

Balises (4)
Étiquettes (1)
8 RÉPONSES 8
Message 2 sur 9
Luna1
en réponse à: Dany.jee

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

Message 3 sur 9
Luna1
en réponse à: Dany.jee

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

Message 4 sur 9
patrick.emin
en réponse à: Dany.jee

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.


Patrick Emin animateur de la communauté francophone


Vous avez trouvé un message utile? Alors donnez un "J'aime" à ce message!
Votre question a eu une réponse satisfaisante? Voulez vous avoir l'amabilité de cliquer sur le bouton
 APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Signez notre Livre d'Or
Message 5 sur 9
Dany.jee
en réponse à: Luna1

@Luna1 

Ca à l'air de marcher, je vais tester ca sur la bibliothèque complète et je reviens vers toi.

Merci beaucoup en tous cas.

😀

 

Message 6 sur 9
miguel.montinho9P3ZS
en réponse à: Luna1

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 ?

Message 7 sur 9
braudpat
en réponse à: miguel.montinho9P3ZS

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 ( Supporting Troops ) - Autodesk Expert Elite
If you are happy with my answer please mark "Accept as Solution" and if very happy please give me a Kudos (Felicitations) - Thanks

Patrice BRAUD

EESignature


Message 8 sur 9
Luna1
en réponse à: braudpat

Coucou,
Yes c'est tout à fait chat ! Le (66 . 1) applique un filtre pour les blocs avec attributs.

Bisous,
Luna
Message 9 sur 9
miguel.montinho9P3ZS
en réponse à: braudpat

Merci pour votre retour, cela fonctionne.

bonne journée

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums  

Autodesk Design & Make Report