opencascade AIS_WalkDelta、AIS_ViewInputBuffer源码学习工作

news/2024/9/30 23:07:18

opencascade AIS_WalkDelta

前言

运行
在这里插入图片描述

方法

1.

空构造函数。
AIS_WalkDelta()
: myIsDefined(false), myIsJumping(false), myIsCrouching(false), myIsRunning(false) {}

2.

返回平移组件。
const AIS_WalkPart& operator[] (AIS_WalkTranslation thePart) ;

3.

返回平移组件。
AIS_WalkPart& operator[] (AIS_WalkTranslation thePart)

4.

返回旋转组件。
const AIS_WalkPart& operator[] (AIS_WalkRotation thePar

5.

返回旋转组件。
AIS_WalkPart& operator[] (AIS_WalkRotation thePart)

6.

返回跳跃状态。
bool IsJumping()

7.

设置跳跃状态。
void SetJumping(bool theIsJumping)

8.

返回蹲下状态。
bool IsCrouching()

9.

设置蹲下状态。
void SetCrouching(bool theIsCrouching)

10.

返回运行状态。
bool IsRunning() const { return myIsRunning; }

11.

设置运行状态。
void SetRunning(bool theIsRunning)

12.

如果即使从上一帧的增量为空,导航键仍被按下,则返回 TRUE。
bool IsDefined()

13.

设置是否有任何导航键被按下。
void SetDefined(bool theIsDefined) { myIsDefined = theIsDefined; }

14.

当旋转和平移增量都为空时返回 TRUE。
bool IsEmpty() const { return !ToMove() && !ToRotate(); }

15.

如果平移增量被定义则返回 TRUE。
bool ToMove()

16.

如果旋转增量被定义则返回 TRUE。
bool ToRotate()

使用示例

AIS_WalkDelta 是 OpenCASCADE 库的一部分,用于处理 3D 视图中步行导航的状态和动作。虽然 OpenCASCADE 的文档中可能没有明确的示例,但我们可以根据 AIS_WalkDelta 类的功能,编写一个假想的使用示例,展示如何在应用程序中设置和获取步行状态。

下面是一个简单的代码示例,演示如何使用 AIS_WalkDelta 来管理步行的状态:

#include <AIS_WalkDelta.hxx>
#include <AIS_WalkPart.hxx>
#include <iostream>// 模拟一个函数来检查和打印步行状态
void PrintWalkState(const AIS_WalkDelta& walkDelta) {std::cout << "Jumping: " << (walkDelta.IsJumping() ? "Yes" : "No") << std::endl;std::cout << "Crouching: " << (walkDelta.IsCrouching() ? "Yes" : "No") << std::endl;std::cout << "Running: " << (walkDelta.IsRunning() ? "Yes" : "No") << std::endl;if (walkDelta.ToMove()) {std::cout << "Moving: Yes" << std::endl;} else {std::cout << "Moving: No" << std::endl;}if (walkDelta.ToRotate()) {std::cout << "Rotating: Yes" << std::endl;} else {std::cout << "Rotating: No" << std::endl;}
}int main() {// 创建一个 AIS_WalkDelta 对象AIS_WalkDelta walkDelta;// 设置运行状态walkDelta.SetJumping(true);walkDelta.SetCrouching(false);walkDelta.SetRunning(true);// 模拟一些平移和旋转设置AIS_WalkPart translationPart;translationPart.SetDelta(1.0); // 假设有一个增量walkDelta[AIS_WalkTranslation_Forward] = translationPart;AIS_WalkPart rotationPart;rotationPart.SetDelta(0.5); // 假设有一个旋转增量walkDelta[AIS_WalkRotation_Yaw] = rotationPart;// 打印当前的步行状态PrintWalkState(walkDelta);return 0;
}

示例说明

  1. 创建 AIS_WalkDelta 实例:我们创建了一个 AIS_WalkDelta 对象 walkDelta 来管理步行的状态。

  2. 设置状态:使用 SetJumpingSetCrouchingSetRunning 函数来设置步行的状态。

  3. 设置平移和旋转:使用 AIS_WalkTranslationAIS_WalkRotation 设置对象的平移和旋转状态。这里,我们为每个状态分配了一个假想的增量。

  4. 打印状态:通过调用 PrintWalkState 函数,打印当前的步行状态,包括是否在跳跃、蹲下、奔跑,以及是否有平移和旋转的增量。

参考

opencascade AIS_ViewInputBuffer

前言

定义查看器事件的辅助结构
在这里插入图片描述

方法

1

bool IsNewGesture; //!< 从一个动作过渡到另一个动作

2

NCollection_Sequence<Aspect_ScrollDelta> ZoomActions; //!< 缩放操作队列

3

struct _orientation
{
bool ToFitAll; //!< 执行 FitAll 操作
bool ToSetViewOrient; //!< 设置新的视图方向
V3d_TypeOfOrientation ViewOrient; //!< 新的视图方向
_orientation() : ToFitAll(false), ToSetViewOrient(false), ViewOrient(V3d_Xpos) {}
} Orientation;

4

struct _highlighting
{
bool ToHilight; //!< 在指定点执行动态高亮
Graphic3d_Vec2i Point; //!< 动态高亮的新点
_highlighting() : ToHilight(false) {}
} MoveTo;

5

struct _selection
{
AIS_ViewSelectionTool Tool; //!< 执行选择
AIS_SelectionScheme Scheme; //!< 选择方案
NCollection_Sequence<Graphic3d_Vec2i>
Points; //!< 选择点
bool ToApplyTool; //!< 应用橡皮筋选择工具
_selection() : Tool(AIS_ViewSelectionTool_Picking), Scheme(AIS_SelectionScheme_UNKNOWN), ToApplyTool(false) {}
} Selection;

6

struct _panningParams
{
bool ToStart; //!< 开始平移
Graphic3d_Vec2i PointStart; //!< 平移起点
bool ToPan; //!< 执行平移
Graphic3d_Vec2i Delta; //!< 平移增量
_panningParams() : ToStart(false), ToPan(false) {}
} Panning;

7

struct _draggingParams
{
bool ToStart; //!< 开始拖动
bool ToMove; //!< 执行拖动
bool ToStop; //!< 停止拖动
bool ToAbort; //!< 中止拖动(恢复之前的位置)
Graphic3d_Vec2i PointStart; //!< 拖动起点
Graphic3d_Vec2i PointTo; //!< 拖动终点
_draggingParams() : ToStart(false), ToMove(false), ToStop(false), ToAbort(false) {}
} Dragging;

8

struct _orbitRotation
{
bool ToStart; //!< 开始轨道旋转
Graphic3d_Vec2d PointStart; //!< 轨道旋转起点
bool ToRotate; //!< 执行轨道旋转
Graphic3d_Vec2d PointTo; //!< 轨道旋转终点
_orbitRotation() : ToStart(false), ToRotate(false) {}
} OrbitRotation;

9

struct _viewRotation
{
bool ToStart; //!< 开始视图旋转
Graphic3d_Vec2d PointStart; //!< 视图旋转起点
bool ToRotate; //!< 执行视图旋转
Graphic3d_Vec2d PointTo; //!< 视图旋转终点
_viewRotation() : ToStart(false), ToRotate(false) {}
} ViewRotation;

10

struct _zrotateParams
{
Graphic3d_Vec2i Point; //!< Z 轴旋转起点
double Angle; //!< Z 轴旋转角度
bool ToRotate; //!< 开始 Z 轴旋转
_zrotateParams() : Angle(0.0), ToRotate(false) {}
} ZRotate;

11

重置事件缓冲区。
void Reset()

示例:使用 AIS_ViewInputBuffer

这个例子演示了如何在 OpenCASCADE 应用程序中使用 AIS_ViewInputBuffer 来处理 3D 查看器的用户输入事件。

#include <AIS_InteractiveContext.hxx>
#include <V3d_View.hxx>
#include <AIS_ViewInputBuffer.hxx>
#include <AIS_ViewController.hxx>
#include <Aspect_Handle.hxx>
#include <Aspect_VKeyMouse.hxx>
#include <Aspect_VKeyFlags.hxx>
#include <Graphic3d_Vec2.hxx>
#include <iostream>// Function to simulate handling events
void HandleViewerEvents(AIS_ViewInputBuffer& inputBuffer, const Handle(AIS_InteractiveContext)& context, const Handle(V3d_View)& view)
{// Example: Check if a new gesture has startedif (inputBuffer.IsNewGesture){std::cout << "New gesture started!" << std::endl;inputBuffer.IsNewGesture = false; // Reset the gesture flag after handling}// Example: Handle zoom actionsfor (const auto& zoomDelta : inputBuffer.ZoomActions){std::cout << "Zooming by delta: " << zoomDelta.Delta << std::endl;view->SetZoom(zoomDelta.Delta);}inputBuffer.ZoomActions.Clear(); // Clear zoom actions after processing// Example: Handle panningif (inputBuffer.Panning.ToPan){std::cout << "Panning with delta: (" << inputBuffer.Panning.Delta.x() << ", " << inputBuffer.Panning.Delta.y() << ")" << std::endl;view->Pan(inputBuffer.Panning.Delta.x(), inputBuffer.Panning.Delta.y());inputBuffer.Panning.ToPan = false; // Reset panning flag after handling}// Example: Handle rotationif (inputBuffer.ViewRotation.ToRotate){std::cout << "Rotating view from: (" << inputBuffer.ViewRotation.PointStart.x() << ", " << inputBuffer.ViewRotation.PointStart.y()<< ") to (" << inputBuffer.ViewRotation.PointTo.x() << ", " << inputBuffer.ViewRotation.PointTo.y() << ")" << std::endl;view->Rotate(inputBuffer.ViewRotation.PointStart.x(), inputBuffer.ViewRotation.PointStart.y(),inputBuffer.ViewRotation.PointTo.x(), inputBuffer.ViewRotation.PointTo.y());inputBuffer.ViewRotation.ToRotate = false; // Reset rotation flag after handling}// Example: Handle selectionif (inputBuffer.Selection.ToApplyTool){std::cout << "Applying selection tool" << std::endl;context->Select(true); // Assume some selection mechanisminputBuffer.Selection.ToApplyTool = false; // Reset selection tool flag after handling}
}int main()
{// Initialize application componentsHandle(V3d_Viewer) viewer; // Assume this is properly initializedHandle(AIS_InteractiveContext) context = new AIS_InteractiveContext(viewer);Handle(V3d_View) view = viewer->CreateView();// Create input bufferAIS_ViewInputBuffer inputBuffer;// Simulate some inputsinputBuffer.IsNewGesture = true;// Simulate a zoom actionAspect_ScrollDelta zoomDelta;zoomDelta.Delta = 1.1;inputBuffer.ZoomActions.Append(zoomDelta);// Simulate a panning actioninputBuffer.Panning.ToPan = true;inputBuffer.Panning.Delta = Graphic3d_Vec2i(5, 10);// Simulate a rotationinputBuffer.ViewRotation.ToRotate = true;inputBuffer.ViewRotation.PointStart = Graphic3d_Vec2d(100, 100);inputBuffer.ViewRotation.PointTo = Graphic3d_Vec2d(150, 150);// Handle the simulated eventsHandleViewerEvents(inputBuffer, context, view);return 0;
}

代码解释

  • 初始化:在示例中,初始化了必要的 OpenCASCADE 组件,如 V3d_ViewerAIS_InteractiveContextV3d_View。创建了一个 AIS_ViewInputBuffer 来存储事件数据。

  • 事件处理

    • 手势:代码检查是否开始了新的手势,并通过打印消息进行处理。
    • 缩放:遍历 ZoomActions 中的每个缩放增量,并将其应用于视图。
    • 平移:检查是否请求平移,并将平移增量应用于视图。
    • 旋转:处理视图旋转,使用起始点和终止点进行操作。
    • 选择:检查是否需要应用选择工具,并执行选择操作。
  • 模拟输入:示例中模拟了一些用户输入,如缩放、平移和旋转操作,以展示如何使用 AIS_ViewInputBuffer

这个示例提供了一个基本框架,演示了如何使用 AIS_ViewInputBuffer 在 OpenCASCADE 中处理各种查看器交互。

参考
参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66674.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

2023-9-30

标签之文本标签列表标签之有序列表列表标签之无序列表

[物理]运动学基础理论串讲

运动学基础理论串讲 公式 推论 前言:运动学中,所有的公式都有其对应的几何意义。解决问题时,我们不应死套公式,应当在图像中解决问题。在图像中看清问题的本质。 \(v_t=v_0+at\)。已知初速度和加速度求末速度。 \(x=v_0t+\dfrac{1}{2}at^2\)。算位移的基础公式。 \(v_t^2-…

深度学习(输出模型中间特征)

深度学习骨干网络一般会包含很多层,这里写了一个脚本,可以保存骨干网络的所有特征图。 代码主要用了get_graph_node_names和create_featrue_extractor这两个函数。 get_graph_node_names是得到所有特征节点名字。 create_featrue_extractor是提取对应节点输出的特征tensor。 …

9月30日记录

完成了一个能够列出30道四则运算的java程序, 题目要求:乘法不超过四位数,减法大于零,除法结果为整数; 实现可视化界面,并且能够计算得分与计时;点击查看代码 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.Actio…

9.28 开发MES系统日志四

今天开发MES系统的流程图以及数据库表,因为对MES系统的不了解,所以先加上了最基本的人员管理以及车间管理等基本表信息。

Connector C++ 连接 MySQL 数据库之增删改查

在 vcpkg 中折腾了 mysql-connector-cpp 8.0 很久,一直连接不上远程数据库,后面查官方文档,mysql-connector-cpp 8.0 好像只支持 MySQL 8.0 以上的数据库,本来想把远程服务器上的 MySQL 升级到 MySQL 8.0,后面发现测试服务器的配置有点拉跨,架不住 MySQL 8.0,但是 vcpkg…

Hadoop 配置hbase

首先要启动hadoop start-dfs.shstart-yarn.sh 查看一下自己的hadoop版本,确保自己下载的hbase与自己的hadoop版本匹配 hadoop version Index of /apache/hbase (tsinghua.edu.cn) 下载hbase 选择倒数第三个下载 下载完成后 进入 /export/server/ 上传压缩包后 完成解压 重命…

.net core elsa工作流程框架源码学习之Pipeline管道的理解

elsa这个框架运用管道来实现切面编程,切面编程的意义我的理解是在于:把业务逻辑和其他与业务不相关的逻辑进行解耦,或者把通用的逻辑:异常处理,日志处理等在不侵入业务逻辑的情况下,服务与这些业务。接下来,详细看看elsa框架的管道是怎么实现的。 主要依靠,下面这个委托…