Invité JLoris Posté(e) le 11 juillet 2019 Posté(e) le 11 juillet 2019 Bonjour, Je suis en train d'apprendre le Lisp, et je voulais entre autres choses, créer une liste de "paires pointées", devant contenir toutes les étiquettes d'attribut d'un bloc.Dans ce style: LIST: (1 . Attribut1) (2 . Attribut2) etc... J'ai plus ou moins compris qu'il faut faire une boucle WHILE pour récupérer chaque étiquette d'attribut, mais je ne comprends pas comment créer la liste, Merci de m’éclairer un peu
Elun Posté(e) le 5 septembre 2019 Posté(e) le 5 septembre 2019 Salut, J'arrive sûrement après la guerre mais j'ai une fonction nommée (Get-att-list) qui devrait correspondre à ce que tu cherches.Ce qu'il faut savoir, c'est que tu ne peux pas obtenir le nom de l'étiquette d'un attribut avec uniquement des fonctions AutoLisp (du moins à ma connaissance), il faut passer par le langage Visual Lisp. La fonction (Get-att-list) requiert uniquement un nom d'entité et renvoie des messages d'erreur si le type de l'objet renseigné comme argument n'est pas un nom d'entité ou si le type d'objet évalué n'est pas un bloc (car si c'est pas un bloc, ya pas d'attributs :P). ; Récupère une liste de paires pointées de l'ensemble des attributs du bloc spécifié en argument et de leur valeur correspondantes : ;--- La fonction (Get-att-list) possède 1 arguments ;--- e_name correspond au nom de l'entité ciblée ;--- Renvoie une liste de paires pointées composées chacunes du nom de l'attribut et de sa valeur (ex : (("CODEPROJET" "C2244") ("N°_DESSIN" "1030 -") ("TITRE_2" "CALEPINAGE DES MODULES PV")) ) (defun Get-att-list (e_name / Att VLA-B Att_List) (if (= (type e_name) 'ENAME) (if (= (cdr (assoc 0 (entget e_name))) "INSERT") (progn (setq VLA-B (vlax-ename->vla-object e_name)) (setq Att_List (mapcar '(lambda (att) (cons (vla-get-tagstring att) (vla-get-textstring att))) (vlax-invoke VLA-B 'getattributes))) (if Att_List Att_List (prompt "\nAucun attribut n'a été trouvé pour ce bloc.\n") ) ) (prompt (strcat "\nErreur : Le nom d'entité spécifié ne fait pas référence à un bloc." "\nIl fait référence à : " (cdr (assoc 0 (entget e_name))) ".\n" ) ) ) (prompt (strcat "\nErreur : La valeur entrée en argument de la fonction est incorrecte." "\nL'argument attend un nom d'entité de la forme : \"<Nom d'entité: b71b140>\", du type \"ENAME\"." " La valeur que vous avez saisie est du type : " (vl-symbol-name (type e_name)) ".\n" ) ) ) ) Si tu as besoin d'explication sur le fonctionnement parce que tu aimerais comprendre (et apprendre) n'hésites pas.
didier Posté(e) le 5 septembre 2019 Posté(e) le 5 septembre 2019 Coucou Ce que je te propose puisque tu es en phase d'apprentissage est de commencer par l'AutoLispMéfie-toi de ce qui est écrit et qui n'est pas toujours vérifié par les gens qui écrivent (ils sont des milliers à écrire la "bonne parole")...Pour avoir l'étiquette c'est le code 2 dans le DXF de l'ATTRIBJe te passe un squelette de code qui ne vérifie pas que l'entité sélectionnée est un bloc et encore moins qu'il y ait des attributs derrière.C'est vraiment pour apprendre... Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
didier Posté(e) le 5 septembre 2019 Posté(e) le 5 septembre 2019 (setq ent (car (entsel))) (setq ordre 1) (setq att (entnext ent)) (while (/= "SEQEND" (cdr (assoc 0 (entget att)))) (setq listatt (append (list (cons ordre (cdr (assoc 2 (entget att))))) listatt)) (setq ordre (1+ ordre)) (setq att (entnext att)) ) Éternel débutant... Mon site perso : Programmer dans AutoCAD
Messages recommandé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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant