Communauté
AutoCAD – tous produits - Français
Bienvenue sur les forums AutoCAD d’Autodesk. Partagez vos connaissances, posez des questions, et explorez les sujets AutoCAD populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

AutoCAD : Sélection rapide (SELECTRAP) via la ligne de commande

11 RÉPONSES 11
RÉSOLU
Répondre
Message 1 sur 12
thomaslonguet_1810
556 Visites, 11 Réponses

AutoCAD : Sélection rapide (SELECTRAP) via la ligne de commande

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

Étiquettes (2)
11 RÉPONSES 11
Message 2 sur 12
-didier-
en réponse à: thomaslonguet_1810

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

 

Éternel débutant.. my site for learning : Programmer dans AutoCAD

Didier Aveline

EESignature

Message 3 sur 12

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

Message 4 sur 12

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.

didier_lourdelle1_0-1718294454351.png


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.

EESignature

Didier Lourdelle Consultant, Formateur & Développeur CAO/DAO
Expertises : AutoCAD, AutoCAD LT, AutoCAD Electrical
Langages : VB.NET, Visual LISP, VBA, Diesel (Direct Interpretively Evaluated String Expression Language)
Base de données relationnelle : Microsoft Access, SQL Server, MySQL
Environnements de développement : Microsoft Visual Studio, Visual Studio Code, Editeur Visual LISP
Utilisations :AutoCAD MAP, Civil 3D, AutoCAD Architecture, AutoCAD MEP, Plant 3D, Civil 3D, RasterDesign, VehicleTracking, Autodesk Recap, Fusion 360, NavisWorks, Revit

Message 5 sur 12
-didier-
en réponse à: thomaslonguet_1810

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

Éternel débutant.. my site for learning : Programmer dans AutoCAD

Didier Aveline

EESignature

Message 6 sur 12

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

Message 7 sur 12
O_Eckmann
en réponse à: thomaslonguet_1810

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

EESignature

Message 8 sur 12

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

 

Message 9 sur 12
didier_lourdelle
en réponse à: -didier-

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.

EESignature

Didier Lourdelle Consultant, Formateur & Développeur CAO/DAO
Expertises : AutoCAD, AutoCAD LT, AutoCAD Electrical
Langages : VB.NET, Visual LISP, VBA, Diesel (Direct Interpretively Evaluated String Expression Language)
Base de données relationnelle : Microsoft Access, SQL Server, MySQL
Environnements de développement : Microsoft Visual Studio, Visual Studio Code, Editeur Visual LISP
Utilisations :AutoCAD MAP, Civil 3D, AutoCAD Architecture, AutoCAD MEP, Plant 3D, Civil 3D, RasterDesign, VehicleTracking, Autodesk Recap, Fusion 360, NavisWorks, Revit

Message 10 sur 12
rebcao
en réponse à: CADaSchtroumpf

Attention, il s'agit d'une version LT ! donc pas d'EXPRESS TOOLS...

 

Christian


Formateur Indépendant, Consultant, AutoCAD, AutoCAD LT, REVIT MEP, INVENTOR -
www.rebcao.fr

Christian REB

Message 11 sur 12
CADaSchtroumpf
en réponse à: rebcao


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

 

Message 12 sur 12

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.


Patrick Emin animateur de la communauté francophone


Vous avez trouvé un message utile? Alors donnez un "J'aime" à ce message!
Votre question a eu une réponse satisfaisante? Voulez vous avoir l'amabilité de cliquer sur le bouton
 APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Signez notre Livre d'Or

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums  

Autodesk Design & Make Report