在使用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时。
哪位大侠能不能给一个关于此类设置的总结啊?
如果要选择“OLE”该怎么办?
正需要,谢谢 看高手用到(66.1)只查到66是“图元跟随”标志(固定),但是这个具体的意思,请问是什么 参考:
'------------------------------------------------------------------
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
过滤器列表由成对的参数组成。第一个参数标识过滤器的类型(例如对象),第二个参数指定要过滤的值(例如圆)。过滤器类型是指定使用哪种过滤器的 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
昨晚发贴,今天就看到了王晓生、Lzh741206两位版主的热情回复,心里暖烘烘的。对两位版主的热情和耐心表示感谢。 真是好文章 也问,如何设置如下过滤条件:
半径为1的园,以及红色的直线。
查看帮助及以上列表,不知如何运用。万望解答! 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