384 lines
13 KiB
Python
384 lines
13 KiB
Python
|
#!/usr/bin/env python3
|
|||
|
# -*- coding: utf-8 -*-
|
|||
|
"""
|
|||
|
SUW Core Module - 核心模块集合
|
|||
|
拆分自: suw_impl.py
|
|||
|
用途: 将大文件拆分为可维护的模块
|
|||
|
版本: 1.0.0 (阶段6完成 - 最终版本)
|
|||
|
作者: SUWood Team
|
|||
|
"""
|
|||
|
|
|||
|
# 阶段1: 导入内存管理模块
|
|||
|
import suw_core.command_dispatcher as cd_module
|
|||
|
import suw_core.dimension_manager as dim_module
|
|||
|
import suw_core.door_drawer_manager as ddm_module
|
|||
|
import suw_core.hardware_manager as hw_module
|
|||
|
import suw_core.machining_manager as mach_module
|
|||
|
import suw_core.selection_manager as sm_module
|
|||
|
import suw_core.deletion_manager as dm_module
|
|||
|
import suw_core.part_creator as pc_module
|
|||
|
import suw_core.material_manager as mm_module
|
|||
|
import suw_core.data_manager as data_module
|
|||
|
import logging
|
|||
|
from .memory_manager import (
|
|||
|
BlenderMemoryManager,
|
|||
|
DependencyGraphManager,
|
|||
|
memory_manager,
|
|||
|
dependency_manager,
|
|||
|
init_main_thread,
|
|||
|
execute_in_main_thread_async,
|
|||
|
execute_in_main_thread,
|
|||
|
process_main_thread_tasks,
|
|||
|
safe_blender_operation
|
|||
|
)
|
|||
|
|
|||
|
# 阶段1: 导入几何工具模块
|
|||
|
from .geometry_utils import (
|
|||
|
Point3d,
|
|||
|
Vector3d,
|
|||
|
Transformation,
|
|||
|
MAT_TYPE_NORMAL,
|
|||
|
MAT_TYPE_OBVERSE,
|
|||
|
MAT_TYPE_REVERSE,
|
|||
|
MAT_TYPE_THIN,
|
|||
|
MAT_TYPE_NATURE
|
|||
|
)
|
|||
|
|
|||
|
# 阶段0: 导入数据管理模块 (基础数据层)
|
|||
|
from .data_manager import (
|
|||
|
DataManager,
|
|||
|
data_manager,
|
|||
|
init_data_manager,
|
|||
|
get_data_manager,
|
|||
|
get_zones,
|
|||
|
get_parts,
|
|||
|
get_hardwares,
|
|||
|
get_texture,
|
|||
|
sel_clear
|
|||
|
)
|
|||
|
|
|||
|
# 阶段2: 导入材质管理模块
|
|||
|
from .material_manager import (
|
|||
|
MaterialManager,
|
|||
|
material_manager,
|
|||
|
init_material_manager
|
|||
|
)
|
|||
|
|
|||
|
# 阶段2: 导入部件创建模块
|
|||
|
from .part_creator import (
|
|||
|
PartCreator,
|
|||
|
part_creator,
|
|||
|
init_part_creator
|
|||
|
)
|
|||
|
|
|||
|
# 阶段3: 导入加工管理模块
|
|||
|
from .machining_manager import (
|
|||
|
MachiningManager,
|
|||
|
machining_manager,
|
|||
|
init_machining_manager,
|
|||
|
get_machining_manager
|
|||
|
)
|
|||
|
|
|||
|
# 阶段3: 导入选择管理模块
|
|||
|
from .selection_manager import (
|
|||
|
SelectionManager,
|
|||
|
selection_manager,
|
|||
|
init_selection_manager,
|
|||
|
get_selection_manager
|
|||
|
)
|
|||
|
|
|||
|
# 阶段4: 导入删除管理模块
|
|||
|
from .deletion_manager import (
|
|||
|
DeletionManager,
|
|||
|
deletion_manager,
|
|||
|
init_deletion_manager,
|
|||
|
get_deletion_manager
|
|||
|
)
|
|||
|
|
|||
|
# 阶段4: 导入五金管理模块
|
|||
|
from .hardware_manager import (
|
|||
|
HardwareManager,
|
|||
|
hardware_manager,
|
|||
|
init_hardware_manager,
|
|||
|
get_hardware_manager
|
|||
|
)
|
|||
|
|
|||
|
# 阶段5: 导出门抽屉管理模块
|
|||
|
from .door_drawer_manager import (
|
|||
|
DoorDrawerManager,
|
|||
|
door_drawer_manager,
|
|||
|
init_door_drawer_manager
|
|||
|
)
|
|||
|
|
|||
|
# 阶段5: 导入尺寸标注管理模块
|
|||
|
from .dimension_manager import (
|
|||
|
DimensionManager,
|
|||
|
dimension_manager,
|
|||
|
init_dimension_manager
|
|||
|
)
|
|||
|
|
|||
|
# 阶段6: 导入命令分发器模块
|
|||
|
from .command_dispatcher import (
|
|||
|
CommandDispatcher,
|
|||
|
command_dispatcher,
|
|||
|
init_command_dispatcher,
|
|||
|
get_dispatcher_stats
|
|||
|
)
|
|||
|
|
|||
|
# ==================== 版本信息 ====================
|
|||
|
|
|||
|
__version__ = "1.0.0"
|
|||
|
__author__ = "SUWood Team"
|
|||
|
__description__ = "SUW Core - 模块化SUWImpl核心功能"
|
|||
|
|
|||
|
# ==================== 拆分进度 ====================
|
|||
|
|
|||
|
REFACTOR_STATUS = {
|
|||
|
"阶段1": "✅ 完成 - 内存管理器 + 几何工具",
|
|||
|
"阶段2": "✅ 完成 - 材质管理器 + 部件创建器",
|
|||
|
"阶段3": "✅ 完成 - 加工管理器 + 选择管理器",
|
|||
|
"阶段4": "✅ 完成 - 删除管理器 + 五金管理器",
|
|||
|
"阶段5": "✅ 完成 - 门抽屉管理器 + 尺寸标注管理器",
|
|||
|
"阶段6": "✅ 完成 - 命令分发器 + 最终整合",
|
|||
|
}
|
|||
|
|
|||
|
# ==================== 模块初始化函数 ====================
|
|||
|
|
|||
|
|
|||
|
def init_all_managers():
|
|||
|
"""
|
|||
|
初始化所有管理器 - 完全独立,不再需要suw_impl
|
|||
|
|
|||
|
Returns:
|
|||
|
dict: 包含所有管理器实例的字典
|
|||
|
"""
|
|||
|
try:
|
|||
|
logger.info("🚀 开始初始化所有独立管理器...")
|
|||
|
|
|||
|
managers = {}
|
|||
|
|
|||
|
# 1. 先初始化数据管理器(最基础)
|
|||
|
from .data_manager import init_data_manager
|
|||
|
managers['data_manager'] = init_data_manager()
|
|||
|
logger.info("✅ DataManager 初始化完成")
|
|||
|
|
|||
|
# 2. 初始化材质管理器
|
|||
|
from .material_manager import init_material_manager
|
|||
|
managers['material_manager'] = init_material_manager()
|
|||
|
logger.info("✅ MaterialManager 初始化完成")
|
|||
|
|
|||
|
# 3. 初始化部件创建器
|
|||
|
from .part_creator import init_part_creator
|
|||
|
managers['part_creator'] = init_part_creator()
|
|||
|
logger.info("✅ PartCreator 初始化完成")
|
|||
|
|
|||
|
# 4. 初始化加工管理器
|
|||
|
from .machining_manager import init_machining_manager
|
|||
|
managers['machining_manager'] = init_machining_manager()
|
|||
|
logger.info("✅ MachiningManager 初始化完成")
|
|||
|
|
|||
|
# 5. 初始化选择管理器
|
|||
|
from .selection_manager import init_selection_manager
|
|||
|
managers['selection_manager'] = init_selection_manager()
|
|||
|
logger.info("✅ SelectionManager 初始化完成")
|
|||
|
|
|||
|
# 6. 初始化删除管理器
|
|||
|
from .deletion_manager import init_deletion_manager
|
|||
|
managers['deletion_manager'] = init_deletion_manager()
|
|||
|
logger.info("✅ DeletionManager 初始化完成")
|
|||
|
|
|||
|
# 7. 初始化硬件管理器
|
|||
|
from .hardware_manager import init_hardware_manager
|
|||
|
managers['hardware_manager'] = init_hardware_manager()
|
|||
|
logger.info("✅ HardwareManager 初始化完成")
|
|||
|
|
|||
|
# 8. 初始化门抽屉管理器
|
|||
|
from .door_drawer_manager import init_door_drawer_manager
|
|||
|
managers['door_drawer_manager'] = init_door_drawer_manager()
|
|||
|
logger.info("✅ DoorDrawerManager 初始化完成")
|
|||
|
|
|||
|
# 9. 初始化尺寸管理器
|
|||
|
from .dimension_manager import init_dimension_manager
|
|||
|
managers['dimension_manager'] = init_dimension_manager()
|
|||
|
logger.info("✅ DimensionManager 初始化完成")
|
|||
|
|
|||
|
# 10. 最后初始化命令分发器(依赖其他所有管理器)
|
|||
|
from .command_dispatcher import init_command_dispatcher
|
|||
|
managers['command_dispatcher'] = init_command_dispatcher()
|
|||
|
logger.info("✅ CommandDispatcher 初始化完成")
|
|||
|
|
|||
|
logger.info(f"🎉 所有管理器初始化完成!共 {len(managers)} 个管理器")
|
|||
|
return managers
|
|||
|
|
|||
|
except Exception as e:
|
|||
|
logger.error(f"❌ 管理器初始化失败: {e}")
|
|||
|
import traceback
|
|||
|
logger.error(traceback.format_exc())
|
|||
|
return {}
|
|||
|
|
|||
|
|
|||
|
def get_all_stats():
|
|||
|
"""获取所有管理器的统计信息"""
|
|||
|
try:
|
|||
|
all_stats = {
|
|||
|
"module_version": __version__,
|
|||
|
"memory_manager": memory_manager.get_memory_stats() if memory_manager else None,
|
|||
|
"material_manager": material_manager.get_material_stats() if material_manager else None,
|
|||
|
"part_creator": part_creator.get_part_creator_stats() if part_creator else None,
|
|||
|
"machining_manager": machining_manager.get_machining_stats() if machining_manager else None,
|
|||
|
"selection_manager": selection_manager.get_selection_stats() if selection_manager else None,
|
|||
|
"deletion_manager": deletion_manager.get_deletion_stats() if deletion_manager else None,
|
|||
|
"hardware_manager": hardware_manager.get_hardware_stats() if hardware_manager else None,
|
|||
|
"door_drawer_manager": door_drawer_manager.get_door_drawer_stats() if door_drawer_manager else None,
|
|||
|
"dimension_manager": dimension_manager.get_dimension_stats() if dimension_manager else None,
|
|||
|
"command_dispatcher": get_dispatcher_stats(),
|
|||
|
}
|
|||
|
return all_stats
|
|||
|
except Exception as e:
|
|||
|
print(f"获取统计信息失败: {e}")
|
|||
|
return {"error": str(e)}
|
|||
|
|
|||
|
|
|||
|
# 为向后兼容添加别名
|
|||
|
get_all_manager_stats = get_all_stats
|
|||
|
|
|||
|
# ==================== 模块导出 ====================
|
|||
|
|
|||
|
|
|||
|
__all__ = [
|
|||
|
# 阶段0: 数据管理层 (基础数据层)
|
|||
|
"DataManager", "data_manager", "init_data_manager", "get_data_manager",
|
|||
|
"get_zones", "get_parts", "get_hardwares", "get_texture", "sel_clear",
|
|||
|
|
|||
|
# 阶段1: 内存管理和几何工具
|
|||
|
"BlenderMemoryManager", "DependencyGraphManager",
|
|||
|
"memory_manager", "dependency_manager",
|
|||
|
"init_main_thread", "execute_in_main_thread_async",
|
|||
|
"execute_in_main_thread", "process_main_thread_tasks",
|
|||
|
"safe_blender_operation",
|
|||
|
"Point3d", "Vector3d", "Transformation",
|
|||
|
"MAT_TYPE_NORMAL", "MAT_TYPE_OBVERSE", "MAT_TYPE_REVERSE",
|
|||
|
"MAT_TYPE_THIN", "MAT_TYPE_NATURE",
|
|||
|
|
|||
|
# 阶段2: 材质管理和部件创建
|
|||
|
"MaterialManager", "material_manager", "init_material_manager",
|
|||
|
"PartCreator", "part_creator", "init_part_creator",
|
|||
|
|
|||
|
# 阶段3: 加工管理和选择管理
|
|||
|
"MachiningManager", "machining_manager", "init_machining_manager", "get_machining_manager",
|
|||
|
"SelectionManager", "selection_manager", "init_selection_manager", "get_selection_manager",
|
|||
|
|
|||
|
# 阶段4: 删除管理和五金管理
|
|||
|
"DeletionManager", "deletion_manager", "init_deletion_manager", "get_deletion_manager",
|
|||
|
"HardwareManager", "hardware_manager", "init_hardware_manager", "get_hardware_manager",
|
|||
|
|
|||
|
# 阶段5: 门抽屉管理和尺寸标注管理
|
|||
|
"DoorDrawerManager", "door_drawer_manager", "init_door_drawer_manager",
|
|||
|
"DimensionManager", "dimension_manager", "init_dimension_manager",
|
|||
|
|
|||
|
# 阶段6: 命令分发
|
|||
|
"CommandDispatcher", "command_dispatcher", "init_command_dispatcher",
|
|||
|
"get_dispatcher_stats",
|
|||
|
|
|||
|
# 工具函数
|
|||
|
"init_all_managers", "get_all_stats", "get_all_manager_stats",
|
|||
|
|
|||
|
# 元信息
|
|||
|
"__version__", "__author__", "__description__", "REFACTOR_STATUS"
|
|||
|
]
|
|||
|
|
|||
|
# 初始化日志
|
|||
|
logger = logging.getLogger(__name__)
|
|||
|
logger.info(f"SUW Core 模块加载完成 - {__version__} ({__author__})")
|
|||
|
|
|||
|
# 导出版本和阶段信息
|
|||
|
__phase__ = "Phase 2"
|
|||
|
|
|||
|
# ==================== 【修复】强制初始化所有全局变量 ====================
|
|||
|
|
|||
|
# 确保所有管理器全局实例正确初始化
|
|||
|
if mm_module.material_manager is None:
|
|||
|
print("🔧 强制初始化MaterialManager全局实例...")
|
|||
|
mm_module.material_manager = mm_module.MaterialManager() # 【修复】移除None参数
|
|||
|
|
|||
|
if pc_module.part_creator is None:
|
|||
|
print("🔧 强制初始化PartCreator全局实例...")
|
|||
|
pc_module.part_creator = pc_module.PartCreator() # 【修复】移除None参数
|
|||
|
|
|||
|
# 导入其他管理器模块
|
|||
|
|
|||
|
# 初始化其他管理器
|
|||
|
if dm_module.deletion_manager is None:
|
|||
|
print("🔧 强制初始化DeletionManager全局实例...")
|
|||
|
dm_module.deletion_manager = dm_module.DeletionManager()
|
|||
|
|
|||
|
if sm_module.selection_manager is None:
|
|||
|
print("🔧 强制初始化SelectionManager全局实例...")
|
|||
|
sm_module.selection_manager = sm_module.SelectionManager()
|
|||
|
|
|||
|
if mach_module.machining_manager is None:
|
|||
|
print("🔧 强制初始化MachiningManager全局实例...")
|
|||
|
mach_module.machining_manager = mach_module.MachiningManager()
|
|||
|
|
|||
|
if hw_module.hardware_manager is None:
|
|||
|
print("🔧 强制初始化HardwareManager全局实例...")
|
|||
|
hw_module.hardware_manager = hw_module.HardwareManager()
|
|||
|
|
|||
|
if ddm_module.door_drawer_manager is None:
|
|||
|
print("🔧 强制初始化DoorDrawerManager全局实例...")
|
|||
|
ddm_module.door_drawer_manager = ddm_module.DoorDrawerManager()
|
|||
|
|
|||
|
if dim_module.dimension_manager is None:
|
|||
|
print("🔧 强制初始化DimensionManager全局实例...")
|
|||
|
dim_module.dimension_manager = dim_module.DimensionManager()
|
|||
|
|
|||
|
if cd_module.command_dispatcher is None:
|
|||
|
print("🔧 强制初始化CommandDispatcher全局实例...")
|
|||
|
cd_module.command_dispatcher = cd_module.CommandDispatcher()
|
|||
|
|
|||
|
# 强制初始化全局实例,确保能够独立运行
|
|||
|
if not globals().get('_managers_initialized', False):
|
|||
|
_managers = init_all_managers()
|
|||
|
globals()['_managers_initialized'] = True
|
|||
|
|
|||
|
# 在文件末尾添加一个非阻塞的启动函数
|
|||
|
|
|||
|
|
|||
|
def start_suwood_non_blocking():
|
|||
|
"""非阻塞启动SUWood客户端(适合在Blender中使用)"""
|
|||
|
print("🚀 非阻塞启动SUWood客户端...")
|
|||
|
client_manager = start_suwood_blender_client()
|
|||
|
|
|||
|
if client_manager:
|
|||
|
print("✅ 客户端已在后台运行")
|
|||
|
print("📝 使用以下命令管理客户端:")
|
|||
|
print(" print_system_status(suwood_client)")
|
|||
|
print(" suwood_client.stop_client()")
|
|||
|
|
|||
|
# 设为全局变量方便访问
|
|||
|
globals()['suwood_client'] = client_manager
|
|||
|
return client_manager
|
|||
|
return None
|
|||
|
|
|||
|
|
|||
|
# 修改主执行逻辑
|
|||
|
if __name__ == "__main__":
|
|||
|
show_usage_guide()
|
|||
|
print("\n🚀 自动启动客户端...")
|
|||
|
|
|||
|
# 检查是否在Blender环境中
|
|||
|
try:
|
|||
|
import bpy
|
|||
|
# 在Blender中,使用非阻塞启动
|
|||
|
start_suwood_non_blocking()
|
|||
|
except ImportError:
|
|||
|
# 在命令行中,使用原来的阻塞启动
|
|||
|
client_manager = start_suwood_blender_client()
|
|||
|
if client_manager:
|
|||
|
try:
|
|||
|
while True:
|
|||
|
time.sleep(30)
|
|||
|
print_system_status(client_manager)
|
|||
|
except KeyboardInterrupt:
|
|||
|
client_manager.stop_client()
|