"""
Shading and UV Preparation Handlers
Business logic for marking seams and sharp edges.
"""
import bpy
import bmesh
import math
import traceback
def mark_seams_by_angle(angle=60.0, clear_existing=False):
"""Mark edges as seams based on angle threshold"""
try:
active_obj = bpy.context.active_object
if not active_obj or active_obj.type != 'MESH':
return {"error": "No active mesh object selected"}
# Store the current mode
current_mode = active_obj.mode
# Switch to edit mode
bpy.ops.object.mode_set(mode='EDIT')
# Clear existing seams if requested
if clear_existing:
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.mark_seam(clear=True)
# Deselect all
bpy.ops.mesh.select_all(action='DESELECT')
# Convert angle to radians
angle_radians = math.radians(angle)
# Select edges by angle
bpy.ops.mesh.edges_select_sharp(sharpness=angle_radians)
# Count selected edges
bm = bmesh.from_edit_mesh(active_obj.data)
edges_marked = sum(1 for e in bm.edges if e.select)
# Mark selected edges as seams
bpy.ops.mesh.mark_seam()
# Update the mesh
bmesh.update_edit_mesh(active_obj.data)
# Return to original mode
bpy.ops.object.mode_set(mode=current_mode)
return {
"success": True,
"edges_marked": edges_marked,
"angle": angle
}
except Exception as e:
traceback.print_exc()
return {"error": f"Failed to mark seams: {str(e)}"}
def mark_sharp_by_angle(angle=45.0, clear_existing=False):
"""Mark edges as sharp based on angle threshold"""
try:
active_obj = bpy.context.active_object
if not active_obj or active_obj.type != 'MESH':
return {"error": "No active mesh object selected"}
# Store the current mode
current_mode = active_obj.mode
# Switch to edit mode
bpy.ops.object.mode_set(mode='EDIT')
# Clear existing sharp edges if requested
if clear_existing:
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.mark_sharp(clear=True)
# Deselect all
bpy.ops.mesh.select_all(action='DESELECT')
# Convert angle to radians
angle_radians = math.radians(angle)
# Select edges by angle
bpy.ops.mesh.edges_select_sharp(sharpness=angle_radians)
# Count selected edges
bm = bmesh.from_edit_mesh(active_obj.data)
edges_marked = sum(1 for e in bm.edges if e.select)
# Mark selected edges as sharp
bpy.ops.mesh.mark_sharp()
# Update the mesh
bmesh.update_edit_mesh(active_obj.data)
# Return to original mode
bpy.ops.object.mode_set(mode=current_mode)
return {
"success": True,
"edges_marked": edges_marked,
"angle": angle
}
except Exception as e:
traceback.print_exc()
return {"error": f"Failed to mark sharp edges: {str(e)}"}