Commit Graph

101 Commits

Author SHA1 Message Date
gaozheng 995c511240 fix(vtk): 沿线位置滑块改按实际雷达三维体存在门控,不再被细长非雷达数据误触发 2026-07-01 08:16:52 +08:00
gaozheng c0b6b31a9a fix(io/gpr): 雷达文件按宽字符打开,支持中文目录路径
规范化/Impulse 雷达 reader 的 std::ifstream 用 toLocal8Bit 产出的窄字节(GBK)路径
打开文件。GUI app 链接 QWebEngine(Chromium)/VTK,启动时 setlocale(LC_ALL,"") 把
LC_CTYPE 提升为系统 UTF-8 locale,此后 narrow ifstream 把 GBK 路径字节当 UTF-8 解析
→ 打不开 → "打开 .head 失败"。纯 "C" locale 的无头/单测环境用 CP_ACP=GBK 解窄路径,
不触发,故此前未暴露。

新增 io/gpr/LocalPath: Windows 用 MultiByteToWideChar(CP_ACP) 把本地 8 位字节解成
宽字符 std::filesystem::path,使 ifstream/ofstream/file_size 走宽字符打开,与 locale
无关;非 Windows 直接 UTF-8。改到所有外部导入路径 open 点(.head/.data/.iprb/.iprh/
.ord/.gps)。

回归测试 OpensCjkDirectoryPathUnderUtf8Locale: 显式置 .UTF-8 locale 复现 app 运行期
条件,走真实 buildLineVolumeFromNormalized 断言中文目录建体成功(退回 narrow 则抛错,
红/绿已验)。
2026-07-01 08:07:40 +08:00
gaozheng e8df41b9f2 feat(vtk): Plane2D 策略持每类型平面矢量底图(多实例+生命周期+底图popup) 2026-07-01 00:21:45 +08:00
gaozheng 8f7da3657a feat(vtk): 类目描述符目录 categoryCatalog(classify谓词+扩展契约)取代 categoryConfigs
splitByCategory 改遍历 catalog 用 classify 路由(首个 classify==true 入段);新增 5 段含 trajectory。旧 CategoryConfig/categoryConfigs 暂保留供 CategoryAnalysisTab/CategorySection。同步修正 test_dataset_category 旧断言(段数随 catalog=5)。
2026-06-30 21:05:15 +08:00
gaozheng 571a72701d feat(radar): 三维交互精修 + 增益切换 + 视角导航(B#1/#2) + 全链路方案 spec
交互精修(雷达+反演通用):
- 切片拾取精确化: 光标射线 vs 切片真实矩形求交 + 可见数据(alpha)双判定, 去外扩
- 取消选中: 点体/空白/帘面即取消(精确命中判据) + Esc 兜底; 选中后上下拖动方向修正
- 滚轮步长: 按沿法向体素间距 x N(Shift 粗调), 不随体长跳变
- 双击正视: 缩放到切片(面内尺寸+视角框住), 不再又小又远
- 不透明度: 各向异性体用特征尺度(门控; 近立方反演维持原对角线)

视角导航(B 方案):
- #1 绕拾取点旋转: 无选中时绕光标射线穿体中段点(按下捕获/拖动固定), 不甩飞
- #2 沿线位置滑块: 雷达专属, 沿最长轴 dolly 到窗口(focusAlongLongAxis), 仅细长体显示

雷达显示增益: 右键切 AGC/保幅 tpow/关, 纯显示重建不动原始数据

spec: 落地 导入->处理->渲染 全链路方案(结合 POC 评估), 定预渲染可选->混合渲染源(IVolumeRenderSource)决策
2026-06-30 18:58:42 +08:00
gaozheng 1e931e4f85 fix(radar): dd_radar_3d 补进 ddCode→维度映射(dimOf/dimensionOf) 2026-06-29 13:35:47 +08:00
gaozheng 25bdd5cc71 feat(radar): registerRadarDataset 登记 dd_radar_3d DS + loadVolume 懒加载后台建体 2026-06-29 13:05:02 +08:00
gaozheng a865264cd1 feat(radar): 数据层 createRadarVolumeGrid(规范化->VolumeGrid) 2026-06-29 12:53:45 +08:00
gaozheng eef8188bcb feat(3d): 色阶跨视图同步真源 + 三维体/切片白化与不透明度重做
- 跨视图色阶单一真源 DatasetViewState:2D详情/3D帘面体共用按dsId的色阶,编辑→真源
  →各视图实时联动且无信号回环;散点(type1) load-then-save 回写,避免覆盖网格的
  lineConfig/层级方案(共享同一条 businessCode="" 后端记录)。
- 色阶两级透明度:ColorScale.globalOpacity 独立存储不烘焙、渲染时与每色 alpha 相乘;
  对话框回显真实值、单色独立;properties 补全 lvlSchemeType/logLinesCount/
  equalAreaLayerCount,避免整条覆盖写清空;"整体透明度"改名"不透明度"、显示 0~100。
- 切片白化:SetWindowLevel 钉死 [vmin,vmax] + LUT 0号白化槽,哨兵真透明
  (tests/spike/slice_alpha_probe.cpp 真 widget 离屏实测);同时纠正切片颜色映射。
- 切片不透明度:与三维体解耦的独立模型(100%/三维体+50%/跟随),默认100%;保存切片建
  自己的色阶对象(颜色快照+不透明度),已保存切片走列表右键"色阶"编辑自身。
- 三维体白化:二值 mask 真白化(NoData 排除出插值,符合 ESRI/GDAL/Surfer 标准);改体
  色阶改为原地更新传函(不重建image),未保存切片不再被刷掉且跟随改色;GPU 探测+CPU
  回退;体不透明度归一为色阶"不透明度"单一控制(去 kMaxOpacity、移除工具条"透"滑块)。
- 持久化:网格视图补 saveColorGradation;DatasetChartDto.parseColorBar 回读 opacity。

详见 docs/superpowers/specs/2026-06-27-inversion-3d-volume-surfer-method-and-gaps.md §7。
2026-06-28 22:14:46 +08:00
gaozheng 4f6abf0c83 feat(3d-view): 三维体渲染稳定性修复 + 透明度可调/交互优化
- 修偶发"不渲染/淡蓝/很实"根因:合并体值域取"首个到达源色阶"随网络到达
  顺序抖动→改取所有源色阶 vmax 中位者(确定性+抗单线离群)
- 体素标量 double→float:GPU 体绘制对 double 处理不稳/间歇出空,float 更稳且省显存
- 源剖面加载瞬时失败(如后端 502)自动重试,避免一条抖动致整体建不出;失败弹 toast 不再静默
- 退化薄体(共面剖面 ny/nz=1)网格每维补到≥2,避免 vtkGPUVolumeRayCastMapper 拒绝渲染
- 三维体透明度可调:工具条「透」按钮+弹出滑块(默认 0.30,实时改已渲染体)
- 工具条 z 序修复:引导层挂 vtkWidget 并 raise,工具条/提示再 raise 其上(缩小渲染区不再被挡)
- 收起左栏同步 QSplitter 尺寸,消除残留空白
- 切换项目清空三维体/切片/异常列表
- VTK 警告/错误转 Qt 日志,不再弹独立 vtkOutputWindow 窗口
- 勾选非三维体 ds 首次加载也显示等待动画(复选框↔spinner)
- 新建三维体后该行多拍重试滚动到分析栏顶部
2026-06-27 18:32:07 +08:00
gaozheng fadcd12239 fix(gpr): 补 Api3dRepository::createGprVolume 声明 + 仓储透传 targetDy
HEAD 的 Api3dRepository.cpp 已定义 createGprVolume,但 .hpp 缺该声明
(成员定义无声明 → geopro_data 编译不过)。本提交补上声明,修复构建。

并把线内通道插值 targetDy(默认 2.5cm) 透传到 createGprVolumeGrid →
app 渲染链也得密 Y 体(与 io::gpr 桥同口径,0=不插值)。
2026-06-26 23:30:04 +08:00
gaozheng c1a824e292 fix(data): 二维维度分类对齐数据字典 DD0623(去已删除轨迹类型)
据数据字典 DD0623:足迹型 2D 只 dd_trajectory_data 为统一通用轨迹「保留」(已并入
dd_radar_rtk_trajectory);dd_transient_electromagnetic_trajectory_data / dd_radar_channel_trajectory /
dd_radar_rtk_trajectory 字典均标「删除」。dimensionOf(Api3d/LocalSample3d)从 4 种轨迹收敛为
dd_trajectory_data;同步更新测试。(dd_raster=本次新增 2D 栅格,与渲染一并放第二步)

测试:439/439 通过
2026-06-26 17:17:07 +08:00
gaozheng 3ed1ea75ac feat(3d): 异常样式接平台 legend(与平台一致,不依赖 mock 保存)
修正前一轮误判:异常样式("与平台一致")不依赖真后端保存链——getDetail/{id} 端点存在且返回 legend。
- 新增 getExceptionTypeDetail(typeId) → GET /business/exceptionType/getDetail/{id}(wireObject 取 data)
- AnomalySaveDialog 选中类型变化时拉其 legend,按形态(1点 pointColor / 2线·3面 polylineColor+Width+
  Shape→dashed)派生样式;首项自动预取
- main accept 后用 dlg.styleColor/Width/Dashed 覆盖默认(#ff3030/2/实线)→异常按平台类型样式渲染

注:真保存(newException)仍卡——实测真后端无任何登记三维体/切片为 dsObject 的端点(voxel/slice
generate 无、通用 dsObject create 也无),异常 remarkSourceId 无真实实体可指,是后端缺端点的硬依赖。

测试:通过
2026-06-26 11:00:34 +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 1742b7508b fix(data): 装置筛选空-parseDsRows 兼容对象形态 properties+顶层装置字段 + CLAUDE规则
诊断(自读日志[arrayfilter]):enum=15(枚举正常)但 row0[](行 properties 空)→装置值没进 row.properties。
DsObjectDataVO.properties 是泛型 JSON(可能对象而非数组),旧 parseDsRows 只 toArray()→对象形态丢空。
修:properties 数组/对象两种形态都解析;顶层 arrayType/arrayTypeName 也收为属性兜底。
另加 [dsrow-raw] 一次性打印首行原始 JSON,若仍空可据此精准定位装置字段实际位置。

生成位置下拉:combo 自身按内容加宽(对话框随之变宽)→ popup 宽=combo 宽,不再外溢出对话框。

CLAUDE.md:新增「能自己做的绝不让用户做」绑定规则——日志/数据/构建/诊断都自己来,只在 LNK1104
需关 app、或真正产品决策时才找用户。
2026-06-25 21:37:42 +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 a6cdd2ff80 feat(3d): createSlice 打印 SliceGenerateRequest 请求体到 log(供后端联调)
createVolume(req) 已打印 [volreq] 请求体;补 createSlice 打印 [slicereq] registerSlice 请求体
(对齐 SliceGenerateRequest / POST /business/dsObject/slice/generate):volumeDsId/name/axis/
三点位姿 origin·point1·point2/colorScaleId。projectId 由真实请求层据当前项目填(mock 无上下文留空)。

构建:app 链接通过
2026-06-25 17:36:48 +08:00
gaozheng 572fbf8d7b fix(ui): 容器节点紧凑卡(矮+居中+小留白)+所有段从项目根树形(自剪枝)+体/切片创建时间+筛选行去采集(日期前装置后) 2026-06-25 14:47:58 +08:00
gaozheng 888a63081b feat(ui): 三维体段从项目根完整层级树(容器节点+体挂归属)+段体右键菜单(详情/删除切片异常)(界面修复 4/5) 2026-06-25 11:50:17 +08:00
gaozheng beb398d478 fix(ui): 生成按钮移标题行+采集时间改时间段(不限)+切片不单列段(挂三维体树)(界面修复 3/4/5) 2026-06-25 09:34:19 +08:00
gaozheng d70590cbef feat(data): 逐线 GPR 体反量化适配器 + GprVolumeRepository
新增数据层方案A纯数据通道,把逐线 GPR 处理后 int16 量化体(io::gpr
buildLineVolumeFromGpr3dv 产 BuiltI16)反量化成 app 渲染链吃的稠密 float 体
(data::VolumeGrid),使真实雷达三维体可经现成 loadVolume->addVolume->buildVoxel
显示(替 mock),零碰并行会话 UI/树/异常热文件。

- builtI16ToVolumeGrid:纯函数适配器,逐体素 Quant::toPhys 反量化,
  kBlank 空值哨兵->NaN(下游 buildVoxel 映射透明),origin/spacing/vmin-vmax 搬运。
- createGprVolumeGrid(lineDir,linePrefix,coarse=4):走 P1/P2 链建逐线体->适配。
- 单测:适配器逐值反量化/维度/spacing/origin/kBlank->NaN;全链合成多通道
  .iprb 走真链产出有效 VolumeGrid;缺线抛异常。434 测试全过,无回归。
2026-06-25 09:06:15 +08:00
gaozheng b9a655126f feat: 装置类型枚举接口 listArrayTypes→填字典→段头装置下拉显示+过滤(Task12 #2) 2026-06-24 21:45:38 +08:00
gaozheng cfd242c106 feat: 异常双击详情接入三级树(anomalyById→AnomalyPropertiesDialog)(Task11 Step4b) 2026-06-24 21:24:48 +08:00
gaozheng 2f07e605c8 feat(app): 三维体段「体→切片/异常」三级树注入 + 异常排除渲染勾选 + 创建异常即时进树(Task11 Step4a) 2026-06-24 20:59:21 +08:00
gaozheng 07be3aef21 feat(data): Api3dRepository.anomalyRows 按 remarkSourceId 供三级树注入(Task11 Step2) 2026-06-24 20:45:55 +08:00
gaozheng 52830bbcb0 feat(core): Anomaly volumeDsId→remarkSourceId(挂体/切片)+resolveAnomalyMount+修正spec/plan命名(Task11 Step1) 2026-06-24 20:37:45 +08:00
gaozheng a06d9e83f8 feat(data): createVolume(VoxelGenerateRequest) 重载+fromRequest 派生+请求体打印(mock) 2026-06-24 19:24:39 +08:00
gaozheng 30e990d967 feat(ui): CategorySection 类型段组件(段头装置/日期筛选+段体可勾选树+生成入口) + DatasetFieldDictionary 缓存类 2026-06-24 19:10:03 +08:00
gaozheng c5b3907fad feat(data): DatasetFieldDictionary 解析 arrayType/collectTime 映射+装置字典(纯函数) 2026-06-24 18:08:45 +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 f00a2143a2 feat(data): VoxelGenerateRequest/SliceGenerateRequest DTO + toJson 2026-06-24 17:52:33 +08:00
gaozheng 07cf75d967 feat(app): CategoryConfig 映射表 + splitByCategory 按 dsTypeCode 分大类 2026-06-24 17:48:47 +08:00
gaozheng 5a719ca16d feat(data): DsRow 加 dsTypeCode/properties + parseDsRows 解析 2026-06-24 17:40:49 +08:00
gaozheng 8edc1f30ac feat(vtk): build-geo 按真实RTK几何把多线拼成统一路向三维体
新增 GpsTrack(.gps解析+经纬→局部米+里程插值/航向) 与 GeoVolumeBuilder
(PCA路向旋转+多线统一网格重叠均值+量化落盘), gpr_poc 加 build-geo 子命令。
消除顺序拼接退化扁带: 真实明星路20线建体 4474x52x82(≈预测4472x43x81),
填充率62%, 旋转-89.5°, 峰值内存258MB, 各轴≤16384整卷单纹理可渲。
复用 readIprb/IprHeader/GprGeometry/ChunkedVolumeStore/Quant, 未重造IO/store。
2026-06-24 12:34:07 +08:00
gaozheng 77cbe4a305 feat(store): 流式金字塔 buildPyramidStreaming 逐块由盘上邻块降采样
level L 每块由 level L-1 的 ≤2×2×2 邻块(readBrick 从盘读)降采样 + 逐块增量写
data_L<L>.bin 得到,不重组整卷,任意时刻只持几个邻块+一个块,内存有界。

复用 buildPyramid 同一降采样核(downsampleVoxel 2×2×2 非 blank 平均 round、
全 blank→kBlank)、computeRange 与 finalizePyramidMeta 收尾(DRY),产出各级
dims/每块体素/min-max/hasRange/meta 与 buildPyramid 逐块一致。

测试:Pyramid.StreamingMatchesInRam 系列(128 整除、100/127 非整除奇数、
70×33×50 各向异性小 brick、全 blank 体)流式 vs 重组整卷逐块对拍;不破坏
buildPyramid/write/readBrick(store/streaming/pyramid 20 例全绿)。
2026-06-24 07:37:53 +08:00
gaozheng 4bb846cf07 feat(data): 流式建体 buildGprVolumeStreaming(沿X分slab,内存有界)
沿X按brick对齐分slab逐块建level0体:assembleGprSurveySlab→共享采样核
sampleGprPoint→writeBrick→释放,峰值内存只随单slab,不持整卷。产出与非流式
buildGprVolume+ChunkedVolumeStore::write逐brick+meta完全一致(对拍守护)。

- 真DRY:抽buildGprVolume的逐点采样核(X/Z落格+Y向1D插值+quant.toQ)为共享自由
  函数geopro::core::sampleGprPoint,整卷版与流式版同调,零漂移;原对拍测试守护
  buildGprVolume公开行为不变。
- 依赖方向:StreamingVolumeBuilder置src/data,命名空间geopro::data,编进
  geopro_store(store增链geopro_io_gpr;io_gpr仅依赖core,无环),core保持纯净。
- 全局量化一致:扫全线全部道tile定vmin/vmax(每次只持一道块),scale/offset与
  buildGprVolume同式,逐体素量化一致。
- B3 MEDIUM:StreamingVolumeWriter改持久ofstream成员(构造开/writeBrick复用/
  finalize关),消除每块open/close;同步更新对应回归测试的writer作用域。
2026-06-23 22:18:45 +08:00
gaozheng 5ffc784792 feat(store): ChunkedVolumeStore 增量写 StreamingVolumeWriter
逐块增量写 level0 store,建体不必持有整卷。产出与非流式 write 逐 brick + meta
完全一致:data.bin 逐块 qCompress 追加(块按 finalize 时固定顺序 bz 最慢/bx 最快
索引),meta.json 结构同 write,故 ChunkedVolumeStore/readBrick 可照常读;偏移 64 位。

DRY 复用 write 的压缩/索引/meta 序列化逻辑(compressBrick/brickIndexJson/
writeMetaGeometry)。约定:每块只写一次(重复抛),缺块 finalize 抛,体素数不符抛。

核心测试 test_streaming_write.cpp:流式(乱序写)vs 非流式 write 逐块对拍 + meta
一致;含重复/缺块/尺寸不符三类错误用例。不破坏 write/readBrick/buildPyramid 现有行为。
2026-06-23 21:50:59 +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 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 86e2b6b8a8 fix(store): brickRange 用 hasRange 标志替代 (0,0) 哨兵
(0,0) 是合法值域(真实全零块,kBlank=INT16_MIN 非 0),旧实现用
(vmin==0&&vmax==0) 当未计算哨兵会误判,导致全零块每次 brickRange
都无谓解压重算,且 buildPyramid 后仍走惰性。

- BrickEntry 加 bool hasRange 显式标志
- brickRange: hasRange 真→直接返回;假→惰性算并就地缓存(mutable levels_)
- meta.json 序列化/反序列化带 hasRange(老 store 缺字段→false,惰性兼容)
- buildPyramid 回填值域时一并置 hasRange=true
- 补测试:真实全零块 brickRange 返回 (0,0) 不退化(金字塔/老 store 两路)
2026-06-23 12:02:17 +08:00
gaozheng 687edfeca1 feat(store): ChunkedVolumeStore 增加多分辨率金字塔与每块 min/max
- buildPyramid(levels): level 0 全分辨率(复用 data.bin),level 1..levels
  逐级 2x 平均降采样(ceil(n/2));非 blank 取均值 round,全 blank 置 kBlank。
  各级独立 data_L<level>.bin + 逐块 qCompress。
- 每级每块计算并存 (min,max)(跳过 kBlank;全 blank 块 = (kBlank,kBlank)),
  写入 meta.json 的 levels 数组并回填原 bricks 索引。
- 新增 levels()/bricksX|Y|Z(level)/dims(level)/readBrick(level,...)/
  brickRange(level,...);保留兼容重载 readBrick(bx,by,bz)==readBrick(0,...)。
- 不破坏 Task 6/8:write/readBrick(bx,by,bz)/meta/bricksXYZ() 语义不变;
  老 store 无 levels 时 levels()=1,brickRange(0,...) 惰性读块计算。
2026-06-23 11:52:47 +08:00
gaozheng d908556166 feat(store): GPR 三维体分块压缩落盘 ChunkedVolumeStore
新增 geopro_store 库(B/C 方案共用基座):int16 体逐块 qCompress 压缩写入
data.bin + nlohmann-json sidecar(meta.json 记几何/量化/逐块偏移索引)。
write/readMeta/readBrick 三接口 + 边缘块(< brick)支持;偏移/长度全程 64 位。
不引入 vtkHDFWriter,不加 vcpkg 依赖(压缩用 QtCore 自带 zlib)。
2026-06-23 11:00:47 +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 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 b97ea68109 feat(vtk): 三维体/切片数据详情对话框(#6)-右键属性表+体统计持久化
- VolumePropertiesDialog/SlicePropertiesDialog 只读属性对话框(仿异常详情)
- Api3dRepository::volumeInfo 取参数+统计;StoredVolume 持久化聚合测点数(finalizeVolume)
- main.cpp 右键「数据详情」按 ddCode 分派(dd_voxel→体/dd_slice→切片);接口与 LocalSample 零改动
- 切片不含统计(切面网格仓储不持久化,守 YAGNI);体统计仅 loaded 时显示,否则占位
- 单测 +2(volumeInfo loaded前/未知id) → 230/230 绿
2026-06-18 20:28:15 +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