wanchr 发表于 2019-11-3 16:16:42

坐标的排序有什么好法子

(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和剩余的比较距离,。。

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

satan421 发表于 2019-11-5 08:28:24

先说你实现这个是要做什么,很可能实现了这个也实现不了其他的。

lisperado 发表于 2019-11-6 02:38:11

利用equal逻辑fuzz条件但不完美

(vl-sort ls '(lambda (a b)
                            (if
                           (equal (cadr a) (cadr b) fuzz )
                           (< (car a) (car b))
                           (< (cadr a) (cadr b))
                           )
                            )
                         )

690994 发表于 2019-11-6 07:26:04

直接筛选就行

wanchr 发表于 2019-11-6 08:44:35

我用来编桩号的,谢谢2楼的提示,有点感觉,
另外那位朋友能提示一下lambda 详细运行原理吗

qq1254582201 发表于 2019-11-6 15:16:07

;;*****************************************************************************通用点表排序
;;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))
                                )
                        )
                )
)
)
;;*****************************************************************************通用点表排序

qq1254582201 发表于 2019-11-6 15:18:29

;;; 通用函数 选择集按照给定的组码值进行排序
;;;
;;参数说明: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 8NIL 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
;;;=============================================================
页: [1]
查看完整版本: 坐标的排序有什么好法子