There are 2 routines:
SSP The first, select all objects that are completely inside.
SSP2 The second one selects everything inside the object plus objects that it touches.
It works with ellipses circles and polylines.
;======SELBYOBJ: FUNCION INTERNA PARA OCUPAR EN 2 RUTINAS POSTERIORES================
(defun SelByObj (ent opt fltr / obj dist n lst prec dist p_lst ss)
(vl-load-com)
(if (= (type ent) 'ENAME)
(setq obj (vlax-ename->vla-object ent))
(setq obj ent
ent (vlax-vla-object->ename ent)
)
)
(cond
((member (vla-get-ObjectName obj) '("AcDbCircle" "AcDbEllipse"))
(setq dist (/ (vlax-curve-getDistAtParam
obj
(vlax-curve-getEndParam obj)
)
50
)
n 0
)
(repeat 50
(setq
lst
(cons
(trans
(vlax-curve-getPointAtDist obj (* dist (setq n (1+ n))))
0
1
)
lst
)
)
)
)
((and (= (vla-get-ObjectName obj) "AcDbPolyline")
(= (vla-get-Closed obj) :vlax-true)
)
(setq p_lst (vl-remove-if-not
'(lambda (x)
(or (= (car x) 10)
(= (car x) 42)
)
)
(entget ent)
)
)
(while p_lst
(setq
lst
(cons
(trans (append (cdr (assoc 10 p_lst))
(list (cdr (assoc 38 (entget ent))))
)
ent
1
)
lst
)
)
(if (/= 0 (cdadr p_lst))
(progn
(setq prec (1+ (fix (* 25 (sqrt (abs (cdadr p_lst))))))
dist (/ (- (if (cdaddr p_lst)
(vlax-curve-getDistAtPoint
obj
(trans (cdaddr p_lst) ent 0)
)
(vlax-curve-getDistAtParam
obj
(vlax-curve-getEndParam obj)
)
)
(vlax-curve-getDistAtPoint
obj
(trans (cdar p_lst) ent 0)
)
)
prec
)
n 0
)
(repeat (1- prec)
(setq
lst (cons
(trans
(vlax-curve-getPointAtDist
obj
(+ (vlax-curve-getDistAtPoint
obj
(trans (cdar p_lst) ent 0)
)
(* dist (setq n (1+ n)))
)
)
0
1
)
lst
)
)
)
)
)
(setq p_lst (cddr p_lst))
)
)
)
(cond
(lst
(vla-ZoomExtents (vlax-get-acad-object))
(setq ss (ssget (strcat "_" opt) lst fltr))
(vla-ZoomPrevious (vlax-get-acad-object))
ss
)
)
)
;==========SSP ----> Selecciona todo, completamente dentro de: Pline, Elipse ó Circulo.====================
(defun c:SSP (/ ss opt)
(and
(or
(and
(setq ss (cadr (ssgetfirst)))
(= 1 (sslength ss))
)
(and
(sssetfirst nil nil)
(setq ss (ssget "_:S:E"
(list
'(-4 . "<OR")
'(0 . "CIRCLE")
'(-4 . "<AND")
'(0 . "ELLIPSE")
'(41 . 0.0)
(cons 42 (* 2 pi))
'(-4 . "AND>")
'(-4 . "<AND")
'(0 . "LWPOLYLINE")
'(-4 . "&")
'(70 . 1)
'(-4 . "AND>")
'(-4 . "OR>")
)
)
)
)
)
(sssetfirst
nil
(SelByObj (ssname ss 0) "Wp" nil)
)
)
(princ)
)
;==========SSP2 ----> Selecciona todo dentro, más lo que toca la: Pline, Elipse ó Circulo.====================
(defun c:SSP2 (/ ss opt)
(and
(or
(and
(setq ss (cadr (ssgetfirst)))
(= 1 (sslength ss))
)
(and
(sssetfirst nil nil)
(setq ss (ssget "_:S:E"
(list
'(-4 . "<OR")
'(0 . "CIRCLE")
'(-4 . "<AND")
'(0 . "ELLIPSE")
'(41 . 0.0)
(cons 42 (* 2 pi))
'(-4 . "AND>")
'(-4 . "<AND")
'(0 . "LWPOLYLINE")
'(-4 . "&")
'(70 . 1)
'(-4 . "AND>")
'(-4 . "OR>")
)
)
)
)
)
(sssetfirst
nil
(ssdel (ssname ss 0) (SelByObj (ssname ss 0) "Cp" nil))
)
)
(princ)
)