suwoodblender/blenderpython/suw_core/__init__.py

384 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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