feat/vtk-3d-view #7
|
|
@ -5,6 +5,7 @@ add_library(geopro_data STATIC
|
|||
repo/LocalSampleRepository.cpp
|
||||
repo/LocalSample3dRepository.cpp
|
||||
dto/NavDto.cpp
|
||||
dto/Vtk3dRequests.cpp
|
||||
dto/DatasetChartDto.cpp
|
||||
dto/MeasurementDto.cpp
|
||||
dto/GrMeasurementDto.cpp
|
||||
|
|
|
|||
|
|
@ -0,0 +1,42 @@
|
|||
#include "dto/Vtk3dRequests.hpp"
|
||||
#include <QJsonArray>
|
||||
#include <QString>
|
||||
|
||||
namespace geopro::data {
|
||||
|
||||
namespace {
|
||||
QJsonArray vec3(const std::array<double, 3>& v) {
|
||||
return QJsonArray{v[0], v[1], v[2]};
|
||||
}
|
||||
QString qs(const std::string& s) { return QString::fromStdString(s); }
|
||||
} // namespace
|
||||
|
||||
QJsonObject VoxelGenerateRequest::toJson() const {
|
||||
QJsonArray ids;
|
||||
for (const auto& s : sourceDatasetIds) ids.append(qs(s));
|
||||
QJsonObject o{
|
||||
{"projectId", qs(projectId)},
|
||||
{"structParentId", qs(structParentId)},
|
||||
{"structParentConfType", structParentConfType},
|
||||
{"name", qs(name)},
|
||||
{"sourceDatasetIds", ids},
|
||||
{"interpModel", qs(interpModel)},
|
||||
{"cellXY", cellXY}, {"cellZ", cellZ}, {"power", power}, {"maxDist", maxDist},
|
||||
};
|
||||
if (!colorScaleId.empty()) o.insert("colorScaleId", qs(colorScaleId));
|
||||
return o;
|
||||
}
|
||||
|
||||
QJsonObject SliceGenerateRequest::toJson() const {
|
||||
QJsonObject o{
|
||||
{"projectId", qs(projectId)},
|
||||
{"volumeDsId", qs(volumeDsId)},
|
||||
{"name", qs(name)},
|
||||
{"axis", axis},
|
||||
{"origin", vec3(origin)}, {"point1", vec3(point1)}, {"point2", vec3(point2)},
|
||||
};
|
||||
if (!colorScaleId.empty()) o.insert("colorScaleId", qs(colorScaleId));
|
||||
return o;
|
||||
}
|
||||
|
||||
} // namespace geopro::data
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
#pragma once
|
||||
#include <array>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <QJsonObject>
|
||||
|
||||
namespace geopro::data {
|
||||
|
||||
// 对齐 docs/api/vtk-3d-openapi.json VoxelGenerateRequest(spec §8 请求体组装)。
|
||||
struct VoxelGenerateRequest {
|
||||
std::string projectId;
|
||||
std::string structParentId; // GS/项目根容器节点 id
|
||||
int structParentConfType = 1; // 1=GS/项目根 2=TM
|
||||
std::string name;
|
||||
std::vector<std::string> sourceDatasetIds;
|
||||
std::string interpModel = "Idw"; // Idw|Kriging
|
||||
double cellXY = 1.0, cellZ = 0.5, power = 2.0, maxDist = 4.0;
|
||||
std::string colorScaleId; // 空=取首源色阶
|
||||
QJsonObject toJson() const;
|
||||
};
|
||||
|
||||
// 对齐 SliceGenerateRequest。
|
||||
struct SliceGenerateRequest {
|
||||
std::string projectId;
|
||||
std::string volumeDsId; // 所属三维体 dsObjectId
|
||||
std::string name;
|
||||
int axis = 3; // 0上下/1前后/2左右/3任意
|
||||
std::array<double, 3> origin{{0, 0, 0}};
|
||||
std::array<double, 3> point1{{0, 0, 0}};
|
||||
std::array<double, 3> point2{{0, 0, 0}};
|
||||
std::string colorScaleId;
|
||||
QJsonObject toJson() const;
|
||||
};
|
||||
|
||||
} // namespace geopro::data
|
||||
|
|
@ -42,6 +42,7 @@ target_sources(geopro_tests PRIVATE data/test_local_repo.cpp)
|
|||
# I3dSceneRepository/LocalSample3dRepository:dimensionOf 映射 + loadVolume/loadTerrainPaths 异步回调(需 PROJ_DATA)。
|
||||
target_sources(geopro_tests PRIVATE data/test_3d_repo.cpp)
|
||||
target_sources(geopro_tests PRIVATE data/test_nav_dto.cpp)
|
||||
target_sources(geopro_tests PRIVATE data/test_vtk3d_requests.cpp)
|
||||
target_sources(geopro_tests PRIVATE data/test_dataset_chart_dto.cpp)
|
||||
target_sources(geopro_tests PRIVATE data/test_measurement_dto.cpp)
|
||||
target_sources(geopro_tests PRIVATE data/test_gr_dto.cpp)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,39 @@
|
|||
#include <gtest/gtest.h>
|
||||
#include <QJsonArray>
|
||||
#include "dto/Vtk3dRequests.hpp"
|
||||
using namespace geopro::data;
|
||||
|
||||
TEST(Vtk3dRequests, VoxelToJsonMatchesContract) {
|
||||
VoxelGenerateRequest q;
|
||||
q.projectId = "p1"; q.structParentId = "g1"; q.structParentConfType = 1;
|
||||
q.name = "体A"; q.sourceDatasetIds = {"d1", "d2"};
|
||||
const QJsonObject j = q.toJson();
|
||||
EXPECT_EQ(j["projectId"].toString(), "p1");
|
||||
EXPECT_EQ(j["structParentId"].toString(), "g1");
|
||||
EXPECT_EQ(j["structParentConfType"].toInt(), 1);
|
||||
EXPECT_EQ(j["name"].toString(), "体A");
|
||||
ASSERT_TRUE(j["sourceDatasetIds"].isArray());
|
||||
EXPECT_EQ(j["sourceDatasetIds"].toArray().size(), 2);
|
||||
EXPECT_EQ(j["interpModel"].toString(), "Idw");
|
||||
EXPECT_DOUBLE_EQ(j["cellXY"].toDouble(), 1.0);
|
||||
// colorScaleId 为空时不应出现在请求体里。
|
||||
EXPECT_FALSE(j.contains("colorScaleId"));
|
||||
}
|
||||
|
||||
TEST(Vtk3dRequests, VoxelColorScaleIncludedWhenSet) {
|
||||
VoxelGenerateRequest q;
|
||||
q.colorScaleId = "cs1";
|
||||
EXPECT_EQ(q.toJson()["colorScaleId"].toString(), "cs1");
|
||||
}
|
||||
|
||||
TEST(Vtk3dRequests, SliceToJsonMatchesContract) {
|
||||
SliceGenerateRequest q;
|
||||
q.projectId = "p1"; q.volumeDsId = "v1"; q.name = "切片1"; q.axis = 3;
|
||||
q.origin = {0, 0, -10}; q.point1 = {100, 0, -10}; q.point2 = {0, 50, -10};
|
||||
const QJsonObject j = q.toJson();
|
||||
EXPECT_EQ(j["volumeDsId"].toString(), "v1");
|
||||
EXPECT_EQ(j["axis"].toInt(), 3);
|
||||
ASSERT_TRUE(j["origin"].isArray());
|
||||
EXPECT_EQ(j["origin"].toArray().size(), 3);
|
||||
EXPECT_DOUBLE_EQ(j["point1"].toArray()[0].toDouble(), 100.0);
|
||||
}
|
||||
Loading…
Reference in New Issue