Aller au contenu

Quelle est la valeur des attributs ?


Messages recommandés

Posté(e)

Bonjour à tous...

 

Je tente, aujourd'hui, de connaitre les valeurs des deux seuls attributs ("PROF" et "ZGs") d'un Bloc ("PRD_PF_ZG") inclus dans la sélection multiple "SelPRD".

 

Si quelqu'un a une astuce, un conseil... Je suis preneur...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Toi tu n'aimes vraiment pas chercher ...

 

J'ai cherché, mais comme je n'ai pas tout compris (même si c'est bien expliqué).

 

Je cherche à extraire deux attributs d'un même bloque... Et sur ton site, je n'ai pas trouvé ce que je cherchais...

 

Peut-être que ça feras parti d'un exercice...

 

J'ai écris ça, mais évidement, ça plante... :

  (while (setq ent (ssname SelPRD i))
   (setq i      (1+ i)
         elst   (entget ent)
         BlkNom (cdr (assoc 2 elst))
   ) ;_ Fin de setq
   (if (= BlkNom "PRD_PF_ZG")
     (progn (setq Coord    (cdr (assoc 10 elst))
                  elst_att (entnext elst)
                  X        (rtos (car Coord) 2 NbDec)
                  Y        (rtos (cadr Coord) 2 NbDec)
                           ;;Z (rtos (caddr Coord) 2 NbDec)
            ) ;_ Fin de setq
            (while (/= (cdr (assoc 0 elst_att)) "SEQEND")
              ;; nom étiquette
              (setq att_etiq (cdr (assoc 2 elst_att)))
              ;; valeur du contenu de l'attribut
              (cond ((= att_etiq "PROF") (setq Prof (atof (cdr (assoc 1 elst_att)))))) ;_ Fin de cond
              (cond ((= att_etiq "ZGs") (setq Alti (atof (cdr (assoc 1 elst_att)))))) ;_ Fin de cond
            ) ;_ Fin de while
            (princ (strcat "\nX=" X "\tY=" Y))
            ;;(write-line (strcat X "," Y) FichierEcrit)
     ) ;_ Fin de progn
   ) ;_ Fin de if
 ) ;_ Fin de while

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Hello jeune Denis

 

Et si tu t'inspirais de la routine de Kent !?

 

Qui traite le Bloc "FSD" et l'attribut "COMMENT" ...

 

J'ai copie / colle la derniere version de la routine mais la 1ere construit simplement une liste des resultats !

SVP tu regardes BIEN les differentes versions proposees au fil de la discussion ...

 

Bye, lecrabe

 

PS: une bonne petite recherche "subtile" ...

https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/list-block-attribute-value/m-p/3317405/highlight/true#M302136

 

https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/help-with-specific-attribute-extraction/m-p/1521290/highlight/true#M200625

 

 

 


;;
;; Routine from: Kent Cooper
;;
;; The following [adjusted from something I posted here last March] 
;; assumes that you are talking about multiple insertions of the FSD Block, 
;; each with only one Attribute whose tag is "COMMENT" 
;; [it is permissible to have multiple Attributes with the same tag in a Block definition 
;; -- if you do, adjustments would have to be made].  
;; It also assumes that you want the values put into an AutoLISP list, 
;; but it could be altered to write them to a file, display them in the text screen, 
;; make them into Text in the drawing, or other possibilities.  
;; And, it allows for the FSD Block to have Attributes other than that one 
;; -- it could be simplified somewhat if the "COMMENT"-tagged Attribute is the only one.  
;; It leaves the CommentList variable holding the list of all those Attribute values.
;;  

(defun C:FSDA (/ blkss ent foundit att comment); = block FSD's Attributes
 (vl-load-com)
 (if (setq blkss (ssget "_X" '((2 . "FSD"))))
   (progn ; then
     (prompt "\nComments:")
     (repeat (sslength blkss)
       (setq
         ent (ssname blkss 0)
         n 0
       ); setq
       (while
         (and
           (not foundit)
           (setq ent (entnext ent))
           (= (cdr (assoc 0 (entget ent))) "ATTRIB")
         ); end and
         (setq att (vlax-ename->vla-object ent))
         (if (= (vla-get-TagString att) "COMMENT")
           (progn
             (setq
               foundit T
               comment (vla-get-TextString att); value [= "" if none specified]
             )
             (prompt
               (strcat
                 "\n" ; new line
                 (itoa (setq n (1+ n))); step integer upward and convert to text
                 " " ; space separator
                 (if (= comment "") "NO COMMENT SPECIFIED" comment)
               ); strcat
             );prompt
           ); progn
         ); if
       ); while
       (setq foundit nil)
       (ssdel (ssname blkss 0) blkss)
     ); repeat
   ); progn
 ); if
 (princ)
); defun

Autodesk Expert Elite Team

Posté(e)

Merci à toi, Ô Décapode...

 

Mais je n'ai pas fini de comprendre ce Lisp...

 

Ça me fait du boulot en plus... ;) Mais c'est bien ce que je cherche...

 

Encore merci...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Hello Jeune Denis

 

Au plaisir mais je suis comme Didier un Vieux Decapode !

 

Si tu fais une routine Sympa et parametrable, SVP tu la partages avec nous ...

 

Bon WE, Bye, lecrabe

Autodesk Expert Elite Team

Posté(e)

Re-salut lecrabe, je rajeunis de jour en jour avec toi... ;) Je vais bientôt avoir le droit de voter... <img src='http://cadxp.com/public/style_emoticons/<#EMO_DIR#>/laugh.gif' class='bbc_emoticon' alt=':(rires forts):' />

 

Voici donc ma routine :

 

- sélection de plusieurs entités, quelles qu'elles soient,

- tri des Blocs, cette routine ne traite QUE des Blocs nommés "PRD_PF_ZG",

- extrait les X, Y, et les deux attributs "PROF" et "ZGs" pour en faire un listing (fichier .lst),

- le fichier .lst se trouve au même emplacement que le .dwg.

;;; ***********************************************
;;; Sélectionne tout les Blocs PRD pour en faire 
;;; un fichier listing avec X,Y,Prof,ZGs           
;;; ***********************************************
(defun c:ExportPrd ( / Fichier NbDec FichierEcrit SelPRD ent elst BlkNom Coord X Y Prof ZGs)
 (princ "\nDéveloppé par Denis H. (v1.0)")
 (setq Fichier (substr (getvar "dwgname") 1 (- (strlen (getvar "dwgname")) 4)))
 (setq Fichier (strcat (getvar "dwgprefix") Fichier ".lst"))
 (setq FichierEcrit (open Fichier "a"))
 (princ "\nCapturer les bloques 'PRD' :")
 (setq NbDec (getvar "luprec"))
 (setq SelPRD (ssget))
 (write-line (strcat "X,Y,Prof,ZGs") FichierEcrit)
 (repeat (sslength SelPRD)
   (setq ent (ssname SelPRD 0))
   (setq elst   (entget ent)
         BlkNom (cdr (assoc 2 elst))
   ) ;_ Fin de setq
   (if (= BlkNom "PRD_PF_ZG")
     (progn (setq Coord (cdr (assoc 10 elst))
                  X     (rtos (car Coord) 2 NbDec)
                  Y     (rtos (cadr Coord) 2 NbDec)
            ) ;_ Fin de setq
            (while (and (setq ent (entnext ent)) (= (cdr (assoc 0 (entget ent))) "ATTRIB"))
              (setq att (vlax-ename->vla-object ent))
              (if (= (vla-get-TagString att) "PROF")
                (setq Prof (vla-get-TextString att))
              ) ; end if
              (if (= (vla-get-TagString att) "ZGs")
                (setq ZGs (vla-get-TextString att))
              ) ; end if
            ) ; end while
            (princ (strcat "\nX=" X "\tY=" Y "\tProf=" Prof "\tZGs=" ZGs))
            (write-line (strcat X "," Y "," Prof "," ZGs) FichierEcrit)
     ) ;_ Fin de progn
   ) ;_ Fin de if
   (ssdel (ssname SelPRD 0) SelPRD)
 ) ;_ Fin de repeat
 (close FichierEcrit)
 (princ)
) ;_ Fin de defun

Le fichier .lst est éditable avec le bloc-note.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

C'est vrai que ça m'a facilité la vie et fait gagner quelques heures...

 

Bon week-end à tous...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

(setq att1 (cdr(assoc 1 (entget (entnext bloc)))))

(setq att2 (cdr(assoc 1 (entget (entnext (entnext bloc))))))

 

Merci, mais de cette façon, on ne cherche pas le nom de l'attribut, chose que tu as bien précisé.

 

Mais de l'autre façon, n'importe qui pourra adapter cette routine avec autant d'attribut qu'elle le souhaite. Je pense pas seulement aux autres quand je développe, je pense surtout au moment, dans longtemps peut-être, ou je vais devoir remettre les mains dans le cambouis et me creuser la tête pour savoir à quoi je pensais quand j'ai fais cette routine...

 

Je n'ai pas dis que ta solution n'était pas bonne, je dis juste qu'elle ne me "convenait" pas, tes deux lignes ne sont pas forcement claire au premier coup d’œil, tandis que les deux (if (= (vla-get-TagString att) "XXXX") sont plus parlant, à mes yeux... Et donc peut-être à d'autres yeux aussi...

 

Il n'y a rien de péjoratif dans mes propos, et ne le prend surtout pas mal...

 

Ça peut d'ailleurs faire partis d'un exercice sur ton site, enfin, c'est juste une idée...

 

Bon week-end à tous et merci encore à vous...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Bonjour,

 

Sans vouloir citer Didier, mais pourquoi passer par un Lisp alors que l'extraction de données répond nativement à ta demande : sélectionner tous les blocs nommés XXX (à sélectionner dans la liste) et en extraire X, Y et les valeurs d'attributs que tu choisis dans la liste.

 

Olivier

Posté(e)

Coucou

 

En réponse au message #10 :

Tu cites un message que j'ai supprimé

Je l'ai supprimé car j'ai senti que je devenais hors-sujet vu que tu passes en VL...

Je commence à être très usé et très fatigué sans doute

Je ne prends pas mal tes remarques mais j'ai énormément de mal à te suivre...

Posté(e)

Sans vouloir citer Didier, mais pourquoi passer par un Lisp alors que l'extraction de données répond nativement à ta demande : sélectionner tous les blocs nommés XXX (à sélectionner dans la liste) et en extraire X, Y et les valeurs d'attributs que tu choisis dans la liste.

Parce-que mon client ne connait que deux ou trois commandes sur AutoCAD... 2008 qui plus est...

 

Je préfère assister mon client plutôt que de lui dire : démerde-toi, ça existe sur ton AutoCAD...

 

Ce n'est pas ma politique, et je suis sûr que je ne suis pas le seul membre de CadXP à penser ça...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Tu as raison mon crabinou

 

On peut aussi faire ceci

(mapcar '(lambda(x) (vlax-get x 'textstring)) (vl-remove-if-not '(lambda(x) (vl-position (vla-get-tagstring x) '("PROF" "ZGS"))) (vlax-invoke (vlax-ename->vla-object (car (entsel))) 'getattributes)))

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Et voilà... mapcar et lambda font leur apparition... Et comme par hasard, c'est un grand pro qui parle à un novice débutant...

 

J'essai TOUT LES JOURS de comprendre ce duo... Tout les jour, j'ai du mal...

 

Mais un jour viendra, je maîtriserais... Ô oui... Un jour viendra...

 

De plus, pour rendre ma routine plus "universelle", je cherche à créer une sélection, faite pas l'utilisateur, des bloques existants dans le dessin avec un (des) attribut(s), puis sélectionner quelques attributs du bloque sélectionné...

 

Ça, ce serait vraiment bien à partager.. Non ?

 

Je ferais tout ça avec le formidable "ListBox" de Maître (gile)...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

mapcar est une boucle

lambda définit une fonction anonyme

 

Si par exemple, je souhaite ajouter 1 à tous les éléments de cette liste '(1 2 3 4 5), je fais

(mapcar '1+ '(1 2 3 4 5))

 

Maintenant, si je souhaite ajouter 2, je fais

(mapcar '(lambda(x) (+ x 2)) '(1 2 3 4 5))

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Merci pour insister Ô Patrick_35, Ô toi grand pro... Mais avoue que ce n'est pas abordable par un débutant novice qui commence si facilement...

 

J'ai déjà vu l'efficacité de ce duo, par tes lisp, par ceux de (gile), et par d'autres aussi... Mais intégrer ça dans un lisp qui peine à utiliser (command face à la peur d'un (entmake... Comprend moi... Ce n'est pas si évident pour nous que pour toi... Non ?

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Salut,

 

Mes préférences pour récupérer une (ou des) valeur(s) d'attribut.

 

blk = ename d'une référence de bloc

tag = étiquette de l'attribut

 

1. Pour la valeur d'un seul attribut

 

Ma préférée depuis A2012, la plus concise (et la plus rapide) :

(getproprtyvalue blk tag)

 

L'utilisation d'une boucle while avec entnext permet de sortir de la boucle dès que l'étiquette est trouvée.

(defun getAttrib (blk tag / elst val)
 (setq elst (entget (entnext blk)))
 (while (and (= (cdr (assoc 0 elst)) "ATTRIB") (not val))
   (if (= (cdr (assoc 2 elst)) tag)
     (setq val (cdr (assoc 1 elst)))
     (setq elst (entget (entnext (cdr (assoc -1 elst)))))
   )
 )
 val
)

 

L'utilisation de la méthode COM GetAttributes oblige à parcourir toute la collection d'attributs

(defun getAttrib (blk tag / val)
 (foreach att (vlax-invoke (vlax-ename->vla-object blk) 'GetAttributes)
   (if (= (vla-get-TagString att) tag)
     (setq val (vla-get-TextString att))
   )
 )
 val
)

 

 

1. Pour les valeurs de tous les attributs

 

J'aime bien récupérer les valeurs sous la forme d'une liste de paires pointées (étiquette . valeur) qui sera facilement utilisable ensuite avec assoc.

Dans ce cas, l'utilisation de Visual LISP fait gagner en concision, le choix d'utiliser AutoLISP ou Visual LISP est en général guidé par le type de l'objet bloc.

 

Si blk est un ENAME :

(defun getAttribs (blk / elst result)
 (setq elst (entget (entnext blk)))
 (while (= (cdr (assoc 0 elst)) "ATTRIB")
   (setq result (cons
                  (cons (cdr (assoc 2 elst))
                        (cdr (assoc 1 elst))
                  )
                  result
                )
         elst   (entget (entnext (cdr (assoc -1 elst))))
   )
 )
 result
)

 

Si blk est un VLA-OBJECT

(defun getAttribs (blk / result)
 (foreach att (vlax-invoke blk 'GetAttributes)
   (setq result (cons
                  (cons (vla-get-TagString att)
                        (vla-get-TextString att)
                  )
                  result
                )
   )
 )
)

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

Posté(e)

@Denis, en réponse à ton message #15, je suis assez surpris pour ne pas dire vexé de tes sous-entendus.

 

J'ai été responsable du support technique avec une équipe de 4 ingénieurs support chez un revendeur Autodesk.

Nous traitions une centaine d'appel par jour et par personne, et cela pendant 15 ans.

Je ne me suis jamais permis et je n'ai jamais autorisé un de mes ingénieurs de répondre à un client de se "démerder" tout seul. Et ce n'est pas aujourd'hui que je vais commencer.

 

Maintenant, mais ce n'est que mon avis, quand un client ne parvient pas à utiliser nos données alors qu'il dispose d'un outil capable de le faire (AutoCAD 2008 dispose de la fonction d'extraction d'outil), il me semble plus judicieux de lui expliquer comment se servir au mieux de ses outils à travers d'un assistant relativement bien fait pour obtenir le résultat escompté.

On peut au passage lui expliquer que cette commande pourra lui être utile pour récupérer d'autre données comme des longueurs ou des surfaces de polylignes.

Ainsi tout le monde progresse en compétence et en autonomie sur cet outil qu'est AutoCAD.

 

Maintenant si tu préfères lui écrire un programme pour qu'il n'est qu'à appuyer sur un bouton sans comprendre ce qu'il fait, il me semble que c'est là que tu prend ton client pour un "imbécile". A moins que tu ais un intérêt financier à garder tes clients "dépendants" de tes compétences.

 

Olivier

Posté(e)

Hello

 

Pour Info: l'extraction de donnees a commence avec la version 2002 (si je me souviens bien) !

- Avec la 2006, on a eu la possibilite de generer les tableaux avec le contenu des attributs

- Avec la 2008, on a eu toutes les possibilites ACTUELLES !!

 

Desole Denis mais je soutiens Olivier ... Il serait bien que les gens connaissent "un peu mieux" cette fonctionnalite d'extraction de donnees vers .CSV/.XLS/.MDB

RAPPEL: meme si l'extraction vers Excel est "bousillee" par les Windows Update !

http://cadxp.com/topic/44951-extraction-de-donnees-delete-me/

 

Apres si les gens désirent une fonctionnalite "Presse Bouton" sur UN Bloc avec tel ou tel attribut, pourquoi pas une routine Lisp/VLisp !?

Quoique en sauvegardant et en re-utilisant les parametres d'une extraction, c equivalent (ou presque) a une routine Lisp/VLisp !

 

Bon WE, Bye, lecrabe

Autodesk Expert Elite Team

Posté(e)

@Denis, en réponse à ton message #15, je suis assez surpris pour ne pas dire vexé de tes sous-entendus.

Je suis désolé de l'effet produit par ce post, ce n'était certainement pas sa vocation.

 

...il me semble plus judicieux de lui expliquer comment se servir au mieux de ses outils à travers d'un assistant relativement bien fait pour obtenir le résultat escompté.

Mon client, et ce n'est pas le seul, ne savait même pas qu'on pouvait taper des commande dans la ligne de commande, et il n'utilisait AutoCAD que pour faire des zoom et imprimer une présentation (qui n'était plus à l'échelle).

 

Je ne peux pas prendre en charge la totalité de la formation pour arriver jusqu'à des commandes comme "EXTRACTDONNEES".

 

Celà dit, je te donne raison, je préfère aussi apprendre une nouvelle commande à quelqu'un que de lui faire une routine qui fait la même chose... Et c'est ce que je fais en général.

 

Je pense que maintenant, tu es plus qu'un novice, au vu de ce que tu partages.

Merci, je prend ça pour un compliment... ;)

Je comprend le sens de ce duo de commandes, mais de là à les utiliser, il y a encore du chemin...

 

Et je serais toujours "novice"... ;)

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

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é