Curlygoth Posté(e) le 24 juin 2022 Posté(e) le 24 juin 2022 Ma 1ere demande : j'aimerai, de maniere cachée, donner ces 2 attributs (puissance et debit) a chaque bloc. tu as un mode invisible pour caché tes blocs attributs 2eme demande : j'aimerai automatiser cela... C'est a dire que lorsque je sélectionne ces blocs, cela me génère directement une étiquette pour la pièce donnée en faisant la somme des attributs puissance et debit. Rien n'est impossible 😉 tu sélectionnes tes X blocs et ca calcul une fois la sélection terminé ? ou tu te fais une zone et tu calcule les blocs a l'intérieur de cette zone ? (définir par polyligne par exemple ?) Citer Mon site Web (en cours de construction) : Site DA-CODE de @didier
sofianerm Posté(e) le 24 juin 2022 Auteur Posté(e) le 24 juin 2022 Merci pour ton aide en tout cas Citer
lecrabe Posté(e) le 24 juin 2022 Posté(e) le 24 juin 2022 Hello As tu essaye les Attributs CONSTANTS ? - La valeur est fixe et ne peut pas etre edite ! Si en plus l attribut est sur un calque specifique (par exemple : ATT_SPECIAL) invisible !? Alors que bien sur tout le reste du Bloc est concu sur le calque ZERO ... La Sante, Bye, lecrabe Citer Autodesk Expert Elite Team
Luna Posté(e) le 24 juin 2022 Posté(e) le 24 juin 2022 (modifié) Coucou, Pour ta première demande, @Curlygoth a suggérer une idée fonctionnelle, bien qu'il ait fait une faute de frappe ^^" Il voulait sûrement parler de la propriété invisible sur les définitions d'ATTRIBUT. Pour cela tu vas dans ton éditeur de bloc, tu sélectionnes (ou créé) tes deux attributs correspondant à la puissance et au débit et dans le panneau des propriétés, tu devrais avoir en bas la propriété "Invisible" -> Définir sur "Oui". Pour la seconde, ne sachant pas précisément ce qu'est une "étiquette", je peux te proposer ceci en attendant (un .dwg d'exemple permettrait de mieux cerner la demande en fonction de la configuration de tes objets) : (defun c:SumAtt (/ param bname jsel i name vnam att lst pt) (setq param (list "PUISSANCE" "DEBIT") ; Liste des noms d'attribut bname "*" ; Liste des noms de blocs (séparer les noms par des virgules, sans espaces !) ) (if (setq jsel (ssget (list '(0 . "INSERT") '(66 . 1) (cons 2 bname)))) (progn (repeat (setq i (sslength jsel)) (and (setq name (ssname jsel (setq i (1- i)))) (setq vnam (vlax-ename->vla-object name)) (vlax-property-available-p vnam 'EffectiveName) (wcmatch (strcase (vla-get-EffectiveName vnam)) (strcase bname)) (setq att (mapcar '(lambda (a) (cons (vla-get-tagstring a) (vla-get-textstring a))) (vlax-invoke vnam 'getAttributes))) (setq att (vl-remove-if-not '(lambda (a) (member (strcase (car a)) (mapcar 'strcase param))) att)) (mapcar '(lambda (a / s v) (setq s (strcase (car a))) (setq v (cond ((distof (cdr a))) (0.0))) (setq lst (if (assoc s lst) (subst (cons s (+ (cdr (assoc s lst)) v)) (assoc s lst) lst ) (append lst (list (cons s v))) ) ) ) att ) ) ) (setq pt (getpoint "\nPoint d'insertion :")) (entmakex (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(100 . "AcDbMText") (cons 10 pt) (cons 1 (apply 'strcat (mapcar '(lambda (x) (strcat (car x) " = " (rtos (cdr x) 2 2) "\\P")) lst))) ) ) ) ) (princ) ) Les noms d'attribut sont purement arbitraire, c'est à toi de mettre le nom qui convient en remplaçant uniquement les mots (bien conserver les guillemets "" !). Le programme ne tient pas compte des majuscules normalement, et si besoin tu peux avoir plus de 2 attributs car c'est une liste (donc si tu spécifies 5 attributs, il fera la somme pour chacun des 5 attributs). Tu peux également modifier le nom dans BNAME, qui correspond au nom de ton bloc, si jamais tu veux filtrer efficacement la sélection des blocs. N'ayant pas de .dwg sous la main, je ne peux pas le tester... Bisous, Luna Modifié le 24 juin 2022 par Luna Correction LISP pour 1 seule insertion Citer
sofianerm Posté(e) le 24 juin 2022 Auteur Posté(e) le 24 juin 2022 Alors merci beaucoup, je viens d'ajouter 2 attributs pour ma plaque, PUISSANCE et DEBIT, que j'ai pu mettre en invisible. J'ai pu définir les valeurs, j'aimerai les bloquer, maintenant, afin de ne plus les changer si possible ? Concernant le lisp, il est fonctionnel merci beaucoup, le seul probleme est que si je selectionne 4 plaques par exemple, je vais devoir faire 4 insertions et seule la derniere contient bien le total correct. Citer
Luna Posté(e) le 24 juin 2022 Posté(e) le 24 juin 2022 Coucou, J'ai corrigé mon erreur sur le LISP pour n'avoir désormais qu'une seule insertion de texte. Ensuite, je n'ai pas super bien compris ta nouvelle demande mais comme je l'ai dit, le programme fonctionne avec autant d'attribut que souhaité donc tu peux essayer en définissant la liste (list "PUISSANCE" "DEBIT" "PUISSANCE_chaud" "PUISSANCE_froid" "DEBIT_chaud" "DEBIT_froid") (encore une fois, c'est à titre d'exemple, donc il te suffit de remplacer par tes attributs à toi !) Et comme chat le programme fera le calcul en additionnant uniquement les "PUISSANCE" entre-elles, les "PUISSANCE_chaud" entre-elles, les "PUISSANCE_froid" entre-elles, etc... Bisous, Luna 1 Citer
Luna Posté(e) le 29 juin 2022 Posté(e) le 29 juin 2022 Juste pour être sûre de bien comprendre... Lors de tes essais, tu modifies une définition de bloc pour lui ajouter des définitions d'attributs puis.....tu utilises le LISP sur ces blocs ? As-tu fait un ATTSYNC avant d'utiliser mon programme, pour mettre à jour la modification/suppression/ajout des attributs ? Sinon, serait-il possible de mettre un .dwg sur lequel tu rencontres ce soucis pour que j'essaie de voir si j'ai le même soucis ? Bisous, Luna Citer
sofianerm Posté(e) le 5 juillet 2022 Auteur Posté(e) le 5 juillet 2022 Salut @Lunaje ne sais pas si tu as l'occasion de jeter un oeil ? Citer
Luna Posté(e) le 5 juillet 2022 Posté(e) le 5 juillet 2022 Coucou, Nan désolée je n'avais pas trop le temps... J'ai jeté un oeil rapidement à ton .dwg et...je ne vois pas un seul attribut dans tes définitions de bloc...tout ce qu'il y a dans l'encadré c'est les références de bloc pour chaque plaque avec un texte à côté pour les différentes valeur de puissance FR/CH et de débit FR/CH... Or depuis le début tu me parles de blocs avec attributs...Donc la réponse est "non, mon programme ne peut pas sélectionner ces blocs, car ils doivent impérativement avoir des attributs !" En fait, il faut que tes textes à gauche de tes références, tu intègres dans chaque définition de bloc des attributs qui correspondent pour chaque valeur ! Autre remarque : pourquoi dans tes définitions de bloc, l'intégralité des objets qui les composent sont des références de bloc ?! Même les textes sont des références de blocs !! J'ai retravaillé ton .dwg pour avoir des attributs dans tes plaques avec les bonnes valeurs et la bonne dénomination (j'ai également décomposer les références de blocs situées dans tes définitions de bloc de tes plaques !). Cependant, il n'est pas possible d'avoir la propriété "Constant" sur les attributs (évitant ainsi la modification des valeurs) car cela supprime les attributs de la liste des attributs des références de blocs, et donc cela complexifie un peu trop la chose (et je n'ai pas le temps pour cela)...Donc il faudra faire avec, les attributs apparaissent dans les propriétés du bloc mais sont invisibles dans le dessin. J'ai réécrit mon code pour qu'il puisse s'adapter au .dwg en PJ, permettant par exemple de remplir directement les blocs étiquette (la première sélection correspond à la sélection des plaques, la seconde demande à sélectionner un seul et unique bloc étiquette et si la seconde ne correspond pas au filtre de recherche donc un bloc ayant des attributs alors le programme va insérer le texte comme précédemment). Ci-dessous le LISP corrigé et remanié : (defun c:SumAtt (/ foo checkblock set-att-list subreal PreIntSuf param bname jsel i name vnam att lst ent) (defun foo (x f) (if f (if (listp x) (mapcar f x) ((eval f) x) ) x ) ) (defun checkblock ( ent blk lst fun / vla att ) (and (setq vla (vlax-ename->vla-object ent)) (vlax-property-available-p vla 'EffectiveName) (wcmatch (foo (vla-get-EffectiveName vla) fun) (foo blk fun)) (setq att (mapcar '(lambda (a) (cons (vla-get-tagstring a) (vla-get-textstring a))) (vlax-invoke vla 'getAttributes))) (setq att (vl-remove-if-not '(lambda (a) (member (foo (car a) fun) (foo lst fun))) att)) ) att ) (defun set-att-list (blk lst / itm tmp) (foreach att (vlax-invoke blk 'getAttributes) (if (setq itm (assoc (vla-get-tagstring att) lst)) (progn (vla-put-textstring att (cdr itm)) (setq tmp (cons itm tmp))) ) ) tmp ) (defun subreal (str num) (setq str (PreIntSuf str)) (apply 'strcat (subst num (cadr str) str)) ) (defun PreIntSuf (str / l x n p i s) (repeat (length (setq l (vl-string->list str))) (setq x (car l)) (cond ( (and p s) (setq s (cons x s))) ( (and (distof (chr x)) n (= "-" (chr n)) ) (setq i (append (list n) i) i (cons x i) ) ) ( (or (distof (chr x)) (and (= "." (chr x)) n (distof (chr n)) ) ) (setq i (cons x i)) ) ( (null i) (setq p (cons x p))) ( i (setq s (cons x s))) ) (setq l (cdr l) n x ) ) (mapcar '(lambda (l) (set (read (vl-symbol-name l)) (reverse (vl-symbol-value l)))) (list 'p 'i 's)) (if (and i (= "-" (chr (car i))) p (= "-" (chr (last p))) ) (setq p (reverse (cdr (reverse p)))) ) (list (vl-list->string p) (vl-list->string i) (vl-list->string s) ) ) (setq param (list "PUISSANCE" "DEBIT" "PUISS_CH" "PUISS_FR" "DEB_CH" "DEB_FR") ; Liste des noms d'attribut bname "*" ; Liste des noms de blocs (séparer les noms par des virgules, sans espaces !) ) (if (setq jsel (ssget (list '(0 . "INSERT") '(66 . 1) (cons 2 bname)))) (progn (repeat (setq i (sslength jsel)) (and (setq name (ssname jsel (setq i (1- i)))) (setq att (checkblock name bname param 'strcase)) (mapcar '(lambda (a / s v) (setq s (strcase (car a))) (setq v (cond ((distof (cdr a))) (0.0))) (setq lst (if (assoc s lst) (subst (cons s (+ (cdr (assoc s lst)) v)) (assoc s lst) lst ) (append lst (list (cons s v))) ) ) ) att ) ) ) (princ "\nVeuillez sélectionner un bloc étiquette...") (if (setq jsel (ssget "_+.:E:S" '((0 . "INSERT") (66 . 1)))) (progn (and (setq name (ssname jsel 0)) (setq att (checkblock name bname param 'strcase)) (set-att-list (vlax-ename->vla-object name) (vl-remove nil (mapcar '(lambda (a) (if (setq b (assoc (car a) lst)) (progn (setq str (cdr a)) (if (distof str) (cons (car a) (rtos (cdr b) 2 2)) (cons (car a) (subreal (cdr a) (rtos (cdr b) 2 2))) ) ) ) ) att ) ) ) ) ) (entmakex (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(100 . "AcDbMText") (cons 10 (getpoint "\nVeuillez spécifier un point d'insertion (MText) : ")) (cons 1 (apply 'strcat (mapcar '(lambda (x) (strcat (car x) " = " (rtos (cdr x) 2 2) "\\P")) lst))) ) ) ) ) ) (princ) ) Bisous, Luna exemple_remplir_etiquette.dwg Citer
Messages recommandés