文档:阶段记录补上「阶段 10:app_window 按职责拆分」与遗留项
- What: docs/architecture/studio-3d-stages.md 新增阶段 10 记录:A1/A2/B/C1/C2 与标定收尾各自搬到哪个文件、 做法(strangler 式搬运 + *Host Protocol + 旧名转发以保住回归门)、数字(app_window 3044→2309 行、 四个控制器 1703 行、新增 41 项控制器单测、测试 603→644)、以及对三维接口无影响的说明 (阶段 4 记录里的 _sync_3d_source/_shows_3d/_splitter_sizes_for 现在住在 view_layout.py)。 - What: 「尚未完成」补两条:窗口里约 40 个过渡转发(下次改动顺手清)、仍留在窗口的预览与 2D 渲染胶水。 - Why: 阶段文档是三维交付的验收记录,读者会按它找代码位置;拆分之后那些位置变了,必须留下指路。 - Verification: 纯文档改动;同批源码验证为 pytest 644 passed / 0 failed / 15 skipped、 tools/ui_check.py 587 项 0 失败、.repro/locale_check.py 0 缺失。 - Not in this change: 不改代码;不改历史阶段(1–9)的记录内容,只在阶段 10 里说明它们提到的窗口方法现在的去处。
This commit is contained in:
@@ -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 页签容器(默认页签切换、可选并排对照)、参数收进"显示设置"抽屉、
|
1. **阶段 8 第二批(画布布局)**:2D/3D 页签容器(默认页签切换、可选并排对照)、参数收进"显示设置"抽屉、
|
||||||
常驻只留视角/复位/外壳/紧凑图例、窄窗口回退、三维画布在 1210×800 下 ≥320 px 高、曲线"可见区间自动/
|
常驻只留视角/复位/外壳/紧凑图例、窄窗口回退、三维画布在 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` 报告。板卡不在手边时按"未跑"
|
`bench_scene.py --package …`、`soak_scene.py --no-window --minutes 10` 报告。板卡不在手边时按"未跑"
|
||||||
记录,**不得**写成通过。
|
记录,**不得**写成通过。
|
||||||
3. **真机待验证一项**(阶段 6 遗留):算法链失败时 SDK 的 `VRAW`(光流)是否也过期。当前取保守解释。
|
3. **真机待验证一项**(阶段 6 遗留):算法链失败时 SDK 的 `VRAW`(光流)是否也过期。当前取保守解释。
|
||||||
|
4. **阶段 10 的过渡转发**:窗口里那约 40 个与旧名同名的成员(`_apply_view_preset`、`_set_display_unit`、
|
||||||
|
`_play_timer`、`_recompute_running`、`_load_recording` …)是给 tests/`ui_check` 的桥,不是最终形态。
|
||||||
|
下一次改动落在哪个控制器,就把该控制器的转发与测试调用点改成 `self.<controller>.*`。
|
||||||
|
5. **仍留在窗口的胶水**:预览(`_start_preview`/`_stop_preview`/`_on_preview_tick`)与 2D 渲染
|
||||||
|
(`_show_image_frame`/`_render_run_image`/`_depth_range`)。它们同时属于面板与相机,暂时没有第二个
|
||||||
|
变更驱动;硬拆只会把耦合搬家。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user