blenderpython/suw_core/test/fix_all_managers.py

379 lines
13 KiB
Python
Raw Normal View History

2025-08-01 17:13:30 +08:00
#!/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()