///////////////////////////////////////////////////////////////////////////////// // // 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 "RimEnsembleCurveSetCollection.h" #include "RiaApplication.h" #include "RiaColorTables.h" #include "RiaStdStringTools.h" #include "RifReaderEclipseSummary.h" #include "RimEnsembleCurveSet.h" #include "RimProject.h" #include "RimSummaryCase.h" #include "RimSummaryCrossPlot.h" #include "RimSummaryCurve.h" #include "RimSummaryCurveAppearanceCalculator.h" #include "RimSummaryPlot.h" #include "RimSummaryPlotSourceStepping.h" #include "RiuQwtPlotCurve.h" #include "qwt_plot.h" CAF_PDM_SOURCE_INIT(RimEnsembleCurveSetCollection, "RimEnsembleCurveSetCollection"); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RimEnsembleCurveSetCollection::RimEnsembleCurveSetCollection() { CAF_PDM_InitObject("Ensemble Curve Sets", ":/EnsembleCurveSets16x16.png", "", ""); CAF_PDM_InitFieldNoDefault(&m_curveSets, "EnsembleCurveSets", "Ensemble Curve Sets", "", "", ""); m_curveSets.uiCapability()->setUiHidden(true); m_curveSets.uiCapability()->setUiTreeChildrenHidden(false); CAF_PDM_InitField(&m_showCurves, "IsActive", true, "Show Curves", "", "", ""); m_showCurves.uiCapability()->setUiHidden(true); CAF_PDM_InitFieldNoDefault(&m_ySourceStepping, "YSourceStepping", "", "", "", ""); m_ySourceStepping = new RimSummaryPlotSourceStepping; m_ySourceStepping->setSourceSteppingType(RimSummaryPlotSourceStepping::Y_AXIS); m_ySourceStepping.uiCapability()->setUiHidden(true); m_ySourceStepping.uiCapability()->setUiTreeChildrenHidden(true); m_ySourceStepping.xmlCapability()->disableIO(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RimEnsembleCurveSetCollection::~RimEnsembleCurveSetCollection() { m_curveSets.deleteAllChildObjects(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RimEnsembleCurveSetCollection::isCurveSetsVisible() { return m_showCurves(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveSetCollection::loadDataAndUpdate(bool updateParentPlot) { for (RimEnsembleCurveSet* curveSet : m_curveSets) { curveSet->loadDataAndUpdate(false); } if (updateParentPlot) { RimSummaryPlot* parentPlot; firstAncestorOrThisOfTypeAsserted(parentPlot); parentPlot->updateAll(); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveSetCollection::setParentQwtPlotAndReplot(QwtPlot* plot) { for (RimEnsembleCurveSet* curveSet : m_curveSets) { curveSet->setParentQwtPlotNoReplot(plot); } if (plot) plot->replot(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveSetCollection::detachQwtCurves() { for (const auto& curveSet : m_curveSets) { curveSet->detachQwtCurves(); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveSetCollection::reattachQwtCurves() { for (const auto& curveSet : m_curveSets) { curveSet->reattachQwtCurves(); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RimEnsembleCurveSet* RimEnsembleCurveSetCollection::findRimCurveSetFromQwtCurve(const QwtPlotCurve* qwtCurve) const { for (RimEnsembleCurveSet* curveSet : m_curveSets) { for (RimSummaryCurve* rimCurve : curveSet->curves()) { if (rimCurve->qwtPlotCurve() == qwtCurve) { return curveSet; } } } return nullptr; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveSetCollection::addCurveSet(RimEnsembleCurveSet* curveSet) { if (curveSet) { m_curveSets.push_back(curveSet); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveSetCollection::deleteCurveSet(RimEnsembleCurveSet* curveSet) { deleteCurveSets({ curveSet }); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveSetCollection::deleteCurveSets(const std::vector curveSets) { for(const auto curveSet : curveSets) { m_curveSets.removeChildObject(curveSet); curveSet->markCachedDataForPurge(); delete curveSet; } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::vector RimEnsembleCurveSetCollection::curveSets() const { return m_curveSets.childObjects(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- size_t RimEnsembleCurveSetCollection::curveSetCount() const { return m_curveSets.size(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::vector RimEnsembleCurveSetCollection::fieldsToShowInToolbar() { if (m_ySourceStepping) { return m_ySourceStepping->fieldsToShowInToolbar(); } return std::vector(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveSetCollection::setCurveSetForSourceStepping(RimEnsembleCurveSet* curveSet) { m_curveSetForSourceStepping = curveSet; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RimEnsembleCurveSet* RimEnsembleCurveSetCollection::curveSetForSourceStepping() const { return m_curveSetForSourceStepping; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::vector RimEnsembleCurveSetCollection::curveSetsForSourceStepping() const { std::vector steppingCurveSets; if (m_curveSetForSourceStepping) { steppingCurveSets.push_back(m_curveSetForSourceStepping); { // Add corresponding history/summary curve with or without H const std::string historyIdentifier = "H"; std::string quantity = m_curveSetForSourceStepping->summaryAddress().quantityName(); std::string candidateName; if (RiaStdStringTools::endsWith(quantity, historyIdentifier)) { candidateName = quantity.substr(0, quantity.size() - 1); } else { candidateName = quantity + historyIdentifier; } for (const auto& c : curveSets()) { if (c->summaryAddress().quantityName() == candidateName) { steppingCurveSets.push_back(c); } } } } else { steppingCurveSets = curveSets(); } return steppingCurveSets; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveSetCollection::deleteAllCurveSets() { m_curveSets.deleteAllChildObjects(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveSetCollection::setCurrentSummaryCurveSet(RimEnsembleCurveSet* curveSet) { m_currentEnsembleCurveSet = curveSet; updateConnectedEditors(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveSetCollection::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) { if (changedField == &m_showCurves) { loadDataAndUpdate(true); RimSummaryPlot* summaryPlot = nullptr; this->firstAncestorOrThisOfTypeAsserted(summaryPlot); summaryPlot->updateConnectedEditors(); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveSetCollection::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) { auto group = uiOrdering.addNewGroup("Data Source"); m_ySourceStepping()->uiOrdering(uiConfigName, *group); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- caf::PdmFieldHandle* RimEnsembleCurveSetCollection::objectToggleField() { return &m_showCurves; }