# M1 设计文档：核心闭环（浏览 + 选型 + 3D 预览 + STEP 下载）

> **历史设计文档（2026-06 拟定）**。实施后的最终状态、与设计的偏差、进度与踩坑以 **项目总览.md** 为准（同目录）。本文件仅作设计参考。

## 1. M1 目标与验收标准

用户（欧霓博维护人员）打开维护版软件 → 加载一个 .opc 数据包 → 客户视角完成一个气缸系列"选型 → 下载 STEP"全流程。

**验收标准：**
- 打开示例数据包，目录树显示分类 → 系列 → 型号
- 选择缸径/行程/磁石等参数，过滤实时生效，参数表与 3D 预览联动
- 点击下载，得到命名正确的 STEP 文件（如 `ACQ32x50S.step`），在 SolidWorks/NX 中打开尺寸正确
- 中英界面切换可用
- `--admin` 启动 + 密码 → 维护页可加载/替换数据包、查看包信息

## 2. 三个关键架构决策

### 决策 1：数据包形态 —— SQLite 元数据 + 资源目录，zip 单文件分发

- `.opc` = zip 包，内含：`catalog.sqlite`（元数据/参数/规则/全文索引）+ `assets/`（STEP、预览网格、图片、PDF）+ `manifest.json`（schema 版本、目录名、语言列表）
- 客户版 exe 把 .opc 作为嵌入资源，首次运行时解压到 `%LOCALAPPDATA%\OuniboCatalog\`；维护版支持加载外部 .opc（便于替换/更新）
- 理由：SQLite 单文件利于嵌入 exe 与增量更新；资源外置避免把几百 MB 的 STEP 塞进数据库 blob

### 决策 2：参数化变体策略 —— M1 用"预生成变体"，schema 预留运行时建模

- M1：Builder/脚本按参数表**批量预生成**所有型号组合的 STEP（如缸径 8 种 × 行程 30 种 = 240 个文件），选型只是命中对应文件。简单、可靠、无运行时几何计算
- 预留扩展点：`variants.geometry_source ∈ {prebuilt, parametric}`；后续行程连续化时，`parametric` 模式在 Builder 端做参数化重建（气动元件形状规则，适合特征化建模），运行时仍只读成品 STEP
- 约束：M1 要求行程等参数为**离散枚举值**；连续行程列入后续里程碑

### 决策 3：3D 预览 —— 编译期转网格，运行时轻渲染

- Builder 打包时把每个 STEP 转成预览网格（glTF/自定义二进制网格，assimp 或 OCCT 完成转换），运行时用 **Helix Toolkit (WPF)** 渲染
- 理由：客户 exe 轻（不含 OCCT 运行时）、启动快、渲染流畅；STEP 原文件仅供下载，不进渲染管线
- 备选（后续增强）：运行时用 OCCT 直接读 STEP 渲染（精度高但增重）

## 3. .opc 数据包 schema（catalog.sqlite）

```sql
-- 元信息
catalog_meta(id, schema_version, catalog_name, catalog_version,
             default_lang, langs_json, build_time)

-- 目录树
categories(id PK, parent_id, sort, code)
series(id PK, category_id FK, code, sort, is_active)

-- 参数定义（每个系列一组参数）
parameters(id PK, series_id FK, code, type,   -- type: enum/number/text
           unit, sort, is_required, values_json)  -- enum 的取值/数值的范围

-- 变体（一个"型号组合"对应一行）
variants(id PK, series_id FK, model_code UNIQUE,   -- 如 ACQ32x50S
         param_values_json,                        -- {"bore":32,"stroke":50,...}
         step_path, mesh_path, preview_img_path,
         geometry_source DEFAULT 'prebuilt')

-- 选型规则（M1 支持简单约束，JSON 表达式）
rules(id PK, series_id FK, priority, expr_json)
-- expr_json 示例：{"if":{"param":"bore","op":"eq","value":32},
--                 "then":{"param":"stroke","op":"in","value":[25,50,75,100]}}

-- 附件（尺寸图/数据表/说明，按语言区分）
attachments(id PK, series_id, kind,   -- dim_drawing/datasheet/note
            lang, path, sort)

-- 翻译
translations(key PK, lang PK, text)

-- 型号编码与命名规则（series 级配置）
series_naming(id PK, series_id FK,
              code_template,     -- 如 "{SERIES}{bore}x{stroke}{MAG}"
              step_name_template -- 如 "{SERIES}{bore}x{stroke}{MAG}.step")
```

manifest.json：

```json
{
  "schema_version": "1.0",
  "catalog_name": "欧霓博气动目录",
  "catalog_version": "2026.06",
  "langs": ["zh-CN", "en-US"],
  "builder_version": "0.1.0"
}
```

## 4. 模块与接口（C# .NET 8，MVVM）

| 模块 | 职责 | M1 关键接口 |
|---|---|---|
| CatalogCore | 数据包读写、查询 | `Load(string opcPath)`；`GetCategoryTree()`；`GetSeries(id)`；`GetVariants(seriesId, filter)`；`ResolveModelCode(code)`；`GetAttachments(seriesId, kind, lang)` |
| ConfiguratorEngine | 参数过滤 + 规则求值 | `GetAvailableOptions(seriesId, currentSelections)`；`Validate(selections) → 违反的规则列表`；`GetVariant(selections)` |
| Viewer3D | 网格加载与交互 | `LoadMesh(path)`；旋转/缩放/平移；`Clear()` |
| ExportService | STEP 下载 | `Export(variantId, destDir)` → 按命名模板复制 STEP 并返回路径 |
| Localization | 多语言 | `T(key, lang)`；资源文件 zh-CN/en-US |
| AdminService | 维护入口 | `IsAdminMode(args)`；`CheckPassword`；`LoadExternalPackage(path)`；`GetPackageInfo()` |
| AppShell (WPF) | 装配以上模块 | 客户模式 / 维护模式路由 |

依赖方向：AppShell → 各模块；CatalogCore 不依赖 UI；Viewer3D 只认网格文件路径。

## 5. UI 线框

```
┌─────────────────────────────────────────────────────────────┐
│ [语言:中/EN]        欧霓博气动目录            [下载 STEP]      │
├──────────────┬──────────────────────────┬───────────────────┤
│ 目录树        │ 参数选择面板              │ 数据表 (Tab)       │
│ ▼ 气动执行元件 │ 缸径: [6] [10] [16] [32]│ ┌────────────────┐│
│   ▼ ACQ 系列 │ 行程: [25][50][75][100] │ │ 2D 尺寸图       ││
│     ACQ 标准缸│ 磁石: [无][S]            │ │ 技术参数表      ││
│   ▼ 迷你气缸  │ 安装: [LB][FA][CB]       │ │ 选型说明        ││
│   ▼ 阀类      │ ── 已选: ACQ32x50S ──    │ └────────────────┘│
│              ├──────────────────────────┤                   │
│              │    3D 预览 (Tab)          │                   │
│              │      [旋转/缩放/平移]      │                   │
└──────────────┴──────────────────────────┴───────────────────┘

维护页（--admin 进入，密码保护）：
┌──────────────────────────────────────────┐
│ 当前数据包: ounibo_2026.06.opc (2026.06) │
│ [加载新数据包...] [校验] [查看日志]        │
│ （M2 起扩展：目录编辑 / 编译发布）          │
└──────────────────────────────────────────┘
```

## 6. 解决方案结构

```
OuniboCatalog/
├── src/
│   ├── Ounibo.Catalog.Core/      # CatalogCore + Configurator + Export + Localization
│   ├── Ounibo.Catalog.Viewer3D/  # Helix Toolkit 封装
│   ├── Ounibo.Catalog.App/       # WPF 壳（客户模式 + 维护页）
│   └── Ounibo.Tools/             # M1: 示例数据生成脚本(CLI)；M2 演化为 Builder
├── tests/Ounibo.Catalog.Core.Tests/   # xUnit：规则求值、命名模板、包加载
├── sample-data/                  # 1 个真实气缸系列的输入与生成物
└── OuniboCatalog.sln
```

## 7. M1 任务清单（建议实现顺序）

1. CatalogCore：.opc 读写 + schema 建表 + 查询接口（含单测）
2. Ounibo.Tools 示例数据生成：读 Excel 参数表 + STEP 库 → 生成 .opc（含网格转换，assimp 命令行即可）
3. AppShell 客户模式：目录树 + 参数面板 + 过滤联动
4. Viewer3D 接入：选型变化 → 切换网格
5. ExportService：STEP 下载 + 命名模板
6. AdminService + 维护页：--admin、密码、加载/替换数据包
7. Localization：中/英资源接入全部文案
8. 集成测试：按验收标准走查全流程

## 8. 需要用户提供的输入（开工前）

- **1 个真实气缸系列的 STEP 模型**（如 ACQ 标准气缸各缸径/行程的模型，或 1 个基准模型 + 尺寸规律说明）
- **该系列的 Excel 参数表**（列：型号编码、缸径、行程、安装方式、磁石等）
- **型号编码规则**（如 ACQ32x50S 各段的含义与允许组合）
- **2D 尺寸图/数据表 PDF**（中/英）
- 客户常用 CAD 清单（用于 STEP 兼容性验证，通常无需适配）
