diff --git a/src/slic3r/GUI/AmsMappingPopup.cpp b/src/slic3r/GUI/AmsMappingPopup.cpp index 6e310bafea..772d85c227 100644 --- a/src/slic3r/GUI/AmsMappingPopup.cpp +++ b/src/slic3r/GUI/AmsMappingPopup.cpp @@ -283,13 +283,13 @@ void MaterialItem::doRender(wxDC &dc) } - 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 @@ -324,7 +324,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; @@ -332,8 +332,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); @@ -342,11 +348,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)); @@ -357,7 +389,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)); @@ -367,8 +400,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)); @@ -389,18 +424,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) @@ -497,14 +532,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_extder_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(); } @@ -513,15 +548,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 ded16e5c24..6e75382dd3 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; @@ -147,32 +153,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;}; @@ -190,6 +200,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 5ef5b69c5b..f898cda41e 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -918,11 +918,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 736d12ebff..41f2473074 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -1311,6 +1311,9 @@ bool SelectMachineDialog::build_nozzles_info(std::string& nozzles_info) } 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; } @@ -2927,7 +2930,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; @@ -3440,7 +3445,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)); @@ -3494,11 +3516,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 "-" }