8.28合并

This commit is contained in:
Hector 2025-08-28 17:13:03 +08:00
parent f4b16c36c6
commit ace5229473
3 changed files with 73 additions and 77 deletions

View File

@ -53,7 +53,7 @@ class Panda3DWorld(ShowBase):
Panda3DWorld : A class to handle all panda3D world manipulation
"""
def __init__(self, width=1254, height=729, is_fullscreen=False, size=1.0, clear_color=LVecBase4f(0, 0.5, 0, 1),
def __init__(self, width=1380, height=729, is_fullscreen=False, size=1.0, clear_color=LVecBase4f(0, 0.5, 0, 1),
name="qpanda3D"):
global _global_world_instance

View File

@ -107,6 +107,15 @@ class MyWorld(CoreWorld):
# 默认启用模型间碰撞检测(可选)
self.enableModelCollisionDetection(enable=True, frequency=0.1, threshold=0.5)
try:
self.property_panel = PropertyPanelManager(self)
print("✓ 属性面板管理器初始化完成")
except Exception as e:
print(f"⚠ 属性面板管理器初始化失败: {e}")
import traceback
traceback.print_exc()
self.property_panel = None
print("✓ MyWorld 初始化完成")
print("✅ 碰撞管理器已初始化")

View File

@ -15,8 +15,8 @@ from PyQt5.QtWidgets import (QApplication, QMainWindow, QMenuBar, QMenu, QAction
QLabel, QLineEdit, QFormLayout, QDoubleSpinBox, QScrollArea,
QFileSystemModel, QButtonGroup, QToolButton, QPushButton, QHBoxLayout,
QComboBox, QGroupBox, QInputDialog, QFileDialog, QMessageBox, QDesktopWidget, QDialog,
QSpinBox)
from PyQt5.QtCore import Qt, QDir, QTimer
QSpinBox, QFrame)
from PyQt5.QtCore import Qt, QDir, QTimer, QSize, QPoint
from ui.widgets import CustomPanda3DWidget, CustomFileView, CustomTreeWidget,CustomAssetsTreeWidget, CustomConsoleDockWidget
class MainWindow(QMainWindow):
@ -352,6 +352,20 @@ class MainWindow(QMainWindow):
self.loadCesiumTilesetAction = self.cesiumMenu.addAction('加载3Dtiles')
self.loadCesiumTilesetAction.triggered.connect(self.onLoadCesiumTileset)
# 添加地球视图相关菜单项
self.createCesiumViewAction = self.cesiumMenu.addAction('创建地球视图')
self.createCesiumViewAction.triggered.connect(self.onCreateCesiumView)
self.toggleCesiumViewAction = self.cesiumMenu.addAction('开关地球视图')
self.toggleCesiumViewAction.triggered.connect(self.onToggleCesiumView)
self.refreshCesiumViewAction = self.cesiumMenu.addAction('刷新地球视图')
self.refreshCesiumViewAction.triggered.connect(self.onRefreshCesiumView)
# 添加模型相关菜单项
self.addModelToCesiumAction = self.cesiumMenu.addAction('添加模型到地球')
self.addModelToCesiumAction.triggered.connect(self.onAddModelClicked)
# 帮助菜单
self.helpMenu = menubar.addMenu('帮助')
@ -441,25 +455,47 @@ class MainWindow(QMainWindow):
# 创建属性面板的主容器和布局
self.propertyContainer = QWidget()
self.propertyContainer.setObjectName("PropertyContainer")
self.propertyLayout = QVBoxLayout(self.propertyContainer)
# 添加初始提示信息
tipLabel = QLabel("")
tipLabel.setStyleSheet("color: gray;") # 使用灰色字体
self.propertyLayout.addWidget(tipLabel)
try:
self.propertyLayout = QVBoxLayout(self.propertyContainer)
print(f"✓ 属性布局创建完成: {self.propertyLayout}")
# 创建滚动区域并设置属性
self.scrollArea = QScrollArea()
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setWidget(self.propertyContainer)
# 添加初始提示信息
tipLabel = QLabel("选择对象以查看属性")
tipLabel.setStyleSheet("color: gray; padding: 10px;") # 使用灰色字体
self.propertyLayout.addWidget(tipLabel)
print("✓ 提示标签添加完成")
# 设置滚动区域为停靠窗口的主部件
self.rightDock.setWidget(self.scrollArea)
self.rightDock.setMinimumWidth(300)
self.addDockWidget(Qt.RightDockWidgetArea, self.rightDock)
# 创建滚动区域并设置属性
self.scrollArea = QScrollArea()
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setWidget(self.propertyContainer)
print("✓ 滚动区域设置完成")
# 设置属性面板到世界对象
self.world.setPropertyLayout(self.propertyLayout)
# 设置滚动区域为停靠窗口的主部件
self.rightDock.setWidget(self.scrollArea)
self.rightDock.setMinimumWidth(300)
self.addDockWidget(Qt.RightDockWidgetArea, self.rightDock)
print("✓ 右侧停靠窗口添加完成")
# 设置属性面板到世界对象
if hasattr(self.world, 'setPropertyLayout'):
print("开始设置属性布局到世界对象...")
self.world.setPropertyLayout(self.propertyLayout)
print("✓ 属性布局设置完成")
else:
print("⚠ 世界对象没有 setPropertyLayout 方法")
except Exception as e:
print(f"✗ 设置属性面板时出错: {e}")
import traceback
traceback.print_exc()
# 创建基本的属性面板作为后备方案
fallback_widget = QLabel("属性面板初始化失败\n请查看控制台日志")
fallback_widget.setStyleSheet("color: red; background-color: white; padding: 10px;")
self.rightDock.setWidget(fallback_widget)
self.addDockWidget(Qt.RightDockWidgetArea, self.rightDock)
# 创建脚本管理停靠窗口
self.scriptDock = QDockWidget("脚本管理", self)
@ -478,7 +514,7 @@ class MainWindow(QMainWindow):
self.scriptDock.setWidget(self.scriptScrollArea)
self.scriptDock.setMinimumWidth(300)
# 设置脚本面板内容
# 设置脚本面板内容 - 这里添加调用
self.setupScriptPanel(self.scriptLayout)
self.addDockWidget(Qt.RightDockWidgetArea, self.scriptDock)
@ -510,7 +546,6 @@ class MainWindow(QMainWindow):
# self.bottomDock.setWidget(self.fileView)
# self.addDockWidget(Qt.BottomDockWidgetArea, self.bottomDock)
# 创建底部停靠窗口(资源窗口)
self.bottomDock = QDockWidget("资源", self)
self.fileView = CustomAssetsTreeWidget(self.world)
@ -523,7 +558,6 @@ class MainWindow(QMainWindow):
self.consoleDock.setWidget(self.consoleView)
self.addDockWidget(Qt.BottomDockWidgetArea, self.consoleDock)
def setupToolbar(self):
"""创建工具栏"""
self.toolbar = self.addToolBar('工具栏')
@ -743,80 +777,33 @@ class MainWindow(QMainWindow):
self.buildAction.triggered.connect(lambda: buildPackage(self))
self.exitAction.triggered.connect(QApplication.instance().quit)
#连接工具事件
self.sunsetAction.triggered.connect(lambda : self.world.setCurrentTool("光照编辑"))
self.pluginAction.triggered.connect(lambda : self.world.setCurrentTool("图形编辑"))
# 连接工具事件
self.sunsetAction.triggered.connect(lambda: self.world.setCurrentTool("光照编辑"))
self.pluginAction.triggered.connect(lambda: self.world.setCurrentTool("图形编辑"))
# 连接GUI编辑模式事件
self.guiEditModeAction.triggered.connect(lambda: self.world.toggleGUIEditMode())
# 连接创建事件
# 连接光源创建按钮事件
self.createSpotLightAction.triggered.connect(lambda :self.world.createSpotLight())
self.createPointLightAction.triggered.connect(lambda :self.world.createPointLight())
# 连接GUI创建按钮事件
# 连接创建事件 - 使用菜单动作而不是不存在的工具栏按钮
self.createSpotLightAction.triggered.connect(lambda: self.world.createSpotLight())
self.createPointLightAction.triggered.connect(lambda: self.world.createPointLight())
self.createButtonAction.triggered.connect(lambda: self.world.createGUIButton())
self.createLabelAction.triggered.connect(lambda: self.world.createGUILabel())
self.createEntryAction.triggered.connect(lambda: self.world.createGUIEntry())
self.create3DTextAction.triggered.connect(lambda: self.world.createGUI3DText())
#self.createSpotLightAction.triggered.connect(lambda :self.world.createSpotLight())
self.createVirtualScreenAction.triggered.connect(lambda: self.world.createGUIVirtualScreen())
self.createCesiumViewAction.triggered.connect(self.onCreateCesiumView)
self.toggleCesiumViewAction.triggered.connect(self.onToggleCesiumView)
self.refreshCesiumViewAction.triggered.connect(self.onRefreshCesiumView)
self.createCesiumViewAction.triggered.connect(self.onCreateCesiumView)
self.toggleCesiumViewAction.triggered.connect(self.onToggleCesiumView)
self.refreshCesiumViewAction.triggered.connect(self.onRefreshCesiumView)
#连接地形创建事件
# 连接地形创建事件
self.createFlatTerrainAction.triggered.connect(self.onCreateFlatTerrain)
self.createHeightmapTerrainAction.triggered.connect(self.onCreateHeightmapTerrain)
self.terrainEditModeAction.triggered.connect(self.onTerrainEditMode)
# 连接工具栏GUI创建按钮事件
self.createButtonTool.clicked.connect(lambda: self.world.createGUIButton())
self.createLabelTool.clicked.connect(lambda: self.world.createGUILabel())
self.create3DTextTool.clicked.connect(lambda: self.world.createGUI3DText())
self.create3DImageTool.clicked.connect(lambda: self.world.createGUI3DImage())
self.create2DImageTool.clicked.connect(lambda: self.world.createGUI2DImage())
self.createSpotLight.clicked.connect(lambda :self.world.createSpotLight())
self.createPointLight.clicked.connect(lambda :self.world.createPointLight())
# 连接工具栏地形创建按钮事件
self.createFlatTerrainTool.clicked.connect(self.onCreateFlatTerrain)
self.createHeightmapTerrainTool.clicked.connect(self.onCreateHeightmapTerrain)
self.terrainEditTool.clicked.connect(self.onTerrainEditMode)
# # 连接创建事件
# # 连接光源创建按钮事件
# self.createSpotLightAction.triggered.connect(lambda :self.world.createSpotLight())
# self.createPointLightAction.triggered.connect(lambda :self.world.createPointLight())
# # 连接GUI创建按钮事件
# self.createButtonAction.triggered.connect(lambda: self.world.createGUIButton())
# self.createLabelAction.triggered.connect(lambda: self.world.createGUILabel())
# self.createEntryAction.triggered.connect(lambda: self.world.createGUIEntry())
# self.create3DTextAction.triggered.connect(lambda: self.world.createGUI3DText())
# #self.createSpotLightAction.triggered.connect(lambda :self.world.createSpotLight())
#
# # self.createVideoScreen.triggered.connect(lambda: self.world.video_manager.create_video_screen(
# # pos=(0, 0, 2),
# # size=(4, 3),
# # name=f"video_screen_{len(self.world.video_manager.video_objects) if hasattr(self.world, 'video_manager') else 0}"
# # ))
# # self.createSphericalVideo.triggered.connect(lambda: self.world.createGUISphericalVideo())
#
# self.createVirtualScreenAction.triggered.connect(lambda: self.world.create_spherical_video())
#
# # 连接工具栏GUI创建按钮事件
# self.createButtonTool.clicked.connect(lambda: self.world.createGUIButton())
# self.createLabelTool.clicked.connect(lambda: self.world.createGUILabel())
# self.create3DTextTool.clicked.connect(lambda: self.world.createGUI3DText())
# self.createSpotLight.clicked.connect(lambda :self.world.createSpotLight())
# self.createPointLight.clicked.connect(lambda :self.world.createPointLight())
# 连接树节点点击信号
# self.treeWidget.itemClicked.connect(self.world.onTreeItemClicked)
self.treeWidget.itemSelectionChanged.connect(lambda :self.world.onTreeItemClicked(self.treeWidget.currentItem(), 0))
self.treeWidget.itemSelectionChanged.connect(
lambda: self.world.onTreeItemClicked(self.treeWidget.currentItem(), 0))
print("已连接点击信号")
# 连接工具切换信号