diff --git a/ui/interface_manager.py b/ui/interface_manager.py index d786dcb9..d45c3458 100644 --- a/ui/interface_manager.py +++ b/ui/interface_manager.py @@ -142,121 +142,21 @@ class InterfaceManager: lightItem = QTreeWidgetItem(sceneRoot,['灯光']) - # 用于跟踪已添加的节点,避免重复 - added_nodes = set() - - # 检查是否有图标配置 - if not hasattr(self, 'item_icons'): - self.item_icons = { - 'model': None, - 'geometry': None, - 'empty': None, - 'default': None - } - - def _add_children_recursive(parent_item, node_path): - """递归添加子节点到树项 - 使用用户提供的有效方法""" - # 防止重复添加 - node_id = id(node_path) - if node_id in added_nodes: - print(f"⚠️ 跳过重复节点: {node_path.getName()}") + BLACK_LIST = {'','**','temp','collision'} + + from panda3d.core import CollisionNode + def should_skip(node): + name = node.getName() + return name in BLACK_LIST or name.startswith('__') or isinstance(node.node(),CollisionNode) or isinstance(node.node(),ModelRoot) or name=="" + + def addNodeToTree(node,parentItem,force = False): + if not force and should_skip(node): return - added_nodes.add(node_id) - - # 获取所有子节点 - children = node_path.getChildren() - - for i in range(children.getNumPaths()): - child_node = children.getPath(i) - - # 跳过黑名单节点 - child_name = child_node.getName() - if child_name in {'', '**', 'temp', 'collision'} or child_name.startswith('__'): - continue - - # 创建子项 - child_item = QTreeWidgetItem(parent_item) - display_name = child_name or f"Child_{i}" - child_item.setText(0, display_name) - - # 检查是否是几何节点并设置图标 - if child_node.find("**/+GeomNode").isEmpty(): - # 不是几何节点 - if hasattr(self, 'item_icons') and self.item_icons.get('model'): - child_item.setIcon(0, self.item_icons.get('model', self.item_icons['default'])) - display_name += " 📦" # 模型节点标记 - else: - # 是几何节点 - if hasattr(self, 'item_icons') and self.item_icons.get('empty'): - child_item.setIcon(0, self.item_icons.get('empty', self.item_icons['default'])) - display_name += " 🔷" # 几何节点标记 - - # 更新显示名称 - child_item.setText(0, display_name) - - # 存储NodePath引用 - child_item.setData(0, Qt.UserRole, child_node) - - # 添加节点信息到提示 - node_info = [] - if hasattr(child_node, 'node') and child_node.node(): - node_info.append(f"类型: {type(child_node.node()).__name__}") - if child_node.getNumChildren() > 0: - node_info.append(f"子节点: {child_node.getNumChildren()}") - if hasattr(child_node, 'getTags') and child_node.getTags(): - tags = [f"{k}:{v}" for k, v in child_node.getTags().items()] - node_info.append(f"标签: {', '.join(tags)}") - - if node_info: - child_item.setToolTip(0, "\n".join(node_info)) - - print(f"+ 添加节点: {display_name}") - - # 递归处理子节点的子节点 - if child_node.getNumChildren() > 0: - _add_children_recursive(child_item, child_node) - - def addNodeToTree(node, parentItem, force=True): - """添加单个节点到树 - 包装函数""" - node_id = id(node) - if node_id in added_nodes: - print(f"⚠️ 跳过重复根节点: {node.getName()}") - return - added_nodes.add(node_id) - - # 创建根节点项 - display_name = node.getName() or "" - - # 检查是否为GLB模型 - is_glb_model = False - if hasattr(node, 'getTags'): - tags = node.getTags() if hasattr(node, 'getTags') else {} - is_glb_model = any('glb' in str(v).lower() or 'gltf' in str(v).lower() for v in tags.values()) - if not is_glb_model: - node_name = node.getName().lower() if node.getName() else "" - is_glb_model = '.glb' in node_name or '.gltf' in node_name - - if is_glb_model: - display_name += " 🎯 GLB" - print(f"🎯 GLB模型检测到: {display_name}") - else: - display_name += " 📦" - print(f"📦 常规模型: {display_name}") - - nodeItem = QTreeWidgetItem(parentItem, [display_name]) - nodeItem.setData(0, Qt.UserRole, node) - - # 添加根节点信息 - node_info = [] - if hasattr(node, 'node') and node.node(): - node_info.append(f"类型: {type(node.node()).__name__}") - if node.getNumChildren() > 0: - node_info.append(f"子节点: {node.getNumChildren()}") - if node_info: - nodeItem.setToolTip(0, "\n".join(node_info)) - - # 使用改进的递归方法处理子节点 - _add_children_recursive(nodeItem, node) + nodeItem = QTreeWidgetItem(parentItem,[node.getName()]) + nodeItem.setData(0,Qt.UserRole,node) + + for child in node.getChildren(): + addNodeToTree(child,nodeItem,force = False) # 递归添加节点及其子节点 # def addNodeToTree(node, parentItem): @@ -278,42 +178,23 @@ class InterfaceManager: # else: # print(f"跳过节点: {child.getName()}") - # 清空去重集合 - added_nodes.clear() - - # 添加所有模型及其子节点 - print(f"\n=== 开始处理 {len(self.world.models)} 个模型 ===") - for i, model in enumerate(self.world.models): - model_name = model.getName() or f"Model_{i}" - print(f"\n--- 处理模型 {i+1}: {model_name} ---") - addNodeToTree(model, modelsItem, force=True) - print("=== 模型处理完成 ===") + for model in self.world.models: + addNodeToTree(model, modelsItem,force=True) # 添加所有GUI元素 - for gui_element in self.world.gui_elements: - gui_type = gui_element.getTag("gui_type") if hasattr(gui_element, 'getTag') else "unknown" - gui_text = gui_element.getTag("gui_text") if hasattr(gui_element, 'getTag') else "GUI元素" + for gui in self.world.gui_elements: + gui_type = gui.getTag("gui_type") or "unknown" + gui_text = gui.getTag("gui_text") or "GUI元素" + item = QTreeWidgetItem(guiItem, [f"{gui_type}: {gui_text}"]) + item.setData(0, Qt.UserRole, gui) - display_name = f"{gui_type}: {gui_text}" - guiElementItem = QTreeWidgetItem(guiItem, [display_name]) - guiElementItem.setData(0, Qt.UserRole, gui_element) - print(f"添加GUI元素: {display_name}") - - # 添加聚光灯 - if hasattr(self.world, 'Spotlight'): - for light_element in self.world.Spotlight: - addNodeToTree(light_element, lightItem, force=True) - - # 添加点光源 - if hasattr(self.world, 'Pointlight'): - for light_element in self.world.Pointlight: - addNodeToTree(light_element, lightItem, force=True) + for light in self.world.Spotlight + self.world.Pointlight: + addNodeToTree(light, lightItem, force=True) # 添加地板节点 - if hasattr(self.world, 'ground'): + if hasattr(self.world, 'ground') and self.world.ground: groundItem = QTreeWidgetItem(sceneRoot, ['地板']) groundItem.setData(0, Qt.UserRole, self.world.ground) - print("添加地板节点") # 展开所有节点 #self.treeWidget.expandAll() diff --git a/ui/property_panel.py b/ui/property_panel.py index a12c14ff..591b0810 100644 --- a/ui/property_panel.py +++ b/ui/property_panel.py @@ -3170,8 +3170,6 @@ class PropertyPanelManager: print(f"未知的材质预设: {preset_name}") return - - preset = presets[preset_name] if "shading_model" in preset: @@ -3184,8 +3182,6 @@ class PropertyPanelManager: print(f"材质emission值: {material.emission}") print(f"基础颜色alpha: {preset['base_color'].w}") - - material.set_base_color(preset["base_color"]) material.set_roughness(preset["roughness"]) material.set_metallic(preset["metallic"]) @@ -3201,7 +3197,7 @@ class PropertyPanelManager: if preset["shading_model"]==3: self._apply_transparent_effect() - #material._applied_preset = preset_name + material._applied_preset = preset_name self._refreshMaterialUI() print(f"已应用材质预设: {preset_name}")