opencascade AIS_MouseGesture AIS_MultipleConnectedInteractive源码学习 原创

AIS_MouseGesture

//! 鼠标手势 - 同一时刻只能激活一个。  
enum AIS_MouseGesture  
{  
  AIS_MouseGesture_NONE,            //!< 无激活手势  
  //  
  AIS_MouseGesture_SelectRectangle, //!< 矩形选择;  
                                    //!  按下按钮开始,移动鼠标定义矩形,释放完成  
  AIS_MouseGesture_SelectLasso,     //!< 多边形选择;  
                                    //!  按下按钮开始,移动鼠标定义多边形路径,释放完成  
  //  
  AIS_MouseGesture_Zoom,            //!< 视图缩放手势;  
                                    //!  向左移动鼠标缩小,向右移动鼠标放大  
  AIS_MouseGesture_ZoomWindow,      //!< 通过窗口缩放视图手势;  
                                    //!  按下按钮开始,移动鼠标定义矩形,释放完成  
  AIS_MouseGesture_Pan,             //!< 视图平移手势  
  AIS_MouseGesture_RotateOrbit,     //!< 轨道旋转手势  
  AIS_MouseGesture_RotateView,      //!< 视图旋转手势  
  AIS_MouseGesture_Drag,            //!< 对象拖拽;  
                                    //!  按下按钮开始,移动鼠标定义矩形,释放完成  
};  

//! 定义鼠标手势的映射。
typedef NCollection_DataMap<unsigned int, AIS_MouseGesture> AIS_MouseGestureMap;
typedef NCollection_DataMap<unsigned int, AIS_SelectionScheme> AIS_MouseSelectionSchemeMap;

AIS_MultipleConnectedInteractive

前言

通过汇集多个对象表示来定义一个交互对象。
这是通过交互对象列表来实现的。
这些也可以是连接的对象。
这样就可以避免进行耗时的表示计算。
在这里插入图片描述

方法

1

空构造函数。
Standard_EXPORT AIS_MultipleConnectedInteractive();

2

析构函数。
Standard_EXPORT virtual ~AIS_MultipleConnectedInteractive();

3

设置回调函数,用于在队列进度时调用(例如,当需要显示新帧时)。
void SetCallback (Graphic3d_MediaTextureSet::CallbackOnUpdate_t theCallbackFunction, void* theCallbackUserPtr)
{
myFramePair->SetCallback (theCallbackFunction, theCallbackUserPtr);
}

4

打开指定文件。
Standard_EXPORT void OpenInput (const TCollection_AsciiString& thePath,
Standard_Boolean theToWait);

5

显示新帧。
Standard_EXPORT bool PresentFrame (const Graphic3d_Vec2i& theLeftCorner,
const Graphic3d_Vec2i& theMaxSize);

6

返回播放器上下文。
const Handle(Media_PlayerContext)& PlayerContext() const { return myFramePair->PlayerContext(); }

7

切换播放状态。
Standard_EXPORT void PlayPause();

8

安排关闭播放器。
void SetClosePlayer()
{
myToClosePlayer = true;
myFramePair->Notify();
}

9

返回持续时间。
double Duration() const { return myFramePair->Duration(); }

//! @name AIS_InteractiveObject 接口
protected:

10

仅接受显示模式0。
virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE { return theMode == 0; }

11

计算演示文稿。
Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager)& thePrsMgr,
const Handle(Prs3d_Presentation)& thePrs,
const Standard_Integer theMode) Standard_OVERRIDE;

12

计算选择。
Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSel,
const Standard_Integer theMode) Standard_OVERRIDE;

protected:

13

更新帧大小。
Standard_EXPORT bool updateSize (const Graphic3d_Vec2i& theLeftCorner,
const Graphic3d_Vec2i& theMaxSize);

示例

AIS_MultipleConnectedInteractive 是 OpenCascade 中用于表示与多个其他交互对象连接的交互对象。它允许在同一对象中显示和操作多个相关联的几何对象。以下是 AIS_MultipleConnectedInteractive 的用法示例:

1. 包含必要的头文件

首先,确保在代码中包含必要的 OpenCascade 头文件:

#include <AIS_MultipleConnectedInteractive.hxx>
#include <AIS_InteractiveContext.hxx>
#include <AIS_Shape.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <V3d_View.hxx>
#include <TopLoc_Location.hxx>

2. 创建几何对象和上下文

创建一些几何对象,并初始化一个 AIS_InteractiveContext

Handle(V3d_Viewer) viewer = ...; // 已初始化的视图器
Handle(AIS_InteractiveContext) context = new AIS_InteractiveContext(viewer);

// 创建两个几何对象
TopoDS_Shape box1 = BRepPrimAPI_MakeBox(100.0, 100.0, 100.0).Shape();
TopoDS_Shape box2 = BRepPrimAPI_MakeBox(50.0, 50.0, 50.0).Shape();

Handle(AIS_Shape) aisBox1 = new AIS_Shape(box1);
Handle(AIS_Shape) aisBox2 = new AIS_Shape(box2);

// 显示几何对象
context->Display(aisBox1, Standard_True);
context->Display(aisBox2, Standard_True);

3. 创建 AIS_MultipleConnectedInteractive

创建一个 AIS_MultipleConnectedInteractive 对象,并将其连接到多个几何对象:

Handle(AIS_MultipleConnectedInteractive) multiConnInteractive = new AIS_MultipleConnectedInteractive();

// 将第一个几何对象连接到多连接交互对象
multiConnInteractive->Connect(aisBox1, aisBox1->LocalTransformationGeom(), aisBox1->TransformPersistence());

// 将第二个几何对象连接到多连接交互对象
multiConnInteractive->Connect(aisBox2, aisBox2->LocalTransformationGeom(), aisBox2->TransformPersistence());

// 显示多连接交互对象
context->Display(multiConnInteractive, Standard_True);

4. 操作多连接交互对象

你可以通过 AIS_InteractiveContext 操作多连接交互对象,例如旋转、平移等:

// 平移多连接交互对象
gp_Trsf translation;
translation.SetTranslation(gp_Vec(10.0, 0.0, 0.0));
multiConnInteractive->SetLocalTransformation(translation);
context->Redisplay(multiConnInteractive, Standard_True);

// 旋转多连接交互对象
gp_Trsf rotation;
rotation.SetRotation(gp::OX(), M_PI / 4);
multiConnInteractive->SetLocalTransformation(rotation);
context->Redisplay(multiConnInteractive, Standard_True);

5. 处理鼠标事件

你可以处理鼠标事件来交互式操作多连接对象:

void OnMouseClick(const Handle(V3d_View)& aView, Standard_Integer x, Standard_Integer y) {
    context->MoveTo(x, y, aView);
    if (context->HasDetected()) {
        Handle(AIS_InteractiveObject) detectedObj = context->DetectedInteractive();
        if (!detectedObj.IsNull() && detectedObj == multiConnInteractive) {
            // 选中了多连接交互对象
            context->StartTransformation(aView, x, y);
        }
    }
}

总结

AIS_MultipleConnectedInteractive 是一个强大的工具,可以帮助用户管理和显示多个相关联的几何对象。通过设置适当的变换矩阵,可以实现对多个对象的各种操作,从而极大地增强了用户的交互体验。如果需要更详细的示例和高级用法,建议查阅 OpenCascade 的官方文档和示例代码。
参考

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