Aller au contenu

Choix des objets avant de lancer la commande???


Messages recommandés

Posté(e)

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>

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

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>

Posté(e)

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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)

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>

Posté(e)

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 nil

Un (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 nil

Un 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 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 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."

Posté(e)

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 objet

a) Oui --> Sélection avec entsel via une boucle

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

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

Joseph Joubert, 1754-1824

Posté(e)

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

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é