明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1998|回复: 7

示例:连接直线为优化多义线

[复制链接]
发表于 2006-7-2 12:39:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2006-7-3 7:28:41 编辑
  1. Sub jline()
  2.     Dim obj As AcadLine, pnt
  3.     Dim objs As New Collection
  4.     Dim selobj As AcadLine
  5.     Dim pnts As New Collection
  6.     Dim i, j
  7.     ThisDrawing.Utility.GetEntity obj, pnt
  8.     Dim ss As New TlsSelectionSet
  9.     pnts.Add obj.StartPoint
  10.     pnts.Add obj.EndPoint
  11.     objs.Add obj
  12.    
  13.     '从选择线起点找起,一直到没有连接的直线或一个以上的直线为止
  14.     Do While True
  15.         ss.Init
  16.         ss.Filter.SetData 0, "line", -4, "<or", 10, pnts(1), 11, pnts(1), -4, "or>"
  17.         ss.SelectObject acSelectionSetAll
  18.         If ss.Count = 2 Then
  19.             If ss.Item(0) Is obj Then
  20.                 Set obj = ss.Item(1)
  21.             Else
  22.                 Set obj = ss.Item(0)
  23.             End If
  24.             If isChild(objs, obj) Then Exit Do
  25.             
  26.             If obj.StartPoint(0) = pnts(1)(0) And obj.StartPoint(1) = pnts(1)(1) Then
  27.                 pnts.Add obj.EndPoint, , 1
  28.             Else
  29.                 pnts.Add obj.StartPoint, , 1
  30.             End If
  31.             objs.Add obj, , 1
  32.         Else
  33.             Exit Do
  34.         End If
  35.     Loop
  36.    
  37.     '从选择线终点找起,一直到没有连接的直线或一个以上的直线为止
  38.     Set obj = selobj
  39.     Do While True
  40.         ss.Init
  41.         ss.Filter.SetData 0, "line", -4, "<or", 10, pnts(pnts.Count), 11, pnts(pnts.Count), -4, "or>"
  42.         ss.SelectObject acSelectionSetAll
  43.         If ss.Count = 2 Then
  44.             If ss.Item(0) Is obj Then
  45.                 Set obj = ss.Item(1)
  46.             Else
  47.                 Set obj = ss.Item(0)
  48.             End If
  49.             If isChild(objs, obj) Then Exit Do
  50.             
  51.             If obj.StartPoint(0) = pnts(pnts.Count)(0) And obj.StartPoint(1) = pnts(pnts.Count)(1) Then
  52.                 pnts.Add obj.EndPoint
  53.             Else
  54.                 pnts.Add obj.StartPoint
  55.             End If
  56.             objs.Add obj
  57.         Else
  58.             Exit Do
  59.         End If
  60.     Loop
  61.     Dim dots() As Double
  62.     ReDim dots(pnts.Count * 2 - 1)
  63.     For i = 1 To pnts.Count
  64.         For j = 0 To 1
  65.             dots((i - 1) * 2 + j) = pnts(i)(j)
  66.         Next
  67.     Next
  68.     ThisDrawing.ModelSpace.AddLightWeightPolyline dots
  69.     For Each i In objs
  70.         i.Delete
  71.     Next i
  72. End Sub
  73. Function isChild(objs As Variant, obj As Object)
  74. Dim i
  75. For Each i In objs
  76.     If i Is obj Then isChild = True: Exit For
  77. Next
  78. End Function
发表于 2006-7-2 14:41:00 | 显示全部楼层
Dim ss As New TlsSelectionSet, 2004CAD这一句通不过.
 楼主| 发表于 2006-7-2 14:50:00 | 显示全部楼层

需要TlsResultBuffer和TlsSelectSet类,在我的博客里下载:)

发表于 2006-7-3 10:08:00 | 显示全部楼层
楼主,好样的。我正需要这个。我以前用LISP编了个将选定的直线和圆弧连成多义线的程序。楼主用VBA实现真是太好了。呵……我现在改用VB.net了。
发表于 2006-7-3 12:14:00 | 显示全部楼层
楼主,能否改为批量选择,自动连接?如果图面有大量直线,这么逐个选取不是太麻烦了.
发表于 2006-7-3 15:37:00 | 显示全部楼层

要支持“line和pline”就好了

现在只能选择线段

未免有点可惜

发表于 2006-7-5 12:38:00 | 显示全部楼层
我没弄懂  下下来的类怎么用啊 我是刚学的请高人指教啊 先谢谢了
发表于 2006-7-8 22:04:00 | 显示全部楼层
你可以这么实现,只选择一个直线,然后程序自动先择与此线某一端点相交的线段,连成多义线。后面的照此垫行。一定行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-27 00:19 , Processed in 0.182389 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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