From 8b14a01a2bf912945e40085f5afd51a80b9a8450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Jensen?= Date: Tue, 14 Aug 2018 11:01:19 +0200 Subject: [PATCH] #3200 Plot editor. Remove curve sets correctly --- .../Application/CMakeLists_files.cmake | 2 + .../Application/RiaCurveSetDefinition.cpp | 71 +++++++++++++++++++ .../Application/RiaCurveSetDefinition.h | 48 +++++++++++++ .../RicSummaryCurveCreator.cpp | 48 +++++++++++-- .../RicSummaryCurveCreator.h | 3 +- .../Summary/RimSummaryPlot.cpp | 8 +++ .../ProjectDataModel/Summary/RimSummaryPlot.h | 2 + .../RiuSummaryCurveDefSelection.cpp | 35 +++++++++ .../RiuSummaryCurveDefSelection.h | 2 + 9 files changed, 213 insertions(+), 6 deletions(-) create mode 100644 ApplicationCode/Application/RiaCurveSetDefinition.cpp create mode 100644 ApplicationCode/Application/RiaCurveSetDefinition.h diff --git a/ApplicationCode/Application/CMakeLists_files.cmake b/ApplicationCode/Application/CMakeLists_files.cmake index 2fc2f0249b..e22ea375b9 100644 --- a/ApplicationCode/Application/CMakeLists_files.cmake +++ b/ApplicationCode/Application/CMakeLists_files.cmake @@ -7,6 +7,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RiaFractureDefines.h ${CMAKE_CURRENT_LIST_DIR}/RiaPreferences.h ${CMAKE_CURRENT_LIST_DIR}/RiaPorosityModel.h ${CMAKE_CURRENT_LIST_DIR}/RiaSummaryCurveDefinition.h +${CMAKE_CURRENT_LIST_DIR}/RiaCurveSetDefinition.h ${CMAKE_CURRENT_LIST_DIR}/RiaRftPltCurveDefinition.h ${CMAKE_CURRENT_LIST_DIR}/RiaViewRedrawScheduler.h ${CMAKE_CURRENT_LIST_DIR}/RiaMemoryCleanup.h @@ -21,6 +22,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RiaMain.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaPreferences.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaPorosityModel.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaSummaryCurveDefinition.cpp +${CMAKE_CURRENT_LIST_DIR}/RiaCurveSetDefinition.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaRftPltCurveDefinition.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaViewRedrawScheduler.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaMemoryCleanup.cpp diff --git a/ApplicationCode/Application/RiaCurveSetDefinition.cpp b/ApplicationCode/Application/RiaCurveSetDefinition.cpp new file mode 100644 index 0000000000..a8f5658e16 --- /dev/null +++ b/ApplicationCode/Application/RiaCurveSetDefinition.cpp @@ -0,0 +1,71 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// 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 "RiaCurveSetDefinition.h" + +#include "RifSummaryReaderInterface.h" +#include "RimSummaryCaseCollection.h" + + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaCurveSetDefinition::RiaCurveSetDefinition() : + m_ensemble(nullptr) +{ + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaCurveSetDefinition::RiaCurveSetDefinition(RimSummaryCaseCollection* ensemble, const RifEclipseSummaryAddress& summaryAddress) : + m_ensemble(ensemble), + m_summaryAddress(summaryAddress) +{ + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSummaryCaseCollection* RiaCurveSetDefinition::ensemble() const +{ + return m_ensemble; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const RifEclipseSummaryAddress& RiaCurveSetDefinition::summaryAddress() const +{ + return m_summaryAddress; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaCurveSetDefinition::operator<(const RiaCurveSetDefinition& other) const +{ + if (m_ensemble != other.ensemble()) + { + return (m_ensemble < other.ensemble()); + } + + return (m_summaryAddress < other.summaryAddress()); +} diff --git a/ApplicationCode/Application/RiaCurveSetDefinition.h b/ApplicationCode/Application/RiaCurveSetDefinition.h new file mode 100644 index 0000000000..b1941ff8a6 --- /dev/null +++ b/ApplicationCode/Application/RiaCurveSetDefinition.h @@ -0,0 +1,48 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// 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 "RifEclipseSummaryAddress.h" + +#include + +#include +#include + +class RimSummaryCaseCollection; + +//================================================================================================== +/// +//================================================================================================== +class RiaCurveSetDefinition +{ +public: + RiaCurveSetDefinition(); + explicit RiaCurveSetDefinition(RimSummaryCaseCollection* emsemble, + const RifEclipseSummaryAddress& summaryAddress); + + RimSummaryCaseCollection* ensemble() const; + const RifEclipseSummaryAddress& summaryAddress() const; + + bool operator < (const RiaCurveSetDefinition& other) const; + +private: + RimSummaryCaseCollection * m_ensemble; + RifEclipseSummaryAddress m_summaryAddress; +}; diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp index f474fe3158..098f485197 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp @@ -21,6 +21,7 @@ #include "RiaApplication.h" #include "RiaColorTables.h" #include "RiaSummaryCurveDefinition.h" +#include "RiaCurveSetDefinition.h" #include "RicSelectSummaryPlotUI.h" #include "RiuSummaryCurveDefinitionKeywords.h" @@ -335,7 +336,7 @@ void RicSummaryCurveCreator::syncPreviewCurvesFromUiSelection() std::set(allCurveDefinitionsVector.begin(), allCurveDefinitionsVector.end()); std::vector currentCurvesInPreviewPlot = m_previewPlot->summaryAndEnsembleCurves(); - if (allCurveDefinitions.size() != currentCurvesInPreviewPlot.size()) + { std::set currentCurveDefs; std::set newCurveDefs; @@ -347,7 +348,6 @@ void RicSummaryCurveCreator::syncPreviewCurvesFromUiSelection() currentCurveDefs.insert(RiaSummaryCurveDefinition(sumCase, curve->summaryAddressY(), sumCase ? sumCase->ensemble() : nullptr)); } - if (allCurveDefinitions.size() < currentCurvesInPreviewPlot.size()) { // Determine which curves to delete from plot std::set deleteCurveDefs; @@ -364,7 +364,7 @@ void RicSummaryCurveCreator::syncPreviewCurvesFromUiSelection() if (deleteCurveDefs.count(curveDef) > 0) curvesToDelete.insert(curve); } } - else + { // Determine which curves are new since last time std::set_difference(allCurveDefinitions.begin(), @@ -374,7 +374,40 @@ void RicSummaryCurveCreator::syncPreviewCurvesFromUiSelection() std::inserter(newCurveDefs, newCurveDefs.end())); } - updatePreviewCurvesFromCurveDefinitions(allCurveDefinitions, newCurveDefs, curvesToDelete); + // Curve sets to delete + std::set curveSetsToDelete; + { + std::vector allCurveSetDefinitionsVector = m_summaryCurveSelectionEditor->summaryAddressSelection()->allCurveSetDefinitionsFromSelections(); + std::set allCurveSetDefinitions = std::set(allCurveSetDefinitionsVector.begin(), allCurveSetDefinitionsVector.end()); + std::vector currentCurveSetsInPreviewPlot = m_previewPlot->curveSets(); + std::set currentCurveSetDefs; + + for (const auto& curveSet : currentCurveSetsInPreviewPlot) + { + RimSummaryCaseCollection* ensemble = curveSet->summaryCaseCollection(); + currentCurveSetDefs.insert(RiaCurveSetDefinition(ensemble, curveSet->summaryAddress())); + } + + if (allCurveSetDefinitions.size() < currentCurveSetsInPreviewPlot.size()) + { + // Determine which curves to delete from plot + std::set deleteCurveSetDefs; + std::set_difference(currentCurveSetDefs.begin(), + currentCurveSetDefs.end(), + allCurveSetDefinitions.begin(), + allCurveSetDefinitions.end(), + std::inserter(deleteCurveSetDefs, deleteCurveSetDefs.end())); + + for (const auto& curveSet : currentCurveSetsInPreviewPlot) + { + RimSummaryCaseCollection* ensemble = curveSet->summaryCaseCollection(); + RiaCurveSetDefinition curveSetDef = RiaCurveSetDefinition(ensemble, curveSet->summaryAddress()); + if (deleteCurveSetDefs.count(curveSetDef) > 0) curveSetsToDelete.insert(curveSet); + } + } + } + + updatePreviewCurvesFromCurveDefinitions(allCurveDefinitions, newCurveDefs, curvesToDelete, curveSetsToDelete); } } @@ -384,7 +417,8 @@ void RicSummaryCurveCreator::syncPreviewCurvesFromUiSelection() void RicSummaryCurveCreator::updatePreviewCurvesFromCurveDefinitions( const std::set& allCurveDefsToDisplay, const std::set& curveDefsToAdd, - const std::set& curvesToDelete) + const std::set& curvesToDelete, + const std::set& curveSetsToDelete) { static bool warningDisplayed = false; @@ -402,6 +436,10 @@ void RicSummaryCurveCreator::updatePreviewCurvesFromCurveDefinitions( initCurveAppearanceCalculator(curveLookCalc); // Delete curves + for (const auto& curveSet : curveSetsToDelete) + { + m_previewPlot->ensembleCurveSetCollection()->deleteCurveSet(curveSet); + } for (const auto& curve : curvesToDelete) { m_previewPlot->deleteCurve(curve); diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.h b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.h index 00c12eac1f..ebeecc7d88 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.h +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.h @@ -87,7 +87,8 @@ private: void syncPreviewCurvesFromUiSelection(); void updatePreviewCurvesFromCurveDefinitions(const std::set& allCurveDefsToDisplay, const std::set& curveDefsToAdd, - const std::set& curvesToDelete); + const std::set& curvesToDelete, + const std::set& curveSetsToDelete); std::set getAllSummaryCaseNames(); std::set getAllSummaryWellNames(); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index f8355a572e..b5cc84a9ee 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -400,6 +400,14 @@ RiuSummaryQwtPlot* RimSummaryPlot::qwtPlot() const return m_qwtPlot; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimSummaryPlot::curveSets() const +{ + return ensembleCurveSetCollection()->curveSets(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h index 7ac24b7c6b..1bcfa50b61 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h @@ -112,6 +112,8 @@ public: RimSummaryCurveCollection* summaryCurveCollection() const; RiuSummaryQwtPlot* qwtPlot() const; + std::vector curveSets() const; + void updatePlotTitle(); const RimSummaryPlotNameHelper* activePlotTitleHelperAllCurves() const; diff --git a/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp b/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp index 0bd598935f..523a633f5c 100644 --- a/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp +++ b/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp @@ -20,6 +20,7 @@ #include "RiaApplication.h" #include "RiaSummaryCurveDefinition.h" +#include "RiaCurveSetDefinition.h" #include "RifEclipseSummaryAddress.h" #include "RifSummaryReaderInterface.h" @@ -302,6 +303,40 @@ std::vector RiuSummaryCurveDefSelection::allCurveDefi return curveDefVector; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RiuSummaryCurveDefSelection::allCurveSetDefinitionsFromSelections() const +{ + std::vector curveSetDefVector; + std::set curveSetDefinitions; + std::set selectedAddressesFromUi = buildAddressListFromSelections(); + + for (SummarySource* currSource : selectedSummarySources()) + { + RimSummaryCaseCollection* ensemble = dynamic_cast(currSource); + if (!ensemble) continue; + + std::vector sourceSources; + std::set addressesFromSource; + + // Build case list + auto addresses = ensemble->calculateUnionOfSummaryAddresses(); + addressesFromSource.insert(addresses.begin(), addresses.end()); + + for (const auto& addressFromSource : addressesFromSource) + { + if (selectedAddressesFromUi.count(addressFromSource) > 0) + { + curveSetDefinitions.insert(RiaCurveSetDefinition(ensemble, addressFromSource)); + } + } + } + + std::copy(curveSetDefinitions.begin(), curveSetDefinitions.end(), std::back_inserter(curveSetDefVector)); + return curveSetDefVector; +} + //-------------------------------------------------------------------------------------------------- /// One CurveDefinition pr ensemble curve set //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.h b/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.h index ca6dc826f9..52d2bbecdb 100644 --- a/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.h +++ b/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.h @@ -37,6 +37,7 @@ class RimSummaryCaseCollection; class RimSummaryCurveAutoName; class RimSummaryPlot; class RiaSummaryCurveDefinition; +class RiaCurveSetDefinition; class SummaryIdentifierAndField; @@ -57,6 +58,7 @@ public: void setSelectedCurveDefinitions(const std::vector& curveDefinitions); std::vector allCurveDefinitionsFromSelection() const; + std::vector allCurveSetDefinitionsFromSelections() const; std::vector selection() const; void setMultiSelectionMode(bool multiSelectionMode);