马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
- ;;////////////////////////////////////////////////////////////////////////////////;;
- ;;(xl-sort# lst dolst)=对多维数组排序,按照执行的先后(最先执行的具有结果的最优先权)----ok!;;2004.8"最后"改为"最先"!.
- ;; v 1.1 修正版ok!----------by 梁雄啸.2004.4 (!!版权所有,转贴或使用请保留本信息行!!)
- (defun xl-sort# (lst dolst / i)
- (foreach n (reverse dolst)
- (setq i (car n)
- lst (if n (vl-sort lst '(lambda (x y)((eval (cadr n)) (nth i x)(nth i y))))
- lst))
- )
- )
- ;;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;;
- ;|详细说明:
- xl-sort#=对多维数组排序,按照执行的先后(最后执行的具有结果的最优先)
- 参数: lst = 要排序的数组,
- dolst = 按位排序所依据的函数列表 = '((i0 func0) (i1 func1) (i2 func2) ...) ;
- i* 为要进行排序的维度(元素中第n元素,不需要按照顺序)
- func* 分别对应数组lst元素(维,也是表)中的元素序列.
- func*可以是任何自定义的含2个参数的函数(注意函数中要对参数为nil时候的判断).如:(< nil 3)=T,(< 3 nil)=nil
- 注: i* 可根据需要自由设定次序.
- 实例:
- 1.(xl-sort# '((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.(xl-sort# '((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.(xl-sort# '((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.(xl-sort# '((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时,维数大的优先.
- (xl-sort# '((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))
- (xl-sort# '((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: (xl-sort# '((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))
- (xl-sort# '((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)
- )
- ;实战测试:
- ;ptsort = 在屏幕点选,调用xl-sort#排序点表,并按排序次序标注序号.
- (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 (xl-sort# ptlst '((0 <) (1 <)))
- (vl-cmdf ".text" n "500" "0" (itoa (setq i (1+ i))) "")
- )
- )
- (vl-cmdf ".undo" "e")
- (princ)
- )
- |;
|