Aller au contenu

Messages recommandés

Posté(e)

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

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

 

Si tu utilises les grips, un (ssget) seul suffit

Si rien n'est "grippé", alors on sélectionne.

 

Inutile avec activeselectionset de stocker la sélection dans une variable ;)

 

@+

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)

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.

 

Amicalement

Vincent

 

 

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

Posté(e)

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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)

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"

 

Merci

Amicalement

Vincent

 

 

 

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

Posté(e)

Tout à fait

 

Quand je vois un (if (and ... ... ...) alors), il y a un doublon

De 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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)

Quand je vois un (if (and ... ... ...) alors), il y a un doublon

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

 

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)
Quand je vois un (if (and ... ... ...) alors), il y a un doublon

et 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 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é