Aller au contenu

LISP propriété bloc - Mettre à l'échelle uniformément / décomposition etc...


Siham7169

Messages recommandés

Bonjour à tous,

N'étant pas adepte des LISP je requiert votre aide,

J'aimerai savoir s'il existe un LISP dans se groupe (je n'ai pas trouvé) qui permet d'automatiser le changement de certaine propriétés de bloc dynamique ou pas, comme par exemple la mise à l'échelle uniforme ou l'autorisation de la décomposition d'un bloc.

Je dois m'occuper de refaire le gabarit de mon entreprise et l'outil de Giles "Edit_bloc" m'as déjà pas mal aidé, mais il ne me permet pas de modifier toute les composante.

Si cette manip en passant par un LISP est possible pouvez m'aidez à en réaliser un ?

Je remercie d'avance la communauté et si il existe déjà un sujet sur ces points je suis désolé d'avance

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Je ne sais pas si un programme existe déjà (probablement), en revanche on peut toujours l'écrire au besoin. Comment détermines-tu les nouvelles valeurs pour les propriétés de ton blocs ? Serait-il possible d'avoir un exemple de ce que tu cherches réellement à obtenir en définissant les données d'entrée ?

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

il y a 44 minutes, Luna a dit :

Coucou,

Je ne sais pas si un programme existe déjà (probablement), en revanche on peut toujours l'écrire au besoin. Comment détermines-tu les nouvelles valeurs pour les propriétés de ton blocs ? Serait-il possible d'avoir un exemple de ce que tu cherches réellement à obtenir en définissant les données d'entrée ?

Bisous,
Luna

Je voudrais modifiés ces données en particulier (voir capture d'écran) :

- Annotatif

- Mettre à l'échelle uniformément

- Autoriser la décomposition

Ces 3 données non que 2 valeurs possibles oui / non

- Unités (résolus avec l'outils de Giles qui ma permit de régler le problèmes)

image.png.d6d04bcb95d27076217d8b6323e0492c.png

Et pour en revenir à mon problèmes j'ai un bon 500 blocs à modifiés et bien sur l'andouille qui les a créés ou modifiés avant a été très malin de verrouiller la décomposition et activé l'échelle uniforme pour je ne sais qu'elle raison. Je voudrais donc automatiser la tâche pour enlever se genre de paramètre (pour faire simple, que tout les blocs soit comme sur la capture d'écran) et évité d'avoir à le faire 500 fois la même manipulation.

Voilà je sais pas si j'ai été très clair,

Merci encore,

Siham

 

Lien vers le commentaire
Partager sur d’autres sites

Oki,

Si cela doit affecter toutes les définitions de blocs de ton dessin, alors ceci devrait fonctionner :

(defun c:BAUE (/ LM:AnnotativeBlock b)
  ;; Annotative Block  -  Lee Mac
  ;; Sets the annotative property for a block definition
  ;; blk - [str] Block name
  ;; flg - [bol] Boolean flag (1=Annotative, 0=Not Annotative)
  ;; Returns: T if successful, else nil
  (defun LM:AnnotativeBlock ( blk flg )
    (and (setq blk (tblobjname "block" blk))
        (progn
            (regapp "AcadAnnotative")
            (entmod
                (append (entget (cdr (assoc 330 (entget blk))))
                    (list
                        (list -3
                            (list
                                "AcadAnnotative"
                                '(1000 . "AnnotativeData")
                                '(1002 . "{")
                                '(1070 . 1)
                                (cons 1070 flg)
                                '(1002 . "}")
                            )
                        )
                    )
                )
            )
        )
    )
  )
  
  (vl-load-com)
  (vlax-for b (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
    (if (not (wcmatch (vlax-get b 'Name) "`**"))
      (progn
        (vlax-put b 'Explodable 1)   ;; 1 = Décomposition autorisée, 0 = Decomposition interdite
        (vlax-put b 'BlockScaling 0) ;; 1 = Echelle uniforme, 0 = Echelle non uniforme autorisée
        (LM:AnnotativeBlock (vlax-get b 'Name) nil)   ;; T = Annotatif Oui, nil = Annotatif Non
      )
    )
  )
  (princ)
)

Sinon, s'il faut l'utiliser sur certaines définitions uniquement, je te propose ceci :

(defun c:BAUE (/ LM:AnnotativeBlock ListBox str2lst bl b blist)
  ;; Annotative Block  -  Lee Mac
  ;; Sets the annotative property for a block definition
  ;; blk - [str] Block name
  ;; flg - [bol] Boolean flag (1=Annotative, 0=Not Annotative)
  ;; Returns: T if successful, else nil
  (defun LM:AnnotativeBlock ( blk flg )
    (and (setq blk (tblobjname "block" blk))
        (progn
            (regapp "AcadAnnotative")
            (entmod
                (append (entget (cdr (assoc 330 (entget blk))))
                    (list
                        (list -3
                            (list
                                "AcadAnnotative"
                                '(1000 . "AnnotativeData")
                                '(1002 . "{")
                                '(1070 . 1)
                                (cons 1070 flg)
                                '(1002 . "}")
                            )
                        )
                    )
                )
            )
        )
    )
  )
  
  (defun ListBox (title msg lst value flag / vl-list-search tmp file DCL_ID choice tlst)

    (defun vl-list-search (p l)
      (vl-remove-if-not '(lambda (x) (wcmatch x p)) l)
    )
    (setq tmp (vl-filename-mktemp "tmp.dcl")
          file (open tmp "w")
          tlst lst
    )
    (write-line
      (strcat "ListBox:dialog{width=" (itoa (+ (apply 'max (mapcar 'strlen (mapcar 'vl-princ-to-string lst))) 5)) ";label=\"" title "\";")
      file
    )
    (write-line
      ":edit_box{key=\"filter\";}"
      file
    )
    (if (and msg (/= msg ""))
      (write-line (strcat ":text{label=\"" msg "\";}") file)
    )
    (write-line
      (cond
        ((= 0 flag) "spacer;:popup_list{key=\"lst\";}")
        ((= 1 flag) "spacer;:list_box{height=15;key=\"lst\";}")
        (t "spacer;:list_box{height=15;key=\"lst\";multiple_select=true;}")
      )
      file
    )
    (write-line ":text{key=\"count\";}" file)
    (write-line "spacer;ok_cancel;}" file)
    (close file)
    (setq DCL_ID (load_dialog tmp))
    (if (not (new_dialog "ListBox" DCL_ID))
      (exit)
    )
    (set_tile "filter" "*")
    (set_tile "count" (strcat (itoa (length lst)) " / " (itoa (length lst))))
    (start_list "lst")
    (mapcar 'add_list lst)
    (end_list)
    (set_tile "lst" (if (member value lst) (itoa (vl-position value lst)) (itoa 0)))
    (action_tile
      "filter"
      "(start_list \"lst\")
      (mapcar 'add_list (setq tlst (vl-list-search $value lst)))
      (end_list)
      (set_tile \"count\" (strcat (itoa (length tlst)) \" / \" (itoa (length lst))))"
    )
    (action_tile
      "accept"
      "(or 
        (= (get_tile \"lst\") \"\")
        (if (= 2 flag)
          (progn
            (foreach n (str2lst (get_tile \"lst\") \" \")
              (setq choice (cons (nth (atoi n) tlst) choice))
            )
            (setq choice (reverse choice))
          )
          (setq choice (nth (atoi (get_tile \"lst\")) tlst))
        )
      )
      (done_dialog)"
    )
    (start_dialog)
    (unload_dialog DCL_ID)
    (vl-file-delete tmp)
    choice

  )
  
  (defun str2lst (str sep / pos)
    (if (setq pos (vl-string-search sep str))
      (cons
        (substr str 1 pos)
        (str2lst (substr str (+ (strlen sep) pos 1)) sep)
      )
      (list str)
    )
  )
  
  (vl-load-com)
  (vlax-for b (setq bl (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object))))
    (if (not (wcmatch (vlax-get b 'Name) "`**"))
      (setq blist (cons (cons (vlax-get b 'Name) b) blist))
    )
  )
  (setq bl (ListBox "Select Block(s)" "Please, select one or more block(s) :" (reverse (mapcar 'car blist)) nil 2))
  (mapcar
    '(lambda (b)
      (setq b (assoc b blist))
      (vlax-put (cdr b) 'Explodable 1)   ;; 1 = Explodable,    0 = Not Explodable
      (vlax-put (cdr b) 'BlockScaling 0) ;; 1 = Unifrom Scale, 0 = Not Uniform Scale
      (LM:AnnotativeBlock (car b) 0)     ;; 1 = Annotative,    0 = Not Annotative
     )
    bl
  )
  (princ)
)

Pour lancer la commande, copie-colle le code dans ta ligne de commande puis c'est la commande BAUE (= Block Annotative Uniform Explodable). J'ai également ajouté des commentaires sur les 3 lignes concernant la modification de la propriété si jamais tu désires modifier la valeur pour l'une d'elles (les commentaires sont repérable via ";;").
En espérant que ceci réponde à ton besoin 😉

Bisous,
Luna

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Le premier code permet de modifier la totalité des définitions de blocs présentes dans le dessin courant tandis que la seconde version permet d'ouvrir une boîte de dialogue avec la liste de l'ensemble des définitions de blocs et tu peux ainsi sélectionner une ou plusieurs définitions de blocs pour en modifier seulement quelques unes (ou toutes évidemment si tu le souhaites).
Autrement dit, tout dépend si tu dois modifier l'ensemble des blocs de ton dessin, ou bien si tu dois le faire uniquement sur certains blocs 😉

Bisous,
Luna

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

il y a 20 minutes, Luna a dit :

Coucou,

Le premier code permet de modifier la totalité des définitions de blocs présentes dans le dessin courant tandis que la seconde version permet d'ouvrir une boîte de dialogue avec la liste de l'ensemble des définitions de blocs et tu peux ainsi sélectionner une ou plusieurs définitions de blocs pour en modifier seulement quelques unes (ou toutes évidemment si tu le souhaites).
Autrement dit, tout dépend si tu dois modifier l'ensemble des blocs de ton dessin, ou bien si tu dois le faire uniquement sur certains blocs 😉

Bisous,
Luna

Re,

Lorsque je lance le deuxième code il y a bien une boite de dialogue qui s'ouvre pour sélectionner les blocs, par contre il n'y pas de boite de dialogue pour une ou plusieurs définitions je sélectionne tout mes blocs et je pense qu'il applique les critère demandé dans le code.

Lien vers le commentaire
Partager sur d’autres sites

il y a 35 minutes, Luna a dit :

Coucou,

Je ne comprends pas bien où est ton problème exactement...Ci-dessous un ScreenCast pour montrer l'utilisation de la boîte de dialogue. As-tu le même fonctionnement ?
https://autode.sk/38rssaW

Bisous,
Luna

Ok c'est bon c'est moi qui est mal compris tout fonctionne correctement,

Merci beaucoup !

Siham

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité