QGIS API Documentation 3.99.0-Master (d270888f95f)
Loading...
Searching...
No Matches
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
18#include <algorithm>
19
20#include "qgsapplication.h"
21#include "qgsfeature.h"
23#include "qgslinesymbol.h"
24#include "qgslogger.h"
25#include "qgsmarkersymbol.h"
26#include "qgspainteffect.h"
28#include "qgspoint.h"
29#include "qgsproperty.h"
30#include "qgsrendercontext.h"
31#include "qgsrendererregistry.h"
33#include "qgssldexportcontext.h"
34#include "qgssymbol.h"
35#include "qgssymbollayerutils.h"
36#include "qgsvectorlayer.h"
37
38#include <QDomDocument>
39#include <QDomElement>
40#include <QPolygonF>
41#include <QString>
42#include <QThread>
43
44using namespace Qt::StringLiterals;
45
46QgsPropertiesDefinition QgsFeatureRenderer::sPropertyDefinitions;
47
49{
50 return QgsSymbol::_getPoint( context, point );
51}
52
54{
55 if ( !destRenderer )
56 return;
57
58 if ( mPaintEffect )
59 destRenderer->setPaintEffect( mPaintEffect->clone() );
60
61 destRenderer->setForceRasterRender( mForceRaster );
63 destRenderer->mOrderBy = mOrderBy;
64 destRenderer->mOrderByEnabled = mOrderByEnabled;
65 destRenderer->mReferenceScale = mReferenceScale;
66 destRenderer->mDataDefinedProperties = mDataDefinedProperties;
67}
68
70 : mType( type )
71{
73 mPaintEffect->setEnabled( false );
74}
75
80
82{
83 QgsFeatureRenderer::initPropertyDefinitions();
84 return sPropertyDefinitions;
85}
86
91
93{
94 return symbolForFeature( feature, context );
95}
96
97QSet< QString > QgsFeatureRenderer::legendKeysForFeature( const QgsFeature &feature, QgsRenderContext &context ) const
98{
99 Q_UNUSED( feature )
100 Q_UNUSED( context )
101 return QSet< QString >();
102}
103
105{
106#ifdef QGISDEBUG
107 if ( !mThread )
108 {
109 mThread = QThread::currentThread();
110 }
111 else
112 {
113 Q_ASSERT_X( mThread == QThread::currentThread(), "QgsFeatureRenderer::startRender", "startRender called in a different thread - use a cloned renderer instead" );
114 }
115#endif
116
117 mDataDefinedProperties.prepare( context.expressionContext() );
118}
119
121{
122 return false;
123}
124
126{
127#ifdef QGISDEBUG
128 Q_ASSERT_X( mThread == QThread::currentThread(), "QgsFeatureRenderer::stopRender", "stopRender called in a different thread - use a cloned renderer instead" );
129#endif
130}
131
133{
134 return false;
135}
136
138{
139 return false;
140}
141
142bool QgsFeatureRenderer::renderFeature( const QgsFeature &feature, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker )
143{
144#ifdef QGISDEBUG
145 Q_ASSERT_X( mThread == QThread::currentThread(), "QgsFeatureRenderer::renderFeature", "renderFeature called in a different thread - use a cloned renderer instead" );
146#endif
147
148 QgsSymbol *symbol = symbolForFeature( feature, context );
149 if ( !symbol )
150 return false;
151
152 renderFeatureWithSymbol( feature, symbol, context, layer, selected, drawVertexMarker );
153 return true;
154}
155
156void QgsFeatureRenderer::renderFeatureWithSymbol( const QgsFeature &feature, QgsSymbol *symbol, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker )
157{
158 symbol->renderFeature( feature, context, layer, selected, drawVertexMarker, mCurrentVertexMarkerType, mCurrentVertexMarkerSize );
159}
160
162{
163 return u"UNKNOWN RENDERER\n"_s;
164}
165
170
172{
173 Q_UNUSED( context )
174 return QgsSymbolList();
175}
176
178{
179 // <renderer-v2 type=""> ... </renderer-v2>
180
181 if ( element.isNull() )
182 return nullptr;
183
184 // load renderer
185 const QString rendererType = element.attribute( u"type"_s );
186
188 if ( !m )
189 return nullptr;
190
191 QgsFeatureRenderer *r = m->createRenderer( element, context );
192 if ( r )
193 {
194 r->setUsingSymbolLevels( element.attribute( u"symbollevels"_s, u"0"_s ).toInt() );
195 r->setForceRasterRender( element.attribute( u"forceraster"_s, u"0"_s ).toInt() );
196 r->setReferenceScale( element.attribute( u"referencescale"_s, u"-1"_s ).toDouble() );
197
198 //restore layer effect
199 const QDomElement effectElem = element.firstChildElement( u"effect"_s );
200 if ( !effectElem.isNull() )
201 {
202 r->setPaintEffect( QgsApplication::paintEffectRegistry()->createEffect( effectElem ) );
203 }
204
205 // restore order by
206 const QDomElement orderByElem = element.firstChildElement( u"orderby"_s );
207 r->mOrderBy.load( orderByElem );
208 r->setOrderByEnabled( element.attribute( u"enableorderby"_s, u"0"_s ).toInt() );
209
210 const QDomElement elemDataDefinedProperties = element.firstChildElement( u"data-defined-properties"_s );
211 if ( !elemDataDefinedProperties.isNull() )
212 r->mDataDefinedProperties.readXml( elemDataDefinedProperties, propertyDefinitions() );
213 }
214 return r;
215}
216
217QDomElement QgsFeatureRenderer::save( QDomDocument &doc, const QgsReadWriteContext &context )
218{
219 Q_UNUSED( context )
220 // create empty renderer element
221 QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
222
223 saveRendererData( doc, rendererElem, context );
224
225 return rendererElem;
226}
227
228void QgsFeatureRenderer::saveRendererData( QDomDocument &doc, QDomElement &rendererElem, const QgsReadWriteContext & )
229{
230 rendererElem.setAttribute( u"forceraster"_s, ( mForceRaster ? u"1"_s : u"0"_s ) );
231 rendererElem.setAttribute( u"symbollevels"_s, ( mUsingSymbolLevels ? u"1"_s : u"0"_s ) );
232 rendererElem.setAttribute( u"referencescale"_s, mReferenceScale );
233
234 QDomElement elemDataDefinedProperties = doc.createElement( u"data-defined-properties"_s );
235 mDataDefinedProperties.writeXml( elemDataDefinedProperties, propertyDefinitions() );
236 rendererElem.appendChild( elemDataDefinedProperties );
237
239 mPaintEffect->saveProperties( doc, rendererElem );
240
241 if ( !mOrderBy.isEmpty() )
242 {
243 QDomElement orderBy = doc.createElement( u"orderby"_s );
244 mOrderBy.save( orderBy );
245 rendererElem.appendChild( orderBy );
246 }
247 rendererElem.setAttribute( u"enableorderby"_s, ( mOrderByEnabled ? u"1"_s : u"0"_s ) );
248}
249
250QgsFeatureRenderer *QgsFeatureRenderer::loadSld( const QDomNode &node, Qgis::GeometryType geomType, QString &errorMessage )
251{
252 const QDomElement element = node.toElement();
253 if ( element.isNull() )
254 return nullptr;
255
256 // get the UserStyle element
257 const QDomElement userStyleElem = element.firstChildElement( u"UserStyle"_s );
258 if ( userStyleElem.isNull() )
259 {
260 // UserStyle element not found, nothing will be rendered
261 errorMessage = u"Info: UserStyle element not found."_s;
262 return nullptr;
263 }
264
265 // get the FeatureTypeStyle element
266 QDomElement featTypeStyleElem = userStyleElem.firstChildElement( u"FeatureTypeStyle"_s );
267 if ( featTypeStyleElem.isNull() )
268 {
269 errorMessage = u"Info: FeatureTypeStyle element not found."_s;
270 return nullptr;
271 }
272
273 // create empty FeatureTypeStyle element to merge Rule's from all FeatureTypeStyle's
274 QDomElement mergedFeatTypeStyle = featTypeStyleElem.cloneNode( false ).toElement();
275
276 // use the RuleRenderer when more rules are present or the rule
277 // has filters or min/max scale denominators set,
278 // otherwise use the SingleSymbol renderer
279 bool needRuleRenderer = false;
280 int ruleCount = 0;
281
282 while ( !featTypeStyleElem.isNull() )
283 {
284 QDomElement ruleElem = featTypeStyleElem.firstChildElement( u"Rule"_s );
285 while ( !ruleElem.isNull() )
286 {
287 // test rule children element to check if we need to create RuleRenderer
288 // and if the rule has a symbolizer
289 bool hasRendererSymbolizer = false;
290 bool hasRuleRenderer = false;
291 QDomElement ruleChildElem = ruleElem.firstChildElement();
292 while ( !ruleChildElem.isNull() )
293 {
294 // rule has filter or min/max scale denominator, use the RuleRenderer
295 if ( ruleChildElem.localName() == "Filter"_L1 ||
296 ruleChildElem.localName() == "ElseFilter"_L1 ||
297 ruleChildElem.localName() == "MinScaleDenominator"_L1 ||
298 ruleChildElem.localName() == "MaxScaleDenominator"_L1 )
299 {
300 hasRuleRenderer = true;
301 }
302 // rule has a renderer symbolizer, not a text symbolizer
303 else if ( ruleChildElem.localName().endsWith( "Symbolizer"_L1 ) &&
304 ruleChildElem.localName() != "TextSymbolizer"_L1 )
305 {
306 QgsDebugMsgLevel( u"Symbolizer element found and not a TextSymbolizer"_s, 2 );
307 hasRendererSymbolizer = true;
308 }
309
310 ruleChildElem = ruleChildElem.nextSiblingElement();
311 }
312
313 if ( hasRendererSymbolizer )
314 {
315 ruleCount++;
316
317 // append a clone of all Rules to the merged FeatureTypeStyle element
318 mergedFeatTypeStyle.appendChild( ruleElem.cloneNode().toElement() );
319
320 if ( hasRuleRenderer )
321 {
322 QgsDebugMsgLevel( u"Filter or Min/MaxScaleDenominator element found: need a RuleRenderer"_s, 2 );
323 needRuleRenderer = true;
324 }
325 }
326
327 // more rules present, use the RuleRenderer
328 if ( ruleCount > 1 )
329 {
330 QgsDebugMsgLevel( u"more Rule elements found: need a RuleRenderer"_s, 2 );
331 needRuleRenderer = true;
332 }
333
334 ruleElem = ruleElem.nextSiblingElement( u"Rule"_s );
335 }
336 featTypeStyleElem = featTypeStyleElem.nextSiblingElement( u"FeatureTypeStyle"_s );
337 }
338
339 QString rendererType;
340 if ( needRuleRenderer )
341 {
342 rendererType = u"RuleRenderer"_s;
343 }
344 else
345 {
346 rendererType = u"singleSymbol"_s;
347 }
348 QgsDebugMsgLevel( u"Instantiating a '%1' renderer..."_s.arg( rendererType ), 2 );
349
350 // create the renderer and return it
352 if ( !m )
353 {
354 errorMessage = u"Error: Unable to get metadata for '%1' renderer."_s.arg( rendererType );
355 return nullptr;
356 }
357
358 QgsFeatureRenderer *r = m->createRendererFromSld( mergedFeatTypeStyle, geomType );
359 return r;
360}
361
362void QgsFeatureRenderer::toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const
363{
364 QgsSldExportContext context;
365 context.setExtraProperties( props );
366 toSld( doc, element, context );
367}
368
369bool QgsFeatureRenderer::toSld( QDomDocument &, QDomElement &, QgsSldExportContext &context ) const
370{
371 context.pushError( QObject::tr( "Vector %1 renderer cannot be converted to SLD" ).arg( type() ) );
372 return false;
373}
374
376{
377 // build up a list of unique legend keys
378 const QgsLegendSymbolList allLegendSymbols = legendSymbolItems();
379 QSet< QString > keys;
380 keys.reserve( allLegendSymbols.size() );
381 for ( const QgsLegendSymbolItem &symbol : allLegendSymbols )
382 {
383 keys.insert( symbol.ruleKey() );
384 }
385 return keys;
386}
387
388QDomElement QgsFeatureRenderer::writeSld( QDomDocument &doc, const QString &styleName, const QVariantMap &props ) const
389{
390 QDomElement userStyleElem = doc.createElement( u"UserStyle"_s );
391
392 QDomElement nameElem = doc.createElement( u"se:Name"_s );
393 nameElem.appendChild( doc.createTextNode( styleName ) );
394 userStyleElem.appendChild( nameElem );
395
396 QDomElement featureTypeStyleElem = doc.createElement( u"se:FeatureTypeStyle"_s );
397 QgsSldExportContext context;
398 context.setExtraProperties( props );
399
400 toSld( doc, featureTypeStyleElem, context );
401 userStyleElem.appendChild( featureTypeStyleElem );
402
403 return userStyleElem;
404}
405
407{
408 return false;
409}
410
412{
413 Q_UNUSED( key )
414 return false;
415}
416
417void QgsFeatureRenderer::checkLegendSymbolItem( const QString &key, bool state )
418{
419 Q_UNUSED( key )
420 Q_UNUSED( state )
421}
422
423void QgsFeatureRenderer::setLegendSymbolItem( const QString &key, QgsSymbol *symbol )
424{
425 Q_UNUSED( key )
426 delete symbol;
427}
428
429QString QgsFeatureRenderer::legendKeyToExpression( const QString &, QgsVectorLayer *, bool &ok ) const
430{
431 ok = false;
432 return QString();
433}
434
439
441{
442 const QgsSymbolList symbolList = symbols( context );
443
444 if ( symbolList.empty() )
445 return 0;
446
447 QgsExpressionContext &expContext = context.expressionContext();
448
449 auto getValueFromSymbol = [ &expContext, &context ]( const QgsSymbol * sym ) -> double
450 {
451 const QgsProperty property = sym->dataDefinedProperties().property( QgsSymbol::Property::ExtentBuffer );
452
453 double value = 0.0;
454
455 if ( property.isActive() )
456 {
457 expContext.setOriginalValueVariable( sym->extentBuffer() );
458
459 value = sym->dataDefinedProperties().valueAsDouble( QgsSymbol::Property::ExtentBuffer, expContext, sym->extentBuffer() );
460 if ( value < 0 )
461 value = 0;
462 }
463 else
464 {
465 value = sym->extentBuffer();
466 }
467
468 if ( sym->extentBufferSizeUnit() != Qgis::RenderUnit::MapUnits )
469 {
470 value = context.convertToMapUnits( value, sym->extentBufferSizeUnit(), sym->mapUnitScale() );
471 }
472
473 return value;
474 };
475
476 if ( symbolList.size() == 1 )
477 return getValueFromSymbol( symbolList[0] );
478
479 auto it = std::max_element( symbolList.constBegin(), symbolList.constEnd(), [ &getValueFromSymbol ]( const QgsSymbol * a, const QgsSymbol * b ) -> bool
480 {
481 return getValueFromSymbol( a ) < getValueFromSymbol( b );
482 } );
483
484 return getValueFromSymbol( *it );
485}
486
487QList<QgsLayerTreeModelLegendNode *> QgsFeatureRenderer::createLegendNodes( QgsLayerTreeLayer *nodeLayer ) const
488{
489 QList<QgsLayerTreeModelLegendNode *> nodes;
490
491 const QgsLegendSymbolList symbolItems = legendSymbolItems();
492 nodes.reserve( symbolItems.size() );
493
494 for ( const QgsLegendSymbolItem &item : symbolItems )
495 {
496 if ( const QgsDataDefinedSizeLegend *dataDefinedSizeLegendSettings = item.dataDefinedSizeLegendSettings() )
497 {
498 nodes << new QgsDataDefinedSizeLegendNode( nodeLayer, *dataDefinedSizeLegendSettings );
499 }
500 else
501 {
502 nodes << new QgsSymbolLegendNode( nodeLayer, item );
503 }
504 }
505 return nodes;
506}
507
513
515{
516 return nullptr != symbolForFeature( feature, context );
517}
518
520{
522 QgsSymbolLayerUtils::drawVertexMarker( pt.x(), pt.y(), *context.painter(),
524 markerSize );
525}
526
528{
529 const auto constPts = pts;
530 for ( const QPointF pt : constPts )
531 renderVertexMarker( pt, context );
532}
533
534void QgsFeatureRenderer::renderVertexMarkerPolygon( QPolygonF &pts, QList<QPolygonF> *rings, QgsRenderContext &context )
535{
536 const auto constPts = pts;
537 for ( const QPointF pt : constPts )
538 renderVertexMarker( pt, context );
539
540 if ( rings )
541 {
542 const auto constRings = *rings;
543 for ( const QPolygonF &ring : constRings )
544 {
545 const auto constRing = ring;
546 for ( const QPointF pt : constRing )
547 renderVertexMarker( pt, context );
548 }
549 }
550}
551
553{
554 QgsSymbolList lst;
555 QgsSymbol *s = symbolForFeature( feature, context );
556 if ( s ) lst.append( s );
557 return lst;
558}
559
561{
562 double extentBuffer = maximumExtentBuffer( context );
563
564 extent.grow( extentBuffer );
565}
566
568{
569 QgsSymbolList lst;
570 QgsSymbol *s = originalSymbolForFeature( feature, context );
571 if ( s ) lst.append( s );
572 return lst;
573}
574
579
581{
582 mPaintEffect.reset( effect );
583
584}
585
587{
588 mDataDefinedProperties.setProperty( key, property );
589}
590
595
600
602{
603 return mOrderByEnabled;
604}
605
607{
608 mOrderByEnabled = enabled;
609}
610
612{
613 delete subRenderer;
614}
615
617{
618 return nullptr;
619}
620
622{
623 return true;
624}
625
626void QgsFeatureRenderer::convertSymbolSizeScale( QgsSymbol *symbol, Qgis::ScaleMethod method, const QString &field )
627{
628 if ( symbol->type() == Qgis:: SymbolType::Marker )
629 {
630 QgsMarkerSymbol *s = static_cast<QgsMarkerSymbol *>( symbol );
631 if ( Qgis::ScaleMethod::ScaleArea == method )
632 {
633 s->setDataDefinedSize( QgsProperty::fromExpression( "coalesce(sqrt(" + QString::number( s->size() ) + " * (" + field + ")),0)" ) );
634 }
635 else
636 {
637 s->setDataDefinedSize( QgsProperty::fromExpression( "coalesce(" + QString::number( s->size() ) + " * (" + field + "),0)" ) );
638 }
640 }
641 else if ( symbol->type() == Qgis::SymbolType::Line )
642 {
643 QgsLineSymbol *s = static_cast<QgsLineSymbol *>( symbol );
644 s->setDataDefinedWidth( QgsProperty::fromExpression( "coalesce(" + QString::number( s->width() ) + " * (" + field + "),0)" ) );
645 }
646}
647
648void QgsFeatureRenderer::convertSymbolRotation( QgsSymbol *symbol, const QString &field )
649{
650 if ( symbol->type() == Qgis::SymbolType::Marker )
651 {
652 QgsMarkerSymbol *s = static_cast<QgsMarkerSymbol *>( symbol );
654 ? QString::number( s->angle() ) + " + "
655 : QString() ) + field );
656 s->setDataDefinedAngle( dd );
657 }
658}
659
660void QgsFeatureRenderer::initPropertyDefinitions()
661{
662 if ( !sPropertyDefinitions.isEmpty() )
663 return;
664
665 QString origin = u"renderer"_s;
666
667 sPropertyDefinitions = QgsPropertiesDefinition
668 {
669 { static_cast< int >( QgsFeatureRenderer::Property::HeatmapRadius ), QgsPropertyDefinition( "heatmapRadius", QObject::tr( "Radius" ), QgsPropertyDefinition::DoublePositive, origin )},
670 { static_cast< int >( QgsFeatureRenderer::Property::HeatmapMaximum ), QgsPropertyDefinition( "heatmapMaximum", QObject::tr( "Maximum" ), QgsPropertyDefinition::DoublePositive, origin )},
671 };
672}
673
675{
676 return mSymbol;
677}
678
680{
681 return mLayer;
682}
ScaleMethod
Scale methods.
Definition qgis.h:643
@ ScaleDiameter
Calculate scale by the diameter.
Definition qgis.h:645
@ ScaleArea
Calculate scale by the area.
Definition qgis.h:644
QFlags< FeatureRendererFlag > FeatureRendererFlags
Flags controlling behavior of vector feature renderers.
Definition qgis.h:857
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
Definition qgis.h:365
@ Millimeters
Millimeters.
Definition qgis.h:5256
@ MapUnits
Map units.
Definition qgis.h:5257
VertexMarkerType
Editing vertex markers, used for showing vertices during a edit operation.
Definition qgis.h:1891
@ Marker
Marker symbol.
Definition qgis.h:630
@ Line
Line symbol.
Definition qgis.h:631
virtual bool readXml(const QDomElement &collectionElem, const QgsPropertiesDefinition &definitions)
Reads property collection state from 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.
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.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:60
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:53
Definition for a property.
Definition qgsproperty.h:47
@ DoublePositive
Positive double value (including 0).
Definition qgsproperty.h:58
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:87
QgsSymbol * symbol() const
The symbol of this symbol level.
Abstract base class for all rendered symbols.
Definition qgssymbol.h:231
@ ExtentBuffer
Extent buffer.
Definition qgssymbol.h:272
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:948
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:63
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.
#define RENDERER_TAG_NAME
Definition qgsrenderer.h:57
QList< QgsSymbol * > QgsSymbolList
Definition qgsrenderer.h:51