cobalt 发表于 2004-11-1 21:17:00

在使用Select方法时如何设置FilterType, FilterData

根据2004 VBA的说明,Select方法的描述为:
object.Select Mode[, Point1][, Point2][, FilterType][, FilterData]
如选择所有的圆,可以使用如下代码:
                       Dim gpCode(0) As Integer
                       Dim dataValue(0) As Variant
                       gpCode(0) = 0
                       dataValue(0) = "Circle"
                       ssetObj.Select acSelectionSetAll, , , gpCode, dataValue
我的问题就是,如果要选择其它的对象,如何设置FilterType, FilterData?比如对象为Ployline时。
哪位大侠能不能给一个关于此类设置的总结啊?

2017forverd 发表于 2017-10-26 09:11:00


如果要选择“OLE”该怎么办?

yideng621 发表于 2017-11-14 22:07:00


正需要,谢谢

elepeipei 发表于 2017-10-27 13:34:00

看高手用到(66.1)只查到66是“图元跟随”标志(固定),但是这个具体的意思,请问是什么

王咣生 发表于 2004-11-1 22:24:00

参考:
'------------------------------------------------------------------
Option Explicit
'------------------------------------------------------------------
Public Sub Sample()
                       On Error GoTo ERROR_HANDLER
                       Dim ssetObj As AcadSelectionSet
                       Set ssetObj = CreateSSet("MySelection")
                       
                       Dim mode As Integer
                       mode = acSelectionSetAll
                       
                       Dim gpCode(0 To 10) As Integer
                       Dim dataValue(0 To 10) As Variant
                       
                       gpCode(0) = -4
                       dataValue(0) = ""
                       
                       gpCode(4) = -4
                       dataValue(4) = ""
                       
                       gpCode(7) = -4
                       dataValue(7) = ""
                       
                       gpCode(10) = -4
                       dataValue(10) = "Or>"
                       
                       Dim groupCode As Variant, dataCode As Variant
                       groupCode = gpCode
                       dataCode = dataValue
                       
                       ssetObj.Select mode, , , groupCode, dataCode
                       
                       MsgBox ssetObj.Count
                       
                       Exit Sub
ERROR_HANDLER:
                       Debug.Print "Error In GetIntersectionPoints: " & Err.Number & ", " & Err.Description
End Sub
'------------------------------------------------------------------
' 创建选择集
'------------------------------------------------------------------
Private Function CreateSSet(ByVal name As String) As AcadSelectionSet
                       On Error GoTo ERR_HANDLER
                       
                       Dim ssetObj As AcadSelectionSet
                       Dim SSetColl As AcadSelectionSets
                       Set SSetColl = ThisDrawing.SelectionSets
                       
                       Dim index As Integer
                       Dim found As Boolean
                       
                       found = False
                       For index = 0 To SSetColl.Count - 1
                                                       Set ssetObj = SSetColl.Item(index)
                                                       If StrComp(ssetObj.name, name, 1) = 0 Then
                                                                                       found = True
                                                                                       Exit For
                                                       End If
                       Next
                       
                       
                       If Not (found) Then
                                                       Set ssetObj = SSetColl.Add(name)
                       Else
                                                       ssetObj.Clear
                       End If
                       
                       Set CreateSSet = ssetObj
                       
                       Exit Function
ERR_HANDLER:
                       Debug.Print "Error in sub CreateSSet: " & Err.Number & " -- "; Err.Description
                       Resume ERR_END
                       
ERR_END:
End Function

雪山飞狐_lzh 发表于 2004-11-2 08:45:00

过滤器列表由成对的参数组成。第一个参数标识过滤器的类型(例如对象),第二个参数指定要过滤的值(例如圆)。过滤器类型是指定使用哪种过滤器的 DXF 组码。下面列出了一些最常用的过滤器类型。
常用过滤器的 DXF 组码
DXF 组码
过滤器类型
0 对象类型(字符串)
例如“Line”、“Circle”、“Arc”等。
2 对象名(字符串)
命名对象的表(给定)名称。
8 图层名(字符串)
例如“图层 0”。
60 对象可见性(整数)
使用 0 = 可见,1 = 不可见。
62 颜色编号(整数)
范围 0 到 256 内的数字索引值。
零表示 BYBLOCK。256 表示 BYLAYER。负值表示图层被关闭。
67 模型/图纸空间标识符(整数)
使用 0 或省略 = 模型空间,1 = 图纸空间。
过滤器参数声明为数组,过滤器类型声明为整数,过滤器值声明为变量。每个过滤器类型都必须与过滤器值成对出现。例如: FilterType(0) = 0            ' 表示过滤器是对象类型
FilterData(0) = "Circle"   ' 表示对象类型是“Circle”
以下代码指定两个条件:对象必须是圆,并且必须在图层 0 上。代码将 FilterType 和 FilterData 声明为两个元素的数组,并将每个条件指定给一个元素: Sub Ch4_FilterBlueCircleOnLayer0()
   Dim sstext As AcadSelectionSet
   Dim FilterType(1) As Integer
   Dim FilterData(1) As Variant
   Set sstext = ThisDrawing.SelectionSets.Add("SS4")
   
   FilterType(0) = 0
   FilterData(0) = "Circle"
   FilterType(1) = 8
   FilterData(1) = "0"
   
   sstext.SelectOnScreen FilterType, FilterData

End Sub
在指定多个选择条件时,AutoCAD 会假设选定的对象必须符合每一个条件。但用户可以按照其他方式来指定条件。对于数字项,用户可以指定关系运算(例如,圆的半径必须大于或等于 5.0);对于所有项,用户可以指定逻辑运算(例如 Text 或 Mtext)。
使用 -4 DXF 组码来指示过滤器规格中的关系运算符。以字符串的形式来指定运算符。下表显示了可以使用的关系运算符:
选择集过滤器列表的关系运算符
运算符
说明
"*" 任何情况(总为真)
"=" 等于
"!=" 不等于
"/=" 不等于
"" 不等于
"小于
"小于或等于
">" 大于
">=" 大于或等于
"&" 按位与 (AND,仅限于整数组)
"&=" 按位屏蔽相等(仅限于整数组)
-4 组码也可以指定过滤器列表中的逻辑运算符,逻辑运算符是字符串但必须成对出现。运算符以小于号开始 ()。下表列出了可以在选择集过滤中使用的逻辑运算符。
选择集过滤器列表的逻辑编组运算符
开始
运算符

包含的内容
结束
运算符
"一个或多个运算对象 "AND>"
"一个或多个运算对象 "OR>"
"两个运算对象 "XOR>"
"一个运算对象 "NOT>"
以下代码指定选择半径大于或等于 5.0 的圆: Sub Ch4_FilterRelational()
   Dim sstext As AcadSelectionSet
   Dim FilterType(2) As Integer
   Dim FilterData(2) As Variant
   Set sstext = ThisDrawing.SelectionSets.Add("SS5")
   
   FilterType(0) = 0
   FilterData(0) = "Circle"
   FilterType(1) = -4
   FilterData(1) = ">="
   FilterType(2) = 40
   FilterData(2) = 5#
   
   sstext.SelectOnScreen FilterType, FilterData
End Sub下例指定选择 Text 或 Mtext 对象: Sub Ch4_FilterOrTest()
   Dim sstext As AcadSelectionSet
   Dim FilterType(3) As Integer
   Dim FilterData(3) As Variant
   Set sstext = ThisDrawing.SelectionSets.Add("SS6")
   FilterType(0) = -4
   FilterData(0) = "   FilterType(1) = 0
   FilterData(1) = "TEXT"
   FilterType(2) = 0
   FilterData(2) = "MTEXT"
   FilterType(3) = -4
   FilterData(3) = "or>"
   
   sstext.SelectOnScreen FilterType, FilterData
End Sub
过滤器列表中的符号名称和字符串可以包含通配符模式。 下表显示了 AutoCAD 能够识别的通配符以及每个通配符在上下文字符串中的含义: 通配符 字符 定义 #                (磅值符号) 匹配任意一个数字 @                (at) 匹配任意一个字母 .                (句号) 匹配任意一个非字母数字的字符 *                (星号) 匹配任意的字符序列(包括空字符串),它可以用在任何搜索模式中:包括开头、中间和结尾处 ?                (问号) 匹配任意一个字符 ~                (波浪号) 如果它是模式中的的第一个字符,则匹配除此模式以外的任意内容 [...] 匹配方括号中的任意一个字符 [~...] 匹配不在方括号中的任意一个字符 -                (连字符) 用在方括号中,指定一个字符的取值范围 ,                (逗号) 分隔两个模式 `                (单引号) 避开特殊的字符(直接读取下一个字符) 使用单引号 (`) 表示下一个字符不是通配符,而是普通字符。例如,要指定在选择集中只包含名为“*U2”的匿名块,请使用以下过滤器参数: FilterType(0) = 2
FilterData(0) = "`*U2"
以下代码将选择条件定义为选择包含“The”的所有 Mtext。本例也说明了 SelectByPolygon 选择方法的用法: Sub Ch4_FilterPolygonWildcard()
   Dim sstext As AcadSelectionSet
   Dim FilterType(1) As Integer
   Dim FilterData(1) As Variant
   Dim pointsArray(0 To 11) As Double
   Dim mode As Integer
   mode = acSelectionSetWindowPolygon
   pointsArray(0) = -12#:pointsArray(1) = -7#:pointsArray(2) = 0
   pointsArray(3) = -12#:pointsArray(4) = 10#:pointsArray(5) = 0
   pointsArray(6) = 10#:pointsArray(7) = 10#:pointsArray(8) = 0
   pointsArray(9) = 10#:pointsArray(10) = -7#:pointsArray(11) = 0
   Set sstext = ThisDrawing.SelectionSets.Add("SS10")
   
   FilterType(0) = 0
   FilterData(0) = "MTEXT"
   FilterType(1) = 1
   FilterData(1) = "*The*"
   
   sstext.SelectByPolygon mode, pointsArray, FilterType, FilterData
End Sub

cobalt 发表于 2004-11-2 08:53:00

昨晚发贴,今天就看到了王晓生、Lzh741206两位版主的热情回复,心里暖烘烘的。对两位版主的热情和耐心表示感谢。

tiger8888 发表于 2004-11-2 12:36:00

真是好文章

zzzzzz 发表于 2004-11-9 21:24:00

也问,如何设置如下过滤条件:
               半径为1的园,以及红色的直线。
查看帮助及以上列表,不知如何运用。万望解答!

雪山飞狐_lzh 发表于 2004-11-9 22:06:00

Sub test()
On Error Resume Next
Dim ft, fd
Dim ss As AcadSelectionSet
ft = CreateArray(vbInteger, -4, -4, 0, 40, -4, -4, 0, 62, -4, -4)
fd = CreateArray(vbVariant, "", "", "or>")
ThisDrawing.SelectionSets("TlsSS").Delete
Set ss = ThisDrawing.SelectionSets.Add("TlsSS")
ss.SelectOnScreen ft, fd
End Sub
Function CreateArray(ByVal TypeName As VbVarType, ParamArray ValArray())
                       Dim i, mArray
                       Dim nCount As Integer
                       
                       nCount = UBound(ValArray)
                       
                       Select Case TypeName
                       Case vbDouble
                                                       Dim dArray() As Double
                                                       ReDim dArray(nCount)
                                                       mArray = dArray
                       Case vbInteger
                                                       Dim nArray() As Integer
                                                       ReDim nArray(nCount)
                                                       mArray = nArray
                       Case vbString
                                                       Dim sArray() As String
                                                       ReDim sArray(nCount)
                                                       mArray = sArray
                       Case vbVariant
                                                       Dim vArray()
                                                       ReDim vArray(nCount)
                                                       mArray = vArray
                       End Select
                       
                       For i = 0 To nCount
                                                       mArray(i) = ValArray(i)
                       Next i
                       
                       CreateArray = mArray
End Function
页: [1] 2
查看完整版本: 在使用Select方法时如何设置FilterType, FilterData