坐标的排序有什么好法子
(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和剩余的比较距离,。。
请问这个想法要怎么实现。
先说你实现这个是要做什么,很可能实现了这个也实现不了其他的。 利用equal逻辑fuzz条件但不完美
(vl-sort ls '(lambda (a b)
(if
(equal (cadr a) (cadr b) fuzz )
(< (car a) (car b))
(< (cadr a) (cadr b))
)
)
) 直接筛选就行 我用来编桩号的,谢谢2楼的提示,有点感觉,
另外那位朋友能提示一下lambda 详细运行原理吗 ;;*****************************************************************************通用点表排序
;;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))
)
)
)
)
)
;;*****************************************************************************通用点表排序 ;;; 通用函数 选择集按照给定的组码值进行排序
;;;
;;参数说明: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]