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:
2015-12-10 16:16:19 +01:00
parent 693101d78d
commit 28429f297b

View File

@@ -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)