Skip to content

Commit c0669d4

Browse files
committed
Port extend lines to new API
1 parent 1cac3bb commit c0669d4

File tree

3 files changed

+58
-75
lines changed

3 files changed

+58
-75
lines changed

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

Lines changed: 26 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,13 @@
2525

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

28-
from qgis.core import (QgsApplication,
29-
QgsFeatureSink,
30-
QgsProcessingUtils)
31-
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
32-
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
33-
from processing.core.parameters import ParameterVector, ParameterNumber
34-
from processing.core.outputs import OutputVector
35-
from processing.tools import dataobjects
28+
from qgis.core import (QgsProcessingParameterNumber,
29+
QgsProcessingException)
30+
from processing.algs.qgis.QgisAlgorithm import QgisFeatureBasedAlgorithm
3631

3732

38-
class ExtendLines(QgisAlgorithm):
33+
class ExtendLines(QgisFeatureBasedAlgorithm):
3934

40-
INPUT_LAYER = 'INPUT_LAYER'
41-
OUTPUT_LAYER = 'OUTPUT_LAYER'
4235
START_DISTANCE = 'START_DISTANCE'
4336
END_DISTANCE = 'END_DISTANCE'
4437

@@ -47,47 +40,37 @@ def group(self):
4740

4841
def __init__(self):
4942
super().__init__()
43+
self.start_distance = None
44+
self.end_distance = None
5045

51-
def initAlgorithm(self, config=None):
52-
self.addParameter(ParameterVector(self.INPUT_LAYER,
53-
self.tr('Input layer'), [dataobjects.TYPE_VECTOR_LINE]))
54-
self.addParameter(ParameterNumber(self.START_DISTANCE,
55-
self.tr('Start distance'), default=0.0))
56-
self.addParameter(ParameterNumber(self.END_DISTANCE,
57-
self.tr('End distance'), default=0.0))
58-
59-
self.addOutput(OutputVector(self.OUTPUT_LAYER, self.tr('Extended lines')))
46+
def initParameters(self, config=None):
47+
self.addParameter(QgsProcessingParameterNumber(self.START_DISTANCE,
48+
self.tr('Start distance'), defaultValue=0.0))
49+
self.addParameter(QgsProcessingParameterNumber(self.END_DISTANCE,
50+
self.tr('End distance'), defaultValue=0.0))
6051

6152
def name(self):
6253
return 'extendlines'
6354

6455
def displayName(self):
6556
return self.tr('Extend lines')
6657

67-
def processAlgorithm(self, parameters, context, feedback):
68-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_LAYER), context)
69-
70-
writer = self.getOutputFromName(
71-
self.OUTPUT_LAYER).getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), context)
72-
73-
start_distance = self.getParameterValue(self.START_DISTANCE)
74-
end_distance = self.getParameterValue(self.END_DISTANCE)
75-
76-
features = QgsProcessingUtils.getFeatures(layer, context)
77-
total = 100.0 / layer.featureCount() if layer.featureCount() else 0
58+
def outputName(self):
59+
return self.tr('Extended')
7860

79-
for current, input_feature in enumerate(features):
80-
output_feature = input_feature
81-
input_geometry = input_feature.geometry()
82-
if input_geometry:
83-
output_geometry = input_geometry.extendLine(start_distance, end_distance)
84-
if not output_geometry:
85-
raise GeoAlgorithmExecutionException(
86-
self.tr('Error calculating extended line'))
61+
def prepareAlgorithm(self, parameters, context, feedback):
62+
self.start_distance = self.parameterAsDouble(parameters, self.START_DISTANCE, context)
63+
self.end_distance = self.parameterAsDouble(parameters, self.END_DISTANCE, context)
64+
return True
8765

88-
output_feature.setGeometry(output_geometry)
66+
def processFeature(self, feature, feedback):
67+
input_geometry = feature.geometry()
68+
if input_geometry:
69+
output_geometry = input_geometry.extendLine(self.start_distance, self.end_distance)
70+
if not output_geometry:
71+
raise QgsProcessingException(
72+
self.tr('Error calculating extended line'))
8973

90-
writer.addFeature(output_feature, QgsFeatureSink.FastInsert)
91-
feedback.setProgress(int(current * total))
74+
feature.setGeometry(output_geometry)
9275

93-
del writer
76+
return feature

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
from .Difference import Difference
5858
from .DropGeometry import DropGeometry
5959
from .DropMZValues import DropMZValues
60+
from .ExtendLines import ExtendLines
6061
from .ExtentFromLayer import ExtentFromLayer
6162
from .ExtractNodes import ExtractNodes
6263
from .FixGeometry import FixGeometry
@@ -162,7 +163,6 @@
162163
# from .Relief import Relief
163164
# from .IdwInterpolation import IdwInterpolation
164165
# from .TinInterpolation import TinInterpolation
165-
# from .ExtendLines import ExtendLines
166166
# from .ExtractSpecificNodes import ExtractSpecificNodes
167167
# from .GeometryByExpression import GeometryByExpression
168168
# from .RasterCalculator import RasterCalculator
@@ -217,11 +217,10 @@ def getAlgs(self):
217217
# SpatialIndex(), DefineProjection(),
218218
# RectanglesOvalsDiamondsVariable(),
219219
# RectanglesOvalsDiamondsFixed(), MergeLines(),
220-
#
221220
# PointsAlongGeometry(),
222221
# Relief(),
223222
# IdwInterpolation(), TinInterpolation(),
224-
# ExtendLines(), ExtractSpecificNodes(),
223+
# ExtractSpecificNodes(),
225224
# GeometryByExpression(),
226225
# RasterCalculator(),
227226
# ShortestPathPointToPoint(), ShortestPathPointToLayer(),
@@ -247,6 +246,7 @@ def getAlgs(self):
247246
Difference(),
248247
DropGeometry(),
249248
DropMZValues(),
249+
ExtendLines(),
250250
ExtentFromLayer(),
251251
ExtractNodes(),
252252
FixGeometry(),

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

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1346,7 +1346,7 @@ tests:
13461346
OUTPUT:
13471347
name: expected/remove_null_polys.gml
13481348
type: vector
1349-
#
1349+
13501350
- algorithm: native:extractbyexpression
13511351
name: Extract by Expression
13521352
params:
@@ -1359,34 +1359,34 @@ tests:
13591359
name: expected/extract_expression.gml
13601360
type: vector
13611361

1362-
# - algorithm: qgis:extendlines
1363-
# name: Extend lines
1364-
# params:
1365-
# END_DISTANCE: 0.2
1366-
# INPUT_LAYER:
1367-
# name: lines.gml
1368-
# type: vector
1369-
# START_DISTANCE: 0.1
1370-
# results:
1371-
# OUTPUT_LAYER:
1372-
# name: expected/extend_lines.gml
1373-
# type: vector
1374-
# compare:
1375-
# geometry:
1376-
# precision: 7
1377-
# - algorithm: qgis:extendlines
1378-
# name: Extend multilines
1379-
# params:
1380-
# END_DISTANCE: 0.4
1381-
# INPUT_LAYER:
1382-
# name: multilines.gml
1383-
# type: vector
1384-
# START_DISTANCE: 0.2
1385-
# results:
1386-
# OUTPUT_LAYER:
1387-
# name: expected/extend_multilines.gml
1388-
# type: vector
1389-
#
1362+
- algorithm: qgis:extendlines
1363+
name: Extend lines
1364+
params:
1365+
END_DISTANCE: 0.2
1366+
INPUT:
1367+
name: lines.gml
1368+
type: vector
1369+
START_DISTANCE: 0.1
1370+
results:
1371+
OUTPUT:
1372+
name: expected/extend_lines.gml
1373+
type: vector
1374+
compare:
1375+
geometry:
1376+
precision: 7
1377+
- algorithm: qgis:extendlines
1378+
name: Extend multilines
1379+
params:
1380+
END_DISTANCE: 0.4
1381+
INPUT:
1382+
name: multilines.gml
1383+
type: vector
1384+
START_DISTANCE: 0.2
1385+
results:
1386+
OUTPUT:
1387+
name: expected/extend_multilines.gml
1388+
type: vector
1389+
13901390
# - algorithm: qgis:extractspecificnodes
13911391
# name: Extract specific nodes lines
13921392
# params:

0 commit comments

Comments
 (0)