乐筑天下

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

选择集和筛选

[复制链接]

4

主题

17

帖子

3

银币

初来乍到

Rank: 1

铜币
33
发表于 2014-1-18 01:38:50 | 显示全部楼层 |阅读模式
亲爱的会员嗨,
我已经很久没有autocad定制了很长时间,现在我想创建一些折线坐标的数组,然后删除重复的坐标,所以我写了我的日常工作,但它在第一阶段有一些错误。

谢谢,祝您度过美好时光。
  1. Private Sub CommandButton4_Click()
  2. Me.Hide
  3. Dim myEnt As AcadEntity
  4. Dim Pot(0 To 2) As Double
  5. Dim myLay As Variant
  6. Dim myCol As Variant
  7. ThisDrawing.Utility.GetEntity myEnt, Pot, "Select yout lwpolyline"
  8.      If TypeOf myEnt Is AcadLWPolyline Then
  9.         myLay = myEnt.Layer
  10.         myCol = myEnt.color
  11.           Else
  12.             MsgBox "Not selected a polyline !?", vbCritical
  13.      End If
  14.     Dim SSet As AcadSelectionSet
  15.     Dim FilterType(0 To 2) As Integer
  16.     Dim FilterData(0 To 2) As Variant
  17.     Dim Groupcode As Variant
  18.     Dim DataValue As Variant
  19.     Dim myCoords() As Double
  20.     FilterType(0) = 0
  21.     FilterData(0) = "LWPolyline"
  22.     FilterType(1) = 8
  23.     FilterData(1) = myEnt.Layer
  24.     FilterType(2) = 62
  25.     FilterData(2) = myEnt.color
  26.     Groupcode = FilterType
  27.     DataValue = FilterData
  28.     On Error Resume Next
  29.     ActiveDocument.SelectionSets.Item("MY_SSL").Delete
  30.     Set SSet = ActiveDocument.SelectionSets.Add("MY_SSL")
  31.     On Error GoTo 0
  32.     SSet.Select acSelectionSetAll, , , Groupcode, DataValue
  33.         
  34.        Dim Ents() As Object
  35.        Dim Ent As Object
  36.        Dim i As Long
  37.         i = 0
  38.           For Each Ent In SSet
  39.              If Ent.EntityType  myEnt.EntityType Then
  40.                 ReDim Preserve Ents(0 To i)
  41.                 Set Ents(i) = Ent
  42.                 ReDim Preserve Ents(0 To i)
  43.                 myCoords(i) = Ent.Coordinates
  44.                 i = i + 1
  45.              End If
  46.           Next Ent
  47.            If i > 0 Then
  48.                 SSet.RemoveItems (Ents)
  49.            End If
  50.                 For i = 0 To UBound(myCoords) - 1
  51.                   Debug.Print myCoords(i), myCoords(i + 1)
  52.                 Next i
  53. UserForm1.Show
  54. End Sub

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

12

主题

175

帖子

77

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
149
发表于 2014-1-30 02:46:41 | 显示全部楼层
你好,Robert98
这个问题你解决了吗?
否则,请让我知道您还在纠结什么。
但是,第一眼我会注意到下面的内容:
-似乎您会抱怨用户没有选择myEnt作为LWPolyline ("MsgBox "没有选择Polyline!?",vbCritical ")但是,如果他选择myEnt作为LWPolyline,那么例程不会做任何事情,因为" if Ent。EntityType  myEnt。SSet”循环中每个Ent的entity type“control inside”将始终返回“False”(SSet。选择标准将只收集“LWPolyline”类型的元素)并且myCoords向量永远不会被填充。
所以您的例程只处理与“非轻量级折线”实体具有相同颜色和图层的轻量级折线的坐标:这是您的目标吗?
-指令“my cords(I)= Ent。坐标”不起作用,因为“坐标”属性会返回一个变量。此外,它返回不止一个值(“对象中每个顶点的坐标”),这些值不能只放入一个向量位置,例如“my cords(I)”。最后,您没有使用任何ReDim指令来使“my cords”向量能够填充新的坐标
,因此您应该首先声明一个变量来收集实体坐标,并最终通过循环将它们注入my cords向量中。所有这些总是保持对向量尺寸的跟踪(即:适当地重新定义它们)。例如:
  1. Option Explicit
  2. Private Sub CommandButton4_Click()
  3. Me.Hide
  4. Dim myEnt As AcadEntity
  5. Dim Pot(0 To 2) As Double
  6. Dim myLay As Variant
  7. Dim myCol As Variant
  8. ThisDrawing.Utility.GetEntity myEnt, Pot, "Select yout lwpolyline"
  9. If TypeOf myEnt Is AcadLWPolyline Then
  10.     myLay = myEnt.Layer
  11.     myCol = myEnt.color
  12. Else
  13.     MsgBox "Not selected a polyline !?", vbCritical
  14. End If
  15. Dim SSet As AcadSelectionSet
  16. Dim FilterType(0 To 2) As Integer
  17. Dim FilterData(0 To 2) As Variant
  18. Dim Groupcode As Variant
  19. Dim DataValue As Variant
  20. Dim myCoords() As Double
  21. FilterType(0) = 0
  22. FilterData(0) = "LWPolyline"
  23. FilterType(1) = 8
  24. FilterData(1) = myEnt.Layer
  25. FilterType(2) = 62
  26. FilterData(2) = myEnt.color
  27. Groupcode = FilterType
  28. DataValue = FilterData
  29. On Error Resume Next
  30. ActiveDocument.SelectionSets.Item("MY_SSL").Delete
  31. Set SSet = ActiveDocument.SelectionSets.Add("MY_SSL")
  32. On Error GoTo 0
  33. SSet.Select acSelectionSetAll, , , Groupcode, DataValue
  34.    
  35. Dim Ents() As Object
  36. Dim Ent As Object
  37. Dim i As Long, j As Long, UBRetCoords As Long, UBMyCoords As Long
  38. Dim retCoords As Variant
  39. i = 0
  40. For Each Ent In SSet
  41.     If Ent.EntityType  myEnt.EntityType Then
  42.         ReDim Preserve Ents(0 To i)
  43.         Set Ents(i) = Ent
  44.         ReDim Preserve Ents(0 To i)
  45.         i = i + 1
  46.         
  47.         retCoords = Ent.Coordinates
  48.         UBRetCoords = UBound(retCoords)
  49.         
  50.         'handle the first time you have to fill myCoords
  51.         On Error Resume Next
  52.         UBMyCoords = UBound(myCoords)
  53.         If Err Then UBMyCoords = -1
  54.         On Error GoTo 0
  55.         
  56.         ' fill myCoords
  57.         ReDim Preserve myCoords(0 To UBMyCoords + UBRetCoords + 1)
  58.         For j = 0 To UBRetCoords
  59.             myCoords(UBMyCoords + j + 1) = retCoords(j)
  60.         Next j
  61.         
  62.     End If
  63. Next Ent
  64. If i > 0 Then
  65.     SSet.RemoveItems (Ents)
  66. End If
  67. For i = 0 To UBound(myCoords) - 1
  68.     Debug.Print myCoords(i), myCoords(i + 1)
  69. Next i
  70. UserForm1.Show
  71. End Sub

再见
回复

使用道具 举报

4

主题

17

帖子

3

银币

初来乍到

Rank: 1

铜币
33
发表于 2014-1-30 18:17:44 | 显示全部楼层
你好,雷克巴
非常感谢你的问候,继续下去似乎是个好主意,但我现在正在进行实地工作,因此很快我就要开始编程了。
罗伯特,你说得对
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-4-20 18:24 , Processed in 0.579249 second(s), 59 queries .

© 2020-2025 乐筑天下

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