OrcaSlicer 现状架构基线
梳理 OrcaSlicer 当前模块边界、运行链路与 AI 接入基线。
更新于 2026-08-15 · system-import
OrcaSlicer 现状架构基线
基线:官方
main @ a62fb17e03d159d5b562cc6d64163346e454b5de。

1. 总体判断
OrcaSlicer 是一个跨平台桌面模块化单体:
libslic3r聚合模型、配置、格式、几何、FFF/SLA 切片和 G-code;libslic3r_gui聚合 wxWidgets GUI、设备、网络、WebView、插件与平台能力;GUI_App是应用组合根和全局服务入口;MainFrame管理顶层导航、菜单和窗口生命周期;Plater是 Prepare/Preview 工作流的核心应用协调器;Model是编辑场景的权威数据源;- FFF 模式下,每个 plate 拥有独立的
Print和GCodeProcessorResult; - 设备输出分为传统
PrintHost和持续连接型IPrinterAgent两套体系。
2. 核心用户旅程
2.1 启动与首次配置
OrcaSlicer main
→ CLI::run
→ GUI_App::OnInit
→ 加载 AppConfig、资源、语言和 profiles
→ 创建 MainFrame / Plater / Device 页面
→ 首次配置向导
本地项目编辑和切片不依赖云登录;网络插件失败时,本地能力仍可运行。
2.2 新建、打开与导入
New / Open / Import
→ 未保存项目与 preset 确认
→ 文件格式解析
→ ModelObject 规范化
→ 加入 Model、ObjectList 和 PartPlate
→ Undo/dirty 更新
→ 相关切片结果失效
.3mf 同时具有“打开项目”“仅导入几何”“加载配置”等语义。当前项目打开不是事务式切换:正式解析前会 reset 旧项目,加载失败后没有完整旧项目回滚。
2.3 Prepare 编辑
GLCanvas3D / Gizmo
→ 临时选择和变换
→ do_move / do_rotate / do_scale
→ 写回 ModelInstance 或 ModelVolume
→ 更新 plate 归属和 ObjectList
→ 创建 Undo snapshot
→ 使切片步骤失效
场景模型:
Model
└─ ModelObject
├─ ModelVolume 几何、部件类型、volume 变换、配置
└─ ModelInstance 实例变换、可打印状态、plate 位置
世界变换为:instance transform × volume transform × mesh。
2.4 参数与预设
有效切片配置由以下来源合成:
Printer preset
+ Process preset
+ Filament presets
+ Project config
+ Plate config
+ Object / Volume / Layer-range overrides
→ DynamicPrintConfig
切换预设还会处理兼容性、未保存变更、FFF/SLA 技术切换、对象位置、dirty 和切片失效。
2.5 切片与 Preview
用户 Slice
→ Plater 校验并选择当前 plate 的 Print
→ BackgroundSlicingProcess::apply(Model, config)
→ Print::apply 增量同步并计算步骤失效
→ Print::process
→ PrintObject 各阶段
→ G-code 与 GCodeProcessorResult
→ slicing-completed event
→ Preview / GCodeViewer
主要 FFF 阶段包括切层、墙、Surface 分类、填充、熨烫、支撑、擦料塔、Skirt/Brim、路径简化和 G-code。
后台切片使用独立 Model 快照,不直接读取 GUI 正在编辑的场景。顶层阶段由切片线程编排,阶段内部通过 TBB 并行。
2.6 导出、发送与设备监控
传统上传:
Plater::send_gcode_legacy
→ PrintHostJob
→ PrintHost queue
→ OctoPrint / Moonraker / PrusaLink 等适配器
持续设备连接:
PrintJob / SendJob
→ NetworkAgent
→ IPrinterAgent
→ LAN / Cloud printer
设备状态:
IPrinterAgent callback
→ GUI_App::CallAfter
→ DeviceManager
→ MachineObject::parse_json
→ Monitor / Status / Storage / Firmware / HMS
2.7 保存、恢复与关闭
Plater::save_project
→ export_3mf
→ StoreParams
→ store_bbs_3mf
→ target.3mf.tmp
→ 成功后原子 rename
→ 清 dirty 和旧恢复备份
自动备份写入临时恢复目录,不覆盖用户项目。关闭窗口会依次处理 Gizmo 编辑、项目保存、preset 保存、上传队列、切片停止和全局服务清理。
3. 架构分层
| 层 | 核心职责 | 主要组件 |
|---|---|---|
| 应用壳 | 生命周期、资源、语言、服务装配 | OrcaSlicer.cpp、GUI_App |
| 顶层导航 | 页面、菜单、快捷键、关闭流程 | MainFrame |
| 应用工作流 | 项目、编辑、切片、预览、导出编排 | Plater |
| 编辑交互 | 3D 场景、对象树、Gizmo、参数侧栏 | GLCanvas3D、ObjectList、Sidebar |
| 场景域 | 对象、部件、实例、plate | Model*、PartPlate* |
| 配置域 | profiles、兼容性、有效配置 | PresetBundle、DynamicPrintConfig |
| 切片域 | 步骤状态、几何处理、路径生成 | Print、PrintObject、PrintRegion |
| 输出域 | G-code、统计、Preview | GCode*、GCodeProcessorResult、libvgcode |
| 持久化 | 3MF 与模型格式 | libslic3r/Format |
| 设备网络 | 发现、状态、上传、打印 | DeviceManager、PrintHost、NetworkAgent |
4. 状态所有权
| 状态范围 | 权威所有者 |
|---|---|
| 应用级 | GUI_App、AppConfig、PresetBundle |
| 项目级 | Plater::Model、Project config |
| 对象级 | ModelObject、ModelVolume、ModelInstance |
| Plate 级 | PartPlate、该 plate 的 Print 与 G-code result |
| 任务级 | BackgroundSlicingProcess、Job/Worker |
| 设备级 | DeviceManager、MachineObject |
新状态必须先确定归属范围,再决定持久化、Undo、dirty、线程和生命周期。
5. 关键兼容边界
.3mf项目必须向后兼容;- Profile key、枚举、默认值、继承和兼容表达式属于公共 schema;
- 新功能关闭时不得改变既有默认切片行为;
- wx 控件只能在 GUI 线程更新;
- 新配置必须声明准确的
PrintStep/PrintObjectStep失效范围; - FFF 多 plate 各自拥有独立切片上下文;
- 所有修改需要 Windows、macOS、Linux 验证;
- 厂商协议应进入
PrintHost、IPrinterAgent或ICloudServiceAgent,不应进入Plater。
6. 主要结构风险
GUI_App既是组合根也是 Service Locator;Plater同时承担视图、模型所有权和跨域编排;- 项目打开不是事务式切换;
- dirty、关闭 freshness 和 backup freshness 存在多套账本;
- 切片 invalidation 与后台线程停止存在严格锁顺序;
- 切片线程、TBB、通用 Worker、网络线程和上传队列多套并发体系并存;
MachineObject和ICloudServiceAgent职责较宽。
因此,新业务能力应优先形成窄接口、领域服务或 Job,再由现有协调器接入。