【FastCAE源码阅读5】使用VTK实现鼠标拾取对象并高亮

鼠标拾取对象是很多软件的基本功能。FastCAE的拾取比较简单,是通过VTK实现的。

对几何而言,拾取类型切换在工具栏上,单击后再来单击视图区对象进行拾取,拾取后的对象会高亮显示。效果如下图:
在这里插入图片描述

一、拾取对象

拾取对象是在PropPickerInteractionStyle类实现的,该类是vtkInteractorStyleRubberBandPick的子类,重写原来的鼠标处理函数。当鼠标左键按下,会触发以下代码:

void PropPickerInteractionStyle::clickSelectGeometry(bool preSelect)
{int *clickPos = this->GetInteractor()->GetEventPosition(); // 获取鼠标点击位置int success = -1, index = -1;vtkActor *actor = nullptr;if (_selectModel == GeometryPoint || _selectModel == GeometryWinPoint) // 几何点{vtkSmartPointer<vtkPointPicker> picker = vtkSmartPointer<vtkPointPicker>::New();success = picker->Pick(clickPos[0], clickPos[1], 0, this->GetDefaultRenderer());if (0 != success){index = picker->GetPointId(); // 点的idactor = picker->GetActor(); // 点对应的Actor}}else{vtkSmartPointer<vtkCellPicker> picker = vtkSmartPointer<vtkCellPicker>::New();if (_selectModel == GeometryCurve || _selectModel == GeometryWinCurve)picker->SetTolerance(0.0025);success = picker->Pick(clickPos[0], clickPos[1], 0, this->GetDefaultRenderer());if (0 != success){index = picker->GetCellId(); // cell的idactor = picker->GetActor(); // 对应的actor}}emit selectGeometry(preSelect, actor, index);
}

这段代码就是鼠标拾取对象的核心逻辑。其实现是借助了VTK提供的vtkPointPicker、vtkCellPicker。其中当拾取模式是点的时候,使用vtkPointPicker,如果拾取成功返回点的id及对应的Actor(一个Actor可能包含多个点)。当拾取模式是线、面、体的时候,使用vtkCellPicker,成功则返回对应cell id及Actor(一个Actor可能包含多个cell)。注意当拾取线的时候,需要提高拾取Tolerance,不然线很难拾取到。

另外要注意的是,当拾取线的时候,面Actor是拾取不到的,同样当拾取面的时候,线Actor也是拾取不到。这是通过在用户切换选择模式的时候,设置面或边Actor是否可以拾取实现的。核心代码在GeometryViewProvider类中,如下:

void GeometryViewProvider::setGeoSelectMode(int m)
{_viewData->updateGraphOption();ModuleBase::SelectModel selectType = (ModuleBase::SelectModel)m;QList<GeoViewObj> viewObjs = _geoViewHash.values();vtkActor *actor = nullptr;for (GeoViewObj vobj : viewObjs){actor = vobj._faceObj.first;if (actor != nullptr)actor->SetPickable(false);actor = vobj._edgeObj.first;if (actor != nullptr)actor->SetPickable(false);actor = vobj._pointObj.first;if (actor != nullptr)actor->SetPickable(false);switch (selectType){case ModuleBase::GeometryBody:case ModuleBase::GeometrySurface:case ModuleBase::GeometryWinBody:case ModuleBase::GeometryWinSurface:actor = vobj._faceObj.first;if (actor != nullptr)actor->SetPickable(true);break;case ModuleBase::GeometryWinCurve:case ModuleBase::GeometryCurve:actor = vobj._edgeObj.first;if (actor != nullptr)actor->SetPickable(true);break;case ModuleBase::GeometryWinPoint:case ModuleBase::GeometryPoint:actor = vobj._pointObj.first;if (actor != nullptr)actor->SetPickable(true);break;default:break;}}
}

这个代码相对比较简单,不再分析。

二、从信号到槽函数

拾取对象之后,会发出emit selectGeometry信号,参数中带有Actor及cell或点的id。这个信号是QT框架提供的编程机制。其对应的槽函数在如下图中能找到:
在这里插入图片描述

三、高亮拾取对象

高亮拾取对象处理过程代码如下:

void GeometryViewProvider::selectGeometry(bool pre, vtkActor *ac, int index)
{if (ac == nullptr || index < 0) // 无效拾取{_viewData->preHighLight(nullptr);_preWindow->reRender();return;}ModuleBase::SelectModel selectMod = _preWindow->getSelectModel(); // 选择模式vtkDataSet *dataSet = ac->GetMapper()->GetInputAsDataSet(); // 获取Actor的多边形数据集vtkPolyDatavtkPolyData *poly = vtkPolyData::SafeDownCast(dataSet);if (poly == nullptr)return;GeometryViewObject *vobj = nullptr;switch (selectMod){case ModuleBase::GeometryWinBody:case ModuleBase::GeometryBody:vobj = _viewData->getSolidViewObj(poly, index);break;case ModuleBase::GeometryWinSurface:case ModuleBase::GeometrySurface:vobj = _viewData->getFaceViewObj(poly, index); // 输入多边形数据+cell idbreak;case ModuleBase::GeometryWinCurve:case ModuleBase::GeometryCurve:vobj = _viewData->getEdgeViewObj(poly, index);break;case ModuleBase::GeometryWinPoint:case ModuleBase::GeometryPoint:vobj = _viewData->getPointViewObj(poly, index);break;default:break;}if (vobj == nullptr)return;if (pre)_viewData->preHighLight(vobj); // 设置预高亮else{vobj->highLight(); // 高亮对象_viewData->preHighLight(nullptr);emit geoShapeSelected(vobj->getGeometySet(), vobj->getIndex());}_preWindow->reRender();
}

同样,这里也只分析面的高亮,其他的高亮逻辑类似。高亮处理的时候,直接先根据Actor获取了其vtkPolyData数据集,找到哪个面需要高亮,最后更改其颜色。如何根据cell id找到这个面,需要理解其数据结构才能看懂其逻辑。对于面的数据结构,这篇文章【FastCAE源码阅读3】几何模型显示:从OCC对象到VTK对象有详细描述。其核心原理是查找cell id落在哪个面包含的cell区间上,确定高亮哪个面。最后调用_preWindow->reRender()重新绘制整个场景。

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

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

相关文章

普洱茶上市?澜沧古茶通过港股聆讯

近日&#xff0c;澜沧古茶成功通过港交所聆讯&#xff0c;随后在11月7日披露了相关资料集。该公司即将在港交所主板上市&#xff0c;此次上市由中信建投国际和招商证券国际担任联席保荐人。据了解&#xff0c;澜沧古茶或将成为内地茶企第一股&#xff0c;也将成为“普洱茶第一股…

汽车发动机各系统部件构造图解及名称大全(超详细)

我们都知道发动机是汽车的心脏,相信大家都有东拼西凑的学一些发动机知识,今天汽车维修网小编给大家系统的整理整个发动机的基础知识,如果能认真看完,相信肯定有所收获。全文3065字,81幅结构图,建议收藏、分享后再慢慢看。 首先我们来看一下 发动机总成构造图解 发动机…

带你走进中国十大名校,全面了解学校历史和文化

一、资源描述 本套资源是很不错的&#xff0c;带你实地走进中国十大名校的校园&#xff0c;看看校园内的著名景点和建筑&#xff0c;同时讲解十大名校的历史和文化。这些高校不仅是中国十大名校&#xff0c;可能也是中国排名前十的学校&#xff0c;更是众多学子梦寐以求的&…

【刚体姿态运动学】角速度和欧拉角速率的换算关系的详细推导

0 引言 本文以一种新的角度推导刚体姿态运动学&#xff0c;也即角速度和欧拉角速率之间的换算&#xff0c;不同于相似博文的地方在于&#xff0c;本文旨在从原理上给出直观清晰生动的解释。将详细过程记录于此&#xff0c;便于后续学习科研查找需要。 1 符号 符号含义 { E }…

爱上C语言:操作符详解(上)

&#x1f680; 作者&#xff1a;阿辉不一般 &#x1f680; 你说呢&#xff1a;生活本来沉闷&#xff0c;但跑起来就有风 &#x1f680; 专栏&#xff1a;爱上C语言 &#x1f680;作图工具&#xff1a;draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话&#xff0c;还请…

双通道 H 桥电机驱动芯片AT8833,软硬件兼容替代DRV8833,应用玩具、打印机等应用

上期小编给大家分享了单通道 H 桥电机驱动芯片&#xff0c;现在来讲一讲双通道的驱动芯片。 双通道 H 桥电机驱动芯片能通过控制电机的正反转、速度和停止等功能&#xff0c;实现对电机的精确控制。下面介绍双通道H桥电机驱动芯片的工作原理和特点。 一、工作原理 双通道 H 桥电…

毫米波雷达技术在自动驾驶中的关键作用:安全、精准、无可替代

自动驾驶技术正以前所未有的速度不断演进&#xff0c;而其中的关键之一就是毫米波雷达技术。作为自动驾驶系统中的核心感知器件之一&#xff0c;毫米波雷达在保障车辆安全、实现精准定位和应对复杂环境中发挥着不可替代的作用。本文将深入探讨毫米波雷达技术在自动驾驶中的关键…

基于Springboot的时装购物系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的时装购物系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 项目介绍…

【性能测试】Linux下Docker安装与docker-compose管理容器(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Linux下Docker…

RuoYi-Vue 在Swagger和Postman中 上传文件测试方案

RequestPart是Spring框架中用于处理multipart/form-data请求中单个部分的注解。在Spring MVC中&#xff0c;当处理文件上传或其他类型的多部分请求时&#xff0c;可以使用RequestPart注解将请求的特定部分绑定到方法参数上。 使用RequestPart注解时&#xff0c;需要指定要绑定…

asp.net水资源检测系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 水资源检测系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开 发 ASP.NET水资源检测系统1 (1) 应用技…

易点易动固定资产管理系统:定制流程与用量控制的高效库存管理利器

对于企业来说&#xff0c;有效的库存管理是保证供应链运作顺畅、降低成本和提高客户满意度的关键要素。易点易动固定资产管理系统凭借其自定义库存管理流程和库存用量控制功能&#xff0c;成为了提升库存管理效率的利器。本文将详细介绍易点易动固定资产管理系统的自定义流程和…

基于SSM框架的共享单车管理系统小程序系统的设计和实现

基于SSM框架的共享单车管理系统小程序系统的设计和实现 源码传送入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;…

腾讯云16核服务器配置有哪些?CPU型号处理器主频性能

腾讯云16核服务器配置大全&#xff0c;CVM云服务器可选择标准型S6、标准型SA3、计算型C6或标准型S5等&#xff0c;目前标准型S5云服务器有优惠活动&#xff0c;性价比高&#xff0c;计算型C6云服务器16核性能更高&#xff0c;轻量16核32G28M带宽优惠价3468元15个月&#xff0c;…

《嵌入式虚拟化技术与应用》:深入浅出阐述嵌入式虚拟机原理,实现“小而能”嵌入式虚拟机!

随着物联网设备的爆炸式增长和万物互联应用的快速发展&#xff0c;虚拟化技术在嵌入式系统上受到了业界越来越多的关注、重视和实际应用。嵌入式系统与虚拟化技术这个跨界创新组合应运而生&#xff0c;其典型的应用场景包括软件定义汽车驾驶舱、工业领域的工作负载整合等。 虚…

PHP网站源码 知识付费分站代理自助下单系统 自带多款模板

源码测评&#xff1a;功能很齐全&#xff0c;有可以对接的总站&#xff0c;应该是对接好就可以推广赚钱了&#xff0c;但是这种感觉能赚钱的就那么几个人&#xff0c;见仁见智吧&#xff01; 截图演示&#xff1a; 转载自 https://www.qnziyw.cn/cmsmb/qtcms/3952.html

Go进阶之rpc和grpc

文章目录 Go环境安装1&#xff09;windows2&#xff09;linux go语言编码规范1.1 包名&#xff1a;package1.2 ⽂件名1.3 结构体命名1.4 接⼝命名1.5 变量命名1.6 常量命名2.1 包注释2.2 结构&#xff08;接⼝&#xff09;注释2.3 函数&#xff08;⽅法&#xff09;注释2.4 代码…

Javascript知识点详解:正则表达式

目录 RegExp 对象 概述 实例属性 实例方法 RegExp.prototype.test() RegExp.prototype.exec() 字符串的实例方法 String.prototype.match() String.prototype.search() String.prototype.replace() String.prototype.split() 匹配规则 字面量字符和元字符 转义符…

python使用pysqlcipher3对sqlite数据库进行加密

python对很多项目都需要对sqlite数据库的数据进行加密&#xff0c;最流行的加密方式是使用pysqlcipher3&#xff0c;当前使用的python版本为3.7&#xff0c;本博文是直接使用pysqlcipher3在项目上的应用&#xff0c;使用的是已编译好的pysqlcipher3包&#xff0c;如果你需要pys…

爱剪辑如何将视频旋转90度,详细操作流程

爱剪辑是一款电脑端常用的视频剪辑类软件&#xff0c;基本上囊括了视频剪辑所需的所有功能&#xff0c;此处主要介绍&#xff0c;爱剪辑是如何对视频进行旋转操作的&#xff0c;水平旋转或者垂直旋转爱剪辑都是可以操作的&#xff0c;整体操作的详细过程将在下方为大家讲解。 …