25 KiB
VTK 三维视图「补充需求」设计
- 日期:2026-06-15
- 分支建议:
feat/vtk-3d-view - 状态:设计稿(spec)。本轮只产出设计,实现分期另立 plan。
- 需求来源:
D:\Projects\GEOPRO\Geopro3.0 需求表.xlsx→「补充需求」页签(已逐行通读,§4 全文映射);交叉参考「DD类型」页签。 - 关键约束(用户已拍板):
- 后端 API 尚未就绪 —— 本轮用
LocalSampleRepository静态数据驱动渲染与交互,但仓储接口必须按真实后端形态设计好(§6),将来后端到位只换实现、不动上层。 - 三维相关 ddCode(
dd_Structual3D/dd_Property3D/切片/异常体/任务记录)后端、客户端都还没做,是净增建。
- 后端 API 尚未就绪 —— 本轮用
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 + 真实/样本数据接入」。
1. 背景与问题
需求表「补充需求」页签定义的是 Geopro 1.0 风格的三维工作台 —— VTK 视图不再是"二维地图/三维视图"二选一的展示器,而是一个带子列表 + 工具栏 + 右键菜单 + 切片/异常交互的分析环境。
当前客户端(M1)的 VTK 现状与之差距:
- 结构不符:现在是单一
QVTKOpenGLStereoWidget+ 顶部「二维地图/三维视图」互斥分段按钮(main.cpp:308-316),左下一个统一数据集列表。需求要的是视图内置三个子列表栏。 - 不渲染数据:见 §0,编排层喂空数据,所有图层勾选是死代码。
- 无坐标轴 / 无相机预设 / 无底图 / 无切片交互 / 无拾取联动 / 无 3D 异常体 / 无任务面板:这些都是净增建。
- 后端缺接口:已核对
ApiClient端点(§6.0),只有 2D ERT 那套;三维体模型/切片保存/异常创建/任务记录端点客户端都没有,且后端也未做。
2. 目标与范围
2.1 总目标
在现有 render actor 地基上,复活并扩展中央 VTK 为「补充需求」描述的三维分析工作台;用静态样本数据驱动,但所有数据出入口走为真实后端预留的仓储接口(§6)。
2.2 范围内(本设计覆盖)
- 三子列表栏 UI 结构(三维数据集 / 二维数据集 / 三维分析)。
- 三维数据集栏:坐标轴设置、水平/垂直比例、快捷视图(前后左右上下)、Zoom(In/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 |
| C3–I3 | 坐标轴显示方式:标准/三维立体/不显示 | 无坐标轴 | vtkCubeAxesActor(标准)/vtkAxesActor(立体)/隐藏;§7.2 |
| D4 | O 点位置 | 无 | 坐标轴原点配置(世界系原点 / 数据包围盒角) |
| D5–I5 | 刻度:无刻度/米/英尺/经纬度/字体 | 无 | 刻度单位换算 + 经纬度用 GeoLocalFrame 反算 + 字体设置 |
| C6 | 水平/垂直比例 | 硬编码 kVerticalExaggeration=2.0(main.cpp:208) |
做成可调,作用于全部 3D actor SetScale(1,1,VE) |
| C7 / D7–I7 | 快捷视图:前/后/左/右/上/下 | CameraPreset 仅 Top2D/Free3D |
新增 6 方向预设(§5.3) |
| C8 / D8–F8 | Zoom:In/Out/Fit | 仅 ResetCamera(=Fit) |
In/Out 调 camera->Zoom();Fit=ResetCamera |
| C9–D10 | 三维数据集列表:筛勾选对象中 ds 维度=3D;勾选多个显示 | sections 为空 | §6.1 维度筛选 + §8 编排复活 |
| C13–F13 | 地图:天地图/Google Map/隐藏 | 中央无底图 | §7.3 底图层(VTK 瓦片) |
| C14 | 2D 视图:关闭/Z=0/顶部/底部/自定义 Z | 无 | 切面高度控制 |
| C15–D16 | 二维数据集列表:ds 维度=2D | 同上 | §6.1 + §8 |
| C19–D20 | 三维分析列表:按 对象/三维体模型/切片 树 | 无 | §7.4 分析树 |
| D21,F22–G22 | 右键·三维体:上下切片 | 无 | §9 轴向切片工具(水平面) |
| F23 | 前后切片 | 无 | §9 轴向切片 |
| F24 | 左右切片 | 无 | §9 轴向切片 |
| F25 | 任意切片(初始 45°,可任意调整) | 无 | §9 任意角度切片(vtkPlaneWidget+vtkCutter) |
| F26 | 色阶(参考 Geopro 1.0 优化) | 有 colorBar 解析 | 复用 ColorScale + 色阶编辑入口 |
| F27 | 显示/隐藏 | 无 | actor 可见性 |
| F28–G28 | 数据详情 → 详情栏 | 详情面板在 | §10 三维体详情类型 |
| E29,F30–F36 | 右键·切片数据集:保存/保存为/导出/删除/色阶/显隐/详情 | 无 | §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,F49–F50 | 创建异常:异常工具,光标拾取起点;结束保存弹框(确定截图大小/异常坐标,参考 1.0) | 有 2D AnomalyActor,无创建流 |
§9.4 异常圈定工具 + §6.4 saveAnomaly + 截图 |
| E51–F51 | 保存为数据集 | 无 | §6.3 |
| E52–F52 | 导出为图片 | 无 | vtkWindowToImageFilter |
| E53–F53 | 导出到 dat | 无 | 切面采样导出 |
| E54–F54 | 正视图 | 无 | §9.3 |
| E55–F55 | 视图翻转(水平旋转 180°) | 无 | 相机 Azimuth(180) |
| E56–F56 | 关闭(取消当前切片) | 无 | 移除切片工具 |
| A58,B59–B65 | 三维体详情:源数据/切片数据/异常/插值模型(克里金,IDW)/插值参数/色阶参数/测量(点数,体积) | 详情引擎在,类型未做 | §10.1 |
| A67 | 切片详情:参照 dd_Section | dd_section 渲染已有 |
§10.2 复用 |
| A69,B70,C71–D77 | 异常体列表树:异常体→分组→异常 | ObjectExceptionPanel 只读树在 |
§11 扩展为可操作 |
| C79,D80–D81 | 操作:删除/删除分组 | 无 | §6.4 delete/deleteGroup |
| C83,C84 | 异常属性 + VTK↔列表 双向选中联动 | 无联动 | §9.3 + §11 |
| B86,C87–F87 | 异常体显示过滤:全部显示/随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 缺口(净增建)
- 坐标轴:无
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换实现。
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"筛选)
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 三维体模型数据集
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; // 异常体
};
VolumeModelMeta loadVolumeMeta(const std::string& dsId);
geopro::core::ScalarVolume loadVolume(const std::string& dsId,
double& ox,double& oy,double& oz,
double& dx,double& dy,double& dz); // 规则体 + 原点/间距
LocalSample:用
VoxelFromScatters把样本两条交叉剖面散点 IDW 成ScalarVolume当作一个三维体模型。
6.3 切片数据集(CRUD —— 后端缺,先内存实现)
struct SliceSpec {
std::string volumeDsId; // 所属三维体
double origin[3]; // 切面一点
double normal[3]; // 切面法向(轴向/任意)
std::string colorScaleId;
};
struct SliceDataset { std::string dsId, name; SliceSpec spec; geopro::core::Grid section; };
SliceDataset extractSlice(const SliceSpec& spec); // 实时算切面(不落库)
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 / 采样写文件(不入仓储)
6.4 异常 / 异常体(树 + CRUD + 截图)
struct AnomalyBody { // 对应"异常体"(树中间层)
std::string id, name, typeName;
std::vector<core::Anomaly> members; // 组内异常(复用既有 2D Anomaly;3D 用包围几何)
};
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 任务管理
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 三子列表栏
在 VTK dock 内(或左侧新 dock)放三个可切换 tab/分段:三维数据集 / 二维数据集 / 三维分析。每栏顶部是该栏专属工具条,下方是数据集勾选列表(按 §6.1 维度筛选当前勾选对象的 ds)。
取舍建议:保留现有
ObjectTreePanel(左上勾选对象)作为"对象勾选源";三栏列表只在被勾选对象范围内、按维度过滤显示 ds。避免与现有左下数据集列表职责重叠 —— 左下数据集列表服务"详情查看",三栏列表服务"VTK 渲染勾选"(两条线,需在 UI 上区分清楚,见 §13 开放问题)。
7.2 三维数据集栏工具条
坐标轴下拉(标准/立体/不显示)+ O 点 + 刻度(无/米/英尺/经纬度)+ 字体 | 水平/垂直比例(滑块/输入)| 快捷视图(前后左右上下 6 钮)| Zoom(In/Out/Fit)。
7.3 二维数据集栏
底图下拉(天地图/Google/隐藏)+ 2D 视图位置(关闭/Z=0/顶部/底部/自定义 Z)。底图层:VTK 内用瓦片纹理贴 z=0 平面(天地图 WMTS);本轮先打通"能显示+隐藏",缓存优化后续。
7.4 三维分析栏
树:对象 → 三维体模型数据集 → 切片。右键菜单按节点类型分派(三维体 / 切片,见 §4 行 D21–F36)。
8. 渲染编排层 VtkSceneController(复活原型)
职责:聚合"勾选对象 + 当前栏 + 图层开关 + 视图模式"→ 经 I3dSceneRepository 取 core::* → 调 actor → Scene。取代 main.cpp 里的 rebuildCentral lambda 与死掉的图层标志。
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),沿固定轴向,角度不可调(符合 G22–G24)。 - 任意切片(F25):
vtkPlaneWidget+vtkCutter/vtkImageReslice,初始 45°,可任意旋转。 - 统一抽象
SliceTool:持vtkPlane,产出切面Grid(喂 GridContourActor 着色)。
9.2 滚轮切片(D46)
选中切片 → 自定义 InteractorStyle 截 OnMouseWheel → 沿切面法向平移 origin → 重算切面。
9.3 拾取 + 选中联动(C38/D39/D40/C84)
vtkPropPicker + 自定义 vtkInteractorStyle:
- 选中三维体/切片 → 以其包围盒中心设相机 focalPoint(拖动绕其旋转)。
- 双击切片 → 相机正视切面法向(D40/D45/E54)。
- 拾取异常体 ↔ 异常树列表双向高亮(C84)。
9.4 异常圈定工具(D48/E49/F49–F50)
自定义 widget:光标拾取起点 → 连续描点成多边形(复用 core::Anomaly Polygon)→ 结束弹保存对话框(截图大小 / 异常坐标,参考 Geopro 1.0)→ saveAnomaly(a, screenshot)。截图用 vtkWindowToImageFilter。
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 现有左下数据集列表的职责边界:是新增三栏(渲染勾选用)与左下(详情用)并存,还是合并改造?影响 UI 重构面。(§7.1 给了建议:并存,两条线)
- 坐标系单位:刻度"经纬度"用
GeoLocalFrame反算到 lat/lon;"米/英尺"基于世界系米。O 点默认取世界原点还是数据包围盒? - 切片"保存为数据集"的落库形态:后端缺接口,本轮 LocalSample 内存态。是否需要持久化到本地文件以便重启可见?
- 异常 3D 表达:现有
Anomaly是 2D(剖面坐标)。三维异常体是用包围多边形拉伸,还是需要真正的 3D 体?需求 B70 树结构清晰,但 3D 几何形态需 1.0 参考。 - "参考 Geopro 1.0"的多处(F26 色阶 / F50 异常保存框 / F49 圈异常):是否有 1.0 可实地学习(截图/源码/在线系统)?按记忆规约(复刻须实地学习,禁猜测),实现这些前需拿到 1.0 参考。
- 底图天地图 key / Google Map 可用性:天地图需 token;Google 在国内可用性。本轮先做天地图 + 隐藏,Google 占位?
14. 分期建议(详细 plan 另立,此处仅排序)
- P1 复活渲染(地基,低风险):
VtkSceneController+I3dSceneRepository/LocalSample3dRepository+ 勾选 ds → 真实/样本数据 → actor。复活帘面/体素/地形/切面着色。 - P2 三维数据集栏(纯前端,独立):坐标轴 + 水平/垂直比例 + 快捷视图 6 向 + Zoom。
- P3 三维分析·切片交互(最重):
interact/+ 轴向/任意切片 + 滚轮 + 拾取联动 + 双击正视 + 正视/翻转/关闭 + 切片 CRUD + 导出。 - P4 异常体 + 圈异常 + 详情 + 任务:异常圈定工具 + 异常体树管理 + 三维体详情 + 任务面板(依赖 1.0 参考)。
- P5 二维底图:天地图瓦片层 + 2D 视图位置。
依赖:P3/P4 多处依赖"参考 Geopro 1.0"与后端接口,须先解 §13 开放问题。P1/P2 无外部依赖,可立即开工。