Bonjour a tous,
Je travail sur AutoCAD LT 2024 et je suis a la recherche d'un moyen de "commander" la commande SELECTRAP directement avec la ligne de commande (sans passer par la fenêtre utilisateur), afin de pouvoir inclure celle-ci a une macro et qu'elle soit complètement autonome.
Cela fait près de 3 mois que je suis a la recherche de cette solutions, alors je serrais très reconnaissant pour toute aide de votre part,
Merci d'avance pour votre temps,
Cordialement, LONGUET Thomas
Le titre du sujet a été modifié par un modérateur pour faciliter la recherche. Titre original:
Sélection rapide (SELECTRAP) via la ligne de commande
Résolu ! Accéder à la solution.
Résolu par CADaSchtroumpf. Accéder à la solution.
Résolu par didier_lourdelle. Accéder à la solution.
Résolu par -didier-. Accéder à la solution.
Bonjour @thomaslonguet_1810
Malheureusement, ce n'est pas possible.
Si ce sont toujours les mêmes filtres qui seront utilisés, il est possible de passer par le lisp et programmer un jeu de sélection avec des qualités propres, genre sélectionner tous les cercles du dessin :
(ssget "X" '((0 . "CIRCLE")))
Amicalement
Didier Aveline
Bonjour @-didier-
Je te remercie pour ta réponse, c'est exactement ce qu'il me fallait.
Et cela ma donner une autre idée mais pour cela il me faudrait pouvoir faire une désélection; j'essaie d'utiliser :
(ssdel ename ss)
Par exemple en faisant une macro de ce genre :
DEPLACER;_ALL;(ssdel CIRCLE ss);;
Mais cela ne semble pas fonctionner, j'ai essayer en écrivant CIRCLE des différentes manière que j'ai trouver en feuilletant le forum mais je n'ai rien trouver. Je pense que je n'ai tout simplement pas compris comment cela fonctionne.
Bien cordialement
Il y a plus simple : utiliser la commande 'filter', même sans être un pro en AutoLISP.
Ça fonctionne sur AutoCAD LT, bien avant que l'AutoLISP soit disponible dans LT 2024.
Il y a surtout la possibilité d’enregistrer les 'Filtres nommés'.
Il existe bien d'autres possibilités, comme le filtrage des cercles avec un diamètre supérieur à 10 sur un calque spécifique.
Cela permet également de créer des filtres complexes qui seront utilisés dans l'exemple de @-didier- , mais c'est un autre sujet...
Si vous avez besoin d'une autre correction ou d'aide supplémentaire, n'hésitez pas à demander.
Bonjour @didier_lourdelle
Sans vouloir te contredire à tout prix, je note dans la question qu'il faut pourvoir l'utiliser en ligne de commande.
Que ce soit "filtre" ou "selectrap", la possibilité de se passer de la case de dialogue n'existe pas.
Amicalement
Didier Aveline
Bonjour @didier_lourdelle
Merci pour ta réponse,
Effectivement la commande FILTRE est bien pratique, mais comme elle ne peut pas être utiliser sans la fenêtre utilisateur j'avais abandonner l'idée.
Mais si tu connais une alternative je suis preneur 😁
Pour l'utilisation les LISP est ce qu'il existe un "dictionnaire" qui regroupe les noms des objets de autoCAD a rentrer dans les LISP ?
Par exemple : Cote = dimension
Cercle = Circle
TextMult = MTEXT
?
Merci a vous
En ligne de commande tu saisis
(cdr (assoc 0 (entget (car (entsel)))))
et tu cliques sur l'objet dont tu veux connaitre le type DXF
Olivier Eckmann
Avec les ExpressTools, il y a la commande SSX qui crée un filtre en ligne de commande. (A voir avec une LT 2024...)
Autrement je me suis constitué une commande en lisp pour créer un filtre en mode dynamique.
Après avoir lancer la commande DYN_FILTER, on balade le curseur sur des objets du dessin et les principaux codes DXF s'affichent sur la barre d'information (à la place des informations des coordonnées).
Si le filtre qui est affiché te convient, tu valides simplement par un clic-droit sur la souris.
Une liste des principaux codes DXF s'affiche alors en ligne de commande, qui va te permettre, si tu le désire, de faire un filtre plus général pour sélectionner plus d'entités correspondantes: Un clic-droit va afficher le pop-up où tu pourra cliquer directement le code à enlever, ou le taper en ligne de commande. Entrée va valider le filtre et sélectionner tous les objets correspondant: les grips seront activés sur ceux-ci.
Cela demande de connaître les principaux codes DXF pour un emploi efficace:
exemple des codes les plus employés:
0 Type d'entité
67 Espace de dessin
8 Calque
6 Type de ligne
62 Couleur
370 Epaisseur de ligne
48 Echelle du type de ligne
39 Largeur de polyligne
38 Elevation
(defun data2string (l_dxf / l_dxf lst_pair grp_el typ_el ch1 ch2 ch)
(setq ch "")
(while l_dxf
(setq lst_pair (car l_dxf))
(setq grp_el (car lst_pair) typ_el (cdr lst_pair))
(cond
((eq (type grp_el) 'INT)
(setq ch1 (itoa grp_el))
)
((eq (type grp_el) 'REAL)
(setq ch1 (rtos grp_el 2 4))
)
((eq (type grp_el) 'STR)
(setq ch1 (strcat "\"" grp_el "\""))
)
(T
(setq ch1 "")
)
)
(cond
((eq (type typ_el) 'INT)
(setq ch2 (itoa typ_el))
)
((eq (type typ_el) 'REAL)
(setq ch2 (rtos typ_el 2 4))
)
((eq (type typ_el) 'STR)
(setq ch2 (strcat "\"" typ_el "\""))
)
((eq (type typ_el) 'LIST)
(setq ch2 (strcat (rtos (car typ_el) 2 4) " " (rtos (cadr typ_el) 2 4) (if (caddr typ_el) (strcat " " (rtos (caddr typ_el) 2 4)) "")))
)
(T
(setq ch2 "")
)
)
(if (eq (type typ_el) 'LIST)
(setq ch (strcat ch "(" ch1 " " ch2 ") "))
(setq ch (strcat ch "(" ch1 " . " ch2 ") "))
)
(setq l_dxf (cdr l_dxf) ch1 "" ch2 "")
)
(strcat "(" ch ")")
)
(defun c:dyn_filter ( / sv_shmnu oldim key pt_sel l_dxfcod m_filt ent dxf_ent typ_ent msg ss)
(setq
sv_shmnu (getvar "SHORTCUTMENU")
oldim (getvar "dimzin")
)
(setvar "dimzin" 0)
(setvar "SHORTCUTMENU" 11)
(while (and (setq key (grread T 4 0)) (not (member key '((2 13) (2 32)))) (/= (car key) 25))
(setq
l_dxfcod nil m_filt nil
pt_sel (osnap (list (caadr key) (cadadr key)) "_near")
)
(if pt_sel
(progn
(setq ss (ssget "_C" pt_sel pt_sel))
(if ss (setq ent (ssname ss 0)))
)
(progn
(setq ent (car (nentselp (list (caadr key) (cadadr key)))))
(cond
(ent
(if (member (cdr (assoc 0 (entget ent))) '("ATTRIB" "VERTEX"))
(progn
(while (/= (cdr (assoc 0 (entget ent))) "SEQEND")
(setq ent (cdar (entget (entnext ent))))
)
(setq ent (cdar (entget (cdr (last (entget ent))))))
)
)
)
)
)
)
(cond
(ent
(setq dxf_ent (entget ent))
(setq l_dxfcod (append '(38 39 48 370 62 6 8 67 0) l_dxfcod))
(if (member (cdr (assoc 0 dxf_ent)) '("HATCH" "INSERT" "MLINE" "SHAPE"))
(if (assoc 2 dxf_ent) (setq l_dxfcod (cons 2 l_dxfcod)))
)
(foreach n l_dxfcod (if (assoc n dxf_ent) (setq m_filt (cons (assoc n dxf_ent) m_filt))))
(grtext -2 (data2string m_filt))
)
(T (grtext -2 ""))
)
)
(cond
(dxf_ent
(setq typ_ent (cdr (assoc 0 dxf_ent)) m_filt nil)
(cond
((eq typ_ent "LWPOLYLINE")
(setq l_dxfcod (cons 43 l_dxfcod))
)
((or (eq typ_ent "POLYLINE") (eq typ_ent "MLINE") (eq typ_ent "SPLINE"))
(setq l_dxfcod (cons 70 l_dxfcod))
)
((or (eq typ_ent "DIMENSION") (eq typ_ent "LEADER"))
(setq l_dxfcod (cons 3 l_dxfcod))
(setq l_dxfcod (cons 70 l_dxfcod))
)
((or (eq typ_ent "ARC") (eq typ_ent "CIRCLE") (eq typ_ent "ELLIPSE"))
(setq l_dxfcod (cons 40 l_dxfcod))
)
((or (eq typ_ent "TEXT") (eq typ_ent "MTEXT") (eq typ_ent "ATTDEF"))
(setq l_dxfcod (cons 7 l_dxfcod))
(setq l_dxfcod (cons 40 l_dxfcod))
)
)
(foreach n l_dxfcod
(if (assoc n dxf_ent)
(setq m_filt
(cons
(if (and (eq (type (cdr (assoc n dxf_ent))) 'STR) (wcmatch (cdr (assoc n dxf_ent)) "*`**"))
(cons n (strcat "`" (cdr (assoc n dxf_ent))))
(assoc n dxf_ent)
)
m_filt
)
)
)
)
(princ (strcat "\n(ssget \"" "_X" "\" " (data2string m_filt) ")"))
(setq msg "")
(initget (foreach n m_filt (setq msg (strcat (itoa (car n)) " " msg))))
(setq msg "")
(setq msg (strcat "\nCode DXF a supprimer? [" (foreach n m_filt (setq msg (strcat (itoa (car n)) "/" msg))) "]"))
(while (setq what (getkword msg))
(setq m_filt (vl-remove (assoc (atoi what) m_filt) m_filt))
(princ (strcat "\n(ssget \"" "_X" "\"" (data2string m_filt) ")"))
(setq msg "")
(initget (foreach n m_filt (setq msg (strcat (itoa (car n)) " " msg))))
(setq msg "")
(setq msg (strcat "\nCode DXF a supprimer? [" (foreach n m_filt (setq msg (strcat (itoa (car n)) "/" msg))) "]"))
)
(if (zerop (getvar "PICKFIRST")) (setvar "PICKFIRST" 1))
(sssetfirst nil nil)
(setq ss (ssget "_X" m_filt))
(if ss
(princ (strcat "\n" (itoa (sslength ss)) " objets similaires sélectionnés."))
)
(sssetfirst nil ss)
)
(T (princ "\nAucune sélection"))
)
(setvar "SHORTCUTMENU" sv_shmnu)
(setvar "dimzin" oldim)
(prin1)
)
Tu as raison, @-didier-. J'ai simplifié ma réponse hier soir, mais il manque ceci. J'attendais les commentaires et retours de @thomaslonguet_1810.
En complément de ma réponse, la commande 'filter' permet de construire et de tester un filtre complexe pour un débutant en AutoLISP.
La sauvegarde du filtre crée un fichier 'filter.nfl' qui est éditable avec le Bloc-notes. C:\Users\<<Dossier Utilisateur>>\AppData\Roaming\Autodesk\AutoCAD LT 2025\R31\fra\Support\filter.nfl
Exemple de ligne dans ce fichier :
Filter.nfl -- Ne modifiez pas ce fichier.
:ai_lisp|FiltreCercle
(0 . "CIRCLE")
:ai_str|FiltreCercle
Objet = Cercle
:ai_lisp|PolyligneOuTexte
(-4 . "<OR")
(0 . "*POLYLINE")
(0 . "*TEXT")
(-4 . "OR>")
:ai_str|PolyligneOuTexte
** Début OR
Objet = Polyligne
Objet = Texte
** Fin OR
:ai_lisp|ExempleForum
(-4 . "<OR")
(0 . "*TEXT")
(0 . "CIRCLE")
(0 . "DIMENSION")
(-4 . "OR>")
:ai_str|ExempleForum
** Début OR
Objet = Texte
Objet = Cercle
Objet = Cote
** Fin OR
Pour répondre à la question @thomaslonguet_1810
Pour l'utilisation les LISP est ce qu'il existe un "dictionnaire" qui regroupe les noms des objets de AutoCAD a rentrer dans les LISP ?
Par exemple : Cote = dimension
Cercle = Circle
TextMult = MTEXT
?
Ton exemple de départ :
(ssget "X" '((0 . "CIRCLE")))
Ton code de base simplifié pour faire des copier-coller à remettre en forme du fichier filter.nfl
:
(ssget "X" '(xxxxx))
(-4 . "<OR")
(0 . "*TEXT")
(0 . "CIRCLE")
(0 . "DIMENSION")
(-4 . "OR>")
Si l'on remplace les XXXXXX par le filtre créé nommé ExempleForum en supprimant les sauts de ligne, on obtient :
(ssget "X" '((-4 . "<OR")(0 . "*TEXT")(0 . "CIRCLE")(0 . "DIMENSION")(-4 . "OR>")))
Cela rend le texte plus clair et structuré, facilitant ainsi la compréhension pour les utilisateurs novices en AutoLISP.
Pour des informations détaillées, vous pouvez consulter la documentation AutoLISP ou des ressources en ligne spécifiques à AutoLISP et AutoCAD.
Attention, il s'agit d'une version LT ! donc pas d'EXPRESS TOOLS...
Christian
Christian REB
@rebcao a écrit :Attention, il s'agit d'une version LT ! donc pas d'EXPRESS TOOLS...
Christian
Merci de la confirmation, c'est pour ça que j'avais exprimé : (A voir avec une LT 2024...)
Cependant je pense que si l'on peut se procurer le fichier ssx.lsp des Express Tools il fonctionnerait très bien sur une LT2024.
En effet ce code date de 1999 et n'a subit aucune modification depuis. Il ne contient donc aucune instruction ActiveX.
Il y aurait juste 2 corrections a apporter pour qu'il fonctionne sans soucis: remplacer la fonction (acet-str-format) par la fonction primaire (strcat) aux lignes 110 et 202.
Je ne publie pas la correction car j’enfreindrais le copyrigth, mais celle-ci est simple à faire. Donc si vous la faites pour votre propre besoin (sans diffusion du fichier) cela est possible de l'utiliser...
Bonjour @thomaslonguet_1810
Merci d’avoir participé à notre communauté ! Vos questions et leurs réponses aident tout le monde. Si des réponses vous paraissent appropriées, voulez vous avoir l'amabilité de cliquer sur le bouton APPROUVER LA SOLUTION en bas de la réponse qui apporte une solution?
Merci de ne pas accepter comme solution le message que vous êtes en train de lire.
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.