opencascade AIS_ExclusionFilter过滤器 源码学习

前言

一个用于根据给定类型和/或签名来拒绝或接受对象的框架。对象被存储,并且存储的对象与标志设置一起用于定义过滤器。要过滤的对象与添加到过滤器中的存储对象进行比较,并根据排除标志设置被接受或拒绝。

  • 排除标志开启时
    • 函数 IsOk 对所有对象回答 true,除了那些类型和签名与过滤框架中存储的对象相同的对象。
  • 排除标志关闭时
    • 函数 IsOk 对所有类型和签名与存储对象相同的对象回答 true

对应方法

AIS_ExclusionFilter() [1/3]

AIS_ExclusionFilter::AIS_ExclusionFilter (const Standard_Boolean ExclusionFlagOn = Standard_True)

构造一个由标志设置 ExclusionFlagOn 定义的空排除过滤器对象。默认情况下,标志设置为 true

AIS_ExclusionFilter() [2/3]

AIS_ExclusionFilter::AIS_ExclusionFilter (const AIS_KindOfInteractive TypeToExclude, const Standard_Boolean ExclusionFlagOn = Standard_True)

所有类型为 TypeToExclude 的 AIS 对象将被 IsOk 方法拒绝。

AIS_ExclusionFilter() [3/3]

AIS_ExclusionFilter::AIS_ExclusionFilter (const AIS_KindOfInteractive TypeToExclude, const Standard_Integer SignatureInType, const Standard_Boolean ExclusionFlagOn = Standard_True)

构造一个由枚举值 TypeToExclude、签名 SignatureInType 和标志设置 ExclusionFlagOn 定义的排除过滤器对象。默认情况下,标志设置为 true

成员函数文档

Add() [1/2]

Standard_Boolean AIS_ExclusionFilter::Add (const AIS_KindOfInteractive TypeToExclude)

TypeToExclude 类型添加到类型列表中。

Add() [2/2]

Standard_Boolean AIS_ExclusionFilter::Add (const AIS_KindOfInteractive TypeToExclude, const Standard_Integer SignatureInType)

将具有特定签名的 TypeToExclude 类型添加到类型列表中。

Clear()

void AIS_ExclusionFilter::Clear ()

清空过滤器中存储的所有类型和签名。

IsExclusionFlagOn()

Standard_Boolean AIS_ExclusionFilter::IsExclusionFlagOn () const

返回当前排除标志的状态。

IsOk()

virtual Standard_Boolean AIS_ExclusionFilter::IsOk (const Handle< SelectMgr_EntityOwner > & anObj) const

指示所选的交互对象是否通过过滤器。所有者 anObj 可以是直接或用户。直接所有者是相应的构造元素,而用户是该实体组成部分的复合形状。当一个对象被鼠标检测到时 - 在 AIS 中,这是通过上下文选择器完成的 - 它的所有者作为参数传递给过滤器。如果对象返回 Standard_True,则保留;否则拒绝。如果您正在创建一个继承此框架的过滤器类,并且子类要在 AIS 本地上下文中使用,则需要实现虚函数 ActsOn

实现自 SelectMgr_Filter

IsStored()

Standard_Boolean AIS_ExclusionFilter::IsStored (const AIS_KindOfInteractive aType) const

检查特定类型是否已存储在过滤器中。

ListOfSignature()

void AIS_ExclusionFilter::ListOfSignature (const AIS_KindOfInteractive aType, TColStd_ListOfInteger & TheStoredList) const

获取特定类型的所有存储签名列表。

ListOfStoredTypes()

void AIS_ExclusionFilter::ListOfStoredTypes (TColStd_ListOfInteger & TheList) const

获取所有存储类型的列表。

Remove() [1/2]

Standard_Boolean AIS_ExclusionFilter::Remove (const AIS_KindOfInteractive TypeToExclude)

从过滤器中移除特定类型。

Remove() [2/2]

Standard_Boolean AIS_ExclusionFilter::Remove (const AIS_KindOfInteractive TypeToExclude, const Standard_Integer SignatureInType)

从过滤器中移除具有特定签名的特定类型。

SetExclusionFlag()

void AIS_ExclusionFilter::SetExclusionFlag (const Standard_Boolean theStatus)

设置排除标志的状态。

示例

下面是一个使用 OpenCASCADE 的 AIS_ExclusionFilter 的示例代码。这个示例演示了如何创建一个过滤器,并将其应用于 AIS 上下文以排除特定类型的交互对象。

cpp 复制代码
#include <AIS_InteractiveContext.hxx>
#include <AIS_Shape.hxx>
#include <AIS_ExclusionFilter.hxx>
#include <TopoDS_Shape.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <V3d_View.hxx>
#include <V3d_Viewer.hxx>
#include <AIS_InteractiveObject.hxx>
#include <Graphic3d.hxx>
#include <OpenGl_GraphicDriver.hxx>
#include <Aspect_DisplayConnection.hxx>
#include <WNT_Window.hxx>

// 初始化 OpenCASCADE 的 Viewer 和 Context
Handle(V3d_Viewer) InitViewer() {
    Handle(Aspect_DisplayConnection) aDisplayConnection = new Aspect_DisplayConnection();
    Handle(OpenGl_GraphicDriver) aGraphicDriver = new OpenGl_GraphicDriver(aDisplayConnection);
    Handle(V3d_Viewer) aViewer = new V3d_Viewer(aGraphicDriver);
    return aViewer;
}

int main() {
    // 初始化 Viewer 和 Context
    Handle(V3d_Viewer) aViewer = InitViewer();
    Handle(AIS_InteractiveContext) aContext = new AIS_InteractiveContext(aViewer);

    // 创建一个 Box 并添加到 Context
    TopoDS_Shape aBox = BRepPrimAPI_MakeBox(100.0, 100.0, 100.0).Shape();
    Handle(AIS_Shape) aShape = new AIS_Shape(aBox);
    aContext->Display(aShape, Standard_True);

    // 创建一个 Exclusion Filter 以排除 AIS_Shape 类型
    Handle(AIS_ExclusionFilter) aFilter = new AIS_ExclusionFilter(AIS_KOI_Shape);

    // 将过滤器应用于上下文
    aContext->AddFilter(aFilter);

    // 检查过滤器是否工作
    if (!aFilter->IsOk(aShape->Owner())) {
        std::cout << "The shape is excluded by the filter." << std::endl;
    } else {
        std::cout << "The shape is not excluded by the filter." << std::endl;
    }

    // 移除过滤器
    aContext->RemoveFilter(aFilter);

    return 0;
}

代码说明

  1. 初始化 Viewer 和 Context

    • 使用 InitViewer 函数初始化 OpenCASCADE 的 Viewer。
    • 创建一个 AIS_InteractiveContext 来管理交互对象。
  2. 创建和显示形状

    • 创建一个立方体 TopoDS_Shape 并将其包装在 AIS_Shape 中。
    • 使用 Display 方法将形状添加到上下文中。
  3. 创建排除过滤器

    • 创建一个 AIS_ExclusionFilter 对象,并指定要排除的交互类型为 AIS_Shape
  4. 应用过滤器

    • 使用 AddFilter 方法将过滤器添加到上下文中。
  5. 验证过滤器

    • 使用 IsOk 方法检查形状是否被过滤器排除。
  6. 移除过滤器

    • 使用 RemoveFilter 方法从上下文中移除过滤器。

这个示例展示了如何在 OpenCASCADE 中使用 AIS_ExclusionFilter 来排除特定类型的交互对象。你可以根据需要调整过滤器的类型和签名,以适应不同的应用场景。

相关推荐
数据与后端架构提升之路12 分钟前
从神经元到神经网络:深度学习的进化之旅
人工智能·神经网络·学习
一行121 分钟前
电脑蓝屏debug学习
学习·电脑
星LZX35 分钟前
WireShark入门学习笔记
笔记·学习·wireshark
阑梦清川36 分钟前
在鱼皮的模拟面试里面学习有感
学习·面试·职场和发展
qq_4330994036 分钟前
Isaac Gym学习笔记——概述
学习
秃头佛爷3 小时前
Python学习大纲总结及注意事项
开发语言·python·学习
dayouziei5 小时前
java的类加载机制的学习
java·学习
dsywws8 小时前
Linux学习笔记之vim入门
linux·笔记·学习
晨曦_子画9 小时前
3种最难学习和最容易学习的 3 种编程语言
学习
城南vision9 小时前
Docker学习—Docker核心概念总结
java·学习·docker