geopro/docs/superpowers/specs/2026-06-17-vtk-3d-volume-sl...

119 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
- **三维体右键**(行 368375切片▸上下/前后/左右/任意)、色阶、显示/隐藏、数据详情。
- **切片右键**(行 376383保存、保存为、导出、删除、色阶、显示/隐藏、数据详情。
### 2.2 切片工具(行 369372, 387389
- 上下/前后/左右切片:在三维体中心或光标位置打开**水平切片工具,角度不可调**。
- 任意切片:初始角度 = 当前视图 45°可任意调整。
- 选中切片滚轮 → 沿法向往内/外推进;切片对象 = 所属三维体(行 389
- 双击切片 → 视角调正为正视该切片(行 386/388
### 2.3 VTK 视图里对切片的右键(行 391399
- **创建异常**:弹异常工具,以光标拾取点为起点圈定;结束保存时弹对话框(截图大小、异常坐标),参考 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 → 3Ddd_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` 接口不变,仅换实现)。