明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4029|回复: 27

[已解答] 如何在圆选择集中高效的分离出同心圆

[复制链接]
发表于 2016-7-17 20:47:34 | 显示全部楼层 |阅读模式
大家好!
最近准备写一个程序,碰到了难点了,大致如下:
首先有一个选择集 (setq ss (ssget '( (0 . "CIRCLE") )) )
我需要把里面不是同心的圆放入到选择集SS1里面 ,自己想了个笨办法但是图元多了就容易卡死
求大家帮我优化一下,或者出个好的方案。谢谢了!
  1. (defun c:tt ( )
  2.   (setq ss (ssget '( (0 . "CIRCLE") )) )
  3.   (setq LST_ENT '()
  4.     I 0
  5.   )
  6.   (repeat (sslength SS)
  7.     (setq LST_ENT (cons (assoc 10 (entget(ssname ss i))) LST_ENT)
  8.       I        (1+ I)
  9.     )
  10.   )
  11.   (setq LST_ENT(delsames LST_ENT  0.0001));不是同心圆的点表
  12.   (setq i 0 )
  13.   (setq ss1 (ssadd) );空选择集
  14.   (repeat (length LST_ENT)
  15.     (setq sso (ssget "p" (list '(0 . "CIRCLE") (cons 10 (cdr (nth i LST_ENT)))))
  16.       ss1(ssadd (ssname sso 0) ss1)
  17.       i   (1+ i)
  18.     )
  19.     (vl-cmdf "_.select" ss "")
  20.   )
  21. )

  22. (defun delsames(l1 rcz / a l l2);;带容差去重(重复过的不出现)
  23.   (while(setq a(car l1)l2(vl-remove-if'(lambda (x)(equal a x rcz))(cdr l1)))
  24.     (if(=(1+(length l2))(length l1))(setq l(cons a l)))
  25.     (setq l1 l2))
  26.   (if(=(1+(length l2))(length l1))(setq l(cons a l)))
  27.   (reverse l))



发表于 2016-7-21 17:45:12 | 显示全部楼层
本帖最后由 llsheng_73 于 2016-7-24 21:58 编辑

  1. (defun tt(n f / e p s i l)
  2.   (if(setq i 0 f(if f'(1 1 1)'(1 1))s(ssget'((0 . "CIrcle"))))
  3.     (progn
  4.       (repeat(sslength s)
  5.         (setq e(ssname s i)
  6.               p(mapcar'(lambda(x)(rtos x 2 n))(mapcar'*(cdr(assoc 10(entget e)))f))
  7.               l(cons(list p e)l)i(1+ i)))
  8.       (mapcar'(lambda(x)(if(assoc(car x)(vl-remove x l))(setq s(ssdel(cadr x)s))))l)
  9.      s)))


(TT 3 T);;考虑圆心高程,用3位小数限定精度
(TT 5 nil);;忽略圆心高程,用5位小数限定精度

回复 支持 1 反对 0

使用道具 举报

发表于 2016-7-17 22:44:15 | 显示全部楼层
你的同心圆圆心应该是嫩提前知道的,直接ssget时过滤10不等于该值就行了
发表于 2016-7-18 08:49:58 | 显示全部楼层
本帖最后由 自贡黄明儒 于 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 09:41:17 | 显示全部楼层
自贡黄明儒 发表于 2016-7-18 08:49
下面的代码我没有试过,你自己试一下

(defun c:w1 (/ E I L P SS)

这段代码大体思路是对的,但结果可能不正确。
原因:因为浮点数的缘故,所以点表几乎没有相同的,即使就在一起的两个表,判断相等也可能不成立。
使用member可能不是好方法,建议使用distance(精度)来遍历,时间可能长一些,但是结果应该正确。
发表于 2016-7-18 12:20:54 | 显示全部楼层
有个想法...
先将圆心转成点

排序法有很多,引用时得分析资料特性为依据

圆的分布,数量,密集度,非同心而又有交集...
皆为考量的因素
 楼主| 发表于 2016-7-18 13:05:26 | 显示全部楼层
Andyhon 发表于 2016-7-18 12:20
有个想法...
先将圆心转成点

有点不明白的
 楼主| 发表于 2016-7-18 13:08:47 | 显示全部楼层
自贡黄明儒 发表于 2016-7-18 08:49
下面的代码我没有试过,你自己试一下

(defun c:w1 (/ E I L P SS)

测试了一下黄工的代码,有问题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

http://bbs.xdcad.net/thread-704746-1-1.html可以考虑容差  发表于 2016-7-18 16:51
发表于 2016-7-18 16:49:01 | 显示全部楼层
去除同心圆,那保留哪一个同心圆呢?
可以用vl-remove-if-not+vl-remove解决,带容差的比较用equal
 楼主| 发表于 2016-7-18 19:00:48 | 显示全部楼层
陨落 发表于 2016-7-18 16:49
去除同心圆,那保留哪一个同心圆呢?
可以用vl-remove-if-not+vl-remove解决,带容差的比较用equal

vl-remove-if-not+vl-remove  这两个函数我不会用
 楼主| 发表于 2016-7-18 19:03:39 | 显示全部楼层
自贡黄明儒 发表于 2016-7-18 08:49
下面的代码我没有试过,你自己试一下

(defun c:w1 (/ E I L Le P SS)

黄工!你发的这个网址打不开





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-19 22:36 , Processed in 0.208539 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表