明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1943|回复: 6

[提问] 给定起终点,如何提取线段连线关系表

[复制链接]
发表于 2018-10-26 00:42:11 | 显示全部楼层 |阅读模式
10明经币
本帖最后由 itoboy 于 2018-11-5 23:10 编辑

如图两两点号间线段是独立的,可根据线段属性提取到分段连线关系表("RQ28" "RQ27" "RQ27" "RQ22" "RQ22" "RQ21" "RQ24" "RQ27" "RQ25" "RQ24" "RQ26" "RQ25" "RQ24" "RQ20")或(("RQ28" "RQ27") ( "RQ27" "RQ22") ( "RQ22" "RQ21") ( "RQ24" "RQ27") ( "RQ25" "RQ24") ( "RQ26" "RQ25") ("RQ24" "RQ20")),给定起点RQ26,终点RQ21,如何计算得到连续线段连线关系表("RQ26" "RQ25" "RQ24" "RQ27" "RQ22" "RQ21"),请大神帮忙
附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

查看完整内容

_$ (findpath "RQ24" "RQ28" lst) ("RQ24" "RQ27" "RQ28") _$ (findpath "RQ22" "RQ28" lst) ("RQ22" "RQ27" "RQ28") _$ (findpath "RQ22" "RQ26" lst) ("RQ22" "RQ27" "RQ24" "RQ25" "RQ26") _$ (findpath "RQ26" "RQ20" lst) ("RQ26" "RQ25" "RQ24" "RQ20") _$ (findpath "RQ26" "RQ28" lst) ("RQ26" "RQ25" "RQ24" "RQ27" "RQ28") _$ (findpath "RQ26" "RQ21" lst) ("RQ26" "RQ25" "RQ24" "RQ27" "RQ22" "RQ21 ...
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2018-10-26 00:42:12 | 显示全部楼层
  1. (setq lst '(("RQ28" "RQ27")
  2.             ("RQ27" "RQ22")
  3.             ("RQ22" "RQ21")
  4.             ("RQ24" "RQ27")
  5.             ("RQ25" "RQ24")
  6.             ("RQ26" "RQ25")
  7.             ("RQ24" "RQ20")
  8.            )
  9. )

  10. ;; (getpath "RQ26" "RQ21")
  11. (defun getpath (start end / next PD)
  12.   (if (null path)
  13.     (setq path (list start))
  14.     (setq path (cons start path))
  15.   )

  16.   (if (= start end)
  17.     (setq lst nil)
  18.     (if        lst
  19.       (progn
  20.         (if (setq next (getnext start))
  21.           (cond
  22.             ((= 1 (length next))
  23.              (getpath (car next) end)
  24.             )
  25.             ((> (length next) 1)
  26.              (setq pd (length path))
  27.              (while next
  28.                (getpath (car next) end)
  29.                
  30.                (setq next (cdr next))
  31.                ;; 路径回退到分支处
  32.                (while (and (/= end (car path)) (> (length path) pd))
  33.                  (setq path (cdr path))
  34.                )
  35.              )
  36.             )
  37.           )
  38.         )
  39.       )
  40.     )
  41.   )
  42. )


  43. ;; (getnext "RQ26")
  44. (defun getnext (s / next)
  45.   (setq next (vl-remove-if-not '(lambda (e) (member s e)) lst))

  46.   ;; 总路径表中移除查到的项防止路径返回
  47.   (setq lst (vl-remove-if '(lambda (e) (member e next)) lst))

  48.   (if next
  49.     (mapcar '(lambda (e1) (car (vl-remove-if '(lambda (e) (= s e)) e1)))
  50.             next
  51.     )
  52.   )
  53. )


  54. ;;;_$ (findpath "RQ26" "RQ21" lst)
  55. (defun findpath        (start end lst / path)
  56.   (getpath start end)
  57.   (reverse path)
  58. )



_$ (findpath "RQ24" "RQ28" lst)
("RQ24" "RQ27" "RQ28")
_$ (findpath "RQ22" "RQ28" lst)
("RQ22" "RQ27" "RQ28")
_$ (findpath "RQ22" "RQ26" lst)
("RQ22" "RQ27" "RQ24" "RQ25" "RQ26")
_$ (findpath "RQ26" "RQ20" lst)
("RQ26" "RQ25" "RQ24" "RQ20")
_$ (findpath "RQ26" "RQ28" lst)
("RQ26" "RQ25" "RQ24" "RQ27" "RQ28")
_$ (findpath "RQ26" "RQ21" lst)
("RQ26" "RQ25" "RQ24" "RQ27" "RQ22" "RQ21")
回复

使用道具 举报

发表于 2018-10-26 16:43:08 | 显示全部楼层

RE: 如何计算得到连续线段连线关系表 "RQ26" "RQ25"

本帖最后由 lisperado 于 2018-10-26 16:45 编辑

10明经币?

虽然不是很了解,排列思路如下

  1. (defun c:tt (/ l i s p e r a d o )
  2.   (setq r 2.0 ) ; 设定字体比列参数 1:2
  3.   (if (and (setq e (car (entsel "\n拾取多义线。。 ")))
  4.            (progn (redraw e 3)
  5.                   (princ "\n选取邻近 RQ#文字。。 ")
  6.                   (setq s (ssget '((0 . "TEXT") (1 . "*RQ*"))))
  7.                   )
  8.            )
  9.     (setq l (mapcar 'cdr
  10.                     (vl-remove nil
  11.                                (vl-sort        (mapcar        '(lambda (x)
  12.                                                    (setq o (vlax-ename->vla-object x)
  13.                                                          p (vlax-get o 'InsertionPoint)
  14.                                                          a (vlax-curve-getclosestpointto e p)
  15.                                                          d (distance p a)
  16.                                                          )
  17.                                                    (if (<= d (* (vla-get-Height o) r))
  18.                                                      (cons (vlax-curve-getdistatpoint e a) (vlax-get o 'TextString))
  19.                                                      )
  20.                                                    )
  21.                                                 (vl-remove-if 'listp (mapcar 'cadr (ssnamex s)))
  22.                                                 )
  23.                                         '(lambda (a b) (< (car a) (car b)))
  24.                                         )
  25.                                )
  26.                     )
  27.           )
  28.     )
  29.   (textscr)
  30.   l
  31.   )


但先判断是否起点RQ26,以及终点RQ21?
再reverse
回复

使用道具 举报

 楼主| 发表于 2018-10-26 17:47:39 | 显示全部楼层
lisperado 发表于 2018-10-26 16:43
10明经币?

虽然不是很了解,排列思路如下

十分感谢你的回复,怎么提取的可以不用管哈,现在只需要对表进行计算就ok,回家后再试试你的思路
回复

使用道具 举报

发表于 2018-11-1 17:06:22 | 显示全部楼层
线段表(("RQ28" "RQ27") ( "RQ27" "RQ23") ( "RQ22" "RQ21") ( "RQ24" "RQ27") ( "RQ25" "RQ24") ( "RQ26" "RQ25") ("RQ24" "RQ20"))和图不对应
给定起点RQ26,终点RQ21,从图上看可以得到结果("RQ26" "RQ25" "RQ24" "RQ27" "RQ22" "RQ21"),但是从线段表看是得不到这个结果的。。。
回复

使用道具 举报

 楼主| 发表于 2018-11-5 23:12:28 | 显示全部楼层
llsheng_73 发表于 2018-11-1 17:06
线段表(("RQ28" "RQ27") ( "RQ27" "RQ23") ( "RQ22" "RQ21") ( "RQ24" "RQ27") ( "RQ25" "RQ24") ( "RQ26"  ...

是我发帖时的失误,后来发现本来以为改了,结果好像没有保存上,第二个应该是 ( "RQ27" "RQ22")
回复

使用道具 举报

 楼主| 发表于 2018-11-7 21:53:48 | 显示全部楼层
vectra 发表于 2018-10-26 00:42
_$ (findpath "RQ24" "RQ28" lst)
("RQ24" "RQ27" "RQ28")
_$ (findpath "RQ22" "RQ28" lst)

万分感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-19 02:56 , Processed in 0.166133 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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