From 3f24ad81e313eff56f2b704a9308394aa75c6614 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Tue, 16 Jun 2026 15:11:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(vtk):=20=E7=BB=B4=E5=BA=A6=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E7=BA=AF=E5=87=BD=E6=95=B0=20splitByDimension=20+=20?= =?UTF-8?q?=E5=8D=95=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/CMakeLists.txt | 3 ++- src/app/DatasetDimension.cpp | 31 ++++++++++++++++++++++++ src/app/DatasetDimension.hpp | 17 +++++++++++++ tests/CMakeLists.txt | 5 ++++ tests/app/test_dataset_dimension.cpp | 36 ++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/app/DatasetDimension.cpp create mode 100644 src/app/DatasetDimension.hpp create mode 100644 tests/app/test_dataset_dimension.cpp diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index 4f3f8fd..8edbbd8 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -60,7 +60,8 @@ add_executable(geopro_desktop WIN32 ImportDatasetDialog.cpp ExportDatasetDialog.cpp SettingsDialog.cpp - Logging.cpp) + Logging.cpp + DatasetDimension.cpp) target_include_directories(geopro_desktop PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) # QtKeychain 经 FetchContent 接入,头文件不随 target 传播,显式加源/构建目录(含生成的 export 头)。 diff --git a/src/app/DatasetDimension.cpp b/src/app/DatasetDimension.cpp new file mode 100644 index 0000000..91d85db --- /dev/null +++ b/src/app/DatasetDimension.cpp @@ -0,0 +1,31 @@ +#include "DatasetDimension.hpp" + +namespace geopro::app { + +namespace { +// 与 LocalSample3dRepository::dimensionOf 同一映射(spec §6.1)。 +enum class Dim { D3, D2, Analysis, Other }; +Dim dimOf(const std::string& c) { + if (c == "dd_voxel" || c == "dd_Structual3D" || c == "dd_Property3D" || + c == "dd_section" || c == "dd_inversion_data") + return Dim::D3; + if (c == "dd_slice") return Dim::Analysis; + if (c == "dd_trajectory_data") return Dim::D2; + return Dim::Other; +} +} // namespace + +DimBuckets splitByDimension(const std::vector& rows) { + DimBuckets b; + for (const auto& r : rows) { + switch (dimOf(r.ddCode)) { + case Dim::D3: b.dim3D.push_back(r); break; + case Dim::D2: b.dim2D.push_back(r); break; + case Dim::Analysis: b.analysis.push_back(r); break; + case Dim::Other: break; + } + } + return b; +} + +} // namespace geopro::app diff --git a/src/app/DatasetDimension.hpp b/src/app/DatasetDimension.hpp new file mode 100644 index 0000000..846ce57 --- /dev/null +++ b/src/app/DatasetDimension.hpp @@ -0,0 +1,17 @@ +#pragma once +#include +#include "repo/RepoTypes.hpp" + +namespace geopro::app { + +struct DimBuckets { + std::vector dim3D; + std::vector dim2D; + std::vector analysis; +}; + +// 按 ddCode 把 ds 分流到 三维数据集 / 二维数据集 / 三维分析 三栏。 +// Other 维度不入任何栏(保留原顺序)。 +DimBuckets splitByDimension(const std::vector& rows); + +} // namespace geopro::app diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4204ba8..4bc8839 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -122,6 +122,11 @@ target_sources(geopro_tests PRIVATE ) # 散点 hover 文本格式(inline 纯函数,无需链 qwt/实例化 ScatterHoverTip)。 target_sources(geopro_tests PRIVATE app/test_scatter_hover.cpp) +# 维度过滤纯函数(splitByDimension: ddCode -> 三维/二维/分析三栏,无 Qt/VTK 依赖)。 +target_sources(geopro_tests PRIVATE + app/test_dataset_dimension.cpp + ${CMAKE_SOURCE_DIR}/src/app/DatasetDimension.cpp +) # controller 层:DatasetDetailController 编排集成测试(QSignalSpy 验证 datasetOpened/tabReady/loadFailed)。 find_package(Qt6 COMPONENTS Test REQUIRED) diff --git a/tests/app/test_dataset_dimension.cpp b/tests/app/test_dataset_dimension.cpp new file mode 100644 index 0000000..72cbc22 --- /dev/null +++ b/tests/app/test_dataset_dimension.cpp @@ -0,0 +1,36 @@ +#include +#include "DatasetDimension.hpp" +#include "repo/RepoTypes.hpp" + +using geopro::data::DsRow; +using geopro::app::splitByDimension; +using geopro::app::DimBuckets; + +static DsRow row(const char* id, const char* ddCode) { + DsRow r; r.id = id; r.ddCode = ddCode; return r; +} + +TEST(DatasetDimension, SplitsByDdCode) { + std::vector in{ + row("a", "dd_section"), // 3D + row("b", "dd_voxel"), // 3D + row("c", "dd_trajectory_data"), // 2D + row("d", "dd_slice"), // Analysis + row("e", "dd_unknownxyz"), // Other -> not in any bucket + }; + DimBuckets b = splitByDimension(in); + ASSERT_EQ(b.dim3D.size(), 2u); + EXPECT_EQ(b.dim3D[0].id, "a"); + EXPECT_EQ(b.dim3D[1].id, "b"); + ASSERT_EQ(b.dim2D.size(), 1u); + EXPECT_EQ(b.dim2D[0].id, "c"); + ASSERT_EQ(b.analysis.size(), 1u); + EXPECT_EQ(b.analysis[0].id, "d"); +} + +TEST(DatasetDimension, EmptyInput) { + DimBuckets b = splitByDimension({}); + EXPECT_TRUE(b.dim3D.empty()); + EXPECT_TRUE(b.dim2D.empty()); + EXPECT_TRUE(b.analysis.empty()); +}