Arcasdk Posté(e) le 13 janvier 2009 Posté(e) le 13 janvier 2009 Bonjour à tous, Je souhaite une très bonne année 2009 à tous les autocadiens (et les autres aussi mais bon...d'abord ceux de mon clan ;-) ).... En ce mardi, je cherche à écrire les quelques lignes de code qui me permettront de garder les entités qui sont sélectionnées même si je lance mon programme après. Et si rien n'est sélectionné, alors mon lisp me le demandera plus tard... Je n'ai vraiment aucune idée du nom de la variable qui stocke les entités sélectionnées. Qqn pourrait m'aiguiller? <IMG SRC=http://peronfrederic.free.fr/banniere.jpg></IMG> <a href=www.formu-lan.net>www.FormuLan.net</a>
Patrick_35 Posté(e) le 13 janvier 2009 Posté(e) le 13 janvier 2009 Salut Tu "stockes" ton jeu de sélection dans une variable. Par exemple (or js (setq js (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
Tramber Posté(e) le 14 janvier 2009 Posté(e) le 14 janvier 2009 Sinon, tu regardes dans la famille des fonctions de selection et plus spécialement la fonction sssetfirst ! Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Arcasdk Posté(e) le 14 janvier 2009 Auteur Posté(e) le 14 janvier 2009 Merci à vous deux.Voila ce que j'ai pu faire.... celà fonctionne. Mémoriser un jeu de sélection (defun c:test (/ js x) (or js (setq js (ssget)) (sslength js) (setq x 0) (while (/= x (sslength js)) ;ECRIRE LE PROGRAMME ;FIN DU PROGRAMME (setq x (+ x 1)) ) ) Je voulais utiliser le "entnext" mais cela ne doit pas être approprié pour passer d'entités à entités. [Edité le 15/1/2009 par Arcasdk] <IMG SRC=http://peronfrederic.free.fr/banniere.jpg></IMG> <a href=www.formu-lan.net>www.FormuLan.net</a>
Patrick_35 Posté(e) le 14 janvier 2009 Posté(e) le 14 janvier 2009 Salut Tu peux aussi faire de cette manière (defun c:test (/ ent js x) (or js (setq js (ssget)) (setq x 0) (while (setq ent (ssname js x) ;ECRIRE LE PROGRAMME ;FIN DU PROGRAMME (setq x (1+ x)) ) ) nb : je ne sais pas si tu as compris la subtilité du ou à la lecture de ton 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
Arcasdk Posté(e) le 15 janvier 2009 Auteur Posté(e) le 15 janvier 2009 Coucou, Effectivement la subtilité du "OR" au départ est un peu flou pour moi. Je l'ai traduit par --->"à moins d'une sélection, sélectionner les objets" ....C'est pas très clair hein......????? [Edité le 15/1/2009 par Arcasdk] <IMG SRC=http://peronfrederic.free.fr/banniere.jpg></IMG> <a href=www.formu-lan.net>www.FormuLan.net</a>
Patrick_35 Posté(e) le 15 janvier 2009 Posté(e) le 15 janvier 2009 Re Le or est utilisé comme condition. Tant qu'il rencontre un nil, il continu. par exemple un (or nil nil nil (ma fonction)) permet d'exécuter (ma fonction) Un (or nil nil T (ma fonction)) ne lancera pas (ma fonction) car le 3em argument n'est pas nilUn (or T nil nil (ma fonction) lui non plus ne lancera pas (ma fonction) à cause du premier argument Cela permet dans une condition d'en vérifier d'autres et de dérouler le lisp Un exemple plus concret (setq ent (entget (car (entsel)))) ; sélection d'un objet (or (eq (cdr (assoc 0 ent)) "INSERT") ; Test si c'est un bloc (eq (cdr (assoc 8 ent)) "Un_Calque") ; Test si l'objet est sur le calque "Un_Calque" (eq (cdr (assoc 62 ent)) 1) ; Test si l'objet est de couleur rouge) (ma fonction) ; ma fonction ) (ma fonction) sera utilisé que si l'objet sélectionné n'est pas un bloc, ne se trouve pas sur le calque "Un_Calque" et n'est pas de couleur rouge.Si une seule de ces conditions correspond, (ma_fonction) ne fonctionnera pas. Pour revenir à te demande, (or js (setq js (ssget)) veux dire que si je n'ai pas de sélection, j'en fais une.Comme tu as déclaré la variable js en local, le test ne sert plus à rien car js est par défaut sur nilUn simple (setq js (ssget)) suffit. Tu as la même logique avec un AND, inverse du or ps : j'ai utilisé trois arguments dans le or, mais tu en as autant que tu le souhaites. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Matt666 Posté(e) le 15 janvier 2009 Posté(e) le 15 janvier 2009 Salut patrick_35 ! Merci pour ce petit topo sur ces élégantes petites manières de codage ! Sinon, pourrais tu montrer comment tu fais pour une sélection de type (entsel) ?Perso je faisais ça :(defun c:test (/ ent) (if (or (not (ssget "i")) (/= (sslength (ssget "i")) 1) ) (progn (while (not (setq ent (car (entsel "\nSélectionner un objet du calque à rendre courant: "))))) ent ) (ssname (ssget "i") 0) ) )La routine retourne le nom de l'entité sélectionnée ou à sélectionner.Et depuis que j'ai lu ton topo, je me demande si on ne peut pas faire ça :(defun c:test (/ ent) (or (not (ssget "i")) (/= 1 (sslength (ssget "i"))) (car (entsel "\nSélectionner un objet du calque à rendre courant: ")) (ssname (ssget "i" 0)) ) ) Comment ferais-tu, toi ?Merci ! [Edité le 15/1/2009 par Matt666] "Chacun compte pour un, et nul ne compte pour plus d'un."
Patrick_35 Posté(e) le 15 janvier 2009 Posté(e) le 15 janvier 2009 Salut Matt Ta première routine est bonne pour la bonne raison que tu as deux choix possible avec le (ssget "i").Le jeu de sélection est vide ou il a plus d'un objeta) Oui --> Sélection avec entsel via une boucleb) Non --> Retourne l'objet déjà sélectionné Seul un if permet cela. De plus, comme tu as positionné (not (ssget "i")) en premier dans le or, si la sélection est vide, tu as T comme retour et le or s'arrête comme je l'ai indiqué, donc pas de test sur (/= (sslength (ssget "i")) 1), ce qui évite une erreur sur une sélection vide. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Matt666 Posté(e) le 15 janvier 2009 Posté(e) le 15 janvier 2009 Ok. Donc ça ne fonctionne pas avec la deuxième sur AutoCAD. Sur BricsCAD la deuxième semble bien fonctionner... Merci à toi ! "Chacun compte pour un, et nul ne compte pour plus d'un."
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