Aller au contenu

Récuperer la valeur d\'un Attribut


Messages recommandés

Posté(e)

coucou

 

je n'avais pas vu cette réponse

je reviens donc poser ma question

 

dans le cas contraire je risque de lâcher l'affaire

 

je t'ai donné mon adresse mail par MP

passe moi un fichier avec des explications Tonnerre de Brest !

 

parce que, quand je vois un bloc NGF, j'ai des craintes

 

amicalement tout de même

Posté(e)

Pour info voila le début de la page de l'onglet CADXP

 

5Þ .Þ ..6Þarea1block.html7Þarea2block.html8Þarea3block.html9Þarea4block.html:Þ article.htmlÿÿÿ;Þcenterblock.htmlj®<Þ centerblock.html.bakÿÿÿ=Þ credits.txt>Þleftblock.htmlÿ?Þ mainmenu.htmlÿÿ@Þmainmenu.html.bak˜®AÞrightblock.htmlBÞ summary.htmlÿÿÿCÞ theme.cfg¦€DÞ theme.html€EÞtheme.html.bakÿFÞ theme.php¦€GÞ Thumbs.db¦€²Þimagesÿ¸Þ,styleÿÿ5Þ .Þ ..6Þarea1block.html7Þarea2block.html8Þarea3block.html9Þarea4block.html:Þ article.htmlÿÿÿ;Þcenterblock.htmlj®<Þ centerblock.html.bakÿÿÿ=Þ

Posté(e)

Coucou

 

voici ce que je te propose

la valeur se stocke dans la variable valATT

 

(setq jeusel (ssget "x"
       (list
	 (cons 0 "INSERT")
	 (cons 2 "NGFX")
       )
     ))
(if (> (sslength jeusel) 1)
 (progn
   (alert "le Bloc NGFX n'est pas unique dans le dessin\n Abandon")
   (quit)
   )
 (progn
   (setq valATT (cdr(assoc 1 (entget (entnext (ssname jeusel 0))))))
   (alert (strcat "la valeur de NGFX est :" valATT))
   )
 )

 

Amicalement

Posté(e)

Bonsoir,

 

J’ai bien trouvé les codes de groupe pour SSGET X mais dans une doc de 1989 !, et j’ai pas d’explication sur (Cons 66 1 )

 

Dans l’aide DXF et en français: http:// http://docs.autodesk.com/ACD/2011/FRA/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-7a04.htm

 

Si tu n’es pas familier des codes dxf , cela veut dire que dans ta sélection tu as filtré les références de bloc (Cons 0 "INSERT"), ayant pour nom NGFX (Cons 2 bn), et ayant un ou plusieurs attributs (Cons 66 1).

 

Pour simplifier on peut directement filtrer une référence de bloc avec son nom.

(ssget "_X" '((2 . "NGFX")))

 

A+

 

Apprendre => Prendre => Rendre

Posté(e)

Bonjour,

Merci didier pour ton nouveau code.

J'avais 2 questions, mais tu as deja repondu sur une avec le test sur le bloc unique.

L'autre question : si j'ai 2 attributs dans mon bloc cela va t'il changer le raisonnement ?

 

Amicalement

Posté(e)

L'autre question : si j'ai 2 attributs dans mon bloc cela va t'il changer le raisonnement ?

 

Forcément, la routine donnée par Didier ne récupère que la valeur du premier attribut.

 

C'est pour ça que, excuse moi d'insister, je proposais une routine plus polyvalente avec GetAttribs qui retourne une liste de paires pointées contenant les étiquettes et valeurs pour chaque attribut.

 

Exemple un bloc contient 2 attributs dont les étiquettes sont ATT1 et ATT2 et une variable blk contenant le nom d'entité d'une référence de bloc dont les valeurs d'attribut sont "toto" pour ATT1 et "3.14159" pour ATT2.

 

l'expression : (setq atts (GetAttribs blk))

affecte la liste : (("ATT1" . "toto") ("ATT2" . "3.14159")) à la variable atts

pour avoir la valeur de ATT1 : (cdr (assoc "ATT1" atts))

pour avoir la valeur de ATT2 : (cdr (assoc "ATT2" atts))

 

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

Posté(e)

Merci pour ta réponse Gile, mais pourquoi cette ligne ?

 

affecte la liste : (("ATT1" . "toto") ("ATT2" . "3.14159")) à la variable atts

 

Si j'ai compris le début :

une variable blk contenant le nom d'entité

 

Ici ent = blk

 

(setq ent (ssget "x"

(list

(cons 0 "INSERT")

(cons 2 "NGFX2")

)

))

Ensuite ton autre code:

(defun GetAttribs (ent / elst lst)

;; Entité suivant celle passée en argument

(setq ent (entnext ent))

;; Boucle tant que ent est de type ATTRIB

(while (= "ATTRIB" (cdr (assoc 0 (setq elst (entget ent)))))

;; ajoute à la liste une paire pointée (TAG . valeur) et passe à l'entité suivante

(setq lst (cons (cons (cdr (assoc 2 elst)) (cdr (assoc 1 elst))) lst)

ent (entnext ent)

)

)

;; valeur de retour : la liste inversée

(reverse lst)

)

Posté(e)

Non, la fonction LISP ssget retourne un jeu de sélection (un objet de type PICKSET), donc :

(setq ent (ssget "x"
	 (list
	   (cons 0 "INSERT")
	   (cons 2 "NGFX2")
	 )
  )
)

affecte à la variable ent un jeu de sélection.

 

C'est la fonction ssname qui retourne le nom d'entité (type ENAME) de l'entité contenue dans le jeu de sélection à l'indice spécifié (base 0).

Donc, c'est l'expression :

(ssname ent 0)

qui retourne la première entité contenue dans le jeu de sélection.

 

Ensuite, tu peux appeler la fonction GetAttribs définie dans la routine que j'ai donnée.

 

Je te donne un exemple commenté et te recommande grandement de le décortiquer de tester chaque expression dans l'éditeur Visual LISP pour comprendre ce qui se passe.

;; Commande TEST
;; Affiche la valeur de l'attribut NTFZ contenu dans le bloc NTGFX
;; Appelle la fonction GetAttribs qui doit être chargée.

(defun c:test (/ ss blk atts val) ;_ variables locales

 ;; Sélectionner les références de bloc NGFX
 (setq ss (ssget "_X" '((0 . "INSERT") (2 . "NGFX"))))

 ;; Obtenir la première entité du jeu de sélection
 (setq blk (ssname ss 0))

 ;; Obtenir la liste des attributs et de leurs valeurs
 ;; avec la fonction GetAttribs
 (setq atts (getattribs blk))

 ;; Obtenir la valeur de l'attribut "NGFZ"
 (setq val (cdr (assoc "NGFZ" atts)))

 ;; Afficher la valeur dans une boite d'alerte
 (alert (strcat "Valeur de NGFZ : " val))

 ;; sortie silencieuse
 (princ)
)

;; GetAttribs
;; Retourne une liste de paire pointées (TAG . Value) par attribut contenus dans le bloc
;;
;; Argument
;; ent : le nom d'entité (ENAME) de la référence de bloc

(defun GetAttribs (ent / elst lst);_ variables locales
 
 ;; Entité suivant celle passée en argument
 (setq ent (entnext ent))
 
 ;; Boucle tant que ent est de type ATTRIB
 (while (= "ATTRIB" (cdr (assoc 0 (setq elst (entget ent)))))
   
   ;; ajoute à la liste une paire pointée (TAG . valeur) et passe à l'entité suivante
   (setq lst (cons (cons (cdr (assoc 2 elst)) (cdr (assoc 1 elst))) lst)
  ent (entnext ent)
   )
 )
 
 ;; valeur de retour : la liste de paires pointées
 (reverse lst)
)

 

La commande 'test' aurait pu être écrite de manière plus concise en utilisant des imbrications d'expressions plutôt que d'utiliser de nombreuses variables :

(defun c:test ()
 (alert
   (strcat
     "Valeur de NGFZ : "
     (cdr (assoc "NGFZ"
	  (getattribs
	    (ssname
	      (ssget "_X" '((0 . "INSERT") (2 . "NGFX")))
	      0
	    )
	  )
   )
     )
   )
 )
 (princ)
)

 

En plus du lien donné ci-dessus, je te recommandes grandement la lecture des sujets suivants :

Éléments de syntaxe AutoLISP

Arguments et Variables

 

;; Commande TEST

 

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

Posté(e)

Ok, j'avais effectivement une erreur

J'ai alors repris ton explication, et j'ai corrigé ssname

 

Voila pour le moment: avec un nouveau bloc du nom NGF2

et 2 attributs NGFZ2 et NIVEAU

 

Je vais aussi regarder ton code, mais pour revenir à l'Etideur Visual Lisp, je n'arrive pas lancer mon lisp depuis la console

Je sais que tu a fait un tutorial, je vais allé voir

 

[surligneur] C'est nickel pour ton code, et aussi ton tuto sur l'Etideur Visual Lisp[/surligneur]

 

Encore un grand merci

 

(Defun C:NGF ()

 

(setq ent (ssname (ssget "_X" '((2 . "NGF2"))) 0))

 

(setq atts (GetAttribs ent))

 

(prompt "\n********* NGFZ2 ****** ")

(princ (cdr (assoc "NGFZ2" atts)))

(prompt "\n********* NIVEAU ****** ")

(princ (cdr (assoc "NIVEAU" atts)))

 

); fin defun

;--------------------------------------

 

;; GetAttribs

;; Retourne une liste de paire pointées (TAG . Value) par attribut contenus dans le bloc

;;

;; Argument

;; ent : le nom d'entité (ENAME) de la référence de bloc

 

(defun GetAttribs (ent / elst lst)

 

;; Entité suivant celle passée en argument

(setq ent (entnext ent))

 

;; Boucle tant que ent est de type ATTRIB

 

(while (= "ATTRIB" (cdr (assoc 0 (setq elst (entget ent)))))

 

;; ajoute à la liste une paire pointée (TAG . valeur) et passe à l'entité suivante

 

(setq lst (cons (cons (cdr (assoc 2 elst)) (cdr (assoc 1 elst))) lst)

ent (entnext ent)

)

); fin while

 

;; valeur de retour : la liste inversée

(reverse lst)

 

) ; fin defun

 

[Edité le 24/8/2011 par ASTERIXII]

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é