opencascade AIS_MouseGesture AIS_MultipleConnectedInteractive源码学习

AIS_MouseGesture

cpp 复制代码
//! 鼠标手势 - 同一时刻只能激活一个。  
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 头文件:

cpp 复制代码
#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

cpp 复制代码
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 对象,并将其连接到多个几何对象:

cpp 复制代码
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 操作多连接交互对象,例如旋转、平移等:

cpp 复制代码
// 平移多连接交互对象
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. 处理鼠标事件

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

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

相关推荐
南宫生28 分钟前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
技术小齐1 小时前
网络运维学习笔记 016网工初级(HCIA-Datacom与CCNA-EI)PPP点对点协议和PPPoE以太网上的点对点协议(此处只讲华为)
运维·网络·学习
竹言笙熙1 小时前
代码审计初探
学习·web安全
日记成书1 小时前
物联网智能项目
物联网·学习
虾球xz1 小时前
游戏引擎学习第118天
学习·游戏引擎
gz927cool2 小时前
大模型做导师之开源项目学习(lightRAG)
学习·开源·mfc
世事如云有卷舒3 小时前
FreeRTOS学习笔记
笔记·学习
靡不有初1114 小时前
CCF-CSP第18次认证第一题——报数【两个与string相关的函数的使用】
c++·学习·ccfcsp
gu205 小时前
c#编程:学习Linq,重几个简单示例开始
开发语言·学习·c#·linq
小蒜学长6 小时前
医疗报销系统的设计与实现(代码+数据库+LW)
数据库·spring boot·学习·oracle·课程设计