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.mzph.cn/news/875382.shtml

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

相关文章

git 操作汇总【迭代更新中】

文章目录 0x1初始化操作0x11 生成公钥0x12 配置账号和邮箱 0x20x21 拉取代码0x22 推送代码0x23 设置远端分支 0x30x31 提交mr 0x40x41 子模块0x42 子模块添加 0x1初始化操作 0x11 生成公钥 ssh-keygen0x12 配置账号和邮箱 git config --global user.name username git confi…

瀚高数据库初级考试认证

pg_dumpall可以转储全局角色和表空间信息 单选题2分 A. 是 B. 否 回答正确(2分) 答案&#xff1a; A 解析&#xff1a;pg_dumpall备份一个给定集簇中的每一个数据库&#xff0c;并且也保留了集簇范围的数据&#xff0c;如角色和表空间定义。 2. 自定义文件格式必须与pg_restore…

【网络安全】构建稳固与安全的网络环境:从“微软蓝屏”事件中汲取的教训

发生什么事了&#xff1f; 近日&#xff0c;一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅成为科技领域的热点新闻&#xff0c;更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件&#xff0c;源于美国电脑安全技术公司“众击”提供的一个…

用uniapp 及socket.io做一个简单聊天app1

####相关的表结构&#xff0c;用的是mysql 用户表&#xff08;Users&#xff09; 存储用户的基本信息。 CREATE TABLE Users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL,email VARCHAR(100) UNIQUE,created_a…

Layui Selcet选择框动态选择问题

前言 时隔多日我也是重新回归写作&#xff0c;高考已经完毕&#xff0c;我将继续我的文章创作&#xff0c;今天我将分享的是我在开发我自己的一个新项目所遇到的问题&#xff0c;这里预告一下我的新项目: VitaApi管理系统 这个系统可以看作是萌新源api管理系统的延续&#xff…

前端学习6——自学习梳理

dom操作&#xff1a;让js和Html真正交互起来 dom&#xff08;document object model&#xff09; 内含利用dom操作进行河北大学网页的简单设计() <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name&qu…

FreeBSD掉电导致ZFS无法识别,无法启动系统

一台FreeBSD系统的机器&#xff0c;前段时间刚刚新加载了第二快硬盘&#xff0c;具体操作见&#xff1a;FreeBSD在zfs挂接第二块ssd 硬盘_zfs不能attach附加硬盘-CSDN博客 问题&#xff1a;FreeBSD在一次掉电后&#xff0c;系统无法启动 启动时显示 FreeBSD/x86 boot Defau…

网络战时代的国家安全:策略、技术和国际合作

网络战时代的国家安全涉及到策略、技术和国际合作等多个方面。以下是对这些问题的简要概述&#xff1a; 网络战策略 网络战策略是指在现代战争中&#xff0c;通过网络技术进行的信息收集、处理、分析、调度和指挥等一系列行动&#xff0c;旨在同时影响和干扰对方的网络系统&am…

HarmonyOS鸿蒙应用开发-ZRouter让系统路由表变得更简单

介绍 ZRouter是基于Navigation系统路由表和Hvigor插件实现的动态路由方案。 系统路由表是API 12起开始支持的&#xff0c;可以帮助我们实现动态路由的功能&#xff0c;其目的是为了解决多个业务模块&#xff08;HAR/HSP&#xff09;之间解耦问题&#xff0c;从而实现业务的复…

【前端】[Spring] Spring Web MVC基础理论

[Spring] Spring Web MVC基础理论 Spring Web MVC&#xff08;简称Spring MVC&#xff09;是Spring框架中用于构建Web应用程序的一个模块&#xff0c;它实现了MVC&#xff08;Model-View-Controller&#xff09;设计模式。以下是对Spring Web MVC基础理论的详细解释&#xff1…

Redis高可用技术之持久化

一、Redis高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是一年有多少秒可以提供正常服务&#xff08;99.9%、99.99%、99.999%等&#xff09;。但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证提供…

【CSS】响应式设计

响应式设计是指通过⼀些技术⼿段&#xff0c;使得⽹站或应⽤在不同终端设备&#xff08;如桌⾯电脑、平板电脑、⼿机等&#xff09;上能够⾃适应地呈现最佳的⽤户体验。 ⼀种实现⽅式是使⽤流体⽹格布局和百分⽐尺⼨等技术&#xff0c;以便根据设备屏幕的宽度和⾼度等信息⾃适…

ubuntu24.04中Osdlyrics报错:canberra-gtk-module和daemon: GDBus.Error:org

OSD Lyrics 是一个桌面应用程序&#xff0c;用于查看与各种媒体播放器兼容的歌词&#xff08;比如Linux下最好的音乐播放器&#xff1a;audacious&#xff09;。它不是一个插件&#xff0c;而是一个独立的程序。OSD Lyrics在您的桌面上显示歌词&#xff0c;风格类似于KaraOK。它…

MySQL InnoDB事务隔离和并发控制面试题详解

1. 为什么 MySQL 使用 B+ 树作为索引而不是 B 树? MySQL 选择使用 B+ 树作为索引主要有以下几个原因: 减少 IO 次数,提高效率:B+ 树的所有数据都存储在叶子节点,非叶子节点只存储索引,树的高度较低,因此查找路径较短,减少了磁盘 IO 次数。查询效率更加稳定:由于数据仅…

Hyper-V 安装 CentOS 8.5

前言 Hyper-V安装文档:在 Windows 10 上安装 Hyper-VCentOS 系统下载:CentOS 国内镜像源 8.5.2111作者:易墨发布时间:2023.10.01原文地址:https://www.cnblogs.com/morang/p/devops-hyperv-centos-install.html使用命令安装 以管理员身份运行 PowerShell 命令: Enable-…

【机器学习】机器学习的基本知识点(包括背景、定义、具体内容、功能、使用场景、操作、未来发展和常见算法)

引言 机器学习是一门涉及多个领域的交叉学科&#xff0c;它主要研究如何让计算机模拟或实现人类的学习行为&#xff0c;以获取新的知识或技能&#xff0c;从而改善系统性能。它是人工智能的核心部分&#xff0c;并且与概率论、统计学、逼近论、凸分析、算法复杂度理论等多个学科…

c++初阶知识——string类详解

目录 前言&#xff1a; 1.标准库中的string类 1.1 auto和范围for auto 范围for 1.2 string类常用接口说明 1.string类对象的常见构造 1.3 string类对象的访问及遍历操作 1.4. string类对象的修改操作 1.5 string类非成员函数 2.string类的模拟实现 2.1 经典的string…

TSMC常见工艺库中7t/9t track的选择

在TSMC的工艺库中&#xff0c;"7T" 和 "9T" 是指标准单元库的轨道&#xff08;track&#xff09;数。轨道数&#xff08;track count&#xff09;通常是指每个单元的高度&#xff0c;这个高度决定了布线资源的密度和灵活性。 例如tcbn22ullbwp7t30p140_11…

GAMES104:05游戏引擎中的渲染系统2:渲染中的光照、材质和shader-学习笔记

文章目录 一、渲染方程及其挑战二、基础光照解决方案-简化版简化光源简化材质简化阴影 三、基于预计算的全局光照3.1挑战和计算思路傅里叶变换球谐函数&#xff08;Spherical Harmonics&#xff09; 3.2 SH Lightmap&#xff1a;预计算 GI3.3 探针 Probe&#xff1a;Light Prob…

无涯·问知财报解读,辅助更加明智的决策

财报解读就像是给公司做一次全面的体检&#xff0c;是理解公司内部运作机制和市场表现的一把钥匙&#xff0c;能够有效帮助投资者、分析师、管理层以及所有市场参与者判断一家公司的健康程度和发展潜力。 星环科技无涯问知的财经库内置了企业年报及财经类信息&#xff0c;并对…