QGIS API Documentation 3.37.0-Master (df6056bf1be)
Loading...
Searching...
No Matches
qgsrenderer.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsrenderer.h
3 ---------------------
4 begin : November 2009
5 copyright : (C) 2009 by Martin Dobias
6 email : wonder dot sk at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#ifndef QGSRENDERER_H
17#define QGSRENDERER_H
18
19#include "qgis_core.h"
20#include "qgis_sip.h"
21#include "qgis.h"
22#include "qgsrectangle.h"
23#include "qgsfields.h"
24#include "qgsfeaturerequest.h"
25#include "qgsconfig.h"
27
28#include <QList>
29#include <QString>
30#include <QVariant>
31#include <QPair>
32#include <QPixmap>
33#include <QDomDocument>
34#include <QDomElement>
35
36class QgsFeature;
37class QgsVectorLayer;
38class QgsPaintEffect;
44
45typedef QMap<QString, QString> QgsStringMap SIP_SKIP;
46
47typedef QList<QgsSymbol *> QgsSymbolList;
48typedef QMap<QString, QgsSymbol * > QgsSymbolMap SIP_SKIP;
49
50#include "qgslegendsymbolitem.h"
51
52
53#define RENDERER_TAG_NAME "renderer-v2"
54
56// symbol levels
57
62class CORE_EXPORT QgsSymbolLevelItem
63{
64 public:
65 QgsSymbolLevelItem( QgsSymbol *symbol, int layer )
66 : mSymbol( symbol )
67 , mLayer( layer )
68 {}
69
73 QgsSymbol *symbol() const;
74
78 int layer() const;
79
80 // TODO QGIS 4.0 -> make private
81 protected:
82 QgsSymbol *mSymbol = nullptr;
83 int mLayer;
84};
85
86// every level has list of items: symbol + symbol layer num
87typedef QList< QgsSymbolLevelItem > QgsSymbolLevel;
88
89// this is a list of levels
90#ifndef SIP_RUN
91typedef QList< QgsSymbolLevel > QgsSymbolLevelOrder;
92#else
93typedef QList< QList< QgsSymbolLevelItem > > QgsSymbolLevelOrder;
94#endif
95
96
98// renderers
99
104class CORE_EXPORT QgsFeatureRenderer
105{
106
107#ifdef SIP_RUN
109
110 const QString type = sipCpp->type();
111
112 if ( type == QLatin1String( "singleSymbol" ) )
113 sipType = sipType_QgsSingleSymbolRenderer;
114 else if ( type == QLatin1String( "categorizedSymbol" ) )
115 sipType = sipType_QgsCategorizedSymbolRenderer;
116 else if ( type == QLatin1String( "graduatedSymbol" ) )
117 sipType = sipType_QgsGraduatedSymbolRenderer;
118 else if ( type == QLatin1String( "RuleRenderer" ) )
119 sipType = sipType_QgsRuleBasedRenderer;
120 else if ( type == QLatin1String( "heatmapRenderer" ) )
121 sipType = sipType_QgsHeatmapRenderer;
122 else if ( type == QLatin1String( "invertedPolygonRenderer" ) )
123 sipType = sipType_QgsInvertedPolygonRenderer;
124 else if ( type == QLatin1String( "pointCluster" ) )
125 sipType = sipType_QgsPointClusterRenderer;
126 else if ( type == QLatin1String( "pointDisplacement" ) )
127 sipType = sipType_QgsPointDisplacementRenderer;
128 else if ( type == QLatin1String( "25dRenderer" ) )
129 sipType = sipType_Qgs25DRenderer;
130 else if ( type == QLatin1String( "nullSymbol" ) )
131 sipType = sipType_QgsNullSymbolRenderer;
132 else if ( type == QLatin1String( "embeddedSymbol" ) )
133 sipType = sipType_QgsEmbeddedSymbolRenderer;
134 else
135 sipType = 0;
136 SIP_END
137#endif
138
139 public:
140
146 enum class Property : int
147 {
148 HeatmapRadius,
149 HeatmapMaximum,
150 };
151
156 static const QgsPropertiesDefinition &propertyDefinitions();
157
158 // renderer takes ownership of its symbols!
159
161 static QgsFeatureRenderer *defaultRenderer( Qgis::GeometryType geomType ) SIP_FACTORY;
162
163 QString type() const { return mType; }
164
173 virtual QgsSymbol *symbolForFeature( const QgsFeature &feature, QgsRenderContext &context ) const = 0;
174
180 virtual QgsSymbol *originalSymbolForFeature( const QgsFeature &feature, QgsRenderContext &context ) const;
181
185 virtual QSet< QString > legendKeysForFeature( const QgsFeature &feature, QgsRenderContext &context ) const;
186
199 virtual void startRender( QgsRenderContext &context, const QgsFields &fields );
200
211 virtual void stopRender( QgsRenderContext &context );
212
221 virtual bool canSkipRender();
222
234 virtual QString filter( const QgsFields &fields = QgsFields() ) { Q_UNUSED( fields ) return QString(); }
235
242 virtual QSet<QString> usedAttributes( const QgsRenderContext &context ) const = 0;
243
250 virtual bool usesEmbeddedSymbols() const;
251
255 virtual bool filterNeedsGeometry() const;
256
257 virtual ~QgsFeatureRenderer();
258
266
280 virtual bool renderFeature( const QgsFeature &feature, QgsRenderContext &context, int layer = -1, bool selected = false, bool drawVertexMarker = false ) SIP_THROW( QgsCsException );
281
283 virtual QString dump() const;
284
290 {
291 SymbolLevels = 1,
292 MoreSymbolsPerFeature = 1 << 2,
293 Filter = 1 << 3,
294 ScaleDependent = 1 << 4
295 };
296
297 Q_DECLARE_FLAGS( Capabilities, Capability )
298
299
312
317 virtual QgsSymbolList symbols( QgsRenderContext &context ) const;
318
319 bool usingSymbolLevels() const { return mUsingSymbolLevels; }
320 void setUsingSymbolLevels( bool usingSymbolLevels ) { mUsingSymbolLevels = usingSymbolLevels; }
321
323 static QgsFeatureRenderer *load( QDomElement &symbologyElem, const QgsReadWriteContext &context ) SIP_FACTORY;
324
331 virtual QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context );
332
336 virtual QDomElement writeSld( QDomDocument &doc, const QString &styleName, const QVariantMap &props = QVariantMap() ) const;
337
349 static QgsFeatureRenderer *loadSld( const QDomNode &node, Qgis::GeometryType geomType, QString &errorMessage ) SIP_FACTORY;
350
352 virtual void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props = QVariantMap() ) const
353 {
354 element.appendChild( doc.createComment( QStringLiteral( "FeatureRenderer %1 not implemented yet" ).arg( type() ) ) );
355 ( void ) props; // warning avoidance
356 }
357
365 QSet< QString > legendKeys() const;
366
371 virtual bool legendSymbolItemsCheckable() const;
372
380 virtual bool legendSymbolItemChecked( const QString &key );
381
389 virtual void checkLegendSymbolItem( const QString &key, bool state = true );
390
399 virtual void setLegendSymbolItem( const QString &key, QgsSymbol *symbol SIP_TRANSFER );
400
415 virtual QString legendKeyToExpression( const QString &key, QgsVectorLayer *layer, bool &ok SIP_OUT ) const;
416
423 virtual QgsLegendSymbolList legendSymbolItems() const;
424
436 virtual QList<QgsLayerTreeModelLegendNode *> createLegendNodes( QgsLayerTreeLayer *nodeLayer ) const SIP_FACTORY;
437
441 virtual QString legendClassificationAttribute() const { return QString(); }
442
444 void setVertexMarkerAppearance( Qgis::VertexMarkerType type, double size );
445
451 virtual bool willRenderFeature( const QgsFeature &feature, QgsRenderContext &context ) const;
452
458 virtual QgsSymbolList symbolsForFeature( const QgsFeature &feature, QgsRenderContext &context ) const;
459
464 virtual QgsSymbolList originalSymbolsForFeature( const QgsFeature &feature, QgsRenderContext &context ) const;
465
472 virtual void modifyRequestExtent( QgsRectangle &extent, QgsRenderContext &context );
473
479 QgsPaintEffect *paintEffect() const;
480
486 void setPaintEffect( QgsPaintEffect *effect SIP_TRANSFER );
487
492 bool forceRasterRender() const { return mForceRaster; }
493
501 void setForceRasterRender( bool forceRaster ) { mForceRaster = forceRaster; }
502
512 void setDataDefinedProperty( Property key, const QgsProperty &property );
513
522 QgsPropertyCollection &dataDefinedProperties() { return mDataDefinedProperties; }
523
531 const QgsPropertyCollection &dataDefinedProperties() const { return mDataDefinedProperties; } SIP_SKIP
532
542 void setDataDefinedProperties( const QgsPropertyCollection &collection ) { mDataDefinedProperties = collection; }
543
558 double referenceScale() const { return mReferenceScale; }
559
574 void setReferenceScale( double scale ) { mReferenceScale = scale; }
575
581 QgsFeatureRequest::OrderBy orderBy() const;
582
588 void setOrderBy( const QgsFeatureRequest::OrderBy &orderBy );
589
595 bool orderByEnabled() const;
596
603 void setOrderByEnabled( bool enabled );
604
611 virtual void setEmbeddedRenderer( QgsFeatureRenderer *subRenderer SIP_TRANSFER );
612
618 virtual const QgsFeatureRenderer *embeddedRenderer() const;
619
629 virtual bool accept( QgsStyleEntityVisitorInterface *visitor ) const;
630
646 void copyRendererData( QgsFeatureRenderer *destRenderer ) const;
647
648 protected:
649 QgsFeatureRenderer( const QString &type );
650
657 void renderFeatureWithSymbol( const QgsFeature &feature, QgsSymbol *symbol, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker ) SIP_THROW( QgsCsException );
658
660 void renderVertexMarker( QPointF pt, QgsRenderContext &context );
662 void renderVertexMarkerPolyline( QPolygonF &pts, QgsRenderContext &context );
664 void renderVertexMarkerPolygon( QPolygonF &pts, QList<QPolygonF> *rings, QgsRenderContext &context );
665
670 static QPointF _getPoint( QgsRenderContext &context, const QgsPoint &point );
671
680 void saveRendererData( QDomDocument &doc, QDomElement &element, const QgsReadWriteContext &context );
681
682 QString mType;
683
684 bool mUsingSymbolLevels = false;
685
688
690 double mCurrentVertexMarkerSize = 2;
691
692 QgsPaintEffect *mPaintEffect = nullptr;
693
694 bool mForceRaster = false;
695
696 double mReferenceScale = -1.0;
697
702 static void convertSymbolSizeScale( QgsSymbol *symbol, Qgis::ScaleMethod method, const QString &field );
703
708 static void convertSymbolRotation( QgsSymbol *symbol, const QString &field );
709
711
712 bool mOrderByEnabled = false;
713
714 private:
715#ifdef SIP_RUN
717 QgsFeatureRenderer &operator=( const QgsFeatureRenderer & );
718#endif
719
720 static void initPropertyDefinitions();
722 static QgsPropertiesDefinition sPropertyDefinitions;
723
724#ifdef QGISDEBUG
726 QThread *mThread = nullptr;
727#endif
728
729 QgsPropertyCollection mDataDefinedProperties;
730
731 Q_DISABLE_COPY( QgsFeatureRenderer )
732};
733
735
736// for some reason SIP compilation fails if these lines are not included:
739
740#endif // QGSRENDERER_H
ScaleMethod
Scale methods.
Definition qgis.h:434
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
Definition qgis.h:274
VertexMarkerType
Editing vertex markers, used for showing vertices during a edit operation.
Definition qgis.h:1500
@ Cross
Cross marker.
Custom exception class for Coordinate Reference System related exceptions.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the renderer's property collection, used for data defined overrides.
virtual QString filter(const QgsFields &fields=QgsFields())
If a renderer does not require all the features this method may be overridden and return an expressio...
bool forceRasterRender() const
Returns whether the renderer must render as a raster.
void setForceRasterRender(bool forceRaster)
Sets whether the renderer should be rendered to a raster destination.
Property
Data definable properties for renderers.
QFlags< Capability > Capabilities
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
virtual QString legendClassificationAttribute() const
If supported by the renderer, return classification attribute for the use in legend.
QString type() const
double referenceScale() const
Returns the symbology reference scale.
void setReferenceScale(double scale)
Sets the symbology reference scale.
bool usingSymbolLevels() const
virtual QSet< QString > usedAttributes(const QgsRenderContext &context) const =0
Returns a list of attributes required by this renderer.
void setUsingSymbolLevels(bool usingSymbolLevels)
virtual QgsSymbol * symbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const =0
To be overridden.
Capability
Used to specify details about a renderer.
const QgsPropertyCollection & dataDefinedProperties() const
Returns a reference to the renderer's property collection, used for data defined overrides.
QgsFeatureRequest::OrderBy mOrderBy
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the renderer's property collection, used for data defined overrides.
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
Represents a list of OrderByClauses, with the most important first and the least important last.
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.
The QgsLegendRendererItem class is abstract interface for legend items returned from QgsMapLayerLegen...
Base class for effect properties widgets.
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
A grouped map of multiple QgsProperty objects, each referenced by a integer key value.
A store for object properties.
The class is used as a container of context for various read/write operations on other objects.
A rectangle specified with double values.
Contains information about the context of a rendering operation.
Base class for renderer settings widgets.
An interface for classes which can visit style entity (e.g.
QgsSymbolLevelItem(QgsSymbol *symbol, int layer)
Definition qgsrenderer.h:65
Abstract base class for all rendered symbols.
Definition qgssymbol.h:94
Represents a vector layer which manages a vector based data sets.
QMap< QString, QString > QgsStringMap
Definition qgis.h:5983
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition qgis_sip.h:191
#define SIP_ENUM_BASETYPE(type)
Definition qgis_sip.h:278
#define SIP_SKIP
Definition qgis_sip.h:126
#define SIP_TRANSFER
Definition qgis_sip.h:36
#define SIP_OUT
Definition qgis_sip.h:58
#define SIP_FACTORY
Definition qgis_sip.h:76
#define SIP_THROW(name,...)
Definition qgis_sip.h:203
#define SIP_END
Definition qgis_sip.h:208
QList< QgsLegendSymbolItem > QgsLegendSymbolList
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.
QList< QgsSymbolLevel > QgsSymbolLevelOrder
Definition qgsrenderer.h:91
QList< QgsSymbolLevelItem > QgsSymbolLevel
Definition qgsrenderer.h:87
QMap< QString, QgsSymbol * > QgsSymbolMap
Definition qgsrenderer.h:48
QList< QgsSymbol * > QgsSymbolList
Definition qgsrenderer.h:47
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsTextRendererUtils::CurvedTextFlags)