明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1525|回复: 3

使用中文建立选择集的自定义函数(免费)

[复制链接]
发表于 2015-1-4 16:08 | 显示全部楼层 |阅读模式
本帖最后由 vbcad 于 2015-1-5 14:56 编辑

调用举例:

过滤所有单行文字
set sset=AcadEasySelect (ThisDrawing, "对象 文字")

过滤所有单行文字,高度大于10
set sset=AcadEasySelect( ThisDrawing, "对象 文字;运算符 >;高度 10")

过滤所有单行文字,高度大于10,内容中包含“你好”
set sset=AcadEasySelect (ThisDrawing, "对象 文字;运算符 >;高度 10;内容 *你好*")

过滤图层“测试”中所有单行文字,高度大于10,内容中包含“你好”
set sset=AcadEasySelect (ThisDrawing, "图层 测试;对象 文字;运算符 >;高度 10;内容 *你好*")

过滤图层“测试”中所有单行文字及多行文字,高度大于10,内容中包含“你好”
call AcadEasySelect (ThisDrawing, "图层 测试;对象 文字;运算符 >;高度 10;内容 *你好*")
set sset=AcadEasySelect (ThisDrawing, "图层 测试;对象 多行文字;运算符 >;高度 10;内容 *你好*",false)
过滤园、多段线、块等只要将 “对象 文字”改为:“对象 园”、“对象 块”、“对象 多段线”

Public Function AcadEasySelect(o_AcadDoc As Object, Optional strFilter As String = "", Optional bNewMode As Boolean = True)  As Object
' 选择过滤对象,
'o_AcadDoc 为文档对象,strFilter为过滤字符串(每组用";"分开,类型和数据用空格分开),bNewMode指定是否为新选择集
    Dim SSet As Object
    Dim SelectName As String
    Dim nSelectObj As Long
    Dim FilterType() As Integer '过滤类型
    Dim FilterData() As Variant '
    Dim tmpSplit() As String
    Dim tmpSplitItem() As String
    Dim tmpString As String, strType As String, strData As String
    Dim i As Long, j As Long
    Dim Find As Long
   
    On Error Resume Next
    SelectName = "tmp"
    Set SSet = o_AcadDoc.SelectionSets(SelectName)
    If bNewMode Then SSet.Delete
    Set SSet = o_AcadDoc.SelectionSets.Add(SelectName)
   
    ReDim FilterType(0)
    ReDim FilterData(0)
   
    If Len(strFilter) = 0 Then '选择所有对象: SSet.Select 5代表所有对象 (acSelectionSetAll)
         SSet.Select 5
    Else
        '将字符转换成过滤数组
        tmpSplitItem = Split(strFilter, ";")
        For i = 0 To UBound(tmpSplitItem)
            Find = InStr(tmpSplitItem(i), " ")
            If Find > 0 Then '如果有数据
                strType = Left(tmpSplitItem(i), Find - 1) '取得对象左边字符
                strData = Right(tmpSplitItem(i), Len(tmpSplitItem(i)) - Find)  '取得对象右边字符
                Select Case strType
                    Case "图层", "图层名"
                        strType = 8
                    Case "可见"
                        strType = 60
                        Select Case strData
                            Case "是", "真"
                                strData = 0
                            Case "否", "假"
                                strData = 1
                        End Select
                    Case "逻辑", "运算符"
                        strType = -4
                    Case "图元", "对象", "对象类型"
                        strType = 0
                        Select Case strData
                            Case "文字"
                                strData = "TEXT"
                            Case "园"
                                strData = "Circle"
                            Case "直线"
                                strData = "Line"
                            Case "多段线"
                                strData = "lwpolyline"
                            Case "多行文字"
                                strData = "MTEXT"
                            Case "块"
                                strData = "Insert"
                            Case "园"
                                strData = "Circle"
                        End Select
                    Case "内容"
                        strType = 1 '选择类型为文字内容
                    Case "块名", "名字"
                        strType = 2 '选择类型为名称(属性标记、块名等)
                    Case "颜色"
                        strType = 62
                    Case "大小", "高度", "长度", "半径"
                        strType = 40
                    
                End Select
               
                ReDim Preserve FilterType(j)
                ReDim Preserve FilterData(j)
                FilterType(j) = strType '选择类型
                FilterData(j) = strData '
                j = j + 1
            End If
        Next
        SSet.Select 5, , , FilterType, FilterData
    End If
'    For i1 = 0 To UBound(FilterData)
'    Debug.Print i1, FilterType(i1), FilterData(i1)
'    Next
    Debug.Print "选择数量:"; SSet.Count '
    Set AcadEasySelect = SSet
End Function
 楼主| 发表于 2015-1-4 16:09 | 显示全部楼层
本帖最后由 vbcad 于 2015-1-5 14:57 编辑
  1. Public Function AcadEasySelect(o_AcadDoc As Object, Optional strFilter As String = "", Optional bNewMode As Boolean = True) As Object
  2. ' 选择过滤对象,
  3. 'o_AcadDoc 为文档对象,strFilter为过滤字符串(每组用";"分开,类型和数据用空格分开),bNewMode指定是否为新选择集
  4.     Dim SSet As Object
  5.     Dim SelectName As String
  6.     Dim nSelectObj As Long
  7.     Dim FilterType() As Integer '过滤类型
  8.     Dim FilterData() As Variant '
  9.     Dim tmpSplit() As String
  10.     Dim tmpSplitItem() As String
  11.     Dim tmpString As String, strType As String, strData As String
  12.     Dim i As Long, j As Long
  13.     Dim Find As Long
  14.    
  15.     On Error Resume Next
  16.     SelectName = "tmp"
  17.     Set SSet = o_AcadDoc.SelectionSets(SelectName)
  18.     If bNewMode Then SSet.Delete
  19.     Set SSet = o_AcadDoc.SelectionSets.Add(SelectName)
  20.    
  21.     ReDim FilterType(0)
  22.     ReDim FilterData(0)
  23.    
  24.     If Len(strFilter) = 0 Then '选择所有对象: SSet.Select 5代表所有对象 (acSelectionSetAll)
  25.          SSet.Select 5
  26.     Else
  27.         '将字符转换成过滤数组
  28.         tmpSplitItem = Split(strFilter, ";")
  29.         For i = 0 To UBound(tmpSplitItem)
  30.             Find = InStr(tmpSplitItem(i), " ")
  31.             If Find > 0 Then '如果有数据
  32.                 strType = Left(tmpSplitItem(i), Find - 1) '取得对象左边字符
  33.                 strData = Right(tmpSplitItem(i), Len(tmpSplitItem(i)) - Find)  '取得对象右边字符
  34.                 Select Case strType
  35.                     Case "图层", "图层名"
  36.                         strType = 8
  37.                     Case "可见"
  38.                         strType = 60
  39.                         Select Case strData
  40.                             Case "是", "真"
  41.                                 strData = 0
  42.                             Case "否", "假"
  43.                                 strData = 1
  44.                         End Select
  45.                     Case "逻辑", "运算符"
  46.                         strType = -4
  47.                     Case "图元", "对象", "对象类型"
  48.                         strType = 0
  49.                         Select Case strData
  50.                             Case "文字"
  51.                                 strData = "TEXT"
  52.                             Case "园"
  53.                                 strData = "Circle"
  54.                             Case "直线"
  55.                                 strData = "Line"
  56.                             Case "多段线"
  57.                                 strData = "lwpolyline"
  58.                             Case "多行文字"
  59.                                 strData = "MTEXT"
  60.                             Case "块"
  61.                                 strData = "Insert"
  62.                             Case "园"
  63.                                 strData = "Circle"
  64.                         End Select
  65.                     Case "内容"
  66.                         strType = 1 '选择类型为文字内容
  67.                     Case "块名", "名字"
  68.                         strType = 2 '选择类型为名称(属性标记、块名等)
  69.                     Case "颜色"
  70.                         strType = 62
  71.                     Case "大小", "高度", "长度", "半径"
  72.                         strType = 40
  73.                     
  74.                 End Select
  75.                
  76.                 ReDim Preserve FilterType(j)
  77.                 ReDim Preserve FilterData(j)
  78.                 FilterType(j) = strType '选择类型
  79.                 FilterData(j) = strData '
  80.                 j = j + 1
  81.             End If
  82.         Next
  83.         SSet.Select 5, , , FilterType, FilterData
  84.     End If
  85. '    For i1 = 0 To UBound(FilterData)
  86. '    Debug.Print i1, FilterType(i1), FilterData(i1)
  87. '    Next
  88.     Debug.Print "选择数量:"; SSet.Count '
  89.     Set AcadEasySelect = SSet
  90. End Function
发表于 2015-1-4 22:56 | 显示全部楼层
不错,支持一下,
函数AcadEasySelect显式申明一下返回类型为好

点评

意见很好  发表于 2015-1-5 14:53
发表于 2016-3-3 16:58 | 显示全部楼层
不错,有点意思.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-24 21:52 , Processed in 0.236749 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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