41
41
QgsExpression ,
42
42
QgsWkbTypes ,
43
43
QgsGeometry ,
44
- QgsVectorLayerUtils )
44
+ QgsVectorLayerUtils ,
45
+ QgsVectorLayer )
45
46
from processing .gui .Postprocessing import handleAlgorithmResults
46
47
from processing .tools import dataobjects
47
48
from qgis .utils import iface
@@ -70,13 +71,11 @@ def execute(alg, parameters, context=None, feedback=None):
70
71
return False , {}
71
72
72
73
73
- def execute_in_place_run (alg , active_layer , parameters , context = None , feedback = None , raise_exceptions = False ):
74
+ def execute_in_place_run (alg , parameters , context = None , feedback = None , raise_exceptions = False ):
74
75
"""Executes an algorithm modifying features in-place in the input layer.
75
76
76
77
:param alg: algorithm to run
77
78
:type alg: QgsProcessingAlgorithm
78
- :param active_layer: the editable layer
79
- :type active_layer: QgsVectoLayer
80
79
:param parameters: parameters of the algorithm
81
80
:type parameters: dict
82
81
:param context: context, defaults to None
@@ -95,6 +94,8 @@ def execute_in_place_run(alg, active_layer, parameters, context=None, feedback=N
95
94
if context is None :
96
95
context = dataobjects .createContext (feedback )
97
96
97
+ active_layer = parameters ['INPUT' ]
98
+
98
99
# Run some checks and prepare the layer for in-place execution by:
99
100
# - getting the active layer and checking that it is a vector
100
101
# - making the layer editable if it was not already
@@ -107,6 +108,9 @@ def execute_in_place_run(alg, active_layer, parameters, context=None, feedback=N
107
108
if active_layer is None :
108
109
raise QgsProcessingException (tr ("There is not active layer." ))
109
110
111
+ if not isinstance (active_layer , QgsVectorLayer ):
112
+ raise QgsProcessingException (tr ("Active layer is not a vector layer." ))
113
+
110
114
if not active_layer .isEditable ():
111
115
if not active_layer .startEditing ():
112
116
raise QgsProcessingException (tr ("Active layer is not editable (and editing could not be turned on)." ))
@@ -150,7 +154,7 @@ def execute_in_place_run(alg, active_layer, parameters, context=None, feedback=N
150
154
if not alg .supportInPlaceEdit (active_layer ):
151
155
raise QgsProcessingException (tr ("Selected algorithm and parameter configuration are not compatible with in-place modifications." ))
152
156
field_idxs = range (len (active_layer .fields ()))
153
- feature_iterator = active_layer .getFeatures (QgsFeatureRequest (active_layer .selectedFeatureIds ())) if parameters [ 'INPUT' ]. selectedFeaturesOnly else active_layer . getFeatures ()
157
+ feature_iterator = active_layer .getFeatures (QgsFeatureRequest (active_layer .selectedFeatureIds ()))
154
158
step = 100 / len (active_layer .selectedFeatureIds ()) if active_layer .selectedFeatureIds () else 1
155
159
for current , f in enumerate (feature_iterator ):
156
160
feedback .setProgress (current * step )
@@ -223,7 +227,9 @@ def execute_in_place_run(alg, active_layer, parameters, context=None, feedback=N
223
227
224
228
225
229
def execute_in_place (alg , parameters , context = None , feedback = None ):
226
- """Executes an algorithm modifying features in-place in the active layer.
230
+ """Executes an algorithm modifying features in-place, if the INPUT
231
+ parameter is not defined, the current active layer will be used as
232
+ INPUT.
227
233
228
234
:param alg: algorithm to run
229
235
:type alg: QgsProcessingAlgorithm
@@ -238,10 +244,11 @@ def execute_in_place(alg, parameters, context=None, feedback=None):
238
244
:rtype: tuple
239
245
"""
240
246
241
- parameters ['INPUT' ] = QgsProcessingFeatureSourceDefinition (iface .activeLayer ().id (), True )
242
- ok , results = execute_in_place_run (alg , iface .activeLayer (), parameters , context = context , feedback = feedback )
247
+ if not 'INPUT' in parameters or not parameters ['INPUT' ]:
248
+ parameters ['INPUT' ] = iface .activeLayer ()
249
+ ok , results = execute_in_place_run (alg , parameters , context = context , feedback = feedback )
243
250
if ok :
244
- iface . activeLayer () .triggerRepaint ()
251
+ parameters [ 'INPUT' ] .triggerRepaint ()
245
252
return ok , results
246
253
247
254
0 commit comments