QGIS API Documentation 3.40.0-Bratislava (b56115d8743)
Loading...
Searching...
No Matches
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
60 Rule( const Rule &rh ) = delete;
61 Rule &operator=( const Rule &rh ) = delete;
62
65 {
66 Filtered = 0,
68 Registered
69 };
70
74 QgsPalLayerSettings *settings() const { return mSettings.get(); }
75
81 bool dependsOnScale() const { return !qgsDoubleNear( mMinimumScale, 0.0 ) || !qgsDoubleNear( mMaximumScale, 0 ); }
82
90 double maximumScale() const { return mMaximumScale; }
91
99 double minimumScale() const { return mMinimumScale; }
100
105 QString filterExpression() const { return mFilterExp; }
106
112 QString description() const { return mDescription; }
113
119 bool active() const { return mIsActive; }
120
126 bool isElse() const { return mElseRule; }
127
129 QString ruleKey() const { return mRuleKey; }
130
133
141 void setMinimumScale( double scale ) { mMinimumScale = scale; }
142
150 void setMaximumScale( double scale ) { mMaximumScale = scale; }
151
157 void setFilterExpression( const QString &filterExp ) { mFilterExp = filterExp; initFilter(); }
158
164 void setDescription( const QString &description ) { mDescription = description; }
165
170 void setActive( bool state ) { mIsActive = state; }
171
177 void setIsElse( bool iselse ) { mElseRule = iselse; }
178
180 void setRuleKey( const QString &key ) { mRuleKey = key; }
181
182 // parent / child operations
183
189 const QgsRuleBasedLabeling::RuleList &children() const { return mChildren; }
190
197
203 QgsRuleBasedLabeling::RuleList descendants() const;
204
210 const QgsRuleBasedLabeling::Rule *parent() const SIP_SKIP { return mParent; }
211
217 QgsRuleBasedLabeling::Rule *parent() { return mParent; }
218
220 void appendChild( QgsRuleBasedLabeling::Rule *rule SIP_TRANSFER );
221
223 void insertChild( int i, QgsRuleBasedLabeling::Rule *rule SIP_TRANSFER );
224
226 void removeChildAt( int i );
227
229 const QgsRuleBasedLabeling::Rule *findRuleByKey( const QString &key ) const;
230
239 QgsRuleBasedLabeling::Rule *findRuleByKey( const QString &key ) SIP_SKIP;
240
243
244 // load / save
245
253 static QgsRuleBasedLabeling::Rule *create( const QDomElement &ruleElem, const QgsReadWriteContext &context, bool reuseId = true ) SIP_FACTORY;
254
256 QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) const;
257
258 // evaluation
259
264 void createSubProviders( QgsVectorLayer *layer, RuleToProviderMap &subProviders, QgsRuleBasedLabelProvider *provider ) SIP_SKIP;
265
270 void subProviderIds( QStringList &list ) const SIP_SKIP;
271
276 void prepare( QgsRenderContext &context, QSet<QString> &attributeNames, RuleToProviderMap &subProviders ) SIP_SKIP;
277
287 std::tuple< RegisterResult, QList< QgsLabelFeature * > > registerFeature( const QgsFeature &feature, QgsRenderContext &context, RuleToProviderMap &subProviders, const QgsGeometry &obstacleGeometry = QgsGeometry(), const QgsSymbol *symbol = nullptr ) SIP_SKIP;
288
293 bool requiresAdvancedEffects() const;
294
304 bool accept( QgsStyleEntityVisitorInterface *visitor ) const;
305
306 private:
307#ifdef SIP_RUN
308 Rule( const QgsRuleBasedLabeling::Rule &rh );
309#endif
310
318 bool isFilterOK( const QgsFeature &f, QgsRenderContext &context ) const;
319
327 bool isScaleOK( double scale ) const;
328
332 void initFilter();
333
337 void updateElseRules();
338
339 private:
340 Rule *mParent = nullptr; // parent rule (nullptr only for root rule)
341 std::unique_ptr<QgsPalLayerSettings> mSettings;
342 double mMaximumScale = 0;
343 double mMinimumScale = 0;
344 QString mFilterExp;
345 QString mDescription;
346 bool mElseRule = false;
347 RuleList mChildren;
348 RuleList mElseRules;
349 bool mIsActive = true; // whether it is enabled or not
350
351 QString mRuleKey = QUuid::createUuid().toString(); // string used for unique identification of rule within labeling
352
353 std::unique_ptr<QgsExpression> mFilter;
354
355 };
356
357
360 ~QgsRuleBasedLabeling() override;
361
362 QgsRuleBasedLabeling::Rule *rootRule();
363 const Rule *rootRule() const SIP_SKIP;
364
366 static QgsRuleBasedLabeling *create( const QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY; // cppcheck-suppress duplInheritedMember
367
368 // implementation of parent interface
369
370 QString type() const override;
371 QgsRuleBasedLabeling *clone() const override SIP_FACTORY;
372 QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) const override;
374 QgsVectorLayerLabelProvider *provider( QgsVectorLayer *layer ) const override SIP_SKIP;
375 QStringList subProviders() const override;
376 QgsPalLayerSettings settings( const QString &providerId = QString() ) const override;
377 bool accept( QgsStyleEntityVisitorInterface *visitor ) const override;
378
386 void setSettings( QgsPalLayerSettings *settings SIP_TRANSFER, const QString &providerId = QString() ) override;
387 bool requiresAdvancedEffects() const override;
388 void toSld( QDomNode &parent, const QVariantMap &props ) const override;
389 void multiplyOpacity( double opacityFactor ) override;
390
391
392 protected:
393 std::unique_ptr<Rule> mRootRule;
394
395
396};
397
398#ifndef SIP_RUN
399
408{
409 public:
410 QgsRuleBasedLabelProvider( const QgsRuleBasedLabeling &rules, QgsVectorLayer *layer, bool withFeatureLoop = true );
411
412 // reimplemented
413
414 bool prepare( QgsRenderContext &context, QSet<QString> &attributeNames ) override;
415
416 QList< QgsLabelFeature * > registerFeature( const QgsFeature &feature, QgsRenderContext &context, const QgsGeometry &obstacleGeometry = QgsGeometry(), const QgsSymbol *symbol = nullptr ) override;
417
419 virtual QgsVectorLayerLabelProvider *createProvider( QgsVectorLayer *layer, const QString &providerId, bool withFeatureLoop, const QgsPalLayerSettings *settings );
420
422 QList<QgsAbstractLabelProvider *> subProviders() override;
423
424 protected:
426 std::unique_ptr<QgsRuleBasedLabeling> mRules;
429};
430
431#endif
432
433#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:58
A geometry is the spatial representation of a feature.
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
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
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:231
The QgsVectorLayerLabelProvider class implements a label provider for vector layers.
Represents a vector layer which manages a vector based data sets.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Definition qgis.h:5917
#define SIP_SKIP
Definition qgis_sip.h:126
#define SIP_TRANSFER
Definition qgis_sip.h:36
#define SIP_FACTORY
Definition qgis_sip.h:76