圖上的圓編號,依圓心座標x軸y軸大小分為8種排序方式
歡迎來找碴,在你的基础上把排序部分改了一下:顺序可能跟你不一样,那个cond里你自己改一下你的取圆心部分怎么那么罗嗦?即使用ACTIVEX方法,也不需要那个pt_save啊(defun c:111 (/ txth ss ans pt_list i ename ptms fun pt)
(vl-load-com)
(setvar "cmdecho" 0)
(setvar "blipmode" 0)
(setq txth (getvar "textsize"))
(setq ss (ssget '((0 . "CIRCLE"))))
(initget "1 2 3 4 5 6 7 8")
(setq ans (getkword "\n輸入排序方向<1-8>:"))
(setq pt_list '())
(setq i 0)
(repeat (sslength ss)
(setq ename (ssname ss i))
(setq ptms (cdr (assoc 10 (entget ename))))
(setq pt_list (cons ptms pt_list))
(setq i (+ i 1))
)
(cond
((= ans "1") (setq fun '(car cadr < <)))
((= ans "2") (setq fun '(car cadr > <)))
((= ans "3") (setq fun '(car cadr < >)))
((= ans "4") (setq fun '(car cadr > >)))
((= ans "5") (setq fun '(cadr car < <)))
((= ans "6") (setq fun '(cadr car > <)))
((= ans "7") (setq fun '(cadr car < >)))
((= ans "8") (setq fun '(cadr car > >)))
)
(setq pt_list (vl-sort pt_list
'(lambda (e1 e2)
((eval (nth 2 fun))
((eval (nth 0 fun)) e1)
((eval (nth 0 fun)) e2)
)
)
)
)
(setq pt_list (vl-sort pt_list
'(lambda (e1 e2)
((eval (nth 3 fun))
((eval (nth 1 fun)) e1)
((eval (nth 1 fun)) e2)
)
)
)
)
(setq i 0)
(repeat (sslength ss)
(setq pt (nth i pt_list))
(command "text" "m" pt txth 0 (rtos (+ i 1)))
(setq i (+ i 1))
)
(prin1)
) 謝謝指正
另一個問題,如果將圖上的數個圓旋轉一個角度(如25度)再旋轉回來(-25度)重做一遍,排序結果會有異常 这是CAD内部精度问题,旋转后那些原来 X坐标相同的,现在其实不同了,会有一点点的不同,这个不同作为平常位置要求,完全可以忽略,但要作为比较用,就完全不同了,解决的办法就是你自己做一个大于和小于的函数代替 > 和 <,要求就是如果两个数差一点点都算等于,即如果A和B相差一个极小的数值(精度控制),使用你的大于和小于符号,都返回nil 我原本提供的程序選1,3,5,7時會有異常,2,4,6,8則不會,之前研究老半天,心中也曾有老大您說的看法,可是查詢座標點則看不出所以然,也用過誤差控制,一樣無效,這程序本身是寫好玩的,在實際工作中並未用到,但透過這過程,多了解一些排序的觀念,THANKS
PS.請套用的人要自行注意這樣的問題 飞哥编的程序真是很妙啊! 80万个圆做标注的时候我用了一天一夜才弄5万。程序还可以优化么?
页:
[1]