Add optional Eclipse case as data source in a view

This option makes it possible to look at data from other cases without creating one view per case.
This commit is contained in:
Magne Sjaastad
2023-11-07 09:57:40 +01:00
parent b9af6a35b0
commit 4da4a222ca
4 changed files with 128 additions and 20 deletions

View File

@@ -19,6 +19,7 @@
#include "RimEclipseCaseTools.h"
#include "RimEclipseResultCase.h"
#include "RimEclipseStatisticsCase.h"
#include "RimProject.h"
//--------------------------------------------------------------------------------------------------
@@ -53,3 +54,30 @@ std::vector<RimEclipseResultCase*> RimEclipseCaseTools::eclipseResultCases()
return resultCases;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimEclipseCase*> RimEclipseCaseTools::allEclipseGridCases()
{
// Find all Eclipse cases, including all single grid cases and source cases in a grid case group. Statistics cases are excluded.
RimProject* proj = RimProject::current();
if ( proj )
{
std::vector<RimEclipseCase*> eclipseCases;
for ( auto c : proj->allGridCases() )
{
if ( dynamic_cast<RimEclipseStatisticsCase*>( c ) ) continue;
if ( auto ec = dynamic_cast<RimEclipseCase*>( c ) )
{
eclipseCases.push_back( ec );
}
}
return eclipseCases;
}
return {};
}

View File

@@ -29,6 +29,12 @@ class RimEclipseResultCase;
class RimEclipseCaseTools
{
public:
static std::vector<RimEclipseCase*> eclipseCases();
// Single grid cases not part of a grid case group
static std::vector<RimEclipseCase*> eclipseCases();
// Result cases based on RimEclipseCaseTools::elipseCases()
static std::vector<RimEclipseResultCase*> eclipseResultCases();
// All Eclipse cases including grid case group source cases, excluding statistics cases
static std::vector<RimEclipseCase*> allEclipseGridCases();
};

View File

@@ -48,6 +48,7 @@
#include "RimCellEdgeColors.h"
#include "RimCellFilterCollection.h"
#include "RimEclipseCase.h"
#include "RimEclipseCaseTools.h"
#include "RimEclipseCellColors.h"
#include "RimEclipseFaultColors.h"
#include "RimEclipsePropertyFilter.h"
@@ -82,6 +83,7 @@
#include "RimStreamlineInViewCollection.h"
#include "RimSurfaceInViewCollection.h"
#include "RimTernaryLegendConfig.h"
#include "RimTools.h"
#include "RimViewController.h"
#include "RimViewLinker.h"
#include "RimViewNameConfig.h"
@@ -140,6 +142,8 @@ RimEclipseView::RimEclipseView()
"EclipseView",
"The Eclipse 3d Reservoir View" );
CAF_PDM_InitFieldNoDefault( &m_customEclipseCase, "CustomEclipseCase", "Custom Case" );
CAF_PDM_InitScriptableFieldWithScriptKeywordNoDefault( &m_cellResult, "GridCellResult", "CellResult", "Cell Result", ":/CellResult.png" );
m_cellResult = new RimEclipseCellColors();
m_cellResult.uiCapability()->setUiTreeHidden( true );
@@ -378,6 +382,19 @@ void RimEclipseView::setVisibleGridPartsWatertight()
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimEclipseView::propagateEclipseCaseToChildObjects()
{
auto currentEclipseCase = eclipseCase();
cellResult()->setEclipseCase( currentEclipseCase );
faultResultSettings()->customFaultResult()->setEclipseCase( currentEclipseCase );
cellFilterCollection()->setCase( currentEclipseCase );
m_streamlineCollection->setEclipseCase( currentEclipseCase );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -385,6 +402,20 @@ void RimEclipseView::fieldChangedByUi( const caf::PdmFieldHandle* changedField,
{
RimGridView::fieldChangedByUi( changedField, oldValue, newValue );
if ( changedField == &m_customEclipseCase )
{
propagateEclipseCaseToChildObjects();
// Sync with RimReloadCaseTools::updateAll3dViews
loadDataAndUpdate();
updateGridBoxData();
updateAnnotationItems();
zoomAll();
return;
}
if ( changedField == &m_showInvalidCells )
{
scheduleGeometryRegen( INACTIVE );
@@ -453,7 +484,7 @@ void RimEclipseView::onCreateDisplayModel()
RiuMainWindow::instance()->setResultInfo(QString("RimEclipseView::onCreateDisplayModel() ") + QString::number(callCount++));
#endif
if ( !( m_eclipseCase && m_eclipseCase->eclipseCaseData() ) ) return;
if ( !( eclipseCase() && eclipseCase()->eclipseCaseData() ) ) return;
const bool cellFiltersActive = cellFilterCollection()->hasActiveFilters();
const bool propertyFiltersActive = eclipsePropertyFilterCollection()->hasActiveFilters();
@@ -1062,11 +1093,11 @@ void RimEclipseView::onLoadDataAndUpdate()
onUpdateScaleTransform();
if ( m_eclipseCase )
if ( eclipseCase() )
{
if ( !m_eclipseCase->openReserviorCase() )
if ( !eclipseCase()->openReserviorCase() )
{
RiaLogging::warning( "Could not open the Eclipse Grid file: \n" + m_eclipseCase->gridFileName() );
RiaLogging::warning( "Could not open the Eclipse Grid file: \n" + eclipseCase()->gridFileName() );
setEclipseCase( nullptr );
return;
}
@@ -1278,9 +1309,9 @@ void RimEclipseView::onUpdateDisplayModelVisibility()
//--------------------------------------------------------------------------------------------------
RigCaseCellResultsData* RimEclipseView::currentGridCellResults() const
{
if ( m_eclipseCase )
if ( eclipseCase() )
{
return m_eclipseCase->results( cellResult()->porosityModel() );
return eclipseCase()->results( cellResult()->porosityModel() );
}
return nullptr;
@@ -1291,9 +1322,9 @@ RigCaseCellResultsData* RimEclipseView::currentGridCellResults() const
//--------------------------------------------------------------------------------------------------
const RigActiveCellInfo* RimEclipseView::currentActiveCellInfo() const
{
if ( m_eclipseCase && m_eclipseCase->eclipseCaseData() )
if ( eclipseCase() && eclipseCase()->eclipseCaseData() )
{
return m_eclipseCase->eclipseCaseData()->activeCellInfo( cellResult()->porosityModel() );
return eclipseCase()->eclipseCaseData()->activeCellInfo( cellResult()->porosityModel() );
}
return nullptr;
@@ -1367,15 +1398,15 @@ void RimEclipseView::onUpdateLegends()
}
}
if ( !m_eclipseCase || !nativeOrOverrideViewer() || !m_eclipseCase->eclipseCaseData() )
if ( !eclipseCase() || !nativeOrOverrideViewer() || !eclipseCase()->eclipseCaseData() )
{
return;
}
RigEclipseCaseData* eclipseCase = m_eclipseCase->eclipseCaseData();
CVF_ASSERT( eclipseCase );
RigEclipseCaseData* eclipseCaseData = eclipseCase()->eclipseCaseData();
CVF_ASSERT( eclipseCaseData );
RigCaseCellResultsData* results = eclipseCase->results( cellResult()->porosityModel() );
RigCaseCellResultsData* results = eclipseCaseData->results( cellResult()->porosityModel() );
CVF_ASSERT( results );
updateLegendRangesTextAndVisibility( cellResult()->legendConfig(),
@@ -1535,10 +1566,8 @@ void RimEclipseView::updateLegendRangesTextAndVisibility( RimRegularLegendConfig
void RimEclipseView::setEclipseCase( RimEclipseCase* reservoir )
{
m_eclipseCase = reservoir;
cellResult()->setEclipseCase( reservoir );
faultResultSettings()->customFaultResult()->setEclipseCase( reservoir );
cellFilterCollection()->setCase( reservoir );
m_streamlineCollection->setEclipseCase( reservoir );
propagateEclipseCaseToChildObjects();
}
//--------------------------------------------------------------------------------------------------
@@ -1546,6 +1575,8 @@ void RimEclipseView::setEclipseCase( RimEclipseCase* reservoir )
//--------------------------------------------------------------------------------------------------
RimEclipseCase* RimEclipseView::eclipseCase() const
{
if ( m_customEclipseCase() != nullptr ) return m_customEclipseCase();
return m_eclipseCase;
}
@@ -1564,9 +1595,9 @@ RimEclipseCase* RimEclipseView::eclipseCase() const
//--------------------------------------------------------------------------------------------------
void RimEclipseView::syncronizeWellsWithResults()
{
if ( !( m_eclipseCase && m_eclipseCase->eclipseCaseData() ) ) return;
if ( !( eclipseCase() && eclipseCase()->eclipseCaseData() ) ) return;
cvf::Collection<RigSimWellData> wellResults = m_eclipseCase->eclipseCaseData()->wellResults();
cvf::Collection<RigSimWellData> wellResults = eclipseCase()->eclipseCaseData()->wellResults();
std::vector<caf::PdmPointer<RimSimWellInView>> newWells;
@@ -1880,6 +1911,10 @@ void RimEclipseView::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering&
caf::PdmUiGroup* nameGroup = uiOrdering.addNewGroup( "View Name" );
nameConfig()->uiOrdering( uiConfigName, *nameGroup );
caf::PdmUiGroup* advancedGroup = uiOrdering.addNewGroup( "Advanced" );
advancedGroup->setCollapsedByDefault();
advancedGroup->add( &m_customEclipseCase );
uiOrdering.skipRemainingFields( true );
}
@@ -1949,6 +1984,40 @@ std::set<RivCellSetEnum> RimEclipseView::allVisibleFaultGeometryTypes() const
return faultGeoTypes;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QList<caf::PdmOptionItemInfo> RimEclipseView::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions )
{
if ( fieldNeedingOptions == &m_customEclipseCase )
{
QList<caf::PdmOptionItemInfo> options;
options.push_back( caf::PdmOptionItemInfo( "None", nullptr ) );
if ( m_eclipseCase && m_eclipseCase->mainGrid() )
{
auto currentGridCount = m_eclipseCase->mainGrid()->gridCount();
for ( auto eclCase : RimEclipseCaseTools::allEclipseGridCases() )
{
// Find all grid cases with same number of LGRs. If the grid count differs, a crash will happen related to
// RimGridCollection::mainEclipseGrid(). This function is using firstAncestorOrThisOfType() to find the Eclipse case. If the
// custom case in RimEclipseView has a different number of LGRs, a crash will happen
if ( eclCase && ( eclCase != m_eclipseCase ) && m_eclipseCase->mainGrid() && eclCase->mainGrid()->gridCount() == currentGridCount )
{
options.push_back( caf::PdmOptionItemInfo( eclCase->caseUserDescription(), eclCase, false, eclCase->uiIconProvider() ) );
}
}
}
return options;
}
return RimGridView::calculateValueOptions( fieldNeedingOptions );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@@ -184,6 +184,8 @@ protected:
RimPropertyFilterCollection* nativePropertyFilterCollection();
virtual std::set<RivCellSetEnum> allVisibleFaultGeometryTypes() const;
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override;
private:
QString createAutoName() const override;
@@ -217,6 +219,8 @@ private:
void setVisibleGridParts( const std::vector<RivCellSetEnum>& cellSets );
void setVisibleGridPartsWatertight();
void propagateEclipseCaseToChildObjects();
protected:
cvf::ref<cvf::ModelBasicList> m_faultReactVizModel;
@@ -241,7 +245,8 @@ private:
caf::PdmChildField<RimEclipsePropertyFilterCollection*> m_propertyFilterCollection;
caf::PdmPointer<RimEclipsePropertyFilterCollection> m_overridePropertyFilterCollection;
caf::PdmPointer<RimEclipseCase> m_eclipseCase;
caf::PdmPointer<RimEclipseCase> m_eclipseCase;
caf::PdmPtrField<RimEclipseCase*> m_customEclipseCase;
cvf::ref<RivReservoirViewPartMgr> m_reservoirGridPartManager;
cvf::ref<RivReservoirSimWellsPartMgr> m_simWellsPartManager;