coolpoom 发表于 2022-11-27 01:52:57

如何将直线XY坐标按线段长短排序输出

如图所示,如何将直线XY坐标按线段长短排序输出到文本?

mj0000 发表于 2022-11-27 01:52:58

本帖最后由 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
)

自贡黄明儒 发表于 2022-11-27 11:16:59

可以(cons 距离 点),这样以“距离”来排序,然后去掉距离,就是点了。

xyp1964 发表于 2022-11-27 16:35:13


coolpoom 发表于 2022-11-28 20:37:14

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

mj0000 发表于 2022-11-29 07:32:06

你加入起点的位置,加个判断,判断直线10和11组码坐标,距离P0点的距离就可以了
页: [1]
查看完整版本: 如何将直线XY坐标按线段长短排序输出