QGIS API Documentation  3.20.0-Odense (decaadbb31)
qgsrenderer.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsrenderer.cpp
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 #include "qgsrenderer.h"
17 #include "qgssymbol.h"
18 #include "qgssymbollayerutils.h"
19 #include "qgsrulebasedrenderer.h"
20 
21 #include "qgssinglesymbolrenderer.h" // for default renderer
22 
23 #include "qgsrendererregistry.h"
24 
25 #include "qgsrendercontext.h"
26 #include "qgsclipper.h"
27 #include "qgsgeometry.h"
28 #include "qgsgeometrycollection.h"
29 #include "qgsfeature.h"
30 #include "qgslogger.h"
31 #include "qgsvectorlayer.h"
32 #include "qgspainteffect.h"
33 #include "qgseffectstack.h"
34 #include "qgspainteffectregistry.h"
35 #include "qgswkbptr.h"
36 #include "qgspoint.h"
37 #include "qgsproperty.h"
38 #include "qgsapplication.h"
39 #include "qgsmarkersymbol.h"
40 #include "qgslinesymbol.h"
41 
42 #include <QDomElement>
43 #include <QDomDocument>
44 #include <QPolygonF>
45 #include <QThread>
46 
47 QPointF QgsFeatureRenderer::_getPoint( QgsRenderContext &context, const QgsPoint &point )
48 {
49  return QgsSymbol::_getPoint( context, point );
50 }
51 
53 {
54  if ( !destRenderer || !mPaintEffect )
55  return;
56 
57  destRenderer->setPaintEffect( mPaintEffect->clone() );
58  destRenderer->setForceRasterRender( mForceRaster );
60  destRenderer->mOrderBy = mOrderBy;
61  destRenderer->mOrderByEnabled = mOrderByEnabled;
62 }
63 
65  : mType( type )
66  , mCurrentVertexMarkerType( QgsVectorLayer::Cross )
67 {
69  mPaintEffect->setEnabled( false );
70 }
71 
73 {
74  delete mPaintEffect;
75 }
76 
78 {
79  return new QgsSingleSymbolRenderer( QgsSymbol::defaultSymbol( geomType ) );
80 }
81 
83 {
84  return symbolForFeature( feature, context );
85 }
86 
87 QSet< QString > QgsFeatureRenderer::legendKeysForFeature( const QgsFeature &feature, QgsRenderContext &context ) const
88 {
89  Q_UNUSED( feature )
90  Q_UNUSED( context )
91  return QSet< QString >();
92 }
93 
95 {
96 #ifdef QGISDEBUG
97  if ( !mThread )
98  {
99  mThread = QThread::currentThread();
100  }
101  else
102  {
103  Q_ASSERT_X( mThread == QThread::currentThread(), "QgsFeatureRenderer::startRender", "startRender called in a different thread - use a cloned renderer instead" );
104  }
105 #endif
106 }
107 
109 {
110 #ifdef QGISDEBUG
111  Q_ASSERT_X( mThread == QThread::currentThread(), "QgsFeatureRenderer::stopRender", "stopRender called in a different thread - use a cloned renderer instead" );
112 #endif
113 }
114 
116 {
117  return false;
118 }
119 
121 {
122  return false;
123 }
124 
125 bool QgsFeatureRenderer::renderFeature( const QgsFeature &feature, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker )
126 {
127 #ifdef QGISDEBUG
128  Q_ASSERT_X( mThread == QThread::currentThread(), "QgsFeatureRenderer::renderFeature", "renderFeature called in a different thread - use a cloned renderer instead" );
129 #endif
130 
131  QgsSymbol *symbol = symbolForFeature( feature, context );
132  if ( !symbol )
133  return false;
134 
135  renderFeatureWithSymbol( feature, symbol, context, layer, selected, drawVertexMarker );
136  return true;
137 }
138 
139 void QgsFeatureRenderer::renderFeatureWithSymbol( const QgsFeature &feature, QgsSymbol *symbol, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker )
140 {
141  symbol->renderFeature( feature, context, layer, selected, drawVertexMarker, mCurrentVertexMarkerType, mCurrentVertexMarkerSize );
142 }
143 
145 {
146  return QStringLiteral( "UNKNOWN RENDERER\n" );
147 }
148 
150 {
151  Q_UNUSED( context )
152  return QgsSymbolList();
153 }
154 
155 QgsFeatureRenderer *QgsFeatureRenderer::load( QDomElement &element, const QgsReadWriteContext &context )
156 {
157  // <renderer-v2 type=""> ... </renderer-v2>
158 
159  if ( element.isNull() )
160  return nullptr;
161 
162  // load renderer
163  QString rendererType = element.attribute( QStringLiteral( "type" ) );
164 
166  if ( !m )
167  return nullptr;
168 
169  QgsFeatureRenderer *r = m->createRenderer( element, context );
170  if ( r )
171  {
172  r->setUsingSymbolLevels( element.attribute( QStringLiteral( "symbollevels" ), QStringLiteral( "0" ) ).toInt() );
173  r->setForceRasterRender( element.attribute( QStringLiteral( "forceraster" ), QStringLiteral( "0" ) ).toInt() );
174 
175  //restore layer effect
176  QDomElement effectElem = element.firstChildElement( QStringLiteral( "effect" ) );
177  if ( !effectElem.isNull() )
178  {
179  r->setPaintEffect( QgsApplication::paintEffectRegistry()->createEffect( effectElem ) );
180  }
181 
182  // restore order by
183  QDomElement orderByElem = element.firstChildElement( QStringLiteral( "orderby" ) );
184  r->mOrderBy.load( orderByElem );
185  r->setOrderByEnabled( element.attribute( QStringLiteral( "enableorderby" ), QStringLiteral( "0" ) ).toInt() );
186  }
187  return r;
188 }
189 
190 QDomElement QgsFeatureRenderer::save( QDomDocument &doc, const QgsReadWriteContext &context )
191 {
192  Q_UNUSED( context )
193  // create empty renderer element
194  QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
195  rendererElem.setAttribute( QStringLiteral( "forceraster" ), ( mForceRaster ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ) );
196 
198  mPaintEffect->saveProperties( doc, rendererElem );
199 
200  if ( !mOrderBy.isEmpty() )
201  {
202  QDomElement orderBy = doc.createElement( QStringLiteral( "orderby" ) );
203  mOrderBy.save( orderBy );
204  rendererElem.appendChild( orderBy );
205  }
206  rendererElem.setAttribute( QStringLiteral( "enableorderby" ), ( mOrderByEnabled ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ) );
207  return rendererElem;
208 }
209 
210 QgsFeatureRenderer *QgsFeatureRenderer::loadSld( const QDomNode &node, QgsWkbTypes::GeometryType geomType, QString &errorMessage )
211 {
212  QDomElement element = node.toElement();
213  if ( element.isNull() )
214  return nullptr;
215 
216  // get the UserStyle element
217  QDomElement userStyleElem = element.firstChildElement( QStringLiteral( "UserStyle" ) );
218  if ( userStyleElem.isNull() )
219  {
220  // UserStyle element not found, nothing will be rendered
221  errorMessage = QStringLiteral( "Info: UserStyle element not found." );
222  return nullptr;
223  }
224 
225  // get the FeatureTypeStyle element
226  QDomElement featTypeStyleElem = userStyleElem.firstChildElement( QStringLiteral( "FeatureTypeStyle" ) );
227  if ( featTypeStyleElem.isNull() )
228  {
229  errorMessage = QStringLiteral( "Info: FeatureTypeStyle element not found." );
230  return nullptr;
231  }
232 
233  // create empty FeatureTypeStyle element to merge Rule's from all FeatureTypeStyle's
234  QDomElement mergedFeatTypeStyle = featTypeStyleElem.cloneNode( false ).toElement();
235 
236  // use the RuleRenderer when more rules are present or the rule
237  // has filters or min/max scale denominators set,
238  // otherwise use the SingleSymbol renderer
239  bool needRuleRenderer = false;
240  int ruleCount = 0;
241 
242  while ( !featTypeStyleElem.isNull() )
243  {
244  QDomElement ruleElem = featTypeStyleElem.firstChildElement( QStringLiteral( "Rule" ) );
245  while ( !ruleElem.isNull() )
246  {
247  // test rule children element to check if we need to create RuleRenderer
248  // and if the rule has a symbolizer
249  bool hasRendererSymbolizer = false;
250  bool hasRuleRenderer = false;
251  QDomElement ruleChildElem = ruleElem.firstChildElement();
252  while ( !ruleChildElem.isNull() )
253  {
254  // rule has filter or min/max scale denominator, use the RuleRenderer
255  if ( ruleChildElem.localName() == QLatin1String( "Filter" ) ||
256  ruleChildElem.localName() == QLatin1String( "MinScaleDenominator" ) ||
257  ruleChildElem.localName() == QLatin1String( "MaxScaleDenominator" ) )
258  {
259  hasRuleRenderer = true;
260  }
261  // rule has a renderer symbolizer, not a text symbolizer
262  else if ( ruleChildElem.localName().endsWith( QLatin1String( "Symbolizer" ) ) &&
263  ruleChildElem.localName() != QLatin1String( "TextSymbolizer" ) )
264  {
265  QgsDebugMsgLevel( QStringLiteral( "Symbolizer element found and not a TextSymbolizer" ), 2 );
266  hasRendererSymbolizer = true;
267  }
268 
269  ruleChildElem = ruleChildElem.nextSiblingElement();
270  }
271 
272  if ( hasRendererSymbolizer )
273  {
274  ruleCount++;
275 
276  // append a clone of all Rules to the merged FeatureTypeStyle element
277  mergedFeatTypeStyle.appendChild( ruleElem.cloneNode().toElement() );
278 
279  if ( hasRuleRenderer )
280  {
281  QgsDebugMsgLevel( QStringLiteral( "Filter or Min/MaxScaleDenominator element found: need a RuleRenderer" ), 2 );
282  needRuleRenderer = true;
283  }
284  }
285 
286  // more rules present, use the RuleRenderer
287  if ( ruleCount > 1 )
288  {
289  QgsDebugMsgLevel( QStringLiteral( "more Rule elements found: need a RuleRenderer" ), 2 );
290  needRuleRenderer = true;
291  }
292 
293  ruleElem = ruleElem.nextSiblingElement( QStringLiteral( "Rule" ) );
294  }
295  featTypeStyleElem = featTypeStyleElem.nextSiblingElement( QStringLiteral( "FeatureTypeStyle" ) );
296  }
297 
298  QString rendererType;
299  if ( needRuleRenderer )
300  {
301  rendererType = QStringLiteral( "RuleRenderer" );
302  }
303  else
304  {
305  rendererType = QStringLiteral( "singleSymbol" );
306  }
307  QgsDebugMsgLevel( QStringLiteral( "Instantiating a '%1' renderer..." ).arg( rendererType ), 2 );
308 
309  // create the renderer and return it
311  if ( !m )
312  {
313  errorMessage = QStringLiteral( "Error: Unable to get metadata for '%1' renderer." ).arg( rendererType );
314  return nullptr;
315  }
316 
317  QgsFeatureRenderer *r = m->createRendererFromSld( mergedFeatTypeStyle, geomType );
318  return r;
319 }
320 
321 QDomElement QgsFeatureRenderer::writeSld( QDomDocument &doc, const QString &styleName, const QVariantMap &props ) const
322 {
323  QDomElement userStyleElem = doc.createElement( QStringLiteral( "UserStyle" ) );
324 
325  QDomElement nameElem = doc.createElement( QStringLiteral( "se:Name" ) );
326  nameElem.appendChild( doc.createTextNode( styleName ) );
327  userStyleElem.appendChild( nameElem );
328 
329  QDomElement featureTypeStyleElem = doc.createElement( QStringLiteral( "se:FeatureTypeStyle" ) );
330  toSld( doc, featureTypeStyleElem, props );
331  userStyleElem.appendChild( featureTypeStyleElem );
332 
333  return userStyleElem;
334 }
335 
337 {
338  return false;
339 }
340 
342 {
343  Q_UNUSED( key )
344  return false;
345 }
346 
347 void QgsFeatureRenderer::checkLegendSymbolItem( const QString &key, bool state )
348 {
349  Q_UNUSED( key )
350  Q_UNUSED( state )
351 }
352 
353 void QgsFeatureRenderer::setLegendSymbolItem( const QString &key, QgsSymbol *symbol )
354 {
355  Q_UNUSED( key )
356  delete symbol;
357 }
358 
360 {
361  return QgsLegendSymbolList();
362 }
363 
365 {
368 }
369 
371 {
372  return nullptr != symbolForFeature( feature, context );
373 }
374 
376 {
378  QgsSymbolLayerUtils::drawVertexMarker( pt.x(), pt.y(), *context.painter(),
380  markerSize );
381 }
382 
384 {
385  const auto constPts = pts;
386  for ( QPointF pt : constPts )
387  renderVertexMarker( pt, context );
388 }
389 
390 void QgsFeatureRenderer::renderVertexMarkerPolygon( QPolygonF &pts, QList<QPolygonF> *rings, QgsRenderContext &context )
391 {
392  const auto constPts = pts;
393  for ( QPointF pt : constPts )
394  renderVertexMarker( pt, context );
395 
396  if ( rings )
397  {
398  const auto constRings = *rings;
399  for ( const QPolygonF &ring : constRings )
400  {
401  const auto constRing = ring;
402  for ( QPointF pt : constRing )
403  renderVertexMarker( pt, context );
404  }
405  }
406 }
407 
409 {
410  QgsSymbolList lst;
411  QgsSymbol *s = symbolForFeature( feature, context );
412  if ( s ) lst.append( s );
413  return lst;
414 }
415 
417 {
418  Q_UNUSED( extent )
419  Q_UNUSED( context )
420 }
421 
423 {
424  QgsSymbolList lst;
425  QgsSymbol *s = originalSymbolForFeature( feature, context );
426  if ( s ) lst.append( s );
427  return lst;
428 }
429 
431 {
432  return mPaintEffect;
433 }
434 
436 {
437  delete mPaintEffect;
438  mPaintEffect = effect;
439 }
440 
442 {
443  return mOrderBy;
444 }
445 
447 {
448  mOrderBy = orderBy;
449 }
450 
452 {
453  return mOrderByEnabled;
454 }
455 
457 {
458  mOrderByEnabled = enabled;
459 }
460 
462 {
463  delete subRenderer;
464 }
465 
467 {
468  return nullptr;
469 }
470 
472 {
473  return true;
474 }
475 
477 {
478  if ( symbol->type() == Qgis:: SymbolType::Marker )
479  {
480  QgsMarkerSymbol *s = static_cast<QgsMarkerSymbol *>( symbol );
481  if ( Qgis::ScaleMethod::ScaleArea == method )
482  {
483  s->setDataDefinedSize( QgsProperty::fromExpression( "coalesce(sqrt(" + QString::number( s->size() ) + " * (" + field + ")),0)" ) );
484  }
485  else
486  {
487  s->setDataDefinedSize( QgsProperty::fromExpression( "coalesce(" + QString::number( s->size() ) + " * (" + field + "),0)" ) );
488  }
490  }
491  else if ( symbol->type() == Qgis::SymbolType::Line )
492  {
493  QgsLineSymbol *s = static_cast<QgsLineSymbol *>( symbol );
494  s->setDataDefinedWidth( QgsProperty::fromExpression( "coalesce(" + QString::number( s->width() ) + " * (" + field + "),0)" ) );
495  }
496 }
497 
499 {
500  if ( symbol->type() == Qgis::SymbolType::Marker )
501  {
502  QgsMarkerSymbol *s = static_cast<QgsMarkerSymbol *>( symbol );
504  ? QString::number( s->angle() ) + " + "
505  : QString() ) + field );
506  s->setDataDefinedAngle( dd );
507  }
508 }
509 
511 {
512  return mSymbol;
513 }
514 
516 {
517  return mLayer;
518 }
ScaleMethod
Scale methods.
Definition: qgis.h:182
@ ScaleDiameter
Calculate scale by the diameter.
@ ScaleArea
Calculate scale by the area.
@ Marker
Marker symbol.
@ Line
Line symbol.
static QgsPaintEffectRegistry * paintEffectRegistry()
Returns the application's paint effect registry, used for managing paint effects.
static QgsRendererRegistry * rendererRegistry()
Returns the application's renderer registry, used for managing vector layer renderers.
void setOrderBy(const QgsFeatureRequest::OrderBy &orderBy)
Define the order in which features shall be processed by this renderer.
void renderVertexMarkerPolyline(QPolygonF &pts, QgsRenderContext &context)
render editing vertex marker for a polyline
static QPointF _getPoint(QgsRenderContext &context, const QgsPoint &point)
Creates a point in screen coordinates from a wkb string in map coordinates.
Definition: qgsrenderer.cpp:47
virtual QDomElement writeSld(QDomDocument &doc, const QString &styleName, const QVariantMap &props=QVariantMap()) const
create the SLD UserStyle element following the SLD v1.1 specs with the given name
virtual QgsLegendSymbolList legendSymbolItems() const
Returns a list of symbology items for the legend.
static QgsFeatureRenderer * defaultRenderer(QgsWkbTypes::GeometryType geomType)
Returns a new renderer - used by default in vector layers.
Definition: qgsrenderer.cpp:77
void setOrderByEnabled(bool enabled)
Sets whether custom ordering should be applied before features are processed by this renderer.
virtual bool legendSymbolItemsCheckable() const
items of symbology items in legend should be checkable
virtual void modifyRequestExtent(QgsRectangle &extent, QgsRenderContext &context)
Allows for a renderer to modify the extent of a feature request prior to rendering.
void renderFeatureWithSymbol(const QgsFeature &feature, QgsSymbol *symbol, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker) SIP_THROW(QgsCsException)
Render the feature with the symbol using context.
virtual bool legendSymbolItemChecked(const QString &key)
items of symbology items in legend is checked
QgsPaintEffect * paintEffect() const
Returns the current paint effect for the renderer.
void setPaintEffect(QgsPaintEffect *effect)
Sets the current paint effect for the renderer.
virtual void setLegendSymbolItem(const QString &key, QgsSymbol *symbol)
Sets the symbol to be used for a legend symbol item.
virtual void setEmbeddedRenderer(QgsFeatureRenderer *subRenderer)
Sets an embedded renderer (subrenderer) for this feature renderer.
QgsFeatureRenderer(const QString &type)
Definition: qgsrenderer.cpp:64
virtual QgsSymbolList symbolsForFeature(const QgsFeature &feature, QgsRenderContext &context) const
Returns list of symbols used for rendering the feature.
void setForceRasterRender(bool forceRaster)
Sets whether the renderer should be rendered to a raster destination.
Definition: qgsrenderer.h:430
virtual QgsSymbolList symbols(QgsRenderContext &context) const
Returns list of symbols used by the renderer.
virtual void stopRender(QgsRenderContext &context)
Must be called when a render cycle has finished, to allow the renderer to clean up.
virtual void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props=QVariantMap()) const
used from subclasses to create SLD Rule elements following SLD v1.1 specs
Definition: qgsrenderer.h:320
virtual QSet< QString > legendKeysForFeature(const QgsFeature &feature, QgsRenderContext &context) const
Returns legend keys matching a specified feature.
Definition: qgsrenderer.cpp:87
QgsPaintEffect * mPaintEffect
Definition: qgsrenderer.h:537
virtual QgsSymbol * symbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const =0
To be overridden.
QString type() const
Definition: qgsrenderer.h:141
virtual bool usesEmbeddedSymbols() const
Returns true if the renderer uses embedded symbols for features.
void copyRendererData(QgsFeatureRenderer *destRenderer) const
Clones generic renderer data to another renderer.
Definition: qgsrenderer.cpp:52
virtual QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context)
store renderer info to XML element
static QgsFeatureRenderer * loadSld(const QDomNode &node, QgsWkbTypes::GeometryType geomType, QString &errorMessage)
Create a new renderer according to the information contained in the UserStyle element of a SLD style ...
void setVertexMarkerAppearance(int type, double size)
Sets type and size of editing vertex markers for subsequent rendering.
virtual QString dump() const
Returns debug information about this renderer.
void setUsingSymbolLevels(bool usingSymbolLevels)
Definition: qgsrenderer.h:292
virtual ~QgsFeatureRenderer()
Definition: qgsrenderer.cpp:72
virtual void checkLegendSymbolItem(const QString &key, bool state=true)
item in symbology was checked
bool orderByEnabled() const
Returns whether custom ordering will be applied before features are processed by this renderer.
virtual bool filterNeedsGeometry() const
Returns true if this renderer requires the geometry to apply the filter.
static void convertSymbolRotation(QgsSymbol *symbol, const QString &field)
static QgsFeatureRenderer * load(QDomElement &symbologyElem, const QgsReadWriteContext &context)
create a renderer from XML element
virtual bool accept(QgsStyleEntityVisitorInterface *visitor) const
Accepts the specified symbology visitor, causing it to visit all symbols associated with the renderer...
int mCurrentVertexMarkerType
The current type of editing marker.
Definition: qgsrenderer.h:533
QgsFeatureRequest::OrderBy mOrderBy
Definition: qgsrenderer.h:553
virtual QgsSymbol * originalSymbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const
Returns symbol for feature.
Definition: qgsrenderer.cpp:82
virtual bool willRenderFeature(const QgsFeature &feature, QgsRenderContext &context) const
Returns whether the renderer will render a feature or not.
void renderVertexMarker(QPointF pt, QgsRenderContext &context)
render editing vertex marker at specified point
void renderVertexMarkerPolygon(QPolygonF &pts, QList< QPolygonF > *rings, QgsRenderContext &context)
render editing vertex marker for a polygon
virtual const QgsFeatureRenderer * embeddedRenderer() const
Returns the current embedded renderer (subrenderer) for this feature renderer.
double mCurrentVertexMarkerSize
The current size of editing marker.
Definition: qgsrenderer.h:535
virtual void startRender(QgsRenderContext &context, const QgsFields &fields)
Must be called when a new render cycle is started.
Definition: qgsrenderer.cpp:94
virtual bool renderFeature(const QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false) SIP_THROW(QgsCsException)
Render a feature using this renderer in the given context.
static void convertSymbolSizeScale(QgsSymbol *symbol, Qgis::ScaleMethod method, const QString &field)
QgsFeatureRequest::OrderBy orderBy() const
Gets the order in which features shall be processed by this renderer.
virtual QgsSymbolList originalSymbolsForFeature(const QgsFeature &feature, QgsRenderContext &context) const
Equivalent of originalSymbolsForFeature() call extended to support renderers that may use more symbol...
Represents a list of OrderByClauses, with the most important first and the least important last.
void CORE_EXPORT load(const QDomElement &elem)
Deserialize from XML.
void CORE_EXPORT save(QDomElement &elem) const
Serialize to XML.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
Container of fields for a vector layer.
Definition: qgsfields.h:45
A line symbol type, for rendering LineString and MultiLineString geometries.
Definition: qgslinesymbol.h:30
double width() const
Returns the estimated width for the whole symbol, which is the maximum width of all marker symbol lay...
void setDataDefinedWidth(const QgsProperty &property)
Set data defined width for whole symbol (including all symbol layers).
A marker symbol type, for rendering Point and MultiPoint geometries.
void setScaleMethod(Qgis::ScaleMethod scaleMethod)
Sets the method to use for scaling the marker's size.
double size() const
Returns the estimated size for the whole symbol, which is the maximum size of all marker symbol layer...
double angle() const
Returns the marker angle for the whole symbol.
void setDataDefinedSize(const QgsProperty &property)
Set data defined size for whole symbol (including all symbol layers).
void setDataDefinedAngle(const QgsProperty &property)
Set data defined angle for whole symbol (including all symbol layers).
static QgsPaintEffect * defaultStack()
Returns a new effect stack consisting of a sensible selection of default effects.
static bool isDefaultStack(QgsPaintEffect *effect)
Tests whether a paint effect matches the default effects stack.
Base class for visual effects which can be applied to QPicture drawings.
void setEnabled(bool enabled)
Sets whether the effect is enabled.
virtual bool saveProperties(QDomDocument &doc, QDomElement &element) const
Saves the current state of the effect to a DOM element.
virtual QgsPaintEffect * clone() const =0
Duplicates an effect by creating a deep copy of the effect.
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:49
A store for object properties.
Definition: qgsproperty.h:232
static QgsProperty fromExpression(const QString &expression, bool isActive=true)
Returns a new ExpressionBasedProperty created from the specified expression.
The class is used as a container of context for various read/write operations on other objects.
A rectangle specified with double values.
Definition: qgsrectangle.h:42
Contains information about the context of a rendering operation.
QPainter * painter()
Returns the destination QPainter for the render operation.
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to painter units (pixels).
Stores metadata about one renderer class.
virtual QgsFeatureRenderer * createRendererFromSld(QDomElement &elem, QgsWkbTypes::GeometryType geomType)
virtual QgsFeatureRenderer * createRenderer(QDomElement &elem, const QgsReadWriteContext &context)=0
Returns new instance of the renderer given the DOM element.
QgsRendererAbstractMetadata * rendererMetadata(const QString &rendererName)
Returns the metadata for a specified renderer.
An interface for classes which can visit style entity (e.g.
VertexMarkerType
Editing vertex markers.
static void drawVertexMarker(double x, double y, QPainter &p, QgsSymbolLayerUtils::VertexMarkerType type, int markerSize)
Draws a vertex symbol at (painter) coordinates x, y.
int layer() const
The layer of this symbol level.
QgsSymbol * mSymbol
Definition: qgsrenderer.h:78
QgsSymbol * symbol() const
The symbol of this symbol level.
Abstract base class for all rendered symbols.
Definition: qgssymbol.h:38
void renderFeature(const QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false, int currentVertexMarkerType=0, double currentVertexMarkerSize=0.0) SIP_THROW(QgsCsException)
Render a feature.
Definition: qgssymbol.cpp:903
static QPointF _getPoint(QgsRenderContext &context, const QgsPoint &point)
Creates a point in screen coordinates from a QgsPoint in map coordinates.
Definition: qgssymbol.h:639
static QgsSymbol * defaultSymbol(QgsWkbTypes::GeometryType geomType)
Returns a new default symbol for the specified geometry type.
Definition: qgssymbol.cpp:355
Qgis::SymbolType type() const
Returns the symbol's type.
Definition: qgssymbol.h:97
@ RenderMillimeters
Millimeters.
Definition: qgsunittypes.h:169
Represents a vector layer which manages a vector based data sets.
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
Definition: qgswkbtypes.h:141
const QgsField & field
Definition: qgsfield.h:463
QList< QgsLegendSymbolItem > QgsLegendSymbolList
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39
#define RENDERER_TAG_NAME
Definition: qgsrenderer.h:49
QList< QgsSymbol * > QgsSymbolList
Definition: qgsrenderer.h:43