#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 完整修复所有管理器的初始化问题 位置: blenderpython/suw_core/test/fix_all_managers.py 作者: SUWood Team 版本: 1.0.0 """ 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 diagnose_manager_issues(): """诊断管理器问题""" print("🔍 诊断管理器初始化问题...") try: # 逐个测试管理器导入 manager_modules = [ 'memory_manager', 'material_manager', 'part_creator', 'machining_manager', 'selection_manager', 'deletion_manager', 'hardware_manager', 'door_drawer_manager', 'dimension_manager', 'command_dispatcher' ] for module_name in manager_modules: try: module = __import__( f'suw_core.{module_name}', fromlist=[module_name]) print(f"✅ {module_name} 模块导入成功") # 检查是否有对应的管理器类 class_names = [attr for attr in dir(module) if attr.endswith( 'Manager') or attr.endswith('Creator') or attr.endswith('Dispatcher')] print(f" 发现类: {class_names}") # 检查是否有初始化函数 init_funcs = [attr for attr in dir( module) if attr.startswith('init_')] print(f" 初始化函数: {init_funcs}") # 检查全局实例 global_instances = [attr for attr in dir(module) if not attr.startswith( '_') and not callable(getattr(module, attr, None)) and not attr[0].isupper()] print(f" 全局实例: {global_instances}") except Exception as e: print(f"❌ {module_name} 导入失败: {e}") print("\n" + "="*50) # 测试 init_all_managers 函数 print("🧪 测试 init_all_managers 函数...") from suw_core import init_all_managers managers = init_all_managers(None) print(f"📊 init_all_managers 返回: {len(managers)} 个管理器") for name, manager in managers.items(): if manager is not None: manager_type = getattr(manager, 'manager_type', 'Unknown') if hasattr(manager, 'get_stats') or hasattr(manager, f'get_{name}_stats'): print(f"✅ {name}: 正常 ({type(manager).__name__})") else: print(f"⚠️ {name}: 创建但缺少统计方法 ({type(manager).__name__})") else: print(f"❌ {name}: 未创建") return managers except Exception as e: print(f"❌ 诊断失败: {e}") import traceback traceback.print_exc() return {} def fix_manager_stats_methods(): """修复管理器统计方法""" print("\n🔧 修复管理器统计方法...") # 为每个管理器添加缺失的统计方法 missing_stats_fixes = { 'memory_manager': ''' def get_memory_stats(self) -> Dict[str, Any]: """获取内存管理器统计信息""" try: stats = { "manager_type": "BlenderMemoryManager", "tracked_objects": len(self.tracked_objects), "tracked_meshes": len(self.tracked_meshes), "tracked_images": len(self.tracked_images), "creation_stats": self.creation_stats.copy(), "blender_available": BLENDER_AVAILABLE } return stats except Exception as e: return {"error": str(e)} ''', 'material_manager': ''' def get_material_stats(self) -> Dict[str, Any]: """获取材质管理器统计信息""" try: stats = { "manager_type": "MaterialManager", "textures_count": len(self.textures), "material_stats": self.material_stats.copy(), "blender_available": BLENDER_AVAILABLE } return stats except Exception as e: return {"error": str(e)} ''', 'machining_manager': ''' def get_machining_stats(self) -> Dict[str, Any]: """获取加工管理器统计信息""" try: stats = { "manager_type": "MachiningManager", "machinings_count": len(getattr(self, 'machinings', {})), "creation_stats": getattr(self, 'creation_stats', {}), "blender_available": BLENDER_AVAILABLE } return stats except Exception as e: return {"error": str(e)} ''', 'selection_manager': ''' def get_selection_stats(self) -> Dict[str, Any]: """获取选择管理器统计信息""" try: stats = { "manager_type": "SelectionManager", "selected_objects": len(getattr(self, 'selected_objects', [])), "blender_available": BLENDER_AVAILABLE } return stats except Exception as e: return {"error": str(e)} ''', 'deletion_manager': ''' def get_deletion_stats(self) -> Dict[str, Any]: """获取删除管理器统计信息""" try: stats = { "manager_type": "DeletionManager", "deletion_stats": getattr(self, 'deletion_stats', {}), "blender_available": BLENDER_AVAILABLE } return stats except Exception as e: return {"error": str(e)} ''', 'hardware_manager': ''' def get_hardware_stats(self) -> Dict[str, Any]: """获取五金管理器统计信息""" try: stats = { "manager_type": "HardwareManager", "hardware_count": len(getattr(self, 'hardwares', {})), "blender_available": BLENDER_AVAILABLE } return stats except Exception as e: return {"error": str(e)} ''', 'door_drawer_manager': ''' def get_door_drawer_stats(self) -> Dict[str, Any]: """获取门抽屉管理器统计信息""" try: stats = { "manager_type": "DoorDrawerManager", "doors_count": len(getattr(self, 'doors', {})), "drawers_count": len(getattr(self, 'drawers', {})), "blender_available": BLENDER_AVAILABLE } return stats except Exception as e: return {"error": str(e)} ''', 'dimension_manager': ''' def get_dimension_stats(self) -> Dict[str, Any]: """获取尺寸标注管理器统计信息""" try: stats = { "manager_type": "DimensionManager", "dimensions_count": len(getattr(self, 'dimensions', {})), "blender_available": BLENDER_AVAILABLE } return stats except Exception as e: return {"error": str(e)} ''' } print("📝 需要添加的统计方法:") for manager, code in missing_stats_fixes.items(): print(f" {manager}: get_{manager.replace('_manager', '')}_stats") print("\n💡 请手动将这些方法添加到对应的管理器类中") return missing_stats_fixes def create_patched_init_function(): """创建修补的初始化函数""" print("\n🔧 创建修补的初始化函数...") patched_init_code = ''' def patched_init_all_managers(suw_impl): """修补版本的管理器初始化函数""" managers = {} try: # 尝试初始化每个管理器,失败时使用默认值 # 材质管理器 try: from suw_core.material_manager import MaterialManager managers['material_manager'] = MaterialManager(suw_impl) print("✅ MaterialManager 初始化成功") except Exception as e: print(f"❌ MaterialManager 初始化失败: {e}") managers['material_manager'] = None # 部件创建器 try: from suw_core.part_creator import PartCreator managers['part_creator'] = PartCreator(suw_impl) print("✅ PartCreator 初始化成功") except Exception as e: print(f"❌ PartCreator 初始化失败: {e}") managers['part_creator'] = None # 加工管理器 try: from suw_core.machining_manager import MachiningManager managers['machining_manager'] = MachiningManager(suw_impl) print("✅ MachiningManager 初始化成功") except Exception as e: print(f"❌ MachiningManager 初始化失败: {e}") managers['machining_manager'] = None # 选择管理器 try: from suw_core.selection_manager import SelectionManager managers['selection_manager'] = SelectionManager(suw_impl) print("✅ SelectionManager 初始化成功") except Exception as e: print(f"❌ SelectionManager 初始化失败: {e}") managers['selection_manager'] = None # 删除管理器 try: from suw_core.deletion_manager import DeletionManager managers['deletion_manager'] = DeletionManager(suw_impl) print("✅ DeletionManager 初始化成功") except Exception as e: print(f"❌ DeletionManager 初始化失败: {e}") managers['deletion_manager'] = None # 五金管理器 try: from suw_core.hardware_manager import HardwareManager managers['hardware_manager'] = HardwareManager(suw_impl) print("✅ HardwareManager 初始化成功") except Exception as e: print(f"❌ HardwareManager 初始化失败: {e}") managers['hardware_manager'] = None # 门抽屉管理器 try: from suw_core.door_drawer_manager import DoorDrawerManager managers['door_drawer_manager'] = DoorDrawerManager(suw_impl) print("✅ DoorDrawerManager 初始化成功") except Exception as e: print(f"❌ DoorDrawerManager 初始化失败: {e}") managers['door_drawer_manager'] = None # 尺寸标注管理器 try: from suw_core.dimension_manager import DimensionManager managers['dimension_manager'] = DimensionManager(suw_impl) print("✅ DimensionManager 初始化成功") except Exception as e: print(f"❌ DimensionManager 初始化失败: {e}") managers['dimension_manager'] = None # 命令分发器 try: from suw_core.command_dispatcher import CommandDispatcher managers['command_dispatcher'] = CommandDispatcher(suw_impl) print("✅ CommandDispatcher 初始化成功") except Exception as e: print(f"❌ CommandDispatcher 初始化失败: {e}") managers['command_dispatcher'] = None success_count = len([m for m in managers.values() if m is not None]) print(f"📊 管理器初始化完成: {success_count}/{len(managers)} 成功") return managers except Exception as e: print(f"❌ 管理器初始化总体失败: {e}") return managers # 替换全局初始化函数 import suw_core suw_core.init_all_managers = patched_init_all_managers ''' return patched_init_code def apply_emergency_patch(): """应用紧急修补""" print("\n🚑 应用紧急修补...") try: # 执行修补代码 patched_code = create_patched_init_function() exec(patched_code) print("✅ 紧急修补已应用") # 重新测试 print("\n🧪 重新测试管理器初始化...") import suw_core managers = suw_core.init_all_managers(None) print( f"📊 修补后结果: {len([m for m in managers.values() if m is not None])}/{len(managers)} 成功") return True except Exception as e: print(f"❌ 紧急修补失败: {e}") import traceback traceback.print_exc() return False def main(): """主函数""" print("🔧 开始完整修复所有管理器...") print("="*60) # 1. 诊断问题 managers = diagnose_manager_issues() # 2. 修复统计方法 fix_manager_stats_methods() # 3. 应用紧急修补 apply_emergency_patch() print("\n" + "="*60) print("🎯 修复总结:") print("1. 请手动修改各个管理器文件的构造函数") print("2. 请添加缺失的统计方法") print("3. 紧急修补已临时应用") print("4. 重新运行客户端测试效果") if __name__ == "__main__": main()