明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 910|回复: 5

[提问] 求助关于表排序函数

[复制链接]
发表于 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不是按从小到大排序的

麻烦告诉给解决一下,先谢谢了
发表于 2019-10-10 08:54:08 | 显示全部楼层
  1. ;; 示例: (MJ:SortPoints MJ:Points "Y") 按Y排序
  2. (defun MJ:SortPoints (points-list xyz)
  3.   (setq xyz (strcase xyz))
  4.   (cond
  5.     ((= xyz "Z")
  6.      (vl-sort points-list
  7.               (function (lambda (p1 p2) (< (caddr p1) (caddr p2))))
  8.      )
  9.      ;|; 3-point lists required!
  10.      (if
  11.        (apply '= (mapcar '(lambda (lst) (length lst)) points-list));如果各点长度同
  12.         (vl-sort points-list (function (lambda (p1 p2) (< (caddr p1) (caddr p2)))))
  13.         (princ "\nCannot sort on Z-coordinates with 2D points!")
  14.      )|;
  15.     )
  16.     ((= xyz "X")
  17.      (vl-sort
  18.        points-list
  19.        (function (lambda (p1 p2) (< (car p1) (car p2))))
  20.      )
  21.     )                                       
  22.     ((= xyz "Y")
  23.      (vl-sort
  24.        points-list
  25.        (function (lambda (p1 p2) (< (cadr p1) (cadr p2))))
  26.      )
  27.     )
  28.   )
  29. )
发表于 2019-10-10 19:48:20 | 显示全部楼层
  1. ;; Sort-ptnByXYZ 点表按照xyz从小到大排序 (Sort-ptnByXYZ ptn)
  2. (defun Sort-ptnByXYZ (ptn / p1 p2)
  3.   (vl-sort ptn
  4.            '(lambda (p1 p2)
  5.               (cond ((< (car p1) (car p2)) T)
  6.                     ((and (= (car p1) (car p2)) (< (cadr p1) (cadr p2))) T)
  7.                     ((and (= (car p1) (car p2))
  8.                           (= (cadr p1) (cadr p2))
  9.                           (< (caddr p1) (caddr p2))
  10.                      )
  11.                      T
  12.                     )
  13.               )
  14.             )
  15.   )
  16. )
发表于 2019-10-10 21:20:42 | 显示全部楼层
vl-sort函数对双条件排序存在问题,之前在写类似需求时发现的,后来只能分开两次做排序,结果就完全正确了。
发表于 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))
             )
           )
  )
)
 楼主| 发表于 2019-10-11 22:09:55 | 显示全部楼层
谢谢各位大哥回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-18 15:59 , Processed in 0.191371 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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