与ea共勉
本函数未考虑允许误差,但支持多纬数组排序和元素不等数组,可自定义排序次序,支持用函数进行排序判断

- ;;////////////////////////////////////////////////////////////////////////////////;;
- ;;(xsort lst dolst)=对多维数组排序,按照执行的先后(最先执行的具有结果的最优先权)
- ;|详细说明:
- xsort=对多维数组排序,按照执行的先后(最后执行的具有结果的最优先)
- 参数: lst = 要排序的数组,
- dolst = 按位排序所依据的函数列表 = '((i0 func0) (i1 func1) (i2 func2) ...) ;
- i* 为要进行排序的维度(元素中第n元素,不需要按照顺序)
- func* 分别对应数组lst元素(维,也是表)中的元素序列.
- func*可以是任何自定义的含2个参数的函数(注意函数中要对参数为nil时候的判断).如:(< nil 3)=T,(< 3 nil)=nil
- 注: i* 可根据需要自由设定次序.
- 实例:
- 1.(xsort '((0 1)(2 1)(0 2)(3 0)(3 1)(2 3)(1 0)(2 0)(1 1)(1 2)(1 3)) '((0 <) (1 <)))
- -> ((0 1) (0 2) (1 0) (1 1) (1 2) (1 3) (2 0) (2 1) (2 3) (3 0) (3 1))
- 2.(xsort '((0 1)(2 1)(0 2)(3 0)(3 1)(2 3)(1 0)(2 0)(1 1)(1 2)(1 3)) '((1 <) (0 <)))
- -> ((1 0) (2 0) (3 0) (0 1) (1 1) (2 1) (3 1) (0 2) (1 2) (1 3) (2 3))
- 3.(xsort '((1 0 1 0)(2 0 1 1)(2 2 2 1)(1 1 2 1)(1 1 1 3)) '((1 <) (3 >) (0 <) (2 <)))
- -> ((2 0 1 1) (1 0 1 0) (1 1 1 3) (1 1 2 1) (2 2 2 1))
- 4.(xsort '((1 0 1 0)(2 3 1 1)(2 2 2 1)(1 0 2 1)(1 1 1 1)) '((0 <) (2 >) nil (4 >)))
- -> ((1 0 2 1) (1 0 1 0) (1 1 1 1) (2 2 2 1) (2 3 1 1))
- 6.支持不等维数组.当对应dolst表中func* 不为nil时,维数大的优先.
- (xsort '((1 0 1)(2 3 1 1 3)(2 2 1)(1 0 2 1)(1 1 1 1 1)) '((0 <) (2 >) (1 <) nil (4 >)))
- -> ((1 0 2 1) (1 0 1) (1 1 1 1 1) (2 2 1) (2 3 1 1 3))
- (xsort '((1 0 1)(2 3 1 1 3)(2 2 1)(1 0 2 1)(1 1 1 1 1)(2 0 2)) '((0 <) (1 >) (2 <) (3 >) (4 >)))
- -> ((1 1 1 1 1) (1 0 1) (1 0 2 1) (2 3 1 1 3) (2 2 1) (2 0 2))
- 7.func*的灵活运用.可以是任何自定义的含2个参数的函数(注意函数中要对参数为nil时候的判断).如:(< nil 3)=T,(< 3 nil)=nil
- ;如下 (xrem x y)
- ;测试:(xrem 7 9) -> nil ;; (rem 7 3)= 1,(rem 9 3)= 0 ,(< 1 0)= nil.
- 代入xosrt: (xsort '((12 3)(7 4)(5 1)(4 4)(2 5)(3 4)(4 3)(3 1)(3 5)(4 2)(2 3)) '((0 <) (1 xrem)))
- 返回 -> ((2 3) (2 5) (3 4) (3 1) (3 5) (4 3) (4 4) (4 2) (5 1) (7 4) (12 3))
- (xsort '((12 3)(7 4)(5 1)(4 4)(2 5)(3 4)(4)(3 1)(3 5)(4 2)(2 3 3)) '((0 <) (1 xrem)))
- -> ((2 3 3) (2 5) (3 4) (3 1) (3 5) (4) (4 4) (4 2) (5 1) (7 4) (12 3))
- |;
- (defun xrem (x y)
- (if (or (and (= nil x) y)
- (and x y (< (rem x 3)(rem y 3))))
- T
- nil)
- )
[php]
;实战测试:
;ptsort = 在屏幕点选,调用xsort排序点表,并按排序次序标注序号.
(defun c:ptsort (/ pt lst i) ;ptlst 全局.
(vl-cmdf ".undo" "be")
(while (and (princ "\n取点<上一组点表>:") (setq pt (getpoint)))
(setq lst (cons pt lst))
)
(setq ptlst (if lst lst ptlst))
(setq i 0)
(if ptlst
(foreach n (xsort ptlst '((0 <) (1 <)))
(vl-cmdf ".text" n "500" "0" (itoa (setq i (1+ i))) "")
)
)
(vl-cmdf ".undo" "e")
(princ)
)
[/php]
附件含 xsort 函数 及 c:ptsort (加载xsort.fas) |