#6237 Implement creation of correlation plot from ensemble plots

This commit is contained in:
Gaute Lindkvist
2020-07-28 15:13:39 +02:00
parent 447d335fc8
commit aeecaa3ff1
12 changed files with 434 additions and 20 deletions

View File

@@ -63,7 +63,7 @@
#include <QWheelEvent>
#include <algorithm>
#include <cfloat>
#include <limits>
//--------------------------------------------------------------------------------------------------
///
@@ -968,7 +968,7 @@ void RiuQwtPlotWidget::findClosestPlotItem( const QPoint& pos,
// Force empty defaults
*closestItem = nullptr;
*closestCurvePoint = -1;
*distanceFromClick = DBL_MAX;
*distanceFromClick = std::numeric_limits<double>::infinity();
const QwtPlotItemList& itmList = itemList();
for ( QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); it++ )
@@ -976,7 +976,7 @@ void RiuQwtPlotWidget::findClosestPlotItem( const QPoint& pos,
if ( ( *it )->rtti() == QwtPlotItem::Rtti_PlotCurve )
{
QwtPlotCurve* candidateCurve = static_cast<QwtPlotCurve*>( *it );
double dist = DBL_MAX;
double dist = std::numeric_limits<double>::infinity();
int curvePoint = candidateCurve->closestPoint( pos, &dist );
if ( dist < *distanceFromClick )
{
@@ -1023,7 +1023,7 @@ void RiuQwtPlotWidget::findClosestPlotItem( const QPoint& pos,
void RiuQwtPlotWidget::selectClosestPlotItem( const QPoint& pos, bool toggleItemInSelection /*= false*/ )
{
QwtPlotItem* closestItem = nullptr;
double distanceFromClick = DBL_MAX;
double distanceFromClick = std::numeric_limits<double>::infinity();
int closestCurvePoint = -1;
findClosestPlotItem( pos, &closestItem, &closestCurvePoint, &distanceFromClick );

View File

@@ -161,12 +161,12 @@ protected:
virtual bool isZoomerActive() const;
virtual void endZoomOperations();
private:
void findClosestPlotItem( const QPoint& pos,
QwtPlotItem** closestItem,
int* closestCurvePoint,
double* distanceFromClick ) const;
private:
void selectClosestPlotItem( const QPoint& pos, bool toggleItemInSelection = false );
static int defaultMinimumWidth();
void replot() override;

View File

@@ -20,12 +20,16 @@
#include "RiaApplication.h"
#include "RiaPreferences.h"
#include "Commands/CorrelationPlotCommands/RicNewCorrelationPlotFeature.h"
#include "RimEnsembleCurveSet.h"
#include "RimEnsembleCurveSetCollection.h"
#include "RimEnsembleStatisticsCase.h"
#include "RimMainPlotCollection.h"
#include "RimPlot.h"
#include "RimRegularLegendConfig.h"
#include "RimSummaryCase.h"
#include "RimSummaryCaseCollection.h"
#include "RimSummaryCurve.h"
#include "RimSummaryCurveCollection.h"
#include "RimSummaryPlot.h"
@@ -46,6 +50,7 @@
#include "RimProject.h"
#include "cafCmdFeatureMenuBuilder.h"
#include "cafIconProvider.h"
#include "cafSelectionManager.h"
#include "cafTitledOverlayFrame.h"
@@ -66,6 +71,8 @@
#include <QMouseEvent>
#include <QWheelEvent>
#include <limits>
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -176,6 +183,73 @@ void RiuSummaryQwtPlot::contextMenuEvent( QContextMenuEvent* event )
menuBuilder << "RicShowPlotDataFeature";
menuBuilder << "RicSavePlotTemplateFeature";
QwtPlotItem* closestItem = nullptr;
double distanceFromClick = std::numeric_limits<double>::infinity();
int closestCurvePoint = -1;
QPoint globalPos = event->globalPos();
QPoint localPos = this->canvas()->mapFromGlobal( globalPos );
findClosestPlotItem( localPos, &closestItem, &closestCurvePoint, &distanceFromClick );
if ( closestItem && closestCurvePoint >= 0 )
{
RiuRimQwtPlotCurve* plotCurve = dynamic_cast<RiuRimQwtPlotCurve*>( closestItem );
if ( plotCurve )
{
RimSummaryCurve* summaryCurve = dynamic_cast<RimSummaryCurve*>( plotCurve->ownerRimCurve() );
if ( summaryCurve && closestCurvePoint < (int)summaryCurve->timeStepsY().size() )
{
std::time_t timeStep = summaryCurve->timeStepsY()[closestCurvePoint];
RimEnsembleCurveSet* ensembleCurveSet = nullptr;
summaryCurve->firstAncestorOrThisOfType( ensembleCurveSet );
if ( ensembleCurveSet )
{
RimSummaryCaseCollection* ensemble = ensembleCurveSet->summaryCaseCollection();
if ( ensemble && ensemble->isEnsemble() )
{
CorrelationPlotParams params( ensemble,
QString::fromStdString(
ensembleCurveSet->summaryAddress().quantityName() ),
timeStep );
QVariant variant = QVariant::fromValue( params );
menuBuilder.subMenuStart( "Create Correlation Plot From Curve Point",
*caf::IconProvider( ":/CorrelationPlots16x16.png" ).icon() );
{
menuBuilder.addCmdFeatureWithUserData( "RicNewCorrelationPlotFeature",
"New Tornado Plot",
variant );
menuBuilder.addCmdFeatureWithUserData( "RicNewCorrelationMatrixPlotFeature",
"New Matrix Plot",
variant );
menuBuilder.addCmdFeatureWithUserData( "RicNewCorrelationReportPlotFeature",
"New Report Plot",
variant );
menuBuilder.subMenuStart( "Cross Plots",
*caf::IconProvider( ":/CorrelationCrossPlot16x16.png" ).icon() );
std::vector<EnsembleParameter> ensembleParameters =
ensemble->variationSortedEnsembleParameters();
for ( const EnsembleParameter& param : ensembleParameters )
{
if ( param.variationBin >= (int)EnsembleParameter::LOW_VARIATION )
{
params.ensembleParameter = param.name;
variant = QVariant::fromValue( params );
menuBuilder.addCmdFeatureWithUserData( "RicNewParameterResultCrossPlotFeature",
QString( "New Cross Plot Against %1" )
.arg( param.uiName() ),
variant );
}
}
menuBuilder.subMenuEnd();
}
menuBuilder.subMenuEnd();
}
}
}
}
}
menuBuilder.appendToMenu( &menu );
if ( menu.actions().size() > 0 )