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
0 commit comments