27
27
28
28
import os
29
29
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 )
34
37
35
38
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
40
39
41
40
pluginPath = os .path .split (os .path .split (os .path .dirname (__file__ ))[0 ])[0 ]
42
41
43
42
44
43
class OffsetLine (QgisAlgorithm ):
45
-
46
- INPUT_LAYER = 'INPUT_LAYER'
47
- OUTPUT_LAYER = 'OUTPUT_LAYER'
44
+ INPUT = 'INPUT'
45
+ OUTPUT = 'OUTPUT'
48
46
DISTANCE = 'DISTANCE'
49
47
SEGMENTS = 'SEGMENTS'
50
48
JOIN_STYLE = 'JOIN_STYLE'
@@ -57,23 +55,29 @@ def __init__(self):
57
55
super ().__init__ ()
58
56
59
57
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 ))
66
68
self .join_styles = [self .tr ('Round' ),
67
69
'Mitre' ,
68
70
'Bevel' ]
69
- self .addParameter (ParameterSelection (
71
+ self .addParameter (QgsProcessingParameterEnum (
70
72
self .JOIN_STYLE ,
71
73
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 ))
75
78
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 ))
77
81
78
82
def name (self ):
79
83
return 'offsetline'
@@ -82,31 +86,33 @@ def displayName(self):
82
86
return self .tr ('Offset line' )
83
87
84
88
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 ())
89
92
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 )
94
97
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
97
100
98
101
for current , input_feature in enumerate (features ):
102
+ if feedback .isCanceled ():
103
+ break
104
+
99
105
output_feature = input_feature
100
106
input_geometry = input_feature .geometry ()
101
107
if input_geometry :
102
108
output_geometry = input_geometry .offsetCurve (distance , segments , join_style , miter_limit )
103
109
if not output_geometry :
104
- raise GeoAlgorithmExecutionException (
110
+ raise QgsProcessingException (
105
111
self .tr ('Error calculating line offset' ))
106
112
107
113
output_feature .setGeometry (output_geometry )
108
114
109
- writer .addFeature (output_feature , QgsFeatureSink .FastInsert )
115
+ sink .addFeature (output_feature , QgsFeatureSink .FastInsert )
110
116
feedback .setProgress (int (current * total ))
111
117
112
- del writer
118
+ return { self . OUTPUT : dest_id }
0 commit comments