#3056 Ensemble curve filters. Add dynamic groups for filtering

This commit is contained in:
Bjørn Erik Jensen 2018-06-18 11:54:04 +02:00
parent 9f1e4fa721
commit 65de617935
6 changed files with 158 additions and 12 deletions

View File

@ -22,6 +22,7 @@
#include "RimSummaryCase.h"
#include "cafPdmUiDoubleSliderEditor.h"
#include "cafPdmUiPushButtonEditor.h"
#include <algorithm>
@ -29,14 +30,21 @@
CAF_PDM_SOURCE_INIT(RimEnsembleCurveFilter, "RimEnsembleCurveFilter");
//--------------------------------------------------------------------------------------------------
/// Internal constants
//--------------------------------------------------------------------------------------------------
#define DOUBLE_INF std::numeric_limits<double>::infinity()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimEnsembleCurveFilter::RimEnsembleCurveFilter() : m_lowerLimit(0), m_upperLimit(0)
RimEnsembleCurveFilter::RimEnsembleCurveFilter() : m_lowerLimit(DOUBLE_INF), m_upperLimit(DOUBLE_INF)
{
CAF_PDM_InitObject("Ensemble Curve Filter", ":/EnsembleCurveSet16x16.png", "", "");
CAF_PDM_InitFieldNoDefault(&m_active, "Active", "Active", "", "", "");
m_active = true;
CAF_PDM_InitFieldNoDefault(&m_ensembleParameterName, "EnsembleParameter", "Ensemble Parameter", "", "", "");
CAF_PDM_InitFieldNoDefault(&m_minValue, "MinValue", "Min", "", "", "");
@ -46,6 +54,19 @@ RimEnsembleCurveFilter::RimEnsembleCurveFilter() : m_lowerLimit(0), m_upperLimit
m_maxValue.uiCapability()->setUiEditorTypeName(caf::PdmUiDoubleSliderEditor::uiEditorTypeName());
CAF_PDM_InitFieldNoDefault(&m_categories, "Categories", "Categories", "", "", "");
CAF_PDM_InitFieldNoDefault(&m_deleteButton, "DeleteEnsembleFilter", "Delete Filter", "", "", "");
m_deleteButton = false;
m_deleteButton.uiCapability()->setUiEditorTypeName(caf::PdmUiPushButtonEditor::uiEditorTypeName());
m_deleteButton.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::HIDDEN);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimEnsembleCurveFilter::RimEnsembleCurveFilter(const QString& ensembleParameterName) : RimEnsembleCurveFilter()
{
m_ensembleParameterName = ensembleParameterName;
}
//--------------------------------------------------------------------------------------------------
@ -59,6 +80,22 @@ bool RimEnsembleCurveFilter::isActive() const
return (!coll || coll->isActive()) && m_active;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RimEnsembleCurveFilter::minValue() const
{
return m_minValue;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RimEnsembleCurveFilter::maxValue() const
{
return m_maxValue;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -68,6 +105,22 @@ std::set<QString> RimEnsembleCurveFilter::categories() const
return std::set<QString>(cs.begin(), cs.end());
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimEnsembleCurveFilter::ensembleParameterName() const
{
return m_ensembleParameterName;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimEnsembleCurveFilter::filterId() const
{
return QString("%1").arg((int64_t)this);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -128,13 +181,33 @@ void RimEnsembleCurveFilter::fieldChangedByUi(const caf::PdmFieldHandle* changed
}
}
curveSet->updateAllCurves();
auto collection = parentCurveFilterCollection();
if (collection) collection->updateConnectedEditors();
}
else if (changedField == &m_active ||
changedField == &m_minValue ||
changedField == &m_maxValue ||
changedField == &m_categories)
{
if (curveSet) curveSet->updateAllCurves();
if (curveSet)
{
curveSet->updateAllCurves();
curveSet->filterCollection()->updateConnectedEditors();
}
}
else if (changedField == &m_deleteButton)
{
m_deleteButton = false;
if (!curveSet) return;
curveSet->filterCollection()->removeFilter(this);
curveSet->filterCollection()->updateConnectedEditors();
curveSet->updateAllCurves();
// Must be last statement before return
delete this;
}
}
@ -147,9 +220,17 @@ void RimEnsembleCurveFilter::defineUiOrdering(QString uiConfigName, caf::PdmUiOr
uiOrdering.add(&m_active);
uiOrdering.add(&m_ensembleParameterName);
uiOrdering.add(&m_minValue);
uiOrdering.add(&m_maxValue);
uiOrdering.add(&m_categories);
if (eParam.isNumeric())
{
uiOrdering.add(&m_minValue);
uiOrdering.add(&m_maxValue);
}
else if(eParam.isText())
{
uiOrdering.add(&m_categories);
}
uiOrdering.add(&m_deleteButton);
uiOrdering.skipRemainingFields(true);
}
@ -170,6 +251,13 @@ void RimEnsembleCurveFilter::defineEditorAttribute(const caf::PdmFieldHandle* fi
myAttr->m_minimum = m_lowerLimit;
myAttr->m_maximum = m_upperLimit;
}
else if (field == &m_deleteButton)
{
caf::PdmUiPushButtonEditorAttribute* attr = dynamic_cast<caf::PdmUiPushButtonEditorAttribute*>(attribute);
if (!attr) return;
attr->m_buttonText = "Delete";
}
}
//--------------------------------------------------------------------------------------------------
@ -244,6 +332,16 @@ RimEnsembleCurveSet * RimEnsembleCurveFilter::parentCurveSet() const
return curveSet;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimEnsembleCurveFilterCollection* RimEnsembleCurveFilter::parentCurveFilterCollection() const
{
RimEnsembleCurveFilterCollection* coll;
firstAncestorOrThisOfType(coll);
return coll;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -25,6 +25,7 @@
class EnsembleParameter;
class RimEnsembleCurveSet;
class RimSummaryCase;
class RimEnsembleCurveFilterCollection;
//==================================================================================================
///
@ -35,9 +36,14 @@ class RimEnsembleCurveFilter : public caf::PdmObject
public:
RimEnsembleCurveFilter();
RimEnsembleCurveFilter(const QString& ensembleParameterName);
bool isActive() const;
double minValue() const;
double maxValue() const;
std::set<QString> categories() const;
QString ensembleParameterName() const;
QString filterId() 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;
@ -47,17 +53,19 @@ public:
std::vector<RimSummaryCase*> applyFilter(const std::vector<RimSummaryCase*>& allSumCases);
void loadDataAndUpdate();
EnsembleParameter selectedEnsembleParameter() const;
protected:
virtual caf::PdmFieldHandle* objectToggleField();
private:
RimEnsembleCurveSet * parentCurveSet() const;
RimEnsembleCurveFilterCollection* parentCurveFilterCollection() const;
void setDefaultValues();
EnsembleParameter selectedEnsembleParameter() const;
private:
caf::PdmField<bool> m_active;
caf::PdmField<bool> m_deleteButton;
caf::PdmField<QString> m_ensembleParameterName;
caf::PdmField<double> m_minValue;
caf::PdmField<double> m_maxValue;

View File

@ -42,16 +42,16 @@ RimEnsembleCurveFilterCollection::RimEnsembleCurveFilterCollection()
CAF_PDM_InitFieldNoDefault(&m_filters, "CurveFilters", "", "", "", "");
m_filters.uiCapability()->setUiTreeChildrenHidden(true);
m_filters.uiCapability()->setUiEditorTypeName(caf::PdmUiTableViewEditor::uiEditorTypeName());
//m_filters.uiCapability()->setUiEditorTypeName(caf::PdmUiTableViewEditor::uiEditorTypeName());
m_filters.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::HIDDEN);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimEnsembleCurveFilter* RimEnsembleCurveFilterCollection::addFilter()
RimEnsembleCurveFilter* RimEnsembleCurveFilterCollection::addFilter(const QString& ensembleParameterName)
{
auto newFilter = new RimEnsembleCurveFilter();
auto newFilter = new RimEnsembleCurveFilter(ensembleParameterName);
m_filters.push_back(newFilter);
return newFilter;
}
@ -61,7 +61,7 @@ RimEnsembleCurveFilter* RimEnsembleCurveFilterCollection::addFilter()
//--------------------------------------------------------------------------------------------------
void RimEnsembleCurveFilterCollection::removeFilter(RimEnsembleCurveFilter* filter)
{
std::remove_if(m_filters.begin(), m_filters.end(), [&](RimEnsembleCurveFilter* f) { return f == filter; });
m_filters.removeChildObject(filter);
}
//--------------------------------------------------------------------------------------------------
@ -108,7 +108,37 @@ void RimEnsembleCurveFilterCollection::fieldChangedByUi(const caf::PdmFieldHandl
//--------------------------------------------------------------------------------------------------
void RimEnsembleCurveFilterCollection::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering)
{
for (auto& filter : m_filters)
{
QString groupTitle;
auto selEnsembleParam = filter->selectedEnsembleParameter();
if (selEnsembleParam.isNumeric())
{
if (!filter->isActive()) groupTitle = "DISABLED - ";
groupTitle += QString("%1. Min: %2, Max: %3")
.arg(filter->ensembleParameterName())
.arg(QString::number(filter->minValue()))
.arg(QString::number(filter->maxValue()));
}
else if (selEnsembleParam.isText())
{
if (!filter->isActive()) groupTitle = "DISABLED - ";
groupTitle += QString("%1. Categories: ")
.arg(filter->ensembleParameterName());
bool first = true;
for (auto cat : filter->categories())
{
if (!first) groupTitle += ", ";
groupTitle += cat;
first = false;
}
}
caf::PdmUiGroup* filterGroup = uiOrdering.addNewGroupWithKeyword(groupTitle, QString("EnsembleFilter_") + filter->filterId());
filter->defineUiOrdering(uiConfigName, *filterGroup);
}
uiOrdering.skipRemainingFields(true);
}
//--------------------------------------------------------------------------------------------------

View File

@ -36,7 +36,7 @@ class RimEnsembleCurveFilterCollection : public caf::PdmObject
public:
RimEnsembleCurveFilterCollection();
RimEnsembleCurveFilter* addFilter();
RimEnsembleCurveFilter* addFilter(const QString& ensembleParameterName = "");
void removeFilter(RimEnsembleCurveFilter* filter);
std::vector<RimEnsembleCurveFilter*> filters() const;

View File

@ -378,6 +378,14 @@ RimSummaryCaseCollection* RimEnsembleCurveSet::summaryCaseCollection() const
return m_yValuesSummaryGroup();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimEnsembleCurveFilterCollection* RimEnsembleCurveSet::filterCollection() const
{
return m_curveFilters;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -587,8 +595,8 @@ void RimEnsembleCurveSet::defineUiOrdering(QString uiConfigName, caf::PdmUiOrder
}
caf::PdmUiGroup* statGroup = uiOrdering.addNewGroup("Statistics");
m_statistics->defineUiOrdering(uiConfigName, *statGroup);
uiOrdering.skipRemainingFields(true);
}

View File

@ -91,6 +91,8 @@ public:
void setSummaryCaseCollection(RimSummaryCaseCollection* sumCaseCollection);
RimSummaryCaseCollection* summaryCaseCollection() const;
RimEnsembleCurveFilterCollection* filterCollection() const;
ColorMode colorMode() const;
void updateEnsembleLegendItem();
EnsembleParameter::Type currentEnsembleParameterType() const;