Siham7169 Posté(e) le 26 avril 2022 Posté(e) le 26 avril 2022 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
Luna Posté(e) le 26 avril 2022 Posté(e) le 26 avril 2022 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
Siham7169 Posté(e) le 26 avril 2022 Auteur Posté(e) le 26 avril 2022 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) 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
Luna Posté(e) le 26 avril 2022 Posté(e) le 26 avril 2022 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 1
Siham7169 Posté(e) le 27 avril 2022 Auteur Posté(e) le 27 avril 2022 Salut Luna, Tout d'abord merci énormément pour le code, J'ai juste une dernière question je n'ai pas compris la différence entre le premier code et le second. Je te remercie en tout cas Siham
Luna Posté(e) le 27 avril 2022 Posté(e) le 27 avril 2022 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 1
Siham7169 Posté(e) le 27 avril 2022 Auteur Posté(e) le 27 avril 2022 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.
Luna Posté(e) le 27 avril 2022 Posté(e) le 27 avril 2022 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
Siham7169 Posté(e) le 27 avril 2022 Auteur Posté(e) le 27 avril 2022 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant