Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e) (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é par Luna
Correction LISP pour 1 seule insertion
Posté(e)

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.

Posté(e)

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
Posté(e)

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

Posté(e)

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

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é