Ubuntu下OCC7.9+Qt5 快速搭建3D可视化框架

Ubuntu下OCC7.9+Qt5搭建简易的项目框架

近两年国产CAD替代如日中天,而几何内核作为CAD软件的核心组件之一,当前有且仅有唯一开源的几何内核库即OCCT;这里为各位自立于投入CAD开发或正在学习OCC库的小伙伴们奉献上一个快速搭建QT+OCC的项目框架;

本文介绍了Qt5+Occ 显示几何模型,最终的效果如下:
在这里插入图片描述

一、OCC中常用的库介绍

首先我们来介绍一下OCC下常用的库的关系

OCC库名功能常用头文件类或方法备注
TKernel基础核心库Standard.hxx,Standard_Handle.hxxStandard_Real,Standard_Integer,Handle()、Handle(ClassName)内存管理、异常处理、基本数据类型,全局配置
TKMath数学库gp_Pnt.hxx,gp_Trsf.hxx,Geom_Curve.hxxgp_Pnt(三维点),gp_Vec(向量),gp_Trsf(仿射变换),Geom_Line,Geom_Circle提供几何和线性代数计算基础;坐标系、向量、矩阵、几何变换
TKBRepRrep拓扑结构相关库TopoDS_Shape.hxx,BRep_Builder.hxx,TopExp_ExplorerTopoDS_Shape,TopoDS_Compound,BRep_Builder::MakeFace()管理边界表示法(BRep)的拓扑结构
TKV3d可视化相关库V3d_View.hxxV3d_View::FitAll()、V3d_View::Rotation()管理三维视图、交互和显示属性;处理视图投影、光照、渲染模式
TKOpenGlOpenGL的封装、抽象、集成OpenGl_GraphicDriver.hxxOpenGl_GraphicDriver(OpenGL图形驱动)提供 OpenGL 的抽象接口;管理 OpenGL 上下文、渲染管线
TKService窗口服务库Aspect_Window.hxx,Aspect_DisplayConnection.hxxAspect_DisplayConnection(显示连接)管理窗口系统集成(如 X11、Win32),处理事件循环、窗口属性
TKPrim基本几何体库BRepPrimAPI_MakeBox.hxxBRepPrimAPI_MakeBox(创建立方体)创建基本几何体(立方体、球体、圆柱体等),参数化几何体的构造
TKBO布尔操作BRepAlgoAPI_Fuse.hxx,BRepAlgoAPI_Cut.hxxBRepAlgoAPI_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();// 打开文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++类与对象—下:夯实面向对象编程的阶梯

9. 赋值运算符重载 9.1 运算符重载 在 C 里&#xff0c;运算符重载能够让自定义类型的对象像内置类型那样使用运算符&#xff0c;这极大地提升了代码的可读性与可维护性。运算符重载本质上是一种特殊的函数&#xff0c;其函数名是 operator 加上要重载的运算符。 下面是运算…

【深度学习-Day 6】掌握 NumPy:ndarray 创建、索引、运算与性能优化指南

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

工程师 - 汽车分类

欧洲和中国按字母对汽车分类&#xff1a; **轴距**&#xff1a;简单来说&#xff0c;就是前轮中心点到后轮中心点之间的距离&#xff0c;也就是前轮轴和后轮轴之间的长度。根据轴距的大小&#xff0c;国际上通常把轿车分为以下几类&#xff08;德国大众汽车习惯用A\B\C\D分类&a…

[低代码 + AI] 明道云与 Dify 的三种融合实践方式详解

随着低代码平台和大语言模型工具的不断发展,将企业数据与智能交互能力融合,成为提高办公效率与自动化水平的关键一步。明道云作为一款成熟的低代码平台,Dify 则是一个支持自定义工作流的开源 LLM 应用框架。两者结合,可以实现灵活、高效的智能化业务处理。 本文将详解明道…

鼠标悬浮特效:常见6种背景类悬浮特效

鼠标悬浮特效&#xff1a;常见6种背景类悬浮特效 前言背景闪现效果预览代码展示 元素阴影效果预览代码展示 元素悬浮阴影效果预览代码展示 元素上浮阴影效果预览代码展示 元素边框阴影效果预览代码展示 元素卷角效果预览代码展示 结语 前言 在之前的文章中&#xff0c;我们介绍…

[人机交互]理解与概念化交互

零.本章重点&#xff08;理解和分析用户问题&#xff09; – 解释“问题空间”的概念和含义 – 解释如何概念化交互 – 描述什么是概念模型 – 讨论将界面隐喻作为概念模型的利弊 – 讨论界面具体化和抽象化各自的优缺点 – 概述概念设计和实际设计的关系 一.理解问题空间 简单…

9.城市基础设施更新工程

9.1 道路改造施工 9.1.1 道路改造施工内容 沥青、水泥混凝土、砌块路面、人行步道、绿化照明、附属设施、交通标志、沥青路面材料的再生利用 9.1.2 道路改造施工技术 1.沥青路面病害及微表处理 1.病害处理 裂缝处理 10mm以内专业灌缝材料或热沥青灌缝、潮湿时乳化沥青灌封…

Milvus(11):动态字段、可归零和默认值

1 动态字段 Collections 的 Schema 中定义的所有字段都必须包含在要插入的实体中。如果希望某些字段是可选的&#xff0c;可以考虑启用动态字段。 1.1 概述 在 Milvus 中&#xff0c;可以通过设置 Collections 中每个字段的名称和数据类型来创建 Collections Schema。向 Schem…

LeetCode41☞缺失的第一个正数

关联LeetCode题号41 本题特点 数组&#xff0c;哈希表 本题思路 找缺失的最小正数&#xff0c;看举例说明缺失的正数&#xff0c;一种情况是连续的最小的正数&#xff0c;一种是缺失连续但不是最小的正数验证数组内数组是否连续&#xff0c;可以通过 nums[i]1 是否存nums组…

补题( Convolution, 二维卷积求输出矩阵元素和最大值)

来源&#xff1a;https://codeforces.com/gym/105231/problem/H 题目描述&#xff1a; 一、题目分析 本题涉及深度学习中的二维卷积操作。给定一个nm的二维输入矩阵I和一个kl的核矩阵K &#xff0c;通过特定公式计算得到(n - k 1)(m - l 1)的输出矩阵O &#xff0c;要求在…

【Java ee初阶】多线程(7)

一、线程池 线程池的一些参数&#xff1a; corePoolSize&#xff1a;核心线程数量 maximumPoolSize:核心线程数量临时线程数量 上述是“java 的线程池策略”&#xff08;其他语言&#xff0c;其他库的线程池可能不同&#xff09; keepAliveTime :临时线程的存活时间.临时线程…

Linux 常用指令详解

Linux 操作系统中有大量强大的命令行工具&#xff0c;下面我将分类介绍一些最常用的指令及其用法。 ## 文件与目录操作 ### 1. ls - 列出目录内容 ls [选项] [目录名] 常用选项&#xff1a; - -l&#xff1a;长格式显示&#xff08;详细信息&#xff09; - -a&#xff1a;显…

uv安装及使用

windows安装参考&#xff1a; 什么是python uv&#xff0c;如何在windows上安装uv&#xff0c;基础的用法有哪些&#xff1f;_windows安装uv-CSDN博客 https://zhuanlan.zhihu.com/p/6776864377 使用方式 方式1&#xff1a; 创建uv虚拟环境->激活环境->安装依赖&…

C#实现Socket通信:基于TCP/IP协议的网络编程

TCP/IP网络模型 最上层的是应用层&#xff0c;也就是我们日常可以接触到的&#xff0c;它会给数据添加对应的头部&#xff0c;并传输给传输层&#xff0c;应用层是我们日常会接触到的&#xff0c;比如HTTP&#xff0c;FTP&#xff0c;Telnet&#xff0c;DNS&#xff0c;SMTP。…

哈希算法、搜索算法与二分查找算法在 C# 中的实现与应用

在计算机科学中&#xff0c;哈希算法、搜索算法和二分查找算法是三个非常基础且常用的概念。它们分别在数据存储、数据查找、以及高效检索等场景中起着至关重要的作用。在 C# 中&#xff0c;这些算法的实现和使用也十分简便。本文将详细讲解这三种算法的原理、应用以及 C# 中的…

AI日报 · 2025年5月05日|雅诗兰黛与微软合作成立 AI 创新实验室,加速美妆产品研发与营销

1、苹果与 Anthropic 深化合作&#xff0c;内部测试 AI 驱动的新版 Xcode 据多方报道&#xff0c;苹果公司正与人工智能初创公司 Anthropic 合作&#xff0c;开发集成 AI 功能的新一代 Xcode 开发平台。该平台旨在利用 Anthropic 强大的 Claude Sonnet 模型&#xff0c;为开发…

python celery框架结合django的使用

学习目标&#xff1a; 通过文章了解celery的运行机制以及如何结合django去使用 熟悉celery的运行原理属性celery在django项目当中的配置如何启动运行celery框架 学习内容&#xff1a; 熟悉celery的运行原理&#xff0c;简单来说 Celery 是一个“任务排队机后台处理器”。帮你…

滑动窗口leetcode 904

代码&#xff1a; class Solution { public:int totalFruit(vector<int>& fruits) {int n fruits.size();unordered_map<int,int> window_type_count;int left 0;int ans 0;for(int right 0; right <n;right){while(window_type_count.size() 2 &&…

用可视化学习逆置法

1.逆置法思路 目标&#xff1a;将这个彩色数组向右旋转3步 &#x1f534;1 → &#x1f7e0;2 → &#x1f7e1;3 → &#x1f7e2;4 → &#x1f535;5 → &#x1f7e3;6 → ⚪7我们希望得到 &#x1f535;5 → &#x1f7e3;6 → ⚪7 → &#x1f534;1 → &#x1f7e0;…

Cisco Packet Tracer 选项卡的使用

目录 设备Config选项卡的使用 Realtime and Simulation模式&#xff08;数据包跟踪与分析&#xff09; 设备Desktop选项卡的使用 设备Config选项卡的使用 Hostname NVRAM Startup Config----Load 加载 INTERFACE 点击on Save 如果&#xff0c;不把Running Config保存为Sta…