1
0
forked from Rowland/EG
EG/core/tool_manager.py
2025-09-16 16:09:54 +08:00

154 lines
6.0 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.

class ToolManager:
"""工具管理器 - 管理编辑器工具状态"""
def __init__(self, world):
"""初始化工具管理器"""
self.world = world
self.currentTool = "选择" # 默认工具为选择工具
print(f"当前工具: {self.currentTool}")
def setCurrentTool(self, tool):
"""设置当前工具"""
self.currentTool = tool
print(f"\n=== 工具切换 ===")
print(f"当前工具: {tool}")
print(f"选中节点: {self.world.selection.selectedNode.getName() if self.world.selection.selectedNode else ''}")
# 根据工具类型启用对应的方法
if tool == "选择":
print(f"当前工具为:{tool}")
#self._enableSelectionTool()
elif tool == "移动":
print(f"当前工具为:{tool}")
#self._enableMoveTool()
elif tool == "旋转":
print(f"当前工具为:{tool}")
#self._enableRotateTool()
elif tool == "缩放":
print(f"当前工具为:{tool}")
#self._enableScaleTool()
elif tool == "光照编辑":
print(f"当前工具为:{tool}")
self.launch_day_time_editor()
elif tool == "图形编辑":
print(f"当前工具为:{tool}")
self.launch_plugin_configurator()
# 坐标轴现在始终跟随选中状态,不再依赖工具类型
def getCurrentTool(self):
"""获取当前工具"""
return self.currentTool
def isSelectionTool(self):
"""检查当前是否是选择工具"""
return self.currentTool == "选择"
def isMoveTool(self):
"""检查当前是否是移动工具"""
return self.currentTool == "移动"
def isRotateTool(self):
"""检查当前是否是旋转工具"""
return self.currentTool == "旋转"
def isScaleTool(self):
"""检查当前是否是缩放工具"""
return self.currentTool == "缩放"
def isDayTimeEditorTool(self):
"""光照"""
return self.currentTool=="光照编辑"
def isPlugincongiguratorTool(self):
"""检查当前是否是图形编辑工具"""
return self.currentTool == "图形编辑"
def launch_day_time_editor(self):
# 检查是否已经启动
if hasattr(self, '_day_time_editor_process') and self._day_time_editor_process:
if self._day_time_editor_process.poll() is None: # 进程仍在运行
print("Day Time Editor 已经在运行")
return True
import subprocess
import os
import sys
try:
if not hasattr(self.world,'render_pipeline') or not self.world.render_pipeline:
print("错误renderpipeline未初始化")
return False
base_path = self.world.render_pipeline.mount_mgr.base_path
editor_path = os.path.join(base_path,"toolkit/day_time_editor/main.py")
if not os.path.exists(editor_path):
print("错误文件不存在")
return False
self._day_time_editor_process = subprocess.Popen([sys.executable, editor_path])
print("Day Time Editor 已启动")
return True
except Exception as e:
print(f"启动 time editor失败")
def openSunLightingTool(self):
"""打开太阳光照系统工具的便捷方法"""
return self.launch_day_time_editor()
def launch_plugin_configurator(self):
"""启动插件配置器"""
import subprocess
import os
import sys
try:
# 检查是否已经有进程在运行
if hasattr(self, '_plugin_configurator_process') and self._plugin_configurator_process:
# 检查进程是否仍在运行
if self._plugin_configurator_process.poll() is None:
print("⚠️ 插件配置器已经在运行中,无需重复启动")
# 尝试将窗口置于前台(在某些系统上可能有效)
try:
# 在Windows上可以尝试激活窗口
if os.name == 'nt':
import win32gui
import win32con
def enum_windows_callback(hwnd, pid):
if win32gui.GetWindowThreadProcessId(hwnd)[1] == pid:
win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)
win32gui.SetForegroundWindow(hwnd)
return False
return True
win32gui.EnumWindows(enum_windows_callback, self._plugin_configurator_process.pid)
except ImportError:
pass # win32gui不可用跳过窗口激活
except Exception as e:
print(f"尝试激活窗口失败: {e}")
return True
else:
# 进程已结束,清理引用
print("🔄 检测到之前的插件配置器进程已结束,准备启动新进程")
self._plugin_configurator_process = None
if not self.world.render_pipeline:
print("❌ 错误RenderPipeline未初始化")
return False
base_path = self.world.render_pipeline.mount_mgr.base_path
editor_path = os.path.join(base_path, "toolkit/plugin_configurator/main.py")
if not os.path.exists(editor_path):
print(f"❌ 错误:插件配置器文件不存在: {editor_path}")
return False
print("🚀 启动插件配置器...")
self._plugin_configurator_process = subprocess.Popen([sys.executable, editor_path])
print("✅ 插件配置器已启动")
return True
except Exception as e:
print(f"❌ 启动插件配置器失败: {e}")
return False