TlsSelectionSet.cls
上传用户:yayuwl
上传日期:2022-03-18
资源大小:8952k
文件大小:13k
源码类别:

CAD

开发平台:

VBA

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "TlsSelectionSet"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = False
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = True
  14. Private m_oSel As AcadSelectionSet
  15. Private m_vFilterType, m_vFilterData
  16. Private m_sName As String
  17. Private m_oApp As AcadApplication
  18. Private m_oUtility As New TlsUtility
  19. Public Property Let Application(ByVal vNewValue As AcadApplication)
  20.     Set m_oApp = vNewValue
  21. End Property
  22. Private Property Get ThisDrawing() As AcadDocument
  23.     Set ThisDrawing = m_oApp.ActiveDocument
  24. End Property
  25. Public Sub NullFilter()
  26. '清空过滤器
  27.     m_vFilterType = Null
  28.     m_vFilterData = Null
  29. End Sub
  30. Private Function IsNull() As Boolean
  31.     If m_oSel Is Nothing Then
  32.         IsNull = True
  33.     ElseIf m_oSel.Count = 0 Then
  34.         IsNull = True
  35.     Else
  36.         IsNull = False
  37.     End If
  38.     
  39. End Function
  40. Public Sub Init(Optional ByVal Name As String = "TlsSel")
  41. '创建选择集
  42. On Error Resume Next
  43.     
  44.     NullFilter
  45.     If Not m_oSel Is Nothing Then m_oSel.Delete
  46.     m_sName = Name
  47.     ThisDrawing.SelectionSets(m_sName).Delete
  48.     Set m_oSel = ThisDrawing.SelectionSets.Add(m_sName)
  49.     
  50. End Sub
  51. Private Sub Class_Terminate()
  52. '类析构时清除选择集
  53. On Error Resume Next
  54.     
  55.     If Not m_oSel Is Nothing Then m_oSel.Delete
  56.     
  57. End Sub
  58. Public Property Get Count() As Integer
  59. '获取选择集实体个数
  60. On Error Resume Next
  61.     Count = m_oSel.Count
  62.     
  63. End Property
  64. Public Property Get Name() As String
  65. '获取选择集名称
  66. On Error Resume Next
  67.     Name = m_sName
  68.     
  69. End Property
  70. Public Property Get Item(ByVal Index) As AcadEntity
  71. Attribute Item.VB_UserMemId = 0
  72. '获取选择集实体
  73. On Error Resume Next
  74.     Set Item = m_oSel(Index)
  75.     
  76. End Property
  77. Public Sub Add(ByVal obj)
  78. '向选择集加入单个实体
  79. On Error Resume Next
  80.     
  81.     Dim objs(0) As AcadEntity
  82.     
  83.     Set objs(0) = obj
  84.     m_oSel.AddItems objs
  85.     
  86. End Sub
  87. Public Sub AddItems(ByVal objs)
  88. '向选择集加入实体数组
  89. On Error Resume Next
  90.     
  91.     m_oSel.AddItems objs
  92.     
  93. End Sub
  94. Public Sub Remove(ByVal obj)
  95. '在选择集中移除单个实体
  96. On Error Resume Next
  97.     
  98.     Dim objs(0) As AcadEntity
  99.     Set objs(0) = obj
  100.     m_oSel.RemoveItems objs
  101.     
  102. End Sub
  103. Public Sub RemoveItems(ByVal objs)
  104. '在选择集中移除实体数组
  105. On Error Resume Next
  106.     
  107.     m_oSel.RemoveItems objs
  108.     
  109. End Sub
  110. Public Sub Clear()
  111. '清空选择集
  112. On Error Resume Next
  113.     
  114.     Select Case m_sName
  115.     Case "PICKFIRST"
  116.         GetPickfirstSelectionSet
  117.     Case "CURRENT"
  118.         GetActiveSelectionSet
  119.     Case Else
  120.         Init m_sName
  121.     End Select
  122.     
  123.     m_oSel.Clear
  124.     
  125. End Sub
  126. Public Sub Update()
  127. On Error Resume Next
  128.     
  129.     m_oSel.Update
  130. End Sub
  131. Public Sub GetPickfirstSelectionSet()
  132. '获取Pickfirst选择集
  133. On Error Resume Next
  134.         
  135.     NullFilter
  136.     If Not m_oSel Is Nothing Then m_oSel.Delete
  137.     m_sName = "PICKFIRST"
  138.     ThisDrawing.SelectionSets(m_sName).Delete
  139.     Set m_oSel = ThisDrawing.PickfirstSelectionSet
  140.     
  141. End Sub
  142. Public Sub GetActiveSelectionSet()
  143. '获取Active选择集
  144. On Error Resume Next
  145.         
  146.     NullFilter
  147.     If Not m_oSel Is Nothing Then m_oSel.Delete
  148.     m_sName = "CURRENT"
  149.     ThisDrawing.SelectionSets(m_sName).Delete
  150.     Set m_oSel = ThisDrawing.ActiveSelectionSet
  151.     
  152. End Sub
  153. Public Sub SetFilterType(ParamArray FilterType())
  154. '设置过滤器类型
  155. On Error Resume Next
  156.     
  157.     Dim i
  158.     Dim nCount As Integer
  159.     nCount = UBound(FilterType)
  160.     
  161.     Dim ft() As Integer
  162.     ReDim ft(nCount)
  163.     
  164.     For i = 0 To nCount
  165.         ft(i) = FilterType(i)
  166.     Next i
  167.     
  168.     m_vFilterType = ft
  169.     
  170. End Sub
  171. Public Sub SetFilterData(ParamArray FilterData())
  172. '设置过滤器数据
  173. On Error Resume Next
  174.     Dim i
  175.     Dim nCount As Integer
  176.     nCount = UBound(FilterData)
  177.     
  178.     Dim fd()
  179.     ReDim fd(nCount)
  180.     
  181.     For i = 0 To nCount
  182.         fd(i) = FilterData(i)
  183.     Next i
  184.     
  185.     m_vFilterData = fd
  186.     
  187. End Sub
  188. Public Sub SetFilter(ParamArray Filter())
  189. '设置过滤器
  190. On Error Resume Next
  191.     
  192.     Dim i
  193.     Dim n As Integer
  194.     Dim nCount As Integer
  195.     nCount = (UBound(Filter) + 1) / 2 - 1
  196.     
  197.     Dim ft() As Integer, fd()
  198.     ReDim ft(nCount), fd(nCount)
  199.     
  200.     For i = 0 To nCount
  201.         n = i * 2
  202.         ft(i) = Filter(n)
  203.         fd(i) = Filter(n + 1)
  204.     Next i
  205.     
  206.     m_vFilterType = ft
  207.     m_vFilterData = fd
  208. End Sub
  209. Public Sub SelectObjectOnScreen()
  210. On Error Resume Next
  211.         
  212.     If IsArray(m_vFilterType) Then
  213.         m_oSel.SelectOnScreen m_vFilterType, m_vFilterData
  214.     Else
  215.         m_oSel.SelectOnScreen
  216.     End If
  217.     
  218. End Sub
  219. Public Sub SelectObject(ByVal Mode As AcSelect, Optional ByVal Point1, Optional ByVal Point2)
  220. On Error Resume Next
  221.         
  222.     If IsArray(m_vFilterType) Then
  223.         If IsMissing(Point1) Then
  224.             m_oSel.Select Mode, , , m_vFilterType, m_vFilterData
  225.         Else
  226.             m_oSel.Select Mode, Point1, Point2, m_vFilterType, m_vFilterData
  227.         End If
  228.     Else
  229.         If IsMissing(Point1) Then
  230.             m_oSel.Select Mode
  231.         Else
  232.             m_oSel.Select Mode, Point1, Point2
  233.         End If
  234.     End If
  235.     
  236. End Sub
  237. Public Sub SelectObjectAtPoint(ByVal Point)
  238. On Error Resume Next
  239.         
  240.     If IsArray(m_vFilterType) Then
  241.         m_oSel.SelectAtPoint Point, m_vFilterType, m_vFilterData
  242.     Else
  243.         m_oSel.SelectAtPoint Point
  244.     End If
  245.     
  246. End Sub
  247. Public Sub SelectObjectByPolygon(ByVal Mode As AcSelect, Optional ByVal Points, Optional ByVal Point2)
  248. On Error Resume Next
  249.         
  250.     If IsArray(m_vFilterType) Then
  251.         m_oSel.SelectByPolygon Mode, Points, m_vFilterType, m_vFilterData
  252.     Else
  253.         m_oSel.SelectByPolygon Mode, Points
  254.     End If
  255.     
  256. End Sub
  257. Public Property Let Visible(ByVal Value As Boolean)
  258. On Error Resume Next
  259.     If IsNull() Then Exit Property
  260.     
  261.     Dim i As AcadEntity
  262.     For Each i In m_oSel
  263.         i.Visible = Value
  264.     Next i
  265.     
  266. End Property
  267. Public Property Let Layer(ByVal Value As String)
  268. On Error Resume Next
  269.     If IsNull() Then Exit Property
  270.     
  271.     Dim i As AcadEntity
  272.     For Each i In m_oSel
  273.         i.Layer = Value
  274.     Next i
  275.     
  276. End Property
  277. Public Property Let LineType(ByVal Value As String)
  278. On Error Resume Next
  279.     If IsNull() Then Exit Property
  280.     
  281.     Dim i As AcadEntity
  282.     For Each i In m_oSel
  283.         i.LineType = Value
  284.     Next i
  285.     
  286. End Property
  287. Public Property Let Color(ByVal Value As ACAD_COLOR)
  288. On Error Resume Next
  289.     If IsNull() Then Exit Property
  290.     
  291.     Dim i As AcadEntity
  292.     For Each i In m_oSel
  293.         i.Color = Value
  294.     Next i
  295.     
  296. End Property
  297. Public Sub Move(Optional ByVal Point1, Optional ByVal Point2)
  298. On Error Resume Next
  299.     If IsNull() Then Exit Sub
  300.     If IsMissing(Point1) Then Point1 = m_oUtility.CreatePoint()
  301.     If IsMissing(Point2) Then Point2 = m_oUtility.CreatePoint()
  302.     
  303.     Dim i As AcadEntity
  304.     For Each i In m_oSel
  305.         i.Move Point1, Point2
  306.     Next i
  307.     
  308. End Sub
  309. Public Function Copy(Optional ByVal Point1, Optional ByVal Point2)
  310. On Error Resume Next
  311.     If IsNull() Then Exit Function
  312.     If IsMissing(Point1) Then Point1 = m_oUtility.CreatePoint()
  313.     If IsMissing(Point2) Then Point2 = m_oUtility.CreatePoint()
  314.     
  315.     Dim objs() As AcadEntity
  316.     Dim i
  317.     ReDim objs(Count - 1)
  318.     
  319.     For i = 0 To Count
  320.         Set objs(i) = m_oSel(i).Copy
  321.         objs(i).Move Point1, Point2
  322.     Next i
  323.     
  324.     Copy = objs
  325.     
  326. End Function
  327. Public Sub Rotate(Optional ByVal BasePoint, Optional ByVal RotationAngle As Double = 1#)
  328. On Error Resume Next
  329.     If IsNull() Then Exit Sub
  330.     If IsMissing(BasePoint) Then BasePoint = m_oUtility.CreatePoint()
  331.         
  332.     Dim i As AcadEntity
  333.     For Each i In m_oSel
  334.         i.Rotate BasePoint, RotationAngle
  335.     Next i
  336. End Sub
  337. Public Sub Rotate3D(Optional ByVal Point1, Optional ByVal Point2, Optional ByVal RotationAngle As Double = 1#)
  338. On Error Resume Next
  339.     If IsNull() Then Exit Sub
  340.     If IsMissing(Point1) Then Point1 = m_oUtility.CreatePoint()
  341.     If IsMissing(Point2) Then Point2 = m_oUtility.CreatePoint()
  342.     
  343.     Dim i As AcadEntity
  344.     For Each i In m_oSel
  345.         i.Rotate3D Point1, Point2, RotationAngle
  346.     Next i
  347. End Sub
  348. Public Sub ScaleAll(Optional ByVal BasePoint, Optional ByVal scalefactor As Double = 1)
  349. On Error Resume Next
  350.     If IsNull() Then Exit Sub
  351.     If IsMissing(BasePoint) Then BasePoint = m_oUtility.CreatePoint()
  352.     
  353.     Dim i As AcadEntity
  354.     For Each i In m_oSel
  355.         i.ScaleEntity BasePoint, scalefactor
  356.     Next i
  357. End Sub
  358. Public Sub Mirror(Optional ByVal Point1, Optional ByVal Point2)
  359. On Error Resume Next
  360.     If IsNull() Then Exit Sub
  361.     If IsMissing(Point1) Then Point1 = m_oUtility.CreatePoint()
  362.     If IsMissing(Point2) Then Point2 = m_oUtility.CreatePoint()
  363.     
  364.     Dim i As AcadEntity
  365.     For Each i In m_oSel
  366.         i.Mirror Point1, Point2
  367.     Next i
  368. End Sub
  369. Public Sub Mirror3D(Optional ByVal Point1, Optional ByVal Point2, Optional ByVal Point3)
  370. On Error Resume Next
  371.     If IsNull() Then Exit Sub
  372.     If IsMissing(Point1) Then Point1 = m_oUtility.CreatePoint()
  373.     If IsMissing(Point2) Then Point2 = m_oUtility.CreatePoint()
  374.     If IsMissing(Point3) Then Point3 = m_oUtility.CreatePoint()
  375.     
  376.     Dim i As AcadEntity
  377.     For Each i In m_oSel
  378.         i.Mirror3D Point1, Point2, Point3
  379.     Next i
  380. End Sub
  381. Public Function Highlight(Optional ByVal HighlightFlag As Boolean = True) As Boolean
  382. On Error Resume Next
  383.     
  384.     Dim i As AcadEntity
  385.     For Each i In m_oSel
  386.         i.Highlight HighlightFlag
  387.     Next i
  388.     If Err Then Highlight = False Else Highlight = True
  389.     
  390. End Function
  391. Public Function Delete() As Boolean
  392. On Error Resume Next
  393.     
  394.     m_oSel.Erase
  395.     If Err Then Delete = False Else Delete = True
  396. End Function
  397. Public Function CopyObjects(Optional ByVal Owner, Optional ByVal IdPairs) As Boolean
  398. On Error Resume Next
  399.     If IsNull() Then Exit Function
  400.     If IsMissing(Owner) Then
  401.         If IsMissing(IdPairs) Then
  402.             ThisDrawing.CopyObjects ToArray
  403.         Else
  404.             ThisDrawing.CopyObjects ToArray, , IdPairs
  405.         End If
  406.     Else
  407.         If IsMissing(IdPairs) Then
  408.             ThisDrawing.CopyObjects ToArray, Owner
  409.         Else
  410.             ThisDrawing.CopyObjects ToArray, Owner, IdPairs
  411.         End If
  412.     End If
  413.     
  414.     If Err Then CopyObjects = False Else CopyObjects = True
  415. End Function
  416. Public Function GetBoundingBox(ByRef MinPoint, ByRef MaxPoint) As Boolean
  417. On Error Resume Next
  418.     Dim i
  419.     Dim d1, d2, p1, p2
  420.     
  421.     If IsNull() Then Exit Function
  422.     
  423.     m_oSel(0).GetBoundingBox d1, d2
  424.     
  425.     For i = 1 To Count - 1
  426.     
  427.         m_oSel(i).GetBoundingBox p1, p2
  428.         
  429.         If p1(0) < d1(0) Then d1(0) = p1(0)
  430.         If p1(1) < d1(1) Then d1(1) = p1(1)
  431.         If p2(0) > d2(0) Then d2(0) = p2(0)
  432.         If p2(1) > d2(1) Then d2(1) = p2(1)
  433.         
  434.     Next i
  435.     
  436.     MinPoint = d1
  437.     MaxPoint = d2
  438.     If Err Then GetBoundingBox = False Else GetBoundingBox = True
  439.     
  440. End Function
  441. Public Function ToBlock(Optional ByVal InsertionPoint, Optional ByVal Name As String = "*U") As String
  442. On Error GoTo ErrHandle
  443.     If IsNull() Then Exit Function
  444.     If IsMissing(InsertionPoint) Then InsertionPoint = m_oUtility.CreatePoint()
  445.     
  446.     Dim oBlock As AcadBlock
  447.     Set oBlock = ThisDrawing.Blocks.Add(InsertionPoint, Name)
  448.     CopyObjects oBlock
  449.     
  450.     ToBlock = oBlock.Name
  451.     
  452. ErrHandle:
  453. End Function
  454. Public Function ToSelectionSet() As AcadSelectionSet
  455. '获取选择集
  456. On Error Resume Next
  457.     
  458.     Set ToSelectionSet = m_oSel
  459.     
  460. End Function
  461. Public Function ToArray()
  462. '转化选择集为对象数组输出
  463. On Error Resume Next
  464.   
  465.     Dim i
  466.     Dim objs() As AcadEntity
  467.     Dim nCount As Integer
  468.     
  469.     nCount = m_oSel.Count - 1
  470.     ReDim objs(nCount)
  471.     
  472.     For i = 0 To nCount
  473.         Set objs(i) = m_oSel(i)
  474.     Next i
  475.     
  476.     ToArray = objs
  477.     
  478. End Function
  479. Public Function GetEntity() As Object
  480. On Error Resume Next
  481.     Dim bJudge As Boolean
  482.     Dim pnt
  483.     
  484.     bJudge = False
  485.     
  486.     Do While Not bJudge
  487.         ThisDrawing.Utility.GetEntity GetEntity, pnt
  488.         m_oSel.Select acSelectionSetAll, , , m_vFilterType, m_vFilterData
  489.         For Each i In m_oSel
  490.             If i Is GetEntity Then
  491.                 bJudge = True
  492.                 Exit Do
  493.             End If
  494.         Next i
  495.     Loop
  496. End Function