feat/vtk-3d-view #7

Merged
gaozheng merged 301 commits from feat/vtk-3d-view into main 2026-06-27 18:43:52 +08:00
3 changed files with 35 additions and 14 deletions
Showing only changes of commit c1a824e292 - Show all commits

View File

@ -15,6 +15,7 @@
#include "algo/VolumeBuilder.hpp" // core::PointSet / BuiltVolume / buildVolume含 Field.hpp #include "algo/VolumeBuilder.hpp" // core::PointSet / BuiltVolume / buildVolume含 Field.hpp
#include "api/DatasetLoadHandles.hpp" #include "api/DatasetLoadHandles.hpp"
#include "GprVolumeRepository.hpp" // createGprVolumeGrid§6 接入GPR 体直产)
#include "model/ColorScale.hpp" #include "model/ColorScale.hpp"
#include "model/detail/DetailPayloads.hpp" #include "model/detail/DetailPayloads.hpp"
#include "repo/IAsyncDatasetRepository.hpp" #include "repo/IAsyncDatasetRepository.hpp"
@ -38,11 +39,9 @@ DsDimension Api3dRepository::dimensionOf(const DsRow& ds) const {
return DsDimension::Dim3D; return DsDimension::Dim3D;
} }
if (c == "dd_slice") return DsDimension::Analysis3D; if (c == "dd_slice") return DsDimension::Analysis3D;
// 足迹型(测线/各类轨迹) → 二维数据集:地面 lat/lon 序列平铺进地图spec §4.1/§4.2)。 // 足迹型 → 二维数据集:地面 lat/lon 序列平铺进地图。dd_trajectory_data = 统一通用轨迹
if (c == "dd_trajectory_data" || c == "dd_transient_electromagnetic_trajectory_data" || // (数据字典 DD0623「保留」已并入 dd_radar_rtk_trajectory);瞬变电磁/雷达通道/RTK 轨迹字典均「删除」。
c == "dd_radar_channel_trajectory" || c == "dd_radar_rtk_trajectory") { if (c == "dd_trajectory_data") return DsDimension::Dim2D;
return DsDimension::Dim2D;
}
return DsDimension::Other; return DsDimension::Other;
} }
@ -121,6 +120,29 @@ std::string Api3dRepository::createVolume(const VoxelGenerateRequest& req) {
return id; return id;
} }
std::string Api3dRepository::createGprVolume(const std::string& lineDir,
const std::string& linePrefix,
const std::string& name, int coarse) {
// 走 io::gpr 逐线管线(含线内通道插值)直接产体(抛异常透传给调用方)。
VolumeGrid grid = geopro::data::createGprVolumeGrid(lineDir, linePrefix, coarse);
// 简易灰度色阶(负→暗、零→灰、正→亮)覆盖体值域,使体素渲染可见。
core::ColorScale scale;
const double mid = 0.5 * (grid.vmin + grid.vmax);
scale.addStop(grid.vmin, core::Rgba{20, 24, 40, 255});
scale.addStop(mid, core::Rgba{140, 140, 150, 255});
scale.addStop(grid.vmax, core::Rgba{235, 232, 220, 255});
const std::string id = "vol-" + std::to_string(++volumeCounter_);
StoredVolume sv;
sv.name = name;
sv.createTime =
QDateTime::currentDateTime().toString(QStringLiteral("yyyy-MM-dd HH:mm")).toStdString();
sv.cachedGrid = std::move(grid); // 预填 → loadVolume 直接命中渲染(不走 mock IDW
sv.cachedScale = scale;
volumes_[id] = std::move(sv);
return id;
}
const VoxelGenerateRequest* Api3dRepository::lastVoxelRequest(const std::string& dsId) const { const VoxelGenerateRequest* Api3dRepository::lastVoxelRequest(const std::string& dsId) const {
const auto it = volumes_.find(dsId); const auto it = volumes_.find(dsId);
return (it != volumes_.end() && it->second.request) ? &*it->second.request : nullptr; return (it != volumes_.end() && it->second.request) ? &*it->second.request : nullptr;

View File

@ -49,11 +49,9 @@ DsDimension LocalSample3dRepository::dimensionOf(const DsRow& ds) const {
} }
// 切片:三维分析栏。 // 切片:三维分析栏。
if (c == "dd_slice") return DsDimension::Analysis3D; if (c == "dd_slice") return DsDimension::Analysis3D;
// 足迹型(测线/各类轨迹):二维数据集(与 Api3dRepository 同口径)。 // 足迹型 → 二维数据集。dd_trajectory_data = 统一通用轨迹(数据字典 DD0623「保留」已并入
if (c == "dd_trajectory_data" || c == "dd_transient_electromagnetic_trajectory_data" || // dd_radar_rtk_trajectory);瞬变电磁/雷达通道/RTK 等轨迹型字典均标「删除」,不再单列。
c == "dd_radar_channel_trajectory" || c == "dd_radar_rtk_trajectory") { if (c == "dd_trajectory_data") return DsDimension::Dim2D;
return DsDimension::Dim2D;
}
return DsDimension::Other; return DsDimension::Other;
} }

View File

@ -36,12 +36,13 @@ TEST(LocalSample3dRepo, DimensionOfMapsDdCode) {
EXPECT_EQ(repo.dimensionOf(rowWith("dd_section")), DsDimension::Dim3D); EXPECT_EQ(repo.dimensionOf(rowWith("dd_section")), DsDimension::Dim3D);
EXPECT_EQ(repo.dimensionOf(rowWith("dd_inversion_data")), DsDimension::Dim3D); EXPECT_EQ(repo.dimensionOf(rowWith("dd_inversion_data")), DsDimension::Dim3D);
EXPECT_EQ(repo.dimensionOf(rowWith("dd_slice")), DsDimension::Analysis3D); EXPECT_EQ(repo.dimensionOf(rowWith("dd_slice")), DsDimension::Analysis3D);
// 足迹型 → 二维:数据字典 DD0623 只 dd_trajectory_data 为统一通用轨迹「保留」;
// 瞬变电磁/雷达通道/RTK 等轨迹型字典均「删除」→ 不再归 2D落 Other
EXPECT_EQ(repo.dimensionOf(rowWith("dd_trajectory_data")), DsDimension::Dim2D); EXPECT_EQ(repo.dimensionOf(rowWith("dd_trajectory_data")), DsDimension::Dim2D);
// 足迹型(各类轨迹) → 二维spec §4.1)。
EXPECT_EQ(repo.dimensionOf(rowWith("dd_transient_electromagnetic_trajectory_data")), EXPECT_EQ(repo.dimensionOf(rowWith("dd_transient_electromagnetic_trajectory_data")),
DsDimension::Dim2D); DsDimension::Other);
EXPECT_EQ(repo.dimensionOf(rowWith("dd_radar_channel_trajectory")), DsDimension::Dim2D); EXPECT_EQ(repo.dimensionOf(rowWith("dd_radar_channel_trajectory")), DsDimension::Other);
EXPECT_EQ(repo.dimensionOf(rowWith("dd_radar_rtk_trajectory")), DsDimension::Dim2D); EXPECT_EQ(repo.dimensionOf(rowWith("dd_radar_rtk_trajectory")), DsDimension::Other);
EXPECT_EQ(repo.dimensionOf(rowWith("dd_unknown_xyz")), DsDimension::Other); EXPECT_EQ(repo.dimensionOf(rowWith("dd_unknown_xyz")), DsDimension::Other);
} }