diff --git a/src/slic3r/GUI/AMSMaterialsSetting.cpp b/src/slic3r/GUI/AMSMaterialsSetting.cpp index db04cf5065..53b9452d20 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.cpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.cpp @@ -532,12 +532,8 @@ void AMSMaterialsSetting::on_select_reset(wxCommandEvent& event) { if (is_virtual_tray()) { tray_id = ams_id; if (!obj->is_enable_np) { - tray_id = VIRTUAL_TRAY_ID; + tray_id = VIRTUAL_TRAY_DEPUTY_ID; } - - // TODO: Orca hack - ams_id = 255; - slot_id = 0; } select_index_info.tray_id = tray_id; select_index_info.ams_id = ams_id; @@ -658,13 +654,13 @@ void AMSMaterialsSetting::on_select_ok(wxCommandEvent &event) auto vt_tray = ams_id; if (!obj->is_enable_np) { - vt_tray = VIRTUAL_TRAY_ID; + vt_tray = VIRTUAL_TRAY_DEPUTY_ID; } if (obj->cali_version >= 0) { PACalibIndexInfo select_index_info; select_index_info.tray_id = vt_tray; - select_index_info.ams_id = 255; // TODO: Orca hack + select_index_info.ams_id = ams_id; select_index_info.slot_id = 0; select_index_info.nozzle_diameter = obj->m_extder_data.extders[0].current_nozzle_diameter; @@ -794,7 +790,7 @@ void AMSMaterialsSetting::on_clr_picker(wxMouseEvent &event) bool AMSMaterialsSetting::is_virtual_tray() { - if (ams_id == VIRTUAL_TRAY_ID) + if (ams_id == VIRTUAL_TRAY_MAIN_ID || ams_id == VIRTUAL_TRAY_DEPUTY_ID) return true; return false; } @@ -1171,15 +1167,16 @@ void AMSMaterialsSetting::on_select_filament(wxCommandEvent &evt) } m_comboBox_cali_result->Set(items); - if (ams_id == VIRTUAL_TRAY_ID) { - AmsTray selected_tray = this->obj->vt_tray; - cali_select_idx = CalibUtils::get_selected_calib_idx(m_pa_profile_items,selected_tray.cali_idx); - if (cali_select_idx >= 0) { + if (ams_id == VIRTUAL_TRAY_MAIN_ID || ams_id == VIRTUAL_TRAY_DEPUTY_ID) { + for (auto slot : obj->vt_slot) { + if (slot.id == std::to_string(ams_id)) + cali_select_idx = CalibUtils::get_selected_calib_idx(m_pa_profile_items, slot.cali_idx); + } + + if (cali_select_idx >= 0) m_comboBox_cali_result->SetSelection(cali_select_idx); - } - else { + else m_comboBox_cali_result->SetSelection(0); - } } else { if (this->obj->amsList.find(std::to_string(ams_id)) != this->obj->amsList.end()) { diff --git a/src/slic3r/GUI/AmsMappingPopup.cpp b/src/slic3r/GUI/AmsMappingPopup.cpp index ca73bacd86..6e310bafea 100644 --- a/src/slic3r/GUI/AmsMappingPopup.cpp +++ b/src/slic3r/GUI/AmsMappingPopup.cpp @@ -292,12 +292,15 @@ void MaterialItem::doRender(wxDC &dc) Bind(wxEVT_LEFT_DOWN, &AmsMapingPopup::on_left_down, this); #endif + SetBackgroundColour(*wxWHITE); m_sizer_main = new wxBoxSizer(wxVERTICAL); m_sizer_ams = new wxBoxSizer(wxHORIZONTAL); m_sizer_ams_left = new wxBoxSizer(wxVERTICAL); m_sizer_ams_right = new wxBoxSizer(wxVERTICAL); + m_sizer_ams_basket_left = new wxBoxSizer(wxVERTICAL); + m_sizer_ams_basket_right = new wxBoxSizer(wxVERTICAL); auto title_panel = new wxPanel(this, wxID_ANY); @@ -318,14 +321,45 @@ void MaterialItem::doRender(wxDC &dc) title_panel->Layout(); title_panel->Fit(); - auto left_ams_title_text = new wxStaticText(this, wxID_ANY, _L("Left Ams")); - auto right_ams_title_text = new wxStaticText(this, wxID_ANY, _L("Right Ams")); + m_left_marea_panel = new wxPanel(this); + m_right_marea_panel = new wxPanel(this); - m_sizer_ams_left->Add(left_ams_title_text, 0, wxALIGN_CENTER, 0); - m_sizer_ams_right->Add(right_ams_title_text, 0, wxALIGN_CENTER, 0); - - m_sizer_ams->Add(m_sizer_ams_left, 0, wxEXPAND | wxALL, FromDIP(0)); - m_sizer_ams->Add(m_sizer_ams_right, 0, wxEXPAND | wxALL, FromDIP(0)); + + /*left ext*/ + m_left_extra_slot = new MappingItem(m_left_marea_panel); + m_left_extra_slot->m_ams_id = VIRTUAL_TRAY_DEPUTY_ID; + m_left_extra_slot->m_slot_id = 0; + 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))); + + + + /*right ext*/ + m_right_extra_slot = new MappingItem(m_right_marea_panel); + m_right_extra_slot->m_ams_id = VIRTUAL_TRAY_MAIN_ID; + m_right_extra_slot->m_slot_id = 0; + 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_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_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)); + m_sizer_ams_right->Add(create_split_sizer(m_right_marea_panel, _L("External")), 0, wxEXPAND|wxTOP, FromDIP(8)); + m_sizer_ams_right->Add(m_right_extra_slot, 0, wxEXPAND|wxTOP, FromDIP(8)); + + + 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(0, 0, 0, wxEXPAND, FromDIP(15)); + m_sizer_ams->Add(m_right_marea_panel, 0, wxEXPAND, FromDIP(0)); m_warning_text = new wxStaticText(this, wxID_ANY, wxEmptyString); @@ -337,7 +371,7 @@ void MaterialItem::doRender(wxDC &dc) m_warning_text->Wrap(FromDIP(248)); m_sizer_main->Add(title_panel, 0, wxEXPAND | wxALL, FromDIP(2)); - m_sizer_main->Add(m_sizer_ams, 0, wxEXPAND | wxALL, FromDIP(2)); + m_sizer_main->Add(m_sizer_ams, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(14)); m_sizer_main->Add(m_warning_text, 0, wxEXPAND | wxALL, FromDIP(6)); SetSizer(m_sizer_main); @@ -353,6 +387,22 @@ 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; + } + wxString AmsMapingPopup::format_text(wxString &m_msg) { if (wxGetApp().app_config->get("language") != "zh_CN") { return m_msg; } @@ -447,12 +497,14 @@ void AmsMapingPopup::update_ams_data_multi_machines() Fit(); } -void AmsMapingPopup::update_ams_data(std::map amsList) +void AmsMapingPopup::update(MachineObject* obj) { - std::map::iterator ams_iter; - BOOST_LOG_TRIVIAL(trace) << "ams_mapping total count " << amsList.size(); + //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(); } @@ -461,7 +513,57 @@ void AmsMapingPopup::update_ams_data(std::map amsList) m_amsmapping_container_sizer_list.clear(); m_mapping_item_list.clear(); - for (ams_iter = amsList.begin(); ams_iter != amsList.end(); ams_iter++) { + /*ext*/ + if (obj->vt_slot.size() == 1) { + m_left_marea_panel->Hide(); + m_right_extra_slot->Hide(); + } + else if (obj->vt_slot.size() > 1) { + m_left_marea_panel->Show(); + m_right_extra_slot->Show(); + } + + for (int i = 0; i < obj->vt_slot.size(); i++) { + + AmsTray* tray_data = &obj->vt_slot[i]; + TrayData td; + + td.id = std::stoi(tray_data->id); + td.ams_id = std::stoi(tray_data->id); + td.slot_id = 0; + + if (!tray_data->is_exists) { + td.type = EMPTY; + } + else { + if (!tray_data->is_tray_info_ready()) { + td.type = THIRD; + } + else { + td.type = NORMAL; + td.colour = AmsTray::decode_color(tray_data->color); + td.name = tray_data->get_display_filament_type(); + td.filament_type = tray_data->get_filament_type(); + td.ctype = tray_data->ctype; + for (auto col : tray_data->cols) { + td.material_cols.push_back(AmsTray::decode_color(col)); + } + } + } + + if (obj->vt_slot[i].id == std::to_string(VIRTUAL_TRAY_MAIN_ID)) { + m_right_extra_slot->send_win = send_win; + add_ext_ams_mapping(td, m_right_extra_slot); + } + else if (obj->vt_slot[i].id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { + m_left_extra_slot->send_win = send_win; + add_ext_ams_mapping(td, m_left_extra_slot); + } + } + + + /*ams*/ + for (std::map::iterator ams_iter = obj->amsList.begin(); ams_iter != obj->amsList.end(); ams_iter++) { int ams_indx = atoi(ams_iter->first.c_str()); int ams_type = ams_iter->second->type; @@ -470,7 +572,7 @@ void AmsMapingPopup::update_ams_data(std::map amsList) if (ams_type >=1 || ams_type <= 3) { //1:ams 2:ams-lite 3:n3f auto sizer_mapping_list = new wxBoxSizer(wxHORIZONTAL); - auto ams_mapping_item_container = new MappingContainer(this); + auto ams_mapping_item_container = new MappingContainer(nozzle_id == 0? m_right_marea_panel:m_left_marea_panel); ams_mapping_item_container->SetSizer(sizer_mapping_list); ams_mapping_item_container->Layout(); @@ -486,7 +588,9 @@ void AmsMapingPopup::update_ams_data(std::map amsList) AmsTray* tray_data = tray_iter->second; TrayData td; - td.id = ams_indx * AMS_TOTAL_COUNT + atoi(tray_data->id.c_str()); + td.id = ams_indx * AMS_TOTAL_COUNT + atoi(tray_data->id.c_str()); + td.ams_id = std::stoi(ams_iter->second->id); + td.slot_id = std::stoi(tray_iter->second->id); if (!tray_data->is_exists) { td.type = EMPTY; @@ -505,9 +609,6 @@ void AmsMapingPopup::update_ams_data(std::map amsList) td.material_cols.push_back(AmsTray::decode_color(col)); } } - - td.ams_id = std::stoi(ams_iter->second->id); - td.slot_id = std::stoi(tray_iter->second->id); } tray_datas.push_back(td); @@ -515,19 +616,15 @@ void AmsMapingPopup::update_ams_data(std::map amsList) ams_mapping_item_container->Show(); add_ams_mapping(tray_datas, ams_mapping_item_container, sizer_mapping_list); - - m_amsmapping_container_sizer_list.push_back(sizer_mapping_list); m_amsmapping_container_list.push_back(ams_mapping_item_container); - //main nozzle = right nozzle - if (nozzle_id == 0) { - m_sizer_ams_right->Add(ams_mapping_item_container, 0, wxALIGN_CENTER, 0); + if (nozzle_id == 0) { //right slot + m_sizer_ams_basket_right->Add(ams_mapping_item_container, 0, wxALIGN_CENTER, 0); } - else if (nozzle_id == 1) { - m_sizer_ams_left->Add(ams_mapping_item_container, 0, wxALIGN_CENTER, 0); + else if (nozzle_id == 1) { //left slot + m_sizer_ams_basket_left->Add(ams_mapping_item_container, 0, wxALIGN_CENTER, 0); } - //m_warning_text->Show(m_has_unmatch_filament); } @@ -535,8 +632,6 @@ void AmsMapingPopup::update_ams_data(std::map amsList) } } - /*extra tray*/ - Layout(); Fit(); } @@ -586,25 +681,20 @@ std::vector AmsMapingPopup::parse_ams_mapping(std::map tray_data, wxWindow* container, wxBoxSizer* sizer) { sizer->Add(0,0,0,wxLEFT,FromDIP(6)); + for (auto i = 0; i < tray_data.size(); i++) { - // set number - /* auto number = new wxStaticText(this, wxID_ANY, wxGetApp().transition_tridid(tray_data[i].id), wxDefaultPosition, wxDefaultSize, 0); - number->SetFont(::Label::Body_13); - number->SetForegroundColour(wxColour(0X6B, 0X6B, 0X6B)); - number->Wrap(-1);*/ - - // set button MappingItem *m_mapping_item = new MappingItem(container); + m_mapping_item->send_win = send_win; m_mapping_item->m_ams_id = tray_data[i].ams_id; m_mapping_item->m_slot_id = tray_data[i].slot_id; + m_mapping_item->set_tray_index(wxGetApp().transition_tridid(tray_data[i].id)); + + m_mapping_item->SetSize(wxSize(FromDIP(48), FromDIP(60))); + m_mapping_item->SetMinSize(wxSize(FromDIP(48), FromDIP(60))); + m_mapping_item->SetMaxSize(wxSize(FromDIP(48), FromDIP(60))); - m_mapping_item->SetSize(wxSize(FromDIP(68 * 0.7), FromDIP(100 * 0.6))); - m_mapping_item->SetMinSize(wxSize(FromDIP(68 * 0.7), FromDIP(100 * 0.6))); - m_mapping_item->SetMaxSize(wxSize(FromDIP(68 * 0.7), FromDIP(100 * 0.6))); - //m_mapping_item->SetCornerRadius(5); - m_mapping_item->SetFont(::Label::Body_12); m_mapping_item_list.push_back(m_mapping_item); if (tray_data[i].type == NORMAL) { @@ -641,14 +731,50 @@ void AmsMapingPopup::add_ams_mapping(std::vector tray_data, wxWindow* }); } - - //sizer_mapping_item->Add(number, 0, wxALIGN_CENTER_HORIZONTAL, 0); - //sizer_mapping_item->Add(m_mapping_item, 0, wxALIGN_CENTER_HORIZONTAL, 0); - m_mapping_item->set_tray_index(wxGetApp().transition_tridid(tray_data[i].id)); - sizer->Add(0,0,0,wxRIGHT,FromDIP(6)); + sizer->Add(0, 0, 0, wxRIGHT, FromDIP(6)); sizer->Add(m_mapping_item, 0, wxTOP, FromDIP(1)); } +} +void AmsMapingPopup::add_ext_ams_mapping(TrayData tray_data, MappingItem* item) +{ + // set button + if (tray_data.type == NORMAL) { + if (is_match_material(tray_data.filament_type)) { + item->set_data(tray_data.colour, tray_data.name, tray_data); + } + else { + item->set_data(wxColour(0xEE, 0xEE, 0xEE), tray_data.name, tray_data, true); + m_has_unmatch_filament = true; + } + + item->Bind(wxEVT_LEFT_DOWN, [this, tray_data, item](wxMouseEvent& e) { + if (!is_match_material(tray_data.filament_type)) return; + item->send_event(m_current_filament_id); + Dismiss(); + }); + } + + + // temp + if (tray_data.type == EMPTY) { + item->set_data(wxColour(0xCE, 0xCE, 0xCE), "-", tray_data); + item->Bind(wxEVT_LEFT_DOWN, [this, tray_data,item](wxMouseEvent& e) { + item->send_event(m_current_filament_id); + Dismiss(); + }); + } + + // third party + if (tray_data.type == THIRD) { + item->set_data(wxColour(0xCE, 0xCE, 0xCE), "?", tray_data); + item->Bind(wxEVT_LEFT_DOWN, [this, tray_data, item](wxMouseEvent& e) { + item->send_event(m_current_filament_id); + Dismiss(); + }); + } + + item->set_tray_index(_L("Ext")); } void AmsMapingPopup::OnDismiss() @@ -688,15 +814,17 @@ void AmsMapingPopup::paintEvent(wxPaintEvent &evt) void MappingItem::send_event(int fliament_id) { - auto number = wxGetApp().transition_tridid(m_tray_data.id); wxCommandEvent event(EVT_SET_FINISH_MAPPING); event.SetInt(m_tray_data.id); - wxString param = wxString::Format("%d|%d|%d|%d|%s|%d|%d|%d", m_coloul.Red(), m_coloul.Green(), m_coloul.Blue(), m_coloul.Alpha(), number, fliament_id, + wxString param = wxString::Format("%d|%d|%d|%d|%s|%d|%d|%d", m_coloul.Red(), m_coloul.Green(), m_coloul.Blue(), m_coloul.Alpha(), m_tray_index, fliament_id, m_tray_data.ams_id, m_tray_data.slot_id); event.SetString(param); - event.SetEventObject(this->GetParent()->GetParent()); - wxPostEvent(this->GetParent()->GetParent()->GetParent(), event); + + if (send_win) { + event.SetEventObject(send_win); + wxPostEvent(send_win, event); + } } void MappingItem::msw_rescale() diff --git a/src/slic3r/GUI/AmsMappingPopup.hpp b/src/slic3r/GUI/AmsMappingPopup.hpp index 7c64cba2f2..addb1070e1 100644 --- a/src/slic3r/GUI/AmsMappingPopup.hpp +++ b/src/slic3r/GUI/AmsMappingPopup.hpp @@ -112,6 +112,7 @@ public: void send_event(int fliament_id); void set_tray_index(wxString t_index) {m_tray_index = t_index;}; + wxWindow*send_win{nullptr}; wxString m_tray_index; wxColour m_coloul; wxString m_name; @@ -144,8 +145,9 @@ class AmsMapingPopup : public PopupWindow { public: AmsMapingPopup(wxWindow *parent); - ~AmsMapingPopup(){}; + ~AmsMapingPopup() {}; + wxWindow* send_win{nullptr}; wxStaticText * m_warning_text{nullptr}; std::vector m_materials_list; std::vector m_amsmapping_container_sizer_list; @@ -159,16 +161,27 @@ public: 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}; - wxWindow *m_parent_item{nullptr}; + wxWindow *m_parent_item{nullptr}; + MappingItem* m_left_extra_slot{nullptr}; + MappingItem* m_right_extra_slot{nullptr}; + + wxPanel* m_left_marea_panel; + wxPanel* m_right_marea_panel; + + wxBoxSizer* create_split_sizer(wxWindow* parent, wxString text); wxString format_text(wxString &m_msg); + void set_send_win(wxWindow* win) {send_win = win;}; void update_materials_list(std::vector list); void set_tag_texture(std::string texture); - void update_ams_data(std::map amsList); + void update(MachineObject* obj); void update_ams_data_multi_machines(); void add_ams_mapping(std::vector tray_data, wxWindow* container, wxBoxSizer* sizer); - void set_current_filament_id(int id){m_current_filament_id = id;}; + void add_ext_ams_mapping(TrayData tray_data, MappingItem* item); + void set_current_filament_id(int id) { m_current_filament_id = id; }; int get_current_filament_id(){return m_current_filament_id;}; bool is_match_material(std::string material); void on_left_down(wxMouseEvent &evt); diff --git a/src/slic3r/GUI/CalibrationWizard.cpp b/src/slic3r/GUI/CalibrationWizard.cpp index 56f202b926..29a180730d 100644 --- a/src/slic3r/GUI/CalibrationWizard.cpp +++ b/src/slic3r/GUI/CalibrationWizard.cpp @@ -108,12 +108,12 @@ void CalibrationWizard::get_tray_ams_and_slot_id(int in_tray_id, int &ams_id, in if (!curr_obj) return; - if (in_tray_id == VIRTUAL_TRAY_ID || in_tray_id == VIRTUAL_TRAY_ID) { + if (in_tray_id == VIRTUAL_TRAY_MAIN_ID || in_tray_id == VIRTUAL_TRAY_DEPUTY_ID) { ams_id = in_tray_id; slot_id = 0; tray_id = ams_id; if (!curr_obj->is_enable_np) - tray_id = VIRTUAL_TRAY_ID; + tray_id = VIRTUAL_TRAY_DEPUTY_ID; } else { ams_id = in_tray_id / 4; diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp index 581b9153bb..82df35f098 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp @@ -1530,7 +1530,7 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj) // init default for filament source // TODO if user change ams/ext, need to update - if ( !obj->has_ams() || (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_ID)) ) + if ( !obj->has_ams() || (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_MAIN_ID)) ) { m_ext_spool_radiobox->SetValue(true); m_ams_radiobox->SetValue(false); @@ -1583,8 +1583,8 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) } // init virtual tray info - if (full_filament_ams_list.find(VIRTUAL_TRAY_ID) != full_filament_ams_list.end()) { - filament_ams_list[VIRTUAL_TRAY_ID] = full_filament_ams_list[VIRTUAL_TRAY_ID]; + if (full_filament_ams_list.find(VIRTUAL_TRAY_MAIN_ID) != full_filament_ams_list.end()) { + filament_ams_list[VIRTUAL_TRAY_MAIN_ID] = full_filament_ams_list[VIRTUAL_TRAY_MAIN_ID]; } @@ -1787,14 +1787,14 @@ void CalibrationPresetPage::update_filament_combobox(std::string ams_id) // update virtual tray combo box m_virtual_tray_comboBox->update_from_preset(); auto it = std::find_if(filament_ams_list.begin(), filament_ams_list.end(), [](auto& entry) { - return entry.first == VIRTUAL_TRAY_ID; + return entry.first == VIRTUAL_TRAY_MAIN_ID; }); if (it != filament_ams_list.end()) { - m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_ID, it->second); + m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_MAIN_ID, it->second); } else { - m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_ID, empty_config); + m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_MAIN_ID, empty_config); } if (filament_ams_list.empty()) diff --git a/src/slic3r/GUI/CalibrationWizardSavePage.cpp b/src/slic3r/GUI/CalibrationWizardSavePage.cpp index 5e7dd3f493..bab1ac159d 100644 --- a/src/slic3r/GUI/CalibrationWizardSavePage.cpp +++ b/src/slic3r/GUI/CalibrationWizardSavePage.cpp @@ -61,7 +61,7 @@ static wxString get_default_name(wxString filament_name, CalibMode mode){ static wxString get_tray_name_by_tray_id(int tray_id) { wxString tray_name; - if (tray_id == VIRTUAL_TRAY_ID) { + if (tray_id == VIRTUAL_TRAY_MAIN_ID) { tray_name = "Ext"; } else { diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index d4ece5ebbe..69d9adbad3 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -574,8 +574,7 @@ MachineObject::MachineObject(NetworkAgent* agent, std::string name, std::string subtask_(nullptr), model_task(nullptr), slice_info(nullptr), - m_is_online(false), - vt_tray(std::to_string(VIRTUAL_TRAY_ID)) + m_is_online(false) { m_agent = agent; @@ -627,6 +626,10 @@ MachineObject::MachineObject(NetworkAgent* agent, std::string name, std::string has_ipcam = true; // default true + + auto vslot = AmsTray(std::to_string(VIRTUAL_TRAY_MAIN_ID)); + vt_slot.push_back(vslot); + m_extder_data.current_extder_id = MAIN_NOZZLE_ID; m_extder_data.target_extder_id = MAIN_NOZZLE_ID; m_extder_data.total_extder_count = 1; @@ -773,8 +776,8 @@ Ams *MachineObject::get_curr_Ams() AmsTray *MachineObject::get_curr_tray() { - if (m_tray_now.compare(std::to_string(VIRTUAL_TRAY_ID)) == 0) { - return &vt_tray; + if (m_tray_now.compare(std::to_string(VIRTUAL_TRAY_MAIN_ID)) == 0) { + return &vt_slot[0]; } Ams* curr_ams = get_curr_Ams(); @@ -1150,18 +1153,22 @@ bool MachineObject::is_valid_mapping_result(std::vector& result, b for (int i = 0; i < result.size(); i++) { // invalid mapping result - if (result[i].tray_id < 0) - valid_ams_mapping_result = false; - else { - int ams_id = result[i].tray_id / 4; - auto ams_item = amsList.find(std::to_string(ams_id)); - if (ams_item == amsList.end()) { - result[i].tray_id = -1; + if (result[i].tray_id < 0) { + if (result[i].ams_id.empty() && result[i].slot_id.empty()) { valid_ams_mapping_result = false; + } + } + else { + auto ams_item = amsList.find(result[i].ams_id); + if (ams_item == amsList.end()) { + if ( (result[i].ams_id != std::to_string(VIRTUAL_TRAY_MAIN_ID)) && + (result[i].ams_id != std::to_string(VIRTUAL_TRAY_DEPUTY_ID))) { + result[i].tray_id = -1; + valid_ams_mapping_result = false; + } } else { if (check_empty_slot) { - int tray_id = result[i].tray_id % 4; - auto tray_item = ams_item->second->trayList.find(std::to_string(tray_id)); + auto tray_item = ams_item->second->trayList.find(result[i].slot_id); if (tray_item == ams_item->second->trayList.end()) { result[i].tray_id = -1; valid_ams_mapping_result = false; @@ -1918,37 +1925,6 @@ int MachineObject::command_set_chamber(int temp) return this->publish_json(j.dump(), 1); } -//int MachineObject::command_ams_switch(int tray_index, int old_temp, int new_temp) -//{ -// BOOST_LOG_TRIVIAL(trace) << "ams_switch to " << tray_index << " with temp: " << old_temp << ", " << new_temp; -// if (old_temp < 0) old_temp = FILAMENT_DEF_TEMP; -// if (new_temp < 0) new_temp = FILAMENT_DEF_TEMP; -// -// std::string gcode = ""; -// int result = 0; -// -// //command -// if (is_support_command_ams_switch) { -// command_ams_change_filament(tray_index, old_temp, new_temp); -// } -// else { -// std::string gcode = ""; -// if (tray_index == 255) { -// gcode = DeviceManager::load_gcode(printer_type, "ams_unload.gcode"); -// } -// else { -// // include VIRTUAL_TRAY_ID -// gcode = DeviceManager::load_gcode(printer_type, "ams_load.gcode"); -// boost::replace_all(gcode, "[next_extruder]", std::to_string(tray_index)); -// boost::replace_all(gcode, "[new_filament_temp]", std::to_string(new_temp)); -// } -// -// result = this->publish_gcode(gcode); -// } -// -// return result; -//} - int MachineObject::command_ams_change_filament(bool load, std::string ams_id, std::string slot_id, int old_temp, int new_temp) { json j; @@ -2017,9 +1993,8 @@ int MachineObject::command_ams_filament_settings(int ams_id, int slot_id, std::s int tag_ams_id = ams_id; int tag_slot_id = slot_id; - if (tag_ams_id == VIRTUAL_TRAY_ID) { - tag_tray_id = VIRTUAL_TRAY_ID; - tag_ams_id = 255; // TODO: Orca hack + if (tag_ams_id == VIRTUAL_TRAY_MAIN_ID || tag_ams_id == VIRTUAL_TRAY_DEPUTY_ID) { + tag_tray_id = VIRTUAL_TRAY_DEPUTY_ID; } else { tag_tray_id = tag_slot_id; } @@ -2720,8 +2695,13 @@ void MachineObject::reset() json empty_j; print_json.diff2all_base_reset(empty_j); - vt_tray.reset(); + for (auto i = 0; i < vt_slot.size(); i++) { + vt_slot[i].reset(); + if (i == 1) { + vt_slot.erase(vt_slot.begin() + 1); + } + } subtask_ = nullptr; } @@ -4400,8 +4380,6 @@ int MachineObject::parse_json(std::string payload, bool key_field_only) } } - std::string temp = tray_it->dump(); - if (tray_it->contains("cali_idx")) { curr_tray->cali_idx = (*tray_it)["cali_idx"].get(); } @@ -4433,12 +4411,50 @@ int MachineObject::parse_json(std::string payload, bool key_field_only) /* vitrual tray*/ if (!key_field_only) { try { - if (jj.contains("vt_tray")) { - auto main_slot = parse_vt_tray(jj["vt_tray"].get()); - main_slot.id = std::to_string(VIRTUAL_TRAY_ID); + if (jj.contains("vir_slot") && jj["vir_slot"].is_array()) { - is_ams_need_update |= vt_tray != main_slot; - vt_tray = main_slot; + for (auto it = jj["vir_slot"].begin(); it != jj["vir_slot"].end(); it++) { + auto vslot = parse_vt_tray(it.value().get()); + + if (vslot.id == std::to_string(VIRTUAL_TRAY_MAIN_ID)) { + auto it = std::next(vt_slot.begin(), 0); + if (it != vt_slot.end()) { + is_ams_need_update |= vt_slot[0] != vslot; + vt_slot[0] = vslot; + } + else { + is_ams_need_update = true; + vt_slot.push_back(vslot); + } + } + else if (vslot.id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { + auto it = std::next(vt_slot.begin(), 1); + if (it != vt_slot.end()) { + is_ams_need_update |= vt_slot[1] != vslot; + vt_slot[1] = vslot; + } + else { + is_ams_need_update = true; + vt_slot.push_back(vslot); + } + } + } + + } + else if (jj.contains("vt_tray")) { + auto main_slot = parse_vt_tray(jj["vt_tray"].get()); + main_slot.id = std::to_string(VIRTUAL_TRAY_MAIN_ID); + + + auto it = std::next(vt_slot.begin(), 0); + if (it != vt_slot.end()) { + is_ams_need_update |= vt_slot[0] != main_slot; + vt_slot[0] = main_slot; + } + else { + is_ams_need_update = true; + vt_slot.push_back(main_slot); + } } else { ams_support_virtual_tray = false; @@ -4498,16 +4514,16 @@ int MachineObject::parse_json(std::string payload, bool key_field_only) if (jj.contains("tray_id")) { tray_id = jj["tray_id"].get(); } - if (ams_id == 255 && tray_id == VIRTUAL_TRAY_ID) { + if (ams_id == 255 && tray_id == VIRTUAL_TRAY_MAIN_ID) { BOOST_LOG_TRIVIAL(info) << "ams_filament_setting, parse tray info"; - vt_tray.nozzle_temp_max = std::to_string(jj["nozzle_temp_max"].get()); - vt_tray.nozzle_temp_min = std::to_string(jj["nozzle_temp_min"].get()); - vt_tray.color = jj["tray_color"].get(); - vt_tray.setting_id = jj["tray_info_idx"].get(); + vt_slot[0].nozzle_temp_max = std::to_string(jj["nozzle_temp_max"].get()); + vt_slot[0].nozzle_temp_min = std::to_string(jj["nozzle_temp_min"].get()); + vt_slot[0].color = jj["tray_color"].get(); + vt_slot[0].setting_id = jj["tray_info_idx"].get(); //vt_tray.type = jj["tray_type"].get(); - vt_tray.type = setting_id_to_type(vt_tray.setting_id, jj["tray_type"].get()); + vt_slot[0].type = setting_id_to_type(vt_slot[0].setting_id, jj["tray_type"].get()); // delay update - vt_tray.set_hold_count(); + vt_slot[0].set_hold_count(); } else { auto ams_it = amsList.find(std::to_string(ams_id)); if (ams_it != amsList.end()) { @@ -4640,7 +4656,7 @@ int MachineObject::parse_json(std::string payload, bool key_field_only) if (jj.contains("tray_id")) { try { curr_tray_id = jj["tray_id"].get(); - if (curr_tray_id == VIRTUAL_TRAY_ID) + if (curr_tray_id == VIRTUAL_TRAY_MAIN_ID) tray_id = curr_tray_id; else if (curr_tray_id >= 0 && curr_tray_id < 16){ ams_id = curr_tray_id / 4; @@ -4653,11 +4669,11 @@ int MachineObject::parse_json(std::string payload, bool key_field_only) ; } } - if (tray_id == VIRTUAL_TRAY_ID) { + if (tray_id == VIRTUAL_TRAY_MAIN_ID) { if (jj.contains("k_value")) - vt_tray.k = jj["k_value"].get(); + vt_slot[0].k = jj["k_value"].get(); if (jj.contains("n_coef")) - vt_tray.n = jj["n_coef"].get(); + vt_slot[0].n = jj["n_coef"].get(); } else { auto ams_item = this->amsList.find(std::to_string(ams_id)); if (ams_item != this->amsList.end()) { @@ -4688,40 +4704,60 @@ int MachineObject::parse_json(std::string payload, bool key_field_only) BOOST_LOG_TRIVIAL(info) << "extrusion_cali_sel: " << str; #endif int ams_id = -1; + int slot_id = -1; int tray_id = -1; - int curr_tray_id = -1; - if (jj.contains("tray_id")) { + + if (jj.contains("ams_id")) { try { - curr_tray_id = jj["tray_id"].get(); - if (curr_tray_id == VIRTUAL_TRAY_ID) - tray_id = curr_tray_id; - else if (curr_tray_id >= 0 && curr_tray_id < 16) { - ams_id = curr_tray_id / 4; - tray_id = curr_tray_id % 4; - } else { - BOOST_LOG_TRIVIAL(trace) << "extrusion_cali_sel: unsupported tray_id = " << curr_tray_id; - } + ams_id = jj["ams_id"].get(); + slot_id = jj["slot_id"].get(); } catch (...) { ; } } - if (tray_id == VIRTUAL_TRAY_ID) { - if (jj.contains("cali_idx")) { - vt_tray.cali_idx = jj["cali_idx"].get(); - vt_tray.set_hold_count(); + else { + tray_id = jj["tray_id"].get(); + if(tray_id >= 0 && tray_id < 16) + { + ams_id = tray_id / 4; + slot_id = tray_id % 4; } - } else { - auto ams_item = this->amsList.find(std::to_string(ams_id)); - if (ams_item != this->amsList.end()) { - auto tray_item = ams_item->second->trayList.find(std::to_string(tray_id)); - if (tray_item != ams_item->second->trayList.end()) { - if (jj.contains("cali_idx")) { + else if(tray_id == VIRTUAL_TRAY_MAIN_ID || tray_id == VIRTUAL_TRAY_DEPUTY_ID){ + ams_id = tray_id; + slot_id = 0; + } + } + + BOOST_LOG_TRIVIAL(trace) << "extrusion_cali_sel: unsupported ams_id = " << ams_id << "slot_id = " << slot_id; + + if (jj.contains("cali_idx")) { + if (ams_id == VIRTUAL_TRAY_MAIN_ID || ams_id == VIRTUAL_TRAY_DEPUTY_ID) { + + if (ams_id == VIRTUAL_TRAY_MAIN_ID && vt_slot.size() > 0) { + + vt_slot[MAIN_NOZZLE_ID].cali_idx = jj["cali_idx"].get(); + vt_slot[MAIN_NOZZLE_ID].set_hold_count(); + + } else if (ams_id == VIRTUAL_TRAY_DEPUTY_ID && vt_slot.size() > 1) { + + vt_slot[DEPUTY_NOZZLE_ID].cali_idx = jj["cali_idx"].get(); + vt_slot[DEPUTY_NOZZLE_ID].set_hold_count(); + + } + + } + else { + auto ams_item = this->amsList.find(std::to_string(ams_id)); + if (ams_item != this->amsList.end()) { + auto tray_item = ams_item->second->trayList.find(std::to_string(slot_id)); + if (tray_item != ams_item->second->trayList.end()) { tray_item->second->cali_idx = jj["cali_idx"].get(); tray_item->second->set_hold_count(); } } } } + } else if (jj["command"].get() == "extrusion_cali_get") { std::string str = jj.dump(); @@ -5346,14 +5382,14 @@ std::string MachineObject::get_string_from_fantype(FanType type) AmsTray MachineObject::parse_vt_tray(json vtray) { - auto vt_tray = AmsTray(std::to_string(VIRTUAL_TRAY_ID)); + auto vt_tray = AmsTray(std::to_string(VIRTUAL_TRAY_MAIN_ID)); if (vtray.contains("id")) vt_tray.id = vtray["id"].get(); auto curr_time = std::chrono::system_clock::now(); auto diff = std::chrono::duration_cast(curr_time - extrusion_cali_set_hold_start); if (diff.count() > HOLD_TIMEOUT || diff.count() < 0 - || extrusion_cali_set_tray_id != VIRTUAL_TRAY_ID) { + || extrusion_cali_set_tray_id != VIRTUAL_TRAY_MAIN_ID) { if (vtray.contains("k")) vt_tray.k = vtray["k"].get(); if (vtray.contains("n")) @@ -5422,6 +5458,12 @@ AmsTray MachineObject::parse_vt_tray(json vtray) else { vt_tray.color = ""; } + if (vtray.contains("ctype")) { + vt_tray.ctype = vtray["ctype"].get(); + } + else { + vt_tray.ctype = 1; + } if (vtray.contains("nozzle_temp_max")) vt_tray.nozzle_temp_max = vtray["nozzle_temp_max"].get(); else @@ -5445,11 +5487,13 @@ AmsTray MachineObject::parse_vt_tray(json vtray) vt_tray.cali_idx = -1; vt_tray.cols.clear(); if (vtray.contains("cols")) { - if (vtray.is_array()) { - for (auto it = vtray.begin(); it != vtray.end(); it++) { + if (vtray["cols"].is_array()) { + for (auto it = vtray["cols"].begin(); it != vtray["cols"].end(); it++) { vt_tray.cols.push_back(it.value().get()); } } + } else { + vt_tray.cols.push_back(vt_tray.color); } if (vtray.contains("remain")) { @@ -5953,7 +5997,7 @@ void MachineObject::check_ams_filament_valid() } } - /*for (auto vt_tray : vt_slot)*/ do{ + for (auto vt_tray : vt_slot) { int vt_id = std::stoi(vt_tray.id); int index = 255 - vt_id; if (index >= m_extder_data.total_extder_count) { @@ -6011,7 +6055,7 @@ void MachineObject::check_ams_filament_valid() } } } - } while (0); + } for (auto &diameter_pair : m_nozzle_filament_data) { auto &diameter = diameter_pair.first; diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 85263899e8..47ca5a50f0 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -39,8 +39,11 @@ #define RETRY_INTERNAL 2000 #define MAIN_NOZZLE_ID 0 +#define DEPUTY_NOZZLE_ID 1 + +#define VIRTUAL_TRAY_MAIN_ID 255 +#define VIRTUAL_TRAY_DEPUTY_ID 254 -#define VIRTUAL_TRAY_ID 254 #define START_SEQ_ID 20000 #define END_SEQ_ID 30000 @@ -1078,8 +1081,7 @@ public: NozzleData m_nozzle_data; /*vi slot data*/ - AmsTray vt_tray; // virtual tray - //std::vector vt_trays; // virtual tray for new + std::vector vt_slot; AmsTray parse_vt_tray(json vtray); /*for parse new info*/ bool check_enable_np(const json& print) const; diff --git a/src/slic3r/GUI/ExtrusionCalibration.cpp b/src/slic3r/GUI/ExtrusionCalibration.cpp index 5eac9d20dc..5cffe9d96b 100644 --- a/src/slic3r/GUI/ExtrusionCalibration.cpp +++ b/src/slic3r/GUI/ExtrusionCalibration.cpp @@ -469,7 +469,7 @@ void ExtrusionCalibration::on_click_cali(wxCommandEvent& event) max_volumetric_speed = speed_opt->get_at(0); if (bed_temp >= 0 && nozzle_temp >= 0 && max_volumetric_speed >= 0) { int curr_tray_id = ams_id * 4 + tray_id; - if (tray_id == VIRTUAL_TRAY_ID) + if (tray_id == VIRTUAL_TRAY_MAIN_ID) curr_tray_id = tray_id; obj->command_start_extrusion_cali(curr_tray_id, nozzle_temp, bed_temp, max_volumetric_speed, it->setting_id); return; @@ -597,7 +597,7 @@ void ExtrusionCalibration::on_click_save(wxCommandEvent &event) // send command int curr_tray_id = ams_id * 4 + tray_id; - if (tray_id == VIRTUAL_TRAY_ID) + if (tray_id == VIRTUAL_TRAY_MAIN_ID) curr_tray_id = tray_id; obj->command_extrusion_cali_set(curr_tray_id, setting_id, name, k, n, bed_temp, nozzle_temp, max_volumetric_speed); Close(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 5a9a7ecf65..e9d4fdefe3 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1714,7 +1714,7 @@ std::map Sidebar::build_filament_ams_list(MachineObject std::map filament_ams_list; if (!obj) return filament_ams_list; - auto vt_tray = obj->vt_tray; + auto vt_tray = obj->vt_slot[0]; if (obj->ams_support_virtual_tray) { DynamicPrintConfig vt_tray_config; vt_tray_config.set_key_value("filament_id", new ConfigOptionStrings{ vt_tray.setting_id }); @@ -1728,7 +1728,7 @@ std::map Sidebar::build_filament_ams_list(MachineObject for (int i = 0; i < vt_tray.cols.size(); ++i) { vt_tray_config.opt("filament_multi_colors")->values.push_back(into_u8(wxColour("#" + vt_tray.cols[i]).GetAsString(wxC2S_HTML_SYNTAX))); } - filament_ams_list.emplace(VIRTUAL_TRAY_ID, std::move(vt_tray_config)); + filament_ams_list.emplace(VIRTUAL_TRAY_MAIN_ID, std::move(vt_tray_config)); } auto list = obj->amsList; diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 64635cb593..fcdedd39d7 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -419,7 +419,9 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) - m_statictext_ams_msg = new wxStaticText(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL); + m_statictext_ams_msg = new wxStaticText(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); + m_statictext_ams_msg->SetMinSize(wxSize(FromDIP(600), -1)); + m_statictext_ams_msg->SetMaxSize(wxSize(FromDIP(600), -1)); m_statictext_ams_msg->SetFont(::Label::Body_13); m_statictext_ams_msg->Hide(); @@ -616,7 +618,7 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_sizer_main->Add(m_filament_panel, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(15)); m_sizer_main->Add(m_sizer_filament_2extruder, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(15)); m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(6)); - m_sizer_main->Add(m_statictext_ams_msg, 0, wxLEFT, 0); + m_sizer_main->Add(m_statictext_ams_msg, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(15)); m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(16)); m_sizer_main->Add(sizer_split_options, 1, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15)); m_sizer_main->Add(m_sizer_options, 0, wxLEFT|wxRIGHT, FromDIP(15)); @@ -1134,8 +1136,8 @@ bool SelectMachineDialog::get_ams_mapping_result(std::string &mapping_array_str, try { if (m_ams_mapping_result[k].ams_id.empty() || m_ams_mapping_result[k].slot_id.empty()) { // invalid case - mapping_item_v1["ams_id"] = 255; // TODO: Orca hack - mapping_item_v1["slot_id"] = 255; + mapping_item_v1["ams_id"] = VIRTUAL_TRAY_MAIN_ID; + mapping_item_v1["slot_id"] = VIRTUAL_TRAY_MAIN_ID; } else { mapping_item_v1["ams_id"] = std::stoi(m_ams_mapping_result[k].ams_id); @@ -1241,9 +1243,7 @@ void SelectMachineDialog::update_ams_status_msg(wxString msg, bool is_warning) if (str_new != str_old) { if (m_statictext_ams_msg->GetLabel() != msg) { m_statictext_ams_msg->SetLabel(msg); - m_statictext_ams_msg->SetMinSize(wxSize(FromDIP(400), -1)); - m_statictext_ams_msg->SetMaxSize(wxSize(FromDIP(400), -1)); - m_statictext_ams_msg->Wrap(FromDIP(400)); + m_statictext_ams_msg->Wrap(FromDIP(600)); m_statictext_ams_msg->Show(); Layout(); Fit(); @@ -3296,7 +3296,8 @@ void SelectMachineDialog::reset_and_sync_ams_list() m_mapping_popup.set_parent_item(item); m_mapping_popup.set_current_filament_id(extruder); m_mapping_popup.set_tag_texture(materials[extruder]); - m_mapping_popup.update_ams_data(obj_->amsList); + m_mapping_popup.update(obj_); + m_mapping_popup.set_send_win(this); m_mapping_popup.Popup(); } } @@ -3722,7 +3723,7 @@ void SelectMachineDialog::set_default_from_sdcard() m_mapping_popup.set_parent_item(item); m_mapping_popup.set_current_filament_id(fo.id); m_mapping_popup.set_tag_texture(fo.type); - m_mapping_popup.update_ams_data(obj_->amsList); + m_mapping_popup.update(obj_); m_mapping_popup.Popup(); } } diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index f58cf30882..feb2ece1dd 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -2630,7 +2630,7 @@ void StatusPanel::update_ams(MachineObject *obj) } - if (is_support_virtual_tray) m_ams_control->update_vams_kn_value(obj->vt_tray, obj); + if (is_support_virtual_tray) m_ams_control->update_vams_kn_value(obj->vt_slot[0], obj); if (m_filament_setting_dlg) m_filament_setting_dlg->update(); std::vector ams_info; @@ -2670,11 +2670,11 @@ void StatusPanel::update_ams(MachineObject *obj) std::string curr_ams_id = m_ams_control->GetCurentAms(); std::string curr_can_id = m_ams_control->GetCurrentCan(curr_ams_id); bool is_vt_tray = false; - if (obj->m_tray_tar == std::to_string(VIRTUAL_TRAY_ID)) + if (obj->m_tray_tar == std::to_string(VIRTUAL_TRAY_MAIN_ID)) is_vt_tray = true; // set segment 1, 2 - if (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_ID) ) { + if (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_MAIN_ID) ) { m_ams_control->SetAmsStep(obj->m_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); } else { @@ -2690,8 +2690,8 @@ void StatusPanel::update_ams(MachineObject *obj) } // set segment 3 - if (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_ID)) { - m_ams_control->SetExtruder(obj->is_filament_at_extruder(), true, obj->m_ams_id, obj->vt_tray.get_color()); + if (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_MAIN_ID)) { + m_ams_control->SetExtruder(obj->is_filament_at_extruder(), true, obj->m_ams_id, obj->vt_slot[0].get_color()); } else { m_ams_control->SetExtruder(obj->is_filament_at_extruder(), false, obj->m_ams_id, m_ams_control->GetCanColour(obj->m_ams_id, obj->m_tray_id)); @@ -2700,7 +2700,7 @@ void StatusPanel::update_ams(MachineObject *obj) if (obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE) { update_filament_step(); - if (obj->m_tray_tar == std::to_string(VIRTUAL_TRAY_ID) && (obj->m_tray_now != std::to_string(VIRTUAL_TRAY_ID) || obj->m_tray_now != "255")) { + if (obj->m_tray_tar == std::to_string(VIRTUAL_TRAY_MAIN_ID) && (obj->m_tray_now != std::to_string(VIRTUAL_TRAY_MAIN_ID) || obj->m_tray_now != "255")) { // wait to heat hotend if (obj->ams_status_sub == 0x02) { m_ams_control->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, FilamentStepType::STEP_TYPE_VT_LOAD); @@ -2807,7 +2807,7 @@ void StatusPanel::update_ams(MachineObject *obj) } bool is_curr_tray_selected = false; - if (!curr_ams_id.empty() && !curr_can_id.empty() && (curr_ams_id != std::to_string(VIRTUAL_TRAY_ID)) ) { + if (!curr_ams_id.empty() && !curr_can_id.empty() && (curr_ams_id != std::to_string(VIRTUAL_TRAY_MAIN_ID)) ) { if (curr_can_id == obj->m_tray_now) { is_curr_tray_selected = true; } @@ -2827,7 +2827,7 @@ void StatusPanel::update_ams(MachineObject *obj) is_curr_tray_selected = true; } } - }else if (curr_ams_id == std::to_string(VIRTUAL_TRAY_ID)) { + }else if (curr_ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID)) { if (curr_ams_id == obj->m_tray_now) { is_curr_tray_selected = true; } @@ -2902,7 +2902,7 @@ void StatusPanel::update_ams_control_state(bool is_curr_tray_selected) enable[ACTION_BTN_LOAD] = true; enable[ACTION_BTN_UNLOAD] = false; } - else if (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_ID)) { + else if (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_MAIN_ID)) { enable[ACTION_BTN_LOAD] = false; enable[ACTION_BTN_UNLOAD] = true; } @@ -2911,7 +2911,7 @@ void StatusPanel::update_ams_control_state(bool is_curr_tray_selected) } else { - if (obj->is_in_printing() /*&& obj->can_resume() && obj->m_tray_now != std::to_string(VIRTUAL_TRAY_ID) */) { + if (obj->is_in_printing() /*&& obj->can_resume() && obj->m_tray_now != std::to_string(VIRTUAL_TRAY_MAIN_ID) */) { if (!obj->can_resume()) { enable[ACTION_BTN_LOAD] = false; @@ -2920,7 +2920,7 @@ void StatusPanel::update_ams_control_state(bool is_curr_tray_selected) else { if (obj->m_tray_now == "255") { - if ( m_ams_control->GetCurentAms() == std::to_string(VIRTUAL_TRAY_ID) ) { + if ( m_ams_control->GetCurentAms() == std::to_string(VIRTUAL_TRAY_MAIN_ID) ) { enable[ACTION_BTN_LOAD] = true; enable[ACTION_BTN_UNLOAD] = false; } @@ -2929,8 +2929,8 @@ void StatusPanel::update_ams_control_state(bool is_curr_tray_selected) enable[ACTION_BTN_UNLOAD] = false; } } - else if (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_ID)) { - if (m_ams_control->GetCurentAms() == std::to_string(VIRTUAL_TRAY_ID)) { + else if (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_MAIN_ID)) { + if (m_ams_control->GetCurentAms() == std::to_string(VIRTUAL_TRAY_MAIN_ID)) { enable[ACTION_BTN_LOAD] = false; enable[ACTION_BTN_UNLOAD] = true; } @@ -3527,11 +3527,18 @@ void StatusPanel::on_ams_load_curr() update_filament_step(); //virtual tray - if (curr_ams_id.compare(std::to_string(VIRTUAL_TRAY_ID)) == 0) + if (curr_ams_id.compare(std::to_string(VIRTUAL_TRAY_MAIN_ID)) == 0 || + curr_ams_id.compare(std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) == 0) { + int vt_slot_idx = 0; + if (curr_ams_id.compare(std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) == 0) + { + vt_slot_idx = 1; + } + int old_temp = -1; int new_temp = -1; - AmsTray* curr_tray = &obj->vt_tray; + AmsTray* curr_tray = &obj->vt_slot[vt_slot_idx]; if (!curr_tray) return; @@ -3601,7 +3608,7 @@ void StatusPanel::on_ams_load_curr() void StatusPanel::on_ams_load_vams(wxCommandEvent& event) { BOOST_LOG_TRIVIAL(info) << "on_ams_load_vams_tray"; - m_ams_control->SwitchAms(std::to_string(VIRTUAL_TRAY_ID)); + m_ams_control->SwitchAms(std::to_string(VIRTUAL_TRAY_MAIN_ID)); on_ams_load_curr(); if (m_print_error_dlg) { m_print_error_dlg->on_hide(); @@ -3671,8 +3678,8 @@ void StatusPanel::on_filament_extrusion_cali(wxCommandEvent &event) m_extrusion_cali_dlg->obj = obj; std::string ams_id = m_ams_control->GetCurentAms(); std::string tray_id = m_ams_control->GetCurrentCan(ams_id); - if (tray_id.empty() && ams_id.compare(std::to_string(VIRTUAL_TRAY_ID)) != 0) { - wxString txt = _L("Please select an AMS slot before calibration."); + if (tray_id.empty() && ams_id.compare(std::to_string(VIRTUAL_TRAY_MAIN_ID)) != 0) { + wxString txt = _L("Please select an AMS slot before calibration"); MessageDialog msg_dlg(nullptr, txt, wxEmptyString, wxICON_WARNING | wxOK); msg_dlg.ShowModal(); return; @@ -3683,8 +3690,8 @@ void StatusPanel::on_filament_extrusion_cali(wxCommandEvent &event) // set ams_filament id is is bbl filament - if (ams_id.compare(std::to_string(VIRTUAL_TRAY_ID)) == 0) { - tray_id_int = VIRTUAL_TRAY_ID; + if (ams_id.compare(std::to_string(VIRTUAL_TRAY_MAIN_ID)) == 0) { + tray_id_int = VIRTUAL_TRAY_MAIN_ID; m_extrusion_cali_dlg->ams_filament_id = ""; } else { @@ -3797,6 +3804,7 @@ void StatusPanel::on_ext_spool_edit(wxCommandEvent &event) m_filament_setting_dlg->ams_id = ams_id; m_filament_setting_dlg->slot_id = slot_id; + int nozzle_index = ams_id == VIRTUAL_TRAY_MAIN_ID ? 0 : 1; try { std::string sn_number; @@ -3805,16 +3813,16 @@ void StatusPanel::on_ext_spool_edit(wxCommandEvent &event) std::string temp_min; wxString k_val; wxString n_val; - k_val = wxString::Format("%.3f", obj->vt_tray.k); - n_val = wxString::Format("%.3f", obj->vt_tray.n); - wxColor color = AmsTray::decode_color(obj->vt_tray.color); - m_filament_setting_dlg->ams_filament_id = obj->vt_tray.setting_id; + k_val = wxString::Format("%.3f", obj->vt_slot[nozzle_index].k); + n_val = wxString::Format("%.3f", obj->vt_slot[nozzle_index].n); + wxColor color = AmsTray::decode_color(obj->vt_slot[nozzle_index].color); + m_filament_setting_dlg->ams_filament_id = obj->vt_slot[nozzle_index].setting_id; std::vector cols; - for (auto col : obj->vt_tray.cols) { + for (auto col : obj->vt_slot[nozzle_index].cols) { cols.push_back(AmsTray::decode_color(col)); } - m_filament_setting_dlg->set_ctype(obj->vt_tray.ctype); + m_filament_setting_dlg->set_ctype(obj->vt_slot[nozzle_index].ctype); if (m_filament_setting_dlg->ams_filament_id.empty()) { m_filament_setting_dlg->set_empty_color(color); @@ -3822,15 +3830,14 @@ void StatusPanel::on_ext_spool_edit(wxCommandEvent &event) else { m_filament_setting_dlg->set_color(color); m_filament_setting_dlg->set_colors(cols); - } - m_filament_setting_dlg->m_is_third = !MachineObject::is_bbl_filament(obj->vt_tray.tag_uid); + m_filament_setting_dlg->m_is_third = !MachineObject::is_bbl_filament(obj->vt_slot[nozzle_index].tag_uid); if (!m_filament_setting_dlg->m_is_third) { - sn_number = obj->vt_tray.uuid; - filament = obj->vt_tray.sub_brands; - temp_max = obj->vt_tray.nozzle_temp_max; - temp_min = obj->vt_tray.nozzle_temp_min; + sn_number = obj->vt_slot[nozzle_index].uuid; + filament = obj->vt_slot[nozzle_index].sub_brands; + temp_max = obj->vt_slot[nozzle_index].nozzle_temp_max; + temp_min = obj->vt_slot[nozzle_index].nozzle_temp_min; } m_filament_setting_dlg->Move(wxPoint(current_position_x,current_position_y)); @@ -3857,8 +3864,8 @@ void StatusPanel::on_ams_refresh_rfid(wxCommandEvent &event) } std::string curr_ams_id = m_ams_control->GetCurentAms(); - // do not support refresh rfid for VIRTUAL_TRAY_ID - if (curr_ams_id.compare(std::to_string(VIRTUAL_TRAY_ID)) == 0) { + // do not support refresh rfid for VIRTUAL_TRAY_MAIN_ID + if (curr_ams_id.compare(std::to_string(VIRTUAL_TRAY_MAIN_ID)) == 0) { return; } std::string curr_can_id = event.GetString().ToStdString(); @@ -3887,7 +3894,7 @@ void StatusPanel::on_ams_selected(wxCommandEvent &event) { if (obj) { std::string curr_ams_id = m_ams_control->GetCurentAms(); - if (curr_ams_id.compare(std::to_string(VIRTUAL_TRAY_ID)) == 0) { + if (curr_ams_id.compare(std::to_string(VIRTUAL_TRAY_MAIN_ID)) == 0) { //update_ams_control_state(curr_ams_id, true); return; } else { diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index 047adbeaeb..0b70bf7786 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -260,13 +260,13 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_panel_virtual->SetMaxSize(wxSize(AMS_CAN_LIB_SIZE.x + FromDIP(16), AMS_CANS_SIZE.y)); m_vams_info.material_state = AMSCanType::AMS_CAN_TYPE_VIRTUAL; - m_vams_info.can_id = wxString::Format("%d", VIRTUAL_TRAY_ID).ToStdString(); + m_vams_info.can_id = wxString::Format("%d", VIRTUAL_TRAY_MAIN_ID).ToStdString(); auto vams_panel = new wxWindow(m_panel_virtual, wxID_ANY); vams_panel->SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); m_vams_lib = new AMSLib(vams_panel, m_vams_info.can_id, m_vams_info); - m_vams_lib->m_slot_id = m_vams_info.can_id; + m_vams_lib->m_slot_id = "0"; // TODO: Orca hack m_vams_road = new AMSRoad(vams_panel, wxID_ANY, m_vams_info, -1, -1, wxDefaultPosition, AMS_CAN_ROAD_SIZE); m_vams_lib->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { @@ -1202,7 +1202,7 @@ void AMSControl::SwitchAms(std::string ams_id) { if(ams_id == m_current_show_ams){return;} - if (ams_id != std::to_string(VIRTUAL_TRAY_ID)) { + if (ams_id != std::to_string(VIRTUAL_TRAY_MAIN_ID)) { if (m_current_show_ams != ams_id) { m_current_show_ams = ams_id; m_extruder->OnAmsLoading(false); @@ -1229,7 +1229,7 @@ void AMSControl::SwitchAms(std::string ams_id) } if (!ready_selected) { - m_current_ams = std::to_string(VIRTUAL_TRAY_ID); + m_current_ams = std::to_string(VIRTUAL_TRAY_MAIN_ID); m_vams_lib->OnSelected(); } else {