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();// 打開文件