diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index ed4713737f..38582c7aa8 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -747,9 +747,7 @@ void GCodeViewer::load(const GCodeProcessorResult& gcode_result, const Print& pr m_filament_diameters = gcode_result.filament_diameters; m_filament_densities = gcode_result.filament_densities; - if (wxGetApp().is_editor()) - load_shells(print); - else { + if (!wxGetApp().is_editor()) { Pointfs bed_shape; std::string texture; std::string model; @@ -903,7 +901,6 @@ void GCodeViewer::reset() m_filament_diameters = std::vector(); m_filament_densities = std::vector(); m_extrusions.reset_ranges(); - m_shells.volumes.clear(); m_layers.reset(); m_layers_z_range = { 0, 0 }; m_roles = std::vector(); @@ -927,12 +924,13 @@ void GCodeViewer::render() m_statistics.total_instances_gpu_size = 0; #endif // ENABLE_GCODE_VIEWER_STATISTICS + glsafe(::glEnable(GL_DEPTH_TEST)); + render_shells(); + if (m_roles.empty()) return; - glsafe(::glEnable(GL_DEPTH_TEST)); render_toolpaths(); - render_shells(); float legend_height = 0.0f; if (!m_layers.empty()) { render_legend(legend_height); @@ -2226,6 +2224,8 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) void GCodeViewer::load_shells(const Print& print) { + m_shells.volumes.clear(); + if (print.objects().empty()) // no shells, return return; diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 32d0a91e34..7c387d59c4 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -838,6 +838,9 @@ public: bool is_legend_enabled() const { return m_legend_enabled; } void enable_legend(bool enable) { m_legend_enabled = enable; } + bool are_shells_visible() const { return m_shells.visible; } + void set_shells_visible(bool visible) { m_shells.visible = visible; } + void export_toolpaths_to_obj(const char* filename) const; void toggle_gcode_window_visibility() { m_sequential_view.gcode_window.toggle_visibility(); } @@ -849,9 +852,10 @@ public: const ConflictResultOpt& get_conflict_result() const { return m_conflict_result; } + void load_shells(const Print& print); + private: void load_toolpaths(const GCodeProcessorResult& gcode_result); - void load_shells(const Print& print); void render_toolpaths(); void render_shells(); void render_legend(float& legend_height); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index a5be3675d9..c161d67b90 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1913,7 +1913,7 @@ void GLCanvas3D::render() _render_bed_axes(); if (is_looking_downward) _render_bed(camera.get_view_matrix(), camera.get_projection_matrix(), false); - if (!m_main_toolbar.is_enabled()) + if (!m_main_toolbar.is_enabled() && current_printer_technology() != ptSLA) _render_gcode(); _render_objects(GLVolumeCollection::ERenderType::Transparent); @@ -2637,12 +2637,19 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re m_dirty = true; } +void GLCanvas3D::load_gcode_shells() +{ + m_gcode_viewer_shells_visible = m_gcode_viewer.are_shells_visible(); + m_gcode_viewer.load_shells(*this->fff_print()); + m_gcode_viewer.update_shells_color_by_extruder(m_config); + m_gcode_viewer.set_shells_visible(true); +} + void GLCanvas3D::load_gcode_preview(const GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors) { m_gcode_viewer.load(gcode_result, *this->fff_print()); if (wxGetApp().is_editor()) { - m_gcode_viewer.update_shells_color_by_extruder(m_config); _set_warning_notification_if_needed(EWarning::ToolpathOutside); _set_warning_notification_if_needed(EWarning::GCodeConflict); } @@ -2690,6 +2697,7 @@ void GLCanvas3D::load_preview(const std::vector& str_tool_colors, c for (const PrintObject* object : print->objects()) _load_print_object_toolpaths(*object, build_volume, str_tool_colors, color_print_values); + m_gcode_viewer.set_shells_visible(m_gcode_viewer_shells_visible); _set_warning_notification_if_needed(EWarning::ToolpathOutside); } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 8ec2260467..7890e96589 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -509,6 +509,7 @@ private: TriangleMesh m_wipe_tower_mesh; #endif // ENABLE_OPENGL_ES GCodeViewer m_gcode_viewer; + bool m_gcode_viewer_shells_visible{ true }; RenderTimer m_render_timer; @@ -829,6 +830,7 @@ public: void reload_scene(bool refresh_immediately, bool force_full_scene_refresh = false); + void load_gcode_shells(); void load_gcode_preview(const GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors); void refresh_gcode_preview_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last); void set_gcode_view_preview_type(GCodeViewer::EViewType type) { return m_gcode_viewer.set_view_type(type); } diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 74a8719d8e..c4f942406d 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -279,6 +279,11 @@ void Preview::set_drop_target(wxDropTarget* target) SetDropTarget(target); } +void Preview::load_gcode_shells() +{ + m_canvas->load_gcode_shells(); +} + void Preview::load_print(bool keep_z_range) { PrinterTechnology tech = m_process->current_printer_technology(); diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index c7b7fdc61d..7c5b111227 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -132,6 +132,7 @@ public: void select_view(const std::string& direction); void set_drop_target(wxDropTarget* target); + void load_gcode_shells(); void load_print(bool keep_z_range = false); void reload_print(bool keep_volumes = false); void refresh_print(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 7d137698cf..7d710849fc 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3991,6 +3991,7 @@ void Plater::priv::set_current_panel(wxPanel* panel) bool model_fits = view3D->get_canvas3d()->check_volumes_outside_state() != ModelInstancePVS_Partly_Outside; if (!model.objects.empty() && !export_in_progress && model_fits) { preview->get_canvas3d()->init_gcode_viewer(); + preview->load_gcode_shells(); q->reslice(); } // keeps current gcode preview, if any