From 385103e252eaf665c1b625c87b89413f2c0d9a89 Mon Sep 17 00:00:00 2001 From: Rowland <975945824@qq.com> Date: Fri, 23 Jan 2026 17:38:13 +0800 Subject: [PATCH] =?UTF-8?q?ui=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/world.py | 2 +- demo.py | 78 ++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 69 insertions(+), 11 deletions(-) diff --git a/core/world.py b/core/world.py index c9d37090..1132f056 100644 --- a/core/world.py +++ b/core/world.py @@ -630,7 +630,7 @@ class CoreWorld(Meta3DWorld): if hasattr(self, 'win') and self.win: width = self.win.getXSize() height = self.win.getYSize() - print(f"从Panda3D窗口获取尺寸!!!!!!!!!!!!!!!!!!!!!: {width} x {height}") + # print(f"从Panda3D窗口获取尺寸!!!!!!!!!!!!!!!!!!!!!: {width} x {height}") return width, height # 最后的默认值 diff --git a/demo.py b/demo.py index d2fb0dd1..ef858637 100644 --- a/demo.py +++ b/demo.py @@ -830,14 +830,14 @@ class MyWorld(CoreWorld): imgui.menu_item("材质编辑器", "", False, True) imgui.menu_item("脚本编辑器", "", False, True) - # 窗口菜单 - with imgui_ctx.begin_menu("窗口") as window_menu: - if window_menu: - _, self.showDemoWindow = imgui.menu_item("ImGui演示", "", self.showDemoWindow, True) - if self.testTexture: - imgui.menu_item("关闭纹理测试", "", False, True) - else: - imgui.menu_item("显示纹理测试", "", False, True) + # 窗口菜单 - 已隐藏 + # with imgui_ctx.begin_menu("窗口") as window_menu: + # if window_menu: + # _, self.showDemoWindow = imgui.menu_item("ImGui演示", "", self.showDemoWindow, True) + # if self.testTexture: + # imgui.menu_item("关闭纹理测试", "", False, True) + # else: + # imgui.menu_item("显示纹理测试", "", False, True) # 帮助菜单 with imgui_ctx.begin_menu("帮助") as help_menu: @@ -5076,7 +5076,7 @@ class MyWorld(CoreWorld): self.clipboard_mode = "cut" # 删除原节点 - self.scene_manager.deleteNode(selected_node) + self._delete_node(selected_node) self.selection.clearSelection() self.add_success_message(f"已剪切节点: {node_name}") @@ -5145,7 +5145,7 @@ class MyWorld(CoreWorld): # 删除节点 if hasattr(self, 'scene_manager') and self.scene_manager: - self.scene_manager.deleteNode(selected_node) + self._delete_node(selected_node) self.selection.clearSelection() self.add_success_message(f"已删除节点: {node_name}") else: @@ -5153,6 +5153,64 @@ class MyWorld(CoreWorld): except Exception as e: self.add_error_message(f"删除操作失败: {e}") + def _delete_node(self, node): + """删除节点的通用方法""" + try: + if not node or node.isEmpty(): + return False + + node_name = node.getName() or "未命名节点" + + # 从场景管理器的模型列表中移除(如果是模型) + if hasattr(self, 'scene_manager') and self.scene_manager: + if node in self.scene_manager.models: + self.scene_manager.models.remove(node) + print(f"[场景管理器] 从模型列表移除: {node_name}") + + # 停止所有与该节点相关的脚本 + if hasattr(self, 'script_manager') and self.script_manager: + try: + # 移除该节点上的所有脚本 + if node in self.script_manager.object_scripts: + del self.script_manager.object_scripts[node] + print(f"[脚本系统] 移除节点 {node_name} 的所有脚本") + except Exception as e: + print(f"[脚本系统] 移除脚本失败: {e}") + + # 清理碰撞体 + if hasattr(self, 'collision_manager') and self.collision_manager: + try: + self.collision_manager.remove_collision_for_node(node) + print(f"[碰撞系统] 移除节点 {node_name} 的碰撞体") + except Exception as e: + print(f"[碰撞系统] 移除碰撞体失败: {e}") + + # 清理Actor缓存(如果有动画) + if hasattr(self, '_actor_cache') and node in self._actor_cache: + actor = self._actor_cache[node] + try: + # 清理相关任务 + taskMgr.remove(f"maintain_anim_pos_{id(actor)}") + # 清理Actor + if not actor.isEmpty(): + actor.cleanup() + actor.removeNode() + print(f"[动画系统] 清理节点 {node_name} 的Actor缓存") + except Exception as e: + print(f"[动画系统] 清理Actor缓存失败: {e}") + finally: + del self._actor_cache[node] + + # 从父节点中移除 + node.removeNode() + + print(f"[删除] 成功删除节点: {node_name}") + return True + + except Exception as e: + print(f"[删除] 删除节点失败: {e}") + return False + # ==================== 对话框绘制函数 ==================== def _draw_new_project_dialog(self):