Resync the AMS control and item widgets

This commit is contained in:
SoftFever
2026-07-17 04:30:45 +08:00
parent db51d8ab9b
commit 7265a2fbfe
4 changed files with 58 additions and 23 deletions

View File

@@ -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";
}

View File

@@ -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<AMSinfo> 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<AMSi
void AMSControl::AddAms(AMSinfo info, AMSPanelPos pos)
{
if (m_total_ext_count > 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<AMSinfo> 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);
}
}

View File

@@ -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
**************************************************/

View File

@@ -14,6 +14,7 @@
#include <wx/dynarray.h>
#include <optional>
#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<Caninfo> 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<DevFilaSwitch::SwitchPos> 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;