lisp统计圆的数量,坐标,表处理,搜索函数

  • A+
所属分类:CAD二次开发

想要通过代码实现自动统计圆的数量和坐标,其实很简单,先说说思路,和原理,

我的思路是

1、先选中所有的圆,在提取坐标点和圆的半径,

2、整理所得来的数据表,进行排序,这样可以按顺序显示。

3、用对比搜索函数,搜索表里面是否有多少个一样的半径。

用搜索的时候去掉重复的,就可以得到有多少个单独的对象。

4,直接用的到的单独的数据依次循环原始表里有有多少一样的半径即可,找到多少个,就是多少个,

我下面的代码只是圆的数量,要想坐标,自己在开始统计的时候自行加上即可,、

最终代码显示格式是((半径)数量),在通过循环依次读出来即可

(defun c:yyy (/ m k ss q1 ee1 xyz lstr Lir bc kk b0 b1 b2)

(setq ss(ssget ":s"
(list '(-4 . "<OR")
' (-4 . "<AND")
' (0 . "CIRCLE")
'(-4 . "AND>")
'(-4 . "OR>")
)
) )

;(command "chprop" ss "" "c" "181" "");颜色
(setq k 0)
(if ss
(repeat (sslength ss)

(setq q1(ssname ss k));取到选集中的第一个图源
(setq ee1 (entget q1)) ;获得图元名为name的图元表赋予给e
(setq xyz (list (cdr (assoc 40 ee1)) );读取半径
Lir(cons xyz Lir ));所有半径表

(setq k (1+ K))

))

;排续
(setq Lir (vl-sort Lir
'(lambda (a b)
(> (car a ) (car b )))))
(setq b0 Lir)

;移除重复的元素,就是得到单独的总个数
(setq xyz nil)
(while Lir
(setq bc (nth 0 Lir)
xyz(append xyz (list bc))
Lir (vl-remove bc Lir));
)

;用单独的在总表里面找,
(setq bc (length xyz)
K 0
kk 1
ee1 nil)
(princ b1)

(while (> bc k)
(setq b2(nth k xyz))
(setq m 0
b1 b0)
(while (/= kk nil)
(setq kk (member b2 b1));搜索
(if(/= kk nil)
(setq m(1+ m))
)
(setq b1(cdr kk))
)
(setq q1 (list b2 m)
ee1(cons q1 ee1 ))
(setq K (1+ k ))
(setq kk 1)
)

(princ ee1);显示半径和数量
(princ )
)

复制

(

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: