///////////////////////////////////////////////////////////////////////////////// // // 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 // for more details. // ///////////////////////////////////////////////////////////////////////////////// #pragma once #include "RimPlot.h" #include "RimPlotDataFilterItem.h" #include "RimTimeStepFilter.h" #include "RigEnsembleParameter.h" #include "cafPdmPtrField.h" #include class RiuSummaryQwtPlot; class RiuGroupedBarChartBuilder; class RimAnalysisPlotDataEntry; class RiaSummaryCurveDefinitionAnalyser; class RimPlotAxisPropertiesInterface; class RimPlotAxisProperties; class RimPlotDataFilterCollection; class RiaSummaryCurveDefinition; class RimSummaryCase; //================================================================================================== /// /// //================================================================================================== class RimAnalysisPlot : public RimPlot { CAF_PDM_HEADER_INIT; public: enum BarOrientation { BARS_HORIZONTAL, BARS_VERTICAL }; enum SortGroupType { NONE, SUMMARY_ITEM, VECTOR, CASE, ENSEMBLE, VALUE, ABS_VALUE, OTHER_VALUE, ABS_OTHER_VALUE, TIME_STEP, }; typedef caf::AppEnum SortGroupAppEnum; using TimeStepFilterEnum = caf::AppEnum; public: RimAnalysisPlot(); ~RimAnalysisPlot() override; void updateCaseNameHasChanged(); RimPlotDataFilterCollection* plotDataFilterCollection() const; void setCurveDefinitions( const std::vector& curveDefinitions ); void setTimeSteps( const std::vector& timeSteps ); std::set unfilteredAddresses(); std::set ensembleParameters(); RigEnsembleParameter ensembleParameter( const QString& ensembleParameterName ); void maxMinValueFromAddress( const RifEclipseSummaryAddress& address, RimPlotDataFilterItem::TimeStepSourceType timeStepSourceType, const std::vector& timeRangeOrSelection, bool useAbsValue, double* min, double* max ); std::vector selectedTimeSteps(); private: // Overridden PDM methods void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; caf::PdmFieldHandle* userDescriptionField() override; QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; std::set allAvailableTimeSteps(); std::set timestepDefiningSourceCases(); std::set allSourceCases(); void onFiltersChanged( const caf::SignalEmitter* emitter ); // RimViewWindow overrides QWidget* viewWidget() override; void deleteViewWidget() override; void onLoadDataAndUpdate() override; void zoomAll() override {} QImage snapshotWindowContent() override; // RimPlotWindow overrides QString description() const override; void doUpdateLayout() override {} // RimPlot Overrides RiuPlotWidget* doCreatePlotViewWidget( QWidget* mainWindowParent = nullptr ) override; RiuQwtPlotWidget* viewer(); RiuPlotWidget* plotWidget() override; void detachAllCurves() override; void reattachAllCurves() override {} void updateAxes() override; void onAxisSelected( RiuPlotAxis axis, bool toggle ) override; void setAutoScaleXEnabled( bool enabled ) override {} void setAutoScaleYEnabled( bool enabled ) override {} void updateLegend() override{}; QString asciiDataForPlotExport() const override { return ""; } // Private methods void cleanupBeforeClose(); void addDataToChartBuilder( RiuGroupedBarChartBuilder& chartBuilder ); void updatePlotTitle(); QString assignGroupingText( RimAnalysisPlot::SortGroupType sortGroup, const RiaSummaryCurveDefinition dataEntry, const QString& timestepString ) const; RiaSummaryCurveDefinitionAnalyser* getOrCreateSelectedCurveDefAnalyser(); std::vector curveDefinitions() const; std::vector filteredCurveDefs(); void applyFilter( const RimPlotDataFilterItem* filter, std::set* filteredSumCases, std::set* filteredSummaryItems ); static std::vector findTimestepIndices( std::vector selectedTimesteps, const std::vector& timesteps ); std::set allPlotAxes() const; void connectAxisSignals( RimPlotAxisProperties* axis ); void axisSettingsChanged( const caf::SignalEmitter* emitter ); void axisLogarithmicChanged( const caf::SignalEmitter* emitter, bool isLogarithmic ); void buildTestPlot( RiuGroupedBarChartBuilder& chartBuilder ); int barTextFontSize() const; void initAfterRead() override; private: void onCaseRemoved( const SignalEmitter* emitter, RimSummaryCase* summaryCase ); void connectAllCaseSignals(); private: std::unique_ptr m_analyserOfSelectedCurveDefs; QPointer m_plotWidget; // Fields caf::PdmField m_selectedVarsUiField; caf::PdmField m_selectVariablesButtonField; caf::PdmChildArrayField m_analysisPlotDataSelection; caf::PdmField m_timeStepFilter; caf::PdmField> m_selectedTimeSteps; caf::PdmPtrField m_referenceCase; caf::PdmField m_useAutoPlotTitle; caf::PdmField m_description; caf::PdmField> m_barOrientation; caf::PdmField m_majorGroupType; caf::PdmField m_mediumGroupType; caf::PdmField m_minorGroupType; caf::PdmField m_valueSortOperation; caf::PdmField m_useTopBarsFilter; caf::PdmField m_maxBarCount; caf::PdmField m_sortGroupForColors; caf::PdmField m_useBarText; caf::PdmField m_useCaseInBarText; caf::PdmField m_useEnsembleInBarText; caf::PdmField m_useSummaryItemInBarText; caf::PdmField m_useTimeStepInBarText; caf::PdmField m_useVectorNameInBarText; caf::PdmField m_barTextFontSize; caf::PdmChildField m_valueAxisProperties; caf::PdmChildField m_plotDataFilterCollection; };