#1999 Curve calc. Curve creator now uses CurveDefSelection component

This commit is contained in:
Bjørn Erik Jensen 2017-10-23 11:41:16 +02:00
parent ec53855cd4
commit 8276d92ce7
10 changed files with 118 additions and 944 deletions

View File

@ -21,6 +21,7 @@
#include "RifEclipseSummaryAddress.h"
#include "RimSummaryCurveAppearanceCalculator.h"
#include "RiuSummaryCurveDefSelectionEditor.h"
#include "cafPdmChildArrayField.h"
#include "cafPdmChildField.h"
@ -36,6 +37,7 @@
class RimSummaryCase;
class RimSummaryCurveAutoName;
class RimSummaryPlot;
class RiaSummaryCurveDefinition;
//==================================================================================================
///
@ -48,29 +50,6 @@ class RicSummaryCurveCreator : public caf::PdmObject
private:
typedef caf::AppEnum<RimSummaryCurveAppearanceCalculator::CurveAppearanceType> AppearanceTypeAppEnum;
class SummaryIdentifierAndField
{
public:
SummaryIdentifierAndField() :
m_summaryIdentifier((RifEclipseSummaryAddress::SummaryIdentifierType)0),
m_pdmField(nullptr)
{}
SummaryIdentifierAndField(RifEclipseSummaryAddress::SummaryIdentifierType summaryIdentifier) :
m_summaryIdentifier(summaryIdentifier),
m_pdmField(new caf::PdmField<std::vector<QString>>())
{}
virtual ~SummaryIdentifierAndField() { delete m_pdmField; }
RifEclipseSummaryAddress::SummaryIdentifierType summaryIdentifier() const { return m_summaryIdentifier; }
caf::PdmField<std::vector<QString>>* pdmField() { return m_pdmField; }
private:
RifEclipseSummaryAddress::SummaryIdentifierType m_summaryIdentifier;
caf::PdmField<std::vector<QString>> * m_pdmField;
};
public:
RicSummaryCurveCreator();
virtual ~RicSummaryCurveCreator();
@ -81,6 +60,7 @@ public:
bool isCloseButtonPressed() const;
void clearCloseButton();
void updateCurveNames();
void setCurveDefSelectionObject(RiuSummaryCurveDefSelection* curveDefSelection);
private:
virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField,
@ -91,27 +71,9 @@ private:
virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName,
caf::PdmUiEditorAttribute* attribute) override;
std::set<RifEclipseSummaryAddress> findPossibleSummaryAddresses(const std::vector<RimSummaryCase*> &selectedCases,
const SummaryIdentifierAndField *identifierAndField);
std::set<RifEclipseSummaryAddress> findPossibleSummaryAddressesFromSelectedCases(const SummaryIdentifierAndField *identifierAndField);
std::set<RifEclipseSummaryAddress> findPossibleSummaryAddressesFromSelectedObservedData(const SummaryIdentifierAndField *identifierAndField);
std::set<RifEclipseSummaryAddress> findPossibleSummaryAddressesFromCalculated();
std::vector<SummaryIdentifierAndField*> buildControllingFieldList(const SummaryIdentifierAndField *identifierAndField);
SummaryIdentifierAndField* lookupIdentifierAndFieldFromFieldHandle(const caf::PdmFieldHandle* pdmFieldHandle);
SummaryIdentifierAndField* lookupControllingField(const SummaryIdentifierAndField *dependentField);
bool isAddressCompatibleWithControllingFieldSelection(const RifEclipseSummaryAddress &address,
const std::vector<SummaryIdentifierAndField*>& identifierAndFieldList);
std::set<std::pair<RifEclipseSummaryAddress,bool>> buildAddressListFromSelections();
void buildAddressListForCategoryRecursively(RifEclipseSummaryAddress::SummaryVarCategory category,
std::vector<SummaryIdentifierAndField*>::const_iterator identifierAndFieldItr,
std::vector<std::pair<RifEclipseSummaryAddress::SummaryIdentifierType, QString>>& identifierPath,
std::set<std::pair<RifEclipseSummaryAddress,bool>>& addressPairSet);
void syncPreviewCurvesFromUiSelection();
void updatePreviewCurvesFromCurveDefinitions(const std::set<std::pair<RimSummaryCase*, RifEclipseSummaryAddress> >& allCurveDefsToDisplay,
const std::set<std::pair<RimSummaryCase*, RifEclipseSummaryAddress> >& curveDefsToAdd,
void updatePreviewCurvesFromCurveDefinitions(const std::set<RiaSummaryCurveDefinition>& allCurveDefsToDisplay,
const std::set<RiaSummaryCurveDefinition>& curveDefsToAdd,
const std::set<RimSummaryCurve*>& curvesToDelete);
std::set<std::string> getAllSummaryCaseNames();
std::set<std::string> getAllSummaryWellNames();
@ -121,26 +83,19 @@ private:
static void copyCurveAndAddToPlot(const RimSummaryCurve *curve, RimSummaryPlot *plot, bool forceVisible = false);
void resetAllFields();
void updateEditorsConnectedToPreviewPlot();
void initCurveAppearanceCalculator(RimSummaryCurveAppearanceCalculator& curveAppearanceCalc);
void applyAppearanceToAllPreviewCurves();
void updateAppearanceEditor();
std::set<std::pair<RimSummaryCase*, RifEclipseSummaryAddress>>
allPreviewCurveDefs() const;
std::set<RiaSummaryCurveDefinition> allPreviewCurveDefs() const;
void createNewPlot();
bool isObservedData(RimSummaryCase *sumCase) const;
std::vector<RimSummaryCase*> summaryCases() const;
static RimSummaryCase* calculatedSummaryCase();
void selectionEditorFieldChanged();
private:
caf::PdmPtrArrayField<RimSummaryCase*> m_selectedCases;
caf::PdmField<std::vector<caf::AppEnum<RifEclipseSummaryAddress::SummaryVarCategory>>> m_selectedSummaryCategories;
caf::PdmField<caf::AppEnum<RifEclipseSummaryAddress::SummaryVarCategory>> m_currentSummaryCategory;
std::map<RifEclipseSummaryAddress::SummaryVarCategory, std::vector<SummaryIdentifierAndField*>> m_identifierFieldsMap;
caf::PdmPtrField<RiuSummaryCurveDefSelection*> m_selectionEditor;
caf::PdmPtrField<RimSummaryPlot*> m_targetPlot;

View File

@ -23,6 +23,8 @@
#include "RimSummaryPlot.h"
#include "RiuSummaryCurveDefinitionKeywords.h"
#include "RiuSummaryCurveDefSelectionEditor.h"
#include "RiuSummaryCurveDefSelection.h"
#include "cafPdmUiFieldEditorHandle.h"
#include "cafPdmUiFieldHandle.h"
@ -41,6 +43,8 @@
//--------------------------------------------------------------------------------------------------
RicSummaryCurveCreatorSplitterUi::RicSummaryCurveCreatorSplitterUi(QWidget* parent)
{
m_parentWidget = parent;
m_addrSelWidget = std::unique_ptr<RiuSummaryCurveDefSelectionEditor>(new RiuSummaryCurveDefSelectionEditor());
}
//--------------------------------------------------------------------------------------------------
@ -59,6 +63,8 @@ void RicSummaryCurveCreatorSplitterUi::recursivelyConfigureAndUpdateTopLevelUiIt
RicSummaryCurveCreator* sumCurveCreator = dynamic_cast<RicSummaryCurveCreator*>(this->pdmItem());
if (sumCurveCreator)
{
sumCurveCreator->setCurveDefSelectionObject(m_addrSelWidget->summaryAddressSelection());
if (sumCurveCreator->isCloseButtonPressed())
{
sumCurveCreator->clearCloseButton();
@ -69,38 +75,10 @@ void RicSummaryCurveCreatorSplitterUi::recursivelyConfigureAndUpdateTopLevelUiIt
if (!m_layout) return;
int splitterPositionIndex = 0;
for (size_t i = 0; i < topLevelUiItems.size(); ++i)
{
if (topLevelUiItems[i]->isUiHidden(uiConfigName)) continue;
QWidget* addrWidget = m_addrSelWidget->getOrCreateWidget(m_parentWidget);
m_addrSelWidget->summaryAddressSelection()->updateConnectedEditors();
if (topLevelUiItems[i]->isUiGroup())
{
caf::PdmUiGroup* group = static_cast<caf::PdmUiGroup*>(topLevelUiItems[i]);
auto groupBox = createGroupBoxWithContent(group, uiConfigName);
bool isSources = group->keyword() == RiuSummaryCurveDefinitionKeywords::sources();
bool isSummaryTypes = group->keyword() == RiuSummaryCurveDefinitionKeywords::summaryTypes();
bool isSummaries = group->keyword() == RiuSummaryCurveDefinitionKeywords::summaries();
bool isDynamicGroup = !isSources && !isSummaryTypes && !isSummaries;
bool leftColumn = isSources || isSummaryTypes;
if (isSummaryTypes || isDynamicGroup)
{
groupBox->setFixedWidth(170);
}
if(leftColumn)
m_firstRowLeftLayout->addWidget(groupBox);
else
m_firstRowRightLayout->addWidget(groupBox);
// Add group boxes until summaries are detected
if (group->keyword() == RiuSummaryCurveDefinitionKeywords::summaries())
break;
}
}
m_firstRowLayout->addWidget(addrWidget);
caf::PdmUiGroup* appearanceGroup = findGroupByKeyword(topLevelUiItems, RiuSummaryCurveDefinitionKeywords::appearance(), uiConfigName);
auto appearanceGroupBox = createGroupBoxWithContent(appearanceGroup, uiConfigName);
@ -134,25 +112,6 @@ QWidget* RicSummaryCurveCreatorSplitterUi::createWidget(QWidget* parent)
m_firstRowLayout->setContentsMargins(0, 0, 0, 0);
firstRowFrame->setLayout(m_firstRowLayout);
QFrame* firstRowLeftFrame = new QFrame(widget);
m_firstRowLeftLayout = new QHBoxLayout;
m_firstRowLeftLayout->setContentsMargins(0, 0, 0, 0);
firstRowLeftFrame->setLayout(m_firstRowLeftLayout);
QFrame* firstRowRightFrame = new QFrame(widget);
m_firstRowRightLayout = new QHBoxLayout;
m_firstRowRightLayout->setContentsMargins(0, 0, 0, 0);
firstRowRightFrame->setLayout(m_firstRowRightLayout);
m_firstRowSplitter = new QSplitter(Qt::Horizontal);
m_firstRowSplitter->setContentsMargins(0, 0, 0, 0);
m_firstRowSplitter->setHandleWidth(6);
m_firstRowSplitter->setStyleSheet("QSplitter::handle { image: url(:/SplitterV.png); }");
m_firstRowSplitter->insertWidget(0, firstRowLeftFrame);
m_firstRowSplitter->insertWidget(1, firstRowRightFrame);
m_firstRowSplitter->setSizes(QList<int>() << 1 << 1);
m_firstRowLayout->addWidget(m_firstRowSplitter);
QFrame* secondRowFrame = new QFrame(widget);
m_secondRowLayout = new QHBoxLayout;
m_secondRowLayout->setContentsMargins(0, 0, 0, 0);

View File

@ -20,8 +20,10 @@
#include "cafPdmUiWidgetBasedObjectEditor.h"
#include <vector>
#include <memory>
class RicSummaryCurveCreator;
class RiuSummaryCurveDefSelectionEditor;
class QMinimizePanel;
class QSplitter;
@ -75,17 +77,17 @@ signals:
private:
QPointer<QVBoxLayout> m_layout;
QPointer<QSplitter> m_firstColumnSplitter;
QPointer<QSplitter> m_firstRowSplitter;
QPointer<QMinimizePanel> m_curvesPanel;
QPointer<QHBoxLayout> m_firstRowLayout;
QPointer<QHBoxLayout> m_firstRowLeftLayout;
QPointer<QHBoxLayout> m_firstRowRightLayout;
QPointer<QHBoxLayout> m_secondRowLayout;
QPointer<QVBoxLayout> m_lowerLeftLayout;
QPointer<QHBoxLayout> m_bottomFieldLayout;
QPointer<caf::PdmUiTreeView> m_curveTreeView;
QWidget* m_parentWidget;
std::unique_ptr<RiuSummaryCurveDefSelectionEditor> m_addrSelWidget;
};

View File

@ -19,6 +19,7 @@
#include "RimSummaryCurveAppearanceCalculator.h"
#include "RiaColorTables.h"
#include "RiaSummaryCurveDefinition.h"
#include "RimSummaryCurve.h"
#include "RimSummaryCase.h"
@ -45,21 +46,21 @@ void caf::AppEnum< RimSummaryCurveAppearanceCalculator::CurveAppearanceType >::s
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryCurveAppearanceCalculator::RimSummaryCurveAppearanceCalculator(const std::set<std::pair<RimSummaryCase*, RifEclipseSummaryAddress> >& curveDefinitions, const std::set<std::string> allSummaryCaseNames, const std::set<std::string> allSummaryWellNames)
RimSummaryCurveAppearanceCalculator::RimSummaryCurveAppearanceCalculator(const std::set<RiaSummaryCurveDefinition>& curveDefinitions, const std::set<std::string> allSummaryCaseNames, const std::set<std::string> allSummaryWellNames)
{
m_allSummaryCaseNames = allSummaryCaseNames;
m_allSummaryWellNames = allSummaryWellNames;
for(const std::pair<RimSummaryCase*, RifEclipseSummaryAddress>& curveDef : curveDefinitions)
for(const RiaSummaryCurveDefinition& curveDef : curveDefinitions)
{
if(curveDef.first) m_caseToAppearanceIdxMap[curveDef.first] = -1;
if(!curveDef.second.wellName().empty()) m_welToAppearanceIdxMap[curveDef.second.wellName()] = -1;
if(!curveDef.second.wellGroupName().empty()) m_grpToAppearanceIdxMap[curveDef.second.wellGroupName()] = -1;
if(!(curveDef.second.regionNumber() == -1)) m_regToAppearanceIdxMap[curveDef.second.regionNumber()] = -1;
if(curveDef.summaryCase()) m_caseToAppearanceIdxMap[curveDef.summaryCase()] = -1;
if(!curveDef.summaryAddress().wellName().empty()) m_welToAppearanceIdxMap[curveDef.summaryAddress().wellName()] = -1;
if(!curveDef.summaryAddress().wellGroupName().empty()) m_grpToAppearanceIdxMap[curveDef.summaryAddress().wellGroupName()] = -1;
if(!(curveDef.summaryAddress().regionNumber() == -1)) m_regToAppearanceIdxMap[curveDef.summaryAddress().regionNumber()] = -1;
if(!curveDef.second.quantityName().empty())
if(!curveDef.summaryAddress().quantityName().empty())
{
std::string varname = curveDef.second.quantityName();
std::string varname = curveDef.summaryAddress().quantityName();
m_varToAppearanceIdxMap[varname] = -1;
// Indexes for sub color ranges

View File

@ -27,11 +27,12 @@
class RimSummaryCurve;
class RimSummaryCase;
class RifEclipseSummaryAddress;
class RiaSummaryCurveDefinition;
class RimSummaryCurveAppearanceCalculator
{
public:
explicit RimSummaryCurveAppearanceCalculator(const std::set<std::pair<RimSummaryCase*, RifEclipseSummaryAddress> >& curveDefinitions,
explicit RimSummaryCurveAppearanceCalculator(const std::set<RiaSummaryCurveDefinition>& curveDefinitions,
const std::set<std::string> allSummaryCaseNames,
const std::set<std::string> allSummaryWellNames);
enum CurveAppearanceType

View File

@ -19,6 +19,7 @@
#include "RimSummaryCurveFilter.h"
#include "RiaApplication.h"
#include "RiaSummaryCurveDefinition.h"
#include "RifReaderEclipseSummary.h"
@ -140,7 +141,7 @@ void RimSummaryCurveFilter::createDefaultCurves(RimSummaryCase* summaryCase, con
m_summaryFilter->setCompleteVarStringFilter(defaultCurveStringFilter);
std::set<std::pair<RimSummaryCase*, RifEclipseSummaryAddress> > newCurveDefinitions;
std::set<RiaSummaryCurveDefinition> newCurveDefinitions;
createSetOfCasesAndResultAdresses(selectedCases, *m_summaryFilter, &newCurveDefinitions);
@ -355,7 +356,7 @@ void RimSummaryCurveFilter::syncCurvesFromUiSelection()
{
// Create a search map containing whats supposed to be curves
std::set<std::pair<RimSummaryCase*, RifEclipseSummaryAddress> > newCurveDefinitions;
std::set<RiaSummaryCurveDefinition> newCurveDefinitions;
// Populate the newCurveDefinitions from the Gui
@ -372,7 +373,7 @@ void RimSummaryCurveFilter::syncCurvesFromUiSelection()
if(!reader->hasAddress(addr)) continue;
if (addrUnion.count(addr) == 0 ) continue; // Wash the possible "old" ui selection with new filter
newCurveDefinitions.insert(std::make_pair(currentCase, addr));
newCurveDefinitions.insert(RiaSummaryCurveDefinition(currentCase, addr));
}
}
@ -522,7 +523,7 @@ void RimSummaryCurveFilter::removeCurvesAssosiatedWithCase(RimSummaryCase* summa
void RimSummaryCurveFilter::createSetOfCasesAndResultAdresses(
const std::vector<RimSummaryCase*>& cases,
const RimSummaryFilter& filter,
std::set<std::pair<RimSummaryCase*, RifEclipseSummaryAddress> >* curveDefinitions) const
std::set<RiaSummaryCurveDefinition>* curveDefinitions) const
{
for (RimSummaryCase* currentCase : cases)
{
@ -536,7 +537,7 @@ void RimSummaryCurveFilter::createSetOfCasesAndResultAdresses(
{
if (!filter.isIncludedByFilter(allAddresses[i])) continue;
curveDefinitions->insert(std::make_pair(currentCase, allAddresses[i]));
curveDefinitions->insert(RiaSummaryCurveDefinition(currentCase, allAddresses[i]));
}
}
}
@ -545,7 +546,7 @@ void RimSummaryCurveFilter::createSetOfCasesAndResultAdresses(
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryCurveFilter::createCurvesFromCurveDefinitions(const std::set<std::pair<RimSummaryCase*, RifEclipseSummaryAddress> >& curveDefinitions)
void RimSummaryCurveFilter::createCurvesFromCurveDefinitions(const std::set<RiaSummaryCurveDefinition>& curveDefinitions)
{
RimSummaryCase* prevCase = nullptr;
RimPlotCurve::LineStyleEnum lineStyle = RimPlotCurve::STYLE_SOLID;
@ -582,12 +583,12 @@ void RimSummaryCurveFilter::createCurvesFromCurveDefinitions(const std::set<std:
for (auto& caseAddrPair : curveDefinitions)
{
RimSummaryCase* currentCase = caseAddrPair.first;
RimSummaryCase* currentCase = caseAddrPair.summaryCase();
RimSummaryCurve* curve = new RimSummaryCurve();
curve->setParentQwtPlotNoReplot(m_parentQwtPlot);
curve->setSummaryCase(currentCase);
curve->setSummaryAddress(caseAddrPair.second);
curve->setSummaryAddress(caseAddrPair.summaryAddress());
curve->setYAxis(m_plotAxis());
curve->applyCurveAutoNameSettings(*m_curveNameConfig());

View File

@ -41,7 +41,7 @@ class RimSummaryCurve;
class RimSummaryFilter;
class RiuLineSegmentQwtPlotCurve;
class RimSummaryCurveAutoName;
class RiaSummaryCurveDefinition;
@ -81,14 +81,14 @@ public:
private:
void syncCurvesFromUiSelection();
void createCurvesFromCurveDefinitions(const std::set<std::pair<RimSummaryCase*, RifEclipseSummaryAddress> >& curveDefinitions);
void createCurvesFromCurveDefinitions(const std::set<RiaSummaryCurveDefinition>& curveDefinitions);
void syncUiSelectionFromCurves();
std::set<RifEclipseSummaryAddress> findPossibleSummaryAddresses();
void createSetOfCasesAndResultAdresses(
const std::vector<RimSummaryCase*>& cases,
const RimSummaryFilter& filter,
std::set<std::pair<RimSummaryCase*, RifEclipseSummaryAddress> >* curveDefinitions) const;
std::set<RiaSummaryCurveDefinition>* curveDefinitions) const;
// Overridden PDM methods
virtual caf::PdmFieldHandle* objectToggleField() override;

View File

@ -186,6 +186,7 @@ RiuSummaryCurveDefSelection::RiuSummaryCurveDefSelection() : m_identifierFieldsM
m_selectedSummaryCategories.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::HIDDEN);
m_currentSummaryCategory.uiCapability()->setUiHidden(true);
m_multiSelectionMode = false;
}
//--------------------------------------------------------------------------------------------------
@ -237,6 +238,22 @@ std::vector<RiaSummaryCurveDefinition> RiuSummaryCurveDefSelection::selectedCurv
return caseAndAddressVector;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiuSummaryCurveDefSelection::setMultiSelectionMode(bool multiSelectionMode)
{
m_multiSelectionMode = multiSelectionMode;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiuSummaryCurveDefSelection::setFieldChangedHandler(const std::function<void()>& handlerFunc)
{
m_toggleChangedHandler = handlerFunc;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -316,6 +333,10 @@ std::set<RifEclipseSummaryAddress> RiuSummaryCurveDefSelection::findPossibleSumm
//--------------------------------------------------------------------------------------------------
void RiuSummaryCurveDefSelection::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue)
{
if (m_toggleChangedHandler != nullptr)
{
m_toggleChangedHandler();
}
}
//--------------------------------------------------------------------------------------------------
@ -806,7 +827,7 @@ void RiuSummaryCurveDefSelection::defineEditorAttribute(const caf::PdmFieldHandl
attrib->showToggleAllCheckbox = false;
}
attrib->singleSelectionMode = true;
attrib->singleSelectionMode = !m_multiSelectionMode;
}
}

View File

@ -28,6 +28,7 @@
#include "cafPdmPtrArrayField.h"
#include "cafPdmPtrField.h"
#include <functional>
#define OBSERVED_DATA_AVALUE_POSTFIX "_OBSDATA"
@ -50,6 +51,8 @@ public:
void setSelectedCurveDefinitions(const std::vector<RiaSummaryCurveDefinition>& curveDefinitions);
std::vector<RiaSummaryCurveDefinition> selectedCurveDefinitions() const;
void setMultiSelectionMode(bool multiSelectionMode);
void setFieldChangedHandler(const std::function<void()>& handlerFunc);
private:
class SummaryIdentifierAndField
@ -116,4 +119,8 @@ private:
caf::PdmField<caf::AppEnum<RifEclipseSummaryAddress::SummaryVarCategory>> m_currentSummaryCategory;
std::map<RifEclipseSummaryAddress::SummaryVarCategory, std::vector<SummaryIdentifierAndField*>> m_identifierFieldsMap;
bool m_multiSelectionMode;
std::function<void()> m_toggleChangedHandler;
};