Anim Cupboard: Add Selection Sets to Animation Panel #81

Merged
Nick Alberelli merged 4 commits from feature/anim-cupboard-selection-set into main 2023-06-16 14:12:17 +02:00
2 changed files with 114 additions and 26 deletions
Showing only changes of commit 8f2efc1caa - Show all commits

View File

@ -8,13 +8,14 @@ from .operators import lock_curves
from .operators import bake_anim_across_armatures
from . import easy_constraints
from . import warn_about_broken_libraries
from . import bone_selection_sets
bl_info = {
'name' : "Animation Cupboard",
'name': "Animation Cupboard",
'author': "Demeter Dzadik",
"version": (0, 0, 2),
'blender' : (3, 2, 0),
'description' : "Tools to improve animation workflows",
'blender': (3, 2, 0),
'description': "Tools to improve animation workflows",
'location': "Various",
'category': 'Animation',
# 'doc_url' : "https://gitlab.com/blender/CloudRig/",
@ -25,39 +26,42 @@ modules = (
lock_curves,
bake_anim_across_armatures,
easy_constraints,
warn_about_broken_libraries
warn_about_broken_libraries,
bone_selection_sets,
)
def register_unregister_modules(modules: List, register: bool):
"""Recursively register or unregister modules by looking for either
un/register() functions or lists named `registry` which should be a list of
registerable classes.
"""
register_func = register_class if register else unregister_class
"""Recursively register or unregister modules by looking for either
un/register() functions or lists named `registry` which should be a list of
registerable classes.
"""
register_func = register_class if register else unregister_class
for m in modules:
if register:
importlib.reload(m)
if hasattr(m, 'registry'):
for c in m.registry:
try:
register_func(c)
except Exception as e:
un = 'un' if not register else ''
print(f"Warning: Failed to {un}register class: {c.__name__}")
print(e)
for m in modules:
if register:
importlib.reload(m)
if hasattr(m, 'registry'):
for c in m.registry:
try:
register_func(c)
except Exception as e:
un = 'un' if not register else ''
print(f"Warning: Failed to {un}register class: {c.__name__}")
print(e)
if hasattr(m, 'modules'):
register_unregister_modules(m.modules, register)
if hasattr(m, 'modules'):
register_unregister_modules(m.modules, register)
if register and hasattr(m, 'register'):
m.register()
elif hasattr(m, 'unregister'):
m.unregister()
if register and hasattr(m, 'register'):
m.register()
elif hasattr(m, 'unregister'):
m.unregister()
def register():
register_unregister_modules(modules, True)
def unregister():
register_unregister_modules(modules, False)

View File

@ -0,0 +1,84 @@
import bpy
from addon_utils import check, paths, enable
import sys
# RELEASE SCRIPTS: official scripts distributed in Blender releases
addon_enabled = False
paths_list = paths()
addon_list = []
for path in paths_list:
for mod_name, mod_path in bpy.path.module_names(path):
if mod_name == 'bone_selection_sets':
is_enabled, is_loaded = check(mod_name)
addon_enabled = is_enabled
break
class POSE_PT_selection_sets_view3d(bpy.types.Panel):
bl_label = "Selection Sets"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = 'Animation'
@classmethod
def poll(cls, context):
return context.mode == 'POSE' and context.active_pose_bone
def draw(self, context):
layout = self.layout
if not addon_enabled:
layout.label(text="Addon 'Bone Selection Sets' not Enabled", icon="ERROR")
return
arm = context.object
row = layout.row()
row.enabled = context.mode == 'POSE'
# UI list
rows = 4 if len(arm.selection_sets) > 0 else 1
row.template_list(
"POSE_UL_selection_set",
"", # type and unique id
arm,
"selection_sets", # pointer to the CollectionProperty
arm,
"active_selection_set", # pointer to the active identifier
rows=rows,
)
# add/remove/specials UI list Menu
col = row.column(align=True)
col.operator("pose.selection_set_add", icon='ADD', text="")
col.operator("pose.selection_set_remove", icon='REMOVE', text="")
col.menu("POSE_MT_selection_sets_context_menu", icon='DOWNARROW_HLT', text="")
# move up/down arrows
if len(arm.selection_sets) > 0:
col.separator()
col.operator(
"pose.selection_set_move", icon='TRIA_UP', text=""
).direction = 'UP'
col.operator(
"pose.selection_set_move", icon='TRIA_DOWN', text=""
).direction = 'DOWN'
# buttons
row = layout.row()
sub = row.row(align=True)
sub.operator("pose.selection_set_assign", text="Assign")
sub.operator("pose.selection_set_unassign", text="Remove")
sub = row.row(align=True)
sub.operator("pose.selection_set_select", text="Select")
sub.operator("pose.selection_set_deselect", text="Deselect")
registry = [
POSE_PT_selection_sets_view3d,
]