[Bf-blender-cvs] [95b28715504] functions: make it easier to create group outputs

Jacques Lucke noreply at git.blender.org
Thu Dec 5 13:14:39 CET 2019


Commit: 95b28715504f03e3a78b68affcac087b34cde747
Author: Jacques Lucke
Date:   Thu Dec 5 13:10:35 2019 +0100
Branches: functions
https://developer.blender.org/rB95b28715504f03e3a78b68affcac087b34cde747

make it easier to create group outputs

===================================================================

M	release/scripts/startup/nodes/function_nodes/groups.py
M	release/scripts/startup/nodes/menu.py

===================================================================

diff --git a/release/scripts/startup/nodes/function_nodes/groups.py b/release/scripts/startup/nodes/function_nodes/groups.py
index a7b390966bc..44e9a05e970 100644
--- a/release/scripts/startup/nodes/function_nodes/groups.py
+++ b/release/scripts/startup/nodes/function_nodes/groups.py
@@ -223,6 +223,10 @@ class ManageGroupPieMenu(bpy.types.Menu, PieMenuHelper):
 
     def draw_left(self, layout):
         node = bpy.context.active_node
+        if node is None:
+            self.empty(layout)
+            return
+
         possible_inputs = [(i, socket) for i, socket in enumerate(node.inputs) 
                                        if socket_can_become_group_input(socket)]
 
@@ -234,6 +238,23 @@ class ManageGroupPieMenu(bpy.types.Menu, PieMenuHelper):
         else:
             layout.operator("fn.create_group_input_for_socket_invoker", text="New Group Input")
 
+    def draw_right(self, layout):
+        node = bpy.context.active_node
+        if node is None:
+            self.empty(layout)
+            return
+
+        possible_outputs = [(i, socket) for i, socket in enumerate(node.outputs)
+                                        if socket_can_become_group_output(socket)]
+
+        if len(possible_outputs) == 0:
+            self.empty(layout, "No outputs.")
+        elif len(possible_outputs) == 1:
+            props = layout.operator("fn.create_group_output_for_socket", text="New Group Output")
+            props.output_index = possible_outputs[0][0]
+        else:
+            layout.operator("fn.create_group_output_for_socket_invoker", text="New Group Output")
+
 
 class CreateGroupInputForSocketInvoker(bpy.types.Operator):
     bl_idname = "fn.create_group_input_for_socket_invoker"
@@ -258,6 +279,29 @@ class CreateGroupInputForSocketInvoker(bpy.types.Operator):
                 props.input_index = i
 
 
+class CreateGroupOutputForSocketInvoker(bpy.types.Operator):
+    bl_idname = "fn.create_group_output_for_socket_invoker"
+    bl_label = "Create Group Output for Socket Invoker"
+
+    def invoke(self, context, event):
+        context.window_manager.popup_menu(self.draw_menu)
+        return {"CANCELLED"}
+
+    @staticmethod
+    def draw_menu(menu, context):
+        node = bpy.context.active_node
+        if node is None:
+            return
+
+        layout = menu.layout.column()
+        layout.operator_context = "INVOKE_DEFAULT"
+        
+        for i, socket in enumerate(node.outputs):
+            if socket_can_become_group_output(socket):
+                props = layout.operator("fn.create_group_output_for_socket", text=socket.name)
+                props.output_index = i
+
+
 class CreateGroupInputForSocket(bpy.types.Operator):
     bl_idname = "fn.create_group_input_for_socket"
     bl_label = "Create Group Input for Socket"
@@ -272,6 +316,7 @@ class CreateGroupInputForSocket(bpy.types.Operator):
         node.select = False
 
         with skip_syncing():
+            # TODO: handle non data sockets
             new_node = tree.nodes.new(type="fn_GroupInputNode")
             new_node.sort_index = 1000
             new_node.input_name = socket.name
@@ -292,9 +337,45 @@ class CreateGroupInputForSocket(bpy.types.Operator):
         return {"FINISHED"}
 
 
+class CreateGroupOutputForSocket(bpy.types.Operator):
+    bl_idname = "fn.create_group_output_for_socket"
+    bl_label = "Create Group Output for Socket"
+    
+    output_index: IntProperty()
+
+    def invoke(self, context, event):
+        tree = context.space_data.node_tree
+        node = context.active_node
+        socket = node.outputs[self.output_index]
+
+        node.select = False
+
+        with skip_syncing():
+            # TODO: handle non data sockets
+            new_node = tree.nodes.new(type="fn_GroupOutputNode")
+            new_node.sort_index = 1000
+            new_node.output_name = socket.name
+            new_node.interface_type = "DATA"
+            new_node.data_type = socket.data_type
+            new_node.rebuild()
+
+            new_node.select = True
+            new_node.parent = node.parent
+            new_node.location = node.location
+            new_node.location.x += 200
+
+            tree.new_link(new_node.inputs[0], socket)
+
+        tree.sync()
+        bpy.ops.node.translate_attach("INVOKE_DEFAULT")
+        return {"FINISHED"}
+
+
 def socket_can_become_group_input(socket):
     return socket.bl_idname != "fn_OperatorSocket" and not socket.is_linked
 
+def socket_can_become_group_output(socket):
+    return socket.bl_idname != "fn_OperatorSocket"
 
 keymap = None
 
diff --git a/release/scripts/startup/nodes/menu.py b/release/scripts/startup/nodes/menu.py
index 11eda7eafe5..6e80c966565 100644
--- a/release/scripts/startup/nodes/menu.py
+++ b/release/scripts/startup/nodes/menu.py
@@ -26,7 +26,6 @@ class FunctionNodesMenu(bpy.types.Menu):
         layout = self.layout
         layout.operator_context = 'INVOKE_DEFAULT'
 
-        insert_node(layout, "fn_BooleanMathNode", "Boolean Math")
         insert_node(layout, "fn_CompareNode", "Compare")
         insert_node(layout, "fn_SwitchNode", "Switch")
         layout.separator()



More information about the Bf-blender-cvs mailing list