From 3c7e8ee12093401d6132504ca034348ca1e19450 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 25 Apr 2025 10:44:55 +0200 Subject: [PATCH] Refactors summary case creation into a tool class Moves the summary case creation logic from the `RicImportSummaryCasesFeature` class to a new `RiaEnsembleImportTools` class. --- .../Tools/Ensemble/CMakeLists_files.cmake | 11 +++ .../Tools/Ensemble/RiaEnsembleImportTools.cpp | 81 +++++++++++++++++++ .../Tools/Ensemble/RiaEnsembleImportTools.h | 37 +++++++++ ApplicationLibCode/CMakeLists.txt | 1 + .../Commands/RicImportEnsembleFeature.cpp | 5 +- .../Commands/RicImportSummaryCasesFeature.cpp | 61 +------------- .../Commands/RicImportSummaryCasesFeature.h | 9 --- .../Commands/RicImportSummaryGroupFeature.cpp | 5 +- .../RicReplaceSummaryEnsembleFeature.cpp | 5 +- .../RicSummaryPlotFeatureImpl.cpp | 9 ++- .../ProjectDataModelCommands/RimcProject.cpp | 7 +- 11 files changed, 151 insertions(+), 80 deletions(-) create mode 100644 ApplicationLibCode/Application/Tools/Ensemble/CMakeLists_files.cmake create mode 100644 ApplicationLibCode/Application/Tools/Ensemble/RiaEnsembleImportTools.cpp create mode 100644 ApplicationLibCode/Application/Tools/Ensemble/RiaEnsembleImportTools.h diff --git a/ApplicationLibCode/Application/Tools/Ensemble/CMakeLists_files.cmake b/ApplicationLibCode/Application/Tools/Ensemble/CMakeLists_files.cmake new file mode 100644 index 0000000000..c9edc06f7d --- /dev/null +++ b/ApplicationLibCode/Application/Tools/Ensemble/CMakeLists_files.cmake @@ -0,0 +1,11 @@ +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RiaEnsembleImportTools.h +) + +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RiaEnsembleImportTools.cpp +) + +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) + +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) diff --git a/ApplicationLibCode/Application/Tools/Ensemble/RiaEnsembleImportTools.cpp b/ApplicationLibCode/Application/Tools/Ensemble/RiaEnsembleImportTools.cpp new file mode 100644 index 0000000000..f2cc52c340 --- /dev/null +++ b/ApplicationLibCode/Application/Tools/Ensemble/RiaEnsembleImportTools.cpp @@ -0,0 +1,81 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2025 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RiaEnsembleImportTools.h" + +#include "RiaGuiApplication.h" +#include "RiaLogging.h" +#include "Summary/RiaSummaryTools.h" + +#include "RifSummaryCaseRestartSelector.h" + +#include "RimSummaryCaseMainCollection.h" + +namespace RiaEnsembleImportTools +{ + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair> createSummaryCasesFromFiles( const QStringList& fileNames, CreateConfig createConfig ) +{ + RimSummaryCaseMainCollection* sumCaseColl = RiaSummaryTools::summaryCaseMainCollection(); + + std::vector newCases; + if ( !sumCaseColl ) return std::make_pair( false, newCases ); + + std::vector importFileInfos; + if ( createConfig.fileType == RiaDefines::FileType::SMSPEC ) + { + RifSummaryCaseRestartSelector fileSelector; + + if ( !RiaGuiApplication::isRunning() || !createConfig.allowDialogs ) + { + fileSelector.showDialog( false ); + } + + fileSelector.setEnsembleOrGroupMode( createConfig.ensembleOrGroup ); + fileSelector.determineFilesToImportFromSummaryFiles( fileNames ); + + importFileInfos = fileSelector.summaryFileInfos(); + + if ( fileSelector.foundErrors() ) + { + QString errorMessage = fileSelector.createCombinedErrorMessage(); + RiaLogging::error( errorMessage ); + } + } + else + { + // No restart files for these file types: just copy to result info + for ( const auto& f : fileNames ) + { + importFileInfos.push_back( RifSummaryCaseFileResultInfo( f, false, createConfig.fileType ) ); + } + } + + if ( !importFileInfos.empty() ) + { + std::vector sumCases = sumCaseColl->createSummaryCasesFromFileInfos( importFileInfos, true ); + newCases.insert( newCases.end(), sumCases.begin(), sumCases.end() ); + } + + return std::make_pair( true, newCases ); +} + +} // namespace RiaEnsembleImportTools diff --git a/ApplicationLibCode/Application/Tools/Ensemble/RiaEnsembleImportTools.h b/ApplicationLibCode/Application/Tools/Ensemble/RiaEnsembleImportTools.h new file mode 100644 index 0000000000..31c2081ce5 --- /dev/null +++ b/ApplicationLibCode/Application/Tools/Ensemble/RiaEnsembleImportTools.h @@ -0,0 +1,37 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2025 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "Summary/RiaSummaryDefines.h" + +#include + +class RimSummaryCase; + +namespace RiaEnsembleImportTools +{ +struct CreateConfig +{ + RiaDefines::FileType fileType; + bool ensembleOrGroup; + bool allowDialogs; +}; +std::pair> createSummaryCasesFromFiles( const QStringList& fileNames, CreateConfig createConfig ); + +} // namespace RiaEnsembleImportTools diff --git a/ApplicationLibCode/CMakeLists.txt b/ApplicationLibCode/CMakeLists.txt index e409615f59..0004ce92d3 100644 --- a/ApplicationLibCode/CMakeLists.txt +++ b/ApplicationLibCode/CMakeLists.txt @@ -91,6 +91,7 @@ list( Application/Tools/Cloud/CMakeLists_files.cmake Application/Tools/Summary/CMakeLists_files.cmake Application/Tools/KeyValueStore/CMakeLists_files.cmake + Application/Tools/Ensemble/CMakeLists_files.cmake ReservoirDataModel/CMakeLists_files.cmake ReservoirDataModel/CMakeLists_filesNotToUnitTest.cmake ReservoirDataModel/Completions/CMakeLists_files.cmake diff --git a/ApplicationLibCode/Commands/RicImportEnsembleFeature.cpp b/ApplicationLibCode/Commands/RicImportEnsembleFeature.cpp index 507c1bb8ed..1d1e0bca46 100644 --- a/ApplicationLibCode/Commands/RicImportEnsembleFeature.cpp +++ b/ApplicationLibCode/Commands/RicImportEnsembleFeature.cpp @@ -18,6 +18,7 @@ #include "RicImportEnsembleFeature.h" +#include "Ensemble/RiaEnsembleImportTools.h" #include "RiaApplication.h" #include "RiaEnsembleNameTools.h" #include "Summary/RiaSummaryDefines.h" @@ -123,8 +124,8 @@ RimSummaryEnsemble* RicImportEnsembleFeature::importSingleEnsemble( const QStrin if ( ensembleName.isEmpty() ) return nullptr; - RicImportSummaryCasesFeature::CreateConfig createConfig{ .fileType = fileType, .ensembleOrGroup = true, .allowDialogs = true }; - auto [isOk, cases] = RicImportSummaryCasesFeature::createSummaryCasesFromFiles( fileNames, createConfig ); + RiaEnsembleImportTools::CreateConfig createConfig{ .fileType = fileType, .ensembleOrGroup = true, .allowDialogs = true }; + auto [isOk, cases] = RiaEnsembleImportTools::createSummaryCasesFromFiles( fileNames, createConfig ); if ( !isOk || cases.empty() ) return nullptr; diff --git a/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.cpp b/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.cpp index ac2d6ff5b2..f906d43869 100644 --- a/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.cpp +++ b/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.cpp @@ -22,6 +22,7 @@ #include "Summary/RiaSummaryPlotTools.h" #include "SummaryPlotCommands/RicNewSummaryCurveFeature.h" +#include "Ensemble/RiaEnsembleImportTools.h" #include "RiaGuiApplication.h" #include "RiaLogging.h" #include "RiaPreferences.h" @@ -74,7 +75,7 @@ void RicImportSummaryCasesFeature::onActionTriggered( bool isChecked ) if ( fileNames.isEmpty() ) return; - CreateConfig createConfig{ .fileType = fileType, .ensembleOrGroup = false, .allowDialogs = true }; + RiaEnsembleImportTools::CreateConfig createConfig{ .fileType = fileType, .ensembleOrGroup = false, .allowDialogs = true }; auto [isOk, cases] = createSummaryCasesFromFiles( fileNames, createConfig ); if ( !isOk ) return; @@ -123,8 +124,8 @@ std::pair> RicImportSummaryCasesFeature::crea { RiaGuiApplication* app = RiaGuiApplication::instance(); - CreateConfig createConfig{ .fileType = RiaDefines::FileType::SMSPEC, .ensembleOrGroup = false, .allowDialogs = true }; - auto [isOk, cases] = createSummaryCasesFromFiles( fileNames, createConfig ); + RiaEnsembleImportTools::CreateConfig createConfig{ .fileType = RiaDefines::FileType::SMSPEC, .ensembleOrGroup = false, .allowDialogs = true }; + auto [isOk, cases] = RiaEnsembleImportTools::createSummaryCasesFromFiles( fileNames, createConfig ); if ( isOk ) { addSummaryCases( cases ); @@ -160,60 +161,6 @@ std::pair> RicImportSummaryCasesFeature::crea return std::make_pair( false, cases ); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -std::pair> RicImportSummaryCasesFeature::createSummaryCasesFromFiles( const QStringList& fileNames, - CreateConfig createConfig ) -{ - RiaApplication* app = RiaApplication::instance(); - RimProject* proj = app->project(); - - RimSummaryCaseMainCollection* sumCaseColl = proj->activeOilField() ? proj->activeOilField()->summaryCaseMainCollection() : nullptr; - - std::vector newCases; - - if ( !sumCaseColl ) return std::make_pair( false, newCases ); - - std::vector importFileInfos; - if ( createConfig.fileType == RiaDefines::FileType::SMSPEC ) - { - RifSummaryCaseRestartSelector fileSelector; - - if ( !RiaGuiApplication::isRunning() || !createConfig.allowDialogs ) - { - fileSelector.showDialog( false ); - } - - fileSelector.setEnsembleOrGroupMode( createConfig.ensembleOrGroup ); - fileSelector.determineFilesToImportFromSummaryFiles( fileNames ); - - importFileInfos = fileSelector.summaryFileInfos(); - - if ( fileSelector.foundErrors() ) - { - QString errorMessage = fileSelector.createCombinedErrorMessage(); - RiaLogging::error( errorMessage ); - } - } - else - { - // No restart files for these file types: just copy to result info - for ( auto f : fileNames ) - { - importFileInfos.push_back( RifSummaryCaseFileResultInfo( f, false, createConfig.fileType ) ); - } - } - - if ( !importFileInfos.empty() ) - { - std::vector sumCases = sumCaseColl->createSummaryCasesFromFileInfos( importFileInfos, true ); - newCases.insert( newCases.end(), sumCases.begin(), sumCases.end() ); - } - - return std::make_pair( true, newCases ); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.h b/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.h index 706fb35198..4a791a8f9a 100644 --- a/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.h +++ b/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.h @@ -43,15 +43,6 @@ public: static std::pair> createAndAddSummaryCasesFromFiles( const QStringList& fileName, bool doCreateDefaultPlot ); - struct CreateConfig - { - RiaDefines::FileType fileType; - bool ensembleOrGroup; - bool allowDialogs; - }; - - static std::pair> createSummaryCasesFromFiles( const QStringList& fileName, CreateConfig createConfig ); - static void addSummaryCases( const std::vector& cases ); static void addCasesToGroupIfRelevant( const std::vector& cases ); diff --git a/ApplicationLibCode/Commands/RicImportSummaryGroupFeature.cpp b/ApplicationLibCode/Commands/RicImportSummaryGroupFeature.cpp index 60151ac3c5..c9995d7f85 100644 --- a/ApplicationLibCode/Commands/RicImportSummaryGroupFeature.cpp +++ b/ApplicationLibCode/Commands/RicImportSummaryGroupFeature.cpp @@ -18,6 +18,7 @@ #include "RicImportSummaryGroupFeature.h" +#include "Ensemble/RiaEnsembleImportTools.h" #include "RiaGuiApplication.h" #include "Summary/RiaSummaryDefines.h" @@ -47,8 +48,8 @@ void RicImportSummaryGroupFeature::onActionTriggered( bool isChecked ) RiaDefines::FileType fileType = RicRecursiveFileSearchDialog::mapSummaryFileType( result.fileType ); - RicImportSummaryCasesFeature::CreateConfig createConfig{ .fileType = fileType, .ensembleOrGroup = true, .allowDialogs = true }; - auto [isOk, cases] = RicImportSummaryCasesFeature::createSummaryCasesFromFiles( fileNames, createConfig ); + RiaEnsembleImportTools::CreateConfig createConfig{ .fileType = fileType, .ensembleOrGroup = true, .allowDialogs = true }; + auto [isOk, cases] = RiaEnsembleImportTools::createSummaryCasesFromFiles( fileNames, createConfig ); RicImportSummaryCasesFeature::addSummaryCases( cases ); RicImportEnsembleFeature::groupSummaryCases( cases, "", RiaDefines::EnsembleGroupingMode::FMU_FOLDER_STRUCTURE, false ); diff --git a/ApplicationLibCode/Commands/SummaryPlotCommands/RicReplaceSummaryEnsembleFeature.cpp b/ApplicationLibCode/Commands/SummaryPlotCommands/RicReplaceSummaryEnsembleFeature.cpp index 6ca055d16e..5c1417b3cb 100644 --- a/ApplicationLibCode/Commands/SummaryPlotCommands/RicReplaceSummaryEnsembleFeature.cpp +++ b/ApplicationLibCode/Commands/SummaryPlotCommands/RicReplaceSummaryEnsembleFeature.cpp @@ -18,6 +18,7 @@ #include "RicReplaceSummaryEnsembleFeature.h" +#include "Ensemble/RiaEnsembleImportTools.h" #include "RiaLogging.h" #include "Summary/RiaSummaryTools.h" @@ -61,8 +62,8 @@ void RicReplaceSummaryEnsembleFeature::onActionTriggered( bool isChecked ) if ( fileNames.isEmpty() ) return; if ( fileType != RiaDefines::FileType::SMSPEC ) return; - RicImportSummaryCasesFeature::CreateConfig createConfig{ .fileType = fileType, .ensembleOrGroup = false, .allowDialogs = false }; - auto [isOk, newCases] = RicImportSummaryCasesFeature::createSummaryCasesFromFiles( fileNames, createConfig ); + RiaEnsembleImportTools::CreateConfig createConfig{ .fileType = fileType, .ensembleOrGroup = false, .allowDialogs = false }; + auto [isOk, newCases] = RiaEnsembleImportTools::createSummaryCasesFromFiles( fileNames, createConfig ); if ( !isOk || newCases.empty() ) { RiaLogging::warning( "No new cases are created." ); diff --git a/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotFeatureImpl.cpp b/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotFeatureImpl.cpp index 96fb9bd2ae..64c099c5fa 100644 --- a/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotFeatureImpl.cpp +++ b/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotFeatureImpl.cpp @@ -18,6 +18,7 @@ #include "RicSummaryPlotFeatureImpl.h" +#include "Ensemble/RiaEnsembleImportTools.h" #include "RiaApplication.h" #include "RiaColorTables.h" #include "RiaDefines.h" @@ -284,10 +285,10 @@ void RicSummaryPlotFeatureImpl::createSummaryPlotsFromArgumentLine( const QStrin bool isEnsembleMode = ensembleColoringStyle != EnsembleColoringType::NONE; - RicImportSummaryCasesFeature::CreateConfig createConfig{ .fileType = RiaDefines::FileType::SMSPEC, - .ensembleOrGroup = isEnsembleMode, - .allowDialogs = true }; - auto [isOk, summaryCasesToUse] = RicImportSummaryCasesFeature::createSummaryCasesFromFiles( summaryFileNames, createConfig ); + RiaEnsembleImportTools::CreateConfig createConfig{ .fileType = RiaDefines::FileType::SMSPEC, + .ensembleOrGroup = isEnsembleMode, + .allowDialogs = true }; + auto [isOk, summaryCasesToUse] = RiaEnsembleImportTools::createSummaryCasesFromFiles( summaryFileNames, createConfig ); if ( !isOk || summaryCasesToUse.empty() ) { RiaLogging::error( "Needs at least one summary case to create a plot." ); diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcProject.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcProject.cpp index 4db900dd19..1d191472ac 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcProject.cpp +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcProject.cpp @@ -18,6 +18,7 @@ #include "RimcProject.h" +#include "Ensemble/RiaEnsembleImportTools.h" #include "RiaApplication.h" #include "RiaGuiApplication.h" #include "RiaLogging.h" @@ -72,10 +73,8 @@ caf::PdmObjectHandle* RimProject_importSummaryCase::execute() QStringList summaryFileNames{ absolutePath }; - RicImportSummaryCasesFeature::CreateConfig createConfig{ .fileType = RiaDefines::FileType::SMSPEC, - .ensembleOrGroup = false, - .allowDialogs = false }; - auto [isOk, newCases] = RicImportSummaryCasesFeature::createSummaryCasesFromFiles( summaryFileNames, createConfig ); + RiaEnsembleImportTools::CreateConfig createConfig{ .fileType = RiaDefines::FileType::SMSPEC, .ensembleOrGroup = false, .allowDialogs = false }; + auto [isOk, newCases] = RiaEnsembleImportTools::createSummaryCasesFromFiles( summaryFileNames, createConfig ); if ( isOk ) { RicImportSummaryCasesFeature::addSummaryCases( newCases );