From e1b8d8cdea58563d8bf2c9eb6914ccdee4e13ddc Mon Sep 17 00:00:00 2001 From: Hanif Koh Date: Mon, 19 Oct 2026 13:49:54 +0800 Subject: [PATCH] Show Track-Switch AMS Units Under Both Nozzles in the Calibration Wizard With a Filament Track Switch installed the device layer pins every AMS to the main extruder and records the real binding in GetBindedExtruderSet(), but the calibration preset page still split the AMS units by GetExtruderId(). Every AMS landed under the right nozzle and the left nozzle only offered its external spool. Split the panels by the bound extruder set, blank the external spools when the switch is installed, and take a selected filament's extruder from the panel it was picked in rather than from its AMS. --- src/slic3r/GUI/CalibrationWizard.cpp | 14 ++-- .../GUI/CalibrationWizardPresetPage.cpp | 75 +++++++++++++------ .../GUI/CalibrationWizardPresetPage.hpp | 2 +- 3 files changed, 61 insertions(+), 30 deletions(-) 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;