如何在圆选择集中高效的分离出同心圆
大家好!最近准备写一个程序,碰到了难点了,大致如下:
首先有一个选择集 (setq ss (ssget '( (0 . "CIRCLE") )) )
我需要把里面不是同心的圆放入到选择集SS1里面 ,自己想了个笨办法但是图元多了就容易卡死
求大家帮我优化一下,或者出个好的方案。谢谢了!
(defun c:tt ( )
(setq ss (ssget '( (0 . "CIRCLE") )) )
(setq LST_ENT '()
I 0
)
(repeat (sslength SS)
(setq LST_ENT (cons (assoc 10 (entget(ssname ss i))) LST_ENT)
I (1+ I)
)
)
(setq LST_ENT(delsames LST_ENT0.0001));不是同心圆的点表
(setq i 0 )
(setq ss1 (ssadd) );空选择集
(repeat (length LST_ENT)
(setq sso (ssget "p" (list '(0 . "CIRCLE") (cons 10 (cdr (nth i LST_ENT)))))
ss1(ssadd (ssname sso 0) ss1)
i (1+ i)
)
(vl-cmdf "_.select" ss "")
)
)
(defun delsames(l1 rcz / a l l2);;带容差去重(重复过的不出现)
(while(setq a(car l1)l2(vl-remove-if'(lambda (x)(equal a x rcz))(cdr l1)))
(if(=(1+(length l2))(length l1))(setq l(cons a l)))
(setq l1 l2))
(if(=(1+(length l2))(length l1))(setq l(cons a l)))
(reverse l))
本帖最后由 llsheng_73 于 2016-7-24 21:58 编辑
(defun tt(n f / e p s i l)
(if(setq i 0 f(if f'(1 1 1)'(1 1))s(ssget'((0 . "CIrcle"))))
(progn
(repeat(sslength s)
(setq e(ssname s i)
p(mapcar'(lambda(x)(rtos x 2 n))(mapcar'*(cdr(assoc 10(entget e)))f))
l(cons(list p e)l)i(1+ i)))
(mapcar'(lambda(x)(if(assoc(car x)(vl-remove x l))(setq s(ssdel(cadr x)s))))l)
s)))
(TT 3 T);;考虑圆心高程,用3位小数限定精度
(TT 5 nil);;忽略圆心高程,用5位小数限定精度
你的同心圆圆心应该是嫩提前知道的,直接ssget时过滤10不等于该值就行了 本帖最后由 自贡黄明儒 于 2016-7-18 13:57 编辑
下面的代码我没有试过,你自己试一下
(defun c:w1 (/ E I L Le P SS)
(setq ss (ssget '((0 . "CIRCLE"))))
(repeat (setq i (sslength SS))
(setq i (1- i))
(setq e (ssname ss i))
(setq P (cdr (assoc 10 (entget e))))
(setq L (cons p L))
)
(repeat (setq i (sslength SS))
(setq i (1- i))
(setq e (ssname ss i))
(setq P (cdr (assoc 10 (entget e))))
(cond ((member P (member p L)) (setq Le (cons e Le))))
)
(if Le
(mapcar '(lambda (x) (ssdel x ss)) Le)
)
ss
)
自贡黄明儒 发表于 2016-7-18 08:49 static/image/common/back.gif
下面的代码我没有试过,你自己试一下
(defun c:w1 (/ E I L P SS)
这段代码大体思路是对的,但结果可能不正确。
原因:因为浮点数的缘故,所以点表几乎没有相同的,即使就在一起的两个表,判断相等也可能不成立。
使用member可能不是好方法,建议使用distance(精度)来遍历,时间可能长一些,但是结果应该正确。 有个想法...
先将圆心转成点
排序法有很多,引用时得分析资料特性为依据
圆的分布,数量,密集度,非同心而又有交集...
皆为考量的因素
Andyhon 发表于 2016-7-18 12:20 static/image/common/back.gif
有个想法...
先将圆心转成点
有点不明白的 自贡黄明儒 发表于 2016-7-18 08:49 static/image/common/back.gif
下面的代码我没有试过,你自己试一下
(defun c:w1 (/ E I L P SS)
测试了一下黄工的代码,有问题
去除同心圆,那保留哪一个同心圆呢?
可以用vl-remove-if-not+vl-remove解决,带容差的比较用equal 陨落 发表于 2016-7-18 16:49 static/image/common/back.gif
去除同心圆,那保留哪一个同心圆呢?
可以用vl-remove-if-not+vl-remove解决,带容差的比较用equal
vl-remove-if-not+vl-remove这两个函数我不会用 自贡黄明儒 发表于 2016-7-18 08:49 static/image/common/back.gif
下面的代码我没有试过,你自己试一下
(defun c:w1 (/ E I L Le P SS)
黄工!你发的这个网址打不开