Initial Dumper static functions cleanup

refactor
Jonas Holzman 2025-03-20 15:12:18 +01:00
parent b251a3b122
commit 18f75eed25
1 changed files with 25 additions and 26 deletions

View File

@ -1,61 +1,61 @@
import bpy
import mathutils
from pprint import pprint
import json
import itertools
from copy import copy
from os.path import abspath
from pprint import pprint
def get_default(prop):
"""Get the default value of a bl property"""
def get_default(prop: bpy.types.Property):
"""Get the default value of a Blender property"""
if getattr(prop, "is_array", False):
return list(prop.default_array)
elif hasattr(prop, "default"):
return prop.default
def get_dumper(bl_object, fallback=None):
"""Find the right dumper type by checking inheritance"""
def get_dumper(bl_object: bpy.types.bpy_struct):
"""Get the corresponding dumper for a given Blender object, or its closest base type"""
for dp in dumpers:
if isinstance(bl_object, dp.bl_type):
if isinstance(bl_object, dp.bl_type): # TODO: Cascade system
return dp
return fallback or Dumper
return Dumper or None
def get_bl_object(data):
"""Find the bl object for loading data into it depending on the type and the context"""
def get_current_node_tree(data):
if data.get("_new", {}).get("type") == "GeometryNodeTree":
return bpy.context.object.modifiers.active.node_group
def dump_nodes(ob):
def dump_nodes(nodes: list[bpy.types.Node]):
"""Generic Recursive Dump, convert any object into a dict"""
Dumper.pointers.clear()
Dumper.pointers.clear() # TODO: Bad global
if isinstance(ob, (list, tuple)):
data = [get_dumper(o).dump(o) for o in ob]
else:
data = get_dumper(ob).dump(ob)
data = [dump_node(node) for node in nodes]
Dumper.pointers.clear()
print("---")
pprint(data)
print("---")
return data
def dump_node(node: bpy.types.Node):
dumper = get_dumper(node)
return dumper.dump(node) # TODO: Break the recursivity, clear things up
def load_nodes(data, bl_object=None):
def load_nodes(data, node_tree=None):
"""Generic Load to create an object from a dict"""
Dumper.pointers.clear()
# print(Dumper.pointers)
if bl_object is None:
bl_object = get_bl_object(data)
if node_tree is None:
node_tree = get_current_node_tree(data)
dumper = get_dumper(bl_object)
dumper.load(data, bl_object)
dumper = get_dumper(node_tree)
dumper.load(data, node_tree)
Dumper.pointers.clear()
@ -96,7 +96,6 @@ class Dumper:
if bl_object is None:
return
# pprint(data)
if bl_pointer := data.get("bl_pointer"):
cls.pointers[bl_pointer] = bl_object
@ -114,7 +113,7 @@ class Dumper:
dumper = PropCollection
if hasattr(attr, "bl_rna"):
bl_type = attr.bl_rna.type_recast()
dumper = get_dumper(bl_type, fallback=PropCollection)
dumper = PropCollection or get_dumper(bl_type)
dumper.load(value, attr)
continue