Útiles de filtros de selección rápidos

jueves, 22 de octubre de 2015

Todos los que trabajamos a menudo con AutoCAD hemos utilizado filtros de selección en alguna ocasión, en mi caso muy a menudo, ya sea por la orden “’FILTER”, por el comando de selección rápida “SELECR” (_QSELECT) o por otros métodos, como la programación.


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)
Descarga.
Estas utilidades han sido incorporadas al proyecto de “La Marmita”, integradas en el menú, en la ruta de archivos y en la carga automática de funciones y comandos.
Se puede descargar el proyecto completo desde: Proyecto "La Marmita".

Como siempre, espero sea de utilidad.
Un saludo a tod@s desde España.

No hay comentarios:

Publicar un comentario