当前位置:   article > 正文

autoCAD 使用选择集_cad 变量 选择集

cad 变量 选择集

使用选择集

选择集可以由单个对象组成,也可以是一个更复杂的编组:例如特定图层的对象集。 在命令启动前通过pick first选择或者执行命令后提示选择对象要注用户在图形区域中选择对象后创建的选择集是最具代表性的。

选择集不是持久的,如果需要保留选择集,用于在多个命令之间或将来使用,就必须创建一个自定义的字典并记录对象 ID,并将选择集当作一个记录创建。

获得PickFirst选择集
在图形区域中选择对象
添加或合并多个选择集
定义选择集过滤规则
从选择集中移除对象

获得PickFirst选择集

PickFirst 选择集是在先选择对象后启动命令的时候创建的。为了获得 PickFirst 选择集的对象,必须满足某些条件,这些条件是:

  • PICKFIRST 系统变量必须设置为 1
  • 必须给命令定义 UsePickSet 命令标记,用以通知命令要使用 Pickfirst 选择集
  • 调用 SelectImplied 方法获得 PickFirst 选择集

SetImpliedSelection 方法用于清除当前的 PickFirst 选择集。

获得 Pickfirst 选择集

本例显示 PickFirst 选择集中的对象的数量然后要求用户选择另外的对象。在请求用户选择对象前,使用 SetImpliedSelection 方法将当前 PickFirst 选择集清空了。

  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.EditorInput
  5. <CommandMethod("CheckForPickfirstSelection", CommandFlags.UsePickSet)> _
  6. Public Sub CheckForPickfirstSelection()
  7. '' 获得当前文档 Get the current document
  8. Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  9. '' 获得 PickFirst 选择集 Get the PickFirst selection set
  10. Dim acSSPrompt As PromptSelectionResult
  11. acSSPrompt = acDocEd.SelectImplied()
  12. Dim acSSet As SelectionSet
  13. '' 如果提示状态是 OK,那么对象在命令启动前已经被选择了 If the prompt status is OK, objects were selected before
  14. '' the command was started
  15. If acSSPrompt.Status = PromptStatus.OK Then
  16. acSSet = acSSPrompt.Value
  17. Application.ShowAlertDialog("Number of objects in Pickfirst selection: " & _
  18. acSSet.Count.ToString())
  19. Else
  20. Application.ShowAlertDialog("Number of objects in Pickfirst selection: 0")
  21. End If
  22. '' 清除 PickFirst 选择集 Clear the PickFirst selection set
  23. Dim idarrayEmpty() As ObjectId
  24. acDocEd.SetImpliedSelection(idarrayEmpty)
  25. '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
  26. acSSPrompt = acDocEd.GetSelection()
  27. '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
  28. If acSSPrompt.Status = PromptStatus.OK Then
  29. acSSet = acSSPrompt.Value
  30. Application.ShowAlertDialog("Number of objects selected: " & _
  31. acSSet.Count.ToString())
  32. Else
  33. Application.ShowAlertDialog("Number of objects selected: 0")
  34. End If
  35. End Sub

在图形区域中选择对象

  • GetSelection
  • 提示用户从屏幕中拾取对象。
  • SelectAll
  • 在当前空间中选择所有对象,但不包括锁定或冻结的。
  • SelectCrossingPolygon
  • 选择与通过指定点定义的多边形内部和相交的对象。多边形可以是任何形状但不能与它自己相交或接触。
  • SelectCrossingWindow
  • 选择与通过两个点定义的区域内部和相交的对象。
  • SelectFence
  • 选择与选择栅格相交的所有对象。栅格选择与多边形相交选择是相似的,不同的是栅格不能封闭,而且栅格可以与自己相交。
  • SelectLast
  • 选择当前空间中最后创建的对象。
  • SelectPrevious
  • 选择在前一个选择对象提示时选择的所有对象。
  • SelectWindow
  • 选择完全包含在通过两个点定义的矩形内部的所有对象。
  • SelectWindowPolygon
  • 选择完全包含在通过点定义的多边形里面的对象。多边形可以是任何形状但不能与它自己相交或接触。
  • SelectAtPoint
  • 选择经过给定点的对象并将它们放到活动选择集中去。
  • SelectByPolygon
  • 选择栅格内部的对象并将它们放到活动选择集中去。

在屏幕上提示选择对象并遍历选择集

本例提示用户选择对象,然后修改每个选中对象的颜色为绿色或 AutoCAD 颜色索引为 3。

  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.EditorInput
  5. <CommandMethod("SelectObjectsOnscreen")> _
  6. Public Sub SelectObjectsOnscreen()
  7. '' 获得当前文档和数据库 Get the current document and database
  8. Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  9. Dim acCurDb As Database = acDoc.Database
  10. ''启动一个事务 Start a transaction
  11. Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  12. '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
  13. Dim acSSPrompt As PromptSelectionResult = acDoc.Editor.GetSelection()
  14. '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
  15. If acSSPrompt.Status = PromptStatus.OK Then
  16. Dim acSSet As SelectionSet = acSSPrompt.Value
  17. '' 遍历选择集中的对象 Step through the objects in the selection set
  18. For Each acSSObj As SelectedObject In acSSet
  19. '' 检查以确定返回的 SelectedObject 对象是有效的 Check to make sure a valid SelectedObject object was returned
  20. If Not IsDBNull(acSSObj) Then
  21. '' 以写的方式打开选择的对象 Open the selected object for write
  22. Dim acEnt As Entity = acTrans.GetObject(acSSObj.ObjectId, _
  23. OpenMode.ForWrite)
  24. If Not IsDBNull(acEnt) Then
  25. '' 修改对象的颜色为绿色 Change the object's color to Green
  26. acEnt.ColorIndex = 3
  27. End If
  28. End If
  29. Next
  30. '' 保存新对象到数据库中 Save the new object to the database
  31. acTrans.Commit()
  32. End If
  33. '' 销毁事务 Dispose of the transaction
  34. End Using
  35. End Sub

添加或合并多个选择集

用户可以合并多个选择集,需要创建一个 ObjectIdCollection 对象,然后向其中添加多个选择集的对象的 ObjectID。除了添加 ObjectID 到 ObjectIdCollection 对象中,也可以移除 ObjectID。一旦所有 ObjectID 添加到 ObjectIdCollection 对象后,就可以遍历 ObjectID 集合并操作每一个需要的对象。

添加选择的对象到选择集中

本例提示用户选择对象两次然后合并两个选择集到一个独立的选择集中。

  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.EditorInput
  5. <CommandMethod("MergeSelectionSets")> _
  6. Public Sub MergeSelectionSets()
  7. '' 获得当前文档的编辑器 Get the current document editor
  8. Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  9. '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
  10. Dim acSSPrompt As PromptSelectionResult
  11. acSSPrompt = acDocEd.GetSelection()
  12. Dim acSSet1 As SelectionSet
  13. Dim acObjIdColl As ObjectIdCollection = New ObjectIdCollection()
  14. '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
  15. If acSSPrompt.Status = PromptStatus.OK Then
  16. '' Get the selected objects
  17. acSSet1 = acSSPrompt.Value
  18. '' 添加选择的对象到 ObjectIDCollection 中 Append the selected objects to the ObjectIdCollection
  19. acObjIdColl = New ObjectIdCollection(acSSet1.GetObjectIds())
  20. End If
  21. '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
  22. acSSPrompt = acDocEd.GetSelection()
  23. Dim acSSet2 As SelectionSet
  24. '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
  25. If acSSPrompt.Status = PromptStatus.OK Then
  26. acSSet2 = acSSPrompt.Value
  27. '' 检查 ObjectIDCollection 的大小,如果为 0 就重新初始化它 Check the size of the ObjectIdCollection, if zero, then initialize it
  28. If acObjIdColl.Count = 0 Then
  29. acObjIdColl = New ObjectIdCollection(acSSet2.GetObjectIds())
  30. Else
  31. Dim acObjId As ObjectId
  32. '' 遍历第二个选择集 Step through the second selection set
  33. For Each acObjId In acSSet2.GetObjectIds()
  34. '' 添加每个对象 ID 到 ObjectIDCollection 中 Add each object id to the ObjectIdCollection
  35. acObjIdColl.Add(acObjId)
  36. Next
  37. End If
  38. End If
  39. Application.ShowAlertDialog("Number of objects selected: " & _
  40. acObjIdColl.Count.ToString())
  41. End Sub

定义选择集过滤规则

用户可以使用选择过滤器来限制选择和添加到选择集中的对象。选择集过滤器列表可以通过特性或类型用于过滤选择的对象。例如,可能只想选择仅为蓝色的对象,或只在某个图层上的对象。还可以在过滤器列表中组合选择条件,例如,可以创建一个选择过滤器来限制选择的蓝色的圆且位置指定图层上的图案。选择过滤器可以作为参数指定给在“在图形区域中选择对象”部分中不同的选择方法。

注意过滤功能只能识别明确指定给对象的值,而不能识别从图层继承的。例如,如果对象的 linetype 属性设置成 ByLayer 并且图层指定设置为隐藏线型;过滤对象指定为隐藏线型将不能选择那些 LineType 属性设置为 ByLayer 的对象。

使用选择集过滤器定义选择集规则
在选择集过滤器中指定多个条件
添加复杂的过滤器列表条件
在选择器过滤器条件中使用通配符
过滤扩展数据

使用选择集过滤器定义选择集规则

选择过滤器列表由成对的以 TypedValues 形式的参数组成。TypedValue 的 第一个参数标识过滤器的类型(例如对象),第二个参数指定要过滤的值(例如圆)。过滤器类型是指定使用哪种过滤器的 DXF 组码。下面列出了一些最常用的过滤器类型。

常用过滤器的 DXF 组码
 

  • DXF 码                                       过滤器类型 
  • 0 (or DxfCode.Start)                   对象类型(字符串) 例如 直线、圆、圆弧等等。
  • 2 (or DxfCode.BlockName)        块名(字符串) 一个插入引用的块名
  •  
  • 8 or (DxfCode.LayerName)        图层名(字符串)例如 Layer 0
  • 60 (DxfCode.Visibility)               可见性(整数)使用 0 = 可见,1 = 不可见。
  •  
  • 62 (or DxfCode.Color)                颜色编号(整数)范围 0 到 256 内的数字索引值。
  •                                           零表示 BYBLOCK。256 表示 BYLAYER。负值表示图层被关闭。
  • 67                          模型/图纸空间标识符(整数)使用 0 或省略 = 模型空间,1 = 图纸空间。

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

主要点。此点为直线或文字图元的起点,圆的圆心等等。 
DXF:主要点的 X 值(其后为 Y 和 Z 值的组码 20 和 30) APP:三维点(三个实数构成的表)

11-18

其他点。 
DXF:其他点的 X 值(其后为 Y 和 Z 值的组码 21-28 和 31-38) APP:三维点(三个实数构成的表)

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

拉伸方向(固定)。 
DXF:拉伸方向的 X 值 APP:三维拉伸方向矢量

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

扩展数据中的点 
DXF:X 值(其后跟组码 1020 和 1030) APP:三维点

1020, 1030

DXF:点的 Y 和 Z 值

1011

扩展数据中的三维世界空间位置
DXF:X 值(其后跟组码 1021 和 1031):三维点

1021, 1031

DXF:世界空间位置的 Y 和 Z 值。

1012

扩展数据中的三维世界空间位移
DXF:X 值(其后跟组码 1022 和 1032):三维矢量

1022, 1032

DXF:世界空间位移的 Y 和 Z 值

1013

扩展数据中的三维世界空间方向 
DXF:X 值(其后跟组码 1022 和 1032) APP:三维矢量

1023, 1033

DXF:世界空间方向的 Y 和 Z 值

1040

扩展数据浮点值。

1041

扩展数据距离值。

1042

扩展数据比例因子。

1070

扩展数据 16 位符号整数。

1071

扩展数据 32 位符号整数。

下面的代码提示用户选择要包含在选择集中的对象,并过滤掉除圆之外的所有对象。

  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.EditorInput
  5. <CommandMethod("FilterSelectionSet")> _
  6. Public Sub FilterSelectionSet()
  7. '' 获得当前文档的编辑器 Get the current document editor
  8. Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  9. '' 创建一个 TypedValue 数组,用于定义过滤条件 Create a TypedValue array to define the filter criteria
  10. Dim acTypValAr(0) As TypedValue
  11. acTypValAr.SetValue(New TypedValue(DxfCode.Start, "CIRCLE"), 0)
  12. '' 赋值过滤条件给 SelectionFilter 对象 Assign the filter criteria to a SelectionFilter object
  13. Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
  14. '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
  15. Dim acSSPrompt As PromptSelectionResult
  16. acSSPrompt = acDocEd.GetSelection(acSelFtr)
  17. '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
  18. If acSSPrompt.Status = PromptStatus.OK Then
  19. Dim acSSet As SelectionSet = acSSPrompt.Value
  20. Application.ShowAlertDialog("Number of objects selected: " & _
  21. acSSet.Count.ToString())
  22. Else
  23. Application.ShowAlertDialog("Number of objects selected: 0")
  24. End If
  25. End Sub

在选择集过滤器中指定多个条件

一个选择集过滤器可以包含适用于多个属性或对象的过滤条件。声明的数组应该包含足够多的元素来表示每个条件。

以下示例指定了两个选择对象的过滤条件:对象必须是圆,并且必须在图层 0 上。

  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.EditorInput
  5. <CommandMethod("FilterBlueCircleOnLayer0")> _
  6. Public Sub FilterBlueCircleOnLayer0()
  7. '' 获得当前文档的编辑器 Get the current document editor
  8. Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  9. '' 创建一个 TypedValue 数组,用于定义过滤条件 Create a TypedValue array to define the filter criteria
  10. Dim acTypValAr(2) As TypedValue
  11. acTypValAr.SetValue(New TypedValue(DxfCode.Color, 5), 0)
  12. acTypValAr.SetValue(New TypedValue(DxfCode.Start, "CIRCLE"), 1)
  13. acTypValAr.SetValue(New TypedValue(DxfCode.LayerName, "0"), 2)
  14. '' 赋值过滤条件给 SelectionFilter 对象 Assign the filter criteria to a SelectionFilter object
  15. Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
  16. '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
  17. Dim acSSPrompt As PromptSelectionResult
  18. acSSPrompt = acDocEd.GetSelection(acSelFtr)
  19. '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
  20. If acSSPrompt.Status = PromptStatus.OK Then
  21. Dim acSSet As SelectionSet = acSSPrompt.Value
  22. Application.ShowAlertDialog("Number of objects selected: " & _
  23. acSSet.Count.ToString())
  24. Else
  25. Application.ShowAlertDialog("Number of objects selected: 0")
  26. End If
  27. 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)

  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.EditorInput
  5. <CommandMethod("FilterRelational")> _
  6. Public Sub FilterRelational()
  7. '' 获得当前文档的编辑器 Get the current document editor
  8. Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  9. '' 创建一个 TypedValue 数组,用于定义过滤条件 Create a TypedValue array to define the filter criteria
  10. Dim acTypValAr(2) As TypedValue
  11. acTypValAr.SetValue(New TypedValue(DxfCode.Start, "CIRCLE"), 0)
  12. acTypValAr.SetValue(New TypedValue(DxfCode.Operator, ">="), 1)
  13. acTypValAr.SetValue(New TypedValue(40, 5), 2)
  14. '' 赋值过滤条件给 SelectionFilter 对象 Assign the filter criteria to a SelectionFilter object
  15. Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
  16. '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
  17. Dim acSSPrompt As PromptSelectionResult
  18. acSSPrompt = acDocEd.GetSelection(acSelFtr)
  19. '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
  20. If acSSPrompt.Status = PromptStatus.OK Then
  21. Dim acSSet As SelectionSet = acSSPrompt.Value
  22. Application.ShowAlertDialog("Number of objects selected: " & _
  23. acSSet.Count.ToString())
  24. Else
  25. Application.ShowAlertDialog("Number of objects selected: 0")
  26. End If
  27. End Sub

在选择器过滤器条件中使用通配符

过滤器列表中的符号名称和字符串可以包含通配符模式。

下表显示了 AutoCAD 能够识别的通配符以及每个通配符在上下文字符串中的含义:

通配符

字符

说明

#?(pound 磅值符号)

匹配任意一个数字

@?(at 在符号)

匹配任意一个字母

.?(period 句点)

匹配任意一个非字母数字的字符

*?(asterisk 星号)

匹配任何字符顺序,包括空字符,可用于搜索模式中的任何位置:在开头、在中间或在结尾

??(question mark 问号)

匹配任意一个字符

~?(tilde 波浪号)

如果它是模式中的的第一个字符,则匹配除此模式以外的任意内容

[...]

匹配方括号中的任意一个字符

[~...]

匹配不在方括号中的任意一个字符

-?(hyphen 连字符)

用在方括号中,指定一个字符的取值范围

,?(comma 逗号)

分隔两个模式

`?(reverse quote 反引号)

避开特殊的字符(直接读取下一个字符)

使用单引号 (`) 表示下一个字符不是通配符,而是普通字符。例如,要指定仅将命名为“*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)

  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.EditorInput
  5. <CommandMethod("FilterMtextWildcard")> _
  6. Public Sub FilterMtextWildcard()
  7. '' 获得当前文档的编辑器 Get the current document editor
  8. Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  9. '' 创建一个 TypedValue 数组,用于定义过滤条件 Create a TypedValue array to define the filter criteria
  10. Dim acTypValAr(1) As TypedValue
  11. acTypValAr.SetValue(New TypedValue(DxfCode.Start, "MTEXT"), 0)
  12. acTypValAr.SetValue(New TypedValue(DxfCode.Text, "*The*"), 1)
  13. '' 赋值过滤条件给 SelectionFilter 对象 Assign the filter criteria to a SelectionFilter object
  14. Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
  15. '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
  16. Dim acSSPrompt As PromptSelectionResult
  17. acSSPrompt = acDocEd.GetSelection(acSelFtr)
  18. '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
  19. If acSSPrompt.Status = PromptStatus.OK Then
  20. Dim acSSet As SelectionSet = acSSPrompt.Value
  21. Application.ShowAlertDialog("Number of objects selected: " & _
  22. acSSet.Count.ToString())
  23. Else
  24. Application.ShowAlertDialog("Number of objects selected: 0")
  25. End If
  26. End Sub

 

过滤扩展数据

外部应用程序可以向 AutoCAD 对象附加数据,例如文字字符串、数值、三维点、距离和图层名。这种数据称为外部数据或 Xdata。用户可以过滤包含指定的应用程序外部数据的图元。

选择包含外部数据的圆

下例将通过过滤查找出包含通过“MY_APP”应用程序添加的外部数据的圆:

  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.EditorInput
  5. <CommandMethod("FilterXdata")> _
  6. Public Sub FilterXdata()
  7. '' 获得当前文档的编辑器 Get the current document editor
  8. Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  9. '' 创建一个 TypedValue 数组,用于定义过滤条件 Create a TypedValue array to define the filter criteria
  10. Dim acTypValAr(1) As TypedValue
  11. acTypValAr.SetValue(New TypedValue(DxfCode.Start, "Circle"), 0)
  12. acTypValAr.SetValue(New TypedValue(DxfCode.ExtendedDataRegAppName, _
  13. "MY_APP"), 1)
  14. '' 赋值过滤条件给 SelectionFilter 对象 Assign the filter criteria to a SelectionFilter object
  15. Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
  16. '' 要求在图形区域中选择对象 Request for objects to be selected in the drawing area
  17. Dim acSSPrompt As PromptSelectionResult
  18. acSSPrompt = acDocEd.GetSelection(acSelFtr)
  19. '' 如果提示状态是 OK,对象就被选择了 If the prompt status is OK, objects were selected
  20. If acSSPrompt.Status = PromptStatus.OK Then
  21. Dim acSSet As SelectionSet = acSSPrompt.Value
  22. Application.ShowAlertDialog("Number of objects selected: " & _
  23. acSSet.Count.ToString())
  24. Else
  25. Application.ShowAlertDialog("Number of objects selected: 0")
  26. End If
  27. End Sub

 从选择集中移除对象

创建选择集之后,用户可以使用选定对象的 ObjectID 列表。选择集不允许从它里面添加或删除 ObjectID,但可以使用一个 ObjectIDCollection 对象合并多个选择集并将它当作一个对象使用。可以从 ObjectIDCollection 对象上添加和移除 ObjectID。使用 Remove 或 RemoveAt 方法从一个 ObjectIDCollection 对象中移除 ObjectID。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/111815
推荐阅读
相关标签
  

闽ICP备14008679号