geopro/docs/superpowers/HANDOFF-vtk-category-view-r...

208 lines
24 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-24。分支 `feat/vtk-3d-view`。
> 本会话**产出 spec + 实施 plan + openapi 修订,未改业务代码**——下一步是按 plan 执行实现。
>
> **速览**:把 VTK 左侧三 tab 重构为「按数据类型大类分组」两 tab经真实接口实测定分类/字段、opus 子代理评审、客户两轮交互确认后定稿。产出 spec`specs/2026-06-24-vtk-category-view-refactor-design.md`+ 实施 plan`plans/2026-06-24-vtk-category-view-refactor.md`8 phase/12 task+ openapi v0.6`docs/api/vtk-3d-openapi.json`)。
---
## ⏩ 实施进度2026-06-24 续会话)
**Task 1-10 完成 + Task 12 大部分 + Task 11 Step 1-4a 完成。剩 4 项(见末尾「剩余真实状态」)。**
### 续会话第二批提交(在 `d539fc1` 之后)
```
6edfad9 feat(app): VtkViewToolbar 接入中央画布(view/zoom/fit+axesSettings弹窗) # Task12 工具条✓
1d744ba feat(app): 对象树拉取改 checkedSourcesChanged+confType 分流(GS直挂ds) # Task12 #1✓
2f07e60 feat(app): 三维体段「体→切片/异常」三级树注入+异常排除渲染勾选+即时进树 # Task11 Step4a✓
9899d5f→修正 feat(app): 创建异常按切片是否已保存挂体/切片(resolveAnomalyMount) # Task11 Step3✓
07be3ae feat(data): Api3dRepository.anomalyRows 按 remarkSourceId 供三级树注入 # Task11 Step2✓
52830bb feat(core): Anomaly volumeDsId→remarkSourceId + resolveAnomalyMount # Task11 Step1✓
6e3c810 docs: 异常归属设计修订(取消独立异常区,挂体/切片+三级树) # spec/plan
901c84e feat(app): 对象树→splitByCategory→5段数据流+勾选分流渲染+生成入口 # Task12 阶段A✓
```
⚠️ 教训:`git diff --cached` 必须当 STOP 闸门——9899d5f 曾误带并行 GPR 会话已暂存的新文件,已 reset 拆分修正。
### 🚧 剩余真实状态(续会话第三批更新)
**已再完成**#2 装置枚举接口(`listArrayTypes` GET `/business/script/arrayTypeList`→`DatasetFieldDictionary.arrayTypeEnum`→段头装置下拉显示+过滤commit b9a6551)、#4 VolumeParamsDialog 扩展(左侧源列表可增删+生成位置下拉 GS/TM→`req.structParentId/confType`a41b428)、Task11 异常双击详情(`anomalyById`→AnomalyPropertiesDialogcfd242c)。
**仅剩 #6 退役旧栏**——⚠️ **不是纯删,直接删会丢功能**,须先补迁:
1. **垂直夸张(VE)滑块**:现挂旧 c3(main :1032/1036 + Column3DDataset VE 滑块);退役后无 UI 入口,需迁 `VtkViewToolbar` 或段头 + 接 `sceneCtrl->setVerticalExaggeration`
2. **切片勾选同步**main :624/663 `colAnalysis()->setItemChecked`(切片保存自动勾选 / 关闭取消勾选);需给 `CategoryAnalysisTab``setItemChecked(dsId,bool)`(按 dsId 在 voxel 段树定位项设勾选main 改调它。
3. `refreshAnomalies` 去 ca 依赖(:420-446 用 `ca->anomalyFilterMode()/setAnomalies()`)→ 改全渲染(异常显隐档位是边缘功能,简化为全显示)。
4. 删 main 中 c3/ca 共 ~35 处接线(:463/666-700/794-796/800-981/1032-1036+ ColumnDrawer `col3D_/colAnalysis_` 成员/访问器/实例 + `Column3D*` include + 旧 `createVolume(VolumeBuildParams,name)` 重载(无调用者后)。
5. `splitByDimension` 保留refreshAnalysis 仍用其 dim2D 喂 col2D
**#6 不影响当前功能**(旧栏已 hide、app 完整可用),是独立清理工程,无法 headless 验证——建议新会话清爽做。
#### 历史剩余真实状态4 项,均无法 headless 验证)
1. **Task11 Step4b — 异常/切片树内交互**三级树「展示」已通Step4a缺 dd_anomaly 双击详情main detailRequested 加 dd_anomaly 分支→需 Api3d 加 `anomalyById`→AnomalyPropertiesDialog、右键删除CategorySection 加右键菜单+信号→main deleteAnomaly/deleteSlice、切片保存位姿、per-anomaly 显隐。现 refreshAnomalies 仍用隐藏 colAnalysis 的 filterMode异常默认全渲染可接受
2. **Task12 #2 dict 填充 — 真实阻塞**:装置类型筛选需 `DatasetFieldDictionary` 填充,但 `parseFieldMapping` 需**原始 dynamicForm JSON**(含 confFieldId/optionsObject而现有 `loadDatasetFormAsync` 返回的是解析后 `DynamicForm`(仅 name/value丢了 optionsObject。**需新增"拉原始 dynamicForm JSON"异步接口**;且装置 value→中文字典源 spec §11 本就标注待坐实。当前 dict=nullptr装置筛选退化不筛、日期筛选回退 createTime数据照常出
3. **Task12 #4 — VolumeParamsDialog 扩展**:左侧勾选源 ds 树(按 GS 分组·可二次增删) + 右侧「生成位置」下拉(项目内 GS/TM默认单GS→该GS/跨GS→项目根)→填 req.structParentId/structParentConfType。现用基础 VolumeParamsDialog归属走默认
4. **Task12 #6 — 退役旧栏**:删 main 中 c3/ca 旧接线(:653区 c3 view/zoom/gen、:730区 ca 接线)、col3D()/colAnalysis() 调用、Column3D* 实例;删 ColumnDrawer col3D_/colAnalysis_ 成员+访问器refreshAnomalies 去 ca 依赖(改全渲染)。**须先做 Step4b 把 ca 的切片删除/保存/异常详情功能迁到新树**,否则删 ca=丢功能。splitByDimension 保留(dim2D 用)。
> 已就绪未删:旧 `Column3DDataset/Column3DAnalysis` 仍实例化但隐藏,`checkedTmsChanged` 信号与新 `checkedSourcesChanged` 并存(主接线已切新信号,旧信号仅剩 :1369 nav 接线在用)。
### 历史Task 1-10 完成记录
**已提交、可编译、逻辑层单测全绿425 测试5 个失败均为 PROJ_DATA 环境性、非回归)。**
提交链(在 `a7d558b` docs 之后):
```
a06d9e8 feat(data): createVolume(VoxelGenerateRequest) 重载+fromRequest 派生+请求体打印(mock) # Task10
3af7e44 feat(ui): VtkViewToolbar 画布工具条 + AxesSettingsDialog 坐标轴设置 # Task9
98114a3 feat(ui): CategoryAnalysisTab(QScrollArea 5段)+ColumnDrawer 两tab(旧栏隐藏过渡) # Task8
30e990d feat(ui): CategorySection 类型段组件 + DatasetFieldDictionary 缓存类 # Task7
40646f7 refactor(tree): 评审修复-抽 recomputeAllGsStates 去 nullptr 信号 hack # Task4-6 review 修复
c5b3907 feat(data): DatasetFieldDictionary 解析 arrayType/collectTime 映射+装置字典 # Task6
1978a31 feat(tree): GS 三态状态机(停 AutoTristate)+右键 ds/tm + checkedSourcesChanged # Task4+5(合并)
6b39901 test(data): 补 properties[1] 日期项断言
f00a214 feat(data): VoxelGenerateRequest/SliceGenerateRequest DTO + toJson # Task3
07cf75d feat(app): CategoryConfig 映射表 + splitByCategory # Task2
5a719ca feat(data): DsRow 加 dsTypeCode/properties + parseDsRows 解析 # Task1
```
**已就绪的新构件(均编译通过)**
- 逻辑层:`DsRow` 扩字段、`splitByCategory`(CategoryConfig 5 段)、`Vtk3dRequests`(Voxel/Slice DTO + toJson + `fromRequest`)、`DatasetFieldDictionary`(parseFieldMapping + 缓存类)、`ObjectTreeSelection`(aggregateGsState/dedupeSources)。
- 对象树:`ObjectTreePanel` GS 三态状态机(停 AutoTristate)+ 右键「选择▸ds/tm」+ `checkedSourcesChanged(QList<DataSource>)` 信号(**与旧 `checkedTmsChanged` 并存**Task 12 删旧)。
- UI 组件:`CategorySection`(段头装置/日期筛选+段体可勾选树+「+新增三维体」+双击详情)、`CategoryAnalysisTab`(QScrollArea 5 段setBuckets/section/勾选并集)、`ColumnDrawer` 已改两 tab(三维分析=analysisTab / 二维分析=col2D**旧 col3D_/colAnalysis_ 仍实例化但 hide()、不入 tab**,保留访问器供 main 过渡)、`VtkViewToolbar`、`AxesSettingsDialog`。
- data`Api3dRepository::createVolume(VoxelGenerateRequest)` 重载(组装真实请求体+打印+`lastVoxelRequest`),旧 `createVolume(VolumeBuildParams,name)` 保留。
**⚠️ 当前过渡态**app 可编译运行但「三维分析」tab 是**空的 CategoryAnalysisTab**(数据接线在 Task 12旧三维数据集/三维分析功能已隐藏。对象树 GS 三态+右键 ds/tm **已在现 app 生效**(旧 checkedTmsChanged 仍兼容可立即真实验证plan Task 4 Step 7 清单)。
**偏离 plan 的决策(已记录理由)**:① Task 4+5 合并一个 commitplan Task4 右键已引用 Task5 的 emitCheckedSources循环依赖② DatasetFieldDictionary 异步拉取下放 maindata 层无网络,类只内存缓存);③ CategorySection 段体先平铺populateDatasetList「项目根/GS/TM 容器节点分层」推迟 Task 12 接真实 StructNode④ createSlice 虚接口未改签名SliceGenerateRequest 组装并入 Task 12 main 层。
### 🔧 Task 11+12 待做main.cpp 接线总成,最高风险,须真实 app 验证)
`main.cpp` 1943 行,接线密集。关键现状符号位置:
- `:361` `new ColumnDrawer(centerWidget)` —— 需改传 dict构造已支持第2参 `DatasetFieldDictionary* dict=nullptr`)。
- `:397 refreshAnomalies` / `:448 refreshAnalysis` 闭包用 `drawer->colAnalysis()`
- `:442 c3 = drawer->col3D()``:641` c3 checkedDatasetsChanged→sceneCtrl`:653` c3 generateVolumeRequested→createVolume`:898/902` c3 verticalExaggeration。
- `:579/745` createSlice 调用(补 projectId + 组装 SliceGenerateRequest
- `:584/623` `colAnalysis()->setItemChecked``:666 ca=colAnalysis()`。
- `:1117/1267` 对象树 `checkedTmsChanged` 接线(→改 `checkedSourcesChanged` + confType 分流 `loadRowsAsync(projId, src.id, src.confType, 3, ...)`)。
- `:1134 splitByDimension`→`splitByCategory` + `analysisTab()->setBuckets``:1135 col3D/col2D setDatasets`。
- `:1215 clearCentral`。`:1328 drawer->expand()`。
**Task 11 缺口**`CategoryAnalysisTab`/`CategorySection` 尚无 colAnalysis 的 `setItemChecked`、异常子区 API三维体段需迁入 Column3DAnalysis 异常控件(参 `src/app/panels/columns/Column3DAnalysis.{hpp,cpp}` + main `:397 refreshAnomalies`)。
**Task 12 要点**plan §Task12 Step1-8 已详列):① 对象树勾选→confType 分流拉取→splitByCategory→analysisTab setBuckets② analysisTab checkedDatasetsChanged→并入 checkedProfiles/checkedAnalysis→pushChecked③ generateVolumeRequested→`VolumeParamsDialog` 扩展(左侧勾选源树·可二次增删 + 右侧「生成位置」下拉=项目内 GS/TM→组装 `VoxelGenerateRequest`→`createVolume(req)`;④ 工具条 `VtkViewToolbar` 叠加中央 QVTK + AxesSettingsDialog 接坐标轴;⑤ createSlice 补 `nav.currentProjectId()`;⑥ 删旧 checkedTmsChanged/col3D()/colAnalysis()/splitByDimension/Column3D* 引用 + setStructure 传对象树同源 StructNode容器分层
#### ✅ Task 12 阶段 A 已完成commit 901c84e—— 核心数据流接通
- `refreshAnalysis` 重构为统一入口:`lastSourceRows + volumeRows + sliceRows` → `splitByCategory``analysisTab->setBuckets`5 段出数据)+ `splitByDimension(...).dim2D``col2D`
- 对象树 `checkedTmsChanged` 接线finish 改 `*lastSourceRows=*acc; refreshAnalysis()`(仍用 checkedTmsChanged**confType 分流见剩余①**)。
- `analysisTab` 三接线checkedDatasetsChanged→按 isSlice/isVolume 分流(切片→checkedSliceIds+syncSlices / 体素→checkedAnalysis / 反演剖面→checkedProfiles)→pushCheckedgenerateVolumeRequested→VolumeParamsDialog→组装 `VoxelGenerateRequest`→`createVolume(req)`detailRequested→Slice/Volume 属性对话框。
- `clearCentral` 改走 lastSourceRows/refreshAnalysis。
- **现可验**:勾对象树 TM → 电阻率/视/瞬变段出数据 → 勾选段内 ds → 帘面渲染;生成三维体 → voxel 段出现 → 勾选渲体;切片段同理。
#### 🔧 Task 12 剩余精修6 项,新会话做,每步 build + 真实验证)
1. **confType 分流**:对象树接线从 `checkedTmsChanged(QStringList tmIds)``checkedSourcesChanged(QList<DataSource>)``loadRowsAsync(projId, src.id, src.confType, 3,1,100000)` 第3参传 src.confType支持 GS 直挂 ds现仅 TM。改 main `:~1171` 对象树接线 + `:~1330` 第二个 checkedTmsChanged→nav 接线。
2. **dict 填充**main 创建 `DatasetFieldDictionary` 并传 `new ColumnDrawer(centerWidget, &dict)`;对每个反演 dsType 调 `loadDatasetFormAsync`→`parseFieldMapping`→`dict.setFields`(装置/日期筛选才生效,现 dict=nullptr 退化不筛)。
3. **工具条接入**:实例化 `VtkViewToolbar` 叠加中央 QVTK信号接 sceneCtrlviewRequested/zoom/fit 接现有 c3 对应槽 :647 区axesSettingsRequested→弹 `AxesSettingsDialog`→应用坐标轴VE 控件迁工具条。
4. **VolumeParamsDialog 扩展**:左侧勾选源 ds 树(按 GS 分组·可二次增删) + 右侧「生成位置」下拉(项目内 GS/TM默认 源单GS→该GS/跨GS→项目根)→ 填 `req.structParentId/structParentConfType`
5. **三维体段三级树 + 异常按归属挂体/切片Task 11 本体,已重新设计,见 spec §8 / plan Task 11****取消独立异常区**——异常作叶子挂归属实体(体/切片)下。归属链 `异常→所在切片→切片所属体`,挂载目标由「切片是否已保存成 dd_slice」决定已存挂切片、临时挂体。改 `Anomaly`(volumeDsId→remarkSourceId+remarkSourceType)、Api3d 异常 mock 按归属存查、main 创建逻辑判断切片是否保存、三维体段「体→切片/异常」三级树。多体渲染本就支持(`dsProps_` 按 dsId)`volumeOwnerDs_`=当前切片源体。
6. **退役旧栏**:删 main 中 c3/ca 旧接线(:641/669-760 区)、col3D()/colAnalysis() 调用、`Column3D*` 实例;删 ColumnDrawer 的 col3D_/colAnalysis_ 成员+访问器;评估删 splitByDimensiondim2D 改轻量过滤)。
- 切片保存/关闭(:584/623 setItemChecked)、createSlice projectId(:579/745) 随 #5/#1 一并处理。
> 下方为初版交接spec/plan 设计定论,仍有效)。
## 1. 背景
- 代码库 = 原版 web 系统(`D:\Git\lanbingtech\commercial-admin`,复刻权威)移植的 Qt6 桌面客户端。
- 现状 VTK 视图左侧 `ColumnDrawer` 是三 tab三维数据集/二维数据集/三维分析),`splitByDimension` 按 `ddCode` 分 3 维度。
- 需求(用户截图设计):把「三维数据集」并入「三维分析」,改成**按数据类型大类分组**(电阻率/视电阻率/瞬变电磁/三维体/切片),每类各自筛选+操作;对象树勾选联动、支持 GS/项目直挂数据;全局视图控制移 VTK 画布工具条。
## 2. 本会话已完成
1. **摸透现状源码**ColumnDrawer/Column3D*/DatasetDimension/DatasetListPanel/ObjectTreePanel/RepoTypes/NavDto/Api3dRepository/main.cpp 接线等)。
2. **真实接口实测定关键事实**(用用户给的 token 直连后端,见 §6——纠正了多个二手猜测。
3. **brainstorming 澄清全部设计决策**(容器布局、分类策略、对象树三态交互、装置类型、生成入口等)。
4. **产出 spec** 并经 **opus 子代理评审 + 据评审修订**GS 三态停 AutoTristate、properties 两接口形态澄清、帘面勾选链承接等)。
5. **产出实施 plan**8 phase/12 taskTDD bite-sized逻辑层完整测试代码、UI 层 build+手动验证)。
6. **客户两轮交互确认**收敛生成三维体交互(见 §3 第 5 条),同步更新 spec/openapi(v0.6)/plan。
7. **openapi 修订**:三维体归属层级 TM → GS/项目根 → 再放开 GS/项目根/TM。
## 3. 最终设计定论(核心,已写入 spec
1. **两 tab**「三维分析」5 段)+「二维分析」(现 `Column2DDataset` 不动)。
2. **大类分类按 `dsTypeCode`**(不是 ddCode——电阻率/视电阻率/瞬变电磁三者 ddCode 同为 `dd_inversion_data`,只 dsTypeCode 不同。映射表 `CategoryConfig` 驱动;三维体/切片按 ddCode`dd_voxel`/`dd_slice`)识别。
3. **对象树联动**
- 非根 GS = **三态复选框**聚合「GS 自身 ds 开关」+「子 TM 勾选」)+ 右键「选择▸ds/tm」**必须停用 `Qt::ItemIsAutoTristate`、手动维护三态**UserRole 存 ds 开关)。
- 项目根 = 无复选框、直挂 ds 固定显示、其下 TM 各自二态勾选。
- 信号 `checkedTmsChanged``checkedSourcesChanged(QList<DataSource{id,confType}>)`,按 `structParentConfType`(1=GS/项目, 2=TM) 分流 `loadRowsAsync`
4. **装置类型/采集时间筛选**:是 ds 结构化属性(`arrayType`/`collectTime`),值在 ds 行 `properties[]`confFieldId`DatasetFieldDictionary`(按 dsType 拉一次 `dynamicForm` 取 confFieldId↔fieldCode 映射 + 装置 value→中文字典解析。装置类型只电阻率/视电阻率段有。日期筛选按 collectTime三维体/切片回退 createTime
5. **新增三维体(客户两轮确认定稿)**
- **入口**:数据类型**段头**「+新增三维体」按钮(电阻率/视电阻率/瞬变段),**不在**对象树/容器节点右键。
- **源数据集** = 三维分析中**当前勾选的同类型 ds**(本段类型、可跨 GS
- 点击 → `VolumeParamsDialog`**左侧**树状(按 GS 分组)展示勾选源、**可勾选/取消供确认或二次修改****右侧**参数:名称、**生成位置**下拉、插值模型、水平/竖向间距、IDW 幂次、最大影响距离。
- **生成位置(归属)**:默认 = 源同属单 GS→该 GS、源跨 GS→项目根用户可改为**项目内任意 GS/TM**`structParentConfType` 1 或 2。源与归属解耦。
6. **VTK 画布工具条**:全局视图控制(坐标轴/比例/快捷视图/缩放)移到中央 VTK 竖排工具条;设置→`AxesSettingsDialog`(X/Y/深度 显示+min/max);快捷视图按钮文字「前/后/上/下/左/右」;复位=现「适配」。
7. **请求体 DTO**`createVolume/createSlice` 扩参,内部按 `VoxelGenerateRequest/SliceGenerateRequest` 组装真实请求体结构(仍 mock 存储、假 id`toJson` 序列化;重构落地即可从 UI 产出给后端联调的真实请求体。
8. **三维体/切片/异常**仍 `Api3dRepository` mock异常迁入三维体段。
## 4. 剩余工作 = 执行 plan
`plans/2026-06-24-vtk-category-view-refactor.md`8 phase/12 task依赖顺序
- **Phase 1-2**Task 1-3DsRow 扩展+parseDsRows / CategoryConfig+splitByCategory / 请求体 DTO —— **纯逻辑完整 TDD**
- **Phase 3-4**Task 4-6GS 三态状态机+checkedSourcesChanged / DatasetFieldDictionary —— 逻辑可单测。
- **Phase 5-6**Task 7-9CategorySection / CategoryAnalysisTab+ColumnDrawer / VtkViewToolbar+AxesSettingsDialog —— build+手动验证。
- **Phase 7-8**Task 10-12Api3d 扩参组装请求体 / 段重组(异常迁三维体段) / main.cpp 接线总成 + 退役 Column3DDataset/Column3DAnalysis。
**建议**subagent-driven每 task 新 subagent + task 间两阶段 review+ 独立 git worktree 隔离。每 task 自带测试/验证+commitPhase 间「新旧信号并存→Task 12 统一切换删旧」保证每次可编译。
**plan 中 Task 7 段头按钮 + Task 12 `VolumeParamsDialog` 扩展(左侧源列表二次增删 + 生成位置下拉)已按 §3.5 定稿写好。**
## 5. 待确认 / 风险
- **装置类型 value→中文 字典源**(唯一待坐实,不阻塞实现):实测 `arrayType` 原始值(如 `1429468249448449`**不在**该字段 `optionsObject`(另一套 id `1456095451258368…`)里;`parseDynamicForm:208` 也不翻译但用户说客户端属性面板显中文。Task 6 先用 optionsObject 建表 + 缺失回退原值。**需用户提供客户端数据集属性面板截图**以定位现有翻译路径(候选:`fieldConfigJsonObject.fieldDataRadius` 指向的全局字典 / `script/arrayTypeList`)。
- **段体容器树建法**Task 7 核心):段体要呈现「项目根/GS/TM 容器节点→ds」层级需 main 传 `setStructure`(对象树同源 StructNode+ ds 的 `structParentId/structParentConfType`Task 1 已解析)建容器节点。
- 三维体/切片/异常仍 mock后端就绪后切真实`I3dSceneRepository` 留缝,见 `HANDOFF-vtk-3d-backend-api.md`)。
## 6. 关键实测事实 + 接口(直连后端核实)
- 后端基址 `http://tenant.geomative.cn/pop-api`header `geomativeauthorization: Geomative <token>`token 本会话由用户提供,下会话需重新索取)。
- 样本项目「演示项目(高密度+瞬变)」`1438889436225536`:项目根 GS `1438889436291072` 下直挂 TMERT1-8 confCode=ERT、TEM1-15 confCode=TEM01**无中间 GS 层**(印证「项目根本质是 GS」「TM 可直挂项目根」)。
- **大类 dsTypeCode**:电阻率=`ERT platform inversion data`、视电阻率=`visual resistivity data`、瞬变电磁反演剖面=`DD TRANSIENT ELECTROMAGNETIC INVERSION`(三者 ddCode 同 `dd_inversion_data`)。
- **ds 行 `properties`**`dsObject/data/page`= `[{confFieldId,value}]` 数组;**`dynamicForm` 的 `properties`** = `{fieldCode:value}` map两接口形态不同勿混
- 装置类型字段 `arrayType`、采集时间 `collectTime`fieldCode装置枚举 `GET /business/script/arrayTypeList``[{itemValue,name}]`15 项)。
- 层级 `structParentConfType`1=GS/项目根2=TM`loadRowsAsync` 第 3 参即透传它(现状 main.cpp:1142 写死 2
- 详情接口 `dsObject/getDetail/{id}`、动态表单 `dsObject/dynamicForm/{id}`(客户端 `loadDatasetFormAsync`→`parseDynamicForm`)。
## 7. 代码地图
**现状关键文件(重构基础):**
| 文件 | 作用 |
|---|---|
| `src/app/panels/columns/ColumnDrawer.{hpp,cpp}` | 现三 tab 容器(→两 tab |
| `src/app/panels/columns/Column3DDataset/Column3DAnalysis/Column2DDataset` | 三栏现状(前两退役、二维不动) |
| `src/app/DatasetDimension.{hpp,cpp}` | splitByDimension→splitByCategory 替代) |
| `src/app/panels/DatasetListPanel.cpp` | populateDatasetList/卡片委托/applyDatasetFilter复用 |
| `src/app/panels/ObjectTreePanel.{hpp,cpp}` | 对象树GS:123 AutoTristate、:174 itemChanged、:207 右键) |
| `src/data/repo/RepoTypes.hpp` | DsRow扩 dsTypeCode/properties/structParent* |
| `src/data/dto/NavDto.cpp` | parseDsRows:116 / parseDynamicForm:179 |
| `src/data/api/Api3dRepository.{hpp,cpp}` | 三维体/切片/异常 mockcreateVolume/createSlice 扩参) |
| `src/data/repo/VolumeBuildParams.hpp` / `src/core/model/Anomaly.hpp` | 三维体参数 / 异常模型 |
| `src/app/main.cpp` | 接线(:388-460 异常/勾选、:1113-1225 对象树→分类分发) |
| `src/data/api/ApiProjectRepository.cpp` | loadRowsAsync parentConfType 透传 |
**新建plan §文件结构):** `CategoryConfig.hpp`、`DatasetCategory.{hpp,cpp}`、`Vtk3dRequests.{hpp,cpp}`、`DatasetFieldDictionary.{hpp,cpp}`、`CategorySection.{hpp,cpp}`、`CategoryAnalysisTab.{hpp,cpp}`、`VtkViewToolbar.{hpp,cpp}`、`AxesSettingsDialog.{hpp,cpp}` + 对应 tests。
**契约文档:** `docs/api/vtk-3d-openapi.json`v0.6-draft、真实 schema `docs/apis/business_OpenAPI.json`DsObjectDataVO/DsTypeVO/ArrayTypeVO
## 8. 铁律 / 注意
- **贴源码/实测,别凭印象**:本会话多次因二手猜测("装置类型要后端补字段"、"properties 形态矛盾"、归属层级)被用户/实测纠正——任何字段/语义先去代码或真实接口核实。
- **复用优先**DatasetListPanel/Api3dRepository/Column2DDataset 复用,不重写。
- **每 task TDD + 可编译 + commit**;不留 TODO 占位。
- 全部回复中文。
## 9. 相关
- spec`docs/superpowers/specs/2026-06-24-vtk-category-view-refactor-design.md`
- plan`docs/superpowers/plans/2026-06-24-vtk-category-view-refactor.md`
- 后端契约交接:`docs/superpowers/HANDOFF-vtk-3d-backend-api.md`(三维体/切片/异常端点)
- 记忆:`vtk-3d-persistence-structure`、`dataset-detail-types-catalog`、`web-3d-view-threetile`、`gpr-volume-design-trio`
- 提交:`eceb964`spec+openapi v0.5)、`ef10c35`plan + 客户变动 + openapi v0.6