Jon Posté(e) mercredi à 11:50 Posté(e) mercredi à 11:50 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
(gile) Posté(e) mercredi à 14:04 Posté(e) mercredi à 14:04 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
Jon Posté(e) mercredi à 23:12 Auteur Posté(e) mercredi à 23:12 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?
(gile) Posté(e) jeudi à 06:53 Posté(e) jeudi à 06:53 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
Jon Posté(e) jeudi à 21:35 Auteur Posté(e) jeudi à 21:35 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.
(gile) Posté(e) jeudi à 23:03 Posté(e) jeudi à 23:03 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
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