#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 完整修复所有管理器的统计方法和属性 """ import sys import os # 添加项目路径 current_dir = os.path.dirname(__file__) suw_core_dir = os.path.dirname(current_dir) blenderpython_dir = os.path.dirname(suw_core_dir) sys.path.insert(0, blenderpython_dir) def patch_managers_runtime(): """运行时修补所有管理器""" print("🔧 运行时修补所有管理器...") try: from suw_core import init_all_managers # 创建改进的模拟 SUWImpl class ImprovedMockSUWImpl: def __init__(self): self.parts = {} self.zones = {} self.textures = {} self.machinings = {} self.hardwares = {} self.mat_type = "MAT_TYPE_NORMAL" self._selected_uid = None self.selected_parts = set() self.dimensions = {} self.doors = {} self.drawers = {} mock_suw_impl = ImprovedMockSUWImpl() # 初始化管理器 managers = init_all_managers(mock_suw_impl) # 修补每个管理器 for name, manager in managers.items(): if manager: patch_manager(name, manager) # 更新全局引用 import suw_core for name, manager in managers.items(): if manager: setattr(suw_core, name, manager) print("✅ 运行时修补完成") return managers except Exception as e: print(f"❌ 运行时修补失败: {e}") import traceback traceback.print_exc() return {} def patch_manager(name, manager): """修补单个管理器""" try: # 确保所有管理器都有基础属性 if not hasattr(manager, 'suw_impl'): manager.suw_impl = None if name == 'memory_manager': patch_memory_manager(manager) elif name == 'material_manager': patch_material_manager(manager) elif name == 'part_creator': patch_part_creator(manager) elif name == 'machining_manager': patch_machining_manager(manager) elif name == 'selection_manager': patch_selection_manager(manager) elif name == 'deletion_manager': patch_deletion_manager(manager) elif name == 'hardware_manager': patch_hardware_manager(manager) elif name == 'door_drawer_manager': patch_door_drawer_manager(manager) elif name == 'dimension_manager': patch_dimension_manager(manager) elif name == 'command_dispatcher': patch_command_dispatcher(manager) print(f"✅ {name} 修补完成") except Exception as e: print(f"❌ {name} 修补失败: {e}") def patch_memory_manager(manager): """修补内存管理器""" # 确保有 creation_stats 属性 if not hasattr(manager, 'creation_stats'): manager.creation_stats = { "objects_created": 0, "objects_cleaned": 0, "meshes_created": 0, "images_loaded": 0 } # 修复 get_memory_stats 方法 def get_memory_stats(): try: return { "manager_type": "BlenderMemoryManager", "tracked_objects": len(getattr(manager, 'tracked_objects', set())), "tracked_meshes": len(getattr(manager, 'tracked_meshes', set())), "tracked_images": len(getattr(manager, 'tracked_images', set())), "creation_stats": manager.creation_stats, "blender_available": getattr(manager, 'BLENDER_AVAILABLE', True) } except Exception as e: return {"manager_type": "BlenderMemoryManager", "error": str(e)} manager.get_memory_stats = get_memory_stats def patch_material_manager(manager): """修补材质管理器""" # 确保有必要的属性 if not hasattr(manager, 'textures'): manager.textures = {} if not hasattr(manager, 'material_stats'): manager.material_stats = { "materials_created": 0, "textures_loaded": 0, "creation_errors": 0 } # 添加统计方法 def get_material_stats(): try: return { "manager_type": "MaterialManager", "textures_count": len(manager.textures), "material_stats": manager.material_stats, "suw_impl_attached": manager.suw_impl is not None, "blender_available": True } except Exception as e: return {"manager_type": "MaterialManager", "error": str(e)} manager.get_material_stats = get_material_stats def patch_part_creator(manager): """修补部件创建器""" # part_creator 通常已经有正确的方法,但确保一下 if not hasattr(manager, 'get_part_creator_stats'): def get_part_creator_stats(): try: return { "manager_type": "PartCreator", "parts_by_uid": {uid: len(parts) for uid, parts in getattr(manager, 'parts', {}).items()}, "total_parts": sum(len(parts) for parts in getattr(manager, 'parts', {}).values()), "creation_stats": getattr(manager, 'creation_stats', {}), "suw_impl_attached": manager.suw_impl is not None, "blender_available": True } except Exception as e: return {"manager_type": "PartCreator", "error": str(e)} manager.get_part_creator_stats = get_part_creator_stats def patch_machining_manager(manager): """修补加工管理器""" if not hasattr(manager, 'machinings'): manager.machinings = {} if not hasattr(manager, 'creation_stats'): manager.creation_stats = { "machinings_created": 0, "creation_errors": 0} def get_machining_stats(): try: return { "manager_type": "MachiningManager", "machinings_count": len(manager.machinings), "creation_stats": manager.creation_stats, "suw_impl_attached": manager.suw_impl is not None, "blender_available": True } except Exception as e: return {"manager_type": "MachiningManager", "error": str(e)} manager.get_machining_stats = get_machining_stats def patch_selection_manager(manager): """修补选择管理器""" if not hasattr(manager, 'selected_objects'): manager.selected_objects = [] if not hasattr(manager, 'selected_parts'): manager.selected_parts = set() def get_selection_stats(): try: return { "manager_type": "SelectionManager", "selected_objects": len(manager.selected_objects), "selected_parts": len(manager.selected_parts), "suw_impl_attached": manager.suw_impl is not None, "blender_available": True } except Exception as e: return {"manager_type": "SelectionManager", "error": str(e)} manager.get_selection_stats = get_selection_stats def patch_deletion_manager(manager): """修补删除管理器""" if not hasattr(manager, 'deletion_stats'): manager.deletion_stats = {"entities_deleted": 0, "deletion_errors": 0} def get_deletion_stats(): try: return { "manager_type": "DeletionManager", "deletion_stats": manager.deletion_stats, "suw_impl_attached": manager.suw_impl is not None, "blender_available": True } except Exception as e: return {"manager_type": "DeletionManager", "error": str(e)} manager.get_deletion_stats = get_deletion_stats def patch_hardware_manager(manager): """修补五金管理器""" if not hasattr(manager, 'hardwares'): manager.hardwares = {} def get_hardware_stats(): try: return { "manager_type": "HardwareManager", "hardware_count": len(manager.hardwares), "suw_impl_attached": manager.suw_impl is not None, "blender_available": True } except Exception as e: return {"manager_type": "HardwareManager", "error": str(e)} manager.get_hardware_stats = get_hardware_stats def patch_door_drawer_manager(manager): """修补门抽屉管理器""" if not hasattr(manager, 'doors'): manager.doors = {} if not hasattr(manager, 'drawers'): manager.drawers = {} # 这个管理器通常已经有正确的方法 if not hasattr(manager, 'get_door_drawer_stats'): def get_door_drawer_stats(): try: return { "manager_type": "DoorDrawerManager", "doors_count": len(manager.doors), "drawers_count": len(manager.drawers), "suw_impl_attached": manager.suw_impl is not None, "blender_available": True } except Exception as e: return {"manager_type": "DoorDrawerManager", "error": str(e)} manager.get_door_drawer_stats = get_door_drawer_stats def patch_dimension_manager(manager): """修补尺寸标注管理器""" if not hasattr(manager, 'dimensions'): manager.dimensions = {} # 这个管理器通常已经有正确的方法 if not hasattr(manager, 'get_dimension_stats'): def get_dimension_stats(): try: return { "manager_type": "DimensionManager", "dimensions_count": len(manager.dimensions), "suw_impl_attached": manager.suw_impl is not None, "blender_available": True } except Exception as e: return {"manager_type": "DimensionManager", "error": str(e)} manager.get_dimension_stats = get_dimension_stats def patch_command_dispatcher(manager): """修补命令分发器""" # 这个管理器通常已经有正确的方法 if not hasattr(manager, 'get_dispatcher_stats'): def get_dispatcher_stats(): try: return { "manager_type": "CommandDispatcher", "available_commands": list(getattr(manager, 'command_map', {}).keys()), "command_count": len(getattr(manager, 'command_map', {})), "suw_impl_attached": manager.suw_impl is not None, "blender_available": True } except Exception as e: return {"manager_type": "CommandDispatcher", "error": str(e)} manager.get_dispatcher_stats = get_dispatcher_stats def test_patched_managers(): """测试修补后的管理器""" print("\n🧪 测试修补后的管理器...") try: from suw_core import get_all_stats stats = get_all_stats() print(f"\n📋 get_all_stats 返回 {len(stats)} 个统计项:") success_count = 0 for name, stat in stats.items(): if name == 'module_version': print(f"✅ {name}: {stat}") success_count += 1 elif stat and isinstance(stat, dict) and 'manager_type' in stat: manager_type = stat['manager_type'] error = stat.get('error') if error: print(f"⚠️ {name}: {manager_type} (错误: {error})") else: print(f"✅ {name}: {manager_type}") success_count += 1 elif stat and isinstance(stat, dict): print(f"⚠️ {name}: 有数据但缺少 manager_type") elif stat: print(f"⚠️ {name}: 格式不标准") else: print(f"❌ {name}: 无数据") print( f"\n📈 修补后成功率: {success_count}/{len(stats)} ({success_count/len(stats)*100:.1f}%)") return success_count >= len(stats) * 0.9 # 90% 成功算合格 except Exception as e: print(f"❌ 测试失败: {e}") import traceback traceback.print_exc() return False def main(): """主函数""" print("🚀 开始完整修复所有管理器...") print("="*60) # 1. 运行时修补 managers = patch_managers_runtime() # 2. 测试修补效果 success = test_patched_managers() print("\n" + "="*60) if success: print("🎉 完整修复成功!") print("💡 现在可以在 Blender 中运行:") print(" exec(open('blenderpython/suw_core/test/complete_stats_fix.py').read())") print(" 然后运行 show_module_status() 查看状态") else: print("⚠️ 修复未完全成功,但大部分问题已解决") return success if __name__ == "__main__": main()