QGIS API Documentation  2.8.2-Wien
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
qgssymbolv2.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgssymbolv2.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 QGSSYMBOLV2_H
17 #define QGSSYMBOLV2_H
18 
19 #include "qgis.h"
20 #include <QList>
21 #include <QMap>
22 #include "qgsmapunitscale.h"
23 
24 class QColor;
25 class QImage;
26 class QPainter;
27 class QSize;
28 class QPointF;
29 class QPolygonF;
30 
31 class QDomDocument;
32 class QDomElement;
33 //class
34 
35 class QgsFeature;
36 class QgsFields;
37 class QgsSymbolLayerV2;
38 class QgsRenderContext;
40 
41 typedef QList<QgsSymbolLayerV2*> QgsSymbolLayerV2List;
42 
43 class CORE_EXPORT QgsSymbolV2
44 {
45  public:
46 
48  {
49  MM = 0,
51  Mixed, //mixed units in symbol layers
52  Pixel
53  };
54 
56  {
59  Fill
60  };
61 
63  {
65  ScaleDiameter
66  };
67 
69  {
70  DataDefinedSizeScale = 1,
71  DataDefinedRotation = 2
72  };
73 
74  virtual ~QgsSymbolV2();
75 
77  static QgsSymbolV2* defaultSymbol( QGis::GeometryType geomType );
78 
79  SymbolType type() const { return mType; }
80 
81  // symbol layers handling
82 
89  QgsSymbolLayerV2List symbolLayers() { return mLayers; }
90 
98  QgsSymbolLayerV2* symbolLayer( int layer );
99 
106  int symbolLayerCount() { return mLayers.count(); }
107 
109  bool insertSymbolLayer( int index, QgsSymbolLayerV2* layer );
110 
112  bool appendSymbolLayer( QgsSymbolLayerV2* layer );
113 
115  bool deleteSymbolLayer( int index );
116 
118  QgsSymbolLayerV2* takeSymbolLayer( int index );
119 
121  bool changeSymbolLayer( int index, QgsSymbolLayerV2 *layer );
122 
123  void startRender( QgsRenderContext& context, const QgsFields* fields = 0 );
124  void stopRender( QgsRenderContext& context );
125 
126  void setColor( const QColor& color );
127  QColor color() const;
128 
132  void drawPreviewIcon( QPainter* painter, QSize size, QgsRenderContext* customContext = 0 );
133 
134  QImage asImage( QSize size, QgsRenderContext* customContext = 0 );
135 
136  QImage bigSymbolPreviewImage();
137 
138  QString dump() const;
139 
140  virtual QgsSymbolV2* clone() const = 0;
141 
142  void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const;
143 
144  QgsSymbolV2::OutputUnit outputUnit() const;
145  void setOutputUnit( QgsSymbolV2::OutputUnit u );
146 
147  QgsMapUnitScale mapUnitScale() const;
148  void setMapUnitScale( const QgsMapUnitScale& scale );
149 
151  qreal alpha() const { return mAlpha; }
153  void setAlpha( qreal alpha ) { mAlpha = alpha; }
154 
155  void setRenderHints( int hints ) { mRenderHints = hints; }
156  int renderHints() const { return mRenderHints; }
157 
158  QSet<QString> usedAttributes() const;
159 
160  void setLayer( const QgsVectorLayer* layer ) { mLayer = layer; }
161  const QgsVectorLayer* layer() const { return mLayer; }
162 
163  protected:
164  QgsSymbolV2( SymbolType type, QgsSymbolLayerV2List layers ); // can't be instantiated
165 
166  QgsSymbolLayerV2List cloneLayers() const;
167 
170  bool isSymbolLayerCompatible( SymbolType t );
171 
174 
176  qreal mAlpha;
177 
179 
180  const QgsVectorLayer* mLayer; //current vectorlayer
181 };
182 
184 
185 class CORE_EXPORT QgsSymbolV2RenderContext
186 {
187  public:
188  QgsSymbolV2RenderContext( QgsRenderContext& c, QgsSymbolV2::OutputUnit u, qreal alpha = 1.0, bool selected = false, int renderHints = 0, const QgsFeature* f = 0, const QgsFields* fields = 0, const QgsMapUnitScale& mapUnitScale = QgsMapUnitScale() );
190 
191  QgsRenderContext& renderContext() { return mRenderContext; }
192  const QgsRenderContext& renderContext() const { return mRenderContext; }
193 
194  QgsSymbolV2::OutputUnit outputUnit() const { return mOutputUnit; }
195  void setOutputUnit( QgsSymbolV2::OutputUnit u ) { mOutputUnit = u; }
196 
197  QgsMapUnitScale mapUnitScale() const { return mMapUnitScale; }
198  void setMapUnitScale( const QgsMapUnitScale& scale ) { mMapUnitScale = scale; }
199 
201  qreal alpha() const { return mAlpha; }
203  void setAlpha( qreal alpha ) { mAlpha = alpha; }
204 
205  bool selected() const { return mSelected; }
206  void setSelected( bool selected ) { mSelected = selected; }
207 
208  int renderHints() const { return mRenderHints; }
209  void setRenderHints( int hints ) { mRenderHints = hints; }
210 
211  void setFeature( const QgsFeature* f ) { mFeature = f; }
213  const QgsFeature* feature() const { return mFeature; }
214 
219  const QgsFields* fields() const { return mFields; }
220 
221  double outputLineWidth( double width ) const;
222  double outputPixelSize( double size ) const;
223 
224  // workaround for sip 4.7. Don't use assignment - will fail with assertion error
226 
227  private:
228  QgsRenderContext& mRenderContext;
229  QgsSymbolV2::OutputUnit mOutputUnit;
230  QgsMapUnitScale mMapUnitScale;
231  qreal mAlpha;
232  bool mSelected;
233  int mRenderHints;
234  const QgsFeature* mFeature; //current feature
235  const QgsFields* mFields;
236 };
237 
238 
239 
241 
242 
243 
244 class CORE_EXPORT QgsMarkerSymbolV2 : public QgsSymbolV2
245 {
246  public:
250  static QgsMarkerSymbolV2* createSimple( const QgsStringMap& properties );
251 
253 
254  void setAngle( double angle );
255  double angle();
256 
257  void setSize( double size );
258  double size();
259 
260  void setScaleMethod( QgsSymbolV2::ScaleMethod scaleMethod );
261  ScaleMethod scaleMethod();
262 
263  void renderPoint( const QPointF& point, const QgsFeature* f, QgsRenderContext& context, int layer = -1, bool selected = false );
264 
265  virtual QgsSymbolV2* clone() const override;
266 };
267 
268 
269 
270 class CORE_EXPORT QgsLineSymbolV2 : public QgsSymbolV2
271 {
272  public:
276  static QgsLineSymbolV2* createSimple( const QgsStringMap& properties );
277 
279 
280  void setWidth( double width );
281  double width();
282 
283  void renderPolyline( const QPolygonF& points, const QgsFeature* f, QgsRenderContext& context, int layer = -1, bool selected = false );
284 
285  virtual QgsSymbolV2* clone() const override;
286 };
287 
288 
289 
290 class CORE_EXPORT QgsFillSymbolV2 : public QgsSymbolV2
291 {
292  public:
296  static QgsFillSymbolV2* createSimple( const QgsStringMap& properties );
297 
299  void setAngle( double angle );
300  void renderPolygon( const QPolygonF& points, QList<QPolygonF>* rings, const QgsFeature* f, QgsRenderContext& context, int layer = -1, bool selected = false );
301 
302  virtual QgsSymbolV2* clone() const override;
303 };
304 
305 #endif
306 
307 
308 /*
309 
310 QgsSymbolV2* ps = new QgsPointSymbol();
311 
312 // ----
313 
314 sl = QgsSymbolLayerV2Registry::instance()->createSymbolLayer("SimpleLine", { "color", "..." })
315 
316 // (or)
317 
318 sl = QgsSymbolLayerV2Registry::defaultSymbolLayer(QgsSymbolV2::Line)
319 
320 // (or)
321 
322 QgsSymbolLayerV2* sl = new QgsSimpleLineSymbolLayer(x,y,z);
323 QgsLineSymbol* s = new LineSymbol( [ sl ] );
324 
325 // ----
326 
327 rend = QgsSingleSymbolRenderer( new LineSymbol() );
328 */
329 
330