Merge branch 'new_osg' of http://brigecode.icu:16623/PM/DYTSrouce into new_osg

This commit is contained in:
pimin 2025-11-16 16:54:39 +08:00
commit f32db7fbb4
14 changed files with 144 additions and 154 deletions

View File

@ -1,14 +1,6 @@
#include "app/Application.h" #include "app/Application.h"
#include "common/SpdLogger.h"
#include "common/RecourceHelper.h"
#include "common/CrashHandler.h"
#include "ui/MainFrame.h"
#include "ui/MainWindow.h"
#include "viewer/OsgWidget.h"
#include <QTimer> #include <QTimer>
#include <QApplication> #include <QApplication>
#include <QGridLayout> #include <QGridLayout>
@ -17,19 +9,14 @@
#include <QLockFile> #include <QLockFile>
#include <QStandardPaths> #include <QStandardPaths>
#include <osgViewer/CompositeViewer> #include "common/SpdLogger.h"
#include <osgViewer/ViewerEventHandlers> #include "common/RecourceHelper.h"
#include "common/CrashHandler.h"
#include <osgGA/MultiTouchTrackballManipulator> #include "workspace/WorkspaceManager.h"
#include <osgDB/ReadFile> #include "ui/MainFrame.h"
#include <osgEarth/MapNode>
#include <osgEarthUtil/ExampleResources>
#include <osgGA/StateSetManipulator>
#include "osgqt/GraphicsWindowQt.h"
#include "scene/ui/CompositeWidgetManager.h"
#include "scene/ui/QueryElevationWidget.h"
#ifndef LC #ifndef LC
#define LC "DYT" #define LC "DYT"
@ -82,10 +69,13 @@ int main(int argc, char* argv[]) {
MainFrame mainWindow; MainFrame mainWindow;
splash.showMessage(("正在创建主窗口..."), Qt::AlignHCenter | Qt::AlignBottom, Qt::white); splash.showMessage(("正在创建主窗口..."), Qt::AlignHCenter | Qt::AlignBottom, Qt:: white);
// 先显示窗口,再在事件循环启动后最大化,避免首次显示时原生窗口放置未就绪导致尺寸异常
mainWindow.showMaximized(); mainWindow.showMaximized();
// QTimer::singleShot(0, &mainWindow, &MainFrame::showMaximized);
splash.finish(&mainWindow); splash.finish(&mainWindow);
int ret = app.exec(); int ret = app.exec();
// app.Uninit(); // app.Uninit();
Sleep(200); Sleep(200);

View File

@ -8,6 +8,7 @@
#include <osgDB/ReadFile> #include <osgDB/ReadFile>
#include <osgEarthUtil/EarthManipulator> #include <osgEarthUtil/EarthManipulator>
#include <osgGA/StateSetManipulator> #include <osgGA/StateSetManipulator>
#include <osgEarth/Registry>
#include <osgShadow/ShadowedScene> #include <osgShadow/ShadowedScene>
#include <osgShadow/ViewDependentShadowMap> #include <osgShadow/ViewDependentShadowMap>
@ -34,51 +35,77 @@ OEScene::OEScene() {
Init(); Init();
} }
OEScene::~OEScene() {
}
void OEScene::AttachView(osgViewer::View* view) { void OEScene::AttachView(osgViewer::View* view) {
if (!view) return;
if (curentView_ == view) return;
dyt_check(nullptr != earthRootNode_); dyt_check(nullptr != earthRootNode_);
skyDome_ = osgEarth::Util::SkyNode::create(earthMapNode_);
if (!earthMapNode_) { if (!earthMapNode_) {
LOG_WARN("eart map node is nullptr"); LOG_WARN("eart map node is nullptr");
return; return;
} }
dyt_check(nullptr != earthManipulator_); if (skyDome_.valid()) {
view->setCameraManipulator(earthManipulator_); removeChild(skyDome_.get());
skyDome_ = nullptr;
}
skyDome_ = osgEarth::Util::SkyNode::create(earthMapNode_);
skyDome_->attach(view); skyDome_->attach(view);
skyDome_->getSunLight()->setAmbient(osg::Vec4(0.5,0.5,0.5,1.0)); skyDome_->getSunLight()->setAmbient(osg::Vec4(0.5,0.5,0.5,1.0));
addChild(skyDome_); addChild(skyDome_);
skyDome_->setDateTime(osgEarth::DateTime(2024, 12, 24, 3)); skyDome_->setDateTime(osgEarth::DateTime(2024, 12, 24, 3));
dyt_check(nullptr != earthManipulator_);
view->setCameraManipulator(earthManipulator_);
view->setSceneData(this); view->setSceneData(this);
curentView_ = view; curentView_ = view;
} }
void OEScene::DetachView(osgViewer::View* view) { void OEScene::DetachView(osgViewer::View* view) {
if (!view) return; if (!view) return;
if (view != curentView_) return;
// Remove sky dome from this group if present; SkyNode has no detach in osgEarth 2.8
if (skyDome_.valid()) { if (skyDome_.valid()) {
// Proactively disable lighting/effects to reduce interactions with the View
skyDome_->setLighting(osg::StateAttribute::OFF); skyDome_->setLighting(osg::StateAttribute::OFF);
skyDome_->setSunVisible(false); skyDome_->setSunVisible(false);
skyDome_->setMoonVisible(false); skyDome_->setMoonVisible(false);
skyDome_->setStarsVisible(false); skyDome_->setStarsVisible(false);
skyDome_->setAtmosphereVisible(false); skyDome_->setAtmosphereVisible(false);
removeChild(skyDome_.get());
skyDome_ = nullptr;
} }
// Clear scene data
view->setSceneData(nullptr);
// Clear manipulator association
if (earthManipulator_.valid()) { if (earthManipulator_.valid()) {
view->setCameraManipulator(nullptr); view->setCameraManipulator(nullptr);
} }
// Clear internal view pointer if (skyDome_.valid()) {
removeChild(skyDome_.get());
skyDome_ = nullptr;
}
if (entityRoot_.valid()) {
removeChild(entityRoot_);
entityRoot_ = nullptr;
}
if (earthRootNode_.valid()) {
removeChild(earthRootNode_);
earthRootNode_ = nullptr;
}
view->setSceneData(nullptr);
// 清理内部视图指针
if (curentView_ == view) {
curentView_ = nullptr; curentView_ = nullptr;
}
} }
bool OEScene::AddToScene(osg::Node* node) const { bool OEScene::AddToScene(osg::Node* node) const {
@ -198,18 +225,19 @@ void OEScene::Init() {
std::string earthPath(earthFile.toLocal8Bit().constData()); std::string earthPath(earthFile.toLocal8Bit().constData());
LOG_INFO("Loading earth file from: {}", earthPath); LOG_INFO("Loading earth file from: {}", earthPath);
// earthRootNode_ = osgDB::readNodeFile("triton.earth");
osg::ref_ptr<osgDB::Options> myReadOptions = osgEarth::Registry::cloneOrCreateOptions();
earthRootNode_ = osgDB::readNodeFile(earthPath); earthRootNode_ = osgDB::readNodeFile(earthPath);
dyt_check(nullptr != earthRootNode_); dyt_check(nullptr != earthRootNode_);
addChild(earthRootNode_);
earthMapNode_ = osgEarth::MapNode::get(earthRootNode_); earthMapNode_ = osgEarth::MapNode::findMapNode(earthRootNode_);
dyt_check(nullptr != earthMapNode_); dyt_check(nullptr != earthMapNode_);
addChild(earthMapNode_);
LOG_INFO("earth map node get success: {}", earthMapNode_.valid()); LOG_INFO("earth map node get success: {}", earthMapNode_.valid());
g_srs_ = earthMapNode_->getMapSRS(); g_srs_ = earthMapNode_->getMapSRS();
earthManipulator_ = new osgEarth::Util::EarthManipulator(); earthManipulator_ = new osgEarth::Util::EarthManipulator();
earthManipulator_->getSettings()->setMinMaxPitch(-90.0, -10.0);
entityRoot_ = new osg::Group; entityRoot_ = new osg::Group;

View File

@ -17,6 +17,7 @@ namespace Util {
class OEScene : public osg::Group { class OEScene : public osg::Group {
public: public:
OEScene(); OEScene();
~OEScene();
void AttachView(osgViewer::View* view); void AttachView(osgViewer::View* view);
void DetachView(osgViewer::View* view); void DetachView(osgViewer::View* view);

View File

@ -1,4 +1,4 @@
#include "scene/ui/OESceneUI.h" #include "scene/ui/OESceneUI.h"
#include "config.h" #include "config.h"
#include "common/SpdLogger.h" #include "common/SpdLogger.h"
@ -18,11 +18,10 @@ OESceneUI::OESceneUI(OEScene* oeScene)
OESceneUI::~OESceneUI(void) { OESceneUI::~OESceneUI(void) {
LOG_INFO("dctor self={}", spdlog::fmt_lib::ptr(this)); LOG_INFO("dctor self={}", spdlog::fmt_lib::ptr(this));
/* if (compositeWidgetManager_) {
compositeWidgetManager_->DetachViewUI();
delete compositeWidgetManager_;
compositeWidgetManager_ = nullptr; compositeWidgetManager_ = nullptr;
}*/ queryElevationWidget_ = nullptr;
oeScene_ = nullptr;
} }
void OESceneUI::InitUI(OsgViewUI* ui) { void OESceneUI::InitUI(OsgViewUI* ui) {
@ -53,12 +52,20 @@ void OESceneUI::UninitUI(OsgViewUI* ui) {
LOG_INFO("not init"); LOG_INFO("not init");
return; return;
} }
// 安全清理,不访问可能已销毁的资源
if (compositeWidgetManager_) { if (compositeWidgetManager_) {
// 只在ui有效时才调用DetachViewUI
if (ui) {
compositeWidgetManager_->DetachViewUI(ui); compositeWidgetManager_->DetachViewUI(ui);
}
compositeWidgetManager_ = nullptr; compositeWidgetManager_ = nullptr;
} }
if (queryElevationWidget_) { if (queryElevationWidget_) {
// 只在ui有效时才调用DetachViewUI
if (ui) {
queryElevationWidget_->DetachViewUI(ui); queryElevationWidget_->DetachViewUI(ui);
}
queryElevationWidget_ = nullptr; queryElevationWidget_ = nullptr;
} }

View File

@ -24,10 +24,9 @@ namespace Gdiplus
#include "FrameTitleBar.h" #include "FrameTitleBar.h"
#pragma comment (lib,"Dwmapi.lib") // Adds missing library, fixes error LNK2019: unresolved external symbol __imp__DwmExtendFrameIntoClientArea #pragma comment (lib,"Dwmapi.lib")
#pragma comment (lib,"user32.lib") #pragma comment (lib,"user32.lib")
// 无边框样式:不使用 CAPTION 与系统按钮,避免在 Win7 显示原生按钮
constexpr unsigned long BorderlessFlag = WS_POPUP | WS_THICKFRAME | WS_SYSMENU; constexpr unsigned long BorderlessFlag = WS_POPUP | WS_THICKFRAME | WS_SYSMENU;
inline bool IsCompositionEnabled() { inline bool IsCompositionEnabled() {
@ -103,10 +102,9 @@ bool FramelessDelegateWin::nativeEvent(const QByteArray & eventType, void* messa
return true; return true;
} }
NCCALCSIZE_PARAMS* ncParam = reinterpret_cast<NCCALCSIZE_PARAMS*>(msg->lParam); NCCALCSIZE_PARAMS* ncParam = reinterpret_cast<NCCALCSIZE_PARAMS*>(msg->lParam);
// 最大化时将客户区严格对齐到工作区,避免左右空隙
ncParam->rgrc[0].left = rc->left(); ncParam->rgrc[0].left = rc->left();
ncParam->rgrc[0].top = rc->top(); ncParam->rgrc[0].top = rc->top();
ncParam->rgrc[0].right = rc->right(); ncParam->rgrc[0].right = rc->right() + 1;
ncParam->rgrc[0].bottom = rc->bottom(); ncParam->rgrc[0].bottom = rc->bottom();
*result = 0; *result = 0;
return true; return true;
@ -123,7 +121,7 @@ bool FramelessDelegateWin::nativeEvent(const QByteArray & eventType, void* messa
} else { } else {
clientRect->top = before.top; clientRect->top = before.top;
clientRect->left = before.left; clientRect->left = before.left;
clientRect->right = before.right; clientRect->right = before.right + 1;
clientRect->bottom = before.bottom + 1; clientRect->bottom = before.bottom + 1;
} }
} }
@ -132,12 +130,8 @@ bool FramelessDelegateWin::nativeEvent(const QByteArray & eventType, void* messa
return true; return true;
} }
case WM_NCPAINT: { case WM_NCPAINT: {
if (!IsCompositionEnabled()) {
*result = 0; *result = 0;
return true; return true;
} else {
break;
}
} }
case WM_SETFOCUS: { case WM_SETFOCUS: {
Qt::FocusReason reason; Qt::FocusReason reason;
@ -153,28 +147,38 @@ bool FramelessDelegateWin::nativeEvent(const QByteArray & eventType, void* messa
} }
break; break;
case WM_NCACTIVATE: { case WM_NCACTIVATE: {
if (!IsCompositionEnabled()) {
*result = 1; *result = 1;
return true; return true;
} }
}
break;
case WM_NCHITTEST: { case WM_NCHITTEST: {
return OnNCTitTest(msg, result); return OnNCTitTest(msg, result);
} }
case WM_GETMINMAXINFO: case WM_GETMINMAXINFO: {
{ MINMAXINFO* mmi = reinterpret_cast<MINMAXINFO*>(msg->lParam);
if (::IsZoomed(msg->hwnd)) { HMONITOR monitor = MonitorFromWindow(msg->hwnd, MONITOR_DEFAULTTONEAREST);
RECT frame = { 0, 0, 0, 0 }; MONITORINFO mi;
AdjustWindowRectEx(&frame, WS_OVERLAPPEDWINDOW, FALSE, 0); ::ZeroMemory(&mi, sizeof(mi));
double dpr = mainWidget_->devicePixelRatioF(); mi.cbSize = sizeof(mi);
if (monitor && GetMonitorInfo(monitor, &mi)) {
const RECT& work = mi.rcWork;
const RECT& rcMon = mi.rcMonitor;
const int frameX = GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);
const int frameY = GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);
// 最大化时不叠加系统边框内边距,避免左右出现可见空隙 mmi->ptMaxPosition.x = work.left - frameX;
mmi->ptMaxPosition.y = work.top - frameY;
mmi->ptMaxSize.x = (work.right - work.left) + frameX * 2;
mmi->ptMaxSize.y = (work.bottom - work.top) + frameY * 2;
mmi->ptMaxTrackSize.x = (rcMon.right - rcMon.left) + frameX * 2;
mmi->ptMaxTrackSize.y = (rcMon.bottom - rcMon.top) + frameY * 2;
}
if (::IsZoomed(msg->hwnd)) {
frames_.setLeft(0); frames_.setLeft(0);
frames_.setTop(0); frames_.setTop(0);
frames_.setRight(0); frames_.setRight(0);
frames_.setBottom(0); frames_.setBottom(0);
mainWidget_->setContentsMargins(margins_); mainWidget_->setContentsMargins(margins_);
justMaximized_ = true; justMaximized_ = true;
} else { } else {
@ -188,14 +192,16 @@ bool FramelessDelegateWin::nativeEvent(const QByteArray & eventType, void* messa
if (nullptr != titleBar_ && flag) { if (nullptr != titleBar_ && flag) {
titleBar_->OnMaximized(justMaximized_); titleBar_->OnMaximized(justMaximized_);
} }
return false; *result = 0;
return true;
} }
case WM_NCLBUTTONDBLCLK: { case WM_NCLBUTTONDBLCLK: {
*result = 0;
if (mainWidget_->maximumSize() == QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX) && if (mainWidget_->maximumSize() == QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX) &&
mainWidget_->windowFlags().testFlag(Qt::WindowMaximizeButtonHint)) mainWidget_->windowFlags().testFlag(Qt::WindowMaximizeButtonHint))
return false; return false;
else else
return true; return false;
} }
case WM_NCRBUTTONUP: case WM_NCRBUTTONUP:
{ {
@ -211,13 +217,12 @@ bool FramelessDelegateWin::nativeEvent(const QByteArray & eventType, void* messa
void FramelessDelegateWin::OnShow() { void FramelessDelegateWin::OnShow() {
if (isFirstShow_) { if (isFirstShow_) {
isFirstShow_ = false;
SetNativeWindowLong(); SetNativeWindowLong();
isFirstShow_ = false;
} }
mainWidget_->setAttribute(Qt::WA_Resized); mainWidget_->setAttribute(Qt::WA_Resized);
if (!isFirstShow_ && mainWidget_->isMaximized()) { if (!isFirstShow_ && mainWidget_->isMaximized() && wndPlaceMent_.length == sizeof(wndPlaceMent_)) {
QMetaObject::invokeMethod( QMetaObject::invokeMethod(
this, this,
[=]() { [=]() {
@ -360,26 +365,24 @@ void FramelessDelegateWin::SetNativeWindowLong() {
} }
HWND hwnd = reinterpret_cast<HWND>(mainWidget_->winId()); HWND hwnd = reinterpret_cast<HWND>(mainWidget_->winId());
unsigned long style = BorderlessFlag; unsigned long style = BorderlessFlag;
// 避免父窗口与子窗口重叠绘制导致闪烁,启用剪裁样式
style |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS; style |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
// 显式清理可能由 Qt 或系统设置的标题栏与系统按钮标志,确保不显示原生按钮
style &= ~WS_CAPTION; style &= ~WS_CAPTION;
style &= ~WS_MINIMIZEBOX; style &= ~WS_MINIMIZEBOX;
style &= ~WS_MAXIMIZEBOX; style &= ~WS_MAXIMIZEBOX;
if (!mainWidget_->windowFlags().testFlag(Qt::WindowMinimizeButtonHint) || const bool canResize = (mainWidget_->maximumSize() == QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX));
mainWidget_->maximumSize() != QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)) { if (mainWidget_->windowFlags().testFlag(Qt::WindowMinimizeButtonHint) && canResize) {
style &= ~WS_MINIMIZEBOX; style |= WS_MINIMIZEBOX;
} }
if (!mainWidget_->windowFlags().testFlag(Qt::WindowMaximizeButtonHint)) { if (mainWidget_->windowFlags().testFlag(Qt::WindowMaximizeButtonHint) && canResize) {
style &= ~WS_MAXIMIZEBOX; style |= WS_MAXIMIZEBOX;
} }
::SetWindowLongPtr(hwnd, GWL_STYLE, style); ::SetWindowLongPtr(hwnd, GWL_STYLE, style);
if (IsCompositionEnabled()) { if (IsCompositionEnabled()) {
ExtendFrameIntoClientArea(mainWidget_->windowHandle(), 1, 0, 0, 0); ExtendFrameIntoClientArea(mainWidget_->windowHandle(), 1, 1, 0, 0);
} }
RECT rect; RECT rect;
GetWindowRect(hwnd, &rect); GetWindowRect(hwnd, &rect);
@ -430,10 +433,6 @@ bool FramelessDelegateWin::OnNCTitTest(MSG* msg, qintptr* result) {
*result = HTTOP; *result = HTTOP;
return true; return true;
} }
if (y > rect.top() + borderY && y < rect.top() + borderY) {
*result = HTCAPTION;
return true;
}
if (!maxSized && y >= rect.bottom() - borderY && y <= rect.bottom()) { if (!maxSized && y >= rect.bottom() - borderY && y <= rect.bottom()) {
*result = HTBOTTOM; *result = HTBOTTOM;
return true; return true;

View File

@ -6,9 +6,13 @@
FramelessWindow::FramelessWindow(QWidget* parent) FramelessWindow::FramelessWindow(QWidget* parent)
: QFrame(parent) { : QFrame(parent) {
setWindowFlags(windowFlags() | Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint); setWindowFlags(windowFlags()
| Qt::Window
| Qt::FramelessWindowHint
| Qt::WindowSystemMenuHint
| Qt::WindowMaximizeButtonHint
| Qt::WindowMinimizeButtonHint);
// 初始化平台相关的无边框委托,用于命中测试和缩放。
delegate_ = FramelessDelegate::Create(this); delegate_ = FramelessDelegate::Create(this);
} }

View File

@ -123,8 +123,8 @@ void MainFrame::InitUI() {
simuRunMenu->SetMainWindow(mainWindow); simuRunMenu->SetMainWindow(mainWindow);
OsgWidget* viewWidget = mainWindow->GetViewWidget(); /*OsgWidget* viewWidget = mainWindow->GetViewWidget();
connect(fileMenu, &FileManagerMenu::LoadDyt, viewWidget, &OsgWidget::OnLoadDyt); connect(fileMenu, &FileManagerMenu::LoadDyt, viewWidget, &OsgWidget::OnLoadDyt);*/
//connect(system_, &SystemManagerMenu::signalShowUISetting, mainWindow, &MainWindow::slotShowUISetting); //connect(system_, &SystemManagerMenu::signalShowUISetting, mainWindow, &MainWindow::slotShowUISetting);

View File

@ -18,16 +18,16 @@
<number>0</number> <number>0</number>
</property> </property>
<property name="leftMargin"> <property name="leftMargin">
<number>0</number> <number>6</number>
</property> </property>
<property name="topMargin"> <property name="topMargin">
<number>0</number> <number>0</number>
</property> </property>
<property name="rightMargin"> <property name="rightMargin">
<number>0</number> <number>6</number>
</property> </property>
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>6</number>
</property> </property>
<item> <item>
<widget class="FrameTitleBar" name="titleFrame"> <widget class="FrameTitleBar" name="titleFrame">
@ -55,7 +55,7 @@
<widget class="QWidget" name="body" native="true"> <widget class="QWidget" name="body" native="true">
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing"> <property name="spacing">
<number>2</number> <number>0</number>
</property> </property>
<property name="leftMargin"> <property name="leftMargin">
<number>0</number> <number>0</number>
@ -64,10 +64,10 @@
<number>3</number> <number>3</number>
</property> </property>
<property name="rightMargin"> <property name="rightMargin">
<number>0</number> <number>3</number>
</property> </property>
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>6</number>
</property> </property>
<item> <item>
<widget class="QStackedWidget" name="menuWidget"> <widget class="QStackedWidget" name="menuWidget">

View File

@ -42,8 +42,6 @@ MainWindow::MainWindow(QWidget* parent)
LOG_INFO("MainWindow::MainWindow - Constructor called, about to call InitUI"); LOG_INFO("MainWindow::MainWindow - Constructor called, about to call InitUI");
InitUI(); InitUI();
LOG_INFO("MainWindow::MainWindow - Constructor completed"); LOG_INFO("MainWindow::MainWindow - Constructor completed");
QTimer::singleShot(1000.0, this, SLOT(slotUpdateShowMax()));
} }
MainWindow::~MainWindow() { MainWindow::~MainWindow() {
@ -182,9 +180,7 @@ void MainWindow::InitUI() {
} }
} }
//ui->viewWidget->layout()->addWidget(qtOsgViewWidget_);
qtOsgViewWidget_->LoadDefaultScene(); qtOsgViewWidget_->LoadDefaultScene();
#if 0 #if 0
MatlabObject::GetInstance()->RunMatlabFile(""); MatlabObject::GetInstance()->RunMatlabFile("");
#endif // 1 #endif // 1
@ -206,7 +202,3 @@ void MainWindow::UninitUI() {
} }
} }
void MainWindow::slotUpdateShowMax()
{
showMaximized();
}

View File

@ -36,9 +36,6 @@ public:
return dataPanelManager_; return dataPanelManager_;
} }
protected slots:
void slotUpdateShowMax();
private: private:
void InitUI(); void InitUI();
void UninitUI(); void UninitUI();

View File

@ -75,6 +75,7 @@ void FileManagerMenu::OpenWorkSpace() {
} }
LOG_INFO("open workspace: {}", fileName.toLocal8Bit().constData()); LOG_INFO("open workspace: {}", fileName.toLocal8Bit().constData());
WorkSpaceManager::Get().LoadDyt(fileName);
emit LoadDyt(fileName); emit LoadDyt(fileName);
} }

View File

@ -47,11 +47,10 @@ static void ConfigureView( osgViewer::View* view ) {
OsgWidget::OsgWidget(QWidget* parent, Qt::WindowFlags f) OsgWidget::OsgWidget(QWidget* parent, Qt::WindowFlags f)
: QWidget(parent, f) : QWidget(parent, f)
{ {
// setAttribute(Qt::WA_PaintOnScreen, true); //setAttribute(Qt::WA_PaintOnScreen, true);
// setAttribute(Qt::WA_StaticContents, true); setAttribute(Qt::WA_StaticContents, true);
// setAttribute(Qt::WA_NoSystemBackground, true); setAttribute(Qt::WA_NoSystemBackground, true);
//setAttribute(Qt::WA_OpaquePaintEvent, true); setAttribute(Qt::WA_OpaquePaintEvent, true);
// setAttribute(Qt::WA_DontCreateNativeAncestors, false);
setThreadingModel(osgViewer::ViewerBase::SingleThreaded); setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
setMouseTracking(true); setMouseTracking(true);
@ -73,16 +72,6 @@ OsgWidget::~OsgWidget() {
if (timer_.isActive()) { if (timer_.isActive()) {
timer_.stop(); timer_.stop();
} }
// First unload the workspace while scene/view are still valid,
// so entities can detach cleanly from the scene graph
if (nullptr != workspace_) {
workspace_->Unlaod();
workspace_ = nullptr;
}
// Then perform the viewer teardown (detach UI, view, and scene)
Uninitialize();
} }
void OsgWidget::Initialize() { void OsgWidget::Initialize() {
@ -109,6 +98,11 @@ void OsgWidget::Initialize() {
void OsgWidget::Uninitialize() { void OsgWidget::Uninitialize() {
LOG_INFO("OsgWidget::Uninitialize"); LOG_INFO("OsgWidget::Uninitialize");
if (nullptr != activeScene_) {
activeScene_->DetachView(view_);
}
if (nullptr != viewUI_) { if (nullptr != viewUI_) {
// Avoid creating UI during teardown; only remove if it exists // Avoid creating UI during teardown; only remove if it exists
if (activeScene_.valid()) { if (activeScene_.valid()) {
@ -119,8 +113,8 @@ void OsgWidget::Uninitialize() {
} }
viewUI_ = nullptr; viewUI_ = nullptr;
} }
if (nullptr != activeScene_) { if (nullptr != activeScene_) {
activeScene_->DetachView(view_);
activeScene_ = nullptr; activeScene_ = nullptr;
} }
if (nullptr != view_) { if (nullptr != view_) {
@ -137,29 +131,6 @@ void OsgWidget::LoadDefaultScene() {
} }
} }
void OsgWidget::OnLoadDyt(const QString& path) {
LOG_INFO("load dyt path:{}", path.toStdString());
WorkSpace* workSpace = WorkSpaceManager::Get().LoadDyt(path);
if (nullptr == workSpace) {
QMessageBox::warning(&MainFrame::Get(), tr("warning"),
tr("open dyt file failed"), QMessageBox::Ok);
return;
}
const QString& name = workSpace->GetName();
const QString windowTitle = MainFrame::Get().windowTitle();
MainFrame::Get().setWindowTitle(windowTitle + "-" + name);
WorkSpaceManager::Get().SetCurrent(workSpace);
if (nullptr != workspace_ && workspace_ != workSpace) {
workspace_->Unlaod();
}
workspace_ = workSpace;
emit signalResetWorkSpace();
}
osgQt::GraphicsWindowQt* OsgWidget::createGraphicsWindow(int x, int y, int w, int h, const std::string& name, osgQt::GraphicsWindowQt* OsgWidget::createGraphicsWindow(int x, int y, int w, int h, const std::string& name,
bool windowDecoration) { bool windowDecoration) {
osg::DisplaySettings* ds = osg::DisplaySettings::instance().get(); osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
@ -181,8 +152,7 @@ osgQt::GraphicsWindowQt* OsgWidget::createGraphicsWindow(int x, int y, int w, in
QWidget* OsgWidget::addViewWidget(osgQt::GraphicsWindowQt* gw) { QWidget* OsgWidget::addViewWidget(osgQt::GraphicsWindowQt* gw) {
view_ = new osgViewer::View; view_ = new osgViewer::View;
addView( view_ ); addView(view_);
ConfigureView(view_);
osg::Camera* camera = view_->getCamera(); osg::Camera* camera = view_->getCamera();
camera->setGraphicsContext( gw ); camera->setGraphicsContext( gw );
@ -194,6 +164,9 @@ QWidget* OsgWidget::addViewWidget(osgQt::GraphicsWindowQt* gw) {
camera->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(traits->width)/static_cast<double>(traits->height), 1.0f, 10000.0f ); camera->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(traits->width)/static_cast<double>(traits->height), 1.0f, 10000.0f );
activeScene_->AttachView(view_); activeScene_->AttachView(view_);
ConfigureView(view_);
return gw->getGLWidget(); return gw->getGLWidget();
} }

View File

@ -16,10 +16,8 @@ public:
void Initialize(void); void Initialize(void);
void Uninitialize(void); void Uninitialize(void);
void LoadDefaultScene(void); void LoadDefaultScene(void);
void OnLoadDyt(const QString& path);
signals: signals:
void signalResetWorkSpace();
void signalScaleInfo(const QString&); void signalScaleInfo(const QString&);
protected: protected:
@ -52,7 +50,6 @@ private:
osg::ref_ptr<OEScene> activeScene_; osg::ref_ptr<OEScene> activeScene_;
osg::ref_ptr<class OsgViewUI> viewUI_; osg::ref_ptr<class OsgViewUI> viewUI_;
class WorkSpace* workspace_{ nullptr };
osg::ref_ptr<osgViewer::View> view_; osg::ref_ptr<osgViewer::View> view_;
// class OsgView* view_{nullptr}; // class OsgView* view_{nullptr};
}; };

View File

@ -152,6 +152,7 @@ WorkSpace* WorkSpaceManager::LoadDyt(const QString& dyt) {
} }
workSpaces_[dyt] = workspace; workSpaces_[dyt] = workspace;
SetCurrent(workspace);
return workspace; return workspace;
} }