Skip to content

Commit 29c4970

Browse files
committedOct 5, 2018
[processing] In-place add layer name to dlg title and store active layer
1 parent 0782b9d commit 29c4970

File tree

3 files changed

+24
-17
lines changed

3 files changed

+24
-17
lines changed
 

‎python/plugins/processing/gui/AlgorithmDialog.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def __init__(self, alg, in_place=False, parent=None):
7171

7272
self.feedback_dialog = None
7373
self.in_place = in_place
74+
self.active_layer = iface.activeLayer()
7475

7576
self.setAlgorithm(alg)
7677
self.setMainWidget(self.getParametersPanel(alg, self))
@@ -81,10 +82,11 @@ def __init__(self, alg, in_place=False, parent=None):
8182
self.buttonBox().addButton(self.runAsBatchButton, QDialogButtonBox.ResetRole) # reset role to ensure left alignment
8283
else:
8384
self.runAsBatchButton = None
84-
has_selection = iface.activeLayer() and (iface.activeLayer().selectedFeatureCount() > 0)
85+
has_selection = self.active_layer and (self.active_layer.selectedFeatureCount() > 0)
8586
self.buttonBox().button(QDialogButtonBox.Ok).setText(QCoreApplication.translate("AlgorithmDialog", "Modify Selected Features")
8687
if has_selection else QCoreApplication.translate("AlgorithmDialog", "Modify All Features"))
8788
self.buttonBox().button(QDialogButtonBox.Close).setText(QCoreApplication.translate("AlgorithmDialog", "Cancel"))
89+
self.setWindowTitle(self.windowTitle() + ' | ' + self.active_layer.name())
8890

8991
def getParametersPanel(self, alg, parent):
9092
return ParametersPanel(parent, alg, self.in_place)
@@ -110,7 +112,7 @@ def getParameterValues(self):
110112
if not param.isDestination():
111113

112114
if self.in_place and param.name() == 'INPUT':
113-
parameters[param.name()] = iface.activeLayer()
115+
parameters[param.name()] = self.active_layer
114116
continue
115117

116118
try:

‎python/plugins/processing/gui/AlgorithmExecutor.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@
4141
QgsExpression,
4242
QgsWkbTypes,
4343
QgsGeometry,
44-
QgsVectorLayerUtils)
44+
QgsVectorLayerUtils,
45+
QgsVectorLayer)
4546
from processing.gui.Postprocessing import handleAlgorithmResults
4647
from processing.tools import dataobjects
4748
from qgis.utils import iface
@@ -70,13 +71,11 @@ def execute(alg, parameters, context=None, feedback=None):
7071
return False, {}
7172

7273

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):
7475
"""Executes an algorithm modifying features in-place in the input layer.
7576
7677
:param alg: algorithm to run
7778
:type alg: QgsProcessingAlgorithm
78-
:param active_layer: the editable layer
79-
:type active_layer: QgsVectoLayer
8079
:param parameters: parameters of the algorithm
8180
:type parameters: dict
8281
:param context: context, defaults to None
@@ -95,6 +94,8 @@ def execute_in_place_run(alg, active_layer, parameters, context=None, feedback=N
9594
if context is None:
9695
context = dataobjects.createContext(feedback)
9796

97+
active_layer = parameters['INPUT']
98+
9899
# Run some checks and prepare the layer for in-place execution by:
99100
# - getting the active layer and checking that it is a vector
100101
# - 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
107108
if active_layer is None:
108109
raise QgsProcessingException(tr("There is not active layer."))
109110

111+
if not isinstance(active_layer, QgsVectorLayer):
112+
raise QgsProcessingException(tr("Active layer is not a vector layer."))
113+
110114
if not active_layer.isEditable():
111115
if not active_layer.startEditing():
112116
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
150154
if not alg.supportInPlaceEdit(active_layer):
151155
raise QgsProcessingException(tr("Selected algorithm and parameter configuration are not compatible with in-place modifications."))
152156
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()))
154158
step = 100 / len(active_layer.selectedFeatureIds()) if active_layer.selectedFeatureIds() else 1
155159
for current, f in enumerate(feature_iterator):
156160
feedback.setProgress(current * step)
@@ -223,7 +227,9 @@ def execute_in_place_run(alg, active_layer, parameters, context=None, feedback=N
223227

224228

225229
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.
227233
228234
:param alg: algorithm to run
229235
:type alg: QgsProcessingAlgorithm
@@ -238,10 +244,11 @@ def execute_in_place(alg, parameters, context=None, feedback=None):
238244
:rtype: tuple
239245
"""
240246

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)
243250
if ok:
244-
iface.activeLayer().triggerRepaint()
251+
parameters['INPUT'].triggerRepaint()
245252
return ok, results
246253

247254

‎tests/src/python/test_qgsprocessinginplace.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -349,8 +349,7 @@ def _alg_tester(self, alg_name, input_layer, parameters):
349349
alg = self.registry.createAlgorithmById(alg_name)
350350

351351
self.assertIsNotNone(alg)
352-
parameters['INPUT'] = QgsProcessingFeatureSourceDefinition(
353-
input_layer.id(), True)
352+
parameters['INPUT'] = input_layer
354353
parameters['OUTPUT'] = 'memory:'
355354

356355
old_features = [f for f in input_layer.getFeatures()]
@@ -365,7 +364,7 @@ def _alg_tester(self, alg_name, input_layer, parameters):
365364
input_layer.rollBack()
366365
ok = False
367366
ok, _ = execute_in_place_run(
368-
alg, input_layer, parameters, context=context, feedback=feedback, raise_exceptions=True)
367+
alg, parameters, context=context, feedback=feedback, raise_exceptions=True)
369368
new_features = [f for f in input_layer.getFeatures()]
370369

371370
# Check ret values
@@ -453,14 +452,13 @@ def test_select_all_features(self):
453452
'DELTA_X': 1.1,
454453
'DELTA_Y': 1.1,
455454
}
456-
parameters['INPUT'] = QgsProcessingFeatureSourceDefinition(
457-
self.vl.id(), True)
455+
parameters['INPUT'] = self.vl
458456
parameters['OUTPUT'] = 'memory:'
459457

460458
old_features = [f for f in self.vl.getFeatures()]
461459

462460
ok, _ = execute_in_place_run(
463-
alg, self.vl, parameters, context=context, feedback=feedback, raise_exceptions=True)
461+
alg, parameters, context=context, feedback=feedback, raise_exceptions=True)
464462
new_features = [f for f in self.vl.getFeatures()]
465463

466464
self.assertEqual(len(new_features), old_count)

0 commit comments

Comments
 (0)
Please sign in to comment.