基于OpenCASCADE自制三维建模软件(四)实现三维显示界面

一、配置系统变量及QMake文件

  • 在系统环境变量中添加CASROOT变量,将OpenCASCADE库的目录路径填入变量值中
    在这里插入图片描述
  • 打开Qt Creator新建一个Qt QWidgets Application项目,选择QMainWindow界面
  • 编辑 *.pro 文件,将OCC的包含路径、库路径以及具体的库加载到qmake项目中
#Windows系统下编译
win32 {
    #包含路径
    INCLUDEPATH += $$(CASROOT)/inc
    #确定编译器
    win32-msvc2010 {
        compiler=vc10
    }
    win32-msvc2012 {
        compiler=vc11
    }
    win32-msvc2013 {
        compiler=vc12
    }
    win32-msvc2015 {
        compiler=vc14
    }
    #确定64位或32位系统,增加库的路径
    !contains(QMAKE_TARGET.arch, x86_64) {
        CONFIG(debug, debug|release) {  #x86_64 debug
            LIBS += -L$$(CASROOT)/win32/$$compiler/libd
        }
        else {  #x86_64 release
            LIBS += -L$$(CASROOT)/win32/$$compiler/lib
        }
    }
    else {
        CONFIG(debug, debug|release) {  #x86 debug
            LIBS += -L$$(CASROOT)/win64/$$compiler/libd
        }
        else {  #x86 release
            LIBS += -L$$(CASROOT)/win64/$$compiler/lib
        }
    }
}
#添加OCC库
LIBS += -lTKernel -lTKMath -lTKService -lTKV3d -lTKOpenGl \\
        -lTKBRep -lTKIGES -lTKSTL -lTKVRML -lTKSTEP -lTKSTEPAttr -lTKSTEP209 \\
        -lTKSTEPBase -lTKGeomBase -lTKGeomAlgo -lTKG3d -lTKG2d \\
        -lTKXSBase -lTKShHealing -lTKHLR -lTKTopAlgo -lTKMesh -lTKPrim \\
        -lTKCDF -lTKBool -lTKBO -lTKFillet -lTKOffset \\

二、创建界面

  • 新建一个QWidget界面类
  • 编辑头文件
    添加OCC相关变量
    private:
    //!交互式上下文能够管理一个或多个查看器(viewer)中的图形行为和交互式对象的选择
    Handle(AIS_InteractiveContext) m_context;
    //!定义查看器(viewer)类型对象上的服务
    Handle(V3d_Viewer) m_viewer;
    //!创建一个视图
    Handle(V3d_View) m_view;
    //!创建3d接口定义图形驱动程序
    Handle(Graphic3d_GraphicDriver) m_graphic_driver;
添加覆写QWidget的事件
    protected:
    //!覆写绘图事件
    void paintEvent(QPaintEvent *);
    //!覆写窗口尺寸变化事件
    void resizeEvent(QResizeEvent *);
    //!返回窗口的绘制引擎
    QPaintEngine *paintEngine() const;
  • 编写构造函数
C3DWidget::C3DWidget(QWidget *parent) : QWidget(parent)
{
    //若交互式上下文为空,则创建对象
    if (m_context.IsNull())
    {
        //此对象提供与X server的连接,在Windows和Mac OS中不起作用
        Handle(Aspect_DisplayConnection) m_display_donnection = new Aspect_DisplayConnection();
        //创建OpenGl图形驱动
        if (m_graphic_driver.IsNull())
        {
            m_graphic_driver = new OpenGl_GraphicDriver(m_display_donnection);
        }
        //获取QWidget的窗口系统标识符
        WId window_handle = (WId) winId();
        //创建Windows NT 窗口
        Handle(WNT_Window) wind = new WNT_Window((Aspect_Handle) window_handle);
        //创建3D查看器
        m_viewer = new V3d_Viewer(m_graphic_driver, Standard_ExtString("viewer3d"));
        //创建视图
        m_view = m_viewer->CreateView();
        m_view->SetWindow(wind);
        //打开窗口
        if (!wind->IsMapped())
        {
            wind->Map();
        }
        m_context = new AIS_InteractiveContext(m_viewer);  //创建交互式上下文
        //配置查看器的光照
        m_viewer->SetDefaultLights();
        m_viewer->SetLightOn();
        //设置视图的背景颜色为灰色
        m_view->SetBackgroundColor(Quantity_NOC_GRAY60);
        m_view->MustBeResized();
        //显示直角坐标系,可以配置在窗口显示位置、文字颜色、大小、样式
        m_view->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_GOLD, 0.08, V3d_ZBUFFER);
        //设置显示模式
        m_context->SetDisplayMode(AIS_Shaded, Standard_True);
    }
    //配置QWidget
    setAttribute(Qt::WA_PaintOnScreen);
    setAttribute(Qt::WA_NoSystemBackground);
    setBackgroundRole( QPalette::NoRole );  //无背景
    setFocusPolicy( Qt::StrongFocus );
    setAttribute( Qt::WA_PaintOnScreen );
    setAttribute( Qt::WA_NoSystemBackground );
    setMouseTracking( true );   //开启鼠标位置追踪
}
  • 编写覆写函数
void C3DWidget::paintEvent(QPaintEvent *)
{
    m_view->Redraw();
}

void C3DWidget::resizeEvent(QResizeEvent *)
{
    if( !m_view.IsNull() )
    {
        m_view->MustBeResized();
    }
}

QPaintEngine *C3DWidget::paintEngine() const
{
    return 0;
}

三、编译并运行项目

程序运行效果如下:
在这里插入图片描述

四、问题处理

在Qt编译成功后,执行运行的时候可能会显示不到界面,且显示:

\\color{red}{程序异常结束。}


原因是运行环境路径中找不到OCC及其第三方库的动态库文件(*.bin),解决的方法有:

  1. 修改系统环境变量 PATH ,添加动态库的路径
  2. 在Qt Creator中切换到项目模式(Ctrl+5),在构建环境中找到 PATH 变量并添加动态库路径到其中

项目仓库

https://github.com/Jelatine/JellyCAD

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片