From eae6012b77e692467002ffee3601f36fbb436f2a Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 5 Aug 2016 09:28:04 +0200 Subject: [PATCH] #282 Use value selection to filter cells --- .../RivReservoirViewPartMgr.cpp | 68 ++++++++--- .../RimEclipsePropertyFilter.cpp | 110 +++++++++++------- .../RimEclipsePropertyFilter.h | 14 ++- 3 files changed, 130 insertions(+), 62 deletions(-) diff --git a/ApplicationCode/ModelVisualization/RivReservoirViewPartMgr.cpp b/ApplicationCode/ModelVisualization/RivReservoirViewPartMgr.cpp index 8790a909ba..1b1189c80c 100644 --- a/ApplicationCode/ModelVisualization/RivReservoirViewPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivReservoirViewPartMgr.cpp @@ -781,11 +781,8 @@ void RivReservoirViewPartMgr::computePropertyVisibility(cvf::UByteArray* cellVis { RimEclipsePropertyFilter* propertyFilter = propFilterColl->propertyFilters()[i]; - if (propertyFilter->isActive()&& propertyFilter->resultDefinition->hasResult()) + if (propertyFilter->isActive() && propertyFilter->resultDefinition->hasResult()) { - const double lowerBound = propertyFilter->lowerBound(); - const double upperBound = propertyFilter->upperBound(); - const RimCellFilter::FilterModeType filterType = propertyFilter->filterMode(); RigCaseData* eclipseCase = propFilterColl->reservoirView()->eclipseCase()->reservoirData(); @@ -803,26 +800,65 @@ void RivReservoirViewPartMgr::computePropertyVisibility(cvf::UByteArray* cellVis CVF_ASSERT(resultAccessor.notNull()); - //#pragma omp parallel for schedule(dynamic) - for (int cellIndex = 0; cellIndex < static_cast(grid->cellCount()); cellIndex++) + if (propertyFilter->isValueSelectionActive()) { - if ( (*cellVisibility)[cellIndex] ) + std::vector integerVector = propertyFilter->selectedValues(); + std::set integerSet; + for (auto val : integerVector) { - size_t resultValueIndex = cellIndex; - - double scalarValue = resultAccessor->cellScalar(resultValueIndex); - if (lowerBound <= scalarValue && scalarValue <= upperBound) + integerSet.insert(val); + } + + for (int cellIndex = 0; cellIndex < static_cast(grid->cellCount()); cellIndex++) + { + if ((*cellVisibility)[cellIndex]) { - if (filterType == RimCellFilter::EXCLUDE) + size_t resultValueIndex = cellIndex; + + double scalarValue = resultAccessor->cellScalar(resultValueIndex); + if (integerSet.find(scalarValue) != integerSet.end()) { - (*cellVisibility)[cellIndex] = false; + if (filterType == RimCellFilter::EXCLUDE) + { + (*cellVisibility)[cellIndex] = false; + } + } + else + { + if (filterType == RimCellFilter::INCLUDE) + { + (*cellVisibility)[cellIndex] = false; + } } } - else + } + } + else + { + double lowerBound = 0.0; + double upperBound = 0.0; + propertyFilter->rangeValues(&lowerBound, &upperBound); + + for (int cellIndex = 0; cellIndex < static_cast(grid->cellCount()); cellIndex++) + { + if ((*cellVisibility)[cellIndex]) { - if (filterType == RimCellFilter::INCLUDE) + size_t resultValueIndex = cellIndex; + + double scalarValue = resultAccessor->cellScalar(resultValueIndex); + if (lowerBound <= scalarValue && scalarValue <= upperBound) { - (*cellVisibility)[cellIndex] = false; + if (filterType == RimCellFilter::EXCLUDE) + { + (*cellVisibility)[cellIndex] = false; + } + } + else + { + if (filterType == RimCellFilter::INCLUDE) + { + (*cellVisibility)[cellIndex] = false; + } } } } diff --git a/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilter.cpp b/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilter.cpp index a847cb15df..05ef4b3a44 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilter.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilter.cpp @@ -69,16 +69,16 @@ RimEclipsePropertyFilter::RimEclipsePropertyFilter() resultDefinition.uiCapability()->setUiHidden(true); resultDefinition.uiCapability()->setUiChildrenHidden(true); - CAF_PDM_InitField(&lowerBound, "LowerBound", 0.0, "Min", "", "", ""); - lowerBound.uiCapability()->setUiEditorTypeName(caf::PdmUiDoubleSliderEditor::uiEditorTypeName()); + CAF_PDM_InitField(&m_lowerBound, "LowerBound", 0.0, "Min", "", "", ""); + m_lowerBound.uiCapability()->setUiEditorTypeName(caf::PdmUiDoubleSliderEditor::uiEditorTypeName()); - CAF_PDM_InitField(&upperBound, "UpperBound", 0.0, "Max", "", "", ""); - upperBound.uiCapability()->setUiEditorTypeName(caf::PdmUiDoubleSliderEditor::uiEditorTypeName()); + CAF_PDM_InitField(&m_upperBound, "UpperBound", 0.0, "Max", "", "", ""); + m_upperBound.uiCapability()->setUiEditorTypeName(caf::PdmUiDoubleSliderEditor::uiEditorTypeName()); - CAF_PDM_InitFieldNoDefault(&selectedCategoryValues, "SelectedCategoryValues", "Categories", "", "", ""); + CAF_PDM_InitFieldNoDefault(&m_selectedValues, "SelectedValues", "Values", "", "", ""); - CAF_PDM_InitField(&useRangeInsteadOfCategories, "UseRangeInsteadOfCategories", false, "Use Range selection for Categories", "", "", ""); - upperBound.uiCapability()->setUiEditorTypeName(caf::PdmUiDoubleSliderEditor::uiEditorTypeName()); + CAF_PDM_InitField(&m_valueSelection, "Value Selection", true, "Value Selection", "", "", ""); + m_upperBound.uiCapability()->setUiEditorTypeName(caf::PdmUiDoubleSliderEditor::uiEditorTypeName()); updateIconState(); @@ -94,19 +94,53 @@ RimEclipsePropertyFilter::~RimEclipsePropertyFilter() delete resultDefinition; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipsePropertyFilter::rangeValues(double* lower, double* upper) const +{ + *lower = this->m_lowerBound; + *upper = this->m_upperBound; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEclipsePropertyFilter::isValueSelectionActive() const +{ + if (resultDefinition->hasCategoryResult() && m_valueSelection) + { + return true; + } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimEclipsePropertyFilter::selectedValues() const +{ + return m_selectedValues; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimEclipsePropertyFilter::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) { - if (&name == changedField) + if (&m_valueSelection == changedField) { + updateFieldVisibility(); } - else if ( &lowerBound == changedField - || &upperBound == changedField + + if ( &m_lowerBound == changedField + || &m_upperBound == changedField || &obsoleteField_evaluationRegion == changedField || &isActive == changedField - || &filterMode == changedField) + || &filterMode == changedField + || &m_selectedValues == changedField + || &m_valueSelection == changedField) { updateFilterName(); this->updateIconState(); @@ -114,10 +148,6 @@ void RimEclipsePropertyFilter::fieldChangedByUi(const caf::PdmFieldHandle* chang parentContainer()->updateDisplayModelNotifyManagedViews(); } - else if (&useRangeInsteadOfCategories == changedField) - { - updateFieldVisibility(); - } } //-------------------------------------------------------------------------------------------------- @@ -137,11 +167,11 @@ void RimEclipsePropertyFilter::setToDefaultValues() computeResultValueRange(); - lowerBound = m_minimumResultValue; - upperBound = m_maximumResultValue; + m_lowerBound = m_minimumResultValue; + m_upperBound = m_maximumResultValue; - selectedCategoryValues = std::vector(); - useRangeInsteadOfCategories = false; + m_selectedValues = m_uniqueCellValues; + m_valueSelection = true; updateFieldVisibility(); } @@ -163,13 +193,13 @@ void RimEclipsePropertyFilter::defineUiOrdering(QString uiConfigName, caf::PdmUi // Fields declared in RimCellFilter uiOrdering.add(&isActive); uiOrdering.add(&filterMode); - uiOrdering.add(&useRangeInsteadOfCategories); + uiOrdering.add(&m_valueSelection); // Fields declared in this class (RimCellPropertyFilter) - uiOrdering.add(&lowerBound); - uiOrdering.add(&upperBound); + uiOrdering.add(&m_lowerBound); + uiOrdering.add(&m_upperBound); - uiOrdering.add(&selectedCategoryValues); + uiOrdering.add(&m_selectedValues); updateReadOnlyStateOfAllFields(); } @@ -191,7 +221,7 @@ QList RimEclipsePropertyFilter::calculateValueOptions(co { QList optionList; - if (&selectedCategoryValues == fieldNeedingOptions) + if (&m_selectedValues == fieldNeedingOptions) { if (useOptionsOnly) *useOptionsOnly = true; @@ -260,28 +290,28 @@ void RimEclipsePropertyFilter::updateFieldVisibility() { if (resultDefinition->hasCategoryResult()) { - useRangeInsteadOfCategories.uiCapability()->setUiHidden(false); + m_valueSelection.uiCapability()->setUiHidden(false); - if (useRangeInsteadOfCategories) + if (!m_valueSelection) { - selectedCategoryValues.uiCapability()->setUiHidden(true); - lowerBound.uiCapability()->setUiHidden(false); - upperBound.uiCapability()->setUiHidden(false); + m_selectedValues.uiCapability()->setUiHidden(true); + m_lowerBound.uiCapability()->setUiHidden(false); + m_upperBound.uiCapability()->setUiHidden(false); } else { - selectedCategoryValues.uiCapability()->setUiHidden(false); - lowerBound.uiCapability()->setUiHidden(true); - upperBound.uiCapability()->setUiHidden(true); + m_selectedValues.uiCapability()->setUiHidden(false); + m_lowerBound.uiCapability()->setUiHidden(true); + m_upperBound.uiCapability()->setUiHidden(true); } } else { - lowerBound.uiCapability()->setUiHidden(false); - upperBound.uiCapability()->setUiHidden(false); + m_lowerBound.uiCapability()->setUiHidden(false); + m_upperBound.uiCapability()->setUiHidden(false); - selectedCategoryValues.uiCapability()->setUiHidden(true); - useRangeInsteadOfCategories.uiCapability()->setUiHidden(true); + m_selectedValues.uiCapability()->setUiHidden(true); + m_valueSelection.uiCapability()->setUiHidden(true); } } @@ -295,7 +325,7 @@ void RimEclipsePropertyFilter::defineEditorAttribute(const caf::PdmFieldHandle* return; } - if (field == &lowerBound || field == &upperBound) + if (field == &m_lowerBound || field == &m_upperBound) { caf::PdmUiDoubleSliderEditorAttribute* myAttr = dynamic_cast(attribute); if (!myAttr) @@ -343,8 +373,8 @@ void RimEclipsePropertyFilter::computeResultValueRange() m_maximumResultValue = max; m_minimumResultValue = min; - lowerBound.uiCapability()->setUiName(QString("Min (%1)").arg(min)); - upperBound.uiCapability()->setUiName(QString("Max (%1)").arg(max)); + m_lowerBound.uiCapability()->setUiName(QString("Min (%1)").arg(min)); + m_upperBound.uiCapability()->setUiName(QString("Max (%1)").arg(max)); } //-------------------------------------------------------------------------------------------------- @@ -354,7 +384,7 @@ void RimEclipsePropertyFilter::updateFilterName() { QString newFiltername; newFiltername = resultDefinition->resultVariable() + " (" - + QString::number(lowerBound()) + " .. " + QString::number(upperBound) + ")"; + + QString::number(m_lowerBound()) + " .. " + QString::number(m_upperBound) + ")"; this->name = newFiltername; uiCapability()->updateConnectedEditors(); diff --git a/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilter.h b/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilter.h index 864b36892b..dda068b4dd 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilter.h +++ b/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilter.h @@ -44,11 +44,11 @@ public: RimEclipsePropertyFilter(); virtual ~RimEclipsePropertyFilter(); - caf::PdmChildField resultDefinition; - - caf::PdmField lowerBound; - caf::PdmField upperBound; + caf::PdmChildField resultDefinition; + void rangeValues(double* lower, double* upper) const; + bool isValueSelectionActive() const; + std::vector selectedValues() const; RimEclipsePropertyFilterCollection* parentContainer(); void setToDefaultValues(); @@ -75,8 +75,10 @@ private: bool isPropertyFilterControlled(); private: - caf::PdmField< std::vector > selectedCategoryValues; - caf::PdmField useRangeInsteadOfCategories; + caf::PdmField m_lowerBound; + caf::PdmField m_upperBound; + caf::PdmField< std::vector > m_selectedValues; + caf::PdmField m_valueSelection; double m_minimumResultValue; double m_maximumResultValue;