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 "RimEclipseCase.h" +#include "RimEclipseCellColors.h" #include "RimEclipseFaultColors.h" +#include "RimEclipsePropertyFilterCollection.h" +#include "RimEclipseWell.h" +#include "RimEclipseWellCollection.h" +#include "RimFaultCollection.h" #include "RimOilField.h" #include "RimProject.h" -#include "RimEclipseCellColors.h" #include "RimTernaryLegendConfig.h" -#include "RimEclipseWell.h" -#include "RimEclipseWellCollection.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 @@ class RimView : public caf::PdmObject 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 @@ class RiuSelectionManager // 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 @@ class RiuTimeHistoryQwtPlot : public QwtPlot 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); } }