itoboy 发表于 2018-10-26 00:42:11

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

本帖最后由 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"),请大神帮忙

vectra 发表于 2018-10-26 00:42:12



(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")

lisperado 发表于 2018-10-26 16:43:08

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

itoboy 发表于 2018-10-26 17:47:39

lisperado 发表于 2018-10-26 16:43
10明经币?

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


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

llsheng_73 发表于 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"),但是从线段表看是得不到这个结果的。。。

itoboy 发表于 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")

itoboy 发表于 2018-11-7 21:53:48

vectra 发表于 2018-10-26 00:42
_$ (findpath "RQ24" "RQ28" lst)
("RQ24" "RQ27" "RQ28")
_$ (findpath "RQ22" "RQ28" lst)


万分感谢:lol
页: [1]
查看完整版本: 给定起终点,如何提取线段连线关系表