blenderpython/suw_core/test/complete_stats_fix.py

390 lines
13 KiB
Python

#!/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()