Skip to content
Snippets Groups Projects
functions.py 1.44 KiB
Newer Older
  • Learn to ignore specific revisions
  • # SPDX-License-Identifier: GPL-2.0-or-later
    
    
    """
    Pose Library - functions.
    """
    
    from pathlib import Path
    
    from typing import Any, List, Iterable
    
    
    Datablock = Any
    
    import bpy
    
    
    def load_assets_from(filepath: Path) -> List[Datablock]:
        if not has_assets(filepath):
            # Avoid loading any datablocks when there are none marked as asset.
            return []
    
        # Append everything from the file.
        with bpy.data.libraries.load(str(filepath)) as (
            data_from,
            data_to,
        ):
            for attr in dir(data_to):
                setattr(data_to, attr, getattr(data_from, attr))
    
        # Iterate over the appended datablocks to find assets.
        def loaded_datablocks() -> Iterable[Datablock]:
            for attr in dir(data_to):
                datablocks = getattr(data_to, attr)
                for datablock in datablocks:
                    yield datablock
    
        loaded_assets = []
        for datablock in loaded_datablocks():
            if not getattr(datablock, "asset_data", None):
                continue
    
            # Fake User is lost when appending from another file.
            datablock.use_fake_user = True
            loaded_assets.append(datablock)
        return loaded_assets
    
    
    def has_assets(filepath: Path) -> bool:
        with bpy.data.libraries.load(str(filepath), assets_only=True) as (
            data_from,
            _,
        ):
            for attr in dir(data_from):
                data_names = getattr(data_from, attr)
                if data_names:
                    return True
        return False