QGIS API Documentation  3.2.0-Bonn (bc43194)
qgsprocessingalgorithm.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsprocessingalgorithm.h
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 
18 #ifndef QGSPROCESSINGALGORITHM_H
19 #define QGSPROCESSINGALGORITHM_H
20 
21 #include "qgis_core.h"
22 #include "qgis.h"
24 #include "qgsprocessingoutputs.h"
25 #include "qgsprocessingcontext.h"
26 #include "qgsfeaturesource.h"
27 #include "qgsprocessingutils.h"
28 #include <QString>
29 #include <QVariant>
30 #include <QIcon>
31 
34 class QgsFeatureSink;
36 class QgsProcessingModelAlgorithm;
38 
39 #ifdef SIP_RUN
40 % ModuleHeaderCode
41 #include <qgsprocessingmodelalgorithm.h>
42 % End
43 #endif
44 
51 class CORE_EXPORT QgsProcessingAlgorithm
52 {
53 
54 #ifdef SIP_RUN
56  if ( dynamic_cast< QgsProcessingModelAlgorithm * >( sipCpp ) != NULL )
57  sipType = sipType_QgsProcessingModelAlgorithm;
58  else if ( dynamic_cast< QgsProcessingFeatureBasedAlgorithm * >( sipCpp ) != NULL )
59  sipType = sipType_QgsProcessingFeatureBasedAlgorithm;
60  else
61  sipType = sipType_QgsProcessingAlgorithm;
62  SIP_END
63 #endif
64 
65  public:
66 
68  enum Flag
69  {
70  FlagHideFromToolbox = 1 << 1,
71  FlagHideFromModeler = 1 << 2,
72  FlagSupportsBatch = 1 << 3,
73  FlagCanCancel = 1 << 4,
74  FlagRequiresMatchingCrs = 1 << 5,
75  FlagNoThreading = 1 << 6,
76  FlagDisplayNameIsLiteral = 1 << 7,
77  FlagDeprecated = FlagHideFromToolbox | FlagHideFromModeler,
78  };
79  Q_DECLARE_FLAGS( Flags, Flag )
80 
81 
88  QgsProcessingAlgorithm() = default;
89 
90  virtual ~QgsProcessingAlgorithm();
91 
93  QgsProcessingAlgorithm( const QgsProcessingAlgorithm &other ) = delete;
95  QgsProcessingAlgorithm &operator=( const QgsProcessingAlgorithm &other ) = delete;
96 
97  /*
98  * IMPORTANT: While it seems like /Factory/ would be the correct annotation here, that's not
99  * the case.
100  * As per Phil Thomson's advice on https://www.riverbankcomputing.com/pipermail/pyqt/2017-July/039450.html:
101  *
102  * "
103  * /Factory/ is used when the instance returned is guaranteed to be new to Python.
104  * In this case it isn't because it has already been seen when being returned by createInstance()
105  * (However for a different sub-class implemented in C++ then it would be the first time it was seen
106  * by Python so the /Factory/ on create() would be correct.)
107  *
108  * You might try using /TransferBack/ on create() instead - that might be the best compromise.
109  * "
110  */
111 
126  QgsProcessingAlgorithm *create( const QVariantMap &configuration = QVariantMap() ) const SIP_TRANSFERBACK;
127 
137  virtual QString name() const = 0;
138 
145  QString id() const;
146 
157  virtual QString displayName() const = 0;
158 
164  virtual QString shortDescription() const;
165 
170  virtual QStringList tags() const { return QStringList(); }
171 
178  virtual QString shortHelpString() const;
179 
186  virtual QString helpString() const;
187 
193  virtual QString helpUrl() const;
194 
199  virtual QIcon icon() const;
200 
205  virtual QString svgIconPath() const;
206 
213  virtual QString group() const { return QString(); }
214 
222  virtual QString groupId() const { return QString(); }
223 
228  virtual Flags flags() const;
229 
236  virtual bool canExecute( QString *errorMessage SIP_OUT = nullptr ) const;
237 
245  virtual bool checkParameterValues( const QVariantMap &parameters,
246  QgsProcessingContext &context, QString *message SIP_OUT = nullptr ) const;
247 
255  virtual QVariantMap preprocessParameters( const QVariantMap &parameters );
256 
260  QgsProcessingProvider *provider() const;
261 
269 
275  const QgsProcessingParameterDefinition *parameterDefinition( const QString &name ) const;
276 
281  int countVisibleParameters() const;
282 
288  QgsProcessingParameterDefinitions destinationParameterDefinitions() const;
289 
296 
302  const QgsProcessingOutputDefinition *outputDefinition( const QString &name ) const;
303 
307  bool hasHtmlOutputs() const;
308 
326  QVariantMap run( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback, bool *ok SIP_OUT = nullptr, const QVariantMap &configuration = QVariantMap() ) const;
327 
338  bool prepare( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback );
339 
351  QVariantMap runPrepared( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) SIP_THROW( QgsProcessingException );
352 
361  QVariantMap postProcess( QgsProcessingContext &context, QgsProcessingFeedback *feedback );
362 
369  virtual QWidget *createCustomParametersWidget( QWidget *parent = nullptr ) const SIP_FACTORY;
370 
377  QgsExpressionContext createExpressionContext( const QVariantMap &parameters,
378  QgsProcessingContext &context, QgsProcessingFeatureSource *source = nullptr ) const;
379 
386  virtual bool validateInputCrs( const QVariantMap &parameters,
387  QgsProcessingContext &context ) const;
388 
396  virtual QString asPythonCommand( const QVariantMap &parameters, QgsProcessingContext &context ) const;
397 
401  void setProvider( QgsProcessingProvider *provider );
402 
403  protected:
404 
410  virtual QgsProcessingAlgorithm *createInstance() const = 0 SIP_FACTORY;
411 
430  virtual void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) = 0;
431 
449  bool addParameter( QgsProcessingParameterDefinition *parameterDefinition SIP_TRANSFER, bool createOutput = true );
450 
455  void removeParameter( const QString &name );
456 
470  bool addOutput( QgsProcessingOutputDefinition *outputDefinition SIP_TRANSFER );
471 
502  virtual bool prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) SIP_THROW( QgsProcessingException ) SIP_VIRTUALERRORHANDLER( processing_exception_handler );
503 
534  virtual QVariantMap processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) SIP_THROW( QgsProcessingException ) = 0 SIP_VIRTUALERRORHANDLER( processing_exception_handler );
535 
563  virtual QVariantMap postProcessAlgorithm( QgsProcessingContext &context, QgsProcessingFeedback *feedback ) SIP_THROW( QgsProcessingException ) SIP_VIRTUALERRORHANDLER( processing_exception_handler );
564 
568  QString parameterAsString( const QVariantMap &parameters, const QString &name, const QgsProcessingContext &context ) const;
569 
573  QString parameterAsExpression( const QVariantMap &parameters, const QString &name, const QgsProcessingContext &context ) const;
574 
578  double parameterAsDouble( const QVariantMap &parameters, const QString &name, const QgsProcessingContext &context ) const;
579 
583  int parameterAsInt( const QVariantMap &parameters, const QString &name, const QgsProcessingContext &context ) const;
584 
588  int parameterAsEnum( const QVariantMap &parameters, const QString &name, const QgsProcessingContext &context ) const;
589 
593  QList<int> parameterAsEnums( const QVariantMap &parameters, const QString &name, const QgsProcessingContext &context ) const;
594 
598  bool parameterAsBool( const QVariantMap &parameters, const QString &name, const QgsProcessingContext &context ) const;
599 
614  QgsFeatureSink *parameterAsSink( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context, QString &destinationIdentifier SIP_OUT,
616 
625  QgsProcessingFeatureSource *parameterAsSource( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const SIP_FACTORY;
626 
639  QString parameterAsCompatibleSourceLayerPath( const QVariantMap &parameters, const QString &name,
640  QgsProcessingContext &context, const QStringList &compatibleFormats, const QString &preferredFormat = QString( "shp" ), QgsProcessingFeedback *feedback = nullptr );
641 
649  QgsMapLayer *parameterAsLayer( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const;
650 
658  QgsRasterLayer *parameterAsRasterLayer( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const;
659 
663  QString parameterAsOutputLayer( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const;
664 
668  QString parameterAsFileOutput( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const;
669 
677  QgsVectorLayer *parameterAsVectorLayer( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const;
678 
682  QgsCoordinateReferenceSystem parameterAsCrs( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const;
683 
692  QgsRectangle parameterAsExtent( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context,
694 
705  QgsGeometry parameterAsExtentGeometry( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context,
707 
713  QgsCoordinateReferenceSystem parameterAsExtentCrs( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context );
714 
723  QgsPointXY parameterAsPoint( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context,
725 
731  QgsCoordinateReferenceSystem parameterAsPointCrs( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context );
732 
736  QString parameterAsFile( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const;
737 
742  QVariantList parameterAsMatrix( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const;
743 
747  QList< QgsMapLayer *> parameterAsLayerList( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const;
748 
752  QList<double> parameterAsRange( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const;
753 
757  QStringList parameterAsFields( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const;
758 
771  static QString invalidSourceError( const QVariantMap &parameters, const QString &name );
772 
785  static QString invalidRasterError( const QVariantMap &parameters, const QString &name );
786 
799  static QString invalidSinkError( const QVariantMap &parameters, const QString &name );
800 
801  private:
802 
803  QgsProcessingProvider *mProvider = nullptr;
806  bool mHasPrepared = false;
807  bool mHasExecuted = false;
808  bool mHasPostProcessed = false;
809  std::unique_ptr< QgsProcessingContext > mLocalContext;
810 
811  bool createAutoOutputForParameter( QgsProcessingParameterDefinition *parameter );
812 
813  friend class QgsProcessingProvider;
814  friend class TestQgsProcessing;
815  friend class QgsProcessingModelAlgorithm;
816 
817 #ifdef SIP_RUN
819 #endif
820 
821 };
822 Q_DECLARE_OPERATORS_FOR_FLAGS( QgsProcessingAlgorithm::Flags )
823 
824 
825 
826 
850 {
851  public:
852 
857 
858  protected:
859 
860  void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) override;
861 
867  virtual QString outputName() const = 0;
868 
874  virtual QList<int> inputLayerTypes() const;
875 
880  virtual QgsProcessing::SourceType outputLayerType() const;
881 
885  virtual QgsProcessingFeatureSource::Flag sourceFlags() const;
886 
894  virtual QgsWkbTypes::Type outputWkbType( QgsWkbTypes::Type inputWkbType ) const;
895 
906  virtual QgsFields outputFields( const QgsFields &inputFields ) const;
907 
916  virtual QgsCoordinateReferenceSystem outputCrs( const QgsCoordinateReferenceSystem &inputCrs ) const;
917 
923  virtual void initParameters( const QVariantMap &configuration = QVariantMap() );
924 
929  QgsCoordinateReferenceSystem sourceCrs() const;
930 
954  virtual QgsFeatureList processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) SIP_THROW( QgsProcessingException ) = 0 SIP_VIRTUALERRORHANDLER( processing_exception_handler );
955 
956  QVariantMap processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override SIP_THROW( QgsProcessingException );
957 
962  virtual QgsFeatureRequest request() const;
963 
964  private:
965 
966  std::unique_ptr< QgsProcessingFeatureSource > mSource;
967 
968 };
969 
970 // clazy:excludeall=qstring-allocations
971 
972 #endif // QGSPROCESSINGALGORITHM_H
973 
974 
#define SIP_VIRTUALERRORHANDLER(name)
Definition: qgis_sip.h:170
QList< const QgsProcessingParameterDefinition *> QgsProcessingParameterDefinitions
List of processing parameters.
A rectangle specified with double values.
Definition: qgsrectangle.h:40
Base class for all map layer types.
Definition: qgsmaplayer.h:61
Base class for providing feedback from a processing algorithm.
QgsProcessingParameterDefinitions parameterDefinitions() const
Returns an ordered list of parameter definitions utilized by the algorithm.
This class provides qgis with the ability to render raster datasets onto the mapcanvas.
QList< QgsFeature > QgsFeatureList
Definition: qgsfeature.h:549
virtual QString group() const
Returns the name of the group this algorithm belongs to.
A class to represent a 2D point.
Definition: qgspointxy.h:43
An interface for objects which accept features via addFeature(s) methods.
QgsFeatureSource subclass which proxies methods to an underlying QgsFeatureSource, modifying results according to the settings in a QgsProcessingContext.
Container of fields for a vector layer.
Definition: qgsfields.h:42
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:104
Abstract base class for processing providers.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:62
#define SIP_TRANSFERBACK
Definition: qgis_sip.h:41
Abstract base class for processing algorithms.
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:67
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
#define SIP_TRANSFER
Definition: qgis_sip.h:36
This class wraps a request for features to a vector layer (or directly its vector data provider)...
Custom exception class for processing related exceptions.
Definition: qgsexception.h:82
#define SIP_END
Definition: qgis_sip.h:182
#define SIP_FACTORY
Definition: qgis_sip.h:69
Flag
Flags controlling how QgsProcessingFeatureSource fetches features.
QgsProcessingOutputDefinitions outputDefinitions() const
Returns an ordered list of output definitions utilized by the algorithm.
Base class for the definition of processing outputs.
QList< const QgsProcessingOutputDefinition *> QgsProcessingOutputDefinitions
List of processing parameters.
A configuration widget for processing algorithms allows providing additional configuration options di...
#define SIP_OUT
Definition: qgis_sip.h:51
This class represents a coordinate reference system (CRS).
Base class for the definition of processing parameters.
Flag
Flags indicating how and when an algorithm operates and should be exposed to users.
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:165
SourceType
Data source types enum.
Definition: qgsprocessing.h:44
#define SIP_THROW(name)
Definition: qgis_sip.h:177
virtual QString groupId() const
Returns the unique ID of the group this algorithm belongs to.
An abstract QgsProcessingAlgorithm base class for processing algorithms which operate "feature-by-fea...
Represents a vector layer which manages a vector based data sets.
Contains information about the context in which a processing algorithm is executed.