Merge pull request #161 from 989onan/patch2

Fix error logging
This commit is contained in:
Onan Chew
2025-06-02 21:54:39 -04:00
committed by GitHub
21 changed files with 76 additions and 62 deletions
+6 -5
View File
@@ -1,3 +1,4 @@
import traceback
import bpy
import numpy as np
import threading
@@ -18,7 +19,7 @@ from bpy.utils import register_class
from ..core.logging_setup import logger
from ..core.translations import t
from ..core.dictionaries import bone_names
from .dictionaries import reverse_bone_lookup, bone_names
from .dictionaries import reverse_bone_lookup, bone_names, simplify_bonename
class SceneMatClass(PropertyGroup):
mat: PointerProperty(type=Material)
@@ -201,8 +202,8 @@ def apply_pose_as_rest(context: Context, armature_obj: Object, meshes: List[Obje
return True, t("Operation.pose_applied")
except Exception as e:
logger.error(f"Error applying pose as rest: {str(e)}")
return False, str(e)
logger.error(f"Error applying pose as rest:", exception=e)
return False, traceback.format_exc()
def apply_armature_to_mesh(armature_obj: Object, mesh_obj: Object) -> None:
"""Apply armature deformation to mesh"""
@@ -336,7 +337,7 @@ def join_mesh_objects(context: Context, meshes: List[Object], progress: Optional
return joined_mesh
except Exception as e:
logger.error(f"Failed to join meshes: {str(e)}")
logger.error(f"Failed to join meshes:", exception=e)
return None
@@ -366,7 +367,7 @@ def fix_uv_coordinates(context: Context) -> None:
logger.debug(f"UV Fix - Successfully processed {obj.name}")
except Exception as e:
logger.warning(f"UV Fix - Skipped processing for {obj.name}: {str(e)}")
logger.warning(f"UV Fix - Skipped processing for {obj.name}:", exception=e)
finally:
bpy.ops.object.mode_set(mode='OBJECT')
+2 -2
View File
@@ -16,7 +16,7 @@ logger: logging.Logger = logging.getLogger(__name__)
import importlib.util
if importlib.util.find_spec("io_scene_valvesource") is not None:
from io_scene_valvesource.import_smd import SmdImporter
from io_scene_valvesource.import_smd import SmdImporter # type: ignore
class ImportProgress:
"""Tracks and logs the progress of multi-file imports"""
@@ -84,7 +84,7 @@ def import_multi_files(
progress.update(file["name"])
except Exception as e:
logger.error(f"Import failed: {str(e)}", exc_info=True)
logger.error(f"Import failed:", exception=e)
raise
ImportMethod = Callable[[str, List[Dict[str, str]], str], None]
+1 -1
View File
@@ -22,7 +22,7 @@ def configure_logging(enabled: bool = False) -> None:
logger.addHandler(handler)
def error_with_traceback(msg, *args, **kwargs):
if kwargs.get('exc_info', False) or isinstance(msg, Exception):
if isinstance(kwargs.get('exception', None), Exception):
full_msg = f"{msg}\n{traceback.format_exc()}"
_original_error(full_msg, *args, **{**kwargs, 'exc_info': False})
else:
+4 -3
View File
@@ -1,3 +1,4 @@
import traceback
from types import FrameType
import bpy
import bpy_extras
@@ -92,15 +93,15 @@ class AvatarToolkit_OT_ConvertResonite(Operator):
progress.step(t("Tools.convert_resonite.processing", name=bone.name))
except Exception as e:
logger.error(f"Error during Resonite conversion: {str(e)}")
self.report({'ERROR'}, str(e))
logger.error(f"Error during Resonite conversion:", exception=e)
self.report({'ERROR'}, traceback.format_exc())
return {'CANCELLED'}
finally:
try:
bpy.ops.object.mode_set(mode='OBJECT')
except Exception as e:
logger.warning(f"Error returning to object mode: {str(e)}")
logger.warning(f"Error returning to object mode:", exception=e)
if translate_bone_fails > 0:
logger.info(f"Conversion completed with {translate_bone_fails} untranslated bones")
+1 -1
View File
@@ -306,6 +306,6 @@ class AvatarToolKit_OT_AtlasMaterials(Operator):
return {"FINISHED"}
except Exception as e:
logger.error(f"Error creating material atlas: {str(e)}", exc_info=True)
logger.error(f"Error creating material atlas:", exception=e)
self.report({'ERROR'}, t("TextureAtlas.atlas_error"))
raise e
+3 -2
View File
@@ -1,3 +1,4 @@
import traceback
import bpy
import numpy as np
from typing import List, Optional, Dict, Set, Tuple, Any
@@ -72,8 +73,8 @@ class AvatarToolkit_OT_MergeArmature(bpy.types.Operator):
return {'FINISHED'}
except Exception as e:
logger.error(f"Error merging armatures: {str(e)}")
self.report({'ERROR'}, str(e))
logger.error(f"Error merging armatures:", exception=e)
self.report({'ERROR'}, traceback.format_exc())
return {'CANCELLED'}
def delete_rigidbodies_and_joints(armature: Object) -> None:
+3 -2
View File
@@ -1,3 +1,4 @@
import traceback
import bpy
from bpy.types import Operator, Context, Object, ArmatureModifier, VertexGroup
from mathutils import Vector
@@ -115,8 +116,8 @@ class AvatarToolkit_OT_AttachMesh(Operator):
return {'FINISHED'}
except Exception as e:
logger.error(f"Failed to attach mesh: {str(e)}")
self.report({'ERROR'}, str(e))
logger.error(f"Failed to attach mesh:", exception=e)
self.report({'ERROR'}, traceback.format_exc())
return {'CANCELLED'}
def validate_mesh_transforms(mesh: Optional[Object]) -> tuple[bool, str]:
+4 -4
View File
@@ -105,7 +105,7 @@ class CreateEyesAV3Button(bpy.types.Operator):
return {'FINISHED'}
except Exception as e:
logger.error(f"Eye tracking setup failed: {str(e)}")
logger.error(f"Eye tracking setup failed:", exception=e)
return {'CANCELLED'}
class CreateEyesSDK2Button(bpy.types.Operator):
@@ -197,7 +197,7 @@ class CreateEyesSDK2Button(bpy.types.Operator):
return {'FINISHED'}
except Exception as e:
logger.error(f"Eye tracking setup failed: {str(e)}")
logger.error(f"Eye tracking setup failed:", exception=e)
return {'CANCELLED'}
class EyeTrackingBackup:
@@ -223,7 +223,7 @@ class EyeTrackingBackup:
json.dump(self.bone_positions, f)
return True
except Exception as e:
logger.error(f"Backup failed: {str(e)}")
logger.error(f"Backup failed:", exception=e)
return False
def restore_bone_positions(self, armature) -> bool:
@@ -244,7 +244,7 @@ class EyeTrackingBackup:
return True
except Exception as e:
logger.error(f"Restore failed: {str(e)}")
logger.error(f"Restore failed:", exception=e)
return False
class EyeTrackingValidator:
+6 -5
View File
@@ -1,3 +1,4 @@
import traceback
import bpy
import re
from typing import Set, Dict, List, Optional, Tuple
@@ -113,7 +114,7 @@ class AvatarToolkit_OT_CombineMaterials(Operator):
try:
num_combined = self.consolidate_materials(meshes)
except Exception as e:
logger.error(f"Material consolidation failed: {str(e)}")
logger.error(f"Material consolidation failed:", exception=e)
self.report({'ERROR'}, t("Optimization.error.consolidation"))
return {'CANCELLED'}
progress.step("Consolidated materials")
@@ -121,7 +122,7 @@ class AvatarToolkit_OT_CombineMaterials(Operator):
try:
num_cleaned = self.clean_material_slots(meshes)
except Exception as e:
logger.error(f"Material slot cleanup failed: {str(e)}")
logger.error(f"Material slot cleanup failed:", exception=e)
self.report({'ERROR'}, t("Optimization.error.slot_cleanup"))
return {'CANCELLED'}
progress.step("Cleaned material slots")
@@ -129,7 +130,7 @@ class AvatarToolkit_OT_CombineMaterials(Operator):
try:
num_removed = clear_unused_data_blocks()
except Exception as e:
logger.error(f"Data block cleanup failed: {str(e)}")
logger.error(f"Data block cleanup failed:", exception=e)
self.report({'ERROR'}, t("Optimization.error.data_cleanup"))
return {'CANCELLED'}
progress.step("Removed unused data blocks")
@@ -142,8 +143,8 @@ class AvatarToolkit_OT_CombineMaterials(Operator):
return {'FINISHED'}
except Exception as e:
logger.error(f"Failed to combine materials: {str(e)}")
self.report({'ERROR'}, t("Optimization.error.combine_materials", error=str(e)))
logger.error(f"Failed to combine materials:", exception=e)
self.report({'ERROR'}, t("Optimization.error.combine_materials", error=traceback.format_exc()))
return {'CANCELLED'}
def consolidate_materials(self, meshes: List[Object]) -> int:
+5 -4
View File
@@ -1,3 +1,4 @@
import traceback
import bpy
from typing import Set, List, Tuple, ClassVar
from bpy.types import Operator, Context, Object
@@ -52,8 +53,8 @@ class AvatarToolkit_OT_JoinAllMeshes(Operator):
return {'CANCELLED'}
except Exception as e:
logger.error(f"Failed to join meshes: {str(e)}")
self.report({'ERROR'}, t("Optimization.error.join_meshes", error=str(e)))
logger.error(f"Failed to join meshes:", exception=e)
self.report({'ERROR'}, t("Optimization.error.join_meshes", error=traceback.format_exc()))
return {'CANCELLED'}
class AvatarToolkit_OT_JoinSelectedMeshes(Operator):
@@ -96,6 +97,6 @@ class AvatarToolkit_OT_JoinSelectedMeshes(Operator):
return {'CANCELLED'}
except Exception as e:
logger.error(f"Failed to join selected meshes: {str(e)}")
self.report({'ERROR'}, t("Optimization.error.join_selected", error=str(e)))
logger.error(f"Failed to join selected meshes:", exception=e)
self.report({'ERROR'}, t("Optimization.error.join_selected", error=traceback.format_exc()))
return {'CANCELLED'}
+4 -4
View File
@@ -164,7 +164,7 @@ class AvatarToolkit_OT_RemoveDoubles(Operator):
return {'RUNNING_MODAL'}
except Exception as e:
logger.error(f"Error in execute: {str(e)}")
logger.error(f"Error in execute:", exception=e)
return {'CANCELLED'}
def modify_mesh(self, context: Context, mesh: MeshEntry) -> None:
@@ -188,7 +188,7 @@ class AvatarToolkit_OT_RemoveDoubles(Operator):
mesh["mesh"].select_set(False)
except Exception as e:
logger.error(f"Error in modify_mesh: {str(e)}")
logger.error(f"Error in modify_mesh:", exception=e)
def modify_mesh_advanced(self, context: Context, mesh_entry: MeshEntry) -> int:
"""Advanced mesh modification with shape key handling"""
@@ -221,7 +221,7 @@ class AvatarToolkit_OT_RemoveDoubles(Operator):
return len(final_merged_vertex_group)
except Exception as e:
logger.error(f"Error in modify_mesh_advanced: {str(e)}")
logger.error(f"Error in modify_mesh_advanced:", exception=e)
return 1
def apply_final_merging(self, context: Context, mesh_entry: MeshEntry, vertex_group: list[int], merge_distance: float) -> None:
@@ -310,5 +310,5 @@ class AvatarToolkit_OT_RemoveDoubles(Operator):
return {'RUNNING_MODAL'}
except Exception as e:
logger.error(f"Error in modal: {str(e)}")
logger.error(f"Error in modal:", exception=e)
return {'CANCELLED'}
+9 -8
View File
@@ -1,3 +1,4 @@
import traceback
import bpy
from typing import Set, Dict, List, Tuple, Optional, Any
from bpy.props import StringProperty
@@ -63,8 +64,8 @@ class AvatarToolkit_OT_StartPoseMode(Operator):
return {'FINISHED'}
except Exception as e:
logger.error(f"Failed to start pose mode: {str(e)}")
self.report({'ERROR'}, t("PoseMode.error.start", error=str(e)))
logger.error(f"Failed to start pose mode:", exception=e)
self.report({'ERROR'}, t("PoseMode.error.start", error=traceback.format_exc()))
return {'CANCELLED'}
class AvatarToolkit_OT_StopPoseMode(Operator):
@@ -86,8 +87,8 @@ class AvatarToolkit_OT_StopPoseMode(Operator):
bpy.ops.object.mode_set(mode='OBJECT')
return {'FINISHED'}
except Exception as e:
logger.error(f"Failed to stop pose mode: {str(e)}")
self.report({'ERROR'}, t("PoseMode.error.stop", error=str(e)))
logger.error(f"Failed to stop pose mode:", exception=e)
self.report({'ERROR'}, t("PoseMode.error.stop", error=traceback.format_exc()))
return {'CANCELLED'}
class AvatarToolkit_OT_ApplyPoseAsRest(Operator, BatchPoseOperationMixin):
@@ -130,8 +131,8 @@ class AvatarToolkit_OT_ApplyPoseAsRest(Operator, BatchPoseOperationMixin):
return {'FINISHED'}
except Exception as e:
logger.error(f"Failed to apply pose as shape key: {str(e)}")
self.report({'ERROR'}, t("PoseMode.error.shapekey", error=str(e)))
logger.error(f"Failed to apply pose as shape key:", exception=e)
self.report({'ERROR'}, t("PoseMode.error.shapekey", error=traceback.format_exc()))
return {'CANCELLED'}
class AvatarToolkit_OT_ApplyPoseAsShapekey(Operator, BatchPoseOperationMixin):
@@ -161,6 +162,6 @@ class AvatarToolkit_OT_ApplyPoseAsShapekey(Operator, BatchPoseOperationMixin):
logger.info("Successfully applied pose as rest")
return {'FINISHED'}
except Exception as e:
logger.error(f"Failed to apply pose as rest: {str(e)}")
self.report({'ERROR'}, t("PoseMode.error.rest_pose", error=str(e)))
logger.error(f"Failed to apply pose as rest:", exception=e)
self.report({'ERROR'}, t("PoseMode.error.rest_pose", error=traceback.format_exc()))
return {'CANCELLED'}
+5 -4
View File
@@ -1,3 +1,4 @@
import traceback
import bpy
import numpy as np
from bpy.types import Operator, Context
@@ -43,8 +44,8 @@ class AvatarToolkit_OT_ApplyTransforms(Operator):
return {'FINISHED'}
except Exception as e:
logger.error(f"Failed to apply transforms: {str(e)}")
self.report({'ERROR'}, str(e))
logger.error(f"Failed to apply transforms:", exception=e)
self.report({'ERROR'}, traceback.format_exc())
return {'CANCELLED'}
class AvatarToolkit_OT_CleanShapekeys(Operator):
@@ -87,6 +88,6 @@ class AvatarToolkit_OT_CleanShapekeys(Operator):
return {'FINISHED'}
except Exception as e:
logger.error(f"Failed to clean shape keys: {str(e)}")
self.report({'ERROR'}, str(e))
logger.error(f"Failed to clean shape keys:", exception=e)
self.report({'ERROR'}, traceback.format_exc())
return {'CANCELLED'}
+2 -1
View File
@@ -1,3 +1,4 @@
import traceback
import bpy
import re
from bpy.types import Operator, Context, EditBone, Object, Armature, Mesh
@@ -99,7 +100,7 @@ class AvatarToolKit_OT_CreateDigitigradeLegs(Operator):
return True
except Exception as e:
self.report({'ERROR'}, t("Tools.digitigrade_error", error=str(e)))
self.report({'ERROR'}, t("Tools.digitigrade_error", error=traceback.format_exc()))
return False
def execute(self, context: Context) -> set[str]:
+7 -6
View File
@@ -1,3 +1,4 @@
import traceback
import bpy
import math
from typing import Set, List
@@ -51,8 +52,8 @@ class AvatarToolkit_OT_ConnectBones(Operator):
return {'FINISHED'}
except Exception as e:
logger.error(f"Failed to connect bones: {str(e)}")
self.report({'ERROR'}, str(e))
logger.error(f"Failed to connect bones:", exception=e)
self.report({'ERROR'}, traceback.format_exc())
return {'CANCELLED'}
class AvatarToolkit_OT_MergeToActive(Operator):
@@ -105,8 +106,8 @@ class AvatarToolkit_OT_MergeToActive(Operator):
return {'FINISHED'}
except Exception as e:
logger.error(f"Failed to merge bones: {str(e)}")
self.report({'ERROR'}, str(e))
logger.error(f"Failed to merge bones:", exception=e)
self.report({'ERROR'}, traceback.format_exc())
return {'CANCELLED'}
class AvatarToolkit_OT_MergeToParent(Operator):
@@ -157,6 +158,6 @@ class AvatarToolkit_OT_MergeToParent(Operator):
return {'FINISHED'}
except Exception as e:
logger.error(f"Failed to merge bones: {str(e)}")
self.report({'ERROR'}, str(e))
logger.error(f"Failed to merge bones:", exception=e)
self.report({'ERROR'}, traceback.format_exc())
return {'CANCELLED'}
+3 -2
View File
@@ -1,3 +1,4 @@
import traceback
import bpy
from bpy.types import Operator, Context
from ...core.translations import t
@@ -33,7 +34,7 @@ class AvatarToolKit_OT_SeparateByMaterials(Operator):
self.report({'INFO'}, t("Tools.separate_materials_success"))
return {'FINISHED'}
except Exception as e:
self.report({'ERROR'}, str(e))
self.report({'ERROR'}, traceback.format_exc())
return {'CANCELLED'}
class AvatarToolKit_OT_SeparateByLooseParts(Operator):
@@ -65,5 +66,5 @@ class AvatarToolKit_OT_SeparateByLooseParts(Operator):
self.report({'INFO'}, t("Tools.separate_loose_success"))
return {'FINISHED'}
except Exception as e:
self.report({'ERROR'}, str(e))
self.report({'ERROR'}, traceback.format_exc())
return {'CANCELLED'}
+3 -2
View File
@@ -1,3 +1,4 @@
import traceback
import bpy
from typing import Dict, List, Set, Optional, Tuple, Any
from bpy.types import Operator, Context, Object, PoseBone, EditBone, Bone, Constraint
@@ -57,8 +58,8 @@ class AvatarToolkit_OT_ConvertRigifyToUnity(Operator):
return {'FINISHED'}
except Exception as e:
logger.error(f"Failed to convert Rigify: {str(e)}", exc_info=True)
self.report({'ERROR'}, str(e))
logger.error(f"Failed to convert Rigify:", exception=e)
self.report({'ERROR'}, traceback.format_exc())
return {'CANCELLED'}
def cleanup_extra_bones(self, armature: Object) -> None:
+3 -2
View File
@@ -1,3 +1,4 @@
import traceback
import bpy
import math
from typing import Dict, List, Set, Tuple, Optional, Any, Union
@@ -103,8 +104,8 @@ class AvatarToolkit_OT_StandardizeArmature(Operator):
return {'FINISHED'}
except Exception as e:
logger.error(f"Failed to standardize armature: {str(e)}")
self.report({'ERROR'}, str(e))
logger.error(f"Failed to standardize armature:", exception=e)
self.report({'ERROR'}, traceback.format_exc())
try:
if original_mode == 'EDIT_ARMATURE':
+1 -1
View File
@@ -246,7 +246,7 @@ class AvatarToolkit_OT_AlignUVEdgesToTarget(Operator):
logger.info(f"Finished mesh {source} for UV's")
except Exception as e:
logger.error(f"Error processing source {source}: {str(e)}")
logger.error(f"Error processing source {source}:", exception=e)
return {'CANCELLED'}
bpy.ops.object.mode_set(mode=prev_mode)
+3 -2
View File
@@ -1,6 +1,7 @@
# This code was taken from Cats Blender Plugin Unoffical, some of this code is by the original developers, however was improved by myself.
# Didn't think it was necessary to re-make something that works well.
import traceback
import bpy
from typing import Dict, List, Optional, Tuple, Any, Set, Union
from bpy.types import Operator, Context, Object, ShapeKey
@@ -222,8 +223,8 @@ class ATOOLKIT_OT_create_visemes(Operator):
self.report({'INFO'}, t("Visemes.success"))
return {'FINISHED'}
except Exception as e:
logger.error(f"Error creating visemes: {str(e)}")
self.report({'ERROR'}, str(e))
logger.error(f"Error creating visemes:", exception=e)
self.report({'ERROR'}, traceback.format_exc())
return {'CANCELLED'}
def create_visemes(self, context: Context, mesh: Object) -> None:
+1 -1
View File
@@ -81,7 +81,7 @@ class AvatarToolKit_OT_ExpandSectionMaterials(Operator):
return {'FINISHED'}
except Exception as e:
logger.error(f"Error loading materials: {str(e)}", exc_info=True)
logger.error(f"Error loading materials:", exception=e)
self.report({'ERROR'}, t("TextureAtlas.load_error"))
return {'CANCELLED'}