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