QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgsalgorithmfilter.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmfilter.cpp
3 ---------------------
4 begin : April 2018
5 copyright : (C) 2018 by Matthias Kuhn
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18#include "qgsalgorithmfilter.h"
19#include "qgsapplication.h"
20
22
23QString QgsFilterAlgorithm::name() const
24{
25 return QStringLiteral( "filter" );
26}
27
28QString QgsFilterAlgorithm::displayName() const
29{
30 return QObject::tr( "Feature filter" );
31}
32
33QStringList QgsFilterAlgorithm::tags() const
34{
35 return QObject::tr( "filter,proxy,redirect,route" ).split( ',' );
36}
37
38QString QgsFilterAlgorithm::group() const
39{
40 return QObject::tr( "Modeler tools" );
41}
42
43QString QgsFilterAlgorithm::groupId() const
44{
45 return QStringLiteral( "modelertools" );
46}
47
48Qgis::ProcessingAlgorithmFlags QgsFilterAlgorithm::flags() const
49{
51}
52
53QString QgsFilterAlgorithm::shortHelpString() const
54{
55 return QObject::tr( "This algorithm filters features from the input layer and redirects them to one or several outputs." );
56}
57
58QgsFilterAlgorithm *QgsFilterAlgorithm::createInstance() const
59{
60 return new QgsFilterAlgorithm();
61}
62
63QgsFilterAlgorithm::~QgsFilterAlgorithm()
64{
65 qDeleteAll( mOutputs );
66}
67
68void QgsFilterAlgorithm::initAlgorithm( const QVariantMap &configuration )
69{
70 addParameter( new QgsProcessingParameterFeatureSource( QStringLiteral( "INPUT" ), QObject::tr( "Input layer" ) ) );
71
72 const QVariantList outputs = configuration.value( QStringLiteral( "outputs" ) ).toList();
73 for ( const QVariant &output : outputs )
74 {
75 const QVariantMap outputDef = output.toMap();
76 const QString name = QStringLiteral( "OUTPUT_%1" ).arg( outputDef.value( QStringLiteral( "name" ) ).toString() );
77 QgsProcessingParameterFeatureSink *outputParam = new QgsProcessingParameterFeatureSink( name, outputDef.value( QStringLiteral( "name" ) ).toString() );
80 if ( outputDef.value( QStringLiteral( "isModelOutput" ) ).toBool() )
82 outputParam->setFlags( flags );
83 addParameter( outputParam );
84 mOutputs.append( new Output( name, outputDef.value( QStringLiteral( "expression" ) ).toString() ) );
85 }
86}
87
88
89QVariantMap QgsFilterAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
90{
91 std::unique_ptr< QgsProcessingFeatureSource > source( parameterAsSource( parameters, QStringLiteral( "INPUT" ), context ) );
92 if ( !source )
93 throw QgsProcessingException( invalidSourceError( parameters, QStringLiteral( "INPUT" ) ) );
94
95 QgsExpressionContext expressionContext = createExpressionContext( parameters, context, source.get() );
96 for ( Output *output : std::as_const( mOutputs ) )
97 {
98 output->sink.reset( parameterAsSink( parameters, output->name, context, output->destinationIdentifier, source->fields(), source->wkbType(), source->sourceCrs() ) );
99 if ( !output->sink )
100 throw QgsProcessingException( invalidSinkError( parameters, output->name ) );
101 output->expression.prepare( &expressionContext );
102 }
103
104 long count = source->featureCount();
105
106 QgsFeature f;
108
109 double step = count > 0 ? 100.0 / count : 1;
110 int current = 0;
111
112 while ( it.nextFeature( f ) )
113 {
114 if ( feedback->isCanceled() )
115 {
116 break;
117 }
118
119 expressionContext.setFeature( f );
120
121 for ( Output *output : std::as_const( mOutputs ) )
122 {
123 if ( output->expression.evaluate( &expressionContext ).toBool() )
124 {
125 if ( !output->sink->addFeature( f, QgsFeatureSink::FastInsert ) )
126 throw QgsProcessingException( writeFeatureError( output->sink.get(), parameters, output->name ) );
127 }
128 }
129
130 feedback->setProgress( current * step );
131 current++;
132 }
133
134 QVariantMap outputs;
135 for ( const Output *output : std::as_const( mOutputs ) )
136 {
137 outputs.insert( output->name, output->destinationIdentifier );
138 }
139 qDeleteAll( mOutputs );
140 mOutputs.clear();
141 return outputs;
142}
143
144
QFlags< ProcessingAlgorithmFlag > ProcessingAlgorithmFlags
Flags indicating how and when an algorithm operates and should be exposed to users.
Definition: qgis.h:2934
QFlags< ProcessingParameterFlag > ProcessingParameterFlags
Flags which dictate the behavior of Processing parameters.
Definition: qgis.h:3066
@ SkipGeometryValidityChecks
Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always...
@ HideFromToolbox
Algorithm should be hidden from the toolbox.
@ Hidden
Parameter is hidden and should not be shown to users.
@ IsModelOutput
Destination parameter is final output. The parameter name will be used.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
This class wraps a request for features to a vector layer (or directly its vector data provider).
@ FastInsert
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition: qgsfeedback.h:53
void setProgress(double progress)
Sets the current progress for the feedback object.
Definition: qgsfeedback.h:61
Contains information about the context in which a processing algorithm is executed.
Custom exception class for processing related exceptions.
Definition: qgsexception.h:83
Base class for providing feedback from a processing algorithm.
void setFlags(Qgis::ProcessingParameterFlags flags)
Sets the flags associated with the parameter.
A feature sink output for processing algorithms.
An input feature source (such as vector layers) parameter for processing algorithms.