suwoodblender/blenderpython/suw_core/__init__.py

384 lines
13 KiB
Python
Raw Normal View History

2025-07-18 17:09:39 +08:00
#!/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()