131 lines
9.3 KiB
Markdown
131 lines
9.3 KiB
Markdown
# VTK 三维视图「三栏结构重构」设计
|
||
|
||
- 日期:2026-06-16
|
||
- 分支:`feat/vtk-3d-view`
|
||
- 状态:**设计稿(经高保真原型逐项对齐用户反馈后定稿)**
|
||
- 上位文档:`2026-06-15-vtk-3d-supplementary-design.md`(总设计 v2)。本文是其 **A1 三栏结构** 的实现增量设计,**就 UI 形态与若干控件细节,取代总 spec §7.1 中"左侧新 dock / tab 二选一"的开放表述**。
|
||
- 高保真原型:`docs/superpowers/mockups/2026-06-16-three-column-layout.html`(深色令牌取自 `src/app/Theme.cpp`;默认即定稿方案)。
|
||
- 需求来源:`Geopro3.0 需求表.xlsx`「补充需求」页签(已逐行精读,行号见下文)。
|
||
|
||
---
|
||
|
||
## 0. 目标与范围(用户已确认)
|
||
|
||
把当前"旧二维/三维切换 + 三个浮层"的过渡态 UI,重组为需求 A1 的**三个子列表栏**,并接通到已有的渲染/交互能力。
|
||
|
||
### 本轮 IN
|
||
1. **三栏内嵌侧栏**(VTK 视图内左侧抽屉 + 三 tab + 可折叠);删除旧「二维地图/三维视图」互斥切换;中央 dock 改名 **「VTK视图」**。
|
||
2. **收编三浮层**:左上 `layerPanel`(图层勾选)、右上 `axisBar`(P2 工具条)→ 并入「三维数据集」栏;左下 `sliceBar` → **删除**(切片改走三维分析右键菜单)。
|
||
3. **三维数据集栏**:工具条 4 栏位接 P2 已实现控制器;数据集列表按 `dimensionOf` 过滤 3D ds + 勾选 → 接现有 `VtkSceneController` 渲染。
|
||
4. **二维数据集栏**:列表按 2D 过滤;「地图 / 2D视图」控件做出来(底图瓦片渲染留 P5,本轮控件 UI + 2D 视图 Z 平面接通)。
|
||
5. **三维分析栏**:对象→三维体模型→切片 树;两个右键菜单 UI 完整;右键「切片」(上下/前后/左右/任意) **接已有 `SliceTool`**(替代 sliceBar)。
|
||
6. **VTK视图 + 数据详情** 标题栏右侧加**全屏按钮**。
|
||
|
||
### 本轮 OUT(菜单项可见但暂 stub/禁用,留 P4/P5)
|
||
- 切片 CRUD:保存 / 保存为 / 导出 / 删除(P4,`I3dSceneRepository` 接口已留位)。
|
||
- 色阶编辑(F26 参考 Geopro 1.0,无参考,留 P4)。
|
||
- 底图瓦片渲染(P5)、异常体管理 / 三维体详情 / 任务管理(P4)。
|
||
|
||
---
|
||
|
||
## 1. 核心架构决策(关键澄清)
|
||
|
||
**全工作台只有一个共享的中央 VTK 视图**,三栏是叠在其上的「子列表栏」,各自把数据喂进同一视图。证据(需求交叉验证):
|
||
- 行 2「**VTK视图上**提供三个子列表栏」;行 11「显示在 VTK 中」;行 16「显示在 VTK 的 2D 视图」;行 19「显示在 vtk 的三维视图」——三处同指一个 VTK。
|
||
- 需求行 36「VTK视图」挂在「三维分析」下,**只是把视图交互(选中拖动旋转 / 双击正视)归类描述**,不代表视图归三维分析独有。
|
||
|
||
**推论(本轮落地):**
|
||
- 旧「二维地图/三维视图」互斥分段按钮(`main.cpp:308-316` 一带)**删除**。
|
||
- 2D 不再是独立视图模式,而是 VTK 视图里的一个 **2D 图层/平面**(底图 + 2D 数据,摆在某 Z 平面),由「二维数据集」栏控制。
|
||
- 中央 dock 名 `二维地图/三维视图` → **`VTK视图`**(同时承载 2D/3D,且为需求原文叫法)。
|
||
|
||
---
|
||
|
||
## 2. 三栏物理形态(方案 C·视图内嵌侧栏)
|
||
|
||
- 三栏 = **VTK 视图内左侧的抽屉式侧栏**,三个 tab:`三维数据集 / 二维数据集 / 三维分析`,一次显一栏。
|
||
- 画布在侧栏右侧、**不被遮挡**;侧栏右缘有折叠开关(◀/▶),折叠后画布全宽。
|
||
- 侧栏与画布同属 VTK 视图容器(侧栏是视图子控件,符合"VTK视图上提供")。
|
||
- 左侧保留现有 `ObjectTreePanel`(「对象」dock)作为**筛选来源**:三栏列表只在"被勾选对象"范围内、按维度过滤显示 ds(需求行 10/15)。两级关系:勾对象 → 三栏按维度显示其 ds。
|
||
- 现有左下「数据集」dock(详情查看)保留,与三栏列表并存(总 spec §7.1 已定的"两条线")。
|
||
|
||
> 取舍记录:曾考虑"左侧独立 dock + tab"(方案 A)与"竖向分段"(方案 B),均被否——需求「VTK视图**上**」明确栏在视图内;浮窗式(最初的 C)遮挡画面亦否,改为抽屉式。
|
||
|
||
---
|
||
|
||
## 3. 各栏内容(逐行对齐需求,含控件形态)
|
||
|
||
### 3.1 三维数据集栏(行 3–11)
|
||
工具条 = **4 个分组栏位** + 数据集列表:
|
||
|
||
1. **坐标轴设置**(行 4–6)——表单式,每项一行、左对齐:
|
||
- 显示方式:下拉(标准 / 三维立体 / 不显示)
|
||
- O点位置:按钮(弹框设原点)
|
||
- 刻度:下拉(无刻度 / 米 / 英尺 / 经纬度)
|
||
- 字体:按钮(设刻度文字字体)
|
||
2. **水平/垂直比例**(行 7)——**单个拖动滑块 + 数值**(如 2.0×,纵向放大系数;现有 `kVerticalExaggeration`)。**非两个独立控件**。
|
||
3. **快捷视图**(行 8)——6 钮:前 / 后 / 左 / 右 / 上 / 下。
|
||
4. **缩放 Zoom**(行 9)——3 钮:放大(In) / 缩小(Out) / 适配(Fit)。
|
||
5. **数据集列表**(行 10–11)——`dimensionOf==Dim3D` 过滤勾选对象的 ds,勾选→渲染。
|
||
|
||
### 3.2 二维数据集栏(行 12–16)= 3 栏位
|
||
1. **地图**(行 13)——下拉(天地图 / Google Map / 隐藏)。**底图瓦片渲染留 P5**。
|
||
2. **2D视图**(行 14)——下拉(关闭 / Z=0 / 顶部 / 底部 / **自定义**);选「自定义」显数值输入框。
|
||
- **「自定义 Z」= 世界绝对高程(米),向上为正**,与「Z=0/顶部/底部」同坐标系(`GeoLocalFrame` 世界 Z)。决策依据:同一下拉里「Z=0」即绝对值,「自定义」只是输入任意绝对 Z;与业界(Petrel/Leapfrog/ParaView)水平面高度用项目 CRS 绝对高程一致。
|
||
3. **数据集列表**(行 15–16)——`dimensionOf==Dim2D` 过滤,勾选→渲染到 VTK 的 2D 视图。
|
||
|
||
### 3.3 三维分析栏(行 17–35)
|
||
- **数据集列表 = 树**(行 18):对象 → 三维体模型数据集 → 切片。可勾选三维体/切片 → 渲染(行 19)。
|
||
- **右键菜单(按节点类型分派):**
|
||
|
||
**三维体数据集**(行 20–27,**直接项,无"创建切片"父级,无删除**):
|
||
| 菜单项 | 说明 | 本轮 |
|
||
|---|---|---|
|
||
| 切片 ▸ 上下 / 前后 / 左右 / 任意 | 一级「切片」父菜单 + 二级方向(上下/前后/左右=固定角度;任意=初始 45°可调)| **接已有 SliceTool** |
|
||
| 色阶 | 参考 Geopro 1.0 | OUT(stub/禁用)|
|
||
| 显示 / 隐藏 | actor 可见性 | IN |
|
||
| 数据详情 | 详情栏显示 | IN(接现有详情)|
|
||
|
||
> 注:需求字面是"上下切片/前后切片…"直接项;本轮按用户决策归入「切片」一级父菜单、二级去「切片」二字显「上下/前后/左右/任意」。
|
||
|
||
**切片数据集**(行 28–35,**有删除**):
|
||
| 菜单项 | 本轮 |
|
||
|---|---|
|
||
| 保存 / 保存为 / 导出 / 删除 | OUT(P4 CRUD,stub/禁用)|
|
||
| 色阶 | OUT |
|
||
| 显示 / 隐藏 | IN |
|
||
| 数据详情 | IN |
|
||
|
||
- **VTK视图交互**(行 36–38)、**切片分析**(行 39–51,含视图内切片右键:创建异常/保存/导出图片/导出dat/正视图/视图翻转/关闭)——属交互层,多已在 P3 实现或留 P4,本轮不在树结构范围内。
|
||
|
||
---
|
||
|
||
## 4. 全屏功能(新需求)
|
||
|
||
- 在 **「VTK视图」** 与 **「数据详情」** 两个 dock 标题栏右侧各加一个**全屏切换按钮**:点击→该视图充满工作区;再点→还原。
|
||
- 理由:两视图含图形、内容多,常需全屏操作。
|
||
- 实现方向(ADS):给 `CDockWidget` 标题栏插入自定义 `QToolButton`,切换时把该 dock 最大化覆盖 dock 管理区(隐藏同级 / 浮动后最大化,择一,落地时定)。
|
||
|
||
---
|
||
|
||
## 5. 代码触点(落地指引,细节进 plan)
|
||
|
||
- `src/app/main.cpp::buildWorkbench`:
|
||
- 删 `layerPanel` / `axisBar` / `sliceBar` 三浮层及其锚定器(`RightTopAnchor`/`BottomLeftAnchor`)与 `showLayerPanel` 显隐逻辑。
|
||
- 删旧「二维地图/三维视图」分段切换;`vtkDock` 改名「VTK视图」。
|
||
- VTK 视图容器内新建**抽屉侧栏**(QTabWidget 或自绘,三 tab)+ 折叠开关;三栏工具条/列表迁入。
|
||
- **dock 布局持久化版本号须 bump**(见 `main.cpp:1429` 附近注释:改 dock 名/结构要升版本,否则旧布局反序列化错位)。
|
||
- 三维数据集工具条接 P2 已实现的 `VtkSceneController` 坐标轴/比例/快捷视图/zoom 槽(原 axisBar 的接线迁移,不重写控制器)。
|
||
- 数据集列表:用 `I3dSceneRepository::dimensionOf` 过滤;勾选信号接 `VtkSceneController`(复用现 `checkedTmsChanged` 一路的编排)。
|
||
- 三维分析树右键「切片」→ 调已有 `InteractionManager`/`SliceTool` 建切片(替代 sliceBar 原按钮路径)。
|
||
- 全屏按钮:ADS 标题栏自定义按钮 + 最大化/还原。
|
||
|
||
---
|
||
|
||
## 6. 待定 / 风险
|
||
|
||
- 全屏在 ADS 的最大化实现方式(隐藏同级 vs 浮动最大化)落地时定。
|
||
- 二维「地图」底图本轮仅控件,渲染 P5;需确保控件状态能持久化到 P5 不返工。
|
||
- 三栏侧栏与 ADS dock 的交互(侧栏是 VTK 容器子控件,不是 dock)——确保折叠/全屏时布局正确。
|
||
- dock 名变更后旧用户布局失效(bump 版本号后回落默认排布,可接受)。
|