SSGET
Création d'un jeu de sélection d'entités
La fonction (ssget) fait une pause dans le programme pour basculer dans l'interface graphique d'AutoCAD et permettre à l'utilisateur de sélectionner des entités à l'écran.
Toutes les possibilités classiques de sélection des entités existantes dans l'interface graphique d'AutoCAD se retrouvent dans le langage de programmation et même bien davantage
Il est possible de faire par exemple une sélection par capture de toutes les entités "cercle" du calque "0", mais aussi de sélectionner tous les "cercles" ou les "ellipses " (par exemple) qui existent dans le dessin même s'ils sont dans un calque inactif voire même gelé.
Syntaxe | (ssget [méthode-sélection] [pt1 [pt2]] [pt-list] [liste-filtres]) |
Arguments | méthode-sélection, optionnel, une chaîne de caractère (string) définissant la méthode de sélection, les méthodes proposées sont :
pt1, pt2 …, les points définissants la zone de sélection choisie : pt-list, une liste de point le cas échéant, trajet capture polygone … liste-filtres, une liste (list) de types d'entités qui filtreront dans toutes les entités sélectionnées pour ne garder que celles qui existent dans le filtre |
Valeur renvoyée | Le nom du jeu de sélection nil si rien n'est sélectionné |
Français | Anglais | Commentaire |
C | _C | Sélection par Capture (Crossing) |
CP | _CP | Sélection par Capture Polygone (Crossing Polygon) |
T | _F | Sélection par Trajet (Fence, Trajet) |
I | _I | Sélection des entités dont le grip est actif (Implied) |
D | _L | Sélection de la dernière entité créée du dessin (Last) |
P | _P | Le dernier jeu de sélection créé (Previous) |
F | _W | Sélection par fenêtre (Window) |
FP | _WP | élection par fenêtre polygone (Window Polygon) |
X | _X | La totalité des entités du dessin, même celles dans des calques gelés, inactifs ou verrouillés |
:E | Seulement ce qui est cliqué par le curseur de sélection, sans capture ou fenêtre automatique si clic dans le vide, comme une sélection par (entsel) | |
:S | Sélection d'une seule entité (Single) |
Il existe aussi une option "_A" qui n'est pas documentée dans l'aide AutoCAD, elle fait comme avec l'option "_X" une sélection de toutes les entités du fichier mais qui ignore les calques gelés. |
Exemples : Syntaxe puis Action :
(setq jeusel (ssget)) |
Invite à sélectionner des entités à l'écran
(setq jeusel (ssget "_C" '(0 0) '(10 10))) |
Sélection de toutes les entités dans une capture rectangulaire depuis
le point 0 en x, 0 en y jusqu'au point 10 en x, 10 en y
(setq liscap '((0 0) (3 1) (5 2) (2 4))) (setq jeusel (ssget "_CP' liscap)) |
Création d'une liste de points et en ligne 2 :
Sélection de toutes les entités contenues dans le polygone (Capture par Polygone) défini par les points de la liste précédemment définie
(setq jeusel (ssget "x" '((0 . "LINE")))) |
Sélection de toutes les entités "ligne" du dessin,
même dans les calques inactifs ou gelés ou non visibles à l'écran.
(setq jeusel (ssget "_C" '((0 . "LINE")))) |
Sélection des lignes situées dans une capture, même si d'autres entités se trouvent dans la capture, elles seront exclues pour ne garder que les lignes qui font l'objet du filtre.
Les combinaisons de mode de filtres sont très puissantes,
pour ne sélectionner que les entités attendues et qui seront groupées dans un jeu de sélection afin de les traiter individuellement ou en bloc par des fonctions lisp.
Par exemple on ne veut sélectionner que
1- les cercles de couleur "rouge"
2- qui ont un rayon de "12.0 "
3- qui sont sur le calque "menuiserie"
4- en choisissant une zone à l'écran (pas la totalité du calque)
Pour filtrer les entités on se sert des codes DXF dans les listes de définition des entités, dans l'exemple, on commence par un "<AND" pour que toutes les conditions soient réunies,
la paire pointée (dotted pair) qui commence par 0 est le type d'entité,
62 c'est la paire pointée (dotted pair) qui contient le numéro de la couleur
40 c'est la paire pointée (dotted pair) qui contient la valeur du rayon
8 c'est la paire pointée (dotted pair) qui contient le nom de calque
et ainsi de suite si on veut choisir d'autres propriétés.
On termine en clôturant la sélection par ""AND>" .
Se référer aux définitions de codes DXF en annexe.
Les filtres peuvent aussi utiliser des caractères génériques, exemples :
Ne sélectionner que des textes composés de chiffres :
(setq ss (ssget "_X" '((0 . "TEXT") (1 . "~*[~0-9]*")))) |
Ne sélectionner que des textes composés de chiffres entre 1 et 9 :
(setq ss (ssget "_X" (list (cons 0 "TEXT") (cons 1 "#")))) |
Ne sélectionner que des textes composés de chiffres entre 1 et 99 :
(setq ss (ssget "_X" (list (cons 0 "TEXT") (cons 1 "##")))) |
Ne sélectionner que des textes composés d'un seul caractère chiffres compris :
(setq ss (ssget "_X" (list (cons 0 "TEXT") (cons 1 "?")))) |
Sélectionner les entités TEXT mais aussi les MTEXT :
(setq ss (ssget '((0 . "*TEXT")))) |
Et ainsi de suite ...
La limite est définie par la réflexion de celui qui écrit le code...
Concernant les modes ":E" et ":S",
(setq jeusel (ssget ":S:E")) |
":E", interdit de faire une sélection par capture ou fenêtre quand on clique dans le vide comme une sélection classique d'AutoCAD, on ne peut sélectionner que des entités par clic avec le curseur de sélection, ce qui rapproche cette option de la sélection par (entsel).
":S", ne permet la sélection d'une seule entité, mais si on clique dans le vide la sélection normale s'enclenche c'est-à-dire capture ou fenêtre et du coup il est possible de sélectionner plusieurs entités.
Donc pour être certain de ne pouvoir sélectionner qu'une seule entité, il faut combiner les deux options.
Utilisation du signe + (plus) pour autoriser plusieurs choix :
(setq ss (ssget "_:S+L+P")) |
Création d'un jeu de sélection en permettant à l'utilisateur de ne choisir qu'un seul objet ou utiliser les modes de sélection Dernier ou Précédent.
Utilisation du signe - (moins) pour interdire certains choix :
(setq ss (ssget "-A")) |
Cette syntaxe interdira à l'utilisateur de choisir une sélection "_all", même s'il le tapait au clavier au message Choix des objets.
Créer un jeu de sélection en filtrant les entités suivant qu'elles sont dans l'espace papier ou dans l'espace objet.
La solution est dans un filtre qui utilise les codes DXF 67 et 410.
Le code 67 est facultatif, mais s'il existe et que sa valeur est de 0 (zéro) cela indique que l'entité est dans l'espace objet, a contrario si la valeur est 1 cela indique que l'entité est dans l'espace papier.
Le code 410 est le nom de l'onglet de la présentation
Donc pour faire un jeu de sélection de toutes les entités de l'espace objet en ignorant celle de l'espace papier :
(setq ss (ssget "X" (list (cons 67 0)))) |
Le jeu de sélection (selection set) "ss" va contenir toutes les entités de l'espace objet, même celles dans un calque gelé, mais aucune entité appartenant à l'espace papier.
À l'inverse :
(setq ss (ssget "X" (list (cons 67 1)))) |
Le jeu de sélection (selection set) "ss" va contenir toutes les entités de l'espace papier, mais aucune entité appartenant à l'espace objet.
Attention : même s'il n'y a pas d'entités dans l'espace papier, la ligne de code précédente va créer un jeu de sélection contenant une entité, il s'agit d'un objet viewport. |
Exemple dans un fichier vierge :
1 2 | (setq ss (ssget "X" (list (cons 67 1)))) (entget (ssname ss 0)) |
Renvoie : ((-1 . <Nom d'entité: 7ffffb08440>) (0 . "VIEWPORT") (5 . "4BC".....
il faudra donc en tenir compte pour le traitement des entités de ce jeu de sélection suivant ce que vous voudrez en faire.
Maintenant, si on sait dans quel onglet de présentation on veut sélectionner une entité, "Présentation1" pour faire simple, on va ajouter au "filtre" le code 410 avec le nom de la présentation renseigné sous forme de chaîne de caractères (string) :
(setq ss (ssget "X" (list (cons 67 1) (cons 410 "Présentation1")))) |
Le jeu de sélection (selection set) "ss" va contenir toutes les entités de l'espace papier ET de la l'onglet "Présentation1", mais aucune entité appartenant à l'espace objet ou aux autres onglets de présentation.
Quelques renseignements supplémentaires pour (ssget):
- Les objets sélectionnés n'apparaissent en surbrillance que si (ssget) est émis sans argument.
- AutoLISP limite à 128 le nombre de jeux de sélections, et si vous dépassez cette limite au 129 ème (ssget) AutoLisp renvoie une erreur :
dépassement du nombre maximum de jeux de sélection.
- Pour supprimer ou plutôt vider un jeu de sélection une fois qu'il n'est plus utile et pour permettre d'en faire d'autres sans atteindre la limite, il suffit le mettre à nil :
(setq jeusel nil) |
ainsi le nom de jeu de sélection en argument passe à nil et on ne peut plus y faire appel, ça libère de la place pour en faire d'autres.
Les jeux de sélection ne sont pas sauvegardés dans le dessin et disparaissent à la fermeture du dessin
revenir au menu JEUX DE SÉLECTION
2 juin 2017,
mise à jour le 27 décembre 2017,
mise à jour le 06 février 2018
mise à jour le 06 avril 2018
mise à jour le 09 mai 2018