Files
2025-07-15 18:11:58 -04:00

72 lines
2.7 KiB
Python

import traceback
import bpy
from bpy.types import Operator, Context
from ...core.translations import t
from ...core.common import get_active_armature
from ...core.armature_validation import validate_armature
import traceback
class AvatarToolKit_OT_SeparateByMaterials(Operator):
"""Operator to separate mesh by materials"""
bl_idname = "avatar_toolkit.separate_materials"
bl_label = t("Tools.separate_materials")
bl_description = t("Tools.separate_materials_desc")
bl_options = {'REGISTER', 'UNDO'}
@classmethod
def poll(cls, context: Context) -> bool:
"""Check if operator can be executed"""
armature = get_active_armature(context)
if not armature:
return False
valid, _, _ = validate_armature(armature)
return (context.active_object and
context.active_object.type == 'MESH' and
valid)
def execute(self, context: Context) -> set[str]:
"""Execute the separation operation"""
try:
obj = context.active_object
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.separate(type='MATERIAL')
bpy.ops.object.mode_set(mode='OBJECT')
self.report({'INFO'}, t("Tools.separate_materials_success"))
return {'FINISHED'}
except Exception:
self.report({'ERROR'}, traceback.format_exc())
return {'CANCELLED'}
class AvatarToolKit_OT_SeparateByLooseParts(Operator):
"""Operator to separate mesh by loose parts"""
bl_idname = "avatar_toolkit.separate_loose"
bl_label = t("Tools.separate_loose")
bl_description = t("Tools.separate_loose_desc")
bl_options = {'REGISTER', 'UNDO'}
@classmethod
def poll(cls, context: Context) -> bool:
"""Check if operator can be executed"""
armature = get_active_armature(context)
if not armature:
return False
valid, _, _ = validate_armature(armature)
return (context.active_object and
context.active_object.type == 'MESH' and
valid)
def execute(self, context: Context) -> set[str]:
"""Execute the separation operation"""
try:
obj = context.active_object
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.separate(type='LOOSE')
bpy.ops.object.mode_set(mode='OBJECT')
self.report({'INFO'}, t("Tools.separate_loose_success"))
return {'FINISHED'}
except Exception:
self.report({'ERROR'}, traceback.format_exc())
return {'CANCELLED'}