QGIS API Documentation  2.8.2-Wien
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups 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  bool useCustomDashPattern() const { return mUseCustomDashPattern; }
86  void setUseCustomDashPattern( bool b ) { mUseCustomDashPattern = b; }
87 
88  void setCustomDashPatternUnit( QgsSymbolV2::OutputUnit unit ) { mCustomDashPatternUnit = unit; }
89  QgsSymbolV2::OutputUnit customDashPatternUnit() const { return mCustomDashPatternUnit; }
90 
91  const QgsMapUnitScale& customDashPatternMapUnitScale() const { return mCustomDashPatternMapUnitScale; }
92  void setCustomDashPatternMapUnitScale( const QgsMapUnitScale& scale ) { mCustomDashPatternMapUnitScale = scale; }
93 
94  QVector<qreal> customDashVector() const { return mCustomDashVector; }
95  void setCustomDashVector( const QVector<qreal>& vector ) { mCustomDashVector = vector; }
96 
97  //Returns true if the line should only be drawn inside the polygon
98  bool drawInsidePolygon() const { return mDrawInsidePolygon; }
99  //Set to true if the line should only be drawn inside the polygon
100  void setDrawInsidePolygon( bool drawInsidePolygon ) { mDrawInsidePolygon = drawInsidePolygon; }
101 
102  QVector<qreal> dxfCustomDashPattern( QgsSymbolV2::OutputUnit& unit ) const override;
103  Qt::PenStyle dxfPenStyle() const override;
104 
105  double dxfWidth( const QgsDxfExport& e, const QgsSymbolV2RenderContext& context ) const override;
106  double dxfOffset( const QgsDxfExport& e, const QgsSymbolV2RenderContext& context ) const override;
107  QColor dxfColor( const QgsSymbolV2RenderContext& context ) const override;
108 
109  protected:
110  Qt::PenStyle mPenStyle;
111  Qt::PenJoinStyle mPenJoinStyle;
112  Qt::PenCapStyle mPenCapStyle;
113  QPen mPen;
114  QPen mSelPen;
115 
116  //use a custom dash dot pattern instead of the predefined ones
120 
122  QVector<qreal> mCustomDashVector;
123 
125 
126  private:
127  //helper functions for data defined symbology
128  void applyDataDefinedSymbology( QgsSymbolV2RenderContext& context, QPen& pen, QPen& selPen, double& offset );
129  void applySizeScale( QgsSymbolV2RenderContext& context, QPen& pen, QPen& selPen );
130 };
131 
133 
134 #define DEFAULT_MARKERLINE_ROTATE true
135 #define DEFAULT_MARKERLINE_INTERVAL 3
136 
138 {
139  public:
141  double interval = DEFAULT_MARKERLINE_INTERVAL );
142 
144 
146  {
151  CentralPoint
152  };
153 
154  // static stuff
155 
156  static QgsSymbolLayerV2* create( const QgsStringMap& properties = QgsStringMap() );
157  static QgsSymbolLayerV2* createFromSld( QDomElement &element );
158 
159  // implemented from base classes
160 
161  QString layerType() const override;
162 
163  void startRender( QgsSymbolV2RenderContext& context ) override;
164 
165  void stopRender( QgsSymbolV2RenderContext& context ) override;
166 
167  void renderPolyline( const QPolygonF& points, QgsSymbolV2RenderContext& context ) override;
168 
169  void renderPolygonOutline( const QPolygonF& points, QList<QPolygonF>* rings, QgsSymbolV2RenderContext& context ) override;
170 
171  QgsStringMap properties() const override;
172 
173  QgsSymbolLayerV2* clone() const override;
174 
175  void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const override;
176 
177  void setColor( const QColor& color ) override;
178 
179  QgsSymbolV2* subSymbol() override;
180  bool setSubSymbol( QgsSymbolV2* symbol ) override;
181 
182  virtual void setWidth( double width ) override;
183  virtual double width() const override;
184 
185  double estimateMaxBleed() const override;
186 
187  // new stuff
188 
189  bool rotateMarker() const { return mRotateMarker; }
190  void setRotateMarker( bool rotate ) { mRotateMarker = rotate; }
191 
192  double interval() const { return mInterval; }
193  void setInterval( double interval ) { mInterval = interval; }
194 
195  Placement placement() const { return mPlacement; }
196  void setPlacement( Placement p ) { mPlacement = p; }
197 
208  double offsetAlongLine() const { return mOffsetAlongLine; }
209 
221  void setOffsetAlongLine( double offsetAlongLine ) { mOffsetAlongLine = offsetAlongLine; }
222 
228  QgsSymbolV2::OutputUnit offsetAlongLineUnit() const { return mOffsetAlongLineUnit; }
229 
235  void setOffsetAlongLineUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetAlongLineUnit = unit; }
236 
240  const QgsMapUnitScale& offsetAlongLineMapUnitScale() const { return mOffsetAlongLineMapUnitScale; }
241 
245  void setOffsetAlongLineMapUnitScale( const QgsMapUnitScale& scale ) { mOffsetAlongLineMapUnitScale = scale; }
246 
247  void setIntervalUnit( QgsSymbolV2::OutputUnit unit ) { mIntervalUnit = unit; }
248  QgsSymbolV2::OutputUnit intervalUnit() const { return mIntervalUnit; }
249 
250  void setIntervalMapUnitScale( const QgsMapUnitScale& scale ) { mIntervalMapUnitScale = scale; }
251  const QgsMapUnitScale& intervalMapUnitScale() const { return mIntervalMapUnitScale; }
252 
253  void setOutputUnit( QgsSymbolV2::OutputUnit unit ) override;
254  QgsSymbolV2::OutputUnit outputUnit() const override;
255 
256  void setMapUnitScale( const QgsMapUnitScale& scale ) override;
257  QgsMapUnitScale mapUnitScale() const override;
258 
259  protected:
260 
261  void renderPolylineInterval( const QPolygonF& points, QgsSymbolV2RenderContext& context );
262  void renderPolylineVertex( const QPolygonF& points, QgsSymbolV2RenderContext& context, Placement placement = Vertex );
263  void renderPolylineCentral( const QPolygonF& points, QgsSymbolV2RenderContext& context );
264  double markerAngle( const QPolygonF& points, bool isRing, int vertex );
265 
267  double mInterval;
272  double mOffsetAlongLine; //distance to offset along line before marker is drawn
273  QgsSymbolV2::OutputUnit mOffsetAlongLineUnit; //unit for offset along line
275 
276  private:
277 
288  void renderOffsetVertexAlongLine( const QPolygonF& points, int vertex, double distance, QgsSymbolV2RenderContext &context );
289 };
290 
291 #endif
292 
293