明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5789|回复: 12

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

  [复制链接]
发表于 2004-11-1 21:17:00 | 显示全部楼层 |阅读模式
根据AutoCAD2004 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时。 哪位大侠能不能给一个关于此类设置的总结啊?
发表于 2017-10-26 09:11:57 | 显示全部楼层
王咣生 发表于 2004-11-1 22:24
参考:'------------------------------------------------------------------Option Explicit

如果要选择“OLE”  该怎么办?
发表于 2017-11-14 22:07:40 来自手机 | 显示全部楼层
雪山飞狐_lzh 发表于 2004-11-2 08:45
过滤器列表由成对的参数组成。第一个参数标识过滤器的类型(例如对象),第二个参数指定要过滤的值(例如圆 ...

正需要,谢谢
发表于 2017-10-27 13:34:50 | 显示全部楼层
看高手用到(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) = "<Or"
gpCode(1) = -4
dataValue(1) = "<And"
gpCode(2) = 0
dataValue(2) = "LINE"
gpCode(3) = -4
dataValue(3) = "And>"

gpCode(4) = -4
dataValue(4) = "<And"
gpCode(5) = 0
dataValue(5) = "POLYLINE"
gpCode(6) = -4
dataValue(6) = "And>"

gpCode(7) = -4
dataValue(7) = "<And"
gpCode(8) = 0
dataValue(8) = "LWPOLYLINE"
gpCode(9) = -4
dataValue(9) = "And>"

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
发表于 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"

一个或多个运算对象

"AND>"

"<OR"

一个或多个运算对象

"OR>"

"<XOR"

两个运算对象

"XOR>"

"<NOT"

一个运算对象

"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) = "<or"
   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
 楼主| 发表于 2004-11-2 08:53:00 | 显示全部楼层
昨晚发贴,今天就看到了王晓生、Lzh741206两位版主的热情回复,心里暖烘烘的。对两位版主的热情和耐心表示感谢。
发表于 2004-11-2 12:36:00 | 显示全部楼层
真是好文章
发表于 2004-11-9 21:24:00 | 显示全部楼层
也问,如何设置如下过滤条件:


                 半径为1的园,以及红色的直线。


查看帮助及以上列表,不知如何运用。万望解答!
发表于 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", "<and", "Circle", 1, "and>", "<and", "Line", 1, "and>", "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
发表于 2014-2-25 08:27:52 | 显示全部楼层
虽然很久很久了,还是忍不住来赞一个~
发表于 2017-10-9 08:48:27 | 显示全部楼层
参数 FilterType (位于 Select 中) 无效
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 07:31 , Processed in 0.192098 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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