一:编译环境
● Windows 11
● VS2019
● OCC7.6.0(下载链接:https://dev.opencascade.org/release)
● VTK9.1
● Qt5.15.2
下载页面
注:
- 下载圈1的文件或者其他压缩形式的文件
- 圈2是occ依赖的第三方库,根据需要进行下载
二、配置OCC
如果编译不了,注意是3RDPRATY_ 这些key的问题。这些key对应的文件去官网下载配置就好了,然后设置value,唯一要注意的是路径不要用\分隔,改成用/,能少一些问题。
2.1 解压下载好的opencascade-7.6.0.tar.gz文件
2.2 回到上一级目录,新建个文件夹 3rdparty
打开https://dev.opencascade.org/resources/download/3rd-party-components该链接下载需要的第三方库(Qt Vtk自己去下载/编译自己需要的版本)
我下载的是框起来的这三个,都是vc2014 64bit的。
将他们下载到创建的3rdparty目录下并解压:
2.3 打开cmake-gui (我用的3.24)
配置下occ代码路径、生成路径:
点击左下方Configure,会出来弹窗提示创建build文件夹,点Yes即可,弹窗新界面,如下图即可,默认生成64位的库
点击finish后,出现如下界面:
将中上方的grouped复选框勾上,看着舒服:
2.4 第一次配置
2.4.1 USE group
将USE_VTK、USE_FREEIMAGE勾上
2.4.2 INSTALL group
更改install_dir目录(默认目录的话,那需要用管理员模式打开VS2019才能将编译好的文件 install 到该目录下)
2.4.3 BUILD group
把编译qt例子勾上
2.4.4 3rdparty group
需要设置value的地方
● 3rdparty_freetype_dir
○ 解压后的freetype-2.5.5-vc14-64根路径即可:D:/occ/build/freetype-2.5.5-vc14-64
● TLC_DIR和TK_DIR
○ 这两个都在同一个压缩包D:\occ\build\tcltk-86-64里
○ 也是使用根路径:D:/occ/build\tcltk-86-64
2.4.5 点击Configure
还需要配置如下信息
2.5 第二次配置
2.4.1 INSTALL
都不勾选
2.4.2 3rdparty
- 配置Qt dir
Qt Dir,这个去Qt安装目录找,相对位置如下:Qt\5.15.2\5.15.2\msvc2019_64\lib\cmake\Qt5
注意:最后一次Qt5目录下必须要有Qt5Config.cmake这个文件,不然cmake会失败的 - 配置VTK dir
VTK目录层级如下:
其中bin、lib目录存放着debug release的文件
lib/cmake/vtk-9.1目录下,编译vtk install时生成的东西都不能少。尤其要注意有没有这俩文件:VTK-targets-debug.cmake、VTK-targets-release.cmake,这俩文件与编译类型有关,看名字就知道了。
设置的value相对路径如下:vtk_9.1/lib/cmake/vtk-9.1
3. 配置FreeImage dir
这个和配置FreeType dir一样,也是用解压后的路径的根路径:D:/occ/build/freeimage-3.17.0-vc14-64
4. ungrouped entries
先不配置
5.点击configure
这次应该没什么没配置的了
**注:
- 如果哪个dir没有设置,找下对应路径就好,尤其是Qt的,可能会让你设置qmake路径、Qt5LinguistTools路径这些。
- 3RDPARTY组下如果提示没有找到XXX_include_dir,
a. 先看下XXX_DIR的路径用的是否用的/,不能用
b. 如果a设置的是对的,还是找不到,就把XXX_DIR后面的value删除掉,手动指定include目录,路径也用/,防止失败**
2.6 Generate生成
无视警告,打开project
三、编译OCC
点击批生成
把这四个勾上等待就行。
编译好了去自己设置的install目录,目录结构如下:
其中头文件在inc目录,动态库和lib文件在win64目录下(debug和release都在里面,文件夹后面有个d对应的是debug的文件)
四:CMake项目配置
目录层级
最外层的cmakelist.txt
cmake_minimum_required(VERSION 3.22)
project(XXX)
set(CMAKE_CXX_STANDARD 14)
# 解决msvc下 Qt乱码的问题
add_compile_options("/utf-8")
add_definitions(-DUNICODE -D_UNICODE)
# 多处理器编译,加快编译速度
add_compile_options(/MP)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(Qt5_DIR D:/0.software/DevTool/Qt/5.15.2/5.15.2/msvc2019_64/lib/cmake/Qt5)
find_package(Qt5 COMPONENTS
Core
Widgets
Gui
OpenGL REQUIRED)
set(VTK_DIR 3rdparty/vtk_9.1/lib/cmake/vtk-9.1)
find_package(VTK COMPONENTS
ChartsCore
CommonDataModel
FiltersGeneral
FiltersSources
FiltersModeling
GUISupportQt
RenderingCore
RenderingOpenGL2
RenderingFreeType
RenderingAnnotation
RenderingContextOpenGL2
InteractionStyle
InteractionWidgets REQUIRED
)
set(OpenCASCADE_DIR 3rdparty/OCCT/cmake)
find_package(OpenCASCADE
REQUIRED)
add_subdirectory(src)
vtk_module_autoinit(
TARGETS ${PROJECT_NAME}
MODULES ${VTK_LIBRARIES})
src目录下的cmake
project(XXX)
set(main_src
main.cpp mainwindow.cpp mainwindow.h mainwindow.ui)
include_directories(${OpenCASCADE_INCLUDE_DIR})
add_executable(${PROJECT_NAME}
${main_src}
)
target_link_libraries(
${PROJECT_NAME}
Qt5::Core Qt5::Widgets Qt5::Gui Qt5::Gui
${VTK_LIBRARIES}
${OpenCASCADE_LIBRARIES}
)
vtk_module_autoinit(
TARGETS ${PROJECT_NAME}
MODULES ${VTK_LIBRARIES})
main.cpp
#include <BRepPrimAPI_MakeBox.hxx>
#include <IVtkTools_ShapeDataSource.hxx>
#include <vtkAutoInit.h>
#include <vtkRenderer.h>
#include <VtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkPolyDataMapper.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
int main()
{
BRepPrimAPI_MakeBox box(2, 2, 2);
const TopoDS_Shape& shape = box.Shape();
vtkNew<vtkRenderWindow> renderWindow; //创建一个vtk窗口
vtkNew<vtkRenderer> render; //创建一个vtk渲染器
renderWindow->AddRenderer(render); //在窗口中加入渲染器
vtkNew<vtkRenderWindowInteractor> iren; //创建一个vtk交互器
vtkNew<vtkInteractorStyleTrackballCamera> istyle; //创建vtk相机交互器样式
iren->SetRenderWindow(renderWindow); //设置渲染窗口
iren->SetInteractorStyle(istyle); //设置交互器样式
vtkNew<IVtkTools_ShapeDataSource> occSource; //创建一个可以被VTK使用的OCC数据源
occSource->SetShape(new IVtkOCC_Shape(shape)); //将shape添加到数据源中
vtkNew<vtkPolyDataMapper> mapper; //创建一个VTK数据类型
mapper->SetInputConnection(occSource->GetOutputPort()); //创建一个管道,将occ数据导入到VTK数据中
vtkNew<vtkActor> actor; //创建一个vtk actor
actor->SetMapper(mapper); //将vtk数据交给actor
render->AddActor(actor); //在渲染器中加入vtk actor
iren->Initialize(); //初始化交互器
iren->Start(); //开始运行交互器
return 0;
}
知乎 https://zhuanlan.zhihu.com/p/541211894 搬来的示例代码,运行:
搞定。