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

9.3 KiB
Raw Permalink Blame History

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(图层勾选)、右上 axisBarP2 工具条)→ 并入「三维数据集」栏;左下 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保存 / 保存为 / 导出 / 删除P4I3dSceneRepository 接口已留位)。
  • 色阶编辑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 标题栏右侧各加一个全屏切换按钮:点击→该视图充满工作区;再点→还原。
  • 理由:两视图含图形、内容多,常需全屏操作。
  • 实现方向ADSCDockWidget 标题栏插入自定义 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 版本号后回落默认排布,可接受)。