From dd9c9068409d3879127e22914060611177324207 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20T=C3=B6nne?= Date: Fri, 6 Oct 2023 14:33:35 +0200 Subject: [PATCH] Fix #113134: Use a valid socket in node groups for custom nodes Custom node trees may not suppor the default NodeSocketFloat socket type. In case this default type is not supported, search all registered socket types and pick the first one that is supported by the custom node tree. Pull Request: https://projects.blender.org/blender/blender/pulls/113330 --- scripts/startup/bl_operators/node.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/scripts/startup/bl_operators/node.py b/scripts/startup/bl_operators/node.py index b7c9951f1b6..542744f47bb 100644 --- a/scripts/startup/bl_operators/node.py +++ b/scripts/startup/bl_operators/node.py @@ -288,7 +288,23 @@ class NODE_OT_interface_item_new(NodeInterfaceOperator, Operator): default='INPUT', ) - socket_type = 'NodeSocketFloat' + # Returns a valid socket type for the given tree or None. + @staticmethod + def find_valid_socket_type(tree): + socket_type = 'NodeSocketFloat' + # Try the default float socket type + if tree.valid_socket_type(socket_type): + return socket_type + # Custom nodes may not support float sockets, search all + # registered socket subclasses. + types_to_check = [bpy.types.NodeSocket] + while types_to_check: + t = types_to_check.pop() + idname = getattr(t, "bl_idname", "") + if tree.valid_socket_type(idname): + return idname + # Test all subclasses + types_to_check.extend(t.__subclasses__()) def execute(self, context): snode = context.space_data @@ -300,9 +316,9 @@ class NODE_OT_interface_item_new(NodeInterfaceOperator, Operator): active_pos = active_item.position if active_item else -1 if self.item_type == 'INPUT': - item = interface.new_socket("Socket", socket_type=self.socket_type, in_out='INPUT') + item = interface.new_socket("Socket", socket_type=self.find_valid_socket_type(tree), in_out='INPUT') elif self.item_type == 'OUTPUT': - item = interface.new_socket("Socket", socket_type=self.socket_type, in_out='OUTPUT') + item = interface.new_socket("Socket", socket_type=self.find_valid_socket_type(tree), in_out='OUTPUT') elif self.item_type == 'PANEL': item = interface.new_panel("Panel") else: