diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 2aa10a9bb..2dee58136 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -836,8 +836,8 @@ GLCanvas3D::LegendTexture::LegendTexture() void GLCanvas3D::LegendTexture::fill_color_print_legend_values(const GCodePreviewData& preview_data, const GLCanvas3D& canvas, std::vector>& cp_legend_values) { - if (preview_data.extrusion.view_type == GCodePreviewData::Extrusion::ColorPrint && - wxGetApp().extruders_edited_cnt() == 1) // show color change legend only for single-material presets + if (preview_data.extrusion.view_type == GCodePreviewData::Extrusion::ColorPrint /*&& + wxGetApp().extruders_edited_cnt() == 1*/) // show color change legend only for single-material presets { /* // #ys_FIXME_COLOR diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index df7b5cf54..5d0deaaad 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -502,6 +502,8 @@ void Preview::update_sliders(const std::vector& layers_z, bool keep_z_ra m_enabled = true; update_double_slider(layers_z, keep_z_range); m_double_slider_sizer->Show((size_t)0); + if (m_slider->GetManipulationState() != DoubleSlider::msMultiExtruder) + m_double_slider_sizer->GetItem(size_t(0))->GetSizer()->Hide((size_t)0); Layout(); } @@ -572,8 +574,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*/ ? _(L("Color Print")) : config.option("wiping_volumes_matrix")->values.size() > 1 ? _(L("Tool")) : @@ -591,9 +593,9 @@ void Preview::update_view_type() void Preview::create_double_slider() { m_slider = new DoubleSlider(this, wxID_ANY, 0, 0, 0, 100); - m_double_slider_sizer->Add(m_slider, 0, wxEXPAND, 0); + // #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(); @@ -610,7 +612,6 @@ void Preview::create_double_slider() sizer->Add(m_slider, 1, wxEXPAND, 0); m_double_slider_sizer->Add(sizer, 0, wxEXPAND, 0); - */ // sizer, m_canvas_widget m_canvas_widget->Bind(wxEVT_KEY_DOWN, &Preview::update_double_slider_from_canvas, this); @@ -723,12 +724,25 @@ void Preview::update_double_slider(const std::vector& layers_z, bool kee m_slider->SetTicksValues_(ticks_from_model); bool color_print_enable = (wxGetApp().plater()->printer_technology() == ptFFF); + // #ys_FIXME_COLOR + // if (color_print_enable) { + // const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->printers.get_edited_preset().config; + // if (cfg.opt("nozzle_diameter")->values.size() > 1) + // color_print_enable = false; + // } + // 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) - color_print_enable = false; + 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); + } } - m_slider->EnableTickManipulation(color_print_enable); } // #ys_FIXME_COLOR void Preview::check_slider_values(std::vector& ticks_from_config, @@ -875,8 +889,8 @@ void Preview::load_print_as_fff(bool keep_z_range) m_loaded = true; } else { // disable color change information for multi-material presets - if (wxGetApp().extruders_edited_cnt() > 1) - color_print_values.clear(); + // if (wxGetApp().extruders_edited_cnt() > 1) // #ys_FIXME_COLOR + // color_print_values.clear(); // Load the initial preview based on slices, not the final G-code. m_canvas->load_preview(colors, color_print_values); diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index cc6375af8..e6e569939 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -3042,6 +3042,28 @@ void DoubleSlider::correct_higher_value() m_lower_value = m_higher_value; } +wxString DoubleSlider::get_tooltip(bool is_revert_icon_focused) +{ + wxString tooltip(wxEmptyString); + if (m_is_one_layer_icon_focesed) + tooltip = _(L("One layer mode")); + if (is_revert_icon_focused) + tooltip = _(L("Discard all custom changes")); + else if (m_is_action_icon_focesed) + { + const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; + const auto tick_code_it = m_ticks_.find(tick); + 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()) : + from_u8((boost::format(_utf8(L("Delete \"%1%\" code"))) % tick_code_it->gcode).str()); + } + + return tooltip; +} + void DoubleSlider::OnMotion(wxMouseEvent& event) { bool action = false; @@ -3081,22 +3103,7 @@ void DoubleSlider::OnMotion(wxMouseEvent& event) // const wxString tooltip = m_is_one_layer_icon_focesed ? _(L("One layer mode")) : // m_is_action_icon_focesed ? _(L("Add/Del color change")) : // is_revert_icon_focused ? _(L("Discard all color changes")) : ""; - wxString tooltip(wxEmptyString); - if (m_is_one_layer_icon_focesed) - tooltip = _(L("One layer mode")); - if (is_revert_icon_focused) - tooltip = _(L("Discard all custom changes")); - else if (m_is_action_icon_focesed) - { - const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; - const auto tick_code_it = m_ticks_.find(tick); - 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")) : - from_u8((boost::format(_utf8(L("Delete \"%1%\" code"))) % tick_code_it->gcode).str()); - } - - this->SetToolTip(tooltip); + this->SetToolTip(get_tooltip(is_revert_icon_focused)); if (action) { @@ -3298,6 +3305,20 @@ void DoubleSlider::OnRightDown(wxMouseEvent& event) event.Skip(); } +int DoubleSlider::get_extruder_for_tick(int tick) +{ + int extruder = 0; + if (!m_ticks_.empty()) { + auto tick_code_it = m_ticks_.lower_bound(tick); + if (tick_code_it != m_ticks_.begin()) { + --tick_code_it; + extruder = tick_code_it->extruder; + } + } + + return extruder; +} + void DoubleSlider::OnRightUp(wxMouseEvent& event) { if (!HasCapture()) @@ -3307,7 +3328,29 @@ void DoubleSlider::OnRightUp(wxMouseEvent& event) if (m_show_context_menu) { wxMenu menu; - + + if (m_state == msMultiExtruderSimple) + { + const wxString name = _(L("Change extruder")); + + const int extruders_cnt = Slic3r::GUI::wxGetApp().extruders_edited_cnt(); + if (extruders_cnt > 1) + { + const int initial_extruder = get_extruder_for_tick(m_selection == ssLower ? m_lower_value : m_higher_value); + + wxMenu* change_extruder_menu = new wxMenu(); + for (int i = 0; i <= extruders_cnt; i++) { + const wxString& item_name = i == 0 ? _(L("Default")) : wxString::Format("%d", i); + + append_menu_radio_item(change_extruder_menu, wxID_ANY, item_name, "", + [this, i](wxCommandEvent&) { change_extruder(i); }, &menu)->Check(i == initial_extruder); + } + + 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)", "", [this](wxCommandEvent&) { add_code("M600"); }, "colorchange_add_off.png", &menu); @@ -3339,14 +3382,33 @@ 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 - wxString custom_code = wxGetTextFromUser(msg_text, msg_header); - - if (custom_code.IsEmpty()) + wxTextEntryDialog dlg(nullptr, msg_text, msg_header, wxEmptyString, + wxTextEntryDialogStyle | wxTE_MULTILINE); + if (dlg.ShowModal() != wxID_OK || dlg.GetValue().IsEmpty()) return; - code = custom_code.c_str(); + + code = dlg.GetValue().c_str(); } - m_ticks_.insert(TICK_CODE(tick, code)); + int extruder = 0; + if (m_state == msMultiExtruderSimple) + extruder = get_extruder_for_tick(m_selection == ssLower ? m_lower_value : m_higher_value); + + m_ticks_.insert(TICK_CODE(tick, code, extruder)); + + wxPostEvent(this->GetParent(), wxCommandEvent(wxCUSTOMEVT_TICKSCHANGED)); + Refresh(); + Update(); + } +} + +void DoubleSlider::change_extruder(int extruder) +{ + const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; + // if on this Y doesn't exist tick + if (m_ticks_.find(tick) == m_ticks_.end()) + { + m_ticks_.insert(TICK_CODE(tick, "tool_change", extruder)); wxPostEvent(this->GetParent(), wxCommandEvent(wxCUSTOMEVT_TICKSCHANGED)); Refresh(); diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 0ee451f44..e874dbf38 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -806,6 +806,16 @@ public: EnableTickManipulation(false); } + 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 + }; + void SetManipulationState(ManipulationState state) { + m_state = state; + } + ManipulationState GetManipulationState() const { return m_state; } + bool is_horizontal() const { return m_style == wxSL_HORIZONTAL; } bool is_one_layer() const { return m_is_one_layer; } bool is_lower_at_min() const { return m_lower_value == m_min_value; } @@ -823,8 +833,10 @@ public: void OnKeyUp(wxKeyEvent &event); void OnChar(wxKeyEvent &event); void OnRightDown(wxMouseEvent& event); + int get_extruder_for_tick(int tick); void OnRightUp(wxMouseEvent& event); void add_code(std::string code); + void change_extruder(int extruder); protected: @@ -846,6 +858,7 @@ protected: void detect_selected_slider(const wxPoint& pt); void correct_lower_value(); void correct_higher_value(); + wxString get_tooltip(bool is_revert_icon_focused); void move_current_thumb(const bool condition); void action_tick(const TicksAction action); void enter_window(wxMouseEvent& event, const bool enter); @@ -889,6 +902,7 @@ private: bool m_is_one_layer_icon_focesed = false; bool m_is_enabled_tick_manipulation = true; bool m_show_context_menu = false; + ManipulationState m_state = msSingleExtruder; wxRect m_rect_lower_thumb; wxRect m_rect_higher_thumb; @@ -929,6 +943,7 @@ private: tick(tick), gcode(code), extruder(extruder) {} bool operator<(const TICK_CODE& other) const { return other.tick > this->tick; } + bool operator>(const TICK_CODE& other) const { return other.tick < this->tick; } int tick; std::string gcode;