Commit Graph

10 Commits

Author SHA1 Message Date
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 2cf2b6aaa7 feat(dataset-detail): dd_grid 白化数据列表 + 引擎服务端分页(vxe-pager)
⑤ dd_grid 详情:单「列表」页签,序号/x/y 三列(均居中),服务端分页。
按原版(vxe-table)实测复刻:序号列前插、按页偏移自增;total 取 data.total;
分页器对齐 vxe-pager(上一页/页码…/下一页 + 前往N页 + 每页条数 50/100/500/1000 默认50 + 共N条记录)。

引擎新增分页能力(通用,后续分页型详情复用):
- TablePayload 加 pageNo/pageSize(>0 才渲染分页器;0=全量列表,measurement/trajectory 不受影响)
- GridDto.parseGridTable 复用通用 parseGridHeaderTable,前插序号列 + 回填分页态
- 仓储 loadAsync 增 pageNo/pageSize 透传,新增 grid.rows 加载器(端点 dd/ert/grid/rows,默认50条/页)
- 控制器新增 loadTabPaged(保留 3 参 loadTab 以维持 tabNeeded 连接)
- TablePager 分页器组件 + DataTableView 按 pageSize>0 显隐并转发 pageRequested
  → DatasetDetailPage/Panel.tabPageNeeded → Controller.loadTabPaged 反向链路
- GridStrategy(dd_grid 单分页页签) 注册入 main

测试:test_grid_dto(序号偏移/total/分页态/空数据) + grid.rows 分派 + GridStrategy 注册
+ 控制器 loadTabPaged 透传/默认页参;154/154 通过。
ABI 关键头(DetailPayloads.hpp)变更后全量重编 geopro 代码并验 obj 新鲜度。
2026-06-13 17:27:39 +08:00
gaozheng a00aeb9a56 feat(dataset-detail): 按类型渲染引擎 + inversion 迁移 + dd_ert_measurement_data 详情
将数据集详情从硬编码 ERT 反演重构为通用「ddCode→页签→视图kind」渲染引擎,
把已验收的 dd_inversion_data 迁入新引擎(渲染零变化),并在引擎上实现
dd_ert_measurement_data(ERT原始数据)详情。

引擎:
- 策略声明页签:IDatasetChartStrategy::tabs()→vector<TabSpec{title,ViewKind,
  loaderKey,lazy}> 取代 hasGridPhase();控制器通用化(datasetOpened/loadTab/
  tabReady),按页签槽位保留 abort-and-replace + 句柄身份比对 + deleteLater 三件套
- 单一异步句柄 DetailLoad/ApiDetailLoad(QVariant 载荷),仓储 loadAsync(loaderKey,
  dsId) 扁平分派;删 ChartLoad/GridLoad/loadChartAsync/loadGridAsync/DatasetLoads.hpp
- 视图 IDetailView{widget,setPayload(QVariant)} + DetailViewFactory 按 ViewKind 实例化;
  载荷 Scatter/Contour/TablePayload(core/model/detail/DetailPayloads.hpp)
- Page 按 TabSpec 建页签 + 通用 lazy;inversion 散点/网格迁入,渲染代码未改

dd_ert_measurement_data(③散点伪剖面 + 列表):
- 散点复用 RawDataChartView/ScatterPlotItem:x=斜距/y=伪深度(负向)/色=视电阻率,
  连续 cauto(含负离群值),colorBar 取自 colorGradation businessCode=R0&type=3(混合
  hex+rgba/AlphaScale::Unit);电极灰菱形(#BEBEBE实心+白描边 size16);A/B/M/N 与电极
  浮动 hover;数据点尺寸对齐原版 12px;色阶底部横向(与反演一致)
- 通用 DataTableView(gridHeaderDisplay/filedList+rowList,均衡等宽列+居中+隐藏/显示
  开关列);MeasurementDto 解析(散点位置数组 + vmap 摊平)
- 工具条视觉 1:1(信息/框选/显示/隐藏/数据过滤/x·y·v·计算方法下拉/色阶配置/生成视电阻
  率/反演运算/另存为);显示隐藏+x/y 下拉轻交互,其余占位

测试 75→138 全绿。Phase0 真实响应夹具 tests/fixtures/dd/*。
2026-06-13 10:51:24 +08:00
gaozheng 10072eb4b3 feat(dataset-detail+app): 数据集树/按根分页 + 暗色主题保真 + 详情图保真 + 桌面日志崩溃捕获
本分支累积的数据集详情与桌面端健壮性工作(多轮迭代,已逐项实测/用户验收),一次性提交。

数据集列表树化 + 按根分页:
- 原版数据列表为 el-table 树(派生数据按 sourceShowParentId 挂源「原始数据」下);
  DsRow 加 parentId,parseDsRows 解析 sourceShowParentId(回退 parentId),
  DatasetListPanel 由 QListWidget 改建 QTreeWidget(卡片委托泛化到 QAbstractItemView)。
- 后端 data/page 按扁平 DS 分页 → 改为客户端按「第一层节点(根)」分页:
  loadRowsAsync 加 pageSize,selectObject 一次取全,新增 emitNextDataRootPage 按根切页(5根/页),
  loadMoreData 改同步切页;main.cpp 加载更多计数改按根。

暗色主题保真(浅色保持与原版 1:1,仅暗色改 token):
- 新增 ChartTheme::applyChartPlotTheme:按 isDarkTheme() 设 QwtPlot 画布/轴字/网格/零线配色,连 ThemeManager::changed 热切换。
- ColorBarWidget、LoadingOverlay 底色/蒙板/文字同步跟随主题。

详情图渲染保真:
- colorBar alpha 标度修复(混合 hex+rgba 格式,rgba alpha 为 0–1,Bit255→Unit)。
- 散点 cauto 归一化(ColorMapService.setDataRange 解耦色阶形状与数据归一化)。
- 散点 hover 提示(ScatterHoverTip,X/Y/值 3 位小数,canvas mouseTracking)。
- 详情页签用数据名命名。

桌面端日志 + 崩溃捕获:
- Logging:滚动日志 + MiniDump 崩溃捕获 + VEH 抛点符号化;main.cpp GuardedApplication::notify 顶层异常护栏。
- 根 CMakeLists Release 产出 PDB(/Zi /DEBUG);ColorMapService NaN/Inf 守卫。

测试 116→122 全绿(+ParseDsRowsParentIdForTree / DataPaginatesByRootNodeNotFlatCount / 散点/colormap 回归)。
2026-06-12 19:00:32 +08:00
gaozheng 0cb0ed8aa0 refactor(detail): 控制器按 ddCode 走 ChartStrategyRegistry 分派, 未注册优雅降级 (替代硬编码 dd_inversion_data)
- IDatasetChartStrategy + ChartStrategyRegistry 下移到控制器层 (src/controller, namespace geopro::controller), 删 app 层那份, 修层级倒置 (控制器不得依赖 app)
- 接口加 hasGridPhase(); ErtInversionStrategy 留 app 层, 改继承 controller 接口, hasGridPhase()=true
- DatasetDetailController 构造注入 ChartStrategyRegistry&; openDataset 用 registry.supports 降级; loadGridData 用 strategy->hasGridPhase 判定
- main.cpp 构造 registry 注册 ErtInversionStrategy 并注入 (registry 先于 detailCtrl 声明)
- 测试: registry 加 hasGridPhase 断言; 控制器加空注册表降级 + 无网格阶段跳过网格加载用例; 全量 109/109 绿 (基线 106)
2026-06-12 08:14:19 +08:00
gaozheng 350f46060d harden(controller): 析构 abort 在飞句柄(退出契约 spec §7) + Grid 路径回灌/失败用例对称覆盖(评审 I-1/M-3/M-4) 2026-06-11 20:51:45 +08:00
gaozheng e57985c057 feat(data+controller): ApiDatasetRepository 改异步 + DatasetDetailController abort-and-replace+句柄身份比对+loadStarted(移除 busy_/catch)+ 回灌防护测试 2026-06-11 20:37:10 +08:00
gaozheng bac0a198ff feat(ui): 网格数据懒加载接线(控制器 gridReady + 页签首次激活触发)
DatasetDetailController 新增 GridData 内嵌结构 + loadGridData slot
(busy 守卫, 仅 dd_inversion_data; 拉 rows+色阶type2+异常) + gridReady 信号。
buildTabbedPanel 暴露 tabGroup 供调用方监听页签切换。
DatasetDetailPage 在「网格数据」页签首次激活且未加载时 emit gridDataNeeded;
setGridData 转发给 GridDataChartView 并标记已加载(切 ds 重置)。
DatasetDetailPanel 透传 gridDataNeeded / 按 dsId 路由 setGridData。
main.cpp 接线 gridDataNeeded->loadGridData, gridReady->setGridData。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 17:00:07 +08:00
gaozheng 82b654176e fix(ui): 审查修复 loadFailed接线/控制器重入守卫+ddCode降级/散点越界/点异常/Tab deleteLater/makeLines
- main.cpp: DatasetDetailController::loadFailed 连接到 statusBar,5s 显示失败消息
- DatasetDetailController: 加 busy_ 重入守卫;ddCode 非 dd_inversion_data 时直接 loadFailed 降级
- DatasetChartView::showScatter: 按 x/y/v 三者最短长度循环,防越界;加 #include <algorithm>
- DatasetChartView::rebuildAnomalyItems: 先处理 markType==1 点异常(小方块),再走原折线/多边形分支
- DatasetChartView::clearChart: 加注释说明 scene_->clear() + anomalyItems_.clear() 不变式
- DatasetDetailPanel: tabCloseRequested 改用 deleteLater,避免在事件处理期间同步析构
- ContourBands: buildContourBands 按 opt.makeLines 决定是否开 GenerateContourEdgesOn 及提取等值线
2026-06-11 12:42:04 +08:00
gaozheng d61775a3bc feat(controller): DatasetDetailController 编排 + ErtInversionStrategy 标识 2026-06-11 12:04:12 +08:00