diff --git a/ApplicationCode/Application/RiaSummaryCurveDefinition.cpp b/ApplicationCode/Application/RiaSummaryCurveDefinition.cpp index 8558d8457a..04b4cb99ed 100644 --- a/ApplicationCode/Application/RiaSummaryCurveDefinition.cpp +++ b/ApplicationCode/Application/RiaSummaryCurveDefinition.cpp @@ -61,6 +61,22 @@ void RiaSummaryCurveDefinition::resultValues(const RiaSummaryCurveDefinition& cu reader->values(curveDefinition.summaryAddress(), values); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RiaSummaryCurveDefinition::timeSteps(const RiaSummaryCurveDefinition& curveDefinition) +{ + std::vector dummy; + + if (!curveDefinition.summaryAddress().isValid()) return dummy; + if (!curveDefinition.summaryCase()) return dummy; + + RifSummaryReaderInterface* reader = curveDefinition.summaryCase()->summaryReader(); + if (!reader) return dummy; + + return reader->timeSteps(curveDefinition.summaryAddress()); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Application/RiaSummaryCurveDefinition.h b/ApplicationCode/Application/RiaSummaryCurveDefinition.h index 24c51a2e8d..542506f7ec 100644 --- a/ApplicationCode/Application/RiaSummaryCurveDefinition.h +++ b/ApplicationCode/Application/RiaSummaryCurveDefinition.h @@ -39,7 +39,8 @@ public: bool operator < (const RiaSummaryCurveDefinition& other) const; // TODO: Consider moving to a separate tools class - static void resultValues(const RiaSummaryCurveDefinition& curveDefinition, std::vector* values); + static void resultValues(const RiaSummaryCurveDefinition& curveDefinition, std::vector* values); + static const std::vector& timeSteps(const RiaSummaryCurveDefinition& curveDefinition); private: std::pair m_curveDefinition; diff --git a/ApplicationCode/ProjectDataModel/RimCalculation.cpp b/ApplicationCode/ProjectDataModel/RimCalculation.cpp index f30fddc221..7b29525b2c 100644 --- a/ApplicationCode/ProjectDataModel/RimCalculation.cpp +++ b/ApplicationCode/ProjectDataModel/RimCalculation.cpp @@ -188,6 +188,8 @@ bool RimCalculation::calculate() std::vector> variableValues; variableValues.resize(m_variables.size()); + + std::vector sourceTimeSteps; size_t itemCount = 0; @@ -215,6 +217,11 @@ bool RimCalculation::calculate() std::vector& curveValues = variableValues[i]; RiaSummaryCurveDefinition::resultValues(curveDef, &curveValues); + if (sourceTimeSteps.size() == 0) + { + sourceTimeSteps = RiaSummaryCurveDefinition::timeSteps(curveDef); + } + if (itemCount == 0) { itemCount = curveValues.size(); @@ -247,6 +254,9 @@ bool RimCalculation::calculate() if (evaluatedOk) { + // Copy time vector from source + m_timesteps = sourceTimeSteps; + QString txt; for (auto v : m_calculatedValues()) { diff --git a/ApplicationCode/ProjectDataModel/RimCalculationCollection.cpp b/ApplicationCode/ProjectDataModel/RimCalculationCollection.cpp index edd9891bfc..d18dda9989 100644 --- a/ApplicationCode/ProjectDataModel/RimCalculationCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimCalculationCollection.cpp @@ -37,7 +37,9 @@ RimCalculationCollection::RimCalculationCollection() m_calcuations.uiCapability()->setUiEditorTypeName(caf::PdmUiTreeSelectionEditor::uiEditorTypeName()); CAF_PDM_InitFieldNoDefault(&m_calcuationSummaryCase, "CalculationsSummaryCase", "Calculations Summary Case", "", "", ""); - m_calcuationSummaryCase = new RimCalculatedSummaryCase; + m_calcuationSummaryCase.xmlCapability()->disableIO(); + + ensureSummaryCaseIsCreated(); } //-------------------------------------------------------------------------------------------------- @@ -50,7 +52,8 @@ RimCalculation* RimCalculationCollection::addCalculation() m_calcuations.push_back(calculation); - m_calcuationSummaryCase()->buildMetaData(); + ensureSummaryCaseIsCreated(); + m_calcuationSummaryCase->buildMetaData(); return calculation; } @@ -62,7 +65,8 @@ void RimCalculationCollection::deleteCalculation(RimCalculation* calculation) { m_calcuations.removeChildObject(calculation); - m_calcuationSummaryCase()->buildMetaData(); + ensureSummaryCaseIsCreated(); + m_calcuationSummaryCase->buildMetaData(); delete calculation; } @@ -85,8 +89,37 @@ std::vector RimCalculationCollection::calculations() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimCalculatedSummaryCase* RimCalculationCollection::calculationSummaryCase() +RimSummaryCase* RimCalculationCollection::calculationSummaryCase() { + ensureSummaryCaseIsCreated(); + return m_calcuationSummaryCase(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimCalculationCollection::deleteAllContainedObjects() +{ + RimCalculatedSummaryCase* sumCase = m_calcuationSummaryCase(); + if (sumCase) + { + m_calcuationSummaryCase.removeChildObject(sumCase); + + delete sumCase; + } + + m_calcuations.deleteAllChildObjects(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimCalculationCollection::ensureSummaryCaseIsCreated() +{ + if (!m_calcuationSummaryCase()) + { + m_calcuationSummaryCase = new RimCalculatedSummaryCase; + } +} + diff --git a/ApplicationCode/ProjectDataModel/RimCalculationCollection.h b/ApplicationCode/ProjectDataModel/RimCalculationCollection.h index 8dfeb67f10..6acf16494b 100644 --- a/ApplicationCode/ProjectDataModel/RimCalculationCollection.h +++ b/ApplicationCode/ProjectDataModel/RimCalculationCollection.h @@ -23,6 +23,7 @@ #include "cafPdmChildField.h" class RimCalculation; +class RimSummaryCase; class RimCalculatedSummaryCase; //================================================================================================== @@ -40,7 +41,12 @@ public: void deleteCalculation(RimCalculation* calculation); std::vector calculations() const; - RimCalculatedSummaryCase* calculationSummaryCase(); + RimSummaryCase* calculationSummaryCase(); + + void deleteAllContainedObjects(); + +private: + void ensureSummaryCaseIsCreated(); private: caf::PdmChildArrayField m_calcuations; diff --git a/ApplicationCode/ProjectDataModel/RimProject.cpp b/ApplicationCode/ProjectDataModel/RimProject.cpp index 108c3170a8..04623b0f52 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationCode/ProjectDataModel/RimProject.cpp @@ -200,6 +200,8 @@ void RimProject::close() multiSnapshotDefinitions.deleteAllChildObjects(); + calculationCollection->deleteAllContainedObjects(); + delete viewLinkerCollection->viewLinker(); viewLinkerCollection->viewLinker = NULL;