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️⃣ 强分层(核心设计)

职责
Baseruntime
AppCAD逻辑
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(非常工程化)

你想先看哪一块源码,我可以直接帮你“逐文件级别拆解”。

类似文章