From afbebb8cf8cd6cb423abc9834b4ada534eca8faa Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 18 Dec 2014 11:32:31 +0100 Subject: [PATCH] support for reading old blend files (some missing struct members) --- modules/blendfile.py | 9 +++++++-- modules/blendfile_path_walker.py | 10 +++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/modules/blendfile.py b/modules/blendfile.py index 8050e71..b7d06cf 100644 --- a/modules/blendfile.py +++ b/modules/blendfile.py @@ -388,10 +388,15 @@ class BlendFileBlock: # Utility get/set # # avoid inline pointer casting - def get_pointer(self, path, sdna_index_refine=None): + def get_pointer(self, path, default=..., sdna_index_refine=None): if sdna_index_refine is None: sdna_index_refine = self.sdna_index - result = self.get(path, sdna_index_refine=sdna_index_refine) + result = self.get(path, default, sdna_index_refine=sdna_index_refine) + + # default + if type(result) is not int: + return result + assert(self.file.structs[sdna_index_refine].field_from_path(self.file.header, self.file.handle, path).dna_name.is_pointer) if result != 0: # possible (but unlikely) diff --git a/modules/blendfile_path_walker.py b/modules/blendfile_path_walker.py index ed5f3d9..8ec8ded 100644 --- a/modules/blendfile_path_walker.py +++ b/modules/blendfile_path_walker.py @@ -416,7 +416,8 @@ class FilePath: @staticmethod def _from_block_IM(block, basedir, extra_info, level): - if block[b'source'] not in {C_defs.IMA_SRC_FILE, C_defs.IMA_SRC_SEQUENCE, C_defs.IMA_SRC_MOVIE}: + # old files miss this + if block.get(b'source', -1) not in {C_defs.IMA_SRC_FILE, C_defs.IMA_SRC_SEQUENCE, C_defs.IMA_SRC_MOVIE}: return if block[b'packedfile']: return @@ -438,7 +439,10 @@ class FilePath: @staticmethod def _from_block_ME(block, basedir, extra_info, level): - block_external = block.get_pointer(b'ldata.external') + block_external = block.get_pointer(b'ldata.external', None) + if block_external is None: + block_external = block.get_pointer(b'fdata.external', None) + if block_external is not None: yield FPElem_block_path(basedir, level, (block_external, b'filename')), extra_info @@ -559,7 +563,7 @@ class ExpandID: yield item.get_pointer(b'id', sdna_index_refine=sdna_index_bNode) def _expand_generic_nodetree_id(block): - block_ntree = block.get_pointer(b'nodetree') + block_ntree = block.get_pointer(b'nodetree', None) if block_ntree is not None: yield from ExpandID._expand_generic_nodetree(block_ntree)