379 lines
13 KiB
Python
379 lines
13 KiB
Python
|
#!/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()
|