dting2011 发表于 2019-10-10 02:48:18

求助关于表排序函数

请教各位大哥,有很多坐标组成的表,想要坐标按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不是按从小到大排序的

麻烦告诉给解决一下,先谢谢了

fan_zh 发表于 2019-10-10 08:54:08

;; 示例: (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))))
   )
    )
)
)

xyp1964 发表于 2019-10-10 19:48:20

;; 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
                  )
              )
          )
)
)

e2002 发表于 2019-10-10 21:20:42

vl-sort函数对双条件排序存在问题,之前在写类似需求时发现的,后来只能分开两次做排序,结果就完全正确了。

caoyin 发表于 2019-10-10 23:01:35

(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))
             )
         )
)
)

dting2011 发表于 2019-10-11 22:09:55

谢谢各位大哥回复
页: [1]
查看完整版本: 求助关于表排序函数