明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2450|回复: 15

[求助]哪位高手请帮忙看看,做出这样一个程序

  [复制链接]
发表于 2007-7-19 09:14:00 | 显示全部楼层 |阅读模式

一图中有好多名为BLOCK的块,如何可以把此名的块按最短距离进行连线,并且不要有重复连接,如图中红线

 

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2007-7-19 11:19:00 | 显示全部楼层

觉得可以自己动手.

1.选择第一个块,得到选择集ss1,得到块的定义点p1

2.选择第二个块,得到选择集ss2,得到块的定义点p2

3.(command ".line" p1 p2)如此循环.

这样可以省得复杂,不要重得连接,也不用去考虑点排序问题..

发表于 2007-7-19 11:19:00 | 显示全部楼层

我还以为简单呢,呵呵,还没成功,继续努力

写了一个小时,第一部分求出了点,第二部分的算法还是不行,我再看看,有哪位达人要是写了,我就不写了,

所有点求单线最短距离,这个算法不简单呢

(defun c:j ()
  (print "请选择要连线的块")
  (setq ss (ssget '((0 . "INSERT"))))
  (setq len (sslength ss))
  (setq lst (list '()))
  (setq i 0)
  (repeat len
    (setq ent (entget (ssname ss i)))
    (entmake ent)
    (setq temp (entlast))
    (command "explode" temp)
    (setq n1 (entnext temp))
    (setq sstemp (ssadd))
    (while n1
      (setq sstemp (ssadd n1 sstemp))
      (setq n1 (entnext n1))
    )
    (setq j 0)
    (repeat (sslength sstemp)
      (if (= "CIRCLE"
      (cdr (assoc 0 (setq ent1 (entget (ssname sstemp j)))))
   )
 (setq pcen (cdr (assoc 10 ent1)))
      )
      (setq j (1+ j))
    )
    (command "erase" sstemp "")
    (setq lst (cons pcen lst))
    (setq i (1+ i))
  )
  (print lst)


(if (> (setq len(length lst)) 2)
  (progn
    (setq i 0)
    (repeat (- len 1)
      (setq disa (distance (nth i lst) (nth (1+ i) lst)))
      (setq n2 (nth i lst))
      (setq j (1+ i))
      (repeat (- len i 3)
 (setq n3 (nth (1+ j) lst))
 (setq disb (distance n3 n2))
 (setq dis (min disb disa))
 (if (= dis disb)
   (setq pta n3)
   (setq pta (nth 2 lst))
 )
 (setq disa disb)
 (setq j (1+ j))
 )
      (command "line" pta n2 "")
      (setq i (1+ i))
    )
  )
  (print "选的太少")
)
)

发表于 2007-7-19 11:42:00 | 显示全部楼层

请问,交叉可不可以?

还是不允许交叉的?

 楼主| 发表于 2007-7-19 11:49:00 | 显示全部楼层

是呀,正是因为我不知道求点与最近点如何求得

看到三楼中:(if (= "CIRCLE"。。。

我要相连的,并不一定是图中的块,也可以是其他的块,我是想用线把块的插入点相连起来

发表于 2007-7-19 11:57:00 | 显示全部楼层
著名的旅行家问题,我也曾写过一段。
发表于 2007-7-19 12:06:00 | 显示全部楼层

递归算法:

三点:循环距离判断可求

四点:任意三点链接,链接后的两个端点和第四点判断;调用三点判断,得距离a,然后再取别的三个点,调用三点判断,得距离b,

循环得c,d。然后取最小值

五点:任意四点链接,调用四点计算,循环得出

六点:……

……

 楼主| 发表于 2007-7-19 18:34:00 | 显示全部楼层

[求助]搞不定。

偶还是搞不定。
发表于 2007-7-19 21:21:00 | 显示全部楼层
我原来在“算法几何”版块中发过一个用lisp写的代码。可我现在怎么也找不到了。
发表于 2007-7-20 09:47:00 | 显示全部楼层

第一个跟第二个连接后,要将第一个在选择集中删除

要不又可能会出错的

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

本版积分规则

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

GMT+8, 2025-5-26 03:07 , Processed in 0.211121 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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