opencascade AIS_SignatureFilter源码学习 原创
opencascade AIS_SignatureFilter
前言
//! 通过它们的类型和签名选择交互对象。签名为对象的类型提供了额外的特征描述,采用索引的形式。过滤器在本地上下文中查询每个交互对象,以确定其是否具有非空的所有者,并且如果有的话,是否具有所需的签名。如果对象在每种情况下返回true,则保留该对象。否则,将其拒绝。
//! 默认情况下,交互对象具有None类型和签名0。如果您想要为您的交互对象指定特定的类型和签名,必须重新定义两个虚拟方法:Type和Signature。
//! 此过滤器仅在开放的本地上下文中使用。在Collector查看器中,只有当本地上下文打开时,才能定位到积极响应定位过滤器的交互对象。
//! 警告
//! 一些签名已经被AIS中提供的标准对象使用:
//! - 签名0 - 形状(Shape)
//! - 签名1 - 点(Point)
//! - 签名2 - 轴(Axis)
//! - 签名3 - 三轴标识(Trihedron)
//! - 签名4 - 平面三轴标识(PlaneTrihedron)
//! - 签名5 - 线(Line)
//! - 签名6 - 圆(Circle)
//! - 签名7 - 平面(Plane)
方法
1
初始化签名过滤器,将给定类型aGivenKind和给定签名aGivenSignature添加到AIS_TypeFilter中的签名规范中。
Standard_EXPORT AIS_SignatureFilter(const AIS_KindOfInteractive aGivenKind, const Standard_Integer aGivenSignature);
2
//! 如果临时对象不是AIS_InteractiveObject,则返回False。
//! 如果交互对象的签名与过滤器中存储的签名不同,则返回False…
Standard_EXPORT Standard_Boolean IsOk (const Handle(SelectMgr_EntityOwner)& anobj) const Standard_OVERRIDE;
用法
在OpenCascade中,AIS_SignatureFilter
用于根据交互对象的类型和签名进行过滤。以下是一个简单的用例,展示如何使用AIS_SignatureFilter
来筛选特定类型和签名的交互对象。
#include <AIS_SignatureFilter.hxx>
#include <AIS_InteractiveContext.hxx>
#include <AIS_InteractiveObject.hxx>
#include <AIS_KindOfInteractive.hxx>
#include <SelectMgr_Selection.hxx>
#include <SelectMgr_EntityOwner.hxx>
void filterInteractiveObjects()
{
// 创建一个AIS_SignatureFilter来过滤类型为AIS_KOI_Shape并且签名为1的交互对象
AIS_SignatureFilter filter(AIS_KOI_Shape, 1);
// 创建一个交互上下文
Handle(AIS_InteractiveContext) context = new AIS_InteractiveContext();
// 获取选择集
Handle(SelectMgr_Selection) selection = context->MainSelector()->Selection();
// 遍历选择集中的所有实体所有者,检查是否符合过滤器条件
for (Standard_Integer i = 1; i <= selection->NbPicked(); ++i)
{
Handle(SelectMgr_EntityOwner) entityOwner = selection->Picked(i);
if (filter.IsOk(entityOwner))
{
// 如果符合条件,则获取交互对象并进行相应处理
Handle(AIS_InteractiveObject) interactiveObj = Handle(AIS_InteractiveObject)::DownCast(entityOwner->Selectable());
if (!interactiveObj.IsNull())
{
// 在这里可以对符合条件的交互对象进行进一步操作
// 例如打印其信息、修改其属性等
// interactiveObj->...
}
}
}
}
示例解释:
-
创建
AIS_SignatureFilter
对象:
使用AIS_SignatureFilter
类的构造函数,创建一个过滤器来筛选类型为AIS_KOI_Shape
(形状)并且签名为1的交互对象。 -
创建交互上下文:
使用AIS_InteractiveContext
类创建一个交互上下文对象,用于管理和显示交互对象。 -
获取选择集:
使用MainSelector()
方法获取主选择器,然后从中获取选择集。 -
遍历选择集:
使用NbPicked()
方法获取选择集中选中对象的数量,并使用Picked()
方法逐个获取实体所有者。 -
过滤交互对象:
对每个实体所有者,使用IsOk()
方法检查是否符合过滤器条件。如果符合条件,则获取其对应的交互对象。 -
处理符合条件的交互对象:
对于符合条件的交互对象,可以进行进一步的操作,例如打印其信息或修改其属性。
在实际应用中,可以根据具体的需求和场景,调整过滤器的类型和签名,以便精确地筛选和操作交互对象。
参考
拾取类型
enum AIS_StatusOfPick
{
AIS_SOP_Error,//拾取错误
AIS_SOP_NothingSelected,//无拾取
AIS_SOP_Removed,
AIS_SOP_OneSelected,//拾取一个
AIS_SOP_SeveralSelected
};
AIS_SelectionModesConcurrency
//! 模式指定在激活新的选择模式时如何处理多个活动选择模式。
enum AIS_SelectionModesConcurrency
{
AIS_SelectionModesConcurrency_Single, //!< 同一时间只能激活一个选择模式 - 先前激活的模式应被停用
AIS_SelectionModesConcurrency_GlobalOrLocal, //!< 全局(AIS_InteractiveObject::GlobalSelectionMode())或本地(多个)选择模式可以同时处于活动状态
AIS_SelectionModesConcurrency_Multiple, //!< 可以激活任意组合的选择模式
};
AIS_Triangulation
前言
//! 交互对象,从Poly_Triangulation绘制数据,可选择性地使用与每个三角形顶点相关联的颜色。
//! 为了最大效率,颜色以32位整数表示,而不是经典的Quantity_Color值。
//! 目前尚未实现三角形和顶点的交互选择。
方法
1
构造三角化显示对象
Standard_EXPORT AIS_Triangulation(const Handle(Poly_Triangulation)& aTriangulation);
2
//! 设置每个节点的颜色。
//! 每个32位颜色为 Alpha << 24 + Blue << 16 + Green << 8 + Red
//! 颜色组件的顺序对OpenGL进一步使用是至关重要的
Standard_EXPORT void SetColors(const Handle(TColStd_HArray1OfInteger)& aColor);
3
//! 获取每个节点的颜色。
//! 每个32位颜色为 Alpha << 24 + Blue << 16 + Green << 8 + Red
Standard_EXPORT Handle(TColStd_HArray1OfInteger) GetColors() const;
4
//! 如果三角化具有顶点颜色,则返回true。
Standard_Boolean HasVertexColors() const‘’
5
//! 设置三角化对象。
Standard_EXPORT void SetTriangulation(const Handle(Poly_Triangulation)& aTriangulation);
6
//! 返回 Poly_Triangulation 对象。
Standard_EXPORT Handle(Poly_Triangulation) GetTriangulation() const;
7
//! 设置透明度值 aValue 到重构复合形状中。
Standard_EXPORT virtual void SetTransparency(const Standard_Real aValue = 0.6) Standard_OVERRIDE;
8
//! 移除重构复合形状中的透明度设置。
Standard_EXPORT virtual void UnsetTransparency() Standard_OVERRIDE;
9
//! 更新显示内容。
Standard_EXPORT void updatePresentation();
用法用例
在OpenCascade中,AIS_Triangulation
用于显示和管理三角化数据,并可以选择性地处理顶点颜色。以下是一个简单的用例,展示如何使用AIS_Triangulation
类来创建并显示三角化对象。
#include <AIS_Triangulation.hxx>
#include <AIS_InteractiveContext.hxx>
#include <Poly_Triangulation.hxx>
#include <TColgp_Array1OfPnt.hxx>
#include <TColStd_HArray1OfInteger.hxx>
void displayTriangulation()
{
// 创建一个 Poly_Triangulation 对象并添加顶点
Handle(Poly_Triangulation) triangulation = new Poly_Triangulation();
TColgp_Array1OfPnt nodes(1, 3);
nodes(1) = gp_Pnt(0, 0, 0);
nodes(2) = gp_Pnt(1, 0, 0);
nodes(3) = gp_Pnt(0, 1, 0);
triangulation->SetNodes(nodes);
// 设置顶点颜色
Handle(TColStd_HArray1OfInteger) colors = new TColStd_HArray1OfInteger(1, 3);
colors->SetValue(1, 0xFF0000); // Red
colors->SetValue(2, 0x00FF00); // Green
colors->SetValue(3, 0x0000FF); // Blue
// 创建 AIS_Triangulation 对象并设置三角化数据和顶点颜色
Handle(AIS_Triangulation) aisTriangulation = new AIS_Triangulation(triangulation);
aisTriangulation->SetColors(colors);
// 创建交互上下文并将 AIS_Triangulation 对象添加到上下文中
Handle(AIS_InteractiveContext) context = new AIS_InteractiveContext();
context->Display(aisTriangulation, Standard_True); // 将对象显示在视图中
// 设置视图方向和比例
context->SetCurrentV3dView(context->CurrentViewer()->CreateView());
context->SetDisplayMode(AIS_Shaded, Standard_True); // 设置显示模式为Shaded
context->Redisplay(aisTriangulation, Standard_True, Standard_True); // 重新显示对象
}
示例解释:
-
创建 Poly_Triangulation 对象:
使用Poly_Triangulation
类创建一个三角化对象,并设置三个顶点。 -
设置顶点颜色:
创建一个TColStd_HArray1OfInteger
数组来表示顶点的颜色,每个颜色以32位整数表示(如红色0xFF0000)。 -
创建 AIS_Triangulation 对象:
使用AIS_Triangulation
类创建一个交互对象,并将之前创建的Poly_Triangulation
对象和顶点颜色设置添加到其中。 -
创建交互上下文并显示对象:
使用AIS_InteractiveContext
类创建一个交互上下文,并将AIS_Triangulation
对象添加到上下文中,然后显示在视图中。 -
设置显示属性:
设置视图的显示模式为Shaded,并根据需要进行重新显示。
在实际应用中,可以根据具体需求进一步操作和修改AIS_Triangulation
对象,例如添加交互性、更改颜色、调整透明度等。