在使用Select方法时如何设置FilterType, FilterData
根据AutoCAD2004 VBA的说明,Select方法的描述为:object.Select Mode[, Point1][, Point2][, FilterType][, FilterData]
如选择所有的圆,可以使用如下代码:
Dim gpCode(0) As Integer<BR> Dim dataValue(0) As Variant<BR> gpCode(0) = 0<BR> dataValue(0) = "Circle"<BR> ssetObj.Select acSelectionSetAll, , , gpCode, dataValue
我的问题就是,如果要选择其它的对象,如何设置FilterType, FilterData?比如对象为Ployline时。
哪位大侠能不能给一个关于此类设置的总结啊?<BR> 王咣生 发表于 2004-11-1 22:24
参考:'------------------------------------------------------------------Option Explicit
如果要选择“OLE”该怎么办? 雪山飞狐_lzh 发表于 2004-11-2 08:45
过滤器列表由成对的参数组成。第一个参数标识过滤器的类型(例如对象),第二个参数指定要过滤的值(例如圆 ...
正需要,谢谢 看高手用到(66.1)只查到66是“图元跟随”标志(固定),但是这个具体的意思,请问是什么
回复
参考:<BR>'------------------------------------------------------------------<BR>Option Explicit'------------------------------------------------------------------
Public Sub Sample()<BR> On Error GoTo ERROR_HANDLER
Dim ssetObj As AcadSelectionSet<BR> Set ssetObj = CreateSSet("MySelection")<BR> <BR> Dim mode As Integer<BR> mode = acSelectionSetAll<BR> <BR> Dim gpCode(0 To 10) As Integer<BR> Dim dataValue(0 To 10) As Variant<BR> <BR> gpCode(0) = -4<BR> dataValue(0) = "<Or"<BR> gpCode(1) = -4<BR> dataValue(1) = "<And"<BR> gpCode(2) = 0<BR> dataValue(2) = "LINE"<BR> gpCode(3) = -4<BR> dataValue(3) = "And>"<BR> <BR> gpCode(4) = -4<BR> dataValue(4) = "<And"<BR> gpCode(5) = 0<BR> dataValue(5) = "POLYLINE"<BR> gpCode(6) = -4<BR> dataValue(6) = "And>"<BR> <BR> gpCode(7) = -4<BR> dataValue(7) = "<And"<BR> gpCode(8) = 0<BR> dataValue(8) = "LWPOLYLINE"<BR> gpCode(9) = -4<BR> dataValue(9) = "And>"<BR> <BR> gpCode(10) = -4<BR> dataValue(10) = "Or>"<BR> <BR> Dim groupCode As Variant, dataCode As Variant<BR> groupCode = gpCode<BR> dataCode = dataValue<BR> <BR> ssetObj.Select mode, , , groupCode, dataCode<BR> <BR> MsgBox ssetObj.Count<BR> <BR> Exit Sub<BR>ERROR_HANDLER:<BR> Debug.Print "Error In GetIntersectionPoints: " & Err.Number & ", " & Err.Description<BR>End Sub
<BR>'------------------------------------------------------------------<BR>' 创建选择集<BR>'------------------------------------------------------------------<BR>Private Function CreateSSet(ByVal name As String) As AcadSelectionSet<BR> On Error GoTo ERR_HANDLER<BR> <BR> Dim ssetObj As AcadSelectionSet<BR> Dim SSetColl As AcadSelectionSets<BR> Set SSetColl = ThisDrawing.SelectionSets<BR> <BR> Dim index As Integer<BR> Dim found As Boolean<BR> <BR> found = False
For index = 0 To SSetColl.Count - 1<BR> Set ssetObj = SSetColl.Item(index)<BR> If StrComp(ssetObj.name, name, 1) = 0 Then<BR> found = True<BR> Exit For<BR> End If<BR> Next<BR> <BR> <BR> If Not (found) Then<BR> Set ssetObj = SSetColl.Add(name)<BR> Else<BR> ssetObj.Clear<BR> End If<BR> <BR> Set CreateSSet = ssetObj<BR> <BR> Exit Function<BR>ERR_HANDLER:<BR> Debug.Print "Error in sub CreateSSet: " & Err.Number & " -- "; Err.Description<BR> Resume ERR_END<BR> <BR>ERR_END:<BR>End Function<BR> <P class=body>过滤器列表由成对的参数组成。第一个参数标识过滤器的类型(例如对象),第二个参数指定要过滤的值(例如圆)。过滤器类型是指定使用哪种过滤器的 DXF 组码。下面列出了一些最常用的过滤器类型。
<TABLE class=BasicLeft cellSpacing=0 rules=cols>
<TBODY>
<TR class=row_0>
<TH class=BasicLeft_CELL colSpan=2>
<P class=table_title>常用过滤器的 DXF 组码
</TH></TR>
<TR class=row_0>
<TH class=BasicLeft_CELL>
<P class=table_heading>DXF 组码
</TH>
<TH class=BasicLeft_CELL>
<P class=table_heading>过滤器类型
</TH></TR>
<TR class=row_2>
<TD class=BasicLeft_CELL>
<P class=table_body>0
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>对象类型(字符串)
<P class=table_body>例如“Line”、“Circle”、“Arc”等。
</TD></TR>
<TR class=row_1>
<TD class=BasicLeft_CELL>
<P class=table_body>2
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>对象名(字符串)
<P class=table_body>命名对象的表(给定)名称。
</TD></TR>
<TR class=row_2>
<TD class=BasicLeft_CELL>
<P class=table_body>8
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>图层名(字符串)
<P class=table_body>例如“图层 0”。
</TD></TR>
<TR class=row_1>
<TD class=BasicLeft_CELL>
<P class=table_body>60
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>对象可见性(整数)
<P class=table_body>使用 0 = 可见,1 = 不可见。
</TD></TR>
<TR class=row_2>
<TD class=BasicLeft_CELL>
<P class=table_body>62
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>颜色编号(整数)
<P class=table_body>范围 0 到 256 内的数字索引值。
<P class=table_body>零表示 BYBLOCK。256 表示 BYLAYER。负值表示图层被关闭。
</TD></TR>
<TR class=row_1>
<TD class=BasicLeft_CELL>
<P class=table_body>67
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>模型/图纸空间标识符(整数)
<P class=table_body>使用 0 或省略 = 模型空间,1 = 图纸空间。
</TD></TR></TBODY></TABLE>
<P class=body>
<A name="" nid="3"></A>
<P class=body>过滤器参数声明为数组,过滤器类型声明为整数,过滤器值声明为变量。每个过滤器类型都必须与过滤器值成对出现。例如:
<PRE class=prog_in_0>FilterType(0) = 0 ' 表示过滤器是对象类型
</PRE><PRE class=prog_in_end_0>FilterData(0) = "Circle" ' 表示对象类型是“Circle”
</PRE>
<P class=body>以下代码指定两个条件:对象必须是圆,并且必须在图层 0 上。代码将 FilterType 和 FilterData 声明为两个元素的数组,并将每个条件指定给一个元素:
<PRE class=prog_in_0>Sub Ch4_FilterBlueCircleOnLayer0()
</PRE><PRE class=prog_in_0> Dim sstext As AcadSelectionSet
</PRE><PRE class=prog_in_0> Dim FilterType(1) As Integer
</PRE><PRE class=prog_in_0> Dim FilterData(1) As Variant
</PRE><PRE class=prog_in_0> Set sstext = ThisDrawing.SelectionSets.Add("SS4")
</PRE><PRE class=prog_in_0>
</PRE><PRE class=prog_in_0> FilterType(0) = 0
</PRE><PRE class=prog_in_0> FilterData(0) = "Circle"
</PRE><PRE class=prog_in_0></PRE><PRE class=prog_in_0> FilterType(1) = 8
</PRE><PRE class=prog_in_0> FilterData(1) = "0"
</PRE><PRE class=prog_in_0>
</PRE><PRE class=prog_in_0> sstext.SelectOnScreen FilterType, FilterData
</PRE><PRE class=prog_in_0>
</PRE><PRE class=prog_in_end_0>End Sub
</PRE>
<P class=body>在指定多个选择条件时,AutoCAD 会假设选定的对象必须符合每一个条件。但用户可以按照其他方式来指定条件。对于数字项,用户可以指定关系运算(例如,圆的半径必须大于或等于 5.0);对于所有项,用户可以指定逻辑运算(例如 Text 或 Mtext)。
<P class=body>使用 -4 DXF 组码来指示过滤器规格中的关系运算符。以字符串的形式来指定运算符。下表显示了可以使用的关系运算符:
<TABLE class=BasicLeft cellSpacing=0 rules=cols>
<TBODY>
<TR class=row_0>
<TH class=BasicLeft_CELL colSpan=2>
<P class=table_title>选择集过滤器列表的关系运算符
</TH></TR>
<TR class=row_0>
<TH class=BasicLeft_CELL>
<P class=table_heading>运算符
</TH>
<TH class=BasicLeft_CELL>
<P class=table_heading>说明
</TH></TR>
<TR class=row_2>
<TD class=BasicLeft_CELL>
<P class=table_body>"*"
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>任何情况(总为真)
</TD></TR>
<TR class=row_1>
<TD class=BasicLeft_CELL>
<P class=table_body>"="
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>等于
</TD></TR>
<TR class=row_2>
<TD class=BasicLeft_CELL>
<P class=table_body>"!="
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>不等于
</TD></TR>
<TR class=row_1>
<TD class=BasicLeft_CELL>
<P class=table_body>"/="
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>不等于
</TD></TR>
<TR class=row_2>
<TD class=BasicLeft_CELL>
<P class=table_body>"<>"
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>不等于
</TD></TR>
<TR class=row_1>
<TD class=BasicLeft_CELL>
<P class=table_body>"<"
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>小于
</TD></TR>
<TR class=row_2>
<TD class=BasicLeft_CELL>
<P class=table_body>"<="
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>小于或等于
</TD></TR>
<TR class=row_1>
<TD class=BasicLeft_CELL>
<P class=table_body>">"
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>大于
</TD></TR>
<TR class=row_2>
<TD class=BasicLeft_CELL>
<P class=table_body>">="
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>大于或等于
</TD></TR>
<TR class=row_1>
<TD class=BasicLeft_CELL>
<P class=table_body>"&"
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>按位与 (AND,仅限于整数组)
</TD></TR>
<TR class=row_2>
<TD class=BasicLeft_CELL>
<P class=table_body>"&="
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>按位屏蔽相等(仅限于整数组)
</TD></TR></TBODY></TABLE>
<P class=body>-4 组码也可以指定过滤器列表中的逻辑运算符,逻辑运算符是字符串但必须成对出现。运算符以小于号开始 (<),以大于号结束 (>)。下表列出了可以在选择集过滤中使用的逻辑运算符。
<TABLE class=BasicLeft cellSpacing=0 rules=cols>
<TBODY>
<TR class=row_0>
<TH class=BasicLeft_CELL colSpan=3>
<P class=table_title>选择集过滤器列表的逻辑编组运算符
</TH></TR>
<TR class=row_0>
<TH class=BasicLeft_CELL>
<P class=table_heading>开始<BR>运算符
</TH>
<TH class=BasicLeft_CELL>
<P class=table_heading><BR>包含的内容
</TH>
<TH class=BasicLeft_CELL>
<P class=table_heading>结束<BR>运算符
</TH></TR>
<TR class=row_2>
<TD class=BasicLeft_CELL>
<P class=table_body>"<AND"
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>一个或多个运算对象
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>"AND>"
</TD></TR>
<TR class=row_1>
<TD class=BasicLeft_CELL>
<P class=table_body>"<OR"
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>一个或多个运算对象
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>"OR>"
</TD></TR>
<TR class=row_2>
<TD class=BasicLeft_CELL>
<P class=table_body>"<XOR"
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>两个运算对象
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>"XOR>"
</TD></TR>
<TR class=row_1>
<TD class=BasicLeft_CELL>
<P class=table_body>"<NOT"
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>一个运算对象
</TD>
<TD class=BasicLeft_CELL>
<P class=table_body>"NOT>"
</TD></TR></TBODY></TABLE>
<P class=body>以下代码指定选择半径大于或等于 5.0 的圆:
<PRE class=prog_in_0>Sub Ch4_FilterRelational()
</PRE><PRE class=prog_in_0> Dim sstext As AcadSelectionSet
</PRE><PRE class=prog_in_0> Dim FilterType(2) As Integer
</PRE><PRE class=prog_in_0> Dim FilterData(2) As Variant
</PRE><PRE class=prog_in_0> Set sstext = ThisDrawing.SelectionSets.Add("SS5")
</PRE><PRE class=prog_in_0>
</PRE><PRE class=prog_in_0> FilterType(0) = 0
</PRE><PRE class=prog_in_0> FilterData(0) = "Circle"
</PRE><PRE class=prog_in_0> FilterType(1) = -4
</PRE><PRE class=prog_in_0> FilterData(1) = ">="
</PRE><PRE class=prog_in_0> FilterType(2) = 40
</PRE><PRE class=prog_in_0> FilterData(2) = 5#
</PRE><PRE class=prog_in_0>
</PRE><PRE class=prog_in_0> sstext.SelectOnScreen FilterType, FilterData
</PRE><PRE class=prog_in_end_0>End Sub</PRE><PRE class=prog_in_end_0><P class=body>下例指定选择 Text 或 Mtext 对象:
<PRE class=prog_in_0>Sub Ch4_FilterOrTest()
</PRE><PRE class=prog_in_0> Dim sstext As AcadSelectionSet
</PRE><PRE class=prog_in_0> Dim FilterType(3) As Integer
</PRE><PRE class=prog_in_0> Dim FilterData(3) As Variant
</PRE><PRE class=prog_in_0> Set sstext = ThisDrawing.SelectionSets.Add("SS6")
</PRE><PRE class=prog_in_0> FilterType(0) = -4
</PRE><PRE class=prog_in_0> FilterData(0) = "<or"
</PRE><PRE class=prog_in_0> FilterType(1) = 0
</PRE><PRE class=prog_in_0> FilterData(1) = "TEXT"
</PRE><PRE class=prog_in_0> FilterType(2) = 0
</PRE><PRE class=prog_in_0> FilterData(2) = "MTEXT"
</PRE><PRE class=prog_in_0> FilterType(3) = -4
</PRE><PRE class=prog_in_0> FilterData(3) = "or>"
</PRE><PRE class=prog_in_0>
</PRE><PRE class=prog_in_0> sstext.SelectOnScreen FilterType, FilterData
</PRE><PRE class=prog_in_end_0>End Sub
<P class=body>过滤器列表中的符号名称和字符串可以包含通配符模式。
<P class=body>下表显示了 AutoCAD 能够识别的通配符以及每个通配符在上下文字符串中的含义: <TABLE class=BasicLeft cellSpacing=0 rules=cols><TBODY><TR class=row_0><TH class=BasicLeft_CELL colSpan=2><P class=table_title>通配符
</TH></TR><TR class=row_0><TH class=BasicLeft_CELL><P class=table_heading>字符
</TH><TH class=BasicLeft_CELL><P class=table_heading>定义
</TH></TR><TR class=row_2><TD class=BasicLeft_CELL><P class=table_body>#<!--emsp--> (磅值符号)
</TD><TD class=BasicLeft_CELL><P class=table_body>匹配任意一个数字
</TD></TR><TR class=row_1><TD class=BasicLeft_CELL><P class=table_body>@<!--emsp--> (at)
</TD><TD class=BasicLeft_CELL><P class=table_body>匹配任意一个字母
</TD></TR><TR class=row_2><TD class=BasicLeft_CELL><P class=table_body>.<!--emsp--> (句号)
</TD><TD class=BasicLeft_CELL><P class=table_body>匹配任意一个非字母数字的字符
</TD></TR><TR class=row_1><TD class=BasicLeft_CELL><P class=table_body>*<!--emsp--> (星号)
</TD><TD class=BasicLeft_CELL><P class=table_body>匹配任意的字符序列(包括空字符串),它可以用在任何搜索模式中:包括开头、中间和结尾处
</TD></TR><TR class=row_2><TD class=BasicLeft_CELL><P class=table_body>?<!--emsp--> (问号)
</TD><TD class=BasicLeft_CELL><P class=table_body>匹配任意一个字符
</TD></TR><TR class=row_1><TD class=BasicLeft_CELL><P class=table_body>~<!--emsp--> (波浪号)
</TD><TD class=BasicLeft_CELL><P class=table_body>如果它是模式中的的第一个字符,则匹配除此模式以外的任意内容
</TD></TR><TR class=row_2><TD class=BasicLeft_CELL><P class=table_body>[...]
</TD><TD class=BasicLeft_CELL><P class=table_body>匹配方括号中的任意一个字符
</TD></TR><TR class=row_1><TD class=BasicLeft_CELL><P class=table_body>[~...]
</TD><TD class=BasicLeft_CELL><P class=table_body>匹配不在方括号中的任意一个字符
</TD></TR><TR class=row_2><TD class=BasicLeft_CELL><P class=table_body>-<!--emsp--> (连字符)
</TD><TD class=BasicLeft_CELL><P class=table_body>用在方括号中,指定一个字符的取值范围
</TD></TR><TR class=row_1><TD class=BasicLeft_CELL><P class=table_body>,<!--emsp--> (逗号)
</TD><TD class=BasicLeft_CELL><P class=table_body>分隔两个模式
</TD></TR><TR class=row_2><TD class=BasicLeft_CELL><P class=table_body>`<!--emsp--> (单引号)
</TD><TD class=BasicLeft_CELL><P class=table_body>避开特殊的字符(直接读取下一个字符)
</TD></TR></TBODY></TABLE>
<P class=body>使用单引号 (`) 表示下一个字符不是通配符,而是普通字符。例如,要指定在选择集中只包含名为“*U2”的匿名块,请使用以下过滤器参数:
<PRE class=prog_in_0>FilterType(0) = 2
</PRE><PRE class=prog_in_end_0>FilterData(0) = "`*U2"
<P class=body>以下代码将选择条件定义为选择包含“The”的所有 Mtext。本例也说明了 <OBJECT id=alink_SelectByPolygon_AXM_454020 type=application/x-oleobject classid=clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11><PARAM NAME="Width" VALUE="106"><PARAM NAME="Height" VALUE="53"><PARAM NAME="Command" VALUE="ALink"><PARAM NAME="Item1" VALUE=""><PARAM NAME="Item2" VALUE="S"></OBJECT>SelectByPolygon 选择方法的用法:
<PRE class=prog_in_0>Sub Ch4_FilterPolygonWildcard()
</PRE><PRE class=prog_in_0> Dim sstext As AcadSelectionSet
</PRE><PRE class=prog_in_0> Dim FilterType(1) As Integer
</PRE><PRE class=prog_in_0> Dim FilterData(1) As Variant
</PRE><PRE class=prog_in_0> Dim pointsArray(0 To 11) As Double
</PRE><PRE class=prog_in_0> Dim mode As Integer
</PRE><PRE class=prog_in_0> mode = acSelectionSetWindowPolygon
</PRE><PRE class=prog_in_0> pointsArray(0) = -12#:pointsArray(1) = -7#:pointsArray(2) = 0
</PRE><PRE class=prog_in_0> pointsArray(3) = -12#:pointsArray(4) = 10#:pointsArray(5) = 0
</PRE><PRE class=prog_in_0> pointsArray(6) = 10#:pointsArray(7) = 10#:pointsArray(8) = 0
</PRE><PRE class=prog_in_0> pointsArray(9) = 10#:pointsArray(10) = -7#:pointsArray(11) = 0
</PRE><PRE class=prog_in_0> Set sstext = ThisDrawing.SelectionSets.Add("SS10")
</PRE><PRE class=prog_in_0>
</PRE><PRE class=prog_in_0> FilterType(0) = 0
</PRE><PRE class=prog_in_0> FilterData(0) = "MTEXT"
</PRE><PRE class=prog_in_0> FilterType(1) = 1
</PRE><PRE class=prog_in_0> FilterData(1) = "*The*"
</PRE><PRE class=prog_in_0>
</PRE><PRE class=prog_in_0> sstext.SelectByPolygon mode, pointsArray, FilterType, FilterData
</PRE><PRE class=prog_in_end_0>End Sub
</PRE></PRE></PRE></PRE> 昨晚发贴,今天就看到了王晓生、Lzh741206两位版主的热情回复,心里暖烘烘的。对两位版主的热情和耐心表示感谢。 真是好文章 也问,如何设置如下过滤条件:
半径为1的园,以及红色的直线。
查看帮助及以上列表,不知如何运用。万望解答! Sub test()<BR>On Error Resume Next<BR>Dim ft, fd<BR>Dim ss As AcadSelectionSet<BR>ft = CreateArray(vbInteger, -4, -4, 0, 40, -4, -4, 0, 62, -4, -4)<BR>fd = CreateArray(vbVariant, "<or", "<and", "Circle", 1, "and>", "<and", "Line", 1, "and>", "or>")<BR>ThisDrawing.SelectionSets("TlsSS").Delete<BR>Set ss = ThisDrawing.SelectionSets.Add("TlsSS")<BR>ss.SelectOnScreen ft, fd<BR>End Sub
Function CreateArray(ByVal TypeName As VbVarType, ParamArray ValArray())<BR> Dim i, mArray<BR> Dim nCount As Integer<BR> <BR> nCount = UBound(ValArray)<BR> <BR> Select Case TypeName<BR> Case vbDouble<BR> Dim dArray() As Double<BR> ReDim dArray(nCount)<BR> mArray = dArray<BR> Case vbInteger<BR> Dim nArray() As Integer<BR> ReDim nArray(nCount)<BR> mArray = nArray<BR> Case vbString<BR> Dim sArray() As String<BR> ReDim sArray(nCount)<BR> mArray = sArray<BR> Case vbVariant<BR> Dim vArray()<BR> ReDim vArray(nCount)<BR> mArray = vArray<BR> End Select<BR> <BR> For i = 0 To nCount<BR> mArray(i) = ValArray(i)<BR> Next i<BR> <BR> CreateArray = mArray<BR>End Function<BR> 虽然很久很久了,还是忍不住来赞一个~ 参数 FilterType (位于 Select 中) 无效
页:
[1]
2