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