31
31
from qgis .PyQt .QtCore import QVariant
32
32
from qgis .PyQt .QtGui import QIcon
33
33
34
- from qgis .core import QgsFeature , QgsFeatureSink , QgsWkbTypes , QgsField , QgsProcessingUtils
34
+ from qgis .core import (QgsFeature ,
35
+ QgsFeatureSink ,
36
+ QgsWkbTypes ,
37
+ QgsField ,
38
+ QgsProcessing ,
39
+ QgsProcessingUtils ,
40
+ QgsProcessingParameterNumber ,
41
+ QgsProcessingParameterFeatureSource ,
42
+ QgsProcessingParameterFeatureSink )
35
43
36
44
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
37
- from processing .core .parameters import ParameterVector , ParameterNumber
38
- from processing .core .outputs import OutputVector
39
- from processing .tools import dataobjects
40
45
41
46
pluginPath = os .path .split (os .path .split (os .path .dirname (__file__ ))[0 ])[0 ]
42
47
@@ -62,16 +67,16 @@ def __init__(self):
62
67
super ().__init__ ()
63
68
64
69
def initAlgorithm (self , config = None ):
65
- self .addParameter (ParameterVector (self .INPUT ,
66
- self .tr ('Input layer' ),
67
- [ dataobjects . TYPE_VECTOR_POLYGON , dataobjects . TYPE_VECTOR_LINE ]))
68
- self .addParameter ( ParameterNumber ( self . DISTANCE ,
69
- self .tr ( 'Distance' ), default = 1.0 ))
70
- self .addParameter ( ParameterNumber ( self . START_OFFSET ,
71
- self .tr ( 'Start offset' ), default = 0.0 ))
72
- self .addParameter ( ParameterNumber ( self . END_OFFSET ,
73
- self . tr ( 'End offset' ), default = 0.0 ))
74
- self .addOutput ( OutputVector (self .OUTPUT , self .tr ('Points' ), datatype = [ dataobjects . TYPE_VECTOR_POINT ] ))
70
+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT ,
71
+ self .tr ('Input layer' ), [ QgsProcessing . TypeVectorPolygon , QgsProcessing . TypeVectorLine ]))
72
+ self . addParameter ( QgsProcessingParameterNumber ( self . DISTANCE ,
73
+ self .tr ( 'Distance' ), minValue = 0.0 , defaultValue = 1.0 ))
74
+ self .addParameter ( QgsProcessingParameterNumber ( self . START_OFFSET ,
75
+ self .tr ( 'Start offset' ), minValue = 0.0 , defaultValue = 0.0 ))
76
+ self .addParameter ( QgsProcessingParameterNumber ( self . END_OFFSET ,
77
+ self .tr ( 'End offset' ), minValue = 0.0 , defaultValue = 0.0 ))
78
+
79
+ self .addParameter ( QgsProcessingParameterFeatureSink (self .OUTPUT , self .tr ('Points' ), QgsProcessing . TypeVectorPoint ))
75
80
76
81
def name (self ):
77
82
return 'pointsalonglines'
@@ -80,23 +85,27 @@ def displayName(self):
80
85
return self .tr ('Points along lines' )
81
86
82
87
def processAlgorithm (self , parameters , context , feedback ):
83
- layer = QgsProcessingUtils . mapLayerFromString ( self .getParameterValue ( self .INPUT ) , context )
84
- distance = self .getParameterValue ( self .DISTANCE )
85
- start_offset = self .getParameterValue ( self .START_OFFSET )
86
- end_offset = self .getParameterValue ( self .END_OFFSET )
88
+ source = self .parameterAsSource ( parameters , self .INPUT , context )
89
+ distance = self .parameterAsDouble ( parameters , self .DISTANCE , context )
90
+ start_offset = self .parameterAsDouble ( parameters , self .START_OFFSET , context )
91
+ end_offset = self .parameterAsDouble ( parameters , self .END_OFFSET , context )
87
92
88
- fields = layer .fields ()
93
+ fields = source .fields ()
89
94
fields .append (QgsField ('distance' , QVariant .Double ))
90
95
fields .append (QgsField ('angle' , QVariant .Double ))
91
96
92
- writer = self .getOutputFromName (self .OUTPUT ).getVectorWriter (fields , QgsWkbTypes .Point , layer .crs (), context )
97
+ (sink , dest_id ) = self .parameterAsSink (parameters , self .OUTPUT , context ,
98
+ fields , QgsWkbTypes .Point , source .sourceCrs ())
93
99
94
- features = QgsProcessingUtils .getFeatures (layer , context )
95
- total = 100.0 / layer .featureCount () if layer .featureCount () else 0
100
+ features = source .getFeatures ()
101
+ total = 100.0 / source .featureCount () if source .featureCount () else 0
96
102
for current , input_feature in enumerate (features ):
103
+ if feedback .isCanceled ():
104
+ break
105
+
97
106
input_geometry = input_feature .geometry ()
98
107
if not input_geometry :
99
- writer .addFeature (input_feature , QgsFeatureSink .FastInsert )
108
+ sink .addFeature (input_feature , QgsFeatureSink .FastInsert )
100
109
else :
101
110
if input_geometry .type == QgsWkbTypes .PolygonGeometry :
102
111
length = input_geometry .geometry ().perimeter ()
@@ -114,10 +123,10 @@ def processAlgorithm(self, parameters, context, feedback):
114
123
attrs .append (current_distance )
115
124
attrs .append (angle )
116
125
output_feature .setAttributes (attrs )
117
- writer .addFeature (output_feature , QgsFeatureSink .FastInsert )
126
+ sink .addFeature (output_feature , QgsFeatureSink .FastInsert )
118
127
119
128
current_distance += distance
120
129
121
130
feedback .setProgress (int (current * total ))
122
131
123
- del writer
132
+ return { self . OUTPUT : dest_id }
0 commit comments