From 43a30fefe34a867bde7397e80fa72165eddce709 Mon Sep 17 00:00:00 2001 From: brige Date: Thu, 19 Jun 2025 22:05:52 +0800 Subject: [PATCH] fix close crash --- src/effects/ConeWave.cpp | 27 +++++------ src/effects/ConeWave.h | 8 ++-- src/entities/ConeWaveComponent.cpp | 60 ++++++++++++------------ src/scene/ui/CompositeWidgetManager.cpp | 25 ++++------ src/scene/ui/CompositeWidgetManager.h | 28 +++++------ src/scene/ui/OESceneUI.cpp | 24 ++++++++++ src/scene/ui/OESceneUI.h | 1 + src/scene/ui/QueryElevationWidget.cpp | 12 ++++- src/scene/ui/QueryElevationWidget.h | 2 + src/translations/Dyt_zh_CN.ts | 62 ++++++++++++------------- src/ui/MainWindow.cpp | 9 ++++ src/ui/MainWindow.h | 1 + src/viewer/OsgViewUI.cpp | 1 + src/viewer/OsgViewUI.h | 1 + src/viewer/OsgWidget.cpp | 21 ++++++++- src/viewer/OsgWidget.h | 1 + 16 files changed, 170 insertions(+), 113 deletions(-) diff --git a/src/effects/ConeWave.cpp b/src/effects/ConeWave.cpp index afd41314..139ec387 100644 --- a/src/effects/ConeWave.cpp +++ b/src/effects/ConeWave.cpp @@ -1,5 +1,5 @@ #include "effects/ConeWave.h" -/* + #include #include #include @@ -230,18 +230,18 @@ void ConeWave::CreateTexturedCone(osg::Geode* geode) { //设置渲染顺序 仿真模型被波束遮盖 ,1000000-指的是若有1000000个Node 则此节点最后一个被渲染 // //stateset->setRenderBinDetails(120, "OSGEARTH_SCREEN_SPACE_LAYOUT_BIN"); stateset->setRenderBinDetails(10, "RenderBin"); - // osg::ref_ptr blendFunc = new osg::BlendFunc(); - // stateset->setAttributeAndModes(blendFunc, osg::StateAttribute::ON); - // osg::ref_ptr program = new osg::Program(); - // program->addShader(vertexShader); - // program->addShader(fragmentShader); - // - // baseColorUniform_ = new osg::Uniform("baseColor", baseColor_); - // stateset->setMode(GL_CULL_FACE, osg::StateAttribute::ON); - // stateset->addUniform(baseColorUniform_); + osg::ref_ptr blendFunc = new osg::BlendFunc(); + stateset->setAttributeAndModes(blendFunc, osg::StateAttribute::ON); + osg::ref_ptr program = new osg::Program(); + program->addShader(vertexShader); + program->addShader(fragmentShader); + + baseColorUniform_ = new osg::Uniform("baseColor", baseColor_); + stateset->setMode(GL_CULL_FACE, osg::StateAttribute::ON); + stateset->addUniform(baseColorUniform_); // // stateset->osg::ref_ptr program = new osg::Program(); -program->addShader(vertexShader); -program->addShader(fragmentShader);(program, osg::StateAttribute::ON); + program->addShader(vertexShader); + program->addShader(fragmentShader);(program, osg::StateAttribute::ON); // // stateset->setAttributeAndModes(new osg::Depth(osg::Depth::LESS, 0.0, 1.0, false)); // // levelCountUniform_ = new osg::Uniform("num", float(levelCount_)); @@ -250,7 +250,7 @@ program->addShader(fragmentShader);(program, osg::StateAttribute::ON); // stateset->addUniform(levelCountUniform_); // stateset->addUniform(levelHeightUniform_.get()); } -*/ +/* #include #include @@ -528,3 +528,4 @@ void ConeWave::changeWaveBeamConeAppearance( osg::Vec4 color, osg::Vec4 lineColo } +*/ \ No newline at end of file diff --git a/src/effects/ConeWave.h b/src/effects/ConeWave.h index f754f5c5..f54cfc39 100644 --- a/src/effects/ConeWave.h +++ b/src/effects/ConeWave.h @@ -1,5 +1,5 @@ #pragma once -/* + #include #include #include @@ -62,7 +62,7 @@ private: float radius_{ 10.0f }; }; -*/ +/* #pragma once #include @@ -82,7 +82,7 @@ public: void createWaveBeamCone(osg::MatrixTransform* node,double angle, double length, osg::Vec4 color, osg::Vec4 lineColor, double lineWidth); - void changeWaveBeamConeTarget(/*osg::MatrixTransform* mt,*/ double latitude, double longitude, double height, bool ifDynamic); + void changeWaveBeamConeTarget(/*osg::MatrixTransform* mt, * / double latitude, double longitude, double height, bool ifDynamic); void changeWaveBeamConeAppearance(osg::Vec4 color, osg::Vec4 lineColor, double lineWidth); @@ -93,4 +93,4 @@ private: osg::ref_ptr _waveBeamCone; }; - +*/ diff --git a/src/entities/ConeWaveComponent.cpp b/src/entities/ConeWaveComponent.cpp index 8dc273d5..b4b0258a 100644 --- a/src/entities/ConeWaveComponent.cpp +++ b/src/entities/ConeWaveComponent.cpp @@ -13,8 +13,8 @@ ConeWaveComponent::ConeWaveComponent(SceneComponent* parent) : SceneComponent(parent) { - // coneWave_ = new ConeWave(); - // coneWave_->InitGeode(); + coneWave_ = new ConeWave(); + coneWave_->InitGeode(); colorMap_[1] = osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f); colorMap_[2] = osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f); @@ -84,48 +84,46 @@ void ConeWaveComponent::Update(double dt) { } void ConeWaveComponent::SetHeight(float height) { - // coneWave_->SetHeight(height); - // if (nullptr != mt_) { - // mt_->setMatrix(osg::Matrix::translate(osg::Vec3(0.0f, 0.0f, -coneWave_->GetHeght() * 0.75f))); - // } + coneWave_->SetHeight(height); + if (nullptr != mt_) { + mt_->setMatrix(osg::Matrix::translate(osg::Vec3(0.0f, 0.0f, -coneWave_->GetHeght() * 0.75f))); + } } float ConeWaveComponent::GetHeight() const { - return 0;// coneWave_->GetHeght(); + return coneWave_->GetHeght(); } void ConeWaveComponent::SetRadius(float radius) { - // coneWave_->SetRadius(radius); + coneWave_->SetRadius(radius); } float ConeWaveComponent::GetRadius() const { - return 0;// return coneWave_->GetRadius(); + return coneWave_->GetRadius(); } void ConeWaveComponent::SetLevelCount(int count) { - // coneWave_->SetLevelCount(count); + coneWave_->SetLevelCount(count); } float ConeWaveComponent::GetLevelCount() const { - return 0; // return coneWave_->GetLevelCount(); + return coneWave_->GetLevelCount(); } void ConeWaveComponent::SetLevelHeight(float height) { - // coneWave_->SetLevelHeight(height); + coneWave_->SetLevelHeight(height); } float ConeWaveComponent::GetLevelHeight() const { - // return coneWave_->GetLevelHeihgt(); - return 0.0f; + return coneWave_->GetLevelHeihgt(); } void ConeWaveComponent::SetBaseColor(const osg::Vec4& color) { - // coneWave_->SetBaseColor(color); + coneWave_->SetBaseColor(color); } const osg::Vec4 ConeWaveComponent::GetBaseColor() const { - // return coneWave_->GetBaseColor(); - return osg::Vec4(); + return coneWave_->GetBaseColor(); } void ConeWaveComponent::SetColor1(const osg::Vec4& color) { @@ -172,7 +170,7 @@ void ConeWaveComponent::AddToRender() { void ConeWaveComponent::Initialize() { mt_ = new osg::MatrixTransform; mt_->addChild(coneWave_); - // mt_->setMatrix(osg::Matrix::translate(osg::Vec3(0.0f, 0.0f, -coneWave_->GetHeght() * 0.75f))); + mt_->setMatrix(osg::Matrix::translate(osg::Vec3(0.0f, 0.0f, -coneWave_->GetHeght() * 0.75f))); } void ConeWaveComponent::UpdateEvent() { @@ -200,24 +198,24 @@ void ConeWaveComponent::UpdateEvent() { } osg::Vec4& color = colorMap_[currentStatus_]; - // coneWave_->SetBaseColor(color); + coneWave_->SetBaseColor(color); coneWave_->setNodeMask(0xff); - //Timestep* timeStep = workspace->GetTimestep(); - //if (nullptr == timeStep) { - // LOG_WARN("timeStep is nullptr"); - // return; - //} + Timestep* timeStep = workspace->GetTimestep(); + if (nullptr == timeStep) { + LOG_WARN("timeStep is nullptr"); + return; + } - //double dt = timeStep->GetCurrent(); - //int value = timeAction_->GetValue(dt); - //if (-1 == value) { - // return; - //} - // + double dt = timeStep->GetCurrent(); + int value = timeAction_->GetValue(dt); + if (-1 == value) { + return; + } + - //coneWave_->setNodeMask(value == 0 ? 0x0 : 0xff); + coneWave_->setNodeMask(value == 0 ? 0x0 : 0xff); } diff --git a/src/scene/ui/CompositeWidgetManager.cpp b/src/scene/ui/CompositeWidgetManager.cpp index 81a16651..77bb4e77 100644 --- a/src/scene/ui/CompositeWidgetManager.cpp +++ b/src/scene/ui/CompositeWidgetManager.cpp @@ -78,23 +78,7 @@ CompositeWidgetManager::CompositeWidgetManager(void) _canvasFX->getBackground()->setColor(0, 0, 0, 0); } -CompositeWidgetManager::~CompositeWidgetManager(void) -{ - delete _canvasN; - delete _canvasO; - delete _canvasBackGround; - delete _canvasFX; - - delete _bgLayer1; - delete _bgLayer2; - delete _bgLayer3; - delete _bgLayer4; - delete _bgShadow; - - delete _widgetCenter; - delete _widgetN; - - delete _widgetFX; +CompositeWidgetManager::~CompositeWidgetManager(void) { } void CompositeWidgetManager::ResetCanvasPosition(double x, double y) @@ -164,6 +148,13 @@ void CompositeWidgetManager::AttachViewUI(osgWidget::WindowManager* ui) { ui->addChild(_canvasBackGround); } +void CompositeWidgetManager::DetachViewUI(OsgViewUI* ui) { + ui->removeChild(_canvasO); + ui->removeChild(_canvasN); + ui->removeChild(_canvasFX); + ui->removeChild(_canvasBackGround); +} + //void CompositeWidgetManager::slotHeading(double angle) //{ // SetHeading(angle); diff --git a/src/scene/ui/CompositeWidgetManager.h b/src/scene/ui/CompositeWidgetManager.h index 7cfaf0d9..1d0e33d6 100644 --- a/src/scene/ui/CompositeWidgetManager.h +++ b/src/scene/ui/CompositeWidgetManager.h @@ -32,6 +32,7 @@ public: void AttachViewUI(class OsgViewUI* ui); void AttachViewUI(osgWidget::WindowManager* ui); + void DetachViewUI(class OsgViewUI* ui); // // @@ -44,23 +45,22 @@ public slots: void slotHeading(double angle); private: - osgWidget::Canvas* _canvasN; - osgWidget::Canvas* _canvasO; - osgWidget::Canvas* _canvasBackGround; - osgWidget::Canvas* _canvasFX; + osg::ref_ptr _canvasN; + osg::ref_ptr _canvasO; + osg::ref_ptr _canvasBackGround; + osg::ref_ptr _canvasFX; - CompositeWidget* _bgLayer1; - osgWidget::Widget* _bgLayer2; - osgWidget::Widget* _bgLayer3; - osgWidget::Widget* _bgLayer4; - osgWidget::Widget* _bgShadow; + osg::ref_ptr _bgLayer1; + osg::ref_ptr _bgLayer2; + osg::ref_ptr _bgLayer3; + osg::ref_ptr _bgLayer4; + osg::ref_ptr _bgShadow; - CompositeWidget* _widgetCenter; + osg::ref_ptr _widgetCenter; + osg::ref_ptr _widgetN; - CompositeWidget* _widgetN; - - osgWidget::Widget* _widgetFX; - osgWidget::Widget* _widgetFXBackground; + osg::ref_ptr _widgetFX; + osg::ref_ptr _widgetFXBackground; osg::Vec2 _mouseDirection; diff --git a/src/scene/ui/OESceneUI.cpp b/src/scene/ui/OESceneUI.cpp index 227f3c5f..7ba80e83 100644 --- a/src/scene/ui/OESceneUI.cpp +++ b/src/scene/ui/OESceneUI.cpp @@ -18,6 +18,11 @@ OESceneUI::OESceneUI(OEScene* oeScene) OESceneUI::~OESceneUI(void) { LOG_INFO("dctor self={}", spdlog::fmt_lib::ptr(this)); + /* if (compositeWidgetManager_) { + compositeWidgetManager_->DetachViewUI(); + delete compositeWidgetManager_; + compositeWidgetManager_ = nullptr; + }*/ } void OESceneUI::InitUI(OsgViewUI* ui) { @@ -42,6 +47,25 @@ void OESceneUI::InitUI(OsgViewUI* ui) { LOG_INFO("exit"); } +void OESceneUI::UninitUI(OsgViewUI* ui) { + LOG_INFO("enter"); + if (!isInit_) { + LOG_INFO("not init"); + return; + } + if (compositeWidgetManager_) { + compositeWidgetManager_->DetachViewUI(ui); + compositeWidgetManager_ = nullptr; + } + if (queryElevationWidget_) { + queryElevationWidget_->DetachViewUI(ui); + queryElevationWidget_ = nullptr; + } + + isInit_ = false; + LOG_INFO("exit"); +} + void OESceneUI::OnResize(double width, double height) { dyt_check(compositeWidgetManager_); //dyt_check(zoomManager_); diff --git a/src/scene/ui/OESceneUI.h b/src/scene/ui/OESceneUI.h index f0c3d4fe..1040d202 100644 --- a/src/scene/ui/OESceneUI.h +++ b/src/scene/ui/OESceneUI.h @@ -16,6 +16,7 @@ public: ~OESceneUI(void) override; void InitUI(OsgViewUI* ui) override; + void UninitUI(OsgViewUI* ui) override; void OnResize(double width, double height) override; private: diff --git a/src/scene/ui/QueryElevationWidget.cpp b/src/scene/ui/QueryElevationWidget.cpp index c9e30ed0..51c9f954 100644 --- a/src/scene/ui/QueryElevationWidget.cpp +++ b/src/scene/ui/QueryElevationWidget.cpp @@ -43,7 +43,17 @@ void QueryElevationWidget::AttachViewUI(OsgViewUI* ui) { ui->addChild(this); dyt_check(nullptr != oeScene_); osgEarth::MapNode* mapNode = oeScene_->GetMapNode(); - ui->getView()->addEventHandler(new QueryElevationEventHandler(mapNode, this)); + eventHandler_ = new QueryElevationEventHandler(mapNode, this); + ui->getView()->addEventHandler(eventHandler_); +} + +void QueryElevationWidget::DetachViewUI(OsgViewUI* ui) { + dyt_check(nullptr != ui); + ui->removeChild(this); + if (nullptr != eventHandler_) { + ui->getView()->removeEventHandler(eventHandler_); + eventHandler_ = nullptr; + } } diff --git a/src/scene/ui/QueryElevationWidget.h b/src/scene/ui/QueryElevationWidget.h index 84bb7dd3..0f72d10c 100644 --- a/src/scene/ui/QueryElevationWidget.h +++ b/src/scene/ui/QueryElevationWidget.h @@ -24,6 +24,7 @@ public: ~QueryElevationWidget() override; void AttachViewUI(class OsgViewUI* ui); + void DetachViewUI(class OsgViewUI* ui); void OnUpdateGeoPoint(double x, double y, double z); void ResetCanvasPosition(double width, double height); @@ -34,6 +35,7 @@ private: private: class OEScene* oeScene_; osg::ref_ptr label_; + osg::ref_ptr eventHandler_; }; diff --git a/src/translations/Dyt_zh_CN.ts b/src/translations/Dyt_zh_CN.ts index 2f631bcd..7e0390fa 100644 --- a/src/translations/Dyt_zh_CN.ts +++ b/src/translations/Dyt_zh_CN.ts @@ -503,132 +503,132 @@ - + model elements - + attribte - + Wave Curve - + Speed Curve - + 3D Curve - + Target number - + Signal-to-noise ratio - + Azimuth line of sight - + Pitch gaze angle - + azimuth - + Pitch angle - + attribute - + Doppler - + course - + Speed - + longitude - + latitude - + distance - + velocity - + Radial dimensions - + Target RCS - + Report Table - + Signal Indicator Lamp - + ParamSetting - + Matlab File - + name: 5year 0412 @@ -694,12 +694,12 @@ OsgWidget - + warning - + open dyt file failed @@ -858,17 +858,17 @@ - + longitude: - + latitude: - + altitude: diff --git a/src/ui/MainWindow.cpp b/src/ui/MainWindow.cpp index 7bc775c3..5c6e913d 100644 --- a/src/ui/MainWindow.cpp +++ b/src/ui/MainWindow.cpp @@ -39,6 +39,7 @@ MainWindow::MainWindow(QWidget* parent) MainWindow::~MainWindow() { //OsgViewer::Get().Uninitialize(); + UninitUI(); delete ui; } @@ -187,6 +188,14 @@ void MainWindow::InitUI() { #endif // 1 } +void MainWindow::UninitUI() { + if (qtOsgViewWidget_) { + qtOsgViewWidget_->Uninitialize(); + delete qtOsgViewWidget_; + qtOsgViewWidget_ = nullptr; + } +} + void MainWindow::InitDockLayout() { while (tabWidget_->count() > 0) { tabWidget_->removeTab(0); diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index 4f5e65a1..13680c78 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -42,6 +42,7 @@ public slots: private: void InitUI(); + void UninitUI(); void InitDockLayout(); void AddDockArea(const QString& strArea); diff --git a/src/viewer/OsgViewUI.cpp b/src/viewer/OsgViewUI.cpp index d98a8716..3c297e5d 100644 --- a/src/viewer/OsgViewUI.cpp +++ b/src/viewer/OsgViewUI.cpp @@ -58,6 +58,7 @@ void OsgViewUI::AddUI(OsgViewUI::ViewUI* viewUI) { } void OsgViewUI::RemoveUI(OsgViewUI::ViewUI* viewUI) { + viewUI->UninitUI(this); for (auto it = viewUIs_.begin(); it != viewUIs_.end(); ++it) { if (*it == viewUI) { viewUIs_.erase(it); diff --git a/src/viewer/OsgViewUI.h b/src/viewer/OsgViewUI.h index 319fb3fe..f467f78d 100644 --- a/src/viewer/OsgViewUI.h +++ b/src/viewer/OsgViewUI.h @@ -11,6 +11,7 @@ public: public: virtual ~ViewUI() = default; virtual void InitUI(OsgViewUI* ui ) = 0; + virtual void UninitUI(OsgViewUI* ui) = 0; virtual void OnResize(double width, double height) = 0; }; diff --git a/src/viewer/OsgWidget.cpp b/src/viewer/OsgWidget.cpp index 0fb5a937..76afaf47 100644 --- a/src/viewer/OsgWidget.cpp +++ b/src/viewer/OsgWidget.cpp @@ -59,9 +59,10 @@ OsgWidget::~OsgWidget() { } } -void OsgWidget::Initialize() { +void OsgWidget::Initialize() { + LOG_INFO("OsgWidget::Initialize"); QHBoxLayout* layout = new QHBoxLayout(this); - activeScene_ = new OEScene(); + activeScene_ = new OEScene; connect(&WorkSpaceManager::Get(), &WorkSpaceManager::WorkSpaceChanged, [this](WorkSpace* workspace) { if (nullptr == workspace) { LOG_WARN("workspace is nullptr"); @@ -78,6 +79,22 @@ void OsgWidget::Initialize() { viewUI_->AddUI(activeScene_->GetOrCreateSceneUI()); } +void OsgWidget::Uninitialize() { + LOG_INFO("OsgWidget::Uninitialize"); + if (nullptr != viewUI_) { + viewUI_->RemoveUI(activeScene_->GetOrCreateSceneUI()); + viewUI_ = nullptr; + } + if (nullptr != activeScene_) { + activeScene_->DetachView(view_); + activeScene_ = nullptr; + } + if (nullptr != view_) { + removeView(view_); + view_ = nullptr; + } +} + void OsgWidget::LoadDefaultScene() { dyt_check(nullptr != activeScene_); if (nullptr == WorkSpaceManager::Get().LoadDefaultWorkspace(activeScene_)) { diff --git a/src/viewer/OsgWidget.h b/src/viewer/OsgWidget.h index d4954db8..ff64a146 100644 --- a/src/viewer/OsgWidget.h +++ b/src/viewer/OsgWidget.h @@ -13,6 +13,7 @@ public: ~OsgWidget() override; void Initialize(void); + void Uninitialize(void); void LoadDefaultScene(void); void OnLoadDyt(const QString& path);