From ace52294736231de556361a428bdef9752a1bdd5 Mon Sep 17 00:00:00 2001 From: Hector <2055590199@qq.com> Date: Thu, 28 Aug 2025 17:13:03 +0800 Subject: [PATCH] =?UTF-8?q?8.28=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QPanda3D/Panda3DWorld.py | 2 +- main.py | 9 +++ ui/main_window.py | 139 ++++++++++++++++++--------------------- 3 files changed, 73 insertions(+), 77 deletions(-) diff --git a/QPanda3D/Panda3DWorld.py b/QPanda3D/Panda3DWorld.py index d6a4e3b8..a19f52c0 100644 --- a/QPanda3D/Panda3DWorld.py +++ b/QPanda3D/Panda3DWorld.py @@ -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 diff --git a/main.py b/main.py index c666694d..ed81d628 100644 --- a/main.py +++ b/main.py @@ -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("✅ 碰撞管理器已初始化") diff --git a/ui/main_window.py b/ui/main_window.py index 3cddb1f2..5946ccc3 100644 --- a/ui/main_window.py +++ b/ui/main_window.py @@ -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("已连接点击信号") # 连接工具切换信号