diff options
Diffstat (limited to 'pose_library/functions.py')
-rw-r--r-- | pose_library/functions.py | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/pose_library/functions.py b/pose_library/functions.py new file mode 100644 index 00000000..bb32e669 --- /dev/null +++ b/pose_library/functions.py @@ -0,0 +1,94 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +""" +Pose Library - functions. +""" + +from pathlib import Path +from typing import Any, List, Set, cast, Iterable + +Datablock = Any + +import bpy +from bpy.types import ( + Context, +) + + +def asset_mark(context: Context, datablock: Any) -> Set[str]: + asset_mark_ctx = { + **context.copy(), + "id": datablock, + } + return cast(Set[str], bpy.ops.asset.mark(asset_mark_ctx)) + + +def asset_clear(context: Context, datablock: Any) -> Set[str]: + asset_clear_ctx = { + **context.copy(), + "id": datablock, + } + result = bpy.ops.asset.clear(asset_clear_ctx) + assert isinstance(result, set) + if "FINISHED" in result: + datablock.use_fake_user = False + return result + + +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 |