feat/vtk-3d-view #7
|
|
@ -60,7 +60,8 @@ add_executable(geopro_desktop WIN32
|
||||||
ImportDatasetDialog.cpp
|
ImportDatasetDialog.cpp
|
||||||
ExportDatasetDialog.cpp
|
ExportDatasetDialog.cpp
|
||||||
SettingsDialog.cpp
|
SettingsDialog.cpp
|
||||||
Logging.cpp)
|
Logging.cpp
|
||||||
|
DatasetDimension.cpp)
|
||||||
|
|
||||||
target_include_directories(geopro_desktop PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
target_include_directories(geopro_desktop PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
# QtKeychain 经 FetchContent 接入,头文件不随 target 传播,显式加源/构建目录(含生成的 export 头)。
|
# QtKeychain 经 FetchContent 接入,头文件不随 target 传播,显式加源/构建目录(含生成的 export 头)。
|
||||||
|
|
|
||||||
|
|
@ -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<geopro::data::DsRow>& 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
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
#pragma once
|
||||||
|
#include <vector>
|
||||||
|
#include "repo/RepoTypes.hpp"
|
||||||
|
|
||||||
|
namespace geopro::app {
|
||||||
|
|
||||||
|
struct DimBuckets {
|
||||||
|
std::vector<geopro::data::DsRow> dim3D;
|
||||||
|
std::vector<geopro::data::DsRow> dim2D;
|
||||||
|
std::vector<geopro::data::DsRow> analysis;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 按 ddCode 把 ds 分流到 三维数据集 / 二维数据集 / 三维分析 三栏。
|
||||||
|
// Other 维度不入任何栏(保留原顺序)。
|
||||||
|
DimBuckets splitByDimension(const std::vector<geopro::data::DsRow>& rows);
|
||||||
|
|
||||||
|
} // namespace geopro::app
|
||||||
|
|
@ -122,6 +122,11 @@ target_sources(geopro_tests PRIVATE
|
||||||
)
|
)
|
||||||
# 散点 hover 文本格式(inline 纯函数,无需链 qwt/实例化 ScatterHoverTip)。
|
# 散点 hover 文本格式(inline 纯函数,无需链 qwt/实例化 ScatterHoverTip)。
|
||||||
target_sources(geopro_tests PRIVATE app/test_scatter_hover.cpp)
|
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)。
|
# controller 层:DatasetDetailController 编排集成测试(QSignalSpy 验证 datasetOpened/tabReady/loadFailed)。
|
||||||
find_package(Qt6 COMPONENTS Test REQUIRED)
|
find_package(Qt6 COMPONENTS Test REQUIRED)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#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<DsRow> 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());
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue