diff --git a/ApplicationLibCode/Commands/RicNewViewFeature.cpp b/ApplicationLibCode/Commands/RicNewViewFeature.cpp index 1907f42cd3..eed089898a 100644 --- a/ApplicationLibCode/Commands/RicNewViewFeature.cpp +++ b/ApplicationLibCode/Commands/RicNewViewFeature.cpp @@ -23,8 +23,10 @@ #include "Rim3dView.h" #include "RimEclipseCase.h" +#include "RimEclipseCaseTools.h" #include "RimEclipseContourMapView.h" #include "RimEclipseView.h" +#include "RimEclipseViewCollection.h" #include "RimGeoMechCase.h" #include "RimGeoMechView.h" @@ -39,9 +41,9 @@ CAF_CMD_SOURCE_INIT( RicNewViewFeature, "RicNewViewFeature" ); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicNewViewFeature::addReservoirView( RimEclipseCase* eclipseCase, RimGeoMechCase* geomCase ) +void RicNewViewFeature::addReservoirView( RimEclipseCase* eclipseCase, RimGeoMechCase* geomCase, bool useGlobalViewCollection ) { - Rim3dView* newView = createReservoirView( eclipseCase, geomCase ); + Rim3dView* newView = createReservoirView( eclipseCase, geomCase, useGlobalViewCollection ); if ( newView ) { @@ -58,7 +60,7 @@ void RicNewViewFeature::addReservoirView( RimEclipseCase* eclipseCase, RimGeoMec bool RicNewViewFeature::isCommandEnabled() const { return selectedEclipseCase() != nullptr || selectedEclipseView() != nullptr || selectedGeoMechCase() != nullptr || - selectedGeoMechView() != nullptr; + selectedGeoMechView() != nullptr || selectedEclipseViewCollection() != nullptr; } //-------------------------------------------------------------------------------------------------- @@ -76,7 +78,21 @@ void RicNewViewFeature::onActionTriggered( bool isChecked ) if ( geoMechView ) geomCase = geoMechView->geoMechCase(); if ( reservoirView ) eclipseCase = reservoirView->eclipseCase(); - addReservoirView( eclipseCase, geomCase ); + bool useGlobalViewCollection = false; + if ( selectedEclipseViewCollection() ) + { + // Use global view collection if view collection is not descendant of Eclipse case. + useGlobalViewCollection = selectedEclipseViewCollection()->firstAncestorOrThisOfType() == nullptr; + if ( !eclipseCase ) + { + auto eclipseCases = RimEclipseCaseTools::allEclipseGridCases(); + if ( !eclipseCases.empty() ) + { + eclipseCase = eclipseCases[0]; + } + } + } + addReservoirView( eclipseCase, geomCase, useGlobalViewCollection ); } //-------------------------------------------------------------------------------------------------- @@ -91,13 +107,13 @@ void RicNewViewFeature::setupActionLook( QAction* actionToSetup ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -Rim3dView* RicNewViewFeature::createReservoirView( RimEclipseCase* eclipseCase, RimGeoMechCase* geomCase ) +Rim3dView* RicNewViewFeature::createReservoirView( RimEclipseCase* eclipseCase, RimGeoMechCase* geomCase, bool useGlobalViewCollection ) { RimGridView* insertedView = nullptr; if ( eclipseCase ) { - insertedView = eclipseCase->createAndAddReservoirView(); + insertedView = eclipseCase->createAndAddReservoirView( useGlobalViewCollection ); } else if ( geomCase ) { @@ -171,6 +187,17 @@ RimEclipseView* RicNewViewFeature::selectedEclipseView() return nullptr; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEclipseViewCollection* RicNewViewFeature::selectedEclipseViewCollection() +{ + std::vector selection; + caf::SelectionManager::instance()->objectsByType( &selection ); + if ( !selection.empty() ) return selection[0]; + return nullptr; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/RicNewViewFeature.h b/ApplicationLibCode/Commands/RicNewViewFeature.h index f5a6645e9a..c145641072 100644 --- a/ApplicationLibCode/Commands/RicNewViewFeature.h +++ b/ApplicationLibCode/Commands/RicNewViewFeature.h @@ -26,6 +26,7 @@ class RimEclipseView; class RimGeoMechCase; class RimGeoMechView; class Rim3dView; +class RimEclipseViewCollection; //================================================================================================== /// @@ -35,7 +36,7 @@ class RicNewViewFeature : public caf::CmdFeature CAF_CMD_HEADER_INIT; public: - static void addReservoirView( RimEclipseCase* eclipseCase, RimGeoMechCase* geomCase ); + static void addReservoirView( RimEclipseCase* eclipseCase, RimGeoMechCase* geomCase, bool useGlobalViewCollection = false ); protected: bool isCommandEnabled() const override; @@ -43,10 +44,11 @@ protected: void setupActionLook( QAction* actionToSetup ) override; private: - static Rim3dView* createReservoirView( RimEclipseCase* eclipseCase, RimGeoMechCase* geomCase ); + static Rim3dView* createReservoirView( RimEclipseCase* eclipseCase, RimGeoMechCase* geomCase, bool useGlobalViewCollectin ); - static RimEclipseCase* selectedEclipseCase(); - static RimGeoMechCase* selectedGeoMechCase(); - static RimEclipseView* selectedEclipseView(); - static RimGeoMechView* selectedGeoMechView(); + static RimEclipseCase* selectedEclipseCase(); + static RimGeoMechCase* selectedGeoMechCase(); + static RimEclipseView* selectedEclipseView(); + static RimGeoMechView* selectedGeoMechView(); + static RimEclipseViewCollection* selectedEclipseViewCollection(); }; diff --git a/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp b/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp index 5eb216b2d5..5cf14ed840 100644 --- a/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp @@ -60,6 +60,7 @@ #include "RimEclipseResultCase.h" #include "RimEclipseStatisticsCase.h" #include "RimEclipseView.h" +#include "RimEclipseViewCollection.h" #include "RimElasticProperties.h" #include "RimEllipseFractureTemplate.h" #include "RimEnsembleCurveFilterCollection.h" @@ -282,6 +283,10 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicComputeStatisticsFeature"; menuBuilder << "Separator"; } + else if ( dynamic_cast( firstUiItem ) ) + { + menuBuilder << "RicNewViewFeature"; + } else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicRenameCaseFeature"; diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp index c0a904e64b..e8fe32a5e9 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp @@ -117,6 +117,9 @@ RimEclipseCase::RimEclipseCase() m_resultAddressCollections.uiCapability()->setUiHidden( true ); m_resultAddressCollections.xmlCapability()->disableIO(); + CAF_PDM_InitFieldNoDefault( &m_viewCollection, "ViewCollection", "Views" ); + m_viewCollection = new RimEclipseViewCollection; + // Init m_matrixModelResults = new RimReservoirCellResultsStorage; @@ -136,6 +139,7 @@ RimEclipseCase::~RimEclipseCase() delete m_matrixModelResults(); delete m_fractureModelResults(); delete m_inputPropertyCollection; + delete m_viewCollection; RimProject* project = RimProject::current(); if ( project ) @@ -307,9 +311,9 @@ void RimEclipseCase::initAfterRead() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimEclipseView* RimEclipseCase::createAndAddReservoirView() +RimEclipseView* RimEclipseCase::createAndAddReservoirView( bool useGlobalViewCollection ) { - RimEclipseViewCollection* viewColl = viewCollection(); + RimEclipseViewCollection* viewColl = useGlobalViewCollection ? globalViewCollection() : viewCollection(); if ( !viewColl ) return nullptr; return viewColl->addView( this ); @@ -550,6 +554,11 @@ void RimEclipseCase::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrderin { if ( uiConfigName == "MainWindow.ProjectTree" ) { + for ( auto view : m_viewCollection->views() ) + { + uiTreeOrdering.add( view ); + } + if ( !m_2dIntersectionViewCollection->views().empty() ) { uiTreeOrdering.add( &m_2dIntersectionViewCollection ); @@ -1195,6 +1204,14 @@ void RimEclipseCase::updateResultAddressCollection() /// //-------------------------------------------------------------------------------------------------- RimEclipseViewCollection* RimEclipseCase::viewCollection() const +{ + return m_viewCollection; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEclipseViewCollection* RimEclipseCase::globalViewCollection() const { RimProject* project = RimProject::current(); if ( !project ) return nullptr; @@ -1211,7 +1228,18 @@ RimEclipseViewCollection* RimEclipseCase::viewCollection() const std::vector RimEclipseCase::reservoirViews() const { std::vector views; - if ( RimEclipseViewCollection* viewColl = viewCollection() ) + + addViewsFromViewCollection( views, viewCollection() ); + addViewsFromViewCollection( views, globalViewCollection() ); + return views; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipseCase::addViewsFromViewCollection( std::vector& views, const RimEclipseViewCollection* viewColl ) const +{ + if ( viewColl ) { for ( auto view : viewColl->views() ) { @@ -1221,8 +1249,6 @@ std::vector RimEclipseCase::reservoirViews() const } } } - - return views; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseCase.h b/ApplicationLibCode/ProjectDataModel/RimEclipseCase.h index bcd29f88df..933fc62742 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseCase.h +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseCase.h @@ -91,7 +91,7 @@ public: RimReservoirCellResultsStorage* resultsStorage( RiaDefines::PorosityModelType porosityModel ); const RimReservoirCellResultsStorage* resultsStorage( RiaDefines::PorosityModelType porosityModel ) const; - RimEclipseView* createAndAddReservoirView(); + RimEclipseView* createAndAddReservoirView( bool useGlobalViewCollection = false ); RimEclipseView* createCopyAndAddView( const RimEclipseView* sourceView ); const RigVirtualPerforationTransmissibilities* computeAndGetVirtualPerforationTransmissibilities(); @@ -141,7 +141,9 @@ protected: void setReservoirData( RigEclipseCaseData* eclipseCase ); std::vector additionalFiles() const; RimEclipseViewCollection* viewCollection() const; + RimEclipseViewCollection* globalViewCollection() const; RimEclipseContourMapViewCollection* contourMapViewCollection() const; + void addViewsFromViewCollection( std::vector& views, const RimEclipseViewCollection* viewColl ) const; private: void createTimeStepFormatString(); @@ -168,6 +170,7 @@ private: caf::PdmChildField m_matrixModelResults; caf::PdmChildField m_fractureModelResults; + caf::PdmChildField m_viewCollection; caf::PdmField> m_filesContainingFaults; diff --git a/ApplicationLibCode/ProjectDataModel/RimGridCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimGridCollection.cpp index 6afed2a8bb..3de30778da 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimGridCollection.cpp @@ -19,6 +19,7 @@ #include "RimGridCollection.h" #include "RimEclipseCase.h" +#include "RimEclipseView.h" #include "RimGridView.h" #include "RigMainGrid.h" @@ -479,7 +480,10 @@ void RimGridCollection::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrde //-------------------------------------------------------------------------------------------------- const RigMainGrid* RimGridCollection::mainEclipseGrid() const { - auto eclipseCase = firstAncestorOrThisOfType(); + RimEclipseView* gridView = firstAncestorOrThisOfType(); + if ( !gridView ) return nullptr; + + auto eclipseCase = gridView->eclipseCase(); return eclipseCase ? eclipseCase->mainGrid() : nullptr; }