Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsvectorfieldsymbollayer.h 3 : : ------------------------- 4 : : begin : Octorer 25, 2011 5 : : copyright : (C) 2011 by Marco Hugentobler 6 : : email : marco dot hugentobler at sourcepole dot ch 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #ifndef QGSVECTORFIELDSYMBOLLAYER_H 19 : : #define QGSVECTORFIELDSYMBOLLAYER_H 20 : : 21 : : #include "qgis_core.h" 22 : : #include "qgis.h" 23 : : #include "qgssymbollayer.h" 24 : : 25 : : /** 26 : : * \ingroup core 27 : : * \brief A symbol layer class for displaying displacement arrows based on point layer attributes. 28 : : */ 29 : 0 : class CORE_EXPORT QgsVectorFieldSymbolLayer: public QgsMarkerSymbolLayer 30 : : { 31 : : public: 32 : : enum VectorFieldType 33 : : { 34 : : Cartesian = 0, 35 : : Polar, 36 : : Height 37 : : }; 38 : : 39 : : enum AngleOrientation 40 : : { 41 : : ClockwiseFromNorth = 0, 42 : : CounterclockwiseFromEast 43 : : }; 44 : : 45 : : enum AngleUnits 46 : : { 47 : : Degrees = 0, 48 : : Radians 49 : : }; 50 : : 51 : : QgsVectorFieldSymbolLayer(); 52 : : 53 : : //! Creates the symbol layer 54 : : static QgsSymbolLayer *create( const QVariantMap &properties = QVariantMap() ); 55 : : static QgsSymbolLayer *createFromSld( QDomElement &element ); 56 : : 57 : 0 : QString layerType() const override { return QStringLiteral( "VectorField" ); } 58 : : 59 : : bool setSubSymbol( QgsSymbol *symbol SIP_TRANSFER ) override; 60 : 0 : QgsSymbol *subSymbol() override { return mLineSymbol.get(); } 61 : : 62 : : void setColor( const QColor &color ) override; 63 : : QColor color() const override; 64 : : 65 : : void renderPoint( QPointF point, QgsSymbolRenderContext &context ) override; 66 : : void startRender( QgsSymbolRenderContext &context ) override; 67 : : void stopRender( QgsSymbolRenderContext &context ) override; 68 : : 69 : : QgsVectorFieldSymbolLayer *clone() const override SIP_FACTORY; 70 : : QVariantMap properties() const override; 71 : : bool usesMapUnits() const override; 72 : : 73 : : void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const override; 74 : : 75 : : void drawPreviewIcon( QgsSymbolRenderContext &context, QSize size ) override; 76 : : 77 : : QSet<QString> usedAttributes( const QgsRenderContext &context ) const override; 78 : : bool hasDataDefinedProperties() const override; 79 : : 80 : : //setters and getters 81 : 0 : void setXAttribute( const QString &attribute ) { mXAttribute = attribute; } 82 : : QString xAttribute() const { return mXAttribute; } 83 : 0 : void setYAttribute( const QString &attribute ) { mYAttribute = attribute; } 84 : : QString yAttribute() const { return mYAttribute; } 85 : 0 : void setScale( double s ) { mScale = s; } 86 : : double scale() const { return mScale; } 87 : 0 : void setVectorFieldType( VectorFieldType type ) { mVectorFieldType = type; } 88 : : VectorFieldType vectorFieldType() const { return mVectorFieldType; } 89 : 0 : void setAngleOrientation( AngleOrientation orientation ) { mAngleOrientation = orientation; } 90 : : AngleOrientation angleOrientation() const { return mAngleOrientation; } 91 : 0 : void setAngleUnits( AngleUnits units ) { mAngleUnits = units; } 92 : : AngleUnits angleUnits() const { return mAngleUnits; } 93 : : 94 : : void setOutputUnit( QgsUnitTypes::RenderUnit unit ) override; 95 : : QgsUnitTypes::RenderUnit outputUnit() const override; 96 : : 97 : : void setMapUnitScale( const QgsMapUnitScale &scale ) override; 98 : : QgsMapUnitScale mapUnitScale() const override; 99 : : 100 : : /** 101 : : * Sets the units for the distance. 102 : : * \param unit distance units 103 : : * \see distanceUnit() 104 : : */ 105 : 0 : void setDistanceUnit( QgsUnitTypes::RenderUnit unit ) { mDistanceUnit = unit; } 106 : : 107 : : /** 108 : : * Returns the units for the distance. 109 : : * \see setDistanceUnit() 110 : : */ 111 : : QgsUnitTypes::RenderUnit distanceUnit() const { return mDistanceUnit; } 112 : : 113 : 0 : void setDistanceMapUnitScale( const QgsMapUnitScale &scale ) { mDistanceMapUnitScale = scale; } 114 : : const QgsMapUnitScale &distanceMapUnitScale() const { return mDistanceMapUnitScale; } 115 : : 116 : : // TODO - implement properly 117 : 0 : QRectF bounds( QPointF, QgsSymbolRenderContext & ) override { return QRectF(); } 118 : : 119 : : private: 120 : : #ifdef SIP_RUN 121 : : QgsVectorFieldSymbolLayer( const QgsVectorFieldSymbolLayer &other ); 122 : : #endif 123 : : 124 : : QString mXAttribute; 125 : : QString mYAttribute; 126 : : QgsUnitTypes::RenderUnit mDistanceUnit = QgsUnitTypes::RenderMillimeters; 127 : : QgsMapUnitScale mDistanceMapUnitScale; 128 : : double mScale = 1.0; 129 : : VectorFieldType mVectorFieldType = Cartesian; 130 : : AngleOrientation mAngleOrientation = ClockwiseFromNorth; 131 : : AngleUnits mAngleUnits = Degrees; 132 : : 133 : : std::unique_ptr< QgsLineSymbol > mLineSymbol; 134 : : 135 : : //Attribute indices are resolved in startRender method 136 : : int mXIndex = -1; 137 : : int mYIndex = -1; 138 : : 139 : : //Converts length/angle to Cartesian x/y 140 : : void convertPolarToCartesian( double length, double angle, double &x, double &y ) const; 141 : : }; 142 : : 143 : : #endif // QGSVECTORFIELDSYMBOLLAYER_H 144 : : 145 : :