Commit Graph

354 Commits

Author SHA1 Message Date
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 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 4e2bdc3b81 feat(gpr): build-line 健壮支持任意测线 + 新增 build-all 批量建体(磁盘守护/coarse 下采样)
- 桥接 buildLineVolumeFromGpr3dv 增 coarse 参数:沿测线(道/X 轴)按步长下采样,
  spacing.x ×stride 保持真实世界尺度;通道/样本保留全分辨率。默认 coarse=1 全分辨率,
  对现有调用与测试零影响。
- build-line 增 --coarse F;单线建体核心抽出 buildOneLine,加体维度退化守护
  (短桩线 nx<2 等报因跳过不落盘),整条 try/catch 不崩。
- 新增 build-all <lineDir> --outBase <baseDir> [--levels N] [--coarse F]
  [--minFreeGB G]:扫 *_A<NN>.iprh 发现全部测线,逐条建到 baseDir/<line>/;
  每条建前查磁盘剩余,低于阈值(默认 3G)停并报已建哪些;单条异常捕获跳过不中断批量;
  末尾打印各线状态(成功/跳过+因/维度/大小)与合计占用。
- 通道/道/样本全从数据读,不写死;不破坏现有 gpr/bridge 测试(12/12 通过)。
2026-06-25 08:42:31 +08:00
gaozheng b9a655126f feat: 装置类型枚举接口 listArrayTypes→填字典→段头装置下拉显示+过滤(Task12 #2) 2026-06-24 21:45:38 +08:00
gaozheng a41b428b09 feat: VolumeParamsDialog 扩展-左侧源列表(可增删)+生成位置下拉(GS/TM)+req归属(Task12 #4) 2026-06-24 21:37:33 +08:00
gaozheng cfd242c106 feat: 异常双击详情接入三级树(anomalyById→AnomalyPropertiesDialog)(Task11 Step4b) 2026-06-24 21:24:48 +08:00
gaozheng 1d744bab81 feat(app): 对象树拉取改 checkedSourcesChanged+confType 分流(支持 GS 直挂 ds)(Task12 #1) 2026-06-24 21:13:28 +08:00
gaozheng 6edfad9a2f feat(app): VtkViewToolbar 接入中央画布(view/zoom/fit + axesSettings 弹窗)(Task12 工具条) 2026-06-24 21:10:09 +08:00
gaozheng 2f07e605c8 feat(app): 三维体段「体→切片/异常」三级树注入 + 异常排除渲染勾选 + 创建异常即时进树(Task11 Step4a) 2026-06-24 20:59:21 +08:00
gaozheng a32822f7d6 feat(gpr3dv): 桥接处理后立方体→geopro量化/分块/VTK体绘制(P2 渲第一条线真三维体)
把 gpr3dv(P1)处理链产出的处理后立方体桥接到 geopro 已有的量化+ChunkedVolumeStore
+VTK 体绘制,渲出第一条线(明星路_001)的真三维体。算法零改动,仅复用 geopro 量化/
store/渲染。

- 新增桥接 src/io/gpr/Gpr3dvVolumeBridge.{hpp,cpp}(独立 target geopro_gpr3dv_bridge,
  不污染纯 C++17 解析层):走 P1 原版 API load→buildVolumeData→runPipeline(默认链)
  →再 buildVolumeData(处理后),得 volumeData[通道][道][样本];轴映射 X=道/Y=通道/
  Z=样本;扫值域定 Quant(offset=中点);世界 spacing(dx=道距/dy=通道横距/dz=深度采样距)。
- gpr_poc 加子命令 build-line <lineDir> <linePrefix> --out <store> [--levels N]:
  桥接→ChunkedVolumeStore::write+buildPyramid,报维度/量化/spacing/内存/耗时;view 渲。
- 测试 tests/io/gpr/test_gpr3dv_volume_bridge.cpp:合成 2 通道 Impulse 测线走真链,
  校验轴映射/spacing/量化(offset=中点)/稠密体无 kBlank/缺线抛异常。

真实数据验收(明星路_001):体维度 45305×14×796(道×通道×样本,样本由 821 经零时校正
裁至 796),处理后值域[-9249,9206] scale=0.288 offset=-21.5,spacing dx=0.049/dy=0.105/
dz=0.0101m,落盘 845MB 压缩比 1.14x;view --preview/--base 渲出无纹理错、整卷盖全。
全量测试通过。
2026-06-24 20:50:10 +08:00
gaozheng 8b57dd9679 feat(app): 创建异常按所在切片是否已保存挂体/切片(resolveAnomalyMount, Task11 Step3) 2026-06-24 20:49:19 +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 901c84e0ae feat(app): 接通对象树→splitByCategory→三维分析5段数据流+勾选分流渲染+生成入口(Task12 阶段A) 2026-06-24 19:49:18 +08:00
gaozheng a06d9e83f8 feat(data): createVolume(VoxelGenerateRequest) 重载+fromRequest 派生+请求体打印(mock) 2026-06-24 19:24:39 +08:00
gaozheng 3af7e44722 feat(ui): VtkViewToolbar 画布工具条 + AxesSettingsDialog 坐标轴设置 2026-06-24 19:18:34 +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 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 509ba35a47 feat(geo): build-geo 新增中心线曲线坐标网格化(--curvilinear)+距离加权
取最长线 GPS 轨迹作中心线,把每点投影得(沿路里程 s,带符号横偏 d),
网格 X=s/Y=d/Z=深度,把弯路拉直消假鳍;横向范围用带符号 d 的[1%,99%]分位
(鲁棒于离群桩线、不浪费空白半侧);重叠按到 cell 中心的距离加权(w=1/(1+d^2))
代替等权均值。保留 PCA 版供对照(curvilinear 默认 false)。

GpsTrack 新增 projectToCenterline/resampleAndSmooth(纯函数,含直/弯线单测);
GeoVolumeBuilder 新增 distanceWeight 纯函数。

真实数据(明星路 20 线,cellXY 0.5):曲线版 4487x45x82 填充 68.8%,
PCA 版 4474x52x82 填充 62.2% —— ny 更小(拉直)、填充更密、假鳍明显减少。
2026-06-24 15:24:59 +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 fb944f706f feat(vtk): 常驻粗底图+局部高清叠加(永不空白)
ViewAdaptiveVolumeSource 构造时一次性在主线程建整卷最粗「各轴≤16384」层
单纹理底图 baseImage(),永远持有、永不释放、绝不被异步路径触碰——任何视角/
任何运动中底图都盖住整个体,拖动/缩放绝不空白。高清(currentImages)异步重组
当前视野后叠在底图之上局部覆盖,未就绪时只显底图。gpr_poc view 用两个 vtkVolume
(底图先渲、高清叠加),新增 --preview --base 出整卷概览底图截图。为 morph(C3-4)/
运动跟踪(C3-7)打两层结构。
2026-06-24 12:03:10 +08:00
gaozheng ced2ca7811 feat(render): AsyncRegionBuilder 就绪缓存LRU+预取+相同目标短路
C3-3:为 AsyncRegionBuilder 加按 RegionTarget 键的有界 LRU 就绪缓存
(容量N默认6)、prefetch 后台低优先预取(不抢占主目标)、getReady 非阻塞
缓存命中,并短路 requestTarget 相同目标(修 C3-2 LOW)。worker 每轮主
目标优先,否则建预取队列最新;缓存/refcount 增减全在锁内,析构干净 join。
ViewAdaptiveVolumeSource:updateView 提交主目标后预测下一目标(细一层
同区+沿相机方向平移一格 brick 列)并 prefetch;currentImages 走
getReady(主目标)命中即用否则沿用上一张。线程安全延续 C3-1。
2026-06-24 10:37:12 +08:00
gaozheng cec41e3539 feat(vtk): ViewAdaptive 接异步重组(update 不阻塞,view 拖动不卡)+修 C2 维度用 store.dims
把 C3-1 AsyncRegionBuilder 接进 ViewAdaptiveVolumeSource:updateView 只提交目标
(selectLod→RegionTarget→requestTarget),不在主线程重组、立即返回;currentImages/
sliceSource 经 builder.takeLatest 取最新已就绪(没新结果用上一张),空选区不提交、
保留上一张。新增 AsyncRegionBuilder::takeLatest(int&) 非破坏式重载随结果回传 level,
供 lastLevel 同步。

C2 MEDIUM:RegionReorganizer 维度改用 store.dims(level)(单一真源),弃自算
ceil(n/2^level),防 store 降采样规则漂移。

gpr_poc view 切异步:拖动中 InteractionEvent 持续提交目标(非阻塞)+33ms 重复定时器
非阻塞拉取后台就绪纹理换上→主线程不被重组卡住(跟手);preview/smoke/默认取景用
阻塞轮询保证拿到首图。

测试:ViewAdaptive 9 测(原 6 调为异步轮询版+新增 3:AsyncUpdateEventuallyReady/
UpdateDoesNotBlock(<50ms)/UsesStoreDimsNotSelfComputed),AsyncRegionBuilder 5 测仍绿;
全量 382 测通过。
2026-06-24 10:22:22 +08:00
gaozheng fa34cb0bc3 feat(render): C3-1 AsyncRegionBuilder 后台异步重组 + 双缓冲交接
抽公共重组核 reorganizeRegion(RegionReorganizer.{hpp,cpp})为单一真源:
C2 ViewAdaptiveVolumeSource 改委托、C3 AsyncRegionBuilder 也调它(真 DRY)。

AsyncRegionBuilder:后台 worker 调重组核构建 vtkImageData,主线程非阻塞
takeLatest 取最新就绪;requestTarget supersede 收敛最新不堆积。线程安全:
vtkImageData refcount 增减全在 mutex 内/单线程独占,析构置 stop 唤醒干净 join。

测试:5 个异步用例(同步一致/supersede 收敛/析构忙时干净 join/并发 400 次不崩
不死锁/takeLatest 非阻塞)全绿;C1+C2 的 17 个 ViewAdaptive* 抽核后回归全绿。
2026-06-24 09:56:55 +08:00
gaozheng fc9ea58cb5 feat(vtk): ViewAdaptiveVolumeSource 视野区域单纹理重组(C2)
用 C1 selectLod 选层选区,从 ChunkedVolumeStore 把当前视野区域重组为单张
VTK_SHORT vtkImageData(各轴 ≤16384,世界 origin/spacing 按 level+exagg),实现
IVolumeRenderSource。核心 updateView(CameraView,VolumeView) headless 可测。
gpr_poc view 切到该源(退掉 MultiBlock/budget 简化路径),--preview 渲默认视角存
PNG,--smoke 离屏不崩且 LOD 随缩放切换。
2026-06-24 09:24:31 +08:00
gaozheng 0da5accebe fix(lod): selectLod 最粗层兜底裁剪,保证返回区间恒不超 maxTextureDim
最粗层 fits||maxLevel 分支原先无条件返回,不校验 fits;合并体最粗层
全可见区间仍 >maxTextureDim 时返回区间会突破单纹理硬上限,C2 重组撞
GL 16384 纹理墙退回慢路。

新增 clampAxisToMaxTexture,在所有返回路径前按可见中心对称裁三轴到
重组单纹理各轴 <= maxTextureDim 的子区间;brick 本身 > maxTextureDim
的退化情形返回单块并由 C2 体素级再裁(契约见 hpp)。补 3 例边界测试
(brick>maxTextureDim、最粗层整卷超限、改写 RespectsMaxTextureDimAlways
为 brick!=maxTextureDim),原有用例全绿。
2026-06-24 09:09:01 +08:00
gaozheng fa348a2a9f feat(render): C1 视野自适应 LOD 选层(纯逻辑 headless)
selectLod(VolumeView,CameraView,maxTextureDim=16384)→LodSelection:
透视相机参数构 5 视锥面(左/右/上/下/近),保守 p-vertex 裁剪求该层可见
brick 区间;按 worldPerPixel 定最细不过采样层 Lmin,再逐级变粗直到区间
重组单纹理各轴 ≤maxTextureDim。远观→粗层整卷、近观→细层小块、视锥外→empty。
零 VTK/Qt 依赖,与 OutOfCoreSource 几何约定一致(level L 间距×2^L、维度 ceil(n/2^L))。
10 例 headless 单测覆盖远/近/侧/视锥外/极小 maxTextureDim/视距-层单调。
2026-06-24 08:57:32 +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 81e18ebd2d feat(gpr): 加 assembleGprSurveySlab 装配道区间 slab
只装配 [t0,t1) 道段的 GprSurvey,各通道用 readIprbRange 只读该段,
内存只随 slab 大小。x0=t0*dx 使 slab 世界 X 与全线对齐(B4 拼接靠此)。
抽公共 assembleFromScans helper 复用校验/标尺/Y 升序置换/值转置,
不改 assembleGprSurvey 公开行为。新增 slab 对拍与越界/通道数测试。
2026-06-23 21:37:56 +08:00
gaozheng c2ec1d34b4 feat(io): IprbReader 新增 readIprbRange 道区间读取
只 seek 并读取 [t0,t1) 道,不载全文件,供流式 slab 装配内存有界。
偏移与读取字节数全 64 位防大文件溢出;越界与文件打不开抛 std::runtime_error。
不改动 readIprb 现有行为。
2026-06-23 21:29:13 +08:00
gaozheng e62e2cdc8d fix(vtk): 切项目复位重锚标志,修底图清空后再选不重显的回归
上一改 basemap->hide() 引入回归:切项目后再次勾选数据集,底图不再渲染。
根因:勾选是增量渲染、不走 VtkSceneView::clear(),frameAnchoredToData_ 残留为
旧项目的 true → anchorFrameIfNeeded 直接 return 不重锚 → onFrameReanchored 不触发
→ 被 hide() 的底图永不再 show(hide 前底图一直挂着才显得"正常")。
修:VtkSceneView 加 resetFrameAnchor(),clearCentral 中 hide() 前复位 →
新项目首个数据重锚→onFrameReanchored→底图按新项目位置重显。

build all 绿,341/341。
2026-06-23 19:17:11 +08:00
gaozheng 251046f885 fix(vtk): 切项目 clearCentral 补清底图瓦片(basemap->hide)
切项目时帘面/体素/切片/2D足迹已清,但底图瓦片(锚在旧项目地理位置)残留。
clearCentral 增 basemap->hide() 移除全部瓦片;新项目数据到来 onFrameReanchored
按新位置重显。至此切项目中央区(三栏+渲染图元+底图)全部清空。

build all 绿,341/341。
2026-06-23 19:06:52 +08:00
gaozheng 27905511e6 fix(vtk): 空态浮层钳进视图不溢出+文案更新;切项目清空中央区
- CenterOverlay::reposition 钳制浮层尺寸≤host、偏移取非负,缩小子视图时不再超界;
  空态标题/提示改为与当前功能一致(勾选左侧三维/二维/三维分析栏数据集渲染),标签换行
- 切换项目(topBar projectSwitchRequested / ProjectListDialog projectChosen,带 id≠当前
  守卫避开 delete-refresh)先 clearCentral:清三栏(col3D/col2D/colAnalysis setDatasets({}))
  + 清勾选集(checkedProfiles/Analysis/Slice)下发空到 VTK(pushChecked/syncSlices/
  setChecked2DDatasets({})) + 恢复空态浮层

build all 绿,341/341。
2026-06-23 18:56:40 +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 2beb97fa73 feat(vtk): 核外分块体绘制 OutOfCoreSource + renderC 基准(POC-C 命门探针)
OutOfCoreSource 实现 IVolumeRenderSource:相机选 LOD + 视锥裁剪选视野块 →
BrickPager(LRU,内存恒定)→ 每块 ≤64³ vtkImageData(带世界坐标)。renderC 用
vtkMultiBlockVolumeMapper 渲染工作集,绕开 GL_MAX_3D_TEXTURE_SIZE(16384)单轴墙。

实测(单线 store nx=44476>16384,renderB INVALID):
- 分块核外真渲出(非空像素,无纹理维度错),对照 renderB 整卷上传失败。
- 内存恒定:budget=64 驻留 64 块 / 220MB,与体总量无关。
- 静态工作集 9.5 fps;动态换页 1.45 fps(qUncompress 解压+每帧重建 mapper 177ms/帧,
  撞墙);fps 随块数近似反比劣化(256 块 0.47 fps)。结论与缓解见 poc-results-C.md。

含单元测试(纹理安全/budget 恒定/块世界坐标)。
2026-06-23 15:07:09 +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