Aller au contenu

RECHERCHE D'UNE ROUTINE LISP OU AUTRE


Messages recommandés

Posté(e)

Bonjour,

 

Je cherche une routine lisp ou autre, qui permet de me calculer un débit suivant la formule suivante. PUISSANCE*0.86/DELTA.

sur laquelle je sélectionne Le Premier attribut texte (PUISSANCE) qui celui-ci est multiplier par 0.86, ensuite je sélectionne le deuxième attribut texte (DELTA) qui me donne en positionnant le résultat de la formule ci-dessus.

Cordialement.

J'ai une routine lisp ci-dessous de ce style, mais elle donne que la somme.

[/size]

;; Routine pour le calcul des débits Hydraulique des Radiateurs MINUTE_RAD.LSP
;; en Fonction de la puissance et du Delta.
;; Fonctionne en principe sur les TEXT & MTEXT de type numérique.

(defun c:minute_RAD (/ doc sel tot pt nor)
 (vl-load-com)
 (setq	tot 0 doc (vla-get-activedocument (vlax-get-acad-object))
 )
 (princ "\nSélectionnez les textes")
 (if (ssget (list (cons 0 "TEXT,MTEXT")))
   (progn
           (vlax-map-collection
(setq sel (vla-get-activeselectionset doc))
'(lambda (x)
   (setq tot (+ (atof (vla-get-textstring x)) tot))
 )
     )
     (setq ref (vla-item sel 0)) 
     (vla-delete sel)

     (if (setq pt (getpoint "\nPositionnez le résultat: "))
  (progn
  (setq res
                 (vla-addText
  (vla-get-ModelSpace doc)
  (strcat (rtos tot) " l/h")
  (vlax-3d-point pt)
  (vla-get-Height ref)
  )
                 )
                (vla-put-Rotation res (vla-get-Rotation ref))
  (vla-put-StyleName res (vla-get-StyleName ref))
)
     )
   )
 )
 (princ)
)

Posté(e)

Salut,

 

Cette demande me rappelle ce sujet.

 

Si tu parles d'attributs, on peut supposer qu'il s'agit d'attributs de bloc.

Dans ce cas il serait plus simple de simplement sélectionner un (ou plusieurs) bloc et de traiter ses attributs.

Il faut juste s'assurer que le format du texte des valeurs d'attribut permette de retrouver des nombres valides pour faire les opérations.

 

Le mieux serait que tu mettes à disposition un exemple du bloc à traiter s'il est différent de celui du sujet sus-cité.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour Gile,

 

Effectivement, ce sujet à bien été posté par moi même.

 

Je n'arrive pas à joindre le fichier "Erreur Le serveur a retourné une erreur durant l'envoi."

Cordialement.

Posté(e)

Salut.

 

Ça fait un bon moment qu'il n'est plus possible d’héberger des PJ directement sur le forum angry.gif, il faut passer par un hébergeur externe.

 

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

Posté(e)

Bonjour Gile,

 

Effectivement, ce sujet à bien été posté par moi même.

 

Je n'arrive pas à joindre le fichier "Erreur Le serveur a retourné une erreur durant l'envoi."

Cordialement.

 

Bonjour,

 

J'ai été faire un petit tour rapide sur le sujet en question, je répond ici n'ayant pas de compte sur ce forum, et je répond peut être à coté car je ne connais pas les évolutions du logiciel depuis d'AutoCAD 2007...

 

Mais pour faire ce que tu souhaites sur version ancienne c'est possible, mais dans une référence de bloc pour avoir accès propriétés des attributs et pas dans une définition de bloc.

 

A l'usage sur d'ancienne version, dans ton dessin tu ne dois pas insérer une définition de bloc mais une référence de bloc..

 

A+ Bruno

Apprendre => Prendre => Rendre

Posté(e)

Bonjour Bruno,

 

Merci de ta réponse, mais quel est la manip pour insérer une référence de bloc.

 

Chris24

 

Bonjour,

 

Je veux bien essayer de te joindre un exemple si c'est possible (et si je suis bien dans le sujet), mais j'ai besoin de comprendre comment sont renseigné tes attributs puissance et delta (car je ne peux le voir sur ma version)

 

A+ Brun0

Apprendre => Prendre => Rendre

Posté(e)

Salut,

 

Voilà un petit LISP qui fonctionne avec des attributs "classiques" et renseigne l'attribut DEBIT en fonction des valeurs des attributs PUISSANCE et DELTA.

Il faut bien être conscient que modifier la valeur de l'attribut DEBIT en procédant ainsi détruira le champ dynamique qui permettait de calculer automatiquement la valeur. Autrement dit, les blocs traités avec ce LISP ne fonctionneront plus automatiquement avec AutoCAD 2010 et plus.

 

(defun c:debit (/ getAttribs getAtt getVal block attribs puissance delta debit elst)
 (defun getAttribs (ent / elst rslt)
   (while (and ent (= (cdr (assoc 0 (setq elst (entget ent)))) "ATTRIB"))
     (setq rslt (cons (cons (cdr (assoc 2 elst)) ent) rslt)
           ent  (entnext ent)
     )
   )
   rslt
 )
 (defun getAtt (tag /)
   (cond
     ((cdr (assoc tag attribs)))
     (T (prompt (strcat "\nL'attribut '" tag "' est introuvable")))
   )
 )
 (defun getVal (tag / att val)
   (if
     (and
       (setq att (getAtt tag))
       (< 0. (setq val (atof (cdr (assoc 1 (entget att))))))
     )
      val
      (prompt (strcat "\nLa valeur de l'attribut '" tag "' n'est pas valide"))
   )
 )
 (and
   (setq block (car (entsel "\nSélectionnez un bloc: ")))
   (setq attribs (getAttribs (entnext block)))
   (setq puissance (getVal "PUISSANCE"))
   (setq delta (getval "DELTA"))
   (setq debit (getAtt "DEBIT"))
   (setq elst (entget debit))
   (entmod
     (subst
       (cons 1 (strcat (rtos (/ (* puissance 0.86) delta) 2 0) " l/h"))
       (assoc 1 elst)
       elst
     )
   )
 )
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Re Gile,

 

Un grand Merci Gile pour ton programme lisp et du temps que tu à passé pour mon cas ici et ailleurs. Cela fonctionne parfaitement.

 

Cordialement.

 

Chris24

Posté(e)

Re Bruno,

 

Merci pour ton aide cela fonctionne nickel, Pourrais-tu me donner la marche a suivre pour créer se genre de bloc toujours sur une version 2009.

 

Encore Merci.

 

Cordialement.

 

@+

 

Chris24

Posté(e)

Re,

 

Plusieurs liens sur le sujet, ou je me suis essayé à une explication (avec plus ou moins de clarté…), discussion à lire dans leur intégralité.

 

http://cadxp.com/topic/37644-calcul-entre-attributs-dans-bloc/page__view__findpost__p__207410

http://cadxp.com/topic/37644-calcul-entre-attributs-dans-bloc/page__view__findpost__p__210490

http://cadxp.com/topic/40695-pb-champ-dans-bloc/page__view__findpost__p__228056

 

En espérant que tu y trouve ton bonheur.

 

A+ Bruno

Apprendre => Prendre => Rendre

Posté(e)

bonjour a tous

 

Chris24 j'ai récupéré ton bloc et j'ai voulu tester

 

je suis sur autocad architecture 2017

sur quel logiciel es tu ?

 

je suis passé dans l'éditeur de bloc pour reproduire la manip en créant un nouveau paramètre utilisateur

et un nouvel attribut faisant référence a ce parametre

 

et la rien ne se produit

 

BATTMAN, controle, regeneration, rien n'y fait sauf sur ton attribut "DEBIT" ou la ca change

 

autant dans la fenetre de propriété je vois bien mes nouveaux paramètres personnalisés qui se modofient, mais rien d'afficher en dessous sous "attributs" ni dans l'espace objet.

 

 

ca marche chez les autres ? un nouveau BUG autocad ?

 

a+

 

Phil

FREELANCE

Autodesk Architecture 2025 sous windows 11 64

REVIT

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Posté(e)

Bonjour PHILPHIL,

 

En faite mon bloc au départ à été réaliser sur une version AutoCAD 2010 où il est possible d'utiliser les gestionnaires de paramètres dans l’Éditeur de Bloc, qui n'est pas le cas sur une version 2009. A l’insertion du bloc sur la version 2009 les attributs on ce type de caractères "######" pas de prise en charge des formules.

 

Les deux solutions données par (Gile) et Bruno fonctionne trés bien.

 

cdt

 

@+ chris24

 

Les deux solutions données par (Gile) et Bruno fonctionne trés bien.

Posté(e)

bonjour

 

ok

 

ce que je ne comprend pas c'est pourquoi je n'arrive pas a reproduire la chose

meme sur un version plus recente d'autocad architecture

 

un nouvel attribut qui aurait pour résultat "DELTA*PUISSANCE" par exemple

 

j'ai beau recréer dans le gestionnaire un parametre "toto" "DELTA*PUISSANCE"

 

puis un atribut "TOTO" valeur "toto" rien ne se passe, rien ne s'affiche dans le bloc ( meme en respectant les majuscule minuscule)

 

un BUG ? entre autocad et autocad architecture ?

 

Phil

FREELANCE

Autodesk Architecture 2025 sous windows 11 64

REVIT

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Posté(e)

Les deux solutions données par (Gile) et Bruno fonctionne trés bien.

 

Le sujet portant sur une demande de solution en lisp, il est possible de mixer les 2 propositions en adaptant très légèrement le code de (gile), donc très rapidement:

 

(defun c:debitfield (/ getAttribs getAtt getVal block attribs puissance delta debit elst)
 (defun getAttribs (ent / elst rslt)
   (while (and ent (= (cdr (assoc 0 (setq elst (entget ent)))) "ATTRIB"))
     (setq rslt (cons (cons (cdr (assoc 2 elst)) ent) rslt)
           ent  (entnext ent)
     )
   )
   rslt
 )
 (defun getAtt (tag /)
   (cond ((cdr (assoc tag attribs)))
         (T (prompt (strcat "\nL'attribut '" tag "' est introuvable")))
   )
 )
 ;|
 (defun getVal (tag / att val)
   (if
     (and
       (setq att (getAtt tag))
       (< 0. (setq val (atof (cdr (assoc 1 (entget att))))))
     )
      val
      (prompt (strcat "\nLa valeur de l'attribut '" tag "' n'est pas valide"))
   )
 )
|;;; remplace la fonction getval  
 (defun getid (tag) (vla-get-ObjectID (vlax-ename->vla-object (getAtt tag))))
 
 (and (setq block (car (entsel "\nSélectionnez un bloc: ")))
      (setq attribs (getAttribs (entnext block)))
      (setq puissance (getid "PUISSANCE"))
      (setq delta (getid "DELTA"))
      (setq debit (getAtt "DEBIT"))
      (setq elst (entget debit))
      (entmod (subst (cons 1
                           (strcat ;; (rtos (/ (* puissance 0.86) delta) 2 0) " l/h"))
                                   "%<\\AcExpr (%<\\AcObjProp Object(%<\\_ObjId "
                                   (itoa puissance)
                                   " 0>%).TextString>%*0.86/%<\\AcObjProp Object(%<\\_ObjId "
                                   (itoa delta)
                                   " 0>%).TextString>%) \\f \"%lu2%pr2%zs8\">%"
                           )
                     )
                     (assoc 1 elst)
                     elst
              )
      )
 )

 (command "_regen")
 (princ)
)

 

A+ Bruno

Apprendre => Prendre => Rendre

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é