Skip to content

Commit 3a2710e

Browse files
authored
Merge pull request #4870 from nyalldawson/algs3
Port 4 more algs to new API
2 parents 97c1def + 38a13ff commit 3a2710e

11 files changed

+430
-286
lines changed

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

+41-35
Original file line numberDiff line numberDiff line change
@@ -27,24 +27,22 @@
2727

2828
import os
2929

30-
from qgis.core import (QgsApplication,
31-
QgsWkbTypes,
32-
QgsFeatureSink,
33-
QgsProcessingUtils)
30+
from qgis.core import (QgsFeatureSink,
31+
QgsProcessing,
32+
QgsProcessingException,
33+
QgsProcessingParameterFeatureSource,
34+
QgsProcessingParameterNumber,
35+
QgsProcessingParameterEnum,
36+
QgsProcessingParameterFeatureSink)
3437

3538
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
36-
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
37-
from processing.core.parameters import ParameterVector, ParameterSelection, ParameterNumber
38-
from processing.core.outputs import OutputVector
39-
from processing.tools import dataobjects
4039

4140
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
4241

4342

4443
class OffsetLine(QgisAlgorithm):
45-
46-
INPUT_LAYER = 'INPUT_LAYER'
47-
OUTPUT_LAYER = 'OUTPUT_LAYER'
44+
INPUT = 'INPUT'
45+
OUTPUT = 'OUTPUT'
4846
DISTANCE = 'DISTANCE'
4947
SEGMENTS = 'SEGMENTS'
5048
JOIN_STYLE = 'JOIN_STYLE'
@@ -57,23 +55,29 @@ def __init__(self):
5755
super().__init__()
5856

5957
def initAlgorithm(self, config=None):
60-
self.addParameter(ParameterVector(self.INPUT_LAYER,
61-
self.tr('Input layer'), [dataobjects.TYPE_VECTOR_LINE]))
62-
self.addParameter(ParameterNumber(self.DISTANCE,
63-
self.tr('Distance'), default=10.0))
64-
self.addParameter(ParameterNumber(self.SEGMENTS,
65-
self.tr('Segments'), 1, default=8))
58+
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, self.tr('Input layer'),
59+
[QgsProcessing.TypeVectorLine]))
60+
self.addParameter(QgsProcessingParameterNumber(self.DISTANCE,
61+
self.tr('Distance'),
62+
type=QgsProcessingParameterNumber.Double,
63+
defaultValue=10.0))
64+
self.addParameter(QgsProcessingParameterNumber(self.SEGMENTS,
65+
self.tr('Segments'),
66+
type=QgsProcessingParameterNumber.Integer,
67+
minValue=1, defaultValue=8))
6668
self.join_styles = [self.tr('Round'),
6769
'Mitre',
6870
'Bevel']
69-
self.addParameter(ParameterSelection(
71+
self.addParameter(QgsProcessingParameterEnum(
7072
self.JOIN_STYLE,
7173
self.tr('Join style'),
72-
self.join_styles))
73-
self.addParameter(ParameterNumber(self.MITRE_LIMIT,
74-
self.tr('Mitre limit'), 1, default=2))
74+
options=self.join_styles))
75+
self.addParameter(QgsProcessingParameterNumber(self.MITRE_LIMIT,
76+
self.tr('Mitre limit'), type=QgsProcessingParameterNumber.Double,
77+
minValue=1, defaultValue=2))
7578

76-
self.addOutput(OutputVector(self.OUTPUT_LAYER, self.tr('Offset'), datatype=[dataobjects.TYPE_VECTOR_LINE]))
79+
self.addParameter(
80+
QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Offset'), QgsProcessing.TypeVectorLine))
7781

7882
def name(self):
7983
return 'offsetline'
@@ -82,31 +86,33 @@ def displayName(self):
8286
return self.tr('Offset line')
8387

8488
def processAlgorithm(self, parameters, context, feedback):
85-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_LAYER), context)
86-
87-
writer = self.getOutputFromName(
88-
self.OUTPUT_LAYER).getVectorWriter(layer.fields(), QgsWkbTypes.LineString, layer.crs(), context)
89+
source = self.parameterAsSource(parameters, self.INPUT, context)
90+
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
91+
source.fields(), source.wkbType(), source.sourceCrs())
8992

90-
distance = self.getParameterValue(self.DISTANCE)
91-
segments = int(self.getParameterValue(self.SEGMENTS))
92-
join_style = self.getParameterValue(self.JOIN_STYLE) + 1
93-
miter_limit = self.getParameterValue(self.MITRE_LIMIT)
93+
distance = self.parameterAsDouble(parameters, self.DISTANCE, context)
94+
segments = self.parameterAsInt(parameters, self.SEGMENTS, context)
95+
join_style = self.parameterAsEnum(parameters, self.JOIN_STYLE, context) + 1
96+
miter_limit = self.parameterAsDouble(parameters, self.MITRE_LIMIT, context)
9497

95-
features = QgsProcessingUtils.getFeatures(layer, context)
96-
total = 100.0 / layer.featureCount() if layer.featureCount() else 0
98+
features = source.getFeatures()
99+
total = 100.0 / source.featureCount() if source.featureCount() else 0
97100

98101
for current, input_feature in enumerate(features):
102+
if feedback.isCanceled():
103+
break
104+
99105
output_feature = input_feature
100106
input_geometry = input_feature.geometry()
101107
if input_geometry:
102108
output_geometry = input_geometry.offsetCurve(distance, segments, join_style, miter_limit)
103109
if not output_geometry:
104-
raise GeoAlgorithmExecutionException(
110+
raise QgsProcessingException(
105111
self.tr('Error calculating line offset'))
106112

107113
output_feature.setGeometry(output_geometry)
108114

109-
writer.addFeature(output_feature, QgsFeatureSink.FastInsert)
115+
sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
110116
feedback.setProgress(int(current * total))
111117

112-
del writer
118+
return {self.OUTPUT: dest_id}

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

+38-32
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,19 @@
2525

2626
__revision__ = '$Format:%H$'
2727

28-
from qgis.core import (QgsApplication,
29-
QgsFeatureSink,
30-
QgsProcessingUtils,
31-
QgsProcessingParameterDefinition)
28+
from qgis.core import (QgsFeatureSink,
29+
QgsProcessingException,
30+
QgsProcessing,
31+
QgsProcessingParameterDefinition,
32+
QgsProcessingParameterFeatureSource,
33+
QgsProcessingParameterNumber,
34+
QgsProcessingParameterFeatureSink)
3235
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
33-
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
34-
from processing.core.parameters import ParameterVector, ParameterNumber
35-
from processing.core.outputs import OutputVector
36-
from processing.tools import dataobjects
3736

3837

3938
class Orthogonalize(QgisAlgorithm):
40-
41-
INPUT_LAYER = 'INPUT_LAYER'
42-
OUTPUT_LAYER = 'OUTPUT_LAYER'
39+
INPUT = 'INPUT'
40+
OUTPUT = 'OUTPUT'
4341
MAX_ITERATIONS = 'MAX_ITERATIONS'
4442
DISTANCE_THRESHOLD = 'DISTANCE_THRESHOLD'
4543
ANGLE_TOLERANCE = 'ANGLE_TOLERANCE'
@@ -54,20 +52,24 @@ def __init__(self):
5452
super().__init__()
5553

5654
def initAlgorithm(self, config=None):
57-
self.addParameter(ParameterVector(self.INPUT_LAYER,
58-
self.tr('Input layer'), [dataobjects.TYPE_VECTOR_LINE,
59-
dataobjects.TYPE_VECTOR_POLYGON]))
60-
self.addParameter(ParameterNumber(self.ANGLE_TOLERANCE,
61-
self.tr('Maximum angle tolerance (degrees)'),
62-
0.0, 45.0, 15.0))
63-
64-
max_iterations = ParameterNumber(self.MAX_ITERATIONS,
65-
self.tr('Maximum algorithm iterations'),
66-
1, 10000, 1000)
55+
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, self.tr('Input layer'),
56+
[QgsProcessing.TypeVectorLine,
57+
QgsProcessing.TypeVectorPolygon]))
58+
59+
self.addParameter(QgsProcessingParameterNumber(self.ANGLE_TOLERANCE,
60+
self.tr('Maximum angle tolerance (degrees)'),
61+
type=QgsProcessingParameterNumber.Double,
62+
minValue=0.0, maxValue=45.0, defaultValue=15.0))
63+
64+
max_iterations = QgsProcessingParameterNumber(self.MAX_ITERATIONS,
65+
self.tr('Maximum algorithm iterations'),
66+
type=QgsProcessingParameterNumber.Integer,
67+
minValue=1, maxValue=10000, defaultValue=1000)
6768
max_iterations.setFlags(max_iterations.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
6869
self.addParameter(max_iterations)
6970

70-
self.addOutput(OutputVector(self.OUTPUT_LAYER, self.tr('Orthogonalized')))
71+
self.addParameter(
72+
QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Orthogonalized')))
7173

7274
def name(self):
7375
return 'orthogonalize'
@@ -76,27 +78,31 @@ def displayName(self):
7678
return self.tr('Orthogonalize')
7779

7880
def processAlgorithm(self, parameters, context, feedback):
79-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_LAYER), context)
80-
max_iterations = self.getParameterValue(self.MAX_ITERATIONS)
81-
angle_tolerance = self.getParameterValue(self.ANGLE_TOLERANCE)
82-
writer = self.getOutputFromName(
83-
self.OUTPUT_LAYER).getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), context)
81+
source = self.parameterAsSource(parameters, self.INPUT, context)
82+
max_iterations = self.parameterAsInt(parameters, self.MAX_ITERATIONS, context)
83+
angle_tolerance = self.parameterAsDouble(parameters, self.ANGLE_TOLERANCE, context)
84+
85+
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
86+
source.fields(), source.wkbType(), source.sourceCrs())
8487

85-
features = QgsProcessingUtils.getFeatures(layer, context)
86-
total = 100.0 / layer.featureCount() if layer.featureCount() else 0
88+
features = source.getFeatures()
89+
total = 100.0 / source.featureCount() if source.featureCount() else 0
8790

8891
for current, input_feature in enumerate(features):
92+
if feedback.isCanceled():
93+
break
94+
8995
output_feature = input_feature
9096
input_geometry = input_feature.geometry()
9197
if input_geometry:
9298
output_geometry = input_geometry.orthogonalize(1.0e-8, max_iterations, angle_tolerance)
9399
if not output_geometry:
94-
raise GeoAlgorithmExecutionException(
100+
raise QgsProcessingException(
95101
self.tr('Error orthogonalizing geometry'))
96102

97103
output_feature.setGeometry(output_geometry)
98104

99-
writer.addFeature(output_feature, QgsFeatureSink.FastInsert)
105+
sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
100106
feedback.setProgress(int(current * total))
101107

102-
del writer
108+
return {self.OUTPUT: dest_id}

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

+33-24
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,29 @@
2727

2828
import os
2929

30-
from qgis.core import QgsWkbTypes, QgsField, NULL, QgsFeatureSink, QgsProcessingUtils
30+
from qgis.core import (QgsWkbTypes,
31+
QgsField,
32+
NULL,
33+
QgsFeatureSink,
34+
QgsProcessing,
35+
QgsProcessingException,
36+
QgsProcessingParameterFeatureSource,
37+
QgsProcessingParameterNumber,
38+
QgsProcessingParameterFeatureSink)
3139

3240
from qgis.PyQt.QtCore import QVariant
3341
from qgis.PyQt.QtGui import QIcon
3442

3543
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
36-
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
37-
from processing.core.parameters import ParameterVector, ParameterNumber
38-
from processing.core.outputs import OutputVector
39-
from processing.tools import dataobjects
4044

4145
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
4246

4347

4448
class PoleOfInaccessibility(QgisAlgorithm):
4549

46-
INPUT_LAYER = 'INPUT_LAYER'
50+
INPUT = 'INPUT'
4751
TOLERANCE = 'TOLERANCE'
48-
OUTPUT_LAYER = 'OUTPUT_LAYER'
52+
OUTPUT = 'OUTPUT'
4953

5054
def icon(self):
5155
return QIcon(os.path.join(pluginPath, 'images', 'ftools', 'centroids.png'))
@@ -60,12 +64,15 @@ def __init__(self):
6064
super().__init__()
6165

6266
def initAlgorithm(self, config=None):
63-
self.addParameter(ParameterVector(self.INPUT_LAYER,
64-
self.tr('Input layer'),
65-
[dataobjects.TYPE_VECTOR_POLYGON]))
66-
self.addParameter(ParameterNumber(self.TOLERANCE,
67-
self.tr('Tolerance (layer units)'), default=1.0, minValue=0.0))
68-
self.addOutput(OutputVector(self.OUTPUT_LAYER, self.tr('Point'), datatype=[dataobjects.TYPE_VECTOR_POINT]))
67+
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, self.tr('Input layer'),
68+
[QgsProcessing.TypeVectorPolygon]))
69+
self.addParameter(QgsProcessingParameterNumber(self.TOLERANCE,
70+
self.tr('Tolerance (layer units)'),
71+
type=QgsProcessingParameterNumber.Double,
72+
defaultValue=1.0, minValue=0.0))
73+
74+
self.addParameter(
75+
QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Point'), QgsProcessing.TypeVectorPoint))
6976

7077
def name(self):
7178
return 'poleofinaccessibility'
@@ -74,25 +81,27 @@ def displayName(self):
7481
return self.tr('Pole of Inaccessibility')
7582

7683
def processAlgorithm(self, parameters, context, feedback):
77-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_LAYER), context)
78-
tolerance = self.getParameterValue(self.TOLERANCE)
84+
source = self.parameterAsSource(parameters, self.INPUT, context)
85+
tolerance = self.parameterAsDouble(parameters, self.TOLERANCE, context)
7986

80-
fields = layer.fields()
87+
fields = source.fields()
8188
fields.append(QgsField('dist_pole', QVariant.Double))
89+
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
90+
fields, QgsWkbTypes.Point, source.sourceCrs())
8291

83-
writer = self.getOutputFromName(
84-
self.OUTPUT_LAYER).getVectorWriter(fields, QgsWkbTypes.Point, layer.crs(), context)
85-
86-
features = QgsProcessingUtils.getFeatures(layer, context)
87-
total = 100.0 / layer.featureCount() if layer.featureCount() else 0
92+
features = source.getFeatures()
93+
total = 100.0 / source.featureCount() if source.featureCount() else 0
8894

8995
for current, input_feature in enumerate(features):
96+
if feedback.isCanceled():
97+
break
98+
9099
output_feature = input_feature
91100
input_geometry = input_feature.geometry()
92101
if input_geometry:
93102
output_geometry, distance = input_geometry.poleOfInaccessibility(tolerance)
94103
if not output_geometry:
95-
raise GeoAlgorithmExecutionException(
104+
raise QgsProcessingException(
96105
self.tr('Error calculating pole of inaccessibility'))
97106
attrs = input_feature.attributes()
98107
attrs.append(distance)
@@ -104,7 +113,7 @@ def processAlgorithm(self, parameters, context, feedback):
104113
attrs.append(NULL)
105114
output_feature.setAttributes(attrs)
106115

107-
writer.addFeature(output_feature, QgsFeatureSink.FastInsert)
116+
sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
108117
feedback.setProgress(int(current * total))
109118

110-
del writer
119+
return {self.OUTPUT: dest_id}

0 commit comments

Comments
 (0)