diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 4b6f9a20d0..e79c0d4652 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -508,6 +508,7 @@ void GCodeProcessor::apply_config(const PrintConfig& config) m_flavor = config.gcode_flavor; size_t extruders_count = config.nozzle_diameter.values.size(); + m_result.extruders_count = extruders_count; m_extruder_offsets.resize(extruders_count); for (size_t i = 0; i < extruders_count; ++i) { @@ -580,6 +581,8 @@ void GCodeProcessor::apply_config(const DynamicPrintConfig& config) } } + m_result.extruders_count = config.option("nozzle_diameter")->values.size(); + const ConfigOptionPoints* extruder_offset = config.option("extruder_offset"); if (extruder_offset != nullptr) { m_extruder_offsets.resize(extruder_offset->values.size()); diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 5274e2fb99..8c0ddd988f 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -283,6 +283,7 @@ namespace Slic3r { std::vector moves; Pointfs bed_shape; SettingsIds settings_ids; + size_t extruders_count; std::vector extruder_colors; PrintEstimatedTimeStatistics time_statistics; @@ -294,6 +295,7 @@ namespace Slic3r { moves = std::vector(); bed_shape = Pointfs(); extruder_colors = std::vector(); + extruders_count = 0; settings_ids.reset(); } #else @@ -302,6 +304,7 @@ namespace Slic3r { moves = std::vector(); bed_shape = Pointfs(); extruder_colors = std::vector(); + extruders_count = 0; settings_ids.reset(); } #endif // ENABLE_GCODE_VIEWER_STATISTICS diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index ce73d9f837..5dd728284a 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -420,6 +420,7 @@ void GCodeViewer::reset() m_paths_bounding_box = BoundingBoxf3(); m_max_bounding_box = BoundingBoxf3(); m_tool_colors = std::vector(); + m_extruders_count = 0; m_extruder_ids = std::vector(); m_extrusions.reset_role_visibility_flags(); m_extrusions.reset_ranges(); @@ -967,6 +968,8 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) new wxProgressDialog(_L("Generating toolpaths"), "...", 100, wxGetApp().plater(), wxPD_AUTO_HIDE | wxPD_APP_MODAL) : nullptr; + m_extruders_count = gcode_result.extruders_count; + for (size_t i = 0; i < m_moves_count; ++i) { const GCodeProcessor::MoveVertex& move = gcode_result.moves[i]; if (wxGetApp().is_gcode_viewer()) @@ -2318,8 +2321,7 @@ void GCodeViewer::render_legend() const case EViewType::ColorPrint: { const std::vector& custom_gcode_per_print_z = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes; - const int extruders_count = wxGetApp().extruders_edited_cnt(); - if (extruders_count == 1) { // single extruder use case + if (m_extruders_count == 1) { // single extruder use case std::vector>> cp_values = color_print_ranges(0, custom_gcode_per_print_z); const int items_cnt = static_cast(cp_values.size()); if (items_cnt == 0) { // There are no color changes, but there are some pause print or custom Gcode diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 24be077d39..fb805da4ac 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -399,6 +399,7 @@ private: std::vector m_layers_zs; std::array m_layers_z_range; std::vector m_roles; + size_t m_extruders_count; std::vector m_extruder_ids; mutable Extrusions m_extrusions; mutable SequentialView m_sequential_view; diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 3f74757130..1b7fc79c63 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -1292,13 +1292,12 @@ void Preview::load_print_as_fff(bool keep_z_range) // set color print values, if it si selected "ColorPrint" view type #if ENABLE_GCODE_VIEWER if (gcode_view_type == GCodeViewer::EViewType::ColorPrint) { + colors = wxGetApp().plater()->get_colors_for_color_print(m_gcode_result); #else if (m_gcode_preview_data->extrusion.view_type == GCodePreviewData::Extrusion::ColorPrint) { -#endif // ENABLE_GCODE_VIEWER colors = wxGetApp().plater()->get_colors_for_color_print(); -#if !ENABLE_GCODE_VIEWER colors.push_back("#808080"); // gray color for pause print or custom G-code -#endif // !ENABLE_GCODE_VIEWER +#endif // ENABLE_GCODE_VIEWER if (!gcode_preview_data_valid) { color_print_values = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes; @@ -1309,10 +1308,11 @@ void Preview::load_print_as_fff(bool keep_z_range) } #if ENABLE_GCODE_VIEWER else if (gcode_preview_data_valid || gcode_view_type == GCodeViewer::EViewType::Tool) { + colors = wxGetApp().plater()->get_extruder_colors_from_plater_config(m_gcode_result); #else else if (gcode_preview_data_valid || (m_gcode_preview_data->extrusion.view_type == GCodePreviewData::Extrusion::Tool) ) { -#endif // ENABLE_GCODE_VIEWER colors = wxGetApp().plater()->get_extruder_colors_from_plater_config(); +#endif // ENABLE_GCODE_VIEWER color_print_values.clear(); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index f461b6d4e4..6b7b2214c8 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -32,11 +32,9 @@ #include "libslic3r/Format/STL.hpp" #include "libslic3r/Format/AMF.hpp" #include "libslic3r/Format/3mf.hpp" -#if ENABLE_GCODE_VIEWER -#include "libslic3r/GCode/GCodeProcessor.hpp" -#else +#if !ENABLE_GCODE_VIEWER #include "libslic3r/GCode/PreviewData.hpp" -#endif // ENABLE_GCODE_VIEWER +#endif // !ENABLE_GCODE_VIEWER #include "libslic3r/GCode/ThumbnailData.hpp" #include "libslic3r/Model.hpp" #include "libslic3r/SLA/Hollowing.hpp" @@ -5632,31 +5630,49 @@ void Plater::on_activate() } // Get vector of extruder colors considering filament color, if extruder color is undefined. +#if ENABLE_GCODE_VIEWER +std::vector Plater::get_extruder_colors_from_plater_config(const GCodeProcessor::Result* const result) const +#else std::vector Plater::get_extruder_colors_from_plater_config() const +#endif // ENABLE_GCODE_VIEWER { - const Slic3r::DynamicPrintConfig* config = &wxGetApp().preset_bundle->printers.get_edited_preset().config; - std::vector extruder_colors; - if (!config->has("extruder_colour")) // in case of a SLA print +#if ENABLE_GCODE_VIEWER + if (wxGetApp().is_gcode_viewer() && result != nullptr) + return result->extruder_colors; + else { +#endif // ENABLE_GCODE_VIEWER + const Slic3r::DynamicPrintConfig* config = &wxGetApp().preset_bundle->printers.get_edited_preset().config; + std::vector extruder_colors; + if (!config->has("extruder_colour")) // in case of a SLA print + return extruder_colors; + + extruder_colors = (config->option("extruder_colour"))->values; + if (!wxGetApp().plater()) + return extruder_colors; + + const std::vector& filament_colours = (p->config->option("filament_colour"))->values; + for (size_t i = 0; i < extruder_colors.size(); ++i) + if (extruder_colors[i] == "" && i < filament_colours.size()) + extruder_colors[i] = filament_colours[i]; + return extruder_colors; - - extruder_colors = (config->option("extruder_colour"))->values; - if (!wxGetApp().plater()) - return extruder_colors; - - const std::vector& filament_colours = (p->config->option("filament_colour"))->values; - for (size_t i = 0; i < extruder_colors.size(); ++i) - if (extruder_colors[i] == "" && i < filament_colours.size()) - extruder_colors[i] = filament_colours[i]; - - return extruder_colors; +#if ENABLE_GCODE_VIEWER + } +#endif // ENABLE_GCODE_VIEWER } /* Get vector of colors used for rendering of a Preview scene in "Color print" mode * It consists of extruder colors and colors, saved in model.custom_gcode_per_print_z */ +#if ENABLE_GCODE_VIEWER +std::vector Plater::get_colors_for_color_print(const GCodeProcessor::Result* const result) const +{ + std::vector colors = get_extruder_colors_from_plater_config(result); +#else std::vector Plater::get_colors_for_color_print() const { std::vector colors = get_extruder_colors_from_plater_config(); +#endif // ENABLE_GCODE_VIEWER colors.reserve(colors.size() + p->model.custom_gcode_per_print_z.gcodes.size()); for (const CustomGCode::Item& code : p->model.custom_gcode_per_print_z.gcodes) diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 42a22ae804..b40548bde8 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -11,6 +11,9 @@ #include "libslic3r/Preset.hpp" #include "libslic3r/BoundingBox.hpp" +#if ENABLE_GCODE_VIEWER +#include "libslic3r/GCode/GCodeProcessor.hpp" +#endif // ENABLE_GCODE_VIEWER #include "Jobs/Job.hpp" #include "Search.hpp" @@ -233,8 +236,13 @@ public: void force_print_bed_update(); // On activating the parent window. void on_activate(); +#if ENABLE_GCODE_VIEWER + std::vector get_extruder_colors_from_plater_config(const GCodeProcessor::Result* const result = nullptr) const; + std::vector get_colors_for_color_print(const GCodeProcessor::Result* const result = nullptr) const; +#else std::vector get_extruder_colors_from_plater_config() const; std::vector get_colors_for_color_print() const; +#endif // ENABLE_GCODE_VIEWER void update_object_menu(); void show_action_buttons(const bool is_ready_to_slice) const;