refactor: 拆分main初始化并更新优化分析
This commit is contained in:
parent
ffdad6f099
commit
d140552779
@ -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
129
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文件拖拽到窗口中导入")
|
||||
|
||||
Loading…
Reference in New Issue
Block a user