• 基于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& 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

  • 相关阅读:
    Jan 2023-Prioritizing Samples in Reinforcement Learning with Reducible Loss
    【C++】unordered_map和unordered_set
    华为机试 - 非严格递增连续数字序列
    Java学习-详述main方法、可变参数、数组的工具类、二维数组
    GEE——加载ERA5气候再分析参数并使其可视化的脚本示例
    【退役记】NOI2022
    halcon 矩形相似度 rectangularity
    驱动开发(五):Linux内核定时器
    飞桨中国行落地广州 共探企业智能化升级新路径
    全志V853芯片适配双目GC2053的操作步骤
  • 原文地址:https://blog.csdn.net/qq_15714933/article/details/126774482