From 6529f28f26105d1b939e590e7451c7d64c84e5e4 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 23 Jan 2024 10:11:50 +0100 Subject: [PATCH] New gcode visualization library - Separation of tool colors and color changes colors to simplify client code --- src/libvgcode/include/GCodeInputData.hpp | 9 ++ src/libvgcode/include/Viewer.hpp | 15 +++ src/libvgcode/src/Viewer.cpp | 15 +++ src/libvgcode/src/ViewerImpl.cpp | 11 ++- src/libvgcode/src/ViewerImpl.hpp | 5 + src/slic3r/GUI/GCodeViewer.cpp | 57 ++++------- src/slic3r/GUI/GCodeViewer.hpp | 7 +- src/slic3r/GUI/GLCanvas3D.cpp | 20 ++-- src/slic3r/GUI/GLCanvas3D.hpp | 12 ++- src/slic3r/GUI/GUI_Preview.cpp | 56 ++++++----- src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.cpp | 97 +++++++++++++------ src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.hpp | 10 +- 12 files changed, 212 insertions(+), 102 deletions(-) diff --git a/src/libvgcode/include/GCodeInputData.hpp b/src/libvgcode/include/GCodeInputData.hpp index a98484937f..576f93e26a 100644 --- a/src/libvgcode/include/GCodeInputData.hpp +++ b/src/libvgcode/include/GCodeInputData.hpp @@ -5,6 +5,7 @@ #ifndef VGCODE_GCODEINPUTDATA_HPP #define VGCODE_GCODEINPUTDATA_HPP +#include "Types.hpp" #include "PathVertex.hpp" namespace libvgcode { @@ -21,6 +22,14 @@ struct GCodeInputData // See: PathVertex // std::vector vertices; + // + // Palette for extruders colors + // + Palette tools_colors; + // + // Palette for color print colors + // + Palette color_print_colors; }; } // namespace libvgcode diff --git a/src/libvgcode/include/Viewer.hpp b/src/libvgcode/include/Viewer.hpp index 17c2ab666e..83d9eab49d 100644 --- a/src/libvgcode/include/Viewer.hpp +++ b/src/libvgcode/include/Viewer.hpp @@ -146,6 +146,21 @@ public: // void set_tool_colors(const Palette& colors); // + // Return the count of colors in the palette used to render + // the toolpaths when the view type is EViewType::ColorPrint. + // + size_t get_color_print_colors_count() const; + // + // Return the palette used to render the toolpaths when + // the view type is EViewType::ColorPrint. + // + const Palette& get_color_print_colors() const; + // + // Set the palette used to render the toolpaths when + // the view type is EViewType::ColorPrint with the given one. + // + void set_color_print_colors(const Palette& colors); + // // Get the color range for the given view type. // Valid view types are: // EViewType::Height diff --git a/src/libvgcode/src/Viewer.cpp b/src/libvgcode/src/Viewer.cpp index 3436355988..658925aaf5 100644 --- a/src/libvgcode/src/Viewer.cpp +++ b/src/libvgcode/src/Viewer.cpp @@ -137,6 +137,21 @@ void Viewer::set_tool_colors(const Palette& colors) m_impl->set_tool_colors(colors); } +size_t Viewer::get_color_print_colors_count() const +{ + return m_impl->get_color_print_colors_count(); +} + +const Palette& Viewer::get_color_print_colors() const +{ + return m_impl->get_color_print_colors(); +} + +void Viewer::set_color_print_colors(const Palette& colors) +{ + m_impl->set_color_print_colors(colors); +} + const ColorRange& Viewer::get_color_range(EViewType type) const { return m_impl->get_color_range(type); diff --git a/src/libvgcode/src/ViewerImpl.cpp b/src/libvgcode/src/ViewerImpl.cpp index 554ee137c7..e8bf78a80f 100644 --- a/src/libvgcode/src/ViewerImpl.cpp +++ b/src/libvgcode/src/ViewerImpl.cpp @@ -482,6 +482,9 @@ void ViewerImpl::load(GCodeInputData&& gcode_data) m_loading = true; m_vertices = std::move(gcode_data.vertices); + m_tool_colors = std::move(gcode_data.tools_colors); + m_color_print_colors = std::move(gcode_data.color_print_colors); + m_settings.spiral_vase_mode = gcode_data.spiral_vase_mode; std::array times{ 0.0f, 0.0f }; @@ -983,7 +986,7 @@ Color ViewerImpl::get_vertex_color(const PathVertex& v) const case EViewType::ColorPrint: { return m_layers.layer_contains_colorprint_options(static_cast(v.layer_id)) ? DUMMY_COLOR : - m_tool_colors[static_cast(v.color_id) % m_tool_colors.size()]; + m_color_print_colors[static_cast(v.color_id) % m_color_print_colors.size()]; } default: { break; } } @@ -997,6 +1000,12 @@ void ViewerImpl::set_tool_colors(const Palette& colors) m_settings.update_colors = true; } +void ViewerImpl::set_color_print_colors(const Palette& colors) +{ + m_color_print_colors = colors; + m_settings.update_colors = true; +} + const Color& ViewerImpl::get_extrusion_role_color(EGCodeExtrusionRole role) const { const auto it = m_extrusion_roles_colors.find(role); diff --git a/src/libvgcode/src/ViewerImpl.hpp b/src/libvgcode/src/ViewerImpl.hpp index 24c81e93ba..f1d2d751fb 100644 --- a/src/libvgcode/src/ViewerImpl.hpp +++ b/src/libvgcode/src/ViewerImpl.hpp @@ -143,6 +143,10 @@ public: const Palette& get_tool_colors() const { return m_tool_colors; } void set_tool_colors(const Palette& colors); + size_t get_color_print_colors_count() const { return m_color_print_colors.size(); } + const Palette& get_color_print_colors() const { return m_color_print_colors; } + void set_color_print_colors(const Palette& colors); + const Color& get_extrusion_role_color(EGCodeExtrusionRole role) const; void set_extrusion_role_color(EGCodeExtrusionRole role, const Color& color); void reset_default_extrusion_roles_colors(); @@ -278,6 +282,7 @@ private: ColorRange(EColorRangeType::Linear), ColorRange(EColorRangeType::Logarithmic) }; Palette m_tool_colors; + Palette m_color_print_colors; // // OpenGL shaders ids // diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 0f403c78d9..cac423c55b 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1110,37 +1110,33 @@ void GCodeViewer::init() } #if ENABLE_NEW_GCODE_VIEWER -void GCodeViewer::load_as_gcode(const GCodeProcessorResult& gcode_result, const Print& print, const std::vector& str_tool_colors) +void GCodeViewer::load_as_gcode(const GCodeProcessorResult& gcode_result, const Print& print, const std::vector& str_tool_colors, + const std::vector& str_color_print_colors) { const bool current_top_layer_only = m_viewer.is_top_layer_only_view_range(); const bool required_top_layer_only = get_app_config()->get_bool("seq_top_layer_only"); if (current_top_layer_only != required_top_layer_only) m_viewer.toggle_top_layer_only_view_range(); - std::vector tool_colors; - if (m_viewer.get_view_type() == libvgcode::EViewType::Tool && !gcode_result.extruder_colors.empty()) - // update tool colors from config stored in the gcode - decode_colors(gcode_result.extruder_colors, tool_colors); - else - // update tool colors - decode_colors(str_tool_colors, tool_colors); - - // ensure there are enough colors defined - const ColorRGBA default_color = { 1.0f, 0.5f, 0.0f, 1.0f }; // "#FF8000" - while (tool_colors.size() < std::max(1, gcode_result.extruders_count)) { - tool_colors.push_back(default_color); - } - - std::vector colors; - colors.reserve(tool_colors.size()); - for (const ColorRGBA& color : tool_colors) { - colors.emplace_back(libvgcode::convert(color)); - } - m_viewer.set_tool_colors(colors); - // avoid processing if called with the same gcode_result - if (m_last_result_id == gcode_result.id) + if (m_last_result_id == gcode_result.id && wxGetApp().is_editor()) { + // collect tool colors + libvgcode::Palette tools_colors; + tools_colors.reserve(str_tool_colors.size()); + for (const std::string& color : str_tool_colors) { + tools_colors.emplace_back(libvgcode::convert(color)); + } + m_viewer.set_tool_colors(tools_colors); + + // collect color print colors + libvgcode::Palette color_print_colors; + color_print_colors.reserve(str_color_print_colors.size()); + for (const std::string& color : str_color_print_colors) { + color_print_colors.emplace_back(libvgcode::convert(color)); + } + m_viewer.set_color_print_colors(color_print_colors); return; + } m_last_result_id = gcode_result.id; @@ -1148,7 +1144,7 @@ void GCodeViewer::load_as_gcode(const GCodeProcessorResult& gcode_result, const reset(); // convert data from PrusaSlicer format to libvgcode format - libvgcode::GCodeInputData data = libvgcode::convert(gcode_result, m_viewer.get_travels_radius(), m_viewer.get_wipes_radius()); + libvgcode::GCodeInputData data = libvgcode::convert(gcode_result, str_tool_colors, str_color_print_colors, m_viewer); // send data to the viewer m_viewer.reset_default_extrusion_roles_colors(); @@ -1291,19 +1287,8 @@ void GCodeViewer::load(const GCodeProcessorResult& gcode_result, const Print & p } #if ENABLE_NEW_GCODE_VIEWER -void GCodeViewer::load_as_preview(libvgcode::GCodeInputData&& data, const std::vector& str_tool_colors) +void GCodeViewer::load_as_preview(libvgcode::GCodeInputData&& data) { - if (!str_tool_colors.empty()) { - std::vector tool_colors; - decode_colors(str_tool_colors, tool_colors); - std::vector colors; - colors.reserve(tool_colors.size()); - for (const ColorRGBA& color : tool_colors) { - colors.emplace_back(libvgcode::convert(color)); - } - m_viewer.set_tool_colors(colors); - } - m_viewer.set_extrusion_role_color(libvgcode::EGCodeExtrusionRole::Skirt, { 127, 255, 127 }); m_viewer.set_extrusion_role_color(libvgcode::EGCodeExtrusionRole::ExternalPerimeter, { 255, 255, 0 }); m_viewer.set_extrusion_role_color(libvgcode::EGCodeExtrusionRole::SupportMaterial, { 127, 255, 127 }); diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 60b40b3129..f0fe05b232 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -913,8 +913,9 @@ public: // extract rendering data from the given parameters #if ENABLE_NEW_GCODE_VIEWER - void load_as_gcode(const GCodeProcessorResult& gcode_result, const Print& print, const std::vector& str_tool_colors); - void load_as_preview(libvgcode::GCodeInputData&& data, const std::vector& str_tool_colors); + void load_as_gcode(const GCodeProcessorResult& gcode_result, const Print& print, const std::vector& str_tool_colors, + const std::vector& str_color_print_colors); + void load_as_preview(libvgcode::GCodeInputData&& data); #else void load(const GCodeProcessorResult& gcode_result, const Print& print); // recalculate ranges in dependence of what is visible and sets tool/print colors @@ -1024,7 +1025,9 @@ public: void toggle_gcode_window_visibility() { m_sequential_view.gcode_window.toggle_visibility(); } +#if !ENABLE_NEW_GCODE_VIEWER std::vector& get_custom_gcode_per_print_z() { return m_custom_gcode_per_print_z; } +#endif // !ENABLE_NEW_GCODE_VIEWER size_t get_extruders_count() { return m_extruders_count; } void invalidate_legend() { m_legend_resizer.reset(); } diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e9aaee3e93..2bb1bf060b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2687,19 +2687,21 @@ void GLCanvas3D::load_gcode_shells() m_gcode_viewer.set_force_shells_visible(true); } -void GLCanvas3D::load_gcode_preview(const GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors) -{ #if ENABLE_NEW_GCODE_VIEWER +void GLCanvas3D::load_gcode_preview(const GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors, + const std::vector& str_color_print_colors) +{ m_gcode_viewer.enable_legend(true); m_gcode_viewer.enable_view_type_cache_write(true); m_gcode_viewer.enable_view_type_cache_load(true); m_gcode_viewer.set_view_type(m_gcode_viewer.get_view_type()); - m_gcode_viewer.load_as_gcode(gcode_result, *this->fff_print(), str_tool_colors); + m_gcode_viewer.load_as_gcode(gcode_result, *this->fff_print(), str_tool_colors, str_color_print_colors); m_gcode_layers_times_cache = m_gcode_viewer.get_layers_times(); #else +void GLCanvas3D::load_gcode_preview(const GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors) +{ m_gcode_viewer.load(gcode_result, *this->fff_print()); #endif // ENABLE_NEW_GCODE_VIEWER - if (wxGetApp().is_editor()) { _set_warning_notification_if_needed(EWarning::ToolpathOutside); _set_warning_notification_if_needed(EWarning::GCodeConflict); @@ -2735,7 +2737,12 @@ void GLCanvas3D::load_sla_preview() } } +#if ENABLE_NEW_GCODE_VIEWER +void GLCanvas3D::load_preview(const std::vector& str_tool_colors, const std::vector& str_color_print_colors, + const std::vector& color_print_values) +#else void GLCanvas3D::load_preview(const std::vector& str_tool_colors, const std::vector& color_print_values) +#endif // ENABLE_NEW_GCODE_VIEWER { const Print *print = this->fff_print(); if (print == nullptr) @@ -2744,14 +2751,15 @@ void GLCanvas3D::load_preview(const std::vector& str_tool_colors, c _set_current(); #if ENABLE_NEW_GCODE_VIEWER - libvgcode::GCodeInputData data = libvgcode::convert(*print, str_tool_colors, color_print_values, static_cast(wxGetApp().extruders_edited_cnt())); + libvgcode::GCodeInputData data = libvgcode::convert(*print, str_tool_colors, str_color_print_colors, color_print_values, + static_cast(wxGetApp().extruders_edited_cnt())); // send data to the viewer m_gcode_viewer.enable_legend(false); m_gcode_viewer.enable_view_type_cache_write(false); m_gcode_viewer.enable_view_type_cache_load(false); m_gcode_viewer.set_view_type(libvgcode::EViewType::FeatureType); - m_gcode_viewer.load_as_preview(std::move(data), str_tool_colors); + m_gcode_viewer.load_as_preview(std::move(data)); #else // Release OpenGL data before generating new data. this->reset_volumes(); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 617e789415..76c312960f 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -857,7 +857,9 @@ public: #endif // ENABLE_NEW_GCODE_VIEWER void set_volumes_z_range(const std::array& range); void set_toolpaths_z_range(const std::array& range); +#if !ENABLE_NEW_GCODE_VIEWER std::vector& get_custom_gcode_per_print_z() { return m_gcode_viewer.get_custom_gcode_per_print_z(); } +#endif // !ENABLE_NEW_GCODE_VIEWER size_t get_gcode_extruders_count() { return m_gcode_viewer.get_extruders_count(); } std::vector load_object(const ModelObject& model_object, int obj_idx, std::vector instance_idxs); @@ -868,21 +870,27 @@ 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); #if ENABLE_NEW_GCODE_VIEWER + void load_gcode_preview(const GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors, + const std::vector& str_color_print_colors); void set_gcode_view_type(libvgcode::EViewType type) { return m_gcode_viewer.set_view_type(type); } libvgcode::EViewType get_gcode_view_type() const { return m_gcode_viewer.get_view_type(); } void enable_gcode_view_type_cache_load(bool enable) { m_gcode_viewer.enable_view_type_cache_load(enable); } void enable_gcode_view_type_cache_write(bool enable) { m_gcode_viewer.enable_view_type_cache_write(enable); } bool is_gcode_view_type_cache_load_enabled() const { return m_gcode_viewer.is_view_type_cache_load_enabled(); } bool is_gcode_view_type_cache_write_enabled() const { return m_gcode_viewer.is_view_type_cache_write_enabled(); } + + void load_preview(const std::vector& str_tool_colors, const std::vector& str_color_print_colors, + const std::vector& color_print_values); #else + 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); } GCodeViewer::EViewType get_gcode_view_preview_type() const { return m_gcode_viewer.get_view_type(); } + + void load_preview(const std::vector& str_tool_colors, const std::vector& color_print_values); #endif // ENABLE_NEW_GCODE_VIEWER void load_sla_preview(); - void load_preview(const std::vector& str_tool_colors, const std::vector& color_print_values); void bind_event_handlers(); void unbind_event_handlers(); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index e205ca6a2e..c392942666 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -526,7 +526,11 @@ void Preview::update_layers_slider(const std::vector& layers_z, bool kee ticks_info_from_model = plater->model().custom_gcode_per_print_z; else { ticks_info_from_model.mode = CustomGCode::Mode::SingleExtruder; +#if ENABLE_NEW_GCODE_VIEWER + ticks_info_from_model.gcodes = m_gcode_result->custom_gcode_per_print_z; +#else ticks_info_from_model.gcodes = m_canvas->get_custom_gcode_per_print_z(); +#endif // ENABLE_NEW_GCODE_VIEWER } check_layers_slider_values(ticks_info_from_model.gcodes, layers_z); @@ -874,20 +878,23 @@ void Preview::load_print_as_fff(bool keep_z_range) libvgcode::EViewType gcode_view_type = m_canvas->get_gcode_view_type(); const bool gcode_preview_data_valid = !m_gcode_result->moves.empty(); const bool is_pregcode_preview = !gcode_preview_data_valid && wxGetApp().is_editor(); + + const std::vector tool_colors = wxGetApp().plater()->get_extruder_colors_from_plater_config(m_gcode_result); + const std::vector& color_print_values = wxGetApp().is_editor() ? + wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes : m_gcode_result->custom_gcode_per_print_z; + std::vector color_print_colors; + if (!color_print_values.empty()) { + color_print_colors = wxGetApp().plater()->get_colors_for_color_print(m_gcode_result); + color_print_colors.push_back("#808080"); // gray color for pause print or custom G-code + } #else GCodeViewer::EViewType gcode_view_type = m_canvas->get_gcode_view_preview_type(); const bool gcode_preview_data_valid = !m_gcode_result->moves.empty(); -#endif // ENABLE_NEW_GCODE_VIEWER // Collect colors per extruder. std::vector colors; std::vector color_print_values = {}; - // set color print values, if it is selected "ColorPrint" view type -#if ENABLE_NEW_GCODE_VIEWER - if (gcode_view_type == libvgcode::EViewType::ColorPrint || is_pregcode_preview) { -#else if (gcode_view_type == GCodeViewer::EViewType::ColorPrint) { -#endif // ENABLE_NEW_GCODE_VIEWER colors = wxGetApp().plater()->get_colors_for_color_print(m_gcode_result); if (!gcode_preview_data_valid) { @@ -898,25 +905,25 @@ void Preview::load_print_as_fff(bool keep_z_range) colors.push_back("#808080"); // gray color for pause print or custom G-code } } -#if ENABLE_NEW_GCODE_VIEWER - else if (gcode_preview_data_valid || gcode_view_type == libvgcode::EViewType::Tool) { -#else else if (gcode_preview_data_valid || gcode_view_type == GCodeViewer::EViewType::Tool) { -#endif // ENABLE_NEW_GCODE_VIEWER colors = wxGetApp().plater()->get_extruder_colors_from_plater_config(m_gcode_result); color_print_values.clear(); } +#endif // ENABLE_NEW_GCODE_VIEWER std::vector zs; if (IsShown()) { m_canvas->set_selected_extruder(0); if (gcode_preview_data_valid) { - // Load the real G-code preview. - m_canvas->load_gcode_preview(*m_gcode_result, colors); #if ENABLE_NEW_GCODE_VIEWER + // Load the real G-code preview. + m_canvas->load_gcode_preview(*m_gcode_result, tool_colors, color_print_colors); // the view type may have been changed by the call m_canvas->load_gcode_preview() gcode_view_type = m_canvas->get_gcode_view_type(); +#else + // Load the real G-code preview. + m_canvas->load_gcode_preview(*m_gcode_result, colors); #endif // ENABLE_NEW_GCODE_VIEWER m_left_sizer->Layout(); Refresh(); @@ -927,15 +934,15 @@ void Preview::load_print_as_fff(bool keep_z_range) } #if ENABLE_NEW_GCODE_VIEWER else if (is_pregcode_preview) { -#else - else if (wxGetApp().is_editor()) { -#endif // ENABLE_NEW_GCODE_VIEWER // Load the initial preview based on slices, not the final G-code. - m_canvas->load_preview(colors, color_print_values); -#if ENABLE_NEW_GCODE_VIEWER + m_canvas->load_preview(tool_colors, color_print_colors, color_print_values); // the view type has been changed by the call m_canvas->load_gcode_preview() if (gcode_view_type == libvgcode::EViewType::ColorPrint && !color_print_values.empty()) m_canvas->set_gcode_view_type(gcode_view_type); +#else + else if (wxGetApp().is_editor()) { + // Load the initial preview based on slices, not the final G-code. + m_canvas->load_preview(colors, color_print_values); #endif // ENABLE_NEW_GCODE_VIEWER m_left_sizer->Hide(m_bottom_toolbar_panel); m_left_sizer->Layout(); @@ -954,18 +961,19 @@ void Preview::load_print_as_fff(bool keep_z_range) if (!zs.empty() && !m_keep_current_preview_type) { const unsigned int number_extruders = wxGetApp().is_editor() ? - (unsigned int)print->extruders().size() : - m_canvas->get_gcode_extruders_count(); + (unsigned int)print->extruders().size() : m_canvas->get_gcode_extruders_count(); +#if ENABLE_NEW_GCODE_VIEWER + const bool contains_color_gcodes = std::any_of(std::begin(color_print_values), std::end(color_print_values), + [](auto const& item) { return item.type == CustomGCode::Type::ColorChange; }); + const libvgcode::EViewType choice = contains_color_gcodes ? + libvgcode::EViewType::ColorPrint : + (number_extruders > 1) ? libvgcode::EViewType::Tool : libvgcode::EViewType::FeatureType; +#else const std::vector gcodes = wxGetApp().is_editor() ? wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes : m_canvas->get_custom_gcode_per_print_z(); const bool contains_color_gcodes = std::any_of(std::begin(gcodes), std::end(gcodes), [](auto const& item) { return item.type == CustomGCode::Type::ColorChange || item.type == CustomGCode::Type::ToolChange; }); -#if ENABLE_NEW_GCODE_VIEWER - const libvgcode::EViewType choice = contains_color_gcodes ? - libvgcode::EViewType::ColorPrint : - (number_extruders > 1) ? libvgcode::EViewType::Tool : libvgcode::EViewType::FeatureType; -#else const GCodeViewer::EViewType choice = contains_color_gcodes ? GCodeViewer::EViewType::ColorPrint : (number_extruders > 1) ? GCodeViewer::EViewType::Tool : GCodeViewer::EViewType::FeatureType; diff --git a/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.cpp b/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.cpp index a2c2782bf6..c27bbc9472 100644 --- a/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.cpp +++ b/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.cpp @@ -7,6 +7,7 @@ #if ENABLE_NEW_GCODE_VIEWER #include "libslic3r/Print.hpp" +#include "libslic3r/Color.hpp" namespace libvgcode { @@ -38,6 +39,12 @@ Color convert(const Slic3r::ColorRGBA& c) return { static_cast(c.r() * 255.0f), static_cast(c.g() * 255.0f), static_cast(c.b() * 255.0f) }; } +Color convert(const std::string& color_str) +{ + Slic3r::ColorRGBA color_rgba; + return decode_color(color_str, color_rgba) ? convert(color_rgba) : DUMMY_COLOR; +} + Slic3r::GCodeExtrusionRole convert(EGCodeExtrusionRole role) { switch (role) @@ -147,10 +154,28 @@ Slic3r::PrintEstimatedStatistics::ETimeMode convert(const ETimeMode& mode) } } -GCodeInputData convert(const Slic3r::GCodeProcessorResult& result, float travels_radius, float wipes_radius) +GCodeInputData convert(const Slic3r::GCodeProcessorResult& result, const std::vector& str_tool_colors, + const std::vector& str_color_print_colors, const Viewer& viewer) { - const std::vector& moves = result.moves; GCodeInputData ret; + + // collect tool colors + ret.tools_colors.reserve(str_tool_colors.size()); + for (const std::string& color : str_tool_colors) { + ret.tools_colors.emplace_back(convert(color)); + } + + // collect color print colors + const std::vector& str_colors = str_color_print_colors.empty() ? str_tool_colors : str_color_print_colors; + ret.color_print_colors.reserve(str_colors.size()); + for (const std::string& color : str_colors) { + ret.color_print_colors.emplace_back(convert(color)); + } + + const float travels_radius = viewer.get_travels_radius(); + const float wipes_radius = viewer.get_wipes_radius(); + + const std::vector& moves = result.moves; ret.vertices.reserve(2 * moves.size()); for (size_t i = 1; i < moves.size(); ++i) { const Slic3r::GCodeProcessorResult::MoveVertex& curr = moves[i]; @@ -498,37 +523,40 @@ static void convert_wipe_tower_to_vertices(const Slic3r::Print& print, const std class ObjectHelper { public: - ObjectHelper(const std::vector& color_print_values, size_t tool_colors_count, size_t extruders_count) + ObjectHelper(const std::vector& color_print_values, size_t tool_colors_count, size_t color_print_colors_count, size_t extruders_count) : m_color_print_values(color_print_values) , m_tool_colors_count(tool_colors_count) - , m_extruders_count(extruders_count) - { + , m_color_print_colors_count(color_print_colors_count) + , m_extruders_count(extruders_count) { } - uint8_t color_id(size_t layer_id, size_t extruder_id) const - { - return !m_color_print_values.empty() ? color_print_color_id(layer_id, extruder_id) : - (m_tool_colors_count > 0) ? std::min(m_tool_colors_count - 1, static_cast(extruder_id)) : 0; + uint8_t color_id(double print_z, size_t extruder_id) const { + if (!m_color_print_values.empty()) + return color_print_color_id(print_z, extruder_id); + else { + if (m_tool_colors_count > 0) + return std::min(m_tool_colors_count - 1, static_cast(extruder_id)); + else + return 0; + } } private: const std::vector& m_color_print_values; size_t m_tool_colors_count{ 0 }; + size_t m_color_print_colors_count{ 0 }; size_t m_extruders_count{ 0 }; - uint8_t color_print_color_id(double print_z, size_t extruder_id) const - { + uint8_t color_print_color_id(double print_z, size_t extruder_id) const { auto it = std::find_if(m_color_print_values.begin(), m_color_print_values.end(), [print_z](const Slic3r::CustomGCode::Item& code) { return std::fabs(code.print_z - print_z) < EPSILON; }); - if (it != m_color_print_values.end()) { + if (it != m_color_print_values.end()) { Slic3r::CustomGCode::Type type = it->type; // pause print or custom Gcode - if (type == Slic3r::CustomGCode::PausePrint || - (type != Slic3r::CustomGCode::ColorChange && type != Slic3r::CustomGCode::ToolChange)) - return static_cast(m_tool_colors_count - 1); // last color item is a gray color for pause print or custom G-code - + if (type == Slic3r::CustomGCode::PausePrint || type == Slic3r::CustomGCode::Custom || type == Slic3r::CustomGCode::Template) + return static_cast(m_color_print_colors_count - 1); // last color item is a gray color for pause print or custom G-code switch (it->type) { // change color for current extruder case Slic3r::CustomGCode::ColorChange: { return color_change_color_id(it, extruder_id); } @@ -554,8 +582,7 @@ private: return std::min(m_extruders_count - 1, static_cast(extruder_id)); } - uint8_t color_change_color_id(std::vector::const_iterator it, size_t extruder_id) const - { + uint8_t color_change_color_id(std::vector::const_iterator it, size_t extruder_id) const { if (m_extruders_count == 1) return m600_color_id(it); @@ -577,8 +604,7 @@ private: return 0; } - uint8_t tool_change_color_id(std::vector::const_iterator it, size_t extruder_id) const - { + uint8_t tool_change_color_id(std::vector::const_iterator it, size_t extruder_id) const { const int current_extruder = it->extruder == 0 ? static_cast(extruder_id + 1) : it->extruder; if (m_tool_colors_count == m_extruders_count + 1) // there is no one "M600" return std::min(m_extruders_count - 1, std::max(current_extruder - 1, 0)); @@ -593,8 +619,7 @@ private: return std::min(m_extruders_count - 1, std::max(current_extruder - 1, 0)); } - uint8_t m600_color_id(std::vector::const_iterator it) const - { + uint8_t m600_color_id(std::vector::const_iterator it) const { uint8_t shift = 0; while (it != m_color_print_values.begin()) { --it; @@ -606,7 +631,8 @@ private: }; static void convert_object_to_vertices(const Slic3r::PrintObject& object, const std::vector& str_tool_colors, - const std::vector& color_print_values, size_t extruders_count, VerticesData& data) + const std::vector& str_color_print_colors, const std::vector& color_print_values, + size_t extruders_count, VerticesData& data) { const bool has_perimeters = object.is_step_done(Slic3r::posPerimeters); const bool has_infill = object.is_step_done(Slic3r::posInfill); @@ -624,7 +650,7 @@ static void convert_object_to_vertices(const Slic3r::PrintObject& object, const } std::sort(layers.begin(), layers.end(), [](const Slic3r::Layer* l1, const Slic3r::Layer* l2) { return l1->print_z < l2->print_z; }); - ObjectHelper object_helper(color_print_values, str_tool_colors.size(), extruders_count); + ObjectHelper object_helper(color_print_values, str_tool_colors.size(), str_color_print_colors.size(), extruders_count); data.layers_zs.reserve(layers.size()); for (const Slic3r::Layer* layer : layers) { @@ -681,19 +707,21 @@ static void convert_object_to_vertices(const Slic3r::PrintObject& object, const } static void convert_objects_to_vertices(const Slic3r::SpanOfConstPtrs& objects, const std::vector& str_tool_colors, - const std::vector& color_print_values, size_t extruders_count, std::vector& data) + const std::vector& str_color_print_colors, const std::vector& color_print_values, size_t extruders_count, + std::vector& data) { // extract vertices and layers zs object by object data.reserve(data.size() + objects.size()); for (size_t i = 0; i < objects.size(); ++i) { data.emplace_back(VerticesData()); - convert_object_to_vertices(*objects[i], str_tool_colors, color_print_values, extruders_count, data.back()); + convert_object_to_vertices(*objects[i], str_tool_colors, str_color_print_colors, color_print_values, extruders_count, data.back()); } } // mapping from Slic3r::Print to libvgcode::GCodeInputData GCodeInputData convert(const Slic3r::Print& print, const std::vector& str_tool_colors, - const std::vector& color_print_values, size_t extruders_count) + const std::vector& str_color_print_colors, const std::vector& color_print_values, + size_t extruders_count) { GCodeInputData ret; std::vector data; @@ -704,7 +732,7 @@ GCodeInputData convert(const Slic3r::Print& print, const std::vector layers; @@ -723,6 +751,19 @@ GCodeInputData convert(const Slic3r::Print& print, const std::vector& str_tool_colors, + const std::vector& str_color_print_colors, const Viewer& viewer); // mapping from Slic3r::Print to libvgcode::GCodeInputData extern GCodeInputData convert(const Slic3r::Print& print, const std::vector& str_tool_colors, - const std::vector& color_print_values, size_t extruders_count); + const std::vector& str_color_print_colors, const std::vector& color_print_values, + size_t extruders_count); } // namespace libvgcode