blendfile: "fix" blocks' iteration over values, and add 'user_data' member to Blocks and DNAStruct objects.
Currently blendfile.py does not know how to handle embeded structs - this is solvable for later, but at least do not raise exception about that when using values()/items() helpers of BlendFileBlock (for now, return Ellipsis in those cases). Also, added some user_data member to BlendFileBlock and DNAStruct classes, handy when you need to store some own data for each of those, and want to avoid having your own list or dict for that.
This commit is contained in:
@@ -293,6 +293,7 @@ class BlendFileBlock:
|
||||
"sdna_index",
|
||||
"count",
|
||||
"file_offset",
|
||||
"user_data",
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
@@ -310,6 +311,7 @@ class BlendFileBlock:
|
||||
OLDBLOCK = struct.Struct(b'4sI')
|
||||
|
||||
self.file = bfile
|
||||
self.user_data = None
|
||||
|
||||
data = handle.read(bfile.block_header_struct.size)
|
||||
# header size can be 8, 20, or 24 bytes long
|
||||
@@ -464,10 +466,18 @@ class BlendFileBlock:
|
||||
return (f.dna_name.name_only for f in self.dna_type.fields)
|
||||
|
||||
def values(self):
|
||||
return (self[k] for k in self.keys())
|
||||
for k in self.keys():
|
||||
try:
|
||||
yield self[k]
|
||||
except NotImplementedError as err:
|
||||
yield ...
|
||||
|
||||
def items(self):
|
||||
return ((k, self[k]) for k in self.keys())
|
||||
for k in self.keys():
|
||||
try:
|
||||
yield (k, self[k])
|
||||
except NotImplementedError as err:
|
||||
yield (k, ...)
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
@@ -624,12 +634,14 @@ class DNAStruct:
|
||||
"size",
|
||||
"fields",
|
||||
"field_from_name",
|
||||
"user_data",
|
||||
)
|
||||
|
||||
def __init__(self, dna_type_id):
|
||||
self.dna_type_id = dna_type_id
|
||||
self.fields = []
|
||||
self.field_from_name = {}
|
||||
self.user_data = None
|
||||
|
||||
def field_from_path(self, header, handle, path):
|
||||
assert(type(path) == bytes)
|
||||
@@ -697,7 +709,7 @@ class DNAStruct:
|
||||
else:
|
||||
return DNA_IO.read_bytes(handle, dna_name.array_size)
|
||||
else:
|
||||
raise NotImplementedError("%r exists but isn't pointer, can't resolve field %r" % (path, dna_name.name))
|
||||
raise NotImplementedError("%r exists but isn't pointer, can't resolve field %r" % (path, dna_name.name_only))
|
||||
|
||||
def field_set(self, header, handle, path, value):
|
||||
assert(type(path) == bytes)
|
||||
|
Reference in New Issue
Block a user