Present replay 3D with the cursor and open Analyze on a remembered video

Replay left the 3D pane on the rest mesh or a sparse overlay, and Analyze skipped the setup dialog unless the file was re-picked. Live Run no longer starts a chain on a video path. Verified with Studio tests for flush, overlay mask, Analyze open, live-video refusal, and locales.
This commit is contained in:
ykcheungab
2026-10-05 16:52:27 +08:00
parent 3433eb0fec
commit c0a10e6adb
26 changed files with 2226 additions and 158 deletions
+1 -1
View File
@@ -36,7 +36,7 @@ Verify: `test_bare_video_analysis.py`, `test_bare_video.py`,
Opening a recording either serves a compatible stored result or runs one pass behind a
progress-and-cancel surface. `on_analysis_requested` asks `AnalysisService.stored_result()`
first — a file read, the surface showing `analysis.reused` — and otherwise starts
first — a file read, with `AnalysisProgress.reused` filling the bar — and otherwise starts
`AnalysisWorker`, a plain thread whose `Progress` is coalesced at 0.1 s, with
`AnalysisProgress` showing written/expected frames and elapsed time. The timeline stays in
`recording` mode until the pass commits: a half-written result never reaches the screen.
+3 -1
View File
@@ -193,7 +193,9 @@
{ "id": "act_rotate_arrows", "path": "act_rotate_arrows", "objectName": null, "class": "QAction",
"purpose": "view menu: rotate the 2D arrow field by 90 degrees for the mounted sensors" },
{ "id": "act_recompute", "path": "act_recompute", "objectName": null, "class": "QAction",
"purpose": "view menu: recompute the vision pipeline over the recorded video, the same state as the rail's button" },
"purpose": "view menu: analyze video — serve a stored result or run the pass; same state as the rail's button" },
{ "id": "act_analysis_setup", "path": "act_analysis_setup", "objectName": null, "class": "QAction",
"purpose": "view menu: reopen the analysis setup dialog (profile, calibration, reference frame)" },
{ "id": "act_run", "path": "act_run", "objectName": null, "class": "QAction",
"purpose": "F5: start a run (the rail's transport is the primary control)" },
{ "id": "act_stop", "path": "act_stop", "objectName": null, "class": "QAction",