CADxp: Liste d'attributs de bloc - CADxp

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

Liste d'attributs de bloc

#1 L'utilisateur est hors-ligne   JLoris 

  • ceinture jaune
  • Groupe : Membres
  • Messages : 9
  • Inscrit(e) : 12-avril 19

Posté 11 juillet 2019 - 10:40

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
0

#2 L'utilisateur est hors-ligne   Elun 

  • Advanced Member
  • PipPipPip
  • Groupe : Membres
  • Messages : 36
  • Inscrit(e) : 04-mars 19

Posté 05 septembre 2019 - 16:39

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.
0

#3 L'utilisateur est hors-ligne   didier 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8359
  • Inscrit(e) : 18-décembre 02
  • LocationPlanète : Terre

Posté 05 septembre 2019 - 17:24

Coucou

Ce que je te propose puisque tu es en phase d'apprentissage est de commencer par l'AutoLisp
Mé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")...
P
our avoir l'étiquette c'est le code 2 dans le DXF de l'ATTRIB
Je 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 ...
Programmer AutoCAD
0

#4 L'utilisateur est hors-ligne   didier 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8359
  • Inscrit(e) : 18-décembre 02
  • LocationPlanète : Terre

Posté 05 septembre 2019 - 17:24

(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 ...
Programmer AutoCAD
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)