Files
ResInsight/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h
T

336 lines
14 KiB
C++
Raw Normal View History

/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2017- 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.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RifEclipseSummaryAddress.h"
2022-03-14 09:18:48 +01:00
#include "RiaDateTimeDefines.h"
#include "RiaPlotDefines.h"
2024-10-21 14:40:25 +02:00
#include "Summary/RiaSummaryCurveAddress.h"
#include "Summary/RiaSummaryDefines.h"
#include "Appearance/RimCurveAppearanceDefines.h"
2023-09-25 12:45:47 +02:00
#include "RimEnsembleCrossPlotStatisticsCase.h"
#include "RimEnsembleCurveSetColorManager.h"
2021-06-02 13:11:47 +02:00
#include "RimEnsembleCurveSetInterface.h"
2020-12-07 16:49:58 +01:00
#include "RimTimeStepFilter.h"
#include "RigEnsembleParameter.h"
#include "RiuPlotAxis.h"
#include "RiuPlotCurveSymbol.h"
#include "RiuQwtPlotCurveDefines.h"
#include "cafAppEnum.h"
#include "cafPdmChildArrayField.h"
#include "cafPdmChildField.h"
#include "cafPdmObject.h"
2020-12-07 16:49:58 +01:00
#include "cafPdmProxyValueField.h"
#include "cafPdmPtrField.h"
#include <QDate>
2019-12-02 14:05:41 +01:00
#include <QPointer>
#include <string>
class RimSummaryCase;
class RimSummaryEnsemble;
class RimSummaryCurve;
class RimSummaryAddress;
class RimSummaryPlotSourceStepping;
class RimSummaryCurveAutoName;
2018-05-31 10:23:51 +02:00
class RimEnsembleCurveFilterCollection;
2018-06-07 10:02:54 +02:00
class RimEnsembleStatistics;
class RimEnsembleStatisticsCase;
2020-12-07 16:49:58 +01:00
class RimCustomObjectiveFunctionCollection;
class RimObjectiveFunction;
2019-12-18 12:25:19 +01:00
class RiuDraggableOverlayFrame;
2020-12-07 16:49:58 +01:00
class RiaSummaryCurveDefinitionAnalyser;
class RiaSummaryCurveDefinition;
class RiuSummaryVectorSelectionDialog;
class RiuPlotWidget;
class RiuPlotCurve;
class RimPlotAxisPropertiesInterface;
2023-09-25 12:45:47 +02:00
class RimSummaryAddressSelector;
class RimSummaryPlot;
class RimTimeAxisAnnotation;
2019-12-02 14:05:41 +01:00
class QwtPlot;
class QwtPlotCurve;
class QKeyEvent;
class QFrame;
2018-06-07 10:02:54 +02:00
//==================================================================================================
///
//==================================================================================================
2021-06-02 13:11:47 +02:00
class RimEnsembleCurveSet : public caf::PdmObject, public RimEnsembleCurveSetInterface
{
CAF_PDM_HEADER_INIT;
public:
2020-12-07 16:49:58 +01:00
using ColorMode = RimEnsembleCurveSetColorManager::ColorMode;
using ColorModeEnum = RimEnsembleCurveSetColorManager::ColorModeEnum;
using TimeStepFilterEnum = caf::AppEnum<RimTimeStepFilter::TimeStepFilterTypeEnum>;
using LineStyle = caf::AppEnum<RiuQwtPlotCurveDefines::LineStyleEnum>;
using PointSymbol = caf::AppEnum<RiuPlotCurveSymbol::PointSymbolEnum>;
public:
2018-04-19 14:00:00 +02:00
RimEnsembleCurveSet();
~RimEnsembleCurveSet() override;
2021-03-29 15:45:53 +02:00
caf::Signal<> filterChanged;
QString name() const;
2023-04-19 15:36:06 +02:00
bool isCurvesVisible() const;
void setColor( cvf::Color3f color );
void setStatisticsColor( const cvf::Color3f& color );
void enableStatisticsLables( bool enable );
QColor mainEnsembleColor() const;
void loadDataAndUpdate( bool updateParentPlot );
void setParentPlotNoReplot( RiuPlotWidget* plot );
2022-06-24 16:16:46 +02:00
void deletePlotCurves();
void reattachPlotCurves();
void addRealizationCurve( RimSummaryCurve* curve );
void deleteRealizationCurve( RimSummaryCurve* curve );
2023-09-28 14:32:32 +02:00
void setSummaryAddressY( RifEclipseSummaryAddress address );
2023-09-25 12:45:47 +02:00
void setCurveAddress( RiaSummaryCurveAddress address );
2023-09-28 14:32:32 +02:00
void setSummaryAddressYAndStatisticsFlag( RifEclipseSummaryAddress address );
RifEclipseSummaryAddress summaryAddressY() const;
std::string unitNameY() const;
RiaSummaryCurveAddress curveAddress() const;
std::vector<RimSummaryCurve*> curves() const;
int ensembleId() const;
2020-12-07 16:49:58 +01:00
RimCustomObjectiveFunctionCollection* customObjectiveFunctionCollection();
void deleteEnsembleCurves();
void deleteStatisticsCurves();
2019-12-02 14:05:41 +01:00
void onLegendDefinitionChanged();
void setSummaryEnsemble( RimSummaryEnsemble* sumEnsemble );
RimSummaryEnsemble* summaryEnsemble() const;
RimEnsembleCurveFilterCollection* filterCollection() const;
ColorMode colorMode() const;
void setColorMode( ColorMode mode );
void setEnsembleParameter( const QString& parameterName );
RigEnsembleParameter::Type currentEnsembleParameterType() const;
RimRegularLegendConfig* legendConfig();
2019-12-18 12:25:19 +01:00
void updateEnsembleLegendItem();
RiuDraggableOverlayFrame* legendFrame() const;
2023-04-19 15:36:06 +02:00
void setTimeSteps( const std::vector<size_t>& timeStepIndices );
std::vector<time_t> selectedTimeSteps() const;
void setDefaultTimeRange();
RimEnsembleCurveSet* clone() const;
void showCurves( bool show );
void updateAllTextInPlot();
std::vector<RigEnsembleParameter> variationSortedEnsembleParameters() const;
2018-05-31 10:23:51 +02:00
std::vector<std::pair<RigEnsembleParameter, double>> ensembleParameters( RimCurveAppearanceDefines::ParameterSorting sortingMode ) const;
std::vector<RimSummaryCase*> filterEnsembleCases( const std::vector<RimSummaryCase*>& sumCases );
void disableStatisticCurves();
bool isFiltered() const;
2021-06-02 13:11:47 +02:00
void updateEditors() override;
void updateAllCurves() override;
void updateStatisticsCurves() override;
bool hasP10Data() const override;
bool hasP50Data() const override;
bool hasP90Data() const override;
bool hasMeanData() const override;
bool hasPercentileData( int p ) const override;
2023-10-17 12:46:50 +02:00
const RimEnsembleStatistics* statisticsOptions() const;
RimEnsembleStatistics* statisticsOptions();
2023-10-17 12:46:50 +02:00
void appendColorGroup( caf::PdmUiOrdering& uiOrdering );
void appendOptionItemsForSummaryAddresses( QList<caf::PdmOptionItemInfo>* options, RimSummaryEnsemble* summaryCaseGroup );
2025-05-06 12:34:28 +02:00
void appendTimeGroup( caf::PdmUiOrdering& uiOrdering );
2020-04-17 09:31:42 +02:00
const RimEnsembleCurveFilterCollection* curveFilters() const;
2020-12-07 16:49:58 +01:00
void updateFilterLegend();
void updateObjectiveFunctionLegend();
void onFilterChanged();
2020-12-07 16:49:58 +01:00
ObjectiveFunctionTimeConfig objectiveFunctionTimeConfig() const;
std::vector<cvf::Color3f> generateColorsForCases( const std::vector<RimSummaryCase*>& summaryCases ) const;
RiuPlotAxis axisY() const;
RiuPlotAxis axisX() const;
void setLeftOrRightAxisY( RiuPlotAxis plotAxis );
void setBottomOrTopAxisX( RiuPlotAxis plotAxis );
bool isXAxisSummaryVector() const;
RiaDefines::HorizontalAxisType xAxisType() const;
void findOrAssignBottomAxisX( RiuPlotAxis plotAxis );
void findOrAssignLeftOrRightAxisY( RiuPlotAxis plotAxis );
std::vector<RimTimeAxisAnnotation*> createTimeAnnotations() const;
protected:
void initAfterRead() override;
private:
static constexpr auto defaultLineStyle = RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_SOLID;
static constexpr auto defaultSymbol = RiuPlotCurveSymbol::SYMBOL_NONE;
static constexpr int defaultSymbolSize = 6;
void updateEnsembleCurves( const std::vector<RimSummaryCase*>& sumCases );
void updateStatisticsCurves( const std::vector<RimSummaryCase*>& sumCases );
caf::PdmFieldHandle* userDescriptionField() override;
caf::PdmFieldHandle* objectToggleField() override;
2023-02-26 10:48:40 +01:00
void defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override;
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override;
std::set<time_t> allAvailableTimeSteps() const;
2023-02-26 10:48:40 +01:00
std::set<RimSummaryCase*> timestepDefiningSourceCases();
RiaSummaryCurveDefinitionAnalyser* getOrCreateSelectedCurveDefAnalyser();
2020-12-07 16:49:58 +01:00
std::vector<RiaSummaryCurveDefinition> curveDefinitions() const;
2023-02-26 10:48:40 +01:00
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
std::vector<RimSummaryCurve*> realizationCurves() const;
void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "" ) override;
2020-02-12 11:43:15 +01:00
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
2023-04-19 15:36:06 +02:00
void defineObjectEditorAttribute( QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override;
2023-09-27 10:18:52 +02:00
void childFieldChangedByUi( const caf::PdmFieldHandle* changedChildField ) override;
void updatePlotAxis();
QString createAutoName() const;
void updateLegendMappingMode();
void updateLegendTitle();
2020-12-07 16:49:58 +01:00
void updateMaxMinAndDefaultValues();
void updateCurveColors();
void updateTimeAnnotations();
void updateAddressesUiField();
void onObjectiveFunctionChanged( const caf::SignalEmitter* emitter );
void onCustomObjectiveFunctionChanged( const caf::SignalEmitter* emitter );
void onYValuesSummaryAddressButtonClicked();
void onObjectiveValuesSummaryAddressesButtonClicked();
void computeRealizationColor();
2023-04-19 15:36:06 +02:00
void onColorTagClicked( const SignalEmitter* emitter, size_t index );
2023-09-25 12:45:47 +02:00
void setSummaryAddressX( RifEclipseSummaryAddress address );
std::pair<time_t, time_t> fullTimeStepRange() const;
std::pair<time_t, time_t> selectedTimeStepRange() const;
void appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const override;
void createCurves( const std::vector<RimSummaryCase*>& sumCases, const RimSummaryAddress& addr );
void recreatePlotCurveForLegend( RimSummaryPlot* plot );
private:
caf::PdmField<bool> m_showCurves;
caf::PdmChildArrayField<RimSummaryCurve*> m_realizationCurves;
caf::PdmChildArrayField<RimSummaryCurve*> m_statisticsCurves;
caf::PdmPointer<RimSummaryCurve> m_currentSummaryCurve;
caf::PdmPtrField<RimSummaryEnsemble*> m_yValuesSummaryEnsemble;
2022-03-14 09:18:48 +01:00
caf::PdmChildField<RimSummaryAddress*> m_yValuesSummaryAddress;
caf::PdmField<RifEclipseSummaryAddress> m_yValuesSummaryAddressUiField;
caf::PdmField<RiaDefines::DateTimePeriodEnum> m_resampling;
2023-09-25 12:45:47 +02:00
caf::PdmField<caf::AppEnum<RiaDefines::HorizontalAxisType>> m_xAxisType;
caf::PdmChildField<RimSummaryAddressSelector*> m_xAddressSelector;
caf::PdmField<ColorModeEnum> m_colorMode;
caf::PdmField<cvf::Color3f> m_mainEnsembleColor;
cvf::Color3f m_colorForRealizations;
caf::PdmField<double> m_colorOpacity;
caf::PdmField<QString> m_ensembleParameter;
caf::PdmField<caf::AppEnum<RimCurveAppearanceDefines::ParameterSorting>> m_ensembleParameterSorting;
caf::PdmField<caf::AppEnum<RimCurveAppearanceDefines::AppearanceMode>> m_useCustomAppearance;
caf::PdmField<LineStyle> m_lineStyle;
caf::PdmField<PointSymbol> m_pointSymbol;
caf::PdmField<int> m_symbolSize;
caf::PdmField<caf::AppEnum<RimCurveAppearanceDefines::AppearanceMode>> m_statisticsUseCustomAppearance;
caf::PdmField<LineStyle> m_statisticsLineStyle;
caf::PdmField<PointSymbol> m_statisticsPointSymbol;
caf::PdmField<int> m_statisticsSymbolSize;
caf::PdmChildArrayField<RimSummaryAddress*> m_objectiveValuesSummaryAddresses;
caf::PdmField<QString> m_objectiveValuesSummaryAddressesUiField;
caf::PdmPtrField<RimCustomObjectiveFunction*> m_customObjectiveFunction;
caf::PdmField<int> m_minTimeSliderPosition;
caf::PdmField<int> m_maxTimeSliderPosition;
caf::PdmField<QDate> m_minDateRange;
caf::PdmField<QDate> m_maxDateRange;
caf::PdmField<TimeStepFilterEnum> m_timeStepFilter;
caf::PdmField<std::vector<QDateTime>> m_selectedTimeSteps;
2020-12-07 16:49:58 +01:00
caf::PdmField<caf::AppEnum<RiaDefines::PlotAxis>> m_plotAxis_OBSOLETE;
2023-09-27 10:18:52 +02:00
caf::PdmPtrField<RimPlotAxisPropertiesInterface*> m_yPlotAxisProperties;
caf::PdmChildField<RimRegularLegendConfig*> m_legendConfig;
caf::PdmChildField<RimEnsembleCurveFilterCollection*> m_curveFilters;
caf::PdmChildField<RimEnsembleStatistics*> m_statistics;
2020-12-07 16:49:58 +01:00
caf::PdmChildField<RimCustomObjectiveFunctionCollection*> m_customObjectiveFunctions;
caf::PdmField<bool> m_showObjectiveFunctionFormula;
caf::PdmChildField<RimObjectiveFunction*> m_objectiveFunction;
caf::PdmField<bool> m_isUsingAutoName;
caf::PdmField<QString> m_userDefinedName;
caf::PdmProxyValueField<QString> m_autoGeneratedName;
caf::PdmChildField<RimSummaryCurveAutoName*> m_summaryAddressNameTools;
2023-04-19 15:36:06 +02:00
std::unique_ptr<RiuPlotCurve> m_plotCurveForLegendText;
2019-12-18 12:25:19 +01:00
QPointer<RiuDraggableOverlayFrame> m_legendOverlayFrame;
2020-12-07 16:49:58 +01:00
QPointer<RiuDraggableOverlayFrame> m_filterOverlayFrame;
QPointer<RiuDraggableOverlayFrame> m_objectiveFunctionOverlayFrame;
2018-06-07 10:02:54 +02:00
2023-09-25 12:45:47 +02:00
std::unique_ptr<RimEnsembleStatisticsCase> m_ensembleStatCaseY;
std::unique_ptr<RimEnsembleCrossPlotStatisticsCase> m_ensembleStatCaseXY;
2020-12-07 16:49:58 +01:00
std::unique_ptr<RiaSummaryCurveDefinitionAnalyser> m_analyserOfSelectedCurveDefs;
bool m_disableStatisticCurves;
bool m_isCurveSetFiltered;
QList<caf::PdmOptionItemInfo> m_cachedAddressOptions;
size_t m_hash;
size_t m_realizationHash;
2025-08-28 20:14:53 +02:00
caf::PdmField<cvf::Color3f> m_colorForRealizations_OBSOLETE;
};