桌面应用3D渲染【免费下载链接】PrusaSlicerG-code generator for 3D printers (RepRap, Makerbot, Ultimaker etc.)项目地址https://gitcode.com/gh_mirrors/pr/PrusaSlicer点击查看免费下载导读本文以 PrusaSlicer 仓库中 src/slic3r-shared/include/Slic3r/App/Plater/README.md 为骨架深入剖析切片软件打印平台Plater的完整应用层架构Slic3r::App::Plater命名空间如何组织渲染模块、场景呈现器与 Gizmo 管理器如何通过Slic3r::Biz::Scene::SceneInteractor与领域模型Slic3r::Domain::Project交互。读完本文你将掌握 PrusaSlicer 中界面事件 → 业务操作 → 领域数据 → 界面刷新的完整调用链以及 GizmoManager 对工具 Gizmo、选择、拖拽与相机操作的四级调度模型并可据此定位源码中的各组件实现。命名空间与职责划分应用层、业务层与领域层Slic3r::App::Plater命名空间容纳完整的打印平台应用层原文This namespace accommodates complete plater application layer。围绕它PrusaSlicer 将整个切片器拆分成三个层次命名空间层次代表组件职责Slic3r::App::Plater应用层PlaterRenderModule、PlaterScenePresenter、各 Gizmo渲染、界面布局、用户交互入口Slic3r::Biz::Scene业务层SceneInteractor执行操作、维护场景选择状态、广播变更Slic3r::Domain领域层Project、Model领域数据模型与界面无关从仓库目录结构看这一划分与物理目录一一对应App/Plater 目录下存放了全部平台级 GizmoTranslationGizmo、RotationGizmo、ScaleGizmo、CutGizmo、TextGizmo等与渲染模块头文件Biz/Scene/SceneInteractor.hpp 定义了业务层的场景交互器App/Scene/GizmoManager.hpp 则位于应用层的通用场景子目录中被 Plater 与 Preview 共用。设计上App::Plater只负责展示与交互不直接持有领域数据一切对Project的修改都必须经由Biz::Scene层的SceneInteractor以保证业务规则与领域不变量集中在业务层维护。核心交互流程从渲染模块到领域模型README 用一张 Mermaid 图描述了与Project或其子部分如 Model交互的基本流程图中的三条实线--与两条虚线-.-构成了完整的双向闭环下面逐一对应到源码。1. 事件入口PlaterRenderModule → GizmoManagerPlaterRenderModule是平台的顶层渲染模块。查看其声明 PlaterRenderModule.hpp它继承App::RenderModuleBase并实现了十余个监听器接口包括Platform::ICommandExecutedListener命令执行Biz::ISelectedProjectChangedListener选中项目切换Biz::Preset::IPresetChangedListener预设变更Biz::Scene::ISceneSelectionChangedListener场景选择变更Scene::IGizmoActiveToolListener活动工具变更其中的on_scene_mouse_event()、on_scene_selection_changed()等方法正是 README 图中 PlaterRenderModule -- |event| GizmoManager 的具体实现——渲染模块收到平台鼠标/键盘/选择事件后将其转交给内部的GizmoManager处理。2. 操作执行GizmoManager → SceneInteractorGizmoManager收到事件后根据当前激活的工具 Gizmo 决定要执行的业务操作进而调用SceneInteractor。SceneInteractorSceneInteractor.hpp公开了完整的操作 API 面例如对象操作add_new_objects()、add_instance()、delete_selected_elements()、clone_objects_from_project()变换操作transform_selection()交互式拖动、transform_instances()、finalize_transform_selection()分割合并split_selection_to_objects()、merge_selection_into_object()标注类modify_facets_annotations()支撑、接缝、模糊皮肤、多材料涂装共用层高相关modify_layer_height_profile()、modify_layer_config_ranges()值得注意的是SceneInteractor同样实现了多个监听器接口ISelectedProjectChangedListener、IPresetChangedListener等并维护着按项目隔离的ProjectContextsstd::unordered_mapDomain::SelectionId, SceneInteractorProjectContext即每个打开的项目拥有独立的场景状态与选择状态。3. 修改领域模型SceneInteractor → ProjectSceneInteractor执行操作后直接修改Domain::Project——这就是图中 SceneInteractor -- |modify project| Project。它同时持有BedPlacement摆床与BedTracking床跟踪两个业务组件负责在变换元素时更新其所属床实例BedTrackingChanges并同步维护擦嘴塔wipe tower的包含关系见 SceneInteractor.hpp 的update_wipe_tower_containment()。4. 变更通知与帧请求两条虚线回路变更通知SceneInteractor通过WithListeners...广播四类事件——ISceneSelectionChangedListener、ISceneChangedListener、ISceneBedInstanceChangedListener、ISlicingInputChangedListener。PlaterScenePresenter订阅了其中绝大多数PlaterScenePresenter.hpp收到通知后重建/更新场景节点这正是 SceneInteractor -.- |notify about project change| ScenePresenter。帧请求PlaterScenePresenter在场景脏标记后通过Render::CommandBuffer请求渲染模块绘制新帧对应 ScenePresenter -.- |request new frame| PlaterRenderModule。SceneInteractor.hpp中ISceneChangedListener接口的注释给出了事件语义on_instance_added时调用者有责任为给定实例创建全部体积表示The callee is responsible to create all volume representations for given instanceson_volume_added同理——这正是业务层只改数据、应用层负责呈现这一分层原则的直接体现。ScenePresenter按项目隔离的场景呈现器PlaterScenePresenter是应用层中连接业务通知与渲染场景的枢纽。它继承模板基类Scene::ScenePresenterBasePlaterScenePresenterProjectContextScenePresenterBase.hpp基类注释明确说明Base class shared by the scene presenters (PlaterScenePresenter, PreviewScenePresenter) that own one Scene per open project and expose it through ISceneProvider——即 Plater 与 Preview 两个呈现器共享同一套每个打开项目一个 Scene的存储与相机/场景簿记逻辑仅通过模板参数ProjectContextT注入各自更丰富的项目上下文类型。PlaterScenePresenter实现的关键接口包括Scene::IProjectSceneProviderproject_scene(project_id)按项目 ID 返回对应Scene一批业务变更监听器IProjectsChangedListener项目加载/移除、IFDMResultCacheChangedListener/ISLAResultCacheChangedListenerFDM/SLA 切片结果缓存变更、IColorsChangedListener颜色变更、IVirtualExtrudersChangedListener虚拟挤出机变更床实例相关on_bed_instance_updated、on_bed_instance_removed、on_bed_instance_transformed以及虚拟床预览on_virtual_bed_preview_changed。场景节点由私有方法build_volume_node()构建、refresh_volume_nodes()按需刷新擦嘴塔则通过build_wipe_tower_node()/build_unknown_wipe_tower_node()呈现。另有一个值得留意的启动细节force_bed_thumbnails_generation()的注释指出场景初始化发生在构造函数中、早于任何IBedVisuallyChangedListener的注册见 PlaterScenePresenter.hpp因此需要此方法在监听器就绪后强制生成床缩略图。GizmoManager平台交互的四级调度README 的第二张图给出了 GizmoManager 内部的处理流程即渲染模块把事件交给GizmoManager后事件按以下四级逐层分发Active Tool活动工具当前激活的工具 Gizmo如平移、旋转、缩放、切割、涂装优先消费事件Selection选择由QuickSelectGizmo处理框选/点选维护场景选择状态QuickDrag快速拖拽由QuickDragGizmo处理非工具状态下的快速拖动如直接拖动对象实例CameraManipulation相机操作由相机类 Gizmo 处理视角旋转、平移与缩放。从源码结构看后三级分别对应Plater目录下的基础 GizmoQuickSelectGizmo声明于 QuickSelectGizmo.hpp、QuickDragGizmo实现Scene::IGizmo与Scene::IMouseDrag接口见 QuickDragGizmo.hpp与PlaterCameraGizmo。可以推断README 中笼统的 CameraManipulation 即对应相机操作类 Gizmo 的整体能力。GizmoManager 的类结构GizmoManager.hpp 中GizmoManager继承WithListenersIGizmoActiveToolListener、Biz::ISelectedProjectChangedListener、Biz::IProjectsChangedListener、Biz::Scene::ISceneSelectionChangedListener并实现IGizmoController控制器接口。其内部按两类容器组织 Gizmom_base_gizmosGizmoList常驻的基础 Gizmo通过add_base_gizmoG(...)注册m_tool_gizmosToolGizmoList可激活的工具 Gizmo通过add_tool_gizmoG(...)注册。两种注册方法都会把新 Gizmo 加入MouseDragDetector的监听列表、调用register_commands()注册命令、注入共享的Clipper裁剪器与GizmoController。GizmoManager还持有ProjectScopedProjectContext的按项目隔离上下文ProjectContext记录各项目的active_tool、in_cycle循环状态、最近鼠标事件等并对外提供activate_tool()/deactivate_current_tool()/current_tool_type()等控制器方法与find_tool(ToolType, PrinterTechnology)工具查找。工具 Gizmo 的完整注册清单在 PlaterRenderModule.cpp 的init_gizmos()中可以看到全量注册逻辑。它首先构造Scene::MouseDragDetectormin_drag_time_span 500ms、min_drag_offset 500um源码注释标注这两处为待接入 OS 设置的 TODO然后依次注册基础 Gizmobase gizmosGizmo职责PlaterCameraGizmo相机操作视角控制BedSelectGizmo床实例选择ContextMenuGizmo右键上下文菜单QuickSelectGizmo快速选择订阅IHoverChangedListener并反向监听相机更新QuickDragGizmo快速拖拽工具 Gizmotool gizmosTranslationGizmo、RotationGizmo、ScaleGizmo、PlaceOnFaceGizmo贴合面放置、ArrangeGizmo自动排列、SimplifyGizmo简化附带SimplifyNotification通知、PaintOnSupportsGizmo支撑涂装、PaintOnSeamsGizmo接缝涂装、PaintOnFuzzySkinGizmo模糊皮肤涂装、MultiMaterialPaintingGizmo多材料涂装、TextGizmo文字、SvgGizmoSVG、MeasureGizmo测量、CutGizmo切割、VariableLayerHeightGizmo可变层高、HeightRangeGizmo高度范围。其中PlaceOnFaceGizmo、MeasureGizmo、CutGizmo在注册后还额外向SceneInteractor注册为ISceneSelectionChangedListener以便在选择变化时即时刷新自身状态PlaterRenderModule.cpp。这些 Gizmo 的头文件全部位于 App/Plater 目录与 README 同目录可作为继续深挖每个工具的入口。平台层与业务层的协作边界几个代表性案例变换操作的协调用户拖动对象时GizmoManager将鼠标事件分发给TranslationGizmo该 Gizmo 调用SceneInteractor::transform_selection()传入相对变换与TransformMemento记忆起始状态并把place_on_bed参数一并传入。SceneInteractor的接口注释强调了变换的语义SceneInteractor.hpp相对变换始终在世界坐标系中解释若要绕某点O旋转调用方必须自行构造T(O) * R * T(-O)。拖动结束后必须调用finalize_transform_selection(memento, canceled)结束操作TransformMemento中保存了每个元素的原始变换用于支持取消ESC。拖拽期间业务层以TransformState::InProgress状态广播松手后以Completed广播取消则以Canceled广播——事件语义定义在 SceneInteractor.hpp。虚拟床预览SceneInteractor还提供虚拟床预览show_virtual_bed_preview()/hide_virtual_bed_preview()其注释明确说明这只是当用户拖拽对象到新床位置时将被追加的床的纯视觉预览永远不属于领域/撤销状态Never part of domain/undo state并通过virtual_bed_preview_accepts_selection()复用BedTracking包含逻辑判断未放置实例是否会落入新床。这一能力通过ISceneBedInstanceChangedListener::on_virtual_bed_preview_changed()通知呈现层。撤销/重做集成PlaterRenderModule构造时接收App::Undo::StorePlaterRenderModule.hpp并在init_gizmos()中通过m_undo_store.set_gizmo_controller(m_gizmo_manager.get())把 Gizmo 控制器接入撤销存储GizmoManager实现的IGizmoController接口tools_state()/set_tools_state()正是为跨撤销步骤恢复工具激活状态而设计。SceneInteractor侧则通过set_undo_provider()注入IUndoProvider业务操作得以纳入统一的撤销体系。总结与源码导航Slic3r::App::Plater是一个薄应用层 厚业务层 纯领域层的经典分层设计PlaterRenderModule负责事件入口与帧驱动GizmoManager负责任务调度与工具注册PlaterScenePresenter负责把业务变更翻译为场景节点而所有数据修改统一收敛在Biz::Scene::SceneInteractor最终落盘到Domain::Project。三层之间通过WithListeners事件总线解耦辅以按项目隔离的上下文ProjectScoped/ProjectContexts支持多项目并行。继续深入阅读建议按以下路径平台应用层总览README.md渲染模块与 Gizmo 注册PlaterRenderModule.hpp 与 PlaterRenderModule.cppinit_gizmos()位于 931 行起场景呈现器PlaterScenePresenter.hpp 及其共享基类 ScenePresenterBase.hpp业务交互器SceneInteractor.hppGizmo 管理器GizmoManager.hpp 与全部平台 Gizmo 头文件目录 App/Plater赞分享桌面应用3D渲染【免费下载链接】PrusaSlicerG-code generator for 3D printers (RepRap, Makerbot, Ultimaker etc.)项目地址https://gitcode.com/gh_mirrors/pr/PrusaSlicer点击查看免费下载相关推荐PrusaSlicer 低层渲染层Slic3r::App::Render架构解析渲染 API 无关接口与编译期多态设计PrusaSlicer 低层渲染层Slic3r::App::Render架构解析渲染 API 无关接口与编译期多态设计 Slic3r 是 PrusaSli桌面应用3D渲染PrusaSlicer 架构剖析slic3r-shared 平台无关共享库与 Clean Architecture 分层设计PrusaSlicer 架构剖析slic3r shared 平台无关共享库与 Clean Architecture 分层设计 本文以 PrusaSlicer桌面应用3D渲染PrusaSlicer slic3r-platform 跨平台渲染运行时架构解析AbstractRenderModule 与 AbstractRenderCanvas 设计精读PrusaSlicer slic3r platform 跨平台渲染运行时架构解析AbstractRenderModule 与 AbstractRenderCa桌面应用3D渲染上一篇MiniMind-V跨平台部署终极指南Windows、Linux、Mac三系统配置教程 下一篇5分钟掌握VMagicMirror零设备驱动虚拟形象的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
