diff --git a/src/slic3r/GUI/CalibrationWizard.cpp b/src/slic3r/GUI/CalibrationWizard.cpp index 5d287942ba..12e5369f2f 100644 --- a/src/slic3r/GUI/CalibrationWizard.cpp +++ b/src/slic3r/GUI/CalibrationWizard.cpp @@ -435,7 +435,7 @@ void CalibrationWizard::cache_preset_info(MachineObject *obj, float nozzle_dia, if (obj->is_multi_extruders()) { int ams_id, slot_id, tray_id; get_tray_ams_and_slot_id(curr_obj, result.tray_id, ams_id, slot_id, tray_id); - result.extruder_id = preset_page->get_extruder_id(ams_id); + result.extruder_id = preset_page->get_extruder_id_by_tray_id(result.tray_id); result.nozzle_diameter = preset_page->get_nozzle_diameter(result.extruder_id); } else { @@ -753,7 +753,7 @@ void PressureAdvanceWizard::on_cali_start() X1CCalibInfos::X1CCalibInfo calib_info; get_tray_ams_and_slot_id(curr_obj, item.first, calib_info.ams_id, calib_info.slot_id, calib_info.tray_id); - calib_info.extruder_id = preset_page->get_extruder_id(calib_info.ams_id); + calib_info.extruder_id = preset_page->get_extruder_id_by_tray_id(item.first); calib_info.extruder_type = preset_page->get_extruder_type(calib_info.extruder_id); calib_info.nozzle_volume_type = preset_page->get_nozzle_volume_type(calib_info.extruder_id); calib_info.nozzle_diameter = preset_page->get_nozzle_diameter(calib_info.extruder_id); @@ -792,7 +792,7 @@ void PressureAdvanceWizard::on_cali_start() CalibInfo calib_info; calib_info.dev_id = curr_obj->get_dev_id(); get_tray_ams_and_slot_id(curr_obj, selected_filaments.begin()->first, calib_info.ams_id, calib_info.slot_id, selected_tray_id); - calib_info.extruder_id = preset_page->get_extruder_id(calib_info.ams_id); + calib_info.extruder_id = preset_page->get_extruder_id_by_tray_id(selected_filaments.begin()->first); calib_info.extruder_type = preset_page->get_extruder_type(calib_info.extruder_id); calib_info.nozzle_volume_type = preset_page->get_nozzle_volume_type(calib_info.extruder_id); calib_info.nozzle_diameter = preset_page->get_nozzle_diameter(calib_info.extruder_id); @@ -877,7 +877,7 @@ void PressureAdvanceWizard::on_cali_start() calib_info.dev_id = curr_obj->get_dev_id(); get_tray_ams_and_slot_id(curr_obj, item.first, calib_info.ams_id, calib_info.slot_id, selected_tray_id); calib_info.index = preset_page->get_index_by_tray_id(item.first); - calib_info.extruder_id = preset_page->get_extruder_id(calib_info.ams_id); + calib_info.extruder_id = preset_page->get_extruder_id_by_tray_id(item.first); calib_info.nozzle_diameter = preset_page->get_nozzle_diameter(calib_info.extruder_id); calib_info.extruder_type = preset_page->get_extruder_type(calib_info.extruder_id); calib_info.nozzle_volume_type = preset_page->get_nozzle_volume_type(calib_info.extruder_id); @@ -1252,7 +1252,7 @@ void FlowRateWizard::on_cali_start(CaliPresetStage stage, float cali_value, Flow X1CCalibInfos::X1CCalibInfo calib_info; calib_info.tray_id = item.first; get_tray_ams_and_slot_id(curr_obj, item.first, calib_info.ams_id, calib_info.slot_id, calib_info.tray_id); - calib_info.extruder_id = preset_page->get_extruder_id(calib_info.ams_id); + calib_info.extruder_id = preset_page->get_extruder_id_by_tray_id(item.first); calib_info.extruder_type = preset_page->get_extruder_type(calib_info.extruder_id); calib_info.nozzle_volume_type = preset_page->get_nozzle_volume_type(calib_info.extruder_id); calib_info.nozzle_diameter = preset_page->get_nozzle_diameter(calib_info.extruder_id); @@ -1308,7 +1308,7 @@ void FlowRateWizard::on_cali_start(CaliPresetStage stage, float cali_value, Flow int selected_tray_id = 0; get_tray_ams_and_slot_id(curr_obj, selected_filaments.begin()->first, calib_info.ams_id, calib_info.slot_id, selected_tray_id); calib_info.select_ams = std::to_string(selected_tray_id); - calib_info.extruder_id = preset_page->get_extruder_id(calib_info.ams_id); + calib_info.extruder_id = preset_page->get_extruder_id_by_tray_id(selected_filaments.begin()->first); calib_info.extruder_type = preset_page->get_extruder_type(calib_info.extruder_id); calib_info.nozzle_volume_type = preset_page->get_nozzle_volume_type(calib_info.extruder_id); calib_info.nozzle_diameter = preset_page->get_nozzle_diameter(calib_info.extruder_id); @@ -1724,7 +1724,7 @@ void MaxVolumetricSpeedWizard::on_cali_start() int selected_tray_id = 0; get_tray_ams_and_slot_id(curr_obj, selected_filaments.begin()->first, calib_info.ams_id, calib_info.slot_id, selected_tray_id); calib_info.select_ams = std::to_string(selected_tray_id); - calib_info.extruder_id = preset_page->get_extruder_id(calib_info.ams_id); + calib_info.extruder_id = preset_page->get_extruder_id_by_tray_id(selected_filaments.begin()->first); calib_info.extruder_type = preset_page->get_extruder_type(calib_info.extruder_id); calib_info.nozzle_volume_type = preset_page->get_nozzle_volume_type(calib_info.extruder_id); calib_info.nozzle_diameter = preset_page->get_nozzle_diameter(calib_info.extruder_id); diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp index 754d3457cb..673026159e 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp @@ -587,8 +587,23 @@ void CalibrationPresetPage::on_sys_color_changed() m_ams_sync_button->msw_rescale(); } -int CalibrationPresetPage::get_extruder_id(int ams_id) +int CalibrationPresetPage::get_extruder_id_by_tray_id(int tray_id) { + // An AMS behind a Filament Track Switch feeds both extruders, so the extruder is the one + // whose panel the filament was selected in. + if (curr_obj && curr_obj->is_multi_extruders()) { + for (FilamentComboBox *fcb : get_selected_filament_combobox()) { + if (fcb->get_tray_id() != tray_id) + continue; + const bool is_deputy = std::find(m_deputy_filament_comboBox_list.begin(), m_deputy_filament_comboBox_list.end(), fcb) != + m_deputy_filament_comboBox_list.end(); + return is_deputy ? DEPUTY_EXTRUDER_ID : MAIN_EXTRUDER_ID; + } + } + + int ams_id = tray_id / 4, slot_id, unused_tray_id; + if (curr_obj) + get_tray_ams_and_slot_id(curr_obj, tray_id, ams_id, slot_id, unused_tray_id); if (m_ams_id_to_extruder_id_map.find(ams_id) != m_ams_id_to_extruder_id_map.end()) { return m_ams_id_to_extruder_id_map[ams_id]; } @@ -866,6 +881,18 @@ static void fill_nozzle_volume_combo(ComboBox *combo) select_nozzle_volume(combo, NozzleVolumeType::nvtStandard); } +static DynamicPrintConfig empty_tray_config() +{ + DynamicPrintConfig config; + config.set_key_value("filament_id", new ConfigOptionStrings{""}); + config.set_key_value("tag_uid", new ConfigOptionStrings{""}); + config.set_key_value("filament_type", new ConfigOptionStrings{""}); + config.set_key_value("tray_name", new ConfigOptionStrings{""}); + config.set_key_value("filament_colour", new ConfigOptionStrings{""}); + config.set_key_value("filament_exist", new ConfigOptionBools{false}); + return config; +} + void CalibrationPresetPage::init_selection_values() { // init nozzle diameter and nozzle volume @@ -2272,27 +2299,36 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) } } - // init virtual tray info - 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]; - } + // init virtual tray info. With a Filament Track Switch installed the external spools feed + // through the switch, so they can't be calibrated as their own trays. + if (obj->GetFilaSwitch()->IsInstalled()) { + filament_ams_list[VIRTUAL_TRAY_MAIN_ID] = empty_tray_config(); + filament_ams_list[VIRTUAL_TRAY_DEPUTY_ID] = empty_tray_config(); + } else { + 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]; + } - if (full_filament_ams_list.find(VIRTUAL_TRAY_DEPUTY_ID) != full_filament_ams_list.end()) { - filament_ams_list[VIRTUAL_TRAY_DEPUTY_ID] = full_filament_ams_list[VIRTUAL_TRAY_DEPUTY_ID]; + if (full_filament_ams_list.find(VIRTUAL_TRAY_DEPUTY_ID) != full_filament_ams_list.end()) { + filament_ams_list[VIRTUAL_TRAY_DEPUTY_ID] = full_filament_ams_list[VIRTUAL_TRAY_DEPUTY_ID]; + } } // update filament from panel, display only obj has ams // update multi ams panel, display only obj has multi ams if (obj->HasAms()) { if (obj->is_multi_extruders()) { + // An AMS behind a Filament Track Switch is bound to both extruders and appears in both panels. bool main_done = false; bool deputy_done = false; for (auto &ams_item : obj->GetFilaSystem()->GetAmsList()) { - if (ams_item.second->GetExtruderId() == 0 && !main_done) { - update_multi_extruder_filament_combobox(ams_item.second->GetAmsId(), ams_item.second->GetExtruderId()); + const auto &extruder_set = ams_item.second->GetBindedExtruderSet(); + if (!main_done && extruder_set.count(MAIN_EXTRUDER_ID) != 0) { + update_multi_extruder_filament_combobox(ams_item.second->GetAmsId(), MAIN_EXTRUDER_ID); main_done = true; - } else if (ams_item.second->GetExtruderId() == 1 && !deputy_done) { - update_multi_extruder_filament_combobox(ams_item.second->GetAmsId(), ams_item.second->GetExtruderId()); + } + if (!deputy_done && extruder_set.count(DEPUTY_EXTRUDER_ID) != 0) { + update_multi_extruder_filament_combobox(ams_item.second->GetAmsId(), DEPUTY_EXTRUDER_ID); deputy_done = true; } } @@ -2333,10 +2369,11 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) if (ams->second->IsExist() && info.parse_ams_info(obj, ams->second, obj->GetFilaSystem()->IsDetectRemainEnabled(), obj->is_support_ams_humidity)) { ams_info.push_back(info); - if (info.nozzle_id == 0) { - main_ams_info.push_back(info); - } else { - deputy_ams_info.push_back(info); + for (int extruder_id : ams->second->GetBindedExtruderSet()) { + if (extruder_id == MAIN_EXTRUDER_ID) + main_ams_info.push_back(info); + else + deputy_ams_info.push_back(info); } } m_ams_id_to_extruder_id_map[stoi(info.ams_id)] = info.nozzle_id; @@ -2584,13 +2621,7 @@ void CalibrationPresetPage::update_multi_extruder_filament_combobox(const std::s } } - DynamicPrintConfig empty_config; - empty_config.set_key_value("filament_id", new ConfigOptionStrings{""}); - empty_config.set_key_value("tag_uid", new ConfigOptionStrings{""}); - empty_config.set_key_value("filament_type", new ConfigOptionStrings{""}); - empty_config.set_key_value("tray_name", new ConfigOptionStrings{""}); - empty_config.set_key_value("filament_colour", new ConfigOptionStrings{""}); - empty_config.set_key_value("filament_exist", new ConfigOptionBools{false}); + DynamicPrintConfig empty_config = empty_tray_config(); if (filament_ams_list.empty()) return; diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.hpp b/src/slic3r/GUI/CalibrationWizardPresetPage.hpp index 1ad2a2e1e1..27753baf26 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.hpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.hpp @@ -251,7 +251,7 @@ public: void msw_rescale() override; void on_sys_color_changed() override; - int get_extruder_id(int ams_id); + int get_extruder_id_by_tray_id(int tray_id); float get_nozzle_diameter(int extruder_id) const; NozzleVolumeType get_nozzle_volume_type(int extruder_id) const; ExtruderType get_extruder_type(int extruder_id) const;