QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
qgsrulebasedlabeling.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsrulebasedlabeling.h
3 ---------------------
4 begin : September 2015
5 copyright : (C) 2015 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#ifndef QGSRULEBASEDLABELING_H
16#define QGSRULEBASEDLABELING_H
17
18#include "qgis_core.h"
19#include <QStringList>
20#include <QMap>
21#include <QUuid>
22
25
26class QDomDocument;
27class QDomElement;
28
29class QgsExpression;
30class QgsFeature;
33class QgsGeometry;
35
43{
44 public:
45 class Rule;
46 typedef QList<QgsRuleBasedLabeling::Rule *> RuleList;
47 typedef QMap<QgsRuleBasedLabeling::Rule *, QgsVectorLayerLabelProvider *> RuleToProviderMap;
48
55 class CORE_EXPORT Rule
56 {
57 public:
59 Rule( QgsPalLayerSettings *settings SIP_TRANSFER, double maximumScale = 0, double minimumScale = 0, const QString &filterExp = QString(), const QString &description = QString(), bool elseRule = false );
60 ~Rule();
61
63 Rule( const Rule &rh ) = delete;
65 Rule &operator=( const Rule &rh ) = delete;
66
69 {
70 Filtered = 0,
72 Registered
73 };
74
78 QgsPalLayerSettings *settings() const { return mSettings.get(); }
79
85 bool dependsOnScale() const { return !qgsDoubleNear( mMinimumScale, 0.0 ) || !qgsDoubleNear( mMaximumScale, 0 ); }
86
95 double maximumScale() const { return mMaximumScale; }
96
105 double minimumScale() const { return mMinimumScale; }
106
111 QString filterExpression() const { return mFilterExp; }
112
118 QString description() const { return mDescription; }
119
125 bool active() const { return mIsActive; }
126
132 bool isElse() const { return mElseRule; }
133
135 QString ruleKey() const { return mRuleKey; }
136
139
147 void setMinimumScale( double scale ) { mMinimumScale = scale; }
148
156 void setMaximumScale( double scale ) { mMaximumScale = scale; }
157
163 void setFilterExpression( const QString &filterExp ) { mFilterExp = filterExp; initFilter(); }
164
170 void setDescription( const QString &description ) { mDescription = description; }
171
176 void setActive( bool state ) { mIsActive = state; }
177
183 void setIsElse( bool iselse ) { mElseRule = iselse; }
184
186 void setRuleKey( const QString &key ) { mRuleKey = key; }
187
188 // parent / child operations
189
195 const QgsRuleBasedLabeling::RuleList &children() const { return mChildren; }
196
203
209 QgsRuleBasedLabeling::RuleList descendants() const;
210
216 const QgsRuleBasedLabeling::Rule *parent() const SIP_SKIP { return mParent; }
217
223 QgsRuleBasedLabeling::Rule *parent() { return mParent; }
224
226 void appendChild( QgsRuleBasedLabeling::Rule *rule SIP_TRANSFER );
227
229 void insertChild( int i, QgsRuleBasedLabeling::Rule *rule SIP_TRANSFER );
230
232 void removeChildAt( int i );
233
235 const QgsRuleBasedLabeling::Rule *findRuleByKey( const QString &key ) const;
236
246 QgsRuleBasedLabeling::Rule *findRuleByKey( const QString &key ) SIP_SKIP;
247
250
251 // load / save
252
259 static QgsRuleBasedLabeling::Rule *create( const QDomElement &ruleElem, const QgsReadWriteContext &context ) SIP_FACTORY;
260
262 QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) const;
263
264 // evaluation
265
270 void createSubProviders( QgsVectorLayer *layer, RuleToProviderMap &subProviders, QgsRuleBasedLabelProvider *provider ) SIP_SKIP;
271
276 void subProviderIds( QStringList &list ) const SIP_SKIP;
277
282 void prepare( QgsRenderContext &context, QSet<QString> &attributeNames, RuleToProviderMap &subProviders ) SIP_SKIP;
283
293 std::tuple< RegisterResult, QList< QgsLabelFeature * > > registerFeature( const QgsFeature &feature, QgsRenderContext &context, RuleToProviderMap &subProviders, const QgsGeometry &obstacleGeometry = QgsGeometry(), const QgsSymbol *symbol = nullptr ) SIP_SKIP;
294
299 bool requiresAdvancedEffects() const;
300
310 bool accept( QgsStyleEntityVisitorInterface *visitor ) const;
311
312 private:
313#ifdef SIP_RUN
314 Rule( const QgsRuleBasedLabeling::Rule &rh );
315#endif
316
324 bool isFilterOK( const QgsFeature &f, QgsRenderContext &context ) const;
325
333 bool isScaleOK( double scale ) const;
334
338 void initFilter();
339
343 void updateElseRules();
344
345 private:
346 Rule *mParent = nullptr; // parent rule (nullptr only for root rule)
347 std::unique_ptr<QgsPalLayerSettings> mSettings;
348 double mMaximumScale = 0;
349 double mMinimumScale = 0;
350 QString mFilterExp;
351 QString mDescription;
352 bool mElseRule = false;
353 RuleList mChildren;
354 RuleList mElseRules;
355 bool mIsActive = true; // whether it is enabled or not
356
357 QString mRuleKey = QUuid::createUuid().toString(); // string used for unique identification of rule within labeling
358
359 std::unique_ptr<QgsExpression> mFilter;
360
361 };
362
363
366 ~QgsRuleBasedLabeling() override;
367
368 QgsRuleBasedLabeling::Rule *rootRule();
369 const Rule *rootRule() const SIP_SKIP;
370
372 static QgsRuleBasedLabeling *create( const QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
373
374 // implementation of parent interface
375
376 QString type() const override;
377 QgsRuleBasedLabeling *clone() const override SIP_FACTORY;
378 QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) const override;
380 QgsVectorLayerLabelProvider *provider( QgsVectorLayer *layer ) const override SIP_SKIP;
381 QStringList subProviders() const override;
382 QgsPalLayerSettings settings( const QString &providerId = QString() ) const override;
383 bool accept( QgsStyleEntityVisitorInterface *visitor ) const override;
384
393 void setSettings( QgsPalLayerSettings *settings SIP_TRANSFER, const QString &providerId = QString() ) override;
394 bool requiresAdvancedEffects() const override;
395 void toSld( QDomNode &parent, const QVariantMap &props ) const override;
396
397 protected:
398 std::unique_ptr<Rule> mRootRule;
399};
400
401#ifndef SIP_RUN
402
411{
412 public:
413 QgsRuleBasedLabelProvider( const QgsRuleBasedLabeling &rules, QgsVectorLayer *layer, bool withFeatureLoop = true );
414
415 // reimplemented
416
417 bool prepare( QgsRenderContext &context, QSet<QString> &attributeNames ) override;
418
419 QList< QgsLabelFeature * > registerFeature( const QgsFeature &feature, QgsRenderContext &context, const QgsGeometry &obstacleGeometry = QgsGeometry(), const QgsSymbol *symbol = nullptr ) override;
420
422 virtual QgsVectorLayerLabelProvider *createProvider( QgsVectorLayer *layer, const QString &providerId, bool withFeatureLoop, const QgsPalLayerSettings *settings );
423
425 QList<QgsAbstractLabelProvider *> subProviders() override;
426
427 protected:
429 std::unique_ptr<QgsRuleBasedLabeling> mRules;
432};
433
434#endif
435
436#endif // QGSRULEBASEDLABELING_H
Abstract base class - its implementations define different approaches to the labeling of a vector lay...
virtual QStringList subProviders() const
Gets list of sub-providers within the layer's labeling.
virtual void setSettings(QgsPalLayerSettings *settings, const QString &providerId=QString())=0
Set pal settings for a specific provider (takes ownership).
virtual QgsAbstractVectorLayerLabeling * clone() const =0
Returns a new copy of the object.
Class for parsing and evaluation of expressions (formerly called "search strings").
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:164
The QgsLabelFeature class describes a feature that should be used within the labeling engine.
Contains settings for how a map layer will be labeled.
The class is used as a container of context for various read/write operations on other objects.
Contains information about the context of a rendering operation.
Label provider for rule based labeling.
std::unique_ptr< QgsRuleBasedLabeling > mRules
owned copy
QgsRuleBasedLabeling::RuleToProviderMap mSubProviders
label providers are owned by labeling engine
A child rule for QgsRuleBasedLabeling.
QgsRuleBasedLabeling::RuleList & children()
Returns all children rules of this rule.
void setRuleKey(const QString &key)
Override the assigned rule key (should be used just internally by rule-based labeling)
void setMaximumScale(double scale)
Sets the maximum map scale (i.e.
Rule(const Rule &rh)=delete
Rules cannot be copied.
double maximumScale() const
Returns the maximum map scale (i.e.
void setDescription(const QString &description)
Set a human readable description for this rule.
bool dependsOnScale() const
Determines if scale based labeling is active.
const QgsRuleBasedLabeling::RuleList & children() const
Returns all children rules of this rule.
QString filterExpression() const
A filter that will check if this rule applies.
QgsRuleBasedLabeling::Rule * parent()
The parent rule.
const QgsRuleBasedLabeling::Rule * parent() const
The parent rule.
bool active() const
Returns if this rule is active.
QgsPalLayerSettings * settings() const
Returns the labeling settings.
RegisterResult
The result of registering a rule.
@ Inactive
The rule is inactive.
void setActive(bool state)
Sets if this rule is active.
bool isElse() const
Check if this rule is an ELSE rule.
void setMinimumScale(double scale)
Sets the minimum map scale (i.e.
Rule & operator=(const Rule &rh)=delete
Rules cannot be copied.
void setFilterExpression(const QString &filterExp)
Set the expression used to check if a given feature shall be rendered with this rule.
double minimumScale() const
Returns the minimum map scale (i.e.
void setIsElse(bool iselse)
Sets if this rule is an ELSE rule.
QString ruleKey() const
Unique rule identifier (for identification of rule within labeling, used as provider ID)
QString description() const
A human readable description for this rule.
Rule based labeling for a vector layer.
QList< QgsRuleBasedLabeling::Rule * > RuleList
QMap< QgsRuleBasedLabeling::Rule *, QgsVectorLayerLabelProvider * > RuleToProviderMap
An interface for classes which can visit style entity (e.g.
Abstract base class for all rendered symbols.
Definition: qgssymbol.h:93
The QgsVectorLayerLabelProvider class implements a label provider for vector layers.
Represents a vector layer which manages a vector based data sets.
std::unique_ptr< GEOSGeometry, GeosDeleter > unique_ptr
Scoped GEOS pointer.
Definition: qgsgeos.h:74
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Definition: qgis.h:2527
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_FACTORY
Definition: qgis_sip.h:76