You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OpenCASCADE中检测形状选中事件并设置对应回调函数

OpenCASCADE选中状态变更回调实现方案

OpenCASCADE本身支持选中状态变更的回调触发,同时针对Qt结合开发的场景,还有无需轮询的轻量实现方案,具体如下:

方案1:Qt鼠标事件触发查询(推荐)

该方案无需额外注册回调,仅在用户点击3D视图时才执行选中查询,性能开销极低,是Qt+OCCT开发的主流实现方式:

  1. 重写3D视图对应Qt控件的鼠标释放事件
  2. 转换Qt坐标为OCCT视图坐标后调用点选接口
  3. 直接查询选中结果执行自定义逻辑

代码示例:

// 继承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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:27:01