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

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

一、step模型装配体显示

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

基于QT5与opencascdae7.4的简易模型浏览器_第1张图片

基于QT5与opencascdae7.4的简易模型浏览器_第2张图片 

二、视角动画切换

 

三、显示样式切换

基于QT5与opencascdae7.4的简易模型浏览器_第3张图片

基于QT5与opencascdae7.4的简易模型浏览器_第4张图片

四、拾取、高亮、隐藏

 相关代码如下:

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& 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& 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。

你可能感兴趣的:(OpenCascade,C++,图形学,c++,qt)