[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