From 0d0fc1aca5f7d1cf291e94556d04fc5c8bd1aa6b Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Tue, 25 Mar 2025 06:45:39 +0100 Subject: [PATCH] #12282 Improve auto naming to avoid ensembles with identical names --- .../Application/RiaApplication.cpp | 6 +- .../Tools/RiaEnsembleNameTools.cpp | 31 ------ .../Application/Tools/RiaEnsembleNameTools.h | 2 - .../Tools/Summary/RiaSummaryStringTools.cpp | 2 +- .../Tools/Summary/RiaSummaryTools.cpp | 11 +++ .../Tools/Summary/RiaSummaryTools.h | 2 + .../RicDeleteSummaryCaseCollectionFeature.cpp | 2 +- .../Commands/RicImportEnsembleFeature.cpp | 4 +- .../RicNewDerivedEnsembleFeature.cpp | 2 +- .../RicReplaceSummaryEnsembleFeature.cpp | 3 +- .../Cloud/RimCloudDataSourceCollection.cpp | 2 +- .../ProjectDataModel/RimProject.cpp | 8 +- .../RimSummaryCalculationCollection.cpp | 5 +- .../Summary/RimDeltaSummaryEnsemble.cpp | 20 ++-- .../Summary/RimSummaryCaseMainCollection.cpp | 97 +++++++++++++------ .../Summary/RimSummaryCaseMainCollection.h | 8 +- .../Summary/RimSummaryEnsemble.cpp | 18 +++- .../Summary/RimSummaryEnsemble.h | 2 +- .../Summary/Sumo/RimSummaryEnsembleSumo.cpp | 4 +- .../RiuSummaryVectorSelectionUi.cpp | 14 +-- 20 files changed, 138 insertions(+), 105 deletions(-) diff --git a/ApplicationLibCode/Application/RiaApplication.cpp b/ApplicationLibCode/Application/RiaApplication.cpp index da80f886b9..bdf39fc64c 100644 --- a/ApplicationLibCode/Application/RiaApplication.cpp +++ b/ApplicationLibCode/Application/RiaApplication.cpp @@ -776,11 +776,11 @@ bool RiaApplication::loadProject( const QString& projectFileName, ProjectLoadAct if ( !sumMainCollection ) continue; sumMainCollection->updateAutoShortName(); - for ( auto sumCaseGroup : sumMainCollection->summaryCaseCollections() ) + for ( auto ensemble : sumMainCollection->summaryEnsembles() ) { - sumCaseGroup->updateName(); - sumCaseGroup->loadDataAndUpdate(); + ensemble->loadDataAndUpdate(); } + sumMainCollection->updateEnsembleNames(); for ( auto well : oilField->wellPathCollection()->allWellPaths() ) { diff --git a/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.cpp b/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.cpp index 6162038243..bdc9b4260f 100644 --- a/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.cpp +++ b/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.cpp @@ -400,37 +400,6 @@ std::map> return mapping; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaEnsembleNameTools::updateAutoNameEnsembles( std::vector ensembles ) -{ - std::set key1; - std::set key2; - - for ( const auto& ensemble : ensembles ) - { - const auto keys = ensemble->nameKeys(); - key1.insert( keys.first ); - key2.insert( keys.second ); - } - - bool useKey1 = key1.size() > 1; - bool useKey2 = key2.size() > 1; - - if ( !useKey1 && !useKey2 ) - { - useKey2 = true; - } - - for ( auto ensemble : ensembles ) - { - ensemble->setUsePathKey1( useKey1 ); - ensemble->setUsePathKey2( useKey2 ); - ensemble->updateName(); - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.h b/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.h index 2092672959..57bf0ad809 100644 --- a/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.h +++ b/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.h @@ -59,8 +59,6 @@ public: const QStringList& fileNames, const std::vector& fileNameComponents ); - static void updateAutoNameEnsembles( std::vector ensembles ); - static QString uniqueShortNameForEnsembleCase( RimSummaryCase* summaryCase ); static QString uniqueShortNameForSummaryCase( RimSummaryCase* summaryCase ); diff --git a/ApplicationLibCode/Application/Tools/Summary/RiaSummaryStringTools.cpp b/ApplicationLibCode/Application/Tools/Summary/RiaSummaryStringTools.cpp index 7d1f0a57d0..4d2d2a02c9 100644 --- a/ApplicationLibCode/Application/Tools/Summary/RiaSummaryStringTools.cpp +++ b/ApplicationLibCode/Application/Tools/Summary/RiaSummaryStringTools.cpp @@ -149,7 +149,7 @@ std::pair, std::vector> RiaSum if ( !sumCaseMainColl ) return { {}, {} }; auto summaryCases = sumCaseMainColl->topLevelSummaryCases(); - auto ensembles = sumCaseMainColl->summaryCaseCollections(); + auto ensembles = sumCaseMainColl->summaryEnsembles(); return { summaryCases, ensembles }; } diff --git a/ApplicationLibCode/Application/Tools/Summary/RiaSummaryTools.cpp b/ApplicationLibCode/Application/Tools/Summary/RiaSummaryTools.cpp index 9c40bab613..656715423b 100644 --- a/ApplicationLibCode/Application/Tools/Summary/RiaSummaryTools.cpp +++ b/ApplicationLibCode/Application/Tools/Summary/RiaSummaryTools.cpp @@ -442,3 +442,14 @@ time_t RiaSummaryTools::calculateTimeThreshold( const time_t& minimum, const tim return timeThreshold; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaSummaryTools::updateSummaryEnsembleNames() +{ + if ( auto sumCaseMainColl = RiaSummaryTools::summaryCaseMainCollection() ) + { + sumCaseMainColl->updateEnsembleNames(); + } +} diff --git a/ApplicationLibCode/Application/Tools/Summary/RiaSummaryTools.h b/ApplicationLibCode/Application/Tools/Summary/RiaSummaryTools.h index e3f3e4a06b..230dd493a2 100644 --- a/ApplicationLibCode/Application/Tools/Summary/RiaSummaryTools.h +++ b/ApplicationLibCode/Application/Tools/Summary/RiaSummaryTools.h @@ -99,6 +99,8 @@ public: static time_t calculateTimeThreshold( const time_t& minimum, const time_t& maximum ); + static void updateSummaryEnsembleNames(); + private: static void updateRequiredCalculatedCurves( RimSummaryCase* sourceSummaryCase ); static bool isCalculationRequired( const RimUserDefinedCalculation* summaryCalculation, const RimSummaryCase* summaryCase ); diff --git a/ApplicationLibCode/Commands/RicDeleteSummaryCaseCollectionFeature.cpp b/ApplicationLibCode/Commands/RicDeleteSummaryCaseCollectionFeature.cpp index 1686006192..753af96004 100644 --- a/ApplicationLibCode/Commands/RicDeleteSummaryCaseCollectionFeature.cpp +++ b/ApplicationLibCode/Commands/RicDeleteSummaryCaseCollectionFeature.cpp @@ -119,7 +119,7 @@ void RicDeleteSummaryCaseCollectionFeature::onActionTriggered( bool isChecked ) for ( RimSummaryEnsemble* caseCollection : selection ) { - summaryCaseMainCollection->removeCaseCollection( caseCollection ); + summaryCaseMainCollection->removeEnsemble( caseCollection ); delete caseCollection; } diff --git a/ApplicationLibCode/Commands/RicImportEnsembleFeature.cpp b/ApplicationLibCode/Commands/RicImportEnsembleFeature.cpp index c79c7f7f81..b1efc6bd08 100644 --- a/ApplicationLibCode/Commands/RicImportEnsembleFeature.cpp +++ b/ApplicationLibCode/Commands/RicImportEnsembleFeature.cpp @@ -102,7 +102,7 @@ void RicImportEnsembleFeature::onActionTriggered( bool isChecked ) importSingleEnsemble( fileNames, useEnsembleNameDialog, ensembleGroupingMode, fileType, groupName ); } - RiaEnsembleNameTools::updateAutoNameEnsembles( RiaApplication::instance()->project()->summaryGroups() ); + RiaSummaryTools::updateSummaryEnsembleNames(); } } } @@ -137,6 +137,8 @@ RimSummaryEnsemble* RicImportEnsembleFeature::importSingleEnsemble( const QStrin summaryCase->updateAutoShortName(); } + RiaSummaryTools::updateSummaryEnsembleNames(); + RiaSummaryPlotTools::createAndAppendDefaultSummaryMultiPlot( {}, { ensemble } ); } diff --git a/ApplicationLibCode/Commands/SummaryPlotCommands/RicNewDerivedEnsembleFeature.cpp b/ApplicationLibCode/Commands/SummaryPlotCommands/RicNewDerivedEnsembleFeature.cpp index a4b9959d4b..bc79ef48e7 100644 --- a/ApplicationLibCode/Commands/SummaryPlotCommands/RicNewDerivedEnsembleFeature.cpp +++ b/ApplicationLibCode/Commands/SummaryPlotCommands/RicNewDerivedEnsembleFeature.cpp @@ -94,7 +94,7 @@ void RicNewDerivedEnsembleFeature::onActionTriggered( bool isChecked ) { if ( !showWarningDialogWithQuestion() ) { - mainColl->removeCaseCollection( newEnsemble ); + mainColl->removeEnsemble( newEnsemble ); } } } diff --git a/ApplicationLibCode/Commands/SummaryPlotCommands/RicReplaceSummaryEnsembleFeature.cpp b/ApplicationLibCode/Commands/SummaryPlotCommands/RicReplaceSummaryEnsembleFeature.cpp index 4b19be8328..3d80752cda 100644 --- a/ApplicationLibCode/Commands/SummaryPlotCommands/RicReplaceSummaryEnsembleFeature.cpp +++ b/ApplicationLibCode/Commands/SummaryPlotCommands/RicReplaceSummaryEnsembleFeature.cpp @@ -75,10 +75,9 @@ void RicReplaceSummaryEnsembleFeature::onActionTriggered( bool isChecked ) summaryCase->updateAutoShortName(); } - summaryEnsemble->updateName(); - if ( auto sumCaseMainColl = RiaSummaryTools::summaryCaseMainCollection() ) { + sumCaseMainColl->updateEnsembleNames(); sumCaseMainColl->updateAllRequiredEditors(); } } diff --git a/ApplicationLibCode/ProjectDataModel/Cloud/RimCloudDataSourceCollection.cpp b/ApplicationLibCode/ProjectDataModel/Cloud/RimCloudDataSourceCollection.cpp index 2c9308f1a6..c5a99e6f81 100644 --- a/ApplicationLibCode/ProjectDataModel/Cloud/RimCloudDataSourceCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Cloud/RimCloudDataSourceCollection.cpp @@ -88,13 +88,13 @@ void RimCloudDataSourceCollection::createEnsemblesFromSelectedDataSources( const RimSummaryEnsembleSumo* ensemble = new RimSummaryEnsembleSumo(); ensemble->setUsePathKey1( true ); ensemble->setSumoDataSource( dataSource ); - ensemble->updateName(); RiaSummaryTools::summaryCaseMainCollection()->addEnsemble( ensemble ); ensemble->loadDataAndUpdate(); RiaSummaryPlotTools::createAndAppendDefaultSummaryMultiPlot( {}, { ensemble } ); } + RiaSummaryTools::updateSummaryEnsembleNames(); RiaSummaryTools::summaryCaseMainCollection()->updateAllRequiredEditors(); } diff --git a/ApplicationLibCode/ProjectDataModel/RimProject.cpp b/ApplicationLibCode/ProjectDataModel/RimProject.cpp index 4946f23710..f0223eb412 100644 --- a/ApplicationLibCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimProject.cpp @@ -752,7 +752,7 @@ std::vector RimProject::allSummaryCases() const //-------------------------------------------------------------------------------------------------- std::vector RimProject::summaryGroups() const { - std::vector groups; + std::vector ensembles; for ( RimOilField* oilField : oilFields ) { @@ -760,12 +760,12 @@ std::vector RimProject::summaryGroups() const RimSummaryCaseMainCollection* sumCaseMainColl = oilField->summaryCaseMainCollection(); if ( sumCaseMainColl ) { - std::vector g = sumCaseMainColl->summaryCaseCollections(); - groups.insert( groups.end(), g.begin(), g.end() ); + std::vector ensemble = sumCaseMainColl->summaryEnsembles(); + ensembles.insert( ensembles.end(), ensemble.begin(), ensemble.end() ); } } - return groups; + return ensembles; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationCollection.cpp index 054c3cfc3e..7050890f63 100644 --- a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationCollection.cpp @@ -82,10 +82,9 @@ void RimSummaryCalculationCollection::updateDataDependingOnCalculations() } } - auto summaryCaseCollections = summaryCaseCollection->summaryCaseCollections(); - for ( RimSummaryEnsemble* summaryCaseCollection : summaryCaseCollections ) + for ( auto ensemble : summaryCaseCollection->summaryEnsembles() ) { - summaryCaseCollection->onCalculationUpdated(); + ensemble->onCalculationUpdated(); } } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryEnsemble.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryEnsemble.cpp index e398d1193f..eb72f6ca21 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryEnsemble.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryEnsemble.cpp @@ -18,16 +18,18 @@ #include "RiaQDateTimeTools.h" +#include "Summary/RiaSummaryTools.h" + #include "SummaryPlotCommands/RicNewDerivedEnsembleFeature.h" +#include "RifSummaryReaderInterface.h" + #include "RimDeltaSummaryCase.h" #include "RimDeltaSummaryEnsemble.h" #include "RimProject.h" #include "RimSummaryCaseMainCollection.h" #include "RimSummaryEnsemble.h" -#include "RifSummaryReaderInterface.h" - #include "cafPdmUiCheckBoxEditor.h" #include "cafPdmUiPushButtonEditor.h" #include "cafPdmUiTreeSelectionEditor.h" @@ -107,7 +109,8 @@ RimDeltaSummaryEnsemble::~RimDeltaSummaryEnsemble() void RimDeltaSummaryEnsemble::setEnsemble1( RimSummaryEnsemble* ensemble ) { m_ensemble1 = ensemble; - updateName(); + + RiaSummaryTools::updateSummaryEnsembleNames(); } //-------------------------------------------------------------------------------------------------- @@ -116,7 +119,8 @@ void RimDeltaSummaryEnsemble::setEnsemble1( RimSummaryEnsemble* ensemble ) void RimDeltaSummaryEnsemble::setEnsemble2( RimSummaryEnsemble* ensemble ) { m_ensemble2 = ensemble; - updateName(); + + RiaSummaryTools::updateSummaryEnsembleNames(); } //-------------------------------------------------------------------------------------------------- @@ -271,7 +275,6 @@ void RimDeltaSummaryEnsemble::onLoadDataAndUpdate() { updateDerivedEnsembleCases(); updateReferringCurveSets(); - updateName(); updateConnectedEditors(); } @@ -349,7 +352,6 @@ void RimDeltaSummaryEnsemble::defineUiOrdering( QString uiConfigName, caf::PdmUi uiOrdering.skipRemainingFields( true ); - updateName(); if ( !isValid() ) m_caseCount = ""; } @@ -389,7 +391,7 @@ void RimDeltaSummaryEnsemble::fieldChangedByUi( const caf::PdmFieldHandle* chang if ( doUpdate ) { - updateName(); + RiaSummaryTools::updateSummaryEnsembleNames(); if ( doUpdateCases ) { @@ -568,9 +570,9 @@ std::vector RimDeltaSummaryEnsemble::findReferringEnse auto mainColl = firstAncestorOrThisOfType(); if ( mainColl ) { - for ( auto group : mainColl->summaryCaseCollections() ) + for ( auto ensemble : mainColl->summaryEnsembles() ) { - auto derivedEnsemble = dynamic_cast( group ); + auto derivedEnsemble = dynamic_cast( ensemble ); if ( derivedEnsemble ) { if ( derivedEnsemble->m_ensemble1() == this || derivedEnsemble->m_ensemble2() == this ) diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp index d03fb5e76a..6c58e20852 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp @@ -105,7 +105,7 @@ RimSummaryCaseMainCollection::RimSummaryCaseMainCollection() CAF_PDM_InitFieldNoDefault( &m_cases, "SummaryCases", "" ); caf::PdmFieldReorderCapability::addToField( &m_cases ); - CAF_PDM_InitFieldNoDefault( &m_caseCollections, "SummaryCaseCollections", "" ); + CAF_PDM_InitFieldNoDefault( &m_ensembles, "SummaryCaseCollections", "" ); } //-------------------------------------------------------------------------------------------------- @@ -114,7 +114,7 @@ RimSummaryCaseMainCollection::RimSummaryCaseMainCollection() RimSummaryCaseMainCollection::~RimSummaryCaseMainCollection() { m_cases.deleteChildrenAsync(); - m_caseCollections.deleteChildrenAsync(); + m_ensembles.deleteChildrenAsync(); } //-------------------------------------------------------------------------------------------------- @@ -165,9 +165,9 @@ void RimSummaryCaseMainCollection::removeCase( RimSummaryCase* summaryCase, bool std::vector derivedEnsembles; // Build a list of derived ensembles that must be updated after delete - for ( auto group : summaryCaseCollections() ) + for ( auto ensemble : summaryEnsembles() ) { - auto derEnsemble = dynamic_cast( group ); + auto derEnsemble = dynamic_cast( ensemble ); if ( derEnsemble ) { if ( derEnsemble->hasCaseReference( summaryCase ) ) @@ -179,9 +179,9 @@ void RimSummaryCaseMainCollection::removeCase( RimSummaryCase* summaryCase, bool m_cases.removeChild( summaryCase ); - for ( RimSummaryEnsemble* summaryCaseCollection : m_caseCollections ) + for ( RimSummaryEnsemble* ensemble : m_ensembles ) { - summaryCaseCollection->removeCase( summaryCase, notifyChange ); + ensemble->removeCase( summaryCase, notifyChange ); } // Update derived ensemble cases (if any) @@ -203,9 +203,9 @@ void RimSummaryCaseMainCollection::removeCases( std::vector& ca removeCase( sumCase, false ); } - for ( RimSummaryEnsemble* summaryCaseCollection : m_caseCollections ) + for ( RimSummaryEnsemble* ensemble : m_ensembles ) { - summaryCaseCollection->updateReferringCurveSetsZoomAll(); + ensemble->updateReferringCurveSetsZoomAll(); } dataSourceHasChanged.send(); @@ -232,13 +232,13 @@ RimSummaryEnsemble* RimSummaryCaseMainCollection::addEnsemble( const std::vector bool isEnsemble, std::function allocator ) { - RimSummaryEnsemble* summaryCaseCollection = allocator(); - if ( !collectionName.isEmpty() ) summaryCaseCollection->setNameTemplate( collectionName ); + RimSummaryEnsemble* ensemble = allocator(); + if ( !collectionName.isEmpty() ) ensemble->setNameTemplate( collectionName ); - if ( summaryCaseCollection->ensembleId() == -1 ) + if ( ensemble->ensembleId() == -1 ) { RimProject* project = RimProject::current(); - project->assignIdToEnsemble( summaryCaseCollection ); + project->assignIdToEnsemble( ensemble ); } for ( RimSummaryCase* summaryCase : summaryCases ) @@ -253,31 +253,31 @@ RimSummaryEnsemble* RimSummaryCaseMainCollection::addEnsemble( const std::vector m_cases.removeChild( summaryCase ); } - summaryCaseCollection->addCase( summaryCase ); + ensemble->addCase( summaryCase ); if ( isEnsemble ) { summaryCase->setDisplayNameOption( RimCaseDisplayNameTools::DisplayName::SHORT_CASE_NAME ); } } - summaryCaseCollection->setAsEnsemble( isEnsemble ); + ensemble->setAsEnsemble( isEnsemble ); - summaryCaseCollection->caseNameChanged.connect( this, &RimSummaryCaseMainCollection::onCaseNameChanged ); - m_caseCollections.push_back( summaryCaseCollection ); + ensemble->caseNameChanged.connect( this, &RimSummaryCaseMainCollection::onCaseNameChanged ); + m_ensembles.push_back( ensemble ); dataSourceHasChanged.send(); - return summaryCaseCollection; + return ensemble; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimSummaryCaseMainCollection::removeCaseCollection( RimSummaryEnsemble* caseCollection ) +void RimSummaryCaseMainCollection::removeEnsemble( RimSummaryEnsemble* ensemble ) { - m_caseCollections.removeChild( caseCollection ); + m_ensembles.removeChild( ensemble ); - RiaEnsembleNameTools::updateAutoNameEnsembles( summaryCaseCollections() ); + RiaSummaryTools::updateSummaryEnsembleNames(); dataSourceHasChanged.send(); } @@ -289,7 +289,7 @@ void RimSummaryCaseMainCollection::addEnsemble( RimSummaryEnsemble* ensemble ) { CVF_ASSERT( ensemble ); - m_caseCollections.push_back( ensemble ); + m_ensembles.push_back( ensemble ); if ( ensemble->ensembleId() == -1 ) { @@ -325,9 +325,9 @@ std::vector RimSummaryCaseMainCollection::allSummaryCases() con if ( !m_cases.empty() ) cases.insert( cases.end(), m_cases.begin(), m_cases.end() ); - for ( auto& coll : m_caseCollections ) + for ( auto& ensemble : m_ensembles ) { - auto collCases = coll->allSummaryCases(); + auto collCases = ensemble->allSummaryCases(); if ( collCases.empty() ) continue; cases.insert( cases.end(), collCases.begin(), collCases.end() ); } @@ -351,14 +351,14 @@ std::vector RimSummaryCaseMainCollection::topLevelSummaryCases( //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimSummaryCaseMainCollection::summaryCaseCollections() const +std::vector RimSummaryCaseMainCollection::summaryEnsembles() const { - std::vector summaryCaseCollections; - for ( const auto& caseColl : m_caseCollections ) + std::vector ensembles; + for ( const auto& ensemble : m_ensembles ) { - summaryCaseCollections.push_back( caseColl ); + ensembles.push_back( ensemble ); } - return summaryCaseCollections; + return ensembles; } //-------------------------------------------------------------------------------------------------- @@ -381,9 +381,9 @@ void RimSummaryCaseMainCollection::initAfterRead() sumCase->nameChanged.connect( this, &RimSummaryCaseMainCollection::onCaseNameChanged ); } - for ( auto caseCollection : summaryCaseCollections() ) + for ( auto ensemble : summaryEnsembles() ) { - caseCollection->caseNameChanged.connect( this, &RimSummaryCaseMainCollection::onCaseNameChanged ); + ensemble->caseNameChanged.connect( this, &RimSummaryCaseMainCollection::onCaseNameChanged ); } } @@ -545,7 +545,7 @@ RimSummaryEnsemble* RimSummaryCaseMainCollection::defaultAllocator() //-------------------------------------------------------------------------------------------------- void RimSummaryCaseMainCollection::onCaseNameChanged( const SignalEmitter* emitter ) { - RiaEnsembleNameTools::updateAutoNameEnsembles( summaryCaseCollections() ); + RiaSummaryTools::updateSummaryEnsembleNames(); RimSummaryMultiPlotCollection* summaryPlotColl = RiaSummaryTools::summaryMultiPlotCollection(); summaryPlotColl->updateSummaryNameHasChanged(); @@ -721,3 +721,38 @@ void RimSummaryCaseMainCollection::onProjectBeingSaved() } } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryCaseMainCollection::updateEnsembleNames() +{ + std::set key1; + std::set key2; + + auto ensembles = summaryEnsembles(); + + for ( const auto& ensemble : ensembles ) + { + const auto keys = ensemble->nameKeys(); + key1.insert( keys.first ); + key2.insert( keys.second ); + } + + bool useKey1 = key1.size() > 1; + bool useKey2 = key2.size() > 1; + + if ( !useKey1 && !useKey2 ) + { + useKey2 = true; + } + + std::set existingNames; + for ( auto ensemble : ensembles ) + { + ensemble->setUsePathKey1( useKey1 ); + ensemble->setUsePathKey2( useKey2 ); + ensemble->updateName( existingNames ); + existingNames.insert( ensemble->name() ); + } +} diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h index b3e55aa7b4..ebcdc9f24f 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h @@ -49,7 +49,7 @@ public: std::vector allSummaryCases() const; std::vector topLevelSummaryCases() const; - std::vector summaryCaseCollections() const; + std::vector summaryEnsembles() const; std::vector createSummaryCasesFromFileInfos( const std::vector& summaryHeaderFileInfos, bool showProgress = false ); @@ -66,7 +66,7 @@ public: const QString& coolectionName, bool isEnsemble, std::function allocator = defaultAllocator ); - void removeCaseCollection( RimSummaryEnsemble* caseCollection ); + void removeEnsemble( RimSummaryEnsemble* ensemble ); void addEnsemble( RimSummaryEnsemble* ensemble ); void loadAllSummaryCaseData(); @@ -76,6 +76,8 @@ public: void updateAutoShortName(); void onProjectBeingSaved(); + void updateEnsembleNames(); + private: void initAfterRead() override; @@ -87,5 +89,5 @@ private: private: caf::PdmChildArrayField m_cases; - caf::PdmChildArrayField m_caseCollections; + caf::PdmChildArrayField m_ensembles; }; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryEnsemble.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryEnsemble.cpp index 30bfc34529..de20bb3b83 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryEnsemble.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryEnsemble.cpp @@ -26,6 +26,7 @@ #include "RiaStdStringTools.h" #include "RiaTextStringTools.h" #include "Summary/RiaSummaryAddressAnalyzer.h" +#include "Summary/RiaSummaryTools.h" #include "RifSummaryReaderInterface.h" @@ -236,7 +237,7 @@ QString RimSummaryEnsemble::name() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimSummaryEnsemble::updateName() +void RimSummaryEnsemble::updateName( const std::set& existingEnsembleNames ) { const auto [key1, key2] = nameKeys(); @@ -270,6 +271,19 @@ void RimSummaryEnsemble::updateName() { candidateName = candidateName.left( candidateName.length() - 1 ); } + + // Avoid identical ensemble names by appending a number + if ( existingEnsembleNames.contains( candidateName ) ) + { + int counter = 1; + QString uniqueName; + do + { + uniqueName = QString( "%1 (subset-%2)" ).arg( candidateName ).arg( counter++ ); + } while ( existingEnsembleNames.contains( uniqueName ) ); + + candidateName = uniqueName; + } } if ( m_name == candidateName ) return; @@ -889,7 +903,7 @@ void RimSummaryEnsemble::fieldChangedByUi( const caf::PdmFieldHandle* changedFie } if ( changedField == &m_autoName || changedField == &m_nameTemplateString ) { - updateName(); + RiaSummaryTools::updateSummaryEnsembleNames(); } } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryEnsemble.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryEnsemble.h index cc9b43d72c..ff36a5c77b 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryEnsemble.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryEnsemble.h @@ -66,7 +66,7 @@ public: QString name() const; void setNameTemplate( const QString& name ); - void updateName(); + void updateName( const std::set& existingEnsembleNames ); void setUsePathKey1( bool useKey1 ); void setUsePathKey2( bool useKey2 ); virtual std::pair nameKeys() const; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/Sumo/RimSummaryEnsembleSumo.cpp b/ApplicationLibCode/ProjectDataModel/Summary/Sumo/RimSummaryEnsembleSumo.cpp index 5b7051cdf0..9209cd1ea8 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/Sumo/RimSummaryEnsembleSumo.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/Sumo/RimSummaryEnsembleSumo.cpp @@ -488,7 +488,7 @@ void RimSummaryEnsembleSumo::fieldChangedByUi( const caf::PdmFieldHandle* change { clearCachedData(); updateResultAddresses(); - updateName(); + RiaSummaryTools::updateSummaryEnsembleNames(); buildMetaData(); updateConnectedEditors(); @@ -555,7 +555,7 @@ void RimSummaryEnsembleSumo::onLoadDataAndUpdate() } } - updateName(); + RiaSummaryTools::updateSummaryEnsembleNames(); updateResultAddresses(); buildMetaData(); diff --git a/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.cpp b/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.cpp index 82484bf20e..f596c4fbd7 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.cpp +++ b/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.cpp @@ -590,9 +590,9 @@ QList if ( !hideEnsembles ) { bool ensembleHeaderCreated = false; - for ( const auto& sumCaseColl : sumCaseMainColl->summaryCaseCollections() ) + for ( const auto& ensemble : sumCaseMainColl->summaryEnsembles() ) { - if ( !sumCaseColl->isEnsemble() ) continue; + if ( !ensemble->isEnsemble() ) continue; if ( !ensembleHeaderCreated ) { @@ -601,7 +601,7 @@ QList } // Ensemble level { - auto optionItem = caf::PdmOptionItemInfo( sumCaseColl->name(), sumCaseColl ); + auto optionItem = caf::PdmOptionItemInfo( ensemble->name(), ensemble ); optionItem.setLevel( 1 ); options.push_back( optionItem ); } @@ -611,13 +611,13 @@ QList if ( !hideSummaryCases ) { // Grouped cases - for ( const auto& sumCaseColl : sumCaseMainColl->summaryCaseCollections() ) + for ( const auto& ensemble : sumCaseMainColl->summaryEnsembles() ) { - if ( sumCaseColl->isEnsemble() && !showIndividualEnsembleCases ) continue; + if ( ensemble->isEnsemble() && !showIndividualEnsembleCases ) continue; - options.push_back( caf::PdmOptionItemInfo::createHeader( sumCaseColl->name(), true ) ); + options.push_back( caf::PdmOptionItemInfo::createHeader( ensemble->name(), true ) ); - for ( const auto& sumCase : sumCaseColl->allSummaryCases() ) + for ( const auto& sumCase : ensemble->allSummaryCases() ) { auto optionItem = caf::PdmOptionItemInfo( sumCase->displayCaseName(), sumCase ); optionItem.setLevel( 1 );