diff --git a/scripts/modules/bpy_extras/node_utils.py b/scripts/modules/bpy_extras/node_utils.py index 3fec65db5a5..52edc5d5188 100644 --- a/scripts/modules/bpy_extras/node_utils.py +++ b/scripts/modules/bpy_extras/node_utils.py @@ -1,10 +1,49 @@ # SPDX-License-Identifier: GPL-2.0-or-later __all__ = ( + "connect_virtual_socket", "find_node_input", ) +def connect_sockets(input, output): + """ + Connect sockets in a node tree. + + This is useful because the links created through the normal Python API are + invalid when one of the sockets is a virtual socket (grayed out sockets in + Group Input and Group Output nodes). + + It replaces node_tree.links.new(input, output) + """ + import bpy + + # Swap sockets if they are not passed in the proper order + if input.is_output and not output.is_output: + input, output = output, input + + input_node = output.node + output_node = input.node + + if input_node.id_data is not output_node.id_data: + print("Sockets do not belong to the same node tree") + return + + if type(input) == type(output) == bpy.types.NodeSocketVirtual: + print("Cannot connect two virtual sockets together") + return + + if output_node.type == 'GROUP_OUTPUT' and type(input) == bpy.types.NodeSocketVirtual: + output_node.id_data.outputs.new(type(output).__name__, output.name) + input = output_node.inputs[-2] + + if input_node.type == 'GROUP_INPUT' and type(output) == bpy.types.NodeSocketVirtual: + output_node.id_data.inputs.new(type(input).__name__, input.name) + output = input_node.outputs[-2] + + return input_node.id_data.links.new(input, output) + + # XXX Names are not unique. Returns the first match. def find_node_input(node, name): for input in node.inputs: