给定起终点,如何提取线段连线关系表
本帖最后由 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"),请大神帮忙
(setq lst '(("RQ28" "RQ27")
("RQ27" "RQ22")
("RQ22" "RQ21")
("RQ24" "RQ27")
("RQ25" "RQ24")
("RQ26" "RQ25")
("RQ24" "RQ20")
)
)
;; (getpath "RQ26" "RQ21")
(defun getpath (start end / next PD)
(if (null path)
(setq path (list start))
(setq path (cons start path))
)
(if (= start end)
(setq lst nil)
(if lst
(progn
(if (setq next (getnext start))
(cond
((= 1 (length next))
(getpath (car next) end)
)
((> (length next) 1)
(setq pd (length path))
(while next
(getpath (car next) end)
(setq next (cdr next))
;; 路径回退到分支处
(while (and (/= end (car path)) (> (length path) pd))
(setq path (cdr path))
)
)
)
)
)
)
)
)
)
;; (getnext "RQ26")
(defun getnext (s / next)
(setq next (vl-remove-if-not '(lambda (e) (member s e)) lst))
;; 总路径表中移除查到的项防止路径返回
(setq lst (vl-remove-if '(lambda (e) (member e next)) lst))
(if next
(mapcar '(lambda (e1) (car (vl-remove-if '(lambda (e) (= s e)) e1)))
next
)
)
)
;;;_$ (findpath "RQ26" "RQ21" lst)
(defun findpath (start end lst / path)
(getpath start end)
(reverse path)
)
_$ (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")
RE: 如何计算得到连续线段连线关系表 "RQ26" "RQ25"
本帖最后由 lisperado 于 2018-10-26 16:45 编辑10明经币?
虽然不是很了解,排列思路如下
(defun c:tt (/ l i s p e r a d o )
(setq r 2.0 ) ; 设定字体比列参数 1:2
(if (and (setq e (car (entsel "\n拾取多义线。。 ")))
(progn (redraw e 3)
(princ "\n选取邻近 RQ#文字。。 ")
(setq s (ssget '((0 . "TEXT") (1 . "*RQ*"))))
)
)
(setq l (mapcar 'cdr
(vl-remove nil
(vl-sort (mapcar '(lambda (x)
(setq o (vlax-ename->vla-object x)
p (vlax-get o 'InsertionPoint)
a (vlax-curve-getclosestpointto e p)
d (distance p a)
)
(if (<= d (* (vla-get-Height o) r))
(cons (vlax-curve-getdistatpoint e a) (vlax-get o 'TextString))
)
)
(vl-remove-if 'listp (mapcar 'cadr (ssnamex s)))
)
'(lambda (a b) (< (car a) (car b)))
)
)
)
)
)
(textscr)
l
)
但先判断是否起点RQ26,以及终点RQ21?
再reverse lisperado 发表于 2018-10-26 16:43
10明经币?
虽然不是很了解,排列思路如下
十分感谢你的回复,怎么提取的可以不用管哈,现在只需要对表进行计算就ok,回家后再试试你的思路 线段表(("RQ28" "RQ27") ( "RQ27" "RQ23") ( "RQ22" "RQ21") ( "RQ24" "RQ27") ( "RQ25" "RQ24") ( "RQ26" "RQ25") ("RQ24" "RQ20"))和图不对应
给定起点RQ26,终点RQ21,从图上看可以得到结果("RQ26" "RQ25" "RQ24" "RQ27" "RQ22" "RQ21"),但是从线段表看是得不到这个结果的。。。 llsheng_73 发表于 2018-11-1 17:06
线段表(("RQ28" "RQ27") ( "RQ27" "RQ23") ( "RQ22" "RQ21") ( "RQ24" "RQ27") ( "RQ25" "RQ24") ( "RQ26"...
是我发帖时的失误,后来发现本来以为改了,结果好像没有保存上,第二个应该是 ( "RQ27" "RQ22") vectra 发表于 2018-10-26 00:42
_$ (findpath "RQ24" "RQ28" lst)
("RQ24" "RQ27" "RQ28")
_$ (findpath "RQ22" "RQ28" lst)
万分感谢:lol
页:
[1]