基于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 *);
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 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容