Compare commits

..
2 changed files with 108 additions and 369 deletions
+104 -345
View File
@@ -17,10 +17,7 @@
#include "RecenterDialog.hpp"
#include "CalibUtils.hpp"
#include <algorithm>
#include <boost/log/trivial.hpp>
#include <slic3r/GUI/Widgets/ProgressDialog.hpp>
#include <wx/choice.h>
#include <wx/display.h>
#include <wx/mstream.h>
#include <wx/sstream.h>
@@ -216,22 +213,7 @@ void ExtruderImage::msw_rescale()
void ExtruderImage::setExtruderCount(int nozzle_num)
{
const int normalized_count = std::max(0, nozzle_num);
if (m_nozzle_num == normalized_count && m_multi_extruder_states.size() == static_cast<size_t>(normalized_count))
return;
m_nozzle_num = normalized_count;
m_multi_extruder_states.resize(static_cast<size_t>(m_nozzle_num), ExtruderState::EMPTY_LOAD);
Refresh();
}
void ExtruderImage::setGenericNozzleDisplay(bool enabled)
{
if (m_generic_nozzle_display == enabled)
return;
m_generic_nozzle_display = enabled;
Refresh();
m_nozzle_num = nozzle_num;
}
void ExtruderImage::setExtruderUsed(std::string loc)
@@ -246,36 +228,14 @@ void ExtruderImage::setExtruderUsed(std::string loc)
Refresh();
}
void ExtruderImage::setExtruderUsed(int nozzle_idx)
{
if (current_nozzle_idx == nozzle_idx)
return;
current_nozzle_idx = nozzle_idx;
Refresh();
}
void ExtruderImage::update(ExtruderState single_state)
{
m_single_ext_state = single_state;
Refresh();
}
void ExtruderImage::update(ExtruderState right_state, ExtruderState left_state) {
m_left_ext_state = left_state;
m_right_ext_state = right_state;
Refresh();
}
void ExtruderImage::update(ExtruderState state, int idx) {
if (idx < 0 || m_multi_extruder_states.size() <= static_cast<size_t>(idx)) {
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ": Index exceeded number of extruders.";
return;
}
if (m_multi_extruder_states[idx] == state)
return;
m_multi_extruder_states[idx] = state;
}
void ExtruderImage::paintEvent(wxPaintEvent& evt)
@@ -310,50 +270,6 @@ void ExtruderImage::doRender(wxDC& dc)
auto size = GetSize();
//dc.DrawRectangle(0, FromDIP(5), size.x, size.y - FromDIP(5) - FromDIP(2));
if (m_generic_nozzle_display) {
const wxSize source_size = m_left_extruder_active_filled->GetBmpSize();
const int count = std::min(m_nozzle_num, static_cast<int>(m_multi_extruder_states.size()));
if (count <= 0 || size.x <= 0 || size.y <= 0 || source_size.x <= 0 || source_size.y <= 0)
return;
double best_scale = 0.0;
int columns = 1;
int rows = count;
for (int candidate_columns = 1; candidate_columns <= count; ++candidate_columns) {
const int candidate_rows = (count + candidate_columns - 1) / candidate_columns;
const double scale = std::min(static_cast<double>(size.x) / candidate_columns / source_size.x,
static_cast<double>(size.y) / candidate_rows / source_size.y);
if (scale > best_scale) {
best_scale = scale;
columns = candidate_columns;
rows = candidate_rows;
}
}
const int icon_width = std::max(1, static_cast<int>(source_size.x * best_scale));
const int icon_height = std::max(1, static_cast<int>(source_size.y * best_scale));
const int cell_width = size.x / columns;
const int cell_height = size.y / rows;
for (int i = 0; i < count; ++i) {
const ExtruderState state = m_multi_extruder_states[i];
const bool filled = state == ExtruderState::FILLED_LOAD || state == ExtruderState::FILLED_UNLOAD;
const bool selected = i == current_nozzle_idx;
ScalableBitmap* icon = nullptr;
if (selected)
icon = filled ? m_left_extruder_active_filled : m_left_extruder_active_empty;
else
icon = filled ? m_left_extruder_unactive_filled : m_left_extruder_unactive_empty;
const int col = i % columns;
const int row = i / columns;
const int x = col * cell_width + (cell_width - icon_width) / 2;
const int y = row * cell_height + (cell_height - icon_height) / 2;
const wxImage scaled_image = icon->bmp().ConvertToImage().Scale(icon_width, icon_height, wxIMAGE_QUALITY_HIGH);
dc.DrawBitmap(wxBitmap(scaled_image), x, y, true);
}
return;
}
auto pot = wxPoint(size.x / 2, (size.y - m_pipe_filled_load->GetBmpSize().y - m_left_extruder_active_filled->GetBmpSize().y) / 2);
if (m_nozzle_num >= 2){
@@ -1800,14 +1716,32 @@ wxBoxSizer *StatusBasePanel::create_temp_control(wxWindow *parent)
{
auto sizer = new wxBoxSizer(wxVERTICAL);
m_nozzle_temp_control_id = wxWindow::NewControlId();
m_temp_nozzle_parent = parent;
m_temp_nozzle_sizer = sizer;
wxWindowID nozzle_id = wxWindow::NewControlId();
m_tempCtrl_nozzle = new TempInput(parent, nozzle_id, TEMP_BLANK_STR, TempInputType::TEMP_OF_NORMAL_TYPE, TEMP_BLANK_STR, wxString("monitor_nozzle_temp"),
wxString("monitor_nozzle_temp_active"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER);
m_tempCtrl_nozzle->SetMinSize(TEMP_CTRL_MIN_SIZE_ALIGN_TWO_ICON);
m_tempCtrl_nozzle->AddTemp(0); // zero is default temp
m_tempCtrl_nozzle->SetMinTemp(20);
m_tempCtrl_nozzle->SetMaxTemp(300);
m_tempCtrl_nozzle->SetBorderWidth(FromDIP(2));
// Keep the two legacy controls for Bambu's main/deputy nozzle presentation. Generic
// printers use the grow-on-demand pool below, so these do not limit their nozzle count.
m_tempCtrl_nozzle = create_nozzle_temp_control(parent, m_nozzle_temp_control_id);
m_tempCtrl_nozzle_deputy = create_nozzle_temp_control(parent, m_nozzle_temp_control_id);
StateColor tempinput_text_colour(std::make_pair(DISCONNECT_TEXT_COL, (int) StateColor::Disabled), std::make_pair(NORMAL_TEXT_COL, (int) StateColor::Normal));
StateColor tempinput_border_colour(std::make_pair(*wxWHITE, (int)StateColor::Disabled), std::make_pair(BUTTON_HOVER_COL, (int)StateColor::Focused),
std::make_pair(BUTTON_HOVER_COL, (int)StateColor::Hovered), std::make_pair(*wxWHITE, (int)StateColor::Normal));
m_tempCtrl_nozzle->SetTextColor(tempinput_text_colour);
m_tempCtrl_nozzle->SetBorderColor(tempinput_border_colour);
m_tempCtrl_nozzle_deputy = new TempInput(parent, nozzle_id, TEMP_BLANK_STR, TempInputType::TEMP_OF_NORMAL_TYPE, TEMP_BLANK_STR, wxString("monitor_nozzle_temp"), wxString("monitor_nozzle_temp_active"),
wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER);
m_tempCtrl_nozzle_deputy->SetMinSize(TEMP_CTRL_MIN_SIZE_ALIGN_TWO_ICON);
m_tempCtrl_nozzle_deputy->AddTemp(0); // zero is default temp
m_tempCtrl_nozzle_deputy->SetMinTemp(20);
m_tempCtrl_nozzle_deputy->SetMaxTemp(300);
m_tempCtrl_nozzle_deputy->SetBorderWidth(FromDIP(2));
m_tempCtrl_nozzle_deputy->SetTextColor(tempinput_text_colour);
m_tempCtrl_nozzle_deputy->SetBorderColor(tempinput_border_colour);
sizer->Add(m_tempCtrl_nozzle_deputy, 0, wxEXPAND | wxALL, 1);
sizer->Add(m_tempCtrl_nozzle, 0, wxEXPAND | wxALL, 1);
@@ -1826,7 +1760,8 @@ wxBoxSizer *StatusBasePanel::create_temp_control(wxWindow *parent)
m_tempCtrl_bed->SetMaxTemp(bed_temp_range[1]);
m_tempCtrl_bed->SetMinSize(TEMP_CTRL_MIN_SIZE_ALIGN_ONE_ICON);
m_tempCtrl_bed->SetBorderWidth(FromDIP(2));
set_temp_input_colors(m_tempCtrl_bed);
m_tempCtrl_bed->SetTextColor(tempinput_text_colour);
m_tempCtrl_bed->SetBorderColor(tempinput_border_colour);
sizer->Add(m_tempCtrl_bed, 0, wxEXPAND | wxALL, 1);
auto line = new StaticLine(parent);
@@ -1842,7 +1777,8 @@ wxBoxSizer *StatusBasePanel::create_temp_control(wxWindow *parent)
m_tempCtrl_chamber->SetMaxTemp(default_champer_temp_max);
m_tempCtrl_chamber->SetMinSize(TEMP_CTRL_MIN_SIZE_ALIGN_ONE_ICON);
m_tempCtrl_chamber->SetBorderWidth(FromDIP(2));
set_temp_input_colors(m_tempCtrl_chamber);
m_tempCtrl_chamber->SetTextColor(tempinput_text_colour);
m_tempCtrl_chamber->SetBorderColor(tempinput_border_colour);
sizer->Add(m_tempCtrl_chamber, 0, wxEXPAND | wxALL, 1);
m_misc_ctrl_sizer = create_misc_control(parent);
@@ -1850,73 +1786,6 @@ wxBoxSizer *StatusBasePanel::create_temp_control(wxWindow *parent)
return sizer;
}
TempInput* StatusBasePanel::create_nozzle_temp_control(wxWindow* parent, wxWindowID id)
{
auto* temp_ctrl = new TempInput(parent, id, TEMP_BLANK_STR, TempInputType::TEMP_OF_NORMAL_TYPE, TEMP_BLANK_STR,
wxString("monitor_nozzle_temp"), wxString("monitor_nozzle_temp_active"),
wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER);
temp_ctrl->SetMinSize(TEMP_CTRL_MIN_SIZE_ALIGN_TWO_ICON);
temp_ctrl->AddTemp(0); // zero is default temp
temp_ctrl->SetMinTemp(20);
temp_ctrl->SetMaxTemp(300);
temp_ctrl->SetBorderWidth(FromDIP(2));
set_temp_input_colors(temp_ctrl);
return temp_ctrl;
}
void StatusBasePanel::set_temp_input_colors(TempInput* temp_ctrl)
{
StateColor tempinput_text_colour(std::make_pair(DISCONNECT_TEXT_COL, (int)StateColor::Disabled),
std::make_pair(NORMAL_TEXT_COL, (int)StateColor::Normal));
StateColor tempinput_border_colour(std::make_pair(*wxWHITE, (int)StateColor::Disabled),
std::make_pair(BUTTON_HOVER_COL, (int)StateColor::Focused),
std::make_pair(BUTTON_HOVER_COL, (int)StateColor::Hovered),
std::make_pair(*wxWHITE, (int)StateColor::Normal));
temp_ctrl->SetTextColor(tempinput_text_colour);
temp_ctrl->SetBorderColor(tempinput_border_colour);
}
void StatusBasePanel::ensure_nozzle_temp_controls(size_t count)
{
if (!m_temp_nozzle_parent || !m_temp_nozzle_sizer)
return;
bool changed = count != m_temp_nozzle_active_count;
while (m_tempCtrl_nozzles.size() < count) {
TempInput* temp_ctrl = create_nozzle_temp_control(m_temp_nozzle_parent, m_nozzle_temp_control_id);
temp_ctrl->Hide();
m_temp_nozzle_sizer->Insert(m_tempCtrl_nozzles.size(), temp_ctrl, 0, wxEXPAND | wxALL, 1);
m_tempCtrl_nozzles.push_back(temp_ctrl);
m_temp_nozzle_timeouts.push_back(0);
changed = true;
}
const wxSize nozzle_size = count >= 2 ? TEMP_CTRL_MIN_SIZE_ALIGN_TWO_ICON : TEMP_CTRL_MIN_SIZE_ALIGN_ONE_ICON;
for (size_t i = 0; i < m_tempCtrl_nozzles.size(); ++i) {
const bool show = i < count;
if (m_tempCtrl_nozzles[i]->IsShown() != show) {
m_tempCtrl_nozzles[i]->Show(show);
changed = true;
}
if (m_tempCtrl_nozzles[i]->GetMinSize() != nozzle_size) {
m_tempCtrl_nozzles[i]->SetMinSize(nozzle_size);
changed = true;
}
}
if (count < m_temp_nozzle_active_count) {
for (size_t i = count; i < m_temp_nozzle_timeouts.size(); ++i)
m_temp_nozzle_timeouts[i] = 0;
}
m_temp_nozzle_active_count = count;
if (changed) {
m_temp_nozzle_parent->Layout();
Layout();
}
}
wxBoxSizer *StatusBasePanel::create_misc_control(wxWindow *parent)
{
wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
@@ -2140,9 +2009,6 @@ wxBoxSizer *StatusBasePanel::create_extruder_control(wxWindow *parent)
m_nozzle_btn_panel = new SwitchBoard(panel, _L_CONTEXT("Left", "Nozzle position"), _L_CONTEXT("Right", "Nozzle position"), wxSize(FromDIP(126), FromDIP(26)));
m_nozzle_btn_panel->SetAutoDisableWhenSwitch();
m_generic_nozzle_selector = new wxChoice(panel, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(126), FromDIP(26)));
m_generic_nozzle_selector->SetMinSize(wxSize(FromDIP(126), FromDIP(26)));
m_generic_nozzle_selector->Hide();
m_bpButton_e_10 = new Button(panel, "", "monitor_extruder_up", 0, 22); // Orca Dont scale icon size
m_bpButton_e_10->SetBorderWidth(2);
@@ -2175,7 +2041,6 @@ wxBoxSizer *StatusBasePanel::create_extruder_control(wxWindow *parent)
bSizer_e_ctrl->Add(0, 0, 0, wxTOP, FromDIP(15));
bSizer_e_ctrl->Add(m_nozzle_btn_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0);
bSizer_e_ctrl->Add(m_generic_nozzle_selector, 0, wxALIGN_CENTER_HORIZONTAL, 0);
bSizer_e_ctrl->Add(0, 0, 0, wxTOP, FromDIP(15));
bSizer_e_ctrl->Add(m_bpButton_e_10, 0, wxALIGN_CENTER_HORIZONTAL, 0);
bSizer_e_ctrl->Add(0, 0, 0, wxTOP, FromDIP(7));
@@ -2598,43 +2463,9 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co
add_build_step([this] { wire_controls(); });
}
void StatusPanel::sync_nozzle_temp_controls(size_t count)
{
const size_t old_size = m_tempCtrl_nozzles.size();
ensure_nozzle_temp_controls(count);
bool layout_changed = false;
if (m_tempCtrl_nozzle->IsShown()) {
m_tempCtrl_nozzle->Hide();
layout_changed = true;
}
if (m_tempCtrl_nozzle_deputy->IsShown()) {
m_tempCtrl_nozzle_deputy->Hide();
layout_changed = true;
}
if (layout_changed) {
m_temp_nozzle_parent->Layout();
Layout();
}
for (size_t i = old_size; i < m_tempCtrl_nozzles.size(); ++i) {
m_tempCtrl_nozzles[i]->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_kill_focus), NULL, this);
m_tempCtrl_nozzles[i]->Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_set_focus), NULL, this);
}
}
void StatusPanel::wire_controls()
{
init_scaled_buttons();
const bool is_bbl_vendor = wxGetApp().preset_bundle->is_bbl_vendor();
if (!is_bbl_vendor)
sync_nozzle_temp_controls(obj ? obj->GetExtderSystem()->GetTotalExtderCount() : 0);
if (is_bbl_vendor)
m_generic_nozzle_selector->Hide();
else
m_nozzle_btn_panel->Hide();
m_nozzle_btn_panel->GetParent()->Layout();
m_buttons.push_back(m_bpButton_z_10);
m_buttons.push_back(m_bpButton_z_1);
m_buttons.push_back(m_bpButton_z_down_1);
@@ -2664,7 +2495,10 @@ void StatusPanel::wire_controls()
int id = e.GetInt();
if (id == m_tempCtrl_bed->GetType()) {
on_set_bed_temp();
} else if (id == m_nozzle_temp_control_id) {
} else if (id == m_tempCtrl_nozzle->GetType()) {
// NOTE: this check assumes any future m_tempCtrl_nozzles population constructs those
// TempInput widgets with the same "type" id as m_tempCtrl_nozzle (as m_tempCtrl_nozzle_deputy
// already does today), so their events route into this branch too.
if (wxGetApp().preset_bundle->is_bbl_vendor()) {
if (e.GetString() == wxString::Format("%d", MAIN_EXTRUDER_ID)) {
on_set_nozzle_temp(MAIN_EXTRUDER_ID);
@@ -2711,6 +2545,11 @@ void StatusPanel::wire_controls()
m_tempCtrl_nozzle->Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_set_focus), NULL, this);
m_tempCtrl_nozzle_deputy->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_kill_focus), NULL, this);
m_tempCtrl_nozzle_deputy->Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_set_focus), NULL, this);
} else {
for (auto& tempCtrl : m_tempCtrl_nozzles) {
tempCtrl->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_kill_focus), NULL, this);
tempCtrl->Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_set_focus), NULL, this);
}
}
m_tempCtrl_chamber->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_cham_temp_kill_focus), NULL, this);
m_tempCtrl_chamber->Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_cham_temp_set_focus), NULL, this);
@@ -2731,7 +2570,6 @@ void StatusPanel::wire_controls()
m_bpButton_e_10->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_axis_ctrl_e_up_10), NULL, this);
m_bpButton_e_down_10->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_axis_ctrl_e_down_10), NULL, this);
m_nozzle_btn_panel->Connect(wxCUSTOMEVT_SWITCH_POS, wxCommandEventHandler(StatusPanel::on_nozzle_selected), NULL, this);
m_generic_nozzle_selector->Connect(wxEVT_CHOICE, wxCommandEventHandler(StatusPanel::on_nozzle_selected), NULL, this);
Bind(EVT_AMS_EXTRUSION_CALI, &StatusPanel::on_filament_extrusion_cali, this);
Bind(EVT_AMS_LOAD, &StatusPanel::on_ams_load, this);
@@ -2804,7 +2642,6 @@ StatusPanel::~StatusPanel()
m_bpButton_e_10->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_axis_ctrl_e_up_10), NULL, this);
m_bpButton_e_down_10->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_axis_ctrl_e_down_10), NULL, this);
m_nozzle_btn_panel->Disconnect(wxCUSTOMEVT_SWITCH_POS, wxCommandEventHandler(StatusPanel::on_nozzle_selected), NULL, this);
m_generic_nozzle_selector->Disconnect(wxEVT_CHOICE, wxCommandEventHandler(StatusPanel::on_nozzle_selected), NULL, this);
m_switch_speed->Disconnect(wxEVT_LEFT_DOWN, wxCommandEventHandler(StatusPanel::on_switch_speed), NULL, this);
m_calibration_btn->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_start_calibration), NULL, this);
m_options_btn->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_show_print_options), NULL, this);
@@ -3062,7 +2899,6 @@ void StatusPanel::update(MachineObject *obj)
if (!obj || !obj->is_info_ready())
{
m_nozzle_btn_panel->Disable();
m_generic_nozzle_selector->Disable();
return;
}
@@ -3299,10 +3135,6 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj)
{
if (!obj) return;
const int nozzle_num = obj->GetExtderSystem()->GetTotalExtderCount();
if (!wxGetApp().preset_bundle->is_bbl_vendor())
sync_nozzle_temp_controls(nozzle_num);
DevBed* bed = obj->GetBed();
int bed_cur_temp = bed->GetBedTemp();
int bed_target_temp = bed->GetBedTempTarget();
@@ -3343,31 +3175,17 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj)
}
bool to_update_layout = false;
int nozzle_num = obj->GetExtderSystem()->GetTotalExtderCount();
if (wxGetApp().preset_bundle->is_bbl_vendor()) {
for (auto& tempCtrl : m_tempCtrl_nozzles) {
if (tempCtrl->IsShown()) {
tempCtrl->Hide();
to_update_layout = true;
}
}
if (nozzle_num == 1)
{
m_tempCtrl_nozzle->SetCurrTemp(obj->GetExtderSystem()->GetNozzleTempCurrent(MAIN_EXTRUDER_ID));
m_tempCtrl_nozzle->SetCurrType(TEMP_OF_NORMAL_TYPE);
if (!m_tempCtrl_nozzle->IsShown()) {
m_tempCtrl_nozzle->Show();
to_update_layout = true;
}
m_tempCtrl_nozzle_deputy->SetCurrType(TEMP_OF_NORMAL_TYPE);
m_tempCtrl_nozzle_deputy->SetLabel(TEMP_BLANK_STR);
if (m_tempCtrl_nozzle_deputy->IsShown()) {
m_tempCtrl_nozzle_deputy->Hide();
to_update_layout = true;
}
m_tempCtrl_nozzle_deputy->Hide();
if (m_tempCtrl_nozzle->GetMinSize() != TEMP_CTRL_MIN_SIZE_ALIGN_ONE_ICON)
{
@@ -3379,17 +3197,11 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj)
{
m_tempCtrl_nozzle->SetCurrType(TEMP_OF_MAIN_NOZZLE_TYPE);
m_tempCtrl_nozzle->SetCurrTemp(obj->GetExtderSystem()->GetNozzleTempCurrent(MAIN_EXTRUDER_ID));
if (!m_tempCtrl_nozzle->IsShown()) {
m_tempCtrl_nozzle->Show();
to_update_layout = true;
}
m_tempCtrl_nozzle->Show();
m_tempCtrl_nozzle_deputy->SetCurrType(TEMP_OF_DEPUTY_NOZZLE_TYPE);
m_tempCtrl_nozzle_deputy->SetCurrTemp(obj->GetExtderSystem()->GetNozzleTempCurrent(DEPUTY_EXTRUDER_ID));
if (!m_tempCtrl_nozzle_deputy->IsShown()) {
m_tempCtrl_nozzle_deputy->Show();
to_update_layout = true;
}
m_tempCtrl_nozzle_deputy->Show();
if (m_tempCtrl_nozzle->GetMinSize() != TEMP_CTRL_MIN_SIZE_ALIGN_TWO_ICON)
{
@@ -3400,18 +3212,14 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj)
}
else
{
if (m_tempCtrl_nozzle->IsShown()) {
m_tempCtrl_nozzle->Hide();
to_update_layout = true;
}
if (m_tempCtrl_nozzle_deputy->IsShown()) {
m_tempCtrl_nozzle_deputy->Hide();
to_update_layout = true;
}
for (size_t i = 0; i < static_cast<size_t>(nozzle_num); ++i)
m_tempCtrl_nozzle->Hide();
m_tempCtrl_nozzle_deputy->Hide();
for (size_t i = 0; i < m_tempCtrl_nozzles.size(); ++i)
{
m_tempCtrl_nozzles[i]->SetCurrTemp(obj->GetExtderSystem()->GetNozzleTempCurrent((int)i));
m_tempCtrl_nozzles[i]->SetCurrType(TEMP_OF_NORMAL_TYPE);
m_tempCtrl_nozzles[i]->Show();
}
}
@@ -3461,7 +3269,7 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj)
}
else {
assert(m_temp_nozzle_timeouts.size() == m_tempCtrl_nozzles.size());
for (size_t i = 0; i < static_cast<size_t>(nozzle_num); ++i) {
for (size_t i = 0; i < m_temp_nozzle_timeouts.size(); ++i) {
if (m_temp_nozzle_timeouts[i] > 0) {
m_temp_nozzle_timeouts[i]--;
} else {
@@ -3552,90 +3360,69 @@ void StatusPanel::update_misc_ctrl(MachineObject *obj)
/*extder*/
auto extder_system = obj->GetExtderSystem();
m_nozzle_num = extder_system->GetTotalExtderCount();
const bool is_bbl_vendor = wxGetApp().preset_bundle->is_bbl_vendor();
const bool bbl_selector_was_shown = m_nozzle_btn_panel->IsShown();
const bool generic_selector_was_shown = m_generic_nozzle_selector->IsShown();
if (m_nozzle_num <= 0) {
m_nozzle_btn_panel->Hide();
m_generic_nozzle_selector->Hide();
m_extruder_book->SetSelection(0);
} else if (is_bbl_vendor) {
// Preserve Bambu's existing main/deputy presentation and left/right selector.
const int display_num = std::min(m_nozzle_num, static_cast<int>(m_extruderImage.size()));
const int select_index = display_num - 1;
ExtruderImage* image = m_extruderImage[select_index];
image->setGenericNozzleDisplay(false);
image->setExtruderCount(m_nozzle_num);
// m_extruderImage/m_extruder_book only have dedicated pages for 1 and 2 nozzles (see
// create_extruder_control()); 3+ reuses the 2-nozzle page and style, which is a cosmetic
// fallback only (ExtruderImage::doRender's own "m_nozzle_num >= 2" branch already draws the
// same two-icon graphic for any count >= 2) -- this just avoids indexing past the vector's end.
int display_num = m_nozzle_num < (int)m_extruderImage.size() ? m_nozzle_num : (int)m_extruderImage.size();
int select_index = display_num - 1;
if (m_nozzle_num >= 2) {
m_extruder_book->SetSelection(display_num);
m_nozzle_btn_panel->Show();
m_generic_nozzle_selector->Hide();
if (m_nozzle_num >= 2) {
m_extruder_book->SetSelection(display_num);
if (extder_system->GetTotalExtderSize() > 1) {
image->update(get_extder_shown_state(extder_system->HasFilamentInExt(0)),
get_extder_shown_state(extder_system->HasFilamentInExt(1)));
}
/*style*/
m_nozzle_btn_panel->Show();
m_extruderImage[select_index]->setExtruderCount(m_nozzle_num);
if (extder_system->GetCurrentExtderId() == 0xf) {
image->setExtruderUsed("");
m_nozzle_btn_panel->updateState("");
} else if (extder_system->GetCurrentExtderId() == MAIN_EXTRUDER_ID) {
image->setExtruderUsed("right");
m_nozzle_btn_panel->updateState("right");
} else if (extder_system->GetCurrentExtderId() == DEPUTY_EXTRUDER_ID) {
image->setExtruderUsed("left");
m_nozzle_btn_panel->updateState("left");
}
m_nozzle_btn_panel->SetClientData(obj);
if ((obj->is_in_printing() && !obj->is_in_printing_pause()) ||
obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE ||
obj->targ_nozzle_id_from_pc != INVALID_EXTRUDER_ID)
m_nozzle_btn_panel->Disable();
else
m_nozzle_btn_panel->Enable();
} else {
m_nozzle_btn_panel->Hide();
m_generic_nozzle_selector->Hide();
m_extruder_book->SetSelection(display_num);
if (extder_system->GetTotalExtderSize() > 0)
image->update(get_extder_shown_state(extder_system->HasFilamentInExt(0)));
if (obj->GetExtderSystem()->GetTotalExtderSize() > 1)
{
m_extruderImage[select_index]->update(get_extder_shown_state(obj->GetExtderSystem()->HasFilamentInExt(0)),
get_extder_shown_state(obj->GetExtderSystem()->HasFilamentInExt(1)));
}
} else {
m_nozzle_btn_panel->Hide();
m_extruder_book->SetSelection(1);
ExtruderImage* image = m_extruderImage.front();
image->setGenericNozzleDisplay(true);
image->setExtruderCount(m_nozzle_num);
const int current_nozzle_id = extder_system->GetCurrentExtderId();
const int selected_nozzle_id = current_nozzle_id >= 0 && current_nozzle_id < m_nozzle_num ? current_nozzle_id : -1;
image->setExtruderUsed(selected_nozzle_id);
for (int i = 0; i < m_nozzle_num; ++i)
image->update(get_extder_shown_state(extder_system->HasFilamentInExt(i)), i);
image->Refresh();
if (m_generic_nozzle_selector_count != m_nozzle_num) {
m_generic_nozzle_selector->Clear();
for (int i = 0; i < m_nozzle_num; ++i)
m_generic_nozzle_selector->Append(wxString::Format("%s %d", _L("Nozzle"), i + 1));
m_generic_nozzle_selector_count = m_nozzle_num;
/*current*/
/*update when extder position changed or the machine changed*/
if (obj->GetExtderSystem()->GetCurrentExtderId() == 0xf)
{
m_extruderImage[select_index]->setExtruderUsed("");
m_nozzle_btn_panel->updateState("");
}
else if (obj->GetExtderSystem()->GetCurrentExtderId() == MAIN_EXTRUDER_ID)
{
m_extruderImage[select_index]->setExtruderUsed("right");
m_nozzle_btn_panel->updateState("right");
}
else if (obj->GetExtderSystem()->GetCurrentExtderId() == DEPUTY_EXTRUDER_ID)
{
m_extruderImage[select_index]->setExtruderUsed("left");
m_nozzle_btn_panel->updateState("left");
}
m_generic_nozzle_selector->SetSelection(selected_nozzle_id);
m_generic_nozzle_selector->Show(m_nozzle_num > 1);
m_nozzle_btn_panel->SetClientData(obj);
/*enable status*/
/* Can do switch while printing pause STUDIO-9789*/
if ((obj->is_in_printing() && !obj->is_in_printing_pause()) ||
obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE ||
obj->targ_nozzle_id_from_pc != INVALID_EXTRUDER_ID)
m_generic_nozzle_selector->Disable();
{
m_nozzle_btn_panel->Disable();
}
else
m_generic_nozzle_selector->Enable();
}
{
m_nozzle_btn_panel->Enable();
}
} else {
m_nozzle_btn_panel->Hide();
m_extruder_book->SetSelection(display_num);
m_extruderImage[select_index]->setExtruderCount(m_nozzle_num);
if (bbl_selector_was_shown != m_nozzle_btn_panel->IsShown() ||
generic_selector_was_shown != m_generic_nozzle_selector->IsShown())
m_nozzle_btn_panel->GetParent()->Layout();
if (extder_system->GetTotalExtderSize() > 0)
{
ExtruderState shown_state = get_extder_shown_state(extder_system->HasFilamentInExt(0));
m_extruderImage[select_index]->update(shown_state);
}
}
/*switch extder*/
m_extruder_switching_status->updateBy(obj);
@@ -4595,8 +4382,7 @@ void StatusPanel::on_set_nozzle_temp(int nozzle_id)
}
}
}
else if (nozzle_id >= 0 && nozzle_id < (int)m_tempCtrl_nozzles.size() &&
nozzle_id < obj->GetExtderSystem()->GetTotalExtderCount()) {
else if (nozzle_id >= 0 && nozzle_id < (int)m_tempCtrl_nozzles.size()) {
assert(m_tempCtrl_nozzles.size() == m_temp_nozzle_timeouts.size());
wxString str = m_tempCtrl_nozzles[nozzle_id]->GetTextCtrl()->GetValue();
if (str.ToLong(&nozzle_temp) && obj) {
@@ -5467,42 +5253,23 @@ void StatusPanel::on_xyz_abs(wxCommandEvent &event)
void StatusPanel::on_nozzle_selected(wxCommandEvent &event)
{
const bool is_bbl_vendor = wxGetApp().preset_bundle->is_bbl_vendor();
if (obj) {
const int nozzle_id = event.GetInt();
const auto extder_system = obj->GetExtderSystem();
const int current_nozzle_id = extder_system->GetCurrentExtderId();
const int current_selection = current_nozzle_id >= 0 && current_nozzle_id < extder_system->GetTotalExtderCount()
? current_nozzle_id
: wxNOT_FOUND;
const bool nozzle_change_in_progress = !is_bbl_vendor && obj->targ_nozzle_id_from_pc != INVALID_EXTRUDER_ID;
if (!is_bbl_vendor && (nozzle_id < 0 || nozzle_id >= extder_system->GetTotalExtderCount())) {
m_generic_nozzle_selector->SetSelection(current_selection);
return;
}
/*Enable switch head while printing is paused STUDIO-9789*/
if ((obj->is_in_printing() && !obj->is_in_printing_pause()) ||
obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE || nozzle_change_in_progress) {
if ((obj->is_in_printing() && !obj->is_in_printing_pause()) || obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE) {
MessageDialog dlg(nullptr, _L("The printer is busy with another print job."), _L("Error"), wxICON_WARNING | wxOK);
dlg.ShowModal();
if (!is_bbl_vendor)
m_generic_nozzle_selector->SetSelection(current_selection);
return;
}
if (!is_bbl_vendor)
m_generic_nozzle_selector->Disable();
auto nozzle_id = event.GetInt();
if (obj->GetCtrl()->command_select_extruder(nozzle_id) == 0)
{
return;
}
}
if (is_bbl_vendor)
m_nozzle_btn_panel->Enable();
else
m_generic_nozzle_selector->Enable();
m_nozzle_btn_panel->Enable();
}
void StatusPanel::on_show_print_options(wxCommandEvent& event)
@@ -5614,8 +5381,6 @@ void StatusPanel::set_default()
m_switch_lamp_timeout = 0;
m_temp_nozzle_timeout = 0;
m_temp_nozzle_deputy_timeout = 0;
for (auto& timeout : m_temp_nozzle_timeouts)
timeout = 0;
m_temp_bed_timeout = 0;
m_temp_chamber_timeout = 0;
m_switch_nozzle_fan_timeout = 0;
@@ -5623,12 +5388,6 @@ void StatusPanel::set_default()
m_switch_cham_fan_timeout = 0;
m_show_ams_group = false;
m_show_filament_group = false;
m_generic_nozzle_selector->Hide();
m_nozzle_btn_panel->Hide();
m_generic_nozzle_selector->Clear();
m_generic_nozzle_selector_count = 0;
m_extruder_book->SetSelection(0);
m_nozzle_btn_panel->GetParent()->Layout();
reset_printing_values();
m_bitmap_timelapse_img->Hide();
+2 -22
View File
@@ -1,8 +1,6 @@
#ifndef slic3r_StatusPanel_hpp_
#define slic3r_StatusPanel_hpp_
#include <vector>
#include "libslic3r/ProjectTask.hpp"
#include "DeviceManager.hpp"
#include "MonitorPage.hpp"
@@ -43,7 +41,6 @@
#include "StagedBuild.hpp"
class StepIndicator;
class wxChoice;
#define COMMAND_TIMEOUT 5
@@ -118,7 +115,6 @@ class ExtruderImage : public wxWindow
ScalableBitmap *m_left_extruder_active_empty;
ScalableBitmap *m_left_extruder_unactive_filled;
ScalableBitmap *m_left_extruder_unactive_empty;
ScalableBitmap *m_right_extruder_active_filled;
ScalableBitmap *m_right_extruder_active_empty;
ScalableBitmap *m_right_extruder_unactive_filled;
@@ -132,21 +128,15 @@ class ExtruderImage : public wxWindow
ExtruderState m_left_ext_state = {ExtruderState::EMPTY_LOAD};
ExtruderState m_right_ext_state = {ExtruderState::EMPTY_LOAD};
ExtruderState m_single_ext_state = {ExtruderState::EMPTY_LOAD};
std::vector<ExtruderState> m_multi_extruder_states;
bool m_generic_nozzle_display{false};
public:
void update(int nozzle_num, int nozzle_id);
void update(ExtruderState single_state);
void update(ExtruderState right_state, ExtruderState left_state);
void update(ExtruderState state, int idx);
void msw_rescale();
void setExtruderCount(int nozzle_num);
void setGenericNozzleDisplay(bool enabled);
void setExtruderUsed(std::string loc);
void setExtruderUsed(int nozzle_idx);
void paintEvent(wxPaintEvent &evt);
void render(wxDC &dc);
@@ -480,8 +470,6 @@ protected:
std::vector<ExtruderImage *> m_extruderImage;
SwitchBoard * m_nozzle_btn_panel;
wxChoice* m_generic_nozzle_selector{nullptr};
int m_generic_nozzle_selector_count{0};
wxStaticText * m_text_tasklist_caption;
@@ -494,13 +482,9 @@ protected:
wxBoxSizer * m_misc_ctrl_sizer;
StaticBox* m_fan_panel;
StaticLine * m_line_nozzle;
wxWindowID m_nozzle_temp_control_id{wxID_ANY};
wxWindow* m_temp_nozzle_parent{nullptr};
wxBoxSizer* m_temp_nozzle_sizer{nullptr};
size_t m_temp_nozzle_active_count{0};
TempInput* m_tempCtrl_nozzle{nullptr};
TempInput* m_tempCtrl_nozzle;
int m_temp_nozzle_timeout{ 0 };
TempInput* m_tempCtrl_nozzle_deputy{nullptr};
TempInput* m_tempCtrl_nozzle_deputy;
int m_temp_nozzle_deputy_timeout{ 0 };
std::vector<TempInput*> m_tempCtrl_nozzles;
@@ -621,9 +605,6 @@ public:
wxBoxSizer *create_temp_axis_group(wxWindow *parent);
wxBoxSizer *create_temp_control(wxWindow *parent);
TempInput* create_nozzle_temp_control(wxWindow *parent, wxWindowID id);
void set_temp_input_colors(TempInput* temp_ctrl);
void ensure_nozzle_temp_controls(size_t count);
wxBoxSizer *create_misc_control(wxWindow *parent);
wxBoxSizer *create_axis_control(wxWindow *parent);
wxPanel *create_bed_control(wxWindow *parent);
@@ -654,7 +635,6 @@ private:
friend class MonitorPanel;
void wire_controls();
bool load_thumbnail_from_url(const wxString &url, MachineObject *obj);
void sync_nozzle_temp_controls(size_t count);
protected:
std::shared_ptr<SliceInfoPopup> m_slice_info_popup;