Aller au contenu

LISP - Copier la valeur d'un attribut dans un texte


Messages recommandés

Posté(e)

Salut les lipseurs,

Pour un projet en cours, j'aurais besoin de récupérer la valeur d'un attribut d'un bloc pour la copier dans un texte.

Je m'explique :

j'ai un plan d'un bâtiment comportant plusieurs étages avec des radiateurs (radiateur en bloc paramétrique). On peut choisir la hauteur, la largeur et le type de robinetterie sur chaque radiateur.

Dans ce bloc "radiateur", il y a 2 attributs (LIBELLE et LIBELLE_2) qui sont automatiquement remplis via des champs, en fonction des éléments paramétriques choisis (jusque là, c'est bon)

Ce que je souhaiterais, c'est de pouvoir copier la valeur de l'attribut "LIBELLE" et de la copier dans un texte (pour info, les 2 attributs ne sont là que pour "visualiser" les paramètres du blocs inséré)

La méthode de fonctionnement de ce lisp serait de cliquer sur le bloc pour copier la valeur de l'attribut et ensuite de cliquer dans le dessin afin d'insérer un texte avec les valeurs de l'attribut "LIBELLE" (avec les paramètres de calques et de style de police courant)

 

Merci à ceux qui pourraient m'aider

Raph.

Celui qui pose une question est bête 5 minutes, celui qui n'en pose pas l'est toute sa vie !

Posté(e)

J'ai un lisp qui copie la valeur d'un attribut ou texte et qui le colle dans un autre attribut ou texte :
 

;;; 
;;; Copie la valeur du texte d'un attribut de bloc ou texte
;;; et le colle sur un texte d'un attribut de bloc ou texte
;;; 

(defun c:COPYATT ( / selatt selatt2 objatt objatt2)
   (setq selatt (nentsel (strcat "\nSélectionner l'attribut ou le texte à copier :")))
   (setq selatt2 (nentsel (strcat "\nSélectionner l'attribut ou le texte de destination :")))
   (setq objatt (vlax-ename->vla-object (car selatt)))
   (setq objatt2 (vlax-ename->vla-object (car selatt2)))
   (if (and (or (= (vla-get-ObjectName objatt) "AcDbText") (= (vla-get-ObjectName objatt) "AcDbMText") (= (vla-get-ObjectName objatt) "AcDbAttribute")) (or (= (vla-get-ObjectName objatt2) "AcDbText") (= (vla-get-ObjectName objatt2) "AcDbMText") (= (vla-get-ObjectName objatt2) "AcDbAttribute")))
      (vla-put-textstring objatt2 (vla-get-textstring objatt))
   )
   (princ)
)

;;; 

A adapter selon tes besoins.

Posté(e)

Hello @Raph_38

Tiens j ai une tres vieille routine Lisp "ATT2TXT" (SVP a Retester avec un AutoCAD "moderne") qui ne traite pas les Blocs dynamiques

mais qui a priori realise ce que tu demandes ...

D ailleurs si qq un pouvait l ameliorer pour traiter aussi les Blocs dynamiques, cela serait Sympa ! 

Tu nous diras si ca marche ?

Bye, lecrabe

 

 
;; 
;; Programme developpe par Hubert L.  pour Patrice B.
;; 
;; Routine: Att2Txt par HL - Blocs classiques ONLY ! 
;; 

;; 
;; Micro-modifs par PB le 16/06/2000 + 19/06/2000 
;; Noms de calques generes : "ATT__VAR__*" & "ATT__CON__*"
;; 

(defun c:Att2Txt ( / CTENT ENT PTYPE GE PNOM PA ATTNAME ATTETIQ ATTVAL ATTHAU ATTROT OTHER_NAME OTHER_LIST EN1 LIST_ATT POINT_ATT ATTX ATTY INSATT ) 

 (command "_UNDO" "_M")

 (att_bl_list)
 (princ "\n")
 (princ CTENT)
 (command "_layer" "_set" "0" "")

;; **** Eventuellement commentez les lignes suivantes ***
 (ALERT "Attributs copies en Textes sur calques ' ATT__CON__* / ATT__VAR__* ' 
          \n Textes crees au point d'insertion des attributs 
	  \n Retour au calque 0 ")

;; **** Eventuellement commentez la  ligne  suivante  *** 
 (alert (strcat "Nombre de bloc traites = " (itoa ctent)))

)


(defun att_bl_list ()
(ssget)
(setvar "cmdecho" 0)
(setvar "highlight" 0)
  (setq ent (ssget "P" (list (cons 0 "INSERT"))))
 (setq ctent 0)
  (if ent
   (progn
     (while (< ctent (sslength ent))
        (setq selent (ssname ent ctent))
        (xlist)
        (setq ctent (1+ ctent))
      )
    )
    (prompt "\nRIEN A LISTER")
  )
(setvar "highlight" 1)
(setvar "cmdecho" 1)
(princ)
)


(defun xlist ()
  (setq ptype nil)
  (setq ge (entget selent))
  (setq pnom (cdr (assoc 2 ge)))

    (setq pa selent
        attname "VERTEX")

     (bl_def)
    ;(princ pnom)
(if (= 1 (cdr (assoc 66 ge)))  ;entite suit
(while (/= attname "SEQEND")
       (setq pa (entnext pa))
        (if pa (progn
              (setq attname  (cdr (assoc 0  (entget pa))))
              (setq attetiq  (cdr (assoc 2  (entget pa))))

;; ATTPLACE ci-dessous = Point d'insertion de l' ATTRIBUT
              (setq attplace (cdr (assoc 10 (entget pa))))

              (setq attval   (cdr (assoc 1  (entget pa))))
              (setq atthau   (cdr (assoc 40 (entget pa))))

;; ATTPLACE ci-dessous = Point d'insertion du BLOC
;;            (setq attplace (cdr (assoc 10 ge)))

;; Hauteur du texte MICROSCOPIQUE et non pas hauteur de l'attribut
;;            (setq atthau   0.001)


;; Fin Modification
              (setq attrot   (cdr (assoc 50 (entget pa))))


                (if (= attname "ATTRIB") (progn
                           ;(princ attval)(princ "\n")

;;                         (command "_layer" "_m" (strcat "ATT__CON__" attetiq) "")
                           (command "_layer" "_m" (strcat "ATT__VAR__" attetiq) "")

                           (command "_text" attplace atthau (/ (* 180 attrot) pi) attval)
                                         ) 
                ) ;fin de if attrib
            ) ;fin de progn pa
                (= attname "SEQEND")
              
   ) ;fin de if pa

)  ;fin de while
) ; fin de if "entite suit"

)



(defun bl_def()
(setq other_name nil)
(setq other_list nil)
(setq en1 nil)
;(setq list_att xbetiq2)

   (setq en1 (cdr (assoc '-2 (tblsearch "block" pnom))))
      (while (/= nil en1)
	(if (and (= "ATTDEF" (cdr (assoc '0 (entget en1))))
		 (or (= 2 (cdr (assoc '70 (entget en1))))
                     (= 3 (cdr (assoc '70 (entget en1)))) 
                 )
             )
		 (progn  
                    (setvar "lastpoint"  (cdr (assoc '10 ge))) 
                    (setq pointatt (cdr (assoc '10 (entget en1))))
                    (setq attx (car pointatt))
                    (setq atty (cadr pointatt))
                    (setq insatt (strcat "@" (rtos attx) "," (rtos atty)))

;;                  (command "_layer" "_m" (strcat "ATT__CON__" (cdr (assoc '2 (entget en1)))) "")
                    (command "_layer" "_m" (strcat "ATT__CON__"  (cdr (assoc '2 (entget en1)))) "")

                    (command "_text" (cdr (assoc '10 ge)) (cdr (assoc '40 (entget en1))) "0" (cdr (assoc '1 (entget en1))))
	         )
	 )  
	
	(setq en1 (entnext en1))
   ) ;fin de while 1
(princ)
 )

(princ "\nTapez ==> ATT2TXT ") (princ) 

;; (princ "\nPour une selection partielle: Utiliser FILTER auparavant ") (princ) 

 

Autodesk Expert Elite Team

Posté(e)

Coucou,

Peut-être que je dis des bêtises mais un simple champ dynamique pointant sur la valeur de l'attribut souhaité n'est-il pas possible ?
D'autant plus que si je comprends bien ceci

Le 25/08/2023 à 08:23, Raph_38 a dit :

Dans ce bloc "radiateur", il y a 2 attributs (LIBELLE et LIBELLE_2) qui sont automatiquement remplis via des champs, en fonction des éléments paramétriques choisis

la valeur de tes attributs peut changer après que la valeur ait été copiée dans un texte.
Donc le plus sage serait d'insérer un champ dans ton texte pour conserver cet aspect "changeant" de ton attribut. Donc TEXTE > Insérer un champ > Objet > Sélection du bloc désiré > [Nom de l'attribut dans la liste des propriétés visibles]

Bisous,
Luna

Posté(e)

Bonjour,

Tout d'abord, je tiens à vous remercier pour vos retours et votre aide ❤️

@JPhil Super, c'est presque parfait !! 🥰

le seul problème est qu'il faille avoir un texte à coté de chaque bloc pour pouvoir réaliser le copier/coller.

L'idéal serait qu'après avoir sélectionné l'attribut à copier, en cliquant sur une zone du dessin, cela crée un texte en reprenant les paramètres du style de texte par défaut (à voir si j'arrive à trouver un peu de temps pour "lisper" ça, malgré mes faibles connaissances en la matière)

@lecrabe Testé mais cela me crée 2 textes (normal, j'ai 2 attributs) avec des numéros dont je ne connais pas la signification (rien en rapport aux attributs) et dont le point d'insertion est à "l'Ouest" dans le plan, avec un angle de 20° 🤔

@Syl2007 non cela ne réponds pas à ce que je veux mais merci pour ton intervention 😉

@Luna Ce n'est pas exactement ce que je souhaite. 😁

Mes attributs me servent à connaitre les dimensions des radiateurs "paramétrés" mais ils sont visuellement petit pour ne pas gêner l'aspect de l'ensemble. Ce que je veux, c'est pouvoir afficher dans un texte, un des attribut en suffisamment grand pour indiquer sur le plan aux ouvriers le modèle à poser mais tout en gardant la possibilité de pouvoir le déplacer facilement. (et en cas de modifications, le lisp de @JPhil fera parfaitement l'affaire)

Le soucis c'est que mon bloc radiateur n'est pas toujours positionné de la même manière, sa contrainte est d'être aligné aux cloisons/murs du bâtiment et donc se retrouve avec des angles allant de 0 à 360° ce qui implique que les attributs suivent également la même rotation.

Du coup, pour éviter de retourner les plans sur le chantier ou éviter les torticolis à mes gars, je voulais pouvoir mettre un texte reprenant la valeur de l'attribut de mon bloc en faisant un simple clic sur le bloc ou l'attribut puis en cliquant à un endroit du dessin, cela créerait un texte reprenant les infos de l'attribut (en gardant le calque et la police courante)

Je n'ai pas suffisamment de temps (n'étant plus dessinateur mais chargé d'affaires) et de connaissances en lisp pour pouvoir le faire , c'est pourquoi je fais ma demande ici

Raph.

Celui qui pose une question est bête 5 minutes, celui qui n'en pose pas l'est toute sa vie !

Posté(e)
Il y a 1 heure, Raph_38 a dit :

L'idéal serait qu'après avoir sélectionné l'attribut à copier, en cliquant sur une zone du dessin, cela crée un texte en reprenant les paramètres du style de texte par défaut (à voir si j'arrive à trouver un peu de temps pour "lisper" ça, malgré mes faibles connaissances en la matière)

Tente quelque chose comme ça :

(defun c:COPYATT (/ selatt selatt2 objatt objatt2) 
  (setq selatt (nentsel (strcat "\nSélectionner l'attribut ou le texte à copier :")))
  (setq objatt (vlax-ename->vla-object (car selatt)))
  (if (setq selatt2 (nentsel (strcat "\nSélectionner l'attribut ou le texte de destination :"))) 
    (progn (setq objatt2 (vlax-ename->vla-object (car selatt2))) 
           (if 
             (and 
               (or (= (vla-get-ObjectName objatt) "AcDbText") 
                   (= (vla-get-ObjectName objatt) "AcDbMText")
                   (= (vla-get-ObjectName objatt) "AcDbAttribute")
               )
               (or (= (vla-get-ObjectName objatt2) "AcDbText") 
                   (= (vla-get-ObjectName objatt2) "AcDbMText")
                   (= (vla-get-ObjectName objatt2) "AcDbAttribute")
               )
             )
             (vla-put-textstring objatt2 (vla-get-textstring objatt))
           ))
    (command "_TEXT" (getpoint) 4 100 (vla-get-textstring objatt)) ;Hauteur de texte et orientation à 4 et 100g, à ajuster
  )
  (princ)
)

 

Si au moment de sélectionner la destination tu ne sélectionne pas une entité (clic dans le vide ou valide), tu génère un texte.

Les valeurs de hauteur et orientation sont à adapter en fonction de tes besoin dans la ligne 

Ca t'oblige à cliquer une nouvelle fois pour positionner le texte (je trouve pas de manière simple de cliquer dans le vide et récupérer les coordonnées de ce point ...)

Lispeur éternel débutant!
Autocad Map3D 2023
Covadis-Autopist 18.2

Posté(e) (modifié)

Alors je me suis essayé à modifier le lisp CopyATT.

ça fonctionne mais je suis sur que c'est un peu "bricolé" niveau lisp.

si un pro pouvait me dire ce qui ne va pas ou ne pourrait pas aller, merci

;;; 
;;; Copie la valeur du texte d'un attribut de bloc ou texte
;;; et crée un texte avec la valeur copié
;;; 

(defun c:DPATT ( / selatt objatt pt1)
   (setq selatt (nentsel (strcat "\nSélectionner l'attribut ou le texte à copier :")))
   (setq objatt (vlax-ename->vla-object (car selatt)))
   (setq pt1 ( getpoint "\nPoint d'insertion\n" ) )
   (command "texte" pt1 "0" (vla-get-textstring objatt) "")
      (princ)
)

;;; 

Autre point mais là, cela rends le lisp moins généraliste : comment récupérer la valeur de l'attribut "LIBELLE" en cliquant sur le bloc (ce qui m'éviterait de cliquer directement sur l'attribut)

Modifié par Raph_38
correction suite à remarque de Luna

Raph.

Celui qui pose une question est bête 5 minutes, celui qui n'en pose pas l'est toute sa vie !

Posté(e)
Il y a 3 heures, Raph_38 a dit :
(setq pt1 ( getpoint "\nPoint de d'insertion\n" ) )

Coucou, alors je ne suis pas une pro mais je dirais que tu as une erreur sur le texte "Point de d'insertion" 😉

Bisous,
Luna

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é