#2660 Ensemble curves filtering. Refactoring

This commit is contained in:
Bjørn Erik Jensen 2018-06-01 09:08:31 +02:00
parent 58ba0b2882
commit 3aa7204191
3 changed files with 55 additions and 69 deletions

View File

@ -19,6 +19,7 @@
#include "RimEnsembleCurveFilter.h"
#include "RimEnsembleCurveFilterCollection.h"
#include "RimEnsembleCurveSet.h"
#include "RimSummaryCase.h"
#include "cafPdmUiDoubleSliderEditor.h"
@ -55,30 +56,6 @@ bool RimEnsembleCurveFilter::isActive() const
return (!coll || coll->isActive()) && m_active;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimEnsembleCurveFilter::ensembleParameter() const
{
return m_ensembleParameter;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RimEnsembleCurveFilter::minValue() const
{
return m_minValue;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RimEnsembleCurveFilter::maxValue() const
{
return m_maxValue;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -185,6 +162,52 @@ void RimEnsembleCurveFilter::defineUiOrdering(QString uiConfigName, caf::PdmUiOr
uiOrdering.skipRemainingFields(true);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimSummaryCase*> RimEnsembleCurveFilter::applyFilter(const std::vector<RimSummaryCase*>& allSumCases)
{
auto curveSet = parentCurveSet();
auto ensemble = curveSet ? curveSet->summaryCaseCollection() : nullptr;
if (!ensemble || !isActive()) return allSumCases;
std::set<RimSummaryCase*> casesToRemove;
for (const auto& sumCase : allSumCases)
{
auto eParam = ensemble->ensembleParameter(m_ensembleParameter());
if (!eParam.isValid()) continue;
if (!sumCase->caseRealizationParameters()) continue;
auto crpValue = sumCase->caseRealizationParameters()->parameterValue(m_ensembleParameter());
if (eParam.isNumeric())
{
if (!crpValue.isNumeric() ||
crpValue.numericValue() < m_minValue() ||
crpValue.numericValue() > m_maxValue())
{
casesToRemove.insert(sumCase);
}
}
else if (eParam.isText())
{
const auto& filterCategories = categories();
if (!crpValue.isText() ||
std::count(filterCategories.begin(), filterCategories.end(), crpValue.textValue()) == 0)
{
casesToRemove.insert(sumCase);
}
}
}
std::vector<RimSummaryCase*> filteredCases;
std::set<RimSummaryCase*> allCasesSet(allSumCases.begin(), allSumCases.end());
std::set_difference(allCasesSet.begin(), allCasesSet.end(),
casesToRemove.begin(), casesToRemove.end(),
std::inserter(filteredCases, filteredCases.end()));
return filteredCases;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -23,6 +23,7 @@
#include "cafPdmObject.h"
class RimEnsembleCurveSet;
class RimSummaryCase;
//==================================================================================================
///
@ -35,15 +36,14 @@ public:
RimEnsembleCurveFilter();
bool isActive() const;
QString ensembleParameter() const;
double minValue() const;
double maxValue() const;
std::set<QString> categories() const;
virtual QList<caf::PdmOptionItemInfo> calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly) override;
virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override;
virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override;
std::vector<RimSummaryCase*> applyFilter(const std::vector<RimSummaryCase*>& allSumCases);
protected:
virtual caf::PdmFieldHandle* objectToggleField();

View File

@ -930,51 +930,14 @@ std::vector<RimSummaryCase*> RimEnsembleCurveSet::filterEnsembleCases(const RimS
{
if (!ensemble) return std::vector<RimSummaryCase*>();
std::set<RimSummaryCase*> notIncludeCases;
if (!m_curveFilters->filters().empty())
auto sumCases = ensemble->allSummaryCases();
for (auto& filter : m_curveFilters->filters())
{
for (const auto& sumCase : ensemble->allSummaryCases())
{
for (const auto& filter : m_curveFilters()->filters())
{
if (!filter->isActive()) continue;
auto eParam = ensemble->ensembleParameter(filter->ensembleParameter());
if (!eParam.isValid()) continue;
if (!sumCase->caseRealizationParameters()) continue;
auto crpValue = sumCase->caseRealizationParameters()->parameterValue(filter->ensembleParameter());
if (eParam.isNumeric())
{
if (!crpValue.isNumeric() ||
crpValue.numericValue() < filter->minValue() ||
crpValue.numericValue() > filter->maxValue())
{
notIncludeCases.insert(sumCase);
break;
}
}
else if (eParam.isText())
{
const auto& filterCategories = filter->categories();
if (!crpValue.isText() ||
std::count(filterCategories.begin(), filterCategories.end(), crpValue.textValue()) == 0)
{
notIncludeCases.insert(sumCase);
break;
}
}
}
}
sumCases = filter->applyFilter(sumCases);
}
std::vector<RimSummaryCase*> filteredCases;
const auto& allSumCaseVector = ensemble->allSummaryCases();
std::set<RimSummaryCase*> allCasesSet(allSumCaseVector.begin(), allSumCaseVector.end());
std::set_difference(allCasesSet.begin(), allCasesSet.end(),
notIncludeCases.begin(), notIncludeCases.end(),
std::inserter(filteredCases, filteredCases.end()));
return filteredCases;
return sumCases;
}
//--------------------------------------------------------------------------------------------------