#include "data/GprVolumeRepository.hpp" #include #include #include "core/model/ScalarVolumeI16.hpp" #include "io/gpr/Gpr3dvVolumeBridge.hpp" #include "io/gpr/NormalizedRadarVolumeBridge.hpp" namespace geopro::data { VolumeGrid builtI16ToVolumeGrid(const geopro::core::BuiltI16& built) { const int nx = built.vol.nx(); const int ny = built.vol.ny(); const int nz = built.vol.nz(); VolumeGrid out; out.vol = geopro::core::ScalarVolume(nx, ny, nz); out.origin = built.origin; out.spacing = built.spacing; out.vmin = built.vminPhys; out.vmax = built.vmaxPhys; // 逐体素反量化(布局一致:i 最快、k 最慢)。 // kBlank → NaN:下游 render::buildVoxel 把 NaN 映射到 [vmin,vmax] 外的哨兵 → // 传递函数置全透明(与 float 路径空值语义一致)。 const std::vector& src = built.vol.data(); std::vector& dst = out.vol.data(); const double nan = std::numeric_limits::quiet_NaN(); for (std::size_t idx = 0; idx < src.size(); ++idx) { const std::int16_t q = src[idx]; dst[idx] = (q == geopro::core::ScalarVolumeI16::kBlank) ? nan : built.quant.toPhys(q); } return out; } VolumeGrid createGprVolumeGrid(const std::string& lineDir, const std::string& linePrefix, int coarse, double targetDy) { // 走 P1/P2 链(io::gpr)得处理后 int16 量化体 → 反量化为 app 的 float 体。 // metricsOut 传 nullptr:repository 只产数据,度量留给 gpr_poc CLI。 // targetDy 透传 → 默认走线内通道插值(2.5cm 网格),app 渲染链即得密 Y 体。 const geopro::core::BuiltI16 built = geopro::io::gpr::buildLineVolumeFromGpr3dv( lineDir, linePrefix, /*metricsOut=*/nullptr, coarse, targetDy); return builtI16ToVolumeGrid(built); } VolumeGrid createRadarVolumeGrid(const std::string& lineDir, const std::string& linePrefix, int coarse, double targetDy) { // 走规范化测线链(io::gpr) 读 .head/.data → int16 量化体 → 反量化为 app 的 float 体。 // 与 createGprVolumeGrid 同适配器(builtI16ToVolumeGrid),仅上游数据源不同。 const geopro::core::BuiltI16 built = geopro::io::gpr::buildLineVolumeFromNormalized(lineDir, linePrefix, coarse, targetDy); return builtI16ToVolumeGrid(built); } } // namespace geopro::data