mirror of
https://github.com/OPM/ResInsight.git
synced 2026-10-12 16:32:12 -05:00
Support both AND and OR operations when combining range and index filters (#11275)
Support both AND and OR operations when combining range and index filters
This commit is contained in:
1 parent
2386ad8985
commit
fb5758a363
7 files changed
+101
-7
No files matched your search
@@ -57,7 +57,8 @@ void RivFemElmVisibilityCalculator::computeRangeVisibility( cvf::UByteArray*
|
|||||||
const cvf::CellRangeFilter& rangeFilter,
|
const cvf::CellRangeFilter& rangeFilter,
|
||||||
const cvf::UByteArray* indexIncludeVisibility,
|
const cvf::UByteArray* indexIncludeVisibility,
|
||||||
const cvf::UByteArray* indexExcludeVisibility,
|
const cvf::UByteArray* indexExcludeVisibility,
|
||||||
bool useIndexInclude )
|
bool useIndexInclude,
|
||||||
|
bool useAndOperation )
|
||||||
{
|
{
|
||||||
elmVisibilities->resize( femPart->elementCount() );
|
elmVisibilities->resize( femPart->elementCount() );
|
||||||
|
|
||||||
@@ -74,11 +75,21 @@ void RivFemElmVisibilityCalculator::computeRangeVisibility( cvf::UByteArray*
|
|||||||
for ( int elmIdx = 0; elmIdx < femPart->elementCount(); ++elmIdx )
|
for ( int elmIdx = 0; elmIdx < femPart->elementCount(); ++elmIdx )
|
||||||
{
|
{
|
||||||
grid->ijkFromCellIndex( elmIdx, &mainGridI, &mainGridJ, &mainGridK );
|
grid->ijkFromCellIndex( elmIdx, &mainGridI, &mainGridJ, &mainGridK );
|
||||||
|
|
||||||
|
if ( useAndOperation )
|
||||||
|
{
|
||||||
|
( *elmVisibilities )[elmIdx] =
|
||||||
|
( ( *indexIncludeVisibility )[elmIdx] && rangeFilter.isCellVisible( mainGridI, mainGridJ, mainGridK, false ) ) &&
|
||||||
|
( *indexExcludeVisibility )[elmIdx];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
( *elmVisibilities )[elmIdx] =
|
( *elmVisibilities )[elmIdx] =
|
||||||
( ( *indexIncludeVisibility )[elmIdx] || rangeFilter.isCellVisible( mainGridI, mainGridJ, mainGridK, false ) ) &&
|
( ( *indexIncludeVisibility )[elmIdx] || rangeFilter.isCellVisible( mainGridI, mainGridJ, mainGridK, false ) ) &&
|
||||||
( *indexExcludeVisibility )[elmIdx];
|
( *indexExcludeVisibility )[elmIdx];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for ( int elmIdx = 0; elmIdx < femPart->elementCount(); ++elmIdx )
|
for ( int elmIdx = 0; elmIdx < femPart->elementCount(); ++elmIdx )
|
||||||
|
|||||||
@@ -41,7 +41,8 @@ public:
|
|||||||
const cvf::CellRangeFilter& rangeFilter,
|
const cvf::CellRangeFilter& rangeFilter,
|
||||||
const cvf::UByteArray* indexIncludeVisibility,
|
const cvf::UByteArray* indexIncludeVisibility,
|
||||||
const cvf::UByteArray* indexExcludeVisibility,
|
const cvf::UByteArray* indexExcludeVisibility,
|
||||||
bool useIndexInclude );
|
bool useIndexInclude,
|
||||||
|
bool useAndOperation );
|
||||||
|
|
||||||
static void computePropertyVisibility( cvf::UByteArray* cellVisibility,
|
static void computePropertyVisibility( cvf::UByteArray* cellVisibility,
|
||||||
const RigFemPart* grid,
|
const RigFemPart* grid,
|
||||||
|
|||||||
@@ -251,7 +251,8 @@ RivGeoMechPartMgr* RivGeoMechVizLogic::getUpdatedPartMgr( RivGeoMechPartMgrCache
|
|||||||
cellRangeFilter,
|
cellRangeFilter,
|
||||||
&indexIncludeVisibility,
|
&indexIncludeVisibility,
|
||||||
&indexExcludeVisibility,
|
&indexExcludeVisibility,
|
||||||
m_geomechView->cellFilterCollection()->hasActiveIncludeIndexFilters() );
|
m_geomechView->cellFilterCollection()->hasActiveIncludeIndexFilters(),
|
||||||
|
m_geomechView->cellFilterCollection()->useAndOperation() );
|
||||||
}
|
}
|
||||||
else if ( pMgrKey.geometryType() == PROPERTY_FILTERED )
|
else if ( pMgrKey.geometryType() == PROPERTY_FILTERED )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -749,9 +749,11 @@ void RivReservoirViewPartMgr::computeFilterVisibility( RivCellSetEnum
|
|||||||
parentGridVisibilities = reservoirGridPartMgr->cellVisibility( parentGridIndex );
|
parentGridVisibilities = reservoirGridPartMgr->cellVisibility( parentGridIndex );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasAdditiveRangeFilters = cellFilterColl->hasActiveIncludeRangeFilters() ||
|
const bool hasAdditiveRangeFilters = cellFilterColl->hasActiveIncludeRangeFilters() ||
|
||||||
m_reservoirView->wellCollection()->hasVisibleWellCells();
|
m_reservoirView->wellCollection()->hasVisibleWellCells();
|
||||||
bool hasAdditiveIndexFilters = cellFilterColl->hasActiveIncludeIndexFilters();
|
const bool hasAdditiveIndexFilters = cellFilterColl->hasActiveIncludeIndexFilters();
|
||||||
|
|
||||||
|
const bool useAndOperation = cellFilterColl->useAndOperation();
|
||||||
|
|
||||||
#pragma omp parallel for
|
#pragma omp parallel for
|
||||||
for ( int cellIndex = 0; cellIndex < static_cast<int>( grid->cellCount() ); cellIndex++ )
|
for ( int cellIndex = 0; cellIndex < static_cast<int>( grid->cellCount() ); cellIndex++ )
|
||||||
@@ -771,7 +773,7 @@ void RivReservoirViewPartMgr::computeFilterVisibility( RivCellSetEnum
|
|||||||
size_t mainGridJ;
|
size_t mainGridJ;
|
||||||
size_t mainGridK;
|
size_t mainGridK;
|
||||||
|
|
||||||
bool isInSubGridArea = cell.subGrid() != nullptr;
|
const bool isInSubGridArea = cell.subGrid() != nullptr;
|
||||||
grid->ijkFromCellIndex( cellIndex, &mainGridI, &mainGridJ, &mainGridK );
|
grid->ijkFromCellIndex( cellIndex, &mainGridI, &mainGridJ, &mainGridK );
|
||||||
|
|
||||||
bool nativeRangeVisibility = false;
|
bool nativeRangeVisibility = false;
|
||||||
@@ -779,10 +781,18 @@ void RivReservoirViewPartMgr::computeFilterVisibility( RivCellSetEnum
|
|||||||
if ( hasAdditiveRangeFilters )
|
if ( hasAdditiveRangeFilters )
|
||||||
{
|
{
|
||||||
if ( hasAdditiveIndexFilters )
|
if ( hasAdditiveIndexFilters )
|
||||||
|
{
|
||||||
|
if ( useAndOperation )
|
||||||
|
{
|
||||||
|
nativeRangeVisibility = indexIncludeVisibility[cellIndex] &&
|
||||||
|
gridCellRangeFilter.isCellVisible( mainGridI, mainGridJ, mainGridK, isInSubGridArea );
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
nativeRangeVisibility = indexIncludeVisibility[cellIndex] ||
|
nativeRangeVisibility = indexIncludeVisibility[cellIndex] ||
|
||||||
gridCellRangeFilter.isCellVisible( mainGridI, mainGridJ, mainGridK, isInSubGridArea );
|
gridCellRangeFilter.isCellVisible( mainGridI, mainGridJ, mainGridK, isInSubGridArea );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nativeRangeVisibility = gridCellRangeFilter.isCellVisible( mainGridI, mainGridJ, mainGridK, isInSubGridArea );
|
nativeRangeVisibility = gridCellRangeFilter.isCellVisible( mainGridI, mainGridJ, mainGridK, isInSubGridArea );
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
#include "RimCellIndexFilter.h"
|
#include "RimCellIndexFilter.h"
|
||||||
#include "RimCellRangeFilter.h"
|
#include "RimCellRangeFilter.h"
|
||||||
#include "RimPolygonFilter.h"
|
#include "RimPolygonFilter.h"
|
||||||
|
#include "RimProject.h"
|
||||||
#include "RimUserDefinedFilter.h"
|
#include "RimUserDefinedFilter.h"
|
||||||
#include "RimUserDefinedIndexFilter.h"
|
#include "RimUserDefinedIndexFilter.h"
|
||||||
#include "RimViewController.h"
|
#include "RimViewController.h"
|
||||||
@@ -32,8 +33,21 @@
|
|||||||
#include "cafPdmFieldReorderCapability.h"
|
#include "cafPdmFieldReorderCapability.h"
|
||||||
#include "cafPdmFieldScriptingCapability.h"
|
#include "cafPdmFieldScriptingCapability.h"
|
||||||
#include "cafPdmObjectScriptingCapability.h"
|
#include "cafPdmObjectScriptingCapability.h"
|
||||||
|
#include "cafPdmUiLabelEditor.h"
|
||||||
|
|
||||||
#include "cvfStructGridGeometryGenerator.h"
|
#include "cvfStructGridGeometryGenerator.h"
|
||||||
|
|
||||||
|
namespace caf
|
||||||
|
{
|
||||||
|
template <>
|
||||||
|
void caf::AppEnum<RimCellFilterCollection::CombineFilterModeType>::setUp()
|
||||||
|
{
|
||||||
|
addItem( RimCellFilterCollection::AND, "AND", "AND" );
|
||||||
|
addItem( RimCellFilterCollection::OR, "OR", "OR" );
|
||||||
|
setDefault( RimCellFilterCollection::AND );
|
||||||
|
}
|
||||||
|
} // namespace caf
|
||||||
|
|
||||||
CAF_PDM_SOURCE_INIT( RimCellFilterCollection, "CellFilterCollection", "RimCellFilterCollection", "CellRangeFilterCollection" );
|
CAF_PDM_SOURCE_INIT( RimCellFilterCollection, "CellFilterCollection", "RimCellFilterCollection", "CellRangeFilterCollection" );
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@@ -47,6 +61,12 @@ RimCellFilterCollection::RimCellFilterCollection()
|
|||||||
CAF_PDM_InitScriptableField( &m_isActive, "Active", true, "Active" );
|
CAF_PDM_InitScriptableField( &m_isActive, "Active", true, "Active" );
|
||||||
m_isActive.uiCapability()->setUiHidden( true );
|
m_isActive.uiCapability()->setUiHidden( true );
|
||||||
|
|
||||||
|
CAF_PDM_InitFieldNoDefault( &m_combineFilterMode, "CombineFilterMode", "" );
|
||||||
|
|
||||||
|
CAF_PDM_InitField( &m_combineModeLabel, "CombineModeLabel", QString( "" ), "Combine Polygon and Range Filters Using Operation" );
|
||||||
|
m_combineModeLabel.uiCapability()->setUiEditorTypeName( caf::PdmUiLabelEditor::uiEditorTypeName() );
|
||||||
|
m_combineModeLabel.xmlCapability()->disableIO();
|
||||||
|
|
||||||
CAF_PDM_InitFieldNoDefault( &m_cellFilters, "CellFilters", "Filters" );
|
CAF_PDM_InitFieldNoDefault( &m_cellFilters, "CellFilters", "Filters" );
|
||||||
caf::PdmFieldReorderCapability::addToField( &m_cellFilters );
|
caf::PdmFieldReorderCapability::addToField( &m_cellFilters );
|
||||||
|
|
||||||
@@ -87,6 +107,14 @@ void RimCellFilterCollection::setActive( bool bActive )
|
|||||||
updateIconState();
|
updateIconState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
bool RimCellFilterCollection::useAndOperation() const
|
||||||
|
{
|
||||||
|
return m_combineFilterMode() == RimCellFilterCollection::AND;
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@@ -124,6 +152,12 @@ void RimCellFilterCollection::initAfterRead()
|
|||||||
m_cellFilters.push_back( filter );
|
m_cellFilters.push_back( filter );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fallback to OR mode for older projects made without AND support
|
||||||
|
if ( RimProject::current()->isProjectFileVersionEqualOrOlderThan( "2023.12.0" ) )
|
||||||
|
{
|
||||||
|
m_combineFilterMode = RimCellFilterCollection::OR;
|
||||||
|
}
|
||||||
|
|
||||||
// Copy by xml serialization does not give a RimCase parent the first time initAfterRead is called here when creating a new a contour
|
// Copy by xml serialization does not give a RimCase parent the first time initAfterRead is called here when creating a new a contour
|
||||||
// view from a 3d view. The second time we get called it is ok, so just skip setting up the filter connections if we have no case.
|
// view from a 3d view. The second time we get called it is ok, so just skip setting up the filter connections if we have no case.
|
||||||
auto rimCase = firstAncestorOrThisOfType<RimCase>();
|
auto rimCase = firstAncestorOrThisOfType<RimCase>();
|
||||||
@@ -161,6 +195,17 @@ caf::PdmFieldHandle* RimCellFilterCollection::objectToggleField()
|
|||||||
return &m_isActive;
|
return &m_isActive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimCellFilterCollection::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
|
||||||
|
{
|
||||||
|
uiOrdering.add( &m_combineModeLabel );
|
||||||
|
uiOrdering.add( &m_combineFilterMode );
|
||||||
|
|
||||||
|
uiOrdering.skipRemainingFields();
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@@ -182,6 +227,18 @@ void RimCellFilterCollection::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTr
|
|||||||
updateIconState();
|
updateIconState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimCellFilterCollection::defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute )
|
||||||
|
{
|
||||||
|
caf::PdmUiLabelEditorAttribute* myAttr = dynamic_cast<caf::PdmUiLabelEditorAttribute*>( attribute );
|
||||||
|
if ( myAttr )
|
||||||
|
{
|
||||||
|
myAttr->m_useSingleWidgetInsteadOfLabelAndEditorWidget = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -49,6 +49,12 @@ class RimCellFilterCollection : public caf::PdmObject
|
|||||||
CAF_PDM_HEADER_INIT;
|
CAF_PDM_HEADER_INIT;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
enum CombineFilterModeType
|
||||||
|
{
|
||||||
|
OR,
|
||||||
|
AND
|
||||||
|
};
|
||||||
|
|
||||||
RimCellFilterCollection();
|
RimCellFilterCollection();
|
||||||
~RimCellFilterCollection() override;
|
~RimCellFilterCollection() override;
|
||||||
|
|
||||||
@@ -68,6 +74,8 @@ public:
|
|||||||
bool isActive() const;
|
bool isActive() const;
|
||||||
void setActive( bool bActive );
|
void setActive( bool bActive );
|
||||||
|
|
||||||
|
bool useAndOperation() const;
|
||||||
|
|
||||||
void compoundCellRangeFilter( cvf::CellRangeFilter* cellRangeFilter, size_t gridIndex ) const;
|
void compoundCellRangeFilter( cvf::CellRangeFilter* cellRangeFilter, size_t gridIndex ) const;
|
||||||
void updateCellVisibilityByIndex( cvf::UByteArray* cellsIncluded, cvf::UByteArray* cellsExcluded, size_t gridIndex ) const;
|
void updateCellVisibilityByIndex( cvf::UByteArray* cellsIncluded, cvf::UByteArray* cellsExcluded, size_t gridIndex ) const;
|
||||||
|
|
||||||
@@ -87,7 +95,10 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
|
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
|
||||||
|
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
|
||||||
void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName ) override;
|
void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName ) override;
|
||||||
|
void defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override;
|
||||||
|
|
||||||
caf::PdmFieldHandle* objectToggleField() override;
|
caf::PdmFieldHandle* objectToggleField() override;
|
||||||
void initAfterRead() override;
|
void initAfterRead() override;
|
||||||
|
|
||||||
@@ -99,6 +110,8 @@ private:
|
|||||||
|
|
||||||
caf::PdmChildArrayField<RimCellFilter*> m_cellFilters;
|
caf::PdmChildArrayField<RimCellFilter*> m_cellFilters;
|
||||||
caf::PdmField<bool> m_isActive;
|
caf::PdmField<bool> m_isActive;
|
||||||
|
caf::PdmField<QString> m_combineModeLabel;
|
||||||
|
caf::PdmField<caf::AppEnum<CombineFilterModeType>> m_combineFilterMode;
|
||||||
|
|
||||||
caf::PdmChildArrayField<RimCellRangeFilter*> m_rangeFilters_OBSOLETE;
|
caf::PdmChildArrayField<RimCellRangeFilter*> m_rangeFilters_OBSOLETE;
|
||||||
};
|
};
|
||||||
@@ -161,7 +161,8 @@ cvf::ref<cvf::UByteArray> RimGeoMechContourMapProjection::getCellVisibility() co
|
|||||||
cellRangeFilter,
|
cellRangeFilter,
|
||||||
&indexIncludeVis,
|
&indexIncludeVis,
|
||||||
&indexExcludeVis,
|
&indexExcludeVis,
|
||||||
view()->cellFilterCollection()->hasActiveIncludeIndexFilters() );
|
view()->cellFilterCollection()->hasActiveIncludeIndexFilters(),
|
||||||
|
view()->cellFilterCollection()->useAndOperation() );
|
||||||
}
|
}
|
||||||
if ( view()->propertyFilterCollection()->isActive() )
|
if ( view()->propertyFilterCollection()->isActive() )
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in new issue
Block a user