Aller au contenu

Récupérer la liste des calques gelés dans une fenêtre de présentation


Messages recommandés

Posté(e)

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.

Posté(e)

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

Posté(e)

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

 

Amicalement

Vincent

 

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)

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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+

Posté(e)

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.

Posté(e)

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

j'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.

 

 

Posté(e)

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.

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

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é