From d5d26a36f241b31d37ca24b6f042ee574e81e917 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 18 Oct 2017 08:20:21 +0200 Subject: [PATCH] #2022 Curve Calculator : Wire up access to calculated curve data --- .../ProjectDataModel/RimCalculation.cpp | 10 + .../ProjectDataModel/RimCalculation.h | 2 + .../RimCalculationCollection.cpp | 17 ++ .../RimCalculationCollection.h | 7 +- .../Summary/CMakeLists_files.cmake | 2 + .../Summary/RimCalculatedSummaryCase.cpp | 182 ++++++++++++++++++ .../Summary/RimCalculatedSummaryCase.h | 70 +++++++ .../RiuSummaryCurveDefSelection.cpp | 60 ++++-- .../RiuSummaryCurveDefSelection.h | 3 + 9 files changed, 338 insertions(+), 15 deletions(-) create mode 100644 ApplicationCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.cpp create mode 100644 ApplicationCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.h diff --git a/ApplicationCode/ProjectDataModel/RimCalculation.cpp b/ApplicationCode/ProjectDataModel/RimCalculation.cpp index 61108dde95..f30fddc221 100644 --- a/ApplicationCode/ProjectDataModel/RimCalculation.cpp +++ b/ApplicationCode/ProjectDataModel/RimCalculation.cpp @@ -49,6 +49,8 @@ RimCalculation::RimCalculation() CAF_PDM_InitFieldNoDefault(&m_variables, "Variables", "Variables", "", "", ""); CAF_PDM_InitFieldNoDefault(&m_calculatedValues, "CalculatedValues", "Calculated Values", "", "", ""); + + CAF_PDM_InitFieldNoDefault(&m_timesteps, "TimeSteps", "Time Steps", "", "", ""); } //-------------------------------------------------------------------------------------------------- @@ -104,6 +106,14 @@ const std::vector& RimCalculation::values() const return m_calculatedValues(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RimCalculation::timeSteps() const +{ + return m_timesteps(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimCalculation.h b/ApplicationCode/ProjectDataModel/RimCalculation.h index 6cfc8674d9..505b638f54 100644 --- a/ApplicationCode/ProjectDataModel/RimCalculation.h +++ b/ApplicationCode/ProjectDataModel/RimCalculation.h @@ -43,6 +43,7 @@ public: void deleteVariable(RimCalculationVariable* calcVariable); const std::vector& values() const; + const std::vector& timeSteps() const; bool parseExpression(); bool calculate(); @@ -63,4 +64,5 @@ private: caf::PdmChildArrayField m_variables; caf::PdmField> m_calculatedValues; + caf::PdmField> m_timesteps; }; diff --git a/ApplicationCode/ProjectDataModel/RimCalculationCollection.cpp b/ApplicationCode/ProjectDataModel/RimCalculationCollection.cpp index 7d1c499bec..edd9891bfc 100644 --- a/ApplicationCode/ProjectDataModel/RimCalculationCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimCalculationCollection.cpp @@ -19,6 +19,7 @@ #include "RimCalculationCollection.h" #include "RimCalculation.h" +#include "RimCalculatedSummaryCase.h" #include "cafPdmUiGroup.h" #include "cafPdmUiTreeSelectionEditor.h" @@ -34,6 +35,9 @@ RimCalculationCollection::RimCalculationCollection() CAF_PDM_InitFieldNoDefault(&m_calcuations, "Calculations", "Calculations", "", "", ""); m_calcuations.uiCapability()->setUiEditorTypeName(caf::PdmUiTreeSelectionEditor::uiEditorTypeName()); + + CAF_PDM_InitFieldNoDefault(&m_calcuationSummaryCase, "CalculationsSummaryCase", "Calculations Summary Case", "", "", ""); + m_calcuationSummaryCase = new RimCalculatedSummaryCase; } //-------------------------------------------------------------------------------------------------- @@ -46,6 +50,8 @@ RimCalculation* RimCalculationCollection::addCalculation() m_calcuations.push_back(calculation); + m_calcuationSummaryCase()->buildMetaData(); + return calculation; } @@ -55,6 +61,9 @@ RimCalculation* RimCalculationCollection::addCalculation() void RimCalculationCollection::deleteCalculation(RimCalculation* calculation) { m_calcuations.removeChildObject(calculation); + + m_calcuationSummaryCase()->buildMetaData(); + delete calculation; } @@ -73,3 +82,11 @@ std::vector RimCalculationCollection::calculations() const return calcs; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimCalculatedSummaryCase* RimCalculationCollection::calculationSummaryCase() +{ + return m_calcuationSummaryCase(); +} + diff --git a/ApplicationCode/ProjectDataModel/RimCalculationCollection.h b/ApplicationCode/ProjectDataModel/RimCalculationCollection.h index 35688cbcec..8dfeb67f10 100644 --- a/ApplicationCode/ProjectDataModel/RimCalculationCollection.h +++ b/ApplicationCode/ProjectDataModel/RimCalculationCollection.h @@ -20,8 +20,10 @@ #include "cafPdmObject.h" #include "cafPdmChildArrayField.h" +#include "cafPdmChildField.h" class RimCalculation; +class RimCalculatedSummaryCase; //================================================================================================== /// @@ -38,6 +40,9 @@ public: void deleteCalculation(RimCalculation* calculation); std::vector calculations() const; + RimCalculatedSummaryCase* calculationSummaryCase(); + private: - caf::PdmChildArrayField m_calcuations; + caf::PdmChildArrayField m_calcuations; + caf::PdmChildField m_calcuationSummaryCase; }; diff --git a/ApplicationCode/ProjectDataModel/Summary/CMakeLists_files.cmake b/ApplicationCode/ProjectDataModel/Summary/CMakeLists_files.cmake index 3fb999399f..9268fb6850 100644 --- a/ApplicationCode/ProjectDataModel/Summary/CMakeLists_files.cmake +++ b/ApplicationCode/ProjectDataModel/Summary/CMakeLists_files.cmake @@ -26,6 +26,7 @@ ${CEE_CURRENT_LIST_DIR}RimObservedData.h ${CEE_CURRENT_LIST_DIR}RimObservedDataCollection.h ${CEE_CURRENT_LIST_DIR}RimSummaryObservedDataFile.h ${CEE_CURRENT_LIST_DIR}RimObservedEclipseUserData.h +${CEE_CURRENT_LIST_DIR}RimCalculatedSummaryCase.h ) set (SOURCE_GROUP_SOURCE_FILES @@ -50,6 +51,7 @@ ${CEE_CURRENT_LIST_DIR}RimObservedData.cpp ${CEE_CURRENT_LIST_DIR}RimObservedDataCollection.cpp ${CEE_CURRENT_LIST_DIR}RimSummaryObservedDataFile.cpp ${CEE_CURRENT_LIST_DIR}RimObservedEclipseUserData.cpp +${CEE_CURRENT_LIST_DIR}RimCalculatedSummaryCase.cpp ) list(APPEND CODE_HEADER_FILES diff --git a/ApplicationCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.cpp b/ApplicationCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.cpp new file mode 100644 index 0000000000..9bdd4ce84a --- /dev/null +++ b/ApplicationCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.cpp @@ -0,0 +1,182 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// 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 "RimCalculation.h" +#include "RimCalculationCollection.h" + +CAF_PDM_SOURCE_INIT(RimCalculatedSummaryCase,"CalculatedSummaryCase"); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimCalculatedSummaryCase::RimCalculatedSummaryCase() +{ + CAF_PDM_InitObject("Calculated Summary Case",":/SummaryCase48x48.png","",""); + + m_calculatedCurveReader = nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimCalculatedSummaryCase::~RimCalculatedSummaryCase() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimCalculatedSummaryCase::caseName() +{ + return "Calculated Summary Case"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimCalculatedSummaryCase::createSummaryReaderInterface() +{ + if (!m_calculatedCurveReader) + { + RimCalculationCollection* calculationCollection = nullptr; + this->firstAncestorOrThisOfTypeAsserted(calculationCollection); + + m_calculatedCurveReader = new RifCalculatedSummaryCurveReader(calculationCollection); + + m_calculatedCurveReader->buildMetaData(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RifSummaryReaderInterface* RimCalculatedSummaryCase::summaryReader() +{ + if (!m_calculatedCurveReader) createSummaryReaderInterface(); + + return m_calculatedCurveReader; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimCalculatedSummaryCase::updateFilePathsFromProjectPath(const QString& newProjectPath, const QString& oldProjectPath) +{ + // Nothing to do here +} + + + + + + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimCalculatedSummaryCase::buildMetaData() +{ + if (!m_calculatedCurveReader) createSummaryReaderInterface(); + + m_calculatedCurveReader->buildMetaData(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimCalculatedSummaryCase::RifCalculatedSummaryCurveReader::RifCalculatedSummaryCurveReader(RimCalculationCollection* calculationCollection) + : m_calculationCollection(calculationCollection) +{ + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RimCalculatedSummaryCase::RifCalculatedSummaryCurveReader::timeSteps(const RifEclipseSummaryAddress& resultAddress) const +{ + RimCalculation* calc = findCalculationByName(resultAddress); + if (calc) + { + return calc->timeSteps(); + } + + static std::vector dummy; + + return dummy; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimCalculatedSummaryCase::RifCalculatedSummaryCurveReader::values(const RifEclipseSummaryAddress& resultAddress, std::vector* values) const +{ + RimCalculation* calc = findCalculationByName(resultAddress); + if (calc) + { + *values = calc->values(); + + return true; + } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::string RimCalculatedSummaryCase::RifCalculatedSummaryCurveReader::unitName(const RifEclipseSummaryAddress& resultAddress) const +{ + return "Calculated Curve Unit"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimCalculatedSummaryCase::RifCalculatedSummaryCurveReader::buildMetaData() +{ + m_allResultAddresses.clear(); + + for (RimCalculation* calc : m_calculationCollection->calculations()) + { + m_allResultAddresses.push_back(RifEclipseSummaryAddress::calculatedCurveAddress(calc->description().toStdString())); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimCalculation* RimCalculatedSummaryCase::RifCalculatedSummaryCurveReader::findCalculationByName(const RifEclipseSummaryAddress& resultAddress) const +{ + if (!m_calculationCollection) return false; + + CVF_ASSERT(resultAddress.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED); + + QString calculatedName = QString::fromStdString(resultAddress.quantityName()); + + for (RimCalculation* calc : m_calculationCollection->calculations()) + { + if (calc->description() == calculatedName) + { + return calc; + } + } + + return nullptr; +} diff --git a/ApplicationCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.h b/ApplicationCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.h new file mode 100644 index 0000000000..604a373b76 --- /dev/null +++ b/ApplicationCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.h @@ -0,0 +1,70 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// 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 "RimSummaryCase.h" +#include "RifSummaryReaderInterface.h" + +class RimCalculationCollection; +class RimCalculation; + + +//================================================================================================== +// +//================================================================================================== +class RimCalculatedSummaryCase : public RimSummaryCase +{ + CAF_PDM_HEADER_INIT; + +private: + //================================================================================================== + // + //================================================================================================== + class RifCalculatedSummaryCurveReader : public RifSummaryReaderInterface + { + public: + explicit RifCalculatedSummaryCurveReader(RimCalculationCollection* calculationCollection); + + virtual const std::vector& timeSteps(const RifEclipseSummaryAddress& resultAddress) const override; + virtual bool values(const RifEclipseSummaryAddress& resultAddress, std::vector* values) const override; + virtual std::string unitName(const RifEclipseSummaryAddress& resultAddress) const override; + + void buildMetaData(); + + private: + RimCalculation* findCalculationByName(const RifEclipseSummaryAddress& resultAddress) const; + + private: + caf::PdmPointer m_calculationCollection; + }; + +public: + RimCalculatedSummaryCase(); + virtual ~RimCalculatedSummaryCase(); + + virtual QString caseName() override; + virtual void createSummaryReaderInterface() override; + virtual RifSummaryReaderInterface* summaryReader() override; + virtual void updateFilePathsFromProjectPath(const QString& newProjectPath, const QString& oldProjectPath) override; + + void buildMetaData(); + +private: + RifCalculatedSummaryCurveReader* m_calculatedCurveReader; +}; diff --git a/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp b/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp index 52f481428c..a2ae2c9b41 100644 --- a/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp +++ b/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp @@ -21,11 +21,12 @@ #include "RiaApplication.h" #include "RiaSummaryCurveDefinition.h" -#include "RiuSummaryCurveDefinitionKeywords.h" - #include "RifEclipseSummaryAddress.h" #include "RifSummaryReaderInterface.h" +#include "RimCalculation.h" +#include "RimCalculatedSummaryCase.h" +#include "RimCalculationCollection.h" #include "RimObservedData.h" #include "RimObservedDataCollection.h" #include "RimOilField.h" @@ -34,6 +35,8 @@ #include "RimSummaryCaseCollection.h" #include "RimSummaryCaseMainCollection.h" +#include "RiuSummaryCurveDefinitionKeywords.h" + #include "cafPdmUiTreeSelectionEditor.h" #include @@ -211,7 +214,7 @@ std::vector RiuSummaryCurveDefSelection::selectedCurv std::set selectedAddressesFromUi = buildAddressListFromSelections(); - for (RimSummaryCase* currCase : m_selectedCases) + for (RimSummaryCase* currCase : summaryCases()) { if (currCase && currCase->summaryReader()) { @@ -259,7 +262,10 @@ void RiuSummaryCurveDefSelection::setSelectedCurveDefinitions(const std::vector< // Select case if not already selected if (std::find(m_selectedCases.begin(), m_selectedCases.end(), summaryCase) == m_selectedCases.end()) { - m_selectedCases.push_back(summaryCase); + if (summaryCase != calculatedSummaryCase()) + { + m_selectedCases.push_back(summaryCase); + } } bool isObservedDataCase = isObservedData(summaryCase); @@ -293,15 +299,13 @@ std::set RiuSummaryCurveDefSelection::findPossibleSumm if (m_currentSummaryCategory == RifEclipseSummaryAddress::SUMMARY_CALCULATED) { - // TODO - // Wire up list of calculated curves here -/* - RifEclipseSummaryAddress adr = RifEclipseSummaryAddress::calculatedCurveAddress("a My Test"); - addressSet.insert(adr); + RimSummaryCase* calcSumCase = calculatedSummaryCase(); - RifEclipseSummaryAddress adr2 = RifEclipseSummaryAddress::calculatedCurveAddress("b My Test2"); - addressSet.insert(adr2); -*/ + const std::vector allAddresses = calcSumCase->summaryReader()->allResultAddresses(); + for (const auto& adr : allAddresses) + { + addressSet.insert(adr); + } } return addressSet; @@ -582,7 +586,7 @@ void RiuSummaryCurveDefSelection::defineUiOrdering(QString uiConfigName, caf::Pd std::set RiuSummaryCurveDefSelection::findPossibleSummaryAddressesFromSelectedCases(const SummaryIdentifierAndField *identifierAndField) { std::vector cases; - for (const auto& sumCase: m_selectedCases) + for (const auto& sumCase : m_selectedCases()) { if(isObservedData(sumCase)) continue; cases.push_back(sumCase); @@ -596,7 +600,7 @@ std::set RiuSummaryCurveDefSelection::findPossibleSumm std::set RiuSummaryCurveDefSelection::findPossibleSummaryAddressesFromSelectedObservedData(const SummaryIdentifierAndField *identifierAndField) { std::vector obsData; - for (const auto& sumCase : m_selectedCases) + for (const auto& sumCase : m_selectedCases()) { if (isObservedData(sumCase)) { @@ -831,3 +835,31 @@ bool RiuSummaryCurveDefSelection::isObservedData(RimSummaryCase *sumCase) const { return dynamic_cast(sumCase) != nullptr; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RiuSummaryCurveDefSelection::summaryCases() const +{ + std::vector cases; + + for (RimSummaryCase* currCase : m_selectedCases) + { + cases.push_back(currCase); + } + + // Always add the summary case for calculated curves as this case is not displayed in UI + cases.push_back(RiuSummaryCurveDefSelection::calculatedSummaryCase()); + + return cases; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSummaryCase* RiuSummaryCurveDefSelection::calculatedSummaryCase() +{ + RimCalculationCollection* calcColl = RiaApplication::instance()->project()->calculationCollection(); + + return calcColl->calculationSummaryCase(); +} diff --git a/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.h b/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.h index abb974d440..7dec38cbad 100644 --- a/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.h +++ b/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.h @@ -106,6 +106,9 @@ private: void resetAllFields(); bool isObservedData(RimSummaryCase *sumCase) const; + std::vector summaryCases() const; + static RimSummaryCase* calculatedSummaryCase(); + private: caf::PdmPtrArrayField m_selectedCases;