fixes for indirect loading

This commit is contained in:
2014-10-20 00:27:38 +02:00
parent 88c5deda50
commit e61fcb3a05

View File

@@ -110,14 +110,18 @@ class FilePath:
# prevent from expanding the # prevent from expanding the
# same datablock more then once # same datablock more then once
expand_codes = set() expand_codes = set()
# {lib_id: {block_ids... }}
expand_codes_idlib = {}
# only for this block # only for this block
def _expand_codes_add_test(block): def _expand_codes_add_test(block, code):
# return True, if the ID should be searched further
#
# we could investigate a better way... # we could investigate a better way...
# Not to be accessing ID blocks at this point. but its harmless # Not to be accessing ID blocks at this point. but its harmless
if block.code == b'ID': if code == b'ID':
if recursive: if recursive:
lib_all expand_codes_idlib.setdefault(block[b'lib'], set()).add(block[b'name'])
return False return False
else: else:
len_prev = len(expand_codes) len_prev = len(expand_codes)
@@ -125,7 +129,7 @@ class FilePath:
return (len_prev != len(expand_codes)) return (len_prev != len(expand_codes))
def block_expand(block, code): def block_expand(block, code):
if _expand_codes_add_test(block): if _expand_codes_add_test(block, code):
yield block yield block
fn = ExpandID.expand_funcs.get(code) fn = ExpandID.expand_funcs.get(code)
@@ -137,6 +141,10 @@ class FilePath:
yield block yield block
else: else:
expand_codes = None expand_codes = None
# set below
expand_codes_idlib = None
def block_expand(block, code): def block_expand(block, code):
yield block yield block
@@ -149,20 +157,6 @@ class FilePath:
if block[b'id.name'] in block_codes: if block[b'id.name'] in block_codes:
yield from block_expand(block, code) yield from block_expand(block, code)
if expand_codes is None:
iter_blocks_lib = lambda: blend.find_blocks_from_code(b'ID')
else:
# iter_blocks_lib = lambda: (block
# for block in blend.find_blocks_from_code(b'ID')
# if block[b'name'] in expand_codes)
def iter_blocks_lib():
for block in blend.find_blocks_from_code(b'ID'):
# if block[b'name'] in expand_codes:
log_deps.info("%ssearching: %s" % (indent_str, block[b'name'].decode('ascii')))
if block[b'name'] in expand_codes:
print("AAA", block[b'name'], expand_codes)
yield block
if temp_remap_cb is not None: if temp_remap_cb is not None:
filepath_tmp = temp_remap_cb(filepath, level) filepath_tmp = temp_remap_cb(filepath, level)
else: else:
@@ -197,20 +191,24 @@ class FilePath:
log_deps.info("%s%s" % (indent_str, set_as_str(expand_codes))) log_deps.info("%s%s" % (indent_str, set_as_str(expand_codes)))
if recursive: if recursive:
# look into libraries
lib_all = {}
for block in iter_blocks_lib(): if expand_codes_idlib is None:
lib_id = block[b'lib'] expand_codes_idlib = {}
for block in blend.find_blocks_from_code(b'ID'):
expand_codes_idlib.setdefault(block[b'lib'], set()).add(block[b'name'])
# look into libraries
lib_all = []
for lib_id, lib_block_codes in sorted(expand_codes_idlib.items()):
lib = blend.find_block_from_offset(lib_id) lib = blend.find_block_from_offset(lib_id)
lib_path = lib[b'name'] lib_path = lib[b'name']
# import IPython; IPython.embed()
# get all data needed to read the blend files here (it will be freed!) # get all data needed to read the blend files here (it will be freed!)
# lib is an address at the moment, we only use as a way to group # lib is an address at the moment, we only use as a way to group
print("OOO", block[b'name'])
lib_all.setdefault(lib_path, set()).add(block[b'name']) lib_all.append((lib_path, lib_block_codes))
# import IPython; IPython.embed()
# do this after, incase we mangle names above # do this after, incase we mangle names above
for block in iter_blocks_id(b'LI'): for block in iter_blocks_id(b'LI'):
@@ -224,7 +222,7 @@ class FilePath:
# now we've closed the file, loop on other files # now we've closed the file, loop on other files
# note, sorting - isn't needed, it just gives predictable load-order. # note, sorting - isn't needed, it just gives predictable load-order.
for lib_path, lib_block_codes in sorted(lib_all.items()): for lib_path, lib_block_codes in lib_all:
lib_path_abs = os.path.normpath(utils.compatpath(utils.abspath(lib_path, basedir))) lib_path_abs = os.path.normpath(utils.compatpath(utils.abspath(lib_path, basedir)))
# if we visited this before, # if we visited this before,
@@ -240,7 +238,6 @@ class FilePath:
if VERBOSE: if VERBOSE:
print((indent_str + " "), "Library: ", filepath, " -> ", lib_path_abs, sep="") print((indent_str + " "), "Library: ", filepath, " -> ", lib_path_abs, sep="")
# print((indent_str + " "), lib_block_codes) # print((indent_str + " "), lib_block_codes)
print(level)
yield from FilePath.visit_from_blend( yield from FilePath.visit_from_blend(
lib_path_abs, lib_path_abs,
readonly=readonly, readonly=readonly,