FreeCAD 源码分析
FreeCAD 源码分析
下面给你做一个**“源码级 FreeCAD 架构拆解”**,尽量按你做 C++ / 引擎 / EDA / CAD 开发的视角来讲,不讲界面操作,只讲“它到底怎么跑起来的”。
一、FreeCAD 总体架构(核心一句话)
FreeCAD =
Parametric CAD 内核(App) + GUI 可视化层(Gui) + 插件式 Workbench 系统
整体是典型:
MVC / App-Gui 分离 + 插件化架构
官方模块分层:Base / App / Gui / Workbench (freecad.github.io)
二、源码目录结构(你必须先看这个)
FreeCAD/src 里最关键:
src/
├── Base/ # 基础库(内存/线程/数学/信号)
├── App/ # CAD核心(文档/对象/参数系统)
├── Gui/ # Qt界面 + Coin3D渲染
├── Mod/ # 工作台(Sketcher/Part/Arch...)
└── CXX/ # OCC封装
三、三大核心层(真正理解 FreeCAD 的关键)
1️⃣ Base 层(底层 runtime)
相当于:
STL + QtCore + engine runtime
关键模块:
- Base::Vector3d
- Base::Matrix
- Base::Handle(类似 smart pointer)
- Base::Exception
- Base::TimeInfo
作用:
- 内存管理
- 数学计算
- 日志系统
- 线程封装
👉 可以理解为:
FreeCAD 的“轻量 engine runtime”
2️⃣ App 层(最核心)
这是 FreeCAD 的CAD 内核(真正建模发生地)
官方定义:
Document + DocumentObject + Property system (freecad.github.io)
🔷 App 的核心对象模型
App::Document
└── DocumentObject (所有实体基类)
├── Part::Feature
├── Sketcher::SketchObject
├── Body
└── Spreadsheet
🔥 核心机制 1:Property System(非常关键)
每个对象:
class DocumentObject {
PropertyList properties;
}
属性类型:
- PropertyLength
- PropertyAngle
- PropertyLink
- PropertyExpression
- PropertyBool
👉 重点:
FreeCAD 不是“改对象”,而是“改属性 + 触发 recompute”
🔥 核心机制 2:Dependency Graph(依赖图)
Sketch → Pad → Fillet → Final Body
每个 object:
- 记录 input dependencies
- 自动 dirty propagation
- recompute graph execution
👉 你最近看到的优化(property-level dependency)就是这个系统升级
🔥 核心机制 3:Recompute Pipeline
Property change
↓
markTouched()
↓
Document recompute
↓
topological evaluation
↓
OCC shape rebuild
3️⃣ Gui 层(Qt + Coin3D)
GUI =
Qt UI + 3D Viewer + ViewProvider系统
🔷 两大核心组件
① ViewProvider(关键)
App::Object
↔
Gui::ViewProvider
职责:
- 显示颜色
- 选中高亮
- shape 渲染
- interaction
👉 App 不管 UI,Gui 只负责显示
② 3D Viewer
FreeCAD 用:
- Coin3D(Open Inventor)
- OpenGL backend
结构:
SceneGraph (Coin3D)
├── Part shape node
├── Mesh node
├── Sketch curves
└── Selection nodes
四、Workbench 系统(FreeCAD 灵魂)
这是 FreeCAD 最大特点:
功能全部插件化
Workbench结构:
Mod/
├── Part/
├── PartDesign/
├── Sketcher/
├── Arch/
├── Draft/
└── FEM/
每个 workbench 包含:
- Python GUI commands
- C++ kernel extension
- toolbars
- icons
- task panels
🔥 Workbench本质
不是插件 UI,而是:
一组“注册到 App 的命令集合”
五、Sketcher / PartDesign(核心建模链)
Sketcher
- 2D constraint solver
- solve geometry graph
- uses solver (Eigen / OpenCascade constraints)
核心:
Sketch → constraints graph → solver → geometry
PartDesign
基于:
Body + Feature chain
Sketch
↓
Pad (extrude)
↓
Pocket (cut)
↓
Fillet
本质:
feature tree + OCC shape rebuild
六、核心几何内核:OpenCASCADE(OCC)
FreeCAD 不自己做几何:
👉 全靠 OCC
OCC负责:
- BRep
- Boolean operations
- NURBS
- STEP/IGES import/export
- Fillet/Chamfer
FreeCAD 和 OCC关系:
FreeCAD App
↓
Part::TopoShape
↓
OCC BRep_Tool / BRepAlgoAPI
七、FreeCAD 执行流程(非常重要)
你可以理解为:
Python / GUI action
↓
Gui::Command
↓
App::DocumentObject change
↓
Dependency graph mark dirty
↓
recompute()
↓
OCC geometry rebuild
↓
Gui ViewProvider redraw
八、FreeCAD 的设计哲学(源码级总结)
1️⃣ 强分层(核心设计)
| 层 | 职责 |
|---|---|
| Base | runtime |
| App | CAD逻辑 |
| Gui | 显示 |
| Mod | 功能插件 |
2️⃣ 数据驱动(不是操作驱动)
不像 OpenGL 或 Unity:
👉 FreeCAD是:
property-driven CAD system
3️⃣ 全部可脚本化(Python API)
你可以直接:
App.ActiveDocument.addObject("Part::Box")
4️⃣ 延迟计算(lazy recompute)
所有修改:
不立即计算,而是标 dirty
九、如果你做 EDA / CAD / 引擎开发,这个最关键
FreeCAD可以总结成:
🔥 本质模型
Parametric Graph Engine
+ Geometry Kernel (OCC)
+ Scene Graph (Coin3D)
+ Plugin Workbench System
十、给你一个“源码阅读路线”(强建议)
如果你要真正读源码:
① App(必须先读)
src/App/Document.*
src/App/DocumentObject.*
src/App/Property.*
② Gui
src/Gui/ViewProvider*
src/Gui/Command*
src/Gui/Selection*
③ Part(OCC封装)
Mod/Part/
src/Part/
④ Sketcher(最复杂)
Mod/Sketcher/
如果你想继续深入(我可以帮你拆)
可以继续往这些方向深挖:
- FreeCAD dependency graph 实现(比 Blender 还复杂)
- Sketch solver(约束求解器)
- OCC 二次开发封装设计
- PartDesign feature recompute pipeline
- FreeCAD 如何做 undo/redo(非常工程化)
你想先看哪一块源码,我可以直接帮你“逐文件级别拆解”。