diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 9a67b0bcce..86c4c78975 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1331,10 +1331,16 @@ void GLCanvas3D::reset_volumes() m_dirty = true; auto pLater = wxGetApp().plater(); - - if (pLater && wxGetApp().plater()->get_notification_manager()) - { - _set_warning_notification(EWarning::ObjectOutside, false); + if (pLater) { + auto* notification_mgr = pLater->get_notification_manager(); + if (notification_mgr) { + // Only update notification if we can safely access Plater's current canvas + // This ensures Plater::priv structure is still valid + auto* canvas = pLater->get_current_canvas3D(); + if (canvas) { + _set_warning_notification(EWarning::ObjectOutside, false); + } + } } } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 26f953ff49..129a0dab32 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -8839,16 +8839,26 @@ void Plater::priv::set_current_canvas_as_dirty() GLCanvas3D* Plater::priv::get_current_canvas3D(bool exclude_preview) { - if (current_panel == view3D) + // During destruction, these pointers may be null or point to destroyed objects + // Add null checks to prevent crashes during shutdown + if (current_panel == view3D) { + if (view3D) + return view3D->get_canvas3d(); + } + else if (!exclude_preview && (current_panel == preview)) { + if (preview) + return preview->get_canvas3d(); + } + else if (current_panel == assemble_view) { + if (assemble_view) + return assemble_view->get_canvas3d(); + } + + //BBS default set to view3D, but check if it's still valid + if (view3D) return view3D->get_canvas3d(); - else if (!exclude_preview && (current_panel == preview)) - return preview->get_canvas3d(); - else if (current_panel == assemble_view) - return assemble_view->get_canvas3d(); - else //BBS default set to view3D - return view3D->get_canvas3d(); - - //return (current_panel == view3D) ? view3D->get_canvas3d() : ((current_panel == preview) ? preview->get_canvas3d() : nullptr); + + return nullptr; } void Plater::priv::unbind_canvas_event_handlers()