明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5083|回复: 21

[讨论] 【点排序】已知txt点文件,怎么给点排序?

  [复制链接]
发表于 2011-6-11 14:48:16 | 显示全部楼层 |阅读模式
【点排序】已知txt点文件,怎么给点排序?
txt点文件的格式为:[x y z][x y z][x y z][x y z]……
想给点排序的原则是:
1. 判断x,x小在前,如果x相等,判断y
2. 判断y,y小在前,如果y相等,判断z
3. 判断z,z小在前,如果z相等,删除重复点。
输出文件:
txt点文件的格式为:[x y z][x y z][x y z][x y z]……
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2011-6-11 14:49:54 | 显示全部楼层
考虑到小数点关系,误差在0.005内算作相等。
 楼主| 发表于 2011-6-11 14:57:46 | 显示全部楼层
或者不用文件,只对list=(pt1 pt2 ……)排序也可以啊,排序方式也是按先X,在Y,在Z方式,各自从小到大。
 楼主| 发表于 2011-6-11 15:19:56 | 显示全部楼层
论坛上秋风的程序,但是没有误差0.005判断,求改进


Sort_and_Write_pList :见附件
(defun Sort_and_Write_pList (fname plist / fp pt)
   ;; sort plist first
   (setq plist (vl-sort plist
                 '(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
       )
       (T nil)
         )
     )
             )
   )
 楼主| 发表于 2011-6-11 15:33:29 | 显示全部楼层
还有这个,都没有误差判断,而是直接判断
 楼主| 发表于 2011-6-11 15:34:27 | 显示全部楼层
;坐标表排序,By xiao_longxin
(defun order (/ coord_list coord_ord x y z bl_1 bl_2 i j k n)
  (setq        coord_list
         '(
           (1 2 3)
           (1 1 1)
           (1 1 3)
           (1 2 2)
           (3 3 1)
           (2 2 2)
           (3 3 3)
           (2 2 2)
           (1 2 2)
           (1 1 1)
          )
  )

  (setq n (length coord_list))

  (setq i 0)
  (repeat n
    (setq
      coord_ord        (append coord_ord (list (cons i (nth i coord_list))))
    )
    (setq i (1+ i))
  )
                                        ;排序x
  (setq i 1)
  (repeat (- n 1)
    (setq j i)
    (setq pd t)
    (while (and (/= j 0) pd)
      (if (< (nth 1 (nth j coord_ord))
             (nth 1 (nth (- j 1) coord_ord))
          )
        (progn
          (setq bl_1 (nth j coord_ord))
          (setq bl_2 (nth (- j 1) coord_ord))
          (setq coord_ord (subst -99 bl_1 coord_ord))
          (setq coord_ord (subst bl_1 bl_2 coord_ord))
          (setq coord_ord (subst bl_2 -99 coord_ord))
        )
        (setq pd nil)
      )
      (setq j (1- j))
    )

    (setq i (1+ i))
  )
                                        ;排序y
  (setq i 1)
  (repeat (- n 1)
    (setq j i)
    (setq pd t)
    (while (and (/= j 0) pd)
      (if (and (= (nth 1 (nth j coord_ord))
                  (nth 1 (nth (- j 1) coord_ord))
               )
               (< (nth 2 (nth j coord_ord))
                  (nth 2 (nth (- j 1) coord_ord))
               )
          )
        (progn
          (setq bl_1 (nth j coord_ord))
          (setq bl_2 (nth (- j 1) coord_ord))
          (setq coord_ord (subst -99 bl_1 coord_ord))
          (setq coord_ord (subst bl_1 bl_2 coord_ord))
          (setq coord_ord (subst bl_2 -99 coord_ord))
        )
        (setq pd nil)
      )
      (setq j (1- j))
    )

    (setq i (1+ i))
  )
                                        ;排序z

  (setq i 1)
  (repeat (- n 1)
    (setq j i)
    (setq pd t)
    (while (and (/= j 0) pd)
      (if (and (= (nth 1 (nth j coord_ord))
                  (nth 1 (nth (- j 1) coord_ord))
               )
               (= (nth 2 (nth j coord_ord))
                  (nth 2 (nth (- j 1) coord_ord))
               )
               (< (nth 3 (nth j coord_ord))
                  (nth 3 (nth (- j 1) coord_ord))
               )
          )
        (progn
          (setq bl_1 (nth j coord_ord))
          (setq bl_2 (nth (- j 1) coord_ord))
          (setq coord_ord (subst -99 bl_1 coord_ord))
          (setq coord_ord (subst bl_1 bl_2 coord_ord))
          (setq coord_ord (subst bl_2 -99 coord_ord))
        )
        (setq pd nil)
      )
      (setq j (1- j))
    )

    (setq i (1+ i))
  )

  (setq coord_list nil)
  (setq i 0)
  (repeat n
    (setq
      coord_list
       (append coord_list (list (cdr (nth i coord_ord))))
    )
    (setq i (1+ i))
  )

)
发表于 2011-6-11 15:51:02 | 显示全部楼层
回复 tm20038175 的帖子

  1. ;;;==================================================================
  2. ;;;Sort_pList 点表按照xyz升序排序,并删除重点,参数:点表 容差精度
  3. ;;;用法: (Sort_pList '((1.005 2.007 3.002)(1 2 3) (1.001 2.002 3.001) (1.005 2.005 3.002)(1.005 2.008 3.002) (1.005 2.006 3.002)) 0.001)
  4. ;;;==================================================================
  5. (defun Sort_pList (plist fuzz / result p)
  6.   (setq        plist
  7.          (vl-sort plist
  8.                   '(lambda (p1 p2)
  9.                      (cond ((and
  10.                               (< (car p1) (car p2))
  11.                               (not (equal (car p1) (car p2) fuzz))
  12.                             ) ;_ and
  13.                             T
  14.                            )
  15.                            ((and (equal (car p1) (car p2) fuzz)
  16.                                  (< (cadr p1) (cadr p2))
  17.                                  (not (equal (cadr p1) (cadr p2) fuzz))
  18.                             ) ;_ and
  19.                             T
  20.                            )
  21.                            ((and (equal (car p1) (car p2) fuzz)
  22.                                  (equal (cadr p1) (cadr p2) fuzz)
  23.                                  (< (caddr p1) (caddr p2))
  24.                                  (not (equal (caddr p1) (caddr p2) fuzz))
  25.                             ) ;_ and
  26.                             T
  27.                            )
  28.                            (T nil)
  29.                      ) ;_ cond
  30.                    ) ;_ lambda
  31.          ) ;_ vl-sort
  32.   ) ;_ setq
  33.   (while plist
  34.     (setq p (car plist)
  35.           result (cons p result)
  36.           plist (cdr plist)
  37.           )
  38.     (while (and plist (equal p (car plist) fuzz))
  39.       (setq plist (cdr plist))
  40.       )
  41.     )
  42.   (reverse result)
  43. ) ;_ defun
 楼主| 发表于 2011-6-11 16:05:04 | 显示全部楼层
十分感谢版主热心回复!!!

另外问一下:fuzz就是容差
吗?
发表于 2011-6-11 16:39:22 | 显示全部楼层
(setq a '((3 5 0)(3 5 0)(3 5 1)(3 2 4)(3 2 4)(3 2 3)(4 2 1)(4 2 1) (4 2 2) (6 4 3)))
(vl-sort (listxx a)
             (function (lambda (e1 e2)
                         (cond ((/= (car e1) (car e2))(< (car e1) (car e2)))
                               ((/= (cadr e1) (cadr e2))(< (cadr e1) (cadr e2)) )
                               ((< (caddr e1) (caddr e2)) )
                               ) ))
         )
(defun listxx ( a / b) ;删除表中重复元素1
(foreach x a (if(not(member x b))(setq b(append b(list x)))))
)
 楼主| 发表于 2011-6-11 21:38:31 | 显示全部楼层
回复 Gu_xl 的帖子

(reverse result) 好像这句话不行啊,得到的结果是从大到小的排列~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-10 04:17 , Processed in 0.168068 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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