111 lines
2.4 KiB
Python
111 lines
2.4 KiB
Python
|
|
|
|
class Socket:
|
|
|
|
def __init__(self, bl_socket, tree):
|
|
|
|
self.tree = tree
|
|
self.bl_socket = bl_socket
|
|
self.data = {}
|
|
|
|
self.id = hex(id(bl_socket))
|
|
self.identifier = bl_socket.identifier
|
|
self.is_linked = bl_socket.is_linked
|
|
|
|
self._value = None
|
|
|
|
if hasattr(bl_socket, 'default_value'):
|
|
self._value = bl_socket.default_value
|
|
|
|
@property
|
|
def value(self):
|
|
|
|
if not isinstance(self._value, (str, int, float, bool)):
|
|
self._value = [v for v in self._value]
|
|
|
|
return self._value
|
|
|
|
@value.setter
|
|
def value(self, v):
|
|
self.bl_socket.default_value = v
|
|
self._value = v
|
|
return self._value
|
|
|
|
def to_dict(self):
|
|
self.data['id'] = self.id
|
|
self.data['value'] = self.value
|
|
self.data['identifier'] = self.identifier
|
|
self.data['is_linked'] = self.is_linked
|
|
self.data['link'] = self.get_link()
|
|
return self.data
|
|
|
|
|
|
class Input(Socket):
|
|
|
|
def __init__(self, bl_input, tree):
|
|
super().__init__(bl_input, tree)
|
|
|
|
self.bl_input = bl_input
|
|
|
|
@classmethod
|
|
def from_dict(cls, data, node):
|
|
|
|
for bl_ipt in node.bl_node.inputs:
|
|
|
|
if bl_ipt.identifier != data['identifier']:
|
|
continue
|
|
|
|
new_ipt = cls(bl_ipt, node.tree)
|
|
|
|
for k, v in data.items():
|
|
setattr(new_ipt, k, v)
|
|
|
|
return new_ipt
|
|
|
|
def get_link(self):
|
|
|
|
if not self.is_linked:
|
|
return None
|
|
|
|
for ipt_link in self.bl_input.links:
|
|
for tree_link in self.tree.links:
|
|
if ipt_link == tree_link.bl_link:
|
|
return tree_link.id
|
|
|
|
|
|
class Output(Socket):
|
|
|
|
def __init__(self, bl_output, tree):
|
|
super().__init__(bl_output, tree)
|
|
|
|
self.bl_output = bl_output
|
|
|
|
@classmethod
|
|
def from_dict(cls, data, node):
|
|
|
|
for bl_opt in node.bl_node.outputs:
|
|
|
|
if bl_opt.identifier != data['identifier']:
|
|
continue
|
|
|
|
new_opt = cls(bl_opt, node.tree)
|
|
|
|
for k, v in data.items():
|
|
setattr(new_opt, k, v)
|
|
|
|
return new_opt
|
|
|
|
def get_link(self):
|
|
|
|
links = []
|
|
|
|
if not self.is_linked:
|
|
return None
|
|
|
|
for opt_link in self.bl_output.links:
|
|
for tree_link in self.tree.links:
|
|
if opt_link == tree_link.bl_link:
|
|
links.append(tree_link.id)
|
|
|
|
return links
|