QGIS API Documentation 3.43.0-Master (56aa1fd18d7)
qgsrulebasedrenderer.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsrulebasedrenderer.h - Rule-based renderer (symbology)
3 ---------------------
4 begin : May 2010
5 copyright : (C) 2010 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 QGSRULEBASEDRENDERER_H
17#define QGSRULEBASEDRENDERER_H
18
19#include "qgis_core.h"
20#include "qgis_sip.h"
21#include "qgsfields.h"
22#include "qgsfeature.h"
23#include "qgis.h"
24
25#include "qgsrenderer.h"
26#include "qgsrendercontext.h"
27
28class QgsExpression;
29
32
40class CORE_EXPORT QgsRuleBasedRenderer : public QgsFeatureRenderer
41{
42 public:
43 // TODO: use QVarLengthArray instead of QList
44
46 {
47 FeatIsSelected = 1,
48 FeatDrawMarkers = 2
49 };
50
56 {
57 FeatureToRender( const QgsFeature &_f, int _flags )
58 : feat( _f )
59 , flags( _flags )
60 {}
62 int flags; // selected and/or draw markers
63 };
64
69 struct RenderJob
70 {
71
78 : ftr( _ftr )
79 , symbol( _s )
80 {}
81
84
86 QgsSymbol *symbol = nullptr;
87
88 private:
89#ifdef SIP_RUN
90 RenderJob &operator=( const RenderJob & );
91#endif
92 };
93
99 {
100 explicit RenderLevel( int z )
101 : zIndex( z )
102 {}
103
104 ~RenderLevel() { qDeleteAll( jobs ); }
106
108 QList<QgsRuleBasedRenderer::RenderJob *> jobs;
109
111 {
112 zIndex = rh.zIndex;
113 qDeleteAll( jobs );
114 jobs.clear();
115 for ( auto it = rh.jobs.constBegin(); it != rh.jobs.constEnd(); ++it )
116 {
117 jobs << new RenderJob( *( *it ) );
118 }
119 return *this;
120 }
121
123 : zIndex( other.zIndex ), jobs()
124 {
125 for ( auto it = other.jobs.constBegin(); it != other.jobs.constEnd(); ++it )
126 {
127 jobs << new RenderJob( * ( *it ) );
128 }
129 }
130
131 };
132
134 typedef QList<QgsRuleBasedRenderer::RenderLevel> RenderQueue;
135
136 class Rule;
137 typedef QList<QgsRuleBasedRenderer::Rule *> RuleList;
138
149 class CORE_EXPORT Rule
150 {
151 public:
154 {
155 Filtered = 0,
157 Rendered
158 };
159
161 Rule( QgsSymbol *symbol SIP_TRANSFER, int maximumScale = 0, int minimumScale = 0, const QString &filterExp = QString(),
162 const QString &label = QString(), const QString &description = QString(), bool elseRule = false );
163 ~Rule();
164
165 Rule( const Rule &rh ) = delete;
166 Rule &operator=( const Rule &rh ) = delete;
167
173 QString dump( int indent = 0 ) const;
174
179 QSet<QString> usedAttributes( const QgsRenderContext &context ) const;
180
184 bool needsGeometry() const;
185
189 QgsSymbolList symbols( const QgsRenderContext &context = QgsRenderContext() ) const;
190
191 QgsLegendSymbolList legendSymbolItems( int currentLevel = -1 ) const;
192
200 bool isFilterOK( const QgsFeature &f, QgsRenderContext *context = nullptr ) const;
201
209 bool isScaleOK( double scale ) const;
210
211 QgsSymbol *symbol() { return mSymbol.get(); }
212 QString label() const { return mLabel; }
213 bool dependsOnScale() const { return mMaximumScale != 0 || mMinimumScale != 0; }
214
222 double maximumScale() const { return mMaximumScale; }
223
231 double minimumScale() const { return mMinimumScale; }
232
237 QgsExpression *filter() const { return mFilter.get(); }
238
243 QString filterExpression() const { return mFilterExp; }
244
250 QString description() const { return mDescription; }
251
257 bool active() const { return mIsActive; }
258
262 QString ruleKey() const { return mRuleKey; }
263
267 void setRuleKey( const QString &key ) { mRuleKey = key; }
268
270 void setSymbol( QgsSymbol *sym SIP_TRANSFER );
271 void setLabel( const QString &label ) { mLabel = label; }
272
280 void setMinimumScale( double scale ) { mMinimumScale = scale; }
281
289 void setMaximumScale( double scale ) { mMaximumScale = scale; }
290
296 void setFilterExpression( const QString &filterExp );
297
303 void setDescription( const QString &description ) { mDescription = description; }
304
309 void setActive( bool state ) { mIsActive = state; }
310
313
319 Q_DECL_DEPRECATED void toSld( QDomDocument &doc, QDomElement &element, QVariantMap props ) const SIP_DEPRECATED;
320
326 bool toSld( QDomDocument &doc, QDomElement &element, QgsSldExportContext &context ) const;
327
331 static QgsRuleBasedRenderer::Rule *createFromSld( QDomElement &element, Qgis::GeometryType geomType ) SIP_FACTORY;
332
333 QDomElement save( QDomDocument &doc, QgsSymbolMap &symbolMap ) const;
334
336 bool startRender( QgsRenderContext &context, const QgsFields &fields, QString &filter );
337
345 bool hasActiveChildren() const;
346
348 QSet<int> collectZLevels();
349
354 void setNormZLevels( const QMap<int, int> &zLevelsToNormLevels ) SIP_SKIP;
355
365 QgsRuleBasedRenderer::Rule::RenderResult renderFeature( QgsRuleBasedRenderer::FeatureToRender &featToRender, QgsRenderContext &context, QgsRuleBasedRenderer::RenderQueue &renderQueue );
366
368 bool willRenderFeature( const QgsFeature &feature, QgsRenderContext *context = nullptr );
369
371 QgsSymbolList symbolsForFeature( const QgsFeature &feature, QgsRenderContext *context = nullptr );
372
376 QSet< QString > legendKeysForFeature( const QgsFeature &feature, QgsRenderContext *context = nullptr );
377
386 QgsRuleBasedRenderer::RuleList rulesForFeature( const QgsFeature &feature, QgsRenderContext *context = nullptr, bool onlyActive = true );
387
393 void stopRender( QgsRenderContext &context );
394
404 static QgsRuleBasedRenderer::Rule *create( QDomElement &ruleElem, QgsSymbolMap &symbolMap, bool reuseId = true ) SIP_FACTORY;
405
411 const QgsRuleBasedRenderer::RuleList &children() const { return mChildren; }
412
418 QgsRuleBasedRenderer::RuleList descendants() const;
419
425 QgsRuleBasedRenderer::Rule *parent() { return mParent; }
426
428 void appendChild( QgsRuleBasedRenderer::Rule *rule SIP_TRANSFER );
429
431 void insertChild( int i, QgsRuleBasedRenderer::Rule *rule SIP_TRANSFER );
432
434 void removeChild( QgsRuleBasedRenderer::Rule *rule );
435
437 void removeChildAt( int i );
438
441
443 QgsRuleBasedRenderer::Rule *takeChildAt( int i ) SIP_TRANSFERBACK;
444
448 QgsRuleBasedRenderer::Rule *findRuleByKey( const QString &key );
449
455 void setIsElse( bool iselse );
456
462 bool isElse() const { return mElseRule; }
463
473 bool accept( QgsStyleEntityVisitorInterface *visitor ) const;
474
475 protected:
476 void initFilter();
477
478 private:
479#ifdef SIP_RUN
480 Rule( const QgsRuleBasedRenderer::Rule &rh );
481#endif
482
483 Rule *mParent = nullptr; // parent rule (nullptr only for root rule)
484 std::unique_ptr< QgsSymbol > mSymbol;
485 double mMaximumScale = 0;
486 double mMinimumScale = 0;
487 QString mFilterExp, mLabel, mDescription;
488 bool mElseRule = false;
489 RuleList mChildren;
490 RuleList mElseRules;
491 bool mIsActive = true; // whether it is enabled or not
492
493 QString mRuleKey; // string used for unique identification of rule within renderer
494
495 // temporary
496 std::unique_ptr< QgsExpression > mFilter;
497 // temporary while rendering
498 QSet<int> mSymbolNormZLevels;
499 RuleList mActiveChildren;
500
505 void updateElseRules();
506 };
507
509
511 static QgsFeatureRenderer *create( QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
512
517
518 ~QgsRuleBasedRenderer() override;
519
521 QgsSymbol *symbolForFeature( const QgsFeature &feature, QgsRenderContext &context ) const override;
522
523 Qgis::FeatureRendererFlags flags() const override;
524 bool renderFeature( const QgsFeature &feature, QgsRenderContext &context, int layer = -1, bool selected = false, bool drawVertexMarker = false ) override SIP_THROW( QgsCsException );
525
526 void startRender( QgsRenderContext &context, const QgsFields &fields ) override;
527 bool canSkipRender() override;
528 void stopRender( QgsRenderContext &context ) override;
529
530 QString filter( const QgsFields &fields = QgsFields() ) override;
531
532 QSet<QString> usedAttributes( const QgsRenderContext &context ) const override;
533
534 bool filterNeedsGeometry() const override;
535
536 QgsRuleBasedRenderer *clone() const override SIP_FACTORY;
537
538 Q_DECL_DEPRECATED void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props = QVariantMap() ) const override SIP_DEPRECATED;
539 bool toSld( QDomDocument &doc, QDomElement &element, QgsSldExportContext &context ) const override;
540
544 static QgsFeatureRenderer *createFromSld( QDomElement &element, Qgis::GeometryType geomType ) SIP_FACTORY;
545
546 QgsSymbolList symbols( QgsRenderContext &context ) const override;
547
548 QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) override;
549 bool legendSymbolItemsCheckable() const override;
550 bool legendSymbolItemChecked( const QString &key ) override;
551 void checkLegendSymbolItem( const QString &key, bool state = true ) override;
552 QString legendKeyToExpression( const QString &key, QgsVectorLayer *layer, bool &ok ) const override;
553
554 void setLegendSymbolItem( const QString &key, QgsSymbol *symbol SIP_TRANSFER ) override;
555 QgsLegendSymbolList legendSymbolItems() const override;
556 QString dump() const override;
557 bool willRenderFeature( const QgsFeature &feature, QgsRenderContext &context ) const override;
558 QgsSymbolList symbolsForFeature( const QgsFeature &feature, QgsRenderContext &context ) const override;
559 QgsSymbolList originalSymbolsForFeature( const QgsFeature &feature, QgsRenderContext &context ) const override;
560 QSet<QString> legendKeysForFeature( const QgsFeature &feature, QgsRenderContext &context ) const override;
561 QgsFeatureRenderer::Capabilities capabilities() override { return MoreSymbolsPerFeature | Filter | ScaleDependent; }
562 bool accept( QgsStyleEntityVisitorInterface *visitor ) const override;
563
565
566 QgsRuleBasedRenderer::Rule *rootRule() { return mRootRule; }
567
569
571 static void refineRuleCategories( QgsRuleBasedRenderer::Rule *initialRule, QgsCategorizedSymbolRenderer *r );
573 static void refineRuleRanges( QgsRuleBasedRenderer::Rule *initialRule, QgsGraduatedSymbolRenderer *r );
575 static void refineRuleScales( QgsRuleBasedRenderer::Rule *initialRule, QList<int> scales );
576
584 static QgsRuleBasedRenderer *convertFromRenderer( const QgsFeatureRenderer *renderer, QgsVectorLayer *layer = nullptr ) SIP_FACTORY;
585
587 static void convertToDataDefinedSymbology( QgsSymbol *symbol, const QString &sizeScaleField, const QString &rotationField = QString() );
588
589 protected:
591 Rule *mRootRule = nullptr;
592
593 // temporary
594 RenderQueue mRenderQueue;
595 QList<FeatureToRender> mCurrentFeatures;
596
597 QString mFilter;
598
599 private:
600#ifdef SIP_RUN
602 QgsRuleBasedRenderer &operator=( const QgsRuleBasedRenderer & );
603#endif
604};
605
606#endif // QGSRULEBASEDRENDERER_H
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:54
QFlags< FeatureRendererFlag > FeatureRendererFlags
Flags controlling behavior of vector feature renderers.
Definition qgis.h:802
A feature renderer which represents features using a list of renderer categories.
Custom exception class for Coordinate Reference System related exceptions.
Handles parsing and evaluation of expressions (formerly called "search strings").
Abstract base class for all 2D vector feature renderers.
virtual QgsLegendSymbolList legendSymbolItems() const
Returns a list of symbology items for the legend.
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.
QFlags< Capability > Capabilities
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 QString dump() const
Returns debug information about this renderer.
virtual QSet< QString > usedAttributes(const QgsRenderContext &context) const =0
Returns a list of attributes required by this renderer.
virtual QgsSymbol * symbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const =0
To be overridden.
@ ScaleDependent
Depends on scale if feature will be rendered (rule based )
virtual bool accept(QgsStyleEntityVisitorInterface *visitor) const
Accepts the specified symbology visitor, causing it to visit all symbols associated with the renderer...
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
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
A vector feature renderer which uses numeric attributes to classify features into different ranges.
A container for the context for various read/write operations on objects.
Contains information about the context of a rendering operation.
Represents an individual rule for a rule-based renderer.
QString ruleKey() const
Unique rule identifier (for identification of rule within renderer)
void setDescription(const QString &description)
Set a human readable description for this rule.
RenderResult
The result of rendering a rule.
@ Inactive
The rule is inactive.
double maximumScale() const
Returns the maximum map scale (i.e.
QgsRuleBasedRenderer::Rule * parent()
The parent rule.
bool isElse() const
Check if this rule is an ELSE rule.
void setMaximumScale(double scale)
Sets the maximum map scale (i.e.
void setActive(bool state)
Sets if this rule is active.
Rule(const Rule &rh)=delete
Rule & operator=(const Rule &rh)=delete
QgsExpression * filter() const
A filter that will check if this rule applies.
double minimumScale() const
Returns the minimum map scale (i.e.
QString description() const
A human readable description for this rule.
void setMinimumScale(double scale)
Sets the minimum map scale (i.e.
void setLabel(const QString &label)
void setRuleKey(const QString &key)
Override the assigned rule key (should be used just internally by rule-based renderer)
QString filterExpression() const
A filter that will check if this rule applies.
bool active() const
Returns if this rule is active.
Rule based renderer.
QList< QgsRuleBasedRenderer::RenderLevel > RenderQueue
Rendering queue: a list of rendering levels.
QList< QgsRuleBasedRenderer::Rule * > RuleList
QgsRuleBasedRenderer::Rule * rootRule()
Holds SLD export options and other information related to SLD export of a QGIS layer style.
An interface for classes which can visit style entity (e.g.
Abstract base class for all rendered symbols.
Definition qgssymbol.h:231
Represents a vector layer which manages a vector based dataset.
#define SIP_DEPRECATED
Definition qgis_sip.h:106
#define SIP_SKIP
Definition qgis_sip.h:126
#define SIP_TRANSFER
Definition qgis_sip.h:36
#define SIP_TRANSFERBACK
Definition qgis_sip.h:48
#define SIP_FACTORY
Definition qgis_sip.h:76
#define SIP_THROW(name,...)
Definition qgis_sip.h:203
QList< QgsLegendSymbolItem > QgsLegendSymbolList
QMap< QString, QgsSymbol * > QgsSymbolMap
Definition qgsrenderer.h:49
QList< QgsSymbol * > QgsSymbolList
Definition qgsrenderer.h:48
Feature for rendering by a QgsRuleBasedRenderer.
FeatureToRender(const QgsFeature &_f, int _flags)
A QgsRuleBasedRenderer rendering job, consisting of a feature to be rendered with a particular symbol...
RenderJob(const QgsRuleBasedRenderer::FeatureToRender &_ftr, QgsSymbol *_s)
Constructor for a render job, with the specified feature to render and symbol.
QgsRuleBasedRenderer::FeatureToRender ftr
Feature to render.
Render level: a list of jobs to be drawn at particular level for a QgsRuleBasedRenderer.
QList< QgsRuleBasedRenderer::RenderJob * > jobs
List of jobs to render, owned by this object.
QgsRuleBasedRenderer::RenderLevel & operator=(const QgsRuleBasedRenderer::RenderLevel &rh)
RenderLevel(const QgsRuleBasedRenderer::RenderLevel &other)