删除圆内的线
大家好,我有一个图里有很多圆,可圆里有很多线,我想选返回圆把圆里的线全都删除,有没有什么更好的办法呀因为他们是块,后来被人炸开了,现在只要圆就行了.而这个块又到处都有,且又被炸开了,各位大帅看看有没有什么办
只在 A 开头的图层 ?
直径范围 > 3828 或 what
问这些是关系到 滤取/排除 的条件式
关系到程序效率,特别是在数量大的时候 ....
(defun c:tt(/ getcirpts ssgetcir s en ss)
;;;计算园的分割点 en 园的图元名 n 园的分割段数
(defun getcirpts (en n / i d pl)
(setq i 0 d (/ pi n 0.5))
(repeat n
(setq pl (cons (vlax-curve-getpointatparam en i) pl)
i (+ i d)
)
)
(reverse pl)
)
;;;参数 cir 园的图元名 filter 过滤表 n 园的分割段数
(defun ssgetcir (cir filter n)
(if filter
(ssget "wp" (getcirpts cir n) filter)
(ssget "wp" (getcirpts cir n))
)
)
;;;选择的园要在图形可见范围内
(setq s (ssget '((0 . "circle"))))
(if s
(repeat (setq k (sslength s))
(setq en (ssname s (setq k (1- k))))
(if (setq ss (ssgetcir en '((0 . "line")) 20)) ;_ 过滤表可自行修改
(command "erase" ss "")
)
)
)
)
(defun gps->ss-2lst (ss / lst n)
(if (= (type ss) 'PICKSET)
(repeat (setq n (sslength ss))
(setq lst (cons (ssname ss (setq n (1- n))) lst))
)
);lst
)
(defun c:cc( / center0 entlst lll n oldosmode pt3 radius0)
(prompt "\n清理圆内部线,一窗口搞定:")
(setvar "osmode" 0)
(setq oldosmode (getvar "osmode") )
(foreach n (gps->ss-2lst (ssget '((0 . "CIRCLE"))))
(setq entlst (entget n)
center0 (cdr (assoc 10 entlst))
radius0 (cdr (assoc 40 entlst))
LLL 0.0
)
(command "_.erase" "wp" )
(while (< lll 6.29)
(setq pt3 (polar center0 lll (* radius0 0.9)))
(command pt3)
(setq lll (+ 0.2 lll))
)
(command "" "")
)
(setvar "osmode" oldosmode)
) 真不错 呵呵 圆内的线也不多啊 三楼楼主的程序对于小于圆的直线来说真是非常棒,不过以下两种情况就不行了曾尝鼎一尝试
(if (setq ss (ssgetcir en '((0 . "line")(0 . "ARC")) 20))或 (if (setq ss (ssgetcir en '((0 . "line""line")) 20))
都不行 本帖最后由 Gu_xl 于 2011-9-14 19:01 编辑
357785513 发表于 2011-9-14 17:16 http://bbs.mjtd.com/static/image/common/back.gif
三楼楼主的程序对于小于圆的直线来说真是非常棒,不过以下两种情况就不行了曾尝鼎一尝试
(if (setq ss (ss ...
对于1楼的图形,3楼就是答案!对于6楼的图,就稍微复杂点,首先将选择方式 "wp" 要改为"CP",再将圆从选择集中剔除,或者"wP"选完后删掉选到的物体,再用 "F" 栏选,再将圆从选择集中剔除,再判断栏选选到的每图元是否落在园内,判断点是否在多边形内的相关代码明经都能搜到!自己再用用心,就能写出程序来了!
下面的代码,仅对删直线有效,对于其他类型实体,请参照自行修改!
(defun c:tt(/ getcirpts ssgetcir s en ss dxf ptincir-p lineincir-p SS->List)
;;;计算园的分割点 en 园的图元名 n 园的分割段数
(defun getcirpts (en n / i d pl)
(setq i 0 d (/ pi n 0.5))
(repeat n
(setq pl (cons (vlax-curve-getpointatparam en i) pl)
i (+ i d)
)
)
(reverse pl)
)
;;;参数 cir 园的图元名 filter 过滤表 n 园的分割段数
(defun ssgetcir (cir filter n / ss)
(if filter
(setq ss (ssget "cp" (getcirpts cir n) filter))
(setq ss (ssget "cp" (getcirpts cir n)))
)
(ssdel cir ss)
(if (> (sslength ss) 0)
ss
)
)
(defun dxf (ent i)
(cond ((= (type ent) 'ename)
(cdr (assoc i (entget ent)))
)
((= (type ent) 'list)
(cdr (assoc i ent))
)
) ;_ if
)
;;;判断点是否在园内
(defun ptincir-p (cir pt / r cp d)
(setq r (dxf cir 40)
cp (dxf cir 10)
)
(or (< (setq d (distance cp pt)) r) (equal d r 0.0001))
)
;;;判断直线是否在园内
(defun lineincir-p (line cir)
(and (ptincir-p cir (dxf line 10))
(ptincir-p cir (dxf line 11))
)
)
;;;选择集->列表
(defun SS->List (ss / i s)
(if ss
(repeat (setq i (sslength ss))
(setq s (cons (ssname ss (setq i (1- i))) s))
)
)
)
;;;选择的园要在图形可见范围内
(setq s (ssget '((0 . "circle"))))
(if s
(progn
(setq s (ss->list s))
(foreach cir s
(if (setq ss (ssgetcir cir '((0 . "line")) 20))
(progn
(setq ss (ss->list ss))
(foreach line ss
(if (lineincir-p line cir) (entdel line))
)
)
)
)
)
)
(princ)
)
哦,毛塞敦开,受教了 无法删除和圆相交的线段。 要这么麻烦吗!快速选择不就可以了!
页:
[1]