diff --git a/src/app/panels/chart/ErtInversionStrategy.hpp b/src/app/panels/chart/ErtInversionStrategy.hpp new file mode 100644 index 0000000..01d7f0d --- /dev/null +++ b/src/app/panels/chart/ErtInversionStrategy.hpp @@ -0,0 +1,7 @@ +#pragma once +#include "panels/chart/IDatasetChartStrategy.hpp" +namespace geopro::app { +struct ErtInversionStrategy : IDatasetChartStrategy { + std::string ddCode() const override { return "dd_inversion_data"; } +}; +} // namespace geopro::app diff --git a/src/controller/CMakeLists.txt b/src/controller/CMakeLists.txt index 45f34d7..0bbe490 100644 --- a/src/controller/CMakeLists.txt +++ b/src/controller/CMakeLists.txt @@ -1,6 +1,7 @@ find_package(Qt6 COMPONENTS Core REQUIRED) add_library(geopro_controller STATIC - WorkbenchNavController.cpp) + WorkbenchNavController.cpp + DatasetDetailController.cpp) target_include_directories(geopro_controller PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(geopro_controller PUBLIC geopro_data Qt6::Core) target_compile_features(geopro_controller PUBLIC cxx_std_17) diff --git a/src/controller/DatasetDetailController.cpp b/src/controller/DatasetDetailController.cpp new file mode 100644 index 0000000..fb03556 --- /dev/null +++ b/src/controller/DatasetDetailController.cpp @@ -0,0 +1,27 @@ +#include "DatasetDetailController.hpp" +#include +#include "repo/IDatasetRepository.hpp" +namespace geopro::controller { + +DatasetDetailController::DatasetDetailController(data::IDatasetRepository& repo, QObject* parent) + : QObject(parent), repo_(repo) {} + +void DatasetDetailController::openDataset(const QString& dsId, const QString& ddCode) { + const std::string id = dsId.toStdString(); + try { + ChartData d; + d.dsId = dsId; + d.ddCode = ddCode; + d.scatter = repo_.loadScatter(id); + d.scatterScale = repo_.loadScatterColorScale(id); + d.grid = repo_.loadGrid(id); + d.gridScale = repo_.loadColorScale(id); + d.anomalies = repo_.loadAnomalies(id); + emit chartReady(d); + } catch (const std::exception& e) { + emit loadFailed(dsId, QString::fromStdString(e.what())); + } +} + +void DatasetDetailController::focusDataset(const QString& dsId) { emit focusRequested(dsId); } +} // namespace geopro::controller diff --git a/src/controller/DatasetDetailController.hpp b/src/controller/DatasetDetailController.hpp new file mode 100644 index 0000000..43e5993 --- /dev/null +++ b/src/controller/DatasetDetailController.hpp @@ -0,0 +1,35 @@ +#pragma once +#include +#include +#include +#include "model/Field.hpp" +#include "model/ColorScale.hpp" +#include "model/Anomaly.hpp" +namespace geopro::data { class IDatasetRepository; } +namespace geopro::controller { + +// 数据详情编排:单击/双击数据集 → 拉 散点/网格/色阶/异常 → 发信号给详情面板。被动视图。 +// 仅服务图表,不与 WorkbenchNavController(项目/结构导航)耦合。 +class DatasetDetailController : public QObject { + Q_OBJECT +public: + struct ChartData { + QString dsId, ddCode; + geopro::core::ScatterField scatter; + geopro::core::ColorScale scatterScale; + geopro::core::Grid grid{1, 1}; // Grid 无默认构造;以占位值初始化,openDataset 会覆盖 + geopro::core::ColorScale gridScale; + std::vector anomalies; + }; + explicit DatasetDetailController(data::IDatasetRepository& repo, QObject* parent = nullptr); +public slots: + void openDataset(const QString& dsId, const QString& ddCode); // 双击=新建/聚焦页 + void focusDataset(const QString& dsId); // 单击=聚焦已开页 +signals: + void chartReady(const ChartData& data); + void focusRequested(const QString& dsId); + void loadFailed(const QString& dsId, const QString& message); +private: + data::IDatasetRepository& repo_; +}; +} // namespace geopro::controller