mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Add summary multi plot
Improve robustness related to update of Summary Plot Manager Add RimSummaryMultiPlot Move shared code into RiaSummaryStringTools Added "Create Summary Multi Plot" to menu of MultiPlot in project tree
This commit is contained in:
parent
21f0988493
commit
4d21f90bf9
@ -19,9 +19,19 @@
|
||||
#include "RiaSummaryStringTools.h"
|
||||
|
||||
#include "RiaLogging.h"
|
||||
#include "RiaStdStringTools.h"
|
||||
#include "RiaSummaryTools.h"
|
||||
|
||||
#include "RifEclipseSummaryAddress.h"
|
||||
#include "RifReaderEclipseSummary.h"
|
||||
#include "RifSummaryReaderInterface.h"
|
||||
|
||||
#include "RimMainPlotCollection.h"
|
||||
#include "RimSummaryCase.h"
|
||||
#include "RimSummaryCaseCollection.h"
|
||||
#include "RimSummaryCaseMainCollection.h"
|
||||
|
||||
#include "SummaryPlotCommands/RicSummaryPlotFeatureImpl.h"
|
||||
|
||||
#include <QRegularExpression>
|
||||
|
||||
@ -61,6 +71,26 @@ void RiaSummaryStringTools::splitAddressFiltersInGridAndSummary( RimSummaryCase*
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::pair<QStringList, QStringList> RiaSummaryStringTools::splitIntoAddressAndDataSourceFilters( const QString& filter )
|
||||
{
|
||||
auto words = RiaSummaryStringTools::splitIntoWords( filter );
|
||||
auto [summaryCases, ensembles] = RiaSummaryStringTools::allDataSourcesInProject();
|
||||
auto dataSourceNames = RiaSummaryStringTools::dataSourceNames( summaryCases, ensembles );
|
||||
|
||||
QStringList addressFilters;
|
||||
QStringList dataSourceFilters;
|
||||
|
||||
RiaSummaryStringTools::splitUsingDataSourceNames( words, dataSourceNames, addressFilters, dataSourceFilters );
|
||||
|
||||
// If no filter on data source is specified, use wildcard to match all
|
||||
if ( dataSourceFilters.empty() ) dataSourceFilters.push_back( "*" );
|
||||
|
||||
return { addressFilters, dataSourceFilters };
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -78,10 +108,10 @@ bool RiaSummaryStringTools::hasFilterAnyMatch( const QString&
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
/// Sort filters into curve and data source filters
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RiaSummaryStringTools::splitIntoAddressAndDataSourceFilters( const QStringList& filters,
|
||||
const QStringList& dataSourceNames,
|
||||
QStringList& addressFilters,
|
||||
QStringList& dataSourceFilters )
|
||||
void RiaSummaryStringTools::splitUsingDataSourceNames( const QStringList& filters,
|
||||
const QStringList& dataSourceNames,
|
||||
QStringList& addressFilters,
|
||||
QStringList& dataSourceFilters )
|
||||
{
|
||||
for ( const auto& s : filters )
|
||||
{
|
||||
@ -108,3 +138,134 @@ void RiaSummaryStringTools::splitIntoAddressAndDataSourceFilters( const QStringL
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::pair<std::vector<RimSummaryCase*>, std::vector<RimSummaryCaseCollection*>>
|
||||
RiaSummaryStringTools::allDataSourcesInProject()
|
||||
{
|
||||
auto sumCaseMainColl = RiaSummaryTools::summaryCaseMainCollection();
|
||||
|
||||
auto summaryCases = sumCaseMainColl->topLevelSummaryCases();
|
||||
auto ensembles = sumCaseMainColl->summaryCaseCollections();
|
||||
|
||||
return { summaryCases, ensembles };
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::pair<std::vector<RimSummaryCase*>, std::vector<RimSummaryCaseCollection*>>
|
||||
RiaSummaryStringTools::dataSourcesMatchingFilters( const QStringList& dataSourceFilters )
|
||||
{
|
||||
std::vector<RimSummaryCase*> matchingSummaryCases;
|
||||
std::vector<RimSummaryCaseCollection*> matchingEnsembles;
|
||||
|
||||
auto [allSummaryCases, allEnsembles] = allDataSourcesInProject();
|
||||
|
||||
for ( const auto& dsFilter : dataSourceFilters )
|
||||
{
|
||||
QString searchString = dsFilter.left( dsFilter.indexOf( ':' ) );
|
||||
QRegExp searcher( searchString, Qt::CaseInsensitive, QRegExp::WildcardUnix );
|
||||
|
||||
for ( const auto& ensemble : allEnsembles )
|
||||
{
|
||||
auto ensembleName = ensemble->name();
|
||||
if ( searcher.exactMatch( ensembleName ) )
|
||||
{
|
||||
if ( searchString == dsFilter )
|
||||
{
|
||||
// Match on ensemble name without realization filter
|
||||
|
||||
matchingEnsembles.push_back( ensemble );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Match on subset of realisations in ensemble
|
||||
|
||||
QString realizationSearchString = dsFilter.right( dsFilter.size() - dsFilter.indexOf( ':' ) - 1 );
|
||||
QRegExp realizationSearcher( realizationSearchString, Qt::CaseInsensitive, QRegExp::WildcardUnix );
|
||||
|
||||
for ( const auto& summaryCase : ensemble->allSummaryCases() )
|
||||
{
|
||||
auto realizationName = summaryCase->displayCaseName();
|
||||
if ( realizationSearcher.exactMatch( realizationName ) )
|
||||
{
|
||||
matchingSummaryCases.push_back( summaryCase );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for ( const auto& summaryCase : allSummaryCases )
|
||||
{
|
||||
auto summaryCaseName = summaryCase->displayCaseName();
|
||||
if ( searcher.exactMatch( summaryCaseName ) )
|
||||
{
|
||||
matchingSummaryCases.push_back( summaryCase );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return { matchingSummaryCases, matchingEnsembles };
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
QStringList RiaSummaryStringTools::splitIntoWords( const QString& text )
|
||||
{
|
||||
QStringList words = text.split( QRegExp( "\\s+" ), QString::SkipEmptyParts );
|
||||
|
||||
return words;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
QStringList RiaSummaryStringTools::dataSourceNames( const std::vector<RimSummaryCase*>& summaryCases,
|
||||
const std::vector<RimSummaryCaseCollection*>& ensembles )
|
||||
{
|
||||
QStringList names;
|
||||
for ( const auto& summaryCase : summaryCases )
|
||||
{
|
||||
names.push_back( summaryCase->displayCaseName() );
|
||||
}
|
||||
|
||||
for ( const auto& ensemble : ensembles )
|
||||
{
|
||||
names.push_back( ensemble->name() );
|
||||
}
|
||||
|
||||
return names;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::set<RifEclipseSummaryAddress>
|
||||
RiaSummaryStringTools::computeFilteredAddresses( const QStringList& textFilters,
|
||||
const std::set<RifEclipseSummaryAddress>& sourceAddresses,
|
||||
bool includeDiffCurves )
|
||||
{
|
||||
std::set<RifEclipseSummaryAddress> addresses;
|
||||
|
||||
std::vector<bool> usedFilters;
|
||||
RicSummaryPlotFeatureImpl::insertFilteredAddressesInSet( textFilters, sourceAddresses, &addresses, &usedFilters );
|
||||
|
||||
if ( includeDiffCurves ) return addresses;
|
||||
|
||||
const auto diffText = RifReaderEclipseSummary::differenceIdentifier();
|
||||
|
||||
std::set<RifEclipseSummaryAddress> addressesWithoutDiffVectors;
|
||||
for ( const auto& adr : addresses )
|
||||
{
|
||||
if ( RiaStdStringTools::endsWith( adr.quantityName(), diffText ) ) continue;
|
||||
|
||||
addressesWithoutDiffVectors.insert( adr );
|
||||
}
|
||||
|
||||
return addressesWithoutDiffVectors;
|
||||
}
|
||||
|
@ -19,9 +19,11 @@
|
||||
#pragma once
|
||||
|
||||
#include <set>
|
||||
#include <vector>
|
||||
|
||||
class RimSummaryCase;
|
||||
class RifEclipseSummaryAddress;
|
||||
class RimSummaryCaseCollection;
|
||||
|
||||
class QString;
|
||||
class QStringList;
|
||||
@ -37,10 +39,28 @@ public:
|
||||
QStringList* summaryAddressFilters,
|
||||
QStringList* gridResultAddressFilters );
|
||||
|
||||
static bool hasFilterAnyMatch( const QString& curveFilter, const std::set<RifEclipseSummaryAddress>& summaryAddresses );
|
||||
static std::pair<QStringList, QStringList> splitIntoAddressAndDataSourceFilters( const QString& filter );
|
||||
|
||||
static void splitIntoAddressAndDataSourceFilters( const QStringList& filters,
|
||||
const QStringList& dataSourceNames,
|
||||
QStringList& addressFilters,
|
||||
QStringList& dataSourceFilters );
|
||||
static std::pair<std::vector<RimSummaryCase*>, std::vector<RimSummaryCaseCollection*>> allDataSourcesInProject();
|
||||
static std::pair<std::vector<RimSummaryCase*>, std::vector<RimSummaryCaseCollection*>>
|
||||
dataSourcesMatchingFilters( const QStringList& dataSourceFilters );
|
||||
|
||||
static QStringList splitIntoWords( const QString& text );
|
||||
|
||||
static QStringList dataSourceNames( const std::vector<RimSummaryCase*>& summaryCases,
|
||||
const std::vector<RimSummaryCaseCollection*>& ensembles );
|
||||
|
||||
static std::set<RifEclipseSummaryAddress>
|
||||
computeFilteredAddresses( const QStringList& textFilters,
|
||||
const std::set<RifEclipseSummaryAddress>& sourceAddresses,
|
||||
bool includeDiffCurves );
|
||||
|
||||
// Consider private, set public to be able to test
|
||||
static void splitUsingDataSourceNames( const QStringList& filters,
|
||||
const QStringList& dataSourceNames,
|
||||
QStringList& addressFilters,
|
||||
QStringList& dataSourceFilters );
|
||||
|
||||
private:
|
||||
static bool hasFilterAnyMatch( const QString& curveFilter, const std::set<RifEclipseSummaryAddress>& summaryAddresses );
|
||||
};
|
||||
|
@ -1,10 +1,13 @@
|
||||
set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RicNewMultiPlotFeature.h
|
||||
${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotBuilder.h
|
||||
set(SOURCE_GROUP_HEADER_FILES
|
||||
${CMAKE_CURRENT_LIST_DIR}/RicNewMultiPlotFeature.h
|
||||
${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotBuilder.h
|
||||
${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryMultiPlotFeature.h
|
||||
)
|
||||
|
||||
set(SOURCE_GROUP_SOURCE_FILES
|
||||
${CMAKE_CURRENT_LIST_DIR}/RicNewMultiPlotFeature.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotBuilder.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryMultiPlotFeature.cpp
|
||||
)
|
||||
|
||||
list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES})
|
||||
|
@ -0,0 +1,82 @@
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2021 Equinor ASA
|
||||
//
|
||||
// ResInsight is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
// FITNESS FOR A PARTICULAR PURPOSE.
|
||||
//
|
||||
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
|
||||
// for more details.
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "RicNewSummaryMultiPlotFeature.h"
|
||||
|
||||
#include "RimMultiPlotCollection.h"
|
||||
#include "RimPlot.h"
|
||||
#include "RimSummaryMultiPlot.h"
|
||||
|
||||
#include "cafSelectionManager.h"
|
||||
#include "cvfAssert.h"
|
||||
|
||||
#include <QAction>
|
||||
|
||||
RICF_SOURCE_INIT( RicNewSummaryMultiPlotFeature, "RicNewSummaryMultiPlotFeature", "createSummaryMultiPlot" );
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RicNewSummaryMultiPlotFeature::RicNewSummaryMultiPlotFeature()
|
||||
{
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
caf::PdmScriptResponse RicNewSummaryMultiPlotFeature::execute()
|
||||
{
|
||||
std::vector<RimPlot*> plots;
|
||||
RimSummaryMultiPlot::createAndAppendMultiPlot( plots );
|
||||
|
||||
return caf::PdmScriptResponse();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool RicNewSummaryMultiPlotFeature::isCommandEnabled()
|
||||
{
|
||||
RimMultiPlotCollection* objToFind = nullptr;
|
||||
|
||||
auto pdmUiItem = caf::SelectionManager::instance()->selectedItem();
|
||||
auto objHandle = dynamic_cast<caf::PdmObjectHandle*>( pdmUiItem );
|
||||
if ( objHandle )
|
||||
{
|
||||
objHandle->firstAncestorOrThisOfType( objToFind );
|
||||
}
|
||||
|
||||
return ( objToFind != nullptr );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RicNewSummaryMultiPlotFeature::onActionTriggered( bool isChecked )
|
||||
{
|
||||
execute();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RicNewSummaryMultiPlotFeature::setupActionLook( QAction* actionToSetup )
|
||||
{
|
||||
actionToSetup->setText( "Create Summary Multi Plot" );
|
||||
actionToSetup->setIcon( QIcon( ":/MultiPlot16x16.png" ) );
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2021 Equinor ASA
|
||||
//
|
||||
// ResInsight is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
// FITNESS FOR A PARTICULAR PURPOSE.
|
||||
//
|
||||
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
|
||||
// for more details.
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "RicfCommandObject.h"
|
||||
|
||||
#include "cafCmdFeature.h"
|
||||
#include "cafPdmField.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
class RimPlot;
|
||||
|
||||
//==================================================================================================
|
||||
///
|
||||
//==================================================================================================
|
||||
class RicNewSummaryMultiPlotFeature : public caf::CmdFeature, public RicfCommandObject
|
||||
{
|
||||
RICF_HEADER_INIT;
|
||||
|
||||
public:
|
||||
RicNewSummaryMultiPlotFeature();
|
||||
|
||||
caf::PdmScriptResponse execute() override;
|
||||
|
||||
protected:
|
||||
bool isCommandEnabled() override;
|
||||
void onActionTriggered( bool isChecked ) override;
|
||||
void setupActionLook( QAction* actionToSetup ) override;
|
||||
};
|
@ -1102,6 +1102,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection()
|
||||
menuBuilder << "RicCloseObservedDataFeature";
|
||||
|
||||
menuBuilder << "RicNewMultiPlotFeature";
|
||||
menuBuilder << "RicNewSummaryMultiPlotFeature";
|
||||
|
||||
// Work in progress -- End
|
||||
|
||||
|
@ -256,6 +256,46 @@ void RimMultiPlot::movePlotsToThis( const std::vector<RimPlot*>& plotsToMove, in
|
||||
this->updateAllRequiredEditors();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimMultiPlot::insertPlots( const std::vector<RimPlot*>& plots )
|
||||
{
|
||||
for ( auto plot : plots )
|
||||
{
|
||||
if ( plot )
|
||||
{
|
||||
m_plots.insert( -1, plot );
|
||||
|
||||
if ( m_viewer )
|
||||
{
|
||||
plot->createPlotWidget();
|
||||
m_viewer->insertPlot( plot->viewer(), -1 );
|
||||
}
|
||||
plot->setShowWindow( true );
|
||||
plot->updateAfterInsertingIntoMultiPlot();
|
||||
}
|
||||
}
|
||||
onPlotAdditionOrRemoval();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimMultiPlot::deleteAllPlots()
|
||||
{
|
||||
for ( auto plot : m_plots() )
|
||||
{
|
||||
if ( plot && m_viewer )
|
||||
{
|
||||
m_viewer->removePlot( plot->viewer() );
|
||||
}
|
||||
}
|
||||
|
||||
m_plots.deleteAllChildObjects();
|
||||
onPlotAdditionOrRemoval();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -659,6 +699,20 @@ void RimMultiPlot::uiOrderingForMultiPlotLayout( QString uiConfigName, caf::PdmU
|
||||
uiOrdering.add( &m_majorTickmarkCount );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimMultiPlot::uiOrderingForSummaryMultiPlot( caf::PdmUiOrdering& uiOrdering ) const
|
||||
{
|
||||
uiOrdering.add( &m_showPlotWindowTitle );
|
||||
uiOrdering.add( &m_plotWindowTitle );
|
||||
uiOrdering.add( &m_showIndividualPlotTitles );
|
||||
uiOrdering.add( &m_subTitleFontSize );
|
||||
uiOrdering.add( &m_columnCount );
|
||||
uiOrdering.add( &m_rowsPerPage );
|
||||
uiOrdering.add( &m_majorTickmarkCount );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -55,6 +55,8 @@ public:
|
||||
};
|
||||
using RowCountEnum = caf::AppEnum<RowCount>;
|
||||
|
||||
friend class RimSummaryMultiPlot;
|
||||
|
||||
public:
|
||||
RimMultiPlot();
|
||||
~RimMultiPlot() override;
|
||||
@ -74,6 +76,10 @@ public:
|
||||
void removePlot( RimPlot* plot ) override;
|
||||
void movePlotsToThis( const std::vector<RimPlot*>& plots, int insertAtPosition );
|
||||
|
||||
void insertPlots( const std::vector<RimPlot*>& plots );
|
||||
void deleteAllPlots();
|
||||
void uiOrderingForSummaryMultiPlot( caf::PdmUiOrdering& uiOrdering ) const;
|
||||
|
||||
size_t plotCount() const override;
|
||||
size_t plotIndex( const RimPlot* plot ) const;
|
||||
|
||||
|
@ -19,6 +19,7 @@
|
||||
|
||||
#include "RimMultiPlot.h"
|
||||
#include "RimProject.h"
|
||||
#include "RimSummaryMultiPlot.h"
|
||||
|
||||
#include "cafPdmFieldReorderCapability.h"
|
||||
|
||||
@ -34,6 +35,10 @@ RimMultiPlotCollection::RimMultiPlotCollection()
|
||||
CAF_PDM_InitFieldNoDefault( &m_multiPlots, "MultiPlots", "Plots Reports" );
|
||||
m_multiPlots.uiCapability()->setUiTreeHidden( true );
|
||||
caf::PdmFieldReorderCapability::addToField( &m_multiPlots );
|
||||
|
||||
CAF_PDM_InitFieldNoDefault( &m_multiSummaryPlots, "MultiSummaryPlots", "Multi Summary Plots" );
|
||||
m_multiSummaryPlots.uiCapability()->setUiTreeHidden( true );
|
||||
caf::PdmFieldReorderCapability::addToField( &m_multiSummaryPlots );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -49,6 +54,7 @@ RimMultiPlotCollection::~RimMultiPlotCollection()
|
||||
void RimMultiPlotCollection::deleteAllPlots()
|
||||
{
|
||||
m_multiPlots.deleteAllChildObjects();
|
||||
m_multiSummaryPlots.deleteAllChildObjects();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -79,6 +85,14 @@ void RimMultiPlotCollection::addMultiPlot( RimMultiPlot* plot )
|
||||
m_multiPlots().push_back( plot );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimMultiPlotCollection::addMultiSummaryPlot( RimSummaryMultiPlot* plot )
|
||||
{
|
||||
m_multiSummaryPlots().push_back( plot );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -86,6 +100,9 @@ void RimMultiPlotCollection::loadDataAndUpdateAllPlots()
|
||||
{
|
||||
for ( const auto& p : m_multiPlots.childObjects() )
|
||||
p->loadDataAndUpdate();
|
||||
|
||||
for ( const auto& p : m_multiSummaryPlots.childObjects() )
|
||||
p->loadDataAndUpdate();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -93,5 +110,5 @@ void RimMultiPlotCollection::loadDataAndUpdateAllPlots()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
size_t RimMultiPlotCollection::plotCount() const
|
||||
{
|
||||
return m_multiPlots.size();
|
||||
return m_multiPlots.size() + m_multiSummaryPlots.size();
|
||||
}
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "cafPdmObject.h"
|
||||
|
||||
class RimMultiPlot;
|
||||
class RimSummaryMultiPlot;
|
||||
|
||||
//==================================================================================================
|
||||
///
|
||||
@ -43,7 +44,9 @@ public:
|
||||
std::vector<RimMultiPlot*> multiPlots() const;
|
||||
RimMultiPlot* createMultiPlot();
|
||||
void addMultiPlot( RimMultiPlot* plot );
|
||||
void addMultiSummaryPlot( RimSummaryMultiPlot* plot );
|
||||
|
||||
private:
|
||||
caf::PdmChildArrayField<RimMultiPlot*> m_multiPlots;
|
||||
caf::PdmChildArrayField<RimMultiPlot*> m_multiPlots;
|
||||
caf::PdmChildArrayField<RimSummaryMultiPlot*> m_multiSummaryPlots;
|
||||
};
|
||||
|
@ -37,6 +37,7 @@ set(SOURCE_GROUP_HEADER_FILES
|
||||
${CMAKE_CURRENT_LIST_DIR}/RimObjectiveFunction.h
|
||||
${CMAKE_CURRENT_LIST_DIR}/RimObjectiveFunctionTools.h
|
||||
${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotManager.h
|
||||
${CMAKE_CURRENT_LIST_DIR}/RimSummaryMultiPlot.h
|
||||
)
|
||||
|
||||
set(SOURCE_GROUP_SOURCE_FILES
|
||||
@ -78,6 +79,7 @@ set(SOURCE_GROUP_SOURCE_FILES
|
||||
${CMAKE_CURRENT_LIST_DIR}/RimObjectiveFunction.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RimObjectiveFunctionTools.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotManager.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RimSummaryMultiPlot.cpp
|
||||
)
|
||||
|
||||
list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES})
|
||||
|
@ -94,6 +94,7 @@ void addCaseRealizationParametersIfFound( RimSummaryCase& sumCase, const QString
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RimSummaryCaseMainCollection::RimSummaryCaseMainCollection()
|
||||
: dataSourceHasChanged( this )
|
||||
{
|
||||
CAF_PDM_InitObject( "Summary Cases", ":/SummaryCases16x16.png", "", "" );
|
||||
|
||||
@ -233,6 +234,8 @@ void RimSummaryCaseMainCollection::addCase( RimSummaryCase* summaryCase )
|
||||
{
|
||||
m_cases.push_back( summaryCase );
|
||||
summaryCase->nameChanged.connect( this, &RimSummaryCaseMainCollection::onCaseNameChanged );
|
||||
|
||||
dataSourceHasChanged.send();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -267,6 +270,8 @@ void RimSummaryCaseMainCollection::removeCase( RimSummaryCase* summaryCase )
|
||||
{
|
||||
derEnsemble->createDerivedEnsembleCases();
|
||||
}
|
||||
|
||||
dataSourceHasChanged.send();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -313,6 +318,8 @@ RimSummaryCaseCollection*
|
||||
summaryCaseCollection->caseNameChanged.connect( this, &RimSummaryCaseMainCollection::onCaseNameChanged );
|
||||
m_caseCollections.push_back( summaryCaseCollection );
|
||||
|
||||
dataSourceHasChanged.send();
|
||||
|
||||
return summaryCaseCollection;
|
||||
}
|
||||
|
||||
@ -322,6 +329,8 @@ RimSummaryCaseCollection*
|
||||
void RimSummaryCaseMainCollection::removeCaseCollection( RimSummaryCaseCollection* caseCollection )
|
||||
{
|
||||
m_caseCollections.removeChildObject( caseCollection );
|
||||
|
||||
dataSourceHasChanged.send();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -19,6 +19,7 @@
|
||||
|
||||
#include "cafPdmChildArrayField.h"
|
||||
#include "cafPdmObject.h"
|
||||
#include "cafSignal.h"
|
||||
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
@ -37,6 +38,9 @@ class RimSummaryCaseMainCollection : public caf::PdmObject
|
||||
{
|
||||
CAF_PDM_HEADER_INIT;
|
||||
|
||||
public:
|
||||
caf::Signal<> dataSourceHasChanged;
|
||||
|
||||
public:
|
||||
RimSummaryCaseMainCollection();
|
||||
~RimSummaryCaseMainCollection() override;
|
||||
|
@ -0,0 +1,307 @@
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2021 Equinor ASA
|
||||
//
|
||||
// ResInsight is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
// FITNESS FOR A PARTICULAR PURPOSE.
|
||||
//
|
||||
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
|
||||
// for more details.
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "RimMultiPlot.h"
|
||||
|
||||
#include "RiaSummaryStringTools.h"
|
||||
|
||||
#include "RimMainPlotCollection.h"
|
||||
#include "RimMultiPlotCollection.h"
|
||||
#include "RimProject.h"
|
||||
#include "RimSummaryCase.h"
|
||||
#include "RimSummaryCaseCollection.h"
|
||||
#include "RimSummaryMultiPlot.h"
|
||||
#include "RimSummaryPlot.h"
|
||||
|
||||
#include "PlotBuilderCommands/RicSummaryPlotBuilder.h"
|
||||
#include "RiuSummaryVectorSelectionUi.h"
|
||||
|
||||
#include "cafPdmUiComboBoxEditor.h"
|
||||
#include "cafPdmUiTreeOrdering.h"
|
||||
#include "cafPdmUiTreeSelectionEditor.h"
|
||||
|
||||
CAF_PDM_SOURCE_INIT( RimSummaryMultiPlot, "MultiSummaryPlot" );
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RimSummaryMultiPlot::RimSummaryMultiPlot()
|
||||
{
|
||||
CAF_PDM_InitObject( "Multi Summary Plot Plot", "", "", "" );
|
||||
this->setDeletable( true );
|
||||
|
||||
CAF_PDM_InitFieldNoDefault( &m_filterText, "FilterText", "Filter Text" );
|
||||
m_filterText.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() );
|
||||
|
||||
CAF_PDM_InitField( &m_individualPlotPerVector, "IndividualPlotPerVector", false, "One plot per Vector" );
|
||||
CAF_PDM_InitField( &m_individualPlotPerDataSource, "IndividualPlotPerDataSource", false, "One plot per Data Source" );
|
||||
|
||||
CAF_PDM_InitField( &m_showMultiPlotInProjectTree, "ShowMultiPlotInProjectTree", false, "Show Multi Plot In Project Tree" );
|
||||
|
||||
CAF_PDM_InitFieldNoDefault( &m_multiPlot, "MultiPlot", "Multi Plot" );
|
||||
m_multiPlot = new RimMultiPlot;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RimSummaryMultiPlot::~RimSummaryMultiPlot()
|
||||
{
|
||||
removeMdiWindowFromMdiArea();
|
||||
m_multiPlot->cleanupBeforeClose();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
QWidget* RimSummaryMultiPlot::viewWidget()
|
||||
{
|
||||
return m_multiPlot->viewWidget();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
QImage RimSummaryMultiPlot::snapshotWindowContent()
|
||||
{
|
||||
return m_multiPlot->snapshotWindowContent();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryMultiPlot::zoomAll()
|
||||
{
|
||||
m_multiPlot->zoomAll();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
QString RimSummaryMultiPlot::description() const
|
||||
{
|
||||
return "RimMultiSummaryPlot Placeholder Text";
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryMultiPlot::addPlot( RimPlot* plot )
|
||||
{
|
||||
m_multiPlot->addPlot( plot );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RimSummaryMultiPlot* RimSummaryMultiPlot::createAndAppendMultiPlot( const std::vector<RimPlot*>& plots )
|
||||
{
|
||||
RimProject* project = RimProject::current();
|
||||
auto* plotCollection = project->mainPlotCollection()->multiPlotCollection();
|
||||
|
||||
auto* plotWindow = new RimSummaryMultiPlot;
|
||||
plotWindow->setAsPlotMdiWindow();
|
||||
plotCollection->addMultiSummaryPlot( plotWindow );
|
||||
|
||||
for ( auto plot : plots )
|
||||
{
|
||||
plotWindow->addPlot( plot );
|
||||
|
||||
plot->resolveReferencesRecursively();
|
||||
plot->revokeMdiWindowStatus();
|
||||
plot->setShowWindow( true );
|
||||
|
||||
plot->loadDataAndUpdate();
|
||||
}
|
||||
|
||||
plotCollection->updateAllRequiredEditors();
|
||||
plotWindow->loadDataAndUpdate();
|
||||
|
||||
return plotWindow;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
QWidget* RimSummaryMultiPlot::createViewWidget( QWidget* mainWindowParent /*= nullptr*/ )
|
||||
{
|
||||
return m_multiPlot->createViewWidget( mainWindowParent );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryMultiPlot::deleteViewWidget()
|
||||
{
|
||||
m_multiPlot->deleteViewWidget();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryMultiPlot::onLoadDataAndUpdate()
|
||||
{
|
||||
updateMdiWindowVisibility();
|
||||
|
||||
m_multiPlot->onLoadDataAndUpdate();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryMultiPlot::doRenderWindowContent( QPaintDevice* paintDevice )
|
||||
{
|
||||
m_multiPlot->doRenderWindowContent( paintDevice );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
QList<caf::PdmOptionItemInfo> RimSummaryMultiPlot::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
|
||||
bool* useOptionsOnly )
|
||||
{
|
||||
QList<caf::PdmOptionItemInfo> options;
|
||||
return options;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryMultiPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
|
||||
{
|
||||
uiOrdering.add( &m_filterText );
|
||||
uiOrdering.add( &m_individualPlotPerVector );
|
||||
uiOrdering.add( &m_individualPlotPerDataSource );
|
||||
|
||||
auto group = uiOrdering.addNewGroup( "Multi Plot Options" );
|
||||
m_multiPlot->uiOrderingForSummaryMultiPlot( *group );
|
||||
|
||||
uiOrdering.add( &m_showMultiPlotInProjectTree );
|
||||
|
||||
uiOrdering.skipRemainingFields();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryMultiPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedField,
|
||||
const QVariant& oldValue,
|
||||
const QVariant& newValue )
|
||||
{
|
||||
RimPlotWindow::fieldChangedByUi( changedField, oldValue, newValue );
|
||||
|
||||
if ( changedField == &m_showWindow && m_showWindow() )
|
||||
{
|
||||
// Plots contained in a RimMultiPlot will automatically be set invisible
|
||||
// Restore plot visibility
|
||||
|
||||
for ( auto p : m_multiPlot->plots() )
|
||||
{
|
||||
p->setShowWindow( true );
|
||||
}
|
||||
}
|
||||
else if ( changedField == &m_filterText || changedField == &m_individualPlotPerDataSource ||
|
||||
changedField == &m_individualPlotPerVector )
|
||||
{
|
||||
updatePlots();
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryMultiPlot::defineEditorAttribute( const caf::PdmFieldHandle* field,
|
||||
QString uiConfigName,
|
||||
caf::PdmUiEditorAttribute* attribute )
|
||||
{
|
||||
if ( field == &m_filterText )
|
||||
{
|
||||
auto attr = dynamic_cast<caf::PdmUiComboBoxEditorAttribute*>( attribute );
|
||||
if ( attr )
|
||||
{
|
||||
attr->enableEditableContent = true;
|
||||
attr->enableAutoComplete = false;
|
||||
attr->adjustWidthToContents = true;
|
||||
attr->notifyWhenTextIsEdited = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryMultiPlot::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName )
|
||||
{
|
||||
uiTreeOrdering.skipRemainingChildren( !m_showMultiPlotInProjectTree );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryMultiPlot::updatePlots()
|
||||
{
|
||||
auto [addressFilters, dataSourceFilters] =
|
||||
RiaSummaryStringTools::splitIntoAddressAndDataSourceFilters( m_filterText() );
|
||||
|
||||
auto [matchingSummaryCases, matchingEnsembles] = RiaSummaryStringTools::dataSourcesMatchingFilters( dataSourceFilters );
|
||||
|
||||
std::set<RifEclipseSummaryAddress> allAddresses;
|
||||
if ( !matchingSummaryCases.empty() )
|
||||
{
|
||||
allAddresses = RicSummaryPlotBuilder::addressesForSource( matchingSummaryCases.front() );
|
||||
}
|
||||
else if ( !matchingEnsembles.empty() )
|
||||
{
|
||||
allAddresses = RicSummaryPlotBuilder::addressesForSource( matchingEnsembles.front() );
|
||||
}
|
||||
|
||||
bool includeDiffCurves = false;
|
||||
auto filteredAddresses =
|
||||
RiaSummaryStringTools::computeFilteredAddresses( addressFilters, allAddresses, includeDiffCurves );
|
||||
|
||||
{
|
||||
// Remove existing plots
|
||||
|
||||
m_multiPlot->deleteAllPlots();
|
||||
|
||||
// Add new plots
|
||||
RicSummaryPlotBuilder plotBuilder;
|
||||
plotBuilder.setAddresses( filteredAddresses );
|
||||
plotBuilder.setDataSources( matchingSummaryCases, matchingEnsembles );
|
||||
plotBuilder.setIndividualPlotPerAddress( m_individualPlotPerVector );
|
||||
plotBuilder.setIndividualPlotPerDataSource( m_individualPlotPerDataSource );
|
||||
|
||||
auto plots = plotBuilder.createPlots();
|
||||
|
||||
std::vector<RimPlot*> plotsForMultiPlot;
|
||||
for ( auto p : plots )
|
||||
{
|
||||
plotsForMultiPlot.push_back( dynamic_cast<RimPlot*>( p ) );
|
||||
}
|
||||
|
||||
for ( auto plot : plotsForMultiPlot )
|
||||
{
|
||||
this->addPlot( plot );
|
||||
|
||||
plot->resolveReferencesRecursively();
|
||||
plot->revokeMdiWindowStatus();
|
||||
plot->setShowWindow( true );
|
||||
}
|
||||
|
||||
m_multiPlot->loadDataAndUpdate();
|
||||
}
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2021 Equinor ASA
|
||||
//
|
||||
// ResInsight is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
// FITNESS FOR A PARTICULAR PURPOSE.
|
||||
//
|
||||
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
|
||||
// for more details.
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "RimPlotWindow.h"
|
||||
|
||||
#include "cafPdmChildField.h"
|
||||
#include "cafPdmObject.h"
|
||||
#include "cafPdmPtrArrayField.h"
|
||||
|
||||
class RimMultiPlot;
|
||||
|
||||
//==================================================================================================
|
||||
///
|
||||
///
|
||||
//==================================================================================================
|
||||
class RimSummaryMultiPlot : public RimPlotWindow
|
||||
{
|
||||
CAF_PDM_HEADER_INIT;
|
||||
|
||||
public:
|
||||
RimSummaryMultiPlot();
|
||||
~RimSummaryMultiPlot();
|
||||
|
||||
QWidget* viewWidget() override;
|
||||
QImage snapshotWindowContent() override;
|
||||
void zoomAll() override;
|
||||
QString description() const override;
|
||||
|
||||
void addPlot( RimPlot* plot );
|
||||
|
||||
static RimSummaryMultiPlot* createAndAppendMultiPlot( const std::vector<RimPlot*>& plots );
|
||||
|
||||
private:
|
||||
QWidget* createViewWidget( QWidget* mainWindowParent = nullptr ) override;
|
||||
void deleteViewWidget() override;
|
||||
void onLoadDataAndUpdate() override;
|
||||
|
||||
void doRenderWindowContent( QPaintDevice* paintDevice ) override;
|
||||
|
||||
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
|
||||
bool* useOptionsOnly ) override;
|
||||
|
||||
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
|
||||
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
|
||||
void defineEditorAttribute( const caf::PdmFieldHandle* field,
|
||||
QString uiConfigName,
|
||||
caf::PdmUiEditorAttribute* attribute ) override;
|
||||
void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName ) override;
|
||||
|
||||
void updatePlots();
|
||||
|
||||
private:
|
||||
caf::PdmField<QString> m_filterText;
|
||||
caf::PdmField<bool> m_individualPlotPerVector;
|
||||
caf::PdmField<bool> m_individualPlotPerDataSource;
|
||||
|
||||
caf::PdmField<bool> m_showMultiPlotInProjectTree;
|
||||
caf::PdmChildField<RimMultiPlot*> m_multiPlot;
|
||||
};
|
@ -28,6 +28,9 @@
|
||||
|
||||
#include "RimEnsembleCurveSet.h"
|
||||
#include "RimEnsembleCurveSetCollection.h"
|
||||
#include "RimMainPlotCollection.h"
|
||||
#include "RimMultiPlotCollection.h"
|
||||
#include "RimProject.h"
|
||||
#include "RimSummaryCase.h"
|
||||
#include "RimSummaryCaseCollection.h"
|
||||
#include "RimSummaryCaseMainCollection.h"
|
||||
@ -113,6 +116,14 @@ void RimSummaryPlotManager::setFocusToFilterText()
|
||||
setFocusToEditorWidget( m_filterText.uiCapability() );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryPlotManager::resetDataSourceSelection()
|
||||
{
|
||||
m_previousDataSourceText.clear();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -128,8 +139,10 @@ void RimSummaryPlotManager::fieldChangedByUi( const caf::PdmFieldHandle* changed
|
||||
const QVariant& oldValue,
|
||||
const QVariant& newValue )
|
||||
{
|
||||
if ( changedField == &m_summaryPlot || changedField == &m_filterText || changedField == &m_includeDiffCurves )
|
||||
if ( changedField == &m_summaryPlot || changedField == &m_filterText || changedField == &m_includeDiffCurves ||
|
||||
changedField == &m_selectedDataSources )
|
||||
{
|
||||
updateSelectionFromUiChange();
|
||||
updateCurveCandidates();
|
||||
}
|
||||
else if ( changedField == &m_pushButtonReplace )
|
||||
@ -175,32 +188,12 @@ QList<caf::PdmOptionItemInfo>
|
||||
}
|
||||
else if ( fieldNeedingOptions == &m_selectedDataSources )
|
||||
{
|
||||
auto [summaryCases, ensembles] = allDataSourcesInProject();
|
||||
|
||||
std::vector<QString> dataSourceDisplayNames;
|
||||
|
||||
bool resetCheckedItems = false;
|
||||
|
||||
std::vector<std::pair<QString, PdmObject*>> dataSources = findDataSourceCandidates();
|
||||
for ( const auto& dataSource : dataSources )
|
||||
for ( const auto& displayName : dataSourceDisplayNames() )
|
||||
{
|
||||
auto displayName = dataSource.first;
|
||||
dataSourceDisplayNames.push_back( displayName );
|
||||
options.push_back( caf::PdmOptionItemInfo( displayName, displayName ) );
|
||||
|
||||
if ( m_previousDataSourceSelection.count( displayName ) == 0 ) resetCheckedItems = true;
|
||||
}
|
||||
|
||||
if ( m_previousDataSourceSelection.size() != dataSourceDisplayNames.size() ) resetCheckedItems = true;
|
||||
|
||||
if ( resetCheckedItems )
|
||||
{
|
||||
// By default select all available data sources
|
||||
m_selectedDataSources = dataSourceDisplayNames;
|
||||
}
|
||||
|
||||
m_previousDataSourceSelection.clear();
|
||||
m_previousDataSourceSelection.insert( dataSourceDisplayNames.begin(), dataSourceDisplayNames.end() );
|
||||
updateSelectionFromUiChange();
|
||||
}
|
||||
|
||||
return options;
|
||||
@ -230,59 +223,33 @@ std::vector<std::pair<QString, caf::PdmObject*>> RimSummaryPlotManager::findData
|
||||
{
|
||||
std::vector<std::pair<QString, PdmObject*>> candidates;
|
||||
|
||||
QStringList addressFilters;
|
||||
QStringList dataSourceFilters;
|
||||
splitIntoAddressAndDataSourceFilters( addressFilters, dataSourceFilters );
|
||||
QStringList dataSourceFilters = extractDataSourceFilters();
|
||||
|
||||
// If no filter on data source is specified, use wildcard to match all
|
||||
if ( dataSourceFilters.empty() ) dataSourceFilters.push_back( "*" );
|
||||
auto [summaryCases, ensembles] = RiaSummaryStringTools::dataSourcesMatchingFilters( dataSourceFilters );
|
||||
|
||||
auto [summaryCases, ensembles] = allDataSourcesInProject();
|
||||
|
||||
for ( const auto& dsFilter : dataSourceFilters )
|
||||
for ( auto ensemble : ensembles )
|
||||
{
|
||||
QString searchString = dsFilter.left( dsFilter.indexOf( ':' ) );
|
||||
QRegExp searcher( searchString, Qt::CaseInsensitive, QRegExp::WildcardUnix );
|
||||
auto ensembleName = ensemble->name();
|
||||
|
||||
for ( const auto& ensemble : ensembles )
|
||||
candidates.push_back( std::make_pair( ensembleName, ensemble ) );
|
||||
}
|
||||
|
||||
for ( const auto& summaryCase : summaryCases )
|
||||
{
|
||||
auto summaryCaseName = summaryCase->displayCaseName();
|
||||
|
||||
QString displayName;
|
||||
auto ensemble = summaryCase->ensemble();
|
||||
if ( ensemble )
|
||||
{
|
||||
auto ensembleName = ensemble->name();
|
||||
if ( searcher.exactMatch( ensembleName ) )
|
||||
{
|
||||
if ( searchString == dsFilter )
|
||||
{
|
||||
// Match on ensemble name without realization filter
|
||||
|
||||
candidates.push_back( std::make_pair( ensembleName, ensemble ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Match on subset of realisations in ensemble
|
||||
|
||||
QString realizationSearchString = dsFilter.right( dsFilter.size() - dsFilter.indexOf( ':' ) - 1 );
|
||||
QRegExp realizationSearcher( realizationSearchString, Qt::CaseInsensitive, QRegExp::WildcardUnix );
|
||||
|
||||
for ( const auto& summaryCase : ensemble->allSummaryCases() )
|
||||
{
|
||||
auto realizationName = summaryCase->displayCaseName();
|
||||
if ( realizationSearcher.exactMatch( realizationName ) )
|
||||
{
|
||||
QString displayName = ensembleName + ":" + realizationName;
|
||||
candidates.push_back( std::make_pair( displayName, summaryCase ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
displayName = ensemble->name() + ":" + summaryCaseName;
|
||||
}
|
||||
else
|
||||
{
|
||||
displayName = summaryCaseName;
|
||||
}
|
||||
|
||||
for ( const auto& summaryCase : summaryCases )
|
||||
{
|
||||
auto summaryCaseName = summaryCase->displayCaseName();
|
||||
if ( searcher.exactMatch( summaryCaseName ) )
|
||||
{
|
||||
candidates.push_back( std::make_pair( summaryCase->displayCaseName(), summaryCase ) );
|
||||
}
|
||||
}
|
||||
candidates.push_back( std::make_pair( displayName, summaryCase ) );
|
||||
}
|
||||
|
||||
return candidates;
|
||||
@ -291,28 +258,17 @@ std::vector<std::pair<QString, caf::PdmObject*>> RimSummaryPlotManager::findData
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::set<RifEclipseSummaryAddress>
|
||||
RimSummaryPlotManager::computeFilteredAddresses( const QStringList& textFilters,
|
||||
const std::set<RifEclipseSummaryAddress>& sourceAddresses )
|
||||
std::vector<QString> RimSummaryPlotManager::dataSourceDisplayNames() const
|
||||
{
|
||||
std::set<RifEclipseSummaryAddress> addresses;
|
||||
|
||||
std::vector<bool> usedFilters;
|
||||
RicSummaryPlotFeatureImpl::insertFilteredAddressesInSet( textFilters, sourceAddresses, &addresses, &usedFilters );
|
||||
|
||||
if ( m_includeDiffCurves ) return addresses;
|
||||
|
||||
const auto diffText = RifReaderEclipseSummary::differenceIdentifier();
|
||||
|
||||
std::set<RifEclipseSummaryAddress> addressesWithoutDiffVectors;
|
||||
for ( const auto& adr : addresses )
|
||||
std::vector<QString> displayNames;
|
||||
std::vector<std::pair<QString, PdmObject*>> dataSources = findDataSourceCandidates();
|
||||
for ( const auto& dataSource : dataSources )
|
||||
{
|
||||
if ( RiaStdStringTools::endsWith( adr.quantityName(), diffText ) ) continue;
|
||||
|
||||
addressesWithoutDiffVectors.insert( adr );
|
||||
auto displayName = dataSource.first;
|
||||
displayNames.push_back( displayName );
|
||||
}
|
||||
|
||||
return addressesWithoutDiffVectors;
|
||||
return displayNames;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -429,6 +385,7 @@ void RimSummaryPlotManager::createNewPlot()
|
||||
p->loadDataAndUpdate();
|
||||
plotsForMultiPlot.push_back( dynamic_cast<RimPlot*>( p ) );
|
||||
}
|
||||
|
||||
RicSummaryPlotBuilder::createAndAppendMultiPlot( plotsForMultiPlot );
|
||||
}
|
||||
else
|
||||
@ -472,20 +429,6 @@ bool RimSummaryPlotManager::eventFilter( QObject* obj, QEvent* event )
|
||||
return QObject::eventFilter( obj, event );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::pair<std::vector<RimSummaryCase*>, std::vector<RimSummaryCaseCollection*>>
|
||||
RimSummaryPlotManager::allDataSourcesInProject() const
|
||||
{
|
||||
auto sumCaseMainColl = RiaSummaryTools::summaryCaseMainCollection();
|
||||
|
||||
auto summaryCases = sumCaseMainColl->topLevelSummaryCases();
|
||||
auto ensembles = sumCaseMainColl->summaryCaseCollections();
|
||||
|
||||
return { summaryCases, ensembles };
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -500,6 +443,7 @@ void RimSummaryPlotManager::updateUiFromSelection()
|
||||
{
|
||||
m_summaryPlot = summaryPlot;
|
||||
|
||||
updateSelectionFromUiChange();
|
||||
updateCurveCandidates();
|
||||
}
|
||||
|
||||
@ -508,8 +452,7 @@ void RimSummaryPlotManager::updateUiFromSelection()
|
||||
m_summaryPlot = nullptr;
|
||||
|
||||
std::vector<QString> tmp;
|
||||
m_addressCandidates = tmp;
|
||||
m_selectedDataSources = tmp;
|
||||
m_addressCandidates = tmp;
|
||||
}
|
||||
|
||||
updateConnectedEditors();
|
||||
@ -538,7 +481,7 @@ std::set<RifEclipseSummaryAddress> RimSummaryPlotManager::filteredAddresses()
|
||||
|
||||
QStringList allCurveAddressFilters = m_filterText().split( QRegExp( "\\s+" ), QString::SkipEmptyParts );
|
||||
|
||||
return computeFilteredAddresses( allCurveAddressFilters, nativeAddresses );
|
||||
return RiaSummaryStringTools::computeFilteredAddresses( allCurveAddressFilters, nativeAddresses, m_includeDiffCurves );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -585,6 +528,20 @@ void RimSummaryPlotManager::updateProjectTreeAndRefresUi()
|
||||
setFocusToFilterText();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryPlotManager::updateSelectionFromUiChange()
|
||||
{
|
||||
QStringList dataSourceFilters = extractDataSourceFilters();
|
||||
if ( m_previousDataSourceText != dataSourceFilters )
|
||||
{
|
||||
m_selectedDataSources = dataSourceDisplayNames();
|
||||
|
||||
m_previousDataSourceText = dataSourceFilters;
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -611,28 +568,12 @@ void RimSummaryPlotManager::setFocusToEditorWidget( caf::PdmUiFieldHandle* uiFie
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryPlotManager::splitIntoAddressAndDataSourceFilters( QStringList& addressFilters,
|
||||
QStringList& dataSourceFilters ) const
|
||||
QStringList RimSummaryPlotManager::extractDataSourceFilters() const
|
||||
{
|
||||
QStringList filterItems = m_filterText().split( QRegExp( "\\s+" ), QString::SkipEmptyParts );
|
||||
auto [addressFilters, dataSourceFilters] =
|
||||
RiaSummaryStringTools::splitIntoAddressAndDataSourceFilters( m_filterText() );
|
||||
|
||||
auto [summaryCases, ensembles] = allDataSourcesInProject();
|
||||
|
||||
QStringList dataSourceNames;
|
||||
for ( const auto& summaryCase : summaryCases )
|
||||
{
|
||||
dataSourceNames.push_back( summaryCase->displayCaseName() );
|
||||
}
|
||||
|
||||
for ( const auto& ensemble : ensembles )
|
||||
{
|
||||
dataSourceNames.push_back( ensemble->name() );
|
||||
}
|
||||
|
||||
RiaSummaryStringTools::splitIntoAddressAndDataSourceFilters( filterItems,
|
||||
dataSourceNames,
|
||||
addressFilters,
|
||||
dataSourceFilters );
|
||||
return dataSourceFilters;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -671,3 +612,12 @@ QString RimSummaryPlotManager::curveFilterRecentlyUsedRegistryKey()
|
||||
{
|
||||
return "SummaryPlotManagerCurveFilterStrings";
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryPlotManager::onSummaryDataSourceHasChanged( const caf::SignalEmitter* emitter )
|
||||
{
|
||||
resetDataSourceSelection();
|
||||
updateSelectionFromUiChange();
|
||||
}
|
||||
|
@ -42,6 +42,8 @@ public:
|
||||
RimSummaryPlotManager();
|
||||
|
||||
void setFocusToFilterText();
|
||||
void resetDataSourceSelection();
|
||||
void onSummaryDataSourceHasChanged( const caf::SignalEmitter* emitter );
|
||||
|
||||
private:
|
||||
void appendCurves();
|
||||
@ -66,11 +68,7 @@ private:
|
||||
void updateCurveCandidates();
|
||||
|
||||
std::vector<std::pair<QString, caf::PdmObject*>> findDataSourceCandidates() const;
|
||||
|
||||
std::set<RifEclipseSummaryAddress> computeFilteredAddresses( const QStringList& textFilters,
|
||||
const std::set<RifEclipseSummaryAddress>& sourceAddresses );
|
||||
|
||||
std::pair<std::vector<RimSummaryCase*>, std::vector<RimSummaryCaseCollection*>> allDataSourcesInProject() const;
|
||||
std::vector<QString> dataSourceDisplayNames() const;
|
||||
|
||||
std::set<RifEclipseSummaryAddress> filteredAddresses();
|
||||
|
||||
@ -78,8 +76,10 @@ private:
|
||||
void appendCurvesToPlot( RimSummaryPlot* destinationPlot );
|
||||
void updateFilterTextHistory();
|
||||
void updateProjectTreeAndRefresUi();
|
||||
void updateSelectionFromUiChange();
|
||||
|
||||
QStringList extractDataSourceFilters() const;
|
||||
|
||||
void splitIntoAddressAndDataSourceFilters( QStringList& addressFilters, QStringList& dataSourceFilters ) const;
|
||||
void findFilteredSummaryCasesAndEnsembles( std::vector<RimSummaryCase*>& summaryCases,
|
||||
std::vector<RimSummaryCaseCollection*>& ensembles ) const;
|
||||
|
||||
@ -106,5 +106,5 @@ private:
|
||||
caf::PdmField<QString> m_labelA;
|
||||
caf::PdmField<QString> m_labelB;
|
||||
|
||||
std::set<QString> m_previousDataSourceSelection;
|
||||
QStringList m_previousDataSourceText;
|
||||
};
|
||||
|
@ -21,10 +21,7 @@ TEST( RiaSummaryStringToolsTest, ParseNumbers )
|
||||
QStringList addressFilters;
|
||||
QStringList dataSourceFilters;
|
||||
|
||||
RiaSummaryStringTools::splitIntoAddressAndDataSourceFilters( arguments,
|
||||
dataSourceNames,
|
||||
addressFilters,
|
||||
dataSourceFilters );
|
||||
RiaSummaryStringTools::splitUsingDataSourceNames( arguments, dataSourceNames, addressFilters, dataSourceFilters );
|
||||
|
||||
EXPECT_TRUE( addressFilters[0] == wellFilter );
|
||||
EXPECT_TRUE( addressFilters[1] == fieldFilter );
|
||||
@ -39,10 +36,7 @@ TEST( RiaSummaryStringToolsTest, ParseNumbers )
|
||||
QStringList addressFilters;
|
||||
QStringList dataSourceFilters;
|
||||
|
||||
RiaSummaryStringTools::splitIntoAddressAndDataSourceFilters( arguments,
|
||||
dataSourceNames,
|
||||
addressFilters,
|
||||
dataSourceFilters );
|
||||
RiaSummaryStringTools::splitUsingDataSourceNames( arguments, dataSourceNames, addressFilters, dataSourceFilters );
|
||||
|
||||
EXPECT_TRUE( addressFilters[0] == wellFilter );
|
||||
EXPECT_TRUE( addressFilters[1] == fieldFilter );
|
||||
|
@ -134,6 +134,10 @@ void RiuPlotMainWindow::initializeGuiNewProjectLoaded()
|
||||
auto sumPlotManager = dynamic_cast<RimSummaryPlotManager*>( m_summaryPlotManager.get() );
|
||||
if ( sumPlotManager )
|
||||
{
|
||||
auto* obj = RiaSummaryTools::summaryCaseMainCollection();
|
||||
obj->dataSourceHasChanged.connect( sumPlotManager, &RimSummaryPlotManager::onSummaryDataSourceHasChanged );
|
||||
|
||||
sumPlotManager->resetDataSourceSelection();
|
||||
sumPlotManager->updateConnectedEditors();
|
||||
}
|
||||
|
||||
|
@ -539,6 +539,101 @@ void RiuSummaryVectorSelectionUi::setDefaultSelection( const std::vector<Summary
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
QList<caf::PdmOptionItemInfo> RiuSummaryVectorSelectionUi::optionsForSummaryDataSource( bool hideSummaryCases,
|
||||
bool hideEnsembles,
|
||||
bool showIndividualEnsembleCases )
|
||||
{
|
||||
QList<caf::PdmOptionItemInfo> options;
|
||||
|
||||
RimProject* proj = RimProject::current();
|
||||
std::vector<RimOilField*> oilFields;
|
||||
|
||||
proj->allOilFields( oilFields );
|
||||
for ( RimOilField* oilField : oilFields )
|
||||
{
|
||||
RimSummaryCaseMainCollection* sumCaseMainColl = oilField->summaryCaseMainCollection();
|
||||
if ( sumCaseMainColl )
|
||||
{
|
||||
if ( !hideSummaryCases )
|
||||
{
|
||||
// Top level cases
|
||||
for ( const auto& sumCase : sumCaseMainColl->topLevelSummaryCases() )
|
||||
{
|
||||
options.push_back( caf::PdmOptionItemInfo( sumCase->displayCaseName(), sumCase ) );
|
||||
}
|
||||
}
|
||||
|
||||
// Ensembles
|
||||
if ( !hideEnsembles )
|
||||
{
|
||||
bool ensembleHeaderCreated = false;
|
||||
for ( const auto& sumCaseColl : sumCaseMainColl->summaryCaseCollections() )
|
||||
{
|
||||
if ( !sumCaseColl->isEnsemble() ) continue;
|
||||
|
||||
if ( !ensembleHeaderCreated )
|
||||
{
|
||||
options.push_back( caf::PdmOptionItemInfo::createHeader( "Ensembles", true ) );
|
||||
ensembleHeaderCreated = true;
|
||||
}
|
||||
// Ensemble level
|
||||
{
|
||||
auto optionItem = caf::PdmOptionItemInfo( sumCaseColl->name(), sumCaseColl );
|
||||
optionItem.setLevel( 1 );
|
||||
options.push_back( optionItem );
|
||||
}
|
||||
if ( showIndividualEnsembleCases )
|
||||
{
|
||||
for ( const auto& sumCase : sumCaseColl->allSummaryCases() )
|
||||
{
|
||||
auto optionItem = caf::PdmOptionItemInfo( sumCase->displayCaseName(), sumCase );
|
||||
optionItem.setLevel( 2 );
|
||||
options.push_back( optionItem );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( !hideSummaryCases )
|
||||
{
|
||||
// Grouped cases
|
||||
for ( const auto& sumCaseColl : sumCaseMainColl->summaryCaseCollections() )
|
||||
{
|
||||
if ( sumCaseColl->isEnsemble() ) continue;
|
||||
|
||||
options.push_back( caf::PdmOptionItemInfo::createHeader( sumCaseColl->name(), true ) );
|
||||
|
||||
for ( const auto& sumCase : sumCaseColl->allSummaryCases() )
|
||||
{
|
||||
auto optionItem = caf::PdmOptionItemInfo( sumCase->displayCaseName(), sumCase );
|
||||
optionItem.setLevel( 1 );
|
||||
options.push_back( optionItem );
|
||||
}
|
||||
}
|
||||
|
||||
// Observed data
|
||||
auto observedDataColl = oilField->observedDataCollection();
|
||||
if ( observedDataColl->allObservedSummaryData().size() > 0 )
|
||||
{
|
||||
options.push_back( caf::PdmOptionItemInfo::createHeader( "Observed Data", true ) );
|
||||
|
||||
for ( const auto& obsData : observedDataColl->allObservedSummaryData() )
|
||||
{
|
||||
auto optionItem = caf::PdmOptionItemInfo( obsData->caseName(), obsData );
|
||||
optionItem.setLevel( 1 );
|
||||
options.push_back( optionItem );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -1345,87 +1440,12 @@ RimSummaryCase* RiuSummaryVectorSelectionUi::calculatedSummaryCase()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RiuSummaryVectorSelectionUi::appendOptionItemsForSources( QList<caf::PdmOptionItemInfo>& options ) const
|
||||
{
|
||||
RimProject* proj = RimProject::current();
|
||||
std::vector<RimOilField*> oilFields;
|
||||
auto dataSourceOptions =
|
||||
optionsForSummaryDataSource( m_hideSummaryCases, m_hideEnsembles, m_showIndividualEnsembleCases );
|
||||
|
||||
proj->allOilFields( oilFields );
|
||||
for ( RimOilField* oilField : oilFields )
|
||||
for ( auto& o : dataSourceOptions )
|
||||
{
|
||||
RimSummaryCaseMainCollection* sumCaseMainColl = oilField->summaryCaseMainCollection();
|
||||
if ( sumCaseMainColl )
|
||||
{
|
||||
if ( !m_hideSummaryCases )
|
||||
{
|
||||
// Top level cases
|
||||
for ( const auto& sumCase : sumCaseMainColl->topLevelSummaryCases() )
|
||||
{
|
||||
options.push_back( caf::PdmOptionItemInfo( sumCase->displayCaseName(), sumCase ) );
|
||||
}
|
||||
}
|
||||
|
||||
// Ensembles
|
||||
if ( !m_hideEnsembles )
|
||||
{
|
||||
bool ensembleHeaderCreated = false;
|
||||
for ( const auto& sumCaseColl : sumCaseMainColl->summaryCaseCollections() )
|
||||
{
|
||||
if ( !sumCaseColl->isEnsemble() ) continue;
|
||||
|
||||
if ( !ensembleHeaderCreated )
|
||||
{
|
||||
options.push_back( caf::PdmOptionItemInfo::createHeader( "Ensembles", true ) );
|
||||
ensembleHeaderCreated = true;
|
||||
}
|
||||
// Ensemble level
|
||||
{
|
||||
auto optionItem = caf::PdmOptionItemInfo( sumCaseColl->name(), sumCaseColl );
|
||||
optionItem.setLevel( 1 );
|
||||
options.push_back( optionItem );
|
||||
}
|
||||
if ( m_showIndividualEnsembleCases )
|
||||
{
|
||||
for ( const auto& sumCase : sumCaseColl->allSummaryCases() )
|
||||
{
|
||||
auto optionItem = caf::PdmOptionItemInfo( sumCase->displayCaseName(), sumCase );
|
||||
optionItem.setLevel( 2 );
|
||||
options.push_back( optionItem );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( !m_hideSummaryCases )
|
||||
{
|
||||
// Grouped cases
|
||||
for ( const auto& sumCaseColl : sumCaseMainColl->summaryCaseCollections() )
|
||||
{
|
||||
if ( sumCaseColl->isEnsemble() ) continue;
|
||||
|
||||
options.push_back( caf::PdmOptionItemInfo::createHeader( sumCaseColl->name(), true ) );
|
||||
|
||||
for ( const auto& sumCase : sumCaseColl->allSummaryCases() )
|
||||
{
|
||||
auto optionItem = caf::PdmOptionItemInfo( sumCase->displayCaseName(), sumCase );
|
||||
optionItem.setLevel( 1 );
|
||||
options.push_back( optionItem );
|
||||
}
|
||||
}
|
||||
|
||||
// Observed data
|
||||
auto observedDataColl = oilField->observedDataCollection();
|
||||
if ( observedDataColl->allObservedSummaryData().size() > 0 )
|
||||
{
|
||||
options.push_back( caf::PdmOptionItemInfo::createHeader( "Observed Data", true ) );
|
||||
|
||||
for ( const auto& obsData : observedDataColl->allObservedSummaryData() )
|
||||
{
|
||||
auto optionItem = caf::PdmOptionItemInfo( obsData->caseName(), obsData );
|
||||
optionItem.setLevel( 1 );
|
||||
options.push_back( optionItem );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
options.push_back( o );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -71,6 +71,9 @@ public:
|
||||
|
||||
void setDefaultSelection( const std::vector<SummarySource*>& defaultCases );
|
||||
|
||||
static QList<caf::PdmOptionItemInfo>
|
||||
optionsForSummaryDataSource( bool hideSummaryCases, bool hideEnsembles, bool showIndividualEnsembleCases );
|
||||
|
||||
private:
|
||||
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
|
||||
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
|
||||
|
Loading…
Reference in New Issue
Block a user