Ubuntu下OCC7.9+Qt5搭建简易的项目框架
近两年国产CAD替代如日中天,而几何内核作为CAD软件的核心组件之一,当前有且仅有唯一开源的几何内核库即OCCT;这里为各位自立于投入CAD开发或正在学习OCC库的小伙伴们奉献上一个快速搭建QT+OCC的项目框架;
本文介绍了Qt5+Occ 显示几何模型,最终的效果如下:
一、OCC中常用的库介绍
首先我们来介绍一下OCC下常用的库的关系
OCC库名 | 功能 | 常用头文件 | 类或方法 | 备注 |
---|---|---|---|---|
TKernel | 基础核心库 | Standard.hxx,Standard_Handle.hxx | Standard_Real,Standard_Integer,Handle()、Handle(ClassName) | 内存管理、异常处理、基本数据类型,全局配置 |
TKMath | 数学库 | gp_Pnt.hxx,gp_Trsf.hxx,Geom_Curve.hxx | gp_Pnt(三维点),gp_Vec(向量),gp_Trsf(仿射变换),Geom_Line,Geom_Circle | 提供几何和线性代数计算基础;坐标系、向量、矩阵、几何变换 |
TKBRep | Rrep拓扑结构相关库 | TopoDS_Shape.hxx,BRep_Builder.hxx,TopExp_Explorer | TopoDS_Shape,TopoDS_Compound,BRep_Builder::MakeFace() | 管理边界表示法(BRep)的拓扑结构 |
TKV3d | 可视化相关库 | V3d_View.hxx | V3d_View::FitAll()、V3d_View::Rotation() | 管理三维视图、交互和显示属性;处理视图投影、光照、渲染模式 |
TKOpenGl | OpenGL的封装、抽象、集成 | OpenGl_GraphicDriver.hxx | OpenGl_GraphicDriver(OpenGL图形驱动) | 提供 OpenGL 的抽象接口;管理 OpenGL 上下文、渲染管线 |
TKService | 窗口服务库 | Aspect_Window.hxx,Aspect_DisplayConnection.hxx | Aspect_DisplayConnection(显示连接) | 管理窗口系统集成(如 X11、Win32),处理事件循环、窗口属性 |
TKPrim | 基本几何体库 | BRepPrimAPI_MakeBox.hxx | BRepPrimAPI_MakeBox(创建立方体) | 创建基本几何体(立方体、球体、圆柱体等),参数化几何体的构造 |
TKBO | 布尔操作 | BRepAlgoAPI_Fuse.hxx,BRepAlgoAPI_Cut.hxx | BRepAlgoAPI_Fuse(布尔并集), BRepAlgoAPI_Cut(布尔差集) | 实现几何布尔运算 |
二、设置CMakeLists.txt核心引用
首先我们需要定义CMakeLists.txt
# 查找 OpenCASCADE 库
find_package(OpenCASCADE REQUIRED)
...target_link_libraries(${PROJECT_NAME}TKernel # 核心基础库TKMath # 数学库TKBRep # BRep 模型支持TKV3d # 3D 视图支持TKOpenGl # OpenGL 图形驱动TKService # 提供 AIS_InteractiveContextTKPrim # 基本图形支持
)
当然,你可以一次性引入足够的库
# 查找 OpenCASCADE 库
find_package(OpenCASCADE REQUIRED)# 包含 OpenCASCADE 头文件
include_directories(${OpenCASCADE_INCLUDE_DIRS})# 添加 OpenCASCADE 库
target_link_libraries(${PROJECT_NAME} ${OpenCASCADE_LIBRARIES})
如果OpenCASCADE在默认的Cmake包依赖路径下包找不到,则编译时,可这样设置
cmake -DOpenCASCADE_DIR="/path/to/opencascade" ..
这样的CMakeLists.txt解析时,搜索OpenCASDE包时就会优先在上面设置的目录查找;find_package原理点这里
当然,如果你希望编译时,只输入
cmake ..
就了事,我们可以明确指定OCC包的安装地址,可CMakeLists.txt
中,声明安装目录,设置变量set(OpenCASCADE_DIR "/path/to/you/dir")
完整的CMakeLists.txt如下所示:
cmake_minimum_required(VERSION 3.5)project(MyQtProject)set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)# Find the Qt5 Widgets library
find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets X11Extras)# 查找 OpenCASCADE 库
find_package(OpenCASCADE REQUIRED)# Define source and header files
# 添加源代码文件
file(GLOB_RECURSE SOURCES src/*.cpp)
file(GLOB_RECURSE HEADERS src/*.h)# set(SOURCES src/main.cpp src/dialog.cpp)
# set(HEADERS src/dialog.h) # 这里可以添加头文件,如果需要的话# 自动处理 moc、uic、rcc
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTUIC ON)
set(CMAKE_AUTORCC ON)# Add an executable with the above sources
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})# Use the Widgets module from Qt5
target_link_libraries(${PROJECT_NAME}Qt5::Widgets
)# 添加 OpenCASCADE 库 - 指定添加(推荐)
target_link_libraries(${PROJECT_NAME}TKernel # 核心基础库TKMath # 数学库TKBRep # BRep 模型支持TKV3d # 3D 视图支持TKOpenGl # OpenGL 图形驱动TKService # 提供 AIS_InteractiveContextTKPrim # 基本图形支持
)
三、上代码
1、项目结构如下
- build/
- src/|-main.cpp|-MainWindow.cpp|-MainWindow.h|-OccViewerWin.cpp|-OccViewerWin.h
- CMakeLists.txt
mian.cpp
为Qt5入口,MainWindow
为主窗口,用来承载菜单及核心的3D预览子组件,OccViewerWin
为Occ预览3D模型的Qt子组件
2、Qt5框架类代码
main.cpp
// main.cpp
#include <QApplication>
#include "MainWindow.h"int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow mainWindow;mainWindow.show();return app.exec();
}
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QLabel>
#include <QMenu>
#include <QString>
#include "OccViewerWin.h"class MainWindow : public QMainWindow {Q_OBJECT // Qt 元对象系统所需的宏public:MainWindow(QWidget *parent = nullptr);void init();private slots:// 统一处理菜单点击的槽函数void handleMenuAction();// 按钮点击的槽函数void onButtonClicked();// 打开文件