QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
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
42{
43 public:
44 class Rule;
45 typedef QList<QgsRuleBasedLabeling::Rule *> RuleList;
46 typedef QMap<QgsRuleBasedLabeling::Rule *, QgsVectorLayerLabelProvider *> RuleToProviderMap;
47
53 class CORE_EXPORT Rule
54 {
55 public:
57 Rule( QgsPalLayerSettings *settings SIP_TRANSFER, double maximumScale = 0, double minimumScale = 0, const QString &filterExp = QString(), const QString &description = QString(), bool elseRule = false );
58 ~Rule();
59
61 Rule( const Rule &rh ) = delete;
63 Rule &operator=( const Rule &rh ) = delete;
64
67 {
68 Filtered = 0,
70 Registered
71 };
72
76 QgsPalLayerSettings *settings() const { return mSettings.get(); }
77
83 bool dependsOnScale() const { return !qgsDoubleNear( mMinimumScale, 0.0 ) || !qgsDoubleNear( mMaximumScale, 0 ); }
84
92 double maximumScale() const { return mMaximumScale; }
93
101 double minimumScale() const { return mMinimumScale; }
102
107 QString filterExpression() const { return mFilterExp; }
108
114 QString description() const { return mDescription; }
115
121 bool active() const { return mIsActive; }
122
128 bool isElse() const { return mElseRule; }
129
131 QString ruleKey() const { return mRuleKey; }
132
135
143 void setMinimumScale( double scale ) { mMinimumScale = scale; }
144
152 void setMaximumScale( double scale ) { mMaximumScale = scale; }
153
159 void setFilterExpression( const QString &filterExp ) { mFilterExp = filterExp; initFilter(); }
160
166 void setDescription( const QString &description ) { mDescription = description; }
167
172 void setActive( bool state ) { mIsActive = state; }
173
179 void setIsElse( bool iselse ) { mElseRule = iselse; }
180
182 void setRuleKey( const QString &key ) { mRuleKey = key; }
183
184 // parent / child operations
185
191 const QgsRuleBasedLabeling::RuleList &children() const { return mChildren; }
192
199
205 QgsRuleBasedLabeling::RuleList descendants() const;
206
212 const QgsRuleBasedLabeling::Rule *parent() const SIP_SKIP { return mParent; }
213
219 QgsRuleBasedLabeling::Rule *parent() { return mParent; }
220
222 void appendChild( QgsRuleBasedLabeling::Rule *rule SIP_TRANSFER );
223
225 void insertChild( int i, QgsRuleBasedLabeling::Rule *rule SIP_TRANSFER );
226
228 void removeChildAt( int i );
229
231 const QgsRuleBasedLabeling::Rule *findRuleByKey( const QString &key ) const;
232
241 QgsRuleBasedLabeling::Rule *findRuleByKey( const QString &key ) SIP_SKIP;
242
245
246 // load / save
247
255 static QgsRuleBasedLabeling::Rule *create( const QDomElement &ruleElem, const QgsReadWriteContext &context, bool reuseId = true ) SIP_FACTORY;
256
258 QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) const;
259
260 // evaluation
261
266 void createSubProviders( QgsVectorLayer *layer, RuleToProviderMap &subProviders, QgsRuleBasedLabelProvider *provider ) SIP_SKIP;
267
272 void subProviderIds( QStringList &list ) const SIP_SKIP;
273
278 void prepare( QgsRenderContext &context, QSet<QString> &attributeNames, RuleToProviderMap &subProviders ) SIP_SKIP;
279
289 std::tuple< RegisterResult, QList< QgsLabelFeature * > > registerFeature( const QgsFeature &feature, QgsRenderContext &context, RuleToProviderMap &subProviders, const QgsGeometry &obstacleGeometry = QgsGeometry(), const QgsSymbol *symbol = nullptr ) SIP_SKIP;
290
295 bool requiresAdvancedEffects() const;
296
306 bool accept( QgsStyleEntityVisitorInterface *visitor ) const;
307
308 private:
309#ifdef SIP_RUN
310 Rule( const QgsRuleBasedLabeling::Rule &rh );
311#endif
312
320 bool isFilterOK( const QgsFeature &f, QgsRenderContext &context ) const;
321
329 bool isScaleOK( double scale ) const;
330
334 void initFilter();
335
339 void updateElseRules();
340
341 private:
342 Rule *mParent = nullptr; // parent rule (nullptr only for root rule)
343 std::unique_ptr<QgsPalLayerSettings> mSettings;
344 double mMaximumScale = 0;
345 double mMinimumScale = 0;
346 QString mFilterExp;
347 QString mDescription;
348 bool mElseRule = false;
349 RuleList mChildren;
350 RuleList mElseRules;
351 bool mIsActive = true; // whether it is enabled or not
352
353 QString mRuleKey = QUuid::createUuid().toString(); // string used for unique identification of rule within labeling
354
355 std::unique_ptr<QgsExpression> mFilter;
356
357 };
358
359
362 ~QgsRuleBasedLabeling() override;
363
364 QgsRuleBasedLabeling::Rule *rootRule();
365 const Rule *rootRule() const SIP_SKIP;
366
368 static QgsRuleBasedLabeling *create( const QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
369
370 // implementation of parent interface
371
372 QString type() const override;
373 QgsRuleBasedLabeling *clone() const override SIP_FACTORY;
374 QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) const override;
376 QgsVectorLayerLabelProvider *provider( QgsVectorLayer *layer ) const override SIP_SKIP;
377 QStringList subProviders() const override;
378 QgsPalLayerSettings settings( const QString &providerId = QString() ) const override;
379 bool accept( QgsStyleEntityVisitorInterface *visitor ) const override;
380
388 void setSettings( QgsPalLayerSettings *settings SIP_TRANSFER, const QString &providerId = QString() ) override;
389 bool requiresAdvancedEffects() const override;
390 void toSld( QDomNode &parent, const QVariantMap &props ) const override;
391 void multiplyOpacity( double opacityFactor ) override;
392
393
394 protected:
395 std::unique_ptr<Rule> mRootRule;
396
397
398};
399
400#ifndef SIP_RUN
401
410{
411 public:
412 QgsRuleBasedLabelProvider( const QgsRuleBasedLabeling &rules, QgsVectorLayer *layer, bool withFeatureLoop = true );
413
414 // reimplemented
415
416 bool prepare( QgsRenderContext &context, QSet<QString> &attributeNames ) override;
417
418 QList< QgsLabelFeature * > registerFeature( const QgsFeature &feature, QgsRenderContext &context, const QgsGeometry &obstacleGeometry = QgsGeometry(), const QgsSymbol *symbol = nullptr ) override;
419
421 virtual QgsVectorLayerLabelProvider *createProvider( QgsVectorLayer *layer, const QString &providerId, bool withFeatureLoop, const QgsPalLayerSettings *settings );
422
424 QList<QgsAbstractLabelProvider *> subProviders() override;
425
426 protected:
428 std::unique_ptr<QgsRuleBasedLabeling> mRules;
431};
432
433#endif
434
435#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:162
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:94
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:73
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Definition: qgis.h:5207
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_FACTORY
Definition: qgis_sip.h:76