Dieunis Posté(e) le 22 avril 2010 Posté(e) le 22 avril 2010 Et je repars sur un autre projet et je bloque dès le départ (c'est ragant)Donc j'essaie de récupérer la liste des calques qui sont gélés (ou libérer peu importe) dans les différentes fenêtres d'une présentation. Le but sera de sélectionner le nom d'une présentation dans un liste et qu'autocad n'affiche que les calques servant à cette présentation dans l'espace objet, donc qu'il désactive les calques qui sont gelés dans les fenêtres. Alors j'ai récupérer lla liste des codes dxf d'une fenêtre, ce qui me donne ça : ((-1 . ) (0 . "VIEWPORT") (5 . "5D818") (102 . "{ACAD_XDICTIONARY") (360 . ) (102 . "}") (330 . d'entité: 7eed1dc0>) (100 . "AcDbEntity") (67 . 1) (410 . "PR1 - Attentes au sol SS") (8 . "_F_Fenetre") (48 . 0.05) (100 . "AcDbViewport") (10 374.697 302.514 0.0) (40 . 735.0) (41 . 594.0) (68 . 2) (69 . 2) (12 -3761.09 -4577.88 0.0) (13 0.0 0.0 0.0) (14 1.0 1.0 0.0) (15 500.0 500.0 0.0) (16 0.0 0.0 1.0) (17 3782.26 4602.3 2839.39) (42 . 50.0) (43 . 0.0) (44 . 0.0) (45 . 59.4) (50 . 0.0) (51 . 0.0) (72 . 1000) (331 . ) (331 . d'entité: 7ed0ef98>) (331 . ) (331 . 7ed1a388>) (331 . ) (331 . ) (331 . ) (331 . ) (331 . d'entité: 7ed57698>) (331 . ) (331 . 7ed5e1b8>) (331 . ) (331 . ) (331 . ) (331 . ) (331 . d'entité: 7eee1570>) (331 . ) (331 . 7eee8038>) (331 . ) (331 . ) (331 . ) (331 . ) (331 . d'entité: 7eef6440>) (331 . ) (331 . 7effa250>) (90 . 819232) (281 . 0) (71 . 1) (74 . 0) (110 0.0 0.0 0.0) (111 1.0 0.0 0.0) (112 0.0 1.0 0.0) (79 . 0) (146 . 0.0) (170 . 0) (61 . 5) (348 . d'entité: 7eea1d78>) (292 . 0) (282 . 1) (141 . 0.0) (142 . 0.0) (63 . 250) (421 . 3355443) (361 . )) Les calques gélés sont sous le code 331, ça correspond bien au nombre de calques gelés dans la fenêtre courante.Je ne vois pas comment récupérer une liste de nom de calque avec les infos que j'obtiens.
bseb67 Posté(e) le 22 avril 2010 Posté(e) le 22 avril 2010 Salut dieunis Il te faut donc parcourir la liste des dxf, si le code = 331,faire un entget sur l'entité pointé par le code 331. Pour parcourir un mapcar ou foreach et je te laisse le reste :)si tu coinces, reviens nous voir. a+ Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
zebulon_ Posté(e) le 23 avril 2010 Posté(e) le 23 avril 2010 Bonjour, (defun massoc (key alist / x nlist) (foreach x alist (if (eq key (car x)) (setq nlist (cons (cdr x) nlist)) ) ) (reverse nlist) ) massoc est une fonction construite sur l'exemple de la fonction assoc, sauf qu'elle renvoie la liste des éléments concernés. Si A est la liste ci dessus (massoc 331 A) renvoie la liste des adresses associées au code 331 AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Patrick_35 Posté(e) le 23 avril 2010 Posté(e) le 23 avril 2010 Salut Comme zebulon_ donne une partie de la solution, tu peux faire aussi Retourne tous les code dxf 331(vl-remove-if-not '(lambda(x)(eq (car x) 331)) (entget (car (entsel)))) Et ensuite un mapcar dessus(mapcar '(lambda(x)(cdr (assoc 2 (entget (cdr x))))) (vl-remove-if-not '(lambda(x)(eq (car x) 331)) (entget (car (entsel))) ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Dieunis Posté(e) le 23 avril 2010 Auteur Posté(e) le 23 avril 2010 Merci à vous. [Edité le 23/4/2010 par Dieunis]
Cyrchap Posté(e) le 23 avril 2010 Posté(e) le 23 avril 2010 Il n'y a pas besoin d'un lisp! La création d'un filtre dans le gestionnaire de calque ( Gel de la fenetre eteint) le fait tres bien.Une fois le filtre créé, dans EP je rentre dans EO, je clique sur geler de mon filtre. ( il y a tous les calque gelé de la fenetre qui s'applique à l'objet, ensuite ]e sort de la presentation et je vais dans Objet et uniquement les calques de ma présentation sont activé.A+
Dieunis Posté(e) le 23 avril 2010 Auteur Posté(e) le 23 avril 2010 je suis d'accord, mais pour gérer les filtre de calques, il faut passer par le gestionnaire des calques, et n'ayant du bon matériel pour travailler, ça me fait ramer un max.Si il y avait des barres de controle comme pour les calques, types de lignes, epaisseurs, cotes, je me servirais des filtres, mais en attendant je bidouille.
Dieunis Posté(e) le 28 avril 2010 Auteur Posté(e) le 28 avril 2010 Je reviens demander de l'aide sur ce sujet car je rebloque dans le processus. je fais des test sur une présentation avec une fenetre.en premier je fais une sélection des fenetres de la présentation : (setq list1 (ssget "_X" '((0 . "viewport")(410 . "nom_présentation")))) !list1 Ensuite, je récupère le contenu du jeu de sélection :(setq nb 0) (while (/= (ssname list1 nb) nil)(setq list2 (cons (ssname list1 nb) list2))(setq nb (1+ nb))) !list2 ( )qui correspond à ( ) Après je récupère les infos de chaque entité :(foreach x list2 (setq list3 (cons (entget x) list3))) !list3 (((-1 . ) (0 . "VIEWPORT") (5 . "20E") (102 . "{ACAD_XDICTIONARY") (360 . ) (102 . "}") (330 . d'entité: 72969ed0>) (100 . "AcDbEntity") (67 . 1) (410 . "Présentation1") (8 . "0") (100 . "AcDbViewport") (10 128.707 97.0855 0.0) (40 . 254.307) (41 . 191.92) (68 . 2) (69 . 2) (12 210.429 147.643 0.0) (13 0.0 0.0 0.0) (14 10.0 10.0 0.0) (15 10.0 10.0 0.0) (16 0.0 0.0 1.0) (17 0.0 0.0 0.0) (42 . 50.0) (43 . 0.0) (44 . 0.0) (45 . 396.807) (50 . 0.0) (51 . 0.0) (72 . 1000) (331 . d'entité: 7296b3a0>) (331 . ) (331 . 7296b408>) (90 . 557152) (281 . 0) (71 . 1) (74 . 0) (110 0.0 0.0 0.0) (111 1.0 0.0 0.0) (112 0.0 1.0 0.0) (79 . 0) (146 . 0.0) (170 . 0) (61 . 5) (348 . d'entité: 72969fa8>) (292 . 1) (282 . 1) (141 . 0.0) (142 . 0.0) (63 . 250) (421 . 3355443)) ((-1 . ) (0 . "VIEWPORT") (5 . "20A") (102 . "{ACAD_XDICTIONARY") (360 . ) (102 . "}") (330 . ) (100 . "AcDbEntity") (67 . 1) (410 . "Présentation1") (8 . "0") (100 . "AcDbViewport") (10 128.5 97.5 0.0) (40 . 397.848) (41 . 222.18) (68 . 1) (69 . 1) (12 128.5 97.5 0.0) (13 0.0 0.0 0.0) (14 10.0 10.0 0.0) (15 10.0 10.0 0.0) (16 0.0 0.0 1.0) (17 0.0 0.0 0.0) (42 . 50.0) (43 . 0.0) (44 . 0.0) (45 . 222.18) (50 . 0.0) (51 . 0.0) (72 . 1000) (90 . 819232) (281 . 0) (71 . 1) (74 . 0) (110 0.0 0.0 0.0) (111 1.0 0.0 0.0) (112 0.0 1.0 0.0) (79 . 0) (146 . 0.0) (170 . 0) (61 . 5) (348 . ) (292 . 1) (282 . 1) (141 . 0.0) (142 . 0.0) (63 . 250) (421 . 3355443)))La on voit que je récupère une liste du genre ((list)(list)), 2 listes dans une seule.Et c'est ça qui doit me bloquer dans la suite.(foreach x list3 (if (eq (car x) 331)(setq list4 (cons (entget (cdr x)) list4))) nilj'ai essayé plein d'autres trucs, de codes qui bouclent indéfiniment sur le premier 331, d'autres qui me récupère que les premiers 331.je m'arrache les cheveux.
Dieunis Posté(e) le 28 avril 2010 Auteur Posté(e) le 28 avril 2010 En m'acharnant un peu plus, je suis arrivé à quelquechose.(setq nb 0) (while (/= nb (length list3))(setq list4 (cons (massoc 331 (nth nb list3)) list4))(setq nb (1+ nb))) 2 !list4 (nil ( 7296b408>))le nil en début, c'est parceque la fonction massoc n'a trouvé de 331 dans la première liste testé (l'espace papier)En gelant des calques dans l'espace papier :Commande: !list4 (( ) ( ))Mais j'ai encore 2 liste dans une liste, et la je viens de penser à un truc.... si je remplace cons par append....Commande: (while (/= nb (length list3))(setq list4 (append (massoc 331 (nth nb list3)) list4))(setq nb (1+ nb))) 2 Commande: !list4 ( )Ha Ha plus qu'une liste, j'ai plus qu'a recommencé du début pour simplifier le machin.
Patrick_35 Posté(e) le 28 avril 2010 Posté(e) le 28 avril 2010 Après quelques touffes en moins, un petit coup de pouce ;) (if (setq list1 (ssget "_X" '((0 . "viewport")(410 . "nom_présentation")))) (progn (setq nb 0) (while (/= (setq fenetre (ssname list1 nb)) nil) (setq lst (mapcar '(lambda(x)(cdr (assoc 2 (entget (cdr x))))) (vl-remove-if-not '(lambda(x)(eq (car x) 331)) (entget fenetre)) ) ) (terpri) (princ lst) (setq nb (1+ nb)) ) ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Dieunis Posté(e) le 29 avril 2010 Auteur Posté(e) le 29 avril 2010 Merci Patrick. maintenant je vais chercher comment faire la différence entre le viewport de l'espace papier et celui des fenetres.
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