Commit Graph

124 Commits

Author SHA1 Message Date
gaozheng 85636931af fix(ui): 分段折叠时向上收起(不再停在原位中间格)
根因:各段 addWidget(sec,1) 等高平分 stretch,折叠后该段仍占等分高度→段头浮在那格顶部、下方留空,
看着像"停在当前位置中间"(仅面板不出滚动条/内容short于视口时可见)。
修法:据折叠态动态重排 stretch——展开段=1(吸收余量铺满)、折叠段=0(只占段头高);末加尾部弹簧,
全部折叠时置 1 把段头顶到顶部。CategorySection 暴露 isExpanded()+collapsedChanged() 信号驱动重排。
保留"全展开等高铺满"原行为(#7)。

构建:app 链接通过
2026-06-26 07:49:08 +08:00
gaozheng d6e52cb51f fix(ui): 三维分析分段面板视觉打磨(段头/新增按钮/顶部留白,规范§4.3/§6.7)
用户反馈分段面板难看,逐项重做:
- 可折叠段头:去原生小三角(难看)→chevron 文本前缀 ▾/▸(随主题/hover 变色);标题改 title 字号
  +半粗(原默认字体);加浅底分段条 bg/panel-subtle + 底分隔线 divider 作视觉分段;hover 转 accent
- 「+新增三维体」:裸 autoRaise 文字 → 描边强调按钮(border/文字 accent/primary,hover 浅强调底,
  radius/sm,caption 字号),符合§6.7 次级强调按钮
- 顶部留白:CategoryAnalysisTab 内容区加 top margin → 首段段头不再贴顶
- 筛选行 setSpacing 一致化

构建:app 链接通过
2026-06-26 07:29:32 +08:00
gaozheng 2f6ec7dae2 fix(ui): 类型筛选改用组内数据自带类型值(typeName/dsTypeCode),不再依赖缺失的arrayType
按用户口径:类型筛选=按加载到该段的数据其自身携带的类型值的范围筛选。装置/arrayType 实测不在
ds 行数据上(data/page 不返回),故改用 ds 已带的 typeName(多为中文)作筛选维度,缺失回退 dsTypeCode
(必要时全局枚举翻译)。下拉列出组内实际出现的类型;passesFilters 按 typeName/dsTypeCode 比对。

构建:app 链接通过
2026-06-25 22:09:15 +08:00
gaozheng 31ad7a4750 chore: 撤诊断日志([dsrow-raw]/[arrayfilter]),保留 parseDsRows 对象形态解析健壮性
诊断结论(自读日志):data/page 所有 ds 行(文件/网格/反演)均不带字段属性(properties=文件元数据或null,
attachedParameters=null,无 arrayType);结构树节点亦无 arrayType。装置类型纯属脚本配置(ScriptInfoVO),
不在任何现有拉取数据里 → 装置筛选需新接脚本配置并按 ds→测线→脚本 串联(数据来源待定)。
2026-06-25 21:48:07 +08:00
gaozheng 5edfc8e5e8 fix(ui): 装置筛选稳健匹配+诊断日志 + 生成位置改下拉框(树形下拉面板)
- 装置下拉空:arrayTypeList 请求成功(日志确认),但匹配只认 itemValue(键)。改稳健匹配——ds 装置属性
  存 itemValue 或中文名都认(命中键取中文名/命中值用原名),data 存实际属性值供 passesFilters 比对。
  仍空则打 [arrayfilter] 诊断日志(枚举大小+首行属性 confFieldId=value)定位是枚举空还是值不匹配。
- 生成位置:QTreeWidget(常显树)→ QComboBox 下拉框,下拉面板用 QTreeView+QStandardItemModel 树模型
  (GS/项目根/TM 层级);mountTargetId/confType 从树视图当前项读(树模型下比 combo currentData 可靠)。

构建:app 链接通过;434/434 测试通过
2026-06-25 21:12:45 +08:00
gaozheng 63ebf7d4f1 fix(ui): 修日期日历面板错乱-popup 父对象改顶层窗口避开下拉项样式
DateRangeEdit 改 QComboBox 子类后,日历 popup 成 QComboBox 后代 → 日历内部日期网格
(QAbstractItemView)吃到全局「QComboBox QAbstractItemView::item」(padding 6px10px/min-height 20px)
下拉列表项样式 → 日期格重叠错位、无星期表头。修:popup 父对象用顶层 window() 而非本 combo,
日历不再是 QComboBox 后代,该 QSS 不匹配 → 日历恢复正常渲染。

注:本地链接因 app 运行中 exe 被锁(LNK1104)未完成,obj 已编译通过;关 app 后重 build 即生效。
2026-06-25 20:55:18 +08:00
gaozheng 69e8790810 feat(vtk): 多三维体并发切片渲染重构(OPT-002:issue2+③+反向②)
核心:InteractionManager 单 image_ → 按 volumeDsId 的多体 map;各切片附着到各自体的 image。
- issue2 选第二个体→第一个体切片消失:setVolumeImage 不再 closeAll 全部切片;改 upsert 某体(同体重建
  才关该体切片)。syncSlices 改为「勾选 + 父体已渲染」即显示(不再限当前体)→ 多体切片并存
- ③ 右键体却建到 current 体:sliceRequested 带目标体 dsId;addSlice(axis,volumeDsId) 用该体 image;
  保存切片/创建异常的 volumeDsId 改用 selectedSliceVolumeDsId(选中切片所属体)而非 currentVolume
- 反向② VTK→树:InteractionManager.onSliceSelectionChanged(selectByTool/onPicked 触发)→
  CategorySection::selectItem 程序化选中(屏蔽信号防环路)
- VtkSceneView 按 dsId 存 volumes_(image/cs/vmin/vmax);addVolume 登记/removeDataset 移除并回退
  current/clear 清空;volume(dsId) 取指定体→色阶编辑支持非当前体;SliceTool 加 volumeDsId 标签
- nearestSlice 阈值/onWheel 步长/导出上色 改用切片所属体的 bounds/色阶

未解:④ 切片拾取串选(nearestSlice 启发式,VTK9.6 不暴露切片 actor 难精确化;widget 交互选中是精确的)

构建:app 链接通过;434/434 测试通过
2026-06-25 20:36:43 +08:00
gaozheng b2904c211e fix(vtk): 坐标轴面板预热(4a)+装置枚举到达重刷下拉+树→VTK选中联动正向(②)
- 4a 坐标轴面板首开卡顿:启动时 ensurePolished+adjustSize 预热样式/布局,避免首次点开同步解析卡UI
- 装置下拉空:枚举异步加载(可能晚于数据)→在 listArrayTypes 回调里 refreshArrayFilters 重填各段下拉
- ② 树选中切片/异常→VTK高亮:CategorySection 发 datasetSelected→main 对 dd_anomaly setSelectedAnomaly
  /dd_slice selectSavedSlice。反向(VTK→树)需拾取回调,并入 OPT-002

构建:app 链接通过
2026-06-25 19:50:36 +08:00
gaozheng 62b7cde5cd fix(ui): 筛选时间换 QComboBox(与装置同款) + 异常复选框驱动显隐(①)
- #3/#4 DateRangeEdit 重写为 QComboBox 子类(覆写 showPopup 弹双日历):外观与装置下拉完全一致
  (同款原生下拉箭头/高度/边框),消除 QToolButton 方案的 popup「must be top level window」告警
- ① 创建异常后取消勾选仍渲染:异常行复选框现驱动显隐——itemChanged 对 dd_anomaly 发
  anomalyVisibilityChanged→setAnomalyVisible;异常默认勾选=显示(新项默认勾,曾取消的保留);
  refreshAnomalies 按三维体段复选框设各异常可见性;异常创建回调改为先 refreshAnalysis 再 refreshAnomalies

构建:app 链接通过
2026-06-25 19:42:37 +08:00
gaozheng 652b37b672 fix(vtk): 修创建切片/异常清空体·切片选择(issue1)+异常副标题补时间+新切片自动勾选
- issue1 真因:voxel(三维体)段数据来自 mock voxelTree,但 setBuckets 用 splitByCategory 的空桶
  (对象树 ds 里无 dd_voxel→必空)先 setDatasets(空) 清掉其勾选,随后 section("voxel")->setDatasets
  (voxelTree) 重填时勾选已丢→「创建切片/异常后体/切片选择被清空」。修:setBuckets 跳过 voxel 段
- 异常副标题没时间:saveAnomaly 没设 createTime(main 构建 Anomaly 也没设)→补当前时间(mock)
- 新切片自动勾选:CategorySection::setChecked(dsId) + 保存切片回调在 refreshAnalysis 后勾选新切片
  (恢复旧行为,避免刚存的切片因未勾被 syncSlices 隐藏)

未解(下轮):issue2 选第二个体时第一个体切片消失=单"当前体"模型固有限制(syncSlices 只显示
volumeDsId==currentVolumeDsId 的切片),需多体并发切片渲染改造

构建:app 链接通过
2026-06-25 19:21:55 +08:00
gaozheng 09a48d846b fix(ui): 栏位勾选增量保留 + tab去箭头 + 缩进 + 滑块跳位 + 清日志警告
- 栏位状态增量(最关键):CategorySection::rebuildList 记住已勾选 ds、重建后复原;之前每次刷新
  (勾选对象/建体/存切片/建异常都触发)清空全部勾选→渲染被重置。复原后 emitChecked 上抛同集,
  控制器据 diff 增量保留已渲染图元
- #1 tab 左右滚动箭头:上轮宽度算法没扣 padding 致溢出。扣开销(~42)稍欠宽 + setUsesScrollButtons(false) 兜底
- #6 缩进:容器文本左缘对齐子级复选框列起点(pad 12,非整列36),「容器→带框子级」缩进=树级(14),
  与「带框→带框」一致,且名称仍紧邻展开图标(无 #2 大留白)
- 5.5 滑块点轨道跳位:ClickJumpSlider 用 QStyle::sliderValueFromPosition 点哪跳哪(点手柄正常拖动)
- 日志 201× QFont pointSize<=0(-1) 警告:ObjectRowDelegate 去掉多余 setPointSizeF(-1)(setPixelSize 直接生效)

构建:app 链接通过
2026-06-25 18:46:06 +08:00
gaozheng 961af652d7 fix(ui): #1 两 tab 平分抽屉宽度,消除旧3栏遗留的右侧空白第三栏位
旧布局 3 栏(三维数据集/二维数据集/三维分析)三分横向空间;重构成 2 tab 后全局 QSS 让 tab 取
内容宽度左对齐,宽抽屉右侧留出约一栏空白(用户感知为"空着的第三栏位")。带样式表的 tab 不响应
setExpanding,故在 ColumnDrawer::resizeEvent 按 barWidth/n 给每个 tab 显式宽度,两 tab 平分填满。

构建:app 链接通过
2026-06-25 17:41:55 +08:00
gaozheng 7ff6f184e9 fix(vtk): 坐标轴/树/筛选跟进修复 + VE保留相机重建 + 异常删除刷actor
坐标轴(5.4/5.5):
- 放大系数改回「点应用才生效」(不再实时):VE 回 applied 信号一并下发;滑块 setPageStep(1)
  修「点轨道直接跳到10」;放大系数组与上方留间距
- 5.4 改VE不再先跳远视角:setVerticalExaggeration 走保留相机重建(preserveCameraOnRebuild)→
  render(resetCamera=false) 不 ResetCamera、fitOnArrival=false,异步到场数据在当前相机下重绘
树:
- #2 撤销 #6 容器复选框列预留(它造成容器名与展开图标间大留白);容器名紧跟展开图标(小留白)
- #3 时间下拉 chevron 跑左上角:`right 8px center` 是CSS偏移语法Qt不认→改 `right center`+origin
异常:
- 右键删除异常只刷列表没刷actor(场景仍渲染)→ deleteAnomaly 成功回调加 refreshAnomalies(技术债)

CLAUDE.md:新增「发现技术债务必须修,不以'非本轮引入'为由搁置」绑定规则

构建:app 链接通过
2026-06-25 17:31:55 +08:00
gaozheng 6a371c9fa9 fix(ui): 筛选行+分析tab滚动重构(批3/#3#7)
- #3 时间筛选下拉:QToolButton 套与 QComboBox 一致的 box(同高/边框/圆角/padding)+右侧统一
     SVG chevron(:/icons/chevron-down.svg),去掉手写粗糙的「▾」字符;修高度比装置下拉矮
- #7 分析tab滚动:各段在 tab 内 stretch=1(内容都少时四段平分高度填满、与VTK区等高不出滚动条);
     段体 list 关内层纵/横滚动条 + 最小高度=可见项内容总高(有副标题52/否则30,同delegate sizeHint),
     内容多则整段拉长、超视口由外层 QScrollArea 统一出单滚动条;去掉末尾 addStretch

构建:app 链接通过
2026-06-25 16:55:15 +08:00
gaozheng b497fe547c fix(ui): 分段树修复(批2)-选中高亮统一对象树+结构还原TM挂载+缩进一致
- #2 DatasetCardDelegate 选中/hover 改与对象树(ObjectRowDelegate)一致:整行方角填充
     (去圆角卡)+左2px accent竖条满高+选中标题加粗;保留双行卡片(创建时间·类型副标题)
- #4 CategorySection 树结构:派生 ds(反演剖面)带派生父指向已被筛掉/属别段的原始 ds 时,
     按 parentId 挂载失败→ds 浮到根平铺。改:派生父在本段保留嵌套(体>切片),否则回退挂
     结构容器 structParentId(TM),还原 项目/GS/TM/DS 真实层级
- #6 三维体段体相对TM缩进过大:容器节点(项目/GS/TM)不画复选框但保留同宽复选框列,使
     各级缩进只差一个树级(原先容器无列宽→子级带框缩进多撑出复选框列宽),与对象树一致

构建:app 链接通过
2026-06-25 16:46:32 +08:00
gaozheng 70f77c1736 refactor(vtk): 退役旧三维数据集/三维分析栏(Task 12 #6)-删 Column3D* 及全部死接线
旧 col3D_/colAnalysis_ 自分段重构后已 hide() 不入 tab、运行时不发信号,其 18 处
connect 全为死接线。本次彻底退役:
- 删 main.cpp 中 10 个 c3(Column3DDataset)+7 个 ca(Column3DAnalysis)+1 个 col3D() VE 接线
- 删 ColumnDrawer 的 col3D_/colAnalysis_ 成员/访问器/实例化/include/前向声明
- 删 4 个源文件 Column3DDataset.{hpp,cpp} / Column3DAnalysis.{hpp,cpp} + CMake 条目

唯一运行时仍在跑的 ca 消费是 refreshAnomalies(读 anomalyFilterMode 写 setAnomalies):
档位改恒「全部显示」(=隐藏 ca 的当前等效行为),异常列表已由 refreshAnalysis 经
voxelTree 全量注入新分段 tab,故去掉 ca->setAnomalies。零可见回归。

已知遗留(旧栏退役暴露,均非本次引入,待新分段段补 API):
- 新建/关闭切片不再自动勾选/取消列表(CategorySection 无 setItemChecked)
- 异常显示过滤档位、列表选中→VTK高亮(R84)随 ca 信号退役,待新段补信号

构建:configure+app 链接通过;测试 isolated 全绿(AsyncRegionBuilder 预取测试满载 flaky,
隔离复跑 3/3 过,属 GPR 域与本次无关)
2026-06-25 15:52:14 +08:00
gaozheng 572fbf8d7b fix(ui): 容器节点紧凑卡(矮+居中+小留白)+所有段从项目根树形(自剪枝)+体/切片创建时间+筛选行去采集(日期前装置后) 2026-06-25 14:47:58 +08:00
gaozheng 778ffe88c0 feat(ui): 三维体段右键全接旧栏操作-体(生成切片/色阶) 切片(保存/另存/导出图片dat/色阶/删除) 异常(显隐/删除) 2026-06-25 12:33:22 +08:00
gaozheng eb50a87694 fix(ui): 右键菜单限三维体段+容器节点去复选框+容器树剪枝(只展示有体路径) 2026-06-25 12:17:50 +08:00
gaozheng 888a63081b feat(ui): 三维体段从项目根完整层级树(容器节点+体挂归属)+段体右键菜单(详情/删除切片异常)(界面修复 4/5) 2026-06-25 11:50:17 +08:00
gaozheng c2f2b1f94c feat(ui): 日期范围筛选控件(双日历面板/可清空/默认今天)替代单 QDateEdit(界面修复 1/2/3) 2026-06-25 11:41:23 +08:00
gaozheng a990f2ea90 fix(ui): 左面板 QSplitter 可拖改宽(min180/max560)+禁横向滚动条(界面修复 1) 2026-06-25 09:41:06 +08:00
gaozheng beb398d478 fix(ui): 生成按钮移标题行+采集时间改时间段(不限)+切片不单列段(挂三维体树)(界面修复 3/4/5) 2026-06-25 09:34:19 +08:00
gaozheng b9a655126f feat: 装置类型枚举接口 listArrayTypes→填字典→段头装置下拉显示+过滤(Task12 #2) 2026-06-24 21:45:38 +08:00
gaozheng 98114a36e0 feat(ui): CategoryAnalysisTab(QScrollArea 5段)+ColumnDrawer 两tab(旧栏隐藏过渡) 2026-06-24 19:14:51 +08:00
gaozheng 30e990d967 feat(ui): CategorySection 类型段组件(段头装置/日期筛选+段体可勾选树+生成入口) + DatasetFieldDictionary 缓存类 2026-06-24 19:10:03 +08:00
gaozheng 40646f7d06 refactor(tree): 评审修复-抽 recomputeAllGsStates 去 nullptr 信号 hack + 注释精确化 2026-06-24 18:15:03 +08:00
gaozheng 1978a31fa7 feat(tree): GS 三态状态机(停 AutoTristate)+右键 ds/tm + checkedSourcesChanged 源集合
合并 plan Task 4+5:plan Task 4 右键代码已引用 Task 5 的 emitCheckedSources,
二者均改 ObjectTreePanel 且循环依赖,合并实现避免中间不可编译态。
checkedSourcesChanged 与旧 checkedTmsChanged 并存,Task 12 接线切换后删旧。
2026-06-24 18:05:09 +08:00
gaozheng bec6a376d5 fix(ui): 详情对话框页脚/表单改走 FormKit 符合视觉规范(去Arco式大按钮)
之前为"像原版"手搭 QFormLayout + Arco式页脚(45%等宽/两端对齐/多主按钮/顺序反),
违反 Geopro3.0 视觉规范 §6.7/§7.5/§7.0.10。改为规范实现(字段结构/API 不动):
- 白化/另存/滤波/网格化:页脚改 formkit::addDialogButtons(右对齐 取消+确定,主按钮蓝);
  异步确认改接 Ok 按钮 clicked(校验/whitenData/save 成功才 accept);表单改 makeEditForm
  +editLabel+capField+addSection;宽度按规范(白化560/另存420/滤波保留宽/网格分组)
- 滤波"保存设置"作次按钮(ActionRole)不抢 primary;网格化 上一步(次)左+取消/确定右
- 快查:ScatterFilterDialog 可编辑输入改 makeEditForm;AutoAnnotation 主操作 setDefault
- 异常各弹窗/反演表单 已合规未动

build all 绿,341/341。
2026-06-23 18:40:11 +08:00
gaozheng 7d0e72dec2 feat(ui): 全局下拉空态优化 EmptyAwareComboBox(占位+暂无数据,对齐Arco)
下拉无数据时原为空白框+空弹窗,不优雅。新增统一空态感知下拉对齐原版 Arco ASelect:
- EmptyAwareComboBox(QComboBox 子类):showPopup 无真实项时临时插禁用灰色「暂无数据」
  条(关闭即移除,不污染取值),仍可点开;占位经 setPlaceholderText(currentIndex=-1)显示
- FormKit 加 comboBox(placeholder) 统一入口
- 全局替换全部 37 处 new QComboBox:7 处数据驱动给占位(白化文件/异常类型/反演模型/
  导入类型脚本/导出模板),30 处仅换类保留自动选首项语义(逐处判断,不破坏取值)

build all 绿,341/341。
2026-06-23 17:35:54 +08:00
gaozheng 438ed78aad feat(detail): 新增异常类型完整1:1(ExceptionTypeDialog 880px双Tab图例编辑器)
替换最小版,完整复刻原版 ExceptionLabel 子弹窗:
- 新建 ExceptionTypeDialog(880px,双Tab异常属性/标注名称):
  异常属性Tab(类型名称/代号必填/标准编号/标准名称/说明 + 按markType点/线/面/文字的
  图例样式编辑器:形状/大小/颜色/不透明度/线形/填充/字体,选项默认对照原版)
  标注名称Tab(自定义格式+分隔符+可增删名称列表 fieldName/fieldCode)
- 仓储 newCustomExceptionType 替换为 addExceptionType(POST /business/exceptionType,
  body 全字段对照原版 handleBeforeOk:legend/exceptionNameList/type:2/exceptionMarkType)
- ExceptionDialog「新增异常类型」按钮接通,成功刷新类型下拉并选中

build all 绿,341/341。
2026-06-23 14:58:36 +08:00
gaozheng 6cc973a183 feat(detail): 异常详情坐标系/网格色阶templateId/新增异常类型 收尾1:1
- I11 异常详情经纬度/投影坐标:Anomaly 加 lonLatPts/eastNorthPts,parseDatasetAnomalies
  按原版响应字段(latitudeLongitude.latLon / geographicalCoordinates.coordinates)解析;
  坐标系下拉条件显示(有 latLon 才给三项,对照原版 latLon.length===0),纯展示不换算
- 网格剖面色阶 templateId:ContourPayload 加 templateId,inversion.grid 加载/重载解析
  getDetail 顶层 templateId,GridDataChartView 传入色阶编辑器→网格色阶另存覆盖可用
- 新增异常类型:仓储加 newCustomExceptionType(POST /business/customExceptionType
  {projectId,exceptionTypeName}),ExceptionDialog 按钮接通+刷新类型下拉

build all 绿,338/338。
2026-06-23 14:35:27 +08:00
gaozheng 3dfe8b54f5 feat(detail): 色阶编辑器另存覆盖 + 散点模板库可用(1:1)
- IColorTemplateRepository/Api 加 updateLvlTemplate(PUT /business/lvlTemplate
  {id,templateName,properties}),对照原版 updateLvlTemplate
- ColorScaleConfigDialog 另存为改自定义弹窗:名称+「覆盖原模板」复选(仅 lvlTemplateId
  非空可勾)→勾选 updateLvlTemplate / 否则 saveLvlTemplate;ctor 增 lvlTemplateId(默认空)
- 散点路径接通模板库:工厂给 Scatter 视图注入 colorTplRepo,构造色阶编辑器传
  colorTplRepo+projectId+data_.templateId→另存/打开/覆盖可用(原 nullptr 禁用)
- 3D 体色阶编辑器(main.cpp)及网格(GridDataChartView)用默认空 templateId,行为不变

build all 绿,336/336。
2026-06-23 14:08:35 +08:00
gaozheng 0212fb5d2e feat(detail): 自动标注对话框补等值线预览图(I13 1:1)
右上补轻量 QwtPlot+ContourPlotItem 渲染反演网格等值面(复用 GridDataChartView 同款
渲染器与 ColorMapService);执行自动标注后 parseDatasetAnomalies 解析预演异常实时叠加,
删除预览行同步移除。构造改收 Grid+ColorScale(统计从 grid.values 算)。

build all 绿,336/336。
2026-06-23 13:53:56 +08:00
gaozheng 75cf8d40ba fix(detail): 反演动态表单支持11种控件+必填校验 + grid按钮视觉 + 色阶templateId
- InversionFormDialog 动态表单不再一律下拉:复用项目既有 parseEditableForm +
  DynamicFormEditor(与对象/结构编辑同款),按 displayComponentType 渲染 11 种控件
  (文本/只读/复选/下拉/日期/时间/日期时间/多行/数字按dataType+limit/树选降级/步进)
  + requiredType 必填校验/只读禁用。生成视电阻率纯select行为不变。
  删除被孤立的 InversionFormParse + 其测试。
- grid 反演按钮行:左"电法列表"radio + 右蓝色主按钮 space-between(仅dd_grid)
- 色阶保存带 templateId(ScatterPayload+DTO捕获色阶detail顶层templateId,measurement
  与反演原数据两路;空可省,对照原版)

后续项(未动,与3D共享风险):ColorScaleConfigDialog 另存覆盖/散点模板库可用。
build all 绿,336/336。GPR/金字塔/.superpowers WIP 未碰。
2026-06-23 12:44:42 +08:00
gaozheng 6bc7c23a8c fix(detail): inversion 异常/自动标注/描述交互返工对齐原版 + 修 getExceptionName
- I9 文字标注:落点后弹 ExceptionTextDialog(字体/大小/颜色/不透明度/内容)写 customLegend;
  补"新增异常类型"按钮(完整子流程标注待办);Anomaly 增 Text=4 + 文字字段
- 修 getExceptionName:原版 data 为纯字符串,客户端误当对象解析→名称回填失败;
  改 wireString 解析,回调签名改 (bool,QString,QString);切类型每次回填
- I10 删除文案对齐原版 contourContentDelete
- I11 详情返工:380px 抽屉式双Tab(图例/坐标),线样式改只读,坐标系切换(图形/经纬度/投影)
  +顶点数+导出txt(经纬度/投影无换算数据,标注;图形坐标可用),提交体仍 {id,exceptionName,remark}
- I13 自动标注返工:1400px,规则卡片(标题/折叠/删除),阈值模式 radio(切换清空),
  右上统计(max/min/mean/median),预览表序号+逐条删除(等值线预览图高成本待办)
- I14 富文本补 背景色/对齐/字体族 工具栏 + QuillDelta 字体族往返;去下划线/列表(原版无)

build all 绿,339/339。GPR/金字塔 WIP 未碰。
2026-06-23 12:26:16 +08:00
gaozheng c21226a3d7 fix(detail): measurement 对话框/工具条视觉返工对齐原版
以原版 web 为准返工 measurement 散点交互视觉:
- 数据过滤:1000px;左直方图(hover柱变红+tooltip)+右信息区(数值范围/占比/原始点数/
  当前点数橙色高亮)+底部双手柄范围滑块(新增RangeSlider)+计算分布/重置;min/max输入
  最大在上最小在下;三方联动(输入↔滑块↔直方图)
- 另存为(RawData):280px、标题"数据另存为"、确认/取消
- 色阶/另存/过滤成功 toast
- 信息面板 A红/B蓝/M绿/N橙(#F4B008);tooltip"查看散点属性"/"散点的点选"
- X/Y/V/值类型下拉固定宽 120/160/160/120;无高程禁用 X/Y
- 导出置工具条最右(页头HeaderAction跨ddCode静态)

API 字段未动。build all 绿。
2026-06-23 11:53:13 +08:00
gaozheng 4a1fecb149 fix(detail): inversion 处理类对话框视觉返工对齐原版(白化/网格化/滤波/另存)
之前用客户端 FormKit 外壳导致与原版 web modal 系统性不一致,以原版为准返工:
- 白化:550px、第2项"白化文件"、边界扩展改文本框、确认/取消顺序、标签右对齐
- 网格化:步1 500/步2 800px、网格参数/数据值设置双分组栅格、"数据值保存为"、
  补恢复默认值按钮 + 间距↔点数双向联动 + 分项校验
- 滤波:900px 左树右设置双卡片、"忽略"、矩阵行列表头 + 奇偶校验
- 另存为(Inversion):标题"另存为新的网格数据"、400px、默认名"网格数据1"、确认/取消
- 工具条:异常标注/自动标注/另存为、原数据另存为 右对齐

API 端点/请求体字段未动(已 1:1)。build all + test 324/324 绿。
2026-06-23 11:31:14 +08:00
gaozheng 8f167b62c9 fix(detail): 白化 tmObjectId 经 open 链路从数据集列表透传(修模板列表为空)
白化「白化模板/模型」方式文件列表为空:原 plan A 用 getDsObjectDetail(dsId)
取 structParentId,实测该响应不含此字段。原版 web 取自数据集行所属 TM
(dsFileRow.structParentId)。

改为 plan B:tmObjectId 从 datasetsLoaded(tmObjectId) 存入树节点新角色
kDsTmObjectIdRole,双击/右键打开时读出,经 openDataset→datasetOpened 信号
→Panel→Page→DetailViewFactory→GridDataChartView 透传,openWhitening 直接用,
删除 getDsObjectDetail 懒拉。

build all(app 链接) + test 全绿,320/320。
2026-06-23 10:51:12 +08:00
gaozheng ec4a7e81ef feat(detail): 补全详情视图剩余交互(框选/绘形/直方图/行级可见性/富文本/白化)
继续数据集详情视图 100% 复刻,补齐上批后置/降级的 6 项。

- M2 measurement 列表行级可见性:DataTableView 载荷驱动可交互开关列
  (仅 measurement 启用),行级 popconfirm → saveDisplayStatus
- M3 数据过滤直方图:新增自绘 ScatterHistogramView,分布柱 + 选区高亮 +
  与 min/max 输入联动
- M14 散点框选:ScatterMarqueePicker 橡皮筋框选 + ScatterPlotItem 选中高亮,
  显示/隐藏对选中子集操作
- I9 异常图上绘形:ContourDrawTool 在等值面上交互绘制 点/线/面/文字
  (先弹窗填类型/名称→图上绘制→newException),坐标表保留为兜底
- I14 富文本描述:DescriptionPanel 升级富文本(粗体/斜体/下划线/字色/字号/
  标题/列表) + QuillDelta 与 Quill Delta 常见格式往返(非 Quill 不可字节级1:1)
- I3 白化 tmObjectId:openWhitening 经 getDsObjectDetail 取 structParentId

修复 ScatterHistogram 命名冲突(widget 改名 ScatterHistogramView,与
ScatterDataOps 的分箱结构 struct 区分),desktop 目标恢复可链接。

抽纯函数 ChartPickGeometry/QuillDelta/buildScatterHistogram + 单测。
build app + test 全绿,318/318 通过。
2026-06-23 10:33:14 +08:00
gaozheng 12813bd8d0 feat(detail): 数据集详情视图交互复刻(measurement/inversion/grid)
对照原版 web 1:1 复刻数据集详情视图的写操作交互,补齐既有视图的全部
可交互能力。

基础设施
- 新增写操作命令仓储 IDatasetCommandRepository + ApiDatasetCommandRepository
  (26 个写/查接口,端点逐字对照原版 apis),回调式异步沿用 ApiColorTemplateRepository 模式
- 写操作注入链平行 setColorTemplateRepo:main→Panel→Page→DetailViewFactory→视图,
  透传 cmdRepo + dsIdGetter
- 新增共享对话框 InversionFormDialog/SaveAsDialog/ScatterFilterDialog/GridWizardDialog/
  WhiteningDialog/FilterDialog/ExceptionDialog/ExceptionDetailDialog/AutoAnnotationDialog
- 纯函数 InversionFormParse/ScatterDataOps/InversionProcessOps/ContourSimplify + 单测

measurement(M1-M13):可见性持久化、数据过滤、X/Y/V轴、值类型、色阶配置、
  生成视电阻率、反演运算、另存为、导出DAT、信息点选
inversion 网格(I1-I15):网格化向导、白化、滤波、等值线提示、简化容差(真生效)、
  异常增删改查+定位、自动标注、描述保存、另存为
inversion 原数据(O1-O3) + grid 反演(G1,functionList 驱动)

后置/降级(台账 §6.4):M14框选、M2行级可见性、M3过滤直方图、I9图上绘形、
  I14富文本(Qt无Quill)、I3白化tmObjectId透传

测试 285/285 通过
2026-06-23 09:21:37 +08:00
gaozheng 08b8ebbf01 feat(ui): 统一对话框外壳+全局控件高度,数据集属性改只读
对话框外壳(formkit)统一,编辑态与只读态同款卡片/分组/边距/按钮栏:
- 新增 dialogRoot/formCard/cardBody/addDialogButtons;buildDetailDialog 复用 formCard
- 生成三维体/导入/导出/异常保存/对象新建/等值线/色阶/设置等对话框迁到统一外壳
- FormKit.hpp 直接 include QLabel/QFrame(editLabel/formCard 返回类型在调用点需完整)

全局控件高度/外观一次补齐(QSS,覆盖所有对话框):
- QSpinBox/QDoubleSpinBox 经 QAbstractSpinBox 统一 box,与输入框/下拉框同高;上下按钮扁平 chevron
- QPlainTextEdit/QTextEdit 补输入框同款边框/圆角/底色
- 新增 chevron-up.svg(数字框上箭头)

数据集属性改为纯只读:移除"修改描述"功能(QTextEdit+保存+saved 信号+repo 依赖),
DatasetAttrPanel 构造简化、main.cpp 相应接线清理
2026-06-23 09:13:17 +08:00
gaozheng 959f030c98 feat(ui): 表单渲染单一真相层(formkit)+只读渲染器(KeyValueView),统一编辑/只读/详情表单
把分散在各文件手搭的表单收敛到唯一实现,杜绝"同类控件各处不一"的漂移:
- 新增 FormKit(DetailForm/buildDetailDialog + makeEditForm/editLabel/capField/addSection)
- 新增 KeyValueView 为唯一只读键值渲染器(§6.4);DynamicFormView 改为内嵌它
- 三维体/切片/异常详情对话框由裸 QFormLayout 迁到 DetailForm+KeyValueView(随内容自适应)
- 生成三维体对话框 + DynamicFormEditor 改用 formkit 可编辑套件(标签列/行距/分组逐像素一致)
- 分组标题统一为 formkit::addSection(编辑态与只读态共用同一段代码)

控件一致性:
- 下拉框/日期框扁平 chevron 箭头(qrc 内嵌 SVG),去 Fusion 原生斜角;日期框补齐输入框同款 box
- 无候选项的"选择"字段退化为 QLineEdit,不再用几何异类的可编辑下拉框
- QComboBox/QDateEdit/QTimeEdit min-height/padding 与 QLineEdit 对齐 → 同高

规范:§7.0.2 标签列宽由区间改精确常量(可编辑100/只读72);新增 §7.0.10 实现纪律
(唯一实现、禁手搭 QFormLayout、精确常量、控件构造一致性、新表单并排验收)
2026-06-23 07:28:48 +08:00
gaozheng 5e60446210 feat(vtk): 色阶编辑器(2D/3D共享)+模板库后端+剖面着色修正+二维数据集足迹
本会话主要交付:
- 色阶配置对话框 1:1 复刻原版(colorLevel/contourLevel/contourLine/colorEditor + colorUtils):
  左三列⚙表格(层级/线形/颜色) + 层级⚙/线形⚙/颜色⚙ 子对话框 + 连续渐变(直方图/读出/min-max/反转)
  + .lvl/.clr 导入导出;文案/校验对齐原版精确 i18n。
- lvl/clr 模板库接真实后端:IColorTemplateRepository + ApiColorTemplateRepository,
  另存/打开/新建色阶/配色方案下拉 经仓储注入 2D(GridDataChartView)与 3D(主对话框)。
- 剖面帘面着色对齐原版 threeContour.js getTerrainColor:上界 stop 取色 + 满 RGB,
  修正"色带整体下移一格 / 发浅发灰 / 丢 alpha"导致与原版差异大的问题。
- 二维数据集视图首切片:勾选轨迹类数据集 → 足迹平铺进 View3D 地图
  (Api3dRepository::loadMapLine 走 dd/ert/trajectory/line + MapLineActor + col2D 接线),
  view2DMode 控摆放高度,顶/底锚真实地表高程(zRefElev)。
- 测试 252 全绿。

并含本分支前序未提交的 UI 工作(ToastOverlay/TopBar/Theme/DynamicForm/若干 panel),
经 CMakeLists/main.cpp 纠缠,随此 checkpoint 一并提交。未纳入未跟踪的 png/yml 及审查报告 txt。
2026-06-22 12:48:45 +08:00
gaozheng c83f63a8f5 feat(vtk): 异常属性对话框(#4c-3, R83)-双击异常列表弹只读属性
- AnomalyPropertiesDialog:名称/类型/标记类型/归属三维体/异常体/顶点世界坐标/备注,只读
- Column3DAnalysis:留存 anomalies_,双击 itemDoubleClicked 按 id 回查发 anomalyPropertiesRequested
- main:接线打开对话框
- 截图字段:模型/端点无,不展示(保存对话框截图为mock未持久化)

编译绿(build.bat app);用户实测通过。#4 异常功能收口。
2026-06-18 19:26:02 +08:00
gaozheng 324d4ac605 feat(vtk): 三维分析区 3D 异常控制(#4c-1)-列表+显示过滤+单条显隐+删除
三维分析栏加 3D 异常控制(异常挂三维体,mock):
- 布局:数据集树 + 「异常」分组框(显示过滤下拉 + 异常列表)放进可拖拽竖向 Splitter,数据集树占多
- 显示过滤(R86-87):全部显示/随GS/随数据集/全部隐藏 —— 独立于体勾选控制 VTK 异常可见性
  (随GS 暂同随数据集;loadAnomalyTree 空key=全部、非空=该体)
- 单条显隐勾选 → setAnomalyVisible;右键「删除异常」→ deleteAnomaly + 刷新
- refreshAnomalies:按档位算异常集合 → clear+addAnomaly 重渲染 + 填列表 + Render
  (修过滤切换后 VTK 不重绘、与列表脱节的 bug)
- 创建异常后经 refreshAnomalies 入列表

编译链接绿(build.bat app exit 0);用户实测通过。
待做:4c-2 列表选中→VTK 高亮联动(R84,需视图 setAnomalySelected);4c-3 异常属性面板(R83);单条显隐态持久化。
2026-06-18 18:57:26 +08:00
gaozheng 6210d615f3 feat(vtk): 异常圈定+保存闭环(#4b)+多项交互修复
#4b 异常圈定→保存→渲染→持久 闭环(异常挂三维体,mock 持久化):
- AnomalyDrawTool:切片平面上圈定多边形(屏幕射线-平面求交落点);左键加点(醒目黄圆点)、
  鼠标移动虚线橡皮筋(末点→光标跟手)、双击/右键/回车闭合、Esc 取消、左上屏幕提示;高优先级观察者绘制期独占输入
- AnomalySaveDialog:名称/异常类型(mock)/备注 + 截图预览及尺寸(R50)
- 切片右键「创建异常」接通:圈定→草稿渲染→截图→保存对话框→saveAnomaly(挂三维体)→红色多边形渲染
- onVolumeChanged→reloadAnomalies:体到场重载其异常(= 显示过滤"随数据集"默认档)
- SliceExport 加 captureRenderWindowPng(异常截图,带尺寸);Anomaly 补 exceptionTypeId/remark

交互修复(用户实测确认):
- 生成三维体**按勾选集合**(checkbox)收集源,不再受行高亮/右键项影响(撤销错误的多选子类)
- buildVolume 网格**覆盖全程**:包络过大时放大间距(fitAxis)而非截断 → 跨 TM 多剖面不再丢远端剖面
- 滚轮回退为"推进当前选中切片";点击切片外**取消选中**(取消后滚轮恢复相机缩放)
- 修圈定闭合误触切片:闭合事件提前 abort,避免漏给切片 widget 触发 slice-motion

文档:plans/2026-06-18-vtk-3d-anomaly.md §6 摆放决策(3D异常控制在三维分析区/右侧总表为全集)+§7/§8 状态;
  design spec 顶部更正块(异常挂三维体/remarkSourceType=标注形态/无截图字段/独立显隐);HANDOFF 更新到 4a/4b。

编译链接绿(build.bat app exit 0);4b 闭环 + 交互修复已用户实测通过。下一步 4c:三维分析区 3D 异常控制(树+过滤R86-87+VTK选中联动R84+显隐+删除)。
2026-06-18 18:31:46 +08:00
gaozheng d56e35f93d feat(vtk): 切片生命周期重构(3b/3c)-已存切片重渲染+保存链接+场景列表同步
切片"未保存↔已保存"统一状态模型,修复多项交互不一致(用户实测通过):
- 保存=链接当前切片到新 dd_slice(不重绘)+三维分析栏自动展开勾选(syncSlices 按 dsId 去重)→
  不再出现"保存后旧渲染还在、再勾选出现两个"的重复切片
- 持久化存精确三点(Origin/Point1/Point2)+axis(SliceSpec),重渲染逐点精确还原 → 尺寸/朝向一致
  (修"重渲染切片明显变大")
- VTK视图「关闭」已保存切片 → onSliceClosed → 取消列表勾选(场景↔列表双向同步)
- VTK视图「保存」按"未保存/已保存"分派:未保存→createSlice+link+autocheck;已保存→saveSlice 覆盖位姿
- 已保存切片在三维分析栏勾选→在当前活动体上按 spec 还原渲染;取消→移除;靠 onVolumeChanged→syncSlices
  解决"父体异步到场"排序(SliceTool 还原构造/dsId 标签;InteractionManager showSavedSlice/hideSavedSlice/
  selectSavedSlice;Api isSliceDataset/sliceSpec)
- 菜单统一/精简:VTK视图与列表导出统一为「导出▸(图片·dat)」;移除列表(三维体/切片)的"显示/隐藏"(勾选即显隐);
  列表保存=覆盖位姿、保存为=另存新切片
- 修 Column3DAnalysis::setDatasets:按 dsId 保留勾选态 + 仅勾选集变化才发信号 →
  保存切片不再连带取消三维体勾选/重置列表

编译链接绿(build.bat app exit 0);上述场景已用户实测通过。
2026-06-18 09:40:19 +08:00
gaozheng b261374cc9 feat(vtk): 客户端生成三维体流程(#1)-多源IDW插值+按类型分流体素/帘面
- core::buildVolume 共享管线(散点→GridSpec→IDW→值域),LocalSample/Api 同源,消除调参漂移
- VolumeBuildParams:参数必存(源ds+插值模型/参数+色阶);不冻结gridSpec,改用"源ds锁定"不变式(留校验TODO)
- Api3dRepository:内存体存储 + createVolume/volumeRows/isVolumeDataset + 多源loadVolume
  (复用loadSection走inversion.grid,竖向=g.y高程,与帘面构造性对齐;绕开scatter端点y/z语义坑)
- loadVolume 回调改交付(VolumeGrid, ColorScale):体色阶=源剖面色阶(mock体在dsRepo无条目)
- UI:Column3DDataset(源数据栏)多选+右键「生成三维体」+ VolumeParamsDialog(IDW;克里金占位)
- 生成的体归三维分析栏(Column3DAnalysis,设计§2.1),非数据集栏;main.cpp 两栏勾选聚合下发,体不被后端刷新冲掉
- VtkSceneController 按 isVolumeDataset 分流体素/帘面,取代失效的全局 showVoxel/showCurtain

编译链接绿(build.bat app exit 0);未GUI实测(Claude无法验VTK渲染)。设计/计划见 docs/superpowers/plans/2026-06-17-vtk-3d-volume-create-flow.md
2026-06-17 20:56:07 +08:00
gaozheng 052fdc1168 refactor(vtk): VE默认值收敛为单一来源(kVerticalExaggeration一处定义,组合根下发控制器/底图/UI);加预设取景诊断日志 2026-06-17 17:10:24 +08:00