Skip to content

Commit b01cae0

Browse files
authoredJun 21, 2017
Merge pull request #4761 from nyalldawson/algs2
Port more processing algs to new API
2 parents 57bf9da + a65e171 commit b01cae0

23 files changed

+1239
-366
lines changed
 

‎python/core/processing/qgsprocessingparameters.sip

Lines changed: 77 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -163,14 +163,16 @@ class QgsProcessingParameterDefinition
163163
sipType = sipType_QgsProcessingParameterString;
164164
else if ( sipCpp->type() == "expression" )
165165
sipType = sipType_QgsProcessingParameterExpression;
166-
else if ( sipCpp->type() == "table" )
167-
sipType = sipType_QgsProcessingParameterTable;
166+
else if ( sipCpp->type() == "vector" )
167+
sipType = sipType_QgsProcessingParameterVectorLayer;
168168
else if ( sipCpp->type() == "field" )
169-
sipType = sipType_QgsProcessingParameterTableField;
169+
sipType = sipType_QgsProcessingParameterField;
170170
else if ( sipCpp->type() == "source" )
171171
sipType = sipType_QgsProcessingParameterFeatureSource;
172172
else if ( sipCpp->type() == "sink" )
173173
sipType = sipType_QgsProcessingParameterFeatureSink;
174+
else if ( sipCpp->type() == "vectorOut" )
175+
sipType = sipType_QgsProcessingParameterVectorOutput;
174176
else if ( sipCpp->type() == "rasterOut" )
175177
sipType = sipType_QgsProcessingParameterRasterOutput;
176178
else if ( sipCpp->type() == "fileOut" )
@@ -1153,10 +1155,11 @@ class QgsProcessingParameterExpression : QgsProcessingParameterDefinition
11531155

11541156
};
11551157

1156-
class QgsProcessingParameterTable : QgsProcessingParameterDefinition
1158+
class QgsProcessingParameterVectorLayer : QgsProcessingParameterDefinition
11571159
{
11581160
%Docstring
1159-
A table (i.e. vector layers with or without geometry) parameter for processing algorithms.
1161+
A vector layer (with or without geometry) parameter for processing algorithms. Consider using
1162+
the more versatile QgsProcessingParameterFeatureSource wherever possible.
11601163
.. versionadded:: 3.0
11611164
%End
11621165

@@ -1165,20 +1168,24 @@ class QgsProcessingParameterTable : QgsProcessingParameterDefinition
11651168
%End
11661169
public:
11671170

1168-
QgsProcessingParameterTable( const QString &name, const QString &description = QString(), const QVariant &defaultValue = QVariant(),
1169-
bool optional = false );
1171+
QgsProcessingParameterVectorLayer( const QString &name, const QString &description = QString(), const QVariant &defaultValue = QVariant(),
1172+
bool optional = false );
11701173
%Docstring
1171-
Constructor for QgsProcessingParameterTable.
1174+
Constructor for QgsProcessingParameterVectorLayer.
11721175
%End
11731176

11741177
virtual QString type() const;
1178+
virtual bool checkValueIsAcceptable( const QVariant &input, QgsProcessingContext *context = 0 ) const;
1179+
1180+
virtual QString valueAsPythonString( const QVariant &value, QgsProcessingContext &context ) const;
1181+
11751182

11761183
};
11771184

1178-
class QgsProcessingParameterTableField : QgsProcessingParameterDefinition
1185+
class QgsProcessingParameterField : QgsProcessingParameterDefinition
11791186
{
11801187
%Docstring
1181-
A table field parameter for processing algorithms.
1188+
A vector layer or feature source field parameter for processing algorithms.
11821189
.. versionadded:: 3.0
11831190
%End
11841191

@@ -1195,13 +1202,13 @@ class QgsProcessingParameterTableField : QgsProcessingParameterDefinition
11951202
DateTime
11961203
};
11971204

1198-
QgsProcessingParameterTableField( const QString &name, const QString &description = QString(), const QVariant &defaultValue = QVariant(),
1199-
const QString &parentLayerParameterName = QString(),
1200-
DataType type = Any,
1201-
bool allowMultiple = false,
1202-
bool optional = false );
1205+
QgsProcessingParameterField( const QString &name, const QString &description = QString(), const QVariant &defaultValue = QVariant(),
1206+
const QString &parentLayerParameterName = QString(),
1207+
DataType type = Any,
1208+
bool allowMultiple = false,
1209+
bool optional = false );
12031210
%Docstring
1204-
Constructor for QgsProcessingParameterTableField.
1211+
Constructor for QgsProcessingParameterField.
12051212
%End
12061213

12071214
virtual QString type() const;
@@ -1354,6 +1361,60 @@ class QgsProcessingParameterFeatureSink : QgsProcessingParameterDefinition
13541361
virtual bool fromVariantMap( const QVariantMap &map );
13551362

13561363

1364+
};
1365+
1366+
1367+
class QgsProcessingParameterVectorOutput : QgsProcessingParameterDefinition
1368+
{
1369+
%Docstring
1370+
A vector layer output parameter. Consider using the more flexible QgsProcessingParameterFeatureSink wherever
1371+
possible.
1372+
.. versionadded:: 3.0
1373+
%End
1374+
1375+
%TypeHeaderCode
1376+
#include "qgsprocessingparameters.h"
1377+
%End
1378+
public:
1379+
1380+
QgsProcessingParameterVectorOutput( const QString &name, const QString &description = QString(), QgsProcessingParameterDefinition::LayerType type = QgsProcessingParameterDefinition::TypeVectorAny, const QVariant &defaultValue = QVariant(),
1381+
bool optional = false );
1382+
%Docstring
1383+
Constructor for QgsProcessingParameterVectorOutput.
1384+
%End
1385+
1386+
virtual QString type() const;
1387+
virtual bool isDestination() const;
1388+
virtual bool checkValueIsAcceptable( const QVariant &input, QgsProcessingContext *context = 0 ) const;
1389+
1390+
virtual QString valueAsPythonString( const QVariant &value, QgsProcessingContext &context ) const;
1391+
1392+
1393+
QgsProcessingParameterDefinition::LayerType dataType() const;
1394+
%Docstring
1395+
Returns the layer type for layers associated with the parameter.
1396+
.. seealso:: setDataType()
1397+
:rtype: QgsProcessingParameterDefinition.LayerType
1398+
%End
1399+
1400+
bool hasGeometry() const;
1401+
%Docstring
1402+
Returns true if the layer is likely to include geometries. In cases were presence of geometry
1403+
cannot be reliably determined in advance, this method will default to returning true.
1404+
:rtype: bool
1405+
%End
1406+
1407+
void setDataType( QgsProcessingParameterDefinition::LayerType type );
1408+
%Docstring
1409+
Sets the layer ``type`` for the layers associated with the parameter.
1410+
.. seealso:: dataType()
1411+
%End
1412+
1413+
virtual QVariantMap toVariantMap() const;
1414+
1415+
virtual bool fromVariantMap( const QVariantMap &map );
1416+
1417+
13571418
};
13581419

13591420
class QgsProcessingParameterRasterOutput : QgsProcessingParameterDefinition

‎python/plugins/processing/algs/qgis/BarPlot.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
from qgis.core import (QgsApplication,
3333
QgsProcessingUtils,
3434
QgsProcessingParameterFeatureSource,
35-
QgsProcessingParameterTableField,
35+
QgsProcessingParameterField,
3636
QgsProcessingParameterFileOutput,
3737
QgsProcessingOutputHtml)
3838
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
@@ -60,12 +60,12 @@ def __init__(self):
6060

6161
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
6262
self.tr('Input layer')))
63-
self.addParameter(QgsProcessingParameterTableField(self.NAME_FIELD,
64-
self.tr('Category name field'),
65-
None, self.INPUT, QgsProcessingParameterTableField.Any))
66-
self.addParameter(QgsProcessingParameterTableField(self.VALUE_FIELD,
67-
self.tr('Value field'),
68-
None, self.INPUT, QgsProcessingParameterTableField.Numeric))
63+
self.addParameter(QgsProcessingParameterField(self.NAME_FIELD,
64+
self.tr('Category name field'),
65+
None, self.INPUT, QgsProcessingParameterField.Any))
66+
self.addParameter(QgsProcessingParameterField(self.VALUE_FIELD,
67+
self.tr('Value field'),
68+
None, self.INPUT, QgsProcessingParameterField.Numeric))
6969

7070
self.addParameter(QgsProcessingParameterFileOutput(self.OUTPUT, self.tr('Added'), self.tr('HTML files (*.html)')))
7171

‎python/plugins/processing/algs/qgis/BasicStatistics.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
QgsFeatureRequest,
3838
QgsProcessingUtils,
3939
QgsProcessingParameterFeatureSource,
40-
QgsProcessingParameterTableField,
40+
QgsProcessingParameterField,
4141
QgsProcessingParameterFileOutput,
4242
QgsProcessingOutputHtml,
4343
QgsProcessingOutputNumber)
@@ -90,9 +90,9 @@ def __init__(self):
9090
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT_LAYER,
9191
self.tr('Input layer')))
9292

93-
self.addParameter(QgsProcessingParameterTableField(self.FIELD_NAME,
94-
self.tr('Field to calculate statistics on'),
95-
None, self.INPUT_LAYER, QgsProcessingParameterTableField.Any))
93+
self.addParameter(QgsProcessingParameterField(self.FIELD_NAME,
94+
self.tr('Field to calculate statistics on'),
95+
None, self.INPUT_LAYER, QgsProcessingParameterField.Any))
9696

9797
self.addParameter(QgsProcessingParameterFileOutput(self.OUTPUT_HTML_FILE, self.tr('Statistics'), self.tr('HTML files (*.html)'), None, True))
9898
self.addOutput(QgsProcessingOutputHtml(self.OUTPUT_HTML_FILE, self.tr('Statistics')))

‎python/plugins/processing/algs/qgis/CreateAttributeIndex.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@
2828
from qgis.core import (QgsVectorDataProvider,
2929
QgsFields,
3030
QgsApplication,
31-
QgsProcessingUtils)
31+
QgsProcessingParameterVectorLayer,
32+
QgsProcessingParameterField,
33+
QgsProcessingParameterDefinition,
34+
QgsProcessingOutputVectorLayer)
3235

3336
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
34-
from processing.core.parameters import ParameterTable
35-
from processing.core.parameters import ParameterTableField
36-
from processing.core.outputs import OutputVector
3737

3838

3939
class CreateAttributeIndex(QgisAlgorithm):
@@ -53,12 +53,11 @@ def group(self):
5353

5454
def __init__(self):
5555
super().__init__()
56-
self.addParameter(ParameterTable(self.INPUT,
57-
self.tr('Input Layer')))
58-
self.addParameter(ParameterTableField(self.FIELD,
59-
self.tr('Attribute to index'), self.INPUT))
60-
self.addOutput(OutputVector(self.OUTPUT,
61-
self.tr('Indexed layer'), True))
56+
self.addParameter(QgsProcessingParameterVectorLayer(self.INPUT,
57+
self.tr('Input Layer')))
58+
self.addParameter(QgsProcessingParameterField(self.FIELD,
59+
self.tr('Attribute to index'), None, self.INPUT))
60+
self.addOutput(QgsProcessingOutputVectorLayer(self.OUTPUT, self.tr('Indexed layer')))
6261

6362
def name(self):
6463
return 'createattributeindex'
@@ -67,9 +66,8 @@ def displayName(self):
6766
return self.tr('Create attribute index')
6867

6968
def processAlgorithm(self, parameters, context, feedback):
70-
file_name = self.getParameterValue(self.INPUT)
71-
layer = QgsProcessingUtils.mapLayerFromString(file_name, context)
72-
field = self.getParameterValue(self.FIELD)
69+
layer = self.parameterAsVectorLayer(parameters, self.INPUT, context)
70+
field = self.parameterAsString(parameters, self.FIELD, context)
7371
provider = layer.dataProvider()
7472

7573
field_index = layer.fields().lookupField(field)
@@ -84,4 +82,4 @@ def processAlgorithm(self, parameters, context, feedback):
8482
feedback.pushInfo(self.tr("Layer's data provider does not support "
8583
"creating attribute indexes"))
8684

87-
self.setOutputValue(self.OUTPUT, file_name)
85+
return {self.OUTPUT: layer.id()}

‎python/plugins/processing/algs/qgis/DeleteColumn.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
QgsProcessingUtils,
3030
QgsProcessingParameterFeatureSource,
3131
QgsProcessingParameterFeatureSink,
32-
QgsProcessingParameterTableField,
32+
QgsProcessingParameterField,
3333
QgsProcessingOutputVectorLayer)
3434
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
3535

@@ -56,9 +56,9 @@ def __init__(self):
5656
super().__init__()
5757

5858
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, self.tr('Input layer')))
59-
self.addParameter(QgsProcessingParameterTableField(self.COLUMNS,
60-
self.tr('Fields to delete'),
61-
None, self.INPUT, QgsProcessingParameterTableField.Any, True))
59+
self.addParameter(QgsProcessingParameterField(self.COLUMNS,
60+
self.tr('Fields to delete'),
61+
None, self.INPUT, QgsProcessingParameterField.Any, True))
6262

6363
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Output layer')))
6464
self.addOutput(QgsProcessingOutputVectorLayer(self.OUTPUT, self.tr("Output layer")))

‎python/plugins/processing/algs/qgis/DeleteHoles.py

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,13 @@
2525
__revision__ = '$Format:%H$'
2626

2727
from qgis.core import (QgsApplication,
28-
QgsProcessingUtils)
28+
QgsProcessingUtils,
29+
QgsProcessingParameterFeatureSource,
30+
QgsProcessingParameterNumber,
31+
QgsProcessingParameterFeatureSink,
32+
QgsProcessingOutputVectorLayer,
33+
QgsProcessingParameterDefinition)
2934
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
30-
from processing.core.parameters import (ParameterVector,
31-
ParameterNumber)
32-
from processing.core.outputs import OutputVector
33-
from processing.tools import dataobjects
3435

3536

3637
class DeleteHoles(QgisAlgorithm):
@@ -53,12 +54,14 @@ def group(self):
5354

5455
def __init__(self):
5556
super().__init__()
56-
self.addParameter(ParameterVector(self.INPUT,
57-
self.tr('Input layer'), [dataobjects.TYPE_VECTOR_POLYGON]))
58-
self.addParameter(ParameterNumber(self.MIN_AREA,
59-
self.tr('Remove holes with area less than'), 0, 10000000.0, default=0.0, optional=True))
57+
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
58+
self.tr('Input layer'), [QgsProcessingParameterDefinition.TypeVectorPolygon]))
59+
self.addParameter(QgsProcessingParameterNumber(self.MIN_AREA,
60+
self.tr('Remove holes with area less than'), QgsProcessingParameterNumber.Double,
61+
0, True, 0.0, 10000000.0))
6062

61-
self.addOutput(OutputVector(self.OUTPUT, self.tr('Cleaned'), datatype=[dataobjects.TYPE_VECTOR_POLYGON]))
63+
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Cleaned'), QgsProcessingParameterDefinition.TypeVectorPolygon))
64+
self.addOutput(QgsProcessingOutputVectorLayer(self.OUTPUT, self.tr('Cleaned'), QgsProcessingParameterDefinition.TypeVectorPolygon))
6265

6366
def name(self):
6467
return 'deleteholes'
@@ -67,29 +70,24 @@ def displayName(self):
6770
return self.tr('Delete holes')
6871

6972
def processAlgorithm(self, parameters, context, feedback):
70-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context)
71-
min_area = self.getParameterValue(self.MIN_AREA)
72-
if min_area is not None:
73-
try:
74-
min_area = float(min_area)
75-
except:
76-
pass
73+
source = self.parameterAsSource(parameters, self.INPUT, context)
74+
min_area = self.parameterAsDouble(parameters, self.MIN_AREA, context)
7775
if min_area == 0.0:
7876
min_area = -1.0
7977

80-
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(),
81-
context)
78+
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
79+
source.fields(), source.wkbType(), source.sourceCrs())
8280

83-
features = QgsProcessingUtils.getFeatures(layer, context)
84-
total = 100.0 / QgsProcessingUtils.featureCount(layer, context)
81+
features = source.getFeatures()
82+
total = 100.0 / source.featureCount()
8583

8684
for current, f in enumerate(features):
85+
if feedback.isCanceled():
86+
break
87+
8788
if f.hasGeometry():
88-
if min_area is not None:
89-
f.setGeometry(f.geometry().removeInteriorRings(min_area))
90-
else:
91-
f.setGeometry(f.geometry().removeInteriorRings())
92-
writer.addFeature(f)
89+
f.setGeometry(f.geometry().removeInteriorRings(min_area))
90+
sink.addFeature(f)
9391
feedback.setProgress(int(current * total))
9492

95-
del writer
93+
return {self.OUTPUT: dest_id}

0 commit comments

Comments
 (0)
Please sign in to comment.