diff --git a/resources/images/warning.svg b/resources/images/warning.svg
new file mode 100644
index 0000000000..2cc3422fd5
--- /dev/null
+++ b/resources/images/warning.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp
index 9a6ce01ffd..b84a08f752 100644
--- a/src/slic3r/GUI/SelectMachine.cpp
+++ b/src/slic3r/GUI/SelectMachine.cpp
@@ -445,7 +445,6 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
sizer_split_filament->Add(m_stext_filament_title, 0, wxALIGN_CENTER, 0);
sizer_split_filament->Add(m_split_line_filament, 1, wxALIGN_CENTER_VERTICAL, 0);
sizer_split_filament->Add(m_sizer_autorefill, 0, wxALIGN_CENTER, 0);
-
/*filament area*/
/*1 extruder*/
m_filament_panel = new StaticBox(this);
@@ -520,9 +519,6 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
m_sizer_filament_2extruder->Add(m_filament_right_panel, 0, wxEXPAND, 0);
m_sizer_filament_2extruder->Layout();
-
- //m_filament_left_panel->Hide();
- //m_filament_right_panel->Hide();
m_filament_panel->Hide();
m_statictext_ams_msg = new Label(this, wxEmptyString);
@@ -531,6 +527,44 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
m_statictext_ams_msg->SetFont(::Label::Body_13);
m_statictext_ams_msg->Hide();
+ /*ams mapping suggestions*/
+ m_link_edit_nozzle = new Label(this, wxEmptyString);
+ m_link_edit_nozzle->SetFont(::Label::Body_13);
+ m_link_edit_nozzle->SetForegroundColour(0x00ae42);
+ m_link_edit_nozzle->SetBackgroundColour(*wxWHITE);
+ m_link_edit_nozzle->Bind(wxEVT_ENTER_WINDOW, [this](auto &e) { SetCursor(wxCURSOR_HAND); });
+ m_link_edit_nozzle->Bind(wxEVT_LEAVE_WINDOW, [this](auto &e) { SetCursor(wxCURSOR_ARROW); });
+ m_link_edit_nozzle->SetLabel(_L("Rearrange filaments of the left and right nozzles ->"));
+
+ m_link_edit_nozzle->Bind(wxEVT_LEFT_DOWN, [this](auto &e) {
+ EndModal(wxID_CLOSE);
+ Plater * plater = wxGetApp().plater();
+ wxCommandEvent evt(EVT_OPEN_FILAMENT_MAP_SETTINGS_DIALOG);
+ evt.SetEventObject(plater);
+ evt.SetInt(1); // 1 means from gcode viewer
+ wxPostEvent(plater, evt);
+ });
+
+ m_mapping_sugs_sizer = new wxBoxSizer(wxHORIZONTAL);
+ auto m_img_mapping_sugs = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap("warning", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)));
+ auto m_txt_mapping_sugs = new Label(this, wxEmptyString);
+ m_txt_mapping_sugs->SetFont(::Label::Body_13);
+ m_txt_mapping_sugs->SetForegroundColour(wxColour(0xFF, 0x6F, 0x00));
+ m_txt_mapping_sugs->SetBackgroundColour(*wxWHITE);
+ m_txt_mapping_sugs->SetLabel(_L("Your material arrangement method is not optimal."));
+ m_mapping_sugs_sizer->Add(m_img_mapping_sugs, 0, wxALIGN_CENTER, 0);
+ m_mapping_sugs_sizer->Add(m_txt_mapping_sugs, 0, wxALIGN_CENTER, 0);
+
+ m_change_filament_times_sizer = new wxBoxSizer(wxHORIZONTAL);
+ auto m_img_change_filament_times = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap("warning", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)));
+ m_txt_change_filament_times = new Label(this, wxEmptyString);
+ m_txt_change_filament_times->SetFont(::Label::Body_13);
+ m_txt_change_filament_times->SetForegroundColour(wxColour(0xFF, 0x6F, 0x00));
+ m_txt_change_filament_times->SetBackgroundColour(*wxWHITE);
+ m_txt_change_filament_times->SetLabel(wxEmptyString);
+ m_change_filament_times_sizer->Add(m_img_change_filament_times, 0, wxALIGN_CENTER, 0);
+ m_change_filament_times_sizer->Add(m_txt_change_filament_times, 0, wxALIGN_CENTER, 0);
+
/*Advanced Options*/
wxBoxSizer* sizer_split_options = new wxBoxSizer(wxHORIZONTAL);
auto m_split_options_line = new wxPanel(this, wxID_ANY);
@@ -791,6 +825,9 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
m_sizer_main->Add(m_sizer_filament_2extruder, 0, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15));
m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(6));
m_sizer_main->Add(m_statictext_ams_msg, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(15));
+ m_sizer_main->Add(m_link_edit_nozzle, 0, wxLEFT|wxRIGHT, FromDIP(15));
+ m_sizer_main->Add(m_mapping_sugs_sizer, 0, wxLEFT|wxRIGHT, FromDIP(15));
+ m_sizer_main->Add(m_change_filament_times_sizer, 0, wxLEFT|wxRIGHT, FromDIP(15));
m_sizer_main->Add(sizer_split_options, 1, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15));
m_sizer_main->Add(sizer_advanced_options_title, 1, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15));
m_sizer_main->Add(m_sizer_options_timelapse, 0, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15));
@@ -2607,6 +2644,8 @@ void SelectMachineDialog::on_set_finish_mapping(wxCommandEvent &evt)
iter++;
}
}
+
+ update_filament_change_count();
}
void SelectMachineDialog::on_print_job_cancel(wxCommandEvent &evt)
@@ -2959,6 +2998,11 @@ void SelectMachineDialog::on_selection_changed(wxCommandEvent &event)
m_ams_mapping_valid = false;
m_ams_mapping_result.clear();
+ m_link_edit_nozzle->Show(false);
+ m_mapping_sugs_sizer->Show(false);
+ m_change_filament_times_sizer->Show(false);
+ m_txt_change_filament_times->Show(false);
+
auto selection = m_comboBox_printer->GetSelection();
DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
if (!dev) return;
@@ -3015,6 +3059,18 @@ void SelectMachineDialog::on_selection_changed(wxCommandEvent &event)
// Has changed machine unrecoverably
GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj);
m_check_flag = false;
+
+ /*check nozzle & filament is it the best*/
+ if (obj->m_extder_data.total_extder_count > 1) {
+ auto stats = m_plater->get_partplate_list().get_current_fff_print().statistics_by_extruder();
+ auto best = stats.stats_by_multi_extruder_best;
+ auto curr = stats.stats_by_multi_extruder_curr;
+
+ if (curr.filament_flush_weight >= best.filament_flush_weight) {
+ m_link_edit_nozzle->Show(true);
+ m_mapping_sugs_sizer->Show(true);
+ }
+ }
} else {
BOOST_LOG_TRIVIAL(error) << "on_selection_changed dev_id not found";
return;
@@ -3058,6 +3114,41 @@ void SelectMachineDialog::update_ams_check(MachineObject *obj)
}
}
+
+void SelectMachineDialog::update_filament_change_count()
+{
+ /*check filament change times*/
+ PartPlate * part_plate = m_plater->get_partplate_list().get_curr_plate();
+ PrintBase * print = nullptr;
+ GCodeResult *gcode_result = nullptr;
+
+
+ part_plate->get_print(&print, &gcode_result, NULL);
+ if (gcode_result && gcode_result->filament_change_count_map.size() > 0 && m_ams_mapping_result.size() > 0) {
+
+ std::vector filament_ids;
+ for (auto mr : m_ams_mapping_result) {
+ if (mr.ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || mr.ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { filament_ids.push_back(mr.id); }
+ }
+
+ int hand_changes_count = 0;
+ for (auto fi : filament_ids) {
+ for (auto counts : gcode_result->filament_change_count_map) {
+ if (counts.first.first == fi || counts.first.second == fi) { hand_changes_count += counts.second; }
+ }
+ }
+
+ if (hand_changes_count > 0) {
+ m_change_filament_times_sizer->Show(true);
+ m_txt_change_filament_times->Show(true);
+ m_txt_change_filament_times->SetLabel(wxString::Format(_L("You picked both external and AMS filament, You will need to manually change filament %d times."), hand_changes_count));
+ }
+ }
+
+ Layout();
+ Fit();
+}
+
void SelectMachineDialog::update_show_status()
{
// refreshing return
@@ -3139,6 +3230,7 @@ void SelectMachineDialog::update_show_status()
if (m_ams_mapping_result.empty()) {
if (m_checkbox_list["use_ams"]->getValue() == "on") {
do_ams_mapping(obj_);
+ update_filament_change_count();
} else {
clean_ams_mapping = true;
}
@@ -3221,11 +3313,9 @@ void SelectMachineDialog::update_show_status()
return;
}
-
- // do ams mapping if no ams result
- if (m_ams_mapping_result.empty()) {
- do_ams_mapping(obj_);
- }
+ //if (m_ams_mapping_result.empty()) {
+ // do_ams_mapping(obj_);
+ //}
const auto& full_config = wxGetApp().preset_bundle->full_config();
size_t nozzle_nums = full_config.option("nozzle_diameter")->values.size();
@@ -3532,6 +3622,9 @@ void SelectMachineDialog::set_default()
m_print_info = "";
m_comboBox_printer->SetValue(wxEmptyString);
m_comboBox_printer->Enable();
+ m_mapping_sugs_sizer->Show(false);
+ m_change_filament_times_sizer->Show(false);
+ m_txt_change_filament_times->Show(false);
// rset status bar
m_status_bar->reset();
@@ -4023,12 +4116,12 @@ void SelectMachineDialog::set_default_normal(const ThumbnailData &data)
m_basic_panel->Layout();
m_basic_panel->Fit();
- //disable pei bed
- DeviceManager* dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager();
+ // disable pei bed
+ DeviceManager *dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager();
if (!dev_manager) return;
- MachineObject* obj_ = dev_manager->get_selected_machine();
- wxSize screenSize = wxGetDisplaySize();
- auto dialogSize = this->GetSize();
+ MachineObject *obj_ = dev_manager->get_selected_machine();
+ wxSize screenSize = wxGetDisplaySize();
+ auto dialogSize = this->GetSize();
#ifdef __WINDOWS__
diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp
index d0dce5a197..b31244a163 100644
--- a/src/slic3r/GUI/SelectMachine.hpp
+++ b/src/slic3r/GUI/SelectMachine.hpp
@@ -325,6 +325,8 @@ protected:
wxBoxSizer* rename_sizer_v{ nullptr };
wxBoxSizer* rename_sizer_h{ nullptr };
wxBoxSizer* m_sizer_autorefill{ nullptr };
+ wxBoxSizer* m_mapping_sugs_sizer{ nullptr };
+ wxBoxSizer* m_change_filament_times_sizer{ nullptr };
ScalableButton* m_button_refresh{ nullptr };
Button* m_button_ensure{ nullptr };
wxStaticBitmap * m_rename_button{nullptr};
@@ -341,6 +343,7 @@ protected:
wxPanel* m_panel_prepare{nullptr};
wxPanel* m_panel_finish{nullptr};
wxPanel* m_line_top{ nullptr };
+ Label* m_link_edit_nozzle{ nullptr };
Label* m_st_txt_error_code{nullptr};
Label* m_st_txt_error_desc{nullptr};
Label* m_st_txt_extra_info{nullptr};
@@ -353,6 +356,7 @@ protected:
Label* m_stext_time{ nullptr };
Label* m_stext_weight{ nullptr };
Label* m_statictext_ams_msg{ nullptr };
+ Label* m_txt_change_filament_times{ nullptr };
Label* m_text_printer_msg{ nullptr };
wxStaticText* m_staticText_bed_title{ nullptr };
wxStaticText* m_stext_sending{ nullptr };
@@ -413,7 +417,8 @@ public:
void reset_ams_material();
void update_show_status();
void update_ams_check(MachineObject* obj);
- void on_rename_click(wxMouseEvent& event);
+ void update_filament_change_count();
+ void on_rename_click(wxMouseEvent &event);
void on_rename_enter();
void update_printer_combobox(wxCommandEvent& event);
void on_cancel(wxCloseEvent& event);