1.保存场景中的模型显示隐藏状态

2.修复3d_image保存size与重新加载项目后size不一致问题
This commit is contained in:
Hector 2025-11-03 17:18:33 +08:00
parent 0c25623606
commit 8b29bc8fc1
2 changed files with 30 additions and 6 deletions

View File

@ -791,7 +791,7 @@ class GUIManager:
traceback.print_exc()
return None
def createGUI3DImage(self, pos=(0, 0, 0), image_path=None, size=1.0):
def createGUI3DImage(self, pos=(0, 0, 0), image_path=None, size=(1.0,1.0,1.0)):
"""创建3D空间图片"""
try:
@ -823,7 +823,7 @@ class GUIManager:
# 参数类型检查和转换
if isinstance(size, (list, tuple)):
if len(size) >= 2:
x_size, y_size = float(size[0]), float(size[1])
x_size, y_size = float(size[0]), float(size[2])
else:
x_size = y_size = float(size[0]) if size else 1.0
else:
@ -831,7 +831,7 @@ class GUIManager:
# 创建卡片
cm = CardMaker('gui_3d_image')
cm.setFrame(-x_size / 2, x_size / 2, -y_size / 2, y_size / 2)
cm.setFrame(-x_size, x_size, -y_size, y_size)
# 创建3D图像节点
# image_node = self.world.render.attachNewNode(cm.generate())

View File

@ -1186,6 +1186,12 @@ class SceneManager:
node.setTag("transform_scale", str(node.getScale()))
print(f"保存节点 {node.getName()} 的变换信息")
# 保存可见性信息
user_visible = node.getPythonTag("user_visible")
if user_visible is not None:
node.setTag("user_visible", str(user_visible).lower())
print(f"保存节点 {node.getName()} 的可见性信息: {user_visible}")
# 保存父子关系信息 - 关键修改
parent = node.getParent()
if parent and not parent.isEmpty() and parent != self.world.render:
@ -1547,7 +1553,23 @@ class SceneManager:
nodePath.setScale(scale)
print(f"{indent}恢复缩放: {scale}")
nodePath.show()
# 恢复可见性状态
user_visible = True
if nodePath.hasTag("user_visible"):
user_visible = nodePath.getTag("user_visible").lower() == "true"
# 设置用户可见性标记
nodePath.setPythonTag("user_visible", user_visible)
# 应用可见性状态
if hasattr(self.world, 'property_panel'):
self.world.property_panel._syncEffectiveVisibility(nodePath)
else:
# 如果没有属性面板,直接应用可见性
if user_visible:
nodePath.show()
else:
nodePath.hide()
if nodePath.hasTag("has_scripts") and nodePath.getTag("has_scripts") == "true":
if hasattr(self.world,'script_manager') and self.world.script_manager:
@ -1962,12 +1984,14 @@ class SceneManager:
elif gui_type == "3d_image" and hasattr(gui_manager, 'createGUI3DImage'):
# 处理3D图像
# 根据缩放值的数量处理尺寸
size = (absolute_scale[0] * 0.2, absolute_scale[1] * 0.2, absolute_scale[2] * 0.2)
# 修复:不使用 absolute_scale因为 createGUI3DImage 中已经处理了尺寸
# 而是在创建后通过 setScale 设置缩放
size = (1.0, 1.0, 1.0) # 使用默认尺寸创建
new_element = gui_manager.createGUI3DImage(
pos=tuple(absolute_position),
image_path=image_path,
size=size
size=size # 使用默认尺寸
)
elif gui_type == "video_screen" and hasattr(gui_manager, 'createVideoScreen'):
print(f"重建的3d视频屏幕视频地址是{video_path}")