ENH: sync ams info to extruder group

Change-Id: Id0aace998a759c6e91aabb2685306e54e06d152e
Jira: STUDIO-9828
This commit is contained in:
chunmao.guo 2025-01-16 11:31:43 +08:00 committed by lane.wei
parent 7e16329d24
commit 2bae63e381
1 changed files with 87 additions and 92 deletions

View File

@ -358,22 +358,29 @@ struct ExtruderGroup : StaticGroup
ScalableButton * btn_up{nullptr};
ScalableButton * btn_down{nullptr};
wxBoxSizer *hsizer_ams { nullptr };
int page_cur{0};
int page_num{3};
int ams_n4 = 0;
int ams_n1 = 0;
size_t page_cur{0};
size_t page_num{3};
size_t ams_n4 = 0;
size_t ams_n1 = 0;
std::vector<AMSinfo> ams_4;
std::vector<AMSinfo> ams_1;
wxString diameter;
void set_ams_count(int n4, int n1)
{
ams_n4 = n4;
ams_n1 = n1;
if (btn_edit)
update_ams();
if (btn_edit) {
if (GUI::wxGetApp().plater())
GUI::wxGetApp().plater()->update_machine_sync_status();
}
}
void update_ams();
void sync_ams(MachineObject const *obj, std::vector<Ams *> const &ams4, std::vector<Ams *> const &ams1);
void Rescale()
{
if (btn_edit)
@ -466,6 +473,7 @@ struct Sidebar::priv
ScalableButton* btn_export_gcode_removable; //exports to removable drives (appears only if removable drive is connected)
bool is_collapsed {false};
bool is_switching_diameter{false};
Search::OptionsSearcher searcher;
std::string ams_list_device;
@ -788,11 +796,9 @@ public:
txt1->SetForegroundColour(0x6B6B6B);
int ams4 = 0, ams1 = 0;
GetAMSCount(index, ams4, ams1);
auto val4 = new SpinInput(this, {}, {}, wxDefaultPosition, {FromDIP(60), -1}, 0, 0, 4 - ams1, ams4);
auto val1 = new SpinInput(this, {}, {}, wxDefaultPosition, {FromDIP(60), -1}, 0, 0, 4 - ams4, ams1);
auto val4 = new SpinInput(this, {}, {}, wxDefaultPosition, {FromDIP(60), -1}, 0, 0, 4, ams4);
auto val1 = new SpinInput(this, {}, {}, wxDefaultPosition, {FromDIP(60), -1}, 0, 0, 8, ams1);
auto event_handler = [index, val4, val1, extruder](auto &evt) {
val4->SetRange(0, 4 - val1->GetValue());
val1->SetRange(0, 4 - val4->GetValue());
SetAMSCount(index, val4->GetValue(), val1->GetValue());
UpdateAMSCount(index, extruder);
};
@ -967,8 +973,8 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title
label_ams->Hide();
ams_not_installed_msg->Hide();
wxStaticBoxSizer *hsizer = new wxStaticBoxSizer(this, wxHORIZONTAL);
hsizer->Add(hsizer_diameter, 1, wxEXPAND | wxALL, FromDIP(2));
hsizer->Add(hsizer_nozzle, 1, wxEXPAND | wxALL, FromDIP(2));
hsizer->Add(hsizer_diameter, 1, wxEXPAND | wxALL, FromDIP(8));
hsizer->Add(hsizer_nozzle, 1, wxEXPAND | wxALL, FromDIP(8));
this->sizer = hsizer;
} else {
wxStaticBoxSizer *vsizer = new wxStaticBoxSizer(this, wxVERTICAL);
@ -983,74 +989,38 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title
void ExtruderGroup::update_ams()
{
int display_capacity = 8;
//if (ams_n4 * 4 + ams_n1 * 2 <= 8)
// is_upward = false;
std::vector<wxColour> colors = {
wxColour(255, 110, 100),
wxColour(97, 27, 22),
wxColour(7, 134, 219),
wxColour(170, 111, 252)
};
bool display_front_ams = false; //!is_upward;
size_t i = 0;
for (; i < ams_n4 && i < 4; ++i) {
display_capacity -= 4;
bool show_this_ams = (display_capacity >= 0) && display_front_ams;
show_this_ams |= (display_capacity < 0) && !display_front_ams;
if (show_this_ams) {
AMSinfo ams_info;
ams_info.ams_type = AMSModel::GENERIC_AMS;
for (size_t i = 0; i < 4; ++i) {
Caninfo can_info;
//can_info.material_colour = colors[i];
ams_info.cans.push_back(can_info);
}
ams[i]->Update(ams_info);
ams[i]->Refresh();
ams[i]->Open();
} else {
ams[i]->Close();
}
static AMSinfo info4;
static AMSinfo info1;
if (info4.cans.empty()) {
for (size_t i = 0; i < 4; ++i) info4.cans.push_back({});
info1.ams_type = AMSModel::N3S_AMS;
info1.cans.push_back({});
}
for (; i < ams_n4 + ams_n1 && i < 4; ++i) {
display_capacity -= 2;
bool show_this_ams = (display_capacity >= 0) && display_front_ams;
show_this_ams |= (display_capacity < 0) && !display_front_ams;
if (show_this_ams) {
AMSinfo ams_info;
ams_info.ams_type = AMSModel::N3S_AMS;
Caninfo can_info;
//can_info.material_colour = wxColour(255, 110, 100);
ams_info.cans.push_back(can_info);
ams[i]->Update(ams_info);
ams[i]->Refresh();
ams[i]->Open();
} else {
ams[i]->Close();
}
page_num = (ams_n4 * 2 + ams_n1 + 3) / 4;
size_t i4 = page_cur * 2;
size_t i1 = 0;
if (i4 > ams_n4) {
i1 = (i4 - ams_n4) * 2;
i4 = ams_n4;
}
if (i == 0) {
ams_not_installed_msg->Show();
btn_up->Hide();
for (AMSPreview *a : ams) {
a->Close();
}
} else {
ams_not_installed_msg->Hide();
for (; i < 4; ++i) { ams[i]->Close(); }
if (display_capacity < 0) {
btn_up->Show();
} else {
btn_up->Hide();
}
size_t left = 4;
size_t index = 0;
for (size_t i = i4; i < ams_n4 && left > 0; ++i, ++index, left -= 2) {
ams[index]->Update(i < ams_4.size() ? ams_4[i] : info4);
ams[index]->Refresh();
ams[index]->Open();
}
for (size_t i = i1; i < ams_n1 && left > 0; ++i, ++index, --left) {
ams[index]->Update(i < ams_1.size() ? ams_1[i] : info1);
ams[index]->Refresh();
ams[index]->Open();
}
for (; index < 4; ++index)
ams[index]->Close();
ams_not_installed_msg->Show(ams_n4 == 0 && ams_n1 == 0);
btn_up->Show(page_cur > 0);
btn_down->Show(page_cur + 1 < page_num);
@ -1063,7 +1033,7 @@ void ExtruderGroup::update_ams()
}
for (size_t i = 0; i < 4; ++i) {
if (ams[i]->IsShown())
hsizer_ams->Add(this->ams[i], 0, wxLEFT, FromDIP(2));
hsizer_ams->Add(this->ams[i], 0, wxLEFT, FromDIP(1));
}
if (btn_up->IsShown() || btn_down->IsShown()) {
if (btn_edit)
@ -1082,9 +1052,21 @@ void ExtruderGroup::update_ams()
}
sizer->Layout();
}
if (GUI::wxGetApp().plater())
GUI::wxGetApp().plater()->update_machine_sync_status();
void ExtruderGroup::sync_ams(MachineObject const *obj, std::vector<Ams *> const &ams4, std::vector<Ams *> const &ams1)
{
auto sync = [obj](std::vector<AMSinfo> &infos, std::vector<Ams *> const &ams) {
infos.clear();
for (auto a : ams) {
AMSinfo ams_info;
ams_info.parse_ams_info(const_cast<MachineObject*>(obj), a, obj->ams_calibrate_remain_flag, obj->is_support_ams_humidity);
infos.push_back(ams_info);
}
};
sync(ams_4, ams4);
sync(ams_1, ams1);
update_ams();
}
bool Sidebar::priv::switch_diameter(bool single)
@ -1225,9 +1207,12 @@ void Sidebar::priv::update_sync_status(const MachineObject *obj)
auto clear_all_sync_status = [this]() {
panel_printer_preset->ShowBadge(false);
panel_printer_bed->ShowBadge(false);
//left_extruder->ShowBadge(false);
left_extruder->ShowBadge(false);
left_extruder->sync_ams(nullptr, {}, {});
right_extruder->ShowBadge(false);
right_extruder->sync_ams(nullptr, {}, {});
single_extruder->ShowBadge(false);
single_extruder->sync_ams(nullptr, {}, {});
};
if (!obj || !obj->is_info_ready()) {
@ -1258,6 +1243,8 @@ void Sidebar::priv::update_sync_status(const MachineObject *obj)
int nozzle_volue_type{0};
int ams_4{0};
int ams_1{0};
std::vector<Ams *> ams_v4;
std::vector<Ams *> ams_v1;
bool operator==(const ExtruderInfo &other) const
{
@ -1317,8 +1304,10 @@ void Sidebar::priv::update_sync_status(const MachineObject *obj)
if (item.second->type == 4) { // N3S
machine_extruder_infos[item.second->nozzle].ams_1++;
machine_extruder_infos[item.second->nozzle].ams_v1.push_back(item.second);
} else {
machine_extruder_infos[item.second->nozzle].ams_4++;
machine_extruder_infos[item.second->nozzle].ams_v4.push_back(item.second);
}
}
@ -1328,25 +1317,34 @@ void Sidebar::priv::update_sync_status(const MachineObject *obj)
if (extruder_nums == 1) {
if (extruder_infos == machine_extruder_infos) {
single_extruder->ShowBadge(true);
single_extruder->sync_ams(obj, machine_extruder_infos[0].ams_v4, machine_extruder_infos[0].ams_v1);
extruder_synced[0] = true;
}
else
else {
single_extruder->ShowBadge(false);
single_extruder->sync_ams(obj, {}, {});
}
}
else if (extruder_nums == 2) {
if (extruder_infos[0] == machine_extruder_infos[0]) {
left_extruder->ShowBadge(true);
left_extruder->sync_ams(obj, machine_extruder_infos[0].ams_v4, machine_extruder_infos[0].ams_v1);
extruder_synced[0] = true;
}
else
else {
left_extruder->ShowBadge(false);
left_extruder->sync_ams(obj, {}, {});
}
if (extruder_infos[1] == machine_extruder_infos[1]) {
right_extruder->ShowBadge(true);
right_extruder->sync_ams(obj, machine_extruder_infos[1].ams_v4, machine_extruder_infos[1].ams_v1);
extruder_synced[1] = true;
}
else
else {
right_extruder->ShowBadge(false);
right_extruder->sync_ams(obj, {}, {});
}
}
StateColor synced_colour(std::pair<wxColour, int>(wxColour("#CECECE"), StateColor::Normal));
@ -1631,15 +1629,9 @@ Sidebar::Sidebar(Plater *parent)
p->single_extruder = new ExtruderGroup(p->m_panel_printer_content, -1, "Nozzle");
auto switch_diameter = [this](wxCommandEvent & evt) {
auto extruder = dynamic_cast<ExtruderGroup *>(dynamic_cast<ComboBox *>(evt.GetEventObject())->GetParent());
p->is_switching_diameter = true;
auto result = p->switch_diameter(extruder == p->single_extruder);
if (result) {
if (extruder != p->single_extruder) {
extruder->combo_diameter->SetSelection(evt.GetInt());
extruder->diameter = evt.GetString();
}
} else {
extruder->combo_diameter->SetValue(extruder->diameter);
}
p->is_switching_diameter = false;
};
p->left_extruder->combo_diameter->Bind(wxEVT_COMBOBOX, switch_diameter);
p->right_extruder->combo_diameter->Bind(wxEVT_COMBOBOX, switch_diameter);
@ -2225,12 +2217,15 @@ void Sidebar::update_presets(Preset::Type preset_type)
if (is_dual_extruder) {
update_extruder_variant(*p->left_extruder, 0);
update_extruder_variant(*p->right_extruder, 1);
update_extruder_diameter(*p->left_extruder);
update_extruder_diameter(*p->right_extruder);
if (!p->is_switching_diameter) {
update_extruder_diameter(*p->left_extruder);
update_extruder_diameter(*p->right_extruder);
}
p->image_printer_bed->SetBitmap(create_scaled_bitmap(bed_type_thumbnails[BedType(p->combo_printer_bed->GetSelection() + 1)], this, 48));
} else {
update_extruder_variant(*p->single_extruder, 0);
update_extruder_diameter(*p->single_extruder);
if (!p->is_switching_diameter)
update_extruder_diameter(*p->single_extruder);
p->image_printer_bed->SetBitmap(create_scaled_bitmap(bed_type_thumbnails[BedType(p->combo_printer_bed->GetSelection() + 1)], this, 32));
}