如何将直线XY坐标按线段长短排序输出
如图所示,如何将直线XY坐标按线段长短排序输出到文本? 本帖最后由 mj0000 于 2022-11-27 11:39 编辑刚好函数库里有,给你个,自己修改下,加上基点到表里面,再输出到文本
;|;________________________________________________________________________________________
[■函数] (Sort_PtsByDist Pt0 Pts Mode)
[功能] 指定点Pt0距离坐标点集中各个点的远近排序(点表远近排序) -- 按距离Pt0点的远近进行排序
[参数] Pt0 --- 排序的基点,起始点
Pts --- 要排序的点表
Mode -- 排序方式。为T时 -- 从近到远排序,为nil时 -- 从远到近排序
[返回值] 排序后的表
[测试] (Sort_PtsByDist (getpoint "\n基点: ")(list (getpoint "\n点1: ") (getpoint "\n点2: ") (getpoint "\n点3: ") (getpoint "\n点4: ")) T)
[函数内容] |;
(defun Sort_PtsByDist (Pt0 Pts Mode / a b DIST I PT_Lst Pt1)
(setq i -1
PT_Lst '()
)
(while (setq Pt1 (nth (setq i (1+ i)) Pts))
(setq dist (distance Pt0 Pt1) ;返回距离Pt0点的距离
PT_Lst (cons (list dist Pt1) PT_Lst) ;返回格式:'((长度1 pt1) (长度2 pt2) ...)
)
)
(if PT_Lst
(progn
(if Mode
(setq PT_Lst (vl-sort PT_Lst '(lambda (a b) (< (car a) (car b))))) ;按距离排序 -- 从近到远
(setq PT_Lst (vl-sort PT_Lst '(lambda (a b) (> (car a) (car b))))) ;按距离排序 -- 从远到近
)
(setq PT_Lst (mapcar 'cadr PT_Lst)) ;删除距离数值
;;(princ "\n-->> 排序后的表 = ")
)
)
PT_Lst
)
可以(cons 距离 点),这样以“距离”来排序,然后去掉距离,就是点了。
mj0000 发表于 2022-11-27 11:36
刚好函数库里有,给你个,自己修改下,加上基点到表里面,再输出到文本
;|;_____________________________ ...
(repeat (sslength ss)
(setq en(ssname ss i)
ent (entget en)
pt(cdr (assoc 10 ent))
pt_1(cdr (assoc 11 ent))
dist (distance pt pt_1)
j 0)
(setq biao (append biao (list (list dist pt pt_1))))
(setq biao (vl-sort biao '(lambda (a b) (< (car a) (car b)))))
(setq i(1+ i))
);repeat
谢谢,看了你代码里的距离提醒了我,我在表内直接加入了起点到终点的距离可以达到效果了。现在又遇到另一个问题:当有线条起点不是P0时得到的表就不正确了,比如有条直线是起点是P3,终点是P0 你加入起点的位置,加个判断,判断直线10和11组码坐标,距离P0点的距离就可以了
页:
[1]