前言
Open CASCADE是由Open Cascade SAS公司开发和支持的开源软件开发平台,旨在为特定领域快速开发程序而设计。它是一个面向对象的C++类库,提供了丰富的几何造型、数据交换和可视化等功能,成为许多CAD软件的核心组件。
本篇描述搭建Qt开发occ环境过程。
注意:用的是内部QWidget提升为OccWidget,边框都是9px默认。
由于使用得occ的7.7,本身是msvc2015x64版本,所以Qt使用5.9.3的msvc2015x64版本(上一篇写成了msvc2017x64)。
这里本来打算将所有的三方库都放到一个bin、lib和include下混合,让pro里面要写xcopy脚本,后来发现不是很好,只好单独保持原样。
下面开始拷贝,将所有文件夹里面的bin里面的拷贝到模块的bin下,lib和include都做此操作,这里单个文件夹下都有bin、lib和include,只有occ没有。
inc中是头文件, win64中有bin和lib,保持相对原路径,已防止后续跟踪目录一致。
这个比较特殊,源文件就在头文件里面,不是生成库。
这里要引入头文件路径,库文件路径和库文件:
occManager.pri
INCLUDEPATH+= $$PWDDEPENDPATH += $$PWDHEADERS += \ $$PWD/OccManager.hSOURCES+= \ $$PWD/OccManager.cpp#occ-7.7.0-msvc2015x64(openCascade-7.7.0-vc14-64)INCLUDEPATH+= $$PWD/occ-7.7.0-msvc2015x64/opencascade-7.7.0/incLIBS+=-L$$PWD/occ-7.7.0-msvc2015x64/opencascade-7.7.0/win64/vc14/libLIBS+=-lTKBinLIBS+=-lTKBinLLIBS+=-lTKBinTObjLIBS+=-lTKBinXCAFLIBS+=-lTKBOLIBS+=-lTKBoolLIBS+=-lTKBRepLIBS+=-lTKCAFLIBS+=-lTKCDFLIBS+=-lTKD3DHostLIBS+=-lTKD3DHostTestLIBS+=-lTKDCAFLIBS+=-lTKDFBrowserLIBS+=-lTKDrawLIBS+=-lTKernelLIBS+=-lTKExpressLIBS+=-lTKFeatLIBS+=-lTKFilletLIBS+=-lTKG2dLIBS+=-lTKG3dLIBS+=-lTKGeomAlgoLIBS+=-lTKGeomBaseLIBS+=-lTKHLRLIBS+=-lTKIGESLIBS+=-lTKIVtkLIBS+=-lTKIVtkDrawLIBS+=-lTKLCAFLIBS+=-lTKMathLIBS+=-lTKMeshLIBS+=-lTKMeshVSLIBS+=-lTKMessageModelLIBS+=-lTKMessageViewLIBS+=-lTKOffsetLIBS+=-lTKOpenGlLIBS+=-lTKOpenGlesLIBS+=-lTKOpenGlesTestLIBS+=-lTKOpenGlTestLIBS+=-lTKPrimLIBS+=-lTKQADrawLIBS+=-lTKRWMeshLIBS+=-lTKServiceLIBS+=-lTKShapeViewLIBS+=-lTKShHealingLIBS+=-lTKStdLIBS+=-lTKStdLLIBS+=-lTKSTEPLIBS+=-lTKSTEP209LIBS+=-lTKSTEPAttrLIBS+=-lTKSTEPBaseLIBS+=-lTKSTLLIBS+=-lTKTInspectorLIBS+=-lTKTInspectorAPILIBS+=-lTKTObjLIBS+=-lTKTObjDRAWLIBS+=-lTKToolsDrawLIBS+=-lTKTopAlgoLIBS+=-lTKTopTestLIBS+=-lTKTreeModelLIBS+=-lTKV3dLIBS+=-lTKVCAFLIBS+=-lTKViewLIBS+=-lTKViewerTestLIBS+=-lTKVInspectorLIBS+=-lTKVRMLLIBS+=-lTKXCAFLIBS+=-lTKXDELIBS+=-lTKXDECascadeLIBS+=-lTKXDEDRAWLIBS+=-lTKXDEIGESLIBS+=-lTKXDESTEPLIBS+=-lTKXMeshLIBS+=-lTKXmlLIBS+=-lTKXmlLLIBS+=-lTKXmlTObjLIBS+=-lTKXmlXCAFLIBS+=-lTKXSBaseLIBS+=-lTKXSDRAW
出现常见错误:
查看文章《关于 fatal error LNK1158: 无法运行“rc.exe” 的解决方法》解决。(注意:直接赋值rc相关文件到qt的msvc2015_64版bin文件夹是最好的)。
至此,引入occ库是好了,但是我们还是要需要调用来检测。
光包含opencascade的bin是不够的(跟我们预期一样,但是编译不把其它库lib带进去,就不知道了):
前面所有库的bin下面的dll都需要才可以正确运行起来,但是编译的时候确实不需要opencascade之外的lib了。
结果跑起来,程序没什么东西的情况下,发布部署包(Qt5.9.3 msvc2017x64 opencascade-7.7.0),有220MB左右,如下图:
一共303项:
…protected slots:// 显示出来之后需要刷一下大小让occ窗口显示大小一致 voidslot_resize();protected:// 需要重写父类的三个函数 QPaintEngine *paintEngine()const;voidpaintEvent(QPaintEvent*event);voidresizeEvent(QResizeEvent*event);private:// occ的专属变量 opencascade::handle<V3d_Viewer> _pV3dViewer; opencascade::handle<V3d_View> _pV3dView; opencascade::handle<Aspect_DisplayConnection> _pAspectDisplayConnection; opencascade::handle<OpenGl_GraphicDriver> _pOpenGLGraphicDriver; opencascade::handle<AIS_InteractiveContext> _pAisInteractiveContext; WId _wid; opencascade::handle<WNT_Window> _pWntWindow;};…
…voidOccWidget::initControl(){// 初始化occ {// 显示到屏幕上 setAttribute(Qt::WA_PaintOnScreen);// 创建连接显示设备 _pAspectDisplayConnection =newAspect_DisplayConnection();// 创建3D接口定义图形驱动 _pOpenGLGraphicDriver =newOpenGl_GraphicDriver(_pAspectDisplayConnection);// 创建3D查看器对象,并指定图形驱动 _pV3dViewer =newV3d_Viewer(_pOpenGLGraphicDriver);// 创建交互上下文对象,关联到3D查看器 _pAisInteractiveContext =newAIS_InteractiveContext(_pV3dViewer);// 创建视图,并关联到3D查看器 _pV3dView = _pV3dViewer->CreateView();// 获取窗口句柄并创建WNT_Window _wid =winId(); _pWntWindow=newWNT_Window((Aspect_Handle)_wid);// 设置视图窗口 _pV3dView->SetWindow(_pWntWindow);if(!_pWntWindow->IsMapped()){ _pWntWindow->Map(); _pV3dView->Redraw();}QTimer::singleShot(10,this,SLOT(slot_resize()));}}voidOccWidget::slot_resize(){ _pV3dView->MustBeResized();}QPaintEngine*OccWidget::paintEngine()const{return0;}voidOccWidget::paintEvent(QPaintEvent*event){if(!_pV3dView.IsNull()){ _pV3dView->Redraw();}QWidget::paintEvent(event);}voidOccWidget::resizeEvent(QResizeEvent*event){if(!_pV3dView.IsNull()){ _pV3dView->MustBeResized();}QWidget::resizeEvent(event);}…
拉伸的时候如下图:
判断是刷了但是好像被覆盖了,后来找到原因是手码的时候代码问题
显示出现该问题
拉伸下则刷新没问题了:
应该是刷新的问题,窗口没完全显示出来之前,是按照某个值(不定)刷的,这就跟动态布局在构造中获取大小不一致一样。
这个只需要再构造中接一个槽函数(这个会确保启动后重新调用一次)。