明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 684|回复: 6

[提问] 坐标的排序有什么好法子

[复制链接]
发表于 2019-11-3 16:16 | 显示全部楼层 |阅读模式
(setq ss (vl-sort ss (function (lambda (x y)(< (fix (car x)) (fix (car y)))))));;X排序从左到右
(setq ss (vl-sort ss (function (lambda (x y)(> (fix (cadr x)) (fix (cadr y)))))));;Y排序从上到下

ss 是个坐标列表,我想对他进行二次排序

假设 ss 有1、2、3、4、5、6、7、8、9、10个点
我想1和其他的点比较距离,比如在1000以内有4 就排1、4
然后用2和剩余的比较距离,1000以内有 3、5 、7 就排 1、4 、2、3、5、7
然后用6和剩余的比较距离,。。

请问这个想法要怎么实现。

发表于 2019-11-5 08:28 | 显示全部楼层
先说你实现这个是要做什么,很可能实现了这个也实现不了其他的。
发表于 2019-11-6 02:38 | 显示全部楼层
利用equal逻辑fuzz条件但不完美

  1. (vl-sort ls '(lambda (a b)
  2.                             (if
  3.                              (equal (cadr a) (cadr b) fuzz )
  4.                              (< (car a) (car b))
  5.                              (< (cadr a) (cadr b))
  6.                              )
  7.                             )
  8.                          )
复制代码
发表于 2019-11-6 07:26 | 显示全部楼层
直接筛选就行
 楼主| 发表于 2019-11-6 08:44 | 显示全部楼层
我用来编桩号的,谢谢2楼的提示,有点感觉,
另外那位朋友能提示一下lambda 详细运行原理吗
发表于 2019-11-6 15:16 | 显示全部楼层
;;*****************************************************************************通用点表排序
;;ssPts: 1 选择集,返回图元列表
;;       2 点表(1到n维 1维时key只能是x或X),返回点表
;;       3 图元列表,返回图元列表
;;Key: "xyzXYZ"任意组合,例如"yX",y在前表示y坐标优先,小y表示从小到大(注:二维点时,不能有z)
;;FUZZ: 允许误差
;;注:点表可以1到n维混合,Key长度不大于点的最小维数。
;;示例1 (HH:ssPts:Sort (ssget) "YxZ" 0.5);返回(<Entity name: 7ef7b3a8> <Entity name: 7ef7b3a0>)
;;示例2 (HH:ssPts:Sort (list '(2 3) '(3 5)) "Yx" 0.5);返回((3 5) (2 3))
;;示例3 (HH:ssPts:Sort '(<Entity name: 7ef79a28> <Entity name: 7ef79a10>) "YxZ" 0.5)
;;本程序是在fsxm的扩展 自贡黄明儒 2013年9月9日
(defun HH:ssPts:Sort (ssPts KEY FUZZ / E EN FUN LST N SORTPTS SORTSS)
  ;;1 点列表排序
  (defun sortpts (PTS FUN xyz FUZZ)
    (vl-sort pts
                        '(lambda (a b)
                                 (if (not (equal (xyz a) (xyz b) fuzz))
                                         (fun (xyz a) (xyz b))
                                 )
                         )
    )
  )
  ;;2 排序
  (defun sortpts1 (PTS KEY FUZZ)
    (setq Key (vl-string->list Key))
    (foreach xyz (reverse Key)
      (cond ((< xyz 100)
                                                        (setq fun >)
                                                        (setq xyz (nth (- xyz 88) (list car cadr caddr)))
            )
                                (T
                                        (setq fun <)
                                        (setq xyz (nth (- xyz 120) (list car cadr caddr)))
                                )
      )
      (setq Pts (sortpts Pts fun xyz fuzz))
    )
  )
  ;;3 本程序主程序
  (cond        ((= (type ssPts) 'PICKSET)
                                                                 (repeat (setq n (sslength ssPts))
                                                                         (if (and (setq e (ssname ssPts (setq n (1- n))))
                                                                                                 (setq en (entget e))
                                                                                         )
                                                                                 (setq lst (cons (append (cdr (assoc 10 en)) (list e)) lst))
                                                                         )
                                                                 )
                                                                 (mapcar 'last (sortpts1 lst KEY FUZZ))
                                                         )
                ((Listp ssPts)
                        (cond ((vl-consp (car ssPts)) (sortpts1 ssPts KEY FUZZ))
                                ((= (type (car ssPts)) 'ENAME)
                                        (foreach e ssPts
                                                (if (setq en (entget e))                     
                                                        (setq lst (cons (append (cdr (assoc 10 en)) (list e)) lst))
                                                )
                                        )
                                        (mapcar 'last (sortpts1 lst KEY FUZZ))
                                )
                        )
                )
  )
)
;;*****************************************************************************通用点表排序
发表于 2019-11-6 15:18 | 显示全部楼层
;;; 通用函数 选择集按照给定的组码值进行排序
;;;
;;参数说明:SE  ----要排序的选择集                                                                  
;              DXF ----排序依据的组码号                                                                 
;              INT ----如果组码值为一个表,则INT指出使用第几个;否则nil                                 
;              FUZZ----允许偏差;若无为nil                                                              
;              K   ----T表示从大到小,nil表示从小到大                                                   
;    返回值:排序后的选择集                                                                             
;    示例:(SORT-SE SS 10 0   5.0 T  )  表示按照10组码的X坐标值进行排序,允许偏差值为5.0,顺序为从大到小
;         (SORT-SE SS 10 1   3.0 NIL)  表示按照10组码的Y坐标值进行排序,允许偏差值为3.0,顺序为从小到大
;          (SORT-SE SS 8  NIL NIL NIL)  表示按照8组码值(图层名称)进行排序,顺序为从小到大            

(vl-load-com)
(defun SORT-SE (SE DXF INT FUZZ K / ENT INDEX LST NEWLST NEWSE TMP)
    ;;建立排序列表
    (setq LST '() INDEX        0)
    (repeat (sslength SE)
        (setq ENT (entget (ssname SE INDEX))
              TMP (cdr (assoc DXF ENT))
        )
        (if (and INT
                 (= (type INT) 'INT)
                 (= (type TMP) 'list)
                 (< INT (length TMP))
            )
            (setq TMP (nth INT TMP))
        )
        (setq LST (cons
                      (list TMP (cdr (assoc 5 ENT)))
                      LST
                  )
        )
        (setq INDEX (1+ INDEX))
    )
    ;;排序操作
    (if        (and FUZZ
             (or
                 (= (type FUZZ) 'INT)
                 (= (type FUZZ) 'REAL)
             )
             (or
                 (= (type TMP) 'INT)
                 (= (type TMP) 'REAL)
             )
        )
        (setq NEWLST
                 (vl-sort LST
                          (function (lambda (E1 E2)
                                        (< (+ (car E1) FUZZ) (car E2))
                                    )
                          )
                 )
        )
        (setq NEWLST
                 (vl-sort LST
                          (function (lambda (E1 E2)
                                        (< (car E1) (car E2))
                                    )
                          )
                 )
        )
    )
    ;;如果K为T,则倒置
    (if        K
        (setq NEWLST (reverse NEWLST))
    )
    ;;组织排序后的选择集
    (setq NEWSE (ssadd))
    (foreach TMP NEWLST
        (setq NEWSE (ssadd (handent (cadr TMP)) NEWSE))
    )
    ;;返回值
    NEWSE
) ;_结束defun
;;;=============================================================
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 10:13 , Processed in 0.413550 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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