QGIS API Documentation 3.30.0-'s-Hertogenbosch (f186b8efe0)
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
260 static QgsRuleBasedLabeling::Rule *create( const QDomElement &ruleElem, const QgsReadWriteContext &context, bool reuseId = true ) SIP_FACTORY;
261
263 QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) const;
264
265 // evaluation
266
271 void createSubProviders( QgsVectorLayer *layer, RuleToProviderMap &subProviders, QgsRuleBasedLabelProvider *provider ) SIP_SKIP;
272
277 void subProviderIds( QStringList &list ) const SIP_SKIP;
278
283 void prepare( QgsRenderContext &context, QSet<QString> &attributeNames, RuleToProviderMap &subProviders ) SIP_SKIP;
284
294 std::tuple< RegisterResult, QList< QgsLabelFeature * > > registerFeature( const QgsFeature &feature, QgsRenderContext &context, RuleToProviderMap &subProviders, const QgsGeometry &obstacleGeometry = QgsGeometry(), const QgsSymbol *symbol = nullptr ) SIP_SKIP;
295
300 bool requiresAdvancedEffects() const;
301
311 bool accept( QgsStyleEntityVisitorInterface *visitor ) const;
312
313 private:
314#ifdef SIP_RUN
315 Rule( const QgsRuleBasedLabeling::Rule &rh );
316#endif
317
325 bool isFilterOK( const QgsFeature &f, QgsRenderContext &context ) const;
326
334 bool isScaleOK( double scale ) const;
335
339 void initFilter();
340
344 void updateElseRules();
345
346 private:
347 Rule *mParent = nullptr; // parent rule (nullptr only for root rule)
348 std::unique_ptr<QgsPalLayerSettings> mSettings;
349 double mMaximumScale = 0;
350 double mMinimumScale = 0;
351 QString mFilterExp;
352 QString mDescription;
353 bool mElseRule = false;
354 RuleList mChildren;
355 RuleList mElseRules;
356 bool mIsActive = true; // whether it is enabled or not
357
358 QString mRuleKey = QUuid::createUuid().toString(); // string used for unique identification of rule within labeling
359
360 std::unique_ptr<QgsExpression> mFilter;
361
362 };
363
364
367 ~QgsRuleBasedLabeling() override;
368
369 QgsRuleBasedLabeling::Rule *rootRule();
370 const Rule *rootRule() const SIP_SKIP;
371
373 static QgsRuleBasedLabeling *create( const QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
374
375 // implementation of parent interface
376
377 QString type() const override;
378 QgsRuleBasedLabeling *clone() const override SIP_FACTORY;
379 QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) const override;
381 QgsVectorLayerLabelProvider *provider( QgsVectorLayer *layer ) const override SIP_SKIP;
382 QStringList subProviders() const override;
383 QgsPalLayerSettings settings( const QString &providerId = QString() ) const override;
384 bool accept( QgsStyleEntityVisitorInterface *visitor ) const override;
385
394 void setSettings( QgsPalLayerSettings *settings SIP_TRANSFER, const QString &providerId = QString() ) override;
395 bool requiresAdvancedEffects() const override;
396 void toSld( QDomNode &parent, const QVariantMap &props ) const override;
397
398 protected:
399 std::unique_ptr<Rule> mRootRule;
400};
401
402#ifndef SIP_RUN
403
412{
413 public:
414 QgsRuleBasedLabelProvider( const QgsRuleBasedLabeling &rules, QgsVectorLayer *layer, bool withFeatureLoop = true );
415
416 // reimplemented
417
418 bool prepare( QgsRenderContext &context, QSet<QString> &attributeNames ) override;
419
420 QList< QgsLabelFeature * > registerFeature( const QgsFeature &feature, QgsRenderContext &context, const QgsGeometry &obstacleGeometry = QgsGeometry(), const QgsSymbol *symbol = nullptr ) override;
421
423 virtual QgsVectorLayerLabelProvider *createProvider( QgsVectorLayer *layer, const QString &providerId, bool withFeatureLoop, const QgsPalLayerSettings *settings );
424
426 QList<QgsAbstractLabelProvider *> subProviders() override;
427
428 protected:
430 std::unique_ptr<QgsRuleBasedLabeling> mRules;
433};
434
435#endif
436
437#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:3509
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_FACTORY
Definition: qgis_sip.h:76