Compare commits
5 Commits
c3aee88dbb
...
76133ef3db
Author | SHA1 | Date | |
---|---|---|---|
76133ef3db | |||
0f2460f6b5 | |||
cbdd63ef0d | |||
164dec9ab5 | |||
1d25f45735 |
30
__init__.py
30
__init__.py
@ -1,6 +1,5 @@
|
||||
import bpy
|
||||
from . import gui, operators, common
|
||||
from typing import List, Tuple
|
||||
from . import gui, operators, common, keymaps
|
||||
bl_info = \
|
||||
{
|
||||
"name": "Damn Simple Pose Library",
|
||||
@ -19,12 +18,9 @@ if _need_reload:
|
||||
|
||||
gui = importlib.reload(gui)
|
||||
common = importlib.reload(common)
|
||||
# keymaps = importlib.reload(keymaps)
|
||||
keymaps = importlib.reload(keymaps)
|
||||
operators = importlib.reload(operators)
|
||||
|
||||
# addon_keymaps: List[Tuple[bpy.types.KeyMap, bpy.types.KeyMapItem]] = []
|
||||
# addon_keymaps = []
|
||||
|
||||
|
||||
class dsplObj(bpy.types.PropertyGroup):
|
||||
pose_library: bpy.props.PointerProperty(
|
||||
@ -40,9 +36,6 @@ class dsplVars(bpy.types.PropertyGroup):
|
||||
pose_new_name: bpy.props.StringProperty(
|
||||
name="Pose Name", description="New name for pose",
|
||||
default="Pose", override={'LIBRARY_OVERRIDABLE'})
|
||||
only_selected: bpy.props.BoolProperty(
|
||||
name="Only selected Bones", description="Process only selected bones",
|
||||
default=False, options={'HIDDEN'}, override={'LIBRARY_OVERRIDABLE'})
|
||||
numero: bpy.props.IntProperty(
|
||||
name='Numero', default=666, override={'LIBRARY_OVERRIDABLE'})
|
||||
|
||||
@ -76,15 +69,7 @@ def register():
|
||||
|
||||
gui.register()
|
||||
operators.register()
|
||||
|
||||
# kc = bpy.context.window_manager.keyconfigs.addon
|
||||
# km = kc.keymaps.new(name='3D View', space_type='VIEW_3D')
|
||||
# kmi = [
|
||||
# km.keymap_items.new("dspl.add_pose", type='L', value='PRESS', shift=True),
|
||||
# km.keymap_items.new("dspl.browse_poses", type='L', value='PRESS', alt=True),
|
||||
# ]
|
||||
# addon_keymaps.append((km, kmi))
|
||||
|
||||
keymaps.register()
|
||||
|
||||
def unregister() -> None:
|
||||
from bpy.utils import unregister_class
|
||||
@ -95,14 +80,9 @@ def unregister() -> None:
|
||||
del bpy.types.Object.dsplvars
|
||||
del bpy.types.Scene.dsplSettings
|
||||
|
||||
gui.unregister()
|
||||
keymaps.unregister()
|
||||
operators.unregister()
|
||||
|
||||
# for km, kmi in addon_keymaps:
|
||||
# km.keymap_items.remove(kmi)
|
||||
# addon_keymaps.clear()
|
||||
|
||||
gui.unregister()
|
||||
|
||||
if __name__ == "__main__":
|
||||
register()
|
||||
|
||||
|
69
common.py
69
common.py
@ -1,4 +1,5 @@
|
||||
import bpy
|
||||
import mathutils
|
||||
|
||||
|
||||
def getArmatureObject(context):
|
||||
@ -96,10 +97,14 @@ def createKeyframe(context, bone_name, transform, index_int, new_marker, loc):
|
||||
pass
|
||||
|
||||
|
||||
def setKeyframesFromBones(context, new_marker):
|
||||
arm_object = getArmatureObject(context)
|
||||
def setKeyframesFromBones(context, arm_object, new_marker):
|
||||
none_selected = True
|
||||
for bone in arm_object.pose.bones:
|
||||
if bone.bone.select or arm_object.dsplvars.only_selected == False:
|
||||
if bone.bone.select:
|
||||
none_selected = False
|
||||
|
||||
for bone in arm_object.pose.bones:
|
||||
if bone.bone.select or none_selected == True:
|
||||
bone_name = bone.name
|
||||
|
||||
if bone.rotation_mode == "XYZ":
|
||||
@ -157,3 +162,61 @@ def setKeyframesFromBones(context, new_marker):
|
||||
createKeyframe(context, bone_name, "scale", 2, new_marker, scl_z)
|
||||
|
||||
|
||||
def setBonesfromKeyframes(context, arm_object, active_marker):
|
||||
none_selected = True
|
||||
for bone in arm_object.pose.bones:
|
||||
if bone.bone.select:
|
||||
none_selected = False
|
||||
|
||||
for bone in arm_object.pose.bones:
|
||||
if bone.bone.select or none_selected == True:
|
||||
bone_name = bone.name
|
||||
|
||||
if bone.rotation_mode == "XYZ":
|
||||
rot_mode = "rotation_euler"
|
||||
elif bone.rotation_mode == "YZX":
|
||||
rot_mode = "rotation_euler"
|
||||
elif bone.rotation_mode == "ZXY":
|
||||
rot_mode = "rotation_euler"
|
||||
elif bone.rotation_mode == "QUATERNION":
|
||||
rot_mode = "rotation_quaternion"
|
||||
else:
|
||||
self.report({'WARNING'}, "DSPL: Unsupported bone: " + bone.name + ": " + bone.rotation_mode)
|
||||
rot_mode = None
|
||||
|
||||
loc_x = findFcurve(context, bone_name, "location", 0) or 0.0
|
||||
loc_y = findFcurve(context, bone_name, "location", 1) or 0.0
|
||||
loc_z = findFcurve(context, bone_name, "location", 2) or 0.0
|
||||
if rot_mode == "rotation_quaternion":
|
||||
rot_w = findFcurve(context, bone_name, rot_mode, 0) or 1.0
|
||||
rot_x = findFcurve(context, bone_name, rot_mode, 1) or 0.0
|
||||
rot_y = findFcurve(context, bone_name, rot_mode, 2) or 0.0
|
||||
rot_z = findFcurve(context, bone_name, rot_mode, 3) or 0.0
|
||||
elif rot_mode == "rotation_euler":
|
||||
rot_x = findFcurve(context, bone_name, rot_mode, 0) or 0.0
|
||||
rot_y = findFcurve(context, bone_name, rot_mode, 1) or 0.0
|
||||
rot_z = findFcurve(context, bone_name, rot_mode, 2) or 0.0
|
||||
scl_x = findFcurve(context, bone_name, "scale", 0) or 1.0
|
||||
scl_y = findFcurve(context, bone_name, "scale", 1) or 1.0
|
||||
scl_z = findFcurve(context, bone_name, "scale", 2) or 1.0
|
||||
|
||||
bone.location = mathutils.Vector((loc_x, loc_y, loc_z))
|
||||
if bone.rotation_mode == "XYZ":
|
||||
bone.rotation_euler = mathutils.Euler(
|
||||
(rot_x, rot_y, rot_z))
|
||||
elif bone.rotation_mode == "YZX":
|
||||
bone.rotation_euler = mathutils.Euler(
|
||||
(rot_x, rot_y, rot_z))
|
||||
elif bone.rotation_mode == "ZXY":
|
||||
bone.rotation_euler = mathutils.Euler(
|
||||
(rot_z, rot_x, rot_y))
|
||||
elif bone.rotation_mode == "YXZ":
|
||||
bone.rotation_euler = mathutils.Euler(
|
||||
(rot_y, rot_x, rot_z))
|
||||
elif bone.rotation_mode == "XZY":
|
||||
bone.rotation_euler = mathutils.Euler(
|
||||
(rot_x, rot_z, rot_y))
|
||||
elif rot_mode == "rotation_quaternion":
|
||||
bone.rotation_quaternion = mathutils.Quaternion(
|
||||
(rot_w, rot_x, rot_y, rot_z))
|
||||
bone.scale = mathutils.Vector((scl_x, scl_y, scl_z))
|
28
gui.py
28
gui.py
@ -75,8 +75,6 @@ class DATA_PT_DSPLPanel(bpy.types.Panel):
|
||||
if active_pose_library.pose_markers.active:
|
||||
quick_apply_layout = quick_pose_controls_layout.split(
|
||||
align=True)
|
||||
quick_apply_layout.prop(arm_object.dsplvars,
|
||||
"only_selected", icon='GROUP_BONE', text="Selected", toggle=True)
|
||||
quick_apply_layout.operator(
|
||||
"dspl.browse_poses", icon='CON_ARMATURE', text="Browse")
|
||||
if dsplsettings.new_menu == False:
|
||||
@ -127,7 +125,7 @@ class DATA_PT_DSPLPanel(bpy.types.Panel):
|
||||
# Pose operators
|
||||
pose_ops_layout = pose_list_entries_layout.column(align=True)
|
||||
pose_ops_layout.operator(
|
||||
"dspl.draw_new_pose_menu", icon='ADD', text="")
|
||||
"wm.call_menu", icon='ADD', text="").name = "OBJECT_MT_AddPoseMenu"
|
||||
if active_pose_library.pose_markers.active:
|
||||
pose_ops_layout.operator(
|
||||
"dspl.remove_pose", icon='REMOVE', text="")
|
||||
@ -159,15 +157,31 @@ class OBJECT_MT_AddPoseMenu(bpy.types.Menu):
|
||||
|
||||
dspl_add_menu_layout = self.layout
|
||||
dspl_add_menu_layout.operator(
|
||||
"dspl.draw_new_pose_menu", icon='DECORATE_DRIVER', text="Add New Pose")
|
||||
if action_object.pose_markers.active:
|
||||
dspl_add_menu_layout.operator(
|
||||
"dspl.add_pose", icon='DECORATE_OVERRIDE', text="Replace Existing Pose").replace = True
|
||||
"dspl.add_pose", icon='ADD', text="Add New Pose").posename = arm_object.dsplvars.pose_new_name
|
||||
if len(action_object.pose_markers):
|
||||
dspl_add_menu_layout.menu(
|
||||
"OBJECT_MT_ReplacePoseMenu", text="Replace Existing Pose", icon="DECORATE_OVERRIDE")
|
||||
|
||||
|
||||
class OBJECT_MT_ReplacePoseMenu(bpy.types.Menu):
|
||||
bl_idname = "OBJECT_MT_ReplacePoseMenu"
|
||||
bl_label = "Add Pose"
|
||||
|
||||
def draw(self, context):
|
||||
arm_object = getArmatureObject(context)
|
||||
action_object = getPoseLib(context)
|
||||
|
||||
dspl_replace_menu_layout = self.layout
|
||||
for pm in action_object.pose_markers:
|
||||
op = dspl_replace_menu_layout.operator("dspl.add_pose", text=pm.name, icon="PMARKER")
|
||||
op.replace = True
|
||||
op.posename = pm.name
|
||||
|
||||
|
||||
classes = (
|
||||
DATA_PT_DSPLPanel,
|
||||
OBJECT_MT_AddPoseMenu,
|
||||
OBJECT_MT_ReplacePoseMenu,
|
||||
)
|
||||
|
||||
|
||||
|
30
keymaps.py
30
keymaps.py
@ -1,28 +1,30 @@
|
||||
# SPDX-FileCopyrightText: 2010-2023 Blender Foundation
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
import bpy
|
||||
from .operators import *
|
||||
from typing import List, Tuple
|
||||
|
||||
|
||||
addon_keymaps = []
|
||||
|
||||
|
||||
def register() -> None:
|
||||
def register_keymaps():
|
||||
wm = bpy.context.window_manager
|
||||
kc = wm.keyconfigs.addon
|
||||
if kc is None:
|
||||
return
|
||||
|
||||
km = kc.keymaps.new(name="File Browser Main")
|
||||
kmi = km.keymap_items.new("dspl.browse_poses", type="L", value="PRESS", alt=True)
|
||||
kmi.active = True
|
||||
# Add Pose
|
||||
km = wm.keyconfigs.addon.keymaps.new(name='Pose', space_type='EMPTY')
|
||||
kmi = km.keymap_items.new('wm.call_menu', 'L', 'PRESS', shift=True)
|
||||
kmi.properties.name = "OBJECT_MT_AddPoseMenu"
|
||||
addon_keymaps.append((km, kmi))
|
||||
|
||||
# Browse Poses
|
||||
km = wm.keyconfigs.addon.keymaps.new(name='Pose', space_type='EMPTY')
|
||||
kmi = km.keymap_items.new('dspl.browse_poses', 'L', 'PRESS', alt=True)
|
||||
addon_keymaps.append((km, kmi))
|
||||
|
||||
def unregister() -> None:
|
||||
def unregister_keymaps():
|
||||
for km, kmi in addon_keymaps:
|
||||
km.keymap_items.remove(kmi)
|
||||
addon_keymaps.clear()
|
||||
|
||||
def register():
|
||||
register_keymaps()
|
||||
|
||||
def unregister():
|
||||
unregister_keymaps()
|
108
operators.py
108
operators.py
@ -1,5 +1,4 @@
|
||||
import bpy
|
||||
import mathutils
|
||||
import blf
|
||||
from .common import *
|
||||
|
||||
@ -39,53 +38,6 @@ class DSPL_OT_ConvertPoseLibrary(bpy.types.Operator):
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
# Operator to to draw a menu for new poses
|
||||
|
||||
|
||||
class DSPL_OT_DrawNewPoseMenu(bpy.types.Operator):
|
||||
bl_idname = "dspl.draw_new_pose_menu"
|
||||
bl_label = "New Pose Menu"
|
||||
bl_description = "New Pose Menu"
|
||||
bl_options = {'INTERNAL'}
|
||||
|
||||
def execute(self, context):
|
||||
return {'FINISHED'}
|
||||
|
||||
def invoke(self, context, event):
|
||||
return context.window_manager.invoke_popup(self, width=200)
|
||||
|
||||
def draw(self, context):
|
||||
dspl_create_popup_layout = self.layout
|
||||
dspl_new_pose_menu = dspl_create_popup_layout.box()
|
||||
|
||||
arm_object = getArmatureObject(context)
|
||||
pose_library = getPoseLib(context)
|
||||
dspl_new_pose_menu.prop(
|
||||
arm_object.dsplvars, "pose_new_name", text="Name")
|
||||
dspl_new_pose_menu.prop(
|
||||
arm_object.dsplvars,
|
||||
"only_selected", icon='GROUP_BONE', text="Selected", toggle=True)
|
||||
dspl_new_pose_menu.operator(
|
||||
"dspl.add_pose", icon='ADD', text="Add New Pose").posename = arm_object.dsplvars.pose_new_name
|
||||
|
||||
|
||||
# Operator to call up popup menus by ID
|
||||
|
||||
|
||||
class DSPL_OT_CallPopupMenu(bpy.types.Operator):
|
||||
bl_idname = "dspl.call_popup_menu"
|
||||
bl_label = "Popup menu"
|
||||
bl_description = "Popup menu"
|
||||
bl_options = {'REGISTER', 'UNDO'}
|
||||
|
||||
menuID: bpy.props.StringProperty()
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.wm.call_menu(name=self.menuID)
|
||||
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
# Operator to manage the big menu buttons
|
||||
|
||||
|
||||
@ -162,7 +114,7 @@ class DSPL_OT_AddPose(bpy.types.Operator):
|
||||
pose_markers.new(name=pose_name)
|
||||
pose_markers[pose_name].frame = new_marker
|
||||
|
||||
setKeyframesFromBones(context, new_marker)
|
||||
setKeyframesFromBones(context, arm_object, new_marker)
|
||||
|
||||
action_object.pose_markers.active = pose_markers[pose_name]
|
||||
bpy.context.area.tag_redraw()
|
||||
@ -174,7 +126,7 @@ class DSPL_OT_AddPose(bpy.types.Operator):
|
||||
action_object = getPoseLib(context)
|
||||
pose_markers = action_object.pose_markers
|
||||
active_marker = pose_markers.active
|
||||
new_name = active_marker.name
|
||||
new_name = self.posename
|
||||
counter = 1
|
||||
|
||||
for pm in pose_markers:
|
||||
@ -189,7 +141,7 @@ class DSPL_OT_AddPose(bpy.types.Operator):
|
||||
|
||||
new_marker = target_frame
|
||||
|
||||
setKeyframesFromBones(context, new_marker)
|
||||
setKeyframesFromBones(context, arm_object, new_marker)
|
||||
|
||||
self.report({'INFO'}, "DSPL: Replaced " + pose_markers[new_name].name + " on frame " + str(pose_markers[new_name].frame))
|
||||
|
||||
@ -365,58 +317,7 @@ class DSPL_OT_ApplyPose(bpy.types.Operator):
|
||||
active_frame = active_marker.frame
|
||||
active_posename = active_marker.name
|
||||
|
||||
for bone in arm_object.pose.bones:
|
||||
if bone.bone.select or arm_object.dsplvars.only_selected == False:
|
||||
bone_name = bone.name
|
||||
|
||||
if bone.rotation_mode == "XYZ":
|
||||
rot_mode = "rotation_euler"
|
||||
elif bone.rotation_mode == "YZX":
|
||||
rot_mode = "rotation_euler"
|
||||
elif bone.rotation_mode == "ZXY":
|
||||
rot_mode = "rotation_euler"
|
||||
elif bone.rotation_mode == "QUATERNION":
|
||||
rot_mode = "rotation_quaternion"
|
||||
else:
|
||||
self.report({'WARNING'}, "DSPL: Unsupported bone: " + bone.name + ": " + bone.rotation_mode)
|
||||
rot_mode = None
|
||||
|
||||
loc_x = findFcurve(context, bone_name, "location", 0) or 0.0
|
||||
loc_y = findFcurve(context, bone_name, "location", 1) or 0.0
|
||||
loc_z = findFcurve(context, bone_name, "location", 2) or 0.0
|
||||
if rot_mode == "rotation_quaternion":
|
||||
rot_w = findFcurve(context, bone_name, rot_mode, 0) or 1.0
|
||||
rot_x = findFcurve(context, bone_name, rot_mode, 1) or 0.0
|
||||
rot_y = findFcurve(context, bone_name, rot_mode, 2) or 0.0
|
||||
rot_z = findFcurve(context, bone_name, rot_mode, 3) or 0.0
|
||||
elif rot_mode == "rotation_euler":
|
||||
rot_x = findFcurve(context, bone_name, rot_mode, 0) or 0.0
|
||||
rot_y = findFcurve(context, bone_name, rot_mode, 1) or 0.0
|
||||
rot_z = findFcurve(context, bone_name, rot_mode, 2) or 0.0
|
||||
scl_x = findFcurve(context, bone_name, "scale", 0) or 1.0
|
||||
scl_y = findFcurve(context, bone_name, "scale", 1) or 1.0
|
||||
scl_z = findFcurve(context, bone_name, "scale", 2) or 1.0
|
||||
|
||||
bone.location = mathutils.Vector((loc_x, loc_y, loc_z))
|
||||
if bone.rotation_mode == "XYZ":
|
||||
bone.rotation_euler = mathutils.Euler(
|
||||
(rot_x, rot_y, rot_z))
|
||||
elif bone.rotation_mode == "YZX":
|
||||
bone.rotation_euler = mathutils.Euler(
|
||||
(rot_x, rot_y, rot_z))
|
||||
elif bone.rotation_mode == "ZXY":
|
||||
bone.rotation_euler = mathutils.Euler(
|
||||
(rot_z, rot_x, rot_y))
|
||||
elif bone.rotation_mode == "YXZ":
|
||||
bone.rotation_euler = mathutils.Euler(
|
||||
(rot_y, rot_x, rot_z))
|
||||
elif bone.rotation_mode == "XZY":
|
||||
bone.rotation_euler = mathutils.Euler(
|
||||
(rot_x, rot_z, rot_y))
|
||||
elif rot_mode == "rotation_quaternion":
|
||||
bone.rotation_quaternion = mathutils.Quaternion(
|
||||
(rot_w, rot_x, rot_y, rot_z))
|
||||
bone.scale = mathutils.Vector((scl_x, scl_y, scl_z))
|
||||
setBonesfromKeyframes(context, arm_object, active_marker)
|
||||
|
||||
self.report({'INFO'}, "DSPL: Applied " + active_posename)
|
||||
|
||||
@ -584,7 +485,6 @@ classes = (
|
||||
DSPL_OT_CreatePoseLibrary,
|
||||
DSPL_OT_ConvertPoseLibrary,
|
||||
DSPL_OT_CallPopupMenu,
|
||||
DSPL_OT_DrawNewPoseMenu,
|
||||
DSPL_OT_MenuButtonHandler,
|
||||
DSPL_OT_AddPose,
|
||||
DSPL_OT_RemovePose,
|
||||
|
Reference in New Issue
Block a user