[Bf-blender-cvs] [513b7b3c783] functions: add outputs dynamically

Jacques Lucke noreply at git.blender.org
Wed Feb 20 17:21:19 CET 2019


Commit: 513b7b3c783366aafb9d95b63967d359fd31ec7e
Author: Jacques Lucke
Date:   Wed Feb 20 14:21:54 2019 +0100
Branches: functions
https://developer.blender.org/rB513b7b3c783366aafb9d95b63967d359fd31ec7e

add outputs dynamically

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

M	release/scripts/startup/function_nodes/__init__.py
M	release/scripts/startup/function_nodes/base.py
A	release/scripts/startup/function_nodes/node_operators.py
M	release/scripts/startup/function_nodes/nodes/function_input.py
M	release/scripts/startup/function_nodes/nodes/function_output.py

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

diff --git a/release/scripts/startup/function_nodes/__init__.py b/release/scripts/startup/function_nodes/__init__.py
index f64bb7d6c88..8877382c5fc 100644
--- a/release/scripts/startup/function_nodes/__init__.py
+++ b/release/scripts/startup/function_nodes/__init__.py
@@ -3,4 +3,5 @@ def register():
     from . import base
     from . import sockets
     from . import nodes
-    from . import menu
\ No newline at end of file
+    from . import menu
+    from . import node_operators
\ No newline at end of file
diff --git a/release/scripts/startup/function_nodes/base.py b/release/scripts/startup/function_nodes/base.py
index b0b960d8b9e..d4eb0ebc46d 100644
--- a/release/scripts/startup/function_nodes/base.py
+++ b/release/scripts/startup/function_nodes/base.py
@@ -7,8 +7,22 @@ class FunctionNodeTree(bpy.types.NodeTree):
 
 bpy.utils.register_class(FunctionNodeTree)
 
+class BaseNode:
+    def draw_buttons(self, context, layout):
+        self.draw(layout)
+
+    def draw(self, layout):
+        pass
+
+    def invoke_function(self, layout, function_name, text, *, settings=tuple()):
+        assert isinstance(settings, tuple)
+        props = layout.operator("fn.node_operator", text=text)
+        props.tree_name = self.id_data.name
+        props.node_name = self.name
+        props.function_name = function_name
+        props.settings_repr = repr(settings)
 
-class FunctionNode:
+class FunctionNode(BaseNode):
     def init(self, context):
         inputs, outputs = self.get_sockets()
         for idname, name in inputs:
@@ -19,12 +33,6 @@ class FunctionNode:
     def get_sockets():
         return [], []
 
-    def draw_buttons(self, context, layout):
-        self.draw(layout)
-
-    def draw(self, layout):
-        pass
-
 class DataSocket:
     color = (0, 0, 0, 0)
 
diff --git a/release/scripts/startup/function_nodes/node_operators.py b/release/scripts/startup/function_nodes/node_operators.py
new file mode 100644
index 00000000000..ea9919b3962
--- /dev/null
+++ b/release/scripts/startup/function_nodes/node_operators.py
@@ -0,0 +1,29 @@
+import bpy
+from bpy.props import *
+
+class NodeOperator(bpy.types.Operator):
+    bl_idname = "fn.node_operator"
+    bl_label = "Generic Node Operator"
+    bl_options = {"INTERNAL"}
+
+    tree_name: StringProperty()
+    node_name: StringProperty()
+    function_name: StringProperty()
+    settings_repr: StringProperty()
+
+    def execute(self, context):
+        tree = bpy.data.node_groups.get(self.tree_name)
+        if tree is None:
+            return {"CANCELLED"}
+
+        node = tree.nodes.get(self.node_name)
+        if node is None:
+            return {"CANCELLED"}
+
+        function = getattr(node, self.function_name)
+        settings = eval(self.settings_repr)
+        function(*settings)
+
+        return {"FINISHED"}
+
+bpy.utils.register_class(NodeOperator)
\ No newline at end of file
diff --git a/release/scripts/startup/function_nodes/nodes/function_input.py b/release/scripts/startup/function_nodes/nodes/function_input.py
index f1cca3bba58..28b4d6e6642 100644
--- a/release/scripts/startup/function_nodes/nodes/function_input.py
+++ b/release/scripts/startup/function_nodes/nodes/function_input.py
@@ -1,6 +1,7 @@
 import bpy
+from .. base import BaseNode
 
-class FunctionInputNode(bpy.types.Node):
+class FunctionInputNode(BaseNode, bpy.types.Node):
     bl_idname = "fn_FunctionInputNode"
     bl_label = "Function Input"
 
diff --git a/release/scripts/startup/function_nodes/nodes/function_output.py b/release/scripts/startup/function_nodes/nodes/function_output.py
index 6193c84d29f..5490ba27e7d 100644
--- a/release/scripts/startup/function_nodes/nodes/function_output.py
+++ b/release/scripts/startup/function_nodes/nodes/function_output.py
@@ -1,10 +1,20 @@
 import bpy
+from .. base import BaseNode
 
-class FunctionOutputNode(bpy.types.Node):
+class FunctionOutputNode(BaseNode, bpy.types.Node):
     bl_idname = "fn_FunctionOutputNode"
     bl_label = "Function Output"
 
     def init(self, context):
-        self.inputs.new("fn_VectorSocket", "Position")
+        pass
+
+    def draw(self, layout):
+        self.invoke_function(layout, "new_socket",
+            "New Float", settings=("fn_FloatSocket", ))
+        self.invoke_function(layout, "new_socket",
+            "New Vector", settings=("fn_VectorSocket", ))
+
+    def new_socket(self, idname):
+        self.inputs.new(idname, "Output")
 
 bpy.utils.register_class(FunctionOutputNode)
\ No newline at end of file



More information about the Bf-blender-cvs mailing list