From 7cd2cd0f50089add7767706824dc2ca9a8932b25 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 9 Nov 2015 19:05:00 +0100 Subject: [PATCH] (#632) Add Eclipse cell to selection and show in 3D view and time history plot Consolidated remove of model based on name in RimView Cleanup selection and time history plot when project is closed --- .../Application/RiaApplication.cpp | 3 + .../ProjectDataModel/RimEclipseView.cpp | 99 ++++++++++++------- ApplicationCode/ProjectDataModel/RimView.cpp | 20 ++++ ApplicationCode/ProjectDataModel/RimView.h | 4 +- .../UserInterface/RiuMainWindow.cpp | 2 + .../UserInterface/RiuSelectionManager.cpp | 8 ++ .../UserInterface/RiuSelectionManager.h | 4 + .../UserInterface/RiuTimeHistoryQwtPlot.cpp | 7 +- .../UserInterface/RiuTimeHistoryQwtPlot.h | 9 +- .../UserInterface/RiuViewerCommands.cpp | 41 +++++++- 10 files changed, 150 insertions(+), 47 deletions(-) diff --git a/ApplicationCode/Application/RiaApplication.cpp b/ApplicationCode/Application/RiaApplication.cpp index 6c85decc4b..855b10e198 100644 --- a/ApplicationCode/Application/RiaApplication.cpp +++ b/ApplicationCode/Application/RiaApplication.cpp @@ -66,6 +66,7 @@ #include "RiuMainWindow.h" #include "RiuProcessMonitor.h" +#include "RiuSelectionManager.h" #include "RiuViewer.h" #include "cafAppEnum.h" @@ -608,6 +609,8 @@ bool RiaApplication::closeProject(bool askToSaveIfDirty) } } + RiuSelectionManager::instance()->deleteAllItems(); + mainWnd->cleanupGuiBeforeProjectClose(); caf::EffectGenerator::clearEffectCache(); diff --git a/ApplicationCode/ProjectDataModel/RimEclipseView.cpp b/ApplicationCode/ProjectDataModel/RimEclipseView.cpp index 268ddd07fc..9d4ae8fda6 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseView.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseView.cpp @@ -22,33 +22,42 @@ #include "RiaApplication.h" #include "RiaPreferences.h" + #include "RigCaseCellResultsData.h" #include "RigCaseData.h" #include "RigResultAccessor.h" #include "RigResultAccessorFactory.h" + #include "Rim3dOverlayInfoConfig.h" -#include "RimEclipseCase.h" #include "RimCellEdgeColors.h" -#include "RimEclipsePropertyFilterCollection.h" #include "RimCellRangeFilterCollection.h" -#include "RimFaultCollection.h" -#include "RimEclipseFaultColors.h" -#include "RimOilField.h" -#include "RimProject.h" +#include "RimEclipseCase.h" #include "RimEclipseCellColors.h" -#include "RimTernaryLegendConfig.h" +#include "RimEclipseFaultColors.h" +#include "RimEclipsePropertyFilterCollection.h" #include "RimEclipseWell.h" #include "RimEclipseWellCollection.h" +#include "RimFaultCollection.h" +#include "RimOilField.h" +#include "RimProject.h" +#include "RimTernaryLegendConfig.h" +#include "RimViewController.h" +#include "RimViewLinker.h" #include "RimWellPathCollection.h" + #include "RiuMainWindow.h" +#include "RiuSelectionManager.h" #include "RiuViewer.h" + #include "RivReservoirPipesPartMgr.h" +#include "RivSingleCellPartGenerator.h" #include "RivTernarySaturationOverlayItem.h" #include "RivWellPathCollectionPartMgr.h" #include "cafCadNavigation.h" #include "cafCeetronPlusNavigation.h" #include "cafFrameAnimationControl.h" +#include "cafPdmUiTreeOrdering.h" #include "cvfDrawable.h" #include "cvfModelBasicList.h" @@ -61,9 +70,6 @@ #include #include -#include "RimViewLinker.h" -#include "RimViewController.h" -#include "cafPdmUiTreeOrdering.h" @@ -644,20 +650,8 @@ void RimEclipseView::updateCurrentTimeStep() // Well pipes // ---------- cvf::String wellPipeModelName = "WellPipeModel"; - std::vector wellPipeModels; - for (cvf::uint i = 0; i < frameScene->modelCount(); i++) - { - if (frameScene->model(i)->name() == wellPipeModelName) - { - wellPipeModels.push_back(frameScene->model(i)); - } - } - for (size_t i = 0; i < wellPipeModels.size(); i++) - { - //printf("updateCurrentTimeStep: Remove WellPipeModel %i from frameScene, for frame %i\n", i, m_currentTimeStep.v()); - frameScene->removeModel(wellPipeModels[i]); - } + this->removeModelByName(frameScene, wellPipeModelName); cvf::ref wellPipeModelBasicList = new cvf::ModelBasicList; wellPipeModelBasicList->setName(wellPipeModelName); @@ -680,6 +674,51 @@ void RimEclipseView::updateCurrentTimeStep() mainGrid->characteristicIJCellSize(), currentActiveCellInfo()->geometryBoundingBox(), m_reservoirGridPartManager->scaleTransform()); + + + { + // Actions related to highlight items in scene + // + // Removed highlight model by name + // Create new highlight model with name + // Create and add selected parts + // Modify with scaletransform() + // Add parts to model + // Add model to scene + + cvf::String highlightModelName = "HighLightModel"; + + this->removeModelByName(frameScene, highlightModelName); + + cvf::ref highlightModelBasicList = new cvf::ModelBasicList; + highlightModelBasicList->setName(highlightModelName); + + RiuSelectionManager* riuSelManager = RiuSelectionManager::instance(); + std::vector items; + riuSelManager->selectedItems(items); + for (size_t i = 0; i < items.size(); i++) + { + RiuEclipseSelectionItem* eclipseSelItem = dynamic_cast(items[i]); + if (eclipseSelItem && + eclipseSelItem->m_view) + { + CVF_ASSERT(eclipseSelItem->m_view->eclipseCase()); + CVF_ASSERT(eclipseSelItem->m_view->eclipseCase()->reservoirData()); + + RivSingleCellPartGenerator partGen(eclipseSelItem->m_view->eclipseCase()->reservoirData(), eclipseSelItem->m_gridIndex, eclipseSelItem->m_cellIndex); + + cvf::ref part = partGen.createPart(eclipseSelItem->m_color); + part->setTransform(this->scaleTransform()); + part->setPriority(10000); + + highlightModelBasicList->addPart(part.p()); + } + } + + highlightModelBasicList->updateBoundingBoxesRecursive(); + + frameScene->addModel(highlightModelBasicList.p()); + } } } @@ -1565,19 +1604,7 @@ void RimEclipseView::addWellPathsToScene(cvf::Scene* scene, CVF_ASSERT(scaleTransform); cvf::String wellPathModelName = "WellPathModel"; - std::vector wellPathModels; - for (cvf::uint i = 0; i < scene->modelCount(); i++) - { - if (scene->model(i)->name() == wellPathModelName) - { - wellPathModels.push_back(scene->model(i)); - } - } - - for (size_t i = 0; i < wellPathModels.size(); i++) - { - scene->removeModel(wellPathModels[i]); - } + this->removeModelByName(scene, wellPathModelName); // Append static Well Paths to model cvf::ref wellPathModelBasicList = new cvf::ModelBasicList; diff --git a/ApplicationCode/ProjectDataModel/RimView.cpp b/ApplicationCode/ProjectDataModel/RimView.cpp index 2bf4d50587..d3429e3b1b 100644 --- a/ApplicationCode/ProjectDataModel/RimView.cpp +++ b/ApplicationCode/ProjectDataModel/RimView.cpp @@ -746,3 +746,23 @@ void RimView::replaceRangeFilterCollectionWithOverride() this->uiCapability()->updateConnectedEditors(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimView::removeModelByName(cvf::Scene* scene, const cvf::String& modelName) +{ + std::vector modelsToBeRemoved; + for (cvf::uint i = 0; i < scene->modelCount(); i++) + { + if (scene->model(i)->name() == modelName) + { + modelsToBeRemoved.push_back(scene->model(i)); + } + } + + for (size_t i = 0; i < modelsToBeRemoved.size(); i++) + { + scene->removeModel(modelsToBeRemoved[i]); + } +} + diff --git a/ApplicationCode/ProjectDataModel/RimView.h b/ApplicationCode/ProjectDataModel/RimView.h index ec84420a08..28912acf6f 100644 --- a/ApplicationCode/ProjectDataModel/RimView.h +++ b/ApplicationCode/ProjectDataModel/RimView.h @@ -33,7 +33,6 @@ #include "cvfBase.h" #include "cvfObject.h" - #include class Rim3dOverlayInfoConfig; @@ -49,6 +48,7 @@ namespace cvf class BoundingBox; class ModelBasicList; class Scene; + class String; class Transform; } @@ -151,6 +151,8 @@ protected: const cvf::BoundingBox& wellPathClipBoundingBox, cvf::Transform* scaleTransform); + static void removeModelByName(cvf::Scene* scene, const cvf::String& modelName); + virtual void createDisplayModel() = 0; virtual void updateDisplayModelVisibility() = 0; virtual void clampCurrentTimestep() = 0; diff --git a/ApplicationCode/UserInterface/RiuMainWindow.cpp b/ApplicationCode/UserInterface/RiuMainWindow.cpp index 5e5f3c0d8b..c3a4c07cfa 100644 --- a/ApplicationCode/UserInterface/RiuMainWindow.cpp +++ b/ApplicationCode/UserInterface/RiuMainWindow.cpp @@ -181,6 +181,8 @@ void RiuMainWindow::cleanupGuiBeforeProjectClose() setPdmRoot(NULL); setResultInfo(""); + + m_timeHistoryQwtPlot->deleteAllCurves(); if (m_pdmUiPropertyView) { diff --git a/ApplicationCode/UserInterface/RiuSelectionManager.cpp b/ApplicationCode/UserInterface/RiuSelectionManager.cpp index fc25056989..8a8c46d54a 100644 --- a/ApplicationCode/UserInterface/RiuSelectionManager.cpp +++ b/ApplicationCode/UserInterface/RiuSelectionManager.cpp @@ -48,6 +48,14 @@ void RiuSelectionManager::setSelectedItems(const std::vector& m_selection = items; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuSelectionManager::appendItemToSelection(RiuSelectionItem* item) +{ + m_selection.push_back(item); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/UserInterface/RiuSelectionManager.h b/ApplicationCode/UserInterface/RiuSelectionManager.h index 7e85181b4c..0089106647 100644 --- a/ApplicationCode/UserInterface/RiuSelectionManager.h +++ b/ApplicationCode/UserInterface/RiuSelectionManager.h @@ -47,6 +47,10 @@ public: // SelectionManager takes ownership of the selection items void setSelectedItems(const std::vector& items); + // Append item to selected items in SelectionManager + // SelectionManager takes ownership of the item + void appendItemToSelection(RiuSelectionItem* item); + // Deletes all items in the SelectionManager void deleteAllItems(); diff --git a/ApplicationCode/UserInterface/RiuTimeHistoryQwtPlot.cpp b/ApplicationCode/UserInterface/RiuTimeHistoryQwtPlot.cpp index 09fe3bd589..6fe444881b 100644 --- a/ApplicationCode/UserInterface/RiuTimeHistoryQwtPlot.cpp +++ b/ApplicationCode/UserInterface/RiuTimeHistoryQwtPlot.cpp @@ -63,7 +63,7 @@ RiuTimeHistoryQwtPlot::~RiuTimeHistoryQwtPlot() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuTimeHistoryQwtPlot::addCurve(const QString& curveName, const std::vector& dateTimes, const std::vector& timeHistoryValues) +void RiuTimeHistoryQwtPlot::addCurve(const QString& curveName, const cvf::Color3f& curveColor, const std::vector& dateTimes, const std::vector& timeHistoryValues) { CVF_ASSERT(dateTimes.size() == timeHistoryValues.size()); @@ -94,7 +94,6 @@ void RiuTimeHistoryQwtPlot::addCurve(const QString& curveName, const std::vector plotCurve->setLineSegmentStartStopIndices(filteredIntervals); plotCurve->setTitle(curveName); - cvf::Color3f curveColor = RicWellLogPlotCurveFeatureImpl::curveColorFromTable(); plotCurve->setPen(QPen(QColor(curveColor.rByte(), curveColor.gByte(), curveColor.bByte()))); plotCurve->attach(this); @@ -108,7 +107,7 @@ void RiuTimeHistoryQwtPlot::addCurve(const QString& curveName, const std::vector //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuTimeHistoryQwtPlot::addCurve(const QString& curveName, const std::vector& frameTimes, const std::vector& timeHistoryValues) +void RiuTimeHistoryQwtPlot::addCurve(const QString& curveName, const cvf::Color3f& curveColor, const std::vector& frameTimes, const std::vector& timeHistoryValues) { std::vector dateTimes; @@ -117,7 +116,7 @@ void RiuTimeHistoryQwtPlot::addCurve(const QString& curveName, const std::vector dateTimes.push_back(QwtDate::toDateTime(frameTimes[i])); } - addCurve(curveName, dateTimes, timeHistoryValues); + addCurve(curveName, curveColor, dateTimes, timeHistoryValues); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/UserInterface/RiuTimeHistoryQwtPlot.h b/ApplicationCode/UserInterface/RiuTimeHistoryQwtPlot.h index 6f39124dc5..6737371553 100644 --- a/ApplicationCode/UserInterface/RiuTimeHistoryQwtPlot.h +++ b/ApplicationCode/UserInterface/RiuTimeHistoryQwtPlot.h @@ -24,6 +24,11 @@ class QwtPlotCurve; class QwtPlotGrid; +namespace cvf +{ + class Color3f; +} + //================================================================================================== // // @@ -35,8 +40,8 @@ public: RiuTimeHistoryQwtPlot(QWidget* parent = NULL); virtual ~RiuTimeHistoryQwtPlot(); - void addCurve(const QString& curveName, const std::vector& dateTimes, const std::vector& timeHistoryValues); - void addCurve(const QString& curveName, const std::vector& frameTimes, const std::vector& timeHistoryValues); + void addCurve(const QString& curveName, const cvf::Color3f& curveColor, const std::vector& dateTimes, const std::vector& timeHistoryValues); + void addCurve(const QString& curveName, const cvf::Color3f& curveColor, const std::vector& frameTimes, const std::vector& timeHistoryValues); void deleteAllCurves(); diff --git a/ApplicationCode/UserInterface/RiuViewerCommands.cpp b/ApplicationCode/UserInterface/RiuViewerCommands.cpp index 465681d3d3..08c05cb0c9 100644 --- a/ApplicationCode/UserInterface/RiuViewerCommands.cpp +++ b/ApplicationCode/UserInterface/RiuViewerCommands.cpp @@ -78,6 +78,8 @@ #include #include #include "RigFemTimeHistoryResultAccessor.h" +#include "RiuSelectionManager.h" +#include "WellLogCommands/RicWellLogPlotCurveFeatureImpl.h" //================================================================================================== // @@ -531,6 +533,11 @@ void RiuViewerCommands::handlePickAction(int winPosX, int winPosY, Qt::KeyboardM { // Delete all curves if no cell is hit mainWnd->timeHistoryPlot()->deleteAllCurves(); + + std::vector items; + RiuSelectionManager::instance()->deleteAllItems(); + + m_reservoirView->scheduleCreateDisplayModelAndRedraw(); } } @@ -567,10 +574,34 @@ void RiuViewerCommands::addTimeHistoryCurve(RimEclipseView* eclipseView, size_t curveName += timeHistResultAccessor.topologyText(); std::vector timeHistoryValues = timeHistResultAccessor.timeHistoryValues(); - CVF_ASSERT(timeStepDates.size() == timeHistoryValues.size()); - - mainWnd->timeHistoryPlot()->addCurve(curveName, timeStepDates, timeHistoryValues); + + cvf::Color3f curveColor = RicWellLogPlotCurveFeatureImpl::curveColorFromTable(); + + std::vector items; + RiuSelectionManager::instance()->selectedItems(items); + + bool isItemPartOfSelection = false; + for (size_t i = 0; i < items.size(); i++) + { + RiuEclipseSelectionItem* eclSelItem = dynamic_cast(items[i]); + if (eclSelItem && + eclSelItem->m_view == eclipseView && + eclSelItem->m_gridIndex == gridIndex && + eclSelItem->m_cellIndex == cellIndex) + { + isItemPartOfSelection = true; + } + } + + if (!isItemPartOfSelection) + { + RiuSelectionManager::instance()->appendItemToSelection(new RiuEclipseSelectionItem(eclipseView, gridIndex, cellIndex, curveColor)); + + mainWnd->timeHistoryPlot()->addCurve(curveName, curveColor, timeStepDates, timeHistoryValues); + + eclipseView->scheduleCreateDisplayModelAndRedraw(); + } } } @@ -607,9 +638,11 @@ void RiuViewerCommands::addTimeHistoryCurve(RimGeoMechView* geoMechView, size_t } CVF_ASSERT(frameTimes.size() == timeHistoryValues.size()); + + cvf::Color3f curveColor = RicWellLogPlotCurveFeatureImpl::curveColorFromTable(); RiuMainWindow* mainWnd = RiuMainWindow::instance(); - mainWnd->timeHistoryPlot()->addCurve(curveName, frameTimes, timeHistoryValues); + mainWnd->timeHistoryPlot()->addCurve(curveName, curveColor, frameTimes, timeHistoryValues); } }