mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-07-18 00:12:09 +00:00
Resync the AMS control and item widgets
This commit is contained in:
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
**************************************************/
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user