Aller au contenu

Comment donner une valeur a un bloc ?


sofianerm

Messages recommandés

Bonjour à tous, 

J'ai une demande assez simple à comprendre, mais je ne sais pas si elle est simple à réaliser. Je vous explique rapidement

1er etape : Je crée des plaques différentes. Chacune des ces plaques a une puissance et un débit.

image.png.639a1e423cc8be662a229ddc4d71050a.png 
Par exemple 205-E a pour puissance 50w et 10 l/h ensuite 204-F a 75w et 18 l/h etc.....

Ma 1ere demande : j'aimerai, de maniere cachée, donner ces 2 attributs (puissance et debit) a chaque bloc. 

 

2eme etape de mon travail : j'ai différentes pieces, ou je mets ces plaques. 

image.png.b045fe0507ad20ae5921aa3574c73c4a.png

A l'heure actuelle, je fais le calcul a la main, c'est a dire

* 3 plaques de 205-E et

* 3 plaques de 204-F

=> donc 3x(50+75) = 375 W 

 

Je fais pareil pour le débit et je change ensuite l'étiquette à la main. Cela me prends du temps. 

 

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.

 

Merci a tous pour votre aide !

Lien vers le commentaire
Partager sur d’autres sites

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 ?)

Lien vers le commentaire
Partager sur d’autres sites

Non tu n'as pas compris, je ne souhaite pas cacher mes blocs, je souhaite définir une variable "puissance" pour le bloc que j'ai crée en lui donnant une valeur, par exemple 100W, sans forcement l'afficher. Exemple : Je crée 2 blocs et je leur donne une valeur.

BLOC A
valeur puissance 100W

BLOC B
valeur puissance 150W

 

Maintenant oui, j'aimerai sélectionner ces blocs comme tu dis, et une fois terminé, je fais "entrée" et ca me fait la somme des puissance dans une étiquette de générée.

Imaginons j'ai dessiné 2 BLOC A et 3 BLOC B. Si je sélectionne l'ensemble, je veux qu'une étiquette soit générée qui fait (2*100 + 3*150 = 650 W)

Lien vers le commentaire
Partager sur d’autres sites

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

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

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é par Luna
Correction LISP pour 1 seule insertion
Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

J'ai egalement une variante qui est que certaines de mes plaques sont froid et chaud.

Plaque classique
*puissance
* debit

Cariante plaque
*puissance froid
*puissance chaud
*debit froid
*debit chaud

 

Je pense que le plus simple est de toujours renseigner les 4 attributs et si je suis en plaque classique dans ces cas la, je renseigne 0 pour la puissance et debit chaud.

Est il possible de modifier le lisp si ca ne te dérange pas, en prenant en compte les 4 attributs (puissance_froid ; debit_froid ; puissance_chaud ; debit_chaud) ? Merci énormément en tout cas.

 

Lien vers le commentaire
Partager sur d’autres sites

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

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

@Luna lorsque je sélectionne les blocs, il me dit "0 objet trouvé"

En faite ce que j'ai remarqué

* scenario 1
J'ai mon bloc, je le modifie en ajoutant des attributs. Lorsque je sélectionne par la suite ce bloc, le lisp ne veut pas.

* scenario 2 :
Je dessine ma plaque, je mets des attributs bloqués, je sélectionne le tout pour créer mon bloc. Pareil, le lisp ne détecte pas d'objet.

* scenario 3 :
Maintenant je dessine ma plaque, je mets des attributs invisibles, non bloqué et je sélectionne l'ensemble pour créer mon bloc. Cette fois ci, il est détecté par ton lisp.

 

En gros, les objets detectés, sont seulement ceux ou lorsque je double clic dessus, j'ai la possibilité de modifier les attributs. Et ce cas de figure je n'ai reussi a le faire qu'avec le scenario 3. Le probleme, c'est que j'aimerai bloqué ces valeurs par modele de plaque, mais surtout j'aimerai que la modification soit faite sur l'ensemble du plan.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é