fix merge armatures
now the different options work. and it has an apply transforms
This commit is contained in:
+103
@@ -115,6 +115,9 @@ def get_armature(context: Context, armature_name: Optional[str] = None) -> Optio
|
||||
def get_armatures(self, context: Context) -> List[Tuple[str, str, str]]:
|
||||
return [(obj.name, obj.name, "") for obj in bpy.data.objects if obj.type == 'ARMATURE']
|
||||
|
||||
def get_armatures_that_are_not_selected(self, context: Context) -> List[Tuple[str, str, str]]:
|
||||
return [(obj.name, obj.name, "") for obj in bpy.data.objects if ((obj.type == 'ARMATURE') and (obj.name != context.scene.selected_armature))]
|
||||
|
||||
def get_selected_armature(context: Context) -> Optional[Object]:
|
||||
if context.scene.selected_armature:
|
||||
armature = bpy.data.objects.get(context.scene.selected_armature)
|
||||
@@ -141,6 +144,106 @@ def select_current_armature(context: Context) -> bool:
|
||||
return True
|
||||
return False
|
||||
|
||||
def apply_pose_as_rest(context: Context, armature_obj: bpy.types.Object, meshes: list[bpy.types.Object]) -> bool:
|
||||
for obj in meshes:
|
||||
mesh_data: Mesh = obj.data
|
||||
|
||||
if mesh_data.shape_keys:
|
||||
shape_key_obj_list: list[bpy.types.Object] = []
|
||||
modifier_armature_name: str = ""
|
||||
|
||||
for modifier in obj.modifiers:
|
||||
if modifier.type == "ARMATURE":
|
||||
arm_modifier: bpy.types.ArmatureModifier = modifier
|
||||
if not (arm_modifier.object == armature_obj):
|
||||
continue
|
||||
modifier_armature_name = arm_modifier.object.name
|
||||
|
||||
if modifier_armature_name == "":
|
||||
continue
|
||||
for idx,shape in enumerate(mesh_data.shape_keys.key_blocks):
|
||||
if idx == 0:
|
||||
continue
|
||||
context.view_layer.objects.active = obj
|
||||
|
||||
bpy.ops.object.mode_set(mode="OBJECT")
|
||||
bpy.ops.object.select_all(action="DESELECT")
|
||||
context.view_layer.objects.active = obj
|
||||
obj.select_set(True)
|
||||
|
||||
#create duplicate of object
|
||||
bpy.ops.object.duplicate()
|
||||
|
||||
shape_obj = context.view_layer.objects.active
|
||||
|
||||
#make current shapekey a separate object
|
||||
shape_obj.active_shape_key_index = idx
|
||||
shape_obj.name = shape.name
|
||||
|
||||
bpy.ops.object.shape_key_move(type="TOP")
|
||||
|
||||
bpy.ops.object.mode_set(mode="EDIT")
|
||||
bpy.ops.object.mode_set(mode="OBJECT")
|
||||
|
||||
bpy.ops.object.shape_key_remove(all=True)
|
||||
|
||||
bpy.ops.object.modifier_apply(modifier=modifier_armature_name)
|
||||
|
||||
#for modifier_name in [i.name for i in shape_obj.modifiers]:
|
||||
# bpy.ops.object.modifier_remove(modifier=modifier_name)
|
||||
|
||||
shape_key_obj_list.append(shape_obj) #add to a list of shape key objects
|
||||
context.view_layer.objects.active = obj
|
||||
|
||||
bpy.ops.object.mode_set(mode="OBJECT")
|
||||
context.view_layer.objects.active.select_set(True)
|
||||
bpy.ops.object.shape_key_remove(all=True)
|
||||
bpy.ops.object.modifier_apply(modifier=modifier_armature_name)
|
||||
bpy.ops.object.select_all(action="DESELECT")
|
||||
|
||||
for shapekey_obj in shape_key_obj_list:
|
||||
shapekey_obj.select_set(True)
|
||||
context.view_layer.objects.active = obj
|
||||
context.view_layer.objects.active.select_set(True)
|
||||
|
||||
try:
|
||||
bpy.ops.object.join_shapes()
|
||||
except:
|
||||
|
||||
#delete shapekey objects to not leave ourselves in a bad exit state - @989onan
|
||||
context.view_layer.objects.active = shape_key_obj_list[0]
|
||||
obj.select_set(False)
|
||||
bpy.ops.object.delete(confirm=False)
|
||||
return False
|
||||
context.view_layer.objects.active = shape_key_obj_list[0]
|
||||
obj.select_set(False)
|
||||
bpy.ops.object.delete(confirm=False)
|
||||
else:
|
||||
modifier_armature_name: str = ""
|
||||
|
||||
for modifier in obj.modifiers:
|
||||
if modifier.type == "ARMATURE":
|
||||
arm_modifier: bpy.types.ArmatureModifier = modifier
|
||||
if not (arm_modifier.object == armature_obj):
|
||||
continue
|
||||
modifier_armature_name = arm_modifier.object.name
|
||||
|
||||
if modifier_armature_name == "":
|
||||
continue
|
||||
context.view_layer.objects.active = obj
|
||||
bpy.ops.object.mode_set(mode="OBJECT")
|
||||
bpy.ops.object.select_all(action="DESELECT")
|
||||
context.view_layer.objects.active.select_set(True)
|
||||
bpy.ops.object.modifier_apply(modifier=modifier_armature_name)
|
||||
|
||||
context.view_layer.objects.active = armature_obj
|
||||
armature_obj.select_set(True)
|
||||
bpy.ops.object.mode_set(mode="OBJECT")
|
||||
bpy.ops.object.mode_set(mode="POSE")
|
||||
|
||||
bpy.ops.pose.armature_apply(selected=False)
|
||||
return True
|
||||
|
||||
def get_all_meshes(context: Context) -> List[Object]:
|
||||
armature = get_selected_armature(context)
|
||||
if armature and is_valid_armature(armature):
|
||||
|
||||
+13
-2
@@ -4,7 +4,7 @@ from ..core.register import register_property
|
||||
from bpy.types import Scene, Object, Material, Context
|
||||
from bpy.props import BoolProperty, EnumProperty, IntProperty, CollectionProperty, StringProperty, FloatVectorProperty, PointerProperty
|
||||
from ..core.addon_preferences import get_preference
|
||||
from ..core.common import SceneMatClass, MaterialListBool, get_armatures, get_mesh_items
|
||||
from ..core.common import SceneMatClass, MaterialListBool, get_armatures, get_mesh_items, get_armatures_that_are_not_selected
|
||||
|
||||
def register() -> None:
|
||||
default_language = get_preference("language", 0)
|
||||
@@ -23,10 +23,21 @@ def register() -> None:
|
||||
)))
|
||||
|
||||
register_property((bpy.types.Scene, "merge_armature_source", bpy.props.EnumProperty(
|
||||
items=get_armatures,
|
||||
items=get_armatures_that_are_not_selected,
|
||||
name=t("MergeArmatures.selected_armature.label"),
|
||||
description=t("MergeArmatures.selected_armature.label")
|
||||
)))
|
||||
|
||||
register_property((bpy.types.Scene, "merge_armature_apply_transforms", bpy.props.BoolProperty(
|
||||
default=False,
|
||||
name=t("MergeArmature.merge_armatures.apply_transforms.label"),
|
||||
description=t("MergeArmature.merge_armatures.apply_transforms.desc")
|
||||
)))
|
||||
register_property((bpy.types.Scene, "merge_armature_align_bones", bpy.props.BoolProperty(
|
||||
default=False,
|
||||
name=t("MergeArmature.merge_armatures.align_bones.label"),
|
||||
description=t("MergeArmature.merge_armatures.align_bones.desc")
|
||||
)))
|
||||
|
||||
register_property((bpy.types.Scene, "avatar_toolkit_language_changed", bpy.props.BoolProperty(default=False)))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user