diff --git a/src/slic3r/GUI/AmsMappingPopup.cpp b/src/slic3r/GUI/AmsMappingPopup.cpp index 3f601f2f2..5689d8e48 100644 --- a/src/slic3r/GUI/AmsMappingPopup.cpp +++ b/src/slic3r/GUI/AmsMappingPopup.cpp @@ -287,13 +287,13 @@ void MaterialItem::doRender(wxDC& dc) dc.DrawBitmap(m_ams_wheel_mitem.bmp(), (GetSize().x / 2 - m_ams_wheel_mitem.GetBmpSize().x) / 2 + 3, ((float)GetSize().y * 3 / 5 - m_ams_wheel_mitem.GetBmpSize().y) / 2 + (float)GetSize().y * 2 / 5); } - AmsMapingPopup::AmsMapingPopup(wxWindow *parent) +AmsMapingPopup::AmsMapingPopup(wxWindow *parent) : PopupWindow(parent, wxBORDER_NONE) { Bind(wxEVT_PAINT, &AmsMapingPopup::paintEvent, this); #if __APPLE__ - Bind(wxEVT_LEFT_DOWN, &AmsMapingPopup::on_left_down, this); + Bind(wxEVT_LEFT_DOWN, &AmsMapingPopup::on_left_down, this); #endif @@ -328,7 +328,7 @@ void MaterialItem::doRender(wxDC& dc) m_left_marea_panel = new wxPanel(this); m_right_marea_panel = new wxPanel(this); - + auto sizer_temp = new wxBoxSizer(wxHORIZONTAL); /*left ext*/ m_left_extra_slot = new MappingItem(m_left_marea_panel); m_left_extra_slot->m_ams_id = VIRTUAL_TRAY_DEPUTY_ID; @@ -336,8 +336,14 @@ void MaterialItem::doRender(wxDC& dc) m_left_extra_slot->SetSize(wxSize(FromDIP(48), FromDIP(60))); m_left_extra_slot->SetMinSize(wxSize(FromDIP(48), FromDIP(60))); m_left_extra_slot->SetMaxSize(wxSize(FromDIP(48), FromDIP(60))); - - + + auto left_panel = new wxPanel(m_left_marea_panel); + left_panel->SetSize(wxSize(FromDIP(182), FromDIP(60))); + left_panel->SetMinSize(wxSize(FromDIP(182), FromDIP(60))); + left_panel->SetMaxSize(wxSize(FromDIP(182), FromDIP(60))); + + sizer_temp->Add(m_left_extra_slot); + sizer_temp->Add(left_panel); /*right ext*/ m_right_extra_slot = new MappingItem(m_right_marea_panel); @@ -346,11 +352,37 @@ void MaterialItem::doRender(wxDC& dc) m_right_extra_slot->SetSize(wxSize(FromDIP(48), FromDIP(60))); m_right_extra_slot->SetMinSize(wxSize(FromDIP(48), FromDIP(60))); m_right_extra_slot->SetMaxSize(wxSize(FromDIP(48), FromDIP(60))); - - m_sizer_ams_left->Add(create_split_sizer(m_left_marea_panel, _L("Left Ams")), 0, wxEXPAND, 0); + + m_sizer_split_ams_left = new wxBoxSizer(wxHORIZONTAL); + auto ams_title_text = new Label(parent, _L("Left Ams")); + ams_title_text->SetFont(::Label::Body_13); + ams_title_text->SetForegroundColour(0x909090); + auto m_split_left_line = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_split_left_line->SetBackgroundColour(0xeeeeee); + m_split_left_line->SetMinSize(wxSize(-1, 1)); + m_split_left_line->SetMaxSize(wxSize(-1, 1)); + m_sizer_split_ams_left->Add(0, 0, 0, wxEXPAND, 0); + m_sizer_split_ams_left->Add(ams_title_text, 0, wxALIGN_CENTER, 0); + m_sizer_split_ams_left->Add(m_split_left_line, 1, wxALIGN_CENTER_VERTICAL, 0); + m_sizer_ams_left->Add(m_sizer_split_ams_left, 0, wxEXPAND, 0); + + m_sizer_split_ams_right = new wxBoxSizer(wxHORIZONTAL); + ams_title_text = new Label(parent, _L("Right Ams")); + ams_title_text->SetFont(::Label::Body_13); + ams_title_text->SetForegroundColour(0x909090); + auto m_split_right_line = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_split_right_line->SetBackgroundColour(0xeeeeee); + m_split_right_line->SetMinSize(wxSize(-1, 1)); + m_split_right_line->SetMaxSize(wxSize(-1, 1)); + m_sizer_split_ams_right->Add(0, 0, 0, wxEXPAND, 0); + m_sizer_split_ams_right->Add(ams_title_text, 0, wxALIGN_CENTER, 0); + m_sizer_split_ams_right->Add(m_split_left_line, 1, wxALIGN_CENTER_VERTICAL, 0); + m_sizer_ams_right->Add(m_sizer_split_ams_right, 0, wxEXPAND, 0); + m_sizer_ams_left->Add(m_sizer_ams_basket_left, 0, wxEXPAND|wxTOP, FromDIP(8)); m_sizer_ams_left->Add(create_split_sizer(m_left_marea_panel, _L("External")), 0, wxEXPAND|wxTOP, FromDIP(8)); - m_sizer_ams_left->Add(m_left_extra_slot, 0, wxEXPAND|wxTOP, FromDIP(8)); + //m_sizer_ams_left->Add(m_left_extra_slot, 0, wxEXPAND|wxTOP, FromDIP(8)); + m_sizer_ams_left->Add(sizer_temp, 0, wxEXPAND | wxTOP, FromDIP(8)); m_sizer_ams_right->Add(create_split_sizer(m_right_marea_panel, _L("Right Ams")), 0, wxEXPAND, 0); m_sizer_ams_right->Add(m_sizer_ams_basket_right, 0, wxEXPAND|wxTOP, FromDIP(8)); @@ -361,7 +393,8 @@ void MaterialItem::doRender(wxDC& dc) m_left_marea_panel->SetSizer(m_sizer_ams_left); m_right_marea_panel->SetSizer(m_sizer_ams_right); - m_sizer_ams->Add(m_left_marea_panel, 0, wxEXPAND, FromDIP(0)); + //m_sizer_ams->Add(m_left_marea_panel, 0, wxEXPAND, FromDIP(0)); + m_sizer_ams->Add(m_left_marea_panel, 0, wxRIGHT, FromDIP(10)); m_sizer_ams->Add(0, 0, 0, wxEXPAND, FromDIP(15)); m_sizer_ams->Add(m_right_marea_panel, 0, wxEXPAND, FromDIP(0)); @@ -371,8 +404,10 @@ void MaterialItem::doRender(wxDC& dc) m_warning_text->SetFont(::Label::Body_12); auto cant_not_match_tip = _L("Note: Only the AMS slots loaded with the same material type can be selected."); m_warning_text->SetLabel(format_text(cant_not_match_tip)); - m_warning_text->SetMinSize(wxSize(FromDIP(248), FromDIP(-1))); - m_warning_text->Wrap(FromDIP(248)); + /*m_warning_text->SetMinSize(wxSize(FromDIP(248), FromDIP(-1))); + m_warning_text->Wrap(FromDIP(248));*/ + /*m_warning_text->SetMinSize(wxSize(FromDIP(496), FromDIP(-1))); + m_warning_text->Wrap(FromDIP(496));*/ m_sizer_main->Add(title_panel, 0, wxEXPAND | wxALL, FromDIP(2)); m_sizer_main->Add(m_sizer_ams, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(14)); @@ -393,18 +428,18 @@ void MaterialItem::doRender(wxDC& dc) wxBoxSizer* AmsMapingPopup::create_split_sizer(wxWindow* parent, wxString text) { - wxBoxSizer* sizer_split_left_ams = new wxBoxSizer(wxHORIZONTAL); - auto left_ams_title_text = new Label(parent, text); - left_ams_title_text->SetFont(::Label::Body_13); - left_ams_title_text->SetForegroundColour(0x909090); - auto m_split_left_line = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); - m_split_left_line->SetBackgroundColour(0xeeeeee); - m_split_left_line->SetMinSize(wxSize(-1, 1)); - m_split_left_line->SetMaxSize(wxSize(-1, 1)); - sizer_split_left_ams->Add(0, 0, 0, wxEXPAND, 0); - sizer_split_left_ams->Add(left_ams_title_text, 0, wxALIGN_CENTER, 0); - sizer_split_left_ams->Add(m_split_left_line, 1, wxALIGN_CENTER_VERTICAL, 0); - return sizer_split_left_ams; + wxBoxSizer* sizer_split_ams = new wxBoxSizer(wxHORIZONTAL); + auto ams_title_text = new Label(parent, text); + ams_title_text->SetFont(::Label::Body_13); + ams_title_text->SetForegroundColour(0x909090); + auto m_split_left_line = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_split_left_line->SetBackgroundColour(0xeeeeee); + m_split_left_line->SetMinSize(wxSize(-1, 1)); + m_split_left_line->SetMaxSize(wxSize(-1, 1)); + sizer_split_ams->Add(0, 0, 0, wxEXPAND, 0); + sizer_split_ams->Add(ams_title_text, 0, wxALIGN_CENTER, 0); + sizer_split_ams->Add(m_split_left_line, 1, wxALIGN_CENTER_VERTICAL, 0); + return sizer_split_ams; } wxString AmsMapingPopup::format_text(wxString &m_msg) @@ -502,14 +537,14 @@ void AmsMapingPopup::update_ams_data_multi_machines() Fit(); } -void AmsMapingPopup::update(MachineObject* obj) -{ +void AmsMapingPopup::update(MachineObject* obj) +{ BOOST_LOG_TRIVIAL(info) << "ams_mapping nozzle count " << obj->m_np_nozzle_data.nozzle.size(); BOOST_LOG_TRIVIAL(info) << "ams_mapping total count " << obj->amsList.size(); if (!obj) {return;} - + for (auto& ams_container : m_amsmapping_container_list) { ams_container->Destroy(); } @@ -518,15 +553,52 @@ void AmsMapingPopup::update(MachineObject* obj) m_amsmapping_container_sizer_list.clear(); m_mapping_item_list.clear(); + /*ext*/ - if (obj->vt_slot.size() == 1) { + const auto& full_config = wxGetApp().preset_bundle->full_config(); + size_t nozzle_nums = full_config.option("nozzle_diameter")->values.size(); + if (nozzle_nums == 1) { + m_warning_text->SetMinSize(wxSize(FromDIP(248), FromDIP(-1))); + m_warning_text->Wrap(FromDIP(248)); m_left_marea_panel->Hide(); - m_right_extra_slot->Hide(); - } - else if (obj->vt_slot.size() > 1) { - m_left_marea_panel->Show(); + m_left_extra_slot->Hide(); + //m_left_marea_panel->Show(); + m_right_marea_panel->Show(); m_right_extra_slot->Show(); } + else if (nozzle_nums > 1) { + m_left_marea_panel->Hide(); + m_right_marea_panel->Hide(); + m_left_extra_slot->Hide(); + m_right_extra_slot->Hide(); + if (m_show_type != ShowType::LEFT_AND_RIGHT) + { + m_warning_text->SetMinSize(wxSize(FromDIP(248), FromDIP(-1))); + m_warning_text->Wrap(FromDIP(248)); + } + if (m_show_type == ShowType::LEFT) + { + m_sizer_split_ams_left->Show(false); + m_left_marea_panel->Show(); + m_left_extra_slot->Show(); + } + else if (m_show_type == ShowType::RIGHT) + { + m_sizer_split_ams_right->Show(false); + m_right_marea_panel->Show(); + m_right_extra_slot->Show(); + } + else if (m_show_type == ShowType::LEFT_AND_RIGHT) + { + m_warning_text->SetMinSize(wxSize(FromDIP(496), FromDIP(-1))); + m_warning_text->Wrap(FromDIP(496)); + m_left_marea_panel->Show(); + m_left_extra_slot->Show(); + m_right_marea_panel->Show(); + m_right_extra_slot->Show(); + } + + } for (int i = 0; i < obj->vt_slot.size(); i++) { diff --git a/src/slic3r/GUI/AmsMappingPopup.hpp b/src/slic3r/GUI/AmsMappingPopup.hpp index 4aa39abca..42de016e8 100644 --- a/src/slic3r/GUI/AmsMappingPopup.hpp +++ b/src/slic3r/GUI/AmsMappingPopup.hpp @@ -51,6 +51,12 @@ enum TrayType { EMPTY }; +enum ShowType { + LEFT, // only show left ams and left ext + RIGHT, //only show right ams and right ext + LEFT_AND_RIGHT //show left and right ams at the same time +}; + struct TrayData { TrayType type; @@ -148,32 +154,36 @@ public: AmsMapingPopup(wxWindow *parent); ~AmsMapingPopup() {}; - wxWindow* send_win{nullptr}; - wxStaticText * m_warning_text{nullptr}; + wxWindow* send_win{ nullptr }; + wxStaticText * m_warning_text{nullptr}; std::vector m_materials_list; std::vector m_amsmapping_container_sizer_list; std::vector m_amsmapping_container_list; std::vector m_mapping_item_list; bool m_has_unmatch_filament {false}; - bool m_supporting_mix_print {false}; + bool m_supporting_mix_print {false}; //For single extruder, can ams and ext print together? int m_current_filament_id; + ShowType m_show_type; std::string m_tag_material; - wxBoxSizer *m_sizer_main{nullptr}; - wxBoxSizer *m_sizer_ams{nullptr}; - wxBoxSizer *m_sizer_ams_left{nullptr}; - wxBoxSizer *m_sizer_ams_right{nullptr}; + wxBoxSizer *m_sizer_main{nullptr}; + wxBoxSizer *m_sizer_ams{nullptr}; + wxBoxSizer *m_sizer_ams_left{nullptr}; + wxBoxSizer *m_sizer_ams_right{nullptr}; wxBoxSizer* m_sizer_ams_basket_left{ nullptr }; wxBoxSizer* m_sizer_ams_basket_right{ nullptr }; - wxBoxSizer *m_sizer_list{nullptr}; + wxBoxSizer *m_sizer_list{nullptr}; wxWindow *m_parent_item{nullptr}; - MappingItem* m_left_extra_slot{nullptr}; + MappingItem* m_left_extra_slot{nullptr}; MappingItem* m_right_extra_slot{nullptr}; wxPanel* m_left_marea_panel; wxPanel* m_right_marea_panel; + wxBoxSizer* m_sizer_split_ams_left; + wxBoxSizer* m_sizer_split_ams_right; + wxBoxSizer* create_split_sizer(wxWindow* parent, wxString text); wxString format_text(wxString &m_msg); void set_send_win(wxWindow* win) {send_win = win;}; @@ -191,6 +201,7 @@ public: virtual bool ProcessLeftDown(wxMouseEvent &event) wxOVERRIDE; void paintEvent(wxPaintEvent &evt); void set_parent_item(wxWindow* item) {m_parent_item = item;}; + void set_show_type(ShowType type) { m_show_type = type; }; std::vector parse_ams_mapping(std::map amsList); }; diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 50b11e93b..91890fe8f 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -900,11 +900,11 @@ int MachineObject::ams_filament_mapping(std::vector filaments, std { tray_filaments.emplace(std::make_pair(tray_index, info)); } - else if (ams->second->nozzle == 0 && ext_first) + else if (ams->second->nozzle == 0 && ext_second) { tray_filaments.emplace(std::make_pair(tray_index, info)); } - else if (ams->second->nozzle == 1 && ext_second) + else if (ams->second->nozzle == 1 && ext_first) { tray_filaments.emplace(std::make_pair(tray_index, info)); } diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 06fc34223..3276bc9cf 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -2153,6 +2153,9 @@ bool SelectMachineDialog::get_ams_mapping_result(std::string &mapping_array_str, } bool SelectMachineDialog::is_two_nozzle_same() { + //if two extruder are same and can be mix-used, return true + //else return false + //wait to fill return false; } @@ -3809,7 +3812,9 @@ void SelectMachineDialog::update_show_status() do_ams_mapping(obj_); } - if (!m_mapping_popup.m_supporting_mix_print) + const auto& full_config = wxGetApp().preset_bundle->full_config(); + size_t nozzle_nums = full_config.option("nozzle_diameter")->values.size(); + if (!m_mapping_popup.m_supporting_mix_print && nozzle_nums == 1) { bool useAms = false; bool useExt = false; @@ -4324,7 +4329,24 @@ void SelectMachineDialog::reset_and_sync_ams_list() DeviceManager *dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev_manager) return; MachineObject *obj_ = dev_manager->get_selected_machine(); - + const auto& full_config = wxGetApp().preset_bundle->full_config(); + size_t nozzle_nums = full_config.option("nozzle_diameter")->values.size(); + if (nozzle_nums > 1) + { + if (is_two_nozzle_same()) + { + m_mapping_popup.set_show_type(ShowType::LEFT_AND_RIGHT); + } + else if (m_filaments_map[extruder] == 1) + { + m_mapping_popup.set_show_type(ShowType::LEFT); + } + else if(m_filaments_map[extruder] == 2) + { + m_mapping_popup.set_show_type(ShowType::RIGHT); + } + } + //m_mapping_popup.set_show_type(ShowType::RIGHT); if (obj_ && obj_->is_support_ams_mapping()) { if (m_mapping_popup.IsShown()) return; wxPoint pos = item->ClientToScreen(wxPoint(0, 0)); @@ -4378,11 +4400,15 @@ void SelectMachineDialog::reset_and_sync_ams_list() } else { + m_filament_left_panel->Hide(); + m_filament_right_panel->Hide(); + m_filament_panel->Show(); + //m_filament_panel_left_sizer->Layout(); m_sizer_ams_mapping->SetCols(8); m_sizer_ams_mapping->Layout(); m_filament_panel_sizer->Layout(); } - + // reset_ams_material();//show "-" }