Skip to content

Commit d53fa8d

Browse files
committed
Port another alg to new API
1 parent ab64428 commit d53fa8d

File tree

4 files changed

+79
-56
lines changed

4 files changed

+79
-56
lines changed

python/plugins/processing/algs/qgis/AddTableField.py

Lines changed: 45 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,14 @@
2929
from qgis.core import (QgsField,
3030
QgsFeature,
3131
QgsApplication,
32-
QgsProcessingUtils)
33-
from processing.algs.qgis import QgisAlgorithm
34-
from processing.core.parameters import ParameterVector
35-
from processing.core.parameters import ParameterString
36-
from processing.core.parameters import ParameterNumber
37-
from processing.core.parameters import ParameterSelection
38-
from processing.core.outputs import OutputVector
32+
QgsProcessingUtils,
33+
QgsProcessingParameterFeatureSource,
34+
QgsProcessingParameterString,
35+
QgsProcessingParameterNumber,
36+
QgsProcessingParameterEnum,
37+
QgsProcessingParameterFeatureSink,
38+
QgsProcessingOutputVectorLayer)
39+
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
3940

4041

4142
class AddTableField(QgisAlgorithm):
@@ -64,18 +65,19 @@ def __init__(self):
6465
self.tr('Float'),
6566
self.tr('String')]
6667

67-
self.addParameter(ParameterVector(self.INPUT_LAYER,
68-
self.tr('Input layer')))
69-
self.addParameter(ParameterString(self.FIELD_NAME,
70-
self.tr('Field name')))
71-
self.addParameter(ParameterSelection(self.FIELD_TYPE,
72-
self.tr('Field type'), self.type_names))
73-
self.addParameter(ParameterNumber(self.FIELD_LENGTH,
74-
self.tr('Field length'), 1, 255, 10))
75-
self.addParameter(ParameterNumber(self.FIELD_PRECISION,
76-
self.tr('Field precision'), 0, 10, 0))
77-
self.addOutput(OutputVector(
78-
self.OUTPUT_LAYER, self.tr('Added')))
68+
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT_LAYER,
69+
self.tr('Input layer')))
70+
self.addParameter(QgsProcessingParameterString(self.FIELD_NAME,
71+
self.tr('Field name')))
72+
self.addParameter(QgsProcessingParameterEnum(self.FIELD_TYPE,
73+
self.tr('Field type'), self.type_names))
74+
self.addParameter(QgsProcessingParameterNumber(self.FIELD_LENGTH,
75+
self.tr('Field length'), QgsProcessingParameterNumber.Integer,
76+
10, False, 1, 255))
77+
self.addParameter(QgsProcessingParameterNumber(self.FIELD_PRECISION,
78+
self.tr('Field precision'), QgsProcessingParameterNumber.Integer, 0, False, 0, 10))
79+
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT_LAYER, self.tr('Added')))
80+
self.addOutput(QgsProcessingOutputVectorLayer(self.OUTPUT_LAYER, self.tr('Added')))
7981

8082
def name(self):
8183
return 'addfieldtoattributestable'
@@ -84,27 +86,32 @@ def displayName(self):
8486
return self.tr('Add field to attributes table')
8587

8688
def processAlgorithm(self, parameters, context, feedback):
87-
fieldType = self.getParameterValue(self.FIELD_TYPE)
88-
fieldName = self.getParameterValue(self.FIELD_NAME)
89-
fieldLength = self.getParameterValue(self.FIELD_LENGTH)
90-
fieldPrecision = self.getParameterValue(self.FIELD_PRECISION)
91-
output = self.getOutputFromName(self.OUTPUT_LAYER)
89+
source = self.parameterAsSource(parameters, self.INPUT_LAYER, context)
9290

93-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_LAYER), context)
91+
fieldType = self.parameterAsEnum(parameters, self.FIELD_TYPE, context)
92+
fieldName = self.parameterAsString(parameters, self.FIELD_NAME, context)
93+
fieldLength = self.parameterAsInt(parameters, self.FIELD_LENGTH, context)
94+
fieldPrecision = self.parameterAsInt(parameters, self.FIELD_PRECISION, context)
9495

95-
fields = layer.fields()
96+
fields = source.fields()
9697
fields.append(QgsField(fieldName, self.TYPES[fieldType], '',
9798
fieldLength, fieldPrecision))
98-
writer = output.getVectorWriter(fields, layer.wkbType(), layer.crs(), context)
99-
outFeat = QgsFeature()
100-
features = QgsProcessingUtils.getFeatures(layer, context)
101-
total = 100.0 / QgsProcessingUtils.featureCount(layer, context)
102-
for current, feat in enumerate(features):
99+
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT_LAYER, context,
100+
fields, source.wkbType(), source.sourceCrs())
101+
102+
features = source.getFeatures()
103+
total = 100.0 / source.featureCount()
104+
105+
for current, input_feature in enumerate(features):
106+
if feedback.isCanceled():
107+
break
108+
109+
output_feature = input_feature
110+
attributes = input_feature.attributes()
111+
attributes.append(None)
112+
output_feature.setAttributes(attributes)
113+
114+
sink.addFeature(output_feature)
103115
feedback.setProgress(int(current * total))
104-
geom = feat.geometry()
105-
outFeat.setGeometry(geom)
106-
atMap = feat.attributes()
107-
atMap.append(None)
108-
outFeat.setAttributes(atMap)
109-
writer.addFeature(outFeat)
110-
del writer
116+
117+
return {self.OUTPUT_LAYER: dest_id}

python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@
104104
# from .RasterLayerStatistics import RasterLayerStatistics
105105
# from .StatisticsByCategories import StatisticsByCategories
106106
# from .EquivalentNumField import EquivalentNumField
107-
# from .AddTableField import AddTableField
107+
from .AddTableField import AddTableField
108108
# from .FieldsCalculator import FieldsCalculator
109109
# from .SaveSelectedFeatures import SaveSelectedFeatures
110110
# from .Explode import Explode
@@ -220,7 +220,7 @@ def getAlgs(self):
220220
# ExtractByAttribute(), SelectByAttribute(), GridPolygon(),
221221
# GridLine(), Gridify(), HubDistancePoints(),
222222
# HubDistanceLines(), HubLines(), Merge(),
223-
# GeometryConvert(), AddTableField(), FieldsCalculator(),
223+
# GeometryConvert(), FieldsCalculator(),
224224
# SaveSelectedFeatures(), JoinAttributes(),
225225
# AutoincrementalField(), Explode(), FieldsPyculator(),
226226
# EquivalentNumField(), PointsLayerFromTable(),
@@ -259,7 +259,8 @@ def getAlgs(self):
259259
# FixGeometry(), ExecuteSQL(), FindProjection(),
260260
# TopoColor(), EliminateSelection()
261261
# ]
262-
algs = [Boundary(),
262+
algs = [AddTableField(),
263+
Boundary(),
263264
BoundingBox()]
264265

265266
# if hasPlotly:

python/plugins/processing/gui/wrappers.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -909,6 +909,21 @@ def createWidget(self):
909909
widget.addItem(desc, val)
910910
return widget
911911

912+
def showExpressionsBuilder(self):
913+
context = dataobjects.createExpressionContext()
914+
value = self.value()
915+
if not isinstance(value, str):
916+
value = ''
917+
dlg = QgsExpressionBuilderDialog(None, value, self.widget, 'generic', context)
918+
dlg.setWindowTitle(self.tr('Expression based input'))
919+
if dlg.exec_() == QDialog.Accepted:
920+
exp = QgsExpression(dlg.expressionText())
921+
if not exp.hasParserError():
922+
if self.dialogType == DIALOG_STANDARD:
923+
self.setValue(str(exp.evaluate(context)))
924+
else:
925+
self.setValue(dlg.expressionText())
926+
912927
def setValue(self, value):
913928
if self.dialogType == DIALOG_STANDARD:
914929
if self.param.multiLine():

python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2524,21 +2524,21 @@ tests:
25242524
# # name: expected/extract_by_location_within.gml
25252525
# # type: vector
25262526
#
2527-
# - algorithm: qgis:addfieldtoattributestable
2528-
# name: add float field
2529-
# params:
2530-
# FIELD_LENGTH: 10
2531-
# FIELD_NAME: field
2532-
# FIELD_PRECISION: 2
2533-
# FIELD_TYPE: '1'
2534-
# INPUT_LAYER:
2535-
# name: custom/points.shp
2536-
# type: vector
2537-
# results:
2538-
# OUTPUT_LAYER:
2539-
# name: expected/add_field.gml
2540-
# type: vector
2541-
#
2527+
- algorithm: qgis:addfieldtoattributestable
2528+
name: add float field
2529+
params:
2530+
FIELD_LENGTH: 10
2531+
FIELD_NAME: field
2532+
FIELD_PRECISION: 2
2533+
FIELD_TYPE: '1'
2534+
INPUT_LAYER:
2535+
name: custom/points.shp
2536+
type: vector
2537+
results:
2538+
OUTPUT_LAYER:
2539+
name: expected/add_field.gml
2540+
type: vector
2541+
25422542
# - algorithm: qgis:randompointsinextent
25432543
# name: Random point in extent, don't check result
25442544
# params:

0 commit comments

Comments
 (0)