From d1405527791b3b4afbb17f278f3bb76904fd16ac Mon Sep 17 00:00:00 2001 From: ayuan9957 <107920784+ayuan9957@users.noreply.github.com> Date: Sat, 28 Feb 2026 17:48:42 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=8B=86=E5=88=86main=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E5=B9=B6=E6=9B=B4=E6=96=B0=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROJECT_OPTIMIZATION_ANALYSIS.md | 48 ++++++------ main.py | 129 ++++++++++++++++--------------- 2 files changed, 94 insertions(+), 83 deletions(-) diff --git a/PROJECT_OPTIMIZATION_ANALYSIS.md b/PROJECT_OPTIMIZATION_ANALYSIS.md index c1b86954..d0bd3f17 100644 --- a/PROJECT_OPTIMIZATION_ANALYSIS.md +++ b/PROJECT_OPTIMIZATION_ANALYSIS.md @@ -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. 与现有文档关系 diff --git a/main.py b/main.py index 8a7503b8..6e868aee 100644 --- a/main.py +++ b/main.py @@ -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文件拖拽到窗口中导入")