#4828 Summary Plot Templates : Robustification

This commit is contained in:
Magne Sjaastad 2019-10-08 07:27:45 +02:00
parent 5a410ca8be
commit cc746a20cb
3 changed files with 113 additions and 64 deletions

View File

@ -170,7 +170,7 @@ QString RicSavePlotTemplateFeature::createTextFromObject( RimSummaryPlot* summar
{ {
std::set<QString> ensembleReferenceStrings; std::set<QString> ensembleReferenceStrings;
const QString summaryGroupFieldKeyword = RicSummaryPlotTemplateTools::summaryGroupFieldName(); const QString summaryGroupFieldKeyword = RicSummaryPlotTemplateTools::summaryGroupFieldKeyword();
for ( const auto& curveSet : newSummaryPlot->ensembleCurveSetCollection()->curveSets() ) for ( const auto& curveSet : newSummaryPlot->ensembleCurveSetCollection()->curveSets() )
{ {

View File

@ -84,91 +84,140 @@ void RicSummaryPlotTemplateTools::appendSummaryPlotToPlotCollection(
const std::vector<RimSummaryCase*>& selectedSummaryCases, const std::vector<RimSummaryCase*>& selectedSummaryCases,
const std::vector<RimSummaryCaseCollection*>& selectedEnsembles ) const std::vector<RimSummaryCaseCollection*>& selectedEnsembles )
{ {
if ( summaryPlot ) if ( !summaryPlot ) return;
if ( selectedSummaryCases.empty() && selectedEnsembles.empty() ) return;
RimSummaryPlotCollection* plotColl = RiaApplication::instance()->project()->mainPlotCollection()->summaryPlotCollection();
plotColl->summaryPlots.push_back( summaryPlot );
summaryPlot->resolveReferencesRecursively();
summaryPlot->initAfterReadRecursively();
{ {
RimSummaryPlotCollection* plotColl = // Replace single summary curves data sources
RiaApplication::instance()->project()->mainPlotCollection()->summaryPlotCollection();
plotColl->summaryPlots.push_back( summaryPlot ); auto summaryCurves = summaryPlot->summaryCurves();
summaryPlot->resolveReferencesRecursively();
summaryPlot->initAfterReadRecursively();
const QString summaryFieldKeyword = RicSummaryPlotTemplateTools::summaryCaseFieldKeyword();
int maximumIndexValue = -1;
for ( const auto& curve : summaryCurves )
{ {
auto summaryCurves = summaryPlot->summaryCurves(); auto fieldHandle = curve->findField( summaryFieldKeyword );
if ( fieldHandle )
const QString summaryFieldKeyword = RicSummaryPlotTemplateTools::summaryCaseFieldKeyword();
for ( const auto& curve : summaryCurves )
{ {
auto fieldHandle = curve->findField( summaryFieldKeyword ); bool conversionOk = false;
if ( fieldHandle ) const QString placeholderString = RicSummaryPlotTemplateTools::placeholderTextForSummaryCase();
auto referenceString = fieldHandle->xmlCapability()->referenceString();
int indexValue = RicSummaryPlotTemplateTools::findValueForKeyword( placeholderString,
referenceString,
&conversionOk );
maximumIndexValue = std::max( maximumIndexValue, indexValue );
if ( conversionOk && indexValue >= 0 && indexValue < static_cast<int>( selectedSummaryCases.size() ) )
{ {
bool conversionOk = false; auto summaryCaseY = selectedSummaryCases[static_cast<int>( indexValue )];
const QString placeholderString = RicSummaryPlotTemplateTools::placeholderTextForSummaryCase(); curve->setSummaryCaseY( summaryCaseY );
auto referenceString = fieldHandle->xmlCapability()->referenceString(); auto currentAddressY = curve->summaryAddressY();
int indexValue = RicSummaryPlotTemplateTools::findValueForKeyword( placeholderString, if ( summaryCaseY->summaryReader() && !summaryCaseY->summaryReader()->hasAddress( currentAddressY ) )
referenceString,
&conversionOk );
if ( conversionOk && indexValue >= 0 && indexValue < static_cast<int>( selectedSummaryCases.size() ) )
{ {
auto summaryCaseY = selectedSummaryCases[static_cast<int>( indexValue )]; auto allAddresses = summaryCaseY->summaryReader()->allResultAddresses();
curve->setSummaryCaseY( summaryCaseY );
auto currentAddressY = curve->summaryAddressY(); auto candidate = RicSummaryPlotTemplateTools::firstAddressByQuantity( currentAddressY,
if ( summaryCaseY->summaryReader() && allAddresses );
!summaryCaseY->summaryReader()->hasAddress( currentAddressY ) ) if ( candidate.category() != RifEclipseSummaryAddress::SUMMARY_INVALID )
{ {
auto allAddresses = summaryCaseY->summaryReader()->allResultAddresses(); curve->setSummaryAddressY( candidate );
auto candidate = RicSummaryPlotTemplateTools::firstAddressByQuantity( currentAddressY,
allAddresses );
if ( candidate.category() != RifEclipseSummaryAddress::SUMMARY_INVALID )
{
curve->setSummaryAddressY( candidate );
}
} }
} }
} }
} }
} }
if ( selectedSummaryCases.size() > static_cast<size_t>( maximumIndexValue ) )
{ {
auto summaryCurves = summaryPlot->ensembleCurveSetCollection()->curveSets(); // Use the curve style of the last curve in template, and duplicate this for remaining data sources
const QString summaryGroupFieldKeyword = RicSummaryPlotTemplateTools::summaryGroupFieldName(); if ( !summaryCurves.empty() )
for ( const auto& curveSet : summaryCurves )
{ {
auto fieldHandle = curveSet->findField( summaryGroupFieldKeyword ); auto lastSummaryCurve = summaryCurves.back();
if ( fieldHandle )
for ( size_t i = maximumIndexValue; i < selectedSummaryCases.size(); i++ )
{ {
auto referenceString = fieldHandle->xmlCapability()->referenceString(); auto newCurve = dynamic_cast<RimSummaryCurve*>(
auto stringList = referenceString.split( " " ); lastSummaryCurve->xmlCapability()->copyByXmlSerialization(
if ( stringList.size() == 2 ) caf::PdmDefaultObjectFactory::instance() ) );
{
QString indexAsString = stringList[1];
bool conversionOk = false; auto summaryCaseY = selectedSummaryCases[i];
auto index = indexAsString.toUInt( &conversionOk ); newCurve->setSummaryCaseY( summaryCaseY );
summaryPlot->addCurveAndUpdate( newCurve );
if ( conversionOk && index < selectedEnsembles.size() )
{
auto summaryCaseY = selectedEnsembles[index];
curveSet->setSummaryCaseCollection( summaryCaseY );
}
}
} }
} }
} }
// TODO: Create additional curves in selected case count is larger than template count
plotColl->updateConnectedEditors();
summaryPlot->loadDataAndUpdate();
} }
{
// Replace ensemble data sources
auto summaryCurveSets = summaryPlot->ensembleCurveSetCollection()->curveSets();
const QString summaryGroupFieldKeyword = RicSummaryPlotTemplateTools::summaryGroupFieldKeyword();
int maximumIndexValue = -1;
for ( const auto& curveSet : summaryCurveSets )
{
auto fieldHandle = curveSet->findField( summaryGroupFieldKeyword );
if ( fieldHandle )
{
bool conversionOk = false;
const QString placeholderString = RicSummaryPlotTemplateTools::placeholderTextForSummaryGroup();
auto referenceString = fieldHandle->xmlCapability()->referenceString();
int indexValue = RicSummaryPlotTemplateTools::findValueForKeyword( placeholderString,
referenceString,
&conversionOk );
maximumIndexValue = std::max( maximumIndexValue, indexValue );
if ( conversionOk && indexValue < selectedEnsembles.size() )
{
auto summaryCaseY = selectedEnsembles[indexValue];
curveSet->setSummaryCaseCollection( summaryCaseY );
}
}
}
if ( selectedEnsembles.size() > static_cast<size_t>( maximumIndexValue ) )
{
// Use the curve style of the last curve in template, and duplicate this for remaining data sources
if ( !summaryCurveSets.empty() )
{
auto lastSummaryCurveSet = summaryCurveSets.back();
for ( size_t i = maximumIndexValue; i < selectedEnsembles.size(); i++ )
{
auto newCurveSet = dynamic_cast<RimEnsembleCurveSet*>(
lastSummaryCurveSet->xmlCapability()->copyByXmlSerialization(
caf::PdmDefaultObjectFactory::instance() ) );
auto ensembleDataSource = selectedEnsembles[i];
newCurveSet->setSummaryCaseCollection( ensembleDataSource );
summaryPlot->ensembleCurveSetCollection()->addCurveSet( newCurveSet );
}
}
}
}
plotColl->updateConnectedEditors();
summaryPlot->loadDataAndUpdate();
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -325,7 +374,7 @@ QString RicSummaryPlotTemplateTools::summaryCaseFieldKeyword()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
QString RicSummaryPlotTemplateTools::summaryGroupFieldName() QString RicSummaryPlotTemplateTools::summaryGroupFieldKeyword()
{ {
return "SummaryGroup"; return "SummaryGroup";
} }
@ -343,7 +392,7 @@ QString RicSummaryPlotTemplateTools::placeholderTextForSummaryCase()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
QString RicSummaryPlotTemplateTools::placeholderTextForSummaryGroup() QString RicSummaryPlotTemplateTools::placeholderTextForSummaryGroup()
{ {
return "ENSEMBLE"; return "ENSEMBLE_NAME";
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -56,7 +56,7 @@ public:
static std::vector<RimSummaryCaseCollection*> selectedSummaryCaseCollections(); static std::vector<RimSummaryCaseCollection*> selectedSummaryCaseCollections();
static QString summaryCaseFieldKeyword(); static QString summaryCaseFieldKeyword();
static QString summaryGroupFieldName(); static QString summaryGroupFieldKeyword();
static QString placeholderTextForSummaryCase(); static QString placeholderTextForSummaryCase();
static QString placeholderTextForSummaryGroup(); static QString placeholderTextForSummaryGroup();