求助关于表排序函数
请教各位大哥,有很多坐标组成的表,想要坐标按X Y Z从小到大的顺序排序,怎么写lisp程序啊,先按X坐标从小到大排,X坐标相同的,再按Y坐标从小到大排序,Y坐标相同的,再按Z坐标从小到大排序论坛里有个表排序函数http://bbs.mjtd.com/thread-95905-1-1.html为啥我给坐标排序,有的好使,有的不好使呢,
比如下面这些坐标PTLIST = ((343.47 281.437 385.384) (343.47 281.443 4.81646) (343.47 -39.9222 7.04077) (-550.17 311.481 206.126) (-550.17 -9.7355 -176.912) (-550.17 311.493 -178.935))
排序完之后PTLIST = ((-550.17 311.481 206.126) (-550.17 311.493 -178.935) (-550.17 -9.7355 -176.912) (343.47 281.443 4.81646) (343.47 -39.9222 7.04077) (343.47 281.437 385.384))
能看出来后三个坐标已经是错的了,Y不是按从小到大排序的
麻烦告诉给解决一下,先谢谢了
;; 示例: (MJ:SortPoints MJ:Points "Y") 按Y排序
(defun MJ:SortPoints (points-list xyz)
(setq xyz (strcase xyz))
(cond
((= xyz "Z")
(vl-sort points-list
(function (lambda (p1 p2) (< (caddr p1) (caddr p2))))
)
;|; 3-point lists required!
(if
(apply '= (mapcar '(lambda (lst) (length lst)) points-list));如果各点长度同
(vl-sort points-list (function (lambda (p1 p2) (< (caddr p1) (caddr p2)))))
(princ "\nCannot sort on Z-coordinates with 2D points!")
)|;
)
((= xyz "X")
(vl-sort
points-list
(function (lambda (p1 p2) (< (car p1) (car p2))))
)
)
((= xyz "Y")
(vl-sort
points-list
(function (lambda (p1 p2) (< (cadr p1) (cadr p2))))
)
)
)
) ;; Sort-ptnByXYZ 点表按照xyz从小到大排序 (Sort-ptnByXYZ ptn)
(defun Sort-ptnByXYZ (ptn / p1 p2)
(vl-sort ptn
'(lambda (p1 p2)
(cond ((< (car p1) (car p2)) T)
((and (= (car p1) (car p2)) (< (cadr p1) (cadr p2))) T)
((and (= (car p1) (car p2))
(= (cadr p1) (cadr p2))
(< (caddr p1) (caddr p2))
)
T
)
)
)
)
) vl-sort函数对双条件排序存在问题,之前在写类似需求时发现的,后来只能分开两次做排序,结果就完全正确了。
(defun PTS-SORT (PLST)
(vl-sort PLST
'(lambda (A B)
(if (equal (car A) (car B) 1E-8)
(if (equal (cadr A) (cadr B) 1E-8)
(< (caddr A) (caddr B))
(< (cadr A) (cadr B))
)
(< (car A) (car B))
)
)
)
) 谢谢各位大哥回复
页:
[1]