Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'pose_library/functions.py')
-rw-r--r--pose_library/functions.py94
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