From b9697d46cfb58315fd202071e71f7da5978644aa Mon Sep 17 00:00:00 2001 From: supermerill Date: Wed, 5 Jun 2024 14:12:12 +0200 Subject: [PATCH] Fix Slider refresh data was sending gcode data when refreshing for a preview. --- src/slic3r/GUI/GUI_Preview.cpp | 71 +++++++++++++++------------------- src/slic3r/GUI/GUI_Preview.hpp | 2 +- 2 files changed, 33 insertions(+), 40 deletions(-) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 9c492156c92..bb6d65c0886 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -686,7 +686,7 @@ void Preview::check_layers_slider_values(std::vector& ticks_f m_schedule_background_process(); } -void Preview::update_layers_slider(const std::vector& layers_z, bool keep_z_range) +void Preview::update_layers_slider(const std::vector& layers_z, bool show_gcode_data, bool keep_z_range) { //lock rendering while updating { @@ -708,7 +708,7 @@ void Preview::update_layers_slider(const std::vector& layers_z, bool kee // Detect and set manipulation mode for double slider update_layers_slider_mode(); - + Plater* plater = wxGetApp().plater(); CustomGCode::Info ticks_info_from_model = plater->model().custom_gcode_per_print_z; if (wxGetApp().is_editor()) @@ -742,46 +742,36 @@ void Preview::update_layers_slider(const std::vector& layers_z, bool kee } m_layers_slider->SetSelectionSpan(idx_low, idx_high); m_layers_slider->SetTicksValues(ticks_info_from_model); - - bool sla_print_technology = plater->printer_technology() == ptSLA; + bool sequential_print = wxGetApp().preset_bundle->fff_prints.get_edited_preset().config.opt_bool("complete_objects"); + bool sla_print_technology = plater->printer_technology() == ptSLA; m_layers_slider->SetDrawMode(sla_print_technology, sequential_print); - if (sla_print_technology) - m_layers_slider->SetLayersTimes(plater->sla_print().print_statistics().layers_times); - else { - if (plater->fff_print().print_statistics().is_computing_gcode || !plater->fff_print().finished()) { - //do not fetch uncomplete data - m_layers_slider->SetLayersTimes({}, 0); + if (show_gcode_data) { + if (sla_print_technology) { + m_layers_slider->SetLayersTimes(plater->sla_print().print_statistics().layers_times); } else { - auto print_mode_stat = m_gcode_result->print_statistics.modes.front(); - m_layers_slider->SetLayersTimes(print_mode_stat.layers_times, print_mode_stat.time); + if (plater->fff_print().print_statistics().is_computing_gcode || !plater->fff_print().finished()) { + // do not fetch uncomplete data + m_layers_slider->SetLayersTimes({}, 0); + } else { + auto print_mode_stat = m_gcode_result->print_statistics.modes.front(); + m_layers_slider->SetLayersTimes(print_mode_stat.layers_times, print_mode_stat.time); + } } - } // create area array - //area not computed for sla_print_technology //TODO - if (!sla_print_technology){ - if (plater->fff_print().print_statistics().is_computing_gcode || !plater->fff_print().finished()) { - //do not fetch uncomplete data - m_layers_slider->SetLayersAreas({}); - } else { - const std::vector> &layerz_to_area = plater->fff_print().print_statistics().layer_area_stats; - std::vector areas; - for(auto [z, area] : layerz_to_area) - areas.push_back(area); - m_layers_slider->SetLayersAreas(areas); - assert(areas.size() == m_gcode_result->print_statistics.modes.front().layers_times.size()); - //auto objects = plater->fff_print().objects(); - //for (auto object : objects) { - // for (auto layer : object->layers()) { - // assert(layer->print_z > 100); - // coord_t layer_z = 100*(coord_t(layer->print_z + 50)/100); - // int32_t area = layerz_to_area[layer_z]; - // for (auto poly : layer->lslices) { - // area += poly.area(); - // } - // layerz_to_area[layer_z] = area; - // } - //} + // area not computed for sla_print_technology //TODO + if (!sla_print_technology) { + if (plater->fff_print().print_statistics().is_computing_gcode || !plater->fff_print().finished()) { + // do not fetch uncomplete data + m_layers_slider->SetLayersAreas({}); + } else { + const std::vector> &layerz_to_area = + plater->fff_print().print_statistics().layer_area_stats; + std::vector areas; + for (auto [z, area] : layerz_to_area) areas.push_back(area); + m_layers_slider->SetLayersAreas(areas); + assert(areas.size() == m_gcode_result->print_statistics.modes.front().layers_times.size()); + } } } @@ -1066,6 +1056,7 @@ void Preview::load_print_as_fff(bool keep_z_range) m_canvas->set_items_show(true, true); m_canvas->set_selected_extruder(0); + bool gcode_not_extrusions = false; if (current_force_state == ForceState::ForceGcode || (gcode_preview_data_valid && current_force_state != ForceState::ForceExtrusions)) { // Load the real G-code preview. if (current_force_state == ForceState::NoForce) @@ -1077,6 +1068,7 @@ void Preview::load_print_as_fff(bool keep_z_range) Refresh(); zs = m_canvas->get_gcode_layers_zs(); m_loaded = true; + gcode_not_extrusions = true; } else if (wxGetApp().is_editor()) { // Load the initial preview based on slices, not the final G-code. @@ -1087,6 +1079,7 @@ void Preview::load_print_as_fff(bool keep_z_range) m_left_sizer->Layout(); Refresh(); zs = m_canvas->get_volumes_print_zs(true); + gcode_not_extrusions = false; } if (!zs.empty() && !m_keep_current_preview_type) { @@ -1116,7 +1109,7 @@ void Preview::load_print_as_fff(bool keep_z_range) hide_layers_slider(); m_canvas_widget->Refresh(); } else { - update_layers_slider(zs, keep_z_range); + update_layers_slider(zs, gcode_not_extrusions, keep_z_range); } } } @@ -1163,7 +1156,7 @@ void Preview::load_print_as_sla() Refresh(); if (n_layers > 0) - update_layers_slider(zs); + update_layers_slider(zs, true); m_loaded = true; } diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 3bc93bb9aee..f9535f0aadb 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -214,7 +214,7 @@ Preview(wxWindow* parent, Bed3D& bed, Model* model, DynamicPrintConfig* config, void check_layers_slider_values(std::vector& ticks_from_model, const std::vector& layers_z); void reset_layers_slider(); - void update_layers_slider(const std::vector& layers_z, bool keep_z_range = false); + void update_layers_slider(const std::vector& layers_z, bool show_gcode_data = false, bool keep_z_range = false); void update_layers_slider_mode(); // update vertical DoubleSlider after keyDown in canvas void update_layers_slider_from_canvas(wxKeyEvent& event);