opencascade AIS_InteractiveObject源码学习【重中之重】 原创

AIS_InteractiveObject

前言

在这里插入图片描述
在这里插入图片描述
//! 定义一个具有显示和选择服务的对象类。
//! 被可视化和选择的实体是交互式对象。
//! 实体的特定属性,如尺寸中箭头的外观,必须在 Prs3d_Drawer 中加载。
//!
//! 您可以利用已经编写好所有必要方法的标准交互式对象类,
//! 或者您可以实现自己的交互式对象类。
//! 每个交互式对象需要实现的关键接口方法:
//! * 可呈现对象 (PrsMgr_PresentableObject)
//! 考虑为特定交互式对象或交互式对象类定义支持的显示模式索引的枚举。
//! - AcceptDisplayMode() 接受此对象实现的显示模式;
//! - Compute() 计算给定显示模式索引的呈现方式;
//! * 可选择对象 (SelectMgr_SelectableObject)
//! 考虑为特定交互式对象或交互式对象类定义支持的选择模式索引的枚举。
//! - ComputeSelection() 计算给定选择模式索引的可选择实体。

这个类是交互式对象的基类,可以说是重中之重的类。

方法

方法1:
//! 返回交互式对象的类型;默认为 AIS_KindOfInteractive_None。

virtual AIS_KindOfInteractive Type() const { return AIS_KindOfInteractive_None; }

方法2:
//! 指定交互式对象的附加特征,类型为 Type();默认为 -1。
//! 在数据中,此签名归属于形状。
//! 其余数据具有以下默认签名:
//! - 点 签名 1
//! - 轴 签名 2
//! - 三轴架 签名 3
//! - 平面三轴架 签名 4
//! - 线 签名 5
//! - 圆 签名 6
//! - 平面 签名 7

virtual Standard_Integer Signature() const { return -1; }

方法3:
//! 更新活动的显示;如果 = Standard_True,则所有内部呈现都将重新计算。
//! 重要提示:最好在可访问时调用对应 AIS_InteractiveContext 实例的 Redisplay 方法。
//! 此方法仅将调用重定向到 myCTXPtr,因此此类字段必须更新以获得正确结果。

Standard_EXPORT void Redisplay(const Standard_Boolean AllModes = Standard_False);

方法4:
//! 指示交互式对象是否有指向交互式上下文的指针。

Standard_Boolean HasInteractiveContext() const { return myCTXPtr != NULL; }

方法5:
//! 返回指向交互式上下文的上下文指针。

AIS_InteractiveContext* InteractiveContext() const { return myCTXPtr; }

方法6:
//! 设置交互式上下文 aCtx,并提供到默认绘图工具或 “Drawer” 的链接(如果没有)。

Standard_EXPORT virtual void SetContext(const Handle(AIS_InteractiveContext)& aCtx);

方法7:
//! 如果对象有分配的所有者,则返回 true。
//! 所有者可以是一组子形状的形状,或者是它组成的子形状,采用临时形式。

Standard_Boolean HasOwner() const { return !myOwner.IsNull(); }

方法8:
//! 返回交互式对象的所有者。
//! 所有者可以是一组子形状的形状,或者是它组成的子形状,
//! 采用临时形式。
//! 有两种类型的所有者:
//! - 直接所有者,分解形状如边、线和面。
//! - 用户,连接到敏感基元的呈现对象,或已分解的形状。

const Handle(Standard_Transient)& GetOwner() const { return myOwner; }

方法9:
//! 允许将所有者 theApplicativeEntity 分配给交互式对象。
//! 这可以是一组子形状的形状,或者是它组成的子形状。
//! 所有者采用临时形式。

void SetOwner(const Handle(Standard_Transient)& theApplicativeEntity) { myOwner = theApplicativeEntity; }

方法10:
//! 每个交互式对象都有方法,允许我们以临时形式为其分配一个所有者。
//! 此方法从图形实体中移除所有者。

void ClearOwner() { myOwner.Nullify(); }

方法11:
//! 在查看器中拖动对象。
//! @param theCtx [in] 交互式上下文
//! @param theView [in] 活动视图
//! @param theOwner [in] 检测到实体的所有者
//! @param theDragFrom [in] 拖动起始点
//! @param theDragTo [in] 拖动结束点
//! @param theAction [in] 拖动动作
//! @return 如果对象拒绝拖动动作(例如 AIS_DragAction_Start),则返回 FALSE。

Standard_EXPORT virtual Standard_Boolean ProcessDragging(const Handle(AIS_InteractiveContext)& theCtx,
const Handle(V3d_View)& theView,
const Handle(SelectMgr_EntityOwner)& theOwner,
const Graphic3d_Vec2i& theDragFrom,
const Graphic3d_Vec2i& theDragTo,
const AIS_DragAction theAction);

方法12:
//! 返回指向交互式上下文的上下文指针。

Standard_EXPORT Handle(AIS_InteractiveContext) GetContext() const;

方法13:
//! 如果此对象在当前 DisplayMode() 下具有呈现,则返回 TRUE。

Standard_EXPORT Standard_Boolean HasPresentation() const;

方法14:
//! 根据当前 DisplayMode() 返回此对象的当前呈现。

Standard_EXPORT Handle(Prs3d_Presentation) Presentation() const;

方法15:
//! 将图形基本外观设置为当前呈现。

Standard_DEPRECATED(“已弃用方法,结果可能未定义”)
Standard_EXPORT void SetAspect(const Handle(Prs3d_BasicAspect)& anAspect);

方法16:
//! 将我(me)的内容转储到流中。

Standard_EXPORT virtual void DumpJson(Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE;

protected:

方法17:
//! TypeOfPresention3d 表示交互式对象可以有依赖于 Display 视图的呈现。

Standard_EXPORT AIS_InteractiveObject(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d = PrsMgr_TOP_AllView);

方法18:
//! 设置呈现显示状态。

Standard_EXPORT void SetDisplayStatus(PrsMgr_DisplayStatus theStatus);

用法示例

在OpenCascade中,AIS_InteractiveObject类用于表示具有显示和选择功能的交互式对象。以下是一个简单的示例,展示如何创建和使用AIS_InteractiveObject对象:

#include <AIS_InteractiveObject.hxx>
#include <AIS_InteractiveContext.hxx>
#include <PrsMgr_PresentableObject.hxx>
#include <SelectMgr_SelectableObject.hxx>
#include <Prs3d_Drawer.hxx>
#include <iostream>

class MyInteractiveObject : public AIS_InteractiveObject,
                            public PrsMgr_PresentableObject,
                            public SelectMgr_SelectableObject
{
public:
    //! 构造函数
    MyInteractiveObject()
        : AIS_InteractiveObject(PrsMgr_TOP_AllView) // 设置呈现对象的类型为所有视图
    {}

    //! 返回交互式对象的类型
    virtual AIS_KindOfInteractive Type() const override { return AIS_KindOfInteractive_Object; }

    //! 返回交互式对象的签名
    virtual Standard_Integer Signature() const override { return 1; }

    //! 更新呈现
    virtual void Compute(const Standard_Integer theMode) override
    {
        // 实现根据显示模式索引计算呈现的逻辑
        // 这里简化为打印信息
        std::cout << "Compute presentation for mode: " << theMode << std::endl;
    }

    //! 更新选择
    virtual void ComputeSelection(const Standard_Integer theMode) override
    {
        // 实现根据选择模式索引计算可选择实体的逻辑
        // 这里简化为打印信息
        std::cout << "Compute selection for mode: " << theMode << std::endl;
    }

    //! 处理拖动操作
    virtual Standard_Boolean ProcessDragging(const Handle(AIS_InteractiveContext)& theCtx,
                                             const Handle(V3d_View)& theView,
                                             const Handle(SelectMgr_EntityOwner)& theOwner,
                                             const Graphic3d_Vec2i& theDragFrom,
                                             const Graphic3d_Vec2i& theDragTo,
                                             const AIS_DragAction theAction) override
    {
        // 实现处理拖动操作的逻辑
        // 这里简化为打印信息
        std::cout << "Processing dragging action" << std::endl;
        return Standard_True; // 返回 true 表示接受拖动操作
    }
};

int main()
{
    // 创建交互式上下文
    Handle(AIS_InteractiveContext) context = new AIS_InteractiveContext;

    // 创建自定义交互式对象
    Handle(MyInteractiveObject) myObject = new MyInteractiveObject;

    // 设置交互式上下文
    myObject->SetContext(context);

    // 添加对象到交互式上下文中
    context->Display(myObject, Standard_True);

    // 执行呈现和选择计算
    myObject->Compute(1); // 假设计算显示模式为 1
    myObject->ComputeSelection(1); // 假设计算选择模式为 1

    // 模拟拖动操作
    Graphic3d_Vec2i dragFrom(0, 0);
    Graphic3d_Vec2i dragTo(100, 100);
    myObject->ProcessDragging(context, context->CurrentViewer()->ActiveView(),
                              myObject->GetOwner(), dragFrom, dragTo, AIS_DragAction_Move);

    return 0;
}

解释示例代码:

  1. 包含头文件:包含了用于OpenCascade图形操作的必要头文件,例如AIS_InteractiveObject.hxxAIS_InteractiveContext.hxx等。

  2. 自定义交互式对象类 MyInteractiveObject:继承了 AIS_InteractiveObjectPrsMgr_PresentableObjectSelectMgr_SelectableObject,表示一个具有显示和选择功能的交互式对象。

  3. 构造函数:初始化 AIS_InteractiveObject,设置呈现对象的类型为所有视图 (PrsMgr_TOP_AllView)。

  4. 重写 Type() 和 Signature() 方法:返回交互式对象的类型和签名。

  5. 重写 Compute() 和 ComputeSelection() 方法:根据给定的显示模式索引和选择模式索引计算呈现和选择的逻辑。这里简化为打印信息。

  6. 重写 ProcessDragging() 方法:处理拖动操作的逻辑。这里简化为打印信息,并返回 Standard_True 表示接受拖动操作。

  7. 主函数 main()

    • 创建了一个交互式上下文 context
    • 创建了自定义交互式对象 myObject
    • 将交互式对象添加到交互式上下文中,并显示出来。
    • 执行了呈现和选择的计算,以及模拟了拖动操作。

这个示例展示了如何创建和使用 AIS_InteractiveObject 类来管理交互式图形对象,并对其进行呈现、选择和拖动操作的处理。

参考

posted @ 2024-07-31 08:45  一点灯  阅读(0)  评论(0编辑  收藏  举报  来源