///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2015- Statoil ASA // Copyright (C) 2015- Ceetron Solutions AS // // 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 "RiuQwtPlotCurveDefines.h" #include "qwt_plot_curve.h" #include "qwt_plot_intervalcurve.h" #include "qwt_symbol.h" //================================================================================================== // // If infinite data is present in the curve data, Qwt is not able to draw a nice curve. // This class assumes that inf data is removed, and segments to be draw are indicated by start/stop indices into curve // data. // // Single values in the curve are drawn using a CrossX symbol // // Here you can see the curve segments visualized. Curve segments are drawn between vector indices. // // 0 - 1 // 5 - 7 // 9 -10 // // * * // * * * // Curve * * * ----- X // // Values 1.0|2.0|inf|inf|inf|1.0|2.0|1.0|inf|1.0|1.0|inf|1.0|inf // Vec index 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10| 11| 12| 13 //================================================================================================== class RiuQwtPlotCurve : public QwtPlotCurve { public: explicit RiuQwtPlotCurve( const QString& title = QString() ); ~RiuQwtPlotCurve() override; void setSamplesFromXValuesAndYValues( 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 ); void setLineSegmentStartStopIndices( const std::vector>& lineSegmentStartStopIndices ); void setSymbolSkipPixelDistance( float distance ); void setPerPointLabels( const std::vector& labels ); void setAppearance( RiuQwtPlotCurveDefines::LineStyleEnum lineStyle, RiuQwtPlotCurveDefines::CurveInterpolationEnum interpolationType, int curveThickness, const QColor& curveColor, const QBrush& fillBrush = QBrush( Qt::NoBrush ) ); void setBlackAndWhiteLegendIcon( bool blackAndWhite ); QwtGraphic legendIcon( int index, const QSizeF& size ) const override; static std::vector fromQDateTime( const std::vector& dateTimes ); static std::vector fromTime_t( const std::vector& timeSteps ); protected: void drawCurve( QPainter* p, int style, const QwtScaleMap& xMap, const QwtScaleMap& yMap, const QRectF& canvasRect, int from, int to ) const override; void drawSymbols( QPainter* p, const QwtSymbol& symbol, const QwtScaleMap& xMap, const QwtScaleMap& yMap, const QRectF& canvasRect, int from, int to ) const override; private: void computeValidIntervalsAndSetCurveData( const std::vector& xValues, const std::vector& yValues, bool keepOnlyPositiveValues ); private: float m_symbolSkipPixelDistance; bool m_blackAndWhiteLegendIcon; std::vector m_perPointLabels; std::vector> m_polyLineStartStopIndices; };