1.前言
OCCT使用的VTK版本是VTK6.1.0,这个版本已经比较老了,如果要使用新版本的VTK,则需要自己引入新版本VTK,自己编译,我这里也比较好奇,为什么OCCT不升级一下VTK版本,下面自己来引入VTK9.2.0版本加入OCCT7.7.0
2.OCCT7.7.0使用VTK9.2.0
2.1.准备工作
1.下载编译VTK9.2.0源码,生成二进制开发包
2.下载OCCT7.7.0并配置编译
2.2.TKIVtkDraw与TKIVtk重编译
OCCT7.7.0中与VTK相关的两个项目是TKIVtkDraw与TKIVtk ,只需要更新这两个项目就可以了,具体步骤如下图
1.将VTK9.2.0的开发包拷贝到OCCT7.7.0的指定目录
2.修改OCCT7.7.0的vs代码配置 重新编译这两个项目
主要是修改VS项目的头文件包含目录和链接的lib库目录和名称,如果没有什么异常那就可以用了(一般不可能没异常。。。)
3.异常问题修复
我这里遇见的异常情况如下,出现这种问题,一般是链接库没引入,导致找不到函数符号,找到包含对应函数的lib库,引入即可。
但是OCCT7.7.0代码里面需要引入的却是一个名字不一样的库
OCCT7.7.0需要引入的lib库名称vtkRenderingOpenGL-9.2.lib
VTK9.2.0生成的lib库中只有vtkRenderingOpenGL2-9.2.lib
why? 看如下图代码
这里是没有 定义VTK_OPENGL2_BACKEND 宏的,我找了一下编译VTK9.2.0的cmake配置,里面也没有发现这个配置,以前的版本貌似有,我这里明显会执行
VTK_MODULE_INIT(vtkRenderingOpenGL)
这里是要加载vtkRenderingOpenGL-9.2.lib库的,but 我只有vtkRenderingOpenGL2-9.2.lib
so?我自己将代码改为
// Initialization of VTK object factories.
// Since VTK 6 the factory methods require "auto-initialization" depending on
// what modules are enabled at VTK configure time.
// Some defines are needed in order to make the factories work properly.
#ifdef VTK_OPENGL2_BACKEND
VTK_MODULE_INIT(vtkRenderingOpenGL2)
#else
VTK_MODULE_INIT(vtkRenderingOpenGL2)
#endif
VTK_MODULE_INIT(vtkInteractionStyle)
这样会不会影响其它地方呢,我先做了个基本测试,使用编译好的新版本OCCT7.7.0库加入到demo程序中,在QT5.12.9程序中实现一个简单的VTK渲染OCCT的TopoDS_Shape的案例,
测试效果如下:
部分代码如下:
//绘制OCC测试
void VTKShowDlg::slotShowOCC()
{//OCCShapeShowTopoDS_Shape aTopoBox = BRepPrimAPI_MakeBox(3.0, 4.0, 5.0).Shape();showOCCShape(aTopoBox);//OCCShowDoc}//渲染OCC TopoDS_Shape
void VTKShowDlg::showOCCShape(TopoDS_Shape &OCCShape)
{vtkNew<IVtkTools_ShapeDataSource> boxSource;boxSource->SetShape(new IVtkOCC_Shape(OCCShape));vtkNew<vtkPolyDataMapper> mapper;mapper->SetInputConnection(boxSource->GetOutputPort());vtkSmartPointer<vtkActor> OCCShapeActor = vtkSmartPointer<vtkActor>::New();OCCShapeActor->SetMapper(mapper);vtkSmartPointer<vtkRenderer> OCCShapeRender = vtkSmartPointer<vtkRenderer>::New();OCCShapeRender->AddActor(OCCShapeActor);OCCShapeRender->SetBackground(0.1, 0.2, 0.4);m_VTKView->m_CurRenderWindow->AddRenderer(OCCShapeRender);m_VTKView->m_CurRenderWindow->Render();
}
通过测试基本功能是没什么问题,暂时没做其它进一步测试,不知道这样改是否稳定可行,以后探讨