【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,一经查实,立即删除!

相关文章

有关熵、相对熵(KL散度)、交叉熵、JS散度、Wasserstein距离的内容

写在前面 最近学了一些关于熵的内容&#xff0c;为增强自己对这些内容的理解&#xff0c;方便自己以后能够温习&#xff0c;随手记录了相关的介绍&#xff0c;可能有不对的地方&#xff0c;敬请谅解。 信息量 任何事件都会承载一定的信息&#xff0c;事件发生的概率越大&…

OpenCV图片验证码识别与滑块验证码识别

目录 图片验证码识别&#xff1a; 一、百度OCR文字识别云服务 二、维普网获取图片验证码 三、维普网opencvocr识别验证码 四、维普网selenium登录并获取数据 滑块验证码&#xff1a; 五、猎聘网获取滑块验证码 六、猎聘网opencv计算滑动距离 七、猎聘网selenium模拟滑…

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

近日&#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;忍不住分享一下给大家。点击跳转到网站。 项目介绍…

Ansible自动化部署工具-组件及语法介绍

大家好&#xff0c;我是蓝胖子&#xff0c;我认为自动化运维要做的事情就是把运维过程中的某些步骤流程化&#xff0c;代码化&#xff0c;这样在以后执行类似的操作的时候就可以解放双手了&#xff0c;让程序自动完成。避免出错&#xff0c;Ansible就是这方面非常好用的工具。它…

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

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

Python123:使用函数输出指定范围内的Fibonacci数、使用函数验证哥德巴赫猜想(C语言)

文章目录 1、使用函数输出指定范围内的Fibonacci数2、使用函数验证哥德巴赫猜想 1、使用函数输出指定范围内的Fibonacci数 题目&#xff1a; 本题要求实现一个计算Fibonacci数的简单函数&#xff0c;并利用其实现另一个函数&#xff0c;输出两正整数m和n&#xff08;0<m≤n…

SLAM_语义SLAM相关论文

目录 1. 综述 2. 相关文章 Probabilistic Data Association for Semantic SLAM VSO:Visual Semantic Odometry 语义信息分割运动物体

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

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

iOS使用NSURLSession实现后台上传下载

NSURLSession后台上传的基本逻辑是&#xff1a;首先创建一个后台模式的NSURLSessionConfiguration&#xff0c;然后通过这个configuration创建一个NSURLSession&#xff0c;接着是创建相关的NSURLSessionTask&#xff0c;最后就是处理相关的代理事件。 1、创建NSURLSession -…

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;…