QGIS API Documentation  2.7.0-Master
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
qgslinesymbollayerv2.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgslinesymbollayerv2.h
3  ---------------------
4  begin : November 2009
5  copyright : (C) 2009 by Martin Dobias
6  email : wonder dot sk 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 QGSLINESYMBOLLAYERV2_H
17 #define QGSLINESYMBOLLAYERV2_H
18 
19 #include "qgssymbollayerv2.h"
20 
21 #include <QPen>
22 #include <QVector>
23 
24 class QgsExpression;
25 
26 #define DEFAULT_SIMPLELINE_COLOR QColor(0,0,0)
27 #define DEFAULT_SIMPLELINE_WIDTH DEFAULT_LINE_WIDTH
28 #define DEFAULT_SIMPLELINE_PENSTYLE Qt::SolidLine
29 #define DEFAULT_SIMPLELINE_JOINSTYLE Qt::BevelJoin
30 #define DEFAULT_SIMPLELINE_CAPSTYLE Qt::SquareCap
31 
32 
34 {
35  public:
37  double width = DEFAULT_SIMPLELINE_WIDTH,
38  Qt::PenStyle penStyle = DEFAULT_SIMPLELINE_PENSTYLE );
39 
40  // static stuff
41 
42  static QgsSymbolLayerV2* create( const QgsStringMap& properties = QgsStringMap() );
43  static QgsSymbolLayerV2* createFromSld( QDomElement &element );
44 
45  // implemented from base classes
46 
47  QString layerType() const override;
48 
49  void startRender( QgsSymbolV2RenderContext& context ) override;
50 
51  void stopRender( QgsSymbolV2RenderContext& context ) override;
52 
53  void renderPolyline( const QPolygonF& points, QgsSymbolV2RenderContext& context ) override;
54 
55  //overriden so that clip path can be set when using draw inside polygon option
56  void renderPolygonOutline( const QPolygonF& points, QList<QPolygonF>* rings, QgsSymbolV2RenderContext& context ) override;
57 
58  QgsStringMap properties() const override;
59 
60  QgsSymbolLayerV2* clone() const override;
61 
62  void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const override;
63 
64  QString ogrFeatureStyle( double mmScaleFactor, double mapUnitScaleFactor ) const override;
65 
66  void setOutputUnit( QgsSymbolV2::OutputUnit unit ) override;
67  QgsSymbolV2::OutputUnit outputUnit() const override;
68 
69  void setMapUnitScale( const QgsMapUnitScale &scale ) override;
70  QgsMapUnitScale mapUnitScale() const override;
71 
72  double estimateMaxBleed() const override;
73 
74  // new stuff
75 
76  Qt::PenStyle penStyle() const { return mPenStyle; }
77  void setPenStyle( Qt::PenStyle style ) { mPenStyle = style; }
78 
79  Qt::PenJoinStyle penJoinStyle() const { return mPenJoinStyle; }
80  void setPenJoinStyle( Qt::PenJoinStyle style ) { mPenJoinStyle = style; }
81 
82  Qt::PenCapStyle penCapStyle() const { return mPenCapStyle; }
83  void setPenCapStyle( Qt::PenCapStyle style ) { mPenCapStyle = style; }
84 
85  double offset() const { return mOffset; }
86  void setOffset( double offset ) { mOffset = offset; }
87 
88  void setOffsetUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetUnit = unit; }
89  QgsSymbolV2::OutputUnit offsetUnit() const { return mOffsetUnit; }
90 
91  void setOffsetMapUnitScale( const QgsMapUnitScale& scale ) { mOffsetMapUnitScale = scale; }
92  const QgsMapUnitScale& offsetMapUnitScale() const { return mOffsetMapUnitScale; }
93 
94  bool useCustomDashPattern() const { return mUseCustomDashPattern; }
95  void setUseCustomDashPattern( bool b ) { mUseCustomDashPattern = b; }
96 
97  void setCustomDashPatternUnit( QgsSymbolV2::OutputUnit unit ) { mCustomDashPatternUnit = unit; }
98  QgsSymbolV2::OutputUnit customDashPatternUnit() const { return mCustomDashPatternUnit; }
99 
100  const QgsMapUnitScale& customDashPatternMapUnitScale() const { return mCustomDashPatternMapUnitScale; }
101  void setCustomDashPatternMapUnitScale( const QgsMapUnitScale& scale ) { mCustomDashPatternMapUnitScale = scale; }
102 
103  QVector<qreal> customDashVector() const { return mCustomDashVector; }
104  void setCustomDashVector( const QVector<qreal>& vector ) { mCustomDashVector = vector; }
105 
106  //Returns true if the line should only be drawn inside the polygon
107  bool drawInsidePolygon() const { return mDrawInsidePolygon; }
108  //Set to true if the line should only be drawn inside the polygon
109  void setDrawInsidePolygon( bool drawInsidePolygon ) { mDrawInsidePolygon = drawInsidePolygon; }
110 
111  QVector<qreal> dxfCustomDashPattern( QgsSymbolV2::OutputUnit& unit ) const override;
112  Qt::PenStyle dxfPenStyle() const override;
113 
114  double dxfWidth( const QgsDxfExport& e, const QgsSymbolV2RenderContext& context ) const override;
115  double dxfOffset( const QgsDxfExport& e, const QgsSymbolV2RenderContext& context ) const override;
116  QColor dxfColor( const QgsSymbolV2RenderContext& context ) const override;
117 
118  protected:
119  Qt::PenStyle mPenStyle;
120  Qt::PenJoinStyle mPenJoinStyle;
121  Qt::PenCapStyle mPenCapStyle;
122  QPen mPen;
123  QPen mSelPen;
124  double mOffset;
127 
128  //use a custom dash dot pattern instead of the predefined ones
132 
134  QVector<qreal> mCustomDashVector;
135 
137 
138  private:
139  //helper functions for data defined symbology
140  void applyDataDefinedSymbology( QgsSymbolV2RenderContext& context, QPen& pen, QPen& selPen, double& offset );
141  void applySizeScale( QgsSymbolV2RenderContext& context, QPen& pen, QPen& selPen );
142 };
143 
145 
146 #define DEFAULT_MARKERLINE_ROTATE true
147 #define DEFAULT_MARKERLINE_INTERVAL 3
148 
150 {
151  public:
153  double interval = DEFAULT_MARKERLINE_INTERVAL );
154 
156 
158  {
163  CentralPoint
164  };
165 
166  // static stuff
167 
168  static QgsSymbolLayerV2* create( const QgsStringMap& properties = QgsStringMap() );
169  static QgsSymbolLayerV2* createFromSld( QDomElement &element );
170 
171  // implemented from base classes
172 
173  QString layerType() const override;
174 
175  void startRender( QgsSymbolV2RenderContext& context ) override;
176 
177  void stopRender( QgsSymbolV2RenderContext& context ) override;
178 
179  void renderPolyline( const QPolygonF& points, QgsSymbolV2RenderContext& context ) override;
180 
181  void renderPolygonOutline( const QPolygonF& points, QList<QPolygonF>* rings, QgsSymbolV2RenderContext& context ) override;
182 
183  QgsStringMap properties() const override;
184 
185  QgsSymbolLayerV2* clone() const override;
186 
187  void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const override;
188 
189  void setColor( const QColor& color ) override;
190 
191  QgsSymbolV2* subSymbol() override;
192  bool setSubSymbol( QgsSymbolV2* symbol ) override;
193 
194  virtual void setWidth( double width ) override;
195  virtual double width() const override;
196 
197  double estimateMaxBleed() const override;
198 
199  // new stuff
200 
201  bool rotateMarker() const { return mRotateMarker; }
202  void setRotateMarker( bool rotate ) { mRotateMarker = rotate; }
203 
204  double interval() const { return mInterval; }
205  void setInterval( double interval ) { mInterval = interval; }
206 
207  double offset() const { return mOffset; }
208  void setOffset( double offset ) { mOffset = offset; }
209 
210  Placement placement() const { return mPlacement; }
211  void setPlacement( Placement p ) { mPlacement = p; }
212 
223  double offsetAlongLine() const { return mOffsetAlongLine; }
224 
236  void setOffsetAlongLine( double offsetAlongLine ) { mOffsetAlongLine = offsetAlongLine; }
237 
243  QgsSymbolV2::OutputUnit offsetAlongLineUnit() const { return mOffsetAlongLineUnit; }
244 
250  void setOffsetAlongLineUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetAlongLineUnit = unit; }
251 
255  const QgsMapUnitScale& offsetAlongLineMapUnitScale() const { return mOffsetAlongLineMapUnitScale; }
256 
260  void setOffsetAlongLineMapUnitScale( const QgsMapUnitScale& scale ) { mOffsetAlongLineMapUnitScale = scale; }
261 
262  void setIntervalUnit( QgsSymbolV2::OutputUnit unit ) { mIntervalUnit = unit; }
263  QgsSymbolV2::OutputUnit intervalUnit() const { return mIntervalUnit; }
264 
265  void setIntervalMapUnitScale( const QgsMapUnitScale& scale ) { mIntervalMapUnitScale = scale; }
266  const QgsMapUnitScale& intervalMapUnitScale() const { return mIntervalMapUnitScale; }
267 
268  void setOffsetUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetUnit = unit; }
269  QgsSymbolV2::OutputUnit offsetUnit() const { return mOffsetUnit; }
270 
271  void setOffsetMapUnitScale( const QgsMapUnitScale& scale ) { mOffsetMapUnitScale = scale; }
272  const QgsMapUnitScale& offsetMapUnitScale() const { return mOffsetMapUnitScale; }
273 
274  void setOutputUnit( QgsSymbolV2::OutputUnit unit ) override;
275  QgsSymbolV2::OutputUnit outputUnit() const override;
276 
277  void setMapUnitScale( const QgsMapUnitScale& scale ) override;
278  QgsMapUnitScale mapUnitScale() const override;
279 
280  protected:
281 
282  void renderPolylineInterval( const QPolygonF& points, QgsSymbolV2RenderContext& context );
283  void renderPolylineVertex( const QPolygonF& points, QgsSymbolV2RenderContext& context, Placement placement = Vertex );
284  void renderPolylineCentral( const QPolygonF& points, QgsSymbolV2RenderContext& context );
285  double markerAngle( const QPolygonF& points, bool isRing, int vertex );
286 
288  double mInterval;
292  double mOffset;
296  double mOffsetAlongLine; //distance to offset along line before marker is drawn
297  QgsSymbolV2::OutputUnit mOffsetAlongLineUnit; //unit for offset along line
299 
300  private:
301 
312  void renderOffsetVertexAlongLine( const QPolygonF& points, int vertex, double distance, QgsSymbolV2RenderContext &context );
313 };
314 
315 #endif
316 
317 
void setIntervalUnit(QgsSymbolV2::OutputUnit unit)
QgsSymbolV2::OutputUnit customDashPatternUnit() const
Class for parsing and evaluation of expressions (formerly called "search strings").
Definition: qgsexpression.h:87
QgsSymbolV2::OutputUnit intervalUnit() const
#define DEFAULT_SIMPLELINE_PENSTYLE
#define DEFAULT_MARKERLINE_ROTATE
QgsSymbolV2::OutputUnit offsetAlongLineUnit() const
Returns the unit used for calculating the offset along line for markers.
virtual Qt::PenStyle dxfPenStyle() const
virtual QgsSymbolLayerV2 * clone() const =0
const QgsMapUnitScale & offsetMapUnitScale() const
virtual double width() const
virtual double dxfOffset(const QgsDxfExport &e, const QgsSymbolV2RenderContext &context) const
#define DEFAULT_MARKERLINE_INTERVAL
const QgsMapUnitScale & customDashPatternMapUnitScale() const
void setCustomDashPatternUnit(QgsSymbolV2::OutputUnit unit)
QgsMapUnitScale mCustomDashPatternMapUnitScale
QgsSymbolV2::OutputUnit outputUnit() const override
QVector< qreal > customDashVector() const
const QgsMapUnitScale & intervalMapUnitScale() const
void setPenJoinStyle(Qt::PenJoinStyle style)
void setOffsetUnit(QgsSymbolV2::OutputUnit unit)
void setIntervalMapUnitScale(const QgsMapUnitScale &scale)
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
QMap< QString, QString > QgsStringMap
Definition: qgis.h:416
Qt::PenStyle penStyle() const
QgsMapUnitScale mOffsetAlongLineMapUnitScale
virtual double estimateMaxBleed() const
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape...
void setOffsetAlongLine(double offsetAlongLine)
Sets the the offset along the line for the marker placement.
virtual void startRender(QgsSymbolV2RenderContext &context)=0
void setInterval(double interval)
QgsSymbolV2::OutputUnit mOffsetUnit
void setDrawInsidePolygon(bool drawInsidePolygon)
virtual double dxfWidth(const QgsDxfExport &e, const QgsSymbolV2RenderContext &context) const override
QgsSymbolV2::OutputUnit mIntervalUnit
virtual void toSld(QDomDocument &doc, QDomElement &element, QgsStringMap props) const
double offsetAlongLine() const
Returns the offset along the line for the marker placement.
void setOutputUnit(QgsSymbolV2::OutputUnit unit) override
virtual QVector< qreal > dxfCustomDashPattern(QgsSymbolV2::OutputUnit &unit) const
const QgsMapUnitScale & offsetMapUnitScale() const
QVector< qreal > mCustomDashVector
Vector with an even number of entries for the.
#define DEFAULT_SIMPLELINE_WIDTH
virtual void setWidth(double width)
virtual QgsStringMap properties() const =0
void setOffsetAlongLineMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale used for calculating the offset in map units along line for markers...
virtual void renderPolygonOutline(const QPolygonF &points, QList< QPolygonF > *rings, QgsSymbolV2RenderContext &context)
void setOffsetAlongLineUnit(QgsSymbolV2::OutputUnit unit)
Sets the unit used for calculating the offset along line for markers.
void setPenCapStyle(Qt::PenCapStyle style)
void setCustomDashVector(const QVector< qreal > &vector)
QgsSymbolV2::OutputUnit offsetUnit() const
virtual QColor dxfColor(const QgsSymbolV2RenderContext &context) const
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
virtual void renderPolyline(const QPolygonF &points, QgsSymbolV2RenderContext &context)=0
QgsSymbolV2::OutputUnit mCustomDashPatternUnit
virtual QString layerType() const =0
virtual QgsSymbolV2 * subSymbol()
#define DEFAULT_SIMPLELINE_COLOR
QgsMapUnitScale mapUnitScale() const override
QgsSymbolV2::OutputUnit mOffsetAlongLineUnit
void setPenStyle(Qt::PenStyle style)
void setMapUnitScale(const QgsMapUnitScale &scale) override
void setCustomDashPatternMapUnitScale(const QgsMapUnitScale &scale)
virtual void setColor(const QColor &color)
QgsSymbolV2::OutputUnit mOffsetUnit
const QgsMapUnitScale & offsetAlongLineMapUnitScale() const
Returns the map unit scale used for calculating the offset in map units along line for markers...
virtual bool setSubSymbol(QgsSymbolV2 *symbol)
virtual void stopRender(QgsSymbolV2RenderContext &context)=0
void setOffsetUnit(QgsSymbolV2::OutputUnit unit)
virtual QString ogrFeatureStyle(double mmScaleFactor, double mapUnitScaleFactor) const
QgsSymbolV2::OutputUnit offsetUnit() const
Qt::PenJoinStyle penJoinStyle() const
Qt::PenCapStyle penCapStyle() const