From a06d9e83f83b6f2521e83d48453c85a1ded9d455 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Wed, 24 Jun 2026 19:24:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(data):=20createVolume(VoxelGenerateRequest?= =?UTF-8?q?)=20=E9=87=8D=E8=BD=BD+fromRequest=20=E6=B4=BE=E7=94=9F+?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E4=BD=93=E6=89=93=E5=8D=B0(mock)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/api/Api3dRepository.cpp | 14 ++++++++++++++ src/data/api/Api3dRepository.hpp | 6 ++++++ src/data/dto/Vtk3dRequests.cpp | 13 +++++++++++++ src/data/dto/Vtk3dRequests.hpp | 4 ++++ tests/data/test_vtk3d_requests.cpp | 22 ++++++++++++++++++++++ 5 files changed, 59 insertions(+) diff --git a/src/data/api/Api3dRepository.cpp b/src/data/api/Api3dRepository.cpp index 0e7b0fb..64a90f7 100644 --- a/src/data/api/Api3dRepository.cpp +++ b/src/data/api/Api3dRepository.cpp @@ -1,6 +1,7 @@ #include "api/Api3dRepository.hpp" #include +#include #include #include #include @@ -106,6 +107,19 @@ std::string Api3dRepository::createVolume(VolumeBuildParams params, const std::s return id; } +std::string Api3dRepository::createVolume(const VoxelGenerateRequest& req) { + const std::string id = createVolume(fromRequest(req), req.name); // 复用 mock 存储 + 惰性插值 + if (auto it = volumes_.find(id); it != volumes_.end()) it->second.request = req; + qInfo().noquote() << "[volreq] createVolume 请求体:" + << QJsonDocument(req.toJson()).toJson(QJsonDocument::Compact); + return id; +} + +const VoxelGenerateRequest* Api3dRepository::lastVoxelRequest(const std::string& dsId) const { + const auto it = volumes_.find(dsId); + return (it != volumes_.end() && it->second.request) ? &*it->second.request : nullptr; +} + std::vector Api3dRepository::volumeRows() const { std::vector rows; rows.reserve(volumes_.size()); diff --git a/src/data/api/Api3dRepository.hpp b/src/data/api/Api3dRepository.hpp index d0eb9ba..58b5e81 100644 --- a/src/data/api/Api3dRepository.hpp +++ b/src/data/api/Api3dRepository.hpp @@ -7,6 +7,7 @@ #include #include +#include "dto/Vtk3dRequests.hpp" #include "geo/GeoLocalFrame.hpp" #include "repo/I3dSceneRepository.hpp" #include "repo/VolumeBuildParams.hpp" @@ -39,6 +40,10 @@ public: // ── 客户端创建三维体(mock 持久化:内存;端点就绪后换实现)────────────────── // 登记新三维体(仅存参数,不立即插值)→ 返回新 dsId("vol-N")。插值在首次 loadVolume 惰性做并缓存。 std::string createVolume(VolumeBuildParams params, const std::string& name); + // 请求体形态创建:组装真实 VoxelGenerateRequest → 派生 params 存储 + 打印请求体 JSON(供后端联调)。 + std::string createVolume(const VoxelGenerateRequest& req); + // 取回某三维体组装的请求体(测试/联调);非本 repo 创建或无 request 时返回 nullptr。 + const VoxelGenerateRequest* lastVoxelRequest(const std::string& dsId) const; // 已创建三维体的列表行(ddCode="dd_voxel"),供三维分析栏合并注入(每次 setDatasets 追加)。 std::vector volumeRows() const; @@ -116,6 +121,7 @@ private: std::optional cachedGrid; core::ColorScale cachedScale; // 与 cachedGrid 同时填(源剖面色阶) std::optional pointCount; // 聚合散点数(finalizeVolume 时持久化,详情统计用) + std::optional request; // 组装的真实请求体(createVolume(req) 路径填充) }; std::map volumes_; // dsId → 体 int volumeCounter_ = 0; diff --git a/src/data/dto/Vtk3dRequests.cpp b/src/data/dto/Vtk3dRequests.cpp index e80a0be..840cc31 100644 --- a/src/data/dto/Vtk3dRequests.cpp +++ b/src/data/dto/Vtk3dRequests.cpp @@ -27,6 +27,19 @@ QJsonObject VoxelGenerateRequest::toJson() const { return o; } +VolumeBuildParams fromRequest(const VoxelGenerateRequest& req) { + VolumeBuildParams p; + p.sourceDatasetIds = req.sourceDatasetIds; + p.interpModel = (req.interpModel == "Kriging") ? VolumeBuildParams::Model::Kriging + : VolumeBuildParams::Model::Idw; + p.cellXY = req.cellXY; + p.cellZ = req.cellZ; + p.power = req.power; + p.maxDist = req.maxDist; + p.colorScaleId = req.colorScaleId; + return p; +} + QJsonObject SliceGenerateRequest::toJson() const { QJsonObject o{ {"projectId", qs(projectId)}, diff --git a/src/data/dto/Vtk3dRequests.hpp b/src/data/dto/Vtk3dRequests.hpp index cb0edc6..3be97e1 100644 --- a/src/data/dto/Vtk3dRequests.hpp +++ b/src/data/dto/Vtk3dRequests.hpp @@ -3,6 +3,7 @@ #include #include #include +#include "repo/VolumeBuildParams.hpp" namespace geopro::data { @@ -32,4 +33,7 @@ struct SliceGenerateRequest { QJsonObject toJson() const; }; +// VoxelGenerateRequest → VolumeBuildParams(客户端插值用;interpModel 字符串→enum)。 +VolumeBuildParams fromRequest(const VoxelGenerateRequest& req); + } // namespace geopro::data diff --git a/tests/data/test_vtk3d_requests.cpp b/tests/data/test_vtk3d_requests.cpp index 9dc27f1..1e9a24e 100644 --- a/tests/data/test_vtk3d_requests.cpp +++ b/tests/data/test_vtk3d_requests.cpp @@ -1,8 +1,30 @@ #include #include #include "dto/Vtk3dRequests.hpp" +#include "repo/VolumeBuildParams.hpp" using namespace geopro::data; +TEST(Vtk3dRequests, VolumeBuildParamsFromRequest) { + VoxelGenerateRequest q; + q.sourceDatasetIds = {"d1"}; + q.cellXY = 2.0; + q.power = 3.0; + q.colorScaleId = "cs1"; + q.interpModel = "Kriging"; + const auto p = fromRequest(q); + ASSERT_EQ(p.sourceDatasetIds.size(), 1u); + EXPECT_EQ(p.sourceDatasetIds[0], "d1"); + EXPECT_DOUBLE_EQ(p.cellXY, 2.0); + EXPECT_DOUBLE_EQ(p.power, 3.0); + EXPECT_EQ(p.colorScaleId, "cs1"); + EXPECT_EQ(p.interpModel, VolumeBuildParams::Model::Kriging); +} + +TEST(Vtk3dRequests, FromRequestDefaultsToIdw) { + VoxelGenerateRequest q; // interpModel 默认 "Idw" + EXPECT_EQ(fromRequest(q).interpModel, VolumeBuildParams::Model::Idw); +} + TEST(Vtk3dRequests, VoxelToJsonMatchesContract) { VoxelGenerateRequest q; q.projectId = "p1"; q.structParentId = "g1"; q.structParentConfType = 1;