- What: `apps/studio/src/orisys_studio/calibration_service.py` 新增三条**无状态**规则, 它们原来长在窗口里:`identity_of(path)`(这份系数文件声称属于哪台设备——用 SDK 自己的 解析器读,与设备将要加载的是同一份文档;读不出来就什么都不声称)、`same_path(a, b)` (同一个配置路径的不同写法不算不一致;两个空值也不算)、 `target_mismatch(path, *, sensor_type, config_ref)`(在确认框之前就说清楚"这份标定 看起来不属于这台设备"的理由)。服务本来就是这个文件工作的所有者,规则回到了它这里, 并且不需要窗口就能测。 - What: 窗口保留 `calibration_identity` / `calibration_target_mismatch` 两个转发 (tests 与 tools/ui_check.py 通过窗口驱动它们),删除 `_same_path`。 `_on_calibration_apply` 仍留在窗口:它要弹确认框、要把路径交给采集 worker,那是交互 与会话,不是关于文件的规则;`_calibration_summary`、`_drain_calibration_events`、 `_drain_reset_events`、`_on_calibration_point/cancelled/exported` 同理(面板与状态栏 的胶水)。 - What: 新增 apps/studio/tests/test_calibration_service.py:4 个用例——身份读出 sensor_type/sn/config_ref、读不出来的文件既无身份也无"不匹配"指控(不能把"不知道" 当成"不一致")、另一台设备/另一份配置会被逐条报出而同一台不会、同一路径的不同写法 不算不一致而非路径值算。 - Why: 这是 app_window 拆分计划里最后一块「有独立规则可搬」的部分。搬完之后 "这份标定是谁的"只有一处实现,窗口只剩对话与转发。 - Verification: pytest shared/tests apps/studio/tests(offscreen)636 passed / 0 failed / 15 skipped(原 632 + 新增 4);apps/studio/tools/ui_check.py 587 项检查 0 失败; .repro/locale_check.py 0 缺失。行为等价(同一份实现 + 一层转发)。 - Not in this change: 预览(_start_preview/_stop_preview/_on_preview_tick)与 2D 渲染 (_render_run_image/_show_image_frame/_depth_range)仍留在窗口——它们是面板与相机的 胶水,不属于任何一个已拆出的变更驱动;已知缺陷(本次未修,另行处理):worker 的 on_reset_applied 从未接到 recording.note_reset,真机上按"清零"不会记录确认事件。
orisys-app
Desktop applications that consume the Orisys SDK.
| App | Status |
|---|---|
apps/studio |
Scaffold shell (theme / locale / prefs / logging) |
apps/internal |
Stub for future calibration & automated testing |
Layout
shared/— common paths, prefs, theme, i18n, loggingapps/studio/config/— locales, default prefs, editablesensors/copiesapps/studio/outputs/— generated logs and calibration exports (gitignored)build/— Windows PyInstaller packaging (build/studio/build.ps1)
Run (studio shell)
cd D:\repo\orisys-app
python -m pip install -e .\shared -e .\apps\studio
python .\apps\studio\run.py
Or without install:
$env:PYTHONPATH = "D:\repo\orisys-app\shared\src;D:\repo\orisys-app\apps\studio\src"
python D:\repo\orisys-app\apps\studio\run.py
Local orisys SDK
orisys_app_shared.force imports orisys.calibration at module scope, so the
studio app cannot start against an SDK build that predates that module
(the published 0.5.2 wheel does not include it). When working from a repo
checkout, install the SDK from source instead of from an index:
python -m pip install .\..\orisys-sdk # same checkout that built this app
If a pip build is blocked by the environment, the equivalent manual install is
to copy orisys-sdk/src/orisys/**/*.py over site-packages/orisys/ and delete
the stale __init__.cp310-win_amd64.pyd (an extension module shadows the
package __init__.py, which hides sibling modules such as calibration.py).
Verifying UI changes
Both tools render the real main window with the offscreen Qt platform — no display, camera or sensor hardware required:
python .\apps\studio\tools\ui_check.py # layout/theme assertions
python .\apps\studio\tools\ui_snapshot.py --theme light --demo `
--sensor finger --panels cal,3d --size 1600x900 --out shot.png
ui_check.py needs only the runtime dependencies. The pytest suite in
shared/tests and apps/studio/tests covers the same ground plus locale and
preference-schema parity:
pip install pytest
python -m pytest
On Windows the offscreen platform finds no fonts unless QT_QPA_FONTDIR points
at C:\Windows\Fonts; both tools set it automatically.
ui_check.py also runs the palette rules (WCAG contrast, colour separation,
ramp monotonicity) that guard the brand tokens; see
apps/studio/docs/ui-palette.md for the
colour system, its relationship to the UI design spec, and every deliberate
deviation from it.
ui_check.py includes a record channel section as well; see
apps/studio/docs/record-channel.md for
why recording and calibration sampling no longer hang off the UI refresh timer,
and for the data-reliability fixes that came with it.
Branding
Window / EXE icon: shared/resources/branding/logo.png
Top bar / About: shared/resources/branding/logo_topbar.png
Dark mode is the default. Logos currently sit on a black tile; a transparent (or light) variant may be needed for polished light mode later.
Versioning
- Studio app version (
orisys_studio.__version__) — shown in Help → About and used for releases. - Shared package version (
orisys_app_shared.__version__) — internal library version. - Shared API (
orisys_app_shared.API_VERSION) — compatibility tag. Studio declaresREQUIRES_SHARED_API; startup logs a warning on mismatch.
Deferred
Run/Stop pipeline, arrow/force plots, units, calibration capture, Open3D finger mesh, sync-from-wheel for config/sensors, PyInstaller packaging, and the internal app.