Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsinterpolatedlinerenderer.h 3 : : -------------------------------------- 4 : : Date : April 2020 5 : : Copyright : (C) 2020 by Vincent Cloarec 6 : : Email : vcloarec at gmail dot com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : 16 : : #ifndef QGSINTERPOLATEDLINERENDERER_H 17 : : #define QGSINTERPOLATEDLINERENDERER_H 18 : : 19 : : #include <QDebug> 20 : : 21 : : #include "qgis.h" 22 : : #include "qgscolorrampshader.h" 23 : : #include "qgsreadwritecontext.h" 24 : : #include "qgsrendercontext.h" 25 : : #include "qgsunittypes.h" 26 : : 27 : : /** 28 : : * \ingroup core 29 : : * 30 : : * \brief Class defining color to render mesh datasets. The color can vary depending on the dataset value. 31 : : * 32 : : * \since QGIS 3.14 33 : : */ 34 : 0 : class CORE_EXPORT QgsInterpolatedLineColor 35 : : { 36 : : public: 37 : : 38 : : /** 39 : : * Defines how the color is defined 40 : : */ 41 : : enum ColoringMethod 42 : : { 43 : : //! Render with a single color 44 : : SingleColor = 0, 45 : : //! Render with a color ramp 46 : : ColorRamp 47 : : }; 48 : : 49 : : //! Default constructor 50 : 0 : QgsInterpolatedLineColor() = default; 51 : : //! Constructor with variable color depending on magnitude 52 : : QgsInterpolatedLineColor( const QgsColorRampShader &colorRampShader ); 53 : : //! Constructor with fixed color 54 : : QgsInterpolatedLineColor( const QColor &color ); 55 : : 56 : : //! Sets the color ramp to define the coloring 57 : : void setColor( const QgsColorRampShader &colorRampShader ); 58 : : 59 : : //! Sets the single color to define the coloring 60 : : void setColor( const QColor &color ); 61 : : 62 : : //! Returns the color corresponding to the magnitude 63 : : QColor color( double magnitude ) const; 64 : : 65 : : //! Returns the coloring method used 66 : : QgsInterpolatedLineColor::ColoringMethod coloringMethod() const; 67 : : 68 : : //! Returns the color ramp shader 69 : : QgsColorRampShader colorRampShader() const; 70 : : 71 : : //! Writes configuration to a new DOM element 72 : : QDomElement writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const; 73 : : //! Reads configuration from the given DOM element 74 : : void readXml( const QDomElement &elem, const QgsReadWriteContext &context ); 75 : : 76 : : /** 77 : : * Returns the break values, graduated colors and the associated gradients between two values 78 : : * 79 : : * - If the color is fixed or only one color for the interval (value1, value2), returns only one color in \a breakColors 80 : : * and void lists for \a breakValues, \a gradients 81 : : * - If the color ramp is classified with 'exact', returns void \a gradients 82 : : * - If the color ramp is classified with 'discrete', return \a gradients with uniform colors 83 : : * - if nothing to render (out of range), return all lists void 84 : : */ 85 : : void graduatedColors( double value1, double value2, QList<double> &breakValues, QList<QColor> &breakColors, QList<QLinearGradient> &gradients ) const; 86 : : 87 : : private: 88 : : QgsColorRampShader mColorRampShader; 89 : 0 : QColor mSingleColor = Qt::black; 90 : : 91 : 0 : QgsInterpolatedLineColor::ColoringMethod mColoringMethod = SingleColor; 92 : : 93 : : QLinearGradient makeSimpleLinearGradient( const QColor &color1, const QColor &color2 ) const; 94 : : 95 : : //! Returns the index of the color ramp shader with value inferior to value 96 : : int itemColorIndexInf( double value ) const; 97 : : 98 : : void graduatedColorsExact( double value1, double value2, QList<double> &breakValues, QList<QColor> &breakColors, QList<QLinearGradient> &gradients ) const; 99 : : void graduatedColorsInterpolated( double value1, double value2, QList<double> &breakValues, QList<QColor> &breakColors, QList<QLinearGradient> &gradients ) const; 100 : : void graduatedColorsDiscrete( double value1, double value2, QList<double> &breakValues, QList<QColor> &breakColors, QList<QLinearGradient> &gradients ) const; 101 : : }; 102 : : 103 : : /** 104 : : * \ingroup core 105 : : * 106 : : * \class QgsInterpolatedLineWidth 107 : : * \brief Represents a width than can vary depending on values 108 : : * \since QGIS 3.14 109 : : */ 110 : 0 : class CORE_EXPORT QgsInterpolatedLineWidth 111 : : { 112 : : public: 113 : : //! Returns the minimum value used to defined the variable width 114 : : double minimumValue() const; 115 : : //! Sets the minimum value used to defined the variable width 116 : : void setMinimumValue( double minimumValue ); 117 : : 118 : : //! Returns the maximum value used to defined the variable width 119 : : double maximumValue() const; 120 : : //! Sets the maximum value used to defined the variable width 121 : : void setMaximumValue( double maximumValue ); 122 : : 123 : : //! Returns the minimum width used to defined the variable width 124 : : double minimumWidth() const; 125 : : //! Sets the minimum width used to defined the variable width 126 : : void setMinimumWidth( double minimumWidth ); 127 : : 128 : : //! Returns the maximum width used to defined the variable width 129 : : double maximumWidth() const; 130 : : //! Sets the maximum width used to defined the variable width 131 : : void setMaximumWidth( double maximumWidth ); 132 : : 133 : : //! Returns whether the variable width ignores out of range value 134 : : bool ignoreOutOfRange() const; 135 : : //! Sets whether the variable width ignores out of range value 136 : : void setIgnoreOutOfRange( bool ignoreOutOfRange ); 137 : : 138 : : //! Returns whether absolute value are used as input 139 : : bool useAbsoluteValue() const; 140 : : //! Sets whether absolute value are used as input 141 : : void setUseAbsoluteValue( bool useAbsoluteValue ); 142 : : 143 : : //! Returns whether the width is variable 144 : : bool isVariableWidth() const; 145 : : //! Returns whether the width is variable 146 : : void setIsVariableWidth( bool isVariableWidth ); 147 : : 148 : : //! Returns the fixed width 149 : : double fixedStrokeWidth() const; 150 : : //! Sets the fixed width 151 : : void setFixedStrokeWidth( double fixedWidth ); 152 : : 153 : : //! Returns the variable width depending on value, if not varying returns the fixed width 154 : : double strokeWidth( double value ) const; 155 : : 156 : : //! Writes configuration to a new DOM element 157 : : QDomElement writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const; 158 : : //! Reads configuration from the given DOM element 159 : : void readXml( const QDomElement &elem, const QgsReadWriteContext &context ); 160 : : 161 : : private: 162 : 0 : bool mIsWidthVariable = false; 163 : : 164 : 0 : double mFixedWidth = DEFAULT_LINE_WIDTH; 165 : : 166 : 0 : double mMinimumValue = 0; 167 : 0 : double mMaximumValue = 10; 168 : 0 : double mMinimumWidth = DEFAULT_LINE_WIDTH; 169 : 0 : double mMaximumWidth = 3; 170 : 0 : bool mIgnoreOutOfRange = false; 171 : 0 : bool mUseAbsoluteValue = false; 172 : : 173 : 0 : mutable double mLinearCoef = 1; 174 : 0 : mutable bool mNeedUpdateFormula = true; 175 : : void updateLinearFormula() const; 176 : : }; 177 : : 178 : : /** 179 : : * \ingroup core 180 : : * \class QgsInterpolatedLineRenderer 181 : : * \brief Represents a line with width and color varying depending on values. 182 : : * \since QGIS 3.14 183 : : */ 184 : 0 : class CORE_EXPORT QgsInterpolatedLineRenderer 185 : : { 186 : : public: 187 : : //! Sets the stroke width used to plot 188 : : void setInterpolatedWidth( const QgsInterpolatedLineWidth &strokeWidth ); 189 : : 190 : : //! Sets the unit of the stroke width 191 : : void setWidthUnit( const QgsUnitTypes::RenderUnit &strokeWidthUnit ); 192 : : 193 : : //! Sets the stroke color used to plot 194 : : void setInterpolatedColor( const QgsInterpolatedLineColor &strokeColoring ); 195 : : 196 : : /** 197 : : * Render a line in the \a context between \a point1 and \a point2 198 : : * with color and width that vary depending on \a value1 and \a value2 199 : : */ 200 : : void render( double value1, double value2, QgsPointXY point1, QgsPointXY point2, QgsRenderContext &context ) const; 201 : : 202 : : private: 203 : : QgsInterpolatedLineWidth mStrokeWidth; 204 : : QgsInterpolatedLineColor mStrokeColoring; 205 : 0 : QgsUnitTypes::RenderUnit mStrokeWidthUnit = QgsUnitTypes::RenderMillimeters; 206 : : 207 : : QPolygonF varyingWidthLine( double value1, double value2, QPointF point1, QPointF point2, QgsRenderContext &context ) const; 208 : : void adjustLine( const double &value, const double &value1, const double &value2, double &width, double &adjusting ) const; 209 : : }; 210 : : 211 : : #endif // QGSINTERPOLATEDLINERENDERER_H