Aller au contenu

Créer une sélection avec la sélection précédente et laisser la main a l'utilisateur pour compléter la sélection.


Messages recommandés

Posté(e)

Bonjour à tous.

 

J'ai pu après pas mal de temps de pause par manque de temps me remettre à apprendre le lisp.

Apres avoir lu, relu et relu introduction à Autolisp et la commande SSGET sur le site de DA-code, j'ai essayé de créer une sélection prenant la sélection précédente et laissant la main à l'utilisateur pour compléter la sélection avant de pouvoir lancer une commande, mais je n'y arrive pas. 

 

J'ai beau tourner la ligne dans tous les sens, une erreur m'est renvoyé.

 

j'ai débuter par ces lignes :

 

 

(defun c:, ( / ss sss )  ;;
 
   (if (or (setq ss (ssget "_I" ))
      (setq ss (ssget "_P+_W")))
     (command-s "-pan" "0,0,0" "0,-100,0"))
 
(princ)
)
 
Le code bloque à (setq ss (ssget "_P+_W"))
 
Pouvez vous m'expliquer la démarche à suivre pour pouvoir procéder 
L'idée est de sélectionner ce dont j'ai besoin au premier étage d'un bâtiment, puis de lancer la commande sur le 1er étage de bâtiment, puis monter à l'étage supérieur qui se situe 100 unité Y plus haute . Si je répète la commande, sans avoir de sélection d'entités dont le grip est actif, alors on récupère la sélection précédente , et laisse la main à l'utilisateur pour pouvoir la compléter. L'idée est de récupérer la sélection d'objet sur plusieurs étage, pour pouvoir la copier ou déplacer.
 
J'y suis arrivé en passant par
 
(defun c:, ( / ss sss )  ;;
 
   (if (or (setq ss (ssget "_I" ))
      (setq sss (ssget "_P")))
 
(if (/= sss NIL )
(command-s "select" "_P" )))
     (command-s "-pan" "0,0,0" "0,-100,0")
 
(princ)
)
 
Mais je me demande si ce n'est pas possible de faire plus simple 
 

 

Posté(e)

Salut,

Tu peux utiliser ssadd pour ajouter des entités à un jeu de sélection.

(defun c:test (/ ss ss2)
  (if (setq ss (ssget))
    (progn
      (command-s "-pan" "0,0,0" "0,-100,0")
      (if (setq ss2 (ssget))
	(repeat	(setq i (sslength ss2))
	  (ssadd (ssname ss2 (setq i (1- i))) ss)
	)
      )
      (sssetfirst nil ss)
    )
  )
  (princ)
)

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut.

moi qui m'était lancé un objectif simple, c'est au delà de mes attentes.

Merci beaucoup 

 j'ai pas compris tout le raisonnement. 

Déjà dans la 1ere ligne, il n'y a pas (ssget "_i") 

Comment il prend en compte le fait qu'il y ai ou non une sélection active? 

 

 

 

 

 

 

 

 

Posté(e)
Il y a 7 heures, Jo le projeteur a dit :

Déjà dans la 1ere ligne, il n'y a pas (ssget "_i") 

Comment il prend en compte le fait qu'il y ai ou non une sélection active? 

Si la variable système PICKFIRST et à 1 (défaut) et qu'il y a des objets sélectionnés (ssget) les prend automatiquement comme (ssget "_I") ; s'il n'y a pas d'objets sélectionnés, l'utilisateur est invité sélectionner des objets.

En pratique, quand on entre TEST,

  • s'il y a des objets sélectionnés, ils sont stockés dans ss
  • s'il n'y a pas d'objets sélectionnés, l'utilisateur est invité faire une sélection qui est stockée dans ss et on fait le panoramique

Puis, l'utilisateur est invité faire une nouvelle sélection (ss2) et les objets de cette sélection sont ajoutés à ss.

Une version commentée :

(defun c:test (/ pickfirst ss ss2)
  
  ;; stocke la valeur courante de PICKFIRST
  (setq pickfirst (getvar "PICKFIRST"))

  ;; force PICKFIRST à 1
  (setvar "PICKFIRST" 1)
  
  (prompt "\nRez de chaussée.")
  ;; récupère la sélection active ou invite l'utilisateur à faire une sélection
  (if (setq ss (ssget))
    (progn
      ;; fait le panoramique
      (command-s "-pan" "0,0,0" "0,-100,0")
      
      (prompt "\nPremier étage.")
      ;; invite l'utilisateur à faire une nouvelle sélection
      (if (setq ss2 (ssget))
	;; ajoute les objets sélectionnés à la première sélection
	(repeat	(setq i (sslength ss2))
	  (ssadd (ssname ss2 (setq i (1- i))) ss)
	)
      )
      ;; active (grippe) l'ensemble des objets sélectionnés
      (sssetfirst nil ss)
    )
  )
  ;; restaure la valeur initiale de PICKFIRST
  (setvar "PICKFIRST" pickfirst)
  (princ)
)

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Ok, je comprend mieux.

 

Une partie que je n'arrive pas comprendre.

 

(repeat	(setq i (sslength ss2))
	  (ssadd (ssname ss2 (setq i (1- i))) ss)

 

Il me semble qu'il y a quelque chose de décrémenté pour être ajouter à une variable (ss il me semble). Mais je n'arrive pas a comprendre comment fonctionne le principe de l'incrémentation et la décrémentation. 

 

 

Posté(e)

Si on "aplatit" les imbrications (LISP n'est qu'imbrications) et qu'on ajoute quelques commentaires.

;; initialise i au nombre d'objets sélectionnés
(setq i (sslength ss2))
;; répète autant de fois qu'il y a d'objets sélectionnés
(repeat	i
  ;; décremente i
  (setq i (1- i))
  ;; récupère l'objet à l'indice i de la sélection
  (setq ent (ssname ss2 i))
  ;; ajoute l'objet à l'autre jeu de sélection
  (ssadd ent ss)
)

Exemple avec 3 objets sélectionnés :

i est initialisé à 3
on répète 3 fois la séquence, soit :

1. on décrémente i (i = 2), on récupère le troisième objet (indice 2) et on l'ajoute à l'autre sélection.

2. on décrémente i (i = 1), on récupère le deuxième objet (indice 1) et on l'ajoute à l'autre sélection.

3. on décrémente i (i = 0), on récupère le premier objet (indice 0) et on l'ajoute à l'autre sélection.

Si on reprend ce code (sans commentaires)

(setq i (sslength ss2))
(repeat	i
  (setq i (1- i))
  (setq ent (ssname ss2 i))
  (ssadd ent ss)
)

Comme la fonction setq renvoie la valeur qui est assignée au symbole, on peut remplace le premier appel à i dans (repeat i...) par l'expression de son initialisation :

(repeat	(setq i (sslength ss2))
  (setq i (1- i))
  (setq ent (ssname ss2 i))
  (ssadd ent ss)
)

de même, on peut remplacer l'appel à i dans l'expression (ssname ...) par l'expression qui décrémente sa valeur :

(repeat	(setq i (sslength ss2))
  (setq ent (ssname ss2 (setq i (1- i))))
  (ssadd ent ss)
)

et, pour finir, remplacer ent dans l'expression (ssadd ...) par l'expression qui assigne sa valeur au symbole 'ent' désormais inutile. sa valeur:

(repeat	(setq i (sslength ss2))
  (ssadd (ssname ss2 (setq i (1- i))) ss)
)

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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é