Aller au contenu

Messages recommandés

Posté(e)

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 ?

Posté(e)

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

Posté(e)

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]

Posté(e)

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

Posté(e)

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.

 

Posté(e)

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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)

 

(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]

Posté(e)

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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)
(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.

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é