34
34
QgsFeature ,
35
35
QgsFeatureSink ,
36
36
QgsGeometry ,
37
- QgsMessageLog ,
38
- QgsProcessingUtils )
37
+ QgsProcessingException ,
38
+ QgsProcessingUtils ,
39
+ QgsProcessingParameterVectorLayer ,
40
+ QgsProcessingParameterEnum ,
41
+ QgsProcessing ,
42
+ QgsProcessingParameterFeatureSink )
39
43
40
44
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
41
- from processing .core .GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
42
- from processing .core .parameters import ParameterVector
43
- from processing .core .parameters import ParameterSelection
44
- from processing .core .outputs import OutputVector
45
- from processing .tools import dataobjects
46
45
47
46
pluginPath = os .path .split (os .path .split (os .path .dirname (__file__ ))[0 ])[0 ]
48
47
@@ -67,16 +66,17 @@ def __init__(self):
67
66
super ().__init__ ()
68
67
69
68
def initAlgorithm (self , config = None ):
70
- self .modes = [self .tr ('Largest area ' ),
69
+ self .modes = [self .tr ('Largest Area ' ),
71
70
self .tr ('Smallest Area' ),
72
- self .tr ('Largest common boundary ' )]
71
+ self .tr ('Largest Common Boundary ' )]
73
72
74
- self .addParameter (ParameterVector (self .INPUT ,
75
- self .tr ('Input layer' ), [dataobjects .TYPE_VECTOR_POLYGON ]))
76
- self .addParameter (ParameterSelection (self .MODE ,
77
- self .tr ('Merge selection with the neighbouring polygon with the' ),
78
- self .modes ))
79
- self .addOutput (OutputVector (self .OUTPUT , self .tr ('Eliminated' ), datatype = [dataobjects .TYPE_VECTOR_POLYGON ]))
73
+ self .addParameter (QgsProcessingParameterVectorLayer (self .INPUT ,
74
+ self .tr ('Input layer' ), [QgsProcessing .TypeVectorPolygon ]))
75
+ self .addParameter (QgsProcessingParameterEnum (self .MODE ,
76
+ self .tr ('Merge selection with the neighbouring polygon with the' ),
77
+ options = self .modes ))
78
+
79
+ self .addParameter (QgsProcessingParameterFeatureSink (self .OUTPUT , self .tr ('Eliminated' ), QgsProcessing .TypeVectorPolygon ))
80
80
81
81
def name (self ):
82
82
return 'eliminateselectedpolygons'
@@ -85,29 +85,32 @@ def displayName(self):
85
85
return self .tr ('Eliminate selected polygons' )
86
86
87
87
def processAlgorithm (self , parameters , context , feedback ):
88
- inLayer = QgsProcessingUtils . mapLayerFromString ( self .getParameterValue ( self .INPUT ) , context )
89
- boundary = self .getParameterValue ( self .MODE ) == self .MODE_BOUNDARY
90
- smallestArea = self .getParameterValue ( self .MODE ) == self .MODE_SMALLEST_AREA
88
+ inLayer = self .parameterAsVectorLayer ( parameters , self .INPUT , context )
89
+ boundary = self .parameterAsEnum ( parameters , self .MODE , context ) == self .MODE_BOUNDARY
90
+ smallestArea = self .parameterAsEnum ( parameters , self .MODE , context ) == self .MODE_SMALLEST_AREA
91
91
92
92
if inLayer .selectedFeatureCount () == 0 :
93
- QgsMessageLog .logMessage (self .tr ('{0}: (No selection in input layer "{1}")' ).format (self .displayName (), self .getParameterValue (self .INPUT )),
94
- self .tr ('Processing' ), QgsMessageLog .WARNING )
93
+ feedback .reportError (self .tr ('{0}: (No selection in input layer "{1}")' ).format (self .displayName (), parameters [self .INPUT ]))
95
94
96
95
featToEliminate = []
97
96
selFeatIds = inLayer .selectedFeatureIds ()
98
- output = self .getOutputFromName (self .OUTPUT )
99
- writer = output .getVectorWriter (inLayer .fields (), inLayer .wkbType (), inLayer .crs (), context )
97
+
98
+ (sink , dest_id ) = self .parameterAsSink (parameters , self .OUTPUT , context ,
99
+ inLayer .fields (), inLayer .wkbType (), inLayer .sourceCrs ())
100
100
101
101
for aFeat in inLayer .getFeatures ():
102
+ if feedback .isCanceled ():
103
+ break
104
+
102
105
if aFeat .id () in selFeatIds :
103
106
# Keep references to the features to eliminate
104
107
featToEliminate .append (aFeat )
105
108
else :
106
109
# write the others to output
107
- writer .addFeature (aFeat , QgsFeatureSink .FastInsert )
110
+ sink .addFeature (aFeat , QgsFeatureSink .FastInsert )
108
111
109
112
# Delete all features to eliminate in processLayer
110
- processLayer = output . layer
113
+ processLayer = QgsProcessingUtils . mapLayerFromString ( dest_id , context )
111
114
processLayer .startEditing ()
112
115
113
116
# ANALYZE
@@ -129,6 +132,9 @@ def processAlgorithm(self, parameters, context, feedback):
129
132
130
133
# Iterate over the polygons to eliminate
131
134
for i in range (len (featToEliminate )):
135
+ if feedback .isCanceled ():
136
+ break
137
+
132
138
feat = featToEliminate .pop ()
133
139
geom2Eliminate = feat .geometry ()
134
140
bbox = geom2Eliminate .boundingBox ()
@@ -145,6 +151,9 @@ def processAlgorithm(self, parameters, context, feedback):
145
151
engine .prepareGeometry ()
146
152
147
153
while fit .nextFeature (selFeat ):
154
+ if feedback .isCanceled ():
155
+ break
156
+
148
157
selGeom = selFeat .geometry ()
149
158
150
159
if engine .intersects (selGeom .geometry ()):
@@ -193,7 +202,7 @@ def processAlgorithm(self, parameters, context, feedback):
193
202
if processLayer .changeGeometry (mergeWithFid , newGeom ):
194
203
madeProgress = True
195
204
else :
196
- raise GeoAlgorithmExecutionException (
205
+ raise QgsProcessingException (
197
206
self .tr ('Could not replace geometry of feature with id {0}' ).format (mergeWithFid ))
198
207
199
208
start = start + add
@@ -207,7 +216,12 @@ def processAlgorithm(self, parameters, context, feedback):
207
216
208
217
# End while
209
218
if not processLayer .commitChanges ():
210
- raise GeoAlgorithmExecutionException (self .tr ('Could not commit changes' ))
219
+ raise QgsProcessingException (self .tr ('Could not commit changes' ))
211
220
212
221
for feature in featNotEliminated :
213
- writer .addFeature (feature , QgsFeatureSink .FastInsert )
222
+ if feedback .isCanceled ():
223
+ break
224
+
225
+ sink .addFeature (feature , QgsFeatureSink .FastInsert )
226
+
227
+ return {self .OUTPUT : dest_id }
0 commit comments