make merge armature use the new identify bones method
This commit is contained in:
@@ -2,7 +2,6 @@ import bpy
|
||||
import numpy as np
|
||||
from typing import List, Optional, Dict, Set, Tuple, Any
|
||||
from bpy.types import Context, Object, Operator, ArmatureModifier, EditBone, VertexGroup, Mesh, ShapeKey
|
||||
from ...core.dictionaries import bone_names
|
||||
from ...core.logging_setup import logger
|
||||
from ...core.translations import t
|
||||
from ...core.common import (
|
||||
@@ -11,6 +10,7 @@ from ...core.common import (
|
||||
clear_unused_data_blocks,
|
||||
join_mesh_objects,
|
||||
remove_unused_shapekeys,
|
||||
identify_bones,
|
||||
)
|
||||
from ...core.dictionaries import simplify_bonename
|
||||
|
||||
@@ -175,45 +175,23 @@ def merge_armatures(
|
||||
for bone in merge_armature_data.bones:
|
||||
original_parents[bone.name] = bone.parent.name if bone.parent else None
|
||||
|
||||
#create reverse lookup
|
||||
reverse_bone_lookup = {}
|
||||
for preferred_name, name_list in bone_names.items():
|
||||
for name in name_list:
|
||||
reverse_bone_lookup[name] = preferred_name
|
||||
|
||||
# Get base bone names
|
||||
base_bone_names: Set[str] = {bone.name for bone in base_armature.data.bones}
|
||||
|
||||
base_armature_standards: Dict[str,Optional[str]] = {}
|
||||
for bone in base_bone_names:
|
||||
if simplify_bonename(bone) in reverse_bone_lookup:
|
||||
base_armature_standards[reverse_bone_lookup[simplify_bonename(bone)]] = bone
|
||||
|
||||
# Switch to edit mode on merge armature and rename bones
|
||||
bpy.context.view_layer.objects.active = merge_armature
|
||||
bpy.ops.object.mode_set(mode='EDIT')
|
||||
|
||||
# Handle bone renaming/removing to target armature.
|
||||
bone_names_source: list[str] = [bone.name for bone in merge_armature_data.edit_bones]
|
||||
for bone in bone_names_source:
|
||||
bone_name = bone
|
||||
if bone_name not in base_bone_names: #not auto mergable to original
|
||||
# Identify our bones to what their standard name is like "hips" for source and target armature bones.
|
||||
identifed_base_bone_names: Dict[str,str] = identify_bones(base_armature.data)
|
||||
identified_bone_names_source: Dict[str,str] = identify_bones(merge_armature_data)
|
||||
|
||||
if simplify_bonename(bone_name) in reverse_bone_lookup: #if is a standard bone through standard translation.
|
||||
if reverse_bone_lookup[simplify_bonename(bone_name)] in base_armature_standards: #if this bone equals for example, "hips", does a bone that should be "hips" exist on our target armature?
|
||||
#if so, rename this bone to that one
|
||||
merge_armature_data.edit_bones[bone_name].name = base_armature_standards[reverse_bone_lookup[simplify_bonename(bone_name)]]
|
||||
for standard,bone_name in identified_bone_names_source.items():
|
||||
if standard in identifed_base_bone_names: #if the bone we are at on our merge armature has a standard name translation for the target armature
|
||||
merge_armature_data.edit_bones[bone_name].name = identifed_base_bone_names[standard] #change it's name to the one on the target merge to armature's coorisponding standard bone
|
||||
bone_name = merge_armature_data.edit_bones[bone_name].name
|
||||
#adjust original parents list to point to the new name.
|
||||
for child_bone in merge_armature_data.edit_bones[bone_name]:
|
||||
original_parents[child_bone.name] = bone_name
|
||||
#then remove so it doesn't clash when merged.
|
||||
merge_armature_data.edit_bones.remove(merge_armature_data.edit_bones[bone_name])
|
||||
continue
|
||||
|
||||
#if it really doesn't have a counter part, just don't bother.
|
||||
else:
|
||||
merge_armature_data.edit_bones.remove(merge_armature_data.edit_bones[bone_name])
|
||||
|
||||
# Return to object mode
|
||||
bpy.ops.object.mode_set(mode='OBJECT')
|
||||
|
||||
Reference in New Issue
Block a user