#2999 Add support for specifying a list of single cells as range filter

This commit is contained in:
Magne Sjaastad 2018-05-31 11:41:48 +02:00
parent d8cc40b8bc
commit 8afc036ea3
3 changed files with 89 additions and 20 deletions

View File

@ -63,7 +63,10 @@ RimCellRangeFilter::RimCellRangeFilter()
CAF_PDM_InitField(&cellCountK, "CellCountK", 1, "Cell Count K", "", "","");
cellCountK.uiCapability()->setUiEditorTypeName(caf::PdmUiSliderEditor::uiEditorTypeName());
CAF_PDM_InitField(&m_useIndividualCellIndices, "UseIndividualCellIndices", false, "Use Individual Cell Indices", "", "", "");
CAF_PDM_InitFieldNoDefault(&m_individualCellIndices, "IndividualCellIndices", "Cell Indices", "", "Use Ctrl-C for copy and Ctrl-V for paste", "");
updateIconState();
}
@ -138,6 +141,22 @@ void RimCellRangeFilter::updateActiveState()
isActive.uiCapability()->setUiReadOnly(isRangeFilterControlled());
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimCellRangeFilter::useIndividualCellIndices() const
{
return m_useIndividualCellIndices();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
const std::vector<cvf::Vec3d>& RimCellRangeFilter::individualCellIndices() const
{
return m_individualCellIndices.v();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -239,9 +258,9 @@ void RimCellRangeFilter::defineUiOrdering(QString uiConfigName, caf::PdmUiOrderi
std::vector<caf::PdmFieldHandle*> objFields;
this->fields(objFields);
for (size_t i = 0; i < objFields.size(); i ++)
for (auto& objField : objFields)
{
objFields[i]->uiCapability()->setUiReadOnly(readOnlyState);
objField->uiCapability()->setUiReadOnly(readOnlyState);
}
const cvf::StructGridInterface* grid = selectedGrid();
@ -284,6 +303,27 @@ void RimCellRangeFilter::defineUiOrdering(QString uiConfigName, caf::PdmUiOrderi
cellCountJ.uiCapability()->setUiName(QString(" Width"));
cellCountK.uiCapability()->setUiName(QString(" Width"));
}
uiOrdering.add(&name);
uiOrdering.add(&filterMode);
uiOrdering.add(&gridIndex);
uiOrdering.add(&propagateToSubGrids);
uiOrdering.add(&startIndexI);
uiOrdering.add(&cellCountI);
uiOrdering.add(&startIndexJ);
uiOrdering.add(&cellCountJ);
uiOrdering.add(&startIndexK);
uiOrdering.add(&cellCountK);
{
auto group = uiOrdering.addNewGroup("Single Cell Filtering (TEST)");
group->setCollapsedByDefault(true);
group->add(&m_useIndividualCellIndices);
group->add(&m_individualCellIndices);
m_individualCellIndices.uiCapability()->setUiReadOnly(!m_useIndividualCellIndices);
}
}
//--------------------------------------------------------------------------------------------------

View File

@ -22,6 +22,8 @@
#include "RimCellFilter.h"
#include "cafPdmFieldCvfVec3d.h"
class RigGridBase;
class RigMainGrid;
class RimCellRangeFilterCollection;
@ -57,6 +59,9 @@ public:
void setDefaultValues();
void updateActiveState();
bool useIndividualCellIndices() const;
const std::vector<cvf::Vec3d>& individualCellIndices() const;
protected:
virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue);
virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute);
@ -70,6 +75,8 @@ private:
bool isRangeFilterControlled() const;
void computeAndSetValidValues();
const cvf::StructGridInterface* selectedGrid();
caf::PdmField<bool> m_useIndividualCellIndices;
caf::PdmField<std::vector<cvf::Vec3d>> m_individualCellIndices;
};

View File

@ -70,25 +70,47 @@ void RimCellRangeFilterCollection::compoundCellRangeFilter(cvf::CellRangeFilter*
{
if (rangeFilter->filterMode == RimCellFilter::INCLUDE)
{
cellRangeFilter->addCellIncludeRange(
rangeFilter->startIndexI - 1,
rangeFilter->startIndexJ - 1,
rangeFilter->startIndexK - 1,
rangeFilter->startIndexI - 1 + rangeFilter->cellCountI,
rangeFilter->startIndexJ - 1 + rangeFilter->cellCountJ,
rangeFilter->startIndexK - 1 + rangeFilter->cellCountK,
rangeFilter->propagateToSubGrids());
if (rangeFilter->useIndividualCellIndices())
{
for (const auto& cellIndex : rangeFilter->individualCellIndices())
{
cellRangeFilter->addCellInclude(
cellIndex.x() - 1 , cellIndex.y() - 1, cellIndex.z() - 1, rangeFilter->propagateToSubGrids());
}
}
else
{
cellRangeFilter->addCellIncludeRange(
rangeFilter->startIndexI - 1,
rangeFilter->startIndexJ - 1,
rangeFilter->startIndexK - 1,
rangeFilter->startIndexI - 1 + rangeFilter->cellCountI,
rangeFilter->startIndexJ - 1 + rangeFilter->cellCountJ,
rangeFilter->startIndexK - 1 + rangeFilter->cellCountK,
rangeFilter->propagateToSubGrids());
}
}
else
{
cellRangeFilter->addCellExcludeRange(
rangeFilter->startIndexI - 1,
rangeFilter->startIndexJ - 1,
rangeFilter->startIndexK - 1,
rangeFilter->startIndexI - 1 + rangeFilter->cellCountI,
rangeFilter->startIndexJ - 1 + rangeFilter->cellCountJ,
rangeFilter->startIndexK - 1 + rangeFilter->cellCountK,
rangeFilter->propagateToSubGrids());
if (rangeFilter->useIndividualCellIndices())
{
for (const auto& cellIndex : rangeFilter->individualCellIndices())
{
cellRangeFilter->addCellExclude(
cellIndex.x() - 1, cellIndex.y() - 1, cellIndex.z() - 1, rangeFilter->propagateToSubGrids());
}
}
else
{
cellRangeFilter->addCellExcludeRange(
rangeFilter->startIndexI - 1,
rangeFilter->startIndexJ - 1,
rangeFilter->startIndexK - 1,
rangeFilter->startIndexI - 1 + rangeFilter->cellCountI,
rangeFilter->startIndexJ - 1 + rangeFilter->cellCountJ,
rangeFilter->startIndexK - 1 + rangeFilter->cellCountK,
rangeFilter->propagateToSubGrids());
}
}
}
}