Aller au contenu

Afficher un texte lié à une entité


(gile)

Messages recommandés

Salut,

 

Pour répondre à une demande ici, j'ai pondu un petit truc dont je me dis qu'il peut être utile.

Trois commandes :

INPUTXDATA : Attache à chaque entité sélectionnée le texte entré (xdata)

REMOVEXDATA : Supprime le texte attaché à l'entité

DISPLAYDATA : Affiche le texte attaché à l'entité sur la quelle passe le curseur

 

http://discussion.autodesk.com/forums/servlet/JiveServlet/download/127-769810-6371548-224383/DData.gif

 

;; Attache à chaque entité sélectionnée  le texte entré (xdata)
(defun c:inputxdata (/ *error* ent)

 (defun *error* (msg)
   (or	(= msg "Fonction annulée")
(princ (strcat "Erreur: " msg))
   )
   (and ent (redraw ent 4))
   (princ)
 )

 (or (tblsearch "APPID" "DynDisplayData")
     (regapp "DynDisplayData")
 )
 (while (setq ent (car (entsel "\nSélectionnez un objet: ")))
   (redraw ent 3)
   (setq txt (getstring t "\nEntrez le texte à associer à l'objet: "))
   (entmod
     (append (entget ent)
      (list (list -3 (list "DynDisplayData" (cons 1000 txt))))
     )
   )
   (redraw ent 4)
 )
 (princ)
)

;; Supprime le texte attaché à l'entité
(defun c:removexdata (/ n ss ent)
 (if (setq n  -1
    ss (ssget '((-3 ("DynDisplayData"))))
     )
   (while (setq ent (ssname ss (setq n (1+ n))))
     (entmod
(append
  (entget ent)
  ((lambda (l)
     (list (cons -3
		 (subst	'("DynDisplayData")
			(assoc "DynDisplayData" l)
			l
		 )
	   )
     )
   )
    (cdr (assoc -3 (entget ent '("*"))))
  )
)
     )
   )
 )
 (princ)
)

;; Affiche le texte attaché à l'entité sur la quelle passe le curseur
(defun c:displaydata (/ *error* gr ent text ent str norm)

 (defun *error* (msg)
   (or	(= msg "Fonction annulée")
(princ (strcat "Erreur: " msg))
   )
   (and text (entdel text))
   (and ent (redraw ent 4))
   (princ)
 )

 (while (= (car (setq gr (grread T 14 2))) 5)
   (and text (entdel text) (setq text nil))
   (and ent (redraw ent 4))
   (setq pt (cadr gr))
   (if
     (and
(setq ent (ssget pt '((-3 ("DynDisplayData")))))
(setq ent (ssname ent 0))
(setq
  str (cdadr
	(cadr (assoc -3 (entget ent '("DynDisplayData"))))
      )
)
     )
      (progn
 (redraw ent 3)
 (setq size (/ (getvar "VIEWSIZE") 50.)
       norm (trans '(0 0 1) 2 0 t)
       text (entmakex
	      (list
		'(0 . "TEXT")
		'(62 . 1)
		(cons 1 str)
		(cons
		  10
		  (polar (trans pt 1 norm) (/ pi 4) size)
		)
		(cons 40 size)
		(cons 7 (getvar "TEXTSTYLE"))
		(cons 50 (- (getvar "VIEWTWIST")))
		(cons 210 norm)
	      )
	    )
 )
      )
   )
 )
 (and text (entdel text) (redraw ent 4))
 (princ)
) 

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

Lien vers le commentaire
Partager sur d’autres sites

 

Hello Gilles

 

Merci pour tes idees originales mais toujours fort utiles ! :)

 

Cela me semble sympa, on pouvait arriver a faire presque la meme chose

en magouillant avec les Hyperliens ... :exclam:

 

Avec ta routine, c plus simple et facilement exploitable (Vrai AutoCAD requis par contre)

 

Merci, Le Decapode

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

hello gile

 

ca a l'air sympa comme truc

 

donc poussons le bouchon un peu trop loin ( si on peut bien sur )

j'ai pas essayé encore le LISP

 

les XDATA je connais pas

 

est ce que ca permet de mettre plusieurs XDATA pour la meme entité ?

le (cons 1000 txt ) en gere 1

si on met un ( cons 1001 txt ) ca en gere un deuxieme ?

 

faut que je testes pour piger

 

bon week end

 

phil

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Une version qui utilise un texte multiligne avec masque d'arrière plan.

 

Nouvelle version : utilise l'éditeur de texte multiligne pour entrer la donnée à afficher

 

Nouvelle version : utilise l'éditeur de texte multiligne pour modifier une donnée déjà entrée.

 

;; IDATA (gile) version 1.02
;; Lier à chaque entité sélectionnée le texte multiligne entré (xdata)
;; ou modifier un texte multiligne déjà lié

(defun c:idata (/ *error* addDynDisplayData ent lastent pt mtxt)
 (vl-load-com)

 (defun *error* (msg)
   (and msg
 (/= msg "Fonction annulée")
 (princ (strcat "Error: " msg))
   )
   (and ent (redraw ent 4))
   (princ)
 )

 ;; Lier une xdata (mtext) à l'entité
 (defun addDynDisplayData (ent mtxt / elst)
   (setq elst (entget mtxt))
   (entmod
     (append (entget ent)
      (list
	(list
	  -3
	  (append
	    (list
	      "DynDisplayData"
	      (cons
		1000
		(if (< 16.0 (atof (substr (getvar 'acadver) 1 4)))
		  (vla-FieldCode (vlax-ename->vla-object mtxt))
		  (cdr (assoc 1 elst))
		)
	      )
	      (cons 1000 (cdr (assoc 7 elst)))
	    )
	    (if	(assoc 90 elst)
	      (list
		(cons 1070 (cdr (assoc 90 elst)))
		(cons 1071 (cdr (assoc 63 elst)))
		(cons 1040 (cdr (assoc 45 elst)))
	      )
	    )
	  )
	)
      )
     )
   )
   (entdel mtxt)
 )

 (or (tblsearch "APPID" "DynDisplayData")
     (regapp "DynDisplayData")
 )
 (while (setq ent (entsel "\nSélectionnez une entité: "))
   (setq lastent (entlast)
  pt	  (cadr ent)
  ent	  (car ent)
   )
   (redraw ent 3)
   (if	(setq data (cdadr (assoc -3 (entget ent '("DynDisplayData")))))
     (progn
(entmake
  (append
    (list
      '(0 . "MTEXT")
      '(100 . "AcDbEntity")
      '(100 . "AcDbMText")
      (cons 10 (cadr (grread T)))
      (cons 40 (/ (getvar 'viewsize) 50.0))
      (cons 1 (cdr (assoc 1000 data)))
      (cons 7 (cdr (assoc 1000 (cdr (member (assoc 1000 data) data)))))
    )
    (if	(assoc 1070 data)
      (list
	(cons 90 (cdr (assoc 1070 data)))
	(cons 63 (cdr (assoc 1071 data)))
	(cons 45 (cdr (assoc 1040 data)))
      )
    )
  )
)
(redraw ent 3)
(setq mtxt (entlast))
(vl-cmdf "_.mtedit" mtxt)
(while (< 0 (getvar 'cmdactive)) (command pause))
(addDynDisplayData ent mtxt)
     )
     (progn
(initdia)
(vl-cmdf "_.mtext" "_non" pt "_width" "0")
(if (not (equal lastent (entlast)))
  (progn
    (setq mtxt (entlast))
    (addDynDisplayData ent mtxt)
  )
)
     )
   )
 )
 (*error* nil)
)

;; RDATA (gile)
;; Supprimer le texte multiligne (xdata) liée à l'entité

(defun c:rdata (/ n ss ent)
 (if (setq n  -1
    ss (ssget '((-3 ("DynDisplayData"))))
     )
   (while (setq ent (ssname ss (setq n (1+ n))))
     (entmod
(append
  (entget ent)
  ((lambda (l)
     (list (cons -3
		 (subst	'("DynDisplayData")
			(assoc "DynDisplayData" l)
			l
		 )
	   )
     )
   )
    (cdr (assoc -3 (entget ent '("*"))))
  )
)
     )
   )
 )
 (princ)
)

;; DDATA (gile)
;; Afficher le texte multiligne lié à l'entité qui se trouve sous le curseur

(defun c:ddata (/ *error* gr ent text ent str norm pt lst)
 (vl-load-com)

 (defun *error* (msg)
   (and msg
 (/= msg "Fonction annulée")
 (princ (strcat "Error: " msg))
   )
   (and text (entdel text))
   (and ent (redraw ent 4))
   (princ)
 )

 (sssetfirst nil nil)
 (while (= (car (setq gr (grread T 14 2))) 5)
   (and text (entdel text) (setq text nil))
   (and ent (redraw ent 4))
   (setq pt (cadr gr))
   (if
     (and
(setq ent (ssget pt '((-3 ("DynDisplayData")))))
(setq ent (ssname ent 0))
(setq lst (cdadr (assoc -3 (entget ent '("DynDisplayData")))))
     )
      (progn
 (redraw ent 3)
 (setq size (/ (getvar "VIEWSIZE") 40.) ; hauteur de texte
       norm (trans '(0 0 1) 2 0 t)
       text (entmakex
	      (append
		(list
		  '(0 . "MTEXT")
		  '(100 . "AcDbEntity")
		  '(100 . "AcDbMText")
		  (cons	10
			(trans
			  (polar (trans pt 1 2) (* pi 1.75) size)
			  2
			  0
			)
		  )
		  (cons 40 size)
		  '(41 . 0.)
		  (cons 1 "")
		  (cons 7 (cdr (assoc 1000 (cdr (member (assoc 1000 lst) lst)))))
		  (cons 210 norm)
		  (cons 11 (trans '(1 0 0) 2 0 T))
		)
		(if (assoc 1070 lst)
		  (list
		    (cons 90 (cdr (assoc 1070 lst)))
		    (cons 63 (cdr (assoc 1071 lst)))
		    (cons 45 (cdr (assoc 1040 lst)))
		  )
		)
	      )
	    )
 )
 (vla-put-TextString (vlax-ename->vla-object text) (cdr (assoc 1000 lst)))
      )
   )
 )
 (*error* nil)
)

  • Upvote 1

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

Lien vers le commentaire
Partager sur d’autres sites

Comme ça semble plaire, j'ai amélioré un peu la chose.

 

 

La saisie du texte à afficher se fait dans l'éditeur de texte multiligne ce qui offre la possibilité d'utiliser toutes les options offertes par cette interface, y compris l'utilisation de champs.

 

 

http://img717.imageshack.us/img717/7158/ddata3.gif

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

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour à tous,

 

Bravo Gile pour cette routine qui est fabuleuse, on peut faire avec cet outil presque un mini SIG avec Autocad, c'est énorme, lié une information à une polyligne c'est génial.

Par contre, serait il possible d'exporter ces informations xdata lié à une entité vers Excel ?

J'ai essayé avec entget entnext et autre mais pas possible et les xdata je ne connais pas du tout.

Merci par avance de votre aide.

 

John

Lien vers le commentaire
Partager sur d’autres sites

  • 7 mois après...
  • 2 ans après...
  • 2 mois après...

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é