Aller au contenu

Opération sur attribut de bloc


Fundream

Messages recommandés

Bonjour les Lispeurs !

 

Je cherche à additionner les valeurs de tous les attributs numériques

nommés "comddc" des blocs dont l'attribut "REF" est égal à "kiko" ou "kina" uniquement

suite à une selection et à retourner cette valeur sous forme de Textmult.

 

Je suis complètement novice en la matière et cela me dépasse complètement,

quelqu'un saurait il m'aider ?

 

Merci beaucoup

Autocad 2015 - Lumion 3D - SCIA Engineer

I7 6700K 4 cores @4.0Ghz - 32Go DDR4 - GTX980ti 6Gb - SSD 512Go - Windows 7 64 bits.

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Bon j'ai une routine "Attr_Total" qui genere le total a partir de UN attribut

dont tu precises EXACTEMENT l'Etiquette / TagName (Attention aux Minuscules / Majuscules)

sur l'ensemble des blocs selectionnes ...

 

Avec cette routine en 2 fois, puisque tu as 2 valeurs d'Attributs specifiques,

tu auras le resultat voulu !?

 

Selection du 1er cas avec "REF" est egal a "kiko"

puis Attr_Total ... Tu memorises le resultat qui est dans lecran texte !

Selection du 1er cas avec "REF" est egal a "kina"

puis Attr_Total ... Tu memorises le resultat ...

Et tu additionnes les DEUX valeurs !!

 

A priori je pense que c deja un bon debut !

 

Bye, lecrabe "triste" (Provenant du Stock de 2000 routines)

 

;|Average of specified attribute - Ranjit Singh 02/23/2017|;

;; 
;; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/collect-data-from-blocks/td-p/6898098
;; 
;; Moyenne du contenu d'un Attribut (Tagname) ---> TOTAL des valeurs de UN Attribut numerique
;;
;; Micro-Micro-Modif par Patrice : TOTAL
;;
;; michalus >>> I have a drawing with multiple dynamic blocks with attributes. 
;; Is there a way to create a lisp, that when i'll choose number of blocks 
;; it will extract the numbers from defined attribute in the block 
;; and place a text with the average of those numbers? 
;; 

(vl-load-com)

(defun c:Attr_Total (/ tagname entdata vlaobj vallst)
(setq tagname (getstring "\nTotal - Enter the Tagname EXACTLY : "))
(mapcar '(lambda (x)
(and (= 'ename (type x))
(foreach attobj (safearray-value (variant-value (vla-getattributes (setq vlaobj (vlax-ename->vla-object x)))))
(and (= tagname (vla-get-tagstring attobj))
(setq vallst (cons (atof (vla-get-textstring attobj)) vallst))))))
(mapcar 'cadr (ssnamex (ssget '((0 . "INSERT") (66 . 1)))))) 
;; (/ (apply '+ vallst) (length vallst)) 
  (+ (apply '+ vallst)                )
)

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup lecrade mais je n'ai pas deux valeurs d'attribut spécifique, le seul attribut que je veux sommer c'est l'attribut "comddc" MAIS je ne veux sommer que ceux qui se trouvent dans les blocs où l'attribut "REF" est "kiko" ou "kina".Dans ma sélection il y a plein d'autres blocs avec l'attribut "comddc" mais comme leur "REF" n'est pas "kiko" ni "kina", je ne souhaite pas les prendre en compte.

Comme tu dis c'est un début, j’essaie maintenant de trouver comment filtrer mes blocs.

Autocad 2015 - Lumion 3D - SCIA Engineer

I7 6700K 4 cores @4.0Ghz - 32Go DDR4 - GTX980ti 6Gb - SSD 512Go - Windows 7 64 bits.

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Mais a priori tu peux facilement selectionner les blocs avec un contenu d'attribut "REF" est "kiko" ou "kina" !?

Cela devient en fait ta selection precedente ...

Et quand tu lances "Attr_Total" apres la question "\nTotal - Enter the Tagname EXACTLY : "

la routine Lisp recupere automatiquement ta selection precedente !?

Donc c OK pour moi ! ... Ou alors je n'ai RIEN compris !?

Manipulation a faire 2 fois car tu as 2 valeurs critiques !

Et tu additionnes (dans ta Tete qui est surement "FUN") les 2 resultats ...

 

Bye, lecrabe "triste"

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Cela fonctionne mais j'ai pris l'exemple de 2 références de pièces pour ne pas surcharger la demande et juste m'apporter une base.

En réalité ma sélection comporte au moins 45 "REF" différentes et je vais devoir sommer leur "comddc" par groupe. Diviser certain totaux par 2, d'autres totaux par 4 et enfin sommer la totalité des résultats obtenus.Donc la routine de sélection par "REF" et sélection précédente j'ai peur que ce soit un peu fastidieux mais je vais tenter de coder ça. Merci

Autocad 2015 - Lumion 3D - SCIA Engineer

I7 6700K 4 cores @4.0Ghz - 32Go DDR4 - GTX980ti 6Gb - SSD 512Go - Windows 7 64 bits.

Lien vers le commentaire
Partager sur d’autres sites

Salut.

 

EXTRACTDONNEES devrait te permettre de filtrer tout ça assez rapidement, et de faire tous tes filtres à partir de la même extraction. J'ignore si les opérations de fin de colonne permettent l'addition pour des colonnes qui sont considérées comme des textes, mais dans ce cas il suffirait de tout extraire vers un tableur et d'ajouter la bonne formule au bon endroit.

 

Cordialy.

Je suis dysorthographique alors lâchez-moi les basques avec ça, je fait déjà de mon mieux.
Membre d'Extinction Rebellion, car pour sauver le monde il n'est jamais trop tard, amour et rage !
Pour écrire un vraie point médian (e·x·e·m·p·l·e) [Alt + 0183] ou ajout d'un raccourci clavier personnalisé (ex. [AltGr + ;])

Utilisateur d'AutoCAD 2021 sous Windows 10

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Non le but est de simplifier au maximum donc de ne pas avoir d'extraction de donné et un tableur.Déja comme mon attribut est toujours "comddc", j'ai retiré le la definition de tagname avec getstring par "comddc" directement, ça évite de le saisir.

(and (= "comddc" (vla-get-tagstring attobj))

 

Sortir le résultat dans un "text" insérable dans l'objet serai un gros plus également.

 

Autocad 2015 - Lumion 3D - SCIA Engineer

I7 6700K 4 cores @4.0Ghz - 32Go DDR4 - GTX980ti 6Gb - SSD 512Go - Windows 7 64 bits.

Lien vers le commentaire
Partager sur d’autres sites

Exactement, j'ai modifié le ssatt et compilé les deux, ça donne ça et ca marche à merveille :

(defun ssatt (/ att elst  ss1 ss2 n ent)
 (and
(setq ss2 (ssadd))
(sssetfirst nil nil)
(princ "\nSélectionnez les blocs ou [b]<[/b]Tous>: ")
(or (setq ss1 (ssget '((0 . "INSERT") (66 . 1))))
   	(setq ss1 (ssget "_X" '((0 . "INSERT") (66 . 1))))
)
(if ss1
 	(repeat (setq n (sslength ss1))
   	(setq ent (ssname ss1 (setq n (1- n)))
         	att (entnext ent)
   	)
   	(while (= (cdr (assoc 0 (setq elst (entget att)))) "ATTRIB")
     	(if (and (= (cdr (assoc 2 elst)) "REF")
				(or
               	(= (cdr (assoc 1 elst)) "kiko")
				(= (cdr (assoc 1 elst)) "kina")
				)
			)

       	(ssadd ent ss2)
     	)
     	(setq att (entnext att))
   	)
 	)
)
(sssetfirst nil ss2)
 )
 (princ)
) 

(defun c:ddc (/ entdata vlaobj vallst ddc )
(ssatt)
(mapcar '(lambda (x)
(and (= 'ename (type x))
(foreach attobj (safearray-value (variant-value (vla-getattributes (setq vlaobj (vlax-ename->vla-object x)))))
(and (= "comddc" (vla-get-tagstring attobj))
(setq vallst (cons (atof (vla-get-textstring attobj)) vallst))))))
(mapcar 'cadr (ssnamex (ssget '((0 . "INSERT") (66 . 1)))))) 
(setq ddc (+ (apply '+ vallst)))
)

Autocad 2015 - Lumion 3D - SCIA Engineer

I7 6700K 4 cores @4.0Ghz - 32Go DDR4 - GTX980ti 6Gb - SSD 512Go - Windows 7 64 bits.

Lien vers le commentaire
Partager sur d’autres sites

FunDream 3D, d'où tu sors ça ?

 

Pour le premier bout de code je t'enverrai des pistaches ^^

 

Ce sont des références de pièce, il faut demander au fabricant le pourquoi du comment.

 

Merci en tout cas

Autocad 2015 - Lumion 3D - SCIA Engineer

I7 6700K 4 cores @4.0Ghz - 32Go DDR4 - GTX980ti 6Gb - SSD 512Go - Windows 7 64 bits.

Lien vers le commentaire
Partager sur d’autres sites

Salut !

Tu as une bonne mémoire ;)

J'ai un problème sur le code, suite au filtre des blocs, si il s’avère que le jeu de sélection est vide, cela me redemande de sélectionner alors que je voudrai que cela se termine.

Il faut donc que je rajoute un (if (ss /= nil)) mais cela ne fonctionne pas. Quelqu'un a une idée pour vérifier qu'un jeu de sélection est présent ?

 

Autocad 2015 - Lumion 3D - SCIA Engineer

I7 6700K 4 cores @4.0Ghz - 32Go DDR4 - GTX980ti 6Gb - SSD 512Go - Windows 7 64 bits.

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é