Merge pull request #4717 from OPM/feature-Text-Based-Curve-Filter-Editor

Feature text based curve filter editor
This commit is contained in:
Magne Sjaastad 2019-09-13 18:01:29 +02:00 committed by GitHub
commit abb0363b12
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 789 additions and 89 deletions

View File

@ -165,8 +165,9 @@ bool RicImportSummaryCasesFeature::createSummaryCasesFromFiles( const QStringLis
std::vector<RimSummaryCase*>* newCases, std::vector<RimSummaryCase*>* newCases,
bool ensembleOrGroup ) bool ensembleOrGroup )
{ {
RiaApplication* app = RiaApplication::instance(); RiaApplication* app = RiaApplication::instance();
RimProject* proj = app->project(); RimProject* proj = app->project();
RimSummaryCaseMainCollection* sumCaseColl = proj->activeOilField() RimSummaryCaseMainCollection* sumCaseColl = proj->activeOilField()
? proj->activeOilField()->summaryCaseMainCollection() ? proj->activeOilField()->summaryCaseMainCollection()
: nullptr; : nullptr;

View File

@ -178,43 +178,11 @@ RimSummaryCurve* createHistoryCurve( const RifEclipseSummaryAddress& addr, RimSu
return nullptr; return nullptr;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
class RigGridCellResultAddress
{
public:
RigGridCellResultAddress()
: gridIndex( -1 )
, i( -1 )
, j( -1 )
, k( -1 )
{
}
RigGridCellResultAddress(
size_t gridIndex, size_t i, size_t j, size_t k, const RigEclipseResultAddress& eclipseResultAddress )
: gridIndex( gridIndex )
, i( i )
, j( j )
, k( k )
, eclipseResultAddress( eclipseResultAddress )
{
}
// Using zero based ijk
size_t gridIndex;
size_t i;
size_t j;
size_t k;
RigEclipseResultAddress eclipseResultAddress;
};
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
std::vector<RigGridCellResultAddress> createGridCellAddressesFromFilter( const QString& text ) std::vector<RigGridCellResultAddress> RigGridCellResultAddress::createGridCellAddressesFromFilter( const QString& text )
{ {
std::vector<RigGridCellResultAddress> addresses; std::vector<RigGridCellResultAddress> addresses;
QStringList addressParts = text.split( ":" ); QStringList addressParts = text.split( ":" );
@ -252,6 +220,9 @@ std::vector<RigGridCellResultAddress> createGridCellAddressesFromFilter( const Q
return addresses; return addresses;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimEclipseCase*> openEclipseCasesForCellPlotting( QStringList gridFileNames ) std::vector<RimEclipseCase*> openEclipseCasesForCellPlotting( QStringList gridFileNames )
{ {
std::vector<RimEclipseCase*> openedCases; std::vector<RimEclipseCase*> openedCases;
@ -424,53 +395,31 @@ void RicSummaryPlotFeatureImpl::createSummaryPlotsFromArgumentLine( const QStrin
{ {
RicImportSummaryCasesFeature::createSummaryCasesFromFiles( summaryFileNames, &summaryCasesToUse, isEnsembleMode ); RicImportSummaryCasesFeature::createSummaryCasesFromFiles( summaryFileNames, &summaryCasesToUse, isEnsembleMode );
RicImportSummaryCasesFeature::addSummaryCases( summaryCasesToUse ); RicImportSummaryCasesFeature::addSummaryCases( summaryCasesToUse );
RiaApplication::instance()->setLastUsedDialogDirectory( RiaDefines::defaultDirectoryLabel( RiaApplication::instance()->setLastUsedDialogDirectory( RiaDefines::defaultDirectoryLabel(
RiaDefines::ECLIPSE_SUMMARY_FILE ), RiaDefines::ECLIPSE_SUMMARY_FILE ),
QFileInfo( summaryFileNames[0] ).absolutePath() ); QFileInfo( summaryFileNames[0] ).absolutePath() );
} }
// Sort in summary and grid curve addresses
QStringList gridResultAddressFilters;
QStringList summaryAddressFilters;
if ( summaryCasesToUse.size() ) if ( summaryCasesToUse.size() )
{ {
const std::set<RifEclipseSummaryAddress>& addrs = summaryCasesToUse[0]->summaryReader()->allResultAddresses(); // Sort in summary and grid curve addresses
std::vector<bool> usedFilters; QStringList gridResultAddressFilters;
std::set<RifEclipseSummaryAddress> setToInsertFilteredAddressesIn; QStringList summaryAddressFilters;
filteredSummaryAdressesFromCase( allCurveAddressFilters, addrs, &setToInsertFilteredAddressesIn, &usedFilters );
QRegularExpression gridAddressPattern( "^[A-Z]+:[0-9]+,[0-9]+,[0-9]+$" ); splitAddressFiltersInGridAndSummary( summaryCasesToUse[0],
allCurveAddressFilters,
&summaryAddressFilters,
&gridResultAddressFilters );
for ( int filterIdx = 0; filterIdx < allCurveAddressFilters.size(); ++filterIdx )
{
const QString& address = allCurveAddressFilters[filterIdx];
if ( usedFilters[filterIdx] )
{
summaryAddressFilters.push_back( address );
}
else
{
if ( gridAddressPattern.match( address ).hasMatch() )
{
gridResultAddressFilters.push_back( address );
}
else
{
RiaLogging::warning( "No summary or restart vectors matched \"" + address + "\"" );
}
}
}
}
if ( summaryCasesToUse.size() )
{
if ( summaryAddressFilters.size() ) if ( summaryAddressFilters.size() )
{ {
RimSummaryPlotCollection* sumPlotColl = RimSummaryPlotCollection* sumPlotColl =
RiaApplication::instance()->project()->mainPlotCollection()->summaryPlotCollection(); RiaApplication::instance()->project()->mainPlotCollection()->summaryPlotCollection();
RimSummaryPlot* lastPlotCreated = nullptr; RimSummaryPlot* lastPlotCreated = nullptr;
RimSummaryCaseCollection* ensemble = nullptr; RimSummaryCaseCollection* ensemble = nullptr;
if ( isEnsembleMode ) if ( isEnsembleMode )
ensemble = RicCreateSummaryCaseCollectionFeature::groupSummaryCases( summaryCasesToUse, "Ensemble", true ); ensemble = RicCreateSummaryCaseCollectionFeature::groupSummaryCases( summaryCasesToUse, "Ensemble", true );
@ -482,6 +431,7 @@ void RicSummaryPlotFeatureImpl::createSummaryPlotsFromArgumentLine( const QStrin
{ {
std::set<RifEclipseSummaryAddress> filteredAdressesFromCases = std::set<RifEclipseSummaryAddress> filteredAdressesFromCases =
applySummaryAddressFiltersToCases( summaryCasesToUse, summaryAddressFilters ); applySummaryAddressFiltersToCases( summaryCasesToUse, summaryAddressFilters );
for ( const auto& addr : filteredAdressesFromCases ) for ( const auto& addr : filteredAdressesFromCases )
{ {
RimEnsembleCurveSet* curveSet = new RimEnsembleCurveSet(); RimEnsembleCurveSet* curveSet = new RimEnsembleCurveSet();
@ -490,16 +440,19 @@ void RicSummaryPlotFeatureImpl::createSummaryPlotsFromArgumentLine( const QStrin
{ {
curveSet->setColorMode( RimEnsembleCurveSet::BY_ENSEMBLE_PARAM ); curveSet->setColorMode( RimEnsembleCurveSet::BY_ENSEMBLE_PARAM );
curveSet->setEnsembleParameter( ensembleColoringParameter ); curveSet->setEnsembleParameter( ensembleColoringParameter );
if ( ensembleColoringStyle == LOG_PARAMETER ) if ( ensembleColoringStyle == LOG_PARAMETER )
{ {
curveSet->legendConfig()->setMappingMode( RimRegularLegendConfig::LOG10_CONTINUOUS ); curveSet->legendConfig()->setMappingMode( RimRegularLegendConfig::LOG10_CONTINUOUS );
} }
} }
newPlot->ensembleCurveSetCollection()->addCurveSet( curveSet ); newPlot->ensembleCurveSetCollection()->addCurveSet( curveSet );
if ( addHistoryCurves ) if ( addHistoryCurves )
{ {
RimSummaryCurve* historyCurve = createHistoryCurve( addr, summaryCasesToUse[0] ); RimSummaryCurve* historyCurve = createHistoryCurve( addr, summaryCasesToUse[0] );
if ( historyCurve ) newPlot->addCurveNoUpdate( historyCurve ); if ( historyCurve ) newPlot->addCurveNoUpdate( historyCurve );
} }
} }
@ -600,6 +553,7 @@ void RicSummaryPlotFeatureImpl::createSummaryPlotsFromArgumentLine( const QStrin
} }
} }
} }
sumPlotColl->updateConnectedEditors(); sumPlotColl->updateConnectedEditors();
if ( lastPlotCreated ) if ( lastPlotCreated )
@ -628,8 +582,9 @@ void RicSummaryPlotFeatureImpl::createSummaryPlotsFromArgumentLine( const QStrin
int curveColorIndex = 0; int curveColorIndex = 0;
for ( const QString& gridAddressFilter : gridResultAddressFilters ) for ( const QString& gridAddressFilter : gridResultAddressFilters )
{ {
std::vector<RigGridCellResultAddress> cellResAddrs = createGridCellAddressesFromFilter( std::vector<RigGridCellResultAddress> cellResAddrs =
gridAddressFilter ); RigGridCellResultAddress::createGridCellAddressesFromFilter( gridAddressFilter );
for ( RigGridCellResultAddress cellResAddr : cellResAddrs ) for ( RigGridCellResultAddress cellResAddr : cellResAddrs )
{ {
for ( RimEclipseCase* eclCase : gridCasesToPlotFrom ) for ( RimEclipseCase* eclCase : gridCasesToPlotFrom )
@ -682,8 +637,8 @@ void RicSummaryPlotFeatureImpl::createSummaryPlotsFromArgumentLine( const QStrin
for ( const QString& gridAddressFilter : gridResultAddressFilters ) for ( const QString& gridAddressFilter : gridResultAddressFilters )
{ {
std::vector<RigGridCellResultAddress> cellResAddrs = createGridCellAddressesFromFilter( std::vector<RigGridCellResultAddress> cellResAddrs =
gridAddressFilter ); RigGridCellResultAddress::createGridCellAddressesFromFilter( gridAddressFilter );
for ( RigGridCellResultAddress cellResAddr : cellResAddrs ) for ( RigGridCellResultAddress cellResAddr : cellResAddrs )
{ {
std::vector<RimGridTimeHistoryCurve*> createdCurves; std::vector<RimGridTimeHistoryCurve*> createdCurves;
@ -742,6 +697,45 @@ void RicSummaryPlotFeatureImpl::createSummaryPlotsFromArgumentLine( const QStrin
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicSummaryPlotFeatureImpl::splitAddressFiltersInGridAndSummary( RimSummaryCase* summaryBaseCases,
const QStringList& allCurveAddressFilters,
QStringList* summaryAddressFilters,
QStringList* gridResultAddressFilters )
{
if ( summaryBaseCases )
{
const std::set<RifEclipseSummaryAddress>& addrs = summaryBaseCases->summaryReader()->allResultAddresses();
std::vector<bool> usedFilters;
std::set<RifEclipseSummaryAddress> setToInsertFilteredAddressesIn;
filteredSummaryAdressesFromCase( allCurveAddressFilters, addrs, &setToInsertFilteredAddressesIn, &usedFilters );
QRegularExpression gridAddressPattern( "^[A-Z]+:[0-9]+,[0-9]+,[0-9]+$" );
for ( int filterIdx = 0; filterIdx < allCurveAddressFilters.size(); ++filterIdx )
{
const QString& address = allCurveAddressFilters[filterIdx];
if ( usedFilters[filterIdx] )
{
summaryAddressFilters->push_back( address );
}
else
{
if ( gridAddressPattern.match( address ).hasMatch() )
{
gridResultAddressFilters->push_back( address );
}
else
{
RiaLogging::warning( "No summary or restart vectors matched \"" + address + "\"" );
}
}
}
}
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -39,16 +39,59 @@ public:
static void createSummaryPlotsFromArgumentLine( const QStringList& arguments ); static void createSummaryPlotsFromArgumentLine( const QStringList& arguments );
static void filteredSummaryAdressesFromCase( const QStringList& curveFilters,
const std::set<RifEclipseSummaryAddress>& allAddressesInCase,
std::set<RifEclipseSummaryAddress>* setToInsertFilteredAddressesIn,
std::vector<bool>* usedFilters );
private: private:
static std::vector<RimSummaryCurve*> addCurvesFromAddressFiltersToPlot( const QStringList& curveFilters, static std::vector<RimSummaryCurve*> addCurvesFromAddressFiltersToPlot( const QStringList& curveFilters,
RimSummaryPlot* plot, RimSummaryPlot* plot,
RimSummaryCase* summaryCase, RimSummaryCase* summaryCase,
bool addHistoryCurves ); bool addHistoryCurves );
static std::set<RifEclipseSummaryAddress> static std::set<RifEclipseSummaryAddress>
applySummaryAddressFiltersToCases( const std::vector<RimSummaryCase*>& summaryCasesToUse, applySummaryAddressFiltersToCases( const std::vector<RimSummaryCase*>& summaryCasesToUse,
const QStringList& summaryAddressFilters ); const QStringList& summaryAddressFilters );
static void filteredSummaryAdressesFromCase( const QStringList& curveFilters,
const std::set<RifEclipseSummaryAddress>& allAddressesInCase, static void splitAddressFiltersInGridAndSummary( RimSummaryCase* summaryBaseCases,
std::set<RifEclipseSummaryAddress>* setToInsertFilteredAddressesIn, const QStringList& allCurveAddressFilters,
std::vector<bool>* usedFilters ); QStringList* summaryAddressFilters,
QStringList* gridResultAddressFilters );
};
#include "RigEclipseResultAddress.h"
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
class RigGridCellResultAddress
{
public:
RigGridCellResultAddress()
: gridIndex( -1 )
, i( -1 )
, j( -1 )
, k( -1 )
{
}
RigGridCellResultAddress(
size_t gridIndex, size_t i, size_t j, size_t k, const RigEclipseResultAddress& eclipseResultAddress )
: gridIndex( gridIndex )
, i( i )
, j( j )
, k( k )
, eclipseResultAddress( eclipseResultAddress )
{
}
static std::vector<RigGridCellResultAddress> createGridCellAddressesFromFilter( const QString& text );
// Using zero based ijk
size_t gridIndex;
size_t i;
size_t j;
size_t k;
RigEclipseResultAddress eclipseResultAddress;
}; };

View File

@ -127,3 +127,22 @@ size_t RimEclipseGeometrySelectionItem::cellIndex() const
{ {
return m_cellIndex; return m_cellIndex;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
cvf::Vec3st RimEclipseGeometrySelectionItem::cellIJK() const
{
cvf::Vec3st IJK( -1, -1, -1 );
if ( m_cellIndex != cvf::UNDEFINED_SIZE_T )
{
if ( m_eclipseCase && m_eclipseCase->eclipseCaseData() && m_eclipseCase->eclipseCaseData()->grid( m_gridIndex ) )
{
m_eclipseCase->eclipseCaseData()->grid( m_gridIndex )->ijkFromCellIndex( m_cellIndex, &IJK[0], &IJK[1], &IJK[2] );
}
}
return IJK;
}

View File

@ -46,6 +46,7 @@ public:
RimEclipseCase* eclipseCase() const; RimEclipseCase* eclipseCase() const;
size_t gridIndex() const; size_t gridIndex() const;
size_t cellIndex() const; size_t cellIndex() const;
cvf::Vec3st cellIJK() const;
private: private:
caf::PdmPtrField<RimEclipseCase*> m_eclipseCase; caf::PdmPtrField<RimEclipseCase*> m_eclipseCase;

View File

@ -45,6 +45,7 @@
#include "RiuQwtPlotCurve.h" #include "RiuQwtPlotCurve.h"
#include "qwt_plot.h" #include "qwt_plot.h"
#include "SummaryPlotCommands/RicSummaryPlotFeatureImpl.h"
CAF_PDM_SOURCE_INIT( RimGridTimeHistoryCurve, "GridTimeHistoryCurve" ); CAF_PDM_SOURCE_INIT( RimGridTimeHistoryCurve, "GridTimeHistoryCurve" );
@ -169,6 +170,30 @@ void RimGridTimeHistoryCurve::setFromEclipseCellAndResult(
geomSelectionItem->setFromCaseGridAndIJK( eclCase, gridIdx, i, j, k ); geomSelectionItem->setFromCaseGridAndIJK( eclCase, gridIdx, i, j, k );
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RigGridCellResultAddress RimGridTimeHistoryCurve::resultAddress()
{
RimEclipseGeometrySelectionItem* eclipseGeomSelectionItem = dynamic_cast<RimEclipseGeometrySelectionItem*>(
m_geometrySelectionItem.value() );
if ( m_eclipseResultDefinition && eclipseGeomSelectionItem )
{
cvf::Vec3st IJK = eclipseGeomSelectionItem->cellIJK();
return RigGridCellResultAddress( eclipseGeomSelectionItem->gridIndex(),
IJK[0],
IJK[1],
IJK[2],
m_eclipseResultDefinition->eclipseResultAddress() );
}
// Todo: support geomech stuff
return RigGridCellResultAddress();
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -310,6 +335,26 @@ QString RimGridTimeHistoryCurve::caseName() const
return ""; return "";
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimCase* RimGridTimeHistoryCurve::gridCase() const
{
RimEclipseGeometrySelectionItem* eclTopItem = eclipseGeomSelectionItem();
if ( eclTopItem && eclTopItem->eclipseCase() )
{
return eclTopItem->eclipseCase();
}
RimGeoMechGeometrySelectionItem* geoMechTopItem = geoMechGeomSelectionItem();
if ( geoMechTopItem && geoMechTopItem->geoMechCase() )
{
return geoMechTopItem->geoMechCase();
}
return nullptr;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -26,6 +26,7 @@
#include "cafPdmPtrField.h" #include "cafPdmPtrField.h"
#include <memory> #include <memory>
#include "SummaryPlotCommands/RicSummaryPlotFeatureImpl.h"
class RigMainGrid; class RigMainGrid;
class RimEclipseCase; class RimEclipseCase;
@ -37,6 +38,7 @@ class RimGeometrySelectionItem;
class RiuFemTimeHistoryResultAccessor; class RiuFemTimeHistoryResultAccessor;
class RiuSelectionItem; class RiuSelectionItem;
class RigEclipseResultAddress; class RigEclipseResultAddress;
class RimCase;
//================================================================================================== //==================================================================================================
/// ///
@ -61,8 +63,11 @@ public:
std::vector<time_t> timeStepValues() const; std::vector<time_t> timeStepValues() const;
std::vector<double> daysSinceSimulationStart() const; std::vector<double> daysSinceSimulationStart() const;
RigGridCellResultAddress resultAddress();
QString quantityName() const; QString quantityName() const;
QString caseName() const; QString caseName() const;
RimCase* gridCase() const;
protected: protected:
QString createCurveAutoName() override; QString createCurveAutoName() override;

View File

@ -36,6 +36,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatistics.h
${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatisticsCase.h ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatisticsCase.h
${CMAKE_CURRENT_LIST_DIR}/RimDerivedEnsembleCase.h ${CMAKE_CURRENT_LIST_DIR}/RimDerivedEnsembleCase.h
${CMAKE_CURRENT_LIST_DIR}/RimDerivedEnsembleCaseCollection.h ${CMAKE_CURRENT_LIST_DIR}/RimDerivedEnsembleCaseCollection.h
${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotFilterTextCurveSetEditor.h
) )
set (SOURCE_GROUP_SOURCE_FILES set (SOURCE_GROUP_SOURCE_FILES
@ -75,6 +76,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatistics.cpp
${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatisticsCase.cpp ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatisticsCase.cpp
${CMAKE_CURRENT_LIST_DIR}/RimDerivedEnsembleCase.cpp ${CMAKE_CURRENT_LIST_DIR}/RimDerivedEnsembleCase.cpp
${CMAKE_CURRENT_LIST_DIR}/RimDerivedEnsembleCaseCollection.cpp ${CMAKE_CURRENT_LIST_DIR}/RimDerivedEnsembleCaseCollection.cpp
${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotFilterTextCurveSetEditor.cpp
) )
list(APPEND CODE_HEADER_FILES list(APPEND CODE_HEADER_FILES

View File

@ -41,6 +41,7 @@
#include "RimSummaryPlotCollection.h" #include "RimSummaryPlotCollection.h"
#include "RimSummaryPlotNameHelper.h" #include "RimSummaryPlotNameHelper.h"
#include "RimSummaryTimeAxisProperties.h" #include "RimSummaryTimeAxisProperties.h"
#include "RimSummaryPlotFilterTextCurveSetEditor.h"
#include "RiuPlotMainWindowTools.h" #include "RiuPlotMainWindowTools.h"
#include "RiuSummaryQwtPlot.h" #include "RiuSummaryQwtPlot.h"
@ -138,7 +139,7 @@ RimSummaryPlot::RimSummaryPlot()
{ {
CAF_PDM_InitObject( "Summary Plot", ":/SummaryPlotLight16x16.png", "", "" ); CAF_PDM_InitObject( "Summary Plot", ":/SummaryPlotLight16x16.png", "", "" );
CAF_PDM_InitField( &m_userDefinedPlotTitle, "PlotDescription", QString( "Summary Plot" ), "Name", "", "", "" ); CAF_PDM_InitField( &m_userDefinedPlotTitle, "PlotDescription", QString( "Summary Plot" ), "Title", "", "", "" );
CAF_PDM_InitField( &m_showPlotTitle, "ShowPlotTitle", true, "Plot Title", "", "", "" ); CAF_PDM_InitField( &m_showPlotTitle, "ShowPlotTitle", true, "Plot Title", "", "", "" );
m_showPlotTitle.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); m_showPlotTitle.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN );
CAF_PDM_InitField( &m_showLegend, "ShowLegend", true, "Legend", "", "", "" ); CAF_PDM_InitField( &m_showLegend, "ShowLegend", true, "Legend", "", "", "" );
@ -147,7 +148,7 @@ RimSummaryPlot::RimSummaryPlot()
CAF_PDM_InitField( &m_legendFontSize, "LegendFontSize", 11, "Legend Font Size", "", "", "" ); CAF_PDM_InitField( &m_legendFontSize, "LegendFontSize", 11, "Legend Font Size", "", "", "" );
m_showLegend.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); m_showLegend.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN );
CAF_PDM_InitField( &m_useAutoPlotTitle, "IsUsingAutoName", true, "Auto Name", "", "", "" ); CAF_PDM_InitField( &m_useAutoPlotTitle, "IsUsingAutoName", true, "Auto Title", "", "", "" );
m_useAutoPlotTitle.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); m_useAutoPlotTitle.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN );
CAF_PDM_InitField( &m_normalizeCurveYValues, "normalizeCurveYValues", false, "Normalize all curves", "", "", "" ); CAF_PDM_InitField( &m_normalizeCurveYValues, "normalizeCurveYValues", false, "Normalize all curves", "", "", "" );
@ -198,6 +199,10 @@ RimSummaryPlot::RimSummaryPlot()
CAF_PDM_InitFieldNoDefault( &m_plotTemplate, "PlotTemplate", "Template", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_plotTemplate, "PlotTemplate", "Template", "", "", "" );
CAF_PDM_InitFieldNoDefault( &m_textCurveSetEditor, "SummaryPlotFilterTextCurveSetEditor", "Text Filter Curve Creator", "", "", "" );
m_textCurveSetEditor.uiCapability()->setUiTreeHidden( true );
m_textCurveSetEditor = new RimSummaryPlotFilterTextCurveSetEditor;
m_isCrossPlot = false; m_isCrossPlot = false;
m_nameHelperAllCurves.reset( new RimSummaryPlotNameHelper ); m_nameHelperAllCurves.reset( new RimSummaryPlotNameHelper );
@ -1188,6 +1193,28 @@ void RimSummaryPlot::addGridTimeHistoryCurve( RimGridTimeHistoryCurve* curve )
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryPlot::addGridTimeHistoryCurveNoUpdate(RimGridTimeHistoryCurve* curve)
{
CVF_ASSERT( curve );
m_gridTimeHistoryCurves.push_back( curve );
if ( m_qwtPlot )
{
curve->setParentQwtPlotNoReplot( m_qwtPlot );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimGridTimeHistoryCurve*> RimSummaryPlot::gridTimeHistoryCurves() const
{
return m_gridTimeHistoryCurves.childObjects();
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -1510,6 +1537,14 @@ std::set<RimPlotAxisPropertiesInterface*> RimSummaryPlot::allPlotAxes() const
return {m_timeAxisProperties, m_bottomAxisProperties, m_leftYAxisProperties, m_rightYAxisProperties}; return {m_timeAxisProperties, m_bottomAxisProperties, m_leftYAxisProperties, m_rightYAxisProperties};
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryPlot::deleteAllGridTimeHistoryCurves()
{
m_gridTimeHistoryCurves.deleteAllChildObjects();
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -1563,21 +1598,28 @@ void RimSummaryPlot::setAsCrossPlot()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimSummaryPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) void RimSummaryPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{ {
uiOrdering.add( &m_showPlotTitle ); caf::PdmUiGroup* mainOptions = uiOrdering.addNewGroup("General Plot Options");
uiOrdering.add( &m_useAutoPlotTitle );
uiOrdering.add( &m_userDefinedPlotTitle );
uiOrdering.add( &m_showLegend );
if ( m_showLegend() ) mainOptions->add( &m_showPlotTitle );
if ( m_showPlotTitle )
{ {
uiOrdering.add( &m_legendFontSize ); mainOptions->add(&m_useAutoPlotTitle);
mainOptions->add(&m_userDefinedPlotTitle);
} }
uiOrdering.add( &m_normalizeCurveYValues );
m_userDefinedPlotTitle.uiCapability()->setUiReadOnly( m_useAutoPlotTitle ); m_userDefinedPlotTitle.uiCapability()->setUiReadOnly( m_useAutoPlotTitle );
uiOrdering.add( &m_plotTemplate ); mainOptions->add( &m_showLegend );
if ( m_showLegend() )
{
mainOptions->add( &m_legendFontSize );
}
mainOptions->add( &m_normalizeCurveYValues );
mainOptions->add( &m_plotTemplate );
caf::PdmUiGroup* textCurveFilterGroup = uiOrdering.addNewGroup("Text-Based Curve Creation");
m_textCurveSetEditor->uiOrdering(uiConfigName, *textCurveFilterGroup);
uiOrdering.skipRemainingFields( true ); uiOrdering.skipRemainingFields( true );
} }

View File

@ -52,6 +52,7 @@ class RimPlotAxisProperties;
class RiuSummaryQwtPlot; class RiuSummaryQwtPlot;
class RimSummaryPlotNameHelper; class RimSummaryPlotNameHelper;
class RimPlotTemplateFileItem; class RimPlotTemplateFileItem;
class RimSummaryPlotFilterTextCurveSetEditor;
class QwtInterval; class QwtInterval;
class QwtPlotCurve; class QwtPlotCurve;
@ -82,10 +83,14 @@ public:
void deleteCurves( const std::vector<RimSummaryCurve*>& curves ); void deleteCurves( const std::vector<RimSummaryCurve*>& curves );
void deleteCurvesAssosiatedWithCase( RimSummaryCase* summaryCase ); void deleteCurvesAssosiatedWithCase( RimSummaryCase* summaryCase );
void deleteAllGridTimeHistoryCurves();
RimEnsembleCurveSetCollection* ensembleCurveSetCollection() const; RimEnsembleCurveSetCollection* ensembleCurveSetCollection() const;
void addGridTimeHistoryCurve( RimGridTimeHistoryCurve* curve ); void addGridTimeHistoryCurve( RimGridTimeHistoryCurve* curve );
void addGridTimeHistoryCurveNoUpdate( RimGridTimeHistoryCurve* curve );
std::vector<RimGridTimeHistoryCurve*> gridTimeHistoryCurves() const;
void addAsciiDataCruve( RimAsciiDataCurve* curve ); void addAsciiDataCruve( RimAsciiDataCurve* curve );
@ -231,6 +236,8 @@ private:
caf::PdmPtrField<RimPlotTemplateFileItem*> m_plotTemplate; caf::PdmPtrField<RimPlotTemplateFileItem*> m_plotTemplate;
caf::PdmChildField<RimSummaryPlotFilterTextCurveSetEditor*> m_textCurveSetEditor;
QPointer<RiuSummaryQwtPlot> m_qwtPlot; QPointer<RiuSummaryQwtPlot> m_qwtPlot;
std::unique_ptr<QwtPlotTextLabel> m_plotInfoLabel; std::unique_ptr<QwtPlotTextLabel> m_plotInfoLabel;

View File

@ -0,0 +1,486 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Statoil 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 "RimSummaryPlotFilterTextCurveSetEditor.h"
#include "RiaApplication.h"
#include "RiaLogging.h"
#include "RiaSummaryCurveDefinition.h"
#include "RifSummaryReaderInterface.h"
#include "RigCaseCellResultsData.h"
#include "RigEclipseCaseData.h"
#include "RimEclipseCase.h"
#include "RimEnsembleCurveSet.h"
#include "RimEnsembleCurveSetCollection.h"
#include "RimGridSummaryCase.h"
#include "RimGridTimeHistoryCurve.h"
#include "RimObservedDataCollection.h"
#include "RimObservedSummaryData.h"
#include "RimOilField.h"
#include "RimProject.h"
#include "RimSummaryCalculationCollection.h"
#include "RimSummaryCase.h"
#include "RimSummaryCaseCollection.h"
#include "RimSummaryCaseMainCollection.h"
#include "RimSummaryCurve.h"
#include "RimSummaryCurveCollection.h"
#include "RimSummaryPlot.h"
#include "RiuSummaryCurveDefSelection.h"
#include "SummaryPlotCommands/RicSummaryPlotFeatureImpl.h"
#include "WellLogCommands/RicWellLogPlotCurveFeatureImpl.h"
#include "cafPdmUiTextEditor.h"
#include "cafPdmUiTreeSelectionEditor.h"
#include <QRegularExpression>
#define FILTER_TEXT_OUTDATED_TEXT "<Outdated>"
CAF_PDM_SOURCE_INIT( RimSummaryPlotFilterTextCurveSetEditor, "SummaryPlotFilterTextCurveSetEditor" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryPlotFilterTextCurveSetEditor::RimSummaryPlotFilterTextCurveSetEditor()
: m_isFieldRecentlyChangedFromGui( false )
{
CAF_PDM_InitObject( "Curve Set Filter Text", "", "", "" );
// clang-format off
QString filterTextToolTip =
"A space separated list of vector addresses in the syntax: <vectorshortname>[:<item>[:<subitem>[:i,j,k]]]\n"
"Wildcards can also be used. Examples:\n"
" \"WOPT:*\" One total oil production curve for each well.\n"
" \"FOPT FWPT\" Two curves with oil and water total production.\n"
" \"BPR:15,28,*\" (no space) Oil phase pressure for all blocks along k as separate curves.\n";
// clang-format on
CAF_PDM_InitFieldNoDefault( &m_curveFilterText, "CurveFilterText", "Curve Filter Text", "", filterTextToolTip, "" );
m_curveFilterText.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN );
// m_curveFilterText.uiCapability()->setUiEditorTypeName( caf::PdmUiTextEditor::uiEditorTypeName() );
CAF_PDM_InitFieldNoDefault( &m_selectedSources, "SummaryCases", "Sources", "", "", "" );
m_selectedSources.uiCapability()->setAutoAddingOptionFromValue( false );
m_selectedSources.uiCapability()->setUiEditorTypeName( caf::PdmUiTreeSelectionEditor::uiEditorTypeName() );
m_selectedSources.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryPlotFilterTextCurveSetEditor::~RimSummaryPlotFilterTextCurveSetEditor() {}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryPlotFilterTextCurveSetEditor::fieldChangedByUi( const caf::PdmFieldHandle* changedField,
const QVariant& oldValue,
const QVariant& newValue )
{
RimSummaryPlot* parentPlot;
this->firstAncestorOrThisOfType( parentPlot );
if ( parentPlot )
{
// Remove all curves, Create new ones
parentPlot->ensembleCurveSetCollection()->deleteAllCurveSets();
parentPlot->deleteAllSummaryCurves();
parentPlot->deleteAllGridTimeHistoryCurves();
std::set<RiaSummaryCurveDefinition> curveDefinitions;
QStringList allCurveAddressFilters = curveFilterTextWithoutOutdatedLabel().split( QRegExp( "\\s+" ),
QString::SkipEmptyParts );
std::vector<bool> accumulatedUsedFilters( allCurveAddressFilters.size(), false );
for ( SummarySource* currSource : selectedSummarySources() )
{
RimSummaryCaseCollection* ensemble = dynamic_cast<RimSummaryCaseCollection*>( currSource );
RimSummaryCase* sumCase = dynamic_cast<RimSummaryCase*>( currSource );
std::set<RifEclipseSummaryAddress> allAddressesFromSource;
if ( ensemble )
{
auto addresses = ensemble->ensembleSummaryAddresses();
allAddressesFromSource.insert( addresses.begin(), addresses.end() );
}
else if ( sumCase )
{
RifSummaryReaderInterface* reader = sumCase ? sumCase->summaryReader() : nullptr;
if ( reader )
{
allAddressesFromSource.insert( reader->allResultAddresses().begin(),
reader->allResultAddresses().end() );
}
}
std::vector<bool> usedFilters;
std::set<RifEclipseSummaryAddress> filteredAddressesFromSource;
RicSummaryPlotFeatureImpl::filteredSummaryAdressesFromCase( allCurveAddressFilters,
allAddressesFromSource,
&filteredAddressesFromSource,
&usedFilters );
for ( size_t fIdx = 0; fIdx < accumulatedUsedFilters.size(); ++fIdx )
{
accumulatedUsedFilters[fIdx] = accumulatedUsedFilters[fIdx] || usedFilters[fIdx];
}
for ( const auto& filteredAddress : filteredAddressesFromSource )
{
curveDefinitions.insert( RiaSummaryCurveDefinition( sumCase, filteredAddress, ensemble ) );
}
}
// Find potensial grid result addresses
QRegularExpression gridAddressPattern( "^[A-Z]+:[0-9]+,[0-9]+,[0-9]+$" );
QStringList gridResultAddressFilters;
for ( int filterIdx = 0; filterIdx < allCurveAddressFilters.size(); ++filterIdx )
{
if ( !accumulatedUsedFilters[filterIdx] )
{
const QString& unusedAddressFilter = allCurveAddressFilters[filterIdx];
if ( gridAddressPattern.match( unusedAddressFilter ).hasMatch() )
{
gridResultAddressFilters.push_back( unusedAddressFilter );
}
else
{
RiaLogging::warning( "No summary or restart vectors matched \"" + unusedAddressFilter + "\"" );
}
}
}
// Create Summary curves and Ensemble curvesets:
for ( const RiaSummaryCurveDefinition& curveDef : curveDefinitions )
{
if ( curveDef.isEnsembleCurve() )
{
RimEnsembleCurveSet* curveSet = new RimEnsembleCurveSet();
curveSet->setSummaryCaseCollection( curveDef.ensemble() );
curveSet->setSummaryAddress( curveDef.summaryAddress() );
parentPlot->ensembleCurveSetCollection()->addCurveSet( curveSet );
}
else
{
RimSummaryCurve* newCurve = new RimSummaryCurve();
parentPlot->addCurveNoUpdate( newCurve );
if ( curveDef.summaryCase() )
{
newCurve->setSummaryCaseY( curveDef.summaryCase() );
}
newCurve->setSummaryAddressYAndApplyInterpolation( curveDef.summaryAddress() );
}
}
// create Grid time history curves
{
std::vector<RimEclipseCase*> gridCasesToPlotFrom;
for ( SummarySource* currSource : selectedSummarySources() )
{
RimGridSummaryCase* gridSumCase = dynamic_cast<RimGridSummaryCase*>( currSource );
if ( gridSumCase )
{
RimEclipseCase* eclCase = gridSumCase->associatedEclipseCase();
if ( eclCase )
{
gridCasesToPlotFrom.push_back( eclCase );
}
}
}
bool isEnsembleMode = gridCasesToPlotFrom.size() > 1;
int curveColorIndex = 0;
for ( const QString& gridAddressFilter : gridResultAddressFilters )
{
std::vector<RigGridCellResultAddress> cellResAddrs =
RigGridCellResultAddress::createGridCellAddressesFromFilter( gridAddressFilter );
for ( RigGridCellResultAddress cellResAddr : cellResAddrs )
{
for ( RimEclipseCase* eclCase : gridCasesToPlotFrom )
{
RigCaseCellResultsData* gridCellResults = eclCase->eclipseCaseData()->results(
RiaDefines::MATRIX_MODEL );
if ( !( gridCellResults && gridCellResults->resultInfo( cellResAddr.eclipseResultAddress ) ) )
{
RiaLogging::warning( "Could not find a restart result property with name: \"" +
cellResAddr.eclipseResultAddress.m_resultName + "\"" );
continue;
}
RimGridTimeHistoryCurve* newCurve = new RimGridTimeHistoryCurve();
newCurve->setFromEclipseCellAndResult( eclCase,
cellResAddr.gridIndex,
cellResAddr.i,
cellResAddr.j,
cellResAddr.k,
cellResAddr.eclipseResultAddress );
newCurve->setLineThickness( 2 );
newCurve->setColor( RicWellLogPlotCurveFeatureImpl::curveColorFromTable( curveColorIndex ) );
if ( !isEnsembleMode ) ++curveColorIndex;
parentPlot->addGridTimeHistoryCurveNoUpdate( newCurve );
}
if ( isEnsembleMode ) ++curveColorIndex;
}
}
}
parentPlot->applyDefaultCurveAppearances();
parentPlot->loadDataAndUpdate();
m_isFieldRecentlyChangedFromGui = true;
parentPlot->updateConnectedEditors();
}
if ( changedField == &m_curveFilterText )
{
m_curveFilterText = curveFilterTextWithoutOutdatedLabel();
}
m_isFieldRecentlyChangedFromGui = true;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryPlotFilterTextCurveSetEditor::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{
if ( !m_isFieldRecentlyChangedFromGui )
{
// Sync gui from existing curves
RimSummaryPlot* parentPlot;
this->firstAncestorOrThisOfType( parentPlot );
std::set<SummarySource*> sourcesFromExistingCurves;
std::set<RifEclipseSummaryAddress> addressesInUse;
std::vector<RigGridCellResultAddress> gridaddressesInUse;
if ( parentPlot )
{
std::vector<RimEnsembleCurveSet*> ensembleCurveSets = parentPlot->ensembleCurveSetCollection()->curveSets();
for ( auto ensCurvSet : ensembleCurveSets )
{
sourcesFromExistingCurves.insert( ensCurvSet->summaryCaseCollection() );
addressesInUse.insert( ensCurvSet->summaryAddress() );
}
std::vector<RimSummaryCurve*> sumCurves = parentPlot->summaryCurveCollection()->curves();
for ( auto sumCurve : sumCurves )
{
sourcesFromExistingCurves.insert( sumCurve->summaryCaseY() );
addressesInUse.insert( sumCurve->summaryAddressY() );
}
std::vector<RimGridTimeHistoryCurve*> gridTimeHistoryCurves = parentPlot->gridTimeHistoryCurves();
for ( auto grCurve : gridTimeHistoryCurves )
{
RimEclipseCase* eclCase = dynamic_cast<RimEclipseCase*>( grCurve->gridCase() );
if ( eclCase )
{
sourcesFromExistingCurves.insert( eclCase );
gridaddressesInUse.push_back( grCurve->resultAddress() );
}
}
}
std::vector<caf::PdmPointer<SummarySource>> usedSources( sourcesFromExistingCurves.begin(),
sourcesFromExistingCurves.end() );
m_selectedSources.clear();
m_selectedSources.setValue( usedSources );
// Check if existing filtertext matches all the curves
// Todo: possibly check grid time history curves also
QStringList allCurveAddressFilters = curveFilterTextWithoutOutdatedLabel().split( QRegExp( "\\s+" ),
QString::SkipEmptyParts );
std::vector<bool> accumulatedUsedFilters( allCurveAddressFilters.size(), false );
std::vector<bool> usedFilters;
std::set<RifEclipseSummaryAddress> filteredAddressesFromSource;
RicSummaryPlotFeatureImpl::filteredSummaryAdressesFromCase( allCurveAddressFilters,
addressesInUse,
&filteredAddressesFromSource,
&usedFilters );
if ( filteredAddressesFromSource != addressesInUse )
{
m_curveFilterText = FILTER_TEXT_OUTDATED_TEXT + curveFilterTextWithoutOutdatedLabel();
}
else
{
m_curveFilterText = curveFilterTextWithoutOutdatedLabel();
}
}
m_isFieldRecentlyChangedFromGui = false;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryPlotFilterTextCurveSetEditor::setupBeforeSave()
{
m_curveFilterText = curveFilterTextWithoutOutdatedLabel();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QList<caf::PdmOptionItemInfo>
RimSummaryPlotFilterTextCurveSetEditor::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
bool* useOptionsOnly )
{
QList<caf::PdmOptionItemInfo> options;
if ( fieldNeedingOptions == &m_selectedSources )
{
appendOptionItemsForSources( options, false, false );
}
return options;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryPlotFilterTextCurveSetEditor::appendOptionItemsForSources( QList<caf::PdmOptionItemInfo>& options,
bool hideSummaryCases,
bool hideEnsembles )
{
RimProject* proj = RiaApplication::instance()->project();
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->caseName(), 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;
}
auto optionItem = caf::PdmOptionItemInfo( sumCaseColl->name(), sumCaseColl );
optionItem.setLevel( 1 );
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->caseName(), 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 );
}
}
}
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<SummarySource*> RimSummaryPlotFilterTextCurveSetEditor::selectedSummarySources() const
{
std::vector<SummarySource*> sources;
for ( const auto& source : m_selectedSources )
{
sources.push_back( source );
}
// Always add the summary case for calculated curves as this case is not displayed in UI
sources.push_back( RiaApplication::instance()->project()->calculationCollection()->calculationSummaryCase() );
return sources;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryPlotFilterTextCurveSetEditor::curveFilterTextWithoutOutdatedLabel() const
{
QString filterText = m_curveFilterText();
if ( filterText.startsWith( FILTER_TEXT_OUTDATED_TEXT ) )
{
return filterText.right( filterText.length() - QString( FILTER_TEXT_OUTDATED_TEXT ).length() );
}
return filterText;
}

View File

@ -0,0 +1,55 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Statoil 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 "cafPdmObject.h"
#include "RiaSummaryCurveDefinition.h"
#include "cafPdmField.h"
#include "cafPdmPtrArrayField.h"
using SummarySource = caf::PdmObject;
class RimSummaryPlotFilterTextCurveSetEditor : public caf::PdmObject
{
CAF_PDM_HEADER_INIT;
public:
RimSummaryPlotFilterTextCurveSetEditor();
~RimSummaryPlotFilterTextCurveSetEditor() override;
protected:
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
bool* useOptionsOnly ) override;
void fieldChangedByUi( const caf::PdmFieldHandle* changedField,
const QVariant& oldValue,
const QVariant& newValue ) override;
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
virtual void setupBeforeSave() override;
private:
static void appendOptionItemsForSources( QList<caf::PdmOptionItemInfo>& options,
bool hideSummaryCases,
bool hideEnsembles );
std::vector<SummarySource*> selectedSummarySources() const;
QString curveFilterTextWithoutOutdatedLabel() const;
caf::PdmPtrArrayField<SummarySource*> m_selectedSources;
caf::PdmField<QString> m_curveFilterText;
bool m_isFieldRecentlyChangedFromGui;
};