乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 127|回复: 9

求助高手帮忙修改下程序

[复制链接]

28

主题

46

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
158
发表于 2008-8-12 10:10:00 | 显示全部楼层 |阅读模式
我想遍历图层"ab1"中的图块及图层"abcd"的闭合多段线,如果图块的坐标在闭合多段线的区域外,则把区域外的图块删除,如在闭合的区域内,则保留。
我想把图块的坐标点画圆,面域,把闭合多段线也进行面域,并求交,如有相交,则保留,没相交则删除,
可是我这个程序有问题,下面也不知道怎么编了,请高手帮帮忙,帮我修改一下。
Sub Example_Select()       '选择某图层的图块与多段线区域比较
Dim ssetObj As AcadSelectionSet
On Error Resume Next
Set ssetObj = ThisDrawing.SelectionSets.Add("SSET")
If Err  0 Then
Set ssetObj = ThisDrawing.SelectionSets.Item("SSET")
ssetObj.Clear
End If
     
Dim mode As Integer
Dim object As AcadEntity
   
mode = acSelectionSetAll
Dim gpCode(1) As Integer
Dim dataValue(1) As Variant
gpCode(0) = 0
dataValue(0) = "insert"
gpCode(1) = 8
dataValue(1) = "ab1"
Dim groupCode As Variant, dataCode As Variant
groupCode = gpCode
dataCode = dataValue
   
ssetObj.Select mode, , , groupCode, dataCode
'提示有几个对象加入选择集
MsgBox "图中有" & ssetObj.Count & "个图元已加入到选择集SSET中。"
'遍历程序
For i = 0 To ssetObj.Count - 1
Set object = ssetObj.Item(i)
Next i
'定义变量为变体型
Dim xy As Variant
'遍历选择集的对象
For Each ent In ssetObj
'求出块对象的坐标
xy = ent.InsertionPoint
'以下为绘制圆程序
Dim cobj(0 To 0) As AcadCircle
Set cobj(0) = ThisDrawing.ModelSpace.AddCircle(xy, 50)
cobj(0).Layer = "ab1"
'对圆进行面域
Dim regionobj As Variant
regionobj = ThisDrawing.ModelSpace.AddRegion(cobj)
cobj(0).Erase
Next
'MsgBox "坐标是:" & xy(0)
'''''''''''''
'以上部分为图块坐标提取程序
'''''''''''''''''''''''
'以下部分为多段线提取并面域
Dim ssetObj1 As AcadSelectionSet
Set ssetObj1 = ThisDrawing.SelectionSets.Add("SSET1")
If Err  0 Then
Set ssetObj1 = ThisDrawing.SelectionSets.Item("SSET1")
ssetObj1.Clear
End If
     
Dim mode1 As Integer
Dim object1(0 To 0) As AcadEntity
   
mode1 = acSelectionSetAll
Dim gpCode1(1) As Integer
Dim dataValue1(1) As Variant
gpCode1(0) = 0
dataValue1(0) = "LWPOLYLINE"
gpCode1(1) = 8
dataValue1(1) = "abcd"
   
Dim groupCode1 As Variant, dataCode1 As Variant
groupCode1 = gpCode1
dataCode1 = dataValue1
   
ssetObj1.Select mode1, , , groupCode1, dataCode1
'显示有几个图元加入选择集内
MsgBox "图中有" & ssetObj1.Count & "个图元已加入到选择集SSET中。"
For i1 = 0 To ssetObj1.Count - 1
Set object1(0) = ssetObj1.Item(i1)
If Not Err Then
Dim regionobj1 As Variant
regionobj1 = ThisDrawing.ModelSpace.AddRegion(object1)
End If
Next i1
Dim roundroomobj As AcadRegion
Dim pillarobj As AcadRegion
'If regionobj(0).Area > regionobj1(0).Area Then
Set roundroomobj = regionobj1(0)
Set pillarobj = regionobj(0)
'Else
'Set pillarobj = regionobj1(0)
'Set roundroomobj = regionobj(0)
'End If
roundroomobj.Color = acRed
pillarobj.Color = acCyan
roundroomobj.Boolean acIntersection, pillarobj
End Sub

回复

使用道具 举报

29

主题

503

帖子

8

银币

中流砥柱

Rank: 25

铜币
619
发表于 2008-8-12 10:36:00 | 显示全部楼层
我的想法,通过过滤,选出abcd图层的多段线,然后创建新选集,通过选集SelectByPolygon,把选到的块添加到选集。删出选集中没有的块
回复

使用道具 举报

28

主题

46

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
158
发表于 2008-8-12 14:19:00 | 显示全部楼层
还是搞不来,请高手帮帮忙吧
回复

使用道具 举报

29

主题

503

帖子

8

银币

中流砥柱

Rank: 25

铜币
619
发表于 2008-8-12 15:46:00 | 显示全部楼层
提供图纸测试
回复

使用道具 举报

25

主题

219

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
319
发表于 2008-8-12 17:25:00 | 显示全部楼层
改变下方法吧!判断块的插入点是否在多段线内(搜搜,有代码的),否就删了,
回复

使用道具 举报

28

主题

46

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
158
发表于 2008-8-12 19:02:00 | 显示全部楼层

这个是图纸,请高手们帮忙
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:0dcvdi1cv2u.dwg 
下载次数:0  文件大小:56.13 KB  售价:2银币 [记录]
下载权限: 不限 以上或 Vip会员   [开通Vip]   [签到领银币]  [免费赚银币]

回复

使用道具 举报

28

主题

46

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
158
发表于 2008-8-13 09:55:00 | 显示全部楼层
高手们,帮帮们吧,帮我编一下吧,我实在是编不出来了
回复

使用道具 举报

29

主题

503

帖子

8

银币

中流砥柱

Rank: 25

铜币
619
发表于 2008-8-13 16:10:00 | 显示全部楼层
  1. Sub test()
  2. On Error Resume Next
  3. '多段线选集
  4. Dim plsltset As AcadSelectionSet
  5. ThisDrawing.SelectionSets.Add "plsltset"
  6. Set plsltset = ThisDrawing.SelectionSets.Item("plsltset")
  7. '初始化
  8. plsltset.Clear'过滤出abcd图层的多段线
  9. Dim ft(0 To 1) As Integer
  10. Dim fd(0 To 1) As Variant
  11. ft(0) = 0
  12. fd(0) = "LWPOLYLINE"
  13. ft(1) = 8
  14. fd(1) = "abcd"
  15. plsltset.Select acSelectionSetAll, , , ft, fd
  16. '块选集
  17. Dim blksltset As AcadSelectionSet
  18. ThisDrawing.SelectionSets.Add "blksltset"
  19. Set blksltset = ThisDrawing.SelectionSets.Item("blksltset")
  20. '初始化
  21. blksltset.Clear
  22. '多段线
  23. Dim plobj As AcadLWPolyline
  24. '块过滤
  25. ft(0) = 0
  26. fd(0) = "INSERT"
  27. ft(1) = 8
  28. fd(1) = "AB1"
  29. '遍历多段线选集选择块
  30. For Each plobj In plsltset
  31. '多段线顶点
  32. Dim plpts As Variant
  33. plpts = plobj.Coordinates
  34. '二维点转换为三维点
  35. ReDim sspts(0 To ((UBound(plpts) + 1) * 3 / 2 - 1)) As Double
  36. Dim j As Integer
  37. j = 0
  38. For i = 0 To UBound(plpts) - 1 Step 2
  39. sspts(j) = plpts(i)
  40. sspts(j + 1) = plpts(i + 1)
  41. sspts(j + 2) = 0
  42. j = j + 3
  43. Next
  44. '选择块
  45. blksltset.SelectByPolygon acSelectionSetCrossingPolygon, sspts, ft, fd
  46. Next
  47. '选择所有AB1图层上的块
  48. Dim allblksltset As AcadSelectionSet
  49. ThisDrawing.SelectionSets.Add "allblksltset"
  50. Set allblksltset = ThisDrawing.SelectionSets.Item("allblksltset")
  51. allblksltset.Select acSelectionSetAll, , , ft, fd
  52. ReDim objs(0 To blksltset.Count - 1) As Object
  53. '多边形内的所有对象
  54. For i = 0 To blksltset.Count - 1
  55. Set objs(i) = blksltset(i)
  56. Next
  57. '剔除多边形内的对象
  58. allblksltset.RemoveItems (objs)
  59. '删除其余对象
  60. allblksltset.Erase
  61. '收工
  62. End Sub
回复

使用道具 举报

25

主题

219

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
319
发表于 2008-8-13 16:43:00 | 显示全部楼层
楼上的写的非常不错
回复

使用道具 举报

28

主题

46

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
158
发表于 2008-8-13 19:30:00 | 显示全部楼层
谢谢楼上的兄弟了,我试用下
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-4 02:00 , Processed in 2.038884 second(s), 87 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表