Skip to content
Snippets Groups Projects
qwt_plot_curve.h 10.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • pixhawk's avatar
    pixhawk committed
    /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
     * Qwt Widget Library
     * Copyright (C) 1997   Josef Wilgen
     * Copyright (C) 2002   Uwe Rathmann
     *
     * This library is free software; you can redistribute it and/or
     * modify it under the terms of the Qwt License, Version 1.0
     *****************************************************************************/
    
    #ifndef QWT_PLOT_CURVE_H
    #define QWT_PLOT_CURVE_H
    
    #include "qwt_global.h"
    
    Bryant's avatar
    Bryant committed
    #include "qwt_plot_seriesitem.h"
    #include "qwt_series_data.h"
    
    pixhawk's avatar
    pixhawk committed
    #include "qwt_text.h"
    
    Bryant's avatar
    Bryant committed
    #include <qpen.h>
    #include <qstring.h>
    
    pixhawk's avatar
    pixhawk committed
    
    class QPainter;
    
    Bryant's avatar
    Bryant committed
    class QPolygonF;
    
    pixhawk's avatar
    pixhawk committed
    class QwtScaleMap;
    class QwtSymbol;
    class QwtCurveFitter;
    
    /*!
    
    Bryant's avatar
    Bryant committed
      \brief A plot item, that represents a series of points
    
    pixhawk's avatar
    pixhawk committed
    
    
    Bryant's avatar
    Bryant committed
      A curve is the representation of a series of points in the x-y plane.
      It supports different display styles, interpolation ( f.e. spline )
      and symbols.
    
    pixhawk's avatar
    pixhawk committed
    
      \par Usage
    
    Bryant's avatar
    Bryant committed
      <dl><dt>a) Assign curve properties</dt>
    
    pixhawk's avatar
    pixhawk committed
      <dd>When a curve is created, it is configured to draw black solid lines
    
    Bryant's avatar
    Bryant committed
      with in QwtPlotCurve::Lines style and no symbols. 
      You can change this by calling
    
    pixhawk's avatar
    pixhawk committed
      setPen(), setStyle() and setSymbol().</dd>
    
    Bryant's avatar
    Bryant committed
      <dt>b) Connect/Assign data.</dt>
      <dd>QwtPlotCurve gets its points using a QwtSeriesData object offering
      a bridge to the real storage of the points ( like QAbstractItemModel ).
      There are several convenience classes derived from QwtSeriesData, that also store
      the points inside ( like QStandardItemModel ). QwtPlotCurve also offers
      a couple of variations of setSamples(), that build QwtSeriesData objects from
      arrays internally.</dd>
      <dt>c) Attach the curve to a plot</dt>
      <dd>See QwtPlotItem::attach()
    
    pixhawk's avatar
    pixhawk committed
      </dd></dl>
    
      \par Example:
    
    Bryant's avatar
    Bryant committed
      see examples/bode
    
    pixhawk's avatar
    pixhawk committed
    
    
    Bryant's avatar
    Bryant committed
      \sa QwtPointSeriesData, QwtSymbol, QwtScaleMap
    
    pixhawk's avatar
    pixhawk committed
    */
    
    Bryant's avatar
    Bryant committed
    class QWT_EXPORT QwtPlotCurve: 
        public QwtPlotSeriesItem, public QwtSeriesStore<QPointF>
    
    pixhawk's avatar
    pixhawk committed
    {
    public:
    
        /*!
            Curve styles.
    
    Bryant's avatar
    Bryant committed
            \sa setStyle(), style()
    
    pixhawk's avatar
    pixhawk committed
        */
    
    Bryant's avatar
    Bryant committed
        enum CurveStyle
        {
            /*!
               Don't draw a curve. Note: This doesn't affect the symbols.
            */
            NoCurve = -1,
    
            /*!
               Connect the points with straight lines. The lines might
               be interpolated depending on the 'Fitted' attribute. Curve
               fitting can be configured using setCurveFitter().
            */
    
    pixhawk's avatar
    pixhawk committed
            Lines,
    
    Bryant's avatar
    Bryant committed
    
            /*!
               Draw vertical or horizontal sticks ( depending on the 
               orientation() ) from a baseline which is defined by setBaseline().
            */
    
    pixhawk's avatar
    pixhawk committed
            Sticks,
    
    Bryant's avatar
    Bryant committed
    
            /*!
               Connect the points with a step function. The step function
               is drawn from the left to the right or vice versa,
               depending on the QwtPlotCurve::Inverted attribute.
            */
    
    pixhawk's avatar
    pixhawk committed
            Steps,
    
    Bryant's avatar
    Bryant committed
    
            /*!
               Draw dots at the locations of the data points. Note:
               This is different from a dotted line (see setPen()), and faster
               as a curve in QwtPlotCurve::NoStyle style and a symbol 
               painting a point.
            */
    
    pixhawk's avatar
    pixhawk committed
            Dots,
    
    
    Bryant's avatar
    Bryant committed
            /*!
               Styles >= QwtPlotCurve::UserCurve are reserved for derived
               classes of QwtPlotCurve that overload drawCurve() with
               additional application specific curve types.
            */
    
    pixhawk's avatar
    pixhawk committed
            UserCurve = 100
        };
    
    
    Bryant's avatar
    Bryant committed
          Attribute for drawing the curve
          \sa setCurveAttribute(), testCurveAttribute(), curveFitter()
    
    pixhawk's avatar
    pixhawk committed
        */
    
    Bryant's avatar
    Bryant committed
        enum CurveAttribute
        {
            /*!
               For QwtPlotCurve::Steps only. 
               Draws a step function from the right to the left.
             */
            Inverted = 0x01,
    
            /*!
              Only in combination with QwtPlotCurve::Lines
              A QwtCurveFitter tries to
              interpolate/smooth the curve, before it is painted.
    
              \note Curve fitting requires temporary memory
              for calculating coefficients and additional points.
              If painting in QwtPlotCurve::Fitted mode is slow it might be better
              to fit the points, before they are passed to QwtPlotCurve.
             */
            Fitted = 0x02
    
    pixhawk's avatar
    pixhawk committed
        };
    
    
    Bryant's avatar
    Bryant committed
        //! Curve attributes
        typedef QFlags<CurveAttribute> CurveAttributes;
    
    
    Bryant's avatar
    Bryant committed
            Attributes how to represent the curve on the legend
    
            \sa setLegendAttribute(), testLegendAttribute(),
                QwtPlotItem::legendData(), legendIcon()
         */
    
        enum LegendAttribute
        {
            /*!
              QwtPlotCurve tries to find a color representing the curve 
              and paints a rectangle with it.
             */
            LegendNoAttribute = 0x00,
    
            /*!
              If the style() is not QwtPlotCurve::NoCurve a line 
              is painted with the curve pen().
             */
            LegendShowLine = 0x01,
    
            /*!
              If the curve has a valid symbol it is painted.
             */
            LegendShowSymbol = 0x02,
    
            /*!
              If the curve has a brush a rectangle filled with the
              curve brush() is painted.
             */
            LegendShowBrush = 0x04
        };
    
        //! Legend attributes
        typedef QFlags<LegendAttribute> LegendAttributes;
    
        /*!
            Attributes to modify the drawing algorithm.
            The default setting enables ClipPolygons | FilterPoints
    
            \sa setPaintAttribute(), testPaintAttribute()
    
    pixhawk's avatar
    pixhawk committed
        */
    
    Bryant's avatar
    Bryant committed
        enum PaintAttribute
        {
            /*!
              Clip polygons before painting them. In situations, where points
              are far outside the visible area (f.e when zooming deep) this
              might be a substantial improvement for the painting performance
             */
            ClipPolygons = 0x01,
    
            /*!
              Tries to reduce the data that has to be painted, by sorting out
              duplicates, or paintings outside the visible area. Might have a
              notable impact on curves with many close points.
              Only a couple of very basic filtering algorithms are implemented.
             */
            FilterPoints = 0x02,
    
            /*!
              Minimize memory usage that is temporarily needed for the 
              translated points, before they get painted.
              This might slow down the performance of painting 
             */
            MinimizeMemory = 0x04,
    
            /*!
              Render the points to a temporary image and paint the image.
              This is a very special optimization for Dots style, when
              having a huge amount of points. 
              With a reasonable number of points QPainter::drawPoints()
              will be faster.
             */
            ImageBuffer = 0x08
    
    pixhawk's avatar
    pixhawk committed
        };
    
    
    Bryant's avatar
    Bryant committed
        //! Paint attributes
        typedef QFlags<PaintAttribute> PaintAttributes;
    
        explicit QwtPlotCurve( const QString &title = QString::null );
        explicit QwtPlotCurve( const QwtText &title );
    
    pixhawk's avatar
    pixhawk committed
    
        virtual ~QwtPlotCurve();
    
        virtual int rtti() const;
    
    
    Bryant's avatar
    Bryant committed
        void setPaintAttribute( PaintAttribute, bool on = true );
        bool testPaintAttribute( PaintAttribute ) const;
    
    pixhawk's avatar
    pixhawk committed
    
    
    Bryant's avatar
    Bryant committed
        void setLegendAttribute( LegendAttribute, bool on = true );
        bool testLegendAttribute( LegendAttribute ) const;
    
    pixhawk's avatar
    pixhawk committed
    
    
    Bryant's avatar
    Bryant committed
    #ifndef QWT_NO_COMPAT
        void setRawSamples( const double *xData, const double *yData, int size );
        void setSamples( const double *xData, const double *yData, int size );
        void setSamples( const QVector<double> &xData, const QVector<double> &yData );
    
    pixhawk's avatar
    pixhawk committed
    #endif
    
    Bryant's avatar
    Bryant committed
        void setSamples( const QVector<QPointF> & );
        void setSamples( QwtSeriesData<QPointF> * );
    
        int closestPoint( const QPoint &pos, double *dist = NULL ) const;
    
        double minXValue() const;
        double maxXValue() const;
        double minYValue() const;
        double maxYValue() const;
    
        void setCurveAttribute( CurveAttribute, bool on = true );
        bool testCurveAttribute( CurveAttribute ) const;
    
        void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine );
        void setPen( const QPen & );
    
    pixhawk's avatar
    pixhawk committed
        const QPen &pen() const;
    
    
    Bryant's avatar
    Bryant committed
        void setBrush( const QBrush & );
    
    pixhawk's avatar
    pixhawk committed
        const QBrush &brush() const;
    
    
    Bryant's avatar
    Bryant committed
        void setBaseline( double );
    
    pixhawk's avatar
    pixhawk committed
        double baseline() const;
    
    
    Bryant's avatar
    Bryant committed
        void setStyle( CurveStyle style );
    
    pixhawk's avatar
    pixhawk committed
        CurveStyle style() const;
    
    
    Bryant's avatar
    Bryant committed
        void setSymbol( QwtSymbol * );
        const QwtSymbol *symbol() const;
    
    pixhawk's avatar
    pixhawk committed
    
    
    Bryant's avatar
    Bryant committed
        void setCurveFitter( QwtCurveFitter * );
    
    pixhawk's avatar
    pixhawk committed
        QwtCurveFitter *curveFitter() const;
    
    
    Bryant's avatar
    Bryant committed
        virtual void drawSeries( QPainter *,
            const QwtScaleMap &xMap, const QwtScaleMap &yMap,
            const QRectF &canvasRect, int from, int to ) const;
    
    pixhawk's avatar
    pixhawk committed
    
    
    Bryant's avatar
    Bryant committed
        virtual QwtGraphic legendIcon( int index, const QSizeF & ) const;
    
    pixhawk's avatar
    pixhawk committed
    
    protected:
    
        void init();
    
    
    Bryant's avatar
    Bryant committed
        virtual void drawCurve( QPainter *p, int style,
            const QwtScaleMap &xMap, const QwtScaleMap &yMap,
            const QRectF &canvasRect, int from, int to ) const;
    
    pixhawk's avatar
    pixhawk committed
    
    
    Bryant's avatar
    Bryant committed
        virtual void drawSymbols( QPainter *p, const QwtSymbol &,
            const QwtScaleMap &xMap, const QwtScaleMap &yMap,
            const QRectF &canvasRect, int from, int to ) const;
    
        virtual void drawLines( QPainter *p,
            const QwtScaleMap &xMap, const QwtScaleMap &yMap,
            const QRectF &canvasRect, int from, int to ) const;
    
        virtual void drawSticks( QPainter *p,
            const QwtScaleMap &xMap, const QwtScaleMap &yMap,
            const QRectF &canvasRect, int from, int to ) const;
    
        virtual void drawDots( QPainter *p,
            const QwtScaleMap &xMap, const QwtScaleMap &yMap,
            const QRectF &canvasRect, int from, int to ) const;
    
    pixhawk's avatar
    pixhawk committed
    
    
    Bryant's avatar
    Bryant committed
        virtual void drawSteps( QPainter *p,
            const QwtScaleMap &xMap, const QwtScaleMap &yMap,
            const QRectF &canvasRect, int from, int to ) const;
    
        virtual void fillCurve( QPainter *,
            const QwtScaleMap &, const QwtScaleMap &, 
            const QRectF &canvasRect, QPolygonF & ) const;
    
        void closePolyline( QPainter *,
            const QwtScaleMap &, const QwtScaleMap &, QPolygonF & ) const;
    
    private:
    
    pixhawk's avatar
    pixhawk committed
        class PrivateData;
        PrivateData *d_data;
    };
    
    
    Bryant's avatar
    Bryant committed
    //! boundingRect().left()
    inline double QwtPlotCurve::minXValue() const
    
    pixhawk's avatar
    pixhawk committed
    {
    
    Bryant's avatar
    Bryant committed
        return boundingRect().left();
    
    pixhawk's avatar
    pixhawk committed
    }
    
    
    Bryant's avatar
    Bryant committed
    //! boundingRect().right()
    inline double QwtPlotCurve::maxXValue() const
    
    pixhawk's avatar
    pixhawk committed
    {
    
    Bryant's avatar
    Bryant committed
        return boundingRect().right();
    
    pixhawk's avatar
    pixhawk committed
    }
    
    
    Bryant's avatar
    Bryant committed
    //! boundingRect().top()
    inline double QwtPlotCurve::minYValue() const
    
    Bryant's avatar
    Bryant committed
        return boundingRect().top();
    
    pixhawk's avatar
    pixhawk committed
    }
    
    
    Bryant's avatar
    Bryant committed
    //! boundingRect().bottom()
    inline double QwtPlotCurve::maxYValue() const
    
    Bryant's avatar
    Bryant committed
        return boundingRect().bottom();
    
    pixhawk's avatar
    pixhawk committed
    }
    
    
    Bryant's avatar
    Bryant committed
    Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCurve::PaintAttributes )
    Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCurve::LegendAttributes )
    Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCurve::CurveAttributes )
    
    
    pixhawk's avatar
    pixhawk committed
    #endif