明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: LONGXIN

论坛中有没有不用vl-sort对任意表进行多重排序的例子?

  [复制链接]
发表于 2011-8-27 02:35:01 | 显示全部楼层
本帖最后由 caoyin 于 2011-8-27 02:42 编辑

;;既然不用vl函数,那就用aLisp写出vl-sort来,
;;第二个参数即排序函数无法做到像vl-sort一样对任何数量的参数都有效,但对于> <函数是可以的
;;因此以下函数处理楼主的数据,需要先对列排序,然后再进一步处理
;;因为临时写的程序,考虑得不严谨,仅供参考
;;  (sort '(3 4 1 7 2 9 5) '<)
;;  (sort '(3 4 2 1 7 2 9 5) '<=);;这里如果用=就会死循环,还可以改进
;;  (sort '("W" "A" "x" "E" "WD" "XX" "xD" "XE") '<)

(defun SORT (LST FUN / JIN X LST2)
(defun JIN (IT LST / TAG TMP LST2)
   (while (not TAG)
     (setq TMP (append LST2 (list IT) LST))
     (if (not (setq TAG (apply FUN TMP)))
       (setq LST2 (append LST2 (list (car LST)))
             LST  (cdr LST)
       )
     )
   )
   TMP
)
(while LST
   (setq X    (car LST)
         LST  (cdr LST)
         LST2 (JIN X LST2)
   )
)
LST2
)

点评

很遗憾,对于重复项没法排序,一运行就出错  发表于 2013-5-27 17:53
发表于 2011-8-29 16:21:54 | 显示全部楼层
发表于 2012-10-5 22:37:19 | 显示全部楼层
百度的也看不懂几个,,,
发表于 2013-1-26 16:07:28 | 显示全部楼层
很深奥啊,没有注释,看不懂
发表于 2013-5-27 17:48:41 | 显示全部楼层
(setq List1 '((3 11) (2 13) (1 13) (3 10) (1 12)(4 12)))
(setq i 0)
(setq number 2)
(repeat        number
   (setq List1  (mapcar '(lambda (x) (nth x List1))
             (vl-sort-i        List1
                        (function (lambda (e1 e2)
                                       (< (nth i e1) (nth i e2))
                                  )
                        )
             )
     )
)
     (setq i (1+ i))
)
发表于 2013-5-28 00:31:03 | 显示全部楼层
本帖最后由 cy956 于 2013-5-28 00:34 编辑

这是vl出现之前用的排序,楼主有兴趣就发上来看看。
  1. (defun lup(a / b mn mx);;;(lup a)■对一个数字表排序,重复的忽略
  2.   (setq mn (apply 'min a) mn (- mn 1000.))
  3.   (while (> (setq mx (apply 'max a)) mn)
  4.     (setq b (cons mx b) a (subst mn mx a))  )
  5.   b)

  6. (defun #px-point2;;(#px-point2 pb)■根据点表第1,2元素的xy比较排序,同#px-point1
  7.        (pb / IN K N P0 P1 PB1 PB11 PB2 PB21 PT)
  8.   ;点表排序,返回点表【根据第一二元素的xy比较】与#px-point1同
  9.   (setq k(if(equal (car (nth 0 pb))(car (nth 1 pb)) 0.0001) 1 0 )
  10.         n(length pb) in 0 pb1'() pb2'())
  11.   (repeat n
  12.     (setq pt(nth in pb) in (1+ in))
  13.     (if pt
  14.       (setq pb1(cons (nth k pt) pb1)
  15.      pb2(append pb2 (list (cons (nth k pt) pt)))))
  16.   )
  17.   (setq pb11(lup pb1)n(length pb11)in 0
  18. p0(car pb11)pb21(list (dxf p0 pb2)))
  19.   (repeat n
  20.     (setq p1(nth in pb11))
  21.     (if (equal p1 p0 0.0000001)
  22.       (setq in (1+ in))
  23.       (setq in (1+ in)
  24.      pb21(append pb21 (list (dxf p1 pb2)))
  25.      p0 p1)
  26.     )
  27.   )pb21
  28. )
不过有好用的,为何还想着老的?玩lisp又到不了底层。


点评

mac osX 版本的cad不支持vl-sort函数  发表于 2014-8-27 11:14
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-30 10:55 , Processed in 0.166867 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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