zebulon_ Posté(e) le 1 avril 2010 Posté(e) le 1 avril 2010 Bonjour, souvent, un lisp commence par un ssget pour permettre à l'utilisateur de choisir les entités sur lesquelles le lisp doit intervenir. Avant de proposer ce ssget et lorsque la variable PICKFIRST vaut 1, il faudrait pouvoir exécuter le lisp avec les entités comprises dans le jeu de sélection implicite (les "poignées" pour faire simple). Pour faire cela, j'utilise la fonction (ssgetfirst) (if (not (and (= (getvar "PICKFIRST") 1) (setq ss (cadr (ssgetfirst))))) (setq ss (ssget)) ) pour ensuite passer en revue chaque entité du jeu de sélection ss avec une boucle itérative (repeat ou while). Etant donné que j'utilise de plus en plus les fonctions VLISP, il est plus efficace dans ce cas d'utiliser vla-get-activeselectionset. Le problème se situe au niveau du ssgetfirst, puisqu'il ne crée pas de jeu de sélection actif et il faut préférer (ssget "_I") qui crée un jeu de sélection avec les entités comprises dans le jeu de sélection implicite. (if (not (and (= (getvar "PICKFIRST") 1) (setq ss (ssget "_I")))) (setq ss (ssget)) ) (vlax-for ent (vla-get-activeselectionset AcDoc) (vlax-dump-object ent)) 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 1 avril 2010 Posté(e) le 1 avril 2010 Salut Si tu utilises les grips, un (ssget) seul suffitSi rien n'est "grippé", alors on sélectionne. Inutile avec activeselectionset de stocker la sélection dans une variable ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebulon_ Posté(e) le 1 avril 2010 Auteur Posté(e) le 1 avril 2010 Effectivement, je me complique la vie pour rien. Même lorsqu'il y a un filtre, ssget regarde d'abord les grips (si PICKFIRST est à 1). Par contre, si je veux mettre un (prompt "message spécifique") avant le ssget et que ce message ne soit s'afficher que quand il n'y a pas de grips, il faut faire quelque chose de ce style (if (not (and (= (getvar "PICKFIRST") 1) (setq ss (ssget "_I" '((-3 ("RBCADSYS"))))))) (progn (prompt "\nSaisir les reprises de bétonnage à modifier :") (setq ss (ssget '((-3 ("RBCADSYS"))))) ) ) (if ss (setq RB_DIST (getdist "\nEspace entre les symboles de reprise : ")) ) ou bien je me complique encore la vie pour rien ? Inutile avec activeselectionset de stocker la sélection dans une variable j'ai bien intégré ce fait, mais j'en avais besoin par ailleur. AmicalementVincent [Edité le 1/4/2010 par zebulon_] 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 1 avril 2010 Posté(e) le 1 avril 2010 J'aurai écrit comme ceci (prompt "\nSaisir les reprises de bétonnage à modifier :") (and (setq ss (ssget '((-3 ("RBCADSYS"))))) (setq RB_DIST (getdist "\nEspace entre les symboles de reprise : ")) (progn ... ) ) De plus, si pickfirst = 0 et sélection avec des grips, le (setq ss (ssget "_I" '((-3 ("RBCADSYS")))) donne nil et donc sert à rien.Si la personne a décidé de mettre cette variable à zéro, c'est qu'elle la connait et donc veut toujours lancer une commande avant une sélection @+ [Edité le 1/4/2010 par Patrick_35] Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebulon_ Posté(e) le 1 avril 2010 Auteur Posté(e) le 1 avril 2010 Je l'avais écrit comme ça aussi, au départ. Mais le prompt s'affiche dans tous les cas, même lorsqu'il n'y a pas de choix des objets à faire par l'utilisateur dans le cas des grips. Ce n'est qu'une question d'esthétique ;) Par ailleurs, il y a un truc qui m'a perturbé en regardant quelques exemples de tes lisps, c'est l'utilisation des fonctions or et and "toutes seules". Bêtement, je ne les imaginais que dans les expressions test des fonctions if, cond ou while. Du coup, j'ai lu l'aide de or et de and plus en détail et j'ai appris que or évalue les expressions de gauche à droite, en cherchant une expression non-nil. Si une telle expression est trouvée, or ne fait plus d'autres évaluations (c'est ce point qui est intéressant !) et retourne T. Si toutes les expressions sont nil, or retourne nil. and stoppe toute évaluation et retourne nil, si l'une des expressions résulte en nil; la fonction retourne T le cas échéant. exemples :(or T (alert "coucou")) ;;; renvoie T et n'affiche pas "coucou"(or nil (alert "coucou")) ;;; renvoie nil et affiche "coucou"(and T (alert "coucou")) ;;; renvoie nil et affiche "coucou" (alert renvoie nil)(and nil (alert "coucou")) ;;; renvoie nil et n'affiche pas "coucou" MerciAmicalementVincent [Edité le 1/4/2010 par zebulon_] 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 1 avril 2010 Posté(e) le 1 avril 2010 Tout à fait Quand je vois un (if (and ... ... ...) alors), il y a un doublonDe plus, tu peux vérifier plusieurs arguments dans un seul AND, comme dans l'exemple précédent (ou or selon) Tu as aussi un peu plus subtile avec un (and (not mon_arg)) qui revient a utiliser un (or mon_arg) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebulon_ Posté(e) le 1 avril 2010 Auteur Posté(e) le 1 avril 2010 Quand je vois un (if (and ... ... ...) alors), il y a un doublonet Dieu sait que j'en ai fait beaucoup... Le if n'est finalement intéressant que lorsqu'il y a un alors ET un sinon. Une dernière chose au sujet de (vla-get-activeselectionset AcDoc) et de l'inutilité de stocker le jeu de sélection dans une variable : si je fais(ssget)(vlax-for ent (vla-get-activeselectionset AcDoc) (vlax-dump-object ent)) et qu'au niveau de (ssget) l'utilisateur ne sélectionne rien, ssget renvoie nil mais le vlax-for se met en branle quand même et se plante.Donc, si je veux l'éviter, il faut faire quelque chose comme ça (if (ssget)(vlax-for ent (vla-get-activeselectionset AcDoc) (vlax-dump-object ent)) (alert "rien sélectionné")) si je peux me passer du sinon, j'utilise or ou and, comme dans ton exemple. (and (ssget) (vlax-for ent (vla-get-activeselectionset AcDoc) (vlax-dump-object ent))) Donc, quand je disais que j'avais besoin de la variable par ailleurs, ce n'étais pas vrai : elle est parfaitement inutile. 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 1 avril 2010 Posté(e) le 1 avril 2010 Quand je vois un (if (and ... ... ...) alors), il y a un doublonet Dieu sait que j'en ai fait beaucoup... Le if n'est finalement intéressant que lorsqu'il y a un alors ET un sinon.Ben oui :D si je fais(ssget)(vlax-for ent (vla-get-activeselectionset AcDoc) (vlax-dump-object ent)) et qu'au niveau de (ssget) l'utilisateur ne sélectionne rien, ssget renvoie nil mais le vlax-for se met en branle quand même et se plante.C'est le jeu de sélection précédent que tu vois Donc, si je veux l'éviter, il faut faire quelque chose comme ça (if (ssget)(vlax-for ent (vla-get-activeselectionset AcDoc) (vlax-dump-object ent)) (alert "rien sélectionné"))Ben oui, mais une chose, n'oublie pas d'effacer le jeu de sélection une fois que tu as fini, car si tu en lances plusieurs, à un moment donné, tu auras un message d'erreur sur IacadSelectionSet (quelque chose comme ça) et impossible de faire la moindre sélection.Donc un (vla-delete (vla-get-activeselectionset AcDoc)) s'impose à la fin de ta boucle si je peux me passer du sinon, j'utilise or ou and, comme dans ton exemple. (and (ssget) (vlax-for ent (vla-get-activeselectionset AcDoc) (vlax-dump-object ent))) Donc, quand je disais que j'avais besoin de la variable par ailleurs, ce n'étais pas vrai : elle est parfaitement inutile.Par forcement, mais elle perd une très grande partie de son utilité @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
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