赞
踩
使用选择集
选择集可以由单个对象组成,也可以是一个更复杂的编组:例如特定图层的对象集。 在命令启动前通过pick first选择或者执行命令后提示选择对象要注用户在图形区域中选择对象后创建的选择集是最具代表性的。
选择集不是持久的,如果需要保留选择集,用于在多个命令之间或将来使用,就必须创建一个自定义的字典并记录对象 ID,并将选择集当作一个记录创建。
获得PickFirst选择集
在图形区域中选择对象
添加或合并多个选择集
定义选择集过滤规则
从选择集中移除对象
获得PickFirst选择集
PickFirst 选择集是在先选择对象后启动命令的时候创建的。为了获得 PickFirst 选择集的对象,必须满足某些条件,这些条件是:
SetImpliedSelection 方法用于清除当前的 PickFirst 选择集。
本例显示 PickFirst 选择集中的对象的数量然后要求用户选择另外的对象。在请求用户选择对象前,使用 SetImpliedSelection 方法将当前 PickFirst 选择集清空了。
- Imports Autodesk.AutoCAD.Runtime
- Imports Autodesk.AutoCAD.ApplicationServices
- Imports Autodesk.AutoCAD.DatabaseServices
- Imports Autodesk.AutoCAD.EditorInput
-
- <CommandMethod("CheckForPickfirstSelection", CommandFlags.UsePickSet)> _
- Public Sub CheckForPickfirstSelection()
- '' 获得当前文档 Get the current document
- Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
-
- '' 获得 PickFirst 选择集 Get the PickFirst selection set
- Dim acSSPrompt As PromptSelectionResult
- acSSPrompt = acDocEd.SelectImplied()
-
- Dim acSSet As SelectionSet
-
- '' 如果提示状态是 OK,那么对象在命令启动前已经被选择了 If the prompt status is OK, objects were selected before
- '' the command was started
- If acSSPrompt.Status = PromptStatus.OK Then
- acSSet = acSSPrompt.Value
-
- Application.ShowAlertDialog("Number of objects in Pickfirst selection: " & _
- acSSet.Count.ToString())
- Else
- Application.ShowAlertDialog("Number of objects in Pickfirst selection: 0")
- End If
-
- '' 清除 PickFirst 选择集 Clear the PickFirst selection set
- Dim idarrayEmpty() As ObjectId
- acDocEd.SetImpliedSelection(idarrayEmpty)
-
- '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
- acSSPrompt = acDocEd.GetSelection()
-
- '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
- If acSSPrompt.Status = PromptStatus.OK Then
- acSSet = acSSPrompt.Value
-
- Application.ShowAlertDialog("Number of objects selected: " & _
- acSSet.Count.ToString())
- Else
- Application.ShowAlertDialog("Number of objects selected: 0")
- End If
- End Sub
在图形区域中选择对象
本例提示用户选择对象,然后修改每个选中对象的颜色为绿色或 AutoCAD 颜色索引为 3。
- Imports Autodesk.AutoCAD.Runtime
- Imports Autodesk.AutoCAD.ApplicationServices
- Imports Autodesk.AutoCAD.DatabaseServices
- Imports Autodesk.AutoCAD.EditorInput
-
- <CommandMethod("SelectObjectsOnscreen")> _
- Public Sub SelectObjectsOnscreen()
- '' 获得当前文档和数据库 Get the current document and database
- Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
- Dim acCurDb As Database = acDoc.Database
-
- ''启动一个事务 Start a transaction
- Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
-
- '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
- Dim acSSPrompt As PromptSelectionResult = acDoc.Editor.GetSelection()
-
- '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
- If acSSPrompt.Status = PromptStatus.OK Then
- Dim acSSet As SelectionSet = acSSPrompt.Value
-
- '' 遍历选择集中的对象 Step through the objects in the selection set
- For Each acSSObj As SelectedObject In acSSet
- '' 检查以确定返回的 SelectedObject 对象是有效的 Check to make sure a valid SelectedObject object was returned
- If Not IsDBNull(acSSObj) Then
- '' 以写的方式打开选择的对象 Open the selected object for write
- Dim acEnt As Entity = acTrans.GetObject(acSSObj.ObjectId, _
- OpenMode.ForWrite)
-
- If Not IsDBNull(acEnt) Then
- '' 修改对象的颜色为绿色 Change the object's color to Green
- acEnt.ColorIndex = 3
- End If
- End If
- Next
-
- '' 保存新对象到数据库中 Save the new object to the database
- acTrans.Commit()
- End If
-
- '' 销毁事务 Dispose of the transaction
- End Using
- End Sub
添加或合并多个选择集
用户可以合并多个选择集,需要创建一个 ObjectIdCollection 对象,然后向其中添加多个选择集的对象的 ObjectID。除了添加 ObjectID 到 ObjectIdCollection 对象中,也可以移除 ObjectID。一旦所有 ObjectID 添加到 ObjectIdCollection 对象后,就可以遍历 ObjectID 集合并操作每一个需要的对象。
本例提示用户选择对象两次然后合并两个选择集到一个独立的选择集中。
- Imports Autodesk.AutoCAD.Runtime
- Imports Autodesk.AutoCAD.ApplicationServices
- Imports Autodesk.AutoCAD.DatabaseServices
- Imports Autodesk.AutoCAD.EditorInput
-
- <CommandMethod("MergeSelectionSets")> _
- Public Sub MergeSelectionSets()
- '' 获得当前文档的编辑器 Get the current document editor
- Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
-
- '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
- Dim acSSPrompt As PromptSelectionResult
- acSSPrompt = acDocEd.GetSelection()
-
- Dim acSSet1 As SelectionSet
- Dim acObjIdColl As ObjectIdCollection = New ObjectIdCollection()
-
- '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
- If acSSPrompt.Status = PromptStatus.OK Then
- '' Get the selected objects
- acSSet1 = acSSPrompt.Value
-
- '' 添加选择的对象到 ObjectIDCollection 中 Append the selected objects to the ObjectIdCollection
- acObjIdColl = New ObjectIdCollection(acSSet1.GetObjectIds())
- End If
-
- '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
- acSSPrompt = acDocEd.GetSelection()
-
- Dim acSSet2 As SelectionSet
-
- '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
- If acSSPrompt.Status = PromptStatus.OK Then
- acSSet2 = acSSPrompt.Value
-
- '' 检查 ObjectIDCollection 的大小,如果为 0 就重新初始化它 Check the size of the ObjectIdCollection, if zero, then initialize it
- If acObjIdColl.Count = 0 Then
- acObjIdColl = New ObjectIdCollection(acSSet2.GetObjectIds())
- Else
- Dim acObjId As ObjectId
-
- '' 遍历第二个选择集 Step through the second selection set
- For Each acObjId In acSSet2.GetObjectIds()
- '' 添加每个对象 ID 到 ObjectIDCollection 中 Add each object id to the ObjectIdCollection
- acObjIdColl.Add(acObjId)
- Next
- End If
- End If
-
- Application.ShowAlertDialog("Number of objects selected: " & _
- acObjIdColl.Count.ToString())
- End Sub
定义选择集过滤规则
用户可以使用选择过滤器来限制选择和添加到选择集中的对象。选择集过滤器列表可以通过特性或类型用于过滤选择的对象。例如,可能只想选择仅为蓝色的对象,或只在某个图层上的对象。还可以在过滤器列表中组合选择条件,例如,可以创建一个选择过滤器来限制选择的蓝色的圆且位置指定图层上的图案。选择过滤器可以作为参数指定给在“在图形区域中选择对象”部分中不同的选择方法。
注意过滤功能只能识别明确指定给对象的值,而不能识别从图层继承的。例如,如果对象的 linetype 属性设置成 ByLayer 并且图层指定设置为隐藏线型;过滤对象指定为隐藏线型将不能选择那些 LineType 属性设置为 ByLayer 的对象。
使用选择集过滤器定义选择集规则
在选择集过滤器中指定多个条件
添加复杂的过滤器列表条件
在选择器过滤器条件中使用通配符
过滤扩展数据
使用选择集过滤器定义选择集规则
选择过滤器列表由成对的以 TypedValues 形式的参数组成。TypedValue 的 第一个参数标识过滤器的类型(例如对象),第二个参数指定要过滤的值(例如圆)。过滤器类型是指定使用哪种过滤器的 DXF 组码。下面列出了一些最常用的过滤器类型。
常用过滤器的 DXF 组码
Public Enum DxfCode
Invalid = -9999
XDictionary = -6
PReactors = -5
[Operator] = -4
XDataStart = -3
FirstEntityId = -2
HeaderId = -2
[End] = -1
Start = 0
XRefPath = 1
Text = 1
SymbolTableRecordName = 2
MlineStyleName = 2
SymbolTableName = 2
AttributeTag = 2
BlockName = 2
ShapeName = 2
DimPostString = 3
Description = 3
TextFontFile = 3
LinetypeProse = 3
DimStyleName = 3
AttributePrompt = 3
SymbolTableRecordComments = 4
CLShapeName = 4
DimensionAlternativePrefixSuffix = 4
TextBigFontFile = 4
DimensionBlock = 5
Handle = 5
LinetypeName = 6
DimBlk1 = 6
TextStyleName = 7
DimBlk2 = 7
LayerName = 8
CLShapeText = 9
XCoordinate = 10
YCoordinate = 20
ZCoordinate = 30
Elevation = 38
Thickness = 39
TxtSize = 40
ViewportHeight = 40
Real = 40
ViewportAspect = 41
ViewWidth = 41
TxtStyleXScale = 41
ViewLensLength = 42
TxtStylePSize = 42
ViewFrontClip = 43
ShapeXOffset = 44
ViewBackClip = 44
ViewHeight = 45
ShapeYOffset = 45
ShapeScale = 46
PixelScale = 47
LinetypeScale = 48
LinetypeElement = 49
MlineOffset = 49
DashLength = 49
ViewportSnapAngle = 50
Angle = 50
ViewportTwist = 51
Visibility = 60
LayerLinetype = 61
Color = 62
HasSubentities = 66
ViewportVisibility = 67
ViewportActive = 68
ViewportNumber = 69
Int16 = 70
TxtStyleFlags = 71
RegAppFlags = 71
ViewMode = 71
LinetypeAlign = 72
CircleSides = 72
LinetypePdc = 73
ViewportZoom = 73
ViewportIcon = 74
ViewportSnap = 75
ViewportGrid = 76
ViewportSnapStyle = 77
ViewportSnapPair = 78
Int32 = 90
Subclass = 100
EmbeddedObjectStart = 101
ControlString = 102
DimVarHandle = 105
UcsOrg = 110
UcsOrientationX = 111
UcsOrientationY = 112
XReal = 140
ViewBrightness = 141
ViewContrast = 142
Int64 = 160
XInt16 = 170
NormalX = 210
NormalY = 220
NormalZ = 230
XXInt16 = 270
Int8 = 280
RenderMode = 281
Bool = 290
XTextString = 300
BinaryChunk = 310
ArbitraryHandle = 320
SoftPointerId = 330
HardPointerId = 340
SoftOwnershipId = 350
HardOwnershipId = 360
LineWeight = 370
PlotStyleNameType = 380
PlotStyleNameId = 390
ExtendedInt16 = 400
LayoutName = 410
ColorRgb = 420
ColorName = 430
Alpha = 440
GradientObjType = 450
GradientPatType = 451
GradientTintType = 452
GradientColCount = 453
GradientAngle = 460
GradientShift = 461
GradientTintVal = 462
GradientColVal = 463
GradientName = 470
Comment = 999
ExtendedDataAsciiString = 1000
ExtendedDataRegAppName = 1001
ExtendedDataControlString = 1002
ExtendedDataLayerName = 1003
ExtendedDataBinaryChunk = 1004
ExtendedDataHandle = 1005
ExtendedDataXCoordinate = 1010
ExtendedDataWorldXCoordinate = 1011
ExtendedDataWorldXDisp = 1012
ExtendedDataWorldXDir = 1013
ExtendedDataYCoordinate = 1020
ExtendedDataWorldYCoordinate = 1021
ExtendedDataWorldYDisp = 1022
ExtendedDataWorldYDir = 1023
ExtendedDataZCoordinate = 1030
ExtendedDataWorldZCoordinate = 1031
ExtendedDataWorldZDisp = 1032
ExtendedDataWorldZDir = 1033
ExtendedDataReal = 1040
ExtendedDataDist = 1041
ExtendedDataScale = 1042
ExtendedDataInteger16 = 1070
ExtendedDataInteger32 = 1071
End Enum
组码 | 说明 |
-5 | APP:persistent reactor 链表 |
-4 | APP:条件运算符(仅用于 ssget) |
-3 | APP:扩展数据 (XDATA) 标记(固定) |
-2 | APP:图元名引用 (固定) |
-1 | APP:图元名。每次打开图形时它都改变,且不被保存。(固定) |
0 | 表示图元类型的文字字符串(固定) |
1 | 图元的主要文字值 |
2 | 名称(属性标记、块名称等) |
3-4 | 其他的文字值或名称值 |
5 | 图元句柄。最多 16 位十六进制数字的文字字符串(固定) |
6 | 线型名(固定) |
7 | 文字样式名(固定) |
8 | 图层名(固定) |
9 | DXF:变量名标识符(仅用于 DXF 文件的 HEADER 区域)。 |
10 | 主要点。此点为直线或文字图元的起点,圆的圆心等等。 |
11-18 | 其他点。 |
20, 30 | DXF:主要点的 Y 和 Z 值 |
21-28, 31-37 | DXF:其他点的 Y 和 Z 值 |
38 | DXF:如果非零,则为图元的标高 |
39 | 如果非零,则为图元的厚度(固定) |
40-48 | 浮点值(文字高度、比例因子 端点高度等) |
48 | 线型比例。浮点标量值。缺省值适用于所有图元类型。 |
49 | 可重复的浮点值。一个图元中的可变长度表(例如 LTYPE 表中的虚线长度)中可出现多个组码 49。组码 7x 总是在第一个组码 49 前出现,用于指定表的长度。 |
50-58 | 角度(在 DXF 文件中单位为度,在 AutoLISP 和 ARX 应用程序中单位为弧度)。 |
60 | 表示图元可见性的整数值。不赋值或值为 0 时表示可见;为 1 时表示不可见。 |
62 | 颜色代码(固定) |
66 | “图元跟随”标志(固定) |
67 | 空间,即模型空间或图纸空间(固定) |
68 | APP:表示视口打开但不可见、未激活或者关闭。 |
69 | APP:视口标识数字。 |
70-78 | 整数值,如重复部分的计数器、标志位或模式等。 |
90-99 | 32 位整数值 |
100 | 子类数据标记(把继承下来的类名当作字符串)。由具体类继承下来的所有对象和图元类都必须有此项。此标记用于分离某个对象中由不同的类定义的数据。它也满足从 ARX 继承下来的每个独立的具体类的 DXF 命名需要(请参见子类标记)。 |
102 | 控制字符串,其后为“{<任意名称>”或 "}"。除了字符串必须以 "{" 开始外,它与外部数据组码 1002 类似。其后可跟任意字符串,且此字符串的解释取决于应用程序。另一个可用的控制字符串为 "}",它标识组的结束。如上所述,除了在执行图形核查操作期间外 AutoCAD 一般不解释这些字符串;它们仅用于应用程序。 |
105 | DIMVAR 符号表条目对象句柄。 |
210 | 拉伸方向(固定)。 |
220, 230 | DXF:拉伸方向的 Y 和 Z 值 |
280-289 | 8 位整数值 |
290-299 | 布尔标志值 |
300-309 | 任意的文字字符串 |
310-319 | 任意二进制数据组,与组码 1004 具有相同表示法和限制:最长为 254 个字符的十六进制字符串表示最长为 127 个字节的数据数据组。 |
320-329 | 任意对象句柄。句柄值保留原样,在执行 INSERT 和 XREF 操作时它们不被转化。 |
330-339 | 软键指针句柄。任意指向同一 DXF 文件或图形中的其他对象的软键指针,在执行 INSERT 和 XREF 操作时被转化。 |
340-349 | 硬键指针句柄。任意指向同一 DXF 文件或图形中的其他对象的硬键指针,在执行 INSERT 和 XREF 操作时被转化。 |
350-359 | 软键从属句柄。链接到同一 DXF 文件或图形中其他对象的任意软键从属链接,在执行 INSERT 和 XREF 操作时被转化。 |
360-369 | 硬键从属句柄。链接到同一 DXF 文件或图形中其他对象的任意硬键从属链接,在执行 INSERT 和 XREF 操作时被转化。 |
370-379 | 线宽枚举值 (AcDb::LineWeight)。作为短整数保存并移动。自定义非图元对象可使用全部范围组码,但图元类只能在其描述中使用371-379的DXF组码,因为AutoCAD和AutoLISP都总是采用370组码作为图元的线宽。在这里370组码就象其它的“公用”图元字段一样。 |
380-389 | 打印样式名类型枚举(AcDb::PlotStyleNameType)。作为短整数保存并移动。自定义非图元对象可使用全部范围组码,但图元类只能在其描述中使用381-389的DXF组码,其原因与上面的线宽范围相同。 |
390-399 | 描述打印样式名对象的句柄值,本质上是硬指针,但它有一不同的范围以使向后兼容能容易地处理。作对象的ID(在DXF文件中为句柄)和在AutoLISP中为特殊的类型保存并移动。自定义非图元对象可使用全部范围组码,但图元类只能在其描述中使用391-399的DXF组码,其原因与上面的线宽范围相同。 |
400-409 | 16位整数 |
410-419 | 字符串 |
999 | DXF:999 组码表示其后为注释字符串行。DXFOUT 不在 DXF 输出文件中包括此组;DXFIN 能识别词组码,但忽略其后的注释。通过 999 组码,用户可以在所编辑的 DXF 文件中包括注释。 |
1000 | 扩展数据中的 ASCII 字符串(最长 255 个字节)。 |
1001 | 扩展数据的已注册应用程序名(ASCII 字符串,最长 31 个字节)。 |
1002 | 扩展数据控制字符串("{" 或 "}")。 |
1003 | 扩展数据图层名。 |
1004 | 扩展数据中的字节数据组(最长 127 字节)。 |
1005 | 扩展数据中的图元句柄。文字字符串,最多 16 位十六进制数字。 |
1010 | 扩展数据中的点 |
1020, 1030 | DXF:点的 Y 和 Z 值 |
1011 | 扩展数据中的三维世界空间位置 |
1021, 1031 | DXF:世界空间位置的 Y 和 Z 值。 |
1012 | 扩展数据中的三维世界空间位移 |
1022, 1032 | DXF:世界空间位移的 Y 和 Z 值 |
1013 | 扩展数据中的三维世界空间方向 |
1023, 1033 | DXF:世界空间方向的 Y 和 Z 值 |
1040 | 扩展数据浮点值。 |
1041 | 扩展数据距离值。 |
1042 | 扩展数据比例因子。 |
1070 | 扩展数据 16 位符号整数。 |
1071 | 扩展数据 32 位符号整数。 |
下面的代码提示用户选择要包含在选择集中的对象,并过滤掉除圆之外的所有对象。
- Imports Autodesk.AutoCAD.Runtime
- Imports Autodesk.AutoCAD.ApplicationServices
- Imports Autodesk.AutoCAD.DatabaseServices
- Imports Autodesk.AutoCAD.EditorInput
-
- <CommandMethod("FilterSelectionSet")> _
- Public Sub FilterSelectionSet()
- '' 获得当前文档的编辑器 Get the current document editor
- Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
-
- '' 创建一个 TypedValue 数组,用于定义过滤条件 Create a TypedValue array to define the filter criteria
- Dim acTypValAr(0) As TypedValue
- acTypValAr.SetValue(New TypedValue(DxfCode.Start, "CIRCLE"), 0)
-
- '' 赋值过滤条件给 SelectionFilter 对象 Assign the filter criteria to a SelectionFilter object
- Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
-
- '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
- Dim acSSPrompt As PromptSelectionResult
- acSSPrompt = acDocEd.GetSelection(acSelFtr)
-
- '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
- If acSSPrompt.Status = PromptStatus.OK Then
- Dim acSSet As SelectionSet = acSSPrompt.Value
-
- Application.ShowAlertDialog("Number of objects selected: " & _
- acSSet.Count.ToString())
- Else
- Application.ShowAlertDialog("Number of objects selected: 0")
- End If
- End Sub
在选择集过滤器中指定多个条件
一个选择集过滤器可以包含适用于多个属性或对象的过滤条件。声明的数组应该包含足够多的元素来表示每个条件。
以下示例指定了两个选择对象的过滤条件:对象必须是圆,并且必须在图层 0 上。
- Imports Autodesk.AutoCAD.Runtime
- Imports Autodesk.AutoCAD.ApplicationServices
- Imports Autodesk.AutoCAD.DatabaseServices
- Imports Autodesk.AutoCAD.EditorInput
-
- <CommandMethod("FilterBlueCircleOnLayer0")> _
- Public Sub FilterBlueCircleOnLayer0()
- '' 获得当前文档的编辑器 Get the current document editor
- Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
-
- '' 创建一个 TypedValue 数组,用于定义过滤条件 Create a TypedValue array to define the filter criteria
- Dim acTypValAr(2) As TypedValue
- acTypValAr.SetValue(New TypedValue(DxfCode.Color, 5), 0)
- acTypValAr.SetValue(New TypedValue(DxfCode.Start, "CIRCLE"), 1)
- acTypValAr.SetValue(New TypedValue(DxfCode.LayerName, "0"), 2)
-
- '' 赋值过滤条件给 SelectionFilter 对象 Assign the filter criteria to a SelectionFilter object
- Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
-
- '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
- Dim acSSPrompt As PromptSelectionResult
- acSSPrompt = acDocEd.GetSelection(acSelFtr)
-
- '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
- If acSSPrompt.Status = PromptStatus.OK Then
- Dim acSSet As SelectionSet = acSSPrompt.Value
-
- Application.ShowAlertDialog("Number of objects selected: " & _
- acSSet.Count.ToString())
- Else
- Application.ShowAlertDialog("Number of objects selected: 0")
- End If
- End Sub
添加复杂的过滤器列表条件
如果指定多个选择条件,AutoCAD 将假设选定对象必须符合所有条件。但用户可以按照其他方式来指定条件。对于数字项,用户可以指定关系运算(例如,圆的半径必须大于或等于 5.0);对于所有项,用户可以指定逻辑运算(例如 Text 或 Mtext)。
使用 -4 DXF 组码或 DxfCode.Operator 常量来指示过滤器中的关系运算符。以字符串的形式来指定运算符。下表显示了可以使用的关系运算符:
过滤器列表中的逻辑运算符也由 -4 组代码或 DxfCode.Operator 常量表示,运算符为字符串,但必须组对。运算符以小于号开始 (<),以大于号结束 (>)。下表列出了可以在选择集过滤中使用的逻辑运算符。
选择集过滤器列表的逻辑编组运算符 | ||
---|---|---|
开始 运算符 | 包含的内容 | 结束 运算符 |
"<AND" | 一个或多个运算对象 | "AND>" |
"<OR" | 一个或多个运算对象 | "OR>" |
"<XOR" | 两个运算对象 | "XOR>" |
"<NOT" | 一个运算对象 | "NOT>" |
‘’以下示例指定选择半径大于或等于 5.0 的圆:
Dim acTypValAr(2) As TypedValue
acTypValAr.SetValue(New TypedValue(DxfCode.Start, "CIRCLE"), 0)
acTypValAr.SetValue(New TypedValue(DxfCode.Operator, ">="), 1)
acTypValAr.SetValue(New TypedValue(40, 5), 2)
- Imports Autodesk.AutoCAD.Runtime
- Imports Autodesk.AutoCAD.ApplicationServices
- Imports Autodesk.AutoCAD.DatabaseServices
- Imports Autodesk.AutoCAD.EditorInput
-
- <CommandMethod("FilterRelational")> _
- Public Sub FilterRelational()
- '' 获得当前文档的编辑器 Get the current document editor
- Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
-
- '' 创建一个 TypedValue 数组,用于定义过滤条件 Create a TypedValue array to define the filter criteria
- Dim acTypValAr(2) As TypedValue
- acTypValAr.SetValue(New TypedValue(DxfCode.Start, "CIRCLE"), 0)
- acTypValAr.SetValue(New TypedValue(DxfCode.Operator, ">="), 1)
- acTypValAr.SetValue(New TypedValue(40, 5), 2)
-
- '' 赋值过滤条件给 SelectionFilter 对象 Assign the filter criteria to a SelectionFilter object
- Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
-
- '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
- Dim acSSPrompt As PromptSelectionResult
- acSSPrompt = acDocEd.GetSelection(acSelFtr)
-
- '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
- If acSSPrompt.Status = PromptStatus.OK Then
- Dim acSSet As SelectionSet = acSSPrompt.Value
-
- Application.ShowAlertDialog("Number of objects selected: " & _
- acSSet.Count.ToString())
- Else
- Application.ShowAlertDialog("Number of objects selected: 0")
- End If
- End Sub
在选择器过滤器条件中使用通配符
过滤器列表中的符号名称和字符串可以包含通配符模式。
下表显示了 AutoCAD 能够识别的通配符以及每个通配符在上下文字符串中的含义:
使用单引号 (`) 表示下一个字符不是通配符,而是普通字符。例如,要指定仅将命名为“*U2”的匿名块包含在选择集中,请使用“`*U2”。
选择包含指定词语的 Mtext
以下代码将选择条件定义为选择所有文字字符串中出现“The”的多行文字。
'' 创建一个 TypedValue 数组,用于定义过滤条件
Dim acTypValAr(1) As TypedValue
acTypValAr.SetValue(New TypedValue(DxfCode.Start, "MTEXT"), 0)
acTypValAr.SetValue(New TypedValue(DxfCode.Text, "*The*"), 1)
- Imports Autodesk.AutoCAD.Runtime
- Imports Autodesk.AutoCAD.ApplicationServices
- Imports Autodesk.AutoCAD.DatabaseServices
- Imports Autodesk.AutoCAD.EditorInput
-
- <CommandMethod("FilterMtextWildcard")> _
- Public Sub FilterMtextWildcard()
- '' 获得当前文档的编辑器 Get the current document editor
- Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
-
- '' 创建一个 TypedValue 数组,用于定义过滤条件 Create a TypedValue array to define the filter criteria
- Dim acTypValAr(1) As TypedValue
- acTypValAr.SetValue(New TypedValue(DxfCode.Start, "MTEXT"), 0)
- acTypValAr.SetValue(New TypedValue(DxfCode.Text, "*The*"), 1)
-
- '' 赋值过滤条件给 SelectionFilter 对象 Assign the filter criteria to a SelectionFilter object
- Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
-
- '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
- Dim acSSPrompt As PromptSelectionResult
- acSSPrompt = acDocEd.GetSelection(acSelFtr)
-
- '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
- If acSSPrompt.Status = PromptStatus.OK Then
- Dim acSSet As SelectionSet = acSSPrompt.Value
-
- Application.ShowAlertDialog("Number of objects selected: " & _
- acSSet.Count.ToString())
- Else
- Application.ShowAlertDialog("Number of objects selected: 0")
- End If
- End Sub
过滤扩展数据
外部应用程序可以向 AutoCAD 对象附加数据,例如文字字符串、数值、三维点、距离和图层名。这种数据称为外部数据或 Xdata。用户可以过滤包含指定的应用程序外部数据的图元。
下例将通过过滤查找出包含通过“MY_APP”应用程序添加的外部数据的圆:
- Imports Autodesk.AutoCAD.Runtime
- Imports Autodesk.AutoCAD.ApplicationServices
- Imports Autodesk.AutoCAD.DatabaseServices
- Imports Autodesk.AutoCAD.EditorInput
-
- <CommandMethod("FilterXdata")> _
- Public Sub FilterXdata()
- '' 获得当前文档的编辑器 Get the current document editor
- Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
-
- '' 创建一个 TypedValue 数组,用于定义过滤条件 Create a TypedValue array to define the filter criteria
- Dim acTypValAr(1) As TypedValue
- acTypValAr.SetValue(New TypedValue(DxfCode.Start, "Circle"), 0)
- acTypValAr.SetValue(New TypedValue(DxfCode.ExtendedDataRegAppName, _
- "MY_APP"), 1)
-
- '' 赋值过滤条件给 SelectionFilter 对象 Assign the filter criteria to a SelectionFilter object
- Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
-
- '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
- Dim acSSPrompt As PromptSelectionResult
- acSSPrompt = acDocEd.GetSelection(acSelFtr)
-
- '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
- If acSSPrompt.Status = PromptStatus.OK Then
- Dim acSSet As SelectionSet = acSSPrompt.Value
-
- Application.ShowAlertDialog("Number of objects selected: " & _
- acSSet.Count.ToString())
- Else
- Application.ShowAlertDialog("Number of objects selected: 0")
- End If
- End Sub
从选择集中移除对象
创建选择集之后,用户可以使用选定对象的 ObjectID 列表。选择集不允许从它里面添加或删除 ObjectID,但可以使用一个 ObjectIDCollection 对象合并多个选择集并将它当作一个对象使用。可以从 ObjectIDCollection 对象上添加和移除 ObjectID。使用 Remove 或 RemoveAt 方法从一个 ObjectIDCollection 对象中移除 ObjectID。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。