diff --git a/src/slic3r/GUI/AMSDryControl.cpp b/src/slic3r/GUI/AMSDryControl.cpp index 9efe7faa87..56a4f5e739 100644 --- a/src/slic3r/GUI/AMSDryControl.cpp +++ b/src/slic3r/GUI/AMSDryControl.cpp @@ -42,7 +42,7 @@ static std::string get_humidity_level_img_path(int humidity_percent) } if (wxGetApp().dark_mode()) { - return "hum_level" + std::to_string(hum_level) + "_no_num_dark"; + return "hum_level" + std::to_string(hum_level) + "_no_num_dark"; // Orca: use the dark-mode humidity glyph in dark mode } else { return "hum_level" + std::to_string(hum_level) + "_no_num_light"; } diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index 7334cb960a..07aa574430 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -332,7 +332,8 @@ std::string AMSControl::GetCurrentCan(std::string amsid) bool AMSControl::IsAmsInRightPanel(std::string ams_id) { if (m_total_ext_count == 2){ - if (m_ams_item_list.find(ams_id) != m_ams_item_list.end() && m_ams_item_list[ams_id]->get_nozzle_id() == MAIN_EXTRUDER_ID) { + // Orca: inlet-aware panel routing (see AMSinfo::routes_to_main_extruder) + if (m_ams_item_list.find(ams_id) != m_ams_item_list.end() && m_ams_item_list[ams_id]->routes_to_main_extruder()) { return true; } else{ @@ -602,30 +603,32 @@ void AMSControl::CreateAmsDoubleNozzle(const std::string &series_name, const std std::vector single_info_right; //Freeze(); + // Orca: place each AMS by its switch inlet when a Filament Track Switch is installed, else by the pinned + // nozzle_id (routes_to_main_extruder). Switch-less machines are unaffected; ext spools keep nozzle_id. for (auto ams_info = m_ams_info.begin(); ams_info != m_ams_info.end(); ams_info++){ if (ams_info->cans.size() == GENERIC_AMS_SLOT_NUM){ - ams_info->nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(ams_info->ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(ams_info->ams_id); + ams_info->routes_to_main_extruder() ? m_item_ids[MAIN_EXTRUDER_ID].push_back(ams_info->ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(ams_info->ams_id); AddAmsPreview(*ams_info, ams_info->ams_type); AddAms(*ams_info); } else if (ams_info->cans.size() == 1){ - if (ams_info->nozzle_id == MAIN_EXTRUDER_ID){ + if (ams_info->routes_to_main_extruder()){ single_info_right.push_back(*ams_info); if (single_info_right.size() == 2){ - single_info_right[0].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_right[0].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_right[0].ams_id); - single_info_right[1].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_right[1].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_right[1].ams_id); + single_info_right[0].routes_to_main_extruder() ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_right[0].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_right[0].ams_id); + single_info_right[1].routes_to_main_extruder() ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_right[1].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_right[1].ams_id); AddAms(single_info_right, series_name, printer_type); AddAmsPreview(single_info_right, AMSPanelPos::RIGHT_PANEL); pair_id.push_back(std::make_pair(single_info_right[0].ams_id, single_info_right[1].ams_id)); single_info_right.clear(); } } - else if (ams_info->nozzle_id == 1){ + else if (!ams_info->routes_to_main_extruder()){ single_info_left.push_back(*ams_info); if (single_info_left.size() == 2){ - single_info_left[0].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_left[0].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_left[0].ams_id); - single_info_left[1].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_left[1].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_left[1].ams_id); + single_info_left[0].routes_to_main_extruder() ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_left[0].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_left[0].ams_id); + single_info_left[1].routes_to_main_extruder() ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_left[1].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_left[1].ams_id); AddAms(single_info_left, series_name, printer_type); AddAmsPreview(single_info_left, AMSPanelPos::LEFT_PANEL); pair_id.push_back(std::make_pair(single_info_left[0].ams_id, single_info_left[1].ams_id)); @@ -650,9 +653,9 @@ void AMSControl::CreateAmsDoubleNozzle(const std::string &series_name, const std //wait add - single_info_right[0].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_right[0].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_right[0].ams_id); + single_info_right[0].routes_to_main_extruder() ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_right[0].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_right[0].ams_id); if (single_info_right.size() == 2){ - single_info_right[1].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_right[1].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_right[1].ams_id); + single_info_right[1].routes_to_main_extruder() ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_right[1].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_right[1].ams_id); pair_id.push_back(std::make_pair(single_info_right[0].ams_id, single_info_right[1].ams_id)); } AddAms(single_info_right, series_name, printer_type); @@ -667,9 +670,9 @@ void AMSControl::CreateAmsDoubleNozzle(const std::string &series_name, const std } } //wait add - single_info_left[0].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_left[0].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_left[0].ams_id); + single_info_left[0].routes_to_main_extruder() ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_left[0].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_left[0].ams_id); if (single_info_left.size() == 2){ - single_info_left[1].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_left[1].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_left[1].ams_id); + single_info_left[1].routes_to_main_extruder() ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_left[1].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_left[1].ams_id); pair_id.push_back(std::make_pair(single_info_left[0].ams_id, single_info_left[1].ams_id)); } AddAmsPreview(single_info_left, AMSPanelPos::LEFT_PANEL); @@ -939,7 +942,9 @@ void AMSControl::UpdateAms(const std::string &series_name, fresh = true; } - if (m_ams_info[i].nozzle_id != ams_info[i].nozzle_id) { + // Orca: rebuild when the panel assignment changes; inlet-aware so a Filament Track Switch + // re-plug (same pinned nozzle_id, different inlet) still refreshes placement. + if (m_ams_info[i].routes_to_main_extruder() != ams_info[i].routes_to_main_extruder()) { fresh = true; } } @@ -1057,12 +1062,12 @@ void AMSControl::AddAmsPreview(AMSinfo info, AMSModel type) { AMSPreview *ams_prv = nullptr; - if (info.nozzle_id == MAIN_EXTRUDER_ID) + if (info.routes_to_main_extruder()) { ams_prv = new AMSPreview(m_panel_prv_right, wxID_ANY, info, type); m_sizer_prv_right->Add(ams_prv, 0, wxALIGN_CENTER | wxLEFT, FromDIP(6)); } - else if (info.nozzle_id == DEPUTY_EXTRUDER_ID) + else if (!info.routes_to_main_extruder()) { ams_prv = new AMSPreview(m_panel_prv_left, wxID_ANY, info, type); m_sizer_prv_left->Add(ams_prv, 0, wxALIGN_CENTER | wxLEFT, FromDIP(6)); @@ -1180,10 +1185,10 @@ void AMSControl::createAmsPanel(wxSimplebook *parent, int &idx, std::vector 1){ - if (info.nozzle_id == MAIN_EXTRUDER_ID){ + if (info.routes_to_main_extruder()){ createAms(m_simplebook_ams_right, m_right_page_index, info, AMSPanelPos::RIGHT_PANEL); } - else if (info.nozzle_id == DEPUTY_EXTRUDER_ID){ + else if (!info.routes_to_main_extruder()){ createAms(m_simplebook_ams_left, m_left_page_index, info, AMSPanelPos::LEFT_PANEL); } } @@ -1221,10 +1226,10 @@ void AMSControl::AddAms(std::vector single_info, const std::string &ser return; } if (m_total_ext_count == 2) { - if (single_info[0].nozzle_id == MAIN_EXTRUDER_ID) { + if (single_info[0].routes_to_main_extruder()) { createAmsPanel(m_simplebook_ams_right, m_right_page_index, single_info, series_name, printer_type, AMSPanelPos::RIGHT_PANEL, m_total_ext_count); } - else if (single_info[0].nozzle_id == DEPUTY_EXTRUDER_ID) { + else if (!single_info[0].routes_to_main_extruder()) { createAmsPanel(m_simplebook_ams_left, m_left_page_index, single_info, series_name, printer_type, AMSPanelPos::LEFT_PANEL, m_total_ext_count); } } diff --git a/src/slic3r/GUI/Widgets/AMSItem.cpp b/src/slic3r/GUI/Widgets/AMSItem.cpp index 2e47f01d6c..2fe49ccaa3 100644 --- a/src/slic3r/GUI/Widgets/AMSItem.cpp +++ b/src/slic3r/GUI/Widgets/AMSItem.cpp @@ -64,6 +64,7 @@ bool AMSinfo::parse_ams_info(MachineObject *obj, DevAms *ams, bool remain_flag, this->ams_type = AMSModel(ams->GetAmsType()); nozzle_id = ams->GetExtruderId(); + switch_pos = ams->GetSwitcherPos(); // Orca: carry the switch inlet for inlet-aware panel placement cans.clear(); for (int i = 0; i < ams->GetTrays().size(); i++) { auto it = ams->GetTrays().find(std::to_string(i)); @@ -234,6 +235,19 @@ int AMSinfo::get_humidity_display_idx() const return 1; } +// Orca: inlet-aware panel routing. REF placed AMS by switch inlet (POS_IN_A/B) via a tray-level binding +// that Orca's pull-mode fila model does not carry; the AMS-level DevAms::GetSwitcherPos() does, and it is +// stashed in switch_pos. When a Filament Track Switch is installed the device pins nozzle_id to MAIN for +// command consumers, so placement follows the inlet here instead (POS_IN_B -> main/right, POS_IN_A -> +// deputy/left). switch_pos is empty on switch-less machines and for ext spools (no tray-level inlet in the +// kept model), so this reduces to the original nozzle_id == MAIN_EXTRUDER_ID test — identical behavior. +bool AMSinfo::routes_to_main_extruder() const +{ + if (switch_pos.has_value()) + return switch_pos.value() == DevFilaSwitch::SwitchPos::POS_IN_B; + return nozzle_id == MAIN_EXTRUDER_ID; +} + /************************************************* Description:AMSExtText **************************************************/ diff --git a/src/slic3r/GUI/Widgets/AMSItem.hpp b/src/slic3r/GUI/Widgets/AMSItem.hpp index 526fa82f36..18a9ee53ef 100644 --- a/src/slic3r/GUI/Widgets/AMSItem.hpp +++ b/src/slic3r/GUI/Widgets/AMSItem.hpp @@ -14,6 +14,7 @@ #include #include +#include "slic3r/GUI/DeviceCore/DevFilaSwitch.h" // Orca: DevFilaSwitch::SwitchPos for inlet-aware AMS placement #define AMS_CONTROL_BRAND_COLOUR wxColour(0, 150, 136) #define AMS_CONTROL_GRAY700 wxColour(107, 107, 107) @@ -33,6 +34,9 @@ namespace Slic3r { namespace GUI { +// Orca: GUI-layer AMS-type enum used across the whole AMSItem/AMSControl widget family in place of the +// device-layer DevAmsType. Kept as an Orca divergence so out-of-cluster consumers (calibration wizard, +// StatusPanel, humidity popup) that assign/compare AMSModel keep compiling; see ledger cluster-4. enum AMSModel { EXT_AMS = 0, //ext GENERIC_AMS = 1, @@ -214,18 +218,22 @@ struct AMSinfo public: std::string ams_id; std::vector cans; - int nozzle_id = 0; + int nozzle_id = 0; // Orca: pull-mode AMS->extruder binding (DevAms::GetExtruderId), pinned to MAIN for switch-routed AMS std::string current_can_id; AMSPassRoadSTEP current_step = AMSPassRoadSTEP::AMS_ROAD_STEP_NONE; AMSAction current_action; int curreent_filamentstep; int ams_humidity = 0; - int humidity_raw = -1; + int humidity_raw = -1; // Orca: raw humidity percent (replaces REF ams_humidity_percent) int left_dray_time = 0; float current_temperature = INVALID_AMS_TEMPERATURE; AMSModel ams_type = AMSModel::GENERIC_AMS; AMSModelOriginType ext_type = AMSModelOriginType::GENERIC_EXT; + // Orca: switch inlet (POS_IN_A/POS_IN_B) carried from the AMS-level DevAms::GetSwitcherPos(); empty on + // printers without a Filament Track Switch. Drives inlet-aware panel placement (routes_to_main_extruder). + std::optional switch_pos; + public: bool operator== (const AMSinfo& other) const { @@ -240,7 +248,8 @@ public: left_dray_time == other.left_dray_time && current_temperature == other.current_temperature && ams_type == other.ams_type && - ext_type == other.ext_type) + ext_type == other.ext_type && + switch_pos == other.switch_pos) // Orca: refresh placement when the switch inlet changes { return true; } @@ -266,6 +275,11 @@ public: Caninfo get_caninfo(const std::string& can_id, bool& found) const; int get_humidity_display_idx() const; + + // Orca: true when this AMS belongs in the main-extruder (right) panel. Follows the switch inlet + // (POS_IN_B -> main/right, POS_IN_A -> deputy/left) when a Filament Track Switch is installed, else + // falls back to the pinned nozzle_id so switch-less machines behave exactly as before. + bool routes_to_main_extruder() const; }; /************************************************* @@ -823,6 +837,8 @@ public: AMSPanelPos get_panel_pos() const { return m_panel_pos; }; int get_nozzle_id() const { return m_info.nozzle_id; }; + // Orca: inlet-aware panel routing (delegates to AMSinfo::routes_to_main_extruder) + bool routes_to_main_extruder() const { return m_info.routes_to_main_extruder(); }; private: ScalableBitmap m_bitmap_extra_framework;