diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 955c76e9f..c3e780041 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1692,15 +1692,27 @@ void GCode::process_layer( } // we should add or not colorprint_change in respect to nozzle_diameter count instead of really used extruders count - if (colorprint_change && print./*extruders()*/config().nozzle_diameter.size()==1) - { - // add tag for analyzer - gcode += "; " + GCodeAnalyzer::Color_Change_Tag + "\n"; - // add tag for time estimator - gcode += "; " + GCodeTimeEstimator::Color_Change_Tag + "\n"; - // #ys_FIXME_COLOR - // gcode += "M600\n"; - gcode += custom_code + "\n"; + // #ys_FIXME_COLOR + // if (colorprint_change && print./*extruders()*/config().nozzle_diameter.size()==1) + // { + // // add tag for analyzer + // gcode += "; " + GCodeAnalyzer::Color_Change_Tag + "\n"; + // // add tag for time estimator + // gcode += "; " + GCodeTimeEstimator::Color_Change_Tag + "\n"; + // + // gcode += "M600\n"; + // } + if (colorprint_change) { + if (print.config().nozzle_diameter.size() == 1) + { + // add tag for analyzer + gcode += "; " + GCodeAnalyzer::Color_Change_Tag + "\n"; + // add tag for time estimator + gcode += "; " + GCodeTimeEstimator::Color_Change_Tag + "\n"; + if (custom_code == "tool_change") + custom_code = "M600"; + gcode += custom_code + "\n"; + } } diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 6123be037..0bb2edfc4 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -586,14 +586,15 @@ std::string Model::propose_export_file_name_and_path(const std::string &new_exte return boost::filesystem::path(this->propose_export_file_name_and_path()).replace_extension(new_extension).string(); } -std::vector> Model:: get_custom_tool_changes(double default_layer_height) const +std::vector> Model::get_custom_tool_changes(double default_layer_height, size_t num_extruders) const { std::vector> custom_tool_changes; if (!custom_gcode_per_height.empty()) { for (const CustomGCode& custom_gcode : custom_gcode_per_height) if (custom_gcode.gcode == "tool_change") { DynamicPrintConfig config; - config.set_key_value("extruder", new ConfigOptionInt(custom_gcode.extruder)); + // If extruder count in PrinterSettings was changed, use default (0) extruder for extruders, more than num_extruders + config.set_key_value("extruder", new ConfigOptionInt(custom_gcode.extruder > num_extruders ? 0 : custom_gcode.extruder)); // For correct extruders(tools) changing, we should decrease custom_gcode.height value by one default layer height custom_tool_changes.push_back({ custom_gcode.height - default_layer_height, config }); } diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index d78dbdfa6..aac6cde06 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -837,7 +837,7 @@ public: std::string propose_export_file_name_and_path(const std::string &new_extension) const; // from custom_gcode_per_height get just tool_change codes - std::vector> get_custom_tool_changes(double default_layer_height) const; + std::vector> get_custom_tool_changes(double default_layer_height, size_t num_extruders) const; private: explicit Model(int) : ObjectBase(-1) { assert(this->id().invalid()); }; diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index d3451265e..a8d905efe 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -834,7 +834,8 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ for (PrintObject *print_object : m_objects) print_object_status.emplace(PrintObjectStatus(print_object)); - std::vector> custom_tool_changes = m_model.get_custom_tool_changes(m_default_object_config.layer_height); + std::vector> custom_tool_changes = + m_model.get_custom_tool_changes(m_default_object_config.layer_height, num_extruders); // 3) Synchronize ModelObjects & PrintObjects. for (size_t idx_model_object = 0; idx_model_object < model.objects.size(); ++ idx_model_object) { diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 5d0deaaad..91ffa4a5a 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -500,9 +500,19 @@ void Preview::reset_sliders() void Preview::update_sliders(const std::vector& layers_z, bool keep_z_range) { m_enabled = true; + // update extruder selector + if (wxGetApp().extruders_edited_cnt() != m_extruder_selector->GetCount()-1) + { + int selection = m_extruder_selector->GetSelection(); + update_extruder_selector(); + if (selection >= m_extruder_selector->GetCount()) + selection = 0; + m_extruder_selector->SetSelection(selection); + } + update_double_slider(layers_z, keep_z_range); m_double_slider_sizer->Show((size_t)0); - if (m_slider->GetManipulationState() != DoubleSlider::msMultiExtruder) + if (m_slider->GetManipulationState() == DoubleSlider::msSingleExtruder) m_double_slider_sizer->GetItem(size_t(0))->GetSizer()->Hide((size_t)0); Layout(); } @@ -560,7 +570,7 @@ void Preview::on_checkbox_legend(wxCommandEvent& evt) m_canvas_widget->Refresh(); } -void Preview::update_view_type() +void Preview::update_view_type(bool slice_completed) { const DynamicPrintConfig& config = wxGetApp().preset_bundle->project_config; @@ -574,8 +584,8 @@ void Preview::update_view_type() _(L("Feature type")); */ - const wxString& choice = !wxGetApp().plater()->model().custom_gcode_per_height.empty()// && - /*wxGetApp().extruders_edited_cnt()==1*/ ? + const wxString& choice = !wxGetApp().plater()->model().custom_gcode_per_height.empty() && + (wxGetApp().extruders_edited_cnt()==1 || !slice_completed) ? _(L("Color Print")) : config.option("wiping_volumes_matrix")->values.size() > 1 ? _(L("Tool")) : @@ -590,25 +600,39 @@ void Preview::update_view_type() } } +void Preview::update_extruder_selector() +{ + m_extruder_selector->Clear(); + + m_extruder_selector->Append("Whole print"); + const int extruder_cnt = wxGetApp().extruders_edited_cnt(); + int i = 0; + while (i < extruder_cnt) + { + i++; + m_extruder_selector->Append(wxString::Format("Extruder %d", i)); + } +} + void Preview::create_double_slider() { m_slider = new DoubleSlider(this, wxID_ANY, 0, 0, 0, 100); // #ys_FIXME_COLOR // m_double_slider_sizer->Add(m_slider, 0, wxEXPAND, 0); - auto extruder_selector = new wxComboBox(this, wxID_ANY); - extruder_selector->Append("Whole print"); - int extruder_cnt = wxGetApp().extruders_edited_cnt(); - int i = 0; - while (i < extruder_cnt) + m_extruder_selector = new wxComboBox(this, wxID_ANY); + update_extruder_selector(); + m_extruder_selector->SetSelection(0); + m_extruder_selector->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent& evt) { - i++; - extruder_selector->Append(wxString::Format("Extruder %d", i)); - } - extruder_selector->SetSelection(0); + m_slider->SetManipulationState(m_extruder_selector->GetSelection() == 0 ? + DoubleSlider::msMultiExtruderWholePrint : + DoubleSlider::msMultiExtruder); + }); + m_extruder_selector->Disable(); // temporary disabled to suppress extruder selection auto sizer = new wxBoxSizer(wxVERTICAL); - sizer->Add(extruder_selector, 0, wxEXPAND, 0); + sizer->Add(m_extruder_selector, 0, wxEXPAND, 0); sizer->Add(m_slider, 1, wxEXPAND, 0); m_double_slider_sizer->Add(sizer, 0, wxEXPAND, 0); @@ -627,7 +651,7 @@ void Preview::create_double_slider() model.custom_gcode_per_height = m_slider->GetTicksValues_(); m_schedule_background_process(); - update_view_type(); + update_view_type(false); reload_print(); }); @@ -733,16 +757,14 @@ void Preview::update_double_slider(const std::vector& layers_z, bool kee // m_slider->EnableTickManipulation(color_print_enable); m_slider->EnableTickManipulation(color_print_enable); - m_slider->SetManipulationState(DoubleSlider::msSingleExtruder); - if (color_print_enable) { - const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->printers.get_edited_preset().config; - if (cfg.opt("nozzle_diameter")->values.size() > 1) { - // ys_TODO : fill is_detected_one_extruder_print value - bool is_detected_one_extruder_print = wxGetApp().plater()->fff_print().extruders().size() == 1; - m_slider->SetManipulationState(is_detected_one_extruder_print ? - DoubleSlider::msMultiExtruderSimple : DoubleSlider::msMultiExtruder); - } + if (color_print_enable && wxGetApp().extruders_edited_cnt() > 1) { + //bool is_detected_full_print = //wxGetApp().plater()->fff_print().extruders().size() == 1; + m_slider->SetManipulationState(m_extruder_selector->GetSelection()==0 ? + DoubleSlider::msMultiExtruderWholePrint : DoubleSlider::msMultiExtruder); } + else + m_slider->SetManipulationState(DoubleSlider::msSingleExtruder); + } // #ys_FIXME_COLOR void Preview::check_slider_values(std::vector& ticks_from_config, diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 551900277..574f827e2 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -103,6 +103,7 @@ class Preview : public wxPanel bool m_enabled; DoubleSlider* m_slider {nullptr}; + wxComboBox* m_extruder_selector {nullptr}; public: Preview(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, @@ -129,7 +130,8 @@ public: void move_double_slider(wxKeyEvent& evt); void edit_double_slider(wxKeyEvent& evt); - void update_view_type(); + void update_view_type(bool slice_completed); + void update_extruder_selector(); bool is_loaded() const { return m_loaded; } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 96af17999..477a0b242 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -4702,7 +4702,7 @@ void Plater::reslice() p->show_action_buttons(true); // update type of preview - p->preview->update_view_type(); + p->preview->update_view_type(true); } void Plater::reslice_SLA_supports(const ModelObject &object, bool postpone_error_messages) diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index e6e569939..e9f5ac329 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -3056,8 +3056,8 @@ wxString DoubleSlider::get_tooltip(bool is_revert_icon_focused) tooltip = tick_code_it == m_ticks_.end() ? _(L("Add color change")) : tick_code_it->gcode == "M600" ? _(L("Delete color change")) : tick_code_it->gcode == "M25" ? _(L("Delete pause")) : - tick_code_it->gcode == "tool_change" ? - from_u8((boost::format(_utf8(L("Delete extruder change to \"%1%\""))) % tick_code_it->extruder).str()) : + tick_code_it->gcode == "tool_change" ? ( m_state == msSingleExtruder ? _(L("Delete color change")) : + from_u8((boost::format(_utf8(L("Delete extruder change to \"%1%\""))) % tick_code_it->extruder).str()) ) : from_u8((boost::format(_utf8(L("Delete \"%1%\" code"))) % tick_code_it->gcode).str()); } @@ -3329,7 +3329,7 @@ void DoubleSlider::OnRightUp(wxMouseEvent& event) if (m_show_context_menu) { wxMenu menu; - if (m_state == msMultiExtruderSimple) + if (m_state == msMultiExtruderWholePrint) { const wxString name = _(L("Change extruder")); @@ -3349,9 +3349,8 @@ void DoubleSlider::OnRightUp(wxMouseEvent& event) menu.AppendSubMenu(change_extruder_menu, name, _(L("Use another extruder"))); } } - - if (m_state != msMultiExtruderSimple) - append_menu_item(&menu, wxID_ANY, _(L("Add color change")) + " (M600)", "", + else + append_menu_item(&menu, wxID_ANY, _(L("Add color change")) + " (M600)", "", [this](wxCommandEvent&) { add_code("M600"); }, "colorchange_add_off.png", &menu); append_menu_item(&menu, wxID_ANY, _(L("Add pause SD print")) + " (M25)", "", @@ -3382,16 +3381,17 @@ void DoubleSlider::add_code(std::string code) wxString msg_header = from_u8((boost::format(_utf8(L("Custom Gcode on current layer (%1% mm)."))) % m_values[tick]).str()); // get custom gcode - wxTextEntryDialog dlg(nullptr, msg_text, msg_header, wxEmptyString, + wxTextEntryDialog dlg(nullptr, msg_text, msg_header, m_custom_gcode, wxTextEntryDialogStyle | wxTE_MULTILINE); if (dlg.ShowModal() != wxID_OK || dlg.GetValue().IsEmpty()) return; - code = dlg.GetValue().c_str(); + m_custom_gcode = dlg.GetValue(); + code = m_custom_gcode.c_str(); } int extruder = 0; - if (m_state == msMultiExtruderSimple) + if (m_state == msMultiExtruderWholePrint) extruder = get_extruder_for_tick(m_selection == ssLower ? m_lower_value : m_higher_value); m_ticks_.insert(TICK_CODE(tick, code, extruder)); diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index e874dbf38..b7fd81db3 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -809,7 +809,7 @@ public: static enum ManipulationState { msSingleExtruder, // single extruder printer preset is selected msMultiExtruder, // multiple extruder printer preset is selected - msMultiExtruderSimple // multiple extruder printer preset is selected, but one-extruder print is detected + msMultiExtruderWholePrint // multiple extruder printer preset is selected, and "Whole print" is selected }; void SetManipulationState(ManipulationState state) { m_state = state; @@ -903,6 +903,7 @@ private: bool m_is_enabled_tick_manipulation = true; bool m_show_context_menu = false; ManipulationState m_state = msSingleExtruder; + wxString m_custom_gcode = wxEmptyString; wxRect m_rect_lower_thumb; wxRect m_rect_higher_thumb;