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 的官方文档和示例代码。
参考