diff --git a/docs/superpowers/specs/2026-06-17-vtk-3d-volume-slice-anomaly-design.md b/docs/superpowers/specs/2026-06-17-vtk-3d-volume-slice-anomaly-design.md new file mode 100644 index 0000000..836cc63 --- /dev/null +++ b/docs/superpowers/specs/2026-06-17-vtk-3d-volume-slice-anomaly-design.md @@ -0,0 +1,118 @@ +# VTK 三维:三维体 / 切片 / 异常 —— 数据模型与客户端交互设计 + +- 日期:2026-06-17 +- 范围:桌面客户端 VTK 三维视图里的「三维体模型(体素) / 切片 / 异常」三类数据及其交互。是补充需求页"三维分析"栏的落地设计。 +- 依据:①《Geopro3.0 需求表.xlsx》「补充需求」页(行号见引用);② 与产品方就 6 个设计问题的确认;③ 现有代码。 +- 原则:缺后端端点的**先本地 mock**(保证功能可见可用),端点就绪后切真实;能纯客户端做的先做。 + +--- + +## 1. 核心数据模型 + +三者都是**可持久化的数据集**,层级关系:`三维体 → 切片 → 异常`。 + +### 1.1 三维体(VolumeModel) +ddCode:`dd_voxel` / `dd_Structual3D` / `dd_Property3D`(需求行 245/290/291)。 +- `id` / `name` +- **`sourceDatasetIds[]`(源数据)**:一组输入数据集,用于插值生成本体(需求行 401)。 +- **`interpModel`**:插值模型,克里金 / IDW(需求行 404)。 +- **`interpParams`**:插值参数(cellXY/cellZ/power/maxDist 等,需求行 405)。 +- `colorScale`(色阶参数,行 406)。 +- `grid`:体素网格 = `ScalarVolume` + `origin/spacing/vmin/vmax`(= 现有 `VolumeGrid`)。 +- `measure`:测量数据,点数/体积(行 407,派生量)。 +- 派生:`slices[]`、`anomalies[]`(汇总该体下所有切片圈定的异常,行 403)。 + +**来源(行业经验)**:① 多条 2D 反演剖面/散点/钻孔点 → IDW/克里金插成 3D 体(最常见);② 直接 3D 采集(三维高密度等,本身即 3D,单数据集)。`sourceDatasetIds` 为 1 个或多个。 + +### 1.2 切片(Slice) +ddCode:`dd_slice`。 +- `id` / `name` +- **`parentVolumeId`**:所属三维体(行 389:切片对象=所属三维体模型)。 +- **`plane`**:切面 = `SliceSpec`(轴向/原点/法向/偏移)。 +- `colorScale`。 +- 生命周期:交互式"切片工具"是**临时**的(在体上实时切);**保存后才成为持久化的 `dd_slice` 数据集**,进入三维分析栏列表(行 390)。 + +### 1.3 异常(Anomaly) +- `id` / `name` +- **`parentSliceId`**:异常画在某切片平面上、附着于该切片(行 392 创建异常在切片右键)。 +- `polygon`:圈定多边形(切片平面内的坐标)。 +- `screenshot` + 元信息(截图大小、异常坐标,行 393)。 +- 向上归属:三维体详情的"异常"= 汇总该体下所有切片圈定的异常(行 403)。 + +--- + +## 2. 客户端交互流(需求"三维分析"栏 + VTK 视图右键) + +### 2.1 三维分析栏(列表) +- 按「**对象 / 三维体模型 / 切片**」三级树显示(行 366)。 +- 勾选一个或多个三维体或切片 → 显示在三维视图(行 367)。 +- **三维体右键**(行 368–375):切片▸(上下/前后/左右/任意)、色阶、显示/隐藏、数据详情。 +- **切片右键**(行 376–383):保存、保存为、导出、删除、色阶、显示/隐藏、数据详情。 + +### 2.2 切片工具(行 369–372, 387–389) +- 上下/前后/左右切片:在三维体中心或光标位置打开**水平切片工具,角度不可调**。 +- 任意切片:初始角度 = 当前视图 45°,可任意调整。 +- 选中切片滚轮 → 沿法向往内/外推进;切片对象 = 所属三维体(行 389)。 +- 双击切片 → 视角调正为正视该切片(行 386/388)。 + +### 2.3 VTK 视图里对切片的右键(行 391–399) +- **创建异常**:弹异常工具,以光标拾取点为起点圈定;结束保存时弹对话框(截图大小、异常坐标),参考 Geopro1.0。 +- **保存**:保存为数据集(切片数据集)。 +- **导出为图片** / **导出到 dat**。 +- **正视图** / **视图翻转(水平 180°)** / **关闭**。 + +### 2.4 创建三维体(设计:建议客户端支持,归属待产品确认) +需求行 196「客户端二维/三维视图聚焦最基本**展示**功能」→ 创建/插值**可能在平台(web)侧**。 +- **方案 A(推荐先做 mock)**:「三维数据集」栏多选若干 3D 数据集(反演剖面)→ 菜单「生成三维体」→ 选插值模型/参数 → 客户端 `IdwInterpolator` 插值 → 三维体(暂存内存/本地)。 +- **方案 B**:仅展示平台已生成的三维体(客户端不提供创建)。 +- 决策见 §5。 + +--- + +## 3. 后端依赖 vs 本地 mock + +| 能力 | 现有端点 | 方案 | +|---|---|---| +| 展示已有三维体(取网格) | ❌ `loadVolume` 是 stub(`kNotReady`) | 后端无 → **mock**:以源数据集散点 IDW 出体(复用 `IdwInterpolator`) | +| 创建三维体(插值) | — 纯计算 | **客户端可做**(IdwInterpolator);持久化见下 | +| 三维体/切片**持久化** | ❌ 无写端点 | **mock**:内存/本地存;端点就绪后切真实 | +| 切片创建/交互 | — 纯客户端 | ✅ 已有(`SliceTool`/`InteractionManager`) | +| 切片保存/另存/导出/删除 | ❌ stub | 保存/删除 → mock(内存);导出图片/dat → **客户端可做**(截图/写文件) | +| 异常读取 | ✅ 现有 `queryException`/`queryExceptionByTmObjectId`(2D 详情已用) | **接真实**(读);三维异常树可复用 | +| 异常保存/删除 | ⚠️ 写端点待确认(原版可标注异常→大概率有) | 有则接,无则 mock | +| 任务记录/可用任务 | ❌ stub | mock | + +--- + +## 4. 代码现状(落点) + +- 维度归类:`LocalSample3dRepository::dimensionOf`(dd_voxel/Structual3D/Property3D/section/inversion → 3D;dd_slice → Analysis)。 +- 体素:`core::IdwInterpolator`(IDW 现成)、`render::buildVoxel`/`VoxelActor`(体绘制)、`VoxelFromScatters`(散点→体)。 +- 切片交互:`render::interact::SliceTool` + `InteractionManager`(已可在体素 image 上切,含上下/前后/左右/任意)。 +- 仓储接口:`I3dSceneRepository` 已定义 `loadVolume / createSlice / saveSlice / deleteSlice / loadAnomalyTree / saveAnomaly / deleteAnomaly / deleteAnomalyGroup / loadTaskRecords / loadUsableTasks`。 + - `LocalSample3dRepository`:以上多为**内存 mock**(slices_/anomalies_ map)。 + - `Api3dRepository`:以上多为 **stub(`kNotReady`)** — 真实数据未接。 +- UI:`Column3DAnalysis` 已定义信号(sliceRequested/colorScaleRequested/visibilityToggled/detailRequested/sliceSave|SaveAs|Export|Delete);`main.cpp` **仅接了 sliceRequested + detailRequested**,其余未连。 + +--- + +## 5. 待产品确认 + +1. **创建三维体在客户端还是平台?** 决定是否做 §2.4 方案 A。 +2. **后端是否会提供**:三维体网格端点、三维体/切片/异常的写端点、任务端点?时间表?(决定哪些长期 mock、哪些等接。) +3. **异常写端点**确切路径(原版标注异常的保存接口)。 + +--- + +## 6. 实现拆解(对应"剩余工作" #2–#6,缺端点先 mock) + +按依赖与价值排序: + +1. **三维体(mock 渲染)**:把当前勾选/源数据反演剖面散点 → `IdwInterpolator` → `VolumeGrid` → `VoxelActor`。`Api3dRepository::loadVolume` 由 stub 改为"取源数据散点 + IDW"(mock)。→ 解锁三维体显示 + 切片有可切对象。 +2. **切片交互接通三维体**:体素就位后,三维体右键"切片▸"已能创建切片(现有 SliceTool)。补:选中切片滚轮推进、双击正视。 +3. **切片保存/另存/导出/删除**:保存/删除 → Api3dRepository 改内存 mock(同 LocalSample);导出图片(截图)/dat(写文件) → 客户端实现。VTK 视图切片右键菜单接线。 +4. **异常**:切片右键"创建异常"→ 圈定工具 + 保存对话框(截图/坐标);异常树接 `queryException` 读端点;保存/删除按端点有无(真实/mock)。 +5. **分析栏右键菜单接线**:色阶、显示/隐藏(纯客户端)、切片保存/另存/导出/删除(接 #3)。 +6. **三维体/切片/异常详情**:数据详情栏展示源数据/插值参数/色阶/测量(点数·体积)/异常列表。 + +> 每步:客户端能做的先做、缺端点的内存 mock 留出可替换缝(保持 `I3dSceneRepository` 接口不变,仅换实现)。