diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 8c64997c1..8d2f1e096 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -575,17 +575,20 @@ void GCodeProcessor::apply_config(const DynamicPrintConfig& config) // ensure at least one (default) color is defined std::string default_color = "#FF8000"; m_result.extruder_colors = std::vector(1, default_color); + m_result.filament_colors = std::vector(1, default_color); const ConfigOptionStrings* extruder_colour = config.option("extruder_colour"); - if (extruder_colour != nullptr) { - // takes colors from config + const ConfigOptionStrings* filament_colour = config.option("filament_colour"); + // takes colors from config + if (extruder_colour != nullptr) m_result.extruder_colors = extruder_colour->values; - // try to replace missing values with filament colors - const ConfigOptionStrings* filament_colour = config.option("filament_colour"); - if (filament_colour != nullptr && filament_colour->values.size() == m_result.extruder_colors.size()) { - for (size_t i = 0; i < m_result.extruder_colors.size(); ++i) { - if (m_result.extruder_colors[i].empty()) - m_result.extruder_colors[i] = filament_colour->values[i]; - } + if (filament_colour != nullptr) + m_result.filament_colors = filament_colour->values; + + // try to replace missing values with filament colors + if (filament_colour != nullptr && filament_colour != nullptr && m_result.extruder_colors.size() == m_result.filament_colors.size()) { + for (size_t i = 0; i < m_result.extruder_colors.size(); ++i) { + if (m_result.extruder_colors[i].empty()) + m_result.extruder_colors[i] = m_result.filament_colors[i]; } } @@ -594,6 +597,10 @@ void GCodeProcessor::apply_config(const DynamicPrintConfig& config) if (m_result.extruder_colors[i].empty()) m_result.extruder_colors[i] = default_color; } + for (size_t i = 0; i < m_result.filament_colors.size(); ++i) { + if (m_result.filament_colors[i].empty()) + m_result.filament_colors[i] = default_color; + } m_extruder_colors.resize(m_result.extruder_colors.size()); for (size_t i = 0; i < m_result.extruder_colors.size(); ++i) { diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index c4e4aa1e9..0bf1656a2 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -265,6 +265,7 @@ namespace Slic3r { Pointfs bed_shape; std::string printer_settings_id; std::vector extruder_colors; + std::vector filament_colors; PrintEstimatedTimeStatistics time_statistics; #if ENABLE_GCODE_VIEWER_STATISTICS diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 87a404994..2483573da 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -368,6 +368,13 @@ void GCodeViewer::refresh(const GCodeProcessor::Result& gcode_result, const std: // update tool colors m_tool_colors = decode_colors(str_tool_colors); + if (m_view_type == EViewType::Filament && !gcode_result.filament_colors.empty()) + // update tool colors from config stored in the gcode + m_filament_colors = decode_colors(gcode_result.filament_colors); + else + // update tool colors + m_filament_colors = decode_colors(str_tool_colors); + // update ranges for coloring / legend m_extrusions.reset_ranges(); for (size_t i = 0; i < m_moves_count; ++i) { @@ -421,6 +428,7 @@ void GCodeViewer::reset() m_paths_bounding_box = BoundingBoxf3(); m_max_bounding_box = BoundingBoxf3(); m_tool_colors = std::vector(); + m_filament_colors = std::vector(); m_extruder_ids = std::vector(); m_extrusions.reset_role_visibility_flags(); m_extrusions.reset_ranges(); @@ -1677,7 +1685,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool case EViewType::Chronology: { color = m_extrusions.ranges.elapsed_time.get_color_at(path.elapsed_time); break; } case EViewType::VolumetricRate: { color = m_extrusions.ranges.volumetric_rate.get_color_at(path.volumetric_rate); break; } case EViewType::Tool: { color = m_tool_colors[path.extruder_id]; break; } - case EViewType::Filament: { color = m_tool_colors[path.extruder_id]; break; } + case EViewType::Filament: { color = m_filament_colors[path.extruder_id]; break; } case EViewType::ColorPrint: { color = m_tool_colors[path.cp_color_id]; break; } case EViewType::ExtruderTemp: { color = m_extrusions.ranges.extruder_temp.get_color_at(path.extruder_temp); break; } default: { color = { 1.0f, 1.0f, 1.0f }; break; } @@ -2345,7 +2353,6 @@ void GCodeViewer::render_legend() const case EViewType::Chronology: { append_range(m_extrusions.ranges.elapsed_time, 0); break; } case EViewType::VolumetricRate: { append_range(m_extrusions.ranges.volumetric_rate, 3); break; } case EViewType::Tool: - case EViewType::Filament: { // shows only extruders actually used for (unsigned char i : m_extruder_ids) { @@ -2353,6 +2360,14 @@ void GCodeViewer::render_legend() const } break; } + case EViewType::Filament: + { + // shows only filament actually used + for (unsigned char i : m_extruder_ids) { + append_item(EItemType::Rect, m_filament_colors[i], _u8L("Filament") + " " + std::to_string(i + 1)); + } + break; + } case EViewType::ColorPrint: { const std::vector& custom_gcode_per_print_z = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes; diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 34d1e3aab..4223755bd 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -415,6 +415,7 @@ private: // bounding box of toolpaths + marker tools BoundingBoxf3 m_max_bounding_box; std::vector m_tool_colors; + std::vector m_filament_colors; std::vector m_layers_zs; std::array m_layers_z_range; std::vector m_roles; diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 4cf2848d6..ddad7eb4c 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -1368,7 +1368,7 @@ 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::Filament) + else if (gcode_view_type == GCodeViewer::EViewType::Filament) #else else if (m_gcode_preview_data->extrusion.view_type == GCodePreviewData::Extrusion::Filament) #endif // ENABLE_GCODE_VIEWER