ADR 0009:从 Pydantic 模型自动生成参数面板
状态:已接受 日期:2026-08-04 关联:ADR 0006(e2m2e GUI 前端定位)、ADR 0005(脚本注册合并)
背景
旧 GUI 通过 SCRIPT_ENTRY 的 CliParam 声明生成参数面板。每新增一个工具需要手写 CliParam 列表。ADR 0005 合并了镜像目录,但 CliParam 仍然是手动维护的元数据。
新架构只暴露 e2m2e 的 4 个已实现 Facade 方法,每个有对应的 Pydantic Request 模型(如 DesignOrbitRequest),包含完整的字段类型、范围、默认值、描述信息。
决策
参数面板从 e2m2e Pydantic 模型自动生成。遍历 Request 模型的 model_fields,按字段类型映射为 Qt 控件。
映射规则:
Pydantic 字段 |
Qt 控件 |
|---|---|
|
|
|
|
|
|
|
|
|
多个 |
|
对应控件 + 可选复选框 |
理由
零维护同步:e2m2e 更新 Pydantic 模型后 GUI 自动反映变更,不需要手动更新参数面板。
单一事实来源:参数定义只在 e2m2e 的
api/models.py中维护。ADR 0014 对齐:e2m2e ADR 0014 已明确 GUI 参数表单从 e2m2e Pydantic 模型生成。
后果
正面
新增 e2m2e Facade 方法时 GUI 零改动(只需在 TOOL_REGISTRY 加一条)
参数校验复用 Pydantic 的验证逻辑
保证参数范围/默认值与 e2m2e 一致
负面
自动生成的 UI 不够精致(如振幅用滑块更直观,但自动生成的是数字框)
复杂字段(如
Any类型的 engine_layout)需要特殊处理需要实现 Pydantic → Qt 控件的映射引擎
后续
可通过
Field(json_schema_extra={"widget": "slider"})扩展 Pydantic 元数据,覆盖特定字段的 UI