明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1458|回复: 4

关于选择集里循环的问题,看《cad vba&vb.net开发》不明白啊,总是失败呢?

[复制链接]
发表于 2012-7-10 10:58:28 | 显示全部楼层 |阅读模式
我用书里建的clsSelectionSet.cls类,试了试循环命令,怎么总提示
Public Sub FilterSSet()
    Dim sset As New clsSelectionSet
    Dim Element As  AcadEntity '定义选择集中的元素对象
    Dim i As Integer
    sset.Create "sset"
    sset.SelectOnScreen
    For Each Element In sset
    i = i + 1
   
    MsgBox "选择集中实体的数量为: " & i
    Next
    sset.Delete
   
End Sub
运行到“ For Each Element In sset"这行时,总提示”对象不支持该属性方法“
改成     Dim Element As  Variant       也不行。
想不明白啊!
求高手解答
 楼主| 发表于 2012-7-10 11:33:26 | 显示全部楼层
吃饭回来接着等,等级低 ,不能直接上传,把clsSelectionSet.cls类模块代码贴出来了,希望有高手能给解释。




Option Explicit

Private m_sset As AcadSelectionSet      ' 选择集对象
Private m_name As String                ' 选择集的名称
Private m_fType() As Integer            ' 过滤器规则
Private m_fData() As Variant            ' 过滤器参数
Private m_bEnableFilter As Boolean      ' 是否启动过滤器
Private m_bHasFilter As Boolean         ' 是否有过滤器可用

' 创建选择集
Public Sub Create(ByVal name As String)
    Debug.Assert (m_sset Is Nothing)
    On Error Resume Next
   
    If Not IsNull(ThisDrawing.SelectionSets.Item(name)) Then
        Set m_sset = ThisDrawing.SelectionSets.Item(name)
        m_sset.Delete
    End If
    Set m_sset = ThisDrawing.SelectionSets.Add(name)
    m_name = name
End Sub

' 删除选择集
Public Sub Delete()
    Debug.Assert (Not m_sset Is Nothing)
   
    m_sset.Delete
    Set m_sset = Nothing
End Sub

' 添加一个实体
Public Sub AddEntity(ByVal ent As AcadEntity)
    Debug.Assert (Not m_sset Is Nothing)
   
    Dim objCollection(0) As AcadEntity
    Set objCollection(0) = ent
   
    m_sset.AddItems objCollection
End Sub

' 添加多个实体
Public Function AddEntitys(ByVal ents As Variant) As Boolean
    Debug.Assert (Not m_sset Is Nothing)
   
    If VarType(ents) <> vbArray + vbObject Then
        AddEntitys = False
        Exit Function
    End If
   
    Dim objCollection() As AcadEntity
    ReDim objCollection(UBound(ents))
   
    Dim i As Integer
    For i = 0 To UBound(ents)
        Set objCollection(i) = ents(i)
    Next i
   
    m_sset.AddItems objCollection
    AddEntitys = True
End Function

' 删除一个实体
Public Sub RemoveEntity(ByVal ent As AcadEntity)
    Debug.Assert (Not m_sset Is Nothing)

    Dim objCollection(0) As AcadEntity
    Set objCollection(0) = ent
   
    m_sset.RemoveItems objCollection
End Sub

' 删除多个实体
Public Function RemoveEntitys(ByVal ents As Variant) As Boolean
    Debug.Assert (Not m_sset Is Nothing)

    If VarType(ents) <> vbArray + vbObject Then
        RemoveEntitys = False
        Exit Function
    End If
   
    Dim objCollection() As AcadEntity
    ReDim objCollection(UBound(ents))
   
    Dim i As Integer
    For i = 0 To UBound(ents)
        Set objCollection(i) = ents(i)
    Next i
   
    m_sset.RemoveItems objCollection
    RemoveEntitys = True
End Function

' 导出为对象数组
Public Function ExportToEntArray() As Variant
    Debug.Assert (Not m_sset Is Nothing)
   
    Dim objCollection() As AcadEntity
    ReDim objCollection(sset.Count - 1)
   
    Dim i As Integer
    For i = 0 To sset.Count - 1
        Set objCollection(i) = sset.Item(i)
    Next i
   
    ExportToEntArray = objCollection
End Function

' 点选对象
Public Sub SelectAtPoint(ByVal point As Variant)
    Debug.Assert (VarType(point) = vbArray + vbDouble)
    Debug.Assert (UBound(point) = 2)
    Debug.Assert (Not m_sset Is Nothing)
   
    If m_bHasFilter And m_bEnableFilter Then
        m_sset.Select acSelectionSetCrossing, point, point, m_fType, m_fData
    Else
        m_sset.Select acSelectionSetCrossing, point, point
    End If
End Sub

' 多边形选择
Public Sub SelectByPolyon(ByVal poly As AcadLWPolyline, ByVal mode As AcSelect)
    Debug.Assert (Not m_sset Is Nothing)
   
    ' 将轻量多段线的坐标输入到点数组中
    Dim pointArrs() As Double
    ReDim pointArrs((UBound(poly.Coordinates) + 1) * 3 / 2 - 1)
   
    Dim i As Integer
    For i = 0 To ((UBound(poly.Coordinates) + 1) / 2 - 1)
        pointArrs(3 * i) = poly.Coordinates(2 * i)
        pointArrs(3 * i + 1) = poly.Coordinates(2 * i + 1)
        pointArrs(3 * i + 2) = 0
    Next i
   
    If m_bHasFilter And m_bEnableFilter Then
        m_sset.SelectByPolygon mode, pointArrs, m_fType, m_fData
    Else
        m_sset.SelectByPolygon mode, pointArrs
    End If
End Sub

' 在屏幕上选择实体
Public Sub SelectOnScreen()
    Debug.Assert (Not m_sset Is Nothing)
   
    If m_bHasFilter And m_bEnableFilter Then
        m_sset.SelectOnScreen m_fType, m_fData
    Else
        m_sset.SelectOnScreen
    End If
End Sub

' 其他选择方式
Public Sub SelectEntity(ByVal mode As AcSelect, Optional point1 As Variant = Empty, Optional point2 As Variant = Empty)
    Debug.Assert (Not m_sset Is Nothing)
   
    If m_bHasFilter And m_bEnableFilter Then
        m_sset.Select mode, point1, point2, m_fType, m_fData
    Else
        m_sset.Select mode, point1, point2
    End If
End Sub

' 创建选择过滤器
Public Sub SetFilter(ParamArray filter())
    Debug.Assert (UBound(filter) Mod 2 = 1)
   
    Dim Count As Integer
    Count = (UBound(filter) + 1) / 2
    ReDim m_fType(Count - 1)
    ReDim m_fData(Count - 1)
    m_bHasFilter = True
   
    Dim i As Integer
    For i = 0 To Count - 1
        m_fType(i) = filter(2 * i)
        m_fData(i) = filter(2 * i + 1)
    Next i
End Sub

' 是否启用选择过滤器
Public Sub EnableFilter(Optional bEnable As Boolean = True)
    m_bEnableFilter = bEnable
End Sub

' 获得选择集中的实体个数
Public Function Count() As Integer
    Debug.Assert (Not m_sset Is Nothing)

    Count = m_sset.Count
End Function

' 获得选择集中的实体集合
Public Function GetAcadSelectionSet() As AcadSelectionSet
    Debug.Assert (Not m_sset Is Nothing)

    Set GetAcadSelectionSet = m_sset
End Function

Private Sub Class_Initialize()
    Set m_sset = Nothing
    m_bHasFilter = False
    m_bEnableFilter = False
End Sub

Private Sub Class_Terminate()
   If Not m_sset Is Nothing Then
        m_sset.Delete
        Set m_sset = Nothing
    End If
End Sub
发表于 2012-7-12 14:47:04 | 显示全部楼层
你在该类里加个AcSel属性对应m_sset吧
发表于 2012-7-13 15:53:31 | 显示全部楼层
For i=0 to sset.count-1
.....
next i
发表于 2012-8-24 12:41:38 | 显示全部楼层
类还没学过,支持一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 15:40 , Processed in 0.150560 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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