50 lines
1023 B
Python
50 lines
1023 B
Python
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
"""
|
|
Pose Library - usage functions.
|
|
"""
|
|
|
|
from typing import Set
|
|
import re
|
|
import bpy
|
|
|
|
from bpy.types import (
|
|
Action,
|
|
Object,
|
|
)
|
|
|
|
|
|
def select_bones(arm_object: Object, action: Action, *, select: bool, flipped: bool) -> None:
|
|
pose_bone_re = re.compile(r'pose.bones\["([^"]+)"\]')
|
|
pose = arm_object.pose
|
|
|
|
seen_bone_names: Set[str] = set()
|
|
|
|
for fcurve in action.fcurves:
|
|
data_path: str = fcurve.data_path
|
|
match = pose_bone_re.match(data_path)
|
|
if not match:
|
|
continue
|
|
|
|
bone_name = match.group(1)
|
|
|
|
if bone_name in seen_bone_names:
|
|
continue
|
|
seen_bone_names.add(bone_name)
|
|
|
|
if flipped:
|
|
bone_name = bpy.utils.flip_name(bone_name)
|
|
|
|
try:
|
|
pose_bone = pose.bones[bone_name]
|
|
except KeyError:
|
|
continue
|
|
|
|
pose_bone.bone.select = select
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import doctest
|
|
|
|
print(f"Test result: {doctest.testmod()}")
|