///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2024 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 "RimVfpDefines.h" #include "RiuPlotCurveSymbol.h" #include "cafPdmPtrArrayField.h" #include "cafPdmPtrField.h" #include class RiuPlotWidget; class VfpPlotData; class RimPlotAxisProperties; class RigVfpTables; class RimVfpTableData; class RimVfpTable; class RiuPlotCurveInfoTextProvider; class RimRegularLegendConfig; class RiuDraggableOverlayFrame; class RimColorLegend; struct VfpValueSelection; struct VfpTableInitialData; namespace Opm { class VFPInjTable; class VFPProdTable; } // namespace Opm namespace caf { class ColorTable; } //-------------------------------------------------------------------------------------------------- /// Vertical Flow Performance Plot //-------------------------------------------------------------------------------------------------- class RimCustomVfpPlot : public RimPlot { CAF_PDM_HEADER_INIT; public: RimCustomVfpPlot(); ~RimCustomVfpPlot() override; void selectDataSource( RimVfpTable* mainDataSource, const std::vector& vfpTableData ); void setTableNumber( int tableNumber ); void initializeObject(); void initializeSelection(); void createDefaultColors(); // RimPlot implementations RiuPlotWidget* plotWidget() override; bool isCurveHighlightSupported() const override; void setAutoScaleXEnabled( bool enabled ) override; void setAutoScaleYEnabled( bool enabled ) override; void updateAxes() override; void updateLegend() override; QString asciiDataForPlotExport() const override; void reattachAllCurves() override; void detachAllCurves() override; // RimPlotWindow implementations QString description() const override; QString infoForCurve( RimPlotCurve* plotCurve ) const; // RimViewWindow implementations QWidget* viewWidget() override; QImage snapshotWindowContent() override; void zoomAll() override; private: void onChildrenUpdated( caf::PdmChildArrayFieldHandle* childArray, std::vector& updatedObjects ) override; void deleteViewWidget() override; void onLoadDataAndUpdate() override; void initAfterRead() override; caf::PdmFieldHandle* userDescriptionField() override; void scheduleReplot(); void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; void defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override; std::vector valuesForProductionType( RimVfpDefines::ProductionVariableType variableType ) const; std::vector familyValuesForTable( RimVfpTable* table ) const; void initializeFromInitData( const VfpTableInitialData& table ); RiuPlotWidget* doCreatePlotViewWidget( QWidget* mainWindowParent ) override; void calculateTableValueOptions( RimVfpDefines::ProductionVariableType variableType, QList& options ); void updatePlotTitle( const QString& plotTitle ); static QString generatePlotTitle( const QString& wellName, int tableNumber, RimVfpDefines::TableType tableType, RimVfpDefines::InterpolatedVariableType interpolatedVariable, RimVfpDefines::ProductionVariableType primaryVariable, RimVfpDefines::ProductionVariableType familyVariable ); static double convertToDisplayUnit( double value, RimVfpDefines::ProductionVariableType variableType ); static void convertToDisplayUnit( std::vector& values, RimVfpDefines::ProductionVariableType variableType ); static QString getDisplayUnit( RimVfpDefines::ProductionVariableType variableType ); static QString getDisplayUnitWithBracket( RimVfpDefines::ProductionVariableType variableType ); struct CurveNameContent { bool defaultName = false; bool tableNumber = false; bool flowRate = false; bool thp = false; bool artificialLiftQuantity = false; bool waterCut = false; bool gasLiquidRatio = false; }; void populatePlotWidgetWithPlotData( RiuPlotWidget* plotWidget, const VfpPlotData& plotData, const VfpValueSelection& valueSelection, int tableNumber, const QColor& color, const CurveNameContent& curveNameContent ); void updateLegendWidget( size_t curveSetCount, CurveNameContent& curveNameContent ); static QString axisTitle( RimVfpDefines::ProductionVariableType variableType, RimVfpDefines::FlowingPhaseType flowingPhase ); void connectAxisSignals( RimPlotAxisProperties* axis ); void axisSettingsChanged( const caf::SignalEmitter* emitter ); void axisLogarithmicChanged( const caf::SignalEmitter* emitter, bool isLogarithmic ); void updatePlotWidgetFromAxisRanges() override; void updateAxisRangesFromPlotWidget() override; void onPlotZoomed(); void curveAppearanceChanged( const caf::SignalEmitter* emitter ); std::vector availableValues( RimVfpDefines::ProductionVariableType variableType ) const; static RiuPlotCurveInfoTextProvider* curveTextProvider(); std::vector nonFamilyProductionVariables() const; std::vector computeValueSelectionCombinations() const; struct PlotCurveData { QString curveName; int tableNumber; double flowRateValue; double thpValue; double artificialLiftQuantityValue; double waterCutValue; double gasLiquidRatioValue; }; static std::vector curveSymbols(); caf::ColorTable curveColors() const; void legendColorsChanged( const caf::SignalEmitter* emitter ); void setColorItemCategoryHidden(); private: caf::PdmField m_plotTitle; caf::PdmPtrField m_mainDataSource; caf::PdmPtrArrayField m_comparisonTables; caf::PdmField> m_curveMatchingType; caf::PdmField> m_curveValueOptions; caf::PdmField m_tableNumber; caf::PdmField m_referenceDepth; caf::PdmField> m_flowingPhase; caf::PdmField> m_flowingWaterFraction; caf::PdmField> m_flowingGasFraction; caf::PdmField> m_tableType; caf::PdmField> m_interpolatedVariable; caf::PdmField> m_primaryVariable; caf::PdmField> m_familyVariable; caf::PdmField> m_flowRate; caf::PdmField> m_thp; caf::PdmField> m_artificialLiftQuantity; caf::PdmField> m_waterCut; caf::PdmField> m_gasLiquidRatio; caf::PdmChildField m_yAxisProperties; caf::PdmChildField m_xAxisProperties; caf::PdmChildArrayField m_plotCurves; caf::PdmChildField m_legendConfig; QPointer m_legendOverlayFrame; caf::PdmChildField m_colorLegend; caf::PdmField m_curveSymbolSize; caf::PdmField m_curveThickness; std::vector m_plotData; std::vector m_plotCurveMetaData; QString m_xAxisTitle; QString m_yAxisTitle; QPointer m_plotWidget; };