Aller au contenu

Liste d'attributs de bloc


Invité JLoris

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

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.

Lien vers le commentaire
Partager sur d’autres sites

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")...

Pour 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

Lien vers le commentaire
Partager sur d’autres sites

(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))
 )

Lien vers le commentaire
Partager sur d’autres sites

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é