Aller au contenu

Explore-DXF


Luna

Messages recommandés

Coucou,

 

Afin d'apprendre la gestion des listes DXF et la manière dont on peut récupérer certaines infos en fonction des types d'entités, j'ai bien souvent été obligée de regarder les listes DXF de ces entités via (entget). Le soucis c'est que l'affichage de ces listes se font sur une seule ligne et lorsqu'il faut se balader d'une entité à une autre, cela peut s'avérer un peu long et fastidieux >w<

 

Ce n'est que récemment que je me suis écrit cette fonction (je suis une quiche en récursivité donc c'est forcément optimisable/améliorable mais bon...^^") pour me faciliter mes recherches et études d'entités AutoCAD. Je me suis dit que cela pourrait éventuellement intéresser quelques personnes donc je la poste ici :3

;--- Nom de la fonction		[]-----------------------[] Explore-DXF []-----------------------[]
;--- Date de création		> 22/02/2021
;--- Dernière modification	> 05/04/2021
;--- Auteur(e)			> Luna
;--- Version			> 2.1.0
;--- Classe			> "DtObj"

;--- But et domaine d'application													;
;	>																;
;																	;
;--- Déclaration des arguments 														;
;	La fonction (Explore-DXF) possède 3 argument(s) :										;
;		¤ entlist	> correspond à la list DXF de l'entité que l'on souhaite explorer.					;
;			(type entlist) = 'LST	| Ex. :	(entget (car (entsel))), (entget (car (entsel)) "*"), ...			;
;																	;
;		¤ n		> correspond au nombre limite de niveau d'exploration que l'on autorise. Cela peut permettre d'éviter	;
;				les boucles intempestives lors de l'exploration ou bien de limiter le temps d'exécution de la fonction.	;
;				Cette variable doit donc forcément être un nombre entier positif, sachant que les risques de boucles	;
;				peuvent survenir à presque tous les niveaux, à partir du niveau 3 ou plus.				;
;			(type n) = 'INT		| Ex. :	1, 2, 5, ...									;
;																	;
;		¤ lst		> correspond à la liste des codes DXF que l'on souhaite développer pour l'exploration, permettant de	;
;				filtrer certains codes DXF que l'on peut juger superflus pour l'exploration en cours.			;
;			(type lst) = 'LST	| Ex. :	'(330 331 340 350 360), '(330 360), ...						;
;																	;
;		¤ flag		> permet de définir si l'on souhaite générer un fichier .txt pour l'extraction et la sauvegarde des	;
;				données.												;
;			(type flag) = 'SYM	| Ex. :	T si l'on souhaite l'export, nil sinon.						;
;																	;
;--- Retour																;
;	La fonction (Explore-DXF) renvoie l'ensemble des listes DXF des entités correspondant à la recherche demandée dans l'historique	;
;	de commande sous forme de liste lisible et ordonnée. La fonction en elle même ne renvoie rien à la fin de l'exécution.		;
;	Ex. : (explore-dxf (car (entsel)) 1 '(330 340 350 360) T) renvoie								;
;Explore DXF in progress from "CIRCLE" (<Nom d'entité: 88a0a680>) :									;
;      (-1 . <Nom d'entité: 88a0a680>)													;
;      (0 . CIRCLE)															;
;      (330 . <Nom d'entité: 37f2c9f0>)													;
;      (5 . 4924D0)															;
;      (100 . AcDbEntity)														;
;      (67 . 0)																;
;      (410 . Model)															;
;      (8 . UBS-900-Fenêtre de Présentation)												;
;      (48 . 0.5)															;
;      (100 . AcDbCircle)														;
;      (10 1.90099e+06 3.16223e+06 236.333)												;
;      (40 . 1.1)															;
;      (210 0.0 0.0 1.0)														;
;																	;
;->  "BLOCK_RECORD" (<Nom d'entité: 37f2c9f0>) at 330 code, from "CIRCLE" object :							;
;         (-1 . <Nom d'entité: 37f2c9f0>)												;
;         (0 . BLOCK_RECORD)														;
;         (5 . 1F)															;
;         (102 . {ACAD_XDICTIONARY)													;
;         (360 . <Nom d'entité: 37f2dcd0>)												;
;         (102 . })															;
;         (330 . <Nom d'entité: 37f2c810>)												;
;         (100 . AcDbSymbolTableRecord)													;
;         (100 . AcDbBlockTableRecord)													;
;         (2 . *Model_Space)														;
;         (360 . <Nom d'entité: 37f2ca00>)												;
;         (340 . <Nom d'entité: 37f2ca20>)												;
;         (70 . 0)															;
;         (280 . 1)															;
;         (281 . 0)															;
;																	;
;End of exploration...															;
;																	;
;--- Modifications apportées par rapport à la version précédente									;
;	> Ajout de la variable flag et de la possibilité de générer un fichier .txt pour l'extraction et la sauvegarde des données DXF.	;
;																	;

(defun Explore-DXF (entlist n lst flag / space DXF-prompt entlist e i file str s c)

	(defun space (n / str)

		(setq str "")
		(repeat n
			(setq str (strcat str " "))
		)
		str

	) ;; End of (defun space)

	(defun DXF-prompt (entlist i code e / str e)

		(setq str
			(strcat s (itoa c) "."
				(space (* i 2))
				"\""
				(cdr (assoc 0 entlist))
				"\" ("
				(vl-prin1-to-string (cdr (assoc -1 entlist)))
				") at "
				(itoa code)
				" code, from \""
				e
				"\" object : "
			)
		)
		(if (and flag
			 file
			 str
		    )
			(write-line (strcat "\n" str "\n") file)
			(prompt (strcat "\n" str "\n|"))
		)
		(mapcar
			'(lambda (e)
				(setq str (strcat (space (+ (* (1+ i) 2) 5)) (vl-prin1-to-string e)))
				(if (and flag
					 file
					 str
				    )
					(write-line str file)
					(prompt (strcat str "\n|"))
				)
			)
			entlist
		)
		(if (<= (setq i (1+ i)) n)
			(progn
				(setq s (strcat s (itoa c) ".")
				      c 0
				)
				(foreach e entlist
					(cond
						((and (member (car e) lst)
						      (= (type (cdr e)) 'ENAME)
						      (entget (cdr e))
						      (setq c (1+ c))
						 )
							(DXF-prompt (entget (cdr e)) i (car e) (cdr (assoc 0 entlist)))
						)
					)
				)
				(if (< (strlen s) 3)
					(setq c 0
					      s ""
					)
					(setq c (atoi (substr s (+ 2 (vl-string-position (ascii ".") (substr s 1 (1- (strlen s))) nil t)) (1- (strlen s))))
					      s (substr s 1 (1+ (vl-string-position (ascii ".") (substr s 1 (1- (strlen s))) nil t)))
					)
				)
			)
		)
		(setq i (1- i))

	) ;; End of (defun DXF-prompt)

	(setq i 0
	      s ""
	      c 0
	)
	(setq str
		(strcat "Explore DXF in progress from \""
			(cdr (assoc 0 entlist))
			"\" ("
			(vl-prin1-to-string (cdr (assoc -1 entlist)))
			") : "
		)
	)
	(if (and flag
		 (setq file (getfiled "Save file - DXF export"
				      (strcat (getvar "DWGPREFIX") (rtos (getvar "CDATE") 2 0) "_" (vl-filename-base (getvar "DWGNAME")) " - " (cdr (assoc 0 entlist)) ".txt")
				      "txt"
				      45
			    )
		 )
		 (setq file (open file "w"))
		 str
	    )
		(write-line (strcat str "\n") file)
		(prompt (strcat "\n" str "\n|"))
	)
	(mapcar
		'(lambda (e)
			(setq str (strcat (space (+ i 6)) (vl-prin1-to-string e)))
			(if (and flag
				 file
				 str
			    )
				(write-line str file)
				(prompt (strcat str "\n|"))
			)
		)
		entlist
	)
	(if (> n 0)
		(foreach e entlist
			(cond
				((and (member (car e) lst)
				      (= (type (cdr e)) 'ENAME)
				      (entget (cdr e))
				      (setq c (1+ c))
				 )
					(DXF-prompt (entget (cdr e)) (setq i 1) (car e) (cdr (assoc 0 entlist)))
				)
			)
		)
	)
	(if (and flag
		 file
	    )
		(write-line "\nEnd of exploration..." file)
		(prompt "\nEnd of exploration...")
	)
	(if (and file
		 (not (close file))
	    )
		(prompt "\nFile has been created !")
	)
	(princ)

)

A vrai dire, je remercie VDH-Bruno car je me suis inspirée d'un de ses messages pour écrire cette fonction :)
Explore-DXF (2.1.0 - 05-04-2021).LSP

 

Bisous,

Luna

 

Modifié par Luna
Petite maj de la fonction pour permettre l'utilisation des pleines capacités de la fonction (entget) avec l'accès aux données étendues. Cela modifie cependant l'utilisation de la fonction qui nécessite désormais un (entget) et non un nom d'entité !!
Lien vers le commentaire
Partager sur d’autres sites

Je poste également cette petite fonction qui permet d'alléger la lecture des listes (mais cela reste limiter par le nombre de ligne autorisées dans l'historique de commandes) :

;--- Nom de la fonction		[]-----------------------[] prompt-list []-----------------------[]
;--- Date de création		> 08/03/2021
;--- Dernière modification	> 22/03/2021
;--- Auteur(e)			> Luna
;--- Version			> 1.0.0
;--- Classe			> "BaLst"

;--- But et domaine d'application													;
;	> Permet d'afficher une liste de manière plus lisible dans l'historique de commande en ajoutant des alinéas.			;
;																	;
;--- Déclaration des arguments 														;
;	La fonction (prompt-list) possède 2 argument(s) :										;
;		¤ lst		> correspond à la liste que l'on souhaite afficher							;
;			(type lst) = 'LST	| Ex. :	(entget (entlast)), ((0 1) 2 (3 4) (5 6 7) 8 (9)), ...				;
;		¤ fun		> correspond au tri qu'on désire appliquer à la liste et correspond à la fonction associée à (vl-sort)	;
;			(type fun) = 'SYM	| Ex. :	'<, '>, '(lambda (x) ...), ...							;
;																	;
;--- Retour																;
;	La fonction (prompt-list) renvoie nil, cependant elle permet d'afficher son résultat au fur et à mesure de son exécution dans	;
;	l'historique de commande.													;
;	Ex. : (prompt-list (entget (entlast)) nil) renvoie nil, en affichant sur la ligne de commande :					;
;		(															;
;		   (-1 . <Nom d'entité: 414a0c40>)											;
;		   (0 . "INSERT")													;
;		   (5 . "30342C")													;
;		   (102 . "{ACAD_XDICTIONARY")												;
;		   (360 . <Nom d'entité: 414a0c50>)											;
;		   (102 . "}")														;
;		   (330 . <Nom d'entité: 414a0940>)											;
;		   (100 . "AcDbEntity")													;
;		   (67 . 1)														;
;		   (410 . "Présentation4")												;
;		   (8 . "0")														;
;		   (62 . 5)														;
;		   (48 . 0.1)														;
;		   (100 . "AcDbBlockReference")												;
;		   (2 . "*U1890")													;
;		   (															;
;		      10														;
;		      267.0														;
;		      390.0														;
;		      0.0														;
;		   )															;
;		   (41 . 1.0)														;
;		   (42 . 1.0)														;
;		   (43 . 1.0)														;
;		   (50 . 0.513301)													;
;		   (70 . 0)														;
;		   (71 . 0)														;
;		   (44 . 0.0)														;
;		   (45 . 0.0)														;
;		   (															;
;		      210														;
;		      0.0														;
;		      0.0														;
;		      1.0														;
;		   )															;
;		)															;
;																	;
;--- Modifications apportées par rapport à la version précédente									;
;	> Création de la fonction.													;
;																	;

(defun prompt-list (lst fun / space l i)

       (defun space (n / str)

               (setq str "")
               (repeat n
                       (setq str (strcat str " "))
               )
               str

       )

(defun lstprompt (lst / l)

	(prompt (strcat "\n" (space (* (1- i) 3)) "("))
	(foreach l (if fun (vl-sort lst fun) lst)
		(if (and (listp l) (vl-list-length l))
			(progn (setq i (1+ i)) (lstprompt l) (setq i (1- i)))
			(prompt (strcat "\n" (space (* i 3)) (vl-prin1-to-string l)))
		)
	)
	(prompt (strcat "\n" (space (* (1- i) 3)) ")"))

)

(setq i 1)
(lstprompt lst)
(princ)		

)

 

Bisous,

Luna

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...
  • 1 an après...

Bonjour à la communauté.
Je cherchais la solution que propose @Luna, et je suis tombé dans un très vieux lisp dans mes archives :

(defun c:dxf_lst ()
  (initget "Entité Sous-entité")
  (mapcar 'print
          (entget (car (if (= (getkword "\n[Entité/Sous-entité]< E >: ") "Sous-entité") ;_ Fin de =
                         (nentsel)
                         (entsel)
                       ) ;_ Fin:if
                  ) ;_ Fin:car
          ) ;_ Fin:entget
  ) ;_ Fin:mapcar
  (textscr)
  (princ)
) ;_ Fin de defun

Denis...

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)

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é