390 lines
13 KiB
Python
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()
|