diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 6f4523375..9e74d217d 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1762,7 +1762,11 @@ namespace ProcessLayer assert(m600_extruder_before_layer >= 0); // Color Change or Tool Change as Color Change. // add tag for processor +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + gcode += ";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Color_Change) + ",T" + std::to_string(m600_extruder_before_layer) + "," + custom_gcode->color + "\n"; +#else gcode += ";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Color_Change) + ",T" + std::to_string(m600_extruder_before_layer) + "\n"; +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER if (!single_extruder_printer && m600_extruder_before_layer >= 0 && first_extruder_id != (unsigned)m600_extruder_before_layer // && !MMU1 diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 7f121689b..1141ca2a7 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -684,6 +684,9 @@ void GCodeProcessor::Result::reset() { extruder_colors = std::vector(); filament_diameters = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DIAMETER); filament_densities = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DENSITY); +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + custom_gcode_per_print_z = std::vector(); +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER time = 0; } #else @@ -695,6 +698,9 @@ void GCodeProcessor::Result::reset() { extruder_colors = std::vector(); filament_diameters = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DIAMETER); filament_densities = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DENSITY); +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + custom_gcode_per_print_z = std::vector(); +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER } #endif // ENABLE_GCODE_VIEWER_STATISTICS @@ -1125,6 +1131,9 @@ void GCodeProcessor::reset() m_result.id = ++s_result_id; m_use_volumetric_e = false; +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + m_last_default_color_id = 0; +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER #if ENABLE_GCODE_VIEWER_DATA_CHECKING m_mm3_per_mm_compare.reset(); @@ -1521,6 +1530,56 @@ void GCodeProcessor::process_tags(const std::string_view comment) // color change tag if (boost::starts_with(comment, reserved_tag(ETags::Color_Change))) { unsigned char extruder_id = 0; +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + static std::vector Default_Colors = { + "#0B2C7A", // { 0.043f, 0.173f, 0.478f }, // bluish + "#1C8891", // { 0.110f, 0.533f, 0.569f }, + "#AAF200", // { 0.667f, 0.949f, 0.000f }, + "#F5CE0A", // { 0.961f, 0.808f, 0.039f }, + "#D16830", // { 0.820f, 0.408f, 0.188f }, + "#942616", // { 0.581f, 0.149f, 0.087f } // reddish + }; + + std::string color = Default_Colors[0]; + auto is_valid_color = [](const std::string& color) { + auto is_hex_digit = [](char c) { + return ((c >= '0' && c <= '9') || + (c >= 'A' && c <= 'F') || + (c >= 'a' && c <= 'f')); + }; + + if (color[0] != '#' || color.length() != 7) + return false; + for (int i = 1; i <= 6; ++i) { + if (!is_hex_digit(color[i])) + return false; + } + return true; + }; + + std::vector tokens; + boost::split(tokens, comment, boost::is_any_of(","), boost::token_compress_on); + if (tokens.size() > 1) { + if (tokens[1][0] == 'T') { + int eid; + if (!parse_number(tokens[1].substr(1), eid) || eid < 0 || eid > 255) { + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Color_Change (" << comment << ")."; + return; + } + extruder_id = static_cast(eid); + } + } + if (tokens.size() > 2) { + if (is_valid_color(tokens[2])) + color = tokens[2]; + } + else { + color = Default_Colors[m_last_default_color_id]; + ++m_last_default_color_id; + if (m_last_default_color_id == Default_Colors.size()) + m_last_default_color_id = 0; + } +#else if (boost::starts_with(comment.substr(reserved_tag(ETags::Color_Change).size()), ",T")) { int eid; if (!parse_number(comment.substr(reserved_tag(ETags::Color_Change).size() + 2), eid) || eid < 0 || eid > 255) { @@ -1529,6 +1588,7 @@ void GCodeProcessor::process_tags(const std::string_view comment) } extruder_id = static_cast(eid); } +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER if (extruder_id < m_extruder_colors.size()) m_extruder_colors[extruder_id] = static_cast(m_extruder_offsets.size()) + m_cp_color.counter; // color_change position in list of color for preview @@ -1539,10 +1599,18 @@ void GCodeProcessor::process_tags(const std::string_view comment) if (m_extruder_id == extruder_id) { m_cp_color.current = m_extruder_colors[extruder_id]; store_move_vertex(EMoveType::Color_change); +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + CustomGCode::Item item = { static_cast(m_end_position[2]), CustomGCode::ColorChange, extruder_id + 1, color, "" }; + m_result.custom_gcode_per_print_z.emplace_back(item); + process_custom_gcode_time(CustomGCode::ColorChange); + process_filaments(CustomGCode::ColorChange); +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER } +#if !ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER process_custom_gcode_time(CustomGCode::ColorChange); process_filaments(CustomGCode::ColorChange); +#endif // !ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER return; } @@ -1550,6 +1618,10 @@ void GCodeProcessor::process_tags(const std::string_view comment) // pause print tag if (comment == reserved_tag(ETags::Pause_Print)) { store_move_vertex(EMoveType::Pause_Print); +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + CustomGCode::Item item = { static_cast(m_end_position[2]), CustomGCode::PausePrint, m_extruder_id + 1, "", "" }; + m_result.custom_gcode_per_print_z.emplace_back(item); +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER process_custom_gcode_time(CustomGCode::PausePrint); return; } @@ -1557,6 +1629,10 @@ void GCodeProcessor::process_tags(const std::string_view comment) // custom code tag if (comment == reserved_tag(ETags::Custom_Code)) { store_move_vertex(EMoveType::Custom_GCode); +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + CustomGCode::Item item = { static_cast(m_end_position[2]), CustomGCode::Custom, m_extruder_id + 1, "", "" }; + m_result.custom_gcode_per_print_z.emplace_back(item); +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER return; } diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 2141b1c07..d83c39d09 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -352,6 +352,9 @@ namespace Slic3r { std::vector filament_diameters; std::vector filament_densities; PrintEstimatedStatistics print_statistics; +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + std::vector custom_gcode_per_print_z; +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER #if ENABLE_GCODE_VIEWER_STATISTICS int64_t time{ 0 }; @@ -484,6 +487,9 @@ namespace Slic3r { CpColor m_cp_color; bool m_use_volumetric_e; SeamsDetector m_seams_detector; +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + size_t m_last_default_color_id; +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER enum class EProducer { diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 0455f6559..2757efd41 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -47,6 +47,8 @@ #define ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW (0 && ENABLE_PROJECT_DIRTY_STATE) // Enable delayed rendering of transparent volumes #define ENABLE_DELAYED_TRANSPARENT_VOLUMES_RENDERING (1 && ENABLE_2_4_0_ALPHA0) +// Enable the fix of importing color print view from gcode files into GCodeViewer +#define ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER (1 && ENABLE_2_4_0_ALPHA0) #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 597736b19..a422a4303 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -1551,6 +1551,9 @@ void Control::OnMotion(wxMouseEvent& event) event.Skip(); // Set tooltips with information for each icon +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + if (GUI::wxGetApp().is_editor()) +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER this->SetToolTip(get_tooltip(tick)); if (action) { diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index e185c9cb7..73600e6de 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -586,6 +586,11 @@ void GCodeViewer::load(const GCodeProcessor::Result& gcode_result, const Print& m_sequential_view.gcode_window.set_filename(gcode_result.filename); m_sequential_view.gcode_window.load_gcode(); +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + if (wxGetApp().is_gcode_viewer()) + m_custom_gcode_per_print_z = gcode_result.custom_gcode_per_print_z; +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + load_toolpaths(gcode_result); if (m_layers.empty()) @@ -743,6 +748,9 @@ void GCodeViewer::reset() m_layers_z_range = { 0, 0 }; m_roles = std::vector(); m_print_statistics.reset(); +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + m_custom_gcode_per_print_z = std::vector(); +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER m_sequential_view.gcode_window.reset(); #if ENABLE_GCODE_VIEWER_STATISTICS m_statistics.reset_all(); @@ -2939,7 +2947,11 @@ void GCodeViewer::render_legend(float& legend_height) const } case EViewType::ColorPrint: { +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + const std::vector& custom_gcode_per_print_z = wxGetApp().is_editor() ? wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes : m_custom_gcode_per_print_z; +#else const std::vector& custom_gcode_per_print_z = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes; +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER size_t total_items = 1; for (unsigned char i : m_extruder_ids) { total_items += color_print_ranges(i, custom_gcode_per_print_z).size(); @@ -3034,7 +3046,11 @@ void GCodeViewer::render_legend(float& legend_height) const auto generate_partial_times = [this, get_used_filament_from_volume](const TimesList& times, const std::vector& used_filaments) { PartialTimes items; +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + std::vector custom_gcode_per_print_z = wxGetApp().is_editor() ? wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes : m_custom_gcode_per_print_z; +#else std::vector custom_gcode_per_print_z = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes; +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER int extruders_count = wxGetApp().extruders_edited_cnt(); std::vector last_color(extruders_count); for (int i = 0; i < extruders_count; ++i) { diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 0c20b764c..7ae6f5cb6 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -616,6 +616,10 @@ private: GCodeProcessor::Result::SettingsIds m_settings_ids; std::array m_sequential_range_caps; +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + std::vector m_custom_gcode_per_print_z; +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + public: GCodeViewer(); ~GCodeViewer() { reset(); } @@ -665,6 +669,10 @@ public: void stop_mapping_gcode_window(); void toggle_gcode_window_visibility() { m_sequential_view.gcode_window.toggle_visibility(); } +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + std::vector& get_custom_gcode_per_print_z() { return m_custom_gcode_per_print_z; } +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + private: void load_toolpaths(const GCodeProcessor::Result& gcode_result); void load_shells(const Print& print, bool initialized); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index ee0555cff..609c903fa 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -634,6 +634,9 @@ public: void set_toolpath_view_type(GCodeViewer::EViewType type); void set_volumes_z_range(const std::array& range); void set_toolpaths_z_range(const std::array& range); +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + std::vector& get_custom_gcode_per_print_z() { return m_gcode_viewer.get_custom_gcode_per_print_z(); } +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER std::vector load_object(const ModelObject& model_object, int obj_idx, std::vector instance_idxs); std::vector load_object(const Model& model, int obj_idx); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index ad762f134..eeac517fd 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -637,11 +637,25 @@ void Preview::update_layers_slider(const std::vector& layers_z, bool kee update_layers_slider_mode(); Plater* plater = wxGetApp().plater(); +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + CustomGCode::Info ticks_info_from_model; + if (wxGetApp().is_editor()) + ticks_info_from_model = plater->model().custom_gcode_per_print_z; + else { + ticks_info_from_model.mode = CustomGCode::Mode::SingleExtruder; + ticks_info_from_model.gcodes = m_canvas->get_custom_gcode_per_print_z(); + } +#else CustomGCode::Info& ticks_info_from_model = plater->model().custom_gcode_per_print_z; +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER check_layers_slider_values(ticks_info_from_model.gcodes, layers_z); //first of all update extruder colors to avoid crash, when we are switching printer preset from MM to SM +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + m_layers_slider->SetExtruderColors(plater->get_extruder_colors_from_plater_config(wxGetApp().is_editor() ? nullptr : m_gcode_result)); +#else m_layers_slider->SetExtruderColors(plater->get_extruder_colors_from_plater_config()); +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER m_layers_slider->SetSliderValues(layers_z); assert(m_layers_slider->GetMinValue() == 0); @@ -904,7 +918,14 @@ void Preview::load_print_as_fff(bool keep_z_range) colors = wxGetApp().plater()->get_colors_for_color_print(m_gcode_result); if (!gcode_preview_data_valid) { +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + if (wxGetApp().is_editor()) + color_print_values = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes; + else + color_print_values = m_canvas->get_custom_gcode_per_print_z(); +#else color_print_values = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes; +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER colors.push_back("#808080"); // gray color for pause print or custom G-code } } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 6f6938eb5..ee32b5ad8 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6059,9 +6059,22 @@ std::vector Plater::get_colors_for_color_print(const GCodeProcessor std::vector colors = get_extruder_colors_from_plater_config(result); 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) - if (code.type == CustomGCode::ColorChange) - colors.emplace_back(code.color); +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + if (wxGetApp().is_gcode_viewer() && result != nullptr) { + for (const CustomGCode::Item& code : result->custom_gcode_per_print_z) { + if (code.type == CustomGCode::ColorChange) + colors.emplace_back(code.color); + } + } + else { +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + for (const CustomGCode::Item& code : p->model.custom_gcode_per_print_z.gcodes) { + if (code.type == CustomGCode::ColorChange) + colors.emplace_back(code.color); + } +#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER + } +#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER return colors; }