From 26314940a3e246f41376708613f460354f3f5c56 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Mon, 14 Sep 2026 15:30:16 +0200 Subject: [PATCH] #14345 Property Filter: Use view case for ensemble filters --- .../CellFilters/RimDataFilterInView.cpp | 5 +- .../UnitTests/RimCellFilterTools-Test.cpp | 64 +++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimDataFilterInView.cpp b/ApplicationLibCode/ProjectDataModel/CellFilters/RimDataFilterInView.cpp index ec63632020..cd47f79bec 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimDataFilterInView.cpp +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimDataFilterInView.cpp @@ -20,6 +20,7 @@ #include "Rim3dView.h" #include "RimCellFilter.h" +#include "RimEclipseView.h" #include "RimGridView.h" #include "Riu3DMainWindowTools.h" @@ -88,7 +89,9 @@ bool RimDataFilterInView::isEvaluatable() const void RimDataFilterInView::applyToCellVisibility( cvf::UByteArray* cellVisibility, const RigGridBase* grid, size_t timeStepIndex ) { if ( !isEvaluatable() ) return; - m_sourceFilter()->applyToCellVisibility( cellVisibility, grid, timeStepIndex ); + + auto* view = firstAncestorOrThisOfType(); + m_sourceFilter()->applyToCellVisibility( cellVisibility, grid, timeStepIndex, view ? view->eclipseCase() : nullptr ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UnitTests/RimCellFilterTools-Test.cpp b/ApplicationLibCode/UnitTests/RimCellFilterTools-Test.cpp index 73f269f9c7..04fb93b17a 100644 --- a/ApplicationLibCode/UnitTests/RimCellFilterTools-Test.cpp +++ b/ApplicationLibCode/UnitTests/RimCellFilterTools-Test.cpp @@ -31,9 +31,12 @@ #include "RimCellFilterTools.h" #include "RimCellRangeFilter.h" #include "RimDataFilterCollection.h" +#include "RimDataFilterInView.h" +#include "RimDataFilterInViewCollection.h" #include "RimEclipsePropertyFilter.h" #include "RimEclipseResultCase.h" #include "RimEclipseResultDefinition.h" +#include "RimEclipseView.h" #include "RimReservoirGridEnsemble.h" #include "cafPdmField.h" @@ -177,6 +180,67 @@ TEST( RimCellFilterToolsTest, GridEnsembleDataFilterCollection ) EXPECT_EQ( size_t( 10 * 10 * 1 ), visibleCount ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RimCellFilterToolsTest, EnsembleDataFilterInViewUsesViewCase ) +{ + auto caseA = openBruggeCase( "Real0", "BRUGGE_0000.EGRID" ); + auto caseB = openBruggeCase( "Real40", "BRUGGE_0040.EGRID" ); + ASSERT_TRUE( caseA != nullptr ); + ASSERT_TRUE( caseB != nullptr ); + + auto ensemble = std::make_unique(); + + RimEclipseResultCase* mainCase = caseA.release(); + RimEclipseResultCase* viewCase = caseB.release(); + ensemble->addCase( mainCase ); + ensemble->addCase( viewCase ); + + auto* view = new RimEclipseView(); + view->setEclipseCase( viewCase ); + ensemble->addView( view ); + + auto* propertyFilter = ensemble->dataFilterCollection()->addNewPropertyFilter(); + ASSERT_TRUE( propertyFilter != nullptr ); + EXPECT_EQ( mainCase, propertyFilter->resultDefinition()->eclipseCase() ); + + propertyFilter->resultDefinition()->setResultType( RiaDefines::ResultCatType::DYNAMIC_NATIVE ); + propertyFilter->resultDefinition()->setResultVariable( RiaResultNames::swat() ); + + auto* lowerField = dynamic_cast*>( propertyFilter->findField( "LowerBound" ) ); + auto* upperField = dynamic_cast*>( propertyFilter->findField( "UpperBound" ) ); + ASSERT_TRUE( lowerField && upperField ); + lowerField->setValue( 0.3 ); + upperField->setValue( 0.6 ); + + auto wrappers = view->dataFiltersInView()->wrappers(); + ASSERT_EQ( 1u, wrappers.size() ); + wrappers.front()->setCheckState( true ); + + const size_t timeStepIndex = 5; + auto expectedViewCaseVisibility = RimCellFilterTools::computeReservoirCellVisibility( propertyFilter, viewCase, timeStepIndex ); + auto mainCaseVisibility = RimCellFilterTools::computeReservoirCellVisibility( propertyFilter, mainCase, timeStepIndex ); + ASSERT_TRUE( expectedViewCaseVisibility.notNull() ); + ASSERT_TRUE( mainCaseVisibility.notNull() ); + + const RigMainGrid* viewGrid = viewCase->eclipseCaseData()->mainGrid(); + cvf::UByteArray viewVisibility( viewGrid->cellCount() ); + viewVisibility.setAll( true ); + wrappers.front()->applyToCellVisibility( &viewVisibility, viewGrid, timeStepIndex ); + + ASSERT_EQ( expectedViewCaseVisibility->size(), viewVisibility.size() ); + ASSERT_EQ( mainCaseVisibility->size(), viewVisibility.size() ); + + size_t differingFromMainCase = 0; + for ( size_t i = 0; i < viewVisibility.size(); i++ ) + { + EXPECT_EQ( expectedViewCaseVisibility->val( i ), viewVisibility.val( i ) ); + if ( mainCaseVisibility->val( i ) != viewVisibility.val( i ) ) differingFromMainCase++; + } + EXPECT_GT( differingFromMainCase, 0u ); +} + //-------------------------------------------------------------------------------------------------- /// //--------------------------------------------------------------------------------------------------