diff --git a/ApplicationCode/Application/Tools/RiaSummaryTools.cpp b/ApplicationCode/Application/Tools/RiaSummaryTools.cpp index c5ef426e7a..0d528c82c3 100644 --- a/ApplicationCode/Application/Tools/RiaSummaryTools.cpp +++ b/ApplicationCode/Application/Tools/RiaSummaryTools.cpp @@ -58,8 +58,7 @@ RimSummaryCaseMainCollection* RiaSummaryTools::summaryCaseMainCollection() //-------------------------------------------------------------------------------------------------- /// Update the summary curves referencing this curve, as the curve is identified by the name //-------------------------------------------------------------------------------------------------- -void RiaSummaryTools::notifyCalculatedCurveNameHasChanged( const QString& previousCurveName, - const QString& currentCurveName ) +void RiaSummaryTools::notifyCalculatedCurveNameHasChanged( int calculationId, const QString& currentCurveName ) { RimSummaryPlotCollection* summaryPlotColl = RiaSummaryTools::summaryPlotCollection(); @@ -68,14 +67,11 @@ void RiaSummaryTools::notifyCalculatedCurveNameHasChanged( const QString& previo for ( RimSummaryCurve* curve : plot->summaryCurves() ) { RifEclipseSummaryAddress adr = curve->summaryAddressY(); - if ( adr.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) + if ( adr.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED && adr.id() == calculationId ) { - if ( adr.quantityName() == previousCurveName.toStdString() ) - { - RifEclipseSummaryAddress updatedAdr = RifEclipseSummaryAddress::calculatedAddress( - currentCurveName.toStdString() ); - curve->setSummaryAddressYAndApplyInterpolation( updatedAdr ); - } + RifEclipseSummaryAddress updatedAdr = + RifEclipseSummaryAddress::calculatedAddress( currentCurveName.toStdString(), calculationId ); + curve->setSummaryAddressYAndApplyInterpolation( updatedAdr ); } } } diff --git a/ApplicationCode/Application/Tools/RiaSummaryTools.h b/ApplicationCode/Application/Tools/RiaSummaryTools.h index 047e54f340..3b5cdfd923 100644 --- a/ApplicationCode/Application/Tools/RiaSummaryTools.h +++ b/ApplicationCode/Application/Tools/RiaSummaryTools.h @@ -39,7 +39,8 @@ class RiaSummaryTools public: static RimSummaryPlotCollection* summaryPlotCollection(); static RimSummaryCaseMainCollection* summaryCaseMainCollection(); - static void notifyCalculatedCurveNameHasChanged( const QString& previousCurveName, const QString& currentCurveName ); + + static void notifyCalculatedCurveNameHasChanged( int calculationId, const QString& currentCurveName ); static RimSummaryPlot* parentSummaryPlot( caf::PdmObject* object ); static RimSummaryPlotCollection* parentSummaryPlotCollection( caf::PdmObject* object ); diff --git a/ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp b/ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp index f396511b06..2c1fae6022 100644 --- a/ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp +++ b/ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp @@ -322,7 +322,8 @@ RimSummaryCurve* RicPlotProductionRateFeature::addSummaryCurve( RimSummaryPlot* -1, -1, -1, - false ); + false, + -1 ); if ( !gridSummaryCase->summaryReader()->hasAddress( addr ) ) { diff --git a/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp b/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp index cc7abf8ab3..2b34a9c187 100644 --- a/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp +++ b/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp @@ -18,15 +18,23 @@ #include "RicReplaceSummaryCaseFeature.h" +#include "RiaApplication.h" #include "RiaLogging.h" #include "RiaSummaryTools.h" #include "RicImportGeneralDataFeature.h" +#include "RimCalculatedSummaryCase.h" #include "RimFileSummaryCase.h" +#include "RimProject.h" +#include "RimSummaryAddress.h" +#include "RimSummaryCalculation.h" +#include "RimSummaryCalculationCollection.h" +#include "RimSummaryCalculationVariable.h" #include "RimSummaryCase.h" #include "RimSummaryCaseCollection.h" #include "RimSummaryCaseMainCollection.h" +#include "RimSummaryCurve.h" #include "RimSummaryPlot.h" #include "RimSummaryPlotCollection.h" @@ -65,9 +73,44 @@ void RicReplaceSummaryCaseFeature::onActionTriggered( bool isChecked ) summaryCase->createRftReaderInterface(); RiaLogging::info( QString( "Replaced summary data for %1" ).arg( oldSummaryHeaderFilename ) ); + RimSummaryCalculationCollection* calcColl = RiaApplication::instance()->project()->calculationCollection(); + + // Find and update all changed calculations + std::set ids; + for ( RimSummaryCalculation* summaryCalculation : calcColl->calculations() ) + { + bool needsUpdate = checkIfCalculationNeedsUpdate( summaryCalculation, summaryCase ); + if ( needsUpdate ) + { + ids.insert( summaryCalculation->id() ); + summaryCalculation->parseExpression(); + summaryCalculation->calculate(); + summaryCalculation->updateDependentCurvesAndPlots(); + } + } + RimSummaryPlotCollection* summaryPlotColl = RiaSummaryTools::summaryPlotCollection(); for ( RimSummaryPlot* summaryPlot : summaryPlotColl->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() ) + { + RifCalculatedSummaryCurveReader reader( calcColl ); + RimSummaryCalculation* calculation = reader.findCalculationByName( summaryAddressY ); + QString description = calculation->description(); + + RifEclipseSummaryAddress updatedAdr = + RifEclipseSummaryAddress::calculatedAddress( description.toStdString(), calculation->id() ); + summaryCurve->setSummaryAddressYAndApplyInterpolation( updatedAdr ); + summaryCurve->loadDataAndUpdate( true ); + } + } + summaryPlot->loadDataAndUpdate(); } } @@ -80,3 +123,21 @@ void RicReplaceSummaryCaseFeature::setupActionLook( QAction* actionToSetup ) actionToSetup->setText( "Replace" ); actionToSetup->setIcon( QIcon( ":/ReplaceCase16x16.png" ) ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicReplaceSummaryCaseFeature::checkIfCalculationNeedsUpdate( const RimSummaryCalculation* summaryCalculation, + const RimFileSummaryCase* summaryCase ) +{ + std::vector variables = summaryCalculation->allVariables(); + for ( RimSummaryCalculationVariable* variable : variables ) + { + if ( variable->summaryCase() == summaryCase ) + { + return true; + } + } + + return false; +} diff --git a/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.h b/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.h index 767588a430..0d60497cb1 100644 --- a/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.h +++ b/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.h @@ -20,6 +20,9 @@ #include "cafCmdFeature.h" +class RimSummaryCalculation; +class RimFileSummaryCase; + class RicReplaceSummaryCaseFeature : public caf::CmdFeature { CAF_CMD_HEADER_INIT; @@ -28,4 +31,7 @@ protected: bool isCommandEnabled() override; void onActionTriggered( bool isChecked ) override; void setupActionLook( QAction* actionToSetup ) override; + + bool checkIfCalculationNeedsUpdate( const RimSummaryCalculation* summaryCalculation, + const RimFileSummaryCase* summaryCase ); }; diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.cpp index c17062a0eb..98e3640088 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.cpp @@ -101,7 +101,7 @@ bool RicSummaryCurveCalculator::parseExpression() const QString currentCurveName = m_currentCalculation->description(); if ( previousCurveName != currentCurveName ) { - RiaSummaryTools::notifyCalculatedCurveNameHasChanged( previousCurveName, currentCurveName ); + RiaSummaryTools::notifyCalculatedCurveNameHasChanged( m_currentCalculation()->id(), currentCurveName ); } m_currentCalculation()->updateDependentCurvesAndPlots(); @@ -122,7 +122,8 @@ void RicSummaryCurveCalculator::fieldChangedByUi( const caf::PdmFieldHandle* cha m_newCalculation = false; RimSummaryCalculation* rimCalc = calculationCollection()->addCalculation(); - m_currentCalculation = rimCalc; + RiaApplication::instance()->project()->assignCalculationIdToCalculation( rimCalc ); + m_currentCalculation = rimCalc; this->updateConnectedEditors(); } @@ -246,7 +247,7 @@ bool RicSummaryCurveCalculator::calculate() const QString currentCurveName = m_currentCalculation->description(); if ( previousCurveName != currentCurveName ) { - RiaSummaryTools::notifyCalculatedCurveNameHasChanged( previousCurveName, currentCurveName ); + RiaSummaryTools::notifyCalculatedCurveNameHasChanged( m_currentCalculation()->id(), currentCurveName ); } if ( !m_currentCalculation()->calculate() ) diff --git a/ApplicationCode/FileInterface/RifEclipseSummaryAddress.cpp b/ApplicationCode/FileInterface/RifEclipseSummaryAddress.cpp index 7db8a19a51..b3bf81b632 100644 --- a/ApplicationCode/FileInterface/RifEclipseSummaryAddress.cpp +++ b/ApplicationCode/FileInterface/RifEclipseSummaryAddress.cpp @@ -41,6 +41,7 @@ RifEclipseSummaryAddress::RifEclipseSummaryAddress( SummaryVarCategory , m_cellK( -1 ) , m_aquiferNumber( -1 ) , m_isErrorResult( false ) + , m_id( -1 ) { std::tuple ijkTuple; std::pair reg2regPair; @@ -98,6 +99,9 @@ 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; } // Set quantity for all categories @@ -252,7 +256,7 @@ RifEclipseSummaryAddress RifEclipseSummaryAddress::fromEclipseTextAddress( const break; case SUMMARY_CALCULATED: - address = calculatedAddress( quantityName ); + address = calculatedAddress( quantityName, RiaStdStringTools::toInt( names[0].toStdString() ) ); break; case SUMMARY_IMPORTED: @@ -503,11 +507,12 @@ RifEclipseSummaryAddress RifEclipseSummaryAddress::blockLgrAddress( const std::s //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RifEclipseSummaryAddress RifEclipseSummaryAddress::calculatedAddress( const std::string& quantityName ) +RifEclipseSummaryAddress RifEclipseSummaryAddress::calculatedAddress( const std::string& quantityName, int id ) { RifEclipseSummaryAddress addr; addr.m_variableCategory = SUMMARY_CALCULATED; addr.m_quantityName = quantityName; + addr.m_id = id; return addr; } @@ -646,6 +651,11 @@ std::string RifEclipseSummaryAddress::uiText() const text += ":" + std::to_string( this->aquiferNumber() ); } break; + case SUMMARY_CALCULATED: + { + text += ":" + std::to_string( this->id() ); + } + break; } return text; @@ -676,6 +686,8 @@ std::string RifEclipseSummaryAddress::uiText( RifEclipseSummaryAddress::SummaryI return std::to_string( aquiferNumber() ); case INPUT_VECTOR_NAME: return quantityName(); + case INPUT_ID: + return std::to_string( id() ); } return ""; } @@ -967,6 +979,11 @@ bool operator==( const RifEclipseSummaryAddress& first, const RifEclipseSummaryA if ( first.aquiferNumber() != second.aquiferNumber() ) return false; } break; + case RifEclipseSummaryAddress::SUMMARY_CALCULATED: + { + if ( first.id() != second.id() ) return false; + } + break; } if ( first.isErrorResult() != second.isErrorResult() ) return false; return true; diff --git a/ApplicationCode/FileInterface/RifEclipseSummaryAddress.h b/ApplicationCode/FileInterface/RifEclipseSummaryAddress.h index cd40fbc4f5..ef422a25f0 100644 --- a/ApplicationCode/FileInterface/RifEclipseSummaryAddress.h +++ b/ApplicationCode/FileInterface/RifEclipseSummaryAddress.h @@ -71,6 +71,7 @@ public: INPUT_SEGMENT_NUMBER, INPUT_AQUIFER_NUMBER, INPUT_VECTOR_NAME, + INPUT_ID }; public: @@ -84,6 +85,7 @@ public: , m_cellK( -1 ) , m_aquiferNumber( -1 ) , m_isErrorResult( false ) + , m_id( -1 ) { } @@ -99,7 +101,8 @@ public: int32_t cellJ, int32_t cellK, int16_t aquiferNumber, - bool isErrorResult ) + bool isErrorResult, + int32_t id ) : m_variableCategory( category ) , m_quantityName( quantityName ) , m_regionNumber( regionNumber ) @@ -113,6 +116,7 @@ public: , m_cellK( cellK ) , m_aquiferNumber( aquiferNumber ) , m_isErrorResult( isErrorResult ) + , m_id( id ) { } @@ -147,7 +151,7 @@ public: static RifEclipseSummaryAddress blockAddress( const std::string& quantityName, int i, int j, int k ); static RifEclipseSummaryAddress blockLgrAddress( const std::string& quantityName, const std::string& lgrName, int i, int j, int k ); - static RifEclipseSummaryAddress calculatedAddress( const std::string& quantityName ); + static RifEclipseSummaryAddress calculatedAddress( const std::string& quantityName, int id ); static RifEclipseSummaryAddress importedAddress( const std::string& quantityName ); static RifEclipseSummaryAddress ensembleStatisticsAddress( const std::string& quantityName, const std::string& dataQuantityName ); @@ -207,6 +211,10 @@ public: { return m_aquiferNumber; } + int id() const + { + return m_id; + } std::string blockAsString() const; const std::string ensembleStatisticsQuantityName() const; @@ -252,6 +260,12 @@ public: { return m_isErrorResult; } + + void setId( int id ) + { + m_id = id; + } + bool hasAccumulatedData() const; private: @@ -274,6 +288,7 @@ private: int16_t m_aquiferNumber; SummaryVarCategory m_variableCategory; bool m_isErrorResult; + int32_t m_id; }; bool operator==( const RifEclipseSummaryAddress& first, const RifEclipseSummaryAddress& second ); diff --git a/ApplicationCode/FileInterface/RifEclipseUserDataKeywordTools.cpp b/ApplicationCode/FileInterface/RifEclipseUserDataKeywordTools.cpp index e72030d685..585174ebb1 100644 --- a/ApplicationCode/FileInterface/RifEclipseUserDataKeywordTools.cpp +++ b/ApplicationCode/FileInterface/RifEclipseUserDataKeywordTools.cpp @@ -183,6 +183,7 @@ RifEclipseSummaryAddress int cellK = -1; int aquiferNumber = -1; bool isErrorResult = false; + int id = -1; switch ( category ) { @@ -292,7 +293,8 @@ RifEclipseSummaryAddress cellJ, cellK, aquiferNumber, - isErrorResult ); + isErrorResult, + id ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/FileInterface/RifKeywordVectorUserData.cpp b/ApplicationCode/FileInterface/RifKeywordVectorUserData.cpp index afd37e8c50..3b4b12ffa5 100644 --- a/ApplicationCode/FileInterface/RifKeywordVectorUserData.cpp +++ b/ApplicationCode/FileInterface/RifKeywordVectorUserData.cpp @@ -168,7 +168,8 @@ bool RifKeywordVectorUserData::parse( const QString& data, const QString& custom -1, -1, -1, - false ); + false, + -1 ); m_allResultAddresses.insert( addr ); diff --git a/ApplicationCode/FileInterface/RifReaderEclipseSummary.cpp b/ApplicationCode/FileInterface/RifReaderEclipseSummary.cpp index fabe412630..202779b3ea 100644 --- a/ApplicationCode/FileInterface/RifReaderEclipseSummary.cpp +++ b/ApplicationCode/FileInterface/RifReaderEclipseSummary.cpp @@ -288,6 +288,7 @@ RifEclipseSummaryAddress addressFromErtSmSpecNode( const ecl::smspec_node& ertSu int cellK( -1 ); int aquiferNumber( -1 ); bool isErrorResult( false ); + int id( -1 ); quantityName = stringFromPointer( ertSumVarNode.get_keyword() ); @@ -414,7 +415,8 @@ RifEclipseSummaryAddress addressFromErtSmSpecNode( const ecl::smspec_node& ertSu cellJ, cellK, aquiferNumber, - isErrorResult ); + isErrorResult, + id ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/FileInterface/RifReaderObservedData.cpp b/ApplicationCode/FileInterface/RifReaderObservedData.cpp index aabb196ebf..edee985544 100644 --- a/ApplicationCode/FileInterface/RifReaderObservedData.cpp +++ b/ApplicationCode/FileInterface/RifReaderObservedData.cpp @@ -164,6 +164,7 @@ RifEclipseSummaryAddress RifReaderObservedData::address( const QString& int cellK( -1 ); int aquiferNumber( -1 ); bool isErrorResult( false ); + int id( -1 ); switch ( summaryCategory ) { @@ -192,7 +193,8 @@ RifEclipseSummaryAddress RifReaderObservedData::address( const QString& cellJ, cellK, aquiferNumber, - isErrorResult ); + isErrorResult, + id ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimProject.cpp b/ApplicationCode/ProjectDataModel/RimProject.cpp index 2f2e2f5e97..71d7f64797 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationCode/ProjectDataModel/RimProject.cpp @@ -65,6 +65,7 @@ #include "RimRftPlotCollection.h" #include "RimSaturationPressurePlotCollection.h" #include "RimScriptCollection.h" +#include "RimSummaryCalculation.h" #include "RimSummaryCalculationCollection.h" #include "RimSummaryCaseMainCollection.h" #include "RimSummaryCrossPlotCollection.h" @@ -106,6 +107,7 @@ RimProject::RimProject( void ) , m_nextValidCaseGroupId( 0 ) , m_nextValidViewId( 1 ) , m_nextValidPlotId( 1 ) + , m_nextValidCalculationId( 1 ) { CAF_PDM_InitObject( "Project", "", "", "" ); @@ -243,10 +245,11 @@ void RimProject::close() plotWindowCurrentModelIndexPath = ""; plotWindowTreeViewState = ""; - m_nextValidCaseId = 0; - m_nextValidCaseGroupId = 0; - m_nextValidViewId = 1; - m_nextValidPlotId = 1; + m_nextValidCaseId = 0; + m_nextValidCaseGroupId = 0; + m_nextValidViewId = 1; + m_nextValidPlotId = 1; + m_nextValidCalculationId = 1; } //-------------------------------------------------------------------------------------------------- @@ -539,6 +542,22 @@ void RimProject::assignPlotIdToPlotWindow( RimPlotWindow* plotWindow ) } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimProject::assignCalculationIdToCalculation( RimSummaryCalculation* calculation ) +{ + if ( calculation ) + { + for ( RimSummaryCalculation* existingCalculation : calculationCollection->calculations() ) + { + m_nextValidCalculationId = std::max( m_nextValidCalculationId, existingCalculation->id() + 1 ); + } + + calculation->setId( m_nextValidCalculationId++ ); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimProject.h b/ApplicationCode/ProjectDataModel/RimProject.h index 302851a3a9..dcbbd53068 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.h +++ b/ApplicationCode/ProjectDataModel/RimProject.h @@ -39,6 +39,7 @@ class RimTextAnnotation; class RimReachCircleAnnotation; class RimPolylinesAnnotation; class RimSummaryCalculationCollection; +class RimSummaryCalculation; class RimCase; class RimCommandObject; class RimCommandObject; @@ -119,6 +120,7 @@ public: void assignIdToCaseGroup( RimIdenticalGridCaseGroup* caseGroup ); void assignViewIdToView( Rim3dView* view ); void assignPlotIdToPlotWindow( RimPlotWindow* plotWindow ); + void assignCalculationIdToCalculation( RimSummaryCalculation* calculation ); void allCases( std::vector& cases ) const; @@ -207,6 +209,7 @@ private: int m_nextValidCaseGroupId; int m_nextValidViewId; int m_nextValidPlotId; + int m_nextValidCalculationId; caf::PdmChildArrayField casesObsolete; // obsolete caf::PdmChildArrayField caseGroupsObsolete; // obsolete diff --git a/ApplicationCode/ProjectDataModel/RimSummaryCalculation.cpp b/ApplicationCode/ProjectDataModel/RimSummaryCalculation.cpp index d6f91c7a62..429b2c027e 100644 --- a/ApplicationCode/ProjectDataModel/RimSummaryCalculation.cpp +++ b/ApplicationCode/ProjectDataModel/RimSummaryCalculation.cpp @@ -64,6 +64,8 @@ RimSummaryCalculation::RimSummaryCalculation() CAF_PDM_InitFieldNoDefault( &m_calculatedValues, "CalculatedValues", "Calculated Values", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_timesteps, "TimeSteps", "Time Steps", "", "", "" ); + CAF_PDM_InitField( &m_id, "Id", -1, "Id", "", "", "" ); + m_id.uiCapability()->setUiHidden( true ); m_exprContextMenuMgr = std::unique_ptr( new RiuExpressionContextMenuManager() ); @@ -86,6 +88,22 @@ QString RimSummaryCalculation::description() const return m_description; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryCalculation::setId( int id ) +{ + m_id = id; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RimSummaryCalculation::id() const +{ + return m_id; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -478,3 +496,15 @@ void RimSummaryCalculation::updateDependentCurvesAndPlots() } } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimSummaryCalculation::allVariables() const +{ + std::vector outVariables; + for ( RimSummaryCalculationVariable* v : m_variables ) + outVariables.push_back( v ); + + return outVariables; +} diff --git a/ApplicationCode/ProjectDataModel/RimSummaryCalculation.h b/ApplicationCode/ProjectDataModel/RimSummaryCalculation.h index 8a98540468..8e3b4a5de9 100644 --- a/ApplicationCode/ProjectDataModel/RimSummaryCalculation.h +++ b/ApplicationCode/ProjectDataModel/RimSummaryCalculation.h @@ -42,10 +42,15 @@ public: void setDescription( const QString& description ); QString description() const; + void setId( int id ); + int id() const; + bool isDirty() const; caf::PdmChildArrayFieldHandle* variables(); + std::vector allVariables() const; + const std::vector& values() const; const std::vector& timeSteps() const; @@ -85,6 +90,7 @@ private: caf::PdmField> m_calculatedValues; caf::PdmField> m_timesteps; + caf::PdmField m_id; std::unique_ptr m_exprContextMenuMgr; diff --git a/ApplicationCode/ProjectDataModel/RimSummaryCalculationCollection.cpp b/ApplicationCode/ProjectDataModel/RimSummaryCalculationCollection.cpp index d7ecbad5cb..e053c7336d 100644 --- a/ApplicationCode/ProjectDataModel/RimSummaryCalculationCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimSummaryCalculationCollection.cpp @@ -18,7 +18,10 @@ #include "RimSummaryCalculationCollection.h" +#include "RiaApplication.h" + #include "RimCalculatedSummaryCase.h" +#include "RimProject.h" #include "RimSummaryCalculation.h" #include "cafPdmUiGroup.h" @@ -46,8 +49,9 @@ RimSummaryCalculationCollection::RimSummaryCalculationCollection() RimSummaryCalculation* RimSummaryCalculationCollection::addCalculation() { RimSummaryCalculation* calculation = new RimSummaryCalculation; + RiaApplication::instance()->project()->assignCalculationIdToCalculation( calculation ); - QString varName = QString( "Calculation_%1" ).arg( m_calcuations.size() + 1 ); + QString varName = QString( "Calculation_%1" ).arg( calculation->id() ); calculation->setDescription( varName ); calculation->setExpression( varName + " := x + y" ); calculation->parseExpression(); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimCalculatedSummaryCurveReader.cpp b/ApplicationCode/ProjectDataModel/Summary/RimCalculatedSummaryCurveReader.cpp index cc10cd052f..9d66565d41 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimCalculatedSummaryCurveReader.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimCalculatedSummaryCurveReader.cpp @@ -85,7 +85,8 @@ void RifCalculatedSummaryCurveReader::buildMetaData() for ( RimSummaryCalculation* calc : m_calculationCollection->calculations() ) { - m_allResultAddresses.insert( RifEclipseSummaryAddress::calculatedAddress( calc->description().toStdString() ) ); + m_allResultAddresses.insert( + RifEclipseSummaryAddress::calculatedAddress( calc->description().toStdString(), calc->id() ) ); } } @@ -97,11 +98,10 @@ RimSummaryCalculation* { if ( m_calculationCollection && resultAddress.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) { - QString calculatedName = QString::fromStdString( resultAddress.quantityName() ); - + int id = resultAddress.id(); for ( RimSummaryCalculation* calc : m_calculationCollection->calculations() ) { - if ( calc->description() == calculatedName ) + if ( calc->id() == id ) { return calc; } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryAddress.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryAddress.cpp index 152f72d413..53e85fe058 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryAddress.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryAddress.cpp @@ -65,6 +65,7 @@ RimSummaryAddress::RimSummaryAddress() CAF_PDM_InitFieldNoDefault( &m_cellK, "SummaryCellK", "K", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_aquiferNumber, "SummaryAquifer", "Aquifer", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_isErrorResult, "IsErrorResult", "Is Error Result", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_calculationId, "CalculationId", "Calculation Id", "", "", "" ); m_category = RifEclipseSummaryAddress::SUMMARY_INVALID; m_regionNumber = -1; @@ -75,6 +76,7 @@ RimSummaryAddress::RimSummaryAddress() m_cellK = -1; m_aquiferNumber = -1; m_isErrorResult = false; + m_calculationId = -1; } //-------------------------------------------------------------------------------------------------- @@ -98,9 +100,10 @@ void RimSummaryAddress::setAddress( const RifEclipseSummaryAddress& addr ) m_aquiferNumber = addr.aquiferNumber(); m_isErrorResult = addr.isErrorResult(); - m_cellI = addr.cellI(); - m_cellJ = addr.cellJ(); - m_cellK = addr.cellK(); + m_cellI = addr.cellI(); + m_cellJ = addr.cellJ(); + m_cellK = addr.cellK(); + m_calculationId = addr.id(); } //-------------------------------------------------------------------------------------------------- @@ -120,5 +123,6 @@ RifEclipseSummaryAddress RimSummaryAddress::address() m_cellJ(), m_cellK(), m_aquiferNumber, - m_isErrorResult ); + m_isErrorResult, + m_calculationId ); } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryAddress.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryAddress.h index 5552a35aca..549e8dd40f 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryAddress.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryAddress.h @@ -62,4 +62,5 @@ private: caf::PdmField m_cellK; caf::PdmField m_aquiferNumber; caf::PdmField m_isErrorResult; + caf::PdmField m_calculationId; }; diff --git a/ApplicationCode/UnitTests/ObservedDataParser-Test.cpp b/ApplicationCode/UnitTests/ObservedDataParser-Test.cpp index ac693d07b0..5602ebd401 100644 --- a/ApplicationCode/UnitTests/ObservedDataParser-Test.cpp +++ b/ApplicationCode/UnitTests/ObservedDataParser-Test.cpp @@ -569,7 +569,7 @@ TEST( RifColumnBasedRsmspecParserTest, TestTableValues ) userData.parse( data ); RifEclipseSummaryAddress - adr( RifEclipseSummaryAddress::SUMMARY_WELL, "WOPR", -1, -1, "", "P-15P", -1, "", -1, -1, -1, -1, false ); + adr( RifEclipseSummaryAddress::SUMMARY_WELL, "WOPR", -1, -1, "", "P-15P", -1, "", -1, -1, -1, -1, false, -1 ); QDateTime firstTimeStep = RiaQDateTimeTools::addDays( RiaQDateTimeTools::epoch(), 1.0 ); auto timeSteps = userData.timeSteps( adr ); diff --git a/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp b/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp index 9bd8b5ec5d..2a8af4ffda 100644 --- a/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp +++ b/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp @@ -138,7 +138,8 @@ RiuSummaryCurveDefSelection::RiuSummaryCurveDefSelection() {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_ID )}, + {new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME )}}}, {RifEclipseSummaryAddress::SUMMARY_IMPORTED, {{new SummaryIdentifierAndField( RifEclipseSummaryAddress::INPUT_VECTOR_NAME )}}}, } ) @@ -350,6 +351,13 @@ RiuSummaryCurveDefSelection::RiuSummaryCurveDefSelection() "" ); CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_CALCULATED][0]->pdmField(), + "CalculatedVectorsId", + "Calculated Vectors Id", + "", + "", + "" ); + + CAF_PDM_InitFieldNoDefault( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_CALCULATED][1]->pdmField(), "CalculatedVectors", "Calculated Vectors", "", @@ -940,7 +948,7 @@ void RiuSummaryCurveDefSelection::defineUiOrdering( QString uiConfigName, caf::P } else if ( sumCategory == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) { - summaryiesField = m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_CALCULATED][0]->pdmField(); + summaryiesField = m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_CALCULATED][1]->pdmField(); } else if ( sumCategory == RifEclipseSummaryAddress::SUMMARY_IMPORTED ) {