///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2019- Equinor 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 "RimWellDistributionPlotCollection.h" #include "RimEclipseResultCase.h" #include "RimProject.h" #include "RimFlowDiagSolution.h" #include "RimWellDistributionPlot.h" #include "RigEclipseCaseData.h" #include "RigTofWellDistributionCalculator.h" #include "RiaColorTools.h" #include "RiuQwtPlotTools.h" #include "qwt_plot.h" #include "qwt_legend.h" #include "qwt_plot_curve.h" #include #include #include //#include "cvfBase.h" //#include "cvfTrace.h" //#include "cvfDebugTimer.h" //================================================================================================== // // // //================================================================================================== CAF_PDM_SOURCE_INIT(RimWellDistributionPlotCollection, "WellDistributionPlotCollection"); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RimWellDistributionPlotCollection::RimWellDistributionPlotCollection() : RimMultiPlotWindow(true) { //cvf::Trace::show("RimWellDistributionPlotCollection::RimWellDistributionPlotCollection()"); CAF_PDM_InitObject("Well Distribution Plots", "", "", ""); CAF_PDM_InitFieldNoDefault(&m_case, "Case", "Case", "", "", ""); CAF_PDM_InitField(&m_timeStepIndex, "TimeStepIndex", -1, "Time Step", "", "", ""); CAF_PDM_InitField(&m_wellName, "WellName", QString("None"), "Well", "", "", ""); m_plotWindowTitle = "Well Distribution Plots"; m_columnCountEnum = RimMultiPlotWindow::COLUMNS_UNLIMITED; m_showPlotLegends = false; m_showWindow = false; setAcceptDrops(false); setAsPlotMdiWindow(); addPlot(new RimWellDistributionPlot(RiaDefines::OIL_PHASE)); addPlot(new RimWellDistributionPlot(RiaDefines::GAS_PHASE)); addPlot(new RimWellDistributionPlot(RiaDefines::WATER_PHASE)); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RimWellDistributionPlotCollection::~RimWellDistributionPlotCollection() { } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimWellDistributionPlotCollection::onLoadDataAndUpdate() { //cvf::Trace::show("RimWellDistributionPlotCollection::onLoadDataAndUpdate()"); RimMultiPlotWindow::onLoadDataAndUpdate(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimWellDistributionPlotCollection::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) { caf::PdmUiGroup* group = uiOrdering.addNewGroup("Plot Data"); group->add(&m_case); group->add(&m_timeStepIndex); group->add(&m_wellName); //RimMultiPlotWindow::defineUiOrdering(uiConfigName, uiOrdering); uiOrdering.skipRemainingFields(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- QList RimWellDistributionPlotCollection::calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly) { QList options = RimMultiPlotWindow::calculateValueOptions(fieldNeedingOptions, useOptionsOnly); if (fieldNeedingOptions == &m_case) { RimProject* ownerProj = nullptr; firstAncestorOrThisOfType(ownerProj); if (ownerProj) { std::vector caseArr; ownerProj->descendantsIncludingThisOfType(caseArr); for (RimEclipseResultCase* c : caseArr) { options.push_back(caf::PdmOptionItemInfo(c->caseUserDescription(), c, true, c->uiIconProvider())); } } } else if (fieldNeedingOptions == &m_timeStepIndex) { if (m_case && m_case->eclipseCaseData()) { const QStringList timeStepNames = m_case->timeStepStrings(); for (int i = 0; i < timeStepNames.size(); i++) { options.push_back(caf::PdmOptionItemInfo(timeStepNames[i], i)); } } if (options.size() == 0) { options.push_back(caf::PdmOptionItemInfo("None", -1)); } } else if (fieldNeedingOptions == &m_wellName) { if (m_case && m_case->eclipseCaseData()) { caf::QIconProvider simWellIcon(":/Well.png"); const std::set sortedWellNameSet = m_case->eclipseCaseData()->findSortedWellNames(); for (const QString& name : sortedWellNameSet) { options.push_back(caf::PdmOptionItemInfo(name, name, true, simWellIcon)); } } if (options.size() == 0) { options.push_back(caf::PdmOptionItemInfo("None", QVariant())); } } return options; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimWellDistributionPlotCollection::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) { if (changedField == &m_case) { fixupDependentFieldsAfterCaseChange(); } bool shouldRecalculatePlotData = false; if (changedField == &m_case || changedField == &m_timeStepIndex || changedField == &m_wellName) { applyPlotDataParametersToContainedPlots(); shouldRecalculatePlotData = true; } RimMultiPlotWindow::fieldChangedByUi(changedField, oldValue, newValue); if (shouldRecalculatePlotData) { loadDataAndUpdate(); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimWellDistributionPlotCollection::applyPlotDataParametersToContainedPlots() { const size_t numPlots = plotCount(); for (size_t i = 0; i < numPlots; i++) { // Dirty usage of dyn_cast, but type is lost when adding the plots to our base class RimWellDistributionPlot* aPlot = dynamic_cast(plotByIndex(i)); if (aPlot) { aPlot->setDataSourceParameters(m_case, m_timeStepIndex, m_wellName); } } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimWellDistributionPlotCollection::fixupDependentFieldsAfterCaseChange() { int newTimeStepIndex = -1; QString newWellName; if (m_case) { const int timeStepCount = m_case->timeStepStrings().size(); if (timeStepCount > 0) { newTimeStepIndex = timeStepCount - 1; } const std::set sortedWellNameSet = m_case->eclipseCaseData()->findSortedWellNames(); if (sortedWellNameSet.size() > 0) { newWellName = *sortedWellNameSet.begin(); } } m_timeStepIndex = newTimeStepIndex; m_wellName = newWellName; }