24 KiB
交接: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→AnomalyPropertiesDialog,cfd242c)。
仅剩 #6 退役旧栏——⚠️ 不是纯删,直接删会丢功能,须先补迁:
- 垂直夸张(VE)滑块:现挂旧 c3(main :1032/1036 + Column3DDataset VE 滑块);退役后无 UI 入口,需迁
VtkViewToolbar或段头 + 接sceneCtrl->setVerticalExaggeration。 - 切片勾选同步:main :624/663
colAnalysis()->setItemChecked(切片保存自动勾选 / 关闭取消勾选);需给CategoryAnalysisTab加setItemChecked(dsId,bool)(按 dsId 在 voxel 段树定位项设勾选),main 改调它。 refreshAnomalies去 ca 依赖(:420-446 用ca->anomalyFilterMode()/setAnomalies())→ 改全渲染(异常显隐档位是边缘功能,简化为全显示)。- 删 main 中 c3/ca 共 ~35 处接线(:463/666-700/794-796/800-981/1032-1036)+ ColumnDrawer
col3D_/colAnalysis_成员/访问器/实例 +Column3D*include + 旧createVolume(VolumeBuildParams,name)重载(无调用者后)。 splitByDimension保留(refreshAnalysis 仍用其 dim2D 喂 col2D)。
#6 不影响当前功能(旧栏已 hide、app 完整可用),是独立清理工程,无法 headless 验证——建议新会话清爽做。
(历史)剩余真实状态(4 项,均无法 headless 验证)
- Task11 Step4b — 异常/切片树内交互:三级树「展示」已通(Step4a);缺 dd_anomaly 双击详情(main detailRequested 加 dd_anomaly 分支→需 Api3d 加
anomalyById→AnomalyPropertiesDialog)、右键删除(CategorySection 加右键菜单+信号→main deleteAnomaly/deleteSlice)、切片保存位姿、per-anomaly 显隐。现 refreshAnomalies 仍用隐藏 colAnalysis 的 filterMode(异常默认全渲染,可接受)。 - Task12 #2 dict 填充 — 真实阻塞:装置类型筛选需
DatasetFieldDictionary填充,但parseFieldMapping需原始 dynamicForm JSON(含 confFieldId/optionsObject),而现有loadDatasetFormAsync返回的是解析后DynamicForm(仅 name/value,丢了 optionsObject)。需新增"拉原始 dynamicForm JSON"异步接口;且装置 value→中文字典源 spec §11 本就标注待坐实。当前 dict=nullptr,装置筛选退化不筛、日期筛选回退 createTime(数据照常出)。 - Task12 #4 — VolumeParamsDialog 扩展:左侧勾选源 ds 树(按 GS 分组·可二次增删) + 右侧「生成位置」下拉(项目内 GS/TM,默认单GS→该GS/跨GS→项目根)→填 req.structParentId/structParentConfType。现用基础 VolumeParamsDialog(归属走默认)。
- 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)。 - 对象树:
ObjectTreePanelGS 三态状态机(停 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 合并一个 commit(plan Task4 右键已引用 Task5 的 emitCheckedSources,循环依赖);② DatasetFieldDictionary 异步拉取下放 main(data 层无网络,类只内存缓存);③ CategorySection 段体先平铺(populateDatasetList),「项目根/GS/TM 容器节点分层」推迟 Task 12 接真实 StructNode;④ createSlice 虚接口未改签名,SliceGenerateRequest 组装并入 Task 12 main 层。
🔧 Task 11+12 待做(main.cpp 接线总成,最高风险,须真实 app 验证)
main.cpp 1943 行,接线密集。关键现状符号位置:
:361new ColumnDrawer(centerWidget)—— 需改传 dict(构造已支持第2参DatasetFieldDictionary* dict=nullptr)。:397 refreshAnomalies/:448 refreshAnalysis闭包用drawer->colAnalysis()。:442 c3 = drawer->col3D();:641c3 checkedDatasetsChanged→sceneCtrl;:653c3 generateVolumeRequested→createVolume;:898/902c3 verticalExaggeration。:579/745createSlice 调用(补 projectId + 组装 SliceGenerateRequest)。:584/623colAnalysis()->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)→pushChecked;generateVolumeRequested→VolumeParamsDialog→组装VoxelGenerateRequest→createVolume(req);detailRequested→Slice/Volume 属性对话框。clearCentral改走 lastSourceRows/refreshAnalysis。- 现可验:勾对象树 TM → 电阻率/视/瞬变段出数据 → 勾选段内 ds → 帘面渲染;生成三维体 → voxel 段出现 → 勾选渲体;切片段同理。
🔧 Task 12 剩余精修(6 项,新会话做,每步 build + 真实验证)
- 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 接线。 - dict 填充:main 创建
DatasetFieldDictionary并传new ColumnDrawer(centerWidget, &dict);对每个反演 dsType 调loadDatasetFormAsync→parseFieldMapping→dict.setFields(装置/日期筛选才生效,现 dict=nullptr 退化不筛)。 - 工具条接入:实例化
VtkViewToolbar叠加中央 QVTK,信号接 sceneCtrl(viewRequested/zoom/fit 接现有 c3 对应槽 :647 区;axesSettingsRequested→弹AxesSettingsDialog→应用坐标轴);VE 控件迁工具条。 - VolumeParamsDialog 扩展:左侧勾选源 ds 树(按 GS 分组·可二次增删) + 右侧「生成位置」下拉(项目内 GS/TM,默认 源单GS→该GS/跨GS→项目根)→ 填
req.structParentId/structParentConfType。 - 三维体段三级树 + 异常按归属挂体/切片(Task 11 本体,已重新设计,见 spec §8 / plan Task 11):取消独立异常区——异常作叶子挂归属实体(体/切片)下。归属链
异常→所在切片→切片所属体,挂载目标由「切片是否已保存成 dd_slice」决定(已存挂切片、临时挂体)。改Anomaly(volumeDsId→remarkSourceId+remarkSourceType)、Api3d 异常 mock 按归属存查、main 创建逻辑判断切片是否保存、三维体段「体→切片/异常」三级树。多体渲染本就支持(dsProps_按 dsId),volumeOwnerDs_=当前切片源体。 - 退役旧栏:删 main 中 c3/ca 旧接线(:641/669-760 区)、col3D()/colAnalysis() 调用、
Column3D*实例;删 ColumnDrawer 的 col3D_/colAnalysis_ 成员+访问器;评估删 splitByDimension(dim2D 改轻量过滤)。
- 切片保存/关闭(: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. 本会话已完成
- 摸透现状源码(ColumnDrawer/Column3D*/DatasetDimension/DatasetListPanel/ObjectTreePanel/RepoTypes/NavDto/Api3dRepository/main.cpp 接线等)。
- 真实接口实测定关键事实(用用户给的 token 直连后端,见 §6)——纠正了多个二手猜测。
- brainstorming 澄清全部设计决策(容器布局、分类策略、对象树三态交互、装置类型、生成入口等)。
- 产出 spec 并经 opus 子代理评审 + 据评审修订(GS 三态停 AutoTristate、properties 两接口形态澄清、帘面勾选链承接等)。
- 产出实施 plan(8 phase/12 task,TDD bite-sized,逻辑层完整测试代码、UI 层 build+手动验证)。
- 客户两轮交互确认收敛生成三维体交互(见 §3 第 5 条),同步更新 spec/openapi(v0.6)/plan。
- openapi 修订:三维体归属层级 TM → GS/项目根 → 再放开 GS/项目根/TM。
3. 最终设计定论(核心,已写入 spec)
- 两 tab:「三维分析」(5 段)+「二维分析」(现
Column2DDataset不动)。 - 大类分类按
dsTypeCode(不是 ddCode)——电阻率/视电阻率/瞬变电磁三者 ddCode 同为dd_inversion_data,只 dsTypeCode 不同。映射表CategoryConfig驱动;三维体/切片按 ddCode(dd_voxel/dd_slice)识别。 - 对象树联动:
- 非根 GS = 三态复选框(聚合「GS 自身 ds 开关」+「子 TM 勾选」)+ 右键「选择▸ds/tm」;必须停用
Qt::ItemIsAutoTristate、手动维护三态(UserRole 存 ds 开关)。 - 项目根 = 无复选框、直挂 ds 固定显示、其下 TM 各自二态勾选。
- 信号
checkedTmsChanged→checkedSourcesChanged(QList<DataSource{id,confType}>),按structParentConfType(1=GS/项目, 2=TM) 分流loadRowsAsync。
- 非根 GS = 三态复选框(聚合「GS 自身 ds 开关」+「子 TM 勾选」)+ 右键「选择▸ds/tm」;必须停用
- 装置类型/采集时间筛选:是 ds 结构化属性(
arrayType/collectTime),值在 ds 行properties[](confFieldId),经DatasetFieldDictionary(按 dsType 拉一次dynamicForm取 confFieldId↔fieldCode 映射 + 装置 value→中文字典)解析。装置类型只电阻率/视电阻率段有。日期筛选按 collectTime(三维体/切片回退 createTime)。 - 新增三维体(客户两轮确认定稿):
- 入口:数据类型段头「+新增三维体」按钮(电阻率/视电阻率/瞬变段),不在对象树/容器节点右键。
- 源数据集 = 三维分析中当前勾选的同类型 ds(本段类型、可跨 GS)。
- 点击 →
VolumeParamsDialog:左侧树状(按 GS 分组)展示勾选源、可勾选/取消供确认或二次修改;右侧参数:名称、生成位置下拉、插值模型、水平/竖向间距、IDW 幂次、最大影响距离。 - 生成位置(归属):默认 = 源同属单 GS→该 GS、源跨 GS→项目根;用户可改为项目内任意 GS/TM(
structParentConfType1 或 2)。源与归属解耦。
- VTK 画布工具条:全局视图控制(坐标轴/比例/快捷视图/缩放)移到中央 VTK 竖排工具条;设置→
AxesSettingsDialog(X/Y/深度 显示+min/max);快捷视图按钮文字「前/后/上/下/左/右」;复位=现「适配」。 - 请求体 DTO:
createVolume/createSlice扩参,内部按VoxelGenerateRequest/SliceGenerateRequest组装真实请求体结构(仍 mock 存储、假 id),toJson序列化;重构落地即可从 UI 产出给后端联调的真实请求体。 - 三维体/切片/异常仍
Api3dRepositorymock;异常迁入三维体段。
4. 剩余工作 = 执行 plan
plans/2026-06-24-vtk-category-view-refactor.md,8 phase/12 task,依赖顺序:
- Phase 1-2(Task 1-3):DsRow 扩展+parseDsRows / CategoryConfig+splitByCategory / 请求体 DTO —— 纯逻辑完整 TDD。
- Phase 3-4(Task 4-6):GS 三态状态机+checkedSourcesChanged / DatasetFieldDictionary —— 逻辑可单测。
- Phase 5-6(Task 7-9):CategorySection / CategoryAnalysisTab+ColumnDrawer / VtkViewToolbar+AxesSettingsDialog —— build+手动验证。
- Phase 7-8(Task 10-12):Api3d 扩参组装请求体 / 段重组(异常迁三维体段) / main.cpp 接线总成 + 退役 Column3DDataset/Column3DAnalysis。
建议:subagent-driven(每 task 新 subagent + task 间两阶段 review)+ 独立 git worktree 隔离。每 task 自带测试/验证+commit;Phase 间「新旧信号并存→Task 12 统一切换删旧」保证每次可编译。
plan 中 Task 7 段头按钮 + Task 12 VolumeParamsDialog 扩展(左侧源列表二次增删 + 生成位置下拉)已按 §3.5 定稿写好。
5. 待确认 / 风险
- 装置类型 value→中文 字典源(唯一待坐实,不阻塞实现):实测
arrayType原始值(如1429468249448449)不在该字段optionsObject(另一套 id1456095451258368…)里;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;headergeomativeauthorization: Geomative <token>(token 本会话由用户提供,下会话需重新索取)。 - 样本项目「演示项目(高密度+瞬变)」
1438889436225536:项目根 GS1438889436291072下直挂 TM(ERT1-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} |
三维体/切片/异常 mock(createVolume/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)