30
30
31
31
from qgis .PyQt .QtGui import QIcon
32
32
33
- from qgis .core import QgsFeature , QgsFeatureSink , QgsGeometry , QgsWkbTypes , QgsProcessingUtils , NULL
33
+ from qgis .core import (QgsFeature ,
34
+ QgsFeatureSink ,
35
+ QgsGeometry ,
36
+ QgsWkbTypes ,
37
+ QgsProcessingUtils ,
38
+ NULL ,
39
+ QgsProcessingParameterFeatureSource ,
40
+ QgsProcessingParameterField ,
41
+ QgsProcessingParameterFeatureSink )
34
42
35
43
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
36
- from processing .core .parameters import ParameterVector
37
- from processing .core .parameters import ParameterTableField
38
- from processing .core .outputs import OutputVector
39
44
40
45
pluginPath = os .path .split (os .path .split (os .path .dirname (__file__ ))[0 ])[0 ]
41
46
@@ -56,11 +61,12 @@ def __init__(self):
56
61
super ().__init__ ()
57
62
58
63
def initAlgorithm (self , config = None ):
59
- self .addParameter (ParameterVector (self .INPUT , self .tr ('Input layer' )))
60
- self .addParameter (ParameterTableField (self .FIELD ,
61
- self .tr ('Unique ID field' ), self .INPUT ))
64
+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT ,
65
+ self .tr ('Input layer' )))
66
+ self .addParameter (QgsProcessingParameterField (self .FIELD ,
67
+ self .tr ('Unique ID field' ), parentLayerParameterName = self .INPUT ))
62
68
63
- self .addOutput ( OutputVector (self .OUTPUT , self .tr ('Multipart' )))
69
+ self .addParameter ( QgsProcessingParameterFeatureSink (self .OUTPUT , self .tr ('Multipart' )))
64
70
65
71
def name (self ):
66
72
return 'singlepartstomultipart'
@@ -69,31 +75,29 @@ def displayName(self):
69
75
return self .tr ('Singleparts to multipart' )
70
76
71
77
def processAlgorithm (self , parameters , context , feedback ):
72
- layer = QgsProcessingUtils . mapLayerFromString ( self .getParameterValue ( self .INPUT ) , context )
73
- fieldName = self .getParameterValue ( self .FIELD )
78
+ source = self .parameterAsSource ( parameters , self .INPUT , context )
79
+ field_name = self .parameterAsString ( parameters , self .FIELD , context )
74
80
75
- geomType = QgsWkbTypes .multiType (layer .wkbType ())
81
+ geom_type = QgsWkbTypes .multiType (source .wkbType ())
76
82
77
- writer = self .getOutputFromName ( self .OUTPUT ). getVectorWriter ( layer . fields (), geomType , layer . crs () ,
78
- context )
83
+ ( sink , dest_id ) = self .parameterAsSink ( parameters , self .OUTPUT , context ,
84
+ source . fields (), geom_type , source . sourceCrs () )
79
85
80
- outFeat = QgsFeature ()
81
- inGeom = QgsGeometry ()
82
-
83
- index = layer .fields ().lookupField (fieldName )
86
+ index = source .fields ().lookupField (field_name )
84
87
85
88
collection_geom = {}
86
89
collection_attrs = {}
87
90
88
- features = QgsProcessingUtils .getFeatures (layer , context )
89
- total = 100.0 / layer .featureCount () if layer .featureCount () else 0
91
+ features = source .getFeatures ()
92
+ total = 100.0 / source .featureCount () if source .featureCount () else 0
90
93
for current , feature in enumerate (features ):
94
+ if feedback .isCanceled ():
95
+ break
96
+
91
97
atMap = feature .attributes ()
92
98
idVar = atMap [index ]
93
- if idVar in [None , NULL ]:
94
- outFeat .setAttributes (atMap )
95
- outFeat .setGeometry (feature .geometry ())
96
- writer .addFeature (outFeat , QgsFeatureSink .FastInsert )
99
+ if idVar in [None , NULL ] or not feature .hasGeometry ():
100
+ sink .addFeature (feature , QgsFeatureSink .FastInsert )
97
101
feedback .setProgress (int (current * total ))
98
102
continue
99
103
@@ -108,8 +112,12 @@ def processAlgorithm(self, parameters, context, feedback):
108
112
feedback .setProgress (int (current * total ))
109
113
110
114
for key , geoms in collection_geom .items ():
111
- outFeat .setAttributes (collection_attrs [key ])
112
- outFeat .setGeometry (QgsGeometry .collectGeometry (geoms ))
113
- writer .addFeature (outFeat , QgsFeatureSink .FastInsert )
115
+ if feedback .isCanceled ():
116
+ break
117
+
118
+ feature = QgsFeature ()
119
+ feature .setAttributes (collection_attrs [key ])
120
+ feature .setGeometry (QgsGeometry .collectGeometry (geoms ))
121
+ sink .addFeature (feature , QgsFeatureSink .FastInsert )
114
122
115
- del writer
123
+ return { self . OUTPUT : dest_id }
0 commit comments