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

24 KiB
Raw Permalink Blame History

交接VTK 三维分析视图重构(按数据类型分组 + 对象树联动)

给下一个会话无缝接手。日期 2026-06-24。分支 feat/vtk-3d-view。 本会话产出 spec + 实施 plan + openapi 修订,未改业务代码——下一步是按 plan 执行实现。

速览:把 VTK 左侧三 tab 重构为「按数据类型大类分组」两 tab经真实接口实测定分类/字段、opus 子代理评审、客户两轮交互确认后定稿。产出 specspecs/2026-06-24-vtk-category-view-refactor-design.md+ 实施 planplans/2026-06-24-vtk-category-view-refactor.md8 phase/12 task+ openapi v0.6docs/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/arrayTypeListDatasetFieldDictionary.arrayTypeEnum→段头装置下拉显示+过滤commit b9a6551)、#4 VolumeParamsDialog 扩展(左侧源列表可增删+生成位置下拉 GS/TM→req.structParentId/confTypea41b428)、Task11 异常双击详情(anomalyById→AnomalyPropertiesDialogcfd242c)。

仅剩 #6 退役旧栏——⚠️ 不是纯删,直接删会丢功能,须先补迁:

  1. 垂直夸张(VE)滑块:现挂旧 c3(main :1032/1036 + Column3DDataset VE 滑块);退役后无 UI 入口,需迁 VtkViewToolbar 或段头 + 接 sceneCtrl->setVerticalExaggeration
  2. 切片勾选同步main :624/663 colAnalysis()->setItemChecked(切片保存自动勾选 / 关闭取消勾选);需给 CategoryAnalysisTabsetItemChecked(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 过渡)、VtkViewToolbarAxesSettingsDialog
  • dataApi3dRepository::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 splitByDimensionsplitByCategory + 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→组装 VoxelGenerateRequestcreateVolume(req);④ 工具条 VtkViewToolbar 叠加中央 QVTK + AxesSettingsDialog 接坐标轴;⑤ createSlice 补 nav.currentProjectId();⑥ 删旧 checkedTmsChanged/col3D()/colAnalysis()/splitByDimension/Column3D* 引用 + setStructure 传对象树同源 StructNode容器分层

Task 12 阶段 A 已完成commit 901c84e—— 核心数据流接通

  • refreshAnalysis 重构为统一入口:lastSourceRows + volumeRows + sliceRowssplitByCategoryanalysisTab->setBuckets5 段出数据)+ splitByDimension(...).dim2Dcol2D
  • 对象树 checkedTmsChanged 接线finish 改 *lastSourceRows=*acc; refreshAnalysis()(仍用 checkedTmsChangedconfType 分流见剩余①)。
  • analysisTab 三接线checkedDatasetsChanged→按 isSlice/isVolume 分流(切片→checkedSliceIds+syncSlices / 体素→checkedAnalysis / 反演剖面→checkedProfiles)→pushCheckedgenerateVolumeRequested→VolumeParamsDialog→组装 VoxelGenerateRequestcreateVolume(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 调 loadDatasetFormAsyncparseFieldMappingdict.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三维数据集/二维数据集/三维分析),splitByDimensionddCode 分 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. 产出实施 plan8 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 驱动;三维体/切片按 ddCodedd_voxel/dd_slice)识别。
  3. 对象树联动
    • 非根 GS = 三态复选框聚合「GS 自身 ds 开关」+「子 TM 勾选」)+ 右键「选择▸ds/tm」必须停用 Qt::ItemIsAutoTristate、手动维护三态UserRole 存 ds 开关)。
    • 项目根 = 无复选框、直挂 ds 固定显示、其下 TM 各自二态勾选。
    • 信号 checkedTmsChangedcheckedSourcesChanged(QList<DataSource{id,confType}>),按 structParentConfType(1=GS/项目, 2=TM) 分流 loadRowsAsync
  4. 装置类型/采集时间筛选:是 ds 结构化属性(arrayType/collectTime),值在 ds 行 properties[]confFieldIdDatasetFieldDictionary(按 dsType 拉一次 dynamicForm 取 confFieldId↔fieldCode 映射 + 装置 value→中文字典解析。装置类型只电阻率/视电阻率段有。日期筛选按 collectTime三维体/切片回退 createTime
  5. 新增三维体(客户两轮确认定稿)
    • 入口:数据类型段头「+新增三维体」按钮(电阻率/视电阻率/瞬变段),不在对象树/容器节点右键。
    • 源数据集 = 三维分析中当前勾选的同类型 ds(本段类型、可跨 GS
    • 点击 → VolumeParamsDialog左侧树状(按 GS 分组)展示勾选源、可勾选/取消供确认或二次修改右侧参数:名称、生成位置下拉、插值模型、水平/竖向间距、IDW 幂次、最大影响距离。
    • 生成位置(归属):默认 = 源同属单 GS→该 GS、源跨 GS→项目根用户可改为项目内任意 GS/TMstructParentConfType 1 或 2。源与归属解耦。
  6. VTK 画布工具条:全局视图控制(坐标轴/比例/快捷视图/缩放)移到中央 VTK 竖排工具条;设置→AxesSettingsDialog(X/Y/深度 显示+min/max);快捷视图按钮文字「前/后/上/下/左/右」;复位=现「适配」。
  7. 请求体 DTOcreateVolume/createSlice 扩参,内部按 VoxelGenerateRequest/SliceGenerateRequest 组装真实请求体结构(仍 mock 存储、假 idtoJson 序列化;重构落地即可从 UI 产出给后端联调的真实请求体。
  8. 三维体/切片/异常Api3dRepository mock异常迁入三维体段。

4. 剩余工作 = 执行 plan

plans/2026-06-24-vtk-category-view-refactor.md8 phase/12 task依赖顺序

  • Phase 1-2Task 1-3DsRow 扩展+parseDsRows / CategoryConfig+splitByCategory / 请求体 DTO —— 纯逻辑完整 TDD
  • Phase 3-4Task 4-6GS 三态状态机+checkedSourcesChanged / DatasetFieldDictionary —— 逻辑可单测。
  • Phase 5-6Task 7-9CategorySection / CategoryAnalysisTab+ColumnDrawer / VtkViewToolbar+AxesSettingsDialog —— build+手动验证。
  • Phase 7-8Task 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/structParentConfTypeTask 1 已解析)建容器节点。
  • 三维体/切片/异常仍 mock后端就绪后切真实I3dSceneRepository 留缝,见 HANDOFF-vtk-3d-backend-api.md)。

6. 关键实测事实 + 接口(直连后端核实)

  • 后端基址 http://tenant.geomative.cn/pop-apiheader 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 行 propertiesdsObject/data/page= [{confFieldId,value}] 数组;dynamicFormproperties = {fieldCode:value} map两接口形态不同勿混
  • 装置类型字段 arrayType、采集时间 collectTimefieldCode装置枚举 GET /business/script/arrayTypeList[{itemValue,name}]15 项)。
  • 层级 structParentConfType1=GS/项目根2=TMloadRowsAsync 第 3 参即透传它(现状 main.cpp:1142 写死 2
  • 详情接口 dsObject/getDetail/{id}、动态表单 dsObject/dynamicForm/{id}(客户端 loadDatasetFormAsyncparseDynamicForm)。

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.hppDatasetCategory.{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.jsonv0.6-draft、真实 schema docs/apis/business_OpenAPI.jsonDsObjectDataVO/DsTypeVO/ArrayTypeVO

8. 铁律 / 注意

  • 贴源码/实测,别凭印象:本会话多次因二手猜测("装置类型要后端补字段"、"properties 形态矛盾"、归属层级)被用户/实测纠正——任何字段/语义先去代码或真实接口核实。
  • 复用优先DatasetListPanel/Api3dRepository/Column2DDataset 复用,不重写。
  • 每 task TDD + 可编译 + commit;不留 TODO 占位。
  • 全部回复中文。

9. 相关

  • specdocs/superpowers/specs/2026-06-24-vtk-category-view-refactor-design.md
  • plandocs/superpowers/plans/2026-06-24-vtk-category-view-refactor.md
  • 后端契约交接:docs/superpowers/HANDOFF-vtk-3d-backend-api.md(三维体/切片/异常端点)
  • 记忆:vtk-3d-persistence-structuredataset-detail-types-catalogweb-3d-view-threetilegpr-volume-design-trio
  • 提交:eceb964spec+openapi v0.5)、ef10c35plan + 客户变动 + openapi v0.6