如何在OpenCASCADE中检测形状选中事件并设置对应回调函数
OpenCASCADE选中状态变更回调实现方案
OpenCASCADE本身支持选中状态变更的回调触发,同时针对Qt结合开发的场景,还有无需轮询的轻量实现方案,具体如下:
方案1:Qt鼠标事件触发查询(推荐)
该方案无需额外注册回调,仅在用户点击3D视图时才执行选中查询,性能开销极低,是Qt+OCCT开发的主流实现方式:
- 重写3D视图对应Qt控件的鼠标释放事件
- 转换Qt坐标为OCCT视图坐标后调用点选接口
- 直接查询选中结果执行自定义逻辑
代码示例:
// 继承QOpenGLWidget或者你自己封装的OCC视图控件类 void OCCViewWidget::mouseReleaseEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton) { // Qt坐标原点在左上角,OCCT视图坐标原点在左下角,需要翻转Y轴 int occX = event->x(); int occY = height() - event->y(); // 执行点选检测,自动更新上下文的选中状态 m_aisContext->MoveTo(occX, occY, m_v3dView, true); if (m_aisContext->NbSelected() > 0) { // 获取选中的形状 TopoDS_Shape selectedShape = m_aisContext->SelectedShape(); // 此处添加你的选中处理逻辑 } else { // 此处添加未选中任何形状的处理逻辑 } } // 继续传递事件给父类处理 QOpenGLWidget::mouseReleaseEvent(event); }
方案2:原生注册选中状态监听器
如果你需要监听所有选中状态变更(包括代码主动调用选中接口触发的变更),可以使用OCCT提供的原生监听器接口,7.5及以上版本支持AddOwnerStatusListener方法注册回调函数:
代码示例:
// 定义选中状态变更回调函数 void selectionStatusCallback(const Handle(AIS_InteractiveContext)& theCtx, const Handle(SelectMgr_EntityOwner)& theOwner, bool isSelected) { // 从选中所有者中拿到对应的交互对象 Handle(AIS_InteractiveObject) aisObj = Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable()); if (aisObj.IsNull()) return; TopoDS_Shape targetShape = aisObj->Shape(); if (isSelected) { // 对象被选中的处理逻辑 } else { // 对象被取消选中的处理逻辑 } } // 初始化上下文时注册回调 m_aisContext->AddOwnerStatusListener(selectionStatusCallback);
内容的提问来源于stack exchange,提问作者Ivan P.
相关产品推荐
相关产品推荐

