Improve node serialization interface functions and logic
This commit is contained in:
parent
2f75f7492d
commit
8f4d7d5684
31
dumper.py
31
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.
|
||||
|
21
operators.py
21
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"}
|
||||
|
Loading…
x
Reference in New Issue
Block a user