diff --git a/docs/architecture/studio-3d-stages.md b/docs/architecture/studio-3d-stages.md index b63244a..b41d997 100644 --- a/docs/architecture/studio-3d-stages.md +++ b/docs/architecture/studio-3d-stages.md @@ -606,7 +606,35 @@ shared 全部 **262 项**。`ui_check.py` **566 项检查 0 失败**(新增 "3 --- -## 尚未完成(写清楚,不用"待办"含糊带过) +## 阶段 10:`app_window` 按职责拆分 —— 已完成(2026-09-15) + +拆分动机与评估见 `docs/architecture/studio-architecture.md` 第 6/7 节(那份报告是本阶段的前置结论: +`app_window` 是唯一 fan-in=1 的中心,四个变更驱动挤在一个 3000 行文件里)。 + +| 切片 | 去向 | 内容 | +|---|---|---| +| A1 | `session_metadata.py`(272 行) | 一次会话对外声明的元数据:`session.json` 的 video fps 规则、滤波块、设备采样率、`SessionFacts` | +| A2 | `session_controller.py`(437 行) | 会话状态与生命周期:worker 与当前 worker、相位、会话计数、每会话遥测、运行定时器(16 ms)、结束原因、丢帧上报 | +| B | `replay_controller.py`(641 行) | 回放策略:入口校验、transport、从视频重算、菜单项启用与提示;`replay.py` 仍是引擎 | +| C1 | `view_layout.py`(398 行) | 面板可见性与尺寸、splitter、四个视图预设、视图菜单勾选、3D 面板开关与其传感器/显示设置 | +| C2 | `display_prefs.py`(227 行) | 单位、量程与时间窗、箭头显示、2D 视图模式、rail 帧率读数 | +| 收尾 | `calibration_service.py`(194 行) | 标定的"这份文件属于谁":`identity_of` / `same_path` / `target_mismatch`(无 Qt) | +| 附带修复 | `session_controller.py` | worker 的 `on_reset_applied` 从未接线——真机按「清零」不会留下 zeroing 事件(见 `test_session_controller.py`) | + +**做法**:strangler 式搬运——先把状态与规则移进控制器(控制器通过 `*Host` Protocol 声明它向窗口借的少数操作), +再让窗口内部的调用点直连控制器,窗口保留一层与旧名同名的转发,使 +`test_ui_smoke`(96 项)、`test_scene3d_view`、`tools/ui_check.py`(587 项)无需改写即可继续驱动窗口。 +每片一刀一个提交,每刀都跑全套 + `ui_check` + `locale_check`。 + +**数字**:`app_window` 3044 → 2309 行(fan-out 36 → 37)、四个新控制器共 1703 行、 +新增 41 项控制器单测(另有 A1 的 15 项会话元数据单测);测试总数 603 → 644,`ui_check` 587 项 0 失败。 + +**对三维的影响**:接口没变。`scene3d/view` 的 `describe()` / `render_totals()` / `capabilities()` / +`set_plan()` 仍是被调用的那四条缝;阶段 4 记录里写着 `app_window._sync_3d_source()`、 +`app_window._shows_3d()`、`app_window._splitter_sizes_for()` 的地方,现在住在 `view_layout.py` +(同名转发仍在窗口上,供测试与 `ui_check` 使用)。3D 遥测仍由 `_on_packet_for_3d`(窗口,采集线程 sink)转发。 + +--- 1. **阶段 8 第二批(画布布局)**:2D/3D 页签容器(默认页签切换、可选并排对照)、参数收进"显示设置"抽屉、 常驻只留视角/复位/外壳/紧凑图例、窄窗口回退、三维画布在 1210×800 下 ≥320 px 高、曲线"可见区间自动/ @@ -618,6 +646,12 @@ shared 全部 **262 项**。`ui_check.py` **566 项检查 0 失败**(新增 "3 `bench_scene.py --package …`、`soak_scene.py --no-window --minutes 10` 报告。板卡不在手边时按"未跑" 记录,**不得**写成通过。 3. **真机待验证一项**(阶段 6 遗留):算法链失败时 SDK 的 `VRAW`(光流)是否也过期。当前取保守解释。 +4. **阶段 10 的过渡转发**:窗口里那约 40 个与旧名同名的成员(`_apply_view_preset`、`_set_display_unit`、 + `_play_timer`、`_recompute_running`、`_load_recording` …)是给 tests/`ui_check` 的桥,不是最终形态。 + 下一次改动落在哪个控制器,就把该控制器的转发与测试调用点改成 `self..*`。 +5. **仍留在窗口的胶水**:预览(`_start_preview`/`_stop_preview`/`_on_preview_tick`)与 2D 渲染 + (`_show_image_frame`/`_render_run_image`/`_depth_range`)。它们同时属于面板与相机,暂时没有第二个 + 变更驱动;硬拆只会把耦合搬家。 ---