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
|
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.
|
||||||
|
21
operators.py
21
operators.py
@ -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"}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user