QGIS API Documentation 3.43.0-Master (56aa1fd18d7)
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
20#include "qgssinglesymbolrenderer.h" // for default renderer
21
22#include "qgsrendererregistry.h"
23
24#include "qgsrendercontext.h"
25#include "qgsfeature.h"
26#include "qgslogger.h"
27#include "qgsvectorlayer.h"
28#include "qgspainteffect.h"
30#include "qgspoint.h"
31#include "qgsproperty.h"
32#include "qgsapplication.h"
33#include "qgsmarkersymbol.h"
34#include "qgslinesymbol.h"
36#include "qgssldexportcontext.h"
37
38#include <QDomElement>
39#include <QDomDocument>
40#include <QPolygonF>
41#include <QThread>
42#include <algorithm>
43
44QgsPropertiesDefinition QgsFeatureRenderer::sPropertyDefinitions;
45
47{
48 return QgsSymbol::_getPoint( context, point );
49}
50
52{
53 if ( !destRenderer )
54 return;
55
56 if ( mPaintEffect )
57 destRenderer->setPaintEffect( mPaintEffect->clone() );
58
59 destRenderer->setForceRasterRender( mForceRaster );
61 destRenderer->mOrderBy = mOrderBy;
62 destRenderer->mOrderByEnabled = mOrderByEnabled;
63 destRenderer->mReferenceScale = mReferenceScale;
64 destRenderer->mDataDefinedProperties = mDataDefinedProperties;
65}
66
68 : mType( type )
69{
71 mPaintEffect->setEnabled( false );
72}
73
78
80{
81 QgsFeatureRenderer::initPropertyDefinitions();
82 return sPropertyDefinitions;
83}
84
89
91{
92 return symbolForFeature( feature, context );
93}
94
95QSet< QString > QgsFeatureRenderer::legendKeysForFeature( const QgsFeature &feature, QgsRenderContext &context ) const
96{
97 Q_UNUSED( feature )
98 Q_UNUSED( context )
99 return QSet< QString >();
100}
101
103{
104#ifdef QGISDEBUG
105 if ( !mThread )
106 {
107 mThread = QThread::currentThread();
108 }
109 else
110 {
111 Q_ASSERT_X( mThread == QThread::currentThread(), "QgsFeatureRenderer::startRender", "startRender called in a different thread - use a cloned renderer instead" );
112 }
113#endif
114
115 mDataDefinedProperties.prepare( context.expressionContext() );
116}
117
119{
120 return false;
121}
122
124{
125#ifdef QGISDEBUG
126 Q_ASSERT_X( mThread == QThread::currentThread(), "QgsFeatureRenderer::stopRender", "stopRender called in a different thread - use a cloned renderer instead" );
127#endif
128}
129
131{
132 return false;
133}
134
136{
137 return false;
138}
139
140bool QgsFeatureRenderer::renderFeature( const QgsFeature &feature, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker )
141{
142#ifdef QGISDEBUG
143 Q_ASSERT_X( mThread == QThread::currentThread(), "QgsFeatureRenderer::renderFeature", "renderFeature called in a different thread - use a cloned renderer instead" );
144#endif
145
146 QgsSymbol *symbol = symbolForFeature( feature, context );
147 if ( !symbol )
148 return false;
149
150 renderFeatureWithSymbol( feature, symbol, context, layer, selected, drawVertexMarker );
151 return true;
152}
153
154void QgsFeatureRenderer::renderFeatureWithSymbol( const QgsFeature &feature, QgsSymbol *symbol, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker )
155{
156 symbol->renderFeature( feature, context, layer, selected, drawVertexMarker, mCurrentVertexMarkerType, mCurrentVertexMarkerSize );
157}
158
160{
161 return QStringLiteral( "UNKNOWN RENDERER\n" );
162}
163
168
170{
171 Q_UNUSED( context )
172 return QgsSymbolList();
173}
174
176{
177 // <renderer-v2 type=""> ... </renderer-v2>
178
179 if ( element.isNull() )
180 return nullptr;
181
182 // load renderer
183 const QString rendererType = element.attribute( QStringLiteral( "type" ) );
184
186 if ( !m )
187 return nullptr;
188
189 QgsFeatureRenderer *r = m->createRenderer( element, context );
190 if ( r )
191 {
192 r->setUsingSymbolLevels( element.attribute( QStringLiteral( "symbollevels" ), QStringLiteral( "0" ) ).toInt() );
193 r->setForceRasterRender( element.attribute( QStringLiteral( "forceraster" ), QStringLiteral( "0" ) ).toInt() );
194 r->setReferenceScale( element.attribute( QStringLiteral( "referencescale" ), QStringLiteral( "-1" ) ).toDouble() );
195
196 //restore layer effect
197 const QDomElement effectElem = element.firstChildElement( QStringLiteral( "effect" ) );
198 if ( !effectElem.isNull() )
199 {
200 r->setPaintEffect( QgsApplication::paintEffectRegistry()->createEffect( effectElem ) );
201 }
202
203 // restore order by
204 const QDomElement orderByElem = element.firstChildElement( QStringLiteral( "orderby" ) );
205 r->mOrderBy.load( orderByElem );
206 r->setOrderByEnabled( element.attribute( QStringLiteral( "enableorderby" ), QStringLiteral( "0" ) ).toInt() );
207
208 const QDomElement elemDataDefinedProperties = element.firstChildElement( QStringLiteral( "data-defined-properties" ) );
209 if ( !elemDataDefinedProperties.isNull() )
210 r->mDataDefinedProperties.readXml( elemDataDefinedProperties, propertyDefinitions() );
211 }
212 return r;
213}
214
215QDomElement QgsFeatureRenderer::save( QDomDocument &doc, const QgsReadWriteContext &context )
216{
217 Q_UNUSED( context )
218 // create empty renderer element
219 QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
220
221 saveRendererData( doc, rendererElem, context );
222
223 return rendererElem;
224}
225
226void QgsFeatureRenderer::saveRendererData( QDomDocument &doc, QDomElement &rendererElem, const QgsReadWriteContext & )
227{
228 rendererElem.setAttribute( QStringLiteral( "forceraster" ), ( mForceRaster ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ) );
229 rendererElem.setAttribute( QStringLiteral( "symbollevels" ), ( mUsingSymbolLevels ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ) );
230 rendererElem.setAttribute( QStringLiteral( "referencescale" ), mReferenceScale );
231
232 QDomElement elemDataDefinedProperties = doc.createElement( QStringLiteral( "data-defined-properties" ) );
233 mDataDefinedProperties.writeXml( elemDataDefinedProperties, propertyDefinitions() );
234 rendererElem.appendChild( elemDataDefinedProperties );
235
237 mPaintEffect->saveProperties( doc, rendererElem );
238
239 if ( !mOrderBy.isEmpty() )
240 {
241 QDomElement orderBy = doc.createElement( QStringLiteral( "orderby" ) );
243 rendererElem.appendChild( orderBy );
244 }
245 rendererElem.setAttribute( QStringLiteral( "enableorderby" ), ( mOrderByEnabled ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ) );
246}
247
248QgsFeatureRenderer *QgsFeatureRenderer::loadSld( const QDomNode &node, Qgis::GeometryType geomType, QString &errorMessage )
249{
250 const QDomElement element = node.toElement();
251 if ( element.isNull() )
252 return nullptr;
253
254 // get the UserStyle element
255 const QDomElement userStyleElem = element.firstChildElement( QStringLiteral( "UserStyle" ) );
256 if ( userStyleElem.isNull() )
257 {
258 // UserStyle element not found, nothing will be rendered
259 errorMessage = QStringLiteral( "Info: UserStyle element not found." );
260 return nullptr;
261 }
262
263 // get the FeatureTypeStyle element
264 QDomElement featTypeStyleElem = userStyleElem.firstChildElement( QStringLiteral( "FeatureTypeStyle" ) );
265 if ( featTypeStyleElem.isNull() )
266 {
267 errorMessage = QStringLiteral( "Info: FeatureTypeStyle element not found." );
268 return nullptr;
269 }
270
271 // create empty FeatureTypeStyle element to merge Rule's from all FeatureTypeStyle's
272 QDomElement mergedFeatTypeStyle = featTypeStyleElem.cloneNode( false ).toElement();
273
274 // use the RuleRenderer when more rules are present or the rule
275 // has filters or min/max scale denominators set,
276 // otherwise use the SingleSymbol renderer
277 bool needRuleRenderer = false;
278 int ruleCount = 0;
279
280 while ( !featTypeStyleElem.isNull() )
281 {
282 QDomElement ruleElem = featTypeStyleElem.firstChildElement( QStringLiteral( "Rule" ) );
283 while ( !ruleElem.isNull() )
284 {
285 // test rule children element to check if we need to create RuleRenderer
286 // and if the rule has a symbolizer
287 bool hasRendererSymbolizer = false;
288 bool hasRuleRenderer = false;
289 QDomElement ruleChildElem = ruleElem.firstChildElement();
290 while ( !ruleChildElem.isNull() )
291 {
292 // rule has filter or min/max scale denominator, use the RuleRenderer
293 if ( ruleChildElem.localName() == QLatin1String( "Filter" ) ||
294 ruleChildElem.localName() == QLatin1String( "ElseFilter" ) ||
295 ruleChildElem.localName() == QLatin1String( "MinScaleDenominator" ) ||
296 ruleChildElem.localName() == QLatin1String( "MaxScaleDenominator" ) )
297 {
298 hasRuleRenderer = true;
299 }
300 // rule has a renderer symbolizer, not a text symbolizer
301 else if ( ruleChildElem.localName().endsWith( QLatin1String( "Symbolizer" ) ) &&
302 ruleChildElem.localName() != QLatin1String( "TextSymbolizer" ) )
303 {
304 QgsDebugMsgLevel( QStringLiteral( "Symbolizer element found and not a TextSymbolizer" ), 2 );
305 hasRendererSymbolizer = true;
306 }
307
308 ruleChildElem = ruleChildElem.nextSiblingElement();
309 }
310
311 if ( hasRendererSymbolizer )
312 {
313 ruleCount++;
314
315 // append a clone of all Rules to the merged FeatureTypeStyle element
316 mergedFeatTypeStyle.appendChild( ruleElem.cloneNode().toElement() );
317
318 if ( hasRuleRenderer )
319 {
320 QgsDebugMsgLevel( QStringLiteral( "Filter or Min/MaxScaleDenominator element found: need a RuleRenderer" ), 2 );
321 needRuleRenderer = true;
322 }
323 }
324
325 // more rules present, use the RuleRenderer
326 if ( ruleCount > 1 )
327 {
328 QgsDebugMsgLevel( QStringLiteral( "more Rule elements found: need a RuleRenderer" ), 2 );
329 needRuleRenderer = true;
330 }
331
332 ruleElem = ruleElem.nextSiblingElement( QStringLiteral( "Rule" ) );
333 }
334 featTypeStyleElem = featTypeStyleElem.nextSiblingElement( QStringLiteral( "FeatureTypeStyle" ) );
335 }
336
337 QString rendererType;
338 if ( needRuleRenderer )
339 {
340 rendererType = QStringLiteral( "RuleRenderer" );
341 }
342 else
343 {
344 rendererType = QStringLiteral( "singleSymbol" );
345 }
346 QgsDebugMsgLevel( QStringLiteral( "Instantiating a '%1' renderer..." ).arg( rendererType ), 2 );
347
348 // create the renderer and return it
350 if ( !m )
351 {
352 errorMessage = QStringLiteral( "Error: Unable to get metadata for '%1' renderer." ).arg( rendererType );
353 return nullptr;
354 }
355
356 QgsFeatureRenderer *r = m->createRendererFromSld( mergedFeatTypeStyle, geomType );
357 return r;
358}
359
360void QgsFeatureRenderer::toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const
361{
362 QgsSldExportContext context;
363 context.setExtraProperties( props );
364 toSld( doc, element, context );
365}
366
367bool QgsFeatureRenderer::toSld( QDomDocument &, QDomElement &, QgsSldExportContext &context ) const
368{
369 context.pushError( QObject::tr( "Vector %1 renderer cannot be converted to SLD" ).arg( type() ) );
370 return false;
371}
372
374{
375 // build up a list of unique legend keys
376 const QgsLegendSymbolList allLegendSymbols = legendSymbolItems();
377 QSet< QString > keys;
378 keys.reserve( allLegendSymbols.size() );
379 for ( const QgsLegendSymbolItem &symbol : allLegendSymbols )
380 {
381 keys.insert( symbol.ruleKey() );
382 }
383 return keys;
384}
385
386QDomElement QgsFeatureRenderer::writeSld( QDomDocument &doc, const QString &styleName, const QVariantMap &props ) const
387{
388 QDomElement userStyleElem = doc.createElement( QStringLiteral( "UserStyle" ) );
389
390 QDomElement nameElem = doc.createElement( QStringLiteral( "se:Name" ) );
391 nameElem.appendChild( doc.createTextNode( styleName ) );
392 userStyleElem.appendChild( nameElem );
393
394 QDomElement featureTypeStyleElem = doc.createElement( QStringLiteral( "se:FeatureTypeStyle" ) );
395 QgsSldExportContext context;
396 context.setExtraProperties( props );
397
398 toSld( doc, featureTypeStyleElem, context );
399 userStyleElem.appendChild( featureTypeStyleElem );
400
401 return userStyleElem;
402}
403
405{
406 return false;
407}
408
410{
411 Q_UNUSED( key )
412 return false;
413}
414
415void QgsFeatureRenderer::checkLegendSymbolItem( const QString &key, bool state )
416{
417 Q_UNUSED( key )
418 Q_UNUSED( state )
419}
420
421void QgsFeatureRenderer::setLegendSymbolItem( const QString &key, QgsSymbol *symbol )
422{
423 Q_UNUSED( key )
424 delete symbol;
425}
426
427QString QgsFeatureRenderer::legendKeyToExpression( const QString &, QgsVectorLayer *, bool &ok ) const
428{
429 ok = false;
430 return QString();
431}
432
437
439{
440 const QgsSymbolList symbolList = symbols( context );
441
442 if ( symbolList.empty() )
443 return 0;
444
445 QgsExpressionContext &expContext = context.expressionContext();
446
447 auto getValueFromSymbol = [ &expContext, &context ]( const QgsSymbol * sym ) -> double
448 {
449 const QgsProperty property = sym->dataDefinedProperties().property( QgsSymbol::Property::ExtentBuffer );
450
451 double value = 0.0;
452
453 if ( property.isActive() )
454 {
455 expContext.setOriginalValueVariable( sym->extentBuffer() );
456
457 value = sym->dataDefinedProperties().valueAsDouble( QgsSymbol::Property::ExtentBuffer, expContext, sym->extentBuffer() );
458 if ( value < 0 )
459 value = 0;
460 }
461 else
462 {
463 value = sym->extentBuffer();
464 }
465
466 if ( sym->extentBufferSizeUnit() != Qgis::RenderUnit::MapUnits )
467 {
468 value = context.convertToMapUnits( value, sym->extentBufferSizeUnit(), sym->mapUnitScale() );
469 }
470
471 return value;
472 };
473
474 if ( symbolList.size() == 1 )
475 return getValueFromSymbol( symbolList[0] );
476
477 auto it = std::max_element( symbolList.constBegin(), symbolList.constEnd(), [ &getValueFromSymbol ]( const QgsSymbol * a, const QgsSymbol * b ) -> bool
478 {
479 return getValueFromSymbol( a ) < getValueFromSymbol( b );
480 } );
481
482 return getValueFromSymbol( *it );
483}
484
485QList<QgsLayerTreeModelLegendNode *> QgsFeatureRenderer::createLegendNodes( QgsLayerTreeLayer *nodeLayer ) const
486{
487 QList<QgsLayerTreeModelLegendNode *> nodes;
488
489 const QgsLegendSymbolList symbolItems = legendSymbolItems();
490 nodes.reserve( symbolItems.size() );
491
492 for ( const QgsLegendSymbolItem &item : symbolItems )
493 {
494 if ( const QgsDataDefinedSizeLegend *dataDefinedSizeLegendSettings = item.dataDefinedSizeLegendSettings() )
495 {
496 nodes << new QgsDataDefinedSizeLegendNode( nodeLayer, *dataDefinedSizeLegendSettings );
497 }
498 else
499 {
500 nodes << new QgsSymbolLegendNode( nodeLayer, item );
501 }
502 }
503 return nodes;
504}
505
511
513{
514 return nullptr != symbolForFeature( feature, context );
515}
516
518{
520 QgsSymbolLayerUtils::drawVertexMarker( pt.x(), pt.y(), *context.painter(),
522 markerSize );
523}
524
526{
527 const auto constPts = pts;
528 for ( const QPointF pt : constPts )
529 renderVertexMarker( pt, context );
530}
531
532void QgsFeatureRenderer::renderVertexMarkerPolygon( QPolygonF &pts, QList<QPolygonF> *rings, QgsRenderContext &context )
533{
534 const auto constPts = pts;
535 for ( const QPointF pt : constPts )
536 renderVertexMarker( pt, context );
537
538 if ( rings )
539 {
540 const auto constRings = *rings;
541 for ( const QPolygonF &ring : constRings )
542 {
543 const auto constRing = ring;
544 for ( const QPointF pt : constRing )
545 renderVertexMarker( pt, context );
546 }
547 }
548}
549
551{
552 QgsSymbolList lst;
553 QgsSymbol *s = symbolForFeature( feature, context );
554 if ( s ) lst.append( s );
555 return lst;
556}
557
559{
560 double extentBuffer = maximumExtentBuffer( context );
561
562 extent.grow( extentBuffer );
563}
564
566{
567 QgsSymbolList lst;
568 QgsSymbol *s = originalSymbolForFeature( feature, context );
569 if ( s ) lst.append( s );
570 return lst;
571}
572
577
579{
580 mPaintEffect.reset( effect );
581
582}
583
585{
586 mDataDefinedProperties.setProperty( key, property );
587}
588
593
598
600{
601 return mOrderByEnabled;
602}
603
605{
606 mOrderByEnabled = enabled;
607}
608
610{
611 delete subRenderer;
612}
613
615{
616 return nullptr;
617}
618
620{
621 return true;
622}
623
624void QgsFeatureRenderer::convertSymbolSizeScale( QgsSymbol *symbol, Qgis::ScaleMethod method, const QString &field )
625{
626 if ( symbol->type() == Qgis:: SymbolType::Marker )
627 {
628 QgsMarkerSymbol *s = static_cast<QgsMarkerSymbol *>( symbol );
629 if ( Qgis::ScaleMethod::ScaleArea == method )
630 {
631 s->setDataDefinedSize( QgsProperty::fromExpression( "coalesce(sqrt(" + QString::number( s->size() ) + " * (" + field + ")),0)" ) );
632 }
633 else
634 {
635 s->setDataDefinedSize( QgsProperty::fromExpression( "coalesce(" + QString::number( s->size() ) + " * (" + field + "),0)" ) );
636 }
638 }
639 else if ( symbol->type() == Qgis::SymbolType::Line )
640 {
641 QgsLineSymbol *s = static_cast<QgsLineSymbol *>( symbol );
642 s->setDataDefinedWidth( QgsProperty::fromExpression( "coalesce(" + QString::number( s->width() ) + " * (" + field + "),0)" ) );
643 }
644}
645
646void QgsFeatureRenderer::convertSymbolRotation( QgsSymbol *symbol, const QString &field )
647{
648 if ( symbol->type() == Qgis::SymbolType::Marker )
649 {
650 QgsMarkerSymbol *s = static_cast<QgsMarkerSymbol *>( symbol );
652 ? QString::number( s->angle() ) + " + "
653 : QString() ) + field );
654 s->setDataDefinedAngle( dd );
655 }
656}
657
658void QgsFeatureRenderer::initPropertyDefinitions()
659{
660 if ( !sPropertyDefinitions.isEmpty() )
661 return;
662
663 QString origin = QStringLiteral( "renderer" );
664
665 sPropertyDefinitions = QgsPropertiesDefinition
666 {
667 { static_cast< int >( QgsFeatureRenderer::Property::HeatmapRadius ), QgsPropertyDefinition( "heatmapRadius", QObject::tr( "Radius" ), QgsPropertyDefinition::DoublePositive, origin )},
668 { static_cast< int >( QgsFeatureRenderer::Property::HeatmapMaximum ), QgsPropertyDefinition( "heatmapMaximum", QObject::tr( "Maximum" ), QgsPropertyDefinition::DoublePositive, origin )},
669 };
670}
671
673{
674 return mSymbol;
675}
676
678{
679 return mLayer;
680}
ScaleMethod
Scale methods.
Definition qgis.h:588
@ ScaleDiameter
Calculate scale by the diameter.
@ ScaleArea
Calculate scale by the area.
QFlags< FeatureRendererFlag > FeatureRendererFlags
Flags controlling behavior of vector feature renderers.
Definition qgis.h:802
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
Definition qgis.h:337
@ Millimeters
Millimeters.
@ MapUnits
Map units.
VertexMarkerType
Editing vertex markers, used for showing vertices during a edit operation.
Definition qgis.h:1796
@ Marker
Marker symbol.
@ Line
Line symbol.
virtual bool readXml(const QDomElement &collectionElem, const QgsPropertiesDefinition &definitions)
Reads property collection state from an XML element.
virtual bool writeXml(QDomElement &collectionElem, const QgsPropertiesDefinition &definitions) const
Writes the current state of the property collection into an XML element.
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.
A legend node with a marker symbol.
Object that keeps configuration of appearance of marker symbol's data-defined size in legend.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for the context.
Abstract base class for all 2D vector feature 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
virtual bool canSkipRender()
Returns true if the renderer can be entirely skipped, i.e.
static QPointF _getPoint(QgsRenderContext &context, const QgsPoint &point)
Creates a point in screen coordinates from a wkb string in map coordinates.
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.
void setOrderByEnabled(bool enabled)
Sets whether custom ordering should be applied before features are processed by this renderer.
virtual bool legendSymbolItemsCheckable() const
Returns true if symbology items in legend are checkable.
virtual void modifyRequestExtent(QgsRectangle &extent, QgsRenderContext &context)
Allows for a renderer to modify the extent of a feature request prior to rendering.
virtual bool legendSymbolItemChecked(const QString &key)
Returns true if the legend symbology item with the specified key 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.
virtual QList< QgsLayerTreeModelLegendNode * > createLegendNodes(QgsLayerTreeLayer *nodeLayer) const
Returns a list of legend nodes to be used for the legend for the renderer.
QgsFeatureRenderer(const QString &type)
static QgsFeatureRenderer * defaultRenderer(Qgis::GeometryType geomType)
Returns a new renderer - used by default in vector layers.
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.
virtual QgsSymbolList symbols(QgsRenderContext &context) const
Returns list of symbols used by the renderer.
virtual Qgis::FeatureRendererFlags flags() const
Returns flags associated with the renderer.
virtual void stopRender(QgsRenderContext &context)
Must be called when a render cycle has finished, to allow the renderer to clean up.
Property
Data definable properties for renderers.
@ HeatmapRadius
Heatmap renderer radius.
@ HeatmapMaximum
Heatmap maximum value.
virtual QSet< QString > legendKeysForFeature(const QgsFeature &feature, QgsRenderContext &context) const
Returns legend keys matching a specified feature.
QString type() const
double maximumExtentBuffer(QgsRenderContext &context) const
Returns the maximum extent buffer found in this renderer's symbols.
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.
virtual bool renderFeature(const QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false)
Render a feature using this renderer in the given context.
virtual QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context)
Stores renderer properties to an XML element.
void setReferenceScale(double scale)
Sets the symbology reference scale.
virtual QString dump() const
Returns debug information about this renderer.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the symbol property definitions.
void setUsingSymbolLevels(bool usingSymbolLevels)
virtual ~QgsFeatureRenderer()
virtual QgsSymbol * symbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const =0
To be overridden.
virtual void checkLegendSymbolItem(const QString &key, bool state=true)
Sets whether the legend symbology item with the specified ley should be checked.
virtual QString legendKeyToExpression(const QString &key, QgsVectorLayer *layer, bool &ok) const
Attempts to convert the specified legend rule key to a QGIS expression matching the features displaye...
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.
virtual Q_DECL_DEPRECATED void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props=QVariantMap()) const
Used from subclasses to create SLD Rule elements following SLD v1.1 specs.
static void convertSymbolRotation(QgsSymbol *symbol, const QString &field)
Converts old rotation expressions to symbol level data defined angles.
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...
QgsFeatureRequest::OrderBy mOrderBy
virtual QgsSymbol * originalSymbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const
Returns symbol for feature.
Qgis::VertexMarkerType mCurrentVertexMarkerType
The current type of editing marker.
QSet< QString > legendKeys() const
Returns the set of all legend keys used by the renderer.
virtual bool willRenderFeature(const QgsFeature &feature, QgsRenderContext &context) const
Returns whether the renderer will render a feature or not.
void saveRendererData(QDomDocument &doc, QDomElement &element, const QgsReadWriteContext &context)
Saves generic renderer data into the specified element.
void renderFeatureWithSymbol(const QgsFeature &feature, QgsSymbol *symbol, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker)
Render the feature with the symbol using context.
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.
std::unique_ptr< QgsPaintEffect > mPaintEffect
virtual void startRender(QgsRenderContext &context, const QgsFields &fields)
Must be called when a new render cycle is started.
void setDataDefinedProperty(Property key, const QgsProperty &property)
Sets a data defined property for the renderer.
static void convertSymbolSizeScale(QgsSymbol *symbol, Qgis::ScaleMethod method, const QString &field)
Converts old sizeScale expressions to symbol level data defined sizes.
void setVertexMarkerAppearance(Qgis::VertexMarkerType type, double size)
Sets type and size of editing vertex markers for subsequent rendering.
QgsFeatureRequest::OrderBy orderBy() const
Gets the order in which features shall be processed by this renderer.
static QgsFeatureRenderer * loadSld(const QDomNode &node, Qgis::GeometryType geomType, QString &errorMessage)
Create a new renderer according to the information contained in the UserStyle element of a SLD style ...
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:58
Container of fields for a vector layer.
Definition qgsfields.h:46
Layer tree node points to a map layer.
Stores information about one class/rule of a vector layer renderer in a unified way that can be used ...
A line symbol type, for rendering LineString and MultiLineString geometries.
void setDataDefinedWidth(const QgsProperty &property) const
Set data defined width for whole symbol (including all symbol layers).
double width() const
Returns the estimated width for the whole symbol, which is the maximum width of all marker symbol lay...
A marker symbol type, for rendering Point and MultiPoint geometries.
void setScaleMethod(Qgis::ScaleMethod scaleMethod) const
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) const
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.
Point geometry type, with support for z-dimension and m-values.
Definition qgspoint.h:49
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
bool prepare(const QgsExpressionContext &context=QgsExpressionContext()) const final
Prepares the collection against a specified expression context.
Definition for a property.
Definition qgsproperty.h:45
@ DoublePositive
Positive double value (including 0)
Definition qgsproperty.h:56
A store for object properties.
static QgsProperty fromExpression(const QString &expression, bool isActive=true)
Returns a new ExpressionBasedProperty created from the specified expression.
A container for the context for various read/write operations on objects.
A rectangle specified with double values.
void grow(double delta)
Grows the rectangle in place by the specified amount.
Contains information about the context of a rendering operation.
double convertToMapUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to map units.
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
QPainter * painter()
Returns the destination QPainter for the render operation.
QgsExpressionContext & expressionContext()
Gets the expression context.
Stores metadata about one renderer class.
virtual QgsFeatureRenderer * createRenderer(QDomElement &elem, const QgsReadWriteContext &context)=0
Returns new instance of the renderer given the DOM element.
virtual QgsFeatureRenderer * createRendererFromSld(QDomElement &elem, Qgis::GeometryType geomType)
Returns a new instance of the renderer, converted from an SLD XML element.
QgsRendererAbstractMetadata * rendererMetadata(const QString &rendererName)
Returns the metadata for a specified renderer.
A feature renderer which renders all features with the same symbol.
Holds SLD export options and other information related to SLD export of a QGIS layer style.
void setExtraProperties(const QVariantMap &properties)
Sets the open ended set of properties that can drive/inform the SLD encoding.
void pushError(const QString &error)
Pushes a error message generated during the conversion.
An interface for classes which can visit style entity (e.g.
static void drawVertexMarker(double x, double y, QPainter &p, Qgis::VertexMarkerType type, int markerSize)
Draws a vertex symbol at (painter) coordinates x, y.
Implementation of legend node interface for displaying preview of vector symbols and their labels and...
int layer() const
The layer of this symbol level.
QgsSymbol * mSymbol
Definition qgsrenderer.h:84
QgsSymbol * symbol() const
The symbol of this symbol level.
Abstract base class for all rendered symbols.
Definition qgssymbol.h:231
@ ExtentBuffer
Extent buffer.
void renderFeature(const QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false, Qgis::VertexMarkerType currentVertexMarkerType=Qgis::VertexMarkerType::SemiTransparentCircle, double currentVertexMarkerSize=0.0)
Render a feature.
static QPointF _getPoint(QgsRenderContext &context, const QgsPoint &point)
Creates a point in screen coordinates from a QgsPoint in map coordinates.
Definition qgssymbol.h:933
Qgis::SymbolType type() const
Returns the symbol's type.
Definition qgssymbol.h:294
static QgsSymbol * defaultSymbol(Qgis::GeometryType geomType)
Returns a new default symbol for the specified geometry type.
Represents a vector layer which manages a vector based dataset.
QList< QgsLegendSymbolItem > QgsLegendSymbolList
#define QgsDebugMsgLevel(str, level)
Definition qgslogger.h:41
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.
#define RENDERER_TAG_NAME
Definition qgsrenderer.h:54
QList< QgsSymbol * > QgsSymbolList
Definition qgsrenderer.h:48