From cf9203fe0a39ea7478d444c2c826c3e8a5d953ce Mon Sep 17 00:00:00 2001 From: Rebecca Cox Date: Thu, 30 Nov 2017 18:57:09 +0100 Subject: [PATCH 01/38] #2182 RFT: Fix path creation of RFT files --- .../ProjectDataModel/RimEclipseResultCase.cpp | 33 ++++--------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimEclipseResultCase.cpp b/ApplicationCode/ProjectDataModel/RimEclipseResultCase.cpp index 4095b1a1fe..84e9761bad 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseResultCase.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseResultCase.cpp @@ -203,33 +203,14 @@ bool RimEclipseResultCase::importGridAndResultMetaData(bool showTimeStepFilter) m_flowDagSolverInterface = new RigFlowDiagSolverInterface(this); - QStringList fileSplitOnDot = caseFileName().split("."); - if (fileSplitOnDot.size() == 2) - { - QStringList fileSplitOnBackSlash = fileSplitOnDot[0].split("\\"); - if (fileSplitOnDot[0] != fileSplitOnBackSlash[0]) - { - m_caseName = fileSplitOnBackSlash.back(); - } - else - { - QStringList fileSplitOnSlash = fileSplitOnDot[0].split("/"); - m_caseName = fileSplitOnSlash.back(); - } + QFileInfo eclipseCaseFileInfo(caseFileName()); + QString rftFileName = eclipseCaseFileInfo.filePath().remove(eclipseCaseFileInfo.completeSuffix()) + "RFT"; + QFileInfo rftFileInfo(rftFileName); - QString rftFile = fileSplitOnDot[0] + ".RFT"; - std::string rftFileStdString = rftFile.toStdString(); - - std::ifstream inputStream(rftFileStdString.c_str()); - if (!inputStream.fail()) - { - RiaLogging::info(QString("File '%1' found, creating reader").arg(rftFileStdString.c_str())); - m_readerEclipseRft = new RifReaderEclipseRft(rftFileStdString); - } - else - { - RiaLogging::warning(QString("Could not find file '%1'").arg(rftFileStdString.c_str())); - } + if (rftFileInfo.exists()) + { + RiaLogging::info(QString("RFT file found")); + m_readerEclipseRft = new RifReaderEclipseRft(rftFileInfo.filePath().toStdString()); } From 476b96b343c5057b77ce61c453759c95e9777a97 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 1 Dec 2017 08:28:41 +0100 Subject: [PATCH 02/38] #2144 Context menu : Add support for icons on sub menus --- ApplicationCode/UserInterface/RiuViewerCommands.cpp | 2 +- Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.cpp | 5 +++-- Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.h | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ApplicationCode/UserInterface/RiuViewerCommands.cpp b/ApplicationCode/UserInterface/RiuViewerCommands.cpp index 3cb92e502f..4aa1927e44 100644 --- a/ApplicationCode/UserInterface/RiuViewerCommands.cpp +++ b/ApplicationCode/UserInterface/RiuViewerCommands.cpp @@ -235,7 +235,7 @@ void RiuViewerCommands::displayContextMenu(QMouseEvent* event) kSliceList.push_back(2); kSliceList.push_back(CVF_MAX(static_cast(k + 1), 1)); - menuBuilder.subMenuStart("Range Filter Slice"); + menuBuilder.subMenuStart("Range Filter Slice", QIcon(":/CellFilter_Range.png")); menuBuilder.addCmdFeatureWithUserData("RicNewSliceRangeFilterFeature", "I-slice Range Filter", iSliceList); menuBuilder.addCmdFeatureWithUserData("RicNewSliceRangeFilterFeature", "J-slice Range Filter", jSliceList); diff --git a/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.cpp b/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.cpp index 103610a1ea..e0d60654c5 100644 --- a/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.cpp +++ b/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.cpp @@ -124,11 +124,12 @@ CmdFeatureMenuBuilder& CmdFeatureMenuBuilder::addSeparator() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -CmdFeatureMenuBuilder& CmdFeatureMenuBuilder::subMenuStart(const QString& menuName) +CmdFeatureMenuBuilder& CmdFeatureMenuBuilder::subMenuStart(const QString& menuName, const QIcon& menuIcon) { MenuItem i; i.itemType = MenuItem::SUBMENU_START; i.itemName = menuName; + i.icon = menuIcon; m_items.push_back(i); return *this; } @@ -160,7 +161,7 @@ void CmdFeatureMenuBuilder::appendToMenu(QMenu* menu) } else if (m_items[i].itemType == MenuItem::SUBMENU_START) { - QMenu* subMenu = menus.back()->addMenu(m_items[i].itemName); + QMenu* subMenu = menus.back()->addMenu(m_items[i].icon, m_items[i].itemName); menus.push_back(subMenu); } else if (m_items[i].itemType == MenuItem::SUBMENU_END) diff --git a/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.h b/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.h index 97486e986d..fa9da5f908 100644 --- a/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.h +++ b/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.h @@ -43,6 +43,7 @@ #include #include +#include class QAction; class QMenu; @@ -67,7 +68,7 @@ public: CmdFeatureMenuBuilder& addSeparator(); - CmdFeatureMenuBuilder& subMenuStart(const QString& menuName); + CmdFeatureMenuBuilder& subMenuStart(const QString& menuName, const QIcon& menuIcon = QIcon()); CmdFeatureMenuBuilder& subMenuEnd(); void appendToMenu(QMenu* menu); @@ -82,6 +83,7 @@ private: QString itemName; QString uiText; QVariant userData; + QIcon icon; }; std::vector m_items; From a96b65cc7fda7f8acc71851acf227090509cb3a2 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 1 Dec 2017 08:33:26 +0100 Subject: [PATCH 03/38] #2144 Context menu builder : Whitespace cleanup and removed unused includes --- .../cafCommand/cafCmdFeatureMenuBuilder.cpp | 61 +++++++++--------- .../cafCommand/cafCmdFeatureMenuBuilder.h | 63 +++++++------------ 2 files changed, 53 insertions(+), 71 deletions(-) diff --git a/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.cpp b/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.cpp index e0d60654c5..6bc773e19f 100644 --- a/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.cpp +++ b/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.cpp @@ -34,40 +34,30 @@ // //################################################################################################## - #include "cafCmdFeatureMenuBuilder.h" #include "cafCmdFeature.h" #include "cafCmdFeatureManager.h" #include "cafCmdSelectionHelper.h" -#include "cafFactory.h" - -#include "defaultfeatures/cafCmdDeleteItemFeature.h" -#include "defaultfeatures/cafCmdAddItemFeature.h" +#include "cafFactory.h" #include #include namespace caf { - -// typedef Factory CommandFeatureFactory; //-------------------------------------------------------------------------------------------------- -/// +/// //-------------------------------------------------------------------------------------------------- -CmdFeatureMenuBuilder::CmdFeatureMenuBuilder() -{ -} +CmdFeatureMenuBuilder::CmdFeatureMenuBuilder() {} //-------------------------------------------------------------------------------------------------- -/// +/// //-------------------------------------------------------------------------------------------------- -CmdFeatureMenuBuilder::~CmdFeatureMenuBuilder() -{ -} +CmdFeatureMenuBuilder::~CmdFeatureMenuBuilder() {} //-------------------------------------------------------------------------------------------------- -/// +/// //-------------------------------------------------------------------------------------------------- CmdFeatureMenuBuilder& CmdFeatureMenuBuilder::operator<<(const QString& commandId) { @@ -79,80 +69,86 @@ CmdFeatureMenuBuilder& CmdFeatureMenuBuilder::operator<<(const QString& commandI { addCmdFeature(commandId); } + return *this; } - //-------------------------------------------------------------------------------------------------- -/// +/// //-------------------------------------------------------------------------------------------------- CmdFeatureMenuBuilder& CmdFeatureMenuBuilder::addCmdFeature(const QString commandId, const QString& uiText) { MenuItem i; i.itemType = MenuItem::COMMAND; i.itemName = commandId; - i.uiText = uiText; + i.uiText = uiText; m_items.push_back(i); + return *this; } //-------------------------------------------------------------------------------------------------- -/// +/// //-------------------------------------------------------------------------------------------------- -CmdFeatureMenuBuilder& CmdFeatureMenuBuilder::addCmdFeatureWithUserData(const QString commandId, const QString& uiText, const QVariant& userData) +CmdFeatureMenuBuilder& CmdFeatureMenuBuilder::addCmdFeatureWithUserData(const QString commandId, const QString& uiText, + const QVariant& userData) { MenuItem i; i.itemType = MenuItem::COMMAND; i.itemName = commandId; - i.uiText = uiText; + i.uiText = uiText; i.userData = userData; m_items.push_back(i); + return *this; } //-------------------------------------------------------------------------------------------------- -/// +/// //-------------------------------------------------------------------------------------------------- CmdFeatureMenuBuilder& CmdFeatureMenuBuilder::addSeparator() { MenuItem i; i.itemType = MenuItem::SEPARATOR; m_items.push_back(i); + return *this; } //-------------------------------------------------------------------------------------------------- -/// +/// //-------------------------------------------------------------------------------------------------- CmdFeatureMenuBuilder& CmdFeatureMenuBuilder::subMenuStart(const QString& menuName, const QIcon& menuIcon) { MenuItem i; i.itemType = MenuItem::SUBMENU_START; i.itemName = menuName; - i.icon = menuIcon; + i.icon = menuIcon; m_items.push_back(i); + return *this; } //-------------------------------------------------------------------------------------------------- -/// +/// //-------------------------------------------------------------------------------------------------- CmdFeatureMenuBuilder& CmdFeatureMenuBuilder::subMenuEnd() { MenuItem i; i.itemType = MenuItem::SUBMENU_END; m_items.push_back(i); + return *this; } //-------------------------------------------------------------------------------------------------- -/// +/// //-------------------------------------------------------------------------------------------------- void CmdFeatureMenuBuilder::appendToMenu(QMenu* menu) { CAF_ASSERT(menu); - std::vector menus = { menu }; + std::vector menus = {menu}; for (size_t i = 0; i < m_items.size(); i++) { if (m_items[i].itemType == MenuItem::SEPARATOR) @@ -174,8 +170,8 @@ void CmdFeatureMenuBuilder::appendToMenu(QMenu* menu) else { CmdFeatureManager* commandManager = CmdFeatureManager::instance(); - QMenu* currentMenu = menus.back(); - caf::CmdFeature* feature = commandManager->getCommandFeature(m_items[i].itemName.toStdString()); + QMenu* currentMenu = menus.back(); + caf::CmdFeature* feature = commandManager->getCommandFeature(m_items[i].itemName.toStdString()); CAF_ASSERT(feature); if (feature->canFeatureBeExecuted()) @@ -189,14 +185,15 @@ void CmdFeatureMenuBuilder::appendToMenu(QMenu* menu) { act = commandManager->action(m_items[i].itemName); } - + CAF_ASSERT(act); for (QAction* existingAct : currentMenu->actions()) { // If action exist, continue to make sure the action is positioned at the first // location of a command ID - if (existingAct == act) continue; + if (existingAct == act) + continue; } currentMenu->addAction(const_cast(act)); diff --git a/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.h b/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.h index fa9da5f908..faaeb0e0d5 100644 --- a/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.h +++ b/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.h @@ -34,27 +34,22 @@ // //################################################################################################## - #pragma once #include -#include -#include -#include -#include #include +#include class QAction; class QMenu; -namespace caf +namespace caf { - class CmdFeature; //================================================================================================== -/// +/// //================================================================================================== class CmdFeatureMenuBuilder { @@ -62,48 +57,38 @@ public: CmdFeatureMenuBuilder(); virtual ~CmdFeatureMenuBuilder(); - CmdFeatureMenuBuilder& operator<<(const QString& commandIdOrSeparator); - CmdFeatureMenuBuilder& addCmdFeature(const QString commandId, const QString& customUiText = ""); - CmdFeatureMenuBuilder& addCmdFeatureWithUserData(const QString commandId, const QString& customUiText, const QVariant& userData); + CmdFeatureMenuBuilder& operator<<(const QString& commandIdOrSeparator); + CmdFeatureMenuBuilder& addCmdFeature(const QString commandId, const QString& customUiText = ""); + CmdFeatureMenuBuilder& addCmdFeatureWithUserData(const QString commandId, const QString& customUiText, + const QVariant& userData); - CmdFeatureMenuBuilder& addSeparator(); + CmdFeatureMenuBuilder& addSeparator(); - CmdFeatureMenuBuilder& subMenuStart(const QString& menuName, const QIcon& menuIcon = QIcon()); - CmdFeatureMenuBuilder& subMenuEnd(); + CmdFeatureMenuBuilder& subMenuStart(const QString& menuName, const QIcon& menuIcon = QIcon()); + CmdFeatureMenuBuilder& subMenuEnd(); - void appendToMenu(QMenu* menu); + void appendToMenu(QMenu* menu); private: struct MenuItem { public: - enum ItemType { COMMAND, SEPARATOR, SUBMENU_START, SUBMENU_END }; + enum ItemType + { + COMMAND, + SEPARATOR, + SUBMENU_START, + SUBMENU_END + }; - ItemType itemType; - QString itemName; - QString uiText; - QVariant userData; - QIcon icon; + ItemType itemType; + QString itemName; + QString uiText; + QVariant userData; + QIcon icon; }; - std::vector m_items; + std::vector m_items; }; } // end namespace caf - - - -//static MenuItem command(QString commandName) -//{ -// MenuItem i; -// i.itemType = COMMAND; -// i.itemName = commandName; -// return i; -//} -// -//static MenuItem separator() -//{ -// MenuItem i; -// i.itemType = SEPARATOR; -// return i; -//} From c86161a0a6104841cf7256d18648a3da4d97896a Mon Sep 17 00:00:00 2001 From: Rebecca Cox Date: Fri, 1 Dec 2017 09:11:11 +0100 Subject: [PATCH 04/38] #2144 Context menu: Add icons to sub menus --- ApplicationCode/UserInterface/RiuViewerCommands.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ApplicationCode/UserInterface/RiuViewerCommands.cpp b/ApplicationCode/UserInterface/RiuViewerCommands.cpp index 4aa1927e44..9dcc5a8f04 100644 --- a/ApplicationCode/UserInterface/RiuViewerCommands.cpp +++ b/ApplicationCode/UserInterface/RiuViewerCommands.cpp @@ -249,7 +249,7 @@ void RiuViewerCommands::displayContextMenu(QMouseEvent* event) menuBuilder.addSeparator(); - menuBuilder.subMenuStart("Intersection"); + menuBuilder.subMenuStart("Intersection", QIcon(":/IntersectionXPlane16x16.png")); menuBuilder << "RicNewPolylineIntersectionFeature"; menuBuilder << "RicNewAzimuthDipIntersectionFeature"; @@ -306,7 +306,7 @@ void RiuViewerCommands::displayContextMenu(QMouseEvent* event) menuBuilder << "RicNewWellLogCurveExtractionFeature"; menuBuilder << "RicNewWellLogFileCurveFeature"; - menuBuilder.subMenuStart("Well Plot"); + menuBuilder.subMenuStart("Well Plot", QIcon(":/SummaryPlot16x16.png")); menuBuilder << "RicNewRftPlotFeature"; menuBuilder << "RicNewPltPlotFeature"; @@ -316,7 +316,7 @@ void RiuViewerCommands::displayContextMenu(QMouseEvent* event) menuBuilder.addSeparator(); - menuBuilder.subMenuStart("Perforation"); + menuBuilder.subMenuStart("Perforation", QIcon(":/FishBoneGroup16x16.png")); #ifdef USE_PROTOTYPE_FEATURE_FRACTURES menuBuilder << "RicNewWellPathFractureAtPosFeature"; @@ -346,7 +346,7 @@ void RiuViewerCommands::displayContextMenu(QMouseEvent* event) menuBuilder << "RicNewWellLogCurveExtractionFeature"; menuBuilder << "RicNewWellLogRftCurveFeature"; - menuBuilder.subMenuStart("Well Plot"); + menuBuilder.subMenuStart("Well Plot", QIcon(":/SummaryPlot16x16.png")); menuBuilder << "RicNewRftPlotFeature"; menuBuilder << "RicNewPltPlotFeature"; From da11a3286201cf007030adeed4a6849ad506e7f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Jensen?= Date: Thu, 30 Nov 2017 13:41:33 +0100 Subject: [PATCH 05/38] #1942 HDF5 reader. Using RiaQDateTimeTools for parts of the reading. See issue comment for more info --- ApplicationCode/Application/Tools/RiaQDateTimeTools.cpp | 8 ++++++++ ApplicationCode/Application/Tools/RiaQDateTimeTools.h | 1 + ApplicationCode/FileInterface/RifHdf5Reader.cpp | 6 ++---- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/ApplicationCode/Application/Tools/RiaQDateTimeTools.cpp b/ApplicationCode/Application/Tools/RiaQDateTimeTools.cpp index 7757cc31ca..e84f9f5970 100644 --- a/ApplicationCode/Application/Tools/RiaQDateTimeTools.cpp +++ b/ApplicationCode/Application/Tools/RiaQDateTimeTools.cpp @@ -72,6 +72,14 @@ QDateTime RiaQDateTimeTools::fromYears(double years) return RiaQDateTimeTools::addYears(dt, yearsAfterEpoch); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QDateTime RiaQDateTimeTools::addMSecs(const QDateTime& dt, double msecs) +{ + return dt.addMSecs(msecs); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Application/Tools/RiaQDateTimeTools.h b/ApplicationCode/Application/Tools/RiaQDateTimeTools.h index 50db1ed3cb..127f9d1435 100644 --- a/ApplicationCode/Application/Tools/RiaQDateTimeTools.h +++ b/ApplicationCode/Application/Tools/RiaQDateTimeTools.h @@ -38,6 +38,7 @@ public: static QDateTime fromString(const QString& dateString, const QString& format); static QDateTime fromYears(double years); + static QDateTime addMSecs(const QDateTime& dt, double msecs); static QDateTime addDays(const QDateTime& dt, double days); static QDateTime addYears(const QDateTime& dt, double years); diff --git a/ApplicationCode/FileInterface/RifHdf5Reader.cpp b/ApplicationCode/FileInterface/RifHdf5Reader.cpp index be53b7d407..050bd7b4bc 100644 --- a/ApplicationCode/FileInterface/RifHdf5Reader.cpp +++ b/ApplicationCode/FileInterface/RifHdf5Reader.cpp @@ -121,8 +121,6 @@ std::vector RifHdf5Reader::timeSteps() const QDateTime dtInitial = sourSimDateTimeToQDateTime(dateString); - int secondsPerDay = 60 * 60 * 24; - for (size_t i = 0; i < m_timeStepFileNames.size(); i++) { std::string fileName = m_timeStepFileNames[i]; @@ -137,8 +135,8 @@ std::vector RifHdf5Reader::timeSteps() const double milliseconds = fractionOfDay * 24.0 * 60.0 * 60.0 * 1000.0; QDateTime dt = dtInitial; - dt = dt.addDays(timeStepDays); - dt = dt.addMSecs(milliseconds); + dt = RiaQDateTimeTools::addDays(dt, timeStepDays); + dt = RiaQDateTimeTools::addMSecs(dt, milliseconds); times.push_back(dt); } From 86e348a9f8e2ca1a0e28378da69e0d63dd4daf1a Mon Sep 17 00:00:00 2001 From: Rebecca Cox Date: Fri, 1 Dec 2017 10:18:59 +0100 Subject: [PATCH 06/38] #2182 RFT: Make path creation of RFT files more robust --- ApplicationCode/ProjectDataModel/RimEclipseResultCase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ApplicationCode/ProjectDataModel/RimEclipseResultCase.cpp b/ApplicationCode/ProjectDataModel/RimEclipseResultCase.cpp index 84e9761bad..6f4a067b95 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseResultCase.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseResultCase.cpp @@ -204,7 +204,7 @@ bool RimEclipseResultCase::importGridAndResultMetaData(bool showTimeStepFilter) m_flowDagSolverInterface = new RigFlowDiagSolverInterface(this); QFileInfo eclipseCaseFileInfo(caseFileName()); - QString rftFileName = eclipseCaseFileInfo.filePath().remove(eclipseCaseFileInfo.completeSuffix()) + "RFT"; + QString rftFileName = eclipseCaseFileInfo.path() + "/" + eclipseCaseFileInfo.completeBaseName() + ".RFT"; QFileInfo rftFileInfo(rftFileName); if (rftFileInfo.exists()) From 8d7a578d6fbc7cb95f2dc979ccf6aa1b332f84eb Mon Sep 17 00:00:00 2001 From: Rebecca Cox Date: Fri, 1 Dec 2017 10:26:32 +0100 Subject: [PATCH 07/38] #2137 Formation Names: Update all plots necessary when changing formation names on case --- .../RigFemPartResultsCollection.cpp | 45 +++++++++++++---- .../RimMainPlotCollection.cpp | 49 +++++++++++++++++-- .../ProjectDataModel/RimMainPlotCollection.h | 1 + .../ReservoirDataModel/RigEclipseCaseData.cpp | 18 ++++++- 4 files changed, 97 insertions(+), 16 deletions(-) diff --git a/ApplicationCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp b/ApplicationCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp index d3b32816af..5d9b8c7b78 100644 --- a/ApplicationCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp +++ b/ApplicationCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp @@ -24,25 +24,35 @@ #ifdef USE_ODB_API #include "RifOdbReader.h" #endif -#include "RigFemScalarResultFrames.h" -#include "RigStatisticsDataCache.h" -#include "RigFemPartResults.h" + +#include "RiaApplication.h" + +#include "RigFemNativeStatCalc.h" #include "RigFemPartCollection.h" +#include "RigFemPartGrid.h" +#include "RigFemPartResults.h" +#include "RigFemScalarResultFrames.h" #include "RigFormationNames.h" +#include "RigStatisticsDataCache.h" + +#include "RimMainPlotCollection.h" +#include "RimProject.h" +#include "RimWellLogPlot.h" +#include "RimWellLogPlotCollection.h" #include "cafProgressInfo.h" #include "cvfBoundingBox.h" -#include -#include -#include -#include "RigFemNativeStatCalc.h" -#include "cafTensor3.h" #include "cafProgressInfo.h" -#include "RigFemPartGrid.h" +#include "cafTensor3.h" #include "cvfGeometryTools.h" #include "cvfMath.h" +#include + +#include +#include + //-------------------------------------------------------------------------------------------------- /// @@ -80,6 +90,23 @@ RigFemPartResultsCollection::~RigFemPartResultsCollection() void RigFemPartResultsCollection::setActiveFormationNames(RigFormationNames* activeFormationNames) { m_activeFormationNamesData = activeFormationNames; + + RimProject* project = RiaApplication::instance()->project(); + if (project) + { + if (project->mainPlotCollection()) + { + RimWellLogPlotCollection* plotCollection = project->mainPlotCollection()->wellLogPlotCollection(); + if (plotCollection) + { + for (RimWellLogPlot* wellLogPlot : plotCollection->wellLogPlots) + { + wellLogPlot->loadDataAndUpdate(); + } + } + } + } + this->deleteResult(RigFemResultAddress(RIG_FORMATION_NAMES, "Active Formation Names", "")); } diff --git a/ApplicationCode/ProjectDataModel/RimMainPlotCollection.cpp b/ApplicationCode/ProjectDataModel/RimMainPlotCollection.cpp index aa57302e3b..d4b2b73349 100644 --- a/ApplicationCode/ProjectDataModel/RimMainPlotCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimMainPlotCollection.cpp @@ -19,17 +19,21 @@ #include "RimMainPlotCollection.h" +#include "RimFlowCharacteristicsPlot.h" #include "RimFlowPlotCollection.h" -#include "RimProject.h" -#include "RimSummaryPlotCollection.h" -#include "RimSummaryCrossPlotCollection.h" -#include "RimRftPlotCollection.h" #include "RimPltPlotCollection.h" +#include "RimProject.h" +#include "RimRftPlotCollection.h" +#include "RimSummaryCrossPlotCollection.h" +#include "RimSummaryPlotCollection.h" +#include "RimViewWindow.h" +#include "RimWellLogPlot.h" #include "RimWellLogPlotCollection.h" +#include "RimWellPltPlot.h" +#include "RimWellRftPlot.h" #include "RiuMainWindow.h" #include "RiuProjectPropertyView.h" -#include "RimFlowCharacteristicsPlot.h" CAF_PDM_SOURCE_INIT(RimMainPlotCollection, "MainPlotCollection"); @@ -171,3 +175,38 @@ void RimMainPlotCollection::updateCurrentTimeStepInPlots() m_flowPlotCollection()->defaultFlowCharacteristicsPlot()->updateCurrentTimeStep(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimMainPlotCollection::updatePlotsWithFormations() +{ + if (m_wellLogPlotCollection) + { + for (RimWellLogPlot* wellLogPlot : m_wellLogPlotCollection->wellLogPlots()) + { + wellLogPlot->loadDataAndUpdate(); + } + } + + if (m_pltPlotCollection) + { + for (RimWellPltPlot* pltPlot : m_pltPlotCollection->pltPlots()) + { + pltPlot->loadDataAndUpdate(); + } + } + + if (m_rftPlotCollection) + { + for (RimWellRftPlot* rftPlot : m_rftPlotCollection->rftPlots()) + { + rftPlot->loadDataAndUpdate(); + } + } + + if (m_flowPlotCollection) + { + m_flowPlotCollection->loadDataAndUpdate(); + } +} + diff --git a/ApplicationCode/ProjectDataModel/RimMainPlotCollection.h b/ApplicationCode/ProjectDataModel/RimMainPlotCollection.h index d749572e63..c842bc03d0 100644 --- a/ApplicationCode/ProjectDataModel/RimMainPlotCollection.h +++ b/ApplicationCode/ProjectDataModel/RimMainPlotCollection.h @@ -58,6 +58,7 @@ public: void deleteAllContainedObjects(); void updateCurrentTimeStepInPlots(); + void updatePlotsWithFormations(); private: diff --git a/ApplicationCode/ReservoirDataModel/RigEclipseCaseData.cpp b/ApplicationCode/ReservoirDataModel/RigEclipseCaseData.cpp index 9624a58e74..50f645438b 100644 --- a/ApplicationCode/ReservoirDataModel/RigEclipseCaseData.cpp +++ b/ApplicationCode/ReservoirDataModel/RigEclipseCaseData.cpp @@ -20,18 +20,24 @@ #include "RigEclipseCaseData.h" +#include "RiaApplication.h" + #include "RigActiveCellInfo.h" #include "RigCaseCellResultsData.h" #include "RigFormationNames.h" #include "RigMainGrid.h" #include "RigResultAccessorFactory.h" #include "RigSimWellData.h" - -#include #include "RigSimulationWellCenterLineCalculator.h" #include "RigSimulationWellCoordsAndMD.h" #include "RigWellPath.h" +#include "RimFlowPlotCollection.h" +#include "RimMainPlotCollection.h" +#include "RimProject.h" + +#include + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -670,6 +676,14 @@ void RigEclipseCaseData::setActiveFormationNames(RigFormationNames* activeFormat } } + RimProject* project = RiaApplication::instance()->project(); + if (project) + { + if (project->mainPlotCollection()) + { + project->mainPlotCollection->updatePlotsWithFormations(); + } + } } //-------------------------------------------------------------------------------------------------- From 9eb85966ed16e75067a46c756173baacecd02ccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Jensen?= Date: Fri, 1 Dec 2017 12:15:30 +0100 Subject: [PATCH 08/38] CSV import. Reopen dialog on parse error --- .../Commands/RicImportObservedDataFeature.cpp | 70 +++++++------- .../Commands/RicImportObservedDataFeature.h | 2 - .../Summary/RimObservedDataCollection.cpp | 96 +++++++++---------- .../Summary/RimObservedDataCollection.h | 6 +- 4 files changed, 79 insertions(+), 95 deletions(-) diff --git a/ApplicationCode/Commands/RicImportObservedDataFeature.cpp b/ApplicationCode/Commands/RicImportObservedDataFeature.cpp index 0b95b98933..7d8a14360b 100644 --- a/ApplicationCode/Commands/RicImportObservedDataFeature.cpp +++ b/ApplicationCode/Commands/RicImportObservedDataFeature.cpp @@ -62,30 +62,45 @@ void RicImportObservedDataFeature::selectObservedDataFileInDialog() RimObservedDataCollection* observedDataCollection = proj->activeOilField() ? proj->activeOilField()->observedDataCollection() : nullptr; if (!observedDataCollection) return; - QString aggregatedErrorStrings; + RimObservedData* observedData = nullptr; for (const QString& fileName : fileNames) { - QString s; - RicImportObservedDataFeature::createAndAddObservedDataFromFile(fileName, &s); - if (!s.isEmpty()) + bool retryImport = false; + + do { - aggregatedErrorStrings += fileName; - aggregatedErrorStrings += "\n"; - aggregatedErrorStrings += s; - aggregatedErrorStrings += "\n"; - aggregatedErrorStrings += "\n"; - } + QString errorText; + + if (fileName.endsWith(".rsm", Qt::CaseInsensitive)) + { + observedData = observedDataCollection->createAndAddRsmObservedDataFromFile(fileName, &errorText); + retryImport = false; + } + else if (fileName.endsWith(".txt", Qt::CaseInsensitive) || fileName.endsWith(".csv", Qt::CaseInsensitive)) + { + bool useSavedFieldValuesInDialog = retryImport; + observedData = observedDataCollection->createAndAddCvsObservedDataFromFile(fileName, useSavedFieldValuesInDialog, &errorText); + retryImport = !errorText.isEmpty(); + } + else + { + errorText = "Not able to import file. Make sure '*.rsm' is used as extension if data is in RMS format or '*.txt' or '*.csv' if data is in CSV format."; + retryImport = false; + } + + if (!errorText.isEmpty()) + { + QMessageBox msgBox; + msgBox.setIcon(QMessageBox::Warning); + msgBox.setText("Errors detected during import "); + msgBox.setDetailedText(errorText); + msgBox.exec(); + } + } while (retryImport); } - if (!aggregatedErrorStrings.isEmpty()) - { - QMessageBox msgBox; - msgBox.setIcon(QMessageBox::Warning); - msgBox.setText("Errors detected during import "); - msgBox.setDetailedText(aggregatedErrorStrings); - msgBox.exec(); - } + RiaApplication::instance()->getOrCreateAndShowMainPlotWindow()->selectAsCurrentItem(observedData); } //-------------------------------------------------------------------------------------------------- @@ -118,22 +133,3 @@ void RicImportObservedDataFeature::setupActionLook(QAction* actionToSetup) actionToSetup->setIcon(QIcon(":/Default.png")); actionToSetup->setText("Import Observed Time History Data"); } - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RicImportObservedDataFeature::createAndAddObservedDataFromFile(const QString& fileName, QString* errorText) -{ - RiaApplication* app = RiaApplication::instance(); - RimProject* proj = app->project(); - - RimObservedDataCollection* observedDataCollection = proj->activeOilField() ? proj->activeOilField()->observedDataCollection() : nullptr; - if (!observedDataCollection) return false; - - RimObservedData* newObservedData = observedDataCollection->createAndAddObservedDataFromFileName(fileName, errorText); - - RiaApplication::instance()->getOrCreateAndShowMainPlotWindow()->selectAsCurrentItem(newObservedData); - - return true; -} - diff --git a/ApplicationCode/Commands/RicImportObservedDataFeature.h b/ApplicationCode/Commands/RicImportObservedDataFeature.h index 394bdd885d..918bfca24c 100644 --- a/ApplicationCode/Commands/RicImportObservedDataFeature.h +++ b/ApplicationCode/Commands/RicImportObservedDataFeature.h @@ -39,6 +39,4 @@ private: virtual bool isCommandEnabled() override; virtual void onActionTriggered(bool isChecked) override; virtual void setupActionLook(QAction* actionToSetup) override; - - static bool createAndAddObservedDataFromFile(const QString& fileName, QString* errorText = nullptr); }; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp index 068315e935..e9ee4ecd2a 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp @@ -77,44 +77,6 @@ void RimObservedDataCollection::addObservedData(RimObservedData* observedData) m_observedDataArray.push_back(observedData); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimObservedData* RimObservedDataCollection::createAndAddObservedDataFromFileName(const QString& fileName, QString* errorText) -{ - RimObservedData* observedData = nullptr; - - { - QFile file(fileName); - if (!file.exists()) - { - QString s = QString("File does not exist, %1").arg(fileName); - RiaLogging::error(s); - - if (errorText) errorText->append(s); - return nullptr; - } - } - - if (fileName.endsWith(".rsm", Qt::CaseInsensitive)) - { - return createAndAddRsmObservedDataFromFile(fileName, errorText); - } - else if (fileName.endsWith(".txt", Qt::CaseInsensitive) || fileName.endsWith(".csv", Qt::CaseInsensitive)) - { - return createAndAddCvsObservedDataFromFile(fileName, errorText); - } - else - { - if (errorText) - { - errorText->append("Not able to import file. Make sure '*.rsm' is used as extension if data is in RMS format or '*.txt' or '*.csv' if data is in CSV format."); - } - } - - return nullptr; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -127,11 +89,30 @@ std::vector RimObservedDataCollection::allObservedData() return allObservedData; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimObservedDataCollection::fileExists(const QString& fileName, QString* errorText /*= nullptr*/) +{ + QFile file(fileName); + if (!file.exists()) + { + QString s = QString("File does not exist, %1").arg(fileName); + RiaLogging::error(s); + + if (errorText) errorText->append(s); + return false; + } + return true; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RimObservedData* RimObservedDataCollection::createAndAddRsmObservedDataFromFile(const QString& fileName, QString* errorText /*= nullptr*/) { + if (!fileExists(fileName, errorText)) return nullptr; + RimObservedData* observedData = nullptr; RimObservedEclipseUserData* columnBasedUserData = new RimObservedEclipseUserData(); observedData = columnBasedUserData; @@ -162,11 +143,18 @@ RimObservedData* RimObservedDataCollection::createAndAddRsmObservedDataFromFile( //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimObservedData* RimObservedDataCollection::createAndAddCvsObservedDataFromFile(const QString& fileName, QString* errorText /*= nullptr*/) +RimObservedData* RimObservedDataCollection::createAndAddCvsObservedDataFromFile(const QString& fileName, bool useSavedFieldsValuesInDialog, QString* errorText /*= nullptr*/) { + if (!fileExists(fileName, errorText)) return nullptr; + RimObservedData* observedData = nullptr; + bool parseOk = false; RicPasteAsciiDataToSummaryPlotFeatureUi parseOptionsUi; + if (useSavedFieldsValuesInDialog) + { + caf::PdmSettings::readFieldsFromApplicationStore(&parseOptionsUi); + } parseOptionsUi.setUiModeImport(fileName); caf::PdmUiPropertyViewDialog propertyDialog(NULL, &parseOptionsUi, "CSV Import Options", ""); @@ -175,35 +163,37 @@ RimObservedData* RimObservedDataCollection::createAndAddCvsObservedDataFromFile( return nullptr; } - RimCsvUserData* columnBasedUserData = new RimCsvUserData(); - columnBasedUserData->setParseOptions(parseOptionsUi.parseOptions()); - observedData = columnBasedUserData; + caf::PdmSettings::writeFieldsToApplicationStore(&parseOptionsUi); - observedData->setSummaryHeaderFileName(fileName); - observedData->createSummaryReaderInterface(); - observedData->updateMetaData(); - observedData->updateOptionSensitivity(); + RimCsvUserData* userData = new RimCsvUserData(); + userData->setParseOptions(parseOptionsUi.parseOptions()); + userData->setSummaryHeaderFileName(fileName); + userData->createSummaryReaderInterface(); + userData->updateMetaData(); + userData->updateOptionSensitivity(); - if (errorText && !observedData->errorMessagesFromReader().isEmpty()) + if (errorText && !userData->errorMessagesFromReader().isEmpty()) { - errorText->append(observedData->errorMessagesFromReader()); + errorText->append(userData->errorMessagesFromReader()); } - if (observedData->summaryReader()) + if (userData->summaryReader()) { - this->m_observedDataArray.push_back(observedData); + this->m_observedDataArray.push_back(userData); + observedData = userData; + parseOk = true; } else { - delete columnBasedUserData; + delete userData; return nullptr; } RiuMainPlotWindow* mainPlotWindow = RiaApplication::instance()->getOrCreateAndShowMainPlotWindow(); if (mainPlotWindow) { - mainPlotWindow->selectAsCurrentItem(observedData); - mainPlotWindow->setExpanded(observedData); + mainPlotWindow->selectAsCurrentItem(userData); + mainPlotWindow->setExpanded(userData); } this->updateConnectedEditors(); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.h b/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.h index 3b82e80680..4f986d71e3 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.h @@ -38,12 +38,12 @@ public: void removeObservedData(RimObservedData* observedData); void addObservedData(RimObservedData* observedData); - RimObservedData* createAndAddObservedDataFromFileName(const QString& fileName, QString* errorText = nullptr); + RimObservedData* createAndAddRsmObservedDataFromFile(const QString& fileName, QString* errorText = nullptr); + RimObservedData* createAndAddCvsObservedDataFromFile(const QString& fileName, bool useSavedFieldsValuesInDialog, QString* errorText = nullptr); std::vector allObservedData(); private: - RimObservedData* createAndAddRsmObservedDataFromFile(const QString& fileName, QString* errorText = nullptr); - RimObservedData* createAndAddCvsObservedDataFromFile(const QString& fileName, QString* errorText = nullptr); + bool fileExists(const QString& fileName, QString* errorText = nullptr); private: caf::PdmChildArrayField m_observedDataArray; From a61da7b215d1a457a82bf9a5b8f82ac89c0db0d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Jensen?= Date: Fri, 1 Dec 2017 13:22:34 +0100 Subject: [PATCH 09/38] #1826. Hide completion type when no time steps are available --- .../ProjectDataModel/RimEclipseResultDefinition.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp b/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp index 7eead54b31..52bdcbcbd1 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp @@ -603,8 +603,11 @@ QList RimEclipseResultDefinition::calcOptionsForVariable QStringList cellCenterResultNames; QStringList cellFaceResultNames; + RigCaseCellResultsData* results = this->currentGridCellResults(); foreach(QString s, getResultNamesForCurrentUiResultType()) { + if (s == RiaDefines::completionTypeResultName() && results->timeStepDates().empty()) continue; + if (RiaDefines::isPerCellFaceResult(s)) { cellFaceResultNames.push_back(s); From 1c628fcf3edb0e2e83a35c1cbdd364d78eee7e2b Mon Sep 17 00:00:00 2001 From: Rebecca Cox Date: Fri, 1 Dec 2017 10:47:15 +0100 Subject: [PATCH 10/38] Change color in statistics dialog --- ApplicationCode/Commands/RicGridStatisticsDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ApplicationCode/Commands/RicGridStatisticsDialog.cpp b/ApplicationCode/Commands/RicGridStatisticsDialog.cpp index f06f82dc2a..4264105495 100644 --- a/ApplicationCode/Commands/RicGridStatisticsDialog.cpp +++ b/ApplicationCode/Commands/RicGridStatisticsDialog.cpp @@ -162,7 +162,7 @@ void RicGridStatisticsDialog::setHistogramData(RimView* view) auto hist = new QwtPlotHistogram("Histogram"); auto aggr = new QwtPlotCurve("Aggregated"); - hist->setBrush(QBrush(QColor(Qt::darkYellow))); + hist->setBrush(QBrush(QColor(Qt::darkCyan))); hist->setZ(-1); aggr->setStyle(QwtPlotCurve::Steps); aggr->setCurveAttribute(QwtPlotCurve::Inverted); From 917b824177c5e6b7c02c328521f46472d9e2cd93 Mon Sep 17 00:00:00 2001 From: Rebecca Cox Date: Fri, 1 Dec 2017 13:20:05 +0100 Subject: [PATCH 11/38] #2144 Context menu: New uiText on menus --- .../UserInterface/RiuViewerCommands.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/ApplicationCode/UserInterface/RiuViewerCommands.cpp b/ApplicationCode/UserInterface/RiuViewerCommands.cpp index 9dcc5a8f04..3731d4f762 100644 --- a/ApplicationCode/UserInterface/RiuViewerCommands.cpp +++ b/ApplicationCode/UserInterface/RiuViewerCommands.cpp @@ -249,7 +249,7 @@ void RiuViewerCommands::displayContextMenu(QMouseEvent* event) menuBuilder.addSeparator(); - menuBuilder.subMenuStart("Intersection", QIcon(":/IntersectionXPlane16x16.png")); + menuBuilder.subMenuStart("Intersections", QIcon(":/IntersectionXPlane16x16.png")); menuBuilder << "RicNewPolylineIntersectionFeature"; menuBuilder << "RicNewAzimuthDipIntersectionFeature"; @@ -305,18 +305,23 @@ void RiuViewerCommands::displayContextMenu(QMouseEvent* event) menuBuilder << "RicNewWellLogCurveExtractionFeature"; menuBuilder << "RicNewWellLogFileCurveFeature"; + + menuBuilder.addSeparator(); - menuBuilder.subMenuStart("Well Plot", QIcon(":/SummaryPlot16x16.png")); + menuBuilder.subMenuStart("Well Plots", QIcon(":/SummaryPlot16x16.png")); menuBuilder << "RicNewRftPlotFeature"; menuBuilder << "RicNewPltPlotFeature"; + + menuBuilder.addSeparator(); + menuBuilder << "RicShowWellAllocationPlotFeature"; menuBuilder.subMenuEnd(); menuBuilder.addSeparator(); - menuBuilder.subMenuStart("Perforation", QIcon(":/FishBoneGroup16x16.png")); + menuBuilder.subMenuStart("Completions", QIcon(":/FishBoneGroup16x16.png")); #ifdef USE_PROTOTYPE_FEATURE_FRACTURES menuBuilder << "RicNewWellPathFractureAtPosFeature"; @@ -346,10 +351,15 @@ void RiuViewerCommands::displayContextMenu(QMouseEvent* event) menuBuilder << "RicNewWellLogCurveExtractionFeature"; menuBuilder << "RicNewWellLogRftCurveFeature"; - menuBuilder.subMenuStart("Well Plot", QIcon(":/SummaryPlot16x16.png")); + menuBuilder.addSeparator(); + + menuBuilder.subMenuStart("Well Plots", QIcon(":/SummaryPlot16x16.png")); menuBuilder << "RicNewRftPlotFeature"; menuBuilder << "RicNewPltPlotFeature"; + + menuBuilder.addSeparator(); + menuBuilder << "RicPlotProductionRateFeature"; menuBuilder << "RicShowWellAllocationPlotFeature"; From a2a7155d1c1089ccb9ddc71e31d4968e5073ae78 Mon Sep 17 00:00:00 2001 From: Rebecca Cox Date: Fri, 1 Dec 2017 13:24:43 +0100 Subject: [PATCH 12/38] #2213 Formations: On import, set formation on active case --- .../RicImportFormationNamesFeature.cpp | 19 +++++++------------ ApplicationCode/ProjectDataModel/RimCase.cpp | 8 ++++++++ ApplicationCode/ProjectDataModel/RimCase.h | 1 + .../ProjectDataModel/RimEclipseCase.cpp | 12 ++++++++++++ .../ProjectDataModel/RimEclipseCase.h | 2 ++ .../ProjectDataModel/RimGeoMechCase.cpp | 12 ++++++++++++ .../ProjectDataModel/RimGeoMechCase.h | 2 ++ 7 files changed, 44 insertions(+), 12 deletions(-) diff --git a/ApplicationCode/Commands/RicImportFormationNamesFeature.cpp b/ApplicationCode/Commands/RicImportFormationNamesFeature.cpp index 603c1678ed..34ee624154 100644 --- a/ApplicationCode/Commands/RicImportFormationNamesFeature.cpp +++ b/ApplicationCode/Commands/RicImportFormationNamesFeature.cpp @@ -27,6 +27,7 @@ #include "RimGeoMechCase.h" #include "RimOilField.h" #include "RimProject.h" +#include "RimView.h" #include "RigEclipseCaseData.h" #include "RigFemPartResultsCollection.h" @@ -37,6 +38,7 @@ #include #include + CAF_CMD_SOURCE_INIT(RicImportFormationNamesFeature, "RicImportFormationNamesFeature"); //-------------------------------------------------------------------------------------------------- @@ -78,21 +80,14 @@ void RicImportFormationNamesFeature::onActionTriggered(bool isChecked) std::vector cases; proj->allCases(cases); - if (cases.size() == 1) + if (!cases.empty()) { - std::vector eclCases = proj->eclipseCases(); - if (eclCases.size() == 1) - { - eclCases[0]->activeFormationNames = formationName; - eclCases[0]->eclipseCaseData()->setActiveFormationNames(formationName->formationNamesData()); - } + RimView* activeView = RiaApplication::instance()->activeReservoirView(); + RimCase* ownerCase = activeView->ownerCase(); - std::vector geoMechCases = proj->geoMechCases(); - - if (geoMechCases.size() == 1) + if (ownerCase) { - geoMechCases[0]->activeFormationNames = formationName; - geoMechCases[0]->geoMechData()->femPartResults()->setActiveFormationNames(formationName->formationNamesData()); + ownerCase->setFormationNames(formationName); } } diff --git a/ApplicationCode/ProjectDataModel/RimCase.cpp b/ApplicationCode/ProjectDataModel/RimCase.cpp index 4e759185d3..1382c40e11 100644 --- a/ApplicationCode/ProjectDataModel/RimCase.cpp +++ b/ApplicationCode/ProjectDataModel/RimCase.cpp @@ -66,6 +66,14 @@ cvf::Vec3d RimCase::displayModelOffset() const return cvf::Vec3d::ZERO; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimCase::setFormationNames(RimFormationNames* formationNames) +{ + activeFormationNames = formationNames; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimCase.h b/ApplicationCode/ProjectDataModel/RimCase.h index 6dd4dc2dfb..5b151baae6 100644 --- a/ApplicationCode/ProjectDataModel/RimCase.h +++ b/ApplicationCode/ProjectDataModel/RimCase.h @@ -63,6 +63,7 @@ public: virtual cvf::Vec3d displayModelOffset() const; virtual void updateFormationNamesData() = 0; + virtual void setFormationNames(RimFormationNames* formationNames); virtual double characteristicCellSize() const = 0; diff --git a/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp b/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp index 272cbb9155..f201ffa5b0 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp @@ -775,6 +775,18 @@ double RimEclipseCase::characteristicCellSize() const return 10.0; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipseCase::setFormationNames(RimFormationNames* formationNames) +{ + activeFormationNames = formationNames; + if (m_rigEclipseCase.notNull() && formationNames != nullptr) + { + m_rigEclipseCase->setActiveFormationNames(formationNames->formationNamesData()); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimEclipseCase.h b/ApplicationCode/ProjectDataModel/RimEclipseCase.h index 42f7e03c0b..5e8710df62 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseCase.h +++ b/ApplicationCode/ProjectDataModel/RimEclipseCase.h @@ -107,6 +107,8 @@ public: virtual double characteristicCellSize() const override; + virtual void setFormationNames(RimFormationNames* formationNames) override; + protected: virtual void initAfterRead(); virtual void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ); diff --git a/ApplicationCode/ProjectDataModel/RimGeoMechCase.cpp b/ApplicationCode/ProjectDataModel/RimGeoMechCase.cpp index a3d4b7c78c..2032fe6ab1 100644 --- a/ApplicationCode/ProjectDataModel/RimGeoMechCase.cpp +++ b/ApplicationCode/ProjectDataModel/RimGeoMechCase.cpp @@ -304,6 +304,18 @@ double RimGeoMechCase::characteristicCellSize() const return 10.0; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimGeoMechCase::setFormationNames(RimFormationNames* formationNames) +{ + activeFormationNames = formationNames; + if (m_geoMechCaseData.notNull() && formationNames != nullptr) + { + m_geoMechCaseData->femPartResults()->setActiveFormationNames(formationNames->formationNamesData()); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimGeoMechCase.h b/ApplicationCode/ProjectDataModel/RimGeoMechCase.h index 8af598bd1e..b16f458535 100644 --- a/ApplicationCode/ProjectDataModel/RimGeoMechCase.h +++ b/ApplicationCode/ProjectDataModel/RimGeoMechCase.h @@ -67,6 +67,8 @@ public: virtual double characteristicCellSize() const override; + virtual void setFormationNames(RimFormationNames* formationNames) override; + // Fields: caf::PdmChildArrayField geoMechViews; From 6103f290bff7cf79794dcfb18382d20588c6596d Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 1 Dec 2017 09:34:43 +0100 Subject: [PATCH 13/38] #2170 Summary Case: Simplified access function to all cases, remove unused function --- .../RicSummaryCurveCreator.cpp | 9 +++----- .../ProjectDataModel/RimProject.cpp | 23 ++++--------------- ApplicationCode/ProjectDataModel/RimProject.h | 5 ++-- .../Summary/RimSummaryCurve.cpp | 3 +-- 4 files changed, 11 insertions(+), 29 deletions(-) diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp index f26f3f0223..45d72e8b27 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp @@ -368,10 +368,8 @@ std::set RicSummaryCurveCreator::getAllSummaryCaseNames() { std::set summaryCaseHashes; RimProject* proj = RiaApplication::instance()->project(); - std::vector cases; - - proj->allSummaryCases(cases); - + + std::vector cases = proj->allSummaryCases(); for (RimSummaryCase* rimCase : cases) { summaryCaseHashes.insert(rimCase->summaryHeaderFilename().toUtf8().constData()); @@ -387,9 +385,8 @@ std::set RicSummaryCurveCreator::getAllSummaryWellNames() { std::set summaryWellNames; RimProject* proj = RiaApplication::instance()->project(); - std::vector cases; - proj->allSummaryCases(cases); + std::vector cases = proj->allSummaryCases(); for (RimSummaryCase* rimCase : cases) { RifSummaryReaderInterface* reader = nullptr; diff --git a/ApplicationCode/ProjectDataModel/RimProject.cpp b/ApplicationCode/ProjectDataModel/RimProject.cpp index 8789f06818..517b1e2b18 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationCode/ProjectDataModel/RimProject.cpp @@ -547,9 +547,10 @@ void RimProject::allCases(std::vector& cases) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimProject::allSummaryCases(std::vector& sumCases) +std::vector RimProject::allSummaryCases() const { - sumCases.clear(); + std::vector sumCases; + for (RimOilField* oilField: oilFields) { if(!oilField) continue; @@ -567,24 +568,8 @@ void RimProject::allSummaryCases(std::vector& sumCases) sumCases.insert(sumCases.end(), observedData.begin(), observedData.end()); } } -} -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimProject::allObservedData(std::vector& observedData) -{ - for (RimOilField* oilField : oilFields) - { - if (!oilField) continue; - RimObservedDataCollection* observedDataCollection = oilField->observedDataCollection(); - if (observedDataCollection) - { - observedData.clear(); - std::vector allObservedData = observedDataCollection->allObservedData(); - observedData.insert(observedData.end(), allObservedData.begin(), allObservedData.end()); - } - } + return sumCases; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimProject.h b/ApplicationCode/ProjectDataModel/RimProject.h index f8a80852c2..bb71149621 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.h +++ b/ApplicationCode/ProjectDataModel/RimProject.h @@ -100,8 +100,9 @@ public: void assignIdToCaseGroup(RimIdenticalGridCaseGroup* caseGroup); void allCases(std::vector& cases); - void allSummaryCases(std::vector& sumCases); - void allObservedData(std::vector& observedData); + + std::vector allSummaryCases() const; + void allNotLinkedViews(std::vector& views); void allVisibleViews(std::vector& views); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp index 1a9152b932..1984dd8572 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp @@ -311,9 +311,8 @@ QList RimSummaryCurve::calculateValueOptions(const caf:: fieldNeedingOptions == &m_xValuesSummaryCase) { RimProject* proj = RiaApplication::instance()->project(); - std::vector cases; - proj->allSummaryCases(cases); + std::vector cases = proj->allSummaryCases(); cases.push_back(proj->calculationCollection->calculationSummaryCase()); From a431d1045715a581a1c7985e5c21236d42b8093a Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 1 Dec 2017 10:24:39 +0100 Subject: [PATCH 14/38] #2170 Summary Source Stepping : Do not show summary case step if only one case is available --- .../Summary/RimSummaryPlotSourceStepping.cpp | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp index f0c184373c..1cd173d650 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp @@ -24,7 +24,6 @@ #include "RifSummaryReaderInterface.h" -#include "RimOilField.h" #include "RimProject.h" #include "RimSummaryCase.h" #include "RimSummaryCaseMainCollection.h" @@ -175,7 +174,11 @@ std::vector RimSummaryPlotSourceStepping::fieldsToShowInTo if (analyzer.summaryCases().size() == 1) { - fields.push_back(&m_summaryCase); + RimProject* proj = RiaApplication::instance()->project(); + if (proj->allSummaryCases().size() > 1) + { + fields.push_back(&m_summaryCase); + } } if (analyzer.wellNames().size() == 1) @@ -221,14 +224,9 @@ QList RimSummaryPlotSourceStepping::calculateValueOption RimProject* proj = RiaApplication::instance()->project(); - RimSummaryCaseMainCollection* sumCaseColl = - proj->activeOilField() ? proj->activeOilField()->summaryCaseMainCollection() : nullptr; - if (sumCaseColl) + for (auto sumCase : proj->allSummaryCases()) { - for (auto sumCase : sumCaseColl->allSummaryCases()) - { - options.append(caf::PdmOptionItemInfo(sumCase->caseName(), sumCase)); - } + options.append(caf::PdmOptionItemInfo(sumCase->caseName(), sumCase)); } return options; @@ -458,8 +456,18 @@ void RimSummaryPlotSourceStepping::updateUiFromCurves() if (analyzer.summaryCases().size() == 1) { - m_summaryCase = *(analyzer.summaryCases().begin()); - m_summaryCase.uiCapability()->setUiHidden(false); + std::set sumCases = analyzer.summaryCases(); + + if (sumCases.find(m_summaryCase) == sumCases.end()) + { + m_summaryCase = *(sumCases.begin()); + } + + RimProject* proj = RiaApplication::instance()->project(); + if (proj->allSummaryCases().size() > 1) + { + m_summaryCase.uiCapability()->setUiHidden(false); + } } RifEclipseSummaryAddress::SummaryVarCategory category = RifEclipseSummaryAddress::SUMMARY_INVALID; @@ -536,7 +544,11 @@ caf::PdmFieldHandle* RimSummaryPlotSourceStepping::fieldToModify() // to be able to step between summary cases if (analyzer.summaryCases().size() == 1) { - return &m_summaryCase; + RimProject* proj = RiaApplication::instance()->project(); + if (proj->allSummaryCases().size() > 1) + { + return &m_summaryCase; + } } return nullptr; From 3276e46e49982ba2a41fd5f265bfed0dfda1758b Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 1 Dec 2017 11:15:19 +0100 Subject: [PATCH 15/38] #2170 Summary Cross Plot : Basis for source steppint in x, y and union --- .../Tools/RiaSummaryCurveAnalyzer.cpp | 13 ++ .../Tools/RiaSummaryCurveAnalyzer.h | 1 + .../Summary/RimSummaryCurve.cpp | 26 +++ .../Summary/RimSummaryCurve.h | 3 + .../Summary/RimSummaryPlotSourceStepping.cpp | 204 +++++++++++++----- .../Summary/RimSummaryPlotSourceStepping.h | 29 ++- 6 files changed, 221 insertions(+), 55 deletions(-) diff --git a/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.cpp b/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.cpp index 45d18c5ea3..24ee187376 100644 --- a/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.cpp +++ b/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.cpp @@ -64,6 +64,19 @@ void RiaSummaryCurveAnalyzer::analyzeAdresses(const std::vector& allAddresses) +{ + clearAllSets(); + + for (const auto& adr : allAddresses) + { + analyzeAddress(adr); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.h b/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.h index dc62dbf9e4..494b191c60 100644 --- a/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.h +++ b/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.h @@ -39,6 +39,7 @@ public: void analyzeCurves(const RimSummaryCurveCollection* sumCurveCollection); void analyzeAdresses(const std::vector& allAddresses); + void analyzeAdresses(const std::set& allAddresses); std::set quantities() const; std::set wellNames() const; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp index 1984dd8572..b26861ec0c 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp @@ -191,6 +191,16 @@ RifEclipseSummaryAddress RimSummaryCurve::summaryAddressX() const return m_xValuesCurveVariable->address(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryCurve::setSummaryAddressX(const RifEclipseSummaryAddress& address) +{ + m_xValuesCurveVariable->setAddress(address); + + // TODO: Should interpolation be computed similar to RimSummaryCurve::setSummaryAddressY +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -283,6 +293,22 @@ const std::vector& RimSummaryCurve::timeStepsY() const return reader->timeSteps(addr); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryCurve::setSummaryCaseX(RimSummaryCase* sumCase) +{ + m_xValuesSummaryCase = sumCase; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSummaryCase* RimSummaryCurve::summaryCaseX() const +{ + return m_xValuesSummaryCase(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.h index abaa739453..f356d0bdfa 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.h @@ -63,7 +63,10 @@ public: const std::vector& timeStepsY() const; // X Axis functions + void setSummaryCaseX(RimSummaryCase* sumCase); + RimSummaryCase* summaryCaseX() const; RifEclipseSummaryAddress summaryAddressX() const; + void setSummaryAddressX(const RifEclipseSummaryAddress& address); std::string unitNameX() const; std::vector valuesX() const; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp index 1cd173d650..aab4983df7 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp @@ -40,7 +40,7 @@ CAF_PDM_SOURCE_INIT(RimSummaryPlotSourceStepping, "RimSummaryCurveCollectionModi //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimSummaryPlotSourceStepping::RimSummaryPlotSourceStepping() +RimSummaryPlotSourceStepping::RimSummaryPlotSourceStepping() : m_sourceSteppingType(Y_AXIS) { // clang-format off CAF_PDM_InitObject("Summary Curves Modifier", "", "", ""); @@ -51,14 +51,17 @@ RimSummaryPlotSourceStepping::RimSummaryPlotSourceStepping() CAF_PDM_InitFieldNoDefault(&m_region, "Region", "Region", "", "", ""); CAF_PDM_InitFieldNoDefault(&m_quantity, "Quantities", "Quantity", "", "", ""); - CAF_PDM_InitFieldNoDefault(&m_wellNameProxy, "WellNameProxy", "WellNameProxy", "", "", ""); - m_wellNameProxy.registerGetMethod(this, &RimSummaryPlotSourceStepping::wellName); - m_wellNameProxy.registerSetMethod(this, &RimSummaryPlotSourceStepping::setWellName); - m_wellNameProxy.uiCapability()->setUiEditorTypeName(caf::PdmUiListEditor::uiEditorTypeName()); - m_wellNameProxy.uiCapability()->setUiHidden(true); // clang-format on } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlotSourceStepping::setSourceSteppingType(SourceSteppingType sourceSteppingType) +{ + m_sourceSteppingType = sourceSteppingType; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -166,11 +169,8 @@ std::vector RimSummaryPlotSourceStepping::fieldsToShowInTo { std::vector fields; - RimSummaryCurveCollection* curveCollection = nullptr; - this->firstAncestorOrThisOfTypeAsserted(curveCollection); - RiaSummaryCurveAnalyzer analyzer; - analyzer.analyzeCurves(curveCollection); + analyzer.analyzeAdresses(allAddressesUsedInCurves()); if (analyzer.summaryCases().size() == 1) { @@ -242,7 +242,7 @@ QList RimSummaryPlotSourceStepping::calculateValueOption RiaSummaryCurveAnalyzer analyzer; analyzer.analyzeAdresses(allAddresses); - if (fieldNeedingOptions == &m_wellName || fieldNeedingOptions == &m_wellNameProxy) + if (fieldNeedingOptions == &m_wellName) { identifierTexts = analyzer.identifierTexts(RifEclipseSummaryAddress::SUMMARY_WELL); } @@ -311,22 +311,44 @@ void RimSummaryPlotSourceStepping::fieldChangedByUi(const caf::PdmFieldHandle* c { for (auto curve : curveCollection->curves()) { - curve->setSummaryCaseY(m_summaryCase); + if (isYAxisStepping()) + { + curve->setSummaryCaseY(m_summaryCase); + } + + if (isXAxisStepping()) + { + curve->setSummaryCaseX(m_summaryCase); + } } triggerLoadDataAndUpdate = true; } } - else if (changedField == &m_wellName || changedField == &m_wellNameProxy) + else if (changedField == &m_wellName) { for (auto curve : curveCollection->curves()) { - RifEclipseSummaryAddress adr = curve->summaryAddressY(); - if (adr.category() == RifEclipseSummaryAddress::SUMMARY_WELL) + if (isYAxisStepping()) { - adr.setWellName(m_wellName().toStdString()); + RifEclipseSummaryAddress adr = curve->summaryAddressY(); + if (adr.category() == RifEclipseSummaryAddress::SUMMARY_WELL) + { + adr.setWellName(m_wellName().toStdString()); - curve->setSummaryAddressY(adr); + curve->setSummaryAddressY(adr); + } + } + + if (isXAxisStepping()) + { + RifEclipseSummaryAddress adr = curve->summaryAddressX(); + if (adr.category() == RifEclipseSummaryAddress::SUMMARY_WELL) + { + adr.setWellName(m_wellName().toStdString()); + + curve->setSummaryAddressX(adr); + } } } @@ -336,12 +358,26 @@ void RimSummaryPlotSourceStepping::fieldChangedByUi(const caf::PdmFieldHandle* c { for (auto curve : curveCollection->curves()) { - RifEclipseSummaryAddress adr = curve->summaryAddressY(); - if (adr.category() == RifEclipseSummaryAddress::SUMMARY_REGION) + if (isYAxisStepping()) { - adr.setRegion(m_region()); + RifEclipseSummaryAddress adr = curve->summaryAddressY(); + if (adr.category() == RifEclipseSummaryAddress::SUMMARY_REGION) + { + adr.setRegion(m_region()); - curve->setSummaryAddressY(adr); + curve->setSummaryAddressY(adr); + } + } + + if (isXAxisStepping()) + { + RifEclipseSummaryAddress adr = curve->summaryAddressX(); + if (adr.category() == RifEclipseSummaryAddress::SUMMARY_REGION) + { + adr.setRegion(m_region()); + + curve->setSummaryAddressX(adr); + } } } @@ -351,9 +387,21 @@ void RimSummaryPlotSourceStepping::fieldChangedByUi(const caf::PdmFieldHandle* c { for (auto curve : curveCollection->curves()) { - RifEclipseSummaryAddress adr = curve->summaryAddressY(); - adr.setQuantityName(m_quantity().toStdString()); - curve->setSummaryAddressY(adr); + if (isYAxisStepping()) + { + RifEclipseSummaryAddress adr = curve->summaryAddressY(); + adr.setQuantityName(m_quantity().toStdString()); + + curve->setSummaryAddressY(adr); + } + + if (isXAxisStepping()) + { + RifEclipseSummaryAddress adr = curve->summaryAddressX(); + adr.setQuantityName(m_quantity().toStdString()); + + curve->setSummaryAddressX(adr); + } } triggerLoadDataAndUpdate = true; @@ -362,12 +410,26 @@ void RimSummaryPlotSourceStepping::fieldChangedByUi(const caf::PdmFieldHandle* c { for (auto curve : curveCollection->curves()) { - RifEclipseSummaryAddress adr = curve->summaryAddressY(); - if (adr.category() == RifEclipseSummaryAddress::SUMMARY_WELL_GROUP) + if (isYAxisStepping()) { - adr.setWellGroupName(m_wellGroupName().toStdString()); + RifEclipseSummaryAddress adr = curve->summaryAddressY(); + if (adr.category() == RifEclipseSummaryAddress::SUMMARY_WELL_GROUP) + { + adr.setWellGroupName(m_wellGroupName().toStdString()); - curve->setSummaryAddressY(adr); + curve->setSummaryAddressY(adr); + } + } + + if (isXAxisStepping()) + { + RifEclipseSummaryAddress adr = curve->summaryAddressX(); + if (adr.category() == RifEclipseSummaryAddress::SUMMARY_WELL_GROUP) + { + adr.setWellGroupName(m_wellGroupName().toStdString()); + + curve->setSummaryAddressX(adr); + } } } @@ -410,7 +472,15 @@ RimSummaryCase* RimSummaryPlotSourceStepping::singleSummaryCase() const std::set cases; for (auto curve : curveCollection->curves()) { - cases.insert(curve->summaryCaseY()); + if (isYAxisStepping()) + { + cases.insert(curve->summaryCaseY()); + } + + if (isXAxisStepping()) + { + cases.insert(curve->summaryCaseX()); + } } if (cases.size() == 1) @@ -421,22 +491,6 @@ RimSummaryCase* RimSummaryPlotSourceStepping::singleSummaryCase() const return nullptr; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimSummaryPlotSourceStepping::wellName() const -{ - return m_wellName(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryPlotSourceStepping::setWellName(const QString& wellName) -{ - m_wellName.setValueWithFieldChanged(wellName); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -514,11 +568,8 @@ void RimSummaryPlotSourceStepping::updateUiFromCurves() //-------------------------------------------------------------------------------------------------- caf::PdmFieldHandle* RimSummaryPlotSourceStepping::fieldToModify() { - RimSummaryCurveCollection* curveCollection = nullptr; - this->firstAncestorOrThisOfTypeAsserted(curveCollection); - RiaSummaryCurveAnalyzer analyzer; - analyzer.analyzeCurves(curveCollection); + analyzer.analyzeAdresses(allAddressesUsedInCurves()); if (analyzer.wellNames().size() == 1) { @@ -564,6 +615,61 @@ caf::PdmValueField* RimSummaryPlotSourceStepping::valueFieldToModify() return dynamic_cast(fieldToModify()); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::set RimSummaryPlotSourceStepping::allAddressesUsedInCurves() const +{ + std::set addresses; + + RimSummaryCurveCollection* curveCollection = nullptr; + this->firstAncestorOrThisOfTypeAsserted(curveCollection); + + auto curves = curveCollection->curves(); + for (auto c : curves) + { + if (isYAxisStepping()) + { + addresses.insert(c->summaryAddressY()); + } + + if (isXAxisStepping()) + { + addresses.insert(c->summaryAddressX()); + } + } + + return addresses; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimSummaryPlotSourceStepping::isXAxisStepping() const +{ + if (m_sourceSteppingType == UNION_X_Y_AXIS) + return true; + + if (m_sourceSteppingType == X_AXIS) + return true; + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimSummaryPlotSourceStepping::isYAxisStepping() const +{ + if (m_sourceSteppingType == UNION_X_Y_AXIS) + return true; + + if (m_sourceSteppingType == Y_AXIS) + return true; + + return false; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h index adb779e9ec..8bdab4d0db 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h @@ -18,6 +18,8 @@ #pragma once +#include "RifEclipseSummaryAddress.h" + #include "cafPdmField.h" #include "cafPdmObject.h" #include "cafPdmProxyValueField.h" @@ -25,6 +27,8 @@ #include +#include + class RimSummaryCase; class RifSummaryReaderInterface; @@ -35,13 +39,23 @@ class RimSummaryPlotSourceStepping : public caf::PdmObject { CAF_PDM_HEADER_INIT; +public: + enum SourceSteppingType + { + Y_AXIS, + X_AXIS, + UNION_X_Y_AXIS + }; + public: RimSummaryPlotSourceStepping(); + void setSourceSteppingType(SourceSteppingType sourceSteppingType); + void applyNextIdentifier(); void applyPreviousIdentifier(); - std::vector fieldsToShowInToolbar(); + std::vector fieldsToShowInToolbar(); private: virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override; @@ -52,23 +66,26 @@ private: virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; - virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute) override; + virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, + caf::PdmUiEditorAttribute* attribute) override; private: RifSummaryReaderInterface* summaryReader() const; RimSummaryCase* singleSummaryCase() const; - QString wellName() const; - void setWellName(const QString& wellName); void updateUiFromCurves(); caf::PdmFieldHandle* fieldToModify(); caf::PdmValueField* valueFieldToModify(); + std::set allAddressesUsedInCurves() const; + + bool isXAxisStepping() const; + bool isYAxisStepping() const; + private: caf::PdmPtrField m_summaryCase; caf::PdmField m_wellName; caf::PdmField m_wellGroupName; caf::PdmField m_region; caf::PdmField m_quantity; - - caf::PdmProxyValueField m_wellNameProxy; // TODO: This is a test field for a list editor + SourceSteppingType m_sourceSteppingType; }; From b8f8b2bc168bca018fc553697f87b18f4149df71 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 1 Dec 2017 11:46:29 +0100 Subject: [PATCH 16/38] #2170 Summary Cross Plot : Show three stepping groups for cross plots --- .../Summary/RimSummaryCurveCollection.cpp | 72 ++++++++++++++++--- .../Summary/RimSummaryCurveCollection.h | 5 +- .../Summary/RimSummaryPlotSourceStepping.cpp | 8 +-- .../Summary/RimSummaryPlotSourceStepping.h | 2 +- 4 files changed, 70 insertions(+), 17 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp index 520fc3af2b..5815f0812e 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp @@ -25,9 +25,10 @@ #include "RimProject.h" #include "RimSummaryCase.h" +#include "RimSummaryCrossPlot.h" #include "RimSummaryCurve.h" -#include "RimSummaryPlotSourceStepping.h" #include "RimSummaryPlot.h" +#include "RimSummaryPlotSourceStepping.h" #include "RiuLineSegmentQwtPlotCurve.h" #include "RiuSummaryQwtPlot.h" @@ -50,11 +51,26 @@ RimSummaryCurveCollection::RimSummaryCurveCollection() CAF_PDM_InitField(&m_showCurves, "IsActive", true, "Show Curves", "", "", ""); m_showCurves.uiCapability()->setUiHidden(true); - CAF_PDM_InitFieldNoDefault(&m_sourceStepping, "SourceStepping", "Plot Source Stepping", "", "", ""); - m_sourceStepping = new RimSummaryPlotSourceStepping; - m_sourceStepping.uiCapability()->setUiHidden(true); - m_sourceStepping.uiCapability()->setUiTreeChildrenHidden(true); - m_sourceStepping.xmlCapability()->disableIO(); + 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(); + + CAF_PDM_InitFieldNoDefault(&m_xSourceStepping, "XSourceStepping", "", "", "", ""); + m_xSourceStepping = new RimSummaryPlotSourceStepping; + m_xSourceStepping->setSourceSteppingType(RimSummaryPlotSourceStepping::X_AXIS); + m_xSourceStepping.uiCapability()->setUiHidden(true); + m_xSourceStepping.uiCapability()->setUiTreeChildrenHidden(true); + m_xSourceStepping.xmlCapability()->disableIO(); + + CAF_PDM_InitFieldNoDefault(&m_unionSourceStepping, "UnionSourceStepping", "", "", "", ""); + m_unionSourceStepping = new RimSummaryPlotSourceStepping; + m_unionSourceStepping->setSourceSteppingType(RimSummaryPlotSourceStepping::UNION_X_Y_AXIS); + m_unionSourceStepping.uiCapability()->setUiHidden(true); + m_unionSourceStepping.uiCapability()->setUiTreeChildrenHidden(true); + m_unionSourceStepping.xmlCapability()->disableIO(); } //-------------------------------------------------------------------------------------------------- @@ -231,7 +247,7 @@ void RimSummaryCurveCollection::setCurrentSummaryCurve(RimSummaryCurve* curve) //-------------------------------------------------------------------------------------------------- void RimSummaryCurveCollection::applyNextIdentifier() { - m_sourceStepping->applyNextIdentifier(); + m_ySourceStepping->applyNextIdentifier(); } //-------------------------------------------------------------------------------------------------- @@ -239,7 +255,7 @@ void RimSummaryCurveCollection::applyNextIdentifier() //-------------------------------------------------------------------------------------------------- void RimSummaryCurveCollection::applyPreviousIdentifier() { - m_sourceStepping->applyPreviousIdentifier(); + m_ySourceStepping->applyPreviousIdentifier(); } //-------------------------------------------------------------------------------------------------- @@ -247,7 +263,15 @@ void RimSummaryCurveCollection::applyPreviousIdentifier() //-------------------------------------------------------------------------------------------------- std::vector RimSummaryCurveCollection::fieldsToShowInToolbar() { - return m_sourceStepping()->fieldsToShowInToolbar(); + RimSummaryCrossPlot* parentCrossPlot; + firstAncestorOrThisOfType(parentCrossPlot); + + if (parentCrossPlot) + { + return m_unionSourceStepping->fieldsToShowInToolbar(); + } + + return m_ySourceStepping()->fieldsToShowInToolbar(); } //-------------------------------------------------------------------------------------------------- @@ -302,9 +326,35 @@ void RimSummaryCurveCollection::fieldChangedByUi(const caf::PdmFieldHandle* chan //-------------------------------------------------------------------------------------------------- void RimSummaryCurveCollection::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) { - auto group = uiOrdering.addNewGroup("Plot Source Stepping"); + RimSummaryCrossPlot* parentCrossPlot; + firstAncestorOrThisOfType(parentCrossPlot); - m_sourceStepping()->uiOrdering(uiConfigName, *group); + if (parentCrossPlot) + { + { + auto group = uiOrdering.addNewGroup("Y Source Stepping"); + + m_ySourceStepping()->uiOrdering(uiConfigName, *group); + } + + { + auto group = uiOrdering.addNewGroup("X Source Stepping"); + + m_xSourceStepping()->uiOrdering(uiConfigName, *group); + } + + { + auto group = uiOrdering.addNewGroup("Union Source Stepping"); + + m_unionSourceStepping()->uiOrdering(uiConfigName, *group); + } + } + else + { + auto group = uiOrdering.addNewGroup("Plot Source Stepping"); + + m_ySourceStepping()->uiOrdering(uiConfigName, *group); + } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.h index 18cb6fdbe9..87f97fd105 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.h @@ -80,7 +80,10 @@ private: caf::PdmField m_showCurves; caf::PdmChildArrayField m_curves; - caf::PdmChildField m_sourceStepping; + caf::PdmChildField m_ySourceStepping; + caf::PdmChildField m_xSourceStepping; + caf::PdmChildField m_unionSourceStepping; + caf::PdmPointer m_currentSummaryCurve; }; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp index aab4983df7..027fa8a3e4 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp @@ -170,7 +170,7 @@ std::vector RimSummaryPlotSourceStepping::fieldsToShowInTo std::vector fields; RiaSummaryCurveAnalyzer analyzer; - analyzer.analyzeAdresses(allAddressesUsedInCurves()); + analyzer.analyzeAdresses(allAddressesUsedInCurveCollection()); if (analyzer.summaryCases().size() == 1) { @@ -506,7 +506,7 @@ void RimSummaryPlotSourceStepping::updateUiFromCurves() this->firstAncestorOrThisOfTypeAsserted(curveCollection); RiaSummaryCurveAnalyzer analyzer; - analyzer.analyzeCurves(curveCollection); + analyzer.analyzeAdresses(allAddressesUsedInCurveCollection()); if (analyzer.summaryCases().size() == 1) { @@ -569,7 +569,7 @@ void RimSummaryPlotSourceStepping::updateUiFromCurves() caf::PdmFieldHandle* RimSummaryPlotSourceStepping::fieldToModify() { RiaSummaryCurveAnalyzer analyzer; - analyzer.analyzeAdresses(allAddressesUsedInCurves()); + analyzer.analyzeAdresses(allAddressesUsedInCurveCollection()); if (analyzer.wellNames().size() == 1) { @@ -618,7 +618,7 @@ caf::PdmValueField* RimSummaryPlotSourceStepping::valueFieldToModify() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::set RimSummaryPlotSourceStepping::allAddressesUsedInCurves() const +std::set RimSummaryPlotSourceStepping::allAddressesUsedInCurveCollection() const { std::set addresses; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h index 8bdab4d0db..f2fab6f7bd 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h @@ -76,7 +76,7 @@ private: caf::PdmFieldHandle* fieldToModify(); caf::PdmValueField* valueFieldToModify(); - std::set allAddressesUsedInCurves() const; + std::set allAddressesUsedInCurveCollection() const; bool isXAxisStepping() const; bool isYAxisStepping() const; From 7f31c245ae8ed36f3ab146ba50866e9faf9a2529 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 1 Dec 2017 13:22:41 +0100 Subject: [PATCH 17/38] #2170 Summary Cross Plot : Improve computation of summary case set --- .../Tools/RiaSummaryCurveAnalyzer.cpp | 36 ++------ .../Tools/RiaSummaryCurveAnalyzer.h | 4 - .../Summary/RimSummaryCurveCollection.cpp | 11 ++- .../Summary/RimSummaryPlotSourceStepping.cpp | 87 ++++++++++++++----- .../Summary/RimSummaryPlotSourceStepping.h | 6 ++ 5 files changed, 85 insertions(+), 59 deletions(-) diff --git a/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.cpp b/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.cpp index 24ee187376..554ca64293 100644 --- a/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.cpp +++ b/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.cpp @@ -32,25 +32,6 @@ //-------------------------------------------------------------------------------------------------- RiaSummaryCurveAnalyzer::RiaSummaryCurveAnalyzer() {} -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaSummaryCurveAnalyzer::analyzeCurves(const RimSummaryCurveCollection* sumCurveCollection) -{ - clearAllSets(); - - if (!sumCurveCollection) - return; - - for (auto curve : sumCurveCollection->curves()) - { - m_summaryCases.insert(curve->summaryCaseY()); - - auto adr = curve->summaryAddressY(); - analyzeAddress(adr); - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -65,7 +46,7 @@ void RiaSummaryCurveAnalyzer::analyzeAdresses(const std::vector& allAddresses) { @@ -112,14 +93,6 @@ std::set RiaSummaryCurveAnalyzer::regionNumbers() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::set RiaSummaryCurveAnalyzer::summaryCases() const -{ - return m_summaryCases; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- std::set RiaSummaryCurveAnalyzer::categories() const { return m_categories; @@ -158,9 +131,11 @@ std::set RiaSummaryCurveAnalyzer::identifierTexts(RifEclipseSummaryAddr } //-------------------------------------------------------------------------------------------------- -/// +/// //-------------------------------------------------------------------------------------------------- -std::vector RiaSummaryCurveAnalyzer::addressesForCategory(const std::vector& addresses, RifEclipseSummaryAddress::SummaryVarCategory category) +std::vector + RiaSummaryCurveAnalyzer::addressesForCategory(const std::vector& addresses, + RifEclipseSummaryAddress::SummaryVarCategory category) { std::vector filteredAddresses; @@ -184,7 +159,6 @@ void RiaSummaryCurveAnalyzer::clearAllSets() m_wellNames.clear(); m_wellGroupNames.clear(); m_regionNumbers.clear(); - m_summaryCases.clear(); m_categories.clear(); } diff --git a/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.h b/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.h index 494b191c60..0836ea0eff 100644 --- a/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.h +++ b/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.h @@ -25,7 +25,6 @@ #include class RimSummaryCurveCollection; -class RimSummaryCase; class QString; @@ -37,7 +36,6 @@ class RiaSummaryCurveAnalyzer public: RiaSummaryCurveAnalyzer(); - void analyzeCurves(const RimSummaryCurveCollection* sumCurveCollection); void analyzeAdresses(const std::vector& allAddresses); void analyzeAdresses(const std::set& allAddresses); @@ -46,7 +44,6 @@ public: std::set wellGroupNames() const; std::set regionNumbers() const; - std::set summaryCases() const; std::set categories() const; std::set identifierTexts(RifEclipseSummaryAddress::SummaryVarCategory category) const; @@ -63,7 +60,6 @@ private: std::set m_wellNames; std::set m_wellGroupNames; std::set m_regionNumbers; - std::set m_summaryCases; std::set m_categories; }; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp index 5815f0812e..cf076ca72e 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp @@ -281,7 +281,16 @@ QString RimSummaryCurveCollection::compileAutoPlotTitle() const { RiaSummaryCurveAnalyzer analyzer; - analyzer.analyzeCurves(this); + std::set addresses; + for (auto c : m_curves) + { + addresses.insert(c->summaryAddressY()); + + // TODO : Improve how cross plot curves contribute to title + // Suggestion : Delegate to RimSummaryPlotSourceStepping to find title + } + + analyzer.analyzeAdresses(addresses); auto quantities = analyzer.quantities(); auto wellNames = analyzer.wellNames(); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp index 027fa8a3e4..0f8dbf69d3 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp @@ -169,10 +169,8 @@ std::vector RimSummaryPlotSourceStepping::fieldsToShowInTo { std::vector fields; - RiaSummaryCurveAnalyzer analyzer; - analyzer.analyzeAdresses(allAddressesUsedInCurveCollection()); - - if (analyzer.summaryCases().size() == 1) + auto sumCases = allSummaryCasesUsedInCurveCollection(); + if (sumCases.size() == 1) { RimProject* proj = RiaApplication::instance()->project(); if (proj->allSummaryCases().size() > 1) @@ -181,6 +179,9 @@ std::vector RimSummaryPlotSourceStepping::fieldsToShowInTo } } + RiaSummaryCurveAnalyzer analyzer; + analyzer.analyzeAdresses(allAddressesUsedInCurveCollection()); + if (analyzer.wellNames().size() == 1) { fields.push_back(&m_wellName); @@ -237,22 +238,19 @@ QList RimSummaryPlotSourceStepping::calculateValueOption RifSummaryReaderInterface* reader = summaryReader(); if (reader) { - const std::vector allAddresses = reader->allResultAddresses(); - - RiaSummaryCurveAnalyzer analyzer; - analyzer.analyzeAdresses(allAddresses); + RiaSummaryCurveAnalyzer* analyzer = analyzerForReader(reader); if (fieldNeedingOptions == &m_wellName) { - identifierTexts = analyzer.identifierTexts(RifEclipseSummaryAddress::SUMMARY_WELL); + identifierTexts = analyzer->identifierTexts(RifEclipseSummaryAddress::SUMMARY_WELL); } else if (fieldNeedingOptions == &m_region) { - identifierTexts = analyzer.identifierTexts(RifEclipseSummaryAddress::SUMMARY_REGION); + identifierTexts = analyzer->identifierTexts(RifEclipseSummaryAddress::SUMMARY_REGION); } else if (fieldNeedingOptions == &m_wellGroupName) { - identifierTexts = analyzer.identifierTexts(RifEclipseSummaryAddress::SUMMARY_WELL_GROUP); + identifierTexts = analyzer->identifierTexts(RifEclipseSummaryAddress::SUMMARY_WELL_GROUP); } else if (fieldNeedingOptions == &m_quantity) { @@ -268,7 +266,7 @@ QList RimSummaryPlotSourceStepping::calculateValueOption RiaSummaryCurveAnalyzer quantityAnalyzer; - auto subset = RiaSummaryCurveAnalyzer::addressesForCategory(allAddresses, category); + auto subset = RiaSummaryCurveAnalyzer::addressesForCategory(reader->allResultAddresses(), category); quantityAnalyzer.analyzeAdresses(subset); for (const auto& quantity : quantityAnalyzer.quantities()) @@ -502,16 +500,9 @@ void RimSummaryPlotSourceStepping::updateUiFromCurves() m_region.uiCapability()->setUiHidden(true); m_quantity.uiCapability()->setUiHidden(true); - RimSummaryCurveCollection* curveCollection = nullptr; - this->firstAncestorOrThisOfTypeAsserted(curveCollection); - - RiaSummaryCurveAnalyzer analyzer; - analyzer.analyzeAdresses(allAddressesUsedInCurveCollection()); - - if (analyzer.summaryCases().size() == 1) + auto sumCases = allSummaryCasesUsedInCurveCollection(); + if (sumCases.size() == 1) { - std::set sumCases = analyzer.summaryCases(); - if (sumCases.find(m_summaryCase) == sumCases.end()) { m_summaryCase = *(sumCases.begin()); @@ -524,6 +515,9 @@ void RimSummaryPlotSourceStepping::updateUiFromCurves() } } + RiaSummaryCurveAnalyzer analyzer; + analyzer.analyzeAdresses(allAddressesUsedInCurveCollection()); + RifEclipseSummaryAddress::SummaryVarCategory category = RifEclipseSummaryAddress::SUMMARY_INVALID; { if (analyzer.categories().size() == 1) @@ -593,7 +587,8 @@ caf::PdmFieldHandle* RimSummaryPlotSourceStepping::fieldToModify() // A pointer field is no a value field, so this must be improved // to be able to step between summary cases - if (analyzer.summaryCases().size() == 1) + auto sumCases = allSummaryCasesUsedInCurveCollection(); + if (sumCases.size() == 1) { RimProject* proj = RiaApplication::instance()->project(); if (proj->allSummaryCases().size() > 1) @@ -616,7 +611,7 @@ caf::PdmValueField* RimSummaryPlotSourceStepping::valueFieldToModify() } //-------------------------------------------------------------------------------------------------- -/// +/// //-------------------------------------------------------------------------------------------------- std::set RimSummaryPlotSourceStepping::allAddressesUsedInCurveCollection() const { @@ -642,6 +637,33 @@ std::set RimSummaryPlotSourceStepping::allAddressesUse return addresses; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::set RimSummaryPlotSourceStepping::allSummaryCasesUsedInCurveCollection() const +{ + std::set sumCases; + + RimSummaryCurveCollection* curveCollection = nullptr; + this->firstAncestorOrThisOfTypeAsserted(curveCollection); + + auto curves = curveCollection->curves(); + for (auto c : curves) + { + if (isYAxisStepping()) + { + sumCases.insert(c->summaryCaseY()); + } + + if (isXAxisStepping()) + { + sumCases.insert(c->summaryCaseX()); + } + } + + return sumCases; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -670,6 +692,25 @@ bool RimSummaryPlotSourceStepping::isYAxisStepping() const return false; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaSummaryCurveAnalyzer* RimSummaryPlotSourceStepping::analyzerForReader(RifSummaryReaderInterface* reader) +{ + if (!reader) + return nullptr; + + if (m_curveAnalyzerForReader.first != reader) + { + RiaSummaryCurveAnalyzer analyzer; + m_curveAnalyzerForReader = std::make_pair(reader, analyzer); + } + + m_curveAnalyzerForReader.second.analyzeAdresses(reader->allResultAddresses()); + + return &m_curveAnalyzerForReader.second; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h index f2fab6f7bd..fa83705f3f 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h @@ -18,6 +18,7 @@ #pragma once +#include "RiaSummaryCurveAnalyzer.h" #include "RifEclipseSummaryAddress.h" #include "cafPdmField.h" @@ -77,10 +78,13 @@ private: caf::PdmValueField* valueFieldToModify(); std::set allAddressesUsedInCurveCollection() const; + std::set allSummaryCasesUsedInCurveCollection() const; bool isXAxisStepping() const; bool isYAxisStepping() const; + RiaSummaryCurveAnalyzer* analyzerForReader(RifSummaryReaderInterface* reader); + private: caf::PdmPtrField m_summaryCase; caf::PdmField m_wellName; @@ -88,4 +92,6 @@ private: caf::PdmField m_region; caf::PdmField m_quantity; SourceSteppingType m_sourceSteppingType; + + std::pair m_curveAnalyzerForReader; }; From 68bcd5253b8b8d89df47ea4dedc1442c4fbbcc84 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 1 Dec 2017 13:37:01 +0100 Subject: [PATCH 18/38] #2170 Summary Plot : Show info text when no common identifier is detected --- .../Summary/RimSummaryPlotSourceStepping.cpp | 29 ++++++++++++++++++- .../Summary/RimSummaryPlotSourceStepping.h | 1 + 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp index 0f8dbf69d3..877c8a1f38 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp @@ -50,6 +50,11 @@ RimSummaryPlotSourceStepping::RimSummaryPlotSourceStepping() : m_sourceSteppingT CAF_PDM_InitFieldNoDefault(&m_wellGroupName, "GroupName", "Group Name", "", "", ""); CAF_PDM_InitFieldNoDefault(&m_region, "Region", "Region", "", "", ""); CAF_PDM_InitFieldNoDefault(&m_quantity, "Quantities", "Quantity", "", "", ""); + + CAF_PDM_InitFieldNoDefault(&m_placeholderForLabel, "Placeholder", "", "", "", ""); + m_placeholderForLabel = "No common identifiers detected"; + m_placeholderForLabel.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::TOP); + m_placeholderForLabel.uiCapability()->setUiReadOnly(true); // clang-format on } @@ -219,12 +224,16 @@ void RimSummaryPlotSourceStepping::defineUiOrdering(QString uiConfigName, caf::P QList RimSummaryPlotSourceStepping::calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly) { + if (fieldNeedingOptions == &m_placeholderForLabel) + { + return QList(); + } + if (fieldNeedingOptions == &m_summaryCase) { QList options; RimProject* proj = RiaApplication::instance()->project(); - for (auto sumCase : proj->allSummaryCases()) { options.append(caf::PdmOptionItemInfo(sumCase->caseName(), sumCase)); @@ -499,6 +508,9 @@ void RimSummaryPlotSourceStepping::updateUiFromCurves() m_wellGroupName.uiCapability()->setUiHidden(true); m_region.uiCapability()->setUiHidden(true); m_quantity.uiCapability()->setUiHidden(true); + m_placeholderForLabel.uiCapability()->setUiHidden(true); + + bool commonIdentifierFound = false; auto sumCases = allSummaryCasesUsedInCurveCollection(); if (sumCases.size() == 1) @@ -512,6 +524,8 @@ void RimSummaryPlotSourceStepping::updateUiFromCurves() if (proj->allSummaryCases().size() > 1) { m_summaryCase.uiCapability()->setUiHidden(false); + + commonIdentifierFound = true; } } @@ -533,6 +547,8 @@ void RimSummaryPlotSourceStepping::updateUiFromCurves() QString txt = QString::fromStdString(*(analyzer.wellNames().begin())); m_wellName = txt; m_wellName.uiCapability()->setUiHidden(false); + + commonIdentifierFound = true; } if (analyzer.wellGroupNames().size() == 1) @@ -540,12 +556,16 @@ void RimSummaryPlotSourceStepping::updateUiFromCurves() QString txt = QString::fromStdString(*(analyzer.wellGroupNames().begin())); m_wellGroupName = txt; m_wellGroupName.uiCapability()->setUiHidden(false); + + commonIdentifierFound = true; } if (analyzer.regionNumbers().size() == 1) { m_region = *(analyzer.regionNumbers().begin()); m_region.uiCapability()->setUiHidden(false); + + commonIdentifierFound = true; } if (analyzer.quantities().size() == 1) @@ -553,8 +573,15 @@ void RimSummaryPlotSourceStepping::updateUiFromCurves() QString txt = QString::fromStdString(*(analyzer.quantities().begin())); m_quantity = txt; m_quantity.uiCapability()->setUiHidden(false); + + commonIdentifierFound = true; } } + + if (!commonIdentifierFound) + { + m_placeholderForLabel.uiCapability()->setUiHidden(false); + } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h index fa83705f3f..c8c6cbd5a3 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h @@ -91,6 +91,7 @@ private: caf::PdmField m_wellGroupName; caf::PdmField m_region; caf::PdmField m_quantity; + caf::PdmField m_placeholderForLabel; SourceSteppingType m_sourceSteppingType; std::pair m_curveAnalyzerForReader; From a5b361f8c994ecdacab4821555982b935c2effef Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 1 Dec 2017 13:55:36 +0100 Subject: [PATCH 19/38] #2170 Summary Cross Plot : Show/hide toolbar based on active view --- .../UserInterface/RiuMainPlotWindow.cpp | 36 +++++++++++-------- .../UserInterface/RiuMainPlotWindow.h | 2 +- .../cafPdmUiToolBarEditor.cpp | 22 ++++++++++++ .../cafUserInterface/cafPdmUiToolBarEditor.h | 3 ++ 4 files changed, 47 insertions(+), 16 deletions(-) diff --git a/ApplicationCode/UserInterface/RiuMainPlotWindow.cpp b/ApplicationCode/UserInterface/RiuMainPlotWindow.cpp index e8942c8ce1..ce1a4b5eae 100644 --- a/ApplicationCode/UserInterface/RiuMainPlotWindow.cpp +++ b/ApplicationCode/UserInterface/RiuMainPlotWindow.cpp @@ -121,7 +121,7 @@ void RiuMainPlotWindow::cleanupGuiBeforeProjectClose() cleanUpTemporaryWidgets(); - m_summaryPlotToolBar->clear(); + m_summaryPlotToolBarEditor->clear(); setWindowTitle("Plots - ResInsight"); } @@ -307,7 +307,8 @@ void RiuMainPlotWindow::createToolBars() } } - m_summaryPlotToolBar = new caf::PdmUiToolBarEditor("Summary Plot", this); + m_summaryPlotToolBarEditor = new caf::PdmUiToolBarEditor("Summary Plot", this); + m_summaryPlotToolBarEditor->hide(); } //-------------------------------------------------------------------------------------------------- @@ -525,6 +526,24 @@ void RiuMainPlotWindow::slotSubWindowActivated(QMdiSubWindow* subWindow) m_activePlotViewWindow = viewWindow; } + + RimSummaryPlot* summaryPlot = dynamic_cast(viewWindow); + if (summaryPlot) + { + std::vector toolBarFields; + toolBarFields = summaryPlot->summaryCurveCollection()->fieldsToShowInToolbar(); + + m_summaryPlotToolBarEditor->setFields(toolBarFields); + m_summaryPlotToolBarEditor->updateUi(); + + m_summaryPlotToolBarEditor->show(); + } + else + { + m_summaryPlotToolBarEditor->clear(); + + m_summaryPlotToolBarEditor->hide(); + } } //-------------------------------------------------------------------------------------------------- @@ -598,19 +617,6 @@ void RiuMainPlotWindow::selectedObjectsChanged() } m_pdmUiPropertyView->showProperties(firstSelectedObject); - std::vector toolBarFields; - if (firstSelectedObject) - { - RimSummaryPlot* summaryPlot = nullptr; - firstSelectedObject->firstAncestorOrThisOfType(summaryPlot); - if (summaryPlot) - { - toolBarFields = summaryPlot->summaryCurveCollection()->fieldsToShowInToolbar(); - } - } - m_summaryPlotToolBar->setFields(toolBarFields); - m_summaryPlotToolBar->updateUi(); - if (uiItems.size() == 1) { // Find the reservoir view or the Plot that the selected item is within diff --git a/ApplicationCode/UserInterface/RiuMainPlotWindow.h b/ApplicationCode/UserInterface/RiuMainPlotWindow.h index d28fbe1a45..f6e97c2542 100644 --- a/ApplicationCode/UserInterface/RiuMainPlotWindow.h +++ b/ApplicationCode/UserInterface/RiuMainPlotWindow.h @@ -119,7 +119,7 @@ private: QMenu* m_windowMenu; caf::PdmUiTreeView* m_projectTreeView; - caf::PdmUiToolBarEditor* m_summaryPlotToolBar; + caf::PdmUiToolBarEditor* m_summaryPlotToolBarEditor; std::unique_ptr m_dragDropInterface; caf::PdmUiPropertyView* m_pdmUiPropertyView; diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp index 716f6ea28c..ae7c1d3e1c 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp @@ -185,4 +185,26 @@ void PdmUiToolBarEditor::clear() m_actions.clear(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void PdmUiToolBarEditor::show() +{ + if (m_toolbar) + { + m_toolbar->show(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void PdmUiToolBarEditor::hide() +{ + if (m_toolbar) + { + m_toolbar->hide(); + } +} + } // end namespace caf diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h index 6d9684bb77..aa3285b123 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h @@ -63,6 +63,9 @@ public: void setFields(std::vector& fields); void clear(); + + void show(); + void hide(); private: virtual void configureAndUpdateUi(const QString& uiConfigName) override; From eb6b0997c80e5c6a08841c8488eea8fc3c4df4ca Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 1 Dec 2017 15:15:43 +0100 Subject: [PATCH 20/38] #2170 Summary Cross Plot : Improve update and visibility of UI when stepping --- .../Summary/RimSummaryCurveCollection.cpp | 2 +- .../Summary/RimSummaryPlotSourceStepping.cpp | 14 +++++- .../UserInterface/RiuMainPlotWindow.cpp | 46 ++++++++++++------- .../UserInterface/RiuMainPlotWindow.h | 2 + .../cafPdmUiToolBarEditor.cpp | 27 +++++++++++ .../cafUserInterface/cafPdmUiToolBarEditor.h | 1 + 6 files changed, 73 insertions(+), 19 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp index cf076ca72e..e9207eb2c6 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp @@ -353,7 +353,7 @@ void RimSummaryCurveCollection::defineUiOrdering(QString uiConfigName, caf::PdmU } { - auto group = uiOrdering.addNewGroup("Union Source Stepping"); + auto group = uiOrdering.addNewGroup("XY Union Source Stepping"); m_unionSourceStepping()->uiOrdering(uiConfigName, *group); } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp index 877c8a1f38..9cf57e1d29 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp @@ -27,10 +27,12 @@ #include "RimProject.h" #include "RimSummaryCase.h" #include "RimSummaryCaseMainCollection.h" +#include "RimSummaryCrossPlot.h" #include "RimSummaryCurve.h" #include "RimSummaryCurveCollection.h" #include "RimSummaryPlot.h" +#include "RiuMainPlotWindow.h" #include "cafPdmUiComboBoxEditor.h" #include "cafPdmUiItem.h" #include "cafPdmUiListEditor.h" @@ -449,8 +451,18 @@ void RimSummaryPlotSourceStepping::fieldChangedByUi(const caf::PdmFieldHandle* c this->firstAncestorOrThisOfTypeAsserted(summaryPlot); summaryPlot->updatePlotTitle(); - summaryPlot->loadDataAndUpdate(); + + RimSummaryCrossPlot* summaryCrossPlot = dynamic_cast(summaryPlot); + if (summaryCrossPlot) + { + // Trigger update of curve collection (and summary toolbar in main window), as the visibility of combo boxes might + // have been changed due to the updates in this function + curveCollection->updateConnectedEditors(); + + RiuMainPlotWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + mainPlotWindow->updateSummaryPlotToolBar(); + } } } diff --git a/ApplicationCode/UserInterface/RiuMainPlotWindow.cpp b/ApplicationCode/UserInterface/RiuMainPlotWindow.cpp index ce1a4b5eae..8eb1b5798d 100644 --- a/ApplicationCode/UserInterface/RiuMainPlotWindow.cpp +++ b/ApplicationCode/UserInterface/RiuMainPlotWindow.cpp @@ -416,6 +416,34 @@ void RiuMainPlotWindow::addToTemporaryWidgets(QWidget* widget) m_temporaryWidgets.push_back(widget); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuMainPlotWindow::updateSummaryPlotToolBar() +{ + RimSummaryPlot* summaryPlot = dynamic_cast(m_activePlotViewWindow); + if (summaryPlot) + { + std::vector toolBarFields; + toolBarFields = summaryPlot->summaryCurveCollection()->fieldsToShowInToolbar(); + + if (!m_summaryPlotToolBarEditor->isEditorDataValid(toolBarFields)) + { + m_summaryPlotToolBarEditor->setFields(toolBarFields); + m_summaryPlotToolBarEditor->updateUi(); + } + + m_summaryPlotToolBarEditor->show(); + } + else + { + m_summaryPlotToolBarEditor->clear(); + + m_summaryPlotToolBarEditor->hide(); + } + +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -527,23 +555,7 @@ void RiuMainPlotWindow::slotSubWindowActivated(QMdiSubWindow* subWindow) m_activePlotViewWindow = viewWindow; } - RimSummaryPlot* summaryPlot = dynamic_cast(viewWindow); - if (summaryPlot) - { - std::vector toolBarFields; - toolBarFields = summaryPlot->summaryCurveCollection()->fieldsToShowInToolbar(); - - m_summaryPlotToolBarEditor->setFields(toolBarFields); - m_summaryPlotToolBarEditor->updateUi(); - - m_summaryPlotToolBarEditor->show(); - } - else - { - m_summaryPlotToolBarEditor->clear(); - - m_summaryPlotToolBarEditor->hide(); - } + updateSummaryPlotToolBar(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/UserInterface/RiuMainPlotWindow.h b/ApplicationCode/UserInterface/RiuMainPlotWindow.h index f6e97c2542..697a0f7fc7 100644 --- a/ApplicationCode/UserInterface/RiuMainPlotWindow.h +++ b/ApplicationCode/UserInterface/RiuMainPlotWindow.h @@ -83,6 +83,8 @@ public: void addToTemporaryWidgets(QWidget* widget); + void updateSummaryPlotToolBar(); + protected: virtual void closeEvent(QCloseEvent* event); diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp index ae7c1d3e1c..1647d760d3 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp @@ -73,6 +73,33 @@ PdmUiToolBarEditor::~PdmUiToolBarEditor() clear(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool PdmUiToolBarEditor::isEditorDataValid(const std::vector& fields) const +{ + if (m_fields.size() == fields.size() && + m_fieldViews.size() == fields.size()) + { + bool equalContent = true; + + for (size_t i = 0; i < m_fields.size(); i++) + { + if (m_fields[i] != fields[i]) + { + equalContent = false; + } + } + + if (equalContent) + { + return true; + } + } + + return false; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h index aa3285b123..fc9a4f4e4f 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h @@ -61,6 +61,7 @@ public: PdmUiToolBarEditor(const QString& title, QMainWindow* mainWindow); ~PdmUiToolBarEditor(); + bool isEditorDataValid(const std::vector& fields) const; void setFields(std::vector& fields); void clear(); From 83a272296c5c50a19dc9151573370286ae160675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Jensen?= Date: Fri, 1 Dec 2017 15:14:47 +0100 Subject: [PATCH 21/38] 2108 summary plot. Display short name in plot for calculated curves --- .../SummaryPlotCommands/RicSummaryCurveCreator.cpp | 12 ++++++++++++ ApplicationCode/ProjectDataModel/RimPlotCurve.cpp | 9 +++++++++ ApplicationCode/ProjectDataModel/RimPlotCurve.h | 1 + .../Summary/RimSummaryCurvesCalculator.cpp | 4 ++-- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp index 45d72e8b27..884c356809 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp @@ -353,6 +353,18 @@ void RicSummaryCurveCreator::updatePreviewCurvesFromCurveDefinitions(const std:: curve->applyCurveAutoNameSettings(*m_curveNameConfig()); m_previewPlot->addCurveNoUpdate(curve); curveLookCalc.setupCurveLook(curve); + + if (curveDef.summaryAddress().category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED) + { + // Use short version of calculated curves name + std::string fullName = curveDef.summaryAddress().quantityName(); + size_t firstSpace = fullName.find_first_of(' '); + QString shortName = firstSpace != std::string::npos ? + QString::fromStdString(fullName.substr(0, firstSpace)) : + QString::fromStdString(fullName); + + curve->setCustomCurveName(shortName); + } } m_previewPlot->loadDataAndUpdate(); diff --git a/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp b/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp index 208c921970..cbcb93bb8e 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp @@ -552,6 +552,15 @@ void RimPlotCurve::setZOrder(double z) } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurve::setCustomCurveName(const QString& customName) +{ + m_isUsingAutoName = false; + m_customCurveName = customName; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimPlotCurve.h b/ApplicationCode/ProjectDataModel/RimPlotCurve.h index ee58669c7e..89b753fa85 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotCurve.h +++ b/ApplicationCode/ProjectDataModel/RimPlotCurve.h @@ -99,6 +99,7 @@ public: void showLegend(bool show); void setZOrder(double z); + void setCustomCurveName(const QString& customName); protected: diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp index 94b59d2f73..5a4aecf0ea 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp @@ -199,7 +199,7 @@ QString RimSummaryPlotYAxisFormatter::autoAxisTitle() const { for (RimSummaryCurve* rimCurve : m_summaryCurves) { - unitToQuantityNameMap[rimCurve->unitNameX()].insert(rimCurve->summaryAddressX().quantityName()); + unitToQuantityNameMap[rimCurve->unitNameX()].insert(rimCurve->curveName().toStdString()); } } else @@ -208,7 +208,7 @@ QString RimSummaryPlotYAxisFormatter::autoAxisTitle() const { if ( rimCurve->axisY() == this->m_axisProperties->plotAxisType() ) { - unitToQuantityNameMap[rimCurve->unitNameY()].insert(rimCurve->summaryAddressY().quantityName()); + unitToQuantityNameMap[rimCurve->unitNameY()].insert(rimCurve->curveName().toStdString()); } } } From 8281391fb9b45789213c275e2e9208ac54690d2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Jensen?= Date: Fri, 1 Dec 2017 15:36:46 +0100 Subject: [PATCH 22/38] #2211 Curve calc. Create new calculation if empty --- .../RicSummaryCurveCalculator.cpp | 17 +++++++++++++++-- .../RicSummaryCurveCalculator.h | 2 ++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.cpp index 55f7a60ce5..21994356b2 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.cpp @@ -51,6 +51,11 @@ RicSummaryCurveCalculator::RicSummaryCurveCalculator() RicSummaryCurveCalculator::assignPushButtonEditor(&m_deleteCalculation); m_calcContextMenuMgr = std::unique_ptr(new RiuCalculationsContextMenuManager()); + + if (!m_currentCalculation) + { + createNewCalculation(); + } } //-------------------------------------------------------------------------------------------------- @@ -119,8 +124,7 @@ void RicSummaryCurveCalculator::fieldChangedByUi(const caf::PdmFieldHandle* chan { m_newCalculation = false; - RimSummaryCalculation* rimCalc = calculationCollection()->addCalculation(); - m_currentCalculation = rimCalc; + createNewCalculation(); this->updateConnectedEditors(); } @@ -288,3 +292,12 @@ void RicSummaryCurveCalculator::onEditorWidgetsCreated() m_calcContextMenuMgr->attachWidget(widget, this); } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicSummaryCurveCalculator::createNewCalculation() +{ + RimSummaryCalculation* rimCalc = calculationCollection()->addCalculation(); + m_currentCalculation = rimCalc; +} diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.h b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.h index 6aa420d59b..3f92c00d20 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.h +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.h @@ -56,6 +56,8 @@ private: virtual void onEditorWidgetsCreated(); private: + void createNewCalculation(); + // TODO : Move to a common caf helper class static void assignPushButtonEditor(caf::PdmFieldHandle* fieldHandle); static void assignPushButtonEditorText(caf::PdmUiEditorAttribute* attribute, const QString& text); From a5300032e9670903a5d3e1d4edfca9ec1fe58bed Mon Sep 17 00:00:00 2001 From: Rebecca Cox Date: Fri, 1 Dec 2017 15:38:29 +0100 Subject: [PATCH 23/38] #2213 Formations: Select formation on a case, only if a single file is imported --- ApplicationCode/Commands/RicImportFormationNamesFeature.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ApplicationCode/Commands/RicImportFormationNamesFeature.cpp b/ApplicationCode/Commands/RicImportFormationNamesFeature.cpp index 34ee624154..aac802428e 100644 --- a/ApplicationCode/Commands/RicImportFormationNamesFeature.cpp +++ b/ApplicationCode/Commands/RicImportFormationNamesFeature.cpp @@ -74,9 +74,10 @@ void RicImportFormationNamesFeature::onActionTriggered(bool isChecked) } // For each file, find existing Formation names item, or create new - RimFormationNames* formationName = fomNameColl->importFiles(fileNames); + if (fileNames.size() > 1) return; + std::vector cases; proj->allCases(cases); From 32c1fa25d5749a2cf8daed07a9ea7d9750d1acbb Mon Sep 17 00:00:00 2001 From: Rebecca Cox Date: Fri, 1 Dec 2017 15:39:34 +0100 Subject: [PATCH 24/38] Guard for if eclipseCaseData is null --- .../RimWellLogExtractionCurve.cpp | 28 +++++++++++-------- .../ProjectDataModel/RimWellLogRftCurve.cpp | 2 ++ .../ProjectDataModel/RimWellLogTrack.cpp | 3 +- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurve.cpp b/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurve.cpp index 6a4aaa694c..66cfc8885e 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurve.cpp @@ -312,19 +312,23 @@ void RimWellLogExtractionCurve::onLoadDataAndUpdate(bool updateParentPlot) RimWellLogPlotCollection* wellLogCollection = mainPlotCollection->wellLogPlotCollection(); cvf::ref eclExtractor; - if ( m_trajectoryType == WELL_PATH ) + + if (eclipseCase) { - eclExtractor = wellLogCollection->findOrCreateExtractor(m_wellPath, eclipseCase); - } - else - { - if (m_branchIndex >= 0 && m_branchIndex < static_cast(m_generatedSimulationWellPathBranches.size()) ) + if (m_trajectoryType == WELL_PATH) { - eclExtractor = wellLogCollection->findOrCreateSimWellExtractor(m_simWellName, - eclipseCase->caseUserDescription(), - m_generatedSimulationWellPathBranches[m_branchIndex].p(), - eclipseCase->eclipseCaseData()); - isUsingPseudoLength = true; + eclExtractor = wellLogCollection->findOrCreateExtractor(m_wellPath, eclipseCase); + } + else + { + if (m_branchIndex >= 0 && m_branchIndex < static_cast(m_generatedSimulationWellPathBranches.size())) + { + eclExtractor = wellLogCollection->findOrCreateSimWellExtractor(m_simWellName, + eclipseCase->caseUserDescription(), + m_generatedSimulationWellPathBranches[m_branchIndex].p(), + eclipseCase->eclipseCaseData()); + isUsingPseudoLength = true; + } } } cvf::ref geomExtractor = wellLogCollection->findOrCreateExtractor(m_wellPath, geomCase); @@ -335,7 +339,7 @@ void RimWellLogExtractionCurve::onLoadDataAndUpdate(bool updateParentPlot) RiaDefines::DepthUnitType depthUnit = RiaDefines::UNIT_METER; - if (eclExtractor.notNull()) + if (eclExtractor.notNull() && eclipseCase) { measuredDepthValues = eclExtractor->measuredDepth(); tvDepthValues = eclExtractor->trueVerticalDepth(); diff --git a/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp b/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp index 199174dc52..144ab10123 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp @@ -465,8 +465,10 @@ RifReaderEclipseRft* RimWellLogRftCurve::rftReader() const //-------------------------------------------------------------------------------------------------- RigEclipseWellLogExtractor* RimWellLogRftCurve::extractor() { + if (!m_eclipseResultCase()) return nullptr; RifReaderEclipseRft* reader = rftReader(); if (!reader) return nullptr; + RimMainPlotCollection* mainPlotCollection; this->firstAncestorOrThisOfTypeAsserted(mainPlotCollection); diff --git a/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp b/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp index cc635b23a5..5a6361c149 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp @@ -978,7 +978,8 @@ RigEclipseWellLogExtractor* RimWellLogTrack::createSimWellExtractor(RimWellLogPl if (!wellLogCollection) return nullptr; RimEclipseCase* eclipseCase = dynamic_cast(rimCase); - + if (!eclipseCase) return nullptr; + RimProject* proj = RiaApplication::instance()->project(); std::vector wellPaths = proj->simulationWellBranches(simWellName); From 04a80864b1d515f8474b67583b743a669e0f08e3 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 1 Dec 2017 21:20:39 +0100 Subject: [PATCH 25/38] AppFwk : Make sure uiOrdering is not called more than once --- .../cafPdmUiToolBarEditor.cpp | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp index 1647d760d3..5841cc4ff7 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp @@ -74,15 +74,14 @@ PdmUiToolBarEditor::~PdmUiToolBarEditor() } //-------------------------------------------------------------------------------------------------- -/// +/// //-------------------------------------------------------------------------------------------------- bool PdmUiToolBarEditor::isEditorDataValid(const std::vector& fields) const { - if (m_fields.size() == fields.size() && - m_fieldViews.size() == fields.size()) + if (m_fields.size() == fields.size() && m_fieldViews.size() == fields.size()) { bool equalContent = true; - + for (size_t i = 0; i < m_fields.size(); i++) { if (m_fields[i] != fields[i]) @@ -105,17 +104,31 @@ bool PdmUiToolBarEditor::isEditorDataValid(const std::vector ownerUiObjects; + + for (PdmFieldHandle* field : m_fields) + { + caf::PdmUiObjectHandle* ownerUiObject = field->ownerObject()->uiCapability(); + if (ownerUiObject) + { + ownerUiObjects.insert(ownerUiObject); + } + } + + PdmUiOrdering config; + for (caf::PdmUiObjectHandle* ownerUiObject : ownerUiObjects) + { + ownerUiObject->uiOrdering(uiConfigName, config); + } + } + for (PdmFieldHandle* field : m_fields) { PdmUiFieldEditorHandle* fieldEditor = nullptr; - caf::PdmUiObjectHandle* ownerUiObject = uiObj(field->ownerObject()); - if (ownerUiObject) - { - PdmUiOrdering config; - ownerUiObject->uiOrdering(uiConfigName, config); - } - // Find or create FieldEditor std::map::iterator it; it = m_fieldViews.find(field->keyword()); @@ -213,7 +226,7 @@ void PdmUiToolBarEditor::clear() } //-------------------------------------------------------------------------------------------------- -/// +/// //-------------------------------------------------------------------------------------------------- void PdmUiToolBarEditor::show() { @@ -224,7 +237,7 @@ void PdmUiToolBarEditor::show() } //-------------------------------------------------------------------------------------------------- -/// +/// //-------------------------------------------------------------------------------------------------- void PdmUiToolBarEditor::hide() { From c0109361ef5a77276d7beda3395e6b418346c375 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 4 Dec 2017 08:26:23 +0100 Subject: [PATCH 26/38] #2170 Summary Cross Plot : Add keyboard modifiers to source stepping --- .../Summary/RimSummaryCurveCollection.cpp | 68 +++++++ .../Summary/RimSummaryCurveCollection.h | 3 + .../Summary/RimSummaryPlotSourceStepping.cpp | 170 +++++++++++++++++- .../Summary/RimSummaryPlotSourceStepping.h | 11 ++ .../UserInterface/RiuSummaryQwtPlot.cpp | 21 +-- .../cafPdmUiComboBoxEditor.cpp | 11 ++ .../cafUserInterface/cafPdmUiComboBoxEditor.h | 3 + 7 files changed, 269 insertions(+), 18 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp index e9207eb2c6..d43b1b13f6 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp @@ -35,6 +35,8 @@ #include "cafPdmUiTreeViewEditor.h" +#include + CAF_PDM_SOURCE_INIT(RimSummaryCurveCollection, "RimSummaryCurveCollection"); //-------------------------------------------------------------------------------------------------- @@ -319,6 +321,72 @@ QString RimSummaryCurveCollection::compileAutoPlotTitle() const return title; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryCurveCollection::handleKeyPressEvent(QKeyEvent* keyEvent) +{ + if (!keyEvent) return; + + RimSummaryPlotSourceStepping* sourceStepping = nullptr; + { + RimSummaryCrossPlot* summaryCrossPlot = nullptr; + this->firstAncestorOrThisOfType(summaryCrossPlot); + + if (summaryCrossPlot) + { + sourceStepping = m_unionSourceStepping(); + } + else + { + sourceStepping = m_ySourceStepping(); + } + } + + if (keyEvent->key() == Qt::Key_PageUp) + { + if (keyEvent->modifiers() & Qt::ShiftModifier) + { + sourceStepping->applyPrevCase(); + + keyEvent->accept(); + } + else if (keyEvent->modifiers() & Qt::ControlModifier) + { + sourceStepping->applyPrevOtherIdentifier(); + + keyEvent->accept(); + } + else + { + sourceStepping->applyPrevQuantity(); + + keyEvent->accept(); + } + } + else if (keyEvent->key() == Qt::Key_PageDown) + { + if (keyEvent->modifiers() & Qt::ShiftModifier) + { + sourceStepping->applyNextCase(); + + keyEvent->accept(); + } + else if (keyEvent->modifiers() & Qt::ControlModifier) + { + sourceStepping->applyNextOtherIdentifier(); + + keyEvent->accept(); + } + else + { + sourceStepping->applyNextQuantity(); + + keyEvent->accept(); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.h index 87f97fd105..882bda59d2 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.h @@ -30,6 +30,7 @@ class QwtPlotCurve; class RimSummaryCase; class RimSummaryCurve; class RimSummaryPlotSourceStepping; +class QKeyEvent; //================================================================================================== /// @@ -66,6 +67,8 @@ public: QString compileAutoPlotTitle() const; + void handleKeyPressEvent(QKeyEvent* keyEvent); + private: caf::PdmFieldHandle* objectToggleField(); virtual void defineObjectEditorAttribute(QString uiConfigName, diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp index 9cf57e1d29..b737a015ce 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp @@ -33,6 +33,7 @@ #include "RimSummaryPlot.h" #include "RiuMainPlotWindow.h" + #include "cafPdmUiComboBoxEditor.h" #include "cafPdmUiItem.h" #include "cafPdmUiListEditor.h" @@ -69,6 +70,107 @@ void RimSummaryPlotSourceStepping::setSourceSteppingType(SourceSteppingType sour m_sourceSteppingType = sourceSteppingType; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlotSourceStepping::applyNextCase() +{ + RimProject* proj = RiaApplication::instance()->project(); + + auto summaryCases = proj->allSummaryCases(); + if (summaryCases.size() < 1) + return; + + auto currentCase = std::find(summaryCases.begin(), summaryCases.end(), m_summaryCase()); + + if (currentCase != summaryCases.end()) + { + currentCase++; + if (currentCase != summaryCases.end()) + { + m_summaryCase = *currentCase; + } + } + else + { + m_summaryCase = summaryCases[0]; + } + + fieldChangedByUi(&m_summaryCase, QVariant(), QVariant()); + m_summaryCase.uiCapability()->updateConnectedEditors(); + + RimSummaryCurveCollection* curveCollection = nullptr; + this->firstAncestorOrThisOfTypeAsserted(curveCollection); + + curveCollection->updateConnectedEditors(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlotSourceStepping::applyPrevCase() +{ + RimProject* proj = RiaApplication::instance()->project(); + + auto summaryCases = proj->allSummaryCases(); + if (summaryCases.size() < 1) + return; + + auto currentCase = std::find(summaryCases.begin(), summaryCases.end(), m_summaryCase()); + + if (currentCase != summaryCases.end() && currentCase != summaryCases.begin()) + { + currentCase--; + m_summaryCase = *currentCase; + } + else + { + m_summaryCase = summaryCases[0]; + } + + fieldChangedByUi(&m_summaryCase, QVariant(), QVariant()); + m_summaryCase.uiCapability()->updateConnectedEditors(); + + RimSummaryCurveCollection* curveCollection = nullptr; + this->firstAncestorOrThisOfTypeAsserted(curveCollection); + + curveCollection->updateConnectedEditors(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlotSourceStepping::applyNextQuantity() +{ + modifyCurrentIndex(&m_quantity, 1); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlotSourceStepping::applyPrevQuantity() +{ + modifyCurrentIndex(&m_quantity, -1); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlotSourceStepping::applyNextOtherIdentifier() +{ + caf::PdmValueField* valueField = valueFieldToModify(); + modifyCurrentIndex(valueField, 1); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlotSourceStepping::applyPrevOtherIdentifier() +{ + caf::PdmValueField* valueField = valueFieldToModify(); + modifyCurrentIndex(valueField, -1); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -611,7 +713,7 @@ caf::PdmFieldHandle* RimSummaryPlotSourceStepping::fieldToModify() if (analyzer.wellGroupNames().size() == 1) { - return &m_wellName; + return &m_wellGroupName; } if (analyzer.regionNumbers().size() == 1) @@ -750,6 +852,51 @@ RiaSummaryCurveAnalyzer* RimSummaryPlotSourceStepping::analyzerForReader(RifSumm return &m_curveAnalyzerForReader.second; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlotSourceStepping::modifyCurrentIndex(caf::PdmValueField* valueField, int indexOffset) +{ + if (valueField) + { + bool useOptionsOnly = true; + + QList options = calculateValueOptions(valueField, nullptr); + if (options.isEmpty()) + { + return; + } + + auto uiVariant = valueField->uiCapability()->toUiBasedQVariant(); + + int currentIndex = -1; + for (int i = 0; i < options.size(); i++) + { + if (uiVariant == options[i].optionUiText()) + { + currentIndex = i; + } + } + + if (currentIndex == -1) + { + currentIndex = 0; + } + + int nextIndex = currentIndex + indexOffset; + if (nextIndex < options.size() && nextIndex > -1) + { + auto optionValue = options[nextIndex].value(); + + QVariant currentValue = valueField->toQVariant(); + + valueField->setFromQVariant(optionValue); + + valueField->uiCapability()->notifyFieldChanged(currentValue, optionValue); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -760,5 +907,26 @@ void RimSummaryPlotSourceStepping::defineEditorAttribute(const caf::PdmFieldHand if (myAttr) { myAttr->showPreviousAndNextButtons = true; + + QString modifierText; + + if (field == &m_summaryCase) + { + modifierText = ("(Shift+"); + } + else if (field == &m_wellName || field == &m_wellGroupName || field == &m_region) + { + modifierText = ("(Ctrl+"); + } + else if (field == &m_quantity) + { + modifierText = ("("); + } + + if (!modifierText.isEmpty()) + { + myAttr->nextButtonText = "Next " + modifierText + "PgDown)"; + myAttr->prevButtonText = "Previous " + modifierText + "PgUp)"; + } } } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h index c8c6cbd5a3..c01a4de7e0 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h @@ -53,6 +53,15 @@ public: void setSourceSteppingType(SourceSteppingType sourceSteppingType); + void applyNextCase(); + void applyPrevCase(); + + void applyNextQuantity(); + void applyPrevQuantity(); + + void applyNextOtherIdentifier(); + void applyPrevOtherIdentifier(); + void applyNextIdentifier(); void applyPreviousIdentifier(); @@ -85,6 +94,8 @@ private: RiaSummaryCurveAnalyzer* analyzerForReader(RifSummaryReaderInterface* reader); + void modifyCurrentIndex(caf::PdmValueField* valueField, int indexOffset); + private: caf::PdmPtrField m_summaryCase; caf::PdmField m_wellName; diff --git a/ApplicationCode/UserInterface/RiuSummaryQwtPlot.cpp b/ApplicationCode/UserInterface/RiuSummaryQwtPlot.cpp index 029f570a5d..d25812a444 100644 --- a/ApplicationCode/UserInterface/RiuSummaryQwtPlot.cpp +++ b/ApplicationCode/UserInterface/RiuSummaryQwtPlot.cpp @@ -23,6 +23,7 @@ #include "RimContextCommandBuilder.h" #include "RimProject.h" #include "RimSummaryCurve.h" +#include "RimSummaryCurveCollection.h" #include "RimSummaryPlot.h" #include "RiuMainPlotWindow.h" @@ -186,24 +187,10 @@ void RiuSummaryQwtPlot::contextMenuEvent(QContextMenuEvent* event) //-------------------------------------------------------------------------------------------------- void RiuSummaryQwtPlot::keyPressEvent(QKeyEvent* keyEvent) { - if (keyEvent->key() == Qt::Key_PageUp) + if (m_plotDefinition && m_plotDefinition->summaryCurveCollection()) { - if (m_plotDefinition) - { - m_plotDefinition->applyPreviousIdentifier(); - } - - keyEvent->accept(); - } - - if (keyEvent->key() == Qt::Key_PageDown) - { - if (m_plotDefinition) - { - m_plotDefinition->applyNextIdentifier(); - } - - keyEvent->accept(); + RimSummaryCurveCollection* curveColl = m_plotDefinition->summaryCurveCollection(); + curveColl->handleKeyPressEvent(keyEvent); } } diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiComboBoxEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiComboBoxEditor.cpp index 087d7a80f4..5efac2f178 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiComboBoxEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiComboBoxEditor.cpp @@ -144,6 +144,17 @@ void PdmUiComboBoxEditor::configureAndUpdateUi(const QString& uiConfigName) { m_nextItemButton->setIcon(QApplication::style()->standardIcon(QStyle::SP_ArrowDown)); } + + // Update button texts + if (!attributes.nextButtonText.isEmpty()) + { + m_nextItemButton->setToolTip(attributes.nextButtonText); + } + + if (!attributes.prevButtonText.isEmpty()) + { + m_previousItemButton->setToolTip(attributes.prevButtonText); + } } else { diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiComboBoxEditor.h b/Fwk/AppFwk/cafUserInterface/cafPdmUiComboBoxEditor.h index cbf6206e72..485f16a00a 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiComboBoxEditor.h +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiComboBoxEditor.h @@ -65,6 +65,9 @@ public: public: bool adjustWidthToContents; bool showPreviousAndNextButtons; + + QString nextButtonText; + QString prevButtonText; }; From f79e31be8f16df99bf3ee320685ff02516a200a6 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 4 Dec 2017 10:20:21 +0100 Subject: [PATCH 27/38] #2216 Disable creation of new calculation object as this causes crash Introduced in 8281391fb9b45789213c275e2e9208ac54690d2e --- .../RicSummaryCurveCalculator.cpp | 17 ++--------------- .../RicSummaryCurveCalculator.h | 2 -- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.cpp index 21994356b2..55f7a60ce5 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.cpp @@ -51,11 +51,6 @@ RicSummaryCurveCalculator::RicSummaryCurveCalculator() RicSummaryCurveCalculator::assignPushButtonEditor(&m_deleteCalculation); m_calcContextMenuMgr = std::unique_ptr(new RiuCalculationsContextMenuManager()); - - if (!m_currentCalculation) - { - createNewCalculation(); - } } //-------------------------------------------------------------------------------------------------- @@ -124,7 +119,8 @@ void RicSummaryCurveCalculator::fieldChangedByUi(const caf::PdmFieldHandle* chan { m_newCalculation = false; - createNewCalculation(); + RimSummaryCalculation* rimCalc = calculationCollection()->addCalculation(); + m_currentCalculation = rimCalc; this->updateConnectedEditors(); } @@ -292,12 +288,3 @@ void RicSummaryCurveCalculator::onEditorWidgetsCreated() m_calcContextMenuMgr->attachWidget(widget, this); } } - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicSummaryCurveCalculator::createNewCalculation() -{ - RimSummaryCalculation* rimCalc = calculationCollection()->addCalculation(); - m_currentCalculation = rimCalc; -} diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.h b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.h index 3f92c00d20..6aa420d59b 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.h +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCalculator.h @@ -56,8 +56,6 @@ private: virtual void onEditorWidgetsCreated(); private: - void createNewCalculation(); - // TODO : Move to a common caf helper class static void assignPushButtonEditor(caf::PdmFieldHandle* fieldHandle); static void assignPushButtonEditorText(caf::PdmUiEditorAttribute* attribute, const QString& text); From 99dd255ee864788869430d8bbe8f6c762badca5c Mon Sep 17 00:00:00 2001 From: Rebecca Cox Date: Mon, 4 Dec 2017 10:26:34 +0100 Subject: [PATCH 28/38] Formations: Change group name --- ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp b/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp index 5a6361c149..e01b4fd8c9 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp @@ -788,7 +788,7 @@ void RimWellLogTrack::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& { uiOrdering.add(&m_userName); - caf::PdmUiGroup* formationGroup = uiOrdering.addNewGroup("Formation Names Properties"); + caf::PdmUiGroup* formationGroup = uiOrdering.addNewGroup("Formation Names"); formationGroup->add(&m_showFormations); From 8ab70887c3d2151441a99ffd155699fdc40263f3 Mon Sep 17 00:00:00 2001 From: Rebecca Cox Date: Mon, 4 Dec 2017 10:56:57 +0100 Subject: [PATCH 29/38] #2219 Intersections: Fix max height of intersection bug --- .../Intersections/RivIntersectionGeometryGenerator.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ApplicationCode/ModelVisualization/Intersections/RivIntersectionGeometryGenerator.cpp b/ApplicationCode/ModelVisualization/Intersections/RivIntersectionGeometryGenerator.cpp index c33bc6ba25..ac362fd883 100644 --- a/ApplicationCode/ModelVisualization/Intersections/RivIntersectionGeometryGenerator.cpp +++ b/ApplicationCode/ModelVisualization/Intersections/RivIntersectionGeometryGenerator.cpp @@ -92,10 +92,8 @@ void RivIntersectionGeometryGenerator::calculateArrays() sectionBBox.add(p1); sectionBBox.add(p2); - cvf::Vec3d maxHeightVec; - double maxSectionHeight = sectionBBox.radius(); double maxSectionHeightUp; double maxSectionHeightDown; @@ -121,7 +119,7 @@ void RivIntersectionGeometryGenerator::calculateArrays() } else { - maxHeightVec = m_extrusionDirection*maxSectionHeight; + maxHeightVec = m_extrusionDirection*gridBBox.radius(); sectionBBox.add(p1 + maxHeightVec); sectionBBox.add(p1 - maxHeightVec); From 2a3276013219a708f83b73bda5f8b8290ecd9e42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Jensen?= Date: Mon, 4 Dec 2017 11:48:59 +0100 Subject: [PATCH 30/38] #2218 observed data. Save ascii parse options to project file and use settings on project load --- .../ProjectDataModel/Summary/RimCsvUserData.cpp | 11 ++++++++--- .../ProjectDataModel/Summary/RimCsvUserData.h | 5 +++-- .../Summary/RimObservedDataCollection.cpp | 15 ++++++++------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimCsvUserData.cpp b/ApplicationCode/ProjectDataModel/Summary/RimCsvUserData.cpp index bb5326779a..85c41527ba 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimCsvUserData.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimCsvUserData.cpp @@ -38,6 +38,11 @@ RimCsvUserData::RimCsvUserData() { CAF_PDM_InitObject("Observed CSV Data File", ":/Default.png", "", ""); m_summaryHeaderFilename.uiCapability()->setUiName("File"); + + CAF_PDM_InitFieldNoDefault(&m_parseOptions, "ParseOptions", "", "", "", ""); + m_parseOptions = new RicPasteAsciiDataToSummaryPlotFeatureUi(); + m_parseOptions->uiCapability()->setUiHidden(true); + m_parseOptions->uiCapability()->setUiTreeHidden(true); } //-------------------------------------------------------------------------------------------------- @@ -58,7 +63,7 @@ void RimCsvUserData::createSummaryReaderInterface() if (caf::Utils::fileExists(this->summaryHeaderFilename())) { RifCsvUserData* csvUserData = new RifCsvUserData(); - if (csvUserData->parse(this->summaryHeaderFilename(), m_parseOptions, &m_errorText)) + if (csvUserData->parse(this->summaryHeaderFilename(), m_parseOptions->parseOptions() , &m_errorText)) { m_summaryReader = csvUserData; } @@ -88,7 +93,7 @@ QString RimCsvUserData::errorMessagesFromReader() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimCsvUserData::setParseOptions(const AsciiDataParseOptions &parseOptions) +RicPasteAsciiDataToSummaryPlotFeatureUi* RimCsvUserData::parseOptions() const { - m_parseOptions = parseOptions; + return m_parseOptions(); } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimCsvUserData.h b/ApplicationCode/ProjectDataModel/Summary/RimCsvUserData.h index 4bf3920687..06bde1d770 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimCsvUserData.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimCsvUserData.h @@ -24,6 +24,7 @@ #include "cafPdmObject.h" #include "cafPdmField.h" +#include "cafPdmChildField.h" #include "cvfObject.h" class RifSummaryReaderInterface; @@ -44,10 +45,10 @@ public: virtual QString errorMessagesFromReader() override; - void setParseOptions(const AsciiDataParseOptions &parseOptions); + RicPasteAsciiDataToSummaryPlotFeatureUi* parseOptions() const; private: + caf::PdmChildField m_parseOptions; cvf::ref m_summaryReader; QString m_errorText; - AsciiDataParseOptions m_parseOptions; }; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp index e9ee4ecd2a..a8ca65068a 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp @@ -150,23 +150,24 @@ RimObservedData* RimObservedDataCollection::createAndAddCvsObservedDataFromFile( RimObservedData* observedData = nullptr; bool parseOk = false; - RicPasteAsciiDataToSummaryPlotFeatureUi parseOptionsUi; + RimCsvUserData* userData = new RimCsvUserData(); + RicPasteAsciiDataToSummaryPlotFeatureUi* parseOptions = userData->parseOptions(); + if (useSavedFieldsValuesInDialog) { - caf::PdmSettings::readFieldsFromApplicationStore(&parseOptionsUi); + caf::PdmSettings::readFieldsFromApplicationStore(parseOptions); } - parseOptionsUi.setUiModeImport(fileName); + parseOptions->setUiModeImport(fileName); - caf::PdmUiPropertyViewDialog propertyDialog(NULL, &parseOptionsUi, "CSV Import Options", ""); + caf::PdmUiPropertyViewDialog propertyDialog(NULL, parseOptions, "CSV Import Options", ""); if (propertyDialog.exec() != QDialog::Accepted) { return nullptr; } - caf::PdmSettings::writeFieldsToApplicationStore(&parseOptionsUi); + caf::PdmSettings::writeFieldsToApplicationStore(parseOptions); - RimCsvUserData* userData = new RimCsvUserData(); - userData->setParseOptions(parseOptionsUi.parseOptions()); + //userData->setParseOptions(parseOptionsUi.parseOptions()); userData->setSummaryHeaderFileName(fileName); userData->createSummaryReaderInterface(); userData->updateMetaData(); From 67fe2e268af0ffe7827102e56acad60e62c6ec33 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 4 Dec 2017 11:43:27 +0100 Subject: [PATCH 31/38] #2211 Curve Calculator : Add default curve calculation before displaying dialog --- .../RicShowSummaryCurveCalculatorFeature.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicShowSummaryCurveCalculatorFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicShowSummaryCurveCalculatorFeature.cpp index 216c23c7af..03a0a56d74 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicShowSummaryCurveCalculatorFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicShowSummaryCurveCalculatorFeature.cpp @@ -20,6 +20,10 @@ #include "RicSummaryCurveCalculatorDialog.h" +#include "RiaApplication.h" +#include "RimProject.h" +#include "RimSummaryCalculationCollection.h" + #include @@ -60,7 +64,14 @@ void RicShowSummaryCurveCalculatorFeature::onActionTriggered(bool isChecked) { RicSummaryCurveCalculatorDialog* dialog = RicShowSummaryCurveCalculatorFeature::curveCalculatorDialog(); - dialog->setCalculationAndUpdateUi(nullptr); + RimProject* proj = RiaApplication::instance()->project(); + RimSummaryCalculationCollection* calcColl = proj->calculationCollection(); + if (calcColl->calculations().size() == 0) + { + calcColl->addCalculation(); + } + + dialog->setCalculationAndUpdateUi(calcColl->calculations()[0]); dialog->show(); dialog->raise(); From c90715d038b45e18f128e371b6cef394c663df95 Mon Sep 17 00:00:00 2001 From: Rebecca Cox Date: Mon, 4 Dec 2017 12:08:26 +0100 Subject: [PATCH 32/38] Fix linux error --- .../Intersections/RivIntersectionGeometryGenerator.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ApplicationCode/ModelVisualization/Intersections/RivIntersectionGeometryGenerator.cpp b/ApplicationCode/ModelVisualization/Intersections/RivIntersectionGeometryGenerator.cpp index ac362fd883..f6ff7b167d 100644 --- a/ApplicationCode/ModelVisualization/Intersections/RivIntersectionGeometryGenerator.cpp +++ b/ApplicationCode/ModelVisualization/Intersections/RivIntersectionGeometryGenerator.cpp @@ -94,8 +94,8 @@ void RivIntersectionGeometryGenerator::calculateArrays() cvf::Vec3d maxHeightVec; - double maxSectionHeightUp; - double maxSectionHeightDown; + double maxSectionHeightUp = 0; + double maxSectionHeightDown = 0; if (m_crossSection->type == RimIntersection::CS_AZIMUTHLINE) { @@ -169,7 +169,7 @@ void RivIntersectionGeometryGenerator::calculateArrays() { cvf::Vec3d temp = vertex.vx - p1; double dot = temp.dot(m_extrusionDirection); - double lengthCheck; + double lengthCheck = 0; if (dot < 0) { From aa9a2b2e2ecc6c2b0bcd9746862ac31a2ff16df8 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 4 Dec 2017 12:30:00 +0100 Subject: [PATCH 33/38] #2214 Summary Source Stepping : Remove obsolete code --- .../Summary/RimSummaryCurveCollection.cpp | 16 -- .../Summary/RimSummaryCurveCollection.h | 2 - .../Summary/RimSummaryPlot.cpp | 16 -- .../ProjectDataModel/Summary/RimSummaryPlot.h | 3 - .../Summary/RimSummaryPlotSourceStepping.cpp | 149 ++---------------- .../Summary/RimSummaryPlotSourceStepping.h | 6 +- 6 files changed, 18 insertions(+), 174 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp index d43b1b13f6..a3307e6f0c 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp @@ -244,22 +244,6 @@ void RimSummaryCurveCollection::setCurrentSummaryCurve(RimSummaryCurve* curve) updateConnectedEditors(); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryCurveCollection::applyNextIdentifier() -{ - m_ySourceStepping->applyNextIdentifier(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryCurveCollection::applyPreviousIdentifier() -{ - m_ySourceStepping->applyPreviousIdentifier(); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.h index 882bda59d2..cd2e29a801 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurveCollection.h @@ -61,8 +61,6 @@ public: void setCurrentSummaryCurve(RimSummaryCurve* curve); - void applyNextIdentifier(); - void applyPreviousIdentifier(); std::vector fieldsToShowInToolbar(); QString compileAutoPlotTitle() const; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index fc7adedc23..cf184ebe1a 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -496,22 +496,6 @@ void RimSummaryPlot::updatePlotTitle() updateMdiWindowTitle(); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryPlot::applyNextIdentifier() -{ - m_summaryCurveCollection->applyNextIdentifier(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryPlot::applyPreviousIdentifier() -{ - m_summaryCurveCollection->applyPreviousIdentifier(); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h index aa0b20dda4..975c0bfcdf 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h @@ -103,9 +103,6 @@ public: void updatePlotTitle(); - void applyNextIdentifier(); - void applyPreviousIdentifier(); - // RimViewWindow overrides public: virtual QWidget* createViewWidget(QWidget* mainWindowParent) override; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp index b737a015ce..033a71cf0d 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp @@ -142,7 +142,10 @@ void RimSummaryPlotSourceStepping::applyPrevCase() //-------------------------------------------------------------------------------------------------- void RimSummaryPlotSourceStepping::applyNextQuantity() { - modifyCurrentIndex(&m_quantity, 1); + if (!m_quantity.uiCapability()->isUiHidden()) + { + modifyCurrentIndex(&m_quantity, 1); + } } //-------------------------------------------------------------------------------------------------- @@ -150,7 +153,10 @@ void RimSummaryPlotSourceStepping::applyNextQuantity() //-------------------------------------------------------------------------------------------------- void RimSummaryPlotSourceStepping::applyPrevQuantity() { - modifyCurrentIndex(&m_quantity, -1); + if (!m_quantity.uiCapability()->isUiHidden()) + { + modifyCurrentIndex(&m_quantity, -1); + } } //-------------------------------------------------------------------------------------------------- @@ -158,7 +164,10 @@ void RimSummaryPlotSourceStepping::applyPrevQuantity() //-------------------------------------------------------------------------------------------------- void RimSummaryPlotSourceStepping::applyNextOtherIdentifier() { - caf::PdmValueField* valueField = valueFieldToModify(); + caf::PdmValueField* valueField = fieldToModify(); + if (!valueField) + return; + modifyCurrentIndex(valueField, 1); } @@ -167,110 +176,13 @@ void RimSummaryPlotSourceStepping::applyNextOtherIdentifier() //-------------------------------------------------------------------------------------------------- void RimSummaryPlotSourceStepping::applyPrevOtherIdentifier() { - caf::PdmValueField* valueField = valueFieldToModify(); + caf::PdmValueField* valueField = fieldToModify(); + if (!valueField) + return; + modifyCurrentIndex(valueField, -1); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryPlotSourceStepping::applyNextIdentifier() -{ - updateUiFromCurves(); - - caf::PdmValueField* valueField = valueFieldToModify(); - if (valueField) - { - bool useOptionsOnly = true; - - QList options = calculateValueOptions(valueField, nullptr); - if (options.isEmpty()) - { - return; - } - - auto uiVariant = valueField->uiCapability()->toUiBasedQVariant(); - - int currentIndex = -1; - for (int i = 0; i < options.size(); i++) - { - if (uiVariant == options[i].optionUiText()) - { - currentIndex = i; - } - } - - if (currentIndex == -1) - { - currentIndex = 0; - } - - int nextIndex = currentIndex + 1; - if (nextIndex >= options.size() - 1) - { - nextIndex = 0; - } - - auto optionValue = options[nextIndex].value(); - - QVariant currentValue = valueField->toQVariant(); - - valueField->setFromQVariant(optionValue); - - valueField->uiCapability()->notifyFieldChanged(currentValue, optionValue); - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryPlotSourceStepping::applyPreviousIdentifier() -{ - updateUiFromCurves(); - - caf::PdmValueField* valueField = valueFieldToModify(); - if (valueField) - { - bool useOptionsOnly = true; - - QList options = calculateValueOptions(valueField, nullptr); - if (options.isEmpty()) - { - return; - } - - auto uiVariant = valueField->uiCapability()->toUiBasedQVariant(); - - int currentIndex = -1; - for (int i = 0; i < options.size(); i++) - { - if (uiVariant == options[i].optionUiText()) - { - currentIndex = i; - } - } - - if (currentIndex == -1) - { - currentIndex = 0; - } - - int nextIndex = currentIndex - 1; - if (nextIndex < 0) - { - nextIndex = options.size() - 1; - } - - auto optionValue = options[nextIndex].value(); - - QVariant currentValue = valueField->toQVariant(); - - valueField->setFromQVariant(optionValue); - - valueField->uiCapability()->notifyFieldChanged(currentValue, optionValue); - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -701,7 +613,7 @@ void RimSummaryPlotSourceStepping::updateUiFromCurves() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -caf::PdmFieldHandle* RimSummaryPlotSourceStepping::fieldToModify() +caf::PdmValueField* RimSummaryPlotSourceStepping::fieldToModify() { RiaSummaryCurveAnalyzer analyzer; analyzer.analyzeAdresses(allAddressesUsedInCurveCollection()); @@ -721,36 +633,9 @@ caf::PdmFieldHandle* RimSummaryPlotSourceStepping::fieldToModify() return &m_region; } - if (analyzer.quantities().size() == 1) - { - return &m_quantity; - } - - // A pointer field is no a value field, so this must be improved - // to be able to step between summary cases - auto sumCases = allSummaryCasesUsedInCurveCollection(); - if (sumCases.size() == 1) - { - RimProject* proj = RiaApplication::instance()->project(); - if (proj->allSummaryCases().size() > 1) - { - return &m_summaryCase; - } - } - return nullptr; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -caf::PdmValueField* RimSummaryPlotSourceStepping::valueFieldToModify() -{ - // This will return a null pointer for summary case modifier - - return dynamic_cast(fieldToModify()); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h index c01a4de7e0..3b30e091de 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h @@ -62,9 +62,6 @@ public: void applyNextOtherIdentifier(); void applyPrevOtherIdentifier(); - void applyNextIdentifier(); - void applyPreviousIdentifier(); - std::vector fieldsToShowInToolbar(); private: @@ -83,8 +80,7 @@ private: RifSummaryReaderInterface* summaryReader() const; RimSummaryCase* singleSummaryCase() const; void updateUiFromCurves(); - caf::PdmFieldHandle* fieldToModify(); - caf::PdmValueField* valueFieldToModify(); + caf::PdmValueField* fieldToModify(); std::set allAddressesUsedInCurveCollection() const; std::set allSummaryCasesUsedInCurveCollection() const; From 6da6a0abe1ccff65e9506000ea3bdda388e016fc Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 4 Dec 2017 12:58:10 +0100 Subject: [PATCH 34/38] #2212 AppFwk : Allow '[' and ']' in filter field text --- .../cafUserInterface/cafPdmUiTreeSelectionEditor.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiTreeSelectionEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiTreeSelectionEditor.cpp index 72a630718b..39460272be 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiTreeSelectionEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiTreeSelectionEditor.cpp @@ -453,7 +453,14 @@ void PdmUiTreeSelectionEditor::slotTextFilterChanged() QString searchString = m_textFilterLineEdit->text(); searchString += "*"; - m_proxyModel->setFilterWildcard(searchString); + // Escape the characters '[' and ']' as these have special meaning for a search string + // To be able to search for vector names in brackets, these must be escaped + // See "Wildcard Matching" in Qt documentation + searchString.replace("[", "\\["); + searchString.replace("]", "\\]"); + + QRegExp searcher(searchString, Qt::CaseInsensitive, QRegExp::WildcardUnix); + m_proxyModel->setFilterRegExp(searcher); updateUi(); } From ae8cdbc5469f889fdbd2b425e5ea49b4268bf5ac Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 4 Dec 2017 13:07:47 +0100 Subject: [PATCH 35/38] #2201 Summary Curve : Move button "Vector Selection Dialog" into vector selection group --- .../ProjectDataModel/Summary/RimSummaryCurve.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp index b26861ec0c..19243153bc 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp @@ -505,7 +505,7 @@ void RimSummaryCurve::defineEditorAttribute(const caf::PdmFieldHandle* field, QS caf::PdmUiPushButtonEditorAttribute* attrib = dynamic_cast (attribute); if (attrib) { - attrib->m_buttonText = "Select Vector..."; + attrib->m_buttonText = "Vector Selection Dialog"; } } } @@ -530,8 +530,8 @@ void RimSummaryCurve::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& curveVarSelectionGroup->setCollapsedByDefault(true); m_yValuesSummaryFilter->uiOrdering(uiConfigName, *curveVarSelectionGroup); curveVarSelectionGroup->add(&m_yValuesUiFilterResultSelection); + curveVarSelectionGroup->add(&m_yPushButtonSelectSummaryAddress); - curveDataGroup->add(&m_yPushButtonSelectSummaryAddress); curveDataGroup->add(&m_plotAxis); } @@ -546,7 +546,7 @@ void RimSummaryCurve::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& m_xValuesSummaryFilter->uiOrdering(uiConfigName, *curveVarSelectionGroup); curveVarSelectionGroup->add(&m_xValuesUiFilterResultSelection); - curveDataGroup->add(&m_xPushButtonSelectSummaryAddress); + curveVarSelectionGroup->add(&m_xPushButtonSelectSummaryAddress); } From eaa0a1d6fed8710f8ddd0d6de12df838d9614cc6 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 4 Dec 2017 13:25:47 +0100 Subject: [PATCH 36/38] #2200 AppFwk Tree Selection Editor: Select item when toggling When toggling the checked state, also select (highlight) the toggled item --- Fwk/AppFwk/cafUserInterface/cafPdmUiTreeSelectionEditor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiTreeSelectionEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiTreeSelectionEditor.cpp index 39460272be..aad492bc7f 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiTreeSelectionEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiTreeSelectionEditor.cpp @@ -207,14 +207,14 @@ void PdmUiTreeSelectionEditor::configureAndUpdateUi(const QString& uiConfigName) m_treeView->setContextMenuPolicy(Qt::NoContextMenu); m_model->enableSingleSelectionMode(m_attributes.singleSelectionMode); - - connect(m_treeView, SIGNAL(clicked(QModelIndex)), this, SLOT(slotClicked(QModelIndex))); } else { m_treeView->setSelectionMode(QAbstractItemView::ExtendedSelection); } + connect(m_treeView, SIGNAL(clicked(QModelIndex)), this, SLOT(slotClicked(QModelIndex))); + if (!m_attributes.showTextFilter) { m_textFilterLineEdit->hide(); From 93b69b807f1b2f38791c51c37428135bf81533ad Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 4 Dec 2017 14:36:17 +0100 Subject: [PATCH 37/38] #2198 Summary Plot : Set default curve selection --- .../RicSummaryCurveCreator.cpp | 12 ++++++++++ .../RicSummaryCurveCreator.h | 1 + .../RiuSummaryCurveDefSelection.cpp | 23 +++++++++++++++++-- .../RiuSummaryCurveDefSelection.h | 4 +++- 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp index 884c356809..2d5f1265ed 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp @@ -138,6 +138,10 @@ void RicSummaryCurveCreator::updateFromSummaryPlot(RimSummaryPlot* targetPlot) { populateCurveCreator(*m_targetPlot); } + else + { + setDefaultCurveSelection(); + } syncPreviewCurvesFromUiSelection(); @@ -554,6 +558,14 @@ void RicSummaryCurveCreator::copyCurveAndAddToPlot(const RimSummaryCurve *curve, curveCopy->loadDataAndUpdate(false); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicSummaryCurveCreator::setDefaultCurveSelection() +{ + m_summaryCurveSelectionEditor->summaryAddressSelection()->setDefaultSelection(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.h b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.h index 5d8b27ee0a..09c7887108 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.h +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.h @@ -84,6 +84,7 @@ private: void populateCurveCreator(const RimSummaryPlot& sourceSummaryPlot); void updateTargetPlot(); static void copyCurveAndAddToPlot(const RimSummaryCurve *curve, RimSummaryPlot *plot, bool forceVisible = false); + void setDefaultCurveSelection(); void resetAllFields(); void initCurveAppearanceCalculator(RimSummaryCurveAppearanceCalculator& curveAppearanceCalc); diff --git a/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp b/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp index cef17cde2e..6bd9a3b967 100644 --- a/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp +++ b/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.cpp @@ -252,7 +252,7 @@ std::vector RiuSummaryCurveDefSelection::selectedCurv std::set selectedAddressesFromUi = buildAddressListFromSelections(); - for (RimSummaryCase* currCase : summaryCases()) + for (RimSummaryCase* currCase : selectedSummaryCases()) { if (currCase && currCase->summaryReader()) { @@ -291,6 +291,25 @@ void RiuSummaryCurveDefSelection::setFieldChangedHandler(const std::functionproject(); + auto allSumCases = proj->allSummaryCases(); + if (allSumCases.size() > 0) + { + RifEclipseSummaryAddress defaultAddress = RifEclipseSummaryAddress::fieldVarAddress("FOPT"); + + RiaSummaryCurveDefinition curveDef(allSumCases[0], defaultAddress); + std::vector curveDefs; + curveDefs.push_back(curveDef); + + setSelectedCurveDefinitions(curveDefs); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -950,7 +969,7 @@ bool RiuSummaryCurveDefSelection::isObservedData(RimSummaryCase *sumCase) const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RiuSummaryCurveDefSelection::summaryCases() const +std::vector RiuSummaryCurveDefSelection::selectedSummaryCases() const { std::vector cases; diff --git a/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.h b/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.h index 929a35d9e5..4cdda0670b 100644 --- a/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.h +++ b/ApplicationCode/UserInterface/RiuSummaryCurveDefSelection.h @@ -55,6 +55,8 @@ public: void setMultiSelectionMode(bool multiSelectionMode); void setFieldChangedHandler(const std::function& handlerFunc); + void setDefaultSelection(); + private: virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, @@ -86,7 +88,7 @@ private: void resetAllFields(); bool isObservedData(RimSummaryCase *sumCase) const; - std::vector summaryCases() const; + std::vector selectedSummaryCases() const; static RimSummaryCase* calculatedSummaryCase(); private: From 860458eb28851081ec218b394e4996db7ff0aea8 Mon Sep 17 00:00:00 2001 From: Rebecca Cox Date: Mon, 4 Dec 2017 15:47:35 +0100 Subject: [PATCH 38/38] #2123 Formation/Well Path: Code clean up --- .../FileInterface/RifWellPathFormationReader.cpp | 12 ------------ .../FileInterface/RifWellPathFormationReader.h | 1 - ApplicationCode/ProjectDataModel/RimWellPath.h | 2 +- 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/ApplicationCode/FileInterface/RifWellPathFormationReader.cpp b/ApplicationCode/FileInterface/RifWellPathFormationReader.cpp index a23a0fed76..560df9be2c 100644 --- a/ApplicationCode/FileInterface/RifWellPathFormationReader.cpp +++ b/ApplicationCode/FileInterface/RifWellPathFormationReader.cpp @@ -21,18 +21,6 @@ #include #include -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -std::map>> RifWellPathFormationReader::readWellFormations(const QString& filePath) -{ - std::map>> formations; - - readFileIntoMap(filePath, &formations); - - return formations; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/FileInterface/RifWellPathFormationReader.h b/ApplicationCode/FileInterface/RifWellPathFormationReader.h index f6d2adc1b4..091f596c6c 100644 --- a/ApplicationCode/FileInterface/RifWellPathFormationReader.h +++ b/ApplicationCode/FileInterface/RifWellPathFormationReader.h @@ -35,7 +35,6 @@ class RifWellPathFormationReader { public: - static std::map> > readWellFormations(const QString& filePath); static std::map > readWellFormationsToGeometry(const QString& filePath); private: diff --git a/ApplicationCode/ProjectDataModel/RimWellPath.h b/ApplicationCode/ProjectDataModel/RimWellPath.h index 74dea531c2..d6dd12e058 100644 --- a/ApplicationCode/ProjectDataModel/RimWellPath.h +++ b/ApplicationCode/ProjectDataModel/RimWellPath.h @@ -168,11 +168,11 @@ private: cvf::ref m_wellPathPartMgr; caf::PdmField m_name; + caf::PdmField m_wellPathFormationFilePath; caf::PdmField m_formationKeyInFile; caf::PdmChildArrayField m_wellLogFiles; - caf::PdmField m_wellPathFormationFilePath; caf::PdmChildField m_wellLogFile_OBSOLETE;