[Bf-blender-cvs] [b9a4ff5d385] functions: Refactor node socket declaration

Jacques Lucke noreply at git.blender.org
Fri Mar 29 13:57:30 CET 2019


Commit: b9a4ff5d38525adfa8e7dc8f37dfec4454ec366c
Author: Jacques Lucke
Date:   Fri Mar 29 13:56:14 2019 +0100
Branches: functions
https://developer.blender.org/rBb9a4ff5d38525adfa8e7dc8f37dfec4454ec366c

Refactor node socket declaration

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

M	release/scripts/startup/function_nodes/base.py
A	release/scripts/startup/function_nodes/declaration/__init__.py
A	release/scripts/startup/function_nodes/declaration/base.py
A	release/scripts/startup/function_nodes/declaration/dynamic_list.py
A	release/scripts/startup/function_nodes/declaration/fixed_type.py
A	release/scripts/startup/function_nodes/declaration/pack_list.py
A	release/scripts/startup/function_nodes/declaration/tree_interface.py
A	release/scripts/startup/function_nodes/declaration/variadic.py
M	release/scripts/startup/function_nodes/nodes/call.py
M	release/scripts/startup/function_nodes/nodes/clamp.py
M	release/scripts/startup/function_nodes/nodes/combine_vector.py
M	release/scripts/startup/function_nodes/nodes/float_math.py
M	release/scripts/startup/function_nodes/nodes/function_input.py
M	release/scripts/startup/function_nodes/nodes/function_output.py
M	release/scripts/startup/function_nodes/nodes/get_list_element.py
M	release/scripts/startup/function_nodes/nodes/map_range.py
M	release/scripts/startup/function_nodes/nodes/object_transforms.py
M	release/scripts/startup/function_nodes/nodes/pack_list.py
M	release/scripts/startup/function_nodes/nodes/random_number.py
M	release/scripts/startup/function_nodes/nodes/separate_vector.py
M	release/scripts/startup/function_nodes/nodes/switch.py
M	release/scripts/startup/function_nodes/nodes/vector_distance.py
A	release/scripts/startup/function_nodes/socket_builder.py
D	release/scripts/startup/function_nodes/socket_decl.py
M	release/scripts/startup/function_nodes/update.py

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

diff --git a/release/scripts/startup/function_nodes/base.py b/release/scripts/startup/function_nodes/base.py
index f40ae30abfc..1f697fdd4a2 100644
--- a/release/scripts/startup/function_nodes/base.py
+++ b/release/scripts/startup/function_nodes/base.py
@@ -19,36 +19,10 @@ class BaseTree:
 class NodeStorage:
     def __init__(self, node):
         self.node = node
-        self.set_current_declaration(*node.get_sockets())
+        builder = node.get_socket_builder()
+        self.socket_decl_map = builder.get_sockets_decl_map()
         self.input_value_storage = dict()
 
-    def set_current_declaration(self, inputs, outputs):
-        self.inputs_decl = inputs
-        self.outputs_decl = outputs
-
-        self.inputs_per_decl = {}
-        sockets = iter(self.node.inputs)
-        for decl in self.inputs_decl:
-            group = tuple(itertools.islice(sockets, decl.amount()))
-            self.inputs_per_decl[decl] = group
-
-        self.outputs_per_decl = {}
-        sockets = iter(self.node.outputs)
-        for decl in self.outputs_decl:
-            group = tuple(itertools.islice(sockets, decl.amount()))
-            self.outputs_per_decl[decl] = group
-
-        self.sockets_per_decl = {}
-        self.sockets_per_decl.update(self.inputs_per_decl)
-        self.sockets_per_decl.update(self.outputs_per_decl)
-
-        self.decl_per_socket = {}
-        self.decl_index_per_socket = {}
-        for decl, sockets in self.sockets_per_decl.items():
-            for i, socket in enumerate(sockets):
-                self.decl_per_socket[socket] = decl
-                self.decl_index_per_socket[socket] = i
-
     def store_socket_states(self):
         for socket in self.node.inputs:
             if not isinstance(socket, DataSocket):
@@ -74,11 +48,8 @@ class BaseNode:
     def init(self, context):
         from . update import managed_update
         with managed_update():
-            inputs, outputs = self.get_sockets()
-            for decl in inputs:
-                decl.build(self.inputs)
-            for decl in outputs:
-                decl.build(self.outputs)
+            builder = self.get_socket_builder()
+            builder.build()
 
     @classmethod
     def get_search_terms(cls):
@@ -102,16 +73,10 @@ class BaseNode:
         self.storage.store_socket_states()
 
         with managed_update():
-            self.inputs.clear()
-            self.outputs.clear()
-
-            inputs, outputs = self.get_sockets()
-            for decl in inputs:
-                decl.build(self.inputs)
-            for decl in outputs:
-                decl.build(self.outputs)
+            builder = self.get_socket_builder()
+            builder.build()
 
-        self.storage.set_current_declaration(inputs, outputs)
+        self.storage.socket_decl_map = builder.get_sockets_decl_map()
         self.storage.try_restore_socket_states()
 
     def _get_state(self):
@@ -139,12 +104,18 @@ class BaseNode:
     def tree(self):
         return self.id_data
 
-    def get_sockets():
-        return [], []
+    def get_socket_builder(self):
+        from . socket_builder import SocketBuilder
+        builder = SocketBuilder(self)
+        self.declaration(builder)
+        return builder
+
+    def declaration(self, builder):
+        raise NotImplementedError()
 
     def draw_buttons(self, context, layout):
         self.draw(layout)
-        for decl in self.storage.sockets_per_decl.keys():
+        for decl in self.decl_map.iter_decls():
             decl.draw_node(layout)
 
     def draw(self, layout):
@@ -172,9 +143,9 @@ class BaseNode:
         props.settings_repr = repr(settings)
 
     def draw_socket(self, socket, layout):
-        storage = self.storage
-        decl = storage.decl_per_socket[socket]
-        index = storage.decl_index_per_socket[socket]
+        decl_map = self.decl_map
+        decl = decl_map.get_decl_by_socket(socket)
+        index = decl_map.get_socket_index_in_decl(socket)
         decl.draw_socket(layout, socket, index)
 
     @classmethod
@@ -214,6 +185,10 @@ class BaseNode:
             _storage_per_node[self] = NodeStorage(self)
         return _storage_per_node[self]
 
+    @property
+    def decl_map(self):
+        return self.storage.socket_decl_map
+
 
 
 class BaseSocket:
@@ -238,7 +213,7 @@ class BaseSocket:
         return (node, self.is_output, self.identifier)
 
     def get_decl(self, node):
-        return node.storage.decl_per_socket[self]
+        return node.decl_map.get_decl_by_socket(self)
 
 class FunctionNode(BaseNode):
     pass
diff --git a/release/scripts/startup/function_nodes/declaration/__init__.py b/release/scripts/startup/function_nodes/declaration/__init__.py
new file mode 100644
index 00000000000..1cb3be0a431
--- /dev/null
+++ b/release/scripts/startup/function_nodes/declaration/__init__.py
@@ -0,0 +1,5 @@
+from . fixed_type import FixedSocketDecl
+from . dynamic_list import ListSocketDecl
+from . pack_list import PackListDecl
+from . tree_interface import TreeInterfaceDecl
+from . variadic import AnyVariadicDecl
\ No newline at end of file
diff --git a/release/scripts/startup/function_nodes/declaration/base.py b/release/scripts/startup/function_nodes/declaration/base.py
new file mode 100644
index 00000000000..ecf844f9809
--- /dev/null
+++ b/release/scripts/startup/function_nodes/declaration/base.py
@@ -0,0 +1,18 @@
+class SocketDeclBase:
+    def build(self, node_sockets):
+        raise NotImplementedError()
+
+    def amount(self):
+        raise NotImplementedError()
+
+    def validate(self, sockets):
+        raise NotImplementedError()
+
+    def draw_node(self, layout):
+        pass
+
+    def draw_socket(self, layout, socket, index):
+        socket.draw_self(layout, self)
+
+    def operator_socket_call(self, own_socket, other_socket):
+        pass
\ No newline at end of file
diff --git a/release/scripts/startup/function_nodes/declaration/dynamic_list.py b/release/scripts/startup/function_nodes/declaration/dynamic_list.py
new file mode 100644
index 00000000000..9378aab9826
--- /dev/null
+++ b/release/scripts/startup/function_nodes/declaration/dynamic_list.py
@@ -0,0 +1,40 @@
+from bpy.props import *
+from . base import SocketDeclBase
+from .. types import type_infos
+
+class ListSocketDecl(SocketDeclBase):
+    def __init__(self, node, identifier: str, display_name: str, prop_name: str, list_or_base: str):
+        self.node = node
+        self.identifier = identifier
+        self.display_name = display_name
+        self.prop_name = prop_name
+        self.list_or_base = list_or_base
+
+    def build(self, node_sockets):
+        data_type = self.get_data_type()
+        return [type_infos.build(
+            data_type,
+            node_sockets,
+            self.display_name,
+            self.identifier)]
+
+    def validate(self, sockets):
+        if len(sockets) != 1:
+            return False
+        return sockets[0].data_type == self.get_data_type()
+
+    def get_data_type(self):
+        base_type = getattr(self.node, self.prop_name)
+        if self.list_or_base == "BASE":
+            return base_type
+        elif self.list_or_base == "LIST":
+            return type_infos.to_list(base_type)
+        else:
+            assert False
+
+    def amount(self):
+        return 1
+
+    @classmethod
+    def Property(cls):
+        return StringProperty(default="Float")
\ No newline at end of file
diff --git a/release/scripts/startup/function_nodes/declaration/fixed_type.py b/release/scripts/startup/function_nodes/declaration/fixed_type.py
new file mode 100644
index 00000000000..849e99b04b0
--- /dev/null
+++ b/release/scripts/startup/function_nodes/declaration/fixed_type.py
@@ -0,0 +1,24 @@
+from . base import SocketDeclBase
+from .. types import type_infos
+
+class FixedSocketDecl(SocketDeclBase):
+    def __init__(self, node, identifier: str, display_name: str, data_type: str):
+        self.node = node
+        self.identifier = identifier
+        self.display_name = display_name
+        self.data_type = data_type
+
+    def build(self, node_sockets):
+        return [type_infos.build(
+            self.data_type,
+            node_sockets,
+            self.display_name,
+            self.identifier)]
+
+    def validate(self, sockets):
+        if len(sockets) != 1:
+            return False
+        return sockets[0].data_type == self.data_type
+
+    def amount(self):
+        return 1
\ No newline at end of file
diff --git a/release/scripts/startup/function_nodes/declaration/pack_list.py b/release/scripts/startup/function_nodes/declaration/pack_list.py
new file mode 100644
index 00000000000..b0a0e5ba27d
--- /dev/null
+++ b/release/scripts/startup/function_nodes/declaration/pack_list.py
@@ -0,0 +1,152 @@
+import bpy
+import uuid
+from bpy.props import *
+from . base import SocketDeclBase
+from .. base import DataSocket
+from .. types import type_infos
+from .. sockets import OperatorSocket
+
+class PackListDecl(SocketDeclBase):
+    def __init__(self, node, identifier: str, prop_name: str, base_type: str):
+        self.node = node
+        self.identifier_suffix = identifier
+        self.prop_name = prop_name
+        self.base_type = base_type
+        self.list_type = type_infos.to_list(base_type)
+
+    def build(self, node_sockets):
+        return list(self._build(node_sockets))
+
+    def _build(self, node_sockets):
+        for item in self.get_collection():
+            data_type = self.base_type if item.state == "BASE" else self.list_type
+            yield type_infos.build(
+                data_type,
+                node_sockets,
+                "",
+                item.identifier_prefix + self.identifier_suffix)
+        yield node_sockets.new("fn_OperatorSocket", "Operator")
+
+    def validate(self, sockets):
+        collection = self.get_collection()
+        if len(sockets) != len(collection) + 1:
+            return False
+
+        for socket, item in zip(sockets[:-1], collection):
+            if item.state == "BASE":
+                if socket.data_type != self.base_type:
+                    return False
+            elif item.state == "LIST":
+                if socket.data_type != self.list_type:
+                    return

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list