opencascade AIS_Manipulator源码学习

前言

AIS_Manipulator 是 OpenCASCADE 库中的一个类,用于在3D空间中对其他交互对象或一组对象进行局部变换。该类提供了直观的操控方式,使用户可以通过鼠标进行平移、缩放和旋转等操作。
在这里插入图片描述

详细功能

交互对象类,通过鼠标操控另一个交互对象或一组对象的局部变换。
它管理3D空间中的三种操作类型:

  • 通过轴进行平移
  • 轴内缩放
  • 围绕轴旋转
    要启用这些模式之一,需要激活选择模式(从1到3)。
    操作器的位置信息定义了三个正交变换轴。可以为每个轴或所有轴禁用特定的变换模式。
    此外,每个轴可以被隐藏或显示。
    以下步骤演示了如何为交互对象附加、配置和使用操作器:
    步骤1. 创建操作器对象并调整其外观:
   Handle(AIS_Manipulator) aManipulator = new AIS_Manipulator();aManipulator->SetPart (0, AIS_Manipulator::Scaling, Standard_False);aManipulator->SetPart (1, AIS_Manipulator::Rotation, Standard_False);

// 将操作器附加到已显示的对象,并管理操作模式

 aManipulator->AttachToObject (anAISObject);aManipulator->EnableMode (AIS_Manipulator::Translation);aManipulator->EnableMode (AIS_Manipulator::Rotation);aManipulator->EnableMode (AIS_Manipulator::Scaling);

请注意,你可以只启用一种操作模式,但显示所有的可视部分。
这段代码允许你查看操作器并选择其操作部分。
请注意,操作器在部分选择时激活模式。
如果此模式已激活,则不会对操作器进行选择。
它可以通过高亮显示激活。启用此功能:

  aManipulator->SetModeActivationOnDetection (Standard_True);

步骤2. 在事件处理链中使用以下代码对对象进行变换:
// 捕捉鼠标按下事件

  if (aManipulator->HasActiveMode()){aManipulator->StartTransform (anXPix, anYPix, aV3dView);}


// 或者跟踪鼠标移动事件

  if (aManipulator->HasActiveMode()){aManipulator->Transform (anXPix, anYPix, aV3dView);aV3dView->Redraw();}


// 或者捕捉鼠标释放事件(应用)或逃逸事件(取消)

  aManipulator->StopTransform(/*Standard_Boolean toApply*/);

步骤3. 要停用当前操作模式使用:

  aManipulator->DeactivateCurrentMode();

步骤4. 要从对象上分离操作器使用:

  aManipulator->Detach();

最后一个方法会删除操作器对象。
AIS_Manipulator 是 OpenCASCADE 库中的一个类,用于在3D空间中对其他交互对象或一组对象进行局部变换。该类提供了直观的操控方式,使用户可以通过鼠标进行平移、缩放和旋转等操作。以下是 AIS_Manipulator 类的详细介绍:

主要功能

AIS_Manipulator 管理 3D 空间中的三种主要变换操作:

  1. 平移:沿着指定的轴进行移动。
  2. 缩放:沿着指定的轴进行缩放。
  3. 旋转:围绕指定的轴进行旋转。

变换模式

要启用某种变换模式,需要激活对应的选择模式(从 1 到 3)。操作器的位置信息定义了三个正交变换轴。可以为每个轴或所有轴禁用特定的变换模式。此外,每个轴可以被隐藏或显示。

方法

使用步骤

步骤 1: 创建并配置操作器对象
Handle(AIS_Manipulator) aManipulator = new AIS_Manipulator();
aManipulator->SetPart (0, AIS_Manipulator::Scaling, Standard_False);
aManipulator->SetPart (1, AIS_Manipulator::Rotation, Standard_False);
步骤 2: 将操作器附加到对象并管理操作模式
aManipulator->AttachToObject (anAISObject);
aManipulator->EnableMode (AIS_Manipulator::Translation);
aManipulator->EnableMode (AIS_Manipulator::Rotation);
aManipulator->EnableMode (AIS_Manipulator::Scaling);
步骤 3: 启用检测时激活模式
aManipulator->SetModeActivationOnDetection (Standard_True);
步骤 4: 在事件处理链中使用操作器进行变换
// 捕捉鼠标按下事件
if (aManipulator->HasActiveMode())
{aManipulator->StartTransform (anXPix, anYPix, aV3dView);
}
// 跟踪鼠标移动事件
if (aManipulator->HasActiveMode())
{aManipulator->Transform (anXPix, anYPix, aV3dView);aV3dView->Redraw();
}
// 捕捉鼠标释放事件(应用)或逃逸事件(取消)
aManipulator->StopTransform(/*Standard_Boolean toApply*/);
步骤 5: 停用当前变换模式
aManipulator->DeactivateCurrentMode();
步骤 6: 从对象上分离操作器
aManipulator->Detach();

代码示例

下面是一个完整的示例,演示如何使用 AIS_Manipulator 来操控一个交互对象:

#include <AIS_Manipulator.hxx>
#include <AIS_Shape.hxx>
#include <V3d_View.hxx>
#include <Geom_CartesianPoint.hxx>
#include <TopoDS_Shape.hxx>
#include <BRepPrimAPI_MakeBox.hxx>// 创建一个形状
TopoDS_Shape aBox = BRepPrimAPI_MakeBox(100, 100, 100).Shape();
Handle(AIS_Shape) anAISObject = new AIS_Shape(aBox);// 创建并配置操作器
Handle(AIS_Manipulator) aManipulator = new AIS_Manipulator();
aManipulator->SetPart (0, AIS_Manipulator::Scaling, Standard_False);
aManipulator->SetPart (1, AIS_Manipulator::Rotation, Standard_False);// 将操作器附加到对象并启用操作模式
aManipulator->AttachToObject(anAISObject);
aManipulator->EnableMode(AIS_Manipulator::Translation);
aManipulator->EnableMode(AIS_Manipulator::Rotation);
aManipulator->EnableMode(AIS_Manipulator::Scaling);// 启用检测时激活模式
aManipulator->SetModeActivationOnDetection(Standard_True);// 在事件处理中进行变换
// 捕捉鼠标按下事件
if (aManipulator->HasActiveMode())
{aManipulator->StartTransform(anXPix, anYPix, aV3dView);
}
// 跟踪鼠标移动事件
if (aManipulator->HasActiveMode())
{aManipulator->Transform(anXPix, anYPix, aV3dView);aV3dView->Redraw();
}
// 捕捉鼠标释放事件(应用)或逃逸事件(取消)
aManipulator->StopTransform(/*Standard_Boolean toApply*/);// 停用当前变换模式
aManipulator->DeactivateCurrentMode();// 从对象上分离操作器
aManipulator->Detach();

通过以上步骤和示例代码,用户可以在 OpenCASCADE 应用中使用 AIS_Manipulator 类来实现对三维对象的直观变换操作。

示例

1

构造一个具有默认位置并显示所有部分的操作器对象。
Standard_EXPORT AIS_Manipulator();

2

构造一个具有输入位置和轴位置并显示所有部分的操作器对象。
Standard_EXPORT AIS_Manipulator (const gp_Ax2& thePosition);

3

禁用或启用某个轴上的平移、旋转或缩放的可视部分。

3

默认情况下所有部分都是启用的(将显示)。
启用或禁用操作器的可视部分不会管理操作(选择)模式。
如果轴索引 < 0 或 > 2,则会引发程序错误。
Standard_EXPORT void SetPart (const Standard_Integer theAxisIndex, const AIS_ManipulatorMode theMode, const Standard_Boolean theIsEnabled);

4

禁用或启用所有轴上的平移、旋转或缩放的可视部分。
默认情况下所有部分都是启用的(将显示)。
启用或禁用操作器的可视部分不会管理操作(选择)模式。
如果轴索引 < 0 或 > 2,则会引发程序错误。
Standard_EXPORT void SetPart (const AIS_ManipulatorMode theMode, const Standard_Boolean theIsEnabled);

5

附加到输入的交互对象并在相同的上下文中显示。
它被放置在对象边界框的中心,其大小调整为对象边界框。
Standard_EXPORT void Attach (const Handle(AIS_InteractiveObject)& theObject, const OptionsForAttach& theOptions = OptionsForAttach());

6

附加到输入的交互对象组并在相同的上下文中显示。
它附加到第一个对象,但管理整个组的操作。
它被放置在对象边界框的中心,其大小调整为对象边界框。
Standard_EXPORT void Attach (const Handle(AIS_ManipulatorObjectSequence)& theObject, const OptionsForAttach& theOptions = OptionsForAttach());

7启用操作模式。

它在当前上下文中激活选择模式。
如果操作器未显示,则不会激活任何模式。
Standard_EXPORT void EnableMode (const AIS_ManipulatorMode theMode);

8

启用检测时激活模式(高亮显示)。
默认情况下,模式在选择操作器部分时激活。
如果启用此模式,选择部分将不起作用。
void SetModeActivationOnDetection (const Standard_Boolean theToEnable)

9

如果手动模式激活已启用,则返回 true。
Standard_Boolean IsModeActivationOnDetection() const

10

在查看器中拖动对象。

theCtx [in] 交互上下文
theView [in] 活动视图
heOwner [in] 检测到的实体所有者
theDragFrom [in] 拖动起点
theDragTo [in] 拖动终点
theAction [in] 拖动操作
如果对象拒绝拖动操作(例如 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) Standard_OVERRIDE;

11

初始化起始(参考)变换。
它在链中与 StartTransform-Transform(gp_Trsf)-StopTransform 一起使用,
仅用于自定义变换集。如果使用 Transform(const Standard_Integer, const Standard_Integer),
初始数据会自动设置,并在 DeactivateCurrentMode 调用时重置(如果尚未重置)。
Standard_EXPORT void StartTransform (const Standard_Integer theX, const Standard_Integer theY, const Handle(V3d_View)& theView);

12

将输入变换应用于拥有对象。
@remark 变换是使用 SetLocalTransformation 为拥有对象设置的。
操作器的位置也存储在本地变换中,因此无需重新显示对象。
它在链中与 StartTransform-Transform(gp_Trsf)-StopTransform 一起使用,
仅用于自定义变换集。
如果未初始化变换(通过 StartTransform() 调用),则不执行任何操作。
Standard_EXPORT void Transform (const gp_Trsf& aTrsf);

12

重置起始(参考)变换。

theToApply [in] 选择是否应用或取消已开始的变换。
它在链中与 StartTransform-Transform(gp_Trsf)-StopTransform 一起使用,
仅用于自定义变换集。

Standard_EXPORT void StopTransform (const Standard_Boolean theToApply = Standard_True);

13

应用从鼠标起始位置(在第一次 Transform() 调用时保存并在 DeactivateCurrentMode() 调用时重置)

14

到输入/输出鼠标位置(theX,theY)的变换。
Standard_EXPORT gp_Trsf Transform (const Standard_Integer theX, const Standard_Integer theY,
const Handle(V3d_View)& theView);

15

根据活动模式和输入运动矢量计算父对象的变换。
您可以使用此方法根据当前模式获取对象变换,或使用自己的算法为模式实现任何其他变换。
@return 父对象的变换。
Standard_EXPORT Standard_Boolean ObjectTransformation (const Standard_Integer theX, const Standard_Integer theY,
const Handle(V3d_View)& theView, gp_Trsf& theTrsf);

16

使当前选择的操作器部分变为非活动状态并重置当前轴索引和当前模式。
在调用后 HasActiveMode() 返回 false。
@sa HasActiveMode()
Standard_EXPORT void DeactivateCurrentMode();

17

从拥有对象中分离,并从上下文中移除自身。
Standard_EXPORT void Detach();

18

@return 所有拥有对象。
Standard_EXPORT Handle(AIS_ManipulatorObjectSequence) Objects() const;

19

@return 第一个(主导)拥有对象。
Standard_EXPORT Handle(AIS_InteractiveObject) Object() const;

20

@return 一个拥有对象。

21

@warning 如果 theIndex 大于拥有对象计数或小于 1,则引发程序错误。
Standard_EXPORT Handle(AIS_InteractiveObject) Object (const Standard_Integer theIndex) const;

22

@return 如果操作器附加到某个交互对象(有拥有对象),则返回 true。
Standard_Boolean IsAttached() const { return HasOwner(); }

23

@return 如果选择了操作器的某部分(变换模式处于活动状态,拥有对象可以变换),则返回 true。
Standard_Boolean HasActiveMode() const { return IsAttached() && myCurrentMode != AIS_MM_None; }

24

启用或禁用操作器的缩放持久模式。启用此模式后,演示将保持固定的屏幕大小。

启用此选项后,将覆盖变换持久性属性和局部变换以实现必要的视觉效果。
在启用缩放持久性时,修改 AttachToObjects 方法的 AdjustSize 参数的使用。

Standard_EXPORT void SetZoomPersistence (const Standard_Boolean theToEnable);

25

返回缩放持久模式的状态(启用或禁用)。
Standard_Boolean ZoomPersistence() const { return myIsZoomPersistentMode; }

26

返回缩放持久模式的状态(是否启用)。
Standard_Boolean ZoomPersistence() const { return myIsZoomPersistentMode; }

27

重新定义变换持久性管理以设置轴子演示的变换。

使用 ZoomPersistence 模式时,此交互对象不支持自定义变换持久性。在此模式下,此类会覆盖演示的变换持久性标志。
调试模式下,调用调试断言以捕获与 ZoomPersistence 模式的不兼容使用,在发布模式下默默无闻地不执行任何操作。
28

在启用缩放持久性时,重新考虑使用 AttachToObjects 方法中的 AdjustSize 参数。
Standard_EXPORT virtual void SetTransformPersistence (const Handle(Graphic3d_TransformPers)& theTrsfPers) Standard_OVERRIDE;

29

返回当前操作模式。
AIS_ManipulatorMode ActiveMode() const { return myCurrentMode; }

30

返回当前活动轴的索引。
Standard_Integer ActiveAxisIndex() const { return myCurrentIndex; }

31

返回操控器交互对象的位置。
const gp_Ax2& Position() const { return myPosition; }

32

设置操控器对象的位置。
Standard_EXPORT void SetPosition (const gp_Ax2& thePosition);

33

返回操控器的尺寸。
Standard_ShortReal Size() const { return myAxes[0].Size(); }

34

设置操控器立方体边界框的边长。
Standard_EXPORT void SetSize (const Standard_ShortReal theSideLength);

35

设置平移器、缩放器和旋转器子显示部分之间的间隔。
Standard_EXPORT void SetGap (const Standard_ShortReal theValue);

36

设置操控器执行变换动作的行为设置,无论它是否与被变换对象一起平移或旋转。
void SetTransformBehavior (const BehaviorOnTransform& theSettings) { myBehaviorOnTransform = theSettings; }

37

返回操控器变换动作的行为设置。
BehaviorOnTransform& ChangeTransformBehavior() { return myBehaviorOnTransform; }

38

返回操控器变换动作的行为设置。
const BehaviorOnTransform& TransformBehavior() const { return myBehaviorOnTransform; }

参考

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Django】 读取excel文件并在前端以网页形式显示-安装使用Pandas

文章目录 安装pandas写views写urls安装openpyxl重新调试 安装pandas Pandas是一个基于NumPy的Python数据分析库&#xff0c;可以从各种文件格式如CSV、JSON、SQL、Excel等导入数据&#xff0c;并支持多种数据运算操作&#xff0c;如归并、再成形、选择等。 更换pip源 pip co…

在 Postman 中设置全局 token

目录 问题描述解决方案 问题描述 在使用 Postman 进行接口测试时&#xff0c;经常会遇到在 Header 中添加 token 的情况。当接口数量较多时&#xff0c;需要为每个接口进行设置&#xff0c;而且当 token 失效时需要重新获取并设置&#xff0c;这样一来效率较低。 解决方案 下…

MSPM0G3507学习笔记1:开发环境_引脚认识与点灯

今日速通一款Ti的单片机用于电赛&#xff1a;MSPM0G3507 这里默认已经安装好了Keil5_MDK 首先声明一下: 因为是速成&#xff0c;所以需要一定单片机学习基础&#xff0c;然后我写的也不会详细&#xff0c;这个专栏的笔记也就是自己能看懂就行的目标~~~ 文章提供测试代码解…

Matlab进阶绘图第65期—带分组折线段的柱状图

带分组折线段的柱状图是在原始柱状图的基础上&#xff0c;在每组柱状图位置处分别添加折线段&#xff0c;以进行对比或添加额外信息。 由于Matlab中未收录带分组折线段的柱状图的绘制函数&#xff0c;因此需要大家自行设法解决。 本文使用自制的BarwithGroupedLine小工具进行…

「Ant Design」Antd 中卡片如何完全不展示内容区域、按需展示内容区域、不展示标题

前言 下面是默认的 Antd 卡片&#xff0c;由以下区域组成 处理 Antd 的 Card 展示形式大致有下面三种 卡片完全不展示内容区域 const App () > (<Card title"Default size card" extra{<a href"#">More</a>} style{{ width: 300 }}b…

SSRF过滤攻击

SSRF绕过&#xff1a; 靶场地址&#xff1a;重庆橙子科技SSRF靶场 这个是毫无过滤的直接读取&#xff0c;但是一般网站会设置有对SSRF的过滤&#xff0c;比如将IP地址过滤。 下面是常用的绕过方式&#xff1a; 1.环回地址绕过 http://127.0.0.1/flag.php http://017700…

C++11新特性——智能指针——参考bibi《 原子之音》的视频以及ChatGpt

智能指针 一、内存泄露1.1 内存泄露常见原因1.2 如何避免内存泄露 二、实例Demo2.1 文件结构2.2 Dog.h2.3 Dog.cpp2.3 mian.cpp 三、独占式智能指针:unique _ptr3.1 创建方式3.1.1 ⭐从原始(裸)指针转换&#xff1a;3.1.2 ⭐⭐使用 new 关键字直接创建&#xff1a;3.1.3 ⭐⭐⭐…

如何录制电脑内部声音?全方位介绍电脑录音软件:8款在线录音!(2024重新整理)

如何录制电脑内部声音&#xff1f;不管是娱乐圈还是现实生活&#xff0c;【录音】这个功能的重要性不言而喻。而电脑录音已在影视配音、音视频剪辑、会议记录、在线教育等多个领域发光发热&#xff01; 本文将为您推荐8款电脑录音软件&#xff0c;并详细介绍电脑录音的多种方式…

electron 网页TodoList工具打包成win桌面应用exe

参考&#xff1a; electron安装&#xff08;支持win、mac、linux桌面应用&#xff09; https://blog.csdn.net/weixin_42357472/article/details/140643624 TodoList工具 https://blog.csdn.net/weixin_42357472/article/details/140618446 electron打包过程&#xff1a; 要将…

51单片机-第五节-串口通信

1.什么是串口&#xff1f; 串口是通讯接口&#xff0c;实现两个设备的互相通信。 单片机自带UART&#xff0c;其中引脚有TXD发送端&#xff0c;RXD接收端。且电平标准为TTL&#xff08;5V为1,0V为0&#xff09;。 2.常见电平标准&#xff1a; &#xff08;1&#xff09;TTL电…

景区AR导航营销系统:技术解决方案与实施效益分析

随着旅游市场的竞争日益激烈&#xff0c;景区需要不断创新以吸引游客。景区 AR 导航将虚拟画面与现实场景相结合&#xff0c;为游客提供了更加直观、生动的导航服务。对于景区而言&#xff0c;这一创新技术无疑是吸引游客目光、提升景区知名度的有力武器。通过独特的 AR 导航体…

RockyLinux 9 PXE Server bios+uefi 自动化部署 RockLinux 8 9

pxe server 前言 PXE&#xff08;Preboot eXecution Environment&#xff0c;预启动执行环境&#xff09;是一种网络启动协议&#xff0c;允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器&#xff0c;它提供了启动镜像和引导加载程序&#xff0c;…

一款基于Cortex-M0+的单片机音频编解码 - CJC2100

USBCodec芯片可以对数字音频信号进行多种处理&#xff0c;例如增加音量、均衡调节、音效处理等。这些处理可以通过耳机的控制按钮来实现&#xff0c;让用户可以根据自己的喜好来调整音频效果。USBCodec芯片还可以控制噪声和失真的水平&#xff0c;以提供高品质的音频输出。噪声…

机器学习笔记-02-基础线性算法认识(问题-解答自查版)

前言 以下问题以Q&A形式记录&#xff0c;基本上都是笔者在初学一轮后&#xff0c;掌握不牢或者频繁忘记的点 Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系&#xff0c;也适合做查漏补缺和复盘。 本文可以让读者用作自查&#xff0c;答案在后面&#xff0…

2024世界技能大赛某省选拔赛“网络安全项目”B模块--操作系统取证解析

2024世界技能大赛某省选拔赛“网络安全项目”B模块--操作系统取证解析 任务一、操作系统取证解析:总结:任务一、操作系统取证解析: A 集团某电脑系统被恶意份子攻击并控制,怀疑其执行了破坏操作,窃取了集团内部的敏感信息,现请分析 A 集团提供的系统镜像和内存镜像,找到…

机会性加密技术:网络安全的新趋势

在当今数字化时代&#xff0c;网络安全已成为各行各业不可忽视的重要议题。随着网络攻击手段的不断演进&#xff0c;传统的加密方式已难以满足复杂多变的安全需求。机会性加密技术&#xff08;Opportunistic Encryption&#xff0c;简称OE&#xff09;&#xff0c;作为一种新兴…

基于Qt的视频剪辑

在Qt中进行视频剪辑可以通过多种方式实现&#xff0c;但通常需要使用一些额外的库来处理视频数据。以下是一些常见的方法和步骤&#xff1a; 使用FFmpeg FFmpeg是一个非常强大的多媒体框架&#xff0c;可以用来处理视频和音频数据。你可以使用FFmpeg的命令行工具或者其库来实现…

skynet 入门篇

文章目录 概述1.实现了actor模型2.实现了服务器的基础组件 环境准备centosubuntumac编译安装 ActorActor模型定义组成 Actor调度工作线程流程工作线程权重工作线程执行规则 小结 概述 skynet 是一个轻量级服务器框架&#xff0c;而不仅仅用于游戏&#xff1b; 轻量级有以下几…

react18+

主要是围绕函数式组件讲&#xff0c;18主要用就是函数式组件&#xff0c;学习前先熟悉下原生js的基本使用&#xff0c;主要是事件 1、UI操作 1.1、书写jsx标签语言 基本写法和原生如同一则&#xff0c;只是放在一个方法里面返回而已&#xff0c;我们称这样的写法为函数式组件…

ChatTTS(文本转语音) 一键本地安装爆火语音模型

想不想让你喜欢的文章&#xff0c;有着一个动听的配音&#xff0c;没错&#xff0c;他就可以实现。 ChatTTS 是一款专为对话场景设计的文本转语音模型&#xff0c;例如 LLM 助手对话任务。它支持英语和中文两种语言。 当下爆火模型&#xff0c;在Git收获23.5k的Star&#xff…