Lisp uniformisation echelle bloc avec attributs

Lisp uniformisation echelle bloc avec attributs

Dany.jee
Contributor Contributor
1 868 Visites
11 Réponses
Message 1 sur 12

Lisp uniformisation echelle bloc avec attributs

Dany.jee
Contributor
Contributor

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

 

0 J'aime
Solutions acceptées (1)
1 869 Visites
11 Réponses
  • Lisp
Replies (11)
Message 2 sur 12

Luna3
Advocate
Advocate

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

0 J'aime
Message 3 sur 12

Luna3
Advocate
Advocate
Solution acceptée

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 12

patrick.emin
Alumni
Alumni

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
0 J'aime
Message 5 sur 12

Dany.jee
Contributor
Contributor

@Luna3 

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.

😀

 

0 J'aime
Message 6 sur 12

miguel.montinho9P3ZS
Explorer
Explorer

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 ?

0 J'aime
Message 7 sur 12

braudpat
Mentor
Mentor

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


0 J'aime
Message 8 sur 12

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

Bisous,
Luna
0 J'aime
Message 9 sur 12

miguel.montinho9P3ZS
Explorer
Explorer

Merci pour votre retour, cela fonctionne.

bonne journée

0 J'aime
Message 10 sur 12

ll_engineering
Explorer
Explorer

Bonjour,

C'est exactement le lisp que je recherche mais malheureusement, il ne fonctionne pas sur la version 2027.

Erreur: type d'argument incorrect: numberp: nil

0 J'aime
Message 11 sur 12

chamberlan_joel
Enthusiast
Enthusiast

ce que j'aime la commu autocad...

ce thread la résume toute entière...

 

je suis complètement rouillé en lisp, mais je sais reconnaitre un code élégant bravo !

Message 12 sur 12

patrick-emin
Collaborator
Collaborator

Bonjour @ll_engineering testé sous AutoCAD 2027, ça fonctionne.