refactor: 拆分main初始化并更新优化分析

This commit is contained in:
ayuan9957 2026-02-28 17:48:42 +08:00
parent ffdad6f099
commit d140552779
2 changed files with 94 additions and 83 deletions

View File

@ -37,6 +37,19 @@
- `_parse_color_string`
- `loadScene` 行数:`556 -> 74`
- 已清理重复异常分支:`_rebuildParentChildRelationships` 内重复 `except` 已移除
- `main.py::__init__` 第一轮拆分已落地(非 VR
- `__init__` 行数:`375 -> 27`
- 已抽出初始化阶段方法:
- `_configure_main_window`
- `_init_legacy_compat_fields`
- `_init_core_services_non_vr`
- `_init_runtime_features_non_vr`
- `_init_imgui_runtime`
- `_init_panel_modules`
- `_init_startup_fonts`
- `_init_ui_runtime_state`
- `_bind_runtime_events`
- `_finalize_startup`
## 1. 总体画像
@ -73,12 +86,12 @@
1. `ui/LUI/lui_function_properties.py::_draw_component_properties` (`1441` 行)
2. `ui/panels/animation_tools.py::_getActor` (`510` 行)
3. `main.py::__init__` (`375` 行)
4. `ui/LUI/lui_manager_interaction.py::_update_drag` (`348` 行)
5. `ui/panels/editor_panels_left.py::_draw_resource_manager` (`310` 行)
6. `core/selection.py::updateGizmoDrag` (`278` 行)
7. `ui/LUI/lui_manager_interaction.py::_handle_resize_drag` (`257` 行)
8. `scene/scene_manager_io_mixin.py::saveScene` (`222` 行)
3. `ui/LUI/lui_manager_interaction.py::_update_drag` (`348` 行)
4. `ui/panels/editor_panels_left.py::_draw_resource_manager` (`310` 行)
5. `core/selection.py::updateGizmoDrag` (`278` 行)
6. `ui/LUI/lui_manager_interaction.py::_handle_resize_drag` (`257` 行)
7. `scene/scene_manager_io_mixin.py::saveScene` (`222` 行)
8. `TransformGizmo/move_gizmo.py::_on_mouse_down` (`222` 行)
### 2.3 异常处理密度高(可观测性风险)
@ -221,22 +234,13 @@
- 第二轮已完成(`loadScene` 已达验收目标:`74` 行)。
- 下一步应转向 `main.py::__init__``ui/panels/animation_tools.py::_getActor`
### B) `main.py::__init__`(第二优先)
### B) `main.py::__init__`(第二优先,已完成第一轮
- 函数规模: `375`
- 近似圈复杂度: `15`
- 问题性质:
- 复杂度不高,但“启动装配职责”过于集中,初始化顺序风险高。
- 建议拆分:
- `_init_legacy_compat_fields()`
- `_init_core_services_non_vr()`(不含 VR
- `_init_imgui_runtime()`
- `_init_panel_modules()`
- `_init_runtime_state_flags()`
- `_bind_input_shortcuts()`
- `_init_drag_drop_and_messages()`
- 函数规模: `27` 行(重构前 `375` 行)
- 状态:
- 初始化编排已拆分为阶段方法VR 初始化逻辑保持原样。
- 约束:
- VR 初始化保持原样,不纳入本轮改造范围
- 后续仅建议做微调,不再进行结构性拆分。
### C) `ui/panels/animation_tools.py::_getActor`(第三优先)
@ -259,8 +263,8 @@
## 4.2 Task B 执行顺序建议(非 VR
1. `loadScene` 已完成两轮拆分(当前建议冻结并转入回归观察)。
2. 下一步整理 `main.__init__`(降低后续模块接入冲突)。
3. 最后处理 `_getActor`(风险最高,建议独立提交并做手工回归)。
2. `main.__init__` 已完成第一轮拆分(建议转入回归观察)。
3. 下一步处理 `_getActor`(风险最高,建议独立提交并做手工回归)。
## 5. 与现有文档关系

129
main.py
View File

@ -63,20 +63,47 @@ warnings.filterwarnings("ignore", category=DeprecationWarning)
class MyWorld(PanelDelegates, CoreWorld):
def __init__(self):
super().__init__()
self._configure_main_window()
self._init_legacy_compat_fields()
self._init_core_services_non_vr()
# 初始化VR管理器
try:
from core.vr import VRManager
self.vr_manager = VRManager(self)
print("✓ VR管理器初始化完成")
except Exception as e:
print(f"⚠ VR管理器初始化失败: {e}")
self.vr_manager = None
# 设置窗口为最大化模式
# VR调试相关变量
self.vr_debug_enabled = False
self.vr_detailed_mode = True
self.vr_performance_monitor = False
self._init_runtime_features_non_vr()
self._init_imgui_runtime()
self._init_panel_modules()
self._init_startup_fonts()
self._init_ui_runtime_state()
self._bind_runtime_events()
self._finalize_startup()
def _configure_main_window(self):
props = WindowProperties()
#props.set_maximized(True)
self.win.request_properties(props)
print("✓ 窗口已设置为最大化模式")
def _init_legacy_compat_fields(self):
# Legacy compatibility fields used by scene/project modules.
self.gui_elements = []
self.gui_manager = None
self.interface_manager = None
self.guiEditMode = False
self.currentGUITool = None
def _init_core_services_non_vr(self):
# 初始化选择和变换系统
self.selection = SelectionSystem(self)
@ -94,10 +121,10 @@ class MyWorld(PanelDelegates, CoreWorld):
# 初始化事件处理系统
self.event_handler = EventHandler(self)
# 初始化工具管理系统
self.tool_manager = ToolManager(self)
# 初始化脚本管理系统
self.script_manager = ScriptManager(self)
@ -114,24 +141,11 @@ class MyWorld(PanelDelegates, CoreWorld):
else:
self.video_manager = None
# 初始化场景管理系统
# print(f"[DEBUG] 初始化场景管理系统...")
self.scene_manager = SceneManager(self)
# print(f"[DEBUG] 场景管理系统初始化完成")
# 初始化项目管理系统
# print(f"[DEBUG] 初始化项目管理系统...")
self.project_manager = ProjectManager(self)
# print(f"[DEBUG] 项目管理系统初始化完成")
self.info_panel_manager = InfoPanelManager(self)
self.command_manager = CommandManager()
# 初始化碰撞管理器
self.collision_manager = CollisionManager(self)
# 初始化资源管理器
self.resource_manager = ResourceManager(self)
# 初始化Actor缓存系统用于动画控制
@ -143,20 +157,7 @@ class MyWorld(PanelDelegates, CoreWorld):
self.mouse_controller.setUp(mouse_speed=25, move_speed=20)
print("✓ 自定义鼠标控制器初始化完成")
# 初始化VR管理器
try:
from core.vr import VRManager
self.vr_manager = VRManager(self)
print("✓ VR管理器初始化完成")
except Exception as e:
print(f"⚠ VR管理器初始化失败: {e}")
self.vr_manager = None
# VR调试相关变量
self.vr_debug_enabled = False
self.vr_detailed_mode = True
self.vr_performance_monitor = False
def _init_runtime_features_non_vr(self):
# 调试选项
self.debug_collision = True # 是否显示碰撞体
@ -165,7 +166,7 @@ class MyWorld(PanelDelegates, CoreWorld):
self.enableModelCollisionDetection(enable=False, frequency=0.1, threshold=0.5)
else:
self.enableModelCollisionDetection(enable=True, frequency=0.1, threshold=0.5)
# 碰撞检测UI相关变量
self._selected_collision_shape = "球形 (Sphere)" # 默认选择的碰撞形状
@ -173,11 +174,11 @@ class MyWorld(PanelDelegates, CoreWorld):
self.script_manager.start_system()
self.terrain_manager = TerrainManager(self)
self.terrain_edit_radius = 3.0
self.terrain_edit_strength=0.3
self.terrain_edit_strength = 0.3
self.terrain_edit_operation = "add"
def _init_imgui_runtime(self):
# Install Dear ImGui
p3dimgui.init(
wantPlaceManager=False,
@ -202,8 +203,10 @@ class MyWorld(PanelDelegates, CoreWorld):
imgui.get_io().config_flags |= imgui.ConfigFlags_.docking_enable
print("✓ ImGui Docking功能已启用")
def _init_panel_modules(self):
# 初始化样式管理器
from core.imgui_style_manager import ImGuiStyleManager
self.style_manager = ImGuiStyleManager(self.imgui, self)
self.editor_panels = EditorPanels(self)
self.script_panels = ScriptPanels(self)
@ -215,12 +218,13 @@ class MyWorld(PanelDelegates, CoreWorld):
self.animation_tools = AnimationTools(self)
self.property_helpers = PropertyHelpers(self)
self.app_actions = AppActions(self)
def _init_startup_fonts(self):
# 简化的初始化字体设置(只使用中文字体)
try:
# 先清除默认字体
self.imgui.io.fonts.clear()
# 尝试加载中文字体
import platform
system = platform.system().lower()
@ -232,7 +236,7 @@ class MyWorld(PanelDelegates, CoreWorld):
font_path = "/System/Library/Fonts/PingFang.ttc"
else:
font_path = None
if font_path and Path(font_path).exists():
self.imgui.io.fonts.add_font_from_file_ttf(font_path, 14.0)
print(f"✓ 初始化中文字体成功: {font_path}")
@ -245,7 +249,7 @@ class MyWorld(PanelDelegates, CoreWorld):
else:
self.imgui.io.fonts.add_font_default()
print("✓ 初始化使用默认字体")
except Exception as e:
print(f"⚠ 初始化字体系统失败: {e}")
# 备用方案:使用默认字体
@ -258,6 +262,7 @@ class MyWorld(PanelDelegates, CoreWorld):
# Disable the camera trackball controls.
self.disableMouse()
def _init_ui_runtime_state(self):
self.showDemoWindow = False
# UI状态管理
@ -269,13 +274,13 @@ class MyWorld(PanelDelegates, CoreWorld):
self.showResourceManager = True
self.showWebPanel = False
self.webPanelUrl = "https://www.baidu.com"
# 脚本系统状态变量
self.hotReloadEnabled = True
self._new_script_name = "new_script"
self._selected_template = 0
self._mount_script_index = 0
# 变换监控相关
self._transform_monitoring = False
self._monitored_node = None
@ -283,13 +288,13 @@ class MyWorld(PanelDelegates, CoreWorld):
self._transform_update_timer = 0
self._transform_update_interval = 0.05 # 50ms检查一次
self._clipboard_pos = None # 位置剪贴板
# 颜色选择器相关
self._color_picker_active = False
self._color_picker_target = None # (target_object, property_name)
self._color_picker_current_color = (1.0, 1.0, 1.0, 1.0)
self._color_picker_callback = None
# 字体选择器相关
self._font_selector_active = False
self._font_selector_target = None # (target_object, property_name)
@ -302,14 +307,14 @@ class MyWorld(PanelDelegates, CoreWorld):
self.show_new_project_dialog = False
self.show_open_project_dialog = False
self.show_save_as_dialog = False
# 路径选择对话框状态
self.show_path_browser = False
self.path_browser_mode = "" # "new_project" 或 "open_project"
self.path_browser_current_path = os.getcwd()
self.path_browser_selected_path = ""
self.path_browser_items = []
# 快捷键映射
self.shortcut_keys = {
'Ctrl+N': self._on_new_project,
@ -317,23 +322,23 @@ class MyWorld(PanelDelegates, CoreWorld):
'Ctrl+S': self._on_save_project,
'Alt+F4': self._on_exit
}
# 键盘状态跟踪
self.ctrl_pressed = False
self.alt_pressed = False
# 消息系统
self.messages = []
self.max_messages = 5 # 最多显示5条消息
# 剪切板系统
self.clipboard = []
self.clipboard_mode = "" # "copy" 或 "cut"
# 视角控制状态
self.camera_control_enabled = True
self.show_camera_info = False
# 拖拽导入状态
self.dragged_files = []
self.is_dragging = False
@ -349,12 +354,12 @@ class MyWorld(PanelDelegates, CoreWorld):
self._drag_scene_tree_hover_node = None
self.model_drag_drop = ModelDragDropService(self)
self.showLUIEditor = not self.use_ssbo_mouse_picking
# 导入功能状态
self.show_import_dialog = False
self.import_file_path = ""
self.supported_formats = [".gltf", ".glb", ".fbx", ".bam", ".egg", ".obj"]
# 创建功能状态
self.show_3d_text_dialog = False
self.show_3d_image_dialog = False
@ -372,34 +377,35 @@ class MyWorld(PanelDelegates, CoreWorld):
self.show_heightmap_browser = False
self.show_script_dialog = False
self.show_script_browser = False
# 高度图浏览器状态
self.heightmap_browser_current_path = os.getcwd()
self.heightmap_browser_selected_path = ""
self.heightmap_browser_items = []
self.heightmap_file_path = ""
self.supported_heightmap_formats = [".png", ".jpg", ".jpeg", ".bmp", ".tiff", ".tif"]
# 脚本浏览器状态
self.script_browser_current_path = os.getcwd()
self.script_browser_selected_path = ""
self.script_browser_items = []
# 对话框参数存储
self.dialog_params = {} # 存储各种对话框的参数
# 脚本系统状态
self.hotReloadEnabled = False
# 初始化高度图浏览器
self._refresh_heightmap_browser()
# 初始化脚本浏览器
self._refresh_script_browser()
def _bind_runtime_events(self):
self.accept('imgui-new-frame', self.__newFrame)
self.accept('`', self.__toggleImgui)
# 添加键盘事件监听用于快捷键
self.accept('control', self._on_ctrl_pressed)
self.accept('control-up', self._on_ctrl_released)
@ -409,7 +415,7 @@ class MyWorld(PanelDelegates, CoreWorld):
self.accept('o', self._on_o_pressed)
self.accept('control-s', self._on_save_project)
self.accept('f4', self._on_f4_pressed)
# 编辑功能快捷键
self.accept('control-z', self._on_undo)
self.accept('control-y', self._on_redo)
@ -418,11 +424,12 @@ class MyWorld(PanelDelegates, CoreWorld):
self.accept('control-v', self._on_paste)
self.accept('delete', self._on_delete_pressed)
self.accept('escape', self._on_escape_pressed)
# 滚轮事件
self.accept('wheel_up', self._on_wheel_up)
self.accept('wheel_down', self._on_wheel_down)
def _finalize_startup(self):
self.testTexture = None
self.icons = {} # 初始化图标字典
@ -430,7 +437,7 @@ class MyWorld(PanelDelegates, CoreWorld):
self.add_success_message("MyWorld 初始化完成")
self.add_info_message("ImGui菜单系统已就绪")
self.add_info_message("快捷键已启用 (Ctrl+N, Ctrl+O, Ctrl+S, Alt+F4)")
# 启用拖拽导入功能
self.setup_drag_drop_support()
self.add_info_message("拖拽导入功能已启用 - 可将3D文件拖拽到窗口中导入")