QGIS API Documentation 4.3.0-Master (0cfde48c85b)
Loading...
Searching...
No Matches
qgsprocessingregistry.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsprocessingregistry.cpp
3 --------------------------
4 begin : December 2016
5 copyright : (C) 2016 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
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
19
34#include "qgsvectorfilewriter.h"
35
36#include <QString>
37
38#include "moc_qgsprocessingregistry.cpp"
39
40using namespace Qt::StringLiterals;
41
43 : QObject( parent )
44 , mDefaultStyleRegistry( new QgsProcessingDefaultStyleRegistry( this ) )
45{
86 addParameterType( new QgsProcessingParameterTypeVectorTileWriterLayers() );
87 addParameterType( new QgsProcessingParameterTypeFieldMapping() );
88 addParameterType( new QgsProcessingParameterTypeAggregate() );
89 addParameterType( new QgsProcessingParameterTypeTinInputLayers() );
90 addParameterType( new QgsProcessingParameterTypeDxfLayers() );
91 addParameterType( new QgsProcessingParameterTypeMeshDatasetGroups() );
92 addParameterType( new QgsProcessingParameterTypeMeshDatasetTime() );
98 addParameterType( new QgsProcessingParameterTypeAlignRasterLayers() );
99 addParameterType( new QgsProcessingParameterTypeHeatmapPixelSize() );
100 addParameterType( new QgsProcessingParameterTypeReliefColors() );
101 addParameterType( new QgsProcessingParameterTypeInterpolationSource() );
102 addParameterType( new QgsProcessingParameterTypeInterpolationPixelSize() );
103 addParameterType( new QgsProcessingParameterTypeTileExtentMaxZoomList() );
104}
105
107{
108 const auto constMProviders = mProviders;
109 for ( QgsProcessingProvider *p : constMProviders )
110 {
111 removeProvider( p );
112 }
113
114 const auto parameterTypes = mParameterTypes.values();
115
117 {
118 removeParameterType( type );
119 }
120}
121
123{
124 if ( !provider )
125 return false;
126
127 if ( providerById( provider->id() ) )
128 {
129 QgsLogger::warning( u"Duplicate provider %1 registered"_s.arg( provider->id() ) );
130 delete provider;
131 return false;
132 }
133
134 if ( !provider->load() )
135 {
136 QgsLogger::warning( u"Provider %1 cannot load"_s.arg( provider->id() ) );
137 delete provider;
138 return false;
139 }
140
141 provider->setParent( this );
142 mProviders[provider->id()] = provider;
143
144 mCachedInformation.clear();
145 connect( provider, &QgsProcessingProvider::algorithmsLoaded, this, [this] { mCachedInformation.clear(); } );
146
147 emit providerAdded( provider->id() );
148 return true;
149}
150
152{
153 if ( !provider )
154 return false;
155
156 const QString id = provider->id();
157
158 if ( !mProviders.contains( id ) )
159 return false;
160
161 provider->unload();
162
163 delete mProviders.take( id );
164
165 mCachedInformation.clear();
166
167 emit providerRemoved( id );
168 return true;
169}
170
171bool QgsProcessingRegistry::removeProvider( const QString &providerId )
172{
173 QgsProcessingProvider *p = providerById( providerId );
174 return removeProvider( p );
175}
176
178{
179 auto it = mProviders.constFind( id );
180 if ( it != mProviders.constEnd() )
181 return it.value();
182
183 // transparently map old references to "grass7" provider to "grass" provider
184 if ( id.compare( "grass7"_L1, Qt::CaseInsensitive ) == 0 )
185 return providerById( u"grass"_s );
186
187 return nullptr;
188}
189
190QList< const QgsProcessingAlgorithm * > QgsProcessingRegistry::algorithms() const
191{
192 QList< const QgsProcessingAlgorithm * > algs;
193 QMap<QString, QgsProcessingProvider *>::const_iterator it = mProviders.constBegin();
194 for ( ; it != mProviders.constEnd(); ++it )
195 {
196 algs.append( it.value()->algorithms() );
197 }
198 return algs;
199}
200
202{
203 const auto it = mCachedInformation.constFind( id );
204 if ( it != mCachedInformation.constEnd() )
205 return *it;
206
209 {
210 info.displayName = algorithm->displayName();
211 info.icon = algorithm->icon();
212 }
213 mCachedInformation.insert( id, info );
214 return info;
215}
216
218{
219 if ( constId.isEmpty() )
220 return nullptr;
221
222 // allow mapping of algorithm via registered algorithm aliases
223 const QString id = mAlgorithmAliases.value( constId, constId );
224
225 // try to match just the one target provider, if we can determine it from the id easily
226 static thread_local QRegularExpression reSplitProviderId( u"^(.*?):(.*)$"_s );
227 const QRegularExpressionMatch match = reSplitProviderId.match( id );
228 if ( match.hasMatch() )
229 {
230 if ( QgsProcessingProvider *provider = providerById( match.captured( 1 ) ) )
231 {
232 if ( const QgsProcessingAlgorithm *algorithm = provider->algorithm( match.captured( 2 ) ) )
233 return algorithm;
234 }
235
236 // try mapping 'qgis' algs to 'native' algs - this allows us to freely move algorithms
237 // from the python 'qgis' provider to the c++ 'native' provider without breaking API
238 // or existing models
239 if ( match.captured( 1 ) == "qgis"_L1 )
240 {
241 const QString algorithmName = id.mid( 5 );
242 if ( QgsProcessingProvider *provider = mProviders.value( u"native"_s ) )
243 {
244 if ( const QgsProcessingAlgorithm *algorithm = provider->algorithm( algorithmName ) )
245 return algorithm;
246 }
247 }
248 }
249
250 // slow: iterate through ALL providers to find a match
251 QMap<QString, QgsProcessingProvider *>::const_iterator it = mProviders.constBegin();
252 for ( ; it != mProviders.constEnd(); ++it )
253 {
254 const QList< const QgsProcessingAlgorithm * > algorithms = it.value()->algorithms();
255 for ( const QgsProcessingAlgorithm *alg : algorithms )
256 if ( alg->id() == id )
257 return alg;
258 }
259
260 return nullptr;
261}
262
263QgsProcessingAlgorithm *QgsProcessingRegistry::createAlgorithmById( const QString &id, const QVariantMap &configuration ) const
264{
265 const QgsProcessingAlgorithm *alg = algorithmById( id );
266 if ( !alg )
267 return nullptr;
268
269 std::unique_ptr< QgsProcessingAlgorithm > creation( alg->create( configuration ) );
270 return creation.release();
271}
272
273void QgsProcessingRegistry::addAlgorithmAlias( const QString &aliasId, const QString &actualId )
274{
275 mAlgorithmAliases.insert( aliasId, actualId );
276}
277
279{
280 if ( !mParameterTypes.contains( type->id() ) )
281 {
282 mParameterTypes.insert( type->id(), type );
283 emit parameterTypeAdded( type );
284 return true;
285 }
286 else
287 {
288 QgsLogger::warning( u"Duplicate parameter type %1 (\"%2\") registered"_s.arg( type->id(), type->name() ) );
289
290 if ( mParameterTypes.value( type->id() ) != type )
291 delete type;
292
293 return false;
294 }
295}
296
298{
299 mParameterTypes.remove( type->id() );
300 emit parameterTypeRemoved( type );
301 delete type;
302}
303
305{
306 return mParameterTypes.value( id );
307}
308
309QList<QgsProcessingParameterType *> QgsProcessingRegistry::parameterTypes() const
310{
311 return mParameterTypes.values();
312}
313
315{
316 return mDefaultStyleRegistry;
317}
static void warning(const QString &msg)
Goes to qWarning.
Contains basic properties for a Processing algorithm.
QString displayName
Algorithm display name.
Abstract base class for processing algorithms.
QgsProcessingAlgorithm * create(const QVariantMap &configuration=QVariantMap()) const
Creates a copy of the algorithm, ready for execution.
A registry for default styles to apply to layers generated by Processing.
An annotation layer parameter for processing algorithms.
An area parameter for processing algorithms.
An authentication configuration parameter for processing algorithms.
A raster band parameter for Processing algorithms.
A boolean parameter for processing algorithms.
A color parameter for Processing algorithms.
A coordinate operation parameter for Processing algorithms.
A crs parameter for processing algorithms.
A database schema name parameter for processing algorithms.
A database table name parameter for processing algorithms.
A datetime parameter for processing algorithms.
A distance parameter for processing algorithms.
A duration parameter for processing algorithms.
An enum based parameter for processing algorithms, allowing for selection from predefined values.
An expression parameter for processing algorithms.
A rectangular map extent parameter for processing algorithms.
A feature sink parameter for Processing algorithms.
An input feature source (such as vector layers) parameter for processing algorithms.
A vector layer or feature source field parameter for processing algorithms.
A generic file based destination parameter, for specifying the destination path for a file (non-map l...
An input file or folder parameter for processing algorithms.
A folder destination parameter, for specifying the destination path for a folder created by the algor...
A geometry parameter for processing algorithms.
A print layout item parameter for Processing algorithms.
A print layout parameter for Processing algorithms.
A generic map layer parameter for processing algorithms.
A map theme parameter for Processing algorithms.
A table (matrix) parameter for processing algorithms.
A mesh layer parameter for processing algorithms.
A parameter for processing algorithms which accepts multiple map layers.
A numeric parameter for processing algorithms.
A point cloud layer attribute parameter for Processing algorithms.
A pointcloud layer destination parameter, for specifying the destination path for a point cloud layer...
A point cloud layer parameter for processing algorithms.
A point parameter for processing algorithms.
A provider connection name parameter for processing algorithms.
A numeric range parameter for processing algorithms.
A raster layer destination parameter, for specifying the destination path for a raster layer created ...
A raster layer parameter for processing algorithms.
A scale parameter for processing algorithms.
A string parameter for processing algorithms.
A vector layer destination parameter, for specifying the destination path for a vector layer created ...
A vector layer parameter for processing algorithms.
A vector tile layer destination parameter, for specifying the destination path for a vector tile laye...
A volume parameter for processing algorithms.
Makes metadata of processing parameters available.
virtual QString name() const =0
A human readable and translatable short name for this parameter type.
virtual QString id() const =0
A static id for this type which will be used for storing this parameter type.
Abstract base class for processing providers.
void algorithmsLoaded()
Emitted when the provider has loaded (or refreshed) its list of available algorithms.
virtual void unload()
Unloads the provider.
virtual QString id() const =0
Returns the unique provider id, used for identifying the provider.
virtual bool load()
Loads the provider.
void removeParameterType(QgsProcessingParameterType *type)
Unregister a custom parameter type from processing.
void parameterTypeAdded(QgsProcessingParameterType *type)
Emitted when a new parameter type has been added to the registry.
QgsProcessingAlgorithm * createAlgorithmById(const QString &id, const QVariantMap &configuration=QVariantMap()) const
Creates a new instance of an algorithm by its ID.
void parameterTypeRemoved(QgsProcessingParameterType *type)
Emitted when a parameter type has been removed from the registry and is about to be deleted.
QgsProcessingAlgorithmInformation algorithmInformation(const QString &id) const
Returns basic algorithm information for the algorithm with matching ID.
QList< const QgsProcessingAlgorithm * > algorithms() const
Returns a list of all available algorithms from registered providers.
QgsProcessingParameterType * parameterType(const QString &id) const
Returns the parameter type registered for id.
bool removeProvider(QgsProcessingProvider *provider)
Removes a provider implementation from the registry (the provider object is deleted).
QgsProcessingDefaultStyleRegistry * defaultStyleRegistry() const
Returns the default style registry, responsible for styling layers generated by Processing tools.
bool addParameterType(QgsProcessingParameterType *type)
Register a new parameter type for processing.
QgsProcessingRegistry(QObject *parent=nullptr)
Constructor for QgsProcessingRegistry.
const QgsProcessingAlgorithm * algorithmById(const QString &id) const
Finds an algorithm by its ID.
QgsProcessingProvider * providerById(const QString &id) const
Returns a matching provider by provider ID.
void providerAdded(const QString &id)
Emitted when a provider has been added to the registry.
QList< QgsProcessingParameterType * > parameterTypes() const
Returns a list with all known parameter types.
bool addProvider(QgsProcessingProvider *provider)
Add a processing provider to the registry.
void providerRemoved(const QString &id)
Emitted when a provider is removed from the registry.
void addAlgorithmAlias(const QString &aliasId, const QString &actualId)
Adds a new alias to an existing algorithm.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into allowing algorithms to be written in pure substantial changes are required in order to port existing x Processing algorithms for QGIS x The most significant changes are outlined not GeoAlgorithm For algorithms which operate on features one by consider subclassing the QgsProcessingFeatureBasedAlgorithm class This class allows much of the boilerplate code for looping over features from a vector layer to be bypassed and instead requires implementation of a processFeature method Ensure that your algorithm(or algorithm 's parent class) implements the new pure virtual createInstance(self) call
#define SIP_TRANSFERTHIS
Definition qgis_sip.h:52