本文旨在分析FreeCAD中的微内核架构。
注1:限于研究水平,分析难免不当,欢迎批评指正。
注2:文章内容会不定期更新。
1. 背景
微内核(Microkernel)架构是一种将系统核心功能最小化、将大部分扩展功能以插件或模块形式实现的架构风格。其核心思想是:
- 核心(kernel)只负责最基础的服务,如对象管理、通信、模块加载等。
- 其他功能(如GUI、建模、导入导出等)均以独立模块/插件形式按需加载。
一般意义的微内核架构图:
微内核(Kernel)
服务/扩展1
服务/扩展2
服务/扩展3
用户应用
FreeCAD为何采用微内核架构?
- 可扩展性:用户和开发者可通过Python/C++模块、工作台(Workbench)等机制灵活扩展功能,无需修改核心代码。
- 模块化:FreeCAD的每个功能模块(如Part、Mesh、Draft、Path等)均为相互解耦的独立单元,既可独立开发、测试和发布,也可由不同开发团队并行演进。模块之间通过标准接口与内核通信,极大提升了项目的可维护性和创新活力。
- 灵活性:不同领域(如机械、建筑、仿真等)可通过独立工作台实现,互不干扰。
- 稳定性与安全性:核心功能精简,降低系统复杂度,插件崩溃不会影响主程序。
- 跨平台与社区协作:便于社区贡献新模块,支持多平台部署。
FreeCAD中的微内核架构图:
注册/扩展
集成
注册/调用
C++/Python互操作
扩展
微内核(Base/App/Gui)
Python解释器(Base::Interpreter)
主窗口(Gui::MainWindow)
工作台管理器(WorkbenchManager)
工作台(Workbench/WorkbenchPy)
命令管理器(CommandManager)
文档对象(App::Document / Gui::Document)
插件/扩展模块(Python/C++)
FreeCAD的微内核架构为其成为通用、可定制的CAD平台奠定了基础。
2. 主要组件
- Application / ApplicationPy:FreeCAD应用程序主控类,负责应用生命周期管理、模块加载、环境初始化等。
- Workbench / WorkbenchPy:工作台基类(C++/Python),定义菜单、工具栏、命令等扩展点,所有自定义工作台需继承。
- WorkbenchManager:工作台管理器,负责注册、查找、激活和管理所有已加载的工作台。
- Gui::MainWindow:主窗口类,负责主界面、菜单、工具栏等GUI元素的管理。
- Command / CommandManager:命令与命令管理器,负责注册、查找和执行各类命令。
- Base::Interpreter:Python解释器集成,负责C++/Python互操作。
- App::Document / Gui::Document:文档对象,负责CAD数据与界面状态的管理。
- Python模块(如src/Gui/FreeCADGuiInit.py):负责注入Python侧基类、初始化脚本等。
这些类共同构成了FreeCAD微内核架构的基础,支撑了模块化、插件化的扩展机制。
主要组件类图(简化):
<<集成>>
<<注册命令>>
<>
<<扩展数据>>
Application
+init()
+loadModule()
+registerWorkbench()
Workbench
+Initialize()
+GetClassName()
WorkbenchManager
+addWorkbench()
+activateWorkbench()
MainWindow
CommandManager
Document
Interpreter
3. 关键流程
1. Application的初始化
- FreeCAD启动时,首先初始化Application(核心应用对象),负责环境配置、模块路径设置、基础服务注册等。
- 加载
src/Gui/FreeCADGuiInit.py等初始化脚本,注入Python侧的基础类型(如Workbench基类)。
2. 利用反射校验与加载模块
- Application在加载模块(如Python工作台)时,利用Python反射机制:
- 检查模块中是否存在
Workbench基类(或其子类)。 - 校验模块结构、接口方法(如
Initialize、GetClassName等)是否符合规范。 - 通过
addWorkbench等接口注册模块。
- 检查模块中是否存在
3. Workbench的加载与注册
FreeCAD的workbench机制分为C++侧和Python侧两个层面:C++ 侧的Workbench类及其派生类由 WorkbenchManager统一管理,负责工作台的创建、激活、生命周期等;Python侧的工作台对象通常继承Python侧的Workbench基类,负责实现Initialize、Activated、Deactivated 等方法,注册到 _pcWorkbenchDictionary,并通过 C++/Python 绑定与 C++ 层交互。
- 用户/开发者定义自定义工作台(继承
Workbench基类),实现所需方法。 - 通过
FreeCADGui.addWorkbench(MyWorkbench())注册到系统。 - C++层(如
ApplicationPy::sAddWorkbenchHandler)接收注册请求,反射校验并将工作台对象注册到WorkbenchManager。 - 激活工作台时,系统自动调用其
Initialize等方法,完成菜单、工具栏等界面元素的挂载。
该流程实现了C++/Python的无缝协作,保证了FreeCAD插件/模块机制的灵活与安全。
关键流程时序图:
C++ (ApplicationPy/WorkbenchManager) Python (FreeCADGui) 用户/模块 C++ (ApplicationPy/WorkbenchManager) Python (FreeCADGui) 用户/模块 定义 MyWorkbench(Workbench) FreeCADGui.addWorkbench(MyWorkbench()) ApplicationPy::sAddWorkbenchHandler 反射校验/注册到 WorkbenchManager 激活时回调 Initialize() 注册命令、菜单、工具栏等
文献资料
- Mark Richards. Software Architecture Patterns. O'Reilly Media, 2015.
- FreeCAD 源码
- FreeCAD 官方文档
- Jürgen Riegel, Werner Mayer, Yorik van Havre. FreeCAD: An Open Source Parametric 3D CAD Modeler.
- Microkernel Architecture Patterns, Microsoft Docs