From c5e979cbaf28836105a54bf3ddb7df18c3229aa9 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 12 Feb 2025 10:19:00 +1000 Subject: [PATCH] [processing] Fix exception when algorithm has no output layers Fixes regression caused by https://github.com/qgis/QGIS/pull/59850 --- .../plugins/processing/gui/Postprocessing.py | 44 ++++++++++++------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/python/plugins/processing/gui/Postprocessing.py b/python/plugins/processing/gui/Postprocessing.py index f495c2af0091..c2d10da6caa1 100644 --- a/python/plugins/processing/gui/Postprocessing.py +++ b/python/plugins/processing/gui/Postprocessing.py @@ -36,6 +36,7 @@ QgsLayerTreeGroup, QgsLayerTreeNode, QgsLayerTreeRegistryBridge, + QgsProject, ) from qgis.utils import iface @@ -204,7 +205,9 @@ def handleAlgorithmResults( ) i = 0 - added_layers: list[tuple[Optional[QgsLayerTreeGroup], QgsLayerTreeLayer]] = [] + added_layers: list[ + tuple[Optional[QgsLayerTreeGroup], QgsLayerTreeLayer, QgsProject] + ] = [] layers_to_post_process: list[ tuple[QgsMapLayer, QgsProcessingContext.LayerDetails] ] = [] @@ -241,7 +244,9 @@ def handleAlgorithmResults( # we don't add the layer to the tree yet -- that's done # later, after we've sorted all added layers layer_tree_layer = create_layer_tree_layer(owned_map_layer, details) - added_layers.append((results_group, layer_tree_layer)) + added_layers.append( + (results_group, layer_tree_layer, details.project) + ) if details.postProcessor(): # we defer calling the postProcessor set in the context @@ -276,11 +281,17 @@ def handleAlgorithmResults( current_selected_node = iface.layerTreeView().currentNode() iface.layerTreeView().setUpdatesEnabled(False) - # store the current intersection point to restore it later - previous_insertion_point = ( - details.project.layerTreeRegistryBridge().layerInsertionPoint() - ) - for group, layer_node in sorted_layer_tree_layers: + for group, layer_node, project in sorted_layer_tree_layers: + if not project: + project = context.project() + + # store the current intersection point to restore it later + previous_insertion_point = None + if project: + previous_insertion_point = ( + project.layerTreeRegistryBridge().layerInsertionPoint() + ) + layer_node.removeCustomProperty(SORT_ORDER_CUSTOM_PROPERTY) insertion_point: Optional[QgsLayerTreeRegistryBridge.InsertionPoint] = None if group is not None: @@ -300,24 +311,23 @@ def handleAlgorithmResults( insertion_point = QgsLayerTreeRegistryBridge.InsertionPoint( current_selected_node, 0 ) - elif context.project(): + elif project: insertion_point = QgsLayerTreeRegistryBridge.InsertionPoint() - if insertion_point: - details.project.layerTreeRegistryBridge().setLayerInsertionPoint( - insertion_point - ) + if project and insertion_point: + project.layerTreeRegistryBridge().setLayerInsertionPoint(insertion_point) - details.project.addMapLayer(layer_node.layer()) + project.addMapLayer(layer_node.layer()) if not have_set_active_layer and iface is not None: iface.setActiveLayer(layer_node.layer()) have_set_active_layer = True - # reset to the previous insertion point - details.project.layerTreeRegistryBridge().setLayerInsertionPoint( - previous_insertion_point - ) + # reset to the previous insertion point + if project: + project.layerTreeRegistryBridge().setLayerInsertionPoint( + previous_insertion_point + ) # all layers have been added to the layer tree, so safe to call # postProcessors now