///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2016- 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 // for more details. // ///////////////////////////////////////////////////////////////////////////////// #pragma once #include "RifEclipseSummaryAddress.h" #include "RiaCurveDataTools.h" #include "RiaDefines.h" #include "RiuQwtPlotCurveDefines.h" #include "RiuQwtSymbol.h" #include "cafPdmField.h" #include "cafPdmFieldCvfColor.h" #include "cafPdmObject.h" #include #include class QwtPlot; class QwtPlotCurve; class QwtPlotIntervalCurve; class RiuQwtPlotCurve; //================================================================================================== /// /// //================================================================================================== class RimPlotCurve : public caf::PdmObject { CAF_PDM_HEADER_INIT; public: caf::Signal<> appearanceChanged; caf::Signal visibilityChanged; caf::Signal<> dataChanged; caf::Signal nameChanged; public: typedef caf::AppEnum CurveInterpolation; typedef caf::AppEnum LineStyle; typedef caf::AppEnum PointSymbol; typedef caf::AppEnum LabelPosition; typedef caf::AppEnum FillStyle; public: RimPlotCurve(); ~RimPlotCurve() override; void loadDataAndUpdate( bool updateParentPlot ); virtual bool xValueRangeInQwt( double* minimumValue, double* maximumValue ) const; virtual bool yValueRangeInQwt( double* minimumValue, double* maximumValue ) const; void setParentQwtPlotAndReplot( QwtPlot* plot ); void setParentQwtPlotNoReplot( QwtPlot* plot ); void detachQwtCurve(); void reattachQwtCurve(); QwtPlotCurve* qwtPlotCurve() const; void setColor( const cvf::Color3f& color ); cvf::Color3f color() const { return m_curveColor; } void setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum lineStyle ); void setSymbol( RiuQwtSymbol::PointSymbolEnum symbolStyle ); void setInterpolation( RiuQwtPlotCurveDefines::CurveInterpolationEnum ); RiuQwtSymbol::PointSymbolEnum symbol(); int symbolSize() const; cvf::Color3f symbolEdgeColor() const; void setSymbolEdgeColor( const cvf::Color3f& edgeColor ); void setSymbolSkipDistance( float distance ); void setSymbolLabel( const QString& label ); void setSymbolLabelPosition( RiuQwtSymbol::LabelPosition labelPosition ); void setSymbolSize( int sizeInPixels ); void setLineThickness( int thickness ); void resetAppearance(); Qt::BrushStyle fillStyle() const; void setFillStyle( Qt::BrushStyle brushStyle ); void setFillColor( const cvf::Color3f& fillColor ); bool isCurveVisible() const; void setCurveVisibility( bool visible ); void updateCurveName(); void updateCurveNameAndUpdatePlotLegendAndTitle(); void updateCurveNameNoLegendUpdate(); QString curveName() const { return m_curveName; } virtual QString curveExportDescription( const RifEclipseSummaryAddress& address = RifEclipseSummaryAddress() ) const { return m_curveName; } void setCustomName( const QString& customName ); QString legendEntryText() const; void setLegendEntryText( const QString& legendEntryText ); void updateCurveVisibility(); void updateLegendEntryVisibilityAndPlotLegend(); void updateLegendEntryVisibilityNoPlotUpdate(); bool showInLegend() const; bool errorBarsVisible() const; void setShowInLegend( bool show ); void setZOrder( double z ); void setErrorBarsVisible( bool isVisible ); virtual void updateCurveAppearance(); bool isCrossPlotCurve() const; void updateUiIconFromPlotSymbol(); protected: virtual QString createCurveAutoName() = 0; virtual void updateZoomInParentPlot() = 0; virtual void onLoadDataAndUpdate( bool updateParentPlot ) = 0; void initAfterRead() override; void updateCurvePresentation( bool updatePlotLegendAndTitle ); void updateOptionSensitivity(); void updatePlotTitle(); virtual void updateLegendsInPlot(); void setSamplesFromXYErrorValues( const std::vector& xValues, const std::vector& yValues, const std::vector& errorValues, bool keepOnlyPositiveValues, RiaCurveDataTools::ErrorAxis errorAxis = RiaCurveDataTools::ErrorAxis::ERROR_ALONG_Y_AXIS ); void setSamplesFromXYValues( const std::vector& xValues, const std::vector& yValues, bool keepOnlyPositiveValues ); void setSamplesFromDatesAndYValues( const std::vector& dateTimes, const std::vector& yValues, bool keepOnlyPositiveValues ); void setSamplesFromTimeTAndYValues( const std::vector& dateTimes, const std::vector& yValues, bool keepOnlyPositiveValues ); protected: // Overridden PDM methods void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; caf::PdmFieldHandle* objectToggleField() override; caf::PdmFieldHandle* userDescriptionField() override; QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) override; void appearanceUiOrdering( caf::PdmUiOrdering& uiOrdering ); void curveNameUiOrdering( caf::PdmUiOrdering& uiOrdering ); private: bool canCurveBeAttached() const; void attachCurveAndErrorBars(); void checkAndApplyDefaultFillColor(); protected: QPointer m_parentQwtPlot; RiuQwtPlotCurve* m_qwtPlotCurve; QwtPlotIntervalCurve* m_qwtCurveErrorBars; caf::PdmField m_showCurve; caf::PdmField m_curveName; caf::PdmField m_customCurveName; caf::PdmField m_showLegend; caf::PdmField m_symbolLabel; caf::PdmField m_symbolSize; caf::PdmField m_legendEntryText; caf::PdmField m_isUsingAutoName; caf::PdmField m_curveColor; caf::PdmField m_curveThickness; caf::PdmField m_symbolSkipPixelDistance; caf::PdmField m_showErrorBars; caf::PdmField m_pointSymbol; caf::PdmField m_lineStyle; caf::PdmField m_fillStyle; caf::PdmField m_fillColor; caf::PdmField m_curveInterpolation; caf::PdmField m_symbolLabelPosition; caf::PdmField m_symbolEdgeColor; };