Dieunis Posté(e) le 4 mars 2010 Posté(e) le 4 mars 2010 Je bloque encore dans le developpement de ma routine. j'ai fait une boite de dialogue dans laquelle s'affiche tous mes calques sauf ceux des xref (merci tramber)dans cette boite je sélectionne plusieurs calques et je clique ok, la séléction est sauvegardée dans la variable "retlist" qui me donne un resusltat du genre : "calque 1" "calque 3" calque 6". le but de la routine est de faire la séléction de tous les objets présent sur les calques choisis.(sssetfirst nil (ssget "_X" ((liste des calques)))) le filtre du ssget pour les calques étant (8 . "nom du calque"), j'ai voulu ajouter 8 à chaque éléments de la liste, alors j'ai tester ça :(foreach x retlist (cons 8 x)))mais il ne retourne que le dernier élément de la liste : 8 . "calque 6" pour tester j'ai assigner le resultat à une variable pour la mettre dans le ssget :(setq list1 (foreach x retlist (cons 8 x)))) mais....Commande: (ssget "_X" ((list1)))*Annuler*fonction incorrecte: (8 . "calque 6") Comment faut faire pour mettre une liste de calque variable comme filtre dans une sélection ?
(gile) Posté(e) le 4 mars 2010 Posté(e) le 4 mars 2010 Salut, Ne jamais oublier que l'interpréteur LISP attend toujours une fonction après une parenthèse*. Quand tu fais :(ssget "_X" ((list1)))L'interpréteur évalue list1 et retourne le résultat de l'évaluation au même endroit, ce qui donne quelque chose comme :(ssget "_X" ((8 . "calque 6") (8 . "calque 12"))))Et il te signifie que (8 . "calque 6") qui est juste derrière la parenthèse ouvrante n'est pas une fonction. Essaye :(ssget "_X" list1) * même quand on utilise l'apostrophe pour éviter l'évaluation d'une liste, il s'agit d'une abréviation d'un appel de la fonction quote.'(1 2 3) = (quote (1 2 3)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Dieunis Posté(e) le 4 mars 2010 Auteur Posté(e) le 4 mars 2010 j'ai essayé : Commande: !list1(8 . "2F_Surfaces locaux") Commande: (ssget "_X" list1)*Annuler*argument point incorrect je n'arrive a mettre qu'un seul élément dans ma variable list1 et en plus il n'a pas l'air de bien l'interpréter. au passage, est ce qu'il y a un post quelque part qui explique comment mettre l'image de fond sous les expressions ? [Edité le 4/3/2010 par Dieunis]
(gile) Posté(e) le 4 mars 2010 Posté(e) le 4 mars 2010 Je n'ai pas bien compris ce que tu fais avant, comme tu parles de listes de calques, je pensais que lst1 contenait une liste de paires pointées : ((8 . "2F_Surfaces locaux")) et pas un paire pointée isolée : (8 . "2F_Surfaces locaux"). Si list1 est une paire pointée, il faut faire :(ssget "_X" (list list1)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Dieunis Posté(e) le 4 mars 2010 Auteur Posté(e) le 4 mars 2010 le retour de ma sélection dans la boite de dialogue Commande: !retlist("0F_DES_Désenfumage" "0F_PB_Appareils sanitaires" "1F_Attentes au sol" "1F_Entrées d'air" "1F_Réservations en PHT" "1F_Réservations en voiles") en fait après je n'arrive pas à faire les paires pointées.celle que j'ai fais avec le foreach doit être une fausse paire pointée.
Patrick_35 Posté(e) le 4 mars 2010 Posté(e) le 4 mars 2010 Salut (ssget "x" (list (cons 8 (apply 'strcat (mapcar '(lambda(x) (strcat x ",")) retlist))))) Mais tu peux éviter des boucles, c'est pour la beauté du code ;) @+ 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 5 mars 2010 Auteur Posté(e) le 5 mars 2010 (ssget "x" (list (cons 8 (apply 'strcat (mapcar '(lambda(x) (strcat x ",")) retlist))))) donc la dedans c'est la virgule qui fait que la paire est pointée et qu'il reconnait le 8 ? j'ai essayé comme ça, mais marche pas non plus : Commande: (ssget "_x" ((mapcar '(lambda(x) (cons 8 x)) retlist))) *Annuler* élément incorrect dans la liste d'arguments: 8 [Edité le 5/3/2010 par Dieunis]
Patrick_35 Posté(e) le 5 mars 2010 Posté(e) le 5 mars 2010 Salut Décompose les fonctions que l'on t'indique et regarde le résultat. commande: !retlist("0F_DES_Désenfumage" "0F_PB_Appareils sanitaires" "1F_Attentes au sol" "1F_Entrées d'air" "1F_Réservations en PHT" "1F_Réservations en voiles") commande: (mapcar '(lambda(x) (strcat x ",")) retlist)("0F_DES_Désenfumage," "0F_PB_Appareils sanitaires," "1F_Attentes au sol," "1F_Entrées d'air," "1F_Réservations en PHT," "1F_Réservations en voiles,") commande: (apply 'strcat (mapcar '(lambda(x) (strcat x ",")) retlist))"0F_DES_Désenfumage,0F_PB_Appareils sanitaires,1F_Attentes au sol,1F_Entrées d'air,1F_Réservations en PHT,1F_Réservations en voiles," commande: (cons 8 (apply 'strcat (mapcar '(lambda(x) (strcat x ",")) retlist)))(8 . "0F_DES_Désenfumage,0F_PB_Appareils sanitaires,1F_Attentes au sol,1F_Entrées d'air,1F_Réservations en PHT,1F_Réservations en voiles,") Reste à faire le ssget @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 5 mars 2010 Posté(e) le 5 mars 2010 Salut, Dans un filtre de sélection, l'opérateur logique par défaut entre les paires pointées est AND. (ssget "_X" '((0 . "LINE") (8 . "calque1")))filtre les entités qui sont des lignes ET qui sont sur le calque1 Si tu fais : (ssget "_X" '((8 . "calque1") (8 . "calque2")))le filtre signifie les entités qui sont sue le caque1 ET qui sont sur le calque2 ce qui est impossible. On peut modifier l'opérateur logique de manière à flitrer les entités qui sont sur le calque 1 OU sur le calque2 (ssget "_X" '((-4 . ""))) Quand la valeur du groupe DXF utilisé dans le filtre est de type chaîne (STR), on peut regrouper plusieurs valeurs dans la même paire pointée en les séparant par une virgule, l'opérateur logique est alors OU (ssget "_X" '((8 . "calque1,calque2")))filtre les entités qui sont sur le calque 1 OU sur le calque2 Avant de programmer pour construire le filtre de sélection, il peut être utile de faire des tests pour déterminer à quoi on veut arriver. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 5 mars 2010 Posté(e) le 5 mars 2010 Pour être puriste et enlever la virgule qui traine à la fin (ssget "x" (list (cons 8 (vl-string-right-trim "," (apply 'strcat (mapcar '(lambda(x) (strcat x ",")) retlist)))))) @+ 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 5 mars 2010 Auteur Posté(e) le 5 mars 2010 (ssget "_X" '((8 . "calque1") (8 . "calque2")))Je savais pas qu'on ne pouvait pas faire ça. (ssget "_X" '((8 . "calque1,calque2")))Et ça je connaissais pas. Merci à vous j'ai tout compris maintenant.
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