#14345 Add Data Filters to grid ensembles

Add a data filter collection to RimReservoirGridEnsemble, so filters can be defined once for the ensemble. The filters are bound to the main case of the ensemble for configuration.

Expose filter creation commands from a Data Filters submenu on the ensemble node, and hide the collection node while empty, matching the case-level behavior. Grid calculation integration is intentionally left for the dependent calculation-filtering change.
This commit is contained in:
Kristian Bendiksen committed 2026-09-09 10:14:41 +02:00
1 parent 2f2f0fd4e8
commit ab43e67f0f
4 files changed
+59 -6

No files matched your search

@@ -18,6 +18,8 @@
#include "RimReservoirGridEnsemble.h"
#include "cafPdmUiTreeOrdering.h"
#include "RiaLogging.h"
#include "RiaQStringFormatter.h"
#include "RiaResultNames.h"
@@ -37,6 +39,7 @@
#include "Formations/RimFormationNamesCollection.h"
#include "Rim2dIntersectionViewCollection.h"
#include "RimCaseCollection.h"
#include "RimDataFilterCollection.h"
#include "RimEclipseCase.h"
#include "RimEclipseCellColors.h"
#include "RimEclipseResultCase.h"
@@ -111,6 +114,9 @@ RimReservoirGridEnsemble::RimReservoirGridEnsemble()
CAF_PDM_InitFieldNoDefault( &m_ensembleCase, "EnsembleCase", "Ensemble Grid" );
m_ensembleCase = nullptr;
CAF_PDM_InitScriptableFieldNoDefault( &m_dataFilterCollection, "DataFilterCollection", "Data Filters" );
m_dataFilterCollection = new RimDataFilterCollection;
CAF_PDM_InitFieldNoDefault( &m_viewCollection, "ViewCollection", "Views" );
m_viewCollection = new RimEclipseViewCollection;
m_viewCollection->setEclipseCaseProvider( [this]() { return this->cases(); } );
@@ -195,6 +201,7 @@ void RimReservoirGridEnsemble::addCase( RimEclipseCase* reservoir )
clearActiveCellUnions();
clearStatisticsResults();
updateMainGridAndActiveCellsForStatisticsCases();
updateDataFilterCollectionCase();
}
//--------------------------------------------------------------------------------------------------
@@ -214,6 +221,7 @@ void RimReservoirGridEnsemble::removeCase( RimEclipseCase* reservoir )
clearActiveCellUnions();
clearStatisticsResults();
updateMainGridAndActiveCellsForStatisticsCases();
updateDataFilterCollectionCase();
}
//--------------------------------------------------------------------------------------------------
@@ -648,6 +656,13 @@ void RimReservoirGridEnsemble::appendMenuItems( caf::CmdFeatureMenuBuilder& menu
{
menuBuilder << "RicNewStatisticsCaseFeature";
}
// The "Data Filters" collection node is hidden while empty, so expose the filter creation
// commands on the ensemble node to allow creating the first filter.
menuBuilder << "Separator";
menuBuilder.subMenuStart( "Data Filters", QIcon( ":/CellFilter.png" ) );
m_dataFilterCollection->appendMenuItems( menuBuilder );
menuBuilder.subMenuEnd();
}
//--------------------------------------------------------------------------------------------------
@@ -659,6 +674,24 @@ RimFormationNames* RimReservoirGridEnsemble::activeFormationNames() const
return m_activeFormationNames();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimDataFilterCollection* RimReservoirGridEnsemble::dataFilterCollection() const
{
return m_dataFilterCollection();
}
//--------------------------------------------------------------------------------------------------
/// The filters in the collection need a source case for configuration (result meta data, grid
/// geometry). Use the main case of the ensemble. Evaluation of the filters is done per case, see
/// RimCellFilterTools::computeReservoirCellVisibility.
//--------------------------------------------------------------------------------------------------
void RimReservoirGridEnsemble::updateDataFilterCollectionCase()
{
if ( m_dataFilterCollection() ) m_dataFilterCollection->setCase( mainCase() );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -725,6 +758,12 @@ void RimReservoirGridEnsemble::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiT
uiTreeOrdering.add( &m_caseCollection );
uiTreeOrdering.add( &m_statisticsCaseCollection );
if ( m_dataFilterCollection() && m_dataFilterCollection()->shouldBeVisibleInTree() )
{
uiTreeOrdering.add( m_dataFilterCollection() );
}
uiTreeOrdering.add( &m_viewCollection );
for ( auto eclipseCase : cases() )
@@ -793,6 +832,7 @@ void RimReservoirGridEnsemble::initAfterRead()
m_viewCollection->setEclipseCaseProvider( [this]() { return this->cases(); } );
}
updateDataFilterCollectionCase();
updateStatisticsVisibility();
}
@@ -35,6 +35,7 @@
class RigActiveCellInfo;
class RigMainGrid;
class RimCaseCollection;
class RimDataFilterCollection;
class RimEclipseCase;
class RimEclipseStatisticsCase;
class RimEclipseView;
@@ -98,6 +99,9 @@ public:
// Formation names
RimFormationNames* activeFormationNames() const override;
// Data filters
RimDataFilterCollection* dataFilterCollection() const;
// Statistics
RimCaseCollection* statisticsCaseCollection() const override;
RimEclipseStatisticsCase* createAndAppendStatisticsCase() override;
@@ -144,6 +148,7 @@ private:
void loadGridsInSharedMode();
void loadGridsInIndividualMode();
void updateGridModeToolTip();
void updateDataFilterCollectionCase();
private:
// File set reference
@@ -160,6 +165,9 @@ private:
caf::PdmChildField<RimCaseCollection*> m_statisticsCaseCollection;
caf::PdmChildField<RimEclipseCase*> m_ensembleCase;
// Data filters
caf::PdmChildField<RimDataFilterCollection*> m_dataFilterCollection;
// Grid mode
caf::PdmField<bool> m_autoDetectGridType;
caf::PdmField<caf::AppEnum<GridModeType>> m_gridMode;