Unos ejemplos de selección por filtro desde programación con VisualLisp podrían ser:
(setq sel (ssget "X" '((0 . "*LINE,ARC,CIRCLE,SPLINE,ELLIPSE,XLINE"))))
(setq selInsert (vl-catch-all-apply (function ssget) (list "_:S:E" filter)))
    Después de muchas horas de trabajo en CAD, fui creando los filtros que más usaba y 
    acabe creando un menú contextual de acceso rápido a estos filtros.  Estas órdenes de filtro son transparentes 
    por lo que podemos usarlas dentro de un comando de Autocad a la hora de seleccionar elementos. 
    También podemos usar las órdenes de filtro sin ningún comando activo, 
    esto dejara los elementos seleccionados por el filtro en pantalla con pinzamientos y 
    después al ejecutar un comando de autocad, seleccionará estos elementos. 
    Esto solo ocurrirá si la variable ‘PICKFIRST’ 
    esta con un valor de 1 (Designación nombre/Verbo)
    No podremos usar estos filtros como comandos transparentes dentro de una orden de VisualLisp, pero podemos usar el fitro previamente y luego ejecutar la orden de lisp siempre y cuando el programador, internamente, no cancele la selección previa en pantalla, como:
(sssetfirst nil nil)
    Estas órdenes de filtro las he integrado en el menú del proyecto “La Marmita”, en una barra de herramientas (oculta) 
    y en un menú contextual que se activa con la secuencia de teclas/botón del ratón: Ctrl+Mayús+Clic.
Nota: Si algún usuario tiene ya asignada esa secuencia de teclas/botón del ratón, he dispuesto dos comandos para poder activar y desactivar el menú contextual de filtros: SSFastMenuOff y SSFastMenuOn.
Posiblemente el usuario que tenga asignadas esas teclas tendrá que cerrar sesión después de utilizar “SSFastMenuOff” para que los efectos de su menú sean visibles.
Lista de comandos.
| Comando | Descripción | 
| 
             | 
        'SSCAPA | Seleccionar por Capa Completa: Selecciona todos los objetos de una capa determinada, indicando un objeto en pantalla para obtener el nombre de capa.  | 
    
| 
             | 
        'SSCAPASEL | Seleccionar por Capa (Parcial):  Selecciona objetos de una capa determinada, indicando un objeto en pantalla para obtener el nombre de capa y seleccionando en pantalla después por los métodos tradicionales (auto, ventana, captura, etc.).  | 
    
| 
             | 
        'SSCAPACOL | Seleccionar por Capa y Color:  Selecciona todos los objetos de una capa y color determinados, indicando un objeto en pantalla para obtener el nombre de capa y su color.  | 
    
| 
             | 
        'SSCOL | Seleccionar por Color (Completo):  Selecciona todos los objetos de un color determinado, indicando un objeto en pantalla para obtener el nombre del color.  | 
    
| 
             | 
        'SSCOLSEL | Seleccionar por Color (Parcial):  Selecciona objetos de un color determinado, indicando un objeto en pantalla para obtener el nombre del color y seleccionando en pantalla después por los métodos tradicionales (auto, ventana, captura, etc.).  | 
    
| 
             | 
        'SSBLK | Seleccionar Bloques (Completo):  Selecciona todos los bloques del mismo nombre indicando uno en pantalla para obtener el nombre. Funciona también con bloques dinámicos.  | 
    
| 
             | 
        'SSBLKSEL | Seleccionar Bloques (Parcial):  Selecciona bloques del mismo nombre indicando uno en pantalla para obtener el nombre y seleccionando en pantalla después por los métodos tradicionales (auto, ventana, captura, etc.). Funciona también con bloques dinámicos.  | 
    
| 
             | 
        'SSLT | Seleccionar por Tipo de Línea (Completo):  Selecciona todos los objetos de un tipo de línea determinado, indicando un objeto en pantalla para obtener el tipo de línea.  | 
    
| 
             | 
        'SSLTSEL | Seleccionar por Tipo de Línea (Parcial):  Selecciona objetos de un tipo de línea determinado, indicando un objeto en pantalla para obtener el tipo de línea y seleccionando en pantalla después por los métodos tradicionales (auto, ventana, captura, etc.).  | 
    
| 
             | 
        'SSLW | Selec. Grosor de Línea Completo:  Selecciona todos los objetos de un grosor de línea determinado, indicando un objeto en pantalla para obtener el grosor de línea.  | 
    
| 
             | 
        'SSLWSEL | Seleccionar por Grosor de Línea (Parcial):  Selecciona objetos de un grosor de línea determinado, indicando un objeto en pantalla para obtener el grosor de línea y seleccionando en pantalla después por los métodos tradicionales (auto, ventana, captura, etc.).  | 
    
| 
             | 
        'SELWIPE | Seleccionar Cobertura (WIPEOUT):  Selecciona todos los objetos de Cobertura (WIPEOUT). Si el marco de cobertura esta desactivado se pueden seleccionar todos indicando “Todo”(_All) en modo de selección.  | 
    
| 
             | 
        SSCAPABYL | Cambiar Capa Completa a Color PorCapa:  Modifica todos los objetos de una capa determinada a color “PorCapa”(ByLayer), indicando un objeto en pantalla para obtener el nombre de capa.  | 
    
| 
             | 
        CDELANTE | Capa hacia Delante:  Modifica el orden (hacia Delante) de todos los objetos de una capa determinada, indicando un objeto en pantalla para obtener el nombre de capa.  | 
    
| 
             | 
        CDETRAS | Capa hacia Atrás:   Modifica el orden (hacia Atrás) de todos los objetos de una capa determinada, indicando un objeto en pantalla para obtener el nombre de capa.  | 
    
Codigo y descarga.
Código
        
Select all
;;************************************ SSFast ******************************************
;;Comandos transparentes mas comunes de Utiles de Selección rápida                      
;;Revisiones:                                                                           
;; Versión 3.0.0   (LaMarmita)                                                          
;; José Luis García Galán 22/10/15                                                      
;; Versión 2.0.0                                                                        
;; José Luis García Galán 12/06/14                                                      
;; Versión 1.0.0                                                                        
;; José Luis García Galán 11/11/06                                                      
;***************************************************************************************
;;____________________________________________________________________________________
;;Usar el menu AUX4 Contextual de las utilidades (Control + May + BOTON DERECHO-RATON)
;;(MENUCMD "A4=LAMARMITA.M_AUX4")
(if (not (jlgg-Read-Registry-Command "SsFast" "ActiveMnu"))
 (jlgg-write-Registry-Command "SsFast" "ActiveMnu" 1)
)
(if (= 1 (jlgg-Read-Registry-Command "SsFast" "ActiveMnu"))
 (menucmd (strcat "A4=" (strcase **NameJLGGMenu**) ".M_AUX4"))
)
;;---------------------------------------------------------------------------
;; comandos para activar y desactivar el menu contextual de selección rápida 
;;---------------------------------------------------------------------------
(defun c:SSFastMenuOn ()
 (jlgg-write-Registry-Command "SsFast" "ActiveMnu" 1)
 (menucmd (strcat "A4=" (strcase **NameJLGGMenu**) ".M_AUX4"))
 (princ)
)
(defun c:SSFastMenuOff ()
 (jlgg-write-Registry-Command "SsFast" "ActiveMnu" 0)
 (menucmd "A4=GACAD.AUX4")
 (princ)
)
;;_______________________________________________________________
;;Funcion de Inicio de filtro de selección rápida                
(defun InicSelect ( / )
 (setvar "cmdecho" 0)
 (if (/= (getvar "CMDACTIVE") 1)
  (sssetfirst nil nil)
 )
)
;;_______________________________________________________________
;;Funcion de finalización de filtro de selección rápida          
(defun FinSelect ( Sel Mens / GetNameCommand)
  (defun GetNameCommand (/ Retval)
   (if (null (setq Retval (getcname (strcat "_" (getvar "CMDNAMES")))))
    ""
    Retval))
 (if (null Mens)(setq Mens ""))
 (if Sel
  (if (/= (getvar "CMDACTIVE") 1)
   (progn
    (prompt Mens)
    (sssetfirst Sel Sel)
    (princ)
   )
   (progn
    (prompt "\nSaliendo de selección rápida.")
    (prompt Mens)
    (prompt (strcat "\nReanudando el comando " (GetNameCommand) "..."))
    Sel
   );c.prg
  );c.if
  (progn (prompt "\n>> No se selecciono nada...")(princ))
 )
)
;; ++++++++++++++++++++++++ FILTROS +++++++++++++++++++++++++++++++++
;--------------------------------------------------------------------
;Selecciona todas las entidades de una capa indicando una en pantalla
;--------------------------------------------------------------------
(defun sscapa ( tiposel / Capa Sel Ent Mens)
 (if (setq Ent (car (entsel "\n>> Seleccione entidad: ")))
  (progn
   (setq Capa (jlgg-dxf 8 (entget Ent)))
   (InicSelect)
   (if tiposel 
    (setq Sel  (ssget "X" (list (cons 8 Capa))))
    (progn
     (prompt (strcat "\n>> Seleccione entidades de capa: " Capa))
     (setq Sel (ssget (list (cons 8 Capa))))
    );c.prg
   );c.if
  );c.prg
 );c.if
 (if Sel (setq Mens (strcat "\nSeleccionadas " (itoa (sslength Sel)) " entidades de la capa: \"" Capa "\"\n")))
 (FinSelect Sel Mens)
);c.defun
(defun C:sscapa ()(sscapa T))
(defun C:sscapasel ()(sscapa nil)) 
;--------------------------------------------------------------------
;Selecciona entidades de una capa con el color de la seleccionada    
;--------------------------------------------------------------------
(defun C:ssCapaCol ( / Color Sel Ent Mens) 
 (if (setq Ent (car (entsel "\nSSFast: Seleccione entidad: ")))
  (progn
   (InicSelect)
   (setq Capa  (jlgg-dxf 8 (entget Ent)))
   (setq Color (jlgg-Get_Col Ent))
   (setq Color (nth (1- (length Color)) Color))
   (if (setq Sel  (ssget "X" (list (cons 8 Capa) Color)))
    (setq Mens (strcat "\nSeleccionadas " (itoa (sslength Sel)) " entidades de la capa: \"" Capa "\" y color " (NameCol (cdr Color))))
   )
  );c.prg
 );c.if
 (FinSelect Sel Mens)
)
;--------------------------------------------------------------------
;Selecciona entidades del color de la seleccionada                   
;--------------------------------------------------------------------
(defun sscol ( tiposel / Color Sel Ent Mens)
 (if (setq Ent (car (entsel "\n>> Seleccione entidad: ")))
  (progn
   (setq Color (jlgg-Get_Col Ent))
   (setq Color (nth (1- (length Color)) Color))
   (InicSelect)
   (if tiposel
    (setq Sel  (ssget "X" (list Color)))
    (progn
     (prompt (strcat "\n>> Seleccione entidades con color: " (NameCol (cdr Color))))
     (setq Sel  (ssget (list Color)))
    );c.prg
   );c.if
  );c.prg
 );c.if
 (if Sel
  (setq Mens (strcat "\nSeleccionadas " (itoa (sslength Sel)) " entidades con color: " (NameCol (cdr Color))))
 );c.if
 (FinSelect Sel Mens)
)
(defun C:sscol ()(sscol T))
(defun C:sscolsel ()(sscol nil))
;--------------------------------------------------------------------
;Selección Rápida de Bloques                                         
;--------------------------------------------------------------------
;; Obtener el nombre real(efectivo) de un bloque
(defun GetEffectiveNameBlk ( obj )
 (vlax-get-property obj
  (if (vlax-property-available-p obj 'effectivename)
    'effectivename
    'name
  )
 )
)
;; Get Anonymous References  -  Lee Mac  (thanks)                        
;; Obtiene todos los nombres referencias anonimas de un bloque dinámico. 
;; blk - [str] Block name for which to return anon. references           
(defun LM:getanonymousreferences ( sBlk / ano def lst rec ref )
    (setq sBlk (strcase sBlk))
    (while (setq def (tblnext "block" (null def)))
        (if
            (and (= 1 (logand 1 (cdr (assoc 70 def))))
                (setq rec
                    (entget
                        (cdr
                            (assoc 330
                                (entget
                                    (tblobjname "block"
                                        (setq ano (cdr (assoc 2 def)))
                                    )
                                )
                            )
                        )
                    )
                )
            )
            (while
                (and
                    (not (member ano lst))
                    (setq ref (assoc 331 rec))
                )
                (if
                    (and
                        (entget (cdr ref))
   (setq oBlk (jlgg-GetVLA-Obj (cdr ref)))
   (equal (vla-get-ObjectName oBlk) "AcDbBlockReference")
                        (= sBlk (strcase (GetEffectiveNameBlk oBlk)))
                    )
                    (setq lst (cons ano lst))
                )
                (setq rec (cdr (member (assoc 331 rec) rec)))
            )
        )
    )
    (reverse lst)
)
;;-------------------------------------------------------------------------
(defun ssblk ( tiposel / NameBlk Sel Ent oEnt Filter Mens)
 (if (setq Ent (car (entsel "\n>> Seleccione Bloque: ")))
  (if (= (jlgg-dxf 0 (entget Ent)) "INSERT")
   (progn
    (setq oEnt (jlgg-GetVLA-Obj Ent))
    (setq NameBlk (GetEffectiveNameBlk oEnt))
    ;(if (= (substr NameBlk 1 1) "*")(setq NameBlk (strcat "`" NameBlk)))   
    (setq Filter  (list '(0 . "INSERT")))
    (cond
     ((= (vla-get-IsDynamicBlock oEnt) :vlax-true)
      (if (setq anonymousref (LM:getanonymousreferences NameBlk))
       (setq filter (append
        filter
        (list
         (cons 2
          (apply (function strcat)
          (cons NameBlk
         (mapcar (function (lambda ( x ) (strcat ",`" x))) anonymousref)
          )
          )
         )
        );list
       );append
       )
 ;;Else:
 (setq filter (append filter (list (cons 2 NameBlk))))
      );c.if
     )
     ((= (substr NameBlk 1 1) "*")
      (setq filter (append filter (list (cons 2 (strcat "`" NameBlk)))))
     )
     (T
      (setq filter (append filter (list (cons 2 NameBlk))))
     )
    );c.cond
    (InicSelect)
    (if tiposel
     (setq Sel (ssget "X" Filter))
     (progn
      (if Esc (setq Filter (append Filter (list (cons 41 Escala)))))
      (prompt (strcat "\n>> Seleccione bloques con nombre: \"" NameBlk "\""))
      (setq Sel (ssget Filter))
     );c.prg
    );c.if
   );c.prg
  );c.if
 );c.if
 (if Sel
   (setq Mens (strcat "\nSeleccionados " (itoa (sslength Sel)) " bloques con nombre: \"" NameBlk "\""))
 );c.if
 (FinSelect Sel Mens)
);c.defun
(defun C:ssblk ()(ssblk T))
(defun C:ssblksel ()(ssblk nil))   
;--------------------------------------------------------------------
;Selección Rápida de Tipos de Línea                                  
;--------------------------------------------------------------------
(defun sslt ( tiposel / TLin sTLin Sel Ent)
 (if (setq Ent (car (entsel "\n>> Seleccione entidad: ")))
  (progn
   (cond
     ((not (setq TLin (jlgg-dxf 6 (entget Ent)))) (setq TLin "ByLayer"))
     ((= (strcase TLin) "BYBLOCK") (setq TLin "PorBloque")) ;;Rarisimo ERROR de Autocad. Hay que ponerlo en castellano v2012
   )
   (InicSelect)
   (if tiposel
    (setq Sel  (ssget "X" (list (cons 6 TLin))))
    (progn
     (prompt (strcat "\n>> Seleccione entidades con tipo de linea: " TLin))
     (setq Sel  (ssget (list (cons 6 TLin))))
    );c.prg
   );c.if
  );c.prg
 );c.if
 (if Sel
  (setq sTLin (cond ((= TLin "ByLayer") "PorCapa")
             ((= TLin "ByBlock") "PorBloque")
      (T TLin))
        Mens (strcat "\nSeleccionadas " (itoa (sslength Sel)) " entidades con tipo de linea: " sTLin))
 );c.if
 (FinSelect Sel Mens)
);c.defun
(defun C:sslt ()(sslt T))
(defun C:ssltsel ()(sslt nil))
;--------------------------------------------------------------------
;Seleccion Rapida de Grosor de Linea                                 
;;ByLayer = -1 :  ByBlock = -2 :  ByDefault = -3                     
;--------------------------------------------------------------------
(defun ssLineweight ( tiposel / LineWh Sel Ent sLineWh Mens)
 (cond
  ((setq Ent (car (entsel "\n>> Seleccione entidad: ")))
   (InicSelect)
   (if (not (setq LineWh (jlgg-dxf 370 (entget Ent))))
    (setq LineWh -1)
   )
   (if tiposel 
    (setq Sel  (ssget "X" (list (cons 370 LineWh))))
    (progn
     (prompt (strcat "\n>> Seleccione entidades con Grosor de linea: " (rtos (/ LineWh 100.0) 2)))
     (setq Sel (ssget (list (cons 370 LineWh))))
    );c.prg
   );c.if
  );
 );c.cond
 (if Sel
   (setq sLineWh (cond ((= LineWh -1) "PorCapa")
                ((= LineWh -2) "PorBloque")
         ((= LineWh -3) "PorDefecto")
         (T (rtos (/ LineWh 100.0) 2)))
  Mens (strcat "\nSeleccionadas " (itoa (sslength Sel)) " entidades con Grosor de línea: \"" sLineWh "\"\n"))
 )
 (FinSelect Sel Mens)
);c.defun
(defun C:sslw ()(ssLineweight T))
(defun C:sslwsel ()(ssLineweight nil))
;;--------------------------------------------------------------------
;; Seleccionar WIPEOYUT                                               
;;--------------------------------------------------------------------
(defun c:SelWipe ( / Sel Mens)
 (InicSelect)
 (prompt "\n>> Seleccione Coberturas: ")
 (if (setq Sel (ssget (list (cons 0 "WIPEOUT"))))
  (setq Mens (strcat "\nSeleccionadas " (itoa (sslength Sel)) " Coberturas."))
 )
 (FinSelect Sel Mens)
)
;--------------------------------------------------------------------
;Cambiar Capa Completa a Color Por Capa                              
;--------------------------------------------------------------------
(defun C:ssCapaByL ( / eco Capa Sel Ent)
 (setq eco (getvar 'cmdecho))
 (setvar 'cmdecho 0)
 (cond
  ((and (setq Ent (vl-catch-all-apply 'entsel (list "\nSeleccione entidad: ")))
  (not (vl-catch-all-error-p Ent)))
   (setq Capa (jlgg-dxf 8 (entget Ent)))
   (cond
 ((setq Sel (ssget "X" (list (cons 8 Capa))))
  (vl-cmdf "_.UNDO" "_BE")
     (vl-cmdf "_.CHPROP" Sel "" "_C" "_BYL" "")
     (prompt (strcat "\nModificadas " (itoa (sslength Sel)) " entidades de capa: \"" Capa "\" a color PorCapa"))
  (vl-cmdf "_.UNDO" "_E")
    )
   )
  )
 )
 (setvar 'cmdecho eco)
 (princ)
)
;--------------------------------------------------------------------
;Cambiar todas las Entidades de una Capa hacia Delante o Detras      
;--------------------------------------------------------------------
(defun OrdenVis ( Modo / eco)
 (setq eco (getvar 'cmdecho))
 (setvar 'cmdecho 0)
 (cond
  ((and (setq Ent (vl-catch-all-apply 'entsel (list "\nSeleccione entidad: ")))
  (not (vl-catch-all-error-p Ent))
  (setq ent (car Ent)))
   (setq Capa (jlgg-dxf 8 (entget Ent)))
   (cond
 ((setq Sel (ssget "X" (list (cons 8 Capa))))
  (vl-cmdf "_.UNDO" "_BE")
  (vl-cmdf "_draworder" Sel "" Modo)
  (prompt (strcat "\nCambiado orden de visualización de capa: \"" Capa "\""
      (if (= Modo "_F") " Delante." " Detrás.") 
             )
  )
     (vl-cmdf "_.UNDO" "_E")
    )
   )
  )
 )
 (setvar 'cmdecho eco)
 (princ)
)
(defun C:CDelante ()(OrdenVis "_F")) 
(defun C:CDetras ()(OrdenVis "_B"))
(princ)
Como siempre, espero sea de utilidad.
Un saludo a tod@s desde España.
    
No hay comentarios:
Publicar un comentario