Files
ResInsight/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h
Magne Sjaastad 931c8d066c #14235 Correlation report: synchronise all sub-plots and control data source from the report
Selecting a summary vector in a correlation report now propagates to the contained tornado, cross and summary plots by selecting the first matrix cell, which sends the existing selection signal handled by the report. A virtual onDataSourceChanged() hook on the abstract correlation plot is called after the summary vector selection dialog, and the matrix and tornado plots override it to re-select their first item so dependent plots update.

When a plot is used as a sub-plot of a correlation report, the data source and correlation settings are controlled from the report, so its property editor exposes only the plot settings. Used individually the plots show the complete set of options. Whether a plot is a report sub-plot is tracked with a flag set by the owning report on construction and after read.

Use updateAllRequiredEditors() for sub-plot interactions and for time step changes driven from the summary plot, so the project tree text and property panel reflect the updated auto-generated titles. Re-apply the configured dock title bar visibility after toggling a sub-plot dock, so the title bar stays hidden when a hidden sub-plot is shown again.
2026-06-26 17:09:26 +02:00

177 lines
6.8 KiB
C++

/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2020 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 "RimPlot.h"
#include "RimTimeStepFilter.h"
#include "cafPdmPtrField.h"
#include <QDateTime>
#include <QString>
#include <ctime>
class RiaSummaryCurveDefinition;
class RiaSummaryCurveDefinitionAnalyser;
class RimAnalysisPlotDataEntry;
class RimSummaryAddress;
class RimEnsembleCurveSet;
class RimSummaryEnsemble;
class RimSummaryCase;
class RigEnsembleParameter;
class RifEclipseSummaryAddress;
class RimAbstractCorrelationPlot : public RimPlot
{
CAF_PDM_HEADER_INIT;
public:
using TimeStepFilterEnum = caf::AppEnum<RimTimeStepFilter::TimeStepFilterTypeEnum>;
public:
RimAbstractCorrelationPlot();
~RimAbstractCorrelationPlot() override;
public:
std::vector<RiaSummaryCurveDefinition> curveDefinitions() const;
void setCurveDefinitions( const std::vector<RiaSummaryCurveDefinition>& curveDefinitions );
void setTimeStep( std::time_t timeStep );
std::set<RimSummaryEnsemble*> ensembles() const;
// Get summary cases filtered by attached ensemble parameter filter
std::set<RimSummaryCase*> filterEnsembleCases( RimSummaryEnsemble* ensemble ) const;
bool isCaseFilterEnabled() const;
void enableCaseFilter( bool enable );
RimEnsembleCurveSet* caseFilterDataSource() const;
void setCaseFilterDataSource( RimEnsembleCurveSet* ensemble );
void setExcludedSummaryCases( const std::vector<RimSummaryCase*>& summaryCases );
std::vector<RimSummaryCase*> excludedSummaryCases() const;
void setReportSubPlot( bool enable );
RiuQwtPlotWidget* viewer();
RiuPlotWidget* plotWidget() override;
void detachAllCurves() override;
QDateTime timeStep() const;
QString timeStepString() const;
int labelFontSize() const;
int axisTitleFontSize() const;
int axisValueFontSize() const;
void setLabelFontSize( caf::FontTools::RelativeSize fontSize );
void setAxisTitleFontSize( caf::FontTools::RelativeSize fontSize );
void setAxisValueFontSize( caf::FontTools::RelativeSize fontSize );
std::set<time_t> allAvailableTimeSteps();
std::set<RifEclipseSummaryAddress> addresses() const;
protected:
// Overridden PDM methods
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;
caf::PdmFieldHandle* userDescriptionField() override;
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override;
std::set<RigEnsembleParameter> ensembleParameters() const;
std::set<RigEnsembleParameter> variationSortedEnsembleParameters();
RigEnsembleParameter ensembleParameterByName( const QString& ensembleParameterName ) const;
// RimViewWindow overrides
QWidget* viewWidget() override;
void deleteViewWidget() override;
void zoomAll() override {}
// RimPlotWindow overrides
QString description() const override;
void doUpdateLayout() override {}
// RimPlot Overrides
RiuPlotWidget* doCreatePlotViewWidget( QWidget* mainWindowParent = nullptr ) override;
void reattachAllCurves() override {}
void setAutoScaleXEnabled( bool enabled ) override {}
void setAutoScaleYEnabled( bool enabled ) override {}
void updateLegend() override;
QString asciiDataForPlotExport() const override { return ""; }
void cleanupBeforeClose();
virtual void updatePlotTitle() = 0;
static time_t timeDiff( time_t lhs, time_t rhs );
QString selectedVectorNamesText();
QString completeAddressText();
void initAfterRead() final;
void appendDataSourceFields( QString uiConfigName, caf::PdmUiOrdering& uiOrdering );
// True when this plot is a sub-plot of a correlation report. The report controls the data source and
// correlation settings, so individually only the plot settings are exposed in the property editor. The
// flag is set by the owning report (see setReportSubPlot) rather than derived by walking ancestors.
bool isContainedInReportPlot() const;
// Called after the selected summary vectors (data source) have been changed through the selection dialog.
// Subclasses may override to propagate the change to dependent plots. The matrix plot uses this to select its
// first cell, which in turn updates the sibling plots in a correlation report.
virtual void onDataSourceChanged();
private:
void onCaseRemoved( const SignalEmitter* emitter, RimSummaryCase* summaryCase );
void connectAllCaseSignals();
void connectCurveFilterSignals();
void onFilterSourceChanged( const caf::SignalEmitter* emitter );
void onSelectVariablesButtonClicked();
RiaSummaryCurveDefinitionAnalyser* getOrCreateSelectedCurveDefAnalyser() const;
protected:
std::unique_ptr<RiaSummaryCurveDefinitionAnalyser> m_analyserOfSelectedCurveDefs;
QPointer<RiuQwtPlotWidget> m_plotWidget;
bool m_selectMultipleVectors;
caf::PdmField<QString> m_selectedVarsUiField;
caf::PdmField<TimeStepFilterEnum> m_timeStepFilter;
caf::PdmField<QDateTime> m_timeStep;
caf::PdmField<bool> m_useAutoPlotTitle;
caf::PdmField<QString> m_description;
RimFontSizeField m_labelFontSize;
RimFontSizeField m_axisTitleFontSize;
RimFontSizeField m_axisValueFontSize;
private:
caf::PdmChildArrayField<RimAnalysisPlotDataEntry*> m_dataSources;
caf::PdmField<bool> m_useCaseFilter;
caf::PdmPtrField<RimEnsembleCurveSet*> m_curveSetForFiltering;
caf::PdmField<bool> m_editCaseFilter;
std::vector<RimSummaryCase*> m_excludedCases;
// Set by the owning correlation report; not serialized, re-established by the report on construction and read.
bool m_isReportSubPlot = false;
};