From f2598e0265d39c51613d49ae6d045214f45cb8ad Mon Sep 17 00:00:00 2001 From: tao wang Date: Tue, 3 Dec 2024 21:49:35 +0800 Subject: [PATCH] NEW:support multiple extruder new control jira:[device page] Change-Id: Idf68a3385172cbaa123cedb4e2b814c15cc09f07 (cherry picked from commit 7700b911a6fec782ce6b484b9b030963283a846c) --- src/slic3r/GUI/DeviceManager.cpp | 30 +++++++ src/slic3r/GUI/DeviceManager.hpp | 14 +++- src/slic3r/GUI/StatusPanel.cpp | 102 +++++++++++++++--------- src/slic3r/GUI/StatusPanel.hpp | 14 ++-- src/slic3r/GUI/Widgets/SwitchButton.cpp | 21 ++++- src/slic3r/GUI/Widgets/SwitchButton.hpp | 6 ++ src/slic3r/GUI/Widgets/TempInput.cpp | 65 +++++++++------ src/slic3r/GUI/Widgets/TempInput.hpp | 7 +- 8 files changed, 184 insertions(+), 75 deletions(-) diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 2ae0f6d9f5..f6257c47d2 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -1644,6 +1644,20 @@ bool MachineObject::is_studio_cmd(int sequence_id) return false; } +int MachineObject::command_select_extruder(int id) +{ + BOOST_LOG_TRIVIAL(info) << "select_extruder"; + + nozzle_selected_count = HOLD_COUNT_MAX; + + json j; + j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["print"]["command"] = "select_extruder"; + j["print"]["extruder_index"] = id; + + return this->publish_json(j.dump(), 1); +} + int MachineObject::command_get_version(bool with_retry) { BOOST_LOG_TRIVIAL(info) << "command_get_version"; @@ -1901,6 +1915,21 @@ int MachineObject::command_set_nozzle(int temp) return this->publish_gcode(gcode_str); } +int MachineObject::command_set_nozzle_new(int nozzle_id, int temp) +{ + BOOST_LOG_TRIVIAL(info) << "set_nozzle_temp"; + + nozzle_selected_count = HOLD_COUNT_MAX; + + json j; + j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["print"]["command"] = "set_nozzle_temp"; + j["print"]["extruder_index"] = nozzle_id; + j["print"]["target_temp"] = temp; + + return this->publish_json(j.dump(), 1); +} + int MachineObject::command_set_chamber(int temp) { json j; @@ -3290,6 +3319,7 @@ int MachineObject::parse_json(std::string payload, bool key_field_only) } } + if (jj.contains("command")) { if (jj["command"].get() == "ams_change_filament") { if (jj.contains("errno")) { diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index ae4805a027..837766bec7 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -141,6 +141,13 @@ enum ManualPaCaliMethod { PA_PATTERN, }; +enum ExtruderSwitchState { + ES_IDLE = 0, + ES_BUSY, + ES_SWITCHING, + ES_SWITCHING_FAILED +}; + enum AirDuctType { AIR_FAN_TYPE, AIR_DOOR_TYPE @@ -218,6 +225,7 @@ struct ExtderData int current_extder_id{0}; int target_extder_id{0}; int total_extder_count {0}; + int state; std::vector extders; }; @@ -588,6 +596,7 @@ public: std::string dev_id; bool local_use_ssl_for_mqtt { true }; bool local_use_ssl_for_ftp { true }; + bool m_busy_for_select_extruder {false}; int subscribe_counter{3}; std::string dev_connection_type; /* lan | cloud */ std::string connection_type() { return dev_connection_type; } @@ -921,6 +930,7 @@ public: int xcam_prompt_sound_hold_count = 0; int xcam_filament_tangle_detect_count = 0; int ams_print_option_count = 0; + int nozzle_selected_count = 0; //supported features bool is_support_chamber_edit{false}; @@ -1019,6 +1029,7 @@ public: std::string parse_version(); void parse_version_func(); bool is_studio_cmd(int seq); + /* command commands */ int command_get_version(bool with_retry = true); int command_request_push_all(bool request_now = false); @@ -1027,7 +1038,7 @@ public: int command_set_printer_nozzle(std::string nozzle_type, float diameter); int command_set_printer_nozzle2(int id, std::string nozzle_type, float diameter, int flow); int command_get_access_code(); - + int command_select_extruder(int id); /* command upgrade */ int command_upgrade_confirm(); @@ -1051,6 +1062,7 @@ public: int command_task_resume(); int command_set_bed(int temp); int command_set_nozzle(int temp); + int command_set_nozzle_new(int nozzle_id, int temp); int command_set_chamber(int temp); // ams controls //int command_ams_switch(int tray_index, int old_temp = 210, int new_temp = 210); diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index f7063364ff..1a4cf9b9fa 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -1414,7 +1414,7 @@ wxBoxSizer *StatusBasePanel::create_temp_control(wxWindow *parent) auto sizer = new wxBoxSizer(wxVERTICAL); wxWindowID nozzle_id = wxWindow::NewControlId(); - m_tempCtrl_nozzle = new TempInput(parent, nozzle_id, TEMP_BLANK_STR, TempInputType::TEMP_OF_MAIN_NOZZLE_TYPE, TEMP_BLANK_STR, wxString("monitor_nozzle_temp"), wxString("monitor_nozzle_temp_active"), + 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_OF_SINGLE_NOZZLE); m_tempCtrl_nozzle->SetMinTemp(nozzle_temp_range[0]); @@ -1429,7 +1429,7 @@ wxBoxSizer *StatusBasePanel::create_temp_control(wxWindow *parent) m_tempCtrl_nozzle->SetBorderColor(tempinput_border_colour); sizer->Add(m_tempCtrl_nozzle, 0, wxEXPAND | wxALL, 1); - m_tempCtrl_nozzle_deputy = new TempInput(parent, nozzle_id, TEMP_BLANK_STR, TempInputType::TEMP_OF_DEPUTY_NOZZLE_TYPE, TEMP_BLANK_STR, wxString("monitor_nozzle_temp"), wxString("monitor_nozzle_temp_active"), + 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_OF_SINGLE_NOZZLE); m_tempCtrl_nozzle_deputy->SetMinTemp(nozzle_temp_range[0]); @@ -1440,7 +1440,7 @@ wxBoxSizer *StatusBasePanel::create_temp_control(wxWindow *parent) m_tempCtrl_nozzle_deputy->SetBorderColor(tempinput_border_colour); sizer->Add(m_tempCtrl_nozzle_deputy, 0, wxEXPAND | wxALL, 1); - //m_tempCtrl_nozzle_deputy->Hide(); + m_tempCtrl_nozzle_deputy->Hide(); m_line_nozzle = new StaticLine(parent); m_line_nozzle->SetLineColour(STATIC_BOX_LINE_COL); @@ -1817,7 +1817,7 @@ wxBoxSizer *StatusBasePanel::create_extruder_control(wxWindow *parent) StateColor e_ctrl_bg(std::pair(BUTTON_PRESS_COL, StateColor::Pressed), std::pair(BUTTON_NORMAL1_COL, StateColor::Normal)); StateColor e_ctrl_bd(std::pair(BUTTON_HOVER_COL, StateColor::Hovered), std::pair(BUTTON_NORMAL1_COL, StateColor::Normal)); - m_left_right_btn_panel = new SwitchBoard(panel, _L("Left"), _L("Right"), wxSize(FromDIP(126), FromDIP(26))); + m_nozzle_btn_panel = new SwitchBoard(panel, _L("Left"), _L("Right"), wxSize(FromDIP(126), FromDIP(26))); m_bpButton_e_10 = new Button(panel, "", "monitor_extruder_up", 0, FromDIP(22)); m_bpButton_e_10->SetBorderWidth(2); @@ -1861,7 +1861,7 @@ wxBoxSizer *StatusBasePanel::create_extruder_control(wxWindow *parent) m_extruder_label->SetForegroundColour(TEXT_LIGHT_FONT_COL); bSizer_e_ctrl->Add(0, 0, 0, wxTOP, FromDIP(15)); - bSizer_e_ctrl->Add(m_left_right_btn_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0); + bSizer_e_ctrl->Add(m_nozzle_btn_panel, 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)); @@ -2041,7 +2041,11 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co if (id == m_tempCtrl_bed->GetType()) { on_set_bed_temp(); } else if (id == m_tempCtrl_nozzle->GetType()) { - on_set_nozzle_temp(); + if (e.GetString() == wxString::Format("%d", MAIN_NOZZLE_ID)) { + on_set_nozzle_temp(MAIN_NOZZLE_ID); + } else if (e.GetString() == wxString::Format("%d", DEPUTY_NOZZLE_ID)) { + on_set_nozzle_temp(DEPUTY_NOZZLE_ID); + } } else if (id == m_tempCtrl_chamber->GetType()) { on_set_chamber_temp(); } @@ -2080,6 +2084,8 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co m_bpButton_z_down_10->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_axis_ctrl_z_down_10), NULL, this); 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_SELECT_NOZZLE_POS, wxCommandEventHandler(StatusPanel::on_nozzle_selected), NULL, this); + //m_button_unload->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_start_unload), NULL, this); Bind(EVT_AMS_EXTRUSION_CALI, &StatusPanel::on_filament_extrusion_cali, this); Bind(EVT_AMS_LOAD, &StatusPanel::on_ams_load, this); @@ -2142,12 +2148,13 @@ StatusPanel::~StatusPanel() m_bpButton_z_down_10->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_axis_ctrl_z_down_10), NULL, this); 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_SELECT_NOZZLE_POS, 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); m_parts_btn->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_show_parts_options), NULL, this); //m_button_unload->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_start_unload), NULL, this); - + // // remove warning dialogs if (m_print_error_dlg != nullptr) delete m_print_error_dlg; @@ -2699,8 +2706,14 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj) m_tempCtrl_bed->SetIconNormal(); } - m_tempCtrl_nozzle->SetCurrTemp((int) obj->m_extder_data.extders[0].temp); - if(nozzle_num == 2 && obj->m_extder_data.extders.size() > 1) m_tempCtrl_nozzle_deputy->SetCurrTemp((int)obj->m_extder_data.extders[0].temp); + m_tempCtrl_nozzle->SetCurrTemp((int) obj->m_extder_data.extders[MAIN_NOZZLE_ID].temp); + if (nozzle_num == 2 && obj->m_extder_data.extders.size() > 1) { + m_tempCtrl_nozzle->SetCurrType(TEMP_OF_MAIN_NOZZLE_TYPE); + m_tempCtrl_nozzle_deputy->SetCurrType(TEMP_OF_DEPUTY_NOZZLE_TYPE); + m_tempCtrl_nozzle_deputy->Show(); + m_tempCtrl_nozzle_deputy->SetCurrTemp((int)obj->m_extder_data.extders[DEPUTY_NOZZLE_ID].temp); + } + if (obj->nozzle_max_temperature > -1) { if (m_tempCtrl_nozzle) m_tempCtrl_nozzle->SetMaxTemp(obj->nozzle_max_temperature); if (m_tempCtrl_nozzle_deputy && nozzle_num >= 2) m_tempCtrl_nozzle_deputy->SetMaxTemp(obj->nozzle_max_temperature); @@ -2713,14 +2726,14 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj) if (m_temp_nozzle_timeout > 0) { m_temp_nozzle_timeout--; } else { - if (!nozzle_temp_input) { m_tempCtrl_nozzle->SetTagTemp((int) obj->m_extder_data.extders[0].target_temp); } + if (!nozzle_temp_input) { m_tempCtrl_nozzle->SetTagTemp((int) obj->m_extder_data.extders[MAIN_NOZZLE_ID].target_temp); } } if (m_temp_nozzle_deputy_timeout > 0) { m_temp_nozzle_deputy_timeout--; } else { - if (!nozzle_temp_input && nozzle_num >= 2) { m_tempCtrl_nozzle_deputy->SetTagTemp((int)obj->m_extder_data.extders[0].target_temp); } + if (!nozzle_temp_input && nozzle_num >= 2) { m_tempCtrl_nozzle_deputy->SetTagTemp((int)obj->m_extder_data.extders[DEPUTY_NOZZLE_ID].target_temp); } } if ((obj->m_extder_data.extders[0].target_temp - obj->m_extder_data.extders[0].temp) >= TEMP_THRESHOLD_VAL) { @@ -2767,11 +2780,7 @@ void StatusPanel::update_misc_ctrl(MachineObject *obj) m_extruder_book->SetSelection(m_nozzle_num); /*style*/ - if (m_nozzle_num == 2) { - m_left_right_btn_panel->Show(); - } else { - m_left_right_btn_panel->Hide(); - } + m_nozzle_btn_panel->Show(); m_extruderImage[select_index]->setExtruderCount(m_nozzle_num); m_extruderImage[select_index]->update(ExtruderState::FILLED_LOAD, ExtruderState::FILLED_UNLOAD); @@ -2779,16 +2788,17 @@ void StatusPanel::update_misc_ctrl(MachineObject *obj) /*current*/ if (obj->m_extder_data.current_extder_id == 0xf) { m_extruderImage[select_index]->setExtruderUsed(""); - m_left_right_btn_panel->updateState(""); + m_nozzle_btn_panel->updateState(""); } else if (obj->m_extder_data.current_extder_id == MAIN_NOZZLE_ID) { m_extruderImage[select_index]->setExtruderUsed("right"); - m_left_right_btn_panel->updateState("right"); + m_nozzle_btn_panel->updateState("right"); } else if (obj->m_extder_data.current_extder_id == DEPUTY_NOZZLE_ID) { m_extruderImage[select_index]->setExtruderUsed("left"); - m_left_right_btn_panel->updateState("left"); + m_nozzle_btn_panel->updateState("left"); } Layout(); } else { + m_nozzle_btn_panel->Hide(); m_extruder_book->SetSelection(m_nozzle_num); m_extruderImage[select_index]->setExtruderCount(m_nozzle_num); } @@ -3853,33 +3863,41 @@ void StatusPanel::on_set_bed_temp() } } -void StatusPanel::on_set_nozzle_temp() +void StatusPanel::on_set_nozzle_temp(int nozzle_id) { if (!obj) {return;} - wxString str = m_tempCtrl_nozzle->GetTextCtrl()->GetValue(); - wxString str_deputy; - int nozzle_num = obj->m_extder_data.total_extder_count; - if (nozzle_num >= 2) str_deputy = m_tempCtrl_nozzle_deputy->GetTextCtrl()->GetValue(); try { long nozzle_temp; - if (str.ToLong(&nozzle_temp) && obj) { - set_hold_count(m_temp_nozzle_timeout); - if (nozzle_temp > m_tempCtrl_nozzle->get_max_temp()) { - nozzle_temp = m_tempCtrl_nozzle->get_max_temp(); - m_tempCtrl_nozzle->SetTagTemp(wxString::Format("%d", nozzle_temp)); - m_tempCtrl_nozzle->Warning(false); + + if (nozzle_id == MAIN_NOZZLE_ID) { + wxString str = m_tempCtrl_nozzle->GetTextCtrl()->GetValue(); + if (str.ToLong(&nozzle_temp) && obj) { + set_hold_count(m_temp_nozzle_timeout); + if (nozzle_temp > m_tempCtrl_nozzle->get_max_temp()) { + nozzle_temp = m_tempCtrl_nozzle->get_max_temp(); + m_tempCtrl_nozzle->SetTagTemp(wxString::Format("%d", nozzle_temp)); + m_tempCtrl_nozzle->Warning(false); + } + if (m_tempCtrl_nozzle->GetCurrType() == TempInputType::TEMP_OF_NORMAL_TYPE) { + obj->command_set_nozzle(nozzle_temp); + } else { + obj->command_set_nozzle_new(MAIN_NOZZLE_ID, nozzle_temp); + } } - obj->command_set_nozzle(nozzle_temp); } - if (nozzle_num >= 2 && str_deputy.ToLong(&nozzle_temp) && obj) { - //set_hold_count(m_temp_nozzle_deputy_timeout); - if (nozzle_temp > m_tempCtrl_nozzle_deputy->get_max_temp()) { - nozzle_temp = m_tempCtrl_nozzle_deputy->get_max_temp(); - m_tempCtrl_nozzle_deputy->SetTagTemp(wxString::Format("%d", nozzle_temp)); - m_tempCtrl_nozzle_deputy->Warning(false); + + if (nozzle_id == DEPUTY_NOZZLE_ID) { + wxString str = m_tempCtrl_nozzle_deputy->GetTextCtrl()->GetValue(); + if (str.ToLong(&nozzle_temp) && obj) { + // set_hold_count(m_temp_nozzle_deputy_timeout); + if (nozzle_temp > m_tempCtrl_nozzle_deputy->get_max_temp()) { + nozzle_temp = m_tempCtrl_nozzle_deputy->get_max_temp(); + m_tempCtrl_nozzle_deputy->SetTagTemp(wxString::Format("%d", nozzle_temp)); + m_tempCtrl_nozzle_deputy->Warning(false); + } + obj->command_set_nozzle_new(DEPUTY_NOZZLE_ID, nozzle_temp); } - obj->command_set_nozzle(nozzle_temp); } } catch (...) { ; @@ -4699,6 +4717,14 @@ void StatusPanel::on_xyz_abs(wxCommandEvent &event) } +void StatusPanel::on_nozzle_selected(wxCommandEvent &event) +{ + if (obj) { + obj->m_extder_data.current_extder_id = event.GetInt(); + auto nozzle_id = event.GetInt();obj->command_select_extruder(nozzle_id); + } +} + void StatusPanel::on_show_print_options(wxCommandEvent& event) { if (obj) { diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index 2bbba9e5da..42e9e9743c 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -394,7 +394,7 @@ protected: wxWebView * m_custom_camera_view{nullptr}; wxSimplebook* m_extruder_book; std::vector m_extruderImage; - SwitchBoard * m_left_right_btn_panel; + SwitchBoard * m_nozzle_btn_panel; wxStaticText * m_text_tasklist_caption; @@ -405,11 +405,11 @@ protected: /* TempInput */ wxBoxSizer * m_misc_ctrl_sizer; - StaticBox* m_fan_panel; + StaticBox* m_fan_panel; StaticLine * m_line_nozzle; - TempInput* m_tempCtrl_nozzle; + TempInput* m_tempCtrl_nozzle; int m_temp_nozzle_timeout{ 0 }; - TempInput* m_tempCtrl_nozzle_deputy; + TempInput* m_tempCtrl_nozzle_deputy; int m_temp_nozzle_deputy_timeout{ 0 }; TempInput * m_tempCtrl_bed; int m_temp_bed_timeout {0}; @@ -487,6 +487,7 @@ protected: virtual void on_axis_ctrl_z_down_10(wxCommandEvent &event) { event.Skip(); } virtual void on_axis_ctrl_e_up_10(wxCommandEvent &event) { event.Skip(); } virtual void on_axis_ctrl_e_down_10(wxCommandEvent &event) { event.Skip(); } + virtual void on_nozzle_selected(wxCommandEvent &event) { event.Skip(); } void on_camera_source_change(wxCommandEvent& event); void handle_camera_source_change(); void remove_controls(); @@ -614,6 +615,8 @@ protected: void on_axis_ctrl_e_down_10(wxCommandEvent &event); void axis_ctrl_e_hint(bool up_down); + void on_nozzle_selected(wxCommandEvent &event); + void on_start_unload(wxCommandEvent &event); /* temp control */ void on_bed_temp_kill_focus(wxFocusEvent &event); @@ -621,7 +624,7 @@ protected: void on_set_bed_temp(); void on_nozzle_temp_kill_focus(wxFocusEvent &event); void on_nozzle_temp_set_focus(wxFocusEvent &event); - void on_set_nozzle_temp(); + void on_set_nozzle_temp(int nozzle_id); void on_set_chamber_temp(); /* extruder apis */ @@ -657,6 +660,7 @@ protected: void on_auto_leveling(wxCommandEvent &event); void on_xyz_abs(wxCommandEvent &event); + void on_show_parts_options(wxCommandEvent& event); /* print options */ void on_show_print_options(wxCommandEvent &event); diff --git a/src/slic3r/GUI/Widgets/SwitchButton.cpp b/src/slic3r/GUI/Widgets/SwitchButton.cpp index 90f040a85b..f76d01b1ea 100644 --- a/src/slic3r/GUI/Widgets/SwitchButton.cpp +++ b/src/slic3r/GUI/Widgets/SwitchButton.cpp @@ -9,6 +9,8 @@ #include #include +wxDEFINE_EVENT(wxCUSTOMEVT_SELECT_NOZZLE_POS, wxCommandEvent); + SwitchButton::SwitchButton(wxWindow* parent, wxWindowID id) : wxBitmapToggleButton(parent, id, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE | wxBU_EXACTFIT) , m_on(this, "toggle_on", 16) @@ -223,8 +225,12 @@ void SwitchBoard::render(wxDC &dc) void SwitchBoard::doRender(wxDC &dc) { + wxColour disable_color = wxColour(0xCECECE); + dc.SetPen(*wxTRANSPARENT_PEN); - dc.SetBrush(wxBrush(0xeeeeee)); + + if (is_enable) {dc.SetBrush(wxBrush(0xeeeeee)); + } else {dc.SetBrush(disable_color);} dc.DrawRoundedRectangle(0, 0, GetSize().x, GetSize().y, 8); /*left*/ @@ -245,7 +251,8 @@ void SwitchBoard::doRender(wxDC &dc) /*right*/ if (switch_right) { - dc.SetBrush(wxBrush(wxColour(0, 174, 66))); + if (is_enable) {dc.SetBrush(wxBrush(wxColour(0, 174, 66))); + } else {dc.SetBrush(disable_color);} dc.DrawRoundedRectangle(GetSize().x / 2, 0, GetSize().x / 2, GetSize().y, 8); } @@ -262,15 +269,25 @@ void SwitchBoard::doRender(wxDC &dc) void SwitchBoard::on_left_down(wxMouseEvent &evt) { + if (!is_enable) { + return; + } + int index = -1; auto pos = ClientToScreen(evt.GetPosition()); auto rect = ClientToScreen(wxPoint(0, 0)); if (pos.x > 0 && pos.x < rect.x + GetSize().x / 2) { switch_left = true; switch_right = false; + index = 1; } else { switch_left = false; switch_right = true; + index = 0; } Refresh(); + + wxCommandEvent event(wxCUSTOMEVT_SELECT_NOZZLE_POS); + event.SetInt(index); + wxPostEvent(this, event); } \ No newline at end of file diff --git a/src/slic3r/GUI/Widgets/SwitchButton.hpp b/src/slic3r/GUI/Widgets/SwitchButton.hpp index cfc1991186..c45d9101ee 100644 --- a/src/slic3r/GUI/Widgets/SwitchButton.hpp +++ b/src/slic3r/GUI/Widgets/SwitchButton.hpp @@ -8,6 +8,8 @@ #include "Label.hpp" #include "Button.hpp" +wxDECLARE_EVENT(wxCUSTOMEVT_SELECT_NOZZLE_POS, wxCommandEvent); + class SwitchButton : public wxBitmapToggleButton { public: @@ -53,12 +55,16 @@ public: bool switch_left{false}; bool switch_right{false}; + bool is_enable {true}; public: void paintEvent(wxPaintEvent &evt); void render(wxDC &dc); void doRender(wxDC &dc); void on_left_down(wxMouseEvent &evt); + void Enable(){is_enable = true;Refresh();}; + void Disable(){is_enable = false;Refresh();}; + bool IsEnabled(){return is_enable;}; }; #endif // !slic3r_GUI_SwitchButton_hpp_ diff --git a/src/slic3r/GUI/Widgets/TempInput.cpp b/src/slic3r/GUI/Widgets/TempInput.cpp index e1fcf813a0..9a5e4e6e71 100644 --- a/src/slic3r/GUI/Widgets/TempInput.cpp +++ b/src/slic3r/GUI/Widgets/TempInput.cpp @@ -58,7 +58,7 @@ void TempInput::Create(wxWindow *parent, wxString text, wxString label, wxString if (m_read_only) return; // enter input mode auto temp = text_ctrl->GetValue(); - if (temp.length() > 0 && temp[0] == (0x5f)) { + if (temp.length() > 0 && temp[0] == (0x5f)) { text_ctrl->SetValue(wxEmptyString); } if (wdialog != nullptr) { wdialog->Dismiss(); } @@ -111,7 +111,7 @@ void TempInput::Create(wxWindow *parent, wxString text, wxString label, wxString }); text_ctrl->Bind(wxEVT_RIGHT_DOWN, [this](auto &e) {}); // disable context menu text_ctrl->Bind(wxEVT_LEFT_DOWN, [this](auto &e) { - if (m_read_only) { + if (m_read_only) { return; } else { e.Skip(); @@ -145,6 +145,7 @@ void TempInput::SetFinish() { wxCommandEvent event(wxCUSTOMEVT_SET_TEMP_FINISH); event.SetInt(temp_type); + event.SetString(wxString::Format("%d", m_input_type)); wxPostEvent(this->GetParent(), event); } @@ -165,26 +166,38 @@ wxString TempInput::erasePending(wxString &str) void TempInput::SetTagTemp(int temp) { - text_ctrl->SetValue(wxString::Format("%d", temp)); - messureSize(); - Refresh(); + auto tp = wxString::Format("%d", temp); + if (text_ctrl->GetValue() != tp) { + text_ctrl->SetValue(tp); + messureSize(); + Refresh(); + } } -void TempInput::SetTagTemp(wxString temp) -{ - text_ctrl->SetValue(temp); - messureSize(); - Refresh(); -} - -void TempInput::SetCurrTemp(int temp) -{ - SetLabel(wxString::Format("%d", temp)); -} - -void TempInput::SetCurrTemp(wxString temp) +void TempInput::SetTagTemp(wxString temp) { - SetLabel(temp); + if (text_ctrl->GetValue() != temp) { + text_ctrl->SetValue(temp); + messureSize(); + Refresh(); + } +} + +void TempInput::SetCurrTemp(int temp) +{ + auto tp = wxString::Format("%d", temp); + if (GetLabel() != tp) { + SetLabel(tp); + Refresh(); + } +} + +void TempInput::SetCurrTemp(wxString temp) +{ + if (GetLabel() != temp) { + SetLabel(temp); + Refresh(); + } } void TempInput::SetCurrType(TempInputType type) { @@ -212,10 +225,10 @@ void TempInput::Warning(bool warn, WarningType type) wxBoxSizer *sizer_text; sizer_text = new wxBoxSizer(wxHORIZONTAL); - - warning_text = new wxStaticText(body, wxID_ANY, - wxEmptyString, + + warning_text = new wxStaticText(body, wxID_ANY, + wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL); warning_text->SetFont(::Label::Body_12); @@ -445,19 +458,19 @@ void TempInput::render(wxDC &dc) auto text = wxWindow::GetLabel(); dc.SetFont(::Label::Head_14); labelSize = dc.GetMultiLineTextExtent(wxWindow::GetLabel()); - + if (!IsEnabled()) { dc.SetTextForeground(wxColour(0xAC, 0xAC, 0xAC)); dc.SetTextBackground(background_color.colorForStates((int) StateColor::Disabled)); - } + } else { dc.SetTextForeground(wxColour(0x32, 0x3A, 0x3D)); dc.SetTextBackground(background_color.colorForStates((int) states)); } - + /*if (!text.IsEmpty()) { - + }*/ wxSize textSize = text_ctrl->GetSize(); if (align_right) { diff --git a/src/slic3r/GUI/Widgets/TempInput.hpp b/src/slic3r/GUI/Widgets/TempInput.hpp index b0b23d5f10..98f6ab48bb 100644 --- a/src/slic3r/GUI/Widgets/TempInput.hpp +++ b/src/slic3r/GUI/Widgets/TempInput.hpp @@ -71,12 +71,12 @@ public: const wxSize & size = wxDefaultSize, long style = 0); - + wxPopupTransientWindow *wdialog{nullptr}; int temp_type; bool actice = false; - + wxString erasePending(wxString &str); void SetTagTemp(int temp); @@ -85,7 +85,8 @@ public: void SetCurrTemp(int temp); void SetCurrTemp(wxString temp); void SetCurrType(TempInputType type); - + TempInputType GetCurrType(){return m_input_type;}; + bool AllisNum(std::string str); void SetFinish(); void Warning(bool warn, WarningType type = WARNING_UNKNOWN);