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
5 changed files with 118 additions and 0 deletions
Showing only changes of commit f00a2143a2 - Show all commits

View File

@ -5,6 +5,7 @@ add_library(geopro_data STATIC
repo/LocalSampleRepository.cpp repo/LocalSampleRepository.cpp
repo/LocalSample3dRepository.cpp repo/LocalSample3dRepository.cpp
dto/NavDto.cpp dto/NavDto.cpp
dto/Vtk3dRequests.cpp
dto/DatasetChartDto.cpp dto/DatasetChartDto.cpp
dto/MeasurementDto.cpp dto/MeasurementDto.cpp
dto/GrMeasurementDto.cpp dto/GrMeasurementDto.cpp

View File

@ -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

View File

@ -0,0 +1,35 @@
#pragma once
#include <array>
#include <string>
#include <vector>
#include <QJsonObject>
namespace geopro::data {
// 对齐 docs/api/vtk-3d-openapi.json VoxelGenerateRequestspec §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

View File

@ -42,6 +42,7 @@ target_sources(geopro_tests PRIVATE data/test_local_repo.cpp)
# I3dSceneRepository/LocalSample3dRepositorydimensionOf + loadVolume/loadTerrainPaths PROJ_DATA # I3dSceneRepository/LocalSample3dRepositorydimensionOf + loadVolume/loadTerrainPaths PROJ_DATA
target_sources(geopro_tests PRIVATE data/test_3d_repo.cpp) 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_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_dataset_chart_dto.cpp)
target_sources(geopro_tests PRIVATE data/test_measurement_dto.cpp) target_sources(geopro_tests PRIVATE data/test_measurement_dto.cpp)
target_sources(geopro_tests PRIVATE data/test_gr_dto.cpp) target_sources(geopro_tests PRIVATE data/test_gr_dto.cpp)

View File

@ -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);
}