geopro/docs/superpowers/specs/2026-06-16-vtk-3d-three-col...

131 lines
9.3 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-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 三维数据集栏(行 311
工具条 = **4 个分组栏位** + 数据集列表:
1. **坐标轴设置**(行 46——表单式每项一行、左对齐
- 显示方式:下拉(标准 / 三维立体 / 不显示)
- O点位置按钮弹框设原点
- 刻度:下拉(无刻度 / 米 / 英尺 / 经纬度)
- 字体:按钮(设刻度文字字体)
2. **水平/垂直比例**(行 7——**单个拖动滑块 + 数值**(如 2.0×,纵向放大系数;现有 `kVerticalExaggeration`)。**非两个独立控件**。
3. **快捷视图**(行 8——6 钮:前 / 后 / 左 / 右 / 上 / 下。
4. **缩放 Zoom**(行 9——3 钮:放大(In) / 缩小(Out) / 适配(Fit)。
5. **数据集列表**(行 1011——`dimensionOf==Dim3D` 过滤勾选对象的 ds勾选→渲染。
### 3.2 二维数据集栏(行 1216= 3 栏位
1. **地图**(行 13——下拉天地图 / Google Map / 隐藏)。**底图瓦片渲染留 P5**。
2. **2D视图**(行 14——下拉关闭 / Z=0 / 顶部 / 底部 / **自定义**);选「自定义」显数值输入框。
- **「自定义 Z」= 世界绝对高程(米),向上为正**与「Z=0/顶部/底部」同坐标系(`GeoLocalFrame` 世界 Z。决策依据同一下拉里「Z=0」即绝对值「自定义」只是输入任意绝对 Z与业界Petrel/Leapfrog/ParaView水平面高度用项目 CRS 绝对高程一致。
3. **数据集列表**(行 1516——`dimensionOf==Dim2D` 过滤,勾选→渲染到 VTK 的 2D 视图。
### 3.3 三维分析栏(行 1735
- **数据集列表 = 树**(行 18对象 → 三维体模型数据集 → 切片。可勾选三维体/切片 → 渲染(行 19
- **右键菜单(按节点类型分派):**
**三维体数据集**(行 2027**直接项,无"创建切片"父级,无删除**
| 菜单项 | 说明 | 本轮 |
|---|---|---|
| 切片 ▸ 上下 / 前后 / 左右 / 任意 | 一级「切片」父菜单 + 二级方向(上下/前后/左右=固定角度;任意=初始 45°可调| **接已有 SliceTool** |
| 色阶 | 参考 Geopro 1.0 | OUTstub/禁用)|
| 显示 / 隐藏 | actor 可见性 | IN |
| 数据详情 | 详情栏显示 | IN接现有详情|
> 注:需求字面是"上下切片/前后切片…"直接项;本轮按用户决策归入「切片」一级父菜单、二级去「切片」二字显「上下/前后/左右/任意」。
**切片数据集**(行 2835**有删除**
| 菜单项 | 本轮 |
|---|---|
| 保存 / 保存为 / 导出 / 删除 | OUTP4 CRUDstub/禁用)|
| 色阶 | OUT |
| 显示 / 隐藏 | IN |
| 数据详情 | IN |
- **VTK视图交互**(行 3638、**切片分析**(行 3951含视图内切片右键创建异常/保存/导出图片/导出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 版本号后回落默认排布,可接受)。