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