【CATIA的二次开发36】对象Selection选择集管理部分方法介绍01

在CATIA V5的VBA开发中,Selection对象是用户交互的核心组件,用于管理用户在图形区域或特征树中的选择操作。
Selection 对象是 CATIA VBA 中的中央交互枢纽,充当用户界面与程序逻辑之间的桥梁。
它代表当前在图形区域或特征树中被选中的元素集合,是自动化操作的基础。

一、Selection对象属性和方法

【CATIA的二次开发36】对象Selection选择集管理部分方法介绍01_第1张图片

二、方法分类概览

分类 方法 核心功能
选择集管理 Add, Remove, Remove2, Clear, GetItem, Item, Item2 增删查操作
交互选择 IndicateOrSelectElement2D, IndicateOrSelectElement3D, SelectElement2, SelectElement3, SelectElement4 用户交互选择
高级查询 Search, FindObject, FilterCorrespondence 元素筛选
剪贴板操作 Copy, Cut, Paste, PasteLink, PasteSpecial 数据转移
元素操作 Delete 删除元素

三、核心方法详解与对比

1、选择集管理方法

方法 参数/返回值 应用场景 版本演变
Add (Item As AnyObject) 以编程方式添加元素到选择集 所有版本
Remove (Index As Integer) 按索引移除元素 (≤32,767个元素) 早期版本(V5R19前)
Remove2 (Index As Long) 支持超大型选择集(>32,767元素) V5R20+
Clear - 清空整个选择集 所有版本
Item (Index As Integer) → SelectionItem 按整数索引访问元素 早期版本
Item2 (Index As Long) → SelectionItem 支持长整型索引访问 V5R20+
GetItem (Index As Long) → SelectionItem 功能同Item2,命名更清晰 V5R25+
' 添加元素到选择集
Sel.Add Part1.HybridBodies.Item("Sketch.1")

' 安全移除元素(V5R20+)
If Sel.Count2 > 1000 Then
Sel.Remove2 1  ' 移除第一个元素
End If

' 遍历大型选择集
For i = 1 To Sel.Count2
Dim selItem As SelectionItem
Set selItem = Sel.GetItem(i)  ' 或 Item2(i)
Debug.Print selItem.Value.Name
Next

2、交互选择方法

方法 关键参数 特点 版本
SelectElement2 (Filter, Message[, MultiSelectionMode]) 基础交互选择,支持单选 V5R16+
SelectElement3 增加MultiSelectionMode参数 支持多选模式 V5R20+
SelectElement4 增加SelectionBeforeActivation参数 预选高亮支持 V5R25+
IndicateOrSelectElement2D (Message[, Filter]) 工程图环境专用 所有版本
IndicateOrSelectElement3D (Message[, Filter]) 3D环境专用 所有版本

多选模式常量:

catMultiSelTriggWhenUserValidatesSelection  ' 用户确认时触发
catMultiSelTriggImmediately                ' 即时触发
' 单选示例 (V5R16+)
Dim filter(0) As String
filter(0) = "Plane"
Sel.SelectElement2 filter, "请选择一个平面", False

' 多选示例 (V5R20+)
Sel.SelectElement3 filter, "请选择多个平面", True, , , , catMultiSelTriggImmediately

' 工程图选择
Sel.IndicateOrSelectElement2D "请选择视图", Array("DrawingView")

3、高级查询方法

方法 参数 功能 典型场景
Search (Query As String) 根据查询字符串筛选元素 批量选择特定属性元素
FindObject (Name As String) → AnyObject 按名称查找元素 快速定位已知名称元素
FilterCorrespondence (FilterType, Tolerance) 基于几何对应性过滤 对称设计/模具匹配
' 选择所有直径>10mm的孔
Sel.Search "Diameter > 10mm AND Type=Hole"

' 选择名称包含"Bolt"的零件
Sel.Search "Name ~ '*Bolt*'"

四、核心方法详解

1、Add方法

在CATIA VBA开发中,Selection对象的Add方法用于将指定元素添加到当前选择集中。以下是详细说明和用法:

  • 基本语法
    selection.Add(Element)
    ‘ 或(带过滤器):
    selection.Add(Element, FilterType)
    
    • 参数说明
      • Element (必需) 要添加到选择集的对象(如几何元素、特征、部件等)
      • FilterType (可选) 指定选择过滤器的类型(使用CatSelectionFilter枚举常量),确保正确选择元素类型
    • 常用过滤器常量
常量名 说明
catSelectionFilterNone 0 无过滤器
catSelectionFilterVertex 1 顶点
catSelectionFilterEdge 2 边线
catSelectionFilterFace 3
catSelectionFilterProduct 10 产品
catSelectionFilterPart 11 零件
  • 使用示例

场景一:基本选择(无过滤器)

Dim sel As Selection
Set sel = CATIA.ActiveDocument.Selection

' 获取要选择的元素(例如第一个面)
Dim myFace As Face
Set myFace = part.Bodies.Item(1).Faces.Item(1)

' 清空并添加选择
sel.Clear
sel.Add myFace

场景二:使用过滤器选择

Dim sel As Selection
Set sel = CATIA.ActiveDocument.Selection

' 获取边线元素
Dim myEdge As Edge
Set myEdge = part.Bodies.Item(1).Edges.Item(1)

' 带过滤器的选择
sel.Clear
sel.Add myEdge, catSelectionFilterEdge  ' 明确指定选择类型为边线

场景三:批量选择多个元素

Dim sel As Selection
Set sel = CATIA.ActiveDocument.Selection
sel.Clear

' 选择零件中所有面
Dim faces As Faces
Set faces = part.Bodies.Item(1).Faces

Dim i As Integer
For i = 1 To faces.Count
    sel.Add faces.Item(i), catSelectionFilterFace
Next i
  • 重要注意事项
    • 清除选择集 添加新元素前建议先调用 sel.Clear 清除现有选择
    • 显式使用过滤器 当选择特定类型元素时,强烈建议添加过滤器参数:
    ' 正确做法(带过滤器)
    sel.Add myFace, catSelectionFilterFace
    
    ' 避免做法(无过滤器)
    sel.Add myFace  ' 可能导致意外选择父级特征
    
    • 错误处理 添加无效对象时会报错,建议添加错误处理:
    On Error Resume Next
    sel.Add invalidObject
    If Err.Number <> 0 Then
        MsgBox "选择失败: " & Err.Description
    End If
    On Error GoTo 0
    
  • 典型应用场景
  1. 自动化选择元素进行操作(如测量、修改属性等)
  2. 批量处理前准备选择集
  3. 创建用户交互前的预选择状态
  4. 配合Selection.VisProperties修改显示属性
    提示:在复杂选择操作后,可通过Selection.Visualization = catVisNoSelection关闭高亮显示以提升性能。

2、Remove方法

在 CATIA VBA 开发中,Selection.Remove 方法是管理选择集的关键工具,用于从当前选择中移除指定元素。
这是创建精确选择集和实现用户交互控制的重要方法。

  • 功能
    从选择集中移除指定位置的元素
    更新选择集计数
    移除图形区对应元素的高亮显示
    保持选择集中剩余元素的顺序
  • 基本语法
selection.Remove(Index)

参数说明

参数 类型 说明
Index Long 要移除的元素在选择集中的位置(1 到 Selection.Count)
  • 使用场景

场景一:基本用法

Sub RemoveSelectedItem()
    Dim sel As Selection
    Set sel = CATIA.ActiveDocument.Selection
    
    If sel.Count = 0 Then
        MsgBox "选择集为空", vbInformation
        Exit Sub
    End If
    
    ' 移除第一个元素
    sel.Remove 1
    MsgBox "已移除第一个选择项", vbInformation
End Sub

场景二:条件移除

Sub RemoveFacesFromSelection()
    Dim sel As Selection
    Set sel = CATIA.ActiveDocument.Selection
    
    If sel.Count = 0 Then Exit Sub
    
    ' 倒序遍历避免索引错误
    Dim i As Long
    For i = sel.Count To 1 Step -1
        Dim elem As SelectedElement
        Set elem = sel.Item(i)
        
        ' 如果元素是面,则移除
        If elem.Type = "Face" Then
            sel.Remove i
        End If
    Next i
    
    MsgBox "已移除所有面元素,剩余 " & sel.Count & " 个元素", vbInformation
End Sub

场景三:交互式移除

Sub InteractiveRemove()
    Dim sel As Selection
    Set sel = CATIA.ActiveDocument.Selection
    
    If sel.Count = 0 Then
        MsgBox "请先选择元素", vbExclamation
        Exit Sub
    End If
    
    ' 显示当前选择
    Dim msg As String
    msg = "当前选择:" & vbCrLf
    Dim i As Long
    For i = 1 To sel.Count
        msg = msg & i & ": " & sel.Item(i).Value.Name & vbCrLf
    Next i
    
    ' 获取用户输入
    Dim indexToRemove As Long
    indexToRemove = InputBox(msg & "输入要移除的项目编号 (1-" & sel.Count & "):")
    
    ' 验证输入
    If indexToRemove >= 1 And indexToRemove <= sel.Count Then
        sel.Remove indexToRemove
        MsgBox "已移除项目 " & indexToRemove, vbInformation
    Else
        MsgBox "无效的输入", vbExclamation
    End If
End Sub

场景四:批量移除多个元素

Sub RemoveMultipleItems()
    Dim sel As Selection
    Set sel = CATIA.ActiveDocument.Selection
    If sel.Count = 0 Then Exit Sub
    
    ' 要移除的索引列表
    Dim indicesToRemove() As Long
    ReDim indicesToRemove(1 To sel.Count)
    Dim count As Long: count = 0
    
    ' 识别要移除的元素(示例:名称为"Temp*"的元素)
    Dim i As Long
    For i = 1 To sel.Count
        If sel.Item(i).Value.Name Like "Temp*" Then
            count = count + 1
            indicesToRemove(count) = i
        End If
    Next i
    
    ' 从后向前移除(避免索引变化)
    For i = count To 1 Step -1
        sel.Remove indicesToRemove(i)
    Next i
    
    MsgBox "已移除 " & count & " 个元素", vbInformation
End Sub

你可能感兴趣的:(CATIA,VBA二次开发,CATIA的VBA二次开发,CATIA,VBA,CATIA宏,CATIA,VBA)