Files
orisys-app/docs/architecture/studio-window-refactor-plan.zh.md
ykcheungab 81063213f9 统一实时标定身份解析并规范行尾
控制器与两个对话框共用 CalibrationService.read_identity,解析失败与缺 SN 分开上报;
本轮改动文件统一 LF,SN 必填回归已锁定。
定向 73 项、校准 UI 8 项与 lint 通过;未跑全量门禁。
2026-10-19 18:42:13 +08:00

161 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Studio 主窗口分步重构计划
目的:plan。范围:`apps/studio/src/orisys_studio/app_window.py` 及其直接调用方。
当前架构由 [Studio 架构](studio-architecture.md) 维护;本文件是唯一实施进度记录。
## 目标与约束
主窗口保留组件装配、跨功能信号连接、窗口几何及明确的关闭顺序。
按职责迁移现有实现,不增加产品功能、依赖、线程或全局状态容器。
会话、回放、布局、显示偏好和记录状态继续由现有控制器持有。
显示层只读取状态;录制与标定采样继续消费采集线程的数据,不依赖刷新频率。
启动、停止、暂停、异常处理、信号顺序及懒加载时机均属于行为保持边界。
关闭时保留预览关闭、采集回调解绑、分析取消与等待、采集和录制收尾、3D 释放的顺序。
测试和工具确实使用的旧入口可以暂留,但每一步必须说明保留原因并更新真实调用方。
不提交、不切换分支;保留所有已有修改,不将并行功能开发混入重构。
## 顺序与验收
每步都先检查调用方及相关测试,完成后更新本计划和架构文档。
任务顺序为 S0 → S1 → S2 → S3 → S4 → S5 → S6;每一步均可独立审查。
### S0:基线与计划
- [x] 记录 HEAD、索引和已有修改,建立独立 scratch 证据目录。
- [x] 在改动前运行状态显示与主窗口相关测试。
基线:2026-10-18,`orisys-app` 的 `main`,HEAD `433b76e`。
源码为 3,181 行;`StudioMainWindow` 有 212 个方法,含属性访问器。
原架构文档的 2,309 行及“拆分已完成”属于历史状态。
### S1:状态显示
- [x] 新建 `status_presenter.py`,接收显示事实与目标控件,不接收整个窗口。
- [x] 迁移 phase、来源摘要、标定摘要、有效性及录制统计的格式化与显示。
- [x] 保留 `_record_stats` 注入入口,保证已有截图工具和 UI 检查仍有效。
涉及主窗口、新 Presenter 和定向测试。验收:实时视图不显示回放标题;分析结果保持自己的
传感器身份;未知、无标定、部分轴标定仍可区分;录制关闭中不显示完成,丢失计数完整。
验证:状态 Presenter 独立测试、`test_ui_smoke`、`test_replay_wiring` 和现有 UI 检查。
### S2:界面构建
- [x] 准备 `ui/window_ui.py` 和 `ui/window_menus.py`,先以独立窗口验证。
- [x] 接入 `ui/window_ui.py` 的控件和布局构建,保持控件身份、顺序及 parent。
- [x] 迁移菜单和 QAction 创建;由窗口显式连接功能操作。
- [x] 迁移对应文字与主题更新,保留必要属性兼容入口。
依赖 S1。涉及主窗口、UI 模块及实际调用方;面板构建和菜单构建分两批验收。
验证:`test_ui_elements`、`test_view_layout`、`test_sensor_switch_window`、主题与语言检查。
3D 仍在原时机创建,启动恢复顺序及保存的布局不变。
### S3:实时标定交互
- [x] 提取 `live_calibration.py` 的选择保存、解析、确认及提交请求。
- [x] 文件身份和匹配规则复用 `CalibrationService`;对话框通过窄接口访问。
- [x] 设备确认、记录版本及采样仍走现有记录通道。
依赖 S2。验证:`test_live_calibration_dialog`、`test_calibration_service` 及确认事件测试。
导出不等于应用,应用请求不等于设备确认,序列号不匹配的处理不变。
实施结果(2026-10-19,round 3–5):round 5 统一身份解析并锁定 SN 必填回归
(定向 73 passed、校准 UI 8 passed);R1–R4 见交接,未改断言或基线。
### S4:分析配置
- [ ] 提取 `analysis_setup.py` 的对话框、裸视频工作目录和分析服务构造。
- [ ] 迁移按录制目录保存的完整分析选择,保持接受、取消、重算来源及缓存语义。
- [ ] `ReplayController` 继续负责执行、取消、缓存及结果选择,不吸收配置逻辑。
依赖 S3 的标定选择接口。验证:`test_bare_video_analysis`、`test_analysis_progress`、
`test_replay_wiring`、`test_recording_recalibration`;保留录制 chain、标定/设备确认、
显式禁用标定、空载窗口及实际参考帧 ID/时间,取消或失败保留上一完整结果。
### S5:运行协调与预览
- [ ] 先提取 `preview_controller.py`,负责设备和预览定时器生命周期。
- [ ] 再提取 `activity_coordinator.py`,统一按钮和快捷键的运行、暂停、停止规则。
- [ ] worker 操作通过 `SessionController`;关闭流程继续在窗口显式排列。
依赖 S4。两批分别验证 `test_session_controller`、`test_pause_controls`、
`test_transport_review` 和连接中停止、断开、异常、重复关闭场景。
普通停止保持非阻塞,退出等待资源结束;预览与采集不能争用相机。
### S6:显示入口与兼容桥收尾
- [ ] 将 2D/3D 的共同交付协调归入现有 `FrameView`,调用方显式传入显示上下文。
- [ ] 更新测试和工具为真实控制器接口,删除已无调用方的窗口转发。
- [ ] 核对依赖方向、无循环、线程归属和文档现状;运行完整门禁。
依赖 S5。验证:`test_shared_depth_scale`、`test_scene3d_frame_views`、回放定位与
显示设置重绘测试。2D/3D 使用同一帧;实时不覆盖回放;重绘不启动新分析。
结束条件是主窗口只承担约定职责,且所有相关检查通过,不以行数作为唯一标准。
## 历史验证摘要
以下是旧批次证据,不是当前 HEAD 的复验。详细原计划快照保存在本轮 scratch 的
`plan-before.md`;原始日志路径若不可用,应注明证据缺失。
| 批次 | 实施与结果 | 原始证据(相对应用仓库) |
|---|---|---|
| S1,2026-10-18 | 状态迁出;前后定向 125 passed,独立 19 passed,最终 Studio 550 passed/19 skipped;首次门禁 Studio 两项失败保留,隔离通过不能解释原因 | `.scratch/studio-window-refactor/20261018-200221/`;`gate-20261018T120931Z/summary.md` |
| S2 准备,2026-10-19 | main a0c13c1;只新增模块及测试,主窗口字节不变;13 passed,lint 通过 | `.scratch/studio-window-refactor/20261019-094111/final.xml` |
| S2 接线,2026-10-19 | main c6c16df;3070→2894 行;10 控件、35 菜单/action 同对象,18 业务回调留窗口;46→49 passed | `.scratch/studio-window-refactor/20261019-095028/` |
S2 串行门禁:lint 通过,UI 632 checks/0 failures;shared 461 passed、15 failed、
18 skipped、3 deselected,涉及映射缺失及模型尺寸;Studio 垃圾回收时访问冲突,无 JUnit。
扩展 UI 131 passed/1 failed,为分析停止后的即时状态断言。旧/新窗口隔离均 4 passed;
旧窗口全套对照无进展后中断。不可据此归因。汇总:
`.scratch/studio-window-refactor/gate-20261019T015301Z/`。
S1 首次 shared 467 passed、18 skipped、3 deselected,UI 632/0;另有关闭后的
`asset_rejected` 异步回调,S5 须复核。S1/S2 临时反转条件的回归能发现错误,已恢复源码。
均为 Windows/Python 3.10.19/offscreen;未验证真实设备、可见桌面或硬件 GL。
未放宽断言或基线。S2 的非迁移方法 AST 一致是当时证据,后续功能提交不受其约束。
## 当前交接:S3 返工 round 5 已交付 review
- task_id:`studio-window-refactor`;round:5;updated_at:2026-10-19,Asia/Hong_Kong。
- status:review;owner:DeepSeek 执行方(已停止写入);next_agent:GPT/Claude 验收方。
- 本轮依据:`.scratch/studio-window-refactor/rework-r5/rework-plan.md`(用户确认的返工计划)。
未放宽 SN 必填、未改并行任务文件、未用全量门禁证明通过;未暂存/提交/推送/切换分支。
- 授权:用户 2026-10-19 转发该返工计划与启动指令,要求按 R1→R2→R4→R3 执行、R4 先交盘点、
完成标 review 交回验收;先前 S3 授权在范围内继续有效。
### 基准与输入
| 仓库 | 分支与 HEAD | 起始状态/本轮修改 |
|---|---|---|
| `D:\orisys_ws\orisys-app` | dev;`70b4341fd00707a3a7579d6d36ed4b090c2be068` | 索引空;工作区含并行任务未提交修改(shared analysis/acquisition、`replay_controller.py`、locales 的 field 键、`finger/sensor.json` 3→2)与本轮交付;本轮改动见下 |
| `D:\orisys_ws` | master;`9201914cbe335b6862058212af0bc2614f2b4792` | 场加权计划等无关修改;本轮不改根仓库 |
工作目录为应用仓库;解释器 `.venv-build\Scripts\python.exe`(3.10.19、offscreen)。
R1 只改行尾:计划所列 5 文件、自有文档 2 个、本轮另 3 个改动文件。R3 改
`calibration_service.py`、`live_calibration.py`、两个对话框与 4 个测试文件;R2/R4 未改生产代码。
文件 SHA256 见 `rework-r5/delivery-sha256.json`;其中 R1 涉及的 3 个并行任务文件
(locales×2、sensor.json、replay_controller.py)只规范了行尾,其内容改动不属于本轮。
### 执行结果
| 项 | 结果与证据 |
|---|---|
| R1 行尾 | 10 个本轮文件均 `i/lf w/lf`;5 个计划文件整文件 diff 由 3312/3215 降至 103/6,与 `--ignore-space-at-eol` 一致;转换前后对照 diff 194 行逐行相同。证据 `rework-r5/r1-eol.md` |
| R2 回归锁定 | 5 类用例齐全(无 SN/无法解析/SN 不一致/未填设备号/非 Finger 文件),`resolve()` 无“无 SN 放行”返回;遗留 `ROLE_DEFAULT` 不校验但无 Finger 默认标定、不可达。证据 `rework-r5/r2-sn-required.md` |
| R4 SN 盘点 | 只读:随包仅 box `force_calibration.json`(无 SN,规则只对 Finger);Finger 目录与设计导出目录无标定文件;`data/dd02-gl` 两个 Finger v3 文件带 `sn=dd02-gl` 且严格解析成功。**无 Finger 文件会被拒绝、无需补 SN**。证据 `rework-r5/sn-inventory.md` |
| R3 统一身份解析 | 对照架构文档:UI→无 Qt 服务层是向下依赖、无环(`cal_panel` 已有同类依赖),方向合规。`CalibrationService.read_identity` 一次解析返回 `(identity, error)`,`identity_of` 变薄封装;控制器删除二次 SDK 解析与 `?` 兜底;两对话框改走同一判断;对话框错误文案与控制器一致。 |
| R3 测试 | 控制器+服务+对话框+locale 48 passed;定向回归 73 passed;`test_ui_smoke -k calibration` 8 passed;本轮文件 lint exit 0、无 findings。证据 `rework-r5/r3-identity.md`、`r5-final-20261019-191500/` |
| 文档检查 | `doc_lint` exit 0、无新增 findings;`doc_count` 计划 2502/3000、架构 3196/3232。证据 scratch `doc-lint.log`、`doc-count.log` |
| 未执行 | 全量门禁(按要求不跑;上轮 studio 57% 原生挂起未解决);未验证真实设备、可见桌面或硬件 GL。 |
历史轮次证据:round 3 门禁 `gate-20261019T093016Z/`、round 4 返工 `handoff-20261019-174000/rework-P2.md`;
详细过程在 scratch,不在本表复制。
### 验收与下一步
- 轮次摘要:1)S0–S2;2)准备 S3 交接;3)S3 实施;4)返工 P2;5)行尾、SN 锁定、盘点与身份解析统一(本轮)。
- 验收者、时间、决定:轮 3 已独立复跑并返工 P2;轮 4 交付后由用户给出本轮返工计划;本轮待复核。
- 下一步:GPT/Claude 复核 R1–R4 证据并独立复跑 R3 测试与行尾检查,决定 done/rework。
S4–S6 仍未实施。改动保持未暂存;提交建议见 `.scratch/studio-window-refactor/commit-message.txt`,
不含并行任务文件与既有 `finger/sensor.json`。
- scratch:证据保留在 `.scratch/studio-window-refactor/`;任务 `.active` 检查后移除,日志不清理。