From a81980c235fa52b868a1fba9383c7f396b6b1a48 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 8 Mar 2017 11:42:08 +0100 Subject: [PATCH] #1185 Added "Plot Production Rates" for sim well in 3D and project tree --- .../FlowCommands/CMakeLists_files.cmake | 2 + .../RicPlotProductionRateFeature.cpp | 212 ++++++++++++++++++ .../RicPlotProductionRateFeature.h | 45 ++++ .../RimContextCommandBuilder.cpp | 1 + .../UserInterface/RiuViewerCommands.cpp | 1 + 5 files changed, 261 insertions(+) create mode 100644 ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp create mode 100644 ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.h diff --git a/ApplicationCode/Commands/FlowCommands/CMakeLists_files.cmake b/ApplicationCode/Commands/FlowCommands/CMakeLists_files.cmake index ad729ca6b4..52b8f0f225 100644 --- a/ApplicationCode/Commands/FlowCommands/CMakeLists_files.cmake +++ b/ApplicationCode/Commands/FlowCommands/CMakeLists_files.cmake @@ -9,6 +9,7 @@ ${CEE_CURRENT_LIST_DIR}RicShowWellAllocationPlotFeature.h ${CEE_CURRENT_LIST_DIR}RicAddStoredWellAllocationPlotFeature.h ${CEE_CURRENT_LIST_DIR}RicShowContributingWellsFromPlotFeature.h ${CEE_CURRENT_LIST_DIR}RicShowContributingWellsFeature.h +${CEE_CURRENT_LIST_DIR}RicPlotProductionRateFeature.h ) set (SOURCE_GROUP_SOURCE_FILES @@ -16,6 +17,7 @@ ${CEE_CURRENT_LIST_DIR}RicShowWellAllocationPlotFeature.cpp ${CEE_CURRENT_LIST_DIR}RicAddStoredWellAllocationPlotFeature.cpp ${CEE_CURRENT_LIST_DIR}RicShowContributingWellsFromPlotFeature.cpp ${CEE_CURRENT_LIST_DIR}RicShowContributingWellsFeature.cpp +${CEE_CURRENT_LIST_DIR}RicPlotProductionRateFeature.cpp ) list(APPEND CODE_HEADER_FILES diff --git a/ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp b/ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp new file mode 100644 index 0000000000..64654400c7 --- /dev/null +++ b/ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp @@ -0,0 +1,212 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// 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 "RicPlotProductionRateFeature.h" + +#include "RiaApplication.h" +#include "RiaPreferences.h" + +#include "RifEclipseSummaryAddress.h" + +#include "RigSingleWellResultsData.h" + +#include "RimEclipseResultCase.h" +#include "RimEclipseWell.h" +#include "RimGridSummaryCase.h" +#include "RimMainPlotCollection.h" +#include "RimOilField.h" +#include "RimProject.h" +#include "RimSummaryCaseCollection.h" +#include "RimSummaryCurve.h" +#include "RimSummaryCurveFilter.h" +#include "RimSummaryPlot.h" +#include "RimSummaryPlotCollection.h" +#include "RimView.h" + +#include "RiuMainPlotWindow.h" +#include "RiuMainWindow.h" + +#include "cafSelectionManager.h" + +#include + +CAF_CMD_SOURCE_INIT(RicPlotProductionRateFeature, "RicPlotProductionRateFeature"); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicPlotProductionRateFeature::isCommandEnabled() +{ + std::vector collection; + caf::SelectionManager::instance()->objectsByType(&collection); + + for (RimEclipseWell* well : collection) + { + RimGridSummaryCase* gridSummaryCase = RicPlotProductionRateFeature::gridSummaryCaseForWell(well); + if (gridSummaryCase) + { + return true; + } + } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicPlotProductionRateFeature::onActionTriggered(bool isChecked) +{ + RimProject* project = RiaApplication::instance()->project(); + CAF_ASSERT(project); + + RimSummaryCaseCollection* sumCaseColl = project->activeOilField() ? project->activeOilField()->summaryCaseCollection() : nullptr; + if (!sumCaseColl) return; + + RimMainPlotCollection* mainPlotColl = project->mainPlotCollection(); + CAF_ASSERT(mainPlotColl); + + RimSummaryPlotCollection* summaryPlotColl = mainPlotColl->summaryPlotCollection(); + CAF_ASSERT(summaryPlotColl); + + std::vector collection; + caf::SelectionManager::instance()->objectsByType(&collection); + + RimSummaryPlot* summaryPlotToSelect = nullptr; + + for (RimEclipseWell* well : collection) + { + RimGridSummaryCase* gridSummaryCase = RicPlotProductionRateFeature::gridSummaryCaseForWell(well); + if (!gridSummaryCase) continue; + + QString curveFilterText = "W*PR:"; + QString description = "Well Production Rates : "; + + RigSingleWellResultsData* wRes = well->wellResults(); + if (wRes) + { + RimView* rimView = nullptr; + well->firstAncestorOrThisOfTypeAsserted(rimView); + + int currentTimeStep = rimView->currentTimeStep(); + + if (wRes->hasWellResult(currentTimeStep)) + { + const RigWellResultFrame& wrf = wRes->wellResultFrame(currentTimeStep); + + if ( wrf.m_productionType == RigWellResultFrame::OIL_INJECTOR + || wrf.m_productionType == RigWellResultFrame::GAS_INJECTOR + || wrf.m_productionType == RigWellResultFrame::WATER_INJECTOR) + { + curveFilterText = "W*IR:"; + description = "Well Injection Rates : "; + } + } + } + + curveFilterText += well->name(); + description += well->name(); + + RimSummaryPlot* plot = new RimSummaryPlot(); + summaryPlotColl->summaryPlots().push_back(plot); + + plot->setDescription(description); + + { + RimSummaryCurveFilter* newCurveFilter = new RimSummaryCurveFilter(); + plot->addCurveFilter(newCurveFilter); + + newCurveFilter->createCurves(gridSummaryCase, curveFilterText); + } + + + { + RimSummaryCurve* newCurve = new RimSummaryCurve(); + plot->addCurve(newCurve); + + newCurve->setSummaryCase(gridSummaryCase); + + RifEclipseSummaryAddress addr( RifEclipseSummaryAddress::SUMMARY_WELL, + "WBHP", + -1, + -1, + "", + well->name().toStdString(), + -1, + "", + -1, + -1, + -1); + + newCurve->setSummaryAddress(addr); + newCurve->setYAxis(RimDefines::PlotAxis::PLOT_AXIS_RIGHT); + } + + summaryPlotColl->updateConnectedEditors(); + plot->loadDataAndUpdate(); + + summaryPlotToSelect = plot; + } + + if (summaryPlotToSelect) + { + RiuMainPlotWindow* mainPlotWindow = RiaApplication::instance()->getOrCreateAndShowMainPlotWindow(); + if (mainPlotWindow) + { + mainPlotWindow->selectAsCurrentItem(summaryPlotToSelect); + mainPlotWindow->setExpanded(summaryPlotToSelect, true); + + mainPlotWindow->tileWindows(); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicPlotProductionRateFeature::setupActionLook(QAction* actionToSetup) +{ + //actionToSetup->setIcon(QIcon(":/WellAllocPlot16x16.png")); + actionToSetup->setText("Plot Production Rates"); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimGridSummaryCase* RicPlotProductionRateFeature::gridSummaryCaseForWell(RimEclipseWell* well) +{ + RimProject* project = RiaApplication::instance()->project(); + if (!project) return nullptr; + + RimSummaryCaseCollection* sumCaseColl = project->activeOilField() ? project->activeOilField()->summaryCaseCollection() : nullptr; + if (!sumCaseColl) return nullptr; + + RimEclipseResultCase* eclCase = nullptr; + well->firstAncestorOrThisOfType(eclCase); + if (eclCase) + { + RimGridSummaryCase* gridSummaryCase = dynamic_cast(sumCaseColl->findSummaryCaseFromEclipseResultCase(eclCase)); + if (gridSummaryCase) + { + return gridSummaryCase; + } + } + + return nullptr; +} + diff --git a/ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.h b/ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.h new file mode 100644 index 0000000000..6fae301645 --- /dev/null +++ b/ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.h @@ -0,0 +1,45 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// 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 "cafCmdFeature.h" + +#include "RimFlowDiagSolution.h" + +class RimGridSummaryCase; +class RimEclipseWell; + +//================================================================================================== +/// +//================================================================================================== +class RicPlotProductionRateFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + // Overrides + virtual bool isCommandEnabled() override; + virtual void onActionTriggered( bool isChecked ) override; + virtual void setupActionLook( QAction* actionToSetup ) override; + +private: + static RimGridSummaryCase* gridSummaryCaseForWell(RimEclipseWell* well); +}; + + diff --git a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp index d535dc568f..b3ed60b074 100644 --- a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp +++ b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp @@ -420,6 +420,7 @@ QStringList RimContextCommandBuilder::commandsFromSelection() } else if (dynamic_cast(uiItem)) { + commandIds << "RicPlotProductionRateFeature"; commandIds << "Separator"; commandIds << "RicEclipseWellShowLabelFeature"; commandIds << "RicEclipseWellShowHeadFeature"; diff --git a/ApplicationCode/UserInterface/RiuViewerCommands.cpp b/ApplicationCode/UserInterface/RiuViewerCommands.cpp index 4e6ae1dbfc..2c011a64ad 100644 --- a/ApplicationCode/UserInterface/RiuViewerCommands.cpp +++ b/ApplicationCode/UserInterface/RiuViewerCommands.cpp @@ -311,6 +311,7 @@ void RiuViewerCommands::displayContextMenu(QMouseEvent* event) commandIds << "RicNewSimWellIntersectionFeature"; commandIds << "RicShowWellAllocationPlotFeature"; commandIds << "RicShowContributingWellsFeature"; + commandIds << "RicPlotProductionRateFeature"; } }