From 8768e186d85da3df34d174f91faf0fdedaee5e36 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Sun, 26 Feb 2023 08:08:06 +0100 Subject: [PATCH] #9671 summary calculations for summary items * Summary Calculation: use shorter name in title * Sort summary addresses to group calculated results last. * Summary Calculation: add option to distribute calculation to other items. * Add support for summary calculation for RimGridSummaryCase. * Use short name for calculations in plot titles. * Update ensembles in Data Sources when calculation is added. * Summary Calculation: allow drag-and-drop of ensembles * Summary Plot: fix axis range aggregation for calculated ensemble addresses. --------- Co-authored-by: Kristian Bendiksen --- .../Application/RiaApplication.cpp | 5 +- .../Tools/RiaOptionItemFactory.cpp | 3 - .../Application/Tools/RiaSummaryTools.cpp | 9 +- .../RicSummaryPlotBuilder.cpp | 1 - .../Commands/RicReplaceSummaryCaseFeature.cpp | 59 --- .../RicEditSummaryCurveCalculationFeature.cpp | 3 +- .../RicSummaryPlotEditorUi.cpp | 10 - .../RicSummaryPlotEditorUi.h | 4 +- .../RifEclipseSummaryAddress.cpp | 197 +++---- .../FileInterface/RifEclipseSummaryAddress.h | 58 +- .../RifEclipseUserDataKeywordTools.cpp | 2 - .../RifMultipleSummaryReaders.cpp | 7 +- .../AnalysisPlots/RimAnalysisPlot.cpp | 6 +- .../RimDataSourceSteppingTools.cpp | 14 + .../RimMainPlotCollection.cpp | 14 - .../ProjectDataModel/RimMainPlotCollection.h | 1 - .../ProjectDataModel/RimPlotCurve.cpp | 2 +- .../RimSummaryCalculation.cpp | 495 +++++++++++++++++- .../ProjectDataModel/RimSummaryCalculation.h | 53 ++ .../RimSummaryCalculationCollection.cpp | 18 - .../RimSummaryCalculationCollection.h | 7 - .../RimSummaryCalculationVariable.cpp | 12 + .../RimUserDefinedCalculation.cpp | 32 +- .../RimUserDefinedCalculation.h | 11 +- .../RimUserDefinedCalculationCollection.cpp | 1 - .../Summary/CMakeLists_files.cmake | 2 - .../Summary/RimCalculatedSummaryCase.cpp | 88 ---- .../Summary/RimCalculatedSummaryCase.h | 50 -- .../RimCalculatedSummaryCurveReader.cpp | 37 +- .../Summary/RimCalculatedSummaryCurveReader.h | 4 +- .../Summary/RimEnsembleCurveSet.cpp | 2 + .../Summary/RimFileSummaryCase.cpp | 10 +- .../Summary/RimFileSummaryCase.h | 10 +- .../Summary/RimGridSummaryCase.cpp | 16 +- .../Summary/RimGridSummaryCase.h | 9 +- .../Summary/RimSummaryAddress.cpp | 33 +- .../Summary/RimSummaryAddress.h | 2 + .../Summary/RimSummaryAddressCollection.cpp | 24 +- .../Summary/RimSummaryCase.cpp | 4 +- .../Summary/RimSummaryCaseCollection.cpp | 2 + .../Summary/RimSummaryCurve.cpp | 17 +- .../Summary/RimSummaryCurveAutoName.cpp | 6 +- .../Summary/RimSummaryCurvesData.cpp | 2 +- .../Summary/RimSummaryMultiPlot.cpp | 10 +- .../Summary/RimSummaryPlot.cpp | 10 +- .../Summary/RimSummaryPlotAxisFormatter.cpp | 4 +- ...RimSummaryPlotFilterTextCurveSetEditor.cpp | 3 - .../RiuSummaryVectorSelectionDialog.cpp | 8 + .../RiuSummaryVectorSelectionDialog.h | 1 + .../RiuSummaryVectorSelectionUi.cpp | 207 ++++---- .../RiuSummaryVectorSelectionUi.h | 6 +- 51 files changed, 990 insertions(+), 601 deletions(-) delete mode 100644 ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.cpp delete mode 100644 ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.h diff --git a/ApplicationLibCode/Application/RiaApplication.cpp b/ApplicationLibCode/Application/RiaApplication.cpp index fba19fbf89..95cc1eebd0 100644 --- a/ApplicationLibCode/Application/RiaApplication.cpp +++ b/ApplicationLibCode/Application/RiaApplication.cpp @@ -71,6 +71,7 @@ #include "RimStimPlanColors.h" #include "RimStimPlanModel.h" #include "RimStimPlanModelCollection.h" +#include "RimSummaryCalculationCollection.h" #include "RimSummaryCase.h" #include "RimSummaryCaseCollection.h" #include "RimSummaryCaseMainCollection.h" @@ -529,8 +530,6 @@ bool RiaApplication::loadProject( const QString& projectFileName, { RimMainPlotCollection* mainPlotColl = RimMainPlotCollection::current(); - - mainPlotColl->ensureCalculationIdsAreAssigned(); mainPlotColl->ensureDefaultFlowPlotsAreCreated(); } @@ -544,6 +543,8 @@ bool RiaApplication::loadProject( const QString& projectFileName, } oilField->summaryCaseMainCollection()->loadAllSummaryCaseData(); + m_project->calculationCollection()->rebuildCaseMetaData(); + if ( !oilField->observedDataCollection() ) { oilField->observedDataCollection = std::make_unique(); diff --git a/ApplicationLibCode/Application/Tools/RiaOptionItemFactory.cpp b/ApplicationLibCode/Application/Tools/RiaOptionItemFactory.cpp index 647a0db844..c3149db194 100644 --- a/ApplicationLibCode/Application/Tools/RiaOptionItemFactory.cpp +++ b/ApplicationLibCode/Application/Tools/RiaOptionItemFactory.cpp @@ -113,9 +113,6 @@ caf::PdmOptionItemInfo case RifEclipseSummaryAddress::SUMMARY_BLOCK_LGR: iconText = ":/summary/components/images/block.svg"; break; - case RifEclipseSummaryAddress::SUMMARY_CALCULATED: - iconText = ":/summary/components/images/calculated.svg"; - break; case RifEclipseSummaryAddress::SUMMARY_IMPORTED: iconText = ":/summary/components/images/others.svg"; break; diff --git a/ApplicationLibCode/Application/Tools/RiaSummaryTools.cpp b/ApplicationLibCode/Application/Tools/RiaSummaryTools.cpp index 65cf7cda56..aa1bd4e1ed 100644 --- a/ApplicationLibCode/Application/Tools/RiaSummaryTools.cpp +++ b/ApplicationLibCode/Application/Tools/RiaSummaryTools.cpp @@ -95,11 +95,10 @@ void RiaSummaryTools::notifyCalculatedCurveNameHasChanged( int calculationId, co for ( RimSummaryCurve* curve : plot->summaryCurves() ) { RifEclipseSummaryAddress adr = curve->summaryAddressY(); - if ( adr.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED && adr.id() == calculationId ) + if ( adr.isCalculated() && adr.id() == calculationId ) { - RifEclipseSummaryAddress updatedAdr = - RifEclipseSummaryAddress::calculatedAddress( currentCurveName.toStdString(), calculationId ); - curve->setSummaryAddressYAndApplyInterpolation( updatedAdr ); + adr.setVectorName( currentCurveName.toStdString() ); + curve->setSummaryAddressYAndApplyInterpolation( adr ); } } } @@ -199,7 +198,7 @@ bool RiaSummaryTools::isSummaryCrossPlot( const RimSummaryPlot* plot ) //-------------------------------------------------------------------------------------------------- bool RiaSummaryTools::hasAccumulatedData( const RifEclipseSummaryAddress& address ) { - if ( address.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) + if ( address.isCalculated() ) { std::vector cases; std::vector addresses; diff --git a/ApplicationLibCode/Commands/PlotBuilderCommands/RicSummaryPlotBuilder.cpp b/ApplicationLibCode/Commands/PlotBuilderCommands/RicSummaryPlotBuilder.cpp index 1862e89969..91ffc6f762 100644 --- a/ApplicationLibCode/Commands/PlotBuilderCommands/RicSummaryPlotBuilder.cpp +++ b/ApplicationLibCode/Commands/PlotBuilderCommands/RicSummaryPlotBuilder.cpp @@ -642,7 +642,6 @@ void RicSummaryPlotBuilder::appendCurvesToPlot( RimSummaryPlot* for ( const auto summaryCase : summaryCases ) { auto curve = createCurve( summaryCase, addr ); - summaryPlot->addCurveNoUpdate( curve ); } } diff --git a/ApplicationLibCode/Commands/RicReplaceSummaryCaseFeature.cpp b/ApplicationLibCode/Commands/RicReplaceSummaryCaseFeature.cpp index b904a8cc5b..ba195e5684 100644 --- a/ApplicationLibCode/Commands/RicReplaceSummaryCaseFeature.cpp +++ b/ApplicationLibCode/Commands/RicReplaceSummaryCaseFeature.cpp @@ -23,7 +23,6 @@ #include "RicImportGeneralDataFeature.h" -#include "RimCalculatedSummaryCase.h" #include "RimFileSummaryCase.h" #include "RimProject.h" #include "RimSummaryAddress.h" @@ -116,27 +115,6 @@ void RicReplaceSummaryCaseFeature::onActionTriggered( bool isChecked ) { for ( RimSummaryPlot* summaryPlot : multiPlot->summaryPlots() ) { - // Update summary curves on calculated data - std::vector summaryCurves = summaryPlot->summaryCurves(); - for ( RimSummaryCurve* summaryCurve : summaryCurves ) - { - RifEclipseSummaryAddress summaryAddressY = summaryCurve->summaryAddressY(); - if ( summaryAddressY.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED && - ids.find( summaryAddressY.id() ) != ids.end() ) - { - if ( calcColl ) - { - RimUserDefinedCalculation* calculation = calcColl->findCalculationById( summaryAddressY.id() ); - QString description = calculation->description(); - - RifEclipseSummaryAddress updatedAdr = - RifEclipseSummaryAddress::calculatedAddress( description.toStdString(), calculation->id() ); - summaryCurve->setSummaryAddressYAndApplyInterpolation( updatedAdr ); - summaryCurve->loadDataAndUpdate( true ); - } - } - } - summaryPlot->loadDataAndUpdate(); } multiPlot->updatePlotTitles(); @@ -145,43 +123,6 @@ void RicReplaceSummaryCaseFeature::onActionTriggered( bool isChecked ) RimSummaryCrossPlotCollection* summaryCrossPlotColl = RiaSummaryTools::summaryCrossPlotCollection(); for ( RimSummaryPlot* summaryPlot : summaryCrossPlotColl->plots() ) { - // Update summary curves on calculated data - std::vector summaryCurves = summaryPlot->summaryCurves(); - for ( RimSummaryCurve* summaryCurve : summaryCurves ) - { - RifEclipseSummaryAddress summaryAddressX = summaryCurve->summaryAddressX(); - if ( summaryAddressX.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED && - ids.find( summaryAddressX.id() ) != ids.end() ) - { - if ( calcColl ) - { - RimUserDefinedCalculation* calculation = calcColl->findCalculationById( summaryAddressX.id() ); - QString description = calculation->description(); - - RifEclipseSummaryAddress updatedAdr = - RifEclipseSummaryAddress::calculatedAddress( description.toStdString(), calculation->id() ); - summaryCurve->setSummaryAddressX( updatedAdr ); - summaryCurve->loadDataAndUpdate( true ); - } - } - - RifEclipseSummaryAddress summaryAddressY = summaryCurve->summaryAddressY(); - if ( summaryAddressY.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED && - ids.find( summaryAddressY.id() ) != ids.end() ) - { - if ( calcColl ) - { - RimUserDefinedCalculation* calculation = calcColl->findCalculationById( summaryAddressX.id() ); - QString description = calculation->description(); - - RifEclipseSummaryAddress updatedAdr = - RifEclipseSummaryAddress::calculatedAddress( description.toStdString(), calculation->id() ); - summaryCurve->setSummaryAddressYAndApplyInterpolation( updatedAdr ); - summaryCurve->loadDataAndUpdate( true ); - } - } - } - summaryPlot->loadDataAndUpdate(); } } diff --git a/ApplicationLibCode/Commands/SummaryPlotCommands/RicEditSummaryCurveCalculationFeature.cpp b/ApplicationLibCode/Commands/SummaryPlotCommands/RicEditSummaryCurveCalculationFeature.cpp index 8464c548bc..96b29afe38 100644 --- a/ApplicationLibCode/Commands/SummaryPlotCommands/RicEditSummaryCurveCalculationFeature.cpp +++ b/ApplicationLibCode/Commands/SummaryPlotCommands/RicEditSummaryCurveCalculationFeature.cpp @@ -45,8 +45,7 @@ CAF_CMD_SOURCE_INIT( RicEditSummaryCurveCalculationFeature, "RicEditSummaryCurve bool RicEditSummaryCurveCalculationFeature::isCommandEnabled() { std::vector selectedCurves = caf::selectedObjectsByType(); - return selectedCurves.size() == 1 && - selectedCurves.front()->summaryAddressY().category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED; + return selectedCurves.size() == 1 && selectedCurves.front()->summaryAddressY().isCalculated(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotEditorUi.cpp b/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotEditorUi.cpp index de464ace57..981444df5f 100644 --- a/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotEditorUi.cpp +++ b/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotEditorUi.cpp @@ -919,16 +919,6 @@ bool RicSummaryPlotEditorUi::isObservedData( RimSummaryCase* sumCase ) const return dynamic_cast( sumCase ) != nullptr; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimSummaryCase* RicSummaryPlotEditorUi::calculatedSummaryCase() -{ - RimSummaryCalculationCollection* calcColl = RimProject::current()->calculationCollection(); - - return calcColl->calculationSummaryCase(); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotEditorUi.h b/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotEditorUi.h index 9da9d20554..fd950c7e93 100644 --- a/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotEditorUi.h +++ b/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotEditorUi.h @@ -45,6 +45,7 @@ class RimSummaryCurveAutoName; class RimSummaryPlot; class RiaSummaryCurveDefinition; class RimEnsembleCurveSet; +class RimCalculatedSummaryCase; //================================================================================================== /// @@ -106,8 +107,7 @@ private: void createNewPlot(); bool isObservedData( RimSummaryCase* sumCase ) const; - static RimSummaryCase* calculatedSummaryCase(); - void selectionEditorFieldChanged(); + void selectionEditorFieldChanged(); void proxyEnablePlotAutoTitle( const bool& enable ); bool proxyPlotAutoTitle() const; diff --git a/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.cpp b/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.cpp index c167f7ba4b..4e17640e7e 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.cpp +++ b/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.cpp @@ -20,6 +20,7 @@ #include "RiaStdStringTools.h" +#include "RifEclEclipseSummary.h" #include "RiuSummaryQuantityNameInfoProvider.h" #include @@ -100,12 +101,10 @@ RifEclipseSummaryAddress::RifEclipseSummaryAddress( SummaryVarCategory case SUMMARY_AQUIFER: m_aquiferNumber = RiaStdStringTools::toInt( identifiers[INPUT_AQUIFER_NUMBER] ); break; - case SUMMARY_CALCULATED: - m_id = RiaStdStringTools::toInt( identifiers[INPUT_ID] ); - break; } m_vectorName = identifiers[INPUT_VECTOR_NAME]; + m_id = RiaStdStringTools::toInt( identifiers[INPUT_ID] ); } //-------------------------------------------------------------------------------------------------- @@ -206,57 +205,12 @@ RifEclipseSummaryAddress RifEclipseSummaryAddress::fromEclipseTextAddress( const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RifEclipseSummaryAddress RifEclipseSummaryAddress::fieldAddress( const std::string& vectorName ) +RifEclipseSummaryAddress RifEclipseSummaryAddress::fieldAddress( const std::string& vectorName, int calculationId ) { RifEclipseSummaryAddress addr; addr.m_variableCategory = SUMMARY_FIELD; addr.m_vectorName = vectorName; - return addr; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RifEclipseSummaryAddress RifEclipseSummaryAddress::aquiferAddress( const std::string& vectorName, int aquiferNumber ) -{ - RifEclipseSummaryAddress addr; - addr.m_variableCategory = SUMMARY_AQUIFER; - addr.m_vectorName = vectorName; - addr.m_aquiferNumber = aquiferNumber; - return addr; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RifEclipseSummaryAddress RifEclipseSummaryAddress::networkAddress( const std::string& vectorName ) -{ - RifEclipseSummaryAddress addr; - addr.m_variableCategory = SUMMARY_NETWORK; - addr.m_vectorName = vectorName; - return addr; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RifEclipseSummaryAddress RifEclipseSummaryAddress::miscAddress( const std::string& vectorName ) -{ - RifEclipseSummaryAddress addr; - addr.m_variableCategory = SUMMARY_MISC; - addr.m_vectorName = vectorName; - return addr; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RifEclipseSummaryAddress RifEclipseSummaryAddress::regionAddress( const std::string& vectorName, int regionNumber ) -{ - RifEclipseSummaryAddress addr; - addr.m_variableCategory = SUMMARY_REGION; - addr.m_vectorName = vectorName; - addr.m_regionNumber = regionNumber; + addr.m_id = calculationId; return addr; } @@ -264,37 +218,96 @@ RifEclipseSummaryAddress RifEclipseSummaryAddress::regionAddress( const std::str /// //-------------------------------------------------------------------------------------------------- RifEclipseSummaryAddress - RifEclipseSummaryAddress::regionToRegionAddress( const std::string& vectorName, int regionNumber, int region2Number ) + RifEclipseSummaryAddress::aquiferAddress( const std::string& vectorName, int aquiferNumber, int calculationId ) +{ + RifEclipseSummaryAddress addr; + addr.m_variableCategory = SUMMARY_AQUIFER; + addr.m_vectorName = vectorName; + addr.m_aquiferNumber = aquiferNumber; + addr.m_id = calculationId; + return addr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RifEclipseSummaryAddress RifEclipseSummaryAddress::networkAddress( const std::string& vectorName, int calculationId ) +{ + RifEclipseSummaryAddress addr; + addr.m_variableCategory = SUMMARY_NETWORK; + addr.m_vectorName = vectorName; + addr.m_id = calculationId; + return addr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RifEclipseSummaryAddress RifEclipseSummaryAddress::miscAddress( const std::string& vectorName, int calculationId ) +{ + RifEclipseSummaryAddress addr; + addr.m_variableCategory = SUMMARY_MISC; + addr.m_vectorName = vectorName; + addr.m_id = calculationId; + return addr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RifEclipseSummaryAddress + RifEclipseSummaryAddress::regionAddress( const std::string& vectorName, int regionNumber, int calculationId ) +{ + RifEclipseSummaryAddress addr; + addr.m_variableCategory = SUMMARY_REGION; + addr.m_vectorName = vectorName; + addr.m_regionNumber = regionNumber; + addr.m_id = calculationId; + return addr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RifEclipseSummaryAddress RifEclipseSummaryAddress::regionToRegionAddress( const std::string& vectorName, + int regionNumber, + int region2Number, + int calculationId ) { RifEclipseSummaryAddress addr; addr.m_variableCategory = SUMMARY_REGION_2_REGION; addr.m_vectorName = vectorName; addr.m_regionNumber = regionNumber; addr.m_regionNumber2 = region2Number; + addr.m_id = calculationId; return addr; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RifEclipseSummaryAddress RifEclipseSummaryAddress::groupAddress( const std::string& vectorName, const std::string& groupName ) +RifEclipseSummaryAddress + RifEclipseSummaryAddress::groupAddress( const std::string& vectorName, const std::string& groupName, int calculationId ) { RifEclipseSummaryAddress addr; addr.m_variableCategory = SUMMARY_GROUP; addr.m_vectorName = vectorName; addr.m_groupName = groupName; + addr.m_id = calculationId; return addr; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RifEclipseSummaryAddress RifEclipseSummaryAddress::wellAddress( const std::string& vectorName, const std::string& wellName ) +RifEclipseSummaryAddress + RifEclipseSummaryAddress::wellAddress( const std::string& vectorName, const std::string& wellName, int calculationId ) { RifEclipseSummaryAddress addr; addr.m_variableCategory = SUMMARY_WELL; addr.m_vectorName = vectorName; addr.m_wellName = wellName; + addr.m_id = calculationId; return addr; } @@ -305,7 +318,8 @@ RifEclipseSummaryAddress RifEclipseSummaryAddress::wellCompletionAddress( const const std::string& wellName, int i, int j, - int k ) + int k, + int calculationId ) { RifEclipseSummaryAddress addr; addr.m_variableCategory = SUMMARY_WELL_COMPLETION; @@ -314,6 +328,7 @@ RifEclipseSummaryAddress RifEclipseSummaryAddress::wellCompletionAddress( const addr.m_cellI = i; addr.m_cellJ = j; addr.m_cellK = k; + addr.m_id = calculationId; return addr; } @@ -322,13 +337,15 @@ RifEclipseSummaryAddress RifEclipseSummaryAddress::wellCompletionAddress( const //-------------------------------------------------------------------------------------------------- RifEclipseSummaryAddress RifEclipseSummaryAddress::wellLgrAddress( const std::string& vectorName, const std::string& lgrName, - const std::string& wellName ) + const std::string& wellName, + int calculationId ) { RifEclipseSummaryAddress addr; addr.m_variableCategory = SUMMARY_WELL_LGR; addr.m_vectorName = vectorName; addr.m_lgrName = lgrName; addr.m_wellName = wellName; + addr.m_id = calculationId; return addr; } @@ -340,7 +357,8 @@ RifEclipseSummaryAddress RifEclipseSummaryAddress::wellCompletionLgrAddress( con const std::string& wellName, int i, int j, - int k ) + int k, + int calculationId ) { RifEclipseSummaryAddress addr; addr.m_variableCategory = SUMMARY_WELL_COMPLETION_LGR; @@ -350,6 +368,7 @@ RifEclipseSummaryAddress RifEclipseSummaryAddress::wellCompletionLgrAddress( con addr.m_cellI = i; addr.m_cellJ = j; addr.m_cellK = k; + addr.m_id = calculationId; return addr; } @@ -358,27 +377,15 @@ RifEclipseSummaryAddress RifEclipseSummaryAddress::wellCompletionLgrAddress( con //-------------------------------------------------------------------------------------------------- RifEclipseSummaryAddress RifEclipseSummaryAddress::wellSegmentAddress( const std::string& vectorName, const std::string& wellName, - int segmentNumber ) + int segmentNumber, + int calculationId ) { RifEclipseSummaryAddress addr; addr.m_variableCategory = SUMMARY_WELL_SEGMENT; addr.m_vectorName = vectorName; addr.m_wellName = wellName; addr.m_wellSegmentNumber = segmentNumber; - return addr; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RifEclipseSummaryAddress RifEclipseSummaryAddress::blockAddress( const std::string& vectorName, int i, int j, int k ) -{ - RifEclipseSummaryAddress addr; - addr.m_variableCategory = SUMMARY_BLOCK; - addr.m_vectorName = vectorName; - addr.m_cellI = i; - addr.m_cellJ = j; - addr.m_cellK = k; + addr.m_id = calculationId; return addr; } @@ -386,7 +393,27 @@ RifEclipseSummaryAddress RifEclipseSummaryAddress::blockAddress( const std::stri /// //-------------------------------------------------------------------------------------------------- RifEclipseSummaryAddress - RifEclipseSummaryAddress::blockLgrAddress( const std::string& vectorName, const std::string& lgrName, int i, int j, int k ) + RifEclipseSummaryAddress::blockAddress( const std::string& vectorName, int i, int j, int k, int calculationId ) +{ + RifEclipseSummaryAddress addr; + addr.m_variableCategory = SUMMARY_BLOCK; + addr.m_vectorName = vectorName; + addr.m_cellI = i; + addr.m_cellJ = j; + addr.m_cellK = k; + addr.m_id = calculationId; + return addr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RifEclipseSummaryAddress RifEclipseSummaryAddress::blockLgrAddress( const std::string& vectorName, + const std::string& lgrName, + int i, + int j, + int k, + int calculationId ) { RifEclipseSummaryAddress addr; addr.m_variableCategory = SUMMARY_BLOCK_LGR; @@ -395,18 +422,7 @@ RifEclipseSummaryAddress addr.m_cellI = i; addr.m_cellJ = j; addr.m_cellK = k; - return addr; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RifEclipseSummaryAddress RifEclipseSummaryAddress::calculatedAddress( const std::string& vectorName, int id ) -{ - RifEclipseSummaryAddress addr; - addr.m_variableCategory = SUMMARY_CALCULATED; - addr.m_vectorName = vectorName; - addr.m_id = id; + addr.m_id = calculationId; return addr; } @@ -585,11 +601,6 @@ std::string RifEclipseSummaryAddress::itemUiText() const text += std::to_string( this->aquiferNumber() ); } break; - case SUMMARY_CALCULATED: - { - text += std::to_string( this->id() ); - } - break; case SUMMARY_IMPORTED: { text += this->vectorName(); @@ -1014,6 +1025,14 @@ std::pair RifEclipseSummaryAddress::regionToRegionPairFromUiTe RiaStdStringTools::toInt16( r2r[1].trimmed().toStdString() ) ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifEclipseSummaryAddress::isCalculated() const +{ + return m_id != -1; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.h b/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.h index a680c3c3b5..63adb2e81f 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.h +++ b/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.h @@ -55,7 +55,6 @@ public: SUMMARY_WELL_SEGMENT, SUMMARY_BLOCK, SUMMARY_BLOCK_LGR, - SUMMARY_CALCULATED, SUMMARY_IMPORTED, SUMMARY_ENSEMBLE_STATISTICS }; @@ -99,31 +98,48 @@ public: static RifEclipseSummaryAddress fromEclipseTextAddress( const std::string& textAddress ); static RifEclipseSummaryAddress fromEclipseTextAddressParseErrorTokens( const std::string& textAddress ); - static RifEclipseSummaryAddress fieldAddress( const std::string& vectorName ); - static RifEclipseSummaryAddress aquiferAddress( const std::string& vectorName, int aquiferNumber ); - static RifEclipseSummaryAddress networkAddress( const std::string& vectorName ); - static RifEclipseSummaryAddress miscAddress( const std::string& vectorName ); - static RifEclipseSummaryAddress regionAddress( const std::string& vectorName, int regionNumber ); + static RifEclipseSummaryAddress fieldAddress( const std::string& vectorName, int calculationId = -1 ); static RifEclipseSummaryAddress - regionToRegionAddress( const std::string& vectorName, int regionNumber, int region2Number ); - static RifEclipseSummaryAddress groupAddress( const std::string& vectorName, const std::string& groupName ); - static RifEclipseSummaryAddress wellAddress( const std::string& vectorName, const std::string& wellName ); + aquiferAddress( const std::string& vectorName, int aquiferNumber, int calculationId = -1 ); + static RifEclipseSummaryAddress networkAddress( const std::string& vectorName, int calculationId = -1 ); + static RifEclipseSummaryAddress miscAddress( const std::string& vectorName, int calculationId = -1 ); + static RifEclipseSummaryAddress regionAddress( const std::string& vectorName, int regionNumber, int calculationId = -1 ); static RifEclipseSummaryAddress - wellCompletionAddress( const std::string& vectorName, const std::string& wellName, int i, int j, int k ); + regionToRegionAddress( const std::string& vectorName, int regionNumber, int region2Number, int calculationId = -1 ); static RifEclipseSummaryAddress - wellLgrAddress( const std::string& vectorName, const std::string& lgrName, const std::string& wellName ); + groupAddress( const std::string& vectorName, const std::string& groupName, int calculationId = -1 ); + static RifEclipseSummaryAddress + wellAddress( const std::string& vectorName, const std::string& wellName, int calculationId = -1 ); + + static RifEclipseSummaryAddress wellCompletionAddress( const std::string& vectorName, + const std::string& wellName, + int i, + int j, + int k, + int calculationId = -1 ); + static RifEclipseSummaryAddress wellLgrAddress( const std::string& vectorName, + const std::string& lgrName, + const std::string& wellName, + int calculationId = -1 ); static RifEclipseSummaryAddress wellCompletionLgrAddress( const std::string& vectorName, const std::string& lgrName, const std::string& wellName, int i, int j, - int k ); + int k, + int calculationId = -1 ); + static RifEclipseSummaryAddress wellSegmentAddress( const std::string& vectorName, + const std::string& wellName, + int segmentNumber, + int calculationId = -1 ); static RifEclipseSummaryAddress - wellSegmentAddress( const std::string& vectorName, const std::string& wellName, int segmentNumber ); - static RifEclipseSummaryAddress blockAddress( const std::string& vectorName, int i, int j, int k ); - static RifEclipseSummaryAddress - blockLgrAddress( const std::string& vectorName, const std::string& lgrName, int i, int j, int k ); - static RifEclipseSummaryAddress calculatedAddress( const std::string& vectorName, int id ); + blockAddress( const std::string& vectorName, int i, int j, int k, int calculationId = -1 ); + static RifEclipseSummaryAddress blockLgrAddress( const std::string& vectorName, + const std::string& lgrName, + int i, + int j, + int k, + int calculationId = -1 ); static RifEclipseSummaryAddress importedAddress( const std::string& vectorName ); static RifEclipseSummaryAddress ensembleStatisticsAddress( const std::string& vectorName, const std::string& datavectorName ); @@ -167,6 +183,7 @@ public: void setWellName( const std::string& wellName ) { m_wellName = wellName; } void setGroupName( const std::string& groupName ) { m_groupName = groupName; } void setRegion( int region ) { m_regionNumber = (int16_t)region; } + void setRegion2( int region2 ) { m_regionNumber2 = (int16_t)region2; } void setAquiferNumber( int aquiferNumber ) { m_aquiferNumber = (int16_t)aquiferNumber; } void setCellIjk( const std::string& uiText ); void setWellSegmentNumber( int segment ) { m_wellSegmentNumber = (int16_t)segment; } @@ -182,13 +199,16 @@ public: auto operator<=>( const RifEclipseSummaryAddress& rhs ) const = default; + bool isCalculated() const; + + std::string formatUiTextRegionToRegion() const; + static std::pair regionToRegionPairFromUiText( const std::string& s ); + private: static RifEclipseSummaryAddress fromTokens( const std::vector& tokens ); bool isValidEclipseCategory() const; static std::tuple ijkTupleFromUiText( const std::string& s ); - std::string formatUiTextRegionToRegion() const; - std::pair regionToRegionPairFromUiText( const std::string& s ); private: // The ordering the variables are defined in defines how the objects get sorted. Members defined first will be diff --git a/ApplicationLibCode/FileInterface/RifEclipseUserDataKeywordTools.cpp b/ApplicationLibCode/FileInterface/RifEclipseUserDataKeywordTools.cpp index f73b1303c1..6b5692fd99 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseUserDataKeywordTools.cpp +++ b/ApplicationLibCode/FileInterface/RifEclipseUserDataKeywordTools.cpp @@ -277,8 +277,6 @@ RifEclipseSummaryAddress RifEclipseUserDataKeywordTools::makeAndFillAddress( con RifEclipseUserDataKeywordTools::extractThreeInts( &cellI, &cellJ, &cellK, columnHeaderText[1] ); } break; - case RifEclipseSummaryAddress::SUMMARY_CALCULATED: - break; default: break; } diff --git a/ApplicationLibCode/FileInterface/RifMultipleSummaryReaders.cpp b/ApplicationLibCode/FileInterface/RifMultipleSummaryReaders.cpp index 389d223df3..56fe36ab51 100644 --- a/ApplicationLibCode/FileInterface/RifMultipleSummaryReaders.cpp +++ b/ApplicationLibCode/FileInterface/RifMultipleSummaryReaders.cpp @@ -17,6 +17,7 @@ ///////////////////////////////////////////////////////////////////////////////// #include "RifMultipleSummaryReaders.h" +#include "RimCalculatedSummaryCurveReader.h" //-------------------------------------------------------------------------------------------------- /// @@ -104,8 +105,12 @@ void RifMultipleSummaryReaders::rebuildMetaData() m_allErrorAddresses.clear(); m_allResultAddresses.clear(); - for ( const auto& reader : m_readers ) + for ( auto& reader : m_readers ) { + // TODO: hack. Find a better way to rebuild calculated summary meta data. + auto calcReader = dynamic_cast( reader.p() ); + if ( calcReader ) calcReader->buildMetaData(); + { auto resultAddresses = reader->allResultAddresses(); m_allResultAddresses.insert( resultAddresses.begin(), resultAddresses.end() ); diff --git a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.cpp b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.cpp index c75e061b7c..da5df1db90 100644 --- a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.cpp @@ -34,7 +34,6 @@ #include "RifSummaryReaderInterface.h" #include "RimAnalysisPlotDataEntry.h" -#include "RimCalculatedSummaryCase.h" #include "RimDerivedSummaryCase.h" #include "RimPlotAxisProperties.h" #include "RimPlotAxisPropertiesInterface.h" @@ -1590,10 +1589,7 @@ void RimAnalysisPlot::updatePlotTitle() QStringList caseNameList; for ( auto summaryCase : getOrCreateSelectedCurveDefAnalyser()->m_singleSummaryCases ) { - if ( !dynamic_cast( summaryCase ) ) - { - caseNameList.push_back( summaryCase->displayCaseName() ); - } + caseNameList.push_back( summaryCase->displayCaseName() ); } QString root = RiaTextStringTools::commonRoot( caseNameList ); diff --git a/ApplicationLibCode/ProjectDataModel/RimDataSourceSteppingTools.cpp b/ApplicationLibCode/ProjectDataModel/RimDataSourceSteppingTools.cpp index 28952e4db9..32e9583b95 100644 --- a/ApplicationLibCode/ProjectDataModel/RimDataSourceSteppingTools.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimDataSourceSteppingTools.cpp @@ -20,6 +20,7 @@ #include "RiaSummaryAddressAnalyzer.h" +#include "RifEclipseSummaryAddress.h" #include "cafPdmUiFieldHandle.h" #include "cvfAssert.h" @@ -141,6 +142,19 @@ bool RimDataSourceSteppingTools::updateAddressIfMatching( const QVariant& return true; } } + else if ( category == RifEclipseSummaryAddress::SUMMARY_REGION_2_REGION ) + { + std::string oldString = oldValue.toString().toStdString(); + std::string newString = newValue.toString().toStdString(); + if ( adr->formatUiTextRegionToRegion() == oldString ) + { + auto [region1, region2] = RifEclipseSummaryAddress::regionToRegionPairFromUiText( newString ); + adr->setRegion( region1 ); + adr->setRegion2( region2 ); + + return true; + } + } else if ( category == RifEclipseSummaryAddress::SUMMARY_WELL_SEGMENT ) { int oldInt = oldValue.toInt(); diff --git a/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.cpp index e26fd2dff5..0d343aa5f6 100644 --- a/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.cpp @@ -378,20 +378,6 @@ void RimMainPlotCollection::ensureDefaultFlowPlotsAreCreated() m_flowPlotCollection()->ensureDefaultFlowPlotsAreCreated(); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimMainPlotCollection::ensureCalculationIdsAreAssigned() -{ - std::vector allAddresses; - this->descendantsIncludingThisOfType( allAddresses ); - - for ( RimSummaryAddress* adr : allAddresses ) - { - adr->ensureCalculationIdIsAssigned(); - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.h b/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.h index ec2b378b74..4a07c3dd88 100644 --- a/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.h +++ b/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.h @@ -88,7 +88,6 @@ public: void scheduleUpdatePlotsWithCompletions(); void deleteAllCachedData(); void ensureDefaultFlowPlotsAreCreated(); - void ensureCalculationIdsAreAssigned(); void loadDataAndUpdateAllPlots(); void updateSelectedWell( QString wellName ); diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp index 00a9eb6d6a..f243adf75f 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp @@ -891,7 +891,7 @@ void RimPlotCurve::updateLegendEntryVisibilityNoPlotUpdate() bool anyCalculated = false; for ( const auto c : summaryPlot->summaryCurves() ) { - if ( c->summaryAddressY().category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) + if ( c->summaryAddressY().isCalculated() ) { // Never hide the legend for calculated curves, as the curve legend is used to // show some essential auto generated data diff --git a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.cpp b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.cpp index 46c1a84f1e..49c342bc69 100644 --- a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.cpp @@ -18,16 +18,22 @@ #include "RimSummaryCalculation.h" -#include "expressionparser/ExpressionParser.h" +#include "RifEclipseSummaryAddress.h" #include "RiaCurveMerger.h" #include "RiaLogging.h" #include "RiaSummaryCurveDefinition.h" #include "RiaSummaryTools.h" +#include "RifSummaryReaderInterface.h" +#include "RimDataSourceSteppingTools.h" +#include "RimProject.h" #include "RimSummaryAddress.h" #include "RimSummaryCalculationCollection.h" #include "RimSummaryCalculationVariable.h" +#include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" +#include "RimSummaryCaseMainCollection.h" #include "RimSummaryCurve.h" #include "RimSummaryMultiPlot.h" #include "RimSummaryMultiPlotCollection.h" @@ -39,6 +45,8 @@ #include "cafPdmUiTableViewEditor.h" #include "cafPdmUiTextEditor.h" +#include "expressionparser/ExpressionParser.h" + #include CAF_PDM_SOURCE_INIT( RimSummaryCalculation, "RimSummaryCalculation" ); @@ -49,6 +57,11 @@ CAF_PDM_SOURCE_INIT( RimSummaryCalculation, "RimSummaryCalculation" ); RimSummaryCalculation::RimSummaryCalculation() { CAF_PDM_InitObject( "RimSummaryCalculation", ":/octave.png", "Calculation", "" ); + + CAF_PDM_InitField( &m_distributeToOtherItems, + "DistributeToOtherItems", + true, + "Distribute to other items (wells, groups, ..)" ); } //-------------------------------------------------------------------------------------------------- @@ -62,12 +75,54 @@ RimSummaryCalculationVariable* RimSummaryCalculation::createVariable() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RimSummaryCalculation::calculate() +std::optional> RimSummaryCalculation::getVariables() const { - QString leftHandSideVariableName = RimSummaryCalculation::findLeftHandSide( m_expression ); + std::vector variables; - RiaTimeHistoryCurveMerger timeHistoryCurveMerger; + for ( size_t i = 0; i < m_variables.size(); i++ ) + { + RimSummaryCalculationVariable* v = dynamic_cast( m_variables[i] ); + CAF_ASSERT( v != nullptr ); + if ( !v->summaryCase() ) + { + return {}; + } + + if ( !v->summaryAddress() ) + { + return {}; + } + + if ( v->summaryAddress()->address().id() == id() ) + { + return {}; + } + + if ( v->summaryAddress()->address().isCalculated() ) + { + std::set calcIds; + if ( detectCyclicCalculation( v->summaryAddress()->address().id(), calcIds ) ) + { + return {}; + } + } + + SummaryCalculationVariable variable; + variable.name = v->name(); + variable.summaryCase = v->summaryCase(); + variable.summaryAddress = v->summaryAddress()->address(); + variables.push_back( variable ); + } + + return variables; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimSummaryCalculation::checkVariables() const +{ for ( size_t i = 0; i < m_variables.size(); i++ ) { RimSummaryCalculationVariable* v = dynamic_cast( m_variables[i] ); @@ -78,7 +133,6 @@ bool RimSummaryCalculation::calculate() RiaLogging::errorInMessageBox( nullptr, "Expression Parser", QString( "No summary case defined for variable : %1" ).arg( v->name() ) ); - return false; } @@ -87,11 +141,180 @@ bool RimSummaryCalculation::calculate() RiaLogging::errorInMessageBox( nullptr, "Expression Parser", QString( "No summary address defined for variable : %1" ).arg( v->name() ) ); - return false; } - RiaSummaryCurveDefinition curveDef( v->summaryCase(), v->summaryAddress()->address(), false ); + if ( v->summaryAddress()->address().id() == id() ) + { + RiaLogging::errorInMessageBox( nullptr, + "Expression Parser", + QString( "Recursive calculation detected for variable : %1" ).arg( v->name() ) ); + return false; + } + + if ( v->summaryAddress()->address().isCalculated() ) + { + std::set calcIds; + if ( detectCyclicCalculation( v->summaryAddress()->address().id(), calcIds ) ) + { + RiaLogging::errorInMessageBox( nullptr, + "Expression Parser", + QString( "Cyclic calculation detected for variable : %1" ).arg( v->name() ) ); + return false; + } + } + } + + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimSummaryCalculation::detectCyclicCalculation( int id, std::set& ids ) const +{ + if ( ids.count( id ) > 0 ) + return true; + else + { + ids.insert( id ); + + // Get calculation for the referenced id + RimSummaryCalculationCollection* calcColl = RimProject::current()->calculationCollection(); + auto calc = dynamic_cast( calcColl->findCalculationById( id ) ); + + // Check if any of the variables references already seen calculations + auto vars = calc->variables(); + for ( size_t i = 0; i < vars->size(); i++ ) + { + auto variable = dynamic_cast( vars->at( i ) ); + auto addr = variable->summaryAddress()->address(); + + if ( addr.id() != -1 && detectCyclicCalculation( addr.id(), ids ) ) return true; + } + + return false; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimSummaryCalculation::calculate() +{ + auto isOk = checkVariables(); + if ( !isOk ) return false; + + // Not much to do for calculate: values and timesteps are generate when needed later. + m_isDirty = false; + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryCalculation::substituteVariables( std::vector& vars, + const RifEclipseSummaryAddress& address ) +{ + auto firstVariable = vars.front(); + + auto category = firstVariable.summaryAddress.category(); + + QVariant oldValue; + QVariant newValue; + bool isHandledBySteppingTools = false; + if ( category == RifEclipseSummaryAddress::SUMMARY_WELL ) + { + oldValue = QString::fromStdString( firstVariable.summaryAddress.wellName() ); + newValue = QString::fromStdString( address.wellName() ); + isHandledBySteppingTools = true; + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_REGION ) + { + oldValue = firstVariable.summaryAddress.regionNumber(); + newValue = address.regionNumber(); + isHandledBySteppingTools = true; + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_GROUP ) + { + oldValue = QString::fromStdString( firstVariable.summaryAddress.groupName() ); + newValue = QString::fromStdString( address.groupName() ); + isHandledBySteppingTools = true; + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_AQUIFER ) + { + oldValue = firstVariable.summaryAddress.aquiferNumber(); + newValue = address.aquiferNumber(); + isHandledBySteppingTools = true; + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION || + category == RifEclipseSummaryAddress::SUMMARY_BLOCK ) + { + oldValue = QString::fromStdString( firstVariable.summaryAddress.blockAsString() ); + newValue = QString::fromStdString( address.blockAsString() ); + isHandledBySteppingTools = true; + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_MISC || category == RifEclipseSummaryAddress::SUMMARY_FIELD ) + { + // No need to do anything for these types + return; + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_REGION_2_REGION ) + { + oldValue = QString::fromStdString( firstVariable.summaryAddress.formatUiTextRegionToRegion() ); + newValue = QString::fromStdString( address.formatUiTextRegionToRegion() ); + isHandledBySteppingTools = true; + } + else + { + RiaLogging::error( QString( "Unhandled subst for category: %1" ).arg( address.uiText().c_str() ) ); + } + + if ( isHandledBySteppingTools ) + { + for ( auto& v : vars ) + { + if ( v.summaryAddress.category() == address.category() ) + { + RimDataSourceSteppingTools::updateAddressIfMatching( oldValue, newValue, address.category(), &v.summaryAddress ); + } + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::optional, std::vector>> + RimSummaryCalculation::calculateWithSubstitutions( RimSummaryCase* summaryCase, const RifEclipseSummaryAddress& addr ) +{ + auto variables = getVariables(); + if ( !variables ) return {}; + + auto vars = variables.value(); + substituteVariables( vars, addr ); + + return calculateResult( m_expression, vars, summaryCase ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::optional, std::vector>> + RimSummaryCalculation::calculateResult( const QString& expression, + const std::vector& variables, + RimSummaryCase* summaryCase ) + +{ + QString leftHandSideVariableName = RimSummaryCalculation::findLeftHandSide( expression ); + + RiaTimeHistoryCurveMerger timeHistoryCurveMerger; + + for ( size_t i = 0; i < variables.size(); i++ ) + { + SummaryCalculationVariable v = variables[i]; + + RiaSummaryCurveDefinition curveDef( summaryCase, v.summaryAddress, false ); std::vector curveValues; RiaSummaryCurveDefinition::resultValues( curveDef, &curveValues ); @@ -102,17 +325,21 @@ bool RimSummaryCalculation::calculate() { timeHistoryCurveMerger.addCurveData( curveTimeSteps, curveValues ); } + else + { + // One variable is missing: not possible to complete the calculation. + // Can happen when stepping and substituting variables. + return {}; + } } timeHistoryCurveMerger.computeInterpolatedValues(); ExpressionParser parser; - for ( size_t i = 0; i < m_variables.size(); i++ ) + for ( size_t i = 0; i < variables.size(); i++ ) { - RimSummaryCalculationVariable* v = dynamic_cast( m_variables[i] ); - CAF_ASSERT( v != nullptr ); - - parser.assignVector( v->name(), timeHistoryCurveMerger.interpolatedYValuesForAllXValues( i ) ); + SummaryCalculationVariable v = variables[i]; + parser.assignVector( v.name, timeHistoryCurveMerger.interpolatedYValuesForAllXValues( i ) ); } std::vector resultValues; @@ -121,13 +348,10 @@ bool RimSummaryCalculation::calculate() parser.assignVector( leftHandSideVariableName, resultValues ); QString errorText; - bool evaluatedOk = parser.expandIfStatementsAndEvaluate( m_expression, &errorText ); + bool evaluatedOk = parser.expandIfStatementsAndEvaluate( expression, &errorText ); if ( evaluatedOk ) { - m_timesteps.v().clear(); - m_calculatedValues.v().clear(); - if ( timeHistoryCurveMerger.validIntervalsForAllXValues().size() > 0 ) { size_t firstValidTimeStep = timeHistoryCurveMerger.validIntervalsForAllXValues().front().first; @@ -141,12 +365,9 @@ bool RimSummaryCalculation::calculate() std::vector validValues( resultValues.begin() + firstValidTimeStep, resultValues.begin() + lastValidTimeStep ); - m_timesteps = validTimeSteps; - m_calculatedValues = validValues; + return std::make_pair( validValues, validTimeSteps ); } } - - m_isDirty = false; } else { @@ -156,7 +377,7 @@ bool RimSummaryCalculation::calculate() RiaLogging::errorInMessageBox( nullptr, "Expression Parser", s ); } - return evaluatedOk; + return {}; } //-------------------------------------------------------------------------------------------------- @@ -168,6 +389,23 @@ void RimSummaryCalculation::updateDependentObjects() this->firstAncestorOrThisOfTypeAsserted( calcColl ); calcColl->rebuildCaseMetaData(); + // Refresh data sources tree. + // TODO: refresh too much: would be enough to only refresh calculated resutls. + RimSummaryCaseMainCollection* summaryCaseCollection = RiaSummaryTools::summaryCaseMainCollection(); + auto summaryCases = summaryCaseCollection->allSummaryCases(); + for ( RimSummaryCase* summaryCase : summaryCases ) + { + summaryCase->createSummaryReaderInterface(); + summaryCase->createRftReaderInterface(); + summaryCase->refreshMetaData(); + } + + auto summaryCaseCollections = summaryCaseCollection->summaryCaseCollections(); + for ( RimSummaryCaseCollection* summaryCaseCollection : summaryCaseCollections ) + { + summaryCaseCollection->refreshMetaData(); + } + RimSummaryMultiPlotCollection* summaryPlotCollection = RiaSummaryTools::summaryMultiPlotCollection(); for ( auto multiPlot : summaryPlotCollection->multiPlots() ) { @@ -177,7 +415,7 @@ void RimSummaryCalculation::updateDependentObjects() for ( RimSummaryCurve* sumCurve : sumPlot->summaryCurves() ) { - if ( sumCurve->summaryAddressY().category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) + if ( sumCurve->summaryAddressY().isCalculated() ) { sumCurve->updateConnectedEditors(); @@ -199,3 +437,216 @@ void RimSummaryCalculation::updateDependentObjects() void RimSummaryCalculation::removeDependentObjects() { } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimSummaryCalculation::allAddressesForSummaryCase( RimSummaryCase* summaryCase ) const +{ + auto variables = getVariables(); + if ( variables && !variables.value().empty() ) + { + // The first variable is the substituable one. Use its category to + // provide all available addresses. + auto firstVariable = variables.value().front(); + if ( m_distributeToOtherItems ) + { + auto allResultAddresses = summaryCase->summaryReader()->allResultAddresses(); + return allAddressesForCategory( firstVariable.summaryAddress.category(), allResultAddresses ); + } + else + { + // Generate the result only for the first variable + return { RimSummaryCalculationAddress( singleAddressesForCategory( firstVariable.summaryAddress ) ) }; + } + } + + return {}; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector + RimSummaryCalculation::allAddressesForCategory( RifEclipseSummaryAddress::SummaryVarCategory category, + const std::set& allResultAddresses ) const +{ + std::vector addresses; + + std::string name = shortName().toStdString(); + if ( category == RifEclipseSummaryAddress::SUMMARY_FIELD ) + { + addresses.push_back( RimSummaryCalculationAddress( RifEclipseSummaryAddress::fieldAddress( name, m_id ) ) ); + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_AQUIFER ) + { + std::set uniqueNumbers; + std::for_each( allResultAddresses.begin(), allResultAddresses.end(), [&]( const auto& addr ) { + uniqueNumbers.insert( addr.aquiferNumber() ); + } ); + + for ( auto num : uniqueNumbers ) + { + addresses.push_back( + RimSummaryCalculationAddress( RifEclipseSummaryAddress::aquiferAddress( name, num, m_id ) ) ); + } + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_MISC ) + { + addresses.push_back( RimSummaryCalculationAddress( RifEclipseSummaryAddress::miscAddress( name, m_id ) ) ); + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_NETWORK ) + { + addresses.push_back( RimSummaryCalculationAddress( RifEclipseSummaryAddress::networkAddress( name, m_id ) ) ); + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_WELL ) + { + std::set uniqueWellNames; + std::for_each( allResultAddresses.begin(), allResultAddresses.end(), [&]( const auto& addr ) { + uniqueWellNames.insert( addr.wellName() ); + } ); + + for ( auto wellName : uniqueWellNames ) + { + addresses.push_back( + RimSummaryCalculationAddress( RifEclipseSummaryAddress::wellAddress( name, wellName, m_id ) ) ); + } + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_GROUP ) + { + std::set uniqueGroupNames; + std::for_each( allResultAddresses.begin(), allResultAddresses.end(), [&]( const auto& addr ) { + uniqueGroupNames.insert( addr.groupName() ); + } ); + + for ( auto groupName : uniqueGroupNames ) + { + addresses.push_back( + RimSummaryCalculationAddress( RifEclipseSummaryAddress::groupAddress( name, groupName, m_id ) ) ); + } + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_REGION ) + { + std::set uniqueRegionNumbers; + std::for_each( allResultAddresses.begin(), allResultAddresses.end(), [&]( const auto& addr ) { + uniqueRegionNumbers.insert( addr.regionNumber() ); + } ); + + for ( auto regionNumber : uniqueRegionNumbers ) + { + addresses.push_back( + RimSummaryCalculationAddress( RifEclipseSummaryAddress::regionAddress( name, regionNumber, m_id ) ) ); + } + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_REGION_2_REGION ) + { + std::set> uniqueRegionNumbers; + std::for_each( allResultAddresses.begin(), allResultAddresses.end(), [&]( const auto& addr ) { + uniqueRegionNumbers.insert( std::make_pair( addr.regionNumber(), addr.regionNumber2() ) ); + } ); + + for ( auto regionNumber : uniqueRegionNumbers ) + { + auto [r1, r2] = regionNumber; + addresses.push_back( + RimSummaryCalculationAddress( RifEclipseSummaryAddress::regionToRegionAddress( name, r1, r2, m_id ) ) ); + } + } + + return addresses; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSummaryCalculationAddress RimSummaryCalculation::singleAddressesForCategory( const RifEclipseSummaryAddress& address ) const +{ + std::string name = shortName().toStdString(); + + RifEclipseSummaryAddress::SummaryVarCategory category = address.category(); + if ( category == RifEclipseSummaryAddress::SUMMARY_FIELD ) + { + return RifEclipseSummaryAddress::fieldAddress( name, m_id ); + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_AQUIFER ) + { + return RifEclipseSummaryAddress::aquiferAddress( name, address.aquiferNumber(), m_id ); + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_MISC ) + { + return RifEclipseSummaryAddress::miscAddress( name, m_id ); + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_NETWORK ) + { + return RifEclipseSummaryAddress::networkAddress( name, m_id ); + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_WELL ) + { + return RifEclipseSummaryAddress::wellAddress( name, address.wellName(), m_id ); + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_GROUP ) + { + return RifEclipseSummaryAddress::groupAddress( name, address.groupName(), m_id ); + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_REGION ) + { + return RifEclipseSummaryAddress::regionAddress( name, address.regionNumber(), m_id ); + } + else if ( category == RifEclipseSummaryAddress::SUMMARY_REGION_2_REGION ) + { + return RifEclipseSummaryAddress::regionToRegionAddress( name, address.regionNumber(), address.regionNumber2(), m_id ); + } + + return RifEclipseSummaryAddress(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimSummaryCalculation::values( RimSummaryCase* summaryCase, const RimSummaryCalculationAddress& address ) + +{ + CAF_ASSERT( summaryCase ); + + const auto& result = calculateWithSubstitutions( summaryCase, address.address() ); + if ( result ) + { + auto [validValues, validTimeSteps] = result.value(); + return validValues; + } + + return {}; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimSummaryCalculation::timeSteps( RimSummaryCase* summaryCase, + const RimSummaryCalculationAddress& address ) +{ + CAF_ASSERT( summaryCase ); + + const auto& result = calculateWithSubstitutions( summaryCase, address.address() ); + if ( result ) + { + auto [validValues, validTimeSteps] = result.value(); + return validTimeSteps; + } + + return {}; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimSummaryCalculation::buildCalculationName() const +{ + QString name = "Default Calculation Name"; + + if ( !m_expression.v().isEmpty() ) + { + name = m_expression; + } + + return name; +} diff --git a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.h b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.h index 0767d0fdc5..fd99ea9c8b 100644 --- a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.h +++ b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.h @@ -25,6 +25,27 @@ /// /// //================================================================================================== +class RimSummaryCalculationAddress +{ +public: + RimSummaryCalculationAddress( RifEclipseSummaryAddress summaryAddress ) + : m_summaryAddress( summaryAddress ) + { + } + + RifEclipseSummaryAddress address() const { return m_summaryAddress; } + +private: + RifEclipseSummaryAddress m_summaryAddress; +}; + +struct SummaryCalculationVariable +{ + QString name; + RimSummaryCase* summaryCase; + RifEclipseSummaryAddress summaryAddress; +}; + class RimSummaryCalculation : public RimUserDefinedCalculation { CAF_PDM_HEADER_INIT; @@ -32,10 +53,42 @@ class RimSummaryCalculation : public RimUserDefinedCalculation public: RimSummaryCalculation(); + std::vector allAddressesForSummaryCase( RimSummaryCase* summaryCase ) const; + + std::vector values( RimSummaryCase* summaryCase, const RimSummaryCalculationAddress& addr ); + std::vector timeSteps( RimSummaryCase* summaryCase, const RimSummaryCalculationAddress& addr ); + bool calculate() override; void updateDependentObjects() override; void removeDependentObjects() override; + QString buildCalculationName() const override; + protected: RimSummaryCalculationVariable* createVariable() override; + + static std::optional, std::vector>> + calculateResult( const QString& expression, + const std::vector& variables, + RimSummaryCase* summaryCase ); + + std::optional, std::vector>> + calculateWithSubstitutions( RimSummaryCase* summaryCase, const RifEclipseSummaryAddress& addr ); + + static void substituteVariables( std::vector& vars, + const RifEclipseSummaryAddress& address ); + + std::vector + allAddressesForCategory( RifEclipseSummaryAddress::SummaryVarCategory category, + const std::set& allResultAddresses ) const; + + RimSummaryCalculationAddress singleAddressesForCategory( const RifEclipseSummaryAddress& address ) const; + + std::optional> getVariables() const; + + bool checkVariables() const; + + bool detectCyclicCalculation( int id, std::set& ids ) const; + + caf::PdmField m_distributeToOtherItems; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationCollection.cpp index d1e87b98a5..e8e8cf5eda 100644 --- a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationCollection.cpp @@ -18,13 +18,8 @@ #include "RimSummaryCalculationCollection.h" -#include "RimCalculatedSummaryCase.h" -#include "RimProject.h" #include "RimSummaryCalculation.h" -#include "cafPdmUiGroup.h" -#include "cafPdmUiTreeSelectionEditor.h" - CAF_PDM_SOURCE_INIT( RimSummaryCalculationCollection, "RimSummaryCalculationCollection" ); //-------------------------------------------------------------------------------------------------- /// @@ -32,10 +27,6 @@ CAF_PDM_SOURCE_INIT( RimSummaryCalculationCollection, "RimSummaryCalculationColl RimSummaryCalculationCollection::RimSummaryCalculationCollection() { CAF_PDM_InitObject( "Calculation Collection", ":/chain.png" ); - - CAF_PDM_InitFieldNoDefault( &m_calcuationSummaryCase, "CalculationsSummaryCase", "Calculations Summary Case" ); - m_calcuationSummaryCase.xmlCapability()->disableIO(); - m_calcuationSummaryCase = new RimCalculatedSummaryCase; } //-------------------------------------------------------------------------------------------------- @@ -46,21 +37,12 @@ RimSummaryCalculation* RimSummaryCalculationCollection::createCalculation() cons return new RimSummaryCalculation; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimSummaryCase* RimSummaryCalculationCollection::calculationSummaryCase() -{ - return m_calcuationSummaryCase(); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimSummaryCalculationCollection::rebuildCaseMetaData() { ensureValidCalculationIds(); - m_calcuationSummaryCase->buildMetaData(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationCollection.h b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationCollection.h index 3d245d7ffb..8d7f21d06c 100644 --- a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationCollection.h +++ b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationCollection.h @@ -21,8 +21,6 @@ #include "RimSummaryCalculation.h" #include "RimUserDefinedCalculationCollection.h" -#include "cafPdmChildArrayField.h" -#include "cafPdmChildField.h" #include "cafPdmObject.h" class RimSummaryCase; @@ -39,15 +37,10 @@ class RimSummaryCalculationCollection : public RimUserDefinedCalculationCollecti public: RimSummaryCalculationCollection(); - RimSummaryCase* calculationSummaryCase(); - void rebuildCaseMetaData() override; RimSummaryCalculation* createCalculation() const override; private: void initAfterRead() override; - -private: - caf::PdmChildField m_calcuationSummaryCase; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationVariable.cpp b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationVariable.cpp index 94583d8be9..e0c4d85873 100644 --- a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationVariable.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculationVariable.cpp @@ -28,6 +28,7 @@ #include "RimSummaryAddress.h" #include "RimSummaryCalculation.h" #include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" #include "RimSummaryCurve.h" #include "RiuDragDrop.h" @@ -69,6 +70,7 @@ void RimSummaryCalculationVariable::fieldChangedByUi( const caf::PdmFieldHandle* { RiuSummaryVectorSelectionDialog dlg( nullptr ); dlg.hideEnsembles(); + dlg.hideCalculationIncompatibleCategories(); readDataFromApplicationStore( &dlg ); @@ -140,6 +142,16 @@ void RimSummaryCalculationVariable::setSummaryAddress( const RimSummaryAddress& auto summaryCase = RiaSummaryTools::summaryCaseById( address.caseId() ); + // Use first summary case for ensemble addresses + if ( address.isEnsemble() ) + { + auto ensemble = RiaSummaryTools::ensembleById( address.ensembleId() ); + if ( ensemble ) + { + summaryCase = ensemble->firstSummaryCase(); + } + } + if ( summaryCase ) m_case = summaryCase; } diff --git a/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.cpp b/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.cpp index 6ba3610ad3..bae6424168 100644 --- a/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.cpp @@ -67,9 +67,13 @@ RimUserDefinedCalculation::RimUserDefinedCalculation() m_unit.uiCapability()->setUiEditorTypeName( caf::PdmUiLineEditor::uiEditorTypeName() ); CAF_PDM_InitFieldNoDefault( &m_variables, "Variables", "Variables" ); - CAF_PDM_InitFieldNoDefault( &m_calculatedValues, "CalculatedValues", "Calculated Values" ); - CAF_PDM_InitFieldNoDefault( &m_timesteps, "TimeSteps", "Time Steps" ); + CAF_PDM_InitFieldNoDefault( &m_calculatedValues_OBSOLETE, "CalculatedValues", "Calculated Values" ); + m_calculatedValues_OBSOLETE.xmlCapability()->disableIO(); + + CAF_PDM_InitFieldNoDefault( &m_timesteps_OBSOLETE, "TimeSteps", "Time Steps" ); + m_timesteps_OBSOLETE.xmlCapability()->disableIO(); + CAF_PDM_InitField( &m_id, "Id", -1, "Id" ); m_id.uiCapability()->setUiHidden( true ); @@ -149,22 +153,6 @@ void RimUserDefinedCalculation::deleteVariable( RimUserDefinedCalculationVariabl delete calcVariable; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -const std::vector& RimUserDefinedCalculation::values() const -{ - return m_calculatedValues(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -const std::vector& RimUserDefinedCalculation::timeSteps() const -{ - return m_timesteps(); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -421,3 +409,11 @@ std::vector RimUserDefinedCalculation::allVa { return m_variables.children(); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimUserDefinedCalculation::shortName() const +{ + return RimUserDefinedCalculation::findLeftHandSide( m_expression ); +} diff --git a/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.h b/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.h index 50e6093191..80a799da72 100644 --- a/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.h +++ b/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.h @@ -51,9 +51,6 @@ public: std::vector allVariables() const; - const std::vector& values() const; - const std::vector& timeSteps() const; - void setExpression( const QString& expr ); QString expression() const; QString unitName() const; @@ -68,6 +65,8 @@ public: static QString findLeftHandSide( const QString& expression ); void attachToWidget(); + QString shortName() const; + protected: virtual RimUserDefinedCalculationVariable* createVariable() = 0; @@ -81,7 +80,7 @@ protected: RimUserDefinedCalculationVariable* addVariable( const QString& name ); void deleteVariable( RimUserDefinedCalculationVariable* calcVariable ); - QString buildCalculationName() const; + virtual QString buildCalculationName() const; protected: caf::PdmField m_description; @@ -92,8 +91,8 @@ protected: caf::PdmChildArrayField m_variables; - caf::PdmField> m_calculatedValues; - caf::PdmField> m_timesteps; + caf::PdmField> m_calculatedValues_OBSOLETE; + caf::PdmField> m_timesteps_OBSOLETE; caf::PdmField m_id; std::unique_ptr m_exprContextMenuMgr; diff --git a/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculationCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculationCollection.cpp index c22ec8a02d..8fdb809ac2 100644 --- a/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculationCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculationCollection.cpp @@ -18,7 +18,6 @@ #include "RimUserDefinedCalculationCollection.h" -#include "RimCalculatedSummaryCase.h" #include "RimProject.h" #include "RimUserDefinedCalculation.h" diff --git a/ApplicationLibCode/ProjectDataModel/Summary/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Summary/CMakeLists_files.cmake index 8826f57724..fe1e28cf2a 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/Summary/CMakeLists_files.cmake @@ -18,7 +18,6 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RimObservedSummaryData.h ${CMAKE_CURRENT_LIST_DIR}/RimSummaryObservedDataFile.h ${CMAKE_CURRENT_LIST_DIR}/RimObservedEclipseUserData.h - ${CMAKE_CURRENT_LIST_DIR}/RimCalculatedSummaryCase.h ${CMAKE_CURRENT_LIST_DIR}/RimCalculatedSummaryCurveReader.h ${CMAKE_CURRENT_LIST_DIR}/RimSummaryAddress.h ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCrossPlot.h @@ -70,7 +69,6 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RimObservedSummaryData.cpp ${CMAKE_CURRENT_LIST_DIR}/RimSummaryObservedDataFile.cpp ${CMAKE_CURRENT_LIST_DIR}/RimObservedEclipseUserData.cpp - ${CMAKE_CURRENT_LIST_DIR}/RimCalculatedSummaryCase.cpp ${CMAKE_CURRENT_LIST_DIR}/RimCalculatedSummaryCurveReader.cpp ${CMAKE_CURRENT_LIST_DIR}/RimSummaryAddress.cpp ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCrossPlot.cpp diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.cpp deleted file mode 100644 index 3831a25ce8..0000000000 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.cpp +++ /dev/null @@ -1,88 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2017 Statoil 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 "RimCalculatedSummaryCase.h" - -#include "RiaSummaryDefines.h" - -#include "RimSummaryCalculation.h" -#include "RimSummaryCalculationCollection.h" - -CAF_PDM_SOURCE_INIT( RimCalculatedSummaryCase, "CalculatedSummaryCase" ); - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimCalculatedSummaryCase::RimCalculatedSummaryCase() -{ - CAF_PDM_InitObject( "Calculated", ":/SummaryCase.svg" ); - - m_calculatedCurveReader = nullptr; - m_displayName = RiaDefines::summaryCalculated(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimCalculatedSummaryCase::~RimCalculatedSummaryCase() -{ -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimCalculatedSummaryCase::caseName() const -{ - return RiaDefines::summaryCalculated(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimCalculatedSummaryCase::createSummaryReaderInterface() -{ - if ( !m_calculatedCurveReader ) - { - RimSummaryCalculationCollection* calculationCollection = nullptr; - this->firstAncestorOrThisOfTypeAsserted( calculationCollection ); - - m_calculatedCurveReader.reset( new RifCalculatedSummaryCurveReader( calculationCollection ) ); - - m_calculatedCurveReader->buildMetaData(); - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RifSummaryReaderInterface* RimCalculatedSummaryCase::summaryReader() -{ - if ( !m_calculatedCurveReader ) createSummaryReaderInterface(); - - return m_calculatedCurveReader.get(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimCalculatedSummaryCase::buildMetaData() -{ - if ( !m_calculatedCurveReader ) createSummaryReaderInterface(); - - m_calculatedCurveReader->buildMetaData(); -} diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.h b/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.h deleted file mode 100644 index 613f115d49..0000000000 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.h +++ /dev/null @@ -1,50 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2017 Statoil 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 "RifSummaryReaderInterface.h" -#include "RimCalculatedSummaryCurveReader.h" -#include "RimSummaryCase.h" - -#include - -class RifCalculatedSummaryCurveReader; -class RimSummaryCalculation; -class RimSummaryCalculationCollection; - -//================================================================================================== -// -//================================================================================================== -class RimCalculatedSummaryCase : public RimSummaryCase -{ - CAF_PDM_HEADER_INIT; - -public: - RimCalculatedSummaryCase(); - ~RimCalculatedSummaryCase() override; - - QString caseName() const override; - void createSummaryReaderInterface() override; - RifSummaryReaderInterface* summaryReader() override; - - void buildMetaData(); - -private: - std::unique_ptr m_calculatedCurveReader; -}; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCurveReader.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCurveReader.cpp index fbeb1cc833..c54dc59a61 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCurveReader.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCurveReader.cpp @@ -18,15 +18,20 @@ #include "RimCalculatedSummaryCurveReader.h" +#include "RifEclipseSummaryAddress.h" #include "RimSummaryCalculation.h" #include "RimSummaryCalculationCollection.h" +#include "RimUserDefinedCalculation.h" //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RifCalculatedSummaryCurveReader::RifCalculatedSummaryCurveReader( RimSummaryCalculationCollection* calculationCollection ) +RifCalculatedSummaryCurveReader::RifCalculatedSummaryCurveReader( RimSummaryCalculationCollection* calculationCollection, + RimSummaryCase* summaryCase ) : m_calculationCollection( calculationCollection ) + , m_summaryCase( summaryCase ) { + CAF_ASSERT( summaryCase ); } //-------------------------------------------------------------------------------------------------- @@ -35,9 +40,10 @@ RifCalculatedSummaryCurveReader::RifCalculatedSummaryCurveReader( RimSummaryCalc std::vector RifCalculatedSummaryCurveReader::timeSteps( const RifEclipseSummaryAddress& resultAddress ) const { RimSummaryCalculation* calc = findCalculationByName( resultAddress ); - if ( calc ) + if ( calc && m_summaryCase ) { - return calc->timeSteps(); + RimSummaryCalculationAddress address( resultAddress ); + return calc->timeSteps( m_summaryCase, address ); } return {}; @@ -49,9 +55,10 @@ std::vector RifCalculatedSummaryCurveReader::timeSteps( const RifEclipse bool RifCalculatedSummaryCurveReader::values( const RifEclipseSummaryAddress& resultAddress, std::vector* values ) const { RimSummaryCalculation* calc = findCalculationByName( resultAddress ); - if ( calc ) + if ( calc && m_summaryCase ) { - *values = calc->values(); + RimSummaryCalculationAddress address( resultAddress ); + *values = calc->values( m_summaryCase, address ); return true; } @@ -82,8 +89,17 @@ void RifCalculatedSummaryCurveReader::buildMetaData() for ( RimUserDefinedCalculation* calc : m_calculationCollection->calculations() ) { - m_allResultAddresses.insert( - RifEclipseSummaryAddress::calculatedAddress( calc->description().toStdString(), calc->id() ) ); + RimSummaryCalculation* sumCalc = dynamic_cast( calc ); + CAF_ASSERT( sumCalc ); + + const auto& allAddresses = sumCalc->allAddressesForSummaryCase( m_summaryCase ); + for ( auto calculationAddress : allAddresses ) + { + if ( calculationAddress.address().isValid() ) + { + m_allResultAddresses.insert( calculationAddress.address() ); + } + } } } @@ -93,12 +109,9 @@ void RifCalculatedSummaryCurveReader::buildMetaData() RimSummaryCalculation* RifCalculatedSummaryCurveReader::findCalculationByName( const RifEclipseSummaryAddress& resultAddress ) const { - if ( m_calculationCollection && resultAddress.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) - { - return dynamic_cast( m_calculationCollection->findCalculationById( resultAddress.id() ) ); - } + if ( !m_calculationCollection || !resultAddress.isCalculated() ) return nullptr; - return nullptr; + return dynamic_cast( m_calculationCollection->findCalculationById( resultAddress.id() ) ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCurveReader.h b/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCurveReader.h index 6cc256facb..aff5dd12b2 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCurveReader.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCurveReader.h @@ -33,7 +33,8 @@ class RimSummaryCalculationCollection; class RifCalculatedSummaryCurveReader : public RifSummaryReaderInterface { public: - explicit RifCalculatedSummaryCurveReader( RimSummaryCalculationCollection* calculationCollection ); + explicit RifCalculatedSummaryCurveReader( RimSummaryCalculationCollection* calculationCollection, + RimSummaryCase* summaryCase ); std::vector timeSteps( const RifEclipseSummaryAddress& resultAddress ) const override; bool values( const RifEclipseSummaryAddress& resultAddress, std::vector* values ) const override; @@ -48,4 +49,5 @@ private: private: caf::PdmPointer m_calculationCollection; + caf::PdmPointer m_summaryCase; }; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp index 7fd531655b..71556c050c 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp @@ -27,6 +27,7 @@ #include "RiaSummaryCurveDefinition.h" #include "RiaTimeTTools.h" +#include "RimSummaryCalculationCollection.h" #include "SummaryPlotCommands/RicSummaryPlotEditorUi.h" #include "RifEnsembleStatisticsReader.h" @@ -46,6 +47,7 @@ #include "RimProject.h" #include "RimRegularLegendConfig.h" #include "RimSummaryAddress.h" +#include "RimSummaryCalculationCollection.h" #include "RimSummaryCase.h" #include "RimSummaryCaseCollection.h" #include "RimSummaryCurve.h" diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.cpp index db3de30dfc..0a272382f3 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.cpp @@ -32,8 +32,10 @@ #include "RifReaderOpmRft.h" #include "RifSummaryReaderMultipleFiles.h" +#include "RimCalculatedSummaryCurveReader.h" #include "RimProject.h" #include "RimRftCase.h" +#include "RimSummaryCalculationCollection.h" #include "RimTools.h" #include "cafPdmFieldScriptingCapability.h" @@ -116,14 +118,20 @@ void RimFileSummaryCase::createSummaryReaderInterfaceThreadSafe( RiaThreadSafeLo void RimFileSummaryCase::createSummaryReaderInterface() { RiaThreadSafeLogger threadSafeLogger; - m_fileSummaryReader = RimFileSummaryCase::findRelatedFilesAndCreateReader( this->summaryHeaderFilename(), + m_fileSummaryReader = RimFileSummaryCase::findRelatedFilesAndCreateReader( this->summaryHeaderFilename(), m_includeRestartFiles, &threadSafeLogger ); + + RimSummaryCalculationCollection* calcColl = RimProject::current()->calculationCollection(); + m_calculatedSummaryReader = new RifCalculatedSummaryCurveReader( calcColl, this ); + m_multiSummaryReader = new RifMultipleSummaryReaders; m_multiSummaryReader->addReader( m_fileSummaryReader.p() ); openAndAttachAdditionalReader(); + m_multiSummaryReader->addReader( m_calculatedSummaryReader.p() ); + auto messages = threadSafeLogger.messages(); for ( const auto& m : messages ) { diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.h b/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.h index 8f9104ece2..5fc9376780 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.h @@ -30,6 +30,7 @@ class RifOpmCommonEclipseSummary; class RifEclipseSummaryAddress; class RifMultipleSummaryReaders; class RimRftCase; +class RifCalculatedSummaryCurveReader; //================================================================================================== // @@ -77,10 +78,11 @@ private: static RifReaderOpmRft* findRftDataAndCreateReader( const QString& rftFileName, const QString& dataDeckFileName ); private: - cvf::ref m_fileSummaryReader; - cvf::ref m_multiSummaryReader; - cvf::ref m_summaryEclipseRftReader; - caf::PdmField m_includeRestartFiles; + cvf::ref m_fileSummaryReader; + cvf::ref m_calculatedSummaryReader; + cvf::ref m_multiSummaryReader; + cvf::ref m_summaryEclipseRftReader; + caf::PdmField m_includeRestartFiles; caf::PdmField m_additionalSummaryFilePath; cvf::ref m_additionalSummaryFileReader; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimGridSummaryCase.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimGridSummaryCase.cpp index 473a106470..515dd10f92 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimGridSummaryCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimGridSummaryCase.cpp @@ -20,11 +20,14 @@ #include "RicfCommandObject.h" +#include "RifMultipleSummaryReaders.h" #include "RifSummaryReaderInterface.h" +#include "RimCalculatedSummaryCurveReader.h" #include "RimEclipseCase.h" #include "RimFileSummaryCase.h" #include "RimProject.h" +#include "RimSummaryCalculationCollection.h" #include "cafPdmObjectScriptingCapability.h" @@ -179,9 +182,16 @@ QString RimGridSummaryCase::eclipseGridFileName() const //-------------------------------------------------------------------------------------------------- void RimGridSummaryCase::createSummaryReaderInterface() { - m_summaryFileReader = RimFileSummaryCase::findRelatedFilesAndCreateReader( this->summaryHeaderFilename(), + m_fileSummaryReader = RimFileSummaryCase::findRelatedFilesAndCreateReader( this->summaryHeaderFilename(), m_includeRestartFiles, nullptr ); + + m_multiSummaryReader = new RifMultipleSummaryReaders; + m_multiSummaryReader->addReader( m_fileSummaryReader.p() ); + + RimSummaryCalculationCollection* calcColl = RimProject::current()->calculationCollection(); + m_calculatedSummaryReader = new RifCalculatedSummaryCurveReader( calcColl, this ); + m_multiSummaryReader->addReader( m_calculatedSummaryReader.p() ); } //-------------------------------------------------------------------------------------------------- @@ -189,11 +199,11 @@ void RimGridSummaryCase::createSummaryReaderInterface() //-------------------------------------------------------------------------------------------------- RifSummaryReaderInterface* RimGridSummaryCase::summaryReader() { - if ( m_summaryFileReader.isNull() ) + if ( m_multiSummaryReader.isNull() ) { createSummaryReaderInterface(); } - return m_summaryFileReader.p(); + return m_multiSummaryReader.p(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimGridSummaryCase.h b/ApplicationLibCode/ProjectDataModel/Summary/RimGridSummaryCase.h index 8787af8f8a..07b5587390 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimGridSummaryCase.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimGridSummaryCase.h @@ -17,6 +17,7 @@ ///////////////////////////////////////////////////////////////////////////////// #pragma once +#include "RifMultipleSummaryReaders.h" #include "RimSummaryCase.h" #include "cafPdmProxyValueField.h" @@ -27,6 +28,8 @@ class RimEclipseCase; class RifSummaryReaderInterface; class RimFileSummaryCase; +class RifCalculatedSummaryCurveReader; +class RifMultipleSummaryReaders; //================================================================================================== // @@ -63,6 +66,8 @@ private: mutable caf::PdmField m_cachedCaseName; caf::PdmProxyValueField m_eclipseGridFileName; - cvf::ref m_summaryFileReader; - caf::PdmField m_includeRestartFiles; + cvf::ref m_fileSummaryReader; + cvf::ref m_calculatedSummaryReader; + cvf::ref m_multiSummaryReader; + caf::PdmField m_includeRestartFiles; }; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddress.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddress.cpp index f454be38ff..4992164fb3 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddress.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddress.cpp @@ -47,7 +47,6 @@ void caf::AppEnum::setUp() addItem( RifAdr::SUMMARY_WELL_SEGMENT, "SUMMARY_SEGMENT", RiaDefines::summarySegment() ); addItem( RifAdr::SUMMARY_BLOCK, "SUMMARY_BLOCK", RiaDefines::summaryBlock() ); addItem( RifAdr::SUMMARY_BLOCK_LGR, "SUMMARY_BLOCK_LGR", RiaDefines::summaryLgrBlock() ); - addItem( RifAdr::SUMMARY_CALCULATED, "SUMMARY_CALCULATED", RiaDefines::summaryCalculated() ); addItem( RifAdr::SUMMARY_IMPORTED, "SUMMARY_IMPORTED", "Imported" ); addItem( RifAdr::SUMMARY_ENSEMBLE_STATISTICS, "SUMMARY_ENSEMBLE_STATISTICS", "Ensemble Statistics" ); setDefault( RifAdr::SUMMARY_FIELD ); @@ -137,6 +136,7 @@ void RimSummaryAddress::setAddress( const RifEclipseSummaryAddress& addr ) m_calculationId = addr.id(); setUiName( m_vectorName ); + setUiIconFromResourceString( iconResourceText() ); } //-------------------------------------------------------------------------------------------------- @@ -160,27 +160,6 @@ RifEclipseSummaryAddress RimSummaryAddress::address() const m_calculationId ); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryAddress::ensureCalculationIdIsAssigned() -{ - if ( m_category == RifEclipseSummaryAddress::SUMMARY_CALCULATED && m_calculationId == -1 ) - { - RimSummaryCalculationCollection* calcColl = RimProject::current()->calculationCollection(); - - for ( const RimUserDefinedCalculation* c : calcColl->calculations() ) - { - QString description = c->description(); - - if ( description == m_vectorName ) - { - m_calculationId = c->id(); - } - } - } -} - //-------------------------------------------------------------------------------------------------- /// Return phase type if the current result is known to be of a particular /// fluid phase type. Otherwise the method will return PHASE_NOT_APPLICABLE. @@ -271,3 +250,13 @@ bool RimSummaryAddress::isEnsemble() const { return m_ensembleId >= 0; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimSummaryAddress::iconResourceText() const +{ + if ( m_calculationId != -1 ) return ":/summary/components/images/calculated.svg"; + + return ":/DataVector.png"; +} diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddress.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddress.h index b6a2f735a8..22f7aba30b 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddress.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddress.h @@ -68,6 +68,8 @@ public: protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + QString iconResourceText() const; + private: caf::PdmField> m_category; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddressCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddressCollection.cpp index d2f76c5da1..f3982242b9 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddressCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddressCollection.cpp @@ -180,10 +180,22 @@ void RimSummaryAddressCollection::updateFolderStructure( const std::set sortedAddresses( addresses.size() ); + std::copy( addresses.begin(), addresses.end(), sortedAddresses.begin() ); + std::sort( sortedAddresses.begin(), + sortedAddresses.end(), + []( const RifEclipseSummaryAddress& a, const RifEclipseSummaryAddress& b ) -> bool { + if ( a.category() < b.category() ) return false; + // Calculated results are sorted last. + if ( a.isCalculated() && !b.isCalculated() ) return false; + if ( !a.isCalculated() && b.isCalculated() ) return true; + return a.vectorName() < b.vectorName(); + } ); + + for ( const auto& address : sortedAddresses ) { switch ( address.category() ) { @@ -301,14 +313,6 @@ void RimSummaryAddressCollection::updateFolderStructure( const std::setaddToSubfolder( QString::fromStdString( address.itemUiText() ), - CollectionContentType::CALCULATED, - address, - caseId, - ensembleId ); - break; - default: continue; } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.cpp index 2592971061..58ff18eec2 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.cpp @@ -30,6 +30,7 @@ #include "RimProject.h" #include "RimSummaryAddress.h" #include "RimSummaryAddressCollection.h" +#include "RimSummaryCalculationCollection.h" #include "RimSummaryCaseCollection.h" #include "cafPdmFieldScriptingCapability.h" @@ -244,7 +245,8 @@ void RimSummaryCase::buildChildNodes() RifSummaryReaderInterface* reader = summaryReader(); if ( !reader ) return; - m_dataVectorFolders->updateFolderStructure( reader->allResultAddresses(), m_caseId ); + auto addresses = reader->allResultAddresses(); + m_dataVectorFolders->updateFolderStructure( addresses, m_caseId ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp index c5b9b37190..d1a2912c6b 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp @@ -34,6 +34,7 @@ #include "RimGridSummaryCase.h" #include "RimProject.h" #include "RimSummaryAddressCollection.h" +#include "RimSummaryCalculationCollection.h" #include "RimSummaryCase.h" #include "RifReaderEclipseRft.h" @@ -328,6 +329,7 @@ std::set RimSummaryCaseCollection::ensembleSummaryAddr const std::set& addrs = m_cases[maxAddrIndex]->summaryReader()->allResultAddresses(); addresses.insert( addrs.begin(), addrs.end() ); } + return addresses; } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp index 66b66cd5d7..a9a001c7a4 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp @@ -475,20 +475,25 @@ QList RimSummaryCurve::calculateValueOptions( const caf: QList options = this->RimPlotCurve::calculateValueOptions( fieldNeedingOptions ); if ( !options.isEmpty() ) return options; - if ( fieldNeedingOptions == &m_yValuesSummaryCase || fieldNeedingOptions == &m_xValuesSummaryCase ) - { - RimProject* proj = RimProject::current(); - + auto createOptionsForSummaryCase = []( RimSummaryCase* summaryCase, QList& options ) { + RimProject* proj = RimProject::current(); std::vector cases = proj->allSummaryCases(); - cases.push_back( proj->calculationCollection->calculationSummaryCase() ); - options = RiaSummaryTools::optionsForSummaryCases( cases ); if ( options.size() > 0 ) { options.push_front( caf::PdmOptionItemInfo( "None", nullptr ) ); } + }; + + if ( fieldNeedingOptions == &m_yValuesSummaryCase ) + { + createOptionsForSummaryCase( m_yValuesSummaryCase, options ); + } + else if ( fieldNeedingOptions == &m_xValuesSummaryCase ) + { + createOptionsForSummaryCase( m_xValuesSummaryCase, options ); } else if ( &m_yValuesSummaryAddressUiField == fieldNeedingOptions ) { diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.cpp index 85c07af969..0e87577280 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.cpp @@ -214,7 +214,7 @@ QString RimSummaryCurveAutoName::buildCurveName( const RifEclipseSummaryAddress& { text = summaryAddress.vectorName(); } - else if ( summaryAddress.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) + else if ( summaryAddress.isCalculated() ) { // Need to add case name for calculated summary RimProject* proj = RimProject::current(); @@ -223,7 +223,7 @@ QString RimSummaryCurveAutoName::buildCurveName( const RifEclipseSummaryAddress& RimUserDefinedCalculation* calculation = calcColl->findCalculationById( summaryAddress.id() ); if ( calculation ) { - text = calculation->description().toStdString(); + text = calculation->shortName().toStdString(); } } @@ -235,7 +235,7 @@ QString RimSummaryCurveAutoName::buildCurveName( const RifEclipseSummaryAddress& appendAddressDetails( text, summaryAddress, plotNameHelper ); - if ( !caseName.empty() ) + if ( !caseName.empty() && !summaryAddress.isCalculated() ) { bool skipSubString = plotNameHelper && plotNameHelper->isCaseInTitle(); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurvesData.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurvesData.cpp index daf51ac1a2..8dd2690bb6 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurvesData.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurvesData.cpp @@ -224,7 +224,7 @@ void RimSummaryCurvesData::populateSummaryCurvesData( std::vector( { curveData } ); if ( hasErrorData ) curveDataList.push_back( errorCurveData ); - if ( curve->summaryAddressY().category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) + if ( curve->summaryAddressY().isCalculated() ) { // We have calculated data, and it we cannot assume identical time axis curvesData->addCurveDataNoSearch( curveCaseName, ensembleName, curve->timeStepsY(), curveDataList ); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp index 8b171cbf0b..993fed7c96 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp @@ -1000,10 +1000,10 @@ void RimSummaryMultiPlot::computeAggregatedAxisRange() auto addressesForCurve = []( RimSummaryCurve* curve, AxisRangeAggregation axisRangeAggregation ) { std::vector addresses; + auto addr = curve->summaryAddressY(); if ( axisRangeAggregation == AxisRangeAggregation::REALIZATIONS ) { - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fieldAddress( curve->summaryAddressY().vectorName() ); - addresses = { addr }; + addresses = { RifEclipseSummaryAddress::fieldAddress( addr.vectorName(), addr.id() ) }; } else if ( axisRangeAggregation == AxisRangeAggregation::WELLS || axisRangeAggregation == AxisRangeAggregation::REGIONS ) @@ -1032,7 +1032,7 @@ void RimSummaryMultiPlot::computeAggregatedAxisRange() for ( const auto& wellName : analyzer->wellNames() ) { addresses.push_back( - RifEclipseSummaryAddress::wellAddress( curve->summaryAddressY().vectorName(), wellName ) ); + RifEclipseSummaryAddress::wellAddress( addr.vectorName(), wellName, addr.id() ) ); } } @@ -1040,8 +1040,8 @@ void RimSummaryMultiPlot::computeAggregatedAxisRange() { for ( auto regionNumber : analyzer->regionNumbers() ) { - addresses.push_back( RifEclipseSummaryAddress::regionAddress( curve->summaryAddressY().vectorName(), - regionNumber ) ); + addresses.push_back( + RifEclipseSummaryAddress::regionAddress( addr.vectorName(), regionNumber, addr.id() ) ); } } } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index 93ab6c77d5..3e25ada0ba 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -51,6 +51,7 @@ #include "RimProject.h" #include "RimSummaryAddress.h" #include "RimSummaryAddressCollection.h" +#include "RimSummaryCalculationCollection.h" #include "RimSummaryCase.h" #include "RimSummaryCaseCollection.h" #include "RimSummaryCurve.h" @@ -640,8 +641,11 @@ void RimSummaryPlot::copyAxisPropertiesFromOther( const RimSummaryPlot& sourceSu { QString data = ap->writeObjectToXmlString(); - axisPropertiesForPlotAxis( ap->plotAxisType() ) - ->readObjectFromXmlString( data, caf::PdmDefaultObjectFactory::instance() ); + auto axisProperty = axisPropertiesForPlotAxis( ap->plotAxisType() ); + if ( axisProperty ) + { + axisProperty->readObjectFromXmlString( data, caf::PdmDefaultObjectFactory::instance() ); + } } } @@ -2755,7 +2759,7 @@ void RimSummaryPlot::updateNameHelperWithCurveData( RimSummaryPlotNameHelper* na { for ( RimSummaryCurve* curve : m_summaryCurveCollection->curves() ) { - if ( curve->summaryAddressY().category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) + if ( curve->summaryAddressY().isCalculated() ) { RiaSummaryTools::getSummaryCasesAndAddressesForCalculation( curve->summaryAddressY().id(), sumCases, diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotAxisFormatter.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotAxisFormatter.cpp index 560741ad03..36208e1885 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotAxisFormatter.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotAxisFormatter.cpp @@ -219,7 +219,7 @@ QString RimSummaryPlotAxisFormatter::autoAxisTitle() const std::string titleText; const std::string& quantityName = sumAddress.vectorName().substr( cutPos + 1 ); - if ( sumAddress.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) + if ( sumAddress.isCalculated() ) { titleText = shortCalculationName( quantityName ); } @@ -352,7 +352,7 @@ QString RimSummaryPlotAxisFormatter::createAxisObjectName() const std::string name; const std::string& quantityName = sumAddress.vectorName().substr( cutPos + 1 ); - if ( sumAddress.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) + if ( sumAddress.isCalculated() ) { name = shortCalculationName( quantityName ); } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp index 9e1a51d207..0f19f1b3f2 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp @@ -400,9 +400,6 @@ std::vector RimSummaryPlotFilterTextCurveSetEditor::selectedSumm sources.push_back( source ); } - // Always add the summary case for calculated curves as this case is not displayed in UI - sources.push_back( RimProject::current()->calculationCollection()->calculationSummaryCase() ); - return sources; } diff --git a/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionDialog.cpp b/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionDialog.cpp index 3911fe116a..91e5844c8d 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionDialog.cpp +++ b/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionDialog.cpp @@ -210,6 +210,14 @@ void RiuSummaryVectorSelectionDialog::hideVectorsWithNoHistory() summaryAddressSelection()->hideVectorsWithoutHistory( true ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuSummaryVectorSelectionDialog::hideCalculationIncompatibleCategories() +{ + summaryAddressSelection()->hideCalculationIncompatibleCategories( true ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionDialog.h b/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionDialog.h index 89f918f957..e0b6ed2393 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionDialog.h +++ b/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionDialog.h @@ -55,6 +55,7 @@ public: void hideHistoryVectors(); void hideDifferenceVectors(); void hideVectorsWithNoHistory(); + void hideCalculationIncompatibleCategories(); private: RiuSummaryVectorSelectionUi* summaryAddressSelection() const; diff --git a/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.cpp b/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.cpp index 9914a2172b..a216987101 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.cpp +++ b/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.cpp @@ -28,7 +28,6 @@ #include "RifReaderEclipseSummary.h" #include "RifSummaryReaderInterface.h" -#include "RimCalculatedSummaryCase.h" #include "RimObservedDataCollection.h" #include "RimObservedSummaryData.h" #include "RimOilField.h" @@ -96,54 +95,68 @@ SummaryIdentifierAndField::~SummaryIdentifierAndField() RiuSummaryVectorSelectionUi::RiuSummaryVectorSelectionUi() : m_identifierFieldsMap( { { RifEclipseSummaryAddress::SUMMARY_FIELD, - { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, + { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_ID ) } } }, { RifEclipseSummaryAddress::SUMMARY_AQUIFER, { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_AQUIFER_NUMBER ) }, - { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_ID ) } } }, { RifEclipseSummaryAddress::SUMMARY_NETWORK, - { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, + { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_ID ) } } }, { RifEclipseSummaryAddress::SUMMARY_MISC, - { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, + { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_ID ) } } }, { RifEclipseSummaryAddress::SUMMARY_REGION, { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_REGION_NUMBER ) }, - { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_ID ) } } }, { RifEclipseSummaryAddress::SUMMARY_REGION_2_REGION, { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_REGION_2_REGION ) }, - { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_ID ) } } }, { RifEclipseSummaryAddress::SUMMARY_GROUP, { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_GROUP_NAME ) }, - { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_ID ) } } }, { RifEclipseSummaryAddress::SUMMARY_WELL, { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_WELL_NAME ) }, - { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_ID ) } } }, { RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION, { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_WELL_NAME ) }, { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_CELL_IJK ) }, - { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_ID ) } } }, { RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION_LGR, { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_LGR_NAME ) }, { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_WELL_NAME ) }, { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_CELL_IJK ) }, - { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_ID ) } } }, { RifEclipseSummaryAddress::SUMMARY_WELL_LGR, { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_LGR_NAME ) }, { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_WELL_NAME ) }, - { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_ID ) } } }, { RifEclipseSummaryAddress::SUMMARY_WELL_SEGMENT, { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_WELL_NAME ) }, { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_SEGMENT_NUMBER ) }, - { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_ID ) } } }, { RifEclipseSummaryAddress::SUMMARY_BLOCK, { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_CELL_IJK ) }, - { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_ID ) } } }, { RifEclipseSummaryAddress::SUMMARY_BLOCK_LGR, { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_LGR_NAME ) }, { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_CELL_IJK ) }, - { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, - { RifEclipseSummaryAddress::SUMMARY_CALCULATED, - { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_ID ) } } }, { RifEclipseSummaryAddress::SUMMARY_IMPORTED, - { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) } } }, + { { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) }, + { new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_ID ) } } }, + } ) , m_showIndividualEnsembleCases( true ) { @@ -156,6 +169,9 @@ RiuSummaryVectorSelectionUi::RiuSummaryVectorSelectionUi() CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_FIELD][0]->pdmField(), "FieldVectors", "Field vectors" ); + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_FIELD][1]->pdmField(), + "FieldCalculationIds", + "Calculation Ids" ); CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_AQUIFER][0]->pdmField(), "Aquifers", @@ -163,14 +179,23 @@ RiuSummaryVectorSelectionUi::RiuSummaryVectorSelectionUi() CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_AQUIFER][1]->pdmField(), "AquiferVectors", "Aquifer Vectors" ); + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_AQUIFER][2]->pdmField(), + "AquifierCalculationIds", + "Calculation Ids" ); CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_NETWORK][0]->pdmField(), "NetworkVectors", "Network Vectors" ); + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_NETWORK][1]->pdmField(), + "NetworkCalculationIds", + "Calculation Ids" ); CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_MISC][0]->pdmField(), "MiscVectors", "Misc Vectors" ); + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_MISC][1]->pdmField(), + "MiscCalculationIds", + "Calculation Ids" ); CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_REGION][0]->pdmField(), "Regions", @@ -178,6 +203,9 @@ RiuSummaryVectorSelectionUi::RiuSummaryVectorSelectionUi() CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_REGION][1]->pdmField(), "RegionsVectors", "Regions Vectors" ); + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_REGION][2]->pdmField(), + "RegionCalculationIds", + "Calculation Ids" ); CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_REGION_2_REGION][0]->pdmField(), "Region2RegionRegions", @@ -185,6 +213,9 @@ RiuSummaryVectorSelectionUi::RiuSummaryVectorSelectionUi() CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_REGION_2_REGION][1]->pdmField(), "Region2RegionVectors", "Region2s Vectors" ); + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_REGION_2_REGION][2]->pdmField(), + "Region2RegionCalculationIds", + "Calculation Ids" ); CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_GROUP][0]->pdmField(), "WellGroupWellGroupNames", @@ -192,6 +223,9 @@ RiuSummaryVectorSelectionUi::RiuSummaryVectorSelectionUi() CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_GROUP][1]->pdmField(), "WellGroupVectors", "Well Group Vectors" ); + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_GROUP][2]->pdmField(), + "WellGroupCalculationIds", + "Calculation Ids" ); CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL][0]->pdmField(), "WellWellName", @@ -199,6 +233,9 @@ RiuSummaryVectorSelectionUi::RiuSummaryVectorSelectionUi() CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL][1]->pdmField(), "WellVectors", "Well Vectors" ); + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL][2]->pdmField(), + "WellCalculationIds", + "Calculation Ids" ); CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION][0]->pdmField(), "WellCompletionWellName", @@ -209,6 +246,9 @@ RiuSummaryVectorSelectionUi::RiuSummaryVectorSelectionUi() CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION][2]->pdmField(), "WellCompletionVectors", "Well Completion Vectors" ); + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION][3]->pdmField(), + "WellCompletionCalculationIds", + "Calculation Ids" ); CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION_LGR][0]->pdmField(), "WellCompletionLgrLgrName", @@ -222,6 +262,9 @@ RiuSummaryVectorSelectionUi::RiuSummaryVectorSelectionUi() CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION_LGR][3]->pdmField(), "WellCompletionLgrVectors", "Well Completion Vectors" ); + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION_LGR][4]->pdmField(), + "WellCompletionLgrCalculationIds", + "Calculation Ids" ); CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_LGR][0]->pdmField(), "WellLgrLgrName", @@ -232,6 +275,9 @@ RiuSummaryVectorSelectionUi::RiuSummaryVectorSelectionUi() CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_LGR][2]->pdmField(), "WellLgrVectors", "Vectors" ); + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_LGR][3]->pdmField(), + "WellLgrCalculationIds", + "Calculation Ids" ); CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_SEGMENT][0]->pdmField(), "WellSegmentWellName", @@ -242,6 +288,9 @@ RiuSummaryVectorSelectionUi::RiuSummaryVectorSelectionUi() CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_SEGMENT][2]->pdmField(), "WellSegmentVectors", "Vectors" ); + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_SEGMENT][3]->pdmField(), + "WellSegmentCalculationIds", + "Calculation Ids" ); CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_BLOCK][0]->pdmField(), "BlockIjk", @@ -249,6 +298,9 @@ RiuSummaryVectorSelectionUi::RiuSummaryVectorSelectionUi() CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_BLOCK][1]->pdmField(), "BlockVectors", "Block Vectors" ); + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_BLOCK][2]->pdmField(), + "BlockCalculationIds", + "Calculation Ids" ); CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_BLOCK_LGR][0]->pdmField(), "BlockLgrLgrName", @@ -259,14 +311,16 @@ RiuSummaryVectorSelectionUi::RiuSummaryVectorSelectionUi() CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_BLOCK_LGR][2]->pdmField(), "BlockLgrVectors", "Block Vectors" ); - - CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_CALCULATED][0]->pdmField(), - "CalculatedVectors", - "Calculated Vectors" ); + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_BLOCK_LGR][3]->pdmField(), + "BlockLgrCalculationIds", + "CalculationIds" ); CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_IMPORTED][0]->pdmField(), "ImportedVectors", "Imported vectors" ); + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_IMPORTED][1]->pdmField(), + "ImportedCalculationIds", + "Calculation Ids" ); for ( const auto& itemTypes : m_identifierFieldsMap ) { @@ -295,9 +349,10 @@ RiuSummaryVectorSelectionUi::RiuSummaryVectorSelectionUi() m_hideEnsembles = false; m_hideSummaryCases = false; - m_hideDifferenceVectors = false; - m_hideHistoryVectors = false; - m_hideVectorsWithoutHistory = false; + m_hideDifferenceVectors = false; + m_hideHistoryVectors = false; + m_hideVectorsWithoutHistory = false; + m_hideCalculationIncompatibleCategories = false; m_prevCurveCount = 0; m_prevCurveSetCount = 0; @@ -494,6 +549,14 @@ void RiuSummaryVectorSelectionUi::hideVectorsWithoutHistory( bool hide ) m_hideVectorsWithoutHistory = hide; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuSummaryVectorSelectionUi::hideCalculationIncompatibleCategories( bool hide ) +{ + m_hideCalculationIncompatibleCategories = hide; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -695,7 +758,7 @@ void RiuSummaryVectorSelectionUi::setSelectedCurveDefinitions( const std::vector avalue = avalue + QString( OBSERVED_DATA_AVALUE_POSTFIX ); } - if ( isVectorField && summaryAddress.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) + if ( isVectorField && summaryAddress.isCalculated() ) { // Append calculation id to input vector name calculated data. avalue = avalue + QString( ":%1" ).arg( summaryAddress.id() ); @@ -724,27 +787,6 @@ void RiuSummaryVectorSelectionUi::setSelectedCurveDefinitions( const std::vector m_prevCurveSetCount = allCurveSetDefinitionsFromSelections().size(); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -std::set RiuSummaryVectorSelectionUi::findPossibleSummaryAddressesFromCalculated() const -{ - std::set addressSet; - - if ( m_currentSummaryCategory == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) - { - RimSummaryCase* calcSumCase = calculatedSummaryCase(); - - const std::set allAddresses = calcSumCase->summaryReader()->allResultAddresses(); - for ( const auto& adr : allAddresses ) - { - addressSet.insert( adr ); - } - } - - return addressSet; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -984,10 +1026,6 @@ void RiuSummaryVectorSelectionUi::defineUiOrdering( QString uiConfigName, caf::P summaryiesField = m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_BLOCK_LGR][2]->pdmField(); } - else if ( sumCategory == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) - { - summaryiesField = m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_CALCULATED][0]->pdmField(); - } else if ( sumCategory == RifEclipseSummaryAddress::SUMMARY_IMPORTED ) { summaryiesField = m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_IMPORTED][0]->pdmField(); @@ -1017,8 +1055,7 @@ std::set RiuSummaryVectorSelectionUi::findPossibleSumm if ( sumCase ) { - auto calculated = dynamic_cast( sumCase ); - if ( !isObservedData( sumCase ) && !calculated ) + if ( !isObservedData( sumCase ) ) { sources.push_back( sumCase ); } @@ -1271,17 +1308,20 @@ void RiuSummaryVectorSelectionUi::buildAddressListForCategoryRecursively( auto idText = identifierText; // Calculated results have a id appended. E.g. "Calculation_3 ( NORNE_ATW2013, WOPR:B-4H ):3" - if ( category == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) + if ( ( *identifierAndFieldItr )->summaryIdentifier() == RifEclipseSummaryAddress::INPUT_VECTOR_NAME ) { // Extract the calculation id - QStringList tokens = idText.split( ":" ); - QString calculationId = tokens.last(); + QStringList tokens = idText.split( ":" ); + if ( tokens.size() > 1 ) + { + QString calculationId = tokens.last(); - // Put the input vector name back together - tokens.pop_back(); - idText = tokens.join( ":" ); + // Put the input vector name back together + tokens.pop_back(); + idText = tokens.join( ":" ); - identifierPath.push_back( std::make_pair( RifEclipseSummaryAddress::INPUT_ID, calculationId ) ); + identifierPath.push_back( std::make_pair( RifEclipseSummaryAddress::INPUT_ID, calculationId ) ); + } } idText.remove( OBSERVED_DATA_AVALUE_POSTFIX ); @@ -1373,22 +1413,9 @@ std::vector RiuSummaryVectorSelectionUi::selectedSummarySources( sources.push_back( source ); } - // Always add the summary case for calculated curves as this case is not displayed in UI - sources.push_back( RiuSummaryVectorSelectionUi::calculatedSummaryCase() ); - return sources; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimSummaryCase* RiuSummaryVectorSelectionUi::calculatedSummaryCase() -{ - RimSummaryCalculationCollection* calcColl = RimProject::current()->calculationCollection(); - - return calcColl->calculationSummaryCase(); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1419,13 +1446,16 @@ void RiuSummaryVectorSelectionUi::appendOptionItemsForCategories( QList addrUnion[itemCount]; - addrUnion[SUM_CASES] = findPossibleSummaryAddressesFromSelectedCases( identifierAndField ); - addrUnion[OBS_DATA] = findPossibleSummaryAddressesFromSelectedObservedData( identifierAndField ); - addrUnion[CALCULATED_CURVES] = findPossibleSummaryAddressesFromCalculated(); + addrUnion[SUM_CASES] = findPossibleSummaryAddressesFromSelectedCases( identifierAndField ); + addrUnion[OBS_DATA] = findPossibleSummaryAddressesFromSelectedObservedData( identifierAndField ); + + bool isVectorField = identifierAndField->summaryIdentifier() == RifEclipseSummaryAddress::INPUT_VECTOR_NAME; std::set itemNames[itemCount]; for ( int i = 0; i < itemCount; i++ ) @@ -1469,18 +1499,15 @@ void RiuSummaryVectorSelectionUi::appendOptionItemsForSubCategoriesAndVectors( Q auto name = address.addressComponentUiText( identifierAndField->summaryIdentifier() ); if ( name.size() > 0 ) { - if ( i == CALCULATED_CURVES ) + if ( isVectorField && address.isCalculated() ) { name += QString( ":%1" ).arg( address.id() ).toStdString(); } - itemNames[i].insert( name ); } } } - bool isVectorField = identifierAndField->summaryIdentifier() == RifEclipseSummaryAddress::INPUT_VECTOR_NAME; - // Merge sets for all other fields than vector fields if ( !isVectorField ) { @@ -1504,10 +1531,6 @@ void RiuSummaryVectorSelectionUi::appendOptionItemsForSubCategoriesAndVectors( Q { headerText = QString( "Observed Data" ); } - else if ( i == CALCULATED_CURVES ) - { - headerText = QString( RiaDefines::summaryCalculated() ); - } if ( !headerText.isEmpty() ) { diff --git a/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.h b/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.h index fa07030d20..078de87f93 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.h +++ b/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.h @@ -66,6 +66,7 @@ public: void hideDifferenceVectors( bool hide ); void hideHistoryVectors( bool hide ); void hideVectorsWithoutHistory( bool hide ); + void hideCalculationIncompatibleCategories( bool hide ); void setFieldChangedHandler( const std::function& handlerFunc ); @@ -88,8 +89,7 @@ private: std::set findPossibleSummaryAddressesFromSelectedCases( const SummaryIdentifierAndField* identifierAndField ) const; std::set - findPossibleSummaryAddressesFromSelectedObservedData( const SummaryIdentifierAndField* identifierAndField ) const; - std::set findPossibleSummaryAddressesFromCalculated() const; + findPossibleSummaryAddressesFromSelectedObservedData( const SummaryIdentifierAndField* identifierAndField ) const; std::vector buildControllingFieldList( const SummaryIdentifierAndField* identifierAndField ) const; @@ -135,6 +135,8 @@ private: bool m_hideVectorsWithoutHistory; bool m_hideDifferenceVectors; + bool m_hideCalculationIncompatibleCategories; + std::function m_toggleChangedHandler; size_t m_prevCurveCount;