Files
Text-Texture-Generator-for-…/__init__.py
2025-09-11 12:12:58 +03:00

223 lines
7.5 KiB
Python

import bpy
import bmesh
from bpy.types import Operator, Panel, PropertyGroup, UIList
from bpy.props import StringProperty, IntProperty, FloatVectorProperty, FloatProperty, BoolProperty, EnumProperty, CollectionProperty, PointerProperty
import os
import tempfile
import subprocess
import sys
import json
import platform
import time
# Import bl_info from utils
from .utils import bl_info
# Import utility functions
from .utils import install_pillow, get_system_fonts, get_font_enum_items
# Import preset system functions
from .presets import (
initialize_presets,
refresh_presets,
refresh_presets_sync,
ensure_presets_available,
migrate_presets_if_needed
)
# Import core generation functions
from .core import generate_texture_image, generate_preview
# Import property groups
from .properties import (
TEXT_TEXTURE_ImageOverlay,
TEXT_TEXTURE_Preset,
TEXT_TEXTURE_Properties
)
# Import operators
from .operators import (
TEXT_TEXTURE_OT_generate,
TEXT_TEXTURE_OT_generate_shader,
TEXT_TEXTURE_OT_refresh_preview,
TEXT_TEXTURE_OT_view_preview_zoom,
TEXT_TEXTURE_OT_save_preset,
TEXT_TEXTURE_OT_save_preset_enter,
TEXT_TEXTURE_OT_load_preset,
TEXT_TEXTURE_OT_delete_preset,
TEXT_TEXTURE_OT_refresh_presets,
TEXT_TEXTURE_OT_add_overlay,
TEXT_TEXTURE_OT_remove_overlay,
TEXT_TEXTURE_OT_duplicate_overlay,
TEXT_TEXTURE_OT_delete_overlay,
TEXT_TEXTURE_OT_move_overlay,
TEXT_TEXTURE_OT_open_panel,
TEXT_TEXTURE_OT_refresh_fonts,
TEXT_TEXTURE_OT_set_anchor_point,
TEXT_TEXTURE_OT_sync_margins,
TEXT_TEXTURE_OT_export_presets,
TEXT_TEXTURE_OT_import_presets,
TEXT_TEXTURE_OT_show_migration_report
)
# Import UI panels and functions
from .ui import (
TEXT_TEXTURE_PT_panel,
TEXT_TEXTURE_PT_panel_3d,
TEXT_TEXTURE_PT_panel_properties,
menu_func_node_editor,
menu_func_view3d,
menu_func_image
)
# ============================================================================
# REGISTRATION
# ============================================================================
classes = (
TEXT_TEXTURE_ImageOverlay,
TEXT_TEXTURE_Preset,
TEXT_TEXTURE_Properties,
TEXT_TEXTURE_OT_generate,
TEXT_TEXTURE_OT_generate_shader,
TEXT_TEXTURE_OT_refresh_preview,
TEXT_TEXTURE_OT_view_preview_zoom,
TEXT_TEXTURE_OT_add_overlay,
TEXT_TEXTURE_OT_remove_overlay,
TEXT_TEXTURE_OT_duplicate_overlay,
TEXT_TEXTURE_OT_delete_overlay,
TEXT_TEXTURE_OT_move_overlay,
TEXT_TEXTURE_OT_open_panel,
TEXT_TEXTURE_OT_save_preset,
TEXT_TEXTURE_OT_save_preset_enter,
TEXT_TEXTURE_OT_set_anchor_point,
TEXT_TEXTURE_OT_sync_margins,
TEXT_TEXTURE_OT_load_preset,
TEXT_TEXTURE_OT_delete_preset,
TEXT_TEXTURE_OT_refresh_fonts,
TEXT_TEXTURE_OT_refresh_presets,
TEXT_TEXTURE_OT_export_presets,
TEXT_TEXTURE_OT_import_presets,
TEXT_TEXTURE_OT_show_migration_report,
TEXT_TEXTURE_PT_panel,
TEXT_TEXTURE_PT_panel_3d,
TEXT_TEXTURE_PT_panel_properties,
)
def register():
print("[TTG DEBUG] ========== ADDON REGISTRATION START ==========")
for cls in classes:
print(f"[TTG DEBUG] Registering class: {cls.__name__}")
try:
bpy.utils.register_class(cls)
print(f"[TTG DEBUG] Successfully registered: {cls.__name__}")
except Exception as e:
print(f"[TTG DEBUG] FAILED to register {cls.__name__}: {e}")
print("[TTG DEBUG] Registering scene properties...")
bpy.types.Scene.text_texture_props = PointerProperty(type=TEXT_TEXTURE_Properties)
print("[TTG DEBUG] Scene properties registered successfully")
# CRITICAL FIX: Force UI refresh after registration
print("[TTG DEBUG] Forcing UI refresh...")
try:
# Update all areas to ensure panels are properly displayed
for window in bpy.context.window_manager.windows:
for area in window.screen.areas:
area.tag_redraw()
print("[TTG DEBUG] UI refresh completed successfully")
except Exception as e:
print(f"[TTG DEBUG] UI refresh failed: {e}")
# Add to menus
bpy.types.NODE_MT_add.append(menu_func_node_editor)
bpy.types.VIEW3D_MT_add.append(menu_func_view3d)
bpy.types.VIEW3D_MT_mesh_add.append(menu_func_view3d)
bpy.types.NODE_MT_node.append(menu_func_node_editor)
# Add to Image menu if available
if hasattr(bpy.types, 'IMAGE_MT_image'):
bpy.types.IMAGE_MT_image.append(menu_func_image)
# Initialize presets using reliable synchronization - no timer chains needed
print("[TTG DEBUG] Registration completed - initializing presets with reliable system")
# Use the new reliable initialization system
try:
# Perform migration check first
migration_result = migrate_presets_if_needed()
if migration_result['migrated_count'] > 0:
print(f"[TTG DEBUG] Migrated {migration_result['migrated_count']} presets during registration")
# Initialize presets using the simplified system
initialize_presets()
print("[TTG DEBUG] Preset initialization completed successfully")
except Exception as e:
print(f"[TTG DEBUG] Error during preset initialization: {e}")
# Don't fail registration if preset initialization fails
import traceback
traceback.print_exc()
# Add handler to reload presets when blend file changes
@bpy.app.handlers.persistent
def on_file_load(dummy):
"""Reload presets when a blend file is loaded"""
try:
print("[TTG] Reloading presets after file load...")
# Use reliable synchronous refresh instead of timer
success = refresh_presets_sync()
if success:
print("[TTG] Presets reloaded successfully after file load")
else:
print("[TTG] Warning: Preset reload failed after file load")
except Exception as e:
print(f"[TTG] Error reloading presets: {e}")
import traceback
traceback.print_exc()
# Register the file load handler
if on_file_load not in bpy.app.handlers.load_post:
bpy.app.handlers.load_post.append(on_file_load)
print("[TTG DEBUG] ========== ADDON REGISTRATION END ==========")
def unregister():
# Clean up preview
try:
if bpy.context.scene:
props = bpy.context.scene.text_texture_props
if props and props.preview_image:
bpy.data.images.remove(props.preview_image)
except Exception:
pass
if "TextTexturePreview" in bpy.data.images:
bpy.data.images.remove(bpy.data.images["TextTexturePreview"])
# Remove file load handler
try:
for handler in bpy.app.handlers.load_post[:]:
if handler.__name__ == 'on_file_load' and 'TTG' in str(handler):
bpy.app.handlers.load_post.remove(handler)
except Exception as e:
print(f"Error removing file load handler: {e}")
# Remove from menus
bpy.types.NODE_MT_add.remove(menu_func_node_editor)
bpy.types.VIEW3D_MT_add.remove(menu_func_view3d)
bpy.types.VIEW3D_MT_mesh_add.remove(menu_func_view3d)
bpy.types.NODE_MT_node.remove(menu_func_node_editor)
if hasattr(bpy.types, 'IMAGE_MT_image'):
bpy.types.IMAGE_MT_image.remove(menu_func_image)
for cls in reversed(classes):
bpy.utils.unregister_class(cls)
del bpy.types.Scene.text_texture_props
if __name__ == "__main__":
register()