Luna Posté(e) le 22 mars 2021 Posté(e) le 22 mars 2021 (modifié) 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é le 5 avril 2021 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é !!
Luna Posté(e) le 22 mars 2021 Auteur Posté(e) le 22 mars 2021 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
Fraid Posté(e) le 29 avril 2021 Posté(e) le 29 avril 2021 merci, je vais m'acheter un décodeur dxf, ^^ https://github.com/Fraiddd
DenisHen Posté(e) le 25 août 2022 Posté(e) le 25 août 2022 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)
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