Aller au contenu

Copier valeur attributs vers tableau


Messages recommandés

Posté(e)

Bonsoir,

 

Je cherche à automatiser la tâche suivante :

 

J'ai un attribut bien précis dans mes cartouches en présentation. Ces attributs champs-dynamiques ont des valeurs différentes dans chaque présentations, il reprennent le nom que j'ai donné à la présentation ainsi qu'un autre champ dynamique comme la date de sauvegarde.

 

Je voudrai copier ces attributs un par un puis les insérer dans une sorte de tableau. Ce sera en quelque sorte un récapitulatif de tous les plans.

 

Passer en revue toutes les présentations je sais faire.

 

Aller chercher la valeur d'un attribut dont je connais le nom... Pas trop... En fait pas du tout... C'est là que j'ai besoin de vous.

 

Une fois que je saurai faire cela, je sais mettre cette valeur en mémoire pour aller l'insérer sous forme de texte quelque part. Sauf que là ce sera pas du texte mais une sorte de clone du champs dynamique avec ses %% et autres \... Hou la la ...

 

Ha ! Tiens, je ne sais pas comment passer de l'espace objet vers espace papier puis revenir...

 

Ne me donnez pas le code tout fait mais juste quelques syntaxes que je puisse faire ma grammaire ensuite SVP !!

 

Merci à vous !

 

 

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Posté(e)

Aller chercher la valeur d'un attribut dont je connais le nom... Pas trop... En fait pas du tout... C'est là que j'ai besoin de vous.

 

Pour retrouver les valeurs d'attributs d'une référence de bloc, on utilise la fonction entnext.

Cette retourne l'entité suivante dans le dessin ou, pour les entités "complexes" (blocs polylignes) les entités qui la compose.

Si on boucle avec entnext sur une référence de bloc la fonction retourne les entités "ATTRIB" de la référence, puis une entité "SEQEND" qui marque la fin des "sous-entités".

Pour chaque attribut on peut tester la valeur de l'étiquette (code DXF 2) et récupérer la valeur de l'attribut (code DXF 1).

 

Exemple avec ref = l'entité référence de bloc (ename)

 

;; récupérer le premier attribut
(setq ent (entnext ref))

;; boucle tant qu'il y a des attributs
(while (and ent
    (setq elst (entget ent))
    (= (cdr (assoc 0 elst)) "ATTRIB")
      )

 ;; Chercher la valeur en fonction de l'étiquette
 (if (= (cdr (assoc 2 elst)) "NOM_ETQUETTE")
   (setq valeur (cdr (assoc 1 elst)))
 )

 (setq ent (entnext ent))
) 

 

Mais cette méthode récupère la valeur de l'attribut, pas le code du champ. pour récupérer le code c'est plus complexe, il faut aller dans las "dictionnaires" attachés à l'attribut (code DXF 360), ce sont des objets imbriqué à plusieurs niveaux, pour arriver à la liste DXF de l'objet "FIELD", il faut faire (sans contrôle, pour éviter les erreurs, il faudrait tester à chaque niveau d'imbrication si l'objet suivant existe) :

 

(entget
 (cdr
   (assoc
     360
     (entget
(cdr
  (assoc
    360
    (dictsearch (cdr (assoc 360 elst)) "ACAD_FIELD")
  )
)
     )
   )
 )
) 

 

Après, il faut reconstituer le code à partir des données de cette liste (et peut-être de la liste de l'objet précedent) mais j'avoue ne pas avoir le courage ce soir de décortiquer tous les codes DXF (en plus ça semble dépendre du type de champ !...).

 

Pour parcourir les présentations dont la fonction layoutlist retourne la liste, tu peux utiliser la variable système CTAB :

 

(setvar "CTAB" "Model") ;; pour activer l'espace objet (modèle)

(setvar "CTAB" "Présentation1") ;; pour activer la Présentation1 

 

[Edité le 25/4/2008 par (gile)]

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

Posté(e)

Un exemple pour retrouver le code d'un champ lié à un objet (la reconstitution du code doit être différente suivant le type de champ)

 

elst = liste DXF de l'attribut

 

Accroche-toi...

 

;; "DICTIONARY" attaché à l'attribut
(if (setq dict1 (cdr (assoc 360 elst)))

 ;; "DICTIONARY" imbriqué dans dict1
 (if (setq dict2 (dictsearch (cdr (assoc 360 elst)) "ACAD_FIELD"))

   ;; "FIELD" imbriqué dans dict2
   (if	(setq field1 (entget (cdr (assoc 360 dict2))))

     ;; "FIELD" imbriqué dans field1
     (if (setq field2 (entget (cdr (assoc 360 field1))))	
(setq
  code (strcat
	 "%		 (vl-string-subst
	   (strcat "ObjId "
		   
		   ;; objet lié au champ
		   (itoa (ename->objectID (cdr (assoc 331 field2))))
	   )
	   "ObjIdx"
	   (cdr (assoc 2 field2))
	 )
	 ">%"
       )
)
     )
   )
 )
)

;; Convertit un ename en ObjectID

(defun ename->objectID (ename)
 (dec (substr (vl-princ-to-string ename) 16 8))
)

;; conversion hexadécimal -> décimal (patrick_35)

(defun dec (n / r s)
 (if (= (type n) 'INT)
   (setq n (itoa n))
 )
 (setq r 0)
 (foreach s (vl-string->list (strcase n))
   (setq r (+
      (lsh r 4)
      (-
	s
	(if (		  48
	  55
	)
      )
    )
   )
 )
) 

 

 

Pour certains champs (je ne les ai pas tous essayé...) qui ne sont pas liés à un objet graphique (date, nom du fichier ...) le code s'obtient simplement par :

 

(setq code (strcat "%%")) 

 

[Edité le 26/4/2008 par (gile)]

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

Posté(e)

Merci à vous pour vos réponses...

 

(Gile), qu'est ce qui c'est passé après 23.00 h pour que tu retrouves le courage d'expliquer les dictionnaires ? Hé hé !!

 

C'est vrai que recréer les champs est une affaire complexe, je pense m'orienter vers l'option suivante :

 

Piquer le coeur de l'attribut pour le transformer en Mtexte, pour ainsi le copier sans concatainer quoi que ce soit. Bien sûr on perd le lien dynamique mais je mettrai en début de lisp une fonction qui effacera, à l'endroit où iront se copier les textes, toute trace d'ancien textes existant. Une capture par polygone et hop ! Y'aura plus rien. Du coup il y aura place nette avant recopie des champs.

 

Ton explication des dictionnaires n'est pas vaine (gile), j'ai d'autres idées mais moins urgentes en tête...

 

Merci à toi P35. J'étudie tout cela et je vous poste mon lisp.

 

A bientôt !

 

[Edité le 26/4/2008 par phil_vsd]

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Posté(e)

Salut,

 

Regarde ici, je pense avoir réussi à écrire une routine qui retourne le code de champ des textes, mtextes et attributs.

La routine retourne nil si le texte ne contient pas de champ.

 

[Edité le 26/4/2008 par (gile)]

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

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é