diff --git a/__init__.py b/__init__.py index 4016289..59a9275 100644 --- a/__init__.py +++ b/__init__.py @@ -2,6 +2,20 @@ modules = None ordered_classes = None def register(): + # Add wheel installation check + try: + import lz4 + except ImportError: + import sys + import os + import site + import pip + wheels_dir = os.path.join(os.path.dirname(__file__), "wheels") + for wheel in os.listdir(wheels_dir): + if wheel.endswith(".whl"): + pip.main(['install', os.path.join(wheels_dir, wheel)]) + site.addsitedir(site.getsitepackages()[0]) + from .core import auto_load print("Starting registration") auto_load.init() diff --git a/core/auto_load.py b/core/auto_load.py index ea4f86f..730daf1 100644 --- a/core/auto_load.py +++ b/core/auto_load.py @@ -56,7 +56,10 @@ def register() -> None: def unregister() -> None: """Unregister all classes and modules in reverse order""" for cls in reversed(ordered_classes): - bpy.utils.unregister_class(cls) + try: + bpy.utils.unregister_class(cls) + except RuntimeError: + continue for module in modules: if module.__name__ == __name__: diff --git a/core/properties.py b/core/properties.py index bd12643..2ab83e6 100644 --- a/core/properties.py +++ b/core/properties.py @@ -370,11 +370,24 @@ class AvatarToolkitSceneProperties(PropertyGroup): def register() -> None: """Register the Avatar Toolkit property group""" logger.info("Registering Avatar Toolkit properties") + try: + bpy.utils.register_class(AvatarToolkitSceneProperties) + except ValueError: + # Class already registered, we can continue + pass bpy.types.Scene.avatar_toolkit = PointerProperty(type=AvatarToolkitSceneProperties) logger.debug("Properties registered successfully") def unregister() -> None: """Unregister the Avatar Toolkit property group""" logger.info("Unregistering Avatar Toolkit properties") - del bpy.types.Scene.avatar_toolkit + try: + del bpy.types.Scene.avatar_toolkit + except: + pass + try: + bpy.utils.unregister_class(AvatarToolkitSceneProperties) + except RuntimeError: + pass logger.debug("Properties unregistered successfully") + diff --git a/functions/custom_tools/armature_merging.py b/functions/custom_tools/armature_merging.py index 437119c..4713629 100644 --- a/functions/custom_tools/armature_merging.py +++ b/functions/custom_tools/armature_merging.py @@ -30,8 +30,8 @@ class AvatarToolkit_OT_MergeArmature(bpy.types.Operator): wm.progress_begin(0, 100) # Get both armatures - base_armature_name: str = context.scene.merge_armature_into - merge_armature_name: str = context.scene.merge_armature + base_armature_name: str = context.scene.avatar_toolkit.merge_armature_into + merge_armature_name: str = context.scene.avatar_toolkit.merge_armature base_armature: Optional[Object] = bpy.data.objects.get(base_armature_name) merge_armature: Optional[Object] = bpy.data.objects.get(merge_armature_name) diff --git a/functions/visemes.py b/functions/visemes.py index 301ab4d..5052559 100644 --- a/functions/visemes.py +++ b/functions/visemes.py @@ -126,15 +126,21 @@ class ATOOLKIT_OT_preview_visemes(Operator): @classmethod def poll(cls, context: Context) -> bool: - # Check if we're in object mode first + # Check if we're in object mode if context.mode != 'OBJECT': return False + # Get mesh from UI selection + props = context.scene.avatar_toolkit + mesh_obj = bpy.data.objects.get(props.viseme_mesh) + + # Validate armature and mesh armature = get_active_armature(context) if not armature: return False valid, _ = validate_armature(armature) - return valid and context.active_object and context.active_object.type == 'MESH' + return valid and mesh_obj and mesh_obj.type == 'MESH' + def execute(self, context: Context) -> Set[str]: props = context.scene.avatar_toolkit @@ -179,11 +185,21 @@ class ATOOLKIT_OT_create_visemes(Operator): @classmethod def poll(cls, context: Context) -> bool: + # Check if we're in object mode + if context.mode != 'OBJECT': + return False + + # Get mesh from UI selection + props = context.scene.avatar_toolkit + mesh_obj = bpy.data.objects.get(props.viseme_mesh) + + # Validate armature and mesh armature = get_active_armature(context) if not armature: return False valid, _ = validate_armature(armature) - return valid and context.active_object and context.active_object.type == 'MESH' + return valid and mesh_obj and mesh_obj.type == 'MESH' + def execute(self, context: Context) -> Set[str]: props = context.scene.avatar_toolkit diff --git a/wheels/jsmin-3.0.1-py3-none-any.whl b/wheels/jsmin-3.0.1-py3-none-any.whl deleted file mode 100644 index 0bf48ba..0000000 Binary files a/wheels/jsmin-3.0.1-py3-none-any.whl and /dev/null differ