基于QT5与opencascdae7.4的简易模型浏览器

写这这个博文的目的是记录下使用OCC自带的显示AIS时需要注意的一些事项。本人花了点时间学习了下OCC的AIS,实现了一个简单的模型浏览器功能。主要功能有:

一、step模型装配体显示

    读取装配体的功能在我前面博客中提到过,具体可以参考前面的文章,参考效果如下:

 

二、视角动画切换

 

三、显示样式切换

四、拾取、高亮、隐藏

 相关代码如下:

1.显示样式:Context->SetDisplayMode(AIS_Shaded, Standard_False);(实体模式)

Context->DefaultDrawer()->SetFaceBoundaryDraw(true);
    Context->DefaultDrawer()->SetFaceBoundaryAspect(
        new Prs3d_LineAspect(Quantity_NOC_YELLOW, Aspect_TOL_SOLID, 10.));
    Context->DefaultDrawer()->SetIsoOnTriangulation(true);   (显示线框)

2.拾取面、线、点

Context->Activate(AIS_Shape::SelectionMode(TopAbs_ShapeEnum::TopAbs_FACE));(拾取面,其他类似)

3.切换动画

增加一个基于qt动画类QAbstractAnimation的类,将OCC显示切入即可。

class V3dViewCameraAnimation : public QAbstractAnimation {
public:
    V3dViewCameraAnimation(const Handle_V3d_View& view, QObject* parent = nullptr);

    int duration() const override;
    void setDuration(int msecs);

    void setCameraStart(const Handle_Graphic3d_Camera& camera);
    void setCameraEnd(const Handle_Graphic3d_Camera& camera);

    const QEasingCurve& easingCurve() const;
    void setEasingCurve(const QEasingCurve& easingCurve);

    void configure(const std::function<void(Handle_V3d_View)>& fnViewChange);

protected:
    void updateCurrentTime(int currentTime) override;

private:
    Handle_V3d_View m_view;
    Handle_Graphic3d_Camera m_cameraStart;
    Handle_Graphic3d_Camera m_cameraEnd;
    QEasingCurve m_easingCurve; // Linear by default
    int m_duration_ms = 1000;
};

核心代码:

void V3dViewCameraAnimation::configure(const std::function<void(Handle_V3d_View)>& fnViewChange)
{
    if (this->state() == QAbstractAnimation::Running)
        this->stop();

    const bool wasImmediateUpdateOn = m_view->SetImmediateUpdate(false);
    m_cameraStart->Copy(m_view->Camera());
    fnViewChange(m_view);
    m_cameraEnd->Copy(m_view->Camera());
    m_view->Camera()->Copy(m_cameraStart); // Restore
    m_view->SetImmediateUpdate(wasImmediateUpdateOn);
}

void V3dViewCameraAnimation::updateCurrentTime(int currentTime)
{
    const double t = m_easingCurve.valueForProgress(currentTime / double(m_duration_ms));
    const bool prevImmediateUpdate = m_view->SetImmediateUpdate(false);
    const Graphic3d_CameraLerp cameraLerp(m_cameraStart, m_cameraEnd);
    Handle_Graphic3d_Camera camera = m_view->Camera();
    cameraLerp.Interpolate(t, camera);
    m_view->SetCamera(camera);
    m_view->ZFitAll();
    m_view->SetImmediateUpdate(prevImmediateUpdate);
    m_view->Update();
}

以上是实现这些功能的主要核心,在做了几组测试下发现,OCC对STEP的渲染优化还是很不错了,也值得学习下AIS。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值