29
29
30
30
from qgis .PyQt .QtGui import QIcon
31
31
32
- from qgis .core import QgsWkbTypes , QgsProcessingUtils
32
+ from qgis .core import (QgsWkbTypes ,
33
+ QgsProcessingUtils ,
34
+ QgsProcessingParameterFeatureSource ,
35
+ QgsProcessingParameterFeatureSink ,
36
+ QgsProcessingOutputVectorLayer )
33
37
34
38
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
35
39
from processing .core .parameters import ParameterVector
@@ -51,8 +55,11 @@ def group(self):
51
55
52
56
def __init__ (self ):
53
57
super ().__init__ ()
54
- self .addParameter (ParameterVector (self .INPUT , self .tr ('Input layer' )))
55
- self .addOutput (OutputVector (self .OUTPUT , self .tr ('Single parts' )))
58
+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT ,
59
+ self .tr ('Input layer' )))
60
+
61
+ self .addParameter (QgsProcessingParameterFeatureSink (self .OUTPUT , self .tr ('Single parts' )))
62
+ self .addOutput (QgsProcessingOutputVectorLayer (self .OUTPUT , self .tr ('Single parts' )))
56
63
57
64
def name (self ):
58
65
return 'multiparttosingleparts'
@@ -61,28 +68,32 @@ def displayName(self):
61
68
return self .tr ('Multipart to singleparts' )
62
69
63
70
def processAlgorithm (self , parameters , context , feedback ):
64
- layer = QgsProcessingUtils .mapLayerFromString (self .getParameterValue (self .INPUT ), context )
65
- geomType = QgsWkbTypes .singleType (layer .wkbType ())
71
+ source = self .parameterAsSource (parameters , self .INPUT , context )
72
+ geomType = QgsWkbTypes .singleType (source .wkbType ())
73
+
74
+ (sink , dest_id ) = self .parameterAsSink (parameters , self .OUTPUT , context ,
75
+ source .fields (), geomType , source .sourceCrs ())
66
76
67
- writer = self . getOutputFromName ( self . OUTPUT ). getVectorWriter ( layer . fields (), geomType , layer . crs (),
68
- context )
77
+ features = source . getFeatures ()
78
+ total = 100.0 / source . featureCount ( )
69
79
70
- features = QgsProcessingUtils .getFeatures (layer , context )
71
- total = 100.0 / QgsProcessingUtils .featureCount (layer , context )
72
80
for current , f in enumerate (features ):
81
+ if feedback .isCanceled ():
82
+ break
83
+
73
84
input_geometry = f .geometry ()
74
85
if input_geometry :
75
86
if input_geometry .isMultipart ():
76
87
for g in input_geometry .asGeometryCollection ():
77
88
output_feature = f
78
89
output_feature .setGeometry (g )
79
- writer .addFeature (output_feature )
90
+ sink .addFeature (output_feature )
80
91
else :
81
- writer .addFeature (f )
92
+ sink .addFeature (f )
82
93
else :
83
94
#input feature with null geometry
84
- writer .addFeature (f )
95
+ sink .addFeature (f )
85
96
86
97
feedback .setProgress (int (current * total ))
87
98
88
- del writer
99
+ return { self . OUTPUT : dest_id }
0 commit comments