#14710 Support ensemble data filters in ensemble contour maps

Replace the built-in formation filter with ensemble data filters. Load ensemble data filters after project read, and parent new views before assigning the case so the ensemble filter collection is resolved correctly.
This commit is contained in:
Magne Sjaastad committed 2026-09-28 10:30:12 +02:00
1 parent 2bdc35ef68
commit 9911c49d2b
20 files changed
+442 -190

No files matched your search

@@ -23,9 +23,11 @@
#include "RimCellRangeFilter.h"
#include "RimCombinedFilter.h"
#include "RimDataFilterCollection.h"
#include "RimDataFilterInView.h"
#include "RimDataFilterInViewCollection.h"
#include "RimEclipseResultCase.h"
#include "RimEclipseView.h"
#include "RimEclipseViewCollection.h"
#include "RimReservoirGridEnsemble.h"
#include "cafSignal.h"
@@ -246,3 +248,58 @@ TEST( RimDataFilterCollection, ensembleViewUsesEnsembleDataFilters )
ensemble->addView( view );
EXPECT_EQ( ensemble->dataFilterCollection(), view->dataFiltersInView()->sourceCollection() );
}
//--------------------------------------------------------------------------------------------------
/// A view created via a case's own view collection should still resolve the ensemble's data filters.
//--------------------------------------------------------------------------------------------------
TEST( RimDataFilterCollection, viewForSingleRealizationUsesEnsembleDataFilters )
{
auto ensemble = std::make_unique<RimReservoirGridEnsemble>();
auto* eclipseCase = new RimEclipseResultCase();
ensemble->addCase( eclipseCase );
RimEclipseView* view = eclipseCase->viewCollection()->addView( eclipseCase );
EXPECT_EQ( ensemble->dataFilterCollection(), view->dataFiltersInView()->sourceCollection() );
}
//--------------------------------------------------------------------------------------------------
/// A filter added to the ensemble after the view exists must still appear as a wrapper in the view.
//--------------------------------------------------------------------------------------------------
TEST( RimDataFilterCollection, viewWrapperAppearsWhenEnsembleFilterAddedAfterViewExists )
{
auto ensemble = std::make_unique<RimReservoirGridEnsemble>();
auto* eclipseCase = new RimEclipseResultCase();
ensemble->addCase( eclipseCase );
RimEclipseView* view = eclipseCase->viewCollection()->addView( eclipseCase );
ASSERT_EQ( ensemble->dataFilterCollection(), view->dataFiltersInView()->sourceCollection() );
EXPECT_TRUE( view->dataFiltersInView()->wrappers().empty() );
ensemble->dataFilterCollection()->addNewPropertyFilter();
ASSERT_EQ( size_t{ 1 }, view->dataFiltersInView()->wrappers().size() );
EXPECT_EQ( ensemble->dataFilterCollection()->filters().front(), view->dataFiltersInView()->wrappers().front()->sourceFilter() );
}
//--------------------------------------------------------------------------------------------------
/// Reproduces RicNewViewForGridEnsembleFeature's "New View" command: the view is created via the
/// ensemble's own view collection, which used to lose the ensemble's data filter because the case
/// was assigned before the view was parented. See #14710.
//--------------------------------------------------------------------------------------------------
TEST( RimDataFilterCollection, viewCreatedViaEnsembleViewCollectionUsesEnsembleDataFilters )
{
auto ensemble = std::make_unique<RimReservoirGridEnsemble>();
auto* eclipseCase = new RimEclipseResultCase();
ensemble->addCase( eclipseCase );
ensemble->dataFilterCollection()->addNewPropertyFilter();
// Exercises the same call path as RicNewViewForGridEnsembleFeature.
RimEclipseView* view = ensemble->viewCollection()->addView( eclipseCase );
EXPECT_EQ( ensemble->dataFilterCollection(), view->dataFiltersInView()->sourceCollection() );
ASSERT_EQ( size_t{ 1 }, view->dataFiltersInView()->wrappers().size() );
}