Improve node serialization interface functions and logic

This commit is contained in:
Jonas Holzman 2025-05-20 16:09:48 +02:00
parent 2f75f7492d
commit 8f4d7d5684
2 changed files with 29 additions and 23 deletions

View File

@ -12,18 +12,29 @@ from . import utils
from . utils import BlenderProperty from . utils import BlenderProperty
def dump_nodes(nodes: list[bpy.types.Node]): def serialize_selected_nodes_from_node_tree(node_tree: bpy.types.NodeTree):
"""Generic recursive dump, convert nodes into a dict""" """Serialize the selected nodes from a node tree"""
dump_pointers = {} selected_nodes = [node for node in node_tree.nodes if node.select]
data = [Serializer.serialize(node, dump_pointers) for node in nodes] selected_links = [link for link in node_tree.links if link.from_node.select
and link.to_node.select]
return data
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): def deserialize_nodes_into_node_tree(data: dict, node_tree: bpy.types.NodeTree):
"""Load/Dump nodes into a specific node tree""" """Deserialize node data into a specific node tree"""
dump_pointers = {} bl_pointers = {}
Serializer.deserialize(data, node_tree, dump_pointers) Serializer.deserialize(data, node_tree, bl_pointers)
# TODO: Sub serialize function where the isinstance is set to the default number of things. # TODO: Sub serialize function where the isinstance is set to the default number of things.

View File

@ -14,7 +14,7 @@ import bpy
from bpy.props import BoolProperty, EnumProperty from bpy.props import BoolProperty, EnumProperty
from bpy.types import Operator 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 .node_utils import remap_node_group_duplicates
from .pack_nodes import combine_objects, extract_objects from .pack_nodes import combine_objects, extract_objects
from .formats import dump_nkit_format, parse_nkit_format from .formats import dump_nkit_format, parse_nkit_format
@ -28,18 +28,12 @@ class NODEKIT_OT_copy(Operator):
def execute(self, context): def execute(self, context):
ntree = context.space_data.edit_tree 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 = { context.window_manager.clipboard = dump_nkit_format(serialized_nodes_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(ntree_data) 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")
self.report({"INFO"}, f"Copied {len(selected_nodes)} selected nodes to system clipboard")
return {"FINISHED"} return {"FINISHED"}
@ -55,7 +49,8 @@ class NODEKIT_OT_copy_tree(Operator):
context.window_manager.clipboard = dump_nkit_format(ntree_data) 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"} return {"FINISHED"}
@ -67,7 +62,7 @@ class NODEKIT_OT_paste(Operator):
def execute(self, context): def execute(self, context):
ntree_data = parse_nkit_format(context.window_manager.clipboard) 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 self.report({"INFO"}, f"X node(s) pasted from system clipboard") # TODO: Ge the number of parsed nodes returned
return {"FINISHED"} return {"FINISHED"}