geopro/docs/superpowers/specs/2026-06-15-vtk-3d-supplemen...

393 lines
31 KiB
Markdown
Raw Permalink 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-15
- 分支建议:`feat/vtk-3d-view`
- 状态:**设计稿 v2已纳入架构评审 + web 端实地分析)**。本轮只产出设计,实现分期另立 plan。
- 需求来源:`D:\Projects\GEOPRO\Geopro3.0 需求表.xlsx` →「补充需求」页签已逐行通读§4 全文映射交叉参考「DD类型」页签原版 web 实地分析见 §1.5、记忆 [[web-3d-view-threetile]]。
- 关键约束(用户已拍板):
1. **后端 API 尚未就绪** —— 本轮用 `LocalSampleRepository` 静态数据驱动渲染与交互,**但仓储接口必须按真实后端形态设计好**§6将来后端到位只换实现、不动上层。
2. 三维相关 ddCode`dd_Structual3D`/`dd_Property3D`/切片/异常体/任务记录)后端、客户端**都还没做**,是净增建。
3. **三栏结构 + 切片是客户端新需求**web 端没有三栏,见 §1.5)。故这两块**以 xlsx 为规格、按 VTK 工程新设计**,不受"复刻须先实地学习"约束;而"参考 Geopro 1.0"的色阶/异常框F26/F50属复刻项、目前无 1.0 参考、先近似后精修。
---
## 0. TL;DR一页结论
「补充需求」整页都是 **VTK 中央视图**的规格:把视图区拆成三个子列表栏(**三维数据集 / 二维数据集 / 三维分析**),并补齐坐标轴、相机预设、底图、**切片交互**、**异常体管理**、三维体详情、任务管理。
**当前真实状态(已源码核实,非推测):中央 VTK 是空壳。**
- `rebuildCentral``src/app/main.cpp:508-512`)只捕获 `showCurtain`,喂入**空 `sections`**;启动后中央区只有背景色 + 相机,不渲染任何数据。
- 浮层勾选框 `chkVoxel/chkSlice/chkTerrain``main.cpp:603-617`)只改 `bool`,而 `rebuildCentralScene``src/app/CentralScene.cpp:16-47`)只处理 `is2D`/`showCurtain` 两支 —— 体素/切片/地形勾选**当前什么都不做**。
- `slicePlane``vtkImagePlaneWidget``main.cpp:251`)声明后**全代码零使用**`buildVoxelFromScatters/buildTerrain/loadVoxelScatters` 在 app 层**零调用**。
**好消息render 层 actor 全部完整且有测试**§5.1),数据源 `LocalSampleRepository` 也在。"之前用静态数据做的原型渲染"git `7007619`/`9b77d07` 等)的**装配代码**在 `6241eb3`"CentralScene 数据驱动重构"时被摘除,但**渲染原语没丢**。
> 一句话地基actor 管线)稳固,缺的是「编排层 + 交互层 + 三栏 UI + 真实/样本数据接入」。
**评审已纳入的硬伤修正**(详见各节):① `Scene` 只能加 `vtkActor`、加不了体绘制 `vtkVolume`"actor 零改动复活"对三维体不成立 → §5.2/§8 增 `vtkProp` 入口;② `I3dSceneRepository` 必须**异步**(项目已 ApiChain 异步化,同步签名会让"换实现不动上层"破产)→ §6③ 任意切片**钉死 `vtkImageReslice`**`vtkCutter` 切体素只出交线不出着色剖面)→ §9.1;④ 接口数据结构去裸 `double[]`/出参 → §6.2/§6.3。
---
## 1. 背景与问题
需求表「补充需求」页签定义的是 Geopro 1.0 风格的三维工作台 —— VTK 视图不再是"二维地图/三维视图"二选一的展示器,而是一个带**子列表 + 工具栏 + 右键菜单 + 切片/异常交互**的分析环境。
当前客户端M1的 VTK 现状与之差距:
1. **结构不符**:现在是单一 `QVTKOpenGLStereoWidget` + 顶部「二维地图/三维视图」互斥分段按钮(`main.cpp:308-316`),左下一个统一数据集列表。需求要的是**视图内置三个子列表栏**。
2. **不渲染数据**:见 §0编排层喂空数据所有图层勾选是死代码。
3. **无坐标轴 / 无相机预设 / 无底图 / 无切片交互 / 无拾取联动 / 无 3D 异常体 / 无任务面板**:这些都是净增建。
4. **后端缺接口**:已核对 `ApiClient` 端点§6.0),只有 2D ERT 那套;三维体模型/切片保存/异常创建/任务记录端点客户端都没有,且后端也未做。
---
## 1.5 原版web实地分析结论Playwright + JS 逆推2026-06-15
实地分析 `http://tenant.geomative.cn/#/projectSpace/dataView`(详见记忆 [[web-3d-view-threetile]]
- **渲染技术栈**web 3D 地球是 **ThreeTileThree.js 瓦片地球)**——DOM 无 `cesium-widget`、单 WebGL2 canvas、`__THREE__` 在Cesium 1.107 虽加载但本页未用。⇒ 桌面用 VTK 是**另一套实现**,三栏/切片是桌面新设计,不存在"web 怎么做桌面照搬"。
- **底图多源已确证**`threeMap` chunk天地图/Google/Bing/高德/腾讯/ArcGIS/Mapbox/中科星图 ⇒ 坐实补充需求 C13 底图需求,桌面 VTK 需自建瓦片层。
- **3D 数据通路已确证**(网络):勾选 ERT 对象 → 批量 `dd/ert/inversion/rows/{id}`(2D 反演剖面) + `lvl/colorGradation` → 在 3D 地理空间摆成**竖直帘面**= 桌面 `CurtainActor` 目标)。
- **3D 分析功能集已确证**index chunk i18n `three*` 键):模型 选/移/转/缩放/恢复 + X·Y·Z 轴分散;剖切面 开/关/显/隐/平移/旋转;创建异常/异常列表;导出 dat/grd/bin/lvl。3D 模型从 URL 加载。⇒ 这些功能桌面要做,但**实现自定**web 用 Three.js桌面用 VTK
- **web 不是三栏**web 是 左(数据筛选+对象树)/中(地球+显示隐藏地图+滑块)/右(异常列表)。补充需求的三栏(三维数据集/二维数据集/三维分析)是**桌面新结构**。
- **威立雅项目只有 2D 反演剖面(帘面),无真正三维体模型**;真三维体(`dd_Structual3D`,"地大展示")很可能在别的项目,待用户指认后再实地学习其切片/异常几何(不阻塞 P1P3因切片可对 LocalSample 体素开发)。
---
## 2. 目标与范围
### 2.1 总目标
在现有 render actor 地基上,复活并扩展中央 VTK 为「补充需求」描述的三维分析工作台;**用静态样本数据驱动**,但所有数据出入口走**为真实后端预留的仓储接口**§6
### 2.2 范围内(本设计覆盖)
- 三子列表栏 UI 结构(三维数据集 / 二维数据集 / 三维分析)。
- 三维数据集栏:坐标轴设置、水平/垂直比例、快捷视图前后左右上下、ZoomIn/Out/Fit、数据集勾选 → 渲染。
- 二维数据集栏:底图(天地图/Google/隐藏、2D 视图切面位置、数据集勾选 → 渲染。
- 三维分析栏:体模型/切片树、右键菜单、切片交互工具、拾取选中联动、切片分析(含创建异常、保存为数据集、导出、正视/翻转/关闭)。
- 三维体数据集详情、切片数据集详情。
- 异常/异常体管理树、删除、属性、VTK 联动、显示过滤、截图属性)。
- 任务管理(任务记录 + 可使用任务列表)。
- **仓储接口设计**§6—— 本设计的重头,决定将来接后端的成本。
### 2.3 范围外 / 后续
- 后端真实接口实现(本轮仅设计接口 + LocalSample 实现)。
- 克里金插值IDW 已有;克里金作为插值模型选项后续补)。
- 二维底图的高保真瓦片缓存/离线(本轮先打通"能显示底图")。
- 与 Web 端完全像素级一致的色阶编辑器(沿用现有 colorBar 解析)。
### 2.4 设计原则
- **render 层零业务**actor 只吃 `core::*` 数据结构(`Grid/ScalarVolume/ScatterField/Anomaly`),不认 ds/API。复活编排即可不改 actor。
- **接口先行**:上层只依赖 `I3dSceneRepository`§6`LocalSample3dRepository` 与未来 `Api3dRepository` 可互换。
- **交互独立成层**:新建 `src/render/interact/`README 早有规划但目录不存在),切片/拾取/圈异常都是 `InteractionTool`
---
## 3. 与既有架构的关系
```
┌─────────────────────────── 中央 VTK 工作台 ───────────────────────────┐
ObjectTreePanel │ ┌ 子列表栏(三选一/并列)────────┐ ┌ VTK 视图区 ──────────────────┐ │
(左上,勾选对象) │ │ [三维数据集] [二维数据集] [三维分析]│ │ Scene(renderer) + actors │ │
│勾选 │ │ · 坐标轴/比例/快捷视图/Zoom 工具条 │ │ + CubeAxes + 底图层 │ │
▼ │ │ · 数据集勾选列表(按维度属性筛) │ │ + InteractionManager(切片/拾取)│ │
VtkSceneController ─┼─→ I3dSceneRepository ─→ core::数据 ─→ render actors ─→ Scene │ │
│ └────────────────────────────────┘ └──────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────┘
右栏: 三维体/切片 详情 · 异常体树 · 任务管理(任务记录 + 可用任务列表)
```
- `VtkSceneController`(新)取代当前散落在 `main.cpp` 的 lambda 编排,订阅"勾选对象/数据集/图层/视图模式"变化,经 `I3dSceneRepository` 取数据,调 render actor 重建场景。
- 现有 `WorkbenchNavController`(对象/数据集导航)、`DatasetDetailController`(详情)保持职责不变,新控制器与之并列。
---
## 4. 「补充需求」全文逐行映射(权威对照表)
> 维度属性来源:需求称"ds 类型的显示属性为 3D/2D",即**维度属性挂在 ds 类型上**(非单条 ds。`DsRow` 当前无此字段(`src/data/repo/RepoTypes.hpp:10`),须由 §6.1 的类型→维度映射补。
| 行 | 需求原文(摘) | 现状 | 落地方式 |
|---|---|---|---|
| A1 | VTK 提供三子列表栏:三维数据集/二维数据集/三维分析 | 单一 2D/3D 切换 | §7.1 三栏 UI |
| C3I3 | 坐标轴显示方式:标准/三维立体/不显示 | 无坐标轴 | `vtkCubeAxesActor`(标准)/`vtkAxesActor`(立体)/隐藏§7.2 |
| D4 | O 点位置 | 无 | 坐标轴原点配置(世界系原点 / 数据包围盒角)|
| D5I5 | 刻度:无刻度/米/英尺/经纬度/字体 | 无 | 刻度单位换算 + 经纬度用 `GeoLocalFrame` 反算 + 字体设置 |
| C6 | 水平/垂直比例 | 硬编码 `kVerticalExaggeration=2.0``main.cpp:208`| 做成可调,作用于全部 3D actor `SetScale(1,1,VE)` |
| C7 / D7I7 | 快捷视图:前/后/左/右/上/下 | `CameraPreset` 仅 Top2D/Free3D | 新增 6 方向预设§5.3|
| C8 / D8F8 | ZoomIn/Out/Fit | 仅 `ResetCamera`(=Fit) | In/Out 调 `camera->Zoom()`Fit=ResetCamera |
| C9D10 | 三维数据集列表:筛勾选对象中 ds 维度=3D勾选多个显示 | sections 为空 | §6.1 维度筛选 + §8 编排复活 |
| C13F13 | 地图:天地图/Google Map/隐藏 | 中央无底图 | §7.3 底图层VTK 瓦片)|
| C14 | 2D 视图:关闭/Z=0/顶部/底部/自定义 Z | 无 | 切面高度控制 |
| C15D16 | 二维数据集列表ds 维度=2D | 同上 | §6.1 + §8 |
| C19D20 | 三维分析列表:按 对象/三维体模型/切片 树 | 无 | §7.4 分析树 |
| D21,F22G22 | 右键·三维体:上下切片 | 无 | §9 轴向切片工具(水平面)|
| F23 | 前后切片 | 无 | §9 轴向切片 |
| F24 | 左右切片 | 无 | §9 轴向切片 |
| F25 | 任意切片(初始 45°可任意调整| 无 | §9 任意角度切片(`vtkPlaneWidget` 控面 + **`vtkImageReslice`** 重采样着色,非 `vtkCutter`|
| F26 | 色阶(参考 Geopro 1.0 优化)| 有 colorBar 解析 | 复用 `ColorScale` + 色阶编辑入口 |
| F27 | 显示/隐藏 | 无 | actor 可见性 |
| F28G28 | 数据详情 → 详情栏 | 详情面板在 | §10 三维体详情类型 |
| E29,F30F36 | 右键·切片数据集:保存/保存为/导出/删除/色阶/显隐/详情 | 无 | §6.3 切片 CRUD 接口 + §10 |
| C38,D39 | 选中三维体/切片为中心拖动旋转 | 无拾取/自定义 style | §9.3 拾取 + 自定义 InteractorStyle |
| D40 | 双击切片 → 正视该切片 | 无 | §9.3 双击→相机正视切面法向 |
| C44,D44 | 右键三维体创建切片工具 | 无 | §9 |
| D45 | 双击切片工具正视 | 无 | §9.3 |
| D46 | 选中切片滚轮 → 内外切片(对象=所属三维体)| 无 | §9.2 滚轮沿法向平移切面 |
| D47 | 切片任一位置可保存为新切片数据集 | 无 | §6.3 createSlice |
| D48,E49,F49F50 | 创建异常:异常工具,光标拾取起点;结束保存弹框(确定截图大小/异常坐标,参考 1.0| 有 2D `AnomalyActor`,无创建流 | §9.4 异常圈定工具 + §6.4 saveAnomaly + 截图 |
| E51F51 | 保存为数据集 | 无 | §6.3 |
| E52F52 | 导出为图片 | 无 | `vtkWindowToImageFilter` |
| E53F53 | 导出到 dat | 无 | 切面采样导出 |
| E54F54 | 正视图 | 无 | §9.3 |
| E55F55 | 视图翻转(水平旋转 180°| 无 | 相机 `Azimuth(180)` |
| E56F56 | 关闭(取消当前切片)| 无 | 移除切片工具 |
| A58,B59B65 | 三维体详情:源数据/切片数据/异常/插值模型(克里金,IDW)/插值参数/色阶参数/测量(点数,体积)| 详情引擎在,类型未做 | §10.1 |
| A67 | 切片详情:参照 dd_Section | `dd_section` 渲染已有 | §10.2 复用 |
| A69,B70,C71D77 | 异常体列表树:异常体→分组→异常 | `ObjectExceptionPanel` 只读树在 | §11 扩展为可操作 |
| C79,D80D81 | 操作:删除/删除分组 | 无 | §6.4 delete/deleteGroup |
| C83,C84 | 异常属性 + VTK↔列表 双向选中联动 | 无联动 | §9.3 + §11 |
| B86,C87F87 | 异常体显示过滤:全部显示/随GS/随数据集/全部隐藏 | 无 | §11 过滤模式 |
| B88,C88 | 异常增加截图属性(保存标识时截图)| 无 | §6.4 截图字段 |
| A90,C90 | 任务管理:任务记录 + 可使用任务列表 | 有 `model/list`,无任务面板 | §12 |
| B91,C91 | 任务记录:当前数据集调用任务的记录 | 无 | §6.5 taskRecords |
| B92,C92 | 可使用任务列表:与 ds 类型相符的任务插件 | `ModelInfo`(model/list) 在 | §6.5 usableTasks(按 ddType 过滤) |
---
## 5. 现状资产盘点render 层,已源码核实)
### 5.1 可直接复用的 actor完整 + 有测试)
| 组件 | 文件 | 吃什么 | 产出 | 复用于补充需求 |
|---|---|---|---|---|
| ScatterActor | `src/render/actors/ScatterActor.*` | `ScatterField+ColorScale` | 散点 actor | 三维体源数据点 |
| GridContourActor | `actors/GridContourActor.*` | `Grid+ColorScale` | 色带+等值线 | 切片面着色 |
| VoxelActor | `actors/VoxelActor.*` | `ScalarVolume+ColorScale+原点/间距` | **GPU 体绘制 `vtkVolume`**,可导出内部 `vtkImageData` | 三维体模型渲染 + 切片输入 |
| VoxelFromScatters | `render/VoxelFromScatters.*` | 多剖面散点+CRS+frame | IDW→体绘制+image | 三维体(散点插值)|
| AnomalyActor | `actors/AnomalyActor.*` | `vector<Anomaly>` | 点/折线/多边形(**2D 剖面**| 切片上异常圈定(需扩 3D 异常体)|
| TerrainActor | `actors/TerrainActor.*` | DEM+影像 GeoTIFF | 纹理地形 | 三维场景地形图层 |
| CurtainActor | `actors/CurtainActor.*` | `Grid+ColorScale+frame` | 竖直帘面 | dd_section 三维帘面 |
| MapLineActor | `actors/MapLineActor.*` | `Grid+frame` | 俯视红线 | 二维数据集测线 |
| ElectrodeActor | `actors/ElectrodeActor.*` | `Grid` | 电极 ▼ | 剖面电极 |
| ColorLutBuilder / ContourBands | `render/ColorLutBuilder.*` `ContourBands.*` | colorBar | LUT / 离线等值线几何 | 色阶 / 导出 |
### 5.2 缺口(净增建)
- **Scene 加不了体绘制**(评审 HIGH`Scene::addActor(vtkActor*)``src/render/Scene.hpp`)只收 `vtkActor`,而 VoxelActor 产物 `vtkVolume``vtkProp3D`、**不是** `vtkActor`。三维体(核心需求)渲染必经此口 → P1 须给 Scene 加 `addViewProp(vtkProp*)`(或 `addVolume(vtkVolume*)`5 行小改,但"actor 零改动复活"对三维体不成立。
- **坐标轴**:无 `vtkCubeAxesActor`/`vtkAxesActor`。
- **相机预设**`CameraPreset.cpp` 仅 `applyTop2D`/`applyFree3D`,缺前后左右上下 + Zoom In/Out。
- **底图**:无 VTK 瓦片底图层README 提的 `ground/TileGroundLayer` 未实现)。
- **切片交互**`vtkImagePlaneWidget` 声明未用;无 reslice/cutter/任意角度切片;`src/render/interact/` 目录不存在。
- **拾取/选中联动**:无 picker、无自定义 `vtkInteractorStyle`
- **3D 异常体**`AnomalyActor` 仅 2D 剖面;无三维异常体 actor、无 VTK↔列表联动。
- **截图**:无 `vtkWindowToImageFilter` 接线。
- **编排层**`rebuildCentralScene` 喂空数据;图层勾选死代码。
### 5.3 CameraPreset 扩展(小量、低风险,可独立先做)
新增 `applyView(vtkRenderer*, ViewDir)``ViewDir ∈ {Front,Back,Left,Right,Top,Bottom}`,设置 position/focalPoint/viewUp 后 `ResetCamera``zoomIn/zoomOut` 调 `camera->Zoom(1.2 / 0.83)``Render`
---
## 6. 仓储接口设计(本设计重头 —— 用户要求"接口设计好"
> 现状:`IDatasetRepository``src/data/repo/IDatasetRepository.hpp`)已有 2D 那套loadGrid/Scatter/ColorScale/Anomalies。本设计**新增并列接口 `I3dSceneRepository`**,承载三维体/切片/异常体/任务。本轮 `LocalSample3dRepository` 实现(读样本文件 + 内存态增删),将来 `Api3dRepository` 换实现。
> **接口必须异步(评审 HIGH**:项目已 ApiChain/`IAsyncProjectRepository` 异步化。`I3dSceneRepository` 取数方法**一律走回调/Qt 信号**(如 `void loadVolume(dsId, std::function<void(VolumeGrid)> onOk, OnErr onErr)`,或返回 `ApiChain`LocalSample 同步数据也包成异步壳。否则将来换 Api 实现会阻塞 UI、上层全要改"换实现不动上层"破产。下文签名为**简化示意(省略回调形参)**,落地按异步范式。
### 6.0 后端端点现状(已核对,非推测)
现有 `ApiClient` 仅:`dd/ert/{grid,inversion,measurement,trajectory}`、`dsObject` CRUD/import/detail、`exception/queryException`**只读**)、`model/list`、`lvl/colorGradation`、`templateExport`。
**缺**:三维体模型数据、切片 CRUD、异常**创建/保存**、任务记录。→ 本轮接口为这些预留方法签名LocalSample 内存实现。
### 6.1 维度属性(解决"ds 维度=3D/2D"筛选)
```cpp
enum class DsDimension { Dim2D, Dim3D, Analysis3D, Other };
// 由 ds 类型ddCode / dsTypeId决定。LocalSample 用内置映射表;
// 未来后端可在 dsObject/getDetail 返回 dimension 字段。
DsDimension dimensionOf(const DsRow& ds) const; // 列表筛选用
```
> LocalSample 映射依据「DD类型」页签语义`dd_Structual3D`/`dd_Property3D`/`dd_voxel` → `Dim3D`/`Analysis3D``dd_section`/`dd_inversion_data` 帘面可入 3D俯视测线入 2D`dd_trajectory_data` → `Dim2D`。
### 6.2 三维体模型数据集
```cpp
struct VolumeModelMeta {
std::string dsId, name;
std::string interpMethod; // "IDW" / "Kriging" / ...
std::vector<DynamicFormField> interpParams; // 插值参数(复用既有动态表单字段)
std::string colorScaleId; // 色阶参数引用
double pointCount = 0, volume = 0; // 测量数据(点数/体积)
std::vector<std::string> sourceDsIds; // 源数据集
std::vector<std::string> sliceDsIds; // 切片数据集
std::vector<std::string> anomalyBodyIds; // 异常体
};
// 规则体 + 原点/间距聚合返回(去 double& 出参,评审 MEDIUM
struct VolumeGrid {
geopro::core::ScalarVolume vol;
std::array<double,3> origin; // ox,oy,oz
std::array<double,3> spacing; // dx,dy,dz
double vmin = 0, vmax = 0;
};
VolumeModelMeta loadVolumeMeta(const std::string& dsId); // 异步示意
VolumeGrid loadVolume(const std::string& dsId); // 异步示意
```
> LocalSample用 `VoxelFromScatters` 把样本两条交叉剖面散点 IDW 成 `ScalarVolume` 当作一个三维体模型(产物即含 `vtkImageData`,切片直接复用)。
### 6.3 切片数据集CRUD —— 后端缺,先内存实现)
```cpp
struct SliceSpec {
std::string volumeDsId; // 所属三维体
std::array<double,3> origin; // 切面一点(去裸数组,评审 MEDIUM
std::array<double,3> normal; // 切面法向(轴向/任意)
std::string colorScaleId;
};
struct SliceDataset { std::string dsId, name; SliceSpec spec; geopro::core::Grid section; };
// 落库 CRUD进仓储
std::string createSlice(const SliceSpec& spec, const std::string& name); // 保存为数据集→返回新 dsId
void saveSlice(const std::string& dsId, const SliceSpec& spec); // 保存
void deleteSlice(const std::string& dsId);
// 导出:导图片/dat 由 UI 层用 vtkWindowToImageFilter / 采样写文件(不入仓储)
```
> **实时切片不进仓储(评审 MEDIUM**:交互拖切面时每帧重采样应直接走 VTK 管线(`vtkImageReslice` 挂在切片工具上§9.1**不**经 repository 回算 `Grid`(避免慢路径)。仓储只管"切片保存为数据集"这种持久化动作。
### 6.4 异常 / 异常体(树 + CRUD + 截图)
```cpp
struct AnomalyBody { // 对应"异常体"(树中间层)
std::string id, name, typeName;
std::vector<core::Anomaly> members; // 组内异常(复用既有 2D Anomaly3D 用包围几何)
};
struct AnomalyTree { // 对象 → 异常体/分组 → 异常
std::vector<AnomalyBody> bodies;
std::vector<core::Anomaly> loose; // 未分组异常
};
AnomalyTree loadAnomalyTree(const std::string& objectId);
std::string saveAnomaly(const core::Anomaly& a, const std::string& screenshotPngPath); // 截图属性
void deleteAnomaly(const std::string& anomalyId);
void deleteAnomalyGroup(const std::string& bodyId);
// 显示过滤是 UI/渲染层状态不进仓储enum AnomalyFilter{All,FollowGs,FollowDs,None}
```
### 6.5 任务管理
```cpp
struct TaskRecord { std::string id, taskName, status, createTime; }; // 任务记录
struct UsableTask { std::string scriptId, scriptCode, name; int opType; }; // = 既有 ModelInfo
std::vector<TaskRecord> loadTaskRecords(const std::string& dsId); // 当前 ds 的调用记录(后端缺→空/样本)
std::vector<UsableTask> loadUsableTasks(const std::string& ddCode); // 按 ds 类型过滤插件(复用 model/list
```
---
## 7. UI 设计
### 7.1 三子列表栏(客户端新设计 —— web 无三栏)
> 已确认§1.5web 端**没有三栏**,三栏是补充需求为桌面定义的新结构,以 xlsx 为准设计。
在 VTK dock 内(或左侧新 dock放三个可切换 tab/分段:**三维数据集 / 二维数据集 / 三维分析**。每栏顶部是该栏专属工具条,下方是数据集勾选列表(按 §6.1 维度筛选当前勾选对象的 ds
**职责切分(决策,不再是开放问题)**:保留现有 `ObjectTreePanel`(左上勾选对象)作为"对象勾选源";三栏列表只在被勾选对象范围内、按维度过滤显示 ds。**左下数据集列表服务"详情查看",三栏列表服务"VTK 渲染勾选"**——两条线并存。依据web 端本身也是"对象树勾选 + 独立异常列表"的多列表结构,两条线与原版心智一致;且补充需求明确三栏服务于 VTK 渲染,与详情查看是不同动作。
### 7.2 三维数据集栏工具条
坐标轴下拉(标准/立体/不显示)+ O 点 + 刻度(无/米/英尺/经纬度)+ 字体 | 水平/垂直比例(滑块/输入)| 快捷视图(前后左右上下 6 钮)| ZoomIn/Out/Fit
### 7.3 二维数据集栏
底图下拉(天地图/Google/隐藏)+ 2D 视图位置(关闭/Z=0/顶部/底部/自定义 Z
**底图层(评审 HIGH被低估单列风险子项**web 用 ThreeTile 多源瓦片§1.5 已确证:天地图/Google/Bing/高德/腾讯…)。桌面 VTK 无现成瓦片图层,需自建小型瓦片引擎:可视范围 → 瓦片行列号 → 异步拉 PNG → 贴 `vtkPlaneSource`+texture → 随相机换 LOD。**关键配准**:天地图瓦片是 EPSG:3857须把每块瓦片范围反算到 `GeoLocalFrame` 局部米才能与帘面/体素对齐(复用 `TerrainActor` 已有的 3857→4326→frame 流程)。本轮先打通"天地图能显示+隐藏"Google/缓存/LOD 后续。**排 P5**(复杂度高、依赖天地图 token
### 7.4 三维分析栏
树:对象 → 三维体模型数据集 → 切片。右键菜单按节点类型分派(三维体 / 切片,见 §4 行 D21F36
---
## 8. 渲染编排层 `VtkSceneController`(复活原型)
职责:聚合"勾选对象 + 当前栏 + 图层开关 + 视图模式"→ 经 `I3dSceneRepository``core::*` → 调 actor → `Scene`。**取代 `main.cpp` 里的 `rebuildCentral` lambda 与死掉的图层标志。**
```cpp
class VtkSceneController : public QObject {
// 输入信号:勾选对象变 / 栏切换 / 图层勾选 / 比例变 / 快捷视图 / 切片增删
// 内部:维护 ScalarVolume/Grid 缓存,按需重建;统一 SetScale(1,1,VE)
// 输出scene.clear()+addActor()+renderWindow->Render()
};
```
落地第一步(最低风险、最快见效):把 `extractSlice`/`loadVolume`/`buildCurtain`/`buildVoxelFromScatters`/`buildTerrain` 用真实勾选 ds 接通 —— **render actor 零改动即复活**
---
## 9. 交互层 `src/render/interact/`(新目录,最重模块)
### 9.1 切片工具
- **轴向切片**(上下/前后/左右):`vtkImagePlaneWidget` 贴体素 `vtkImageData`VoxelActor 已能导出 image沿固定轴向、自动重采样着色角度不可调符合 G22G24
- **任意切片**F25`vtkPlaneWidget`(控制面位姿)+ **`vtkImageReslice`**(按斜面对体素重采样出着色剖面),初始 45°可任意旋转。**不用 `vtkCutter`**(评审 HIGHcutter 切 `vtkImageData` 只产几何交线/多边形,得不到带标量的连续剖面图)。
- 统一抽象 `SliceTool`:持切面位姿 + `vtkImageReslice`,直接产出贴 `vtkImageActor` 的着色剖面(避免回算 `core::Grid` 的绕路;仅"保存为数据集"时才转 Grid 落库)。
### 9.2 滚轮切片D46
选中切片 → 自定义 InteractorStyle 截 `OnMouseWheel` → 沿切面法向平移 origin → 重算切面。
### 9.3 拾取 + 选中联动C38/D39/D40/C84
`vtkPropPicker` + 自定义 `vtkInteractorStyle`
- 选中三维体/切片 → 以其包围盒中心设相机 focalPoint拖动绕其旋转
- 双击切片 → 相机正视切面法向D40/D45/E54
- 拾取异常体 ↔ 异常树列表双向高亮C84
### 9.4 异常圈定工具D48/E49/F49F50
自定义 widget光标拾取起点 → 连续描点成多边形(复用 `core::Anomaly` Polygon→ 结束弹保存对话框(截图大小 / 异常坐标,参考 Geopro 1.0)→ `saveAnomaly(a, screenshot)`。截图用 `vtkWindowToImageFilter`
> **异常几何 = 切片面上的多边形(决策,不再是开放问题)**:需求 F49"以光标拾取点为起点圈异常"+ web 同款(在切片上描点),即异常是**画在切片平面上的多边形**——本质 2D-in-3D把多边形顶点存为切面局部坐标 + 切面位姿即可在 3D 中定位。**不需要真三维体几何**。故 `core::Anomaly`(2D 多边形) 复用成立§6.4 `AnomalyBody.members` 用 `core::Anomaly` + 所属切面引用即可。截图属性B88即圈定时的视图截图。
---
## 10. 详情视图
### 10.1 三维体详情类型(新)
详情面板(`DatasetDetailPanel`ddCode 驱动)新增三维体详情:源数据 / 切片数据 / 异常 / 插值模型(IDW·克里金) / 插值参数 / 色阶参数 / 测量(点数·体积)。数据来自 `VolumeModelMeta`§6.2),多为表单/列表展示。
### 10.2 切片详情
参照 `dd_section`(已有渲染),复用现有等值面+等值线引擎。
---
## 11. 异常体管理面板
扩展现有 `ObjectExceptionPanel`(当前只读树)为可操作:
- 树:对象 → 异常体 → 异常(含未分组异常)。
- 操作:删除 / 删除分组§6.4)。
- 异常属性面板(选中异常显详情)。
- VTK↔列表双向选中联动§9.3)。
- 显示过滤:全部显示 / 随 GS / 随数据集 / 全部隐藏(渲染层可见性状态)。
- 异常截图属性保存时存截图§6.4)。
---
## 12. 任务管理面板(新)
两段:
- **任务记录**:当前数据集的任务调用记录(`loadTaskRecords`,后端缺→样本/空态)。
- **可使用任务列表**:按当前 ds 的 ddCode 过滤的任务插件(`loadUsableTasks`,复用 `model/list`)。
---
## 13. 开放问题 / 待确认
### 已决(评审 + 实地分析后关闭)
-**三栏 vs 左下列表**:两条线并存(三栏=渲染勾选、左下=详情查看web 本身即多列表结构§7.1)。
-**异常 3D 表达**:异常 = 切片面上的 2D 多边形,复用 `core::Anomaly`无需真三维体几何§9.4)。
-**任意切片技术**`vtkImageReslice`,非 `vtkCutter`§9.1)。
-**接口异步 + 数据结构**:异步范式 + `VolumeGrid`/`std::array` 聚合§6
### 仍开放(不阻塞 P1/P2相关期开工前定
1. **坐标系单位 / O 点**§7.2P2刻度"经纬度"用 `GeoLocalFrame` 反算;"米/英尺"基于世界米。O 点默认世界原点还是数据包围盒角?→ P2 开工前定,倾向"数据包围盒角"。
2. **切片"保存为数据集"落库形态**§6.3P3本轮 LocalSample 内存态;是否持久化到本地文件以便重启可见?
3. **真三维体项目**§1.5P3/P4威立雅无真三维体需用户指认有 `dd_Structual3D` 的项目,实地学习其切片/异常几何与交互细节。**不阻塞 P3**(切片对 LocalSample 体素先开发)。
4. **"参考 Geopro 1.0"**F26 色阶 / F50 异常保存框P4目前无 1.0 参考 → 先用现有 colorBar 解析 + 标准保存框近似,拿到 1.0 后精修。
5. **底图 token / Google 可用性**§7.3P5天地图需 tokenGoogle 国内可用性。本轮先天地图 + 隐藏。
---
## 14. 分期建议(详细 plan 另立,此处仅排序)
1. **P1 复活渲染(地基,低风险)**`VtkSceneController` + `I3dSceneRepository`/`LocalSample3dRepository` + 勾选 ds → 真实/样本数据 → actor。复活帘面/体素/地形/切面着色。
2. **P2 三维数据集栏(纯前端,独立)**:坐标轴 + 水平/垂直比例 + 快捷视图 6 向 + Zoom。
3. **P3 三维分析·切片交互(最重)**`interact/` + 轴向/任意切片 + 滚轮 + 拾取联动 + 双击正视 + 正视/翻转/关闭 + 切片 CRUD + 导出。
4. **P4 异常体 + 圈异常 + 详情 + 任务**:异常圈定工具 + 异常体树管理 + 三维体详情 + 任务面板(依赖 1.0 参考)。
5. **P5 二维底图**:天地图瓦片层 + 2D 视图位置。
> 依赖P1/P2/P3 均可用 xlsx + 现有代码 + LocalSample 开工(切片对 LocalSample 体素开发§1.5。P4 的色阶/异常框精修依赖 Geopro 1.0 参考先近似P3/P4 的真三维体细节待用户指认 3D 项目后实地补。P5 底图依赖天地图 token。
>
> **可立即开工P1含 Scene 加 vtkProp 入口)+ P2。** 评审结论spec 修订后可作为 plan 基础。