diff --git a/dumper.py b/dumper.py index 83d1d5d..a34500d 100644 --- a/dumper.py +++ b/dumper.py @@ -12,18 +12,29 @@ from . import utils from . utils import BlenderProperty -def dump_nodes(nodes: list[bpy.types.Node]): - """Generic recursive dump, convert nodes into a dict""" - dump_pointers = {} - data = [Serializer.serialize(node, dump_pointers) for node in nodes] - - return data +def serialize_selected_nodes_from_node_tree(node_tree: bpy.types.NodeTree): + """Serialize the selected nodes from a node tree""" + selected_nodes = [node for node in node_tree.nodes if node.select] + selected_links = [link for link in node_tree.links if link.from_node.select + and link.to_node.select] + + bl_pointers = {} + nodes_data = [Serializer.serialize(node, bl_pointers) for node in selected_nodes] + links_data = [Serializer.serialize(link, bl_pointers) for link in selected_links] + + # Only serialize selected nodes and their links + ntree_data = { + "nodes": nodes_data, + "links": links_data, + } + + return ntree_data -def load_nodes(data, node_tree): - """Load/Dump nodes into a specific node tree""" - dump_pointers = {} - Serializer.deserialize(data, node_tree, dump_pointers) +def deserialize_nodes_into_node_tree(data: dict, node_tree: bpy.types.NodeTree): + """Deserialize node data into a specific node tree""" + bl_pointers = {} + Serializer.deserialize(data, node_tree, bl_pointers) # TODO: Sub serialize function where the isinstance is set to the default number of things. diff --git a/operators.py b/operators.py index dc6f382..852dbdb 100644 --- a/operators.py +++ b/operators.py @@ -14,7 +14,7 @@ import bpy from bpy.props import BoolProperty, EnumProperty from bpy.types import Operator -from .dumper import dump_nodes, load_nodes +from .dumper import serialize_selected_nodes_from_node_tree, deserialize_nodes_into_node_tree from .node_utils import remap_node_group_duplicates from .pack_nodes import combine_objects, extract_objects from .formats import dump_nkit_format, parse_nkit_format @@ -28,18 +28,12 @@ class NODEKIT_OT_copy(Operator): def execute(self, context): ntree = context.space_data.edit_tree - selected_nodes = [node for node in ntree.nodes if node.select] + serialized_nodes_data = serialize_selected_nodes_from_node_tree(ntree) - ntree_data = { - "nodes": dump_nodes(selected_nodes), - "links": dump_nodes( - [l for l in ntree.links if l.from_node.select and l.to_node.select] - ), - } + context.window_manager.clipboard = dump_nkit_format(serialized_nodes_data) - context.window_manager.clipboard = dump_nkit_format(ntree_data) - - self.report({"INFO"}, f"Copied {len(selected_nodes)} selected nodes to system clipboard") + num_selected_nodes = len([n for n in ntree.nodes if n.select]) + self.report({"INFO"}, f"Copied {num_selected_nodes} selected nodes to system clipboard") return {"FINISHED"} @@ -55,7 +49,8 @@ class NODEKIT_OT_copy_tree(Operator): context.window_manager.clipboard = dump_nkit_format(ntree_data) - self.report({"INFO"}, f"Copied {len(ntree.nodes)} selected nodes to system clipboard") + num_nodes = len(ntree.nodes) + self.report({"INFO"}, f"Copied {num_nodes} selected nodes to system clipboard") return {"FINISHED"} @@ -67,7 +62,7 @@ class NODEKIT_OT_paste(Operator): def execute(self, context): ntree_data = parse_nkit_format(context.window_manager.clipboard) - load_nodes(ntree_data, context.space_data.edit_tree) + deserialize_nodes_into_node_tree(ntree_data, context.space_data.edit_tree) self.report({"INFO"}, f"X node(s) pasted from system clipboard") # TODO: Ge the number of parsed nodes returned return {"FINISHED"}