明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5098|回复: 20

如果根据距离最近的点自动生成Pline线?

  [复制链接]
发表于 2010-12-29 20:28:35 | 显示全部楼层 |阅读模式
本帖最后由 xfbar 于 2010-12-30 07:38 编辑

指定起始点和终点,从左边第一个点开始,自动与最近点相连生成一条PLine线,用LISP程序怎么实现?

完整的程序咋写的!?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2010-12-31 20:38:47 | 显示全部楼层
ZZXXQQ 发表于 2010-12-31 20:24
10楼已改。再试试。

谢谢版主
重新下载,可以连接了。
要有规律的点连接才好,如果是较密的点,需要手动修改连接.
学习了
谢谢
回复 支持 0 反对 1

使用道具 举报

发表于 2017-8-11 09:02:29 | 显示全部楼层
发表于 2017-8-10 13:12:44 | 显示全部楼层
加工中心在加工孔的时候,找最近的点加工,是最近的路径,
 楼主| 发表于 2010-12-29 21:20:58 | 显示全部楼层
本帖最后由 xfbar 于 2010-12-29 22:11 编辑

示例 点都在 图上!
发表于 2010-12-30 11:45:37 | 显示全部楼层
取点成表 起点和其他的点的距离 ((dis1 ptstart pt1) (dis2 ptstart pt2) -------)   排序
求出第二个点 将第二个点定义成第一个点 以此循环
 楼主| 发表于 2010-12-30 12:44:24 | 显示全部楼层
思路是这样!想要代码,下面运行有问题,帮看看
  1. (defun z_timer (/ stime h m s)
  2.   (if (not zhf_time_dot)
  3.     (setq zhf_time_dot
  4.     (getvar "date")
  5.    h nil
  6.     )
  7.     (progn
  8.       (setq stime (getvar "date"))
  9.       (setq stime (- stime zhf_time_dot))
  10.       (setq stime (* 86400.0 (- stime (fix stime))))
  11.       (setq h (fix (/ stime 3600)))
  12.       (setq m (fix (/ (- stime (* h 3600)) 60)))
  13.       (setq s (fix (- stime (* m 60) (* h 3600))))
  14.       (setq zhf_time_dot nil)

  15.       (strcat (if (> h 0)
  16.   (strcat (rtos h 2 0) "小时")
  17.   ""
  18.        )
  19.        (if (> m 0)
  20.   (strcat (rtos m 2 0) "分钟")
  21.   ""
  22.        )
  23.        (rtos s 2 0)
  24.        "秒"
  25.       )
  26.     )
  27.   )
  28. )
  29. (defun show (lst stop)
  30.   (mapcar '(lambda (x) (redraw (vlax-vla-object->ename x) 3))
  31.    lst
  32.   )
  33.   (if stop
  34.     (progn (getpoint)
  35.     (mapcar '(lambda (x) (redraw (vlax-vla-object->ename x) 4))
  36.      lst
  37.     )
  38.     )
  39.   )
  40. )
  41. (defun ss2lst (ss vla / re e)
  42.   (if ss
  43.     (repeat (setq n (sslength ss))
  44.       (if vla
  45. (setq e (vlax-ename->vla-object (ssname ss (setq n (1- n)))))
  46. (setq e (ssname ss (setq n (1- n))))
  47.       )
  48.       (setq re (append re (list e)))
  49.     )
  50.   )
  51.   re
  52. )
  53. (defun getss@ (p)
  54.   (ssget "c"
  55.   p
  56.   (polar p (/ pi 4) (/ (getvar "viewsize") 5000))
  57.   '((0 . "arc,ellipse,*line"))
  58.   )
  59. )
  60. (defun getconnect (e)
  61.   (vl-remove e
  62.       (append (ss2lst (getss@ (vlax-curve-getStartpoint e)) t)
  63.        (ss2lst (getss@ (vlax-curve-getEndpoint e)) t)
  64.       )
  65.   )
  66. )
  67. (defun remove:same (lst / re)
  68.   (foreach n lst
  69.     (if (member n re)
  70.       ()
  71.       (setq re (append re (list re)))
  72.     )
  73.   )
  74.   re
  75. )
  76. (defun get:len (e)
  77.   (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e))
  78. )
  79. ;;;________________________________________________
  80. ;;;________________________________________________
  81. ;;;________________________________________________
  82. ;;;________________________________________________
  83. (defun main (pt1 pt2 show / ss sse line path paths shortlen shortlst ss1
  84.       shortest)
  85.   (setq count 0)
  86.   (setq ss  (ss2lst (getss@ pt1) t)
  87. sse (ss2lst (getss@ pt2) t)
  88.   )
  89.   (if (and ss sse)
  90.     (progn
  91.       (setq passed-ss ss
  92.      path-ss   (mapcar '(lambda (x) (list x)) ss)
  93.      dist-ss   (mapcar '(lambda (x) (list x (get:len x))) ss)
  94.      dist-ss   (vl-sort dist-ss '(lambda (a b) (< (cadr a) (cadr b))))
  95.      complete  nil

  96.       )
  97.       (mapcar '(lambda (x)
  98.    (if (member x sse)
  99.      (setq
  100.        complete (append complete (list (list x (get:len x))))
  101.      )
  102.    )
  103.         )
  104.        ss
  105.       )
  106.       (if complete
  107. (setq complete (vl-sort complete
  108.     '(lambda (a b) (< (cadr a) (cadr b)))
  109.          )
  110.        shortest (cadar complete)
  111. )
  112.       )

  113.       (if (and shortest (= shortest (distance pt1 pt2)))
  114. (progn
  115.    (list (cadar complete) (list (caar complete)))
  116. )
  117. (progn
  118.    (while (and dist-ss (> (length sse) (length complete)))
  119.      (setq now   (car dist-ss)
  120.     dist-ss (cdr dist-ss)
  121.      )
  122. ;;;_____________________________
  123. ;;;_____________________________
  124. ;;;_____________________________
  125.      (if show
  126.        (progn
  127.   (vlax-put (car now) 'color (+ 21 (* 10 (rem count 20))))
  128.   (vla-update (car now))
  129.        )
  130.      )
  131. ;;;_____________________________
  132. ;;;_____________________________
  133. ;;;_____________________________
  134.      (if (member (car now) sse)
  135.        (progn
  136.   (setq complete (append complete (list now)))
  137. ;;;__________________________________________________
  138. ;;;到达终点后剔出所有距离已经超出最小路由长度的未完成方向
  139.   (setq complete
  140.           (vl-sort complete
  141.      '(lambda (a b) (< (cadr a) (cadr b)))
  142.           )
  143.         shortest (cadar complete)
  144.         dist-ss  (mapcar '(lambda (x)
  145.        (if (< (cadr x) shortest)
  146.          x
  147.          nil
  148.        )
  149.      )
  150.            dist-ss
  151.           )
  152.         dist-ss  (vl-remove nil dist-ss)
  153.   )
  154. ;;;__________________________________________________
  155. ;;;__________________________________________________
  156.        )
  157.        (progn
  158.   (setq count (1+ count))
  159.   (setq ss (getconnect (car now)))
  160.   (mapcar '(lambda (x) (setq ss (vl-remove x ss)))
  161.    passed-ss
  162.   )
  163.   (setq passed-ss (append passed-ss ss)
  164.         path-ss (append
  165.       path-ss
  166.       (mapcar '(lambda (x) (list x (car now))) ss)
  167.     )
  168.         dist-ss (append
  169.       dist-ss
  170.       (mapcar
  171.         '(lambda (x)
  172.            (if (or (not shortest)
  173.             (< (get:len x) shortest)
  174.         )
  175.       (list x (+ (cadr now) (get:len x)))
  176.            )
  177.          )
  178.         ss
  179.       )
  180.     )
  181.         dist-ss (vl-remove nil dist-ss)
  182.         dist-ss (vl-sort dist-ss
  183.       '(lambda (a b) (< (cadr a) (cadr b)))
  184.     )
  185.   )
  186.        )
  187.      )
  188.    )
  189. ;;;_____________________________
  190. ;;;_____________________________
  191. ;;;_____________________________
  192.    (if show
  193.      (progn
  194.        (mapcar '(lambda (x) (vlax-put x 'color 0)) passed-ss)
  195.        (mapcar '(lambda (x) (vla-update x)) passed-ss)
  196.      )
  197.    )
  198. ;;;_____________________________
  199. ;;;_____________________________
  200. ;;;_____________________________
  201.    (if complete
  202.      (progn
  203.        (setq
  204.   complete (vl-sort complete
  205.       '(lambda (a b) (< (cadr a) (cadr b)))
  206.     )
  207.   n  (car complete)

  208.        )
  209.        (setq len (cadr n)
  210.       n (car n)
  211.        )
  212.        (while n
  213.   (setq ss1 (append ss1 (list n)))
  214.   (setq n (cadr (assoc n path-ss)))
  215.        )
  216.        (list len (reverse ss1))
  217.      )
  218.      nil
  219.    )
  220. )
  221.       )
  222.     )
  223.     nil
  224.   )
  225. )
  226. ;;;________________________________________________
  227. ;;;________________________________________________
  228. ;;;________________________________________________
  229. ;;;________________________________________________
  230. (defun c:ttt (/ pt1 pt2 ss1 ss2 complete)
  231.   (redraw)
  232.   (setq pt1 (getpoint "\n起点:")
  233. pt2 (getpoint "\n终点:")
  234.   )
  235.   (mapcar
  236.     '(lambda (pt)
  237.        (grdraw (polar pt (* pi 0.25) (/ (getvar "viewsize") 40))
  238.         (polar pt (* pi -0.75) (/ (getvar "viewsize") 40))
  239.         1
  240.        )
  241.        (grdraw (polar pt (* pi 0.75) (/ (getvar "viewsize") 40))
  242.         (polar pt (* pi -0.25) (/ (getvar "viewsize") 40))
  243.         1
  244.        )
  245.      )
  246.     (list pt1 pt2)
  247.   )
  248.   (setq zhf_time_dot nil)
  249.   (z_timer)
  250.   (setq ss1 (main pt1 pt2 t))
  251.   (if ss1
  252.     (progn
  253.       (setq ss2 (ssadd))
  254.       (mapcar '(lambda (x)
  255.    (setq ss2 (ssadd (vlax-vla-object->ename x) ss2))
  256.         )
  257.        (cadr ss1)
  258.       )
  259.       (princ (strcat "\n虚线显示最短路线, 共需"
  260.        (itoa (sslength ss2))
  261.        "步,总长度为:"
  262.        (rtos (car ss1))
  263.        "  历时:"
  264.        (z_timer)
  265.       )
  266.       )
  267.       (show (cadr ss1) nil)

  268.     )
  269.     (princ (strcat "\n两点间没有可连通路径,历时:" (z_timer)))
  270.   )
  271.   (princ)
  272. )
  273. ;;;________________________________________________
  274. ;;;________________________________________________
  275. ;;;________________________________________________
  276. ;;;________________________________________________
  277. (princ "\n寻找连接两点的最近路线,by wkai @ xdcad ")
  278. (princ
  279.   "\n前提 所有路线只在交点处交叉,起点和终点选择路线的端点."
  280. )
  281. (princ "\n核心函数 (main 起点 终点 是否显示搜索过程) ")
  282. (princ "\n返回值   (最短路线长度  最短路线途径实体表)")
  283. (princ "\n测试命令:ttt\n")
  284. (princ)
发表于 2010-12-30 17:13:05 | 显示全部楼层
好长
 楼主| 发表于 2010-12-30 17:43:56 | 显示全部楼层
谁帮写 个 简洁有效LSP程序!
发表于 2010-12-30 21:50:27 | 显示全部楼层
露水2 发表于 2010-12-30 11:45
取点成表 起点和其他的点的距离 ((dis1 ptstart pt1) (dis2 ptstart pt2) -------)   排序
求出第二个点 将 ...

你说的此方法,对于例图有效,如果是无规则的点,这样得到的并不是最短的路径,院长和老迈好像已经做到,见过演示图。
发表于 2010-12-30 21:56:48 | 显示全部楼层
谢谢提醒 我没有仔细想
每次都是最近点 路径不知道是不是最短的
 楼主| 发表于 2010-12-30 22:44:03 | 显示全部楼层
本帖最后由 xfbar 于 2010-12-30 22:54 编辑

不是杂乱无章的离散掉点。数据有规则性,大致朝一个方向。 是地下管道的焊口坐标,是分批采集的!所以想实现自动生成一条线!
发表于 2010-12-30 22:54:42 | 显示全部楼层
本帖最后由 ZZXXQQ 于 2010-12-31 21:06 编辑

游客,本帖隐藏的内容需要发帖数高于 5 才可浏览,你当前发帖数只有 0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-20 01:08 , Processed in 0.192123 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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