2.前置基础与OCCT整体认知
第一部分:前置基础与OCCT整体认知(小白版)
目标:搞懂OCCT到底是干什么的,不用写代码,建立整体概念。 适合小白:避开晦涩术语,遇到专有名词我会直接解释。
1.1 OCCT是什么
OCCT全称 Open CASCADE Technology,是一套开源的三维CAD几何内核库。
通俗解释
什么叫“CAD几何内核”?
- 我们平时用的SolidWorks、UG、Creo,它们内部都有一套“看不见的数学算法”: 输入“拉伸100mm、倒圆角5mm、布尔减”,内核去计算点、线、面,生成三维模型。
- OCCT就是这样一套底层算法库,它没有界面,不给你提供按钮、菜单。
- 你要用C++调用它提供的一堆类和函数,自己去写界面、自己做按钮,实现CAD建模功能。
📌一句话总结: OCCT ≠ CAD软件,OCCT是造CAD软件的“零件工具箱”。你拿这个工具箱,自己组装出CAD软件。
它能做什么(应用场景)
- 机械CAD:生成零件、装配、倒角、打孔、布尔运算
- 数据转换:读取STEP/IGS模型,格式转换,模型修复
- BIM建筑建模、逆向工程、仿真前置处理
- 自研工业软件、轻量化工具、模型检查工具
OCCT 和商业内核简单对比
| 内核 | 开源/商业 | 特点 |
|---|---|---|
| OCCT | 开源免费 | 代码全可见,但是文档一般,坑多,需要自己处理很多报错 |
| ACIS / Parasolid | 商业付费 | 稳定、容错强,闭源,要高额授权费 |
小白提示:很多国内工业软件公司,都是基于OCCT二次开发,规避商业内核高昂授权费。
OCCT版本怎么选(工程角度)
-
7.4.0:老版本,很多老项目在用,bug多,但是网上资料多
-
7.7~7.9.1:现在主流稳定版本,bug修复很多,新API,推荐学习就用 7.9.1
不要追最新开发版,容易出现编译崩溃,学习优先选稳定release版本。
1.2 需要哪些前置基础(小白重点)
如果你这些基础薄弱,不用精通,知道概念就可以,后面写代码遇到再回头补。
1)C++基础(最重要)
OCCT是纯C++库,不支持C语言。必须要懂这些概念:
-
类、对象、构造函数
-
继承
-
指针 / 引用
⚠️注意:OCCT不用std::shared_ptr,它有自己一套内存管理机制:
Handle_XXX智能句柄,这个后面环境搭建之后专门讲。 -
简单模板概念。
小白忠告:不用成为C++大神再学OCCT。可以边学OCCT边补C++。
2)计算机图形学基础(三维)
只需要懂最基础概念,不用手写矩阵:
- 三维坐标系:X Y Z轴,右手坐标系(OCCT默认右手坐标系)
- 点:gp_Pnt,三维空间一个位置
- 向量:方向,用来做平移旋转
- 变换:把模型移动、旋转、缩放。底层是矩阵,OCCT会封装好,大部分情况你不用手写矩阵。
3)CAD领域专有概念(小白最容易卡在这里)
这里先记住名词,后面会反复用到:
-
参数化建模:用数字参数驱动模型,比如长方体长=10宽=20高=30,改数字模型就变。
-
几何 Geometry:数学层面。比如一条直线方程、一个球面数学方程。只描述数学。
-
拓扑 Topology:描述物体的连接关系。哪个点属于哪条边,哪条边属于哪个面。
✨小白灵魂区分:
- 几何:“这个球面数学是什么样”
- 拓扑:“这个球由哪些面、边、顶点拼起来,它们怎么连在一起”
-
布尔运算:两个实体相加合并、相减挖洞、求交集。
-
容差 Tolerance:CAD世界最重要概念!
现实计算机浮点数有误差,两个理论上应该重合的点,计算出来差0.000001毫米。OCCT靠容差判断“两个点算不算同一个点”。绝大多数OCCT报错、破模型,根源都是容差不对。
容差先有印象,后面数学模块会细讲。
1.3 OCCT整体架构与模块全景
OCCT把功能拆成很多模块,每个模块对应一堆库文件。 整体分为6大层,从上到下理解:
- Kernel核心内核层:数学基础、内存管理、基础数据结构。最底层。
- 几何层(Geom):曲线、曲面数学定义。只管数学,不管拓扑。
- 拓扑 & BRep层:边界表达,把几何加上连接关系,变成可以建模的实体。OCCT灵魂所在。
- 建模算法层:拉伸、旋转、布尔、倒角、修复,各种建模算法。
- 可视化层(V3d/AIS):把模型渲染到屏幕,显示颜色、拾取物体。
- IO文件层:读写STEP、IGS、BREP、STL文件。
常用核心模块名字,先混个脸熟,不用背
- TKMath:数学库,点向量矩阵变换
- TKG2d / TKG3d:2D、3D几何
- TKGeomBase:曲线曲面基础
- TKTopAlgo:拓扑相关算法
- TKPrim:基础特征(拉伸旋转等)
- TKBO:布尔运算!高频使用
- TKBRep:BRep边界表达,拓扑实体
- TKIVtk / TKV3d / TKAIS:可视化、显示交互
- TKSTEP:STEP文件读写
小白提示:以后写CMake的时候,就是把这些模块名字作为依赖链接。
OCCT命名小规则(看懂类名,减少查文档压力)
gp_XXX:基础数学类。gp_Pnt点,gp_Vec向量,gp_Trsf变换。轻量对象,栈上分配,不用Handle。Geom_XXX:几何类(曲线曲面),继承自Standard_Transient,必须用Handle管理内存。TopoDS_XXX:拓扑对象。TopoDS_Vertex顶点,TopoDS_Edge边,TopoDS_Face面。
两个对象类型区别非常关键:
- gp_xxx:普通小对象,直接
gp_Pnt p(0,0,0);栈创建。- Geom_xxx:继承Transient,必须用Handle句柄,OCCT自己的引用计数管理内存,不能new裸指针。
1.4 OCCT内存管理:Handle_XXX 句柄(重中之重)
很多新手写OCCT代码第一步就崩溃,根源就是不懂Handle。
两类对象,两种内存方式
OCCT里面对象分成两大类,完全不一样用法,千万不要搞混。
第一类:gp_* 系列(数学轻量对象)
例子:gp_Pnt点、gp_Vec向量、gp_Trsf变换、gp_Circ圆。
- 体积很小,普通数据结构体
- 直接在栈上创建,不用new,不用Handle
gp_Pnt p1(10,20,30); // 直接定义,栈对象,自动销毁
直接复制赋值即可:gp_Pnt p2 = p1;,拷贝一份完整数据。
第二类:继承 Standard_Transient 的对象
例子:Geom_Line、Geom_Surface,几乎所有曲线、曲面、高级几何类。
- 这类对象不能裸new直接用,不能直接写
Geom_Line line;,编译报错。 - OCCT自己实现了一套引用计数智能指针,就是
Handle_类名。
✅正确写法:
Handle(Geom_Line) aLine = new Geom_Line(gp_Pnt(0,0,0),gp_Dir(1,0,0));
Handle(Geom_Line)等价于Handle_Geom_Line,两种写法都可以。
Handle做了什么?
- 底层维护引用计数。有多少个Handle指向这个对象,计数+1。
- 当所有Handle全部销毁,计数变为0,对象自动释放内存。
- 不需要手动delete,禁止手动delete这个new出来的对象。
📌小白踩坑提醒:
- 不要拿gp对象和Handle对象互相赋值,编译直接报错。
- TopoDS_XXX(顶点、边、面)拓扑对象,不用Handle!它是值对象,可以直接赋值拷贝。
TopoDS_Vertex v; // 直接用,不是Handle
简单总结一张小表:
| 对象类型 | 示例 | 内存方式 | 是否Handle |
|---|---|---|---|
| gp_xxx数学 | gp_Pnt,gp_Vec | 栈,值拷贝 | ❌不需要 |
| Geom_xxx几何 | Geom_Line,Geom_Surface | 堆,引用计数 | ✅必须Handle |
| TopoDS_xxx拓扑 | TopoDS_Vertex,TopoDS_Face | 值对象,句柄封装 | ❌不需要Handle |
Standard_Transient 是什么
它就是OCCT所有需要Handle管理的类的基类。 只要类继承了它,就必须配合Handle使用,这是OCCT早期C++开发,在std::shared_ptr还没有普及的时候做的自研智能指针。
不要把Handle等同于std::shared_ptr,底层实现不一样,不要混用。
1.5 OCCT学习资源(小白去哪里查资料)
1)官方文档(最重要,必看)
OCCT官方文档分两块:
- User Guide 用户指南:概念讲解,讲模块、原理,适合入门读。
- Reference Manual API参考手册:每个类、每个函数的参数说明,写代码的时候查。
缺点:中文文档几乎没有,全部英文。但是用词不难,结合类名看。
2)官方示例代码(重中之重)
源码包下面有 samples 文件夹。
-
samples/cxx:C++示例,是最好的学习材料。小白学习建议:后面环境搭好之后,不要上来就自己写,先跑官方sample,看懂sample再改。
3)Demo程序:Draw Harness
OCCT自带一个脚本交互工具 Draw Harness。 不用写C++,输入脚本命令就可以直接建模、看模型。
作用:验证算法效果。比如想测试布尔运算效果,先在Draw里面敲命令看效果,再翻译成C++代码。 后面环境搭建章节会讲怎么跑Draw。
4)网上资源现状
- 国内博客大部分都是复制粘贴,版本老旧,很多是7.4以前的旧代码,直接复制会编译报错。
- github上可以搜opencascade相关demo,优先看更新时间比较新的项目。
小白忠告:优先官方文档+官方sample,博客当做辅助参考,不要把博客当圣经。
1.6 OCCT编码习惯、命名再强化一遍
gp_:底层数学,栈对象Geom_:几何曲线曲面,Handle管理TopoDS_:拓扑实体(顶点、边、面、实体),值类型BRep_:BRep边界表达相关TKXXX:CMake链接库模块名
看到类名,就能大概猜到它属于哪个模块,减少查文档的压力。
第一部分小结
第一部分全部是概念,我们搞懂了:
- OCCT是开源CAD几何内核,不是软件,是C++库。
- 区分几何、拓扑、容差这些CAD基础名词。
- 六大模块分层架构,各个TK模块大概用途。
- 三种对象内存模型:gp / Handle(Geom_xxx) / TopoDS_xxx,这个是写代码第一道坎。
- 去哪里找官方文档、示例、Draw工具。
第一部分到此全部结束。 接下来进入第二部分:开发环境搭建与工程配置。 我会讲Windows平台 VS2022 + CMake + OCCT7.9.1,包含:
- 选择源码编译还是下载预编译包,两种方案优缺点
- CMakeLists模板讲解
- 第一个最小demo:创建一个方块,输出到brep文件(暂时不涉及可视化窗口,先跑通无界面版本)

浙公网安备 33010602011771号