diff --git a/resources/config.json b/resources/config.json index 1e9a2acd4d..1d549c9055 100644 --- a/resources/config.json +++ b/resources/config.json @@ -40,9 +40,7 @@ "FUNC_VIRTUAL_CAMERA": false, "FUNC_PRINT_WITHOUT_SD": false, "FUNC_ALTER_RESOLUTION": false, - "FUNC_PRINT_ALL": false, - "FUNC_VIRTUAL_TYAY": true, - "FUNC_EXTRUSION_CALI": true + "FUNC_PRINT_ALL": false }, "camera_resolution": [ "720p" ], "bed_temperature_limit": 100, @@ -53,7 +51,6 @@ "printer_thumbnail_image": "printer_thumbnail_p1p" }, { - "display_name": "Bambu Lab X1", "func": { "FUNC_VIRTUAL_TYAY": true, diff --git a/resources/images/ams_extra_framework_mid.svg b/resources/images/ams_extra_framework_mid.svg new file mode 100644 index 0000000000..480ae748b2 --- /dev/null +++ b/resources/images/ams_extra_framework_mid.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/enable_ams_disable.svg b/resources/images/enable_ams_disable.svg new file mode 100644 index 0000000000..69060f2a12 --- /dev/null +++ b/resources/images/enable_ams_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/extra_ams_tray_left.svg b/resources/images/extra_ams_tray_left.svg new file mode 100644 index 0000000000..f2aae5c5ef --- /dev/null +++ b/resources/images/extra_ams_tray_left.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/extra_ams_tray_left_hover.svg b/resources/images/extra_ams_tray_left_hover.svg new file mode 100644 index 0000000000..aff51a25df --- /dev/null +++ b/resources/images/extra_ams_tray_left_hover.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/extra_ams_tray_left_selected.svg b/resources/images/extra_ams_tray_left_selected.svg new file mode 100644 index 0000000000..b63329c06c --- /dev/null +++ b/resources/images/extra_ams_tray_left_selected.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/extra_ams_tray_right.svg b/resources/images/extra_ams_tray_right.svg new file mode 100644 index 0000000000..993222a8de --- /dev/null +++ b/resources/images/extra_ams_tray_right.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/extra_ams_tray_right_hover.svg b/resources/images/extra_ams_tray_right_hover.svg new file mode 100644 index 0000000000..01a634981a --- /dev/null +++ b/resources/images/extra_ams_tray_right_hover.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/extra_ams_tray_right_selected.svg b/resources/images/extra_ams_tray_right_selected.svg new file mode 100644 index 0000000000..3fbb312a79 --- /dev/null +++ b/resources/images/extra_ams_tray_right_selected.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/slic3r/GUI/AMSMaterialsSetting.cpp b/src/slic3r/GUI/AMSMaterialsSetting.cpp index 5916b5edf2..195ffd4c68 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.cpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.cpp @@ -747,16 +747,6 @@ bool AMSMaterialsSetting::Show(bool show) m_input_nozzle_min->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(20))); //m_clr_picker->set_color(m_clr_picker->GetParent()->GetBackgroundColour()); - /*if (obj && (obj->is_function_supported(PrinterFunction::FUNC_EXTRUSION_CALI) || obj->is_high_printer_type())) { - m_ratio_text->Show(); - m_k_param->Show(); - m_input_k_val->Show(); - } - else { - m_ratio_text->Hide(); - m_k_param->Hide(); - m_input_k_val->Hide(); - }*/ m_ratio_text->Show(); m_k_param->Show(); m_input_k_val->Show(); diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 980d9d0838..4a5b2e87a1 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -725,6 +725,27 @@ bool MachineObject::is_support_ams_mapping() } } +bool MachineObject::is_support_command_ams_switch() +{ + auto ota_ver_it = module_vers.find("ota"); + if (ota_ver_it != module_vers.end()) { + if (printer_type == "BL-P001" || printer_type == "BL-P002") { + + if (ota_ver_it->second.sw_ver.compare("01.05.06.01") < 0) { + return false; + } + + }else if (printer_type == "C11" || printer_type == "C12") { + + if (ota_ver_it->second.sw_ver.compare("01.02.99.10") < 0) { + return false; + } + } + } + + return true; +} + bool MachineObject::is_support_ams_mapping_version(std::string module, std::string version) { bool result = true; @@ -1709,21 +1730,33 @@ int MachineObject::command_set_nozzle(int temp) int MachineObject::command_ams_switch(int tray_index, int old_temp, int new_temp) { BOOST_LOG_TRIVIAL(trace) << "ams_switch to " << tray_index << " with temp: " << old_temp << ", " << new_temp; + if (old_temp < 0) old_temp = FILAMENT_DEF_TEMP; if (new_temp < 0) new_temp = FILAMENT_DEF_TEMP; - int tray_id_int = tray_index; + int result = 0; - std::string gcode = ""; - if (tray_index == 255) { - gcode = DeviceManager::load_gcode(printer_type, "ams_unload.gcode"); - } else { - // include VIRTUAL_TRAY_ID - gcode = DeviceManager::load_gcode(printer_type, "ams_load.gcode"); - boost::replace_all(gcode, "[next_extruder]", std::to_string(tray_index)); - boost::replace_all(gcode, "[new_filament_temp]", std::to_string(new_temp)); + + //command + if (is_support_command_ams_switch()) { + command_ams_change_filament(tray_index, old_temp, new_temp); + } + //gcode + else { + std::string gcode = ""; + if (tray_index == 255) { + gcode = DeviceManager::load_gcode(printer_type, "ams_unload.gcode"); + } + else { + // include VIRTUAL_TRAY_ID + gcode = DeviceManager::load_gcode(printer_type, "ams_load.gcode"); + boost::replace_all(gcode, "[next_extruder]", std::to_string(tray_index)); + boost::replace_all(gcode, "[new_filament_temp]", std::to_string(new_temp)); + } + + result = this->publish_gcode(gcode); } - return this->publish_gcode(gcode); + return result; } int MachineObject::command_ams_change_filament(int tray_id, int old_temp, int new_temp) diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 81f5dad81b..a4b3b72efb 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -529,6 +529,7 @@ public: bool can_unload_filament(); bool is_U0_firmware(); bool is_support_ams_mapping(); + bool is_support_command_ams_switch(); static bool is_support_ams_mapping_version(std::string module, std::string version); int ams_filament_mapping(std::vector filaments, std::vector &result, std::vector exclude_id = std::vector()); diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index a4ca7e9163..075cf71591 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -31,6 +31,7 @@ static const wxFont SWITCH_FONT = Label::Body_10; /* const values */ static const int bed_temp_range[2] = {20, 120}; static const int nozzle_temp_range[2] = {20, 300}; +static const int nozzle_chamber_range[2] = {20, 60}; /* colors */ static const wxColour STATUS_PANEL_BG = wxColour(238, 238, 238); @@ -144,7 +145,6 @@ PrintingTaskPanel::~PrintingTaskPanel() { } - void PrintingTaskPanel::create_panel(wxWindow* parent) { wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); @@ -833,6 +833,17 @@ wxBoxSizer *StatusBasePanel::create_monitoring_page() m_bmToggleBtn_timelapse->Hide(); bSizer_monitoring_title->Add(m_bmToggleBtn_timelapse, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5)); +#if !BBL_RELEASE_TO_PUBLIC + m_staticText_timelapse->Show(); + m_bmToggleBtn_timelapse->Show(); + m_bmToggleBtn_timelapse->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent &e) { + if (e.IsChecked()) + wxGetApp().getAgent()->start_subscribe("tunnel"); + else + wxGetApp().getAgent()->stop_subscribe("tunnel"); + }); +#endif + //m_bitmap_camera_img = new wxStaticBitmap(m_panel_monitoring_title, wxID_ANY, m_bitmap_camera , wxDefaultPosition, wxSize(FromDIP(32), FromDIP(18)), 0); //m_bitmap_camera_img->SetMinSize(wxSize(FromDIP(32), FromDIP(18))); //bSizer_monitoring_title->Add(m_bitmap_camera_img, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5)); @@ -1034,15 +1045,17 @@ wxBoxSizer *StatusBasePanel::create_temp_control(wxWindow *parent) sizer->Add(line, 0, wxEXPAND | wxLEFT | wxRIGHT, 12); wxWindowID frame_id = wxWindow::NewControlId(); - m_tempCtrl_frame = new TempInput(parent, frame_id, TEMP_BLANK_STR, TEMP_BLANK_STR, wxString("monitor_frame_temp"), wxString("monitor_frame_temp"), wxDefaultPosition, + m_tempCtrl_chamber = new TempInput(parent, frame_id, TEMP_BLANK_STR, TEMP_BLANK_STR, wxString("monitor_frame_temp"), wxString("monitor_frame_temp"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER); - m_tempCtrl_frame->SetReadOnly(true); - m_tempCtrl_frame->SetMinSize(TEMP_CTRL_MIN_SIZE); - m_tempCtrl_frame->SetBorderWidth(FromDIP(2)); - m_tempCtrl_frame->SetTextColor(tempinput_text_colour); - m_tempCtrl_frame->SetBorderColor(tempinput_border_colour); + m_tempCtrl_chamber->SetReadOnly(true); + m_tempCtrl_chamber->SetMinTemp(nozzle_chamber_range[0]); + m_tempCtrl_chamber->SetMaxTemp(nozzle_chamber_range[1]); + m_tempCtrl_chamber->SetMinSize(TEMP_CTRL_MIN_SIZE); + m_tempCtrl_chamber->SetBorderWidth(FromDIP(2)); + m_tempCtrl_chamber->SetTextColor(tempinput_text_colour); + m_tempCtrl_chamber->SetBorderColor(tempinput_border_colour); - sizer->Add(m_tempCtrl_frame, 0, wxEXPAND | wxALL, 1); + sizer->Add(m_tempCtrl_chamber, 0, wxEXPAND | wxALL, 1); line = new StaticLine(parent); line->SetLineColour(STATIC_BOX_LINE_COL); sizer->Add(line, 0, wxEXPAND | wxLEFT | wxRIGHT, 12); @@ -1181,12 +1194,12 @@ void StatusBasePanel::reset_temp_misc_control() m_tempCtrl_nozzle->GetTextCtrl()->SetValue(TEMP_BLANK_STR); m_tempCtrl_bed->SetLabel(TEMP_BLANK_STR); m_tempCtrl_bed->GetTextCtrl()->SetValue(TEMP_BLANK_STR); - m_tempCtrl_frame->SetLabel(TEMP_BLANK_STR); - m_tempCtrl_frame->GetTextCtrl()->SetValue(TEMP_BLANK_STR); + m_tempCtrl_chamber->SetLabel(TEMP_BLANK_STR); + m_tempCtrl_chamber->GetTextCtrl()->SetValue(TEMP_BLANK_STR); m_button_unload->Show(); m_tempCtrl_nozzle->Enable(true); - m_tempCtrl_frame->Enable(true); + m_tempCtrl_chamber->Enable(true); m_tempCtrl_bed->Enable(true); // reset misc control @@ -1401,11 +1414,11 @@ wxBoxSizer *StatusBasePanel::create_ams_group(wxWindow *parent) return sizer; } -void StatusBasePanel::show_ams_group(bool show, bool support_virtual_tray, bool support_extrustion_cali) +void StatusBasePanel::show_ams_group(bool show) { m_ams_control->Show(true); m_ams_control_box->Show(true); - m_ams_control->show_noams_mode(show, support_virtual_tray, support_extrustion_cali); + m_ams_control->show_noams_mode(); if (m_show_ams_group != show) { Fit(); } @@ -1530,6 +1543,8 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co on_set_bed_temp(); } else if (id == m_tempCtrl_nozzle->GetType()) { on_set_nozzle_temp(); + } else if (id == m_tempCtrl_chamber->GetType()) { + on_set_chamber_temp(); } }); @@ -1547,10 +1562,12 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co m_tempCtrl_bed->Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_set_focus), NULL, this); m_tempCtrl_nozzle->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_kill_focus), NULL, this); m_tempCtrl_nozzle->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); m_switch_lamp->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_lamp_switch), NULL, this); m_switch_nozzle_fan->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_nozzle_fan_switch), NULL, this); // TODO m_switch_printing_fan->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_nozzle_fan_switch), NULL, this); - m_switch_cham_fan->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_nozzle_fan_switch), NULL, this); + m_switch_cham_fan->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_nozzle_fan_switch), NULL, this); m_bpButton_xy->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_axis_ctrl_xy), NULL, this); // TODO m_bpButton_z_10->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_axis_ctrl_z_up_10), NULL, this); m_bpButton_z_1->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_axis_ctrl_z_up_1), NULL, this); @@ -1787,6 +1804,14 @@ void StatusPanel::update(MachineObject *obj) update_subtask(obj); m_project_task_panel->Thaw(); +#if !BBL_RELEASE_TO_PUBLIC + m_staticText_timelapse + ->SetLabel(obj->is_lan_mode_printer() ? "Local Mqtt" : obj->is_tunnel_mqtt ? "Tunnel Mqtt" : "Cloud Mqtt"); + m_bmToggleBtn_timelapse + ->Enable(!obj->is_lan_mode_printer()); + m_bmToggleBtn_timelapse + ->SetValue(obj->is_tunnel_mqtt); +#endif m_machine_ctrl_panel->Freeze(); @@ -1803,11 +1828,9 @@ void StatusPanel::update(MachineObject *obj) if (obj) { // update extrusion calibration - if (obj->is_function_supported(PrinterFunction::FUNC_EXTRUSION_CALI)) { - if (m_extrusion_cali_dlg) { - m_extrusion_cali_dlg->update_machine_obj(obj); - m_extrusion_cali_dlg->update(); - } + if (m_extrusion_cali_dlg) { + m_extrusion_cali_dlg->update_machine_obj(obj); + m_extrusion_cali_dlg->update(); } // update calibration status @@ -1836,12 +1859,15 @@ void StatusPanel::update(MachineObject *obj) m_options_btn->Hide(); } + //support edit chamber temp if (obj->is_function_supported(PrinterFunction::FUNC_CHAMBER_TEMP)) { - m_tempCtrl_frame->Enable(); + m_tempCtrl_chamber->SetReadOnly(false); + m_tempCtrl_chamber->Enable(); } else { - m_tempCtrl_frame->SetLabel(TEMP_BLANK_STR); - m_tempCtrl_frame->GetTextCtrl()->SetValue(TEMP_BLANK_STR); - m_tempCtrl_frame->Disable(); + m_tempCtrl_chamber->SetReadOnly(true); + m_tempCtrl_chamber->SetLabel(TEMP_BLANK_STR); + m_tempCtrl_chamber->GetTextCtrl()->SetValue(TEMP_BLANK_STR); + m_tempCtrl_chamber->Disable(); } if (!obj->dev_connection_type.empty()) { @@ -1921,13 +1947,11 @@ void StatusPanel::show_error_message(MachineObject* obj, wxString msg, std::stri m_print_error_dlg->update_title_style(_L("Warning"), SecondaryCheckDialog::ButtonStyle::ONLY_CONFIRM, this); } m_print_error_dlg->update_text(msg); - m_print_error_dlg->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this, obj](wxCommandEvent& e) { if (obj) { obj->command_clean_print_error(obj->subtask_id_, obj->print_error); } }); - m_print_error_dlg->Bind(EVT_SECONDARY_CHECK_RETRY, [this, obj](wxCommandEvent& e) { if (m_ams_control) { @@ -2023,7 +2047,7 @@ void StatusPanel::show_printing_status(bool ctrl_area, bool temp_area) if (!temp_area) { m_tempCtrl_nozzle->Enable(false); m_tempCtrl_bed->Enable(false); - m_tempCtrl_frame->Enable(false); + m_tempCtrl_chamber->Enable(false); m_switch_speed->Enable(false); m_switch_speed->SetValue(false); m_switch_lamp->Enable(false); @@ -2033,7 +2057,7 @@ void StatusPanel::show_printing_status(bool ctrl_area, bool temp_area) } else { m_tempCtrl_nozzle->Enable(); m_tempCtrl_bed->Enable(); - m_tempCtrl_frame->Enable(); + m_tempCtrl_chamber->Enable(); m_switch_speed->Enable(); m_switch_speed->SetValue(true); m_switch_lamp->Enable(); @@ -2064,6 +2088,13 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj) } m_tempCtrl_nozzle->SetCurrTemp((int) obj->nozzle_temp); + int nozzle_max_temp = 0; + if (DeviceManager::get_nozzle_max_temperature(obj->printer_type, nozzle_max_temp)) { + if (m_tempCtrl_nozzle) m_tempCtrl_nozzle->SetMaxTemp(nozzle_max_temp); + } + else { + if (m_tempCtrl_nozzle) m_tempCtrl_nozzle->SetMaxTemp(nozzle_temp_range[1]); + } if (m_temp_nozzle_timeout > 0) { m_temp_nozzle_timeout--; @@ -2077,8 +2108,21 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj) m_tempCtrl_nozzle->SetIconNormal(); } - m_tempCtrl_frame->SetCurrTemp(obj->chamber_temp); - m_tempCtrl_frame->SetTagTemp(obj->chamber_temp); + m_tempCtrl_chamber->SetCurrTemp(obj->chamber_temp); + // update temprature if not input temp target + if (m_temp_chamber_timeout > 0) { + m_temp_chamber_timeout--; + } + else { + if (!cham_temp_input) { m_tempCtrl_chamber->SetTagTemp(obj->chamber_temp_target); } + } + + if ((obj->chamber_temp_target - obj->chamber_temp) >= TEMP_THRESHOLD_VAL) { + m_tempCtrl_chamber->SetIconActive(); + } + else { + m_tempCtrl_chamber->SetIconNormal(); + } } void StatusPanel::update_misc_ctrl(MachineObject *obj) @@ -2097,6 +2141,12 @@ void StatusPanel::update_misc_ctrl(MachineObject *obj) } } + if (obj->is_core_xy()) { + m_staticText_z_tip->SetLabel(_L("Bed")); + } else { + m_staticText_z_tip->SetLabel("Z"); + } + // update extruder icon update_extruder_status(obj); @@ -2219,9 +2269,9 @@ void StatusPanel::update_ams(MachineObject *obj) CalibUtils::emit_get_PA_calib_info(obj->nozzle_diameter, ""); } - bool is_support_extrusion_cali = obj->is_function_supported(PrinterFunction::FUNC_EXTRUSION_CALI); - bool is_support_virtual_tray = obj->is_function_supported(PrinterFunction::FUNC_VIRTUAL_TYAY); + bool is_support_virtual_tray = obj->is_function_supported(PrinterFunction::FUNC_VIRTUAL_TYAY); bool is_support_filament_backup = obj->is_function_supported(PrinterFunction::FUNC_FILAMENT_BACKUP); + AMSModel ams_mode = AMSModel::GENERIC_AMS; if (!obj || !obj->is_connected() @@ -2237,11 +2287,18 @@ void StatusPanel::update_ams(MachineObject *obj) BOOST_LOG_TRIVIAL(trace) << "machine object" << obj->dev_name << " was disconnected, set show_ams_group is false"; } - show_ams_group(false, obj->is_function_supported(PrinterFunction::FUNC_VIRTUAL_TYAY), is_support_extrusion_cali); + + if (obj->printer_type == "N1" || obj->printer_type == "N2") { ams_mode = AMSModel::EXTRA_AMS; } + m_ams_control->SetAmsModel(AMSModel::NO_AMS, ams_mode); + + show_ams_group(false); m_ams_control->show_auto_refill(false); } else { - show_ams_group(true, obj->is_function_supported(PrinterFunction::FUNC_VIRTUAL_TYAY), is_support_extrusion_cali); + if (obj->printer_type == "N1" || obj->printer_type == "N2") { ams_mode = AMSModel::EXTRA_AMS; } + m_ams_control->SetAmsModel(ams_mode, ams_mode); + + show_ams_group(true); if (!obj->m_is_support_show_bak || !is_support_filament_backup || !obj->ams_support_auto_switch_filament_flag) { m_ams_control->show_auto_refill(false); @@ -2275,7 +2332,7 @@ void StatusPanel::update_ams(MachineObject *obj) //} // must select a current can - m_ams_control->UpdateAms(ams_info, false, is_support_extrusion_cali); + m_ams_control->UpdateAms(ams_info, false); last_tray_exist_bits = obj->tray_exist_bits; last_ams_exist_bits = obj->ams_exist_bits; @@ -2309,13 +2366,15 @@ void StatusPanel::update_ams(MachineObject *obj) // set segment 3 if (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_ID)) { - m_ams_control->SetExtruder(obj->is_filament_at_extruder(), true, obj->vt_tray.get_color()); + m_ams_control->SetExtruder(obj->is_filament_at_extruder(), true, obj->m_ams_id, obj->vt_tray.get_color()); } else { - m_ams_control->SetExtruder(obj->is_filament_at_extruder(), false, m_ams_control->GetCanColour(obj->m_ams_id, obj->m_tray_id)); + m_ams_control->SetExtruder(obj->is_filament_at_extruder(), false, obj->m_ams_id, m_ams_control->GetCanColour(obj->m_ams_id, obj->m_tray_id)); } if (obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE) { + update_filament_step(); + if (obj->m_tray_tar == std::to_string(VIRTUAL_TRAY_ID) && (obj->m_tray_now != std::to_string(VIRTUAL_TRAY_ID) || obj->m_tray_now != "255")) { // wait to heat hotend if (obj->ams_status_sub == 0x02) { @@ -2386,6 +2445,14 @@ void StatusPanel::update_ams(MachineObject *obj) else { m_ams_control->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD); } + } + else if (obj->ams_status_sub == 0x08) { + if (!obj->is_ams_unload()) { + m_ams_control->SetFilamentStep(FilamentStep::STEP_CHECK_POSITION, FilamentStepType::STEP_TYPE_LOAD); + } + else { + m_ams_control->SetFilamentStep(FilamentStep::STEP_CHECK_POSITION, FilamentStepType::STEP_TYPE_UNLOAD); + } } else { m_ams_control->SetFilamentStep(FilamentStep::STEP_IDLE, FilamentStepType::STEP_TYPE_UNLOAD); } @@ -2443,10 +2510,10 @@ void StatusPanel::update_ams(MachineObject *obj) is_curr_tray_selected = true; } - update_ams_control_state(is_support_extrusion_cali, is_curr_tray_selected); + update_ams_control_state(is_curr_tray_selected); } -void StatusPanel::update_ams_control_state(bool is_support_virtual_tray, bool is_curr_tray_selected) +void StatusPanel::update_ams_control_state(bool is_curr_tray_selected) { // set default value to true bool enable[ACTION_BTN_COUNT]; @@ -2454,21 +2521,18 @@ void StatusPanel::update_ams_control_state(bool is_support_virtual_tray, bool is enable[ACTION_BTN_LOAD] = true; enable[ACTION_BTN_UNLOAD] = true; - if (!is_support_virtual_tray) { - enable[ACTION_BTN_CALI] = false; - } - else { - if (obj->is_in_printing()) { - if (obj->is_in_extrusion_cali()) { - enable[ACTION_BTN_LOAD] = false; - enable[ACTION_BTN_UNLOAD] = false; - enable[ACTION_BTN_CALI] = true; - } else { - enable[ACTION_BTN_CALI] = false; - } - } else { + if (obj->is_in_printing()) { + if (obj->is_in_extrusion_cali()) { + enable[ACTION_BTN_LOAD] = false; + enable[ACTION_BTN_UNLOAD] = false; enable[ACTION_BTN_CALI] = true; } + else { + enable[ACTION_BTN_CALI] = false; + } + } + else { + enable[ACTION_BTN_CALI] = true; } if (obj->is_in_printing() && !obj->can_resume()) { @@ -2943,53 +3007,64 @@ void StatusPanel::on_set_nozzle_temp() } } +void StatusPanel::on_set_chamber_temp() +{ + wxString str = m_tempCtrl_chamber->GetTextCtrl()->GetValue(); + try { + long chamber_temp; + if (str.ToLong(&chamber_temp) && obj) { + set_hold_count(m_temp_chamber_timeout); + obj->command_set_chamber(chamber_temp); + } + } + catch (...) { + ; + } +} + void StatusPanel::on_ams_load(SimpleEvent &event) { BOOST_LOG_TRIVIAL(info) << "on_ams_load"; on_ams_load_curr(); } +void StatusPanel::update_filament_step() +{ + m_ams_control->UpdateStepCtrl(obj->is_filament_at_extruder()); + if (!obj->is_filament_at_extruder()) { + m_is_load_with_temp = true; + } + else { + m_is_load_with_temp = false; + } +} + void StatusPanel::on_ams_load_curr() { if (obj) { std::string curr_ams_id = m_ams_control->GetCurentAms(); std::string curr_can_id = m_ams_control->GetCurrentCan(curr_ams_id); - m_ams_control->UpdateStepCtrl(obj->is_filament_at_extruder()); - if(!obj->is_filament_at_extruder()){ - m_is_load_with_temp = true; - }else{ - m_is_load_with_temp = false; - } - + update_filament_step(); //virtual tray if (curr_ams_id.compare(std::to_string(VIRTUAL_TRAY_ID)) == 0) { - /*if (con_load_dlg == nullptr) { - con_load_dlg = new SecondaryCheckDialog(this->GetParent(), wxID_ANY, _L("Confirm")); - con_load_dlg->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this](wxCommandEvent& e) {*/ - int old_temp = -1; - int new_temp = -1; - AmsTray* curr_tray = &obj->vt_tray; + int old_temp = -1; + int new_temp = -1; + AmsTray* curr_tray = &obj->vt_tray; - if (!curr_tray) return; + if (!curr_tray) return; - try { - if (!curr_tray->nozzle_temp_max.empty() && !curr_tray->nozzle_temp_min.empty()) - old_temp = (atoi(curr_tray->nozzle_temp_min.c_str()) + atoi(curr_tray->nozzle_temp_max.c_str())) / 2; - if (!obj->vt_tray.nozzle_temp_max.empty() && !obj->vt_tray.nozzle_temp_min.empty()) - new_temp = (atoi(obj->vt_tray.nozzle_temp_min.c_str()) + atoi(obj->vt_tray.nozzle_temp_max.c_str())) / 2; - } - catch (...) { - ; - } - obj->command_ams_switch(VIRTUAL_TRAY_ID, old_temp, new_temp); - /*} - ); + try { + if (!curr_tray->nozzle_temp_max.empty() && !curr_tray->nozzle_temp_min.empty()) + old_temp = (atoi(curr_tray->nozzle_temp_min.c_str()) + atoi(curr_tray->nozzle_temp_max.c_str())) / 2; + if (!obj->vt_tray.nozzle_temp_max.empty() && !obj->vt_tray.nozzle_temp_min.empty()) + new_temp = (atoi(obj->vt_tray.nozzle_temp_min.c_str()) + atoi(obj->vt_tray.nozzle_temp_max.c_str())) / 2; } - con_load_dlg->update_text(_L("Please confirm the filament is ready?")); - con_load_dlg->on_show();*/ - return; + catch (...) { + ; + } + obj->command_ams_switch(VIRTUAL_TRAY_ID, old_temp, new_temp); } std::map::iterator it = obj->amsList.find(curr_ams_id); @@ -3303,7 +3378,6 @@ void StatusPanel::on_ams_selected(wxCommandEvent &event) } catch (...) { ; } - //update_ams_control_state(curr_ams_id, obj->is_function_supported(PrinterFunction::FUNC_EXTRUSION_CALI)); } } } @@ -3355,6 +3429,18 @@ void StatusPanel::on_fan_changed(wxCommandEvent& event) } } +void StatusPanel::on_cham_temp_kill_focus(wxFocusEvent& event) +{ + event.Skip(); + cham_temp_input = false; +} + +void StatusPanel::on_cham_temp_set_focus(wxFocusEvent& event) +{ + event.Skip(); + cham_temp_input = true; +} + void StatusPanel::on_bed_temp_kill_focus(wxFocusEvent &event) { event.Skip(); @@ -3635,6 +3721,7 @@ void StatusPanel::set_default() m_switch_lamp_timeout = 0; m_temp_nozzle_timeout = 0; m_temp_bed_timeout = 0; + m_temp_chamber_timeout = 0; m_switch_nozzle_fan_timeout = 0; m_switch_printing_fan_timeout = 0; m_switch_cham_fan_timeout = 0; @@ -3645,7 +3732,7 @@ void StatusPanel::set_default() m_bitmap_recording_img->Hide(); m_bitmap_vcamera_img->Hide(); m_setting_button->Show(); - m_tempCtrl_frame->Show(); + m_tempCtrl_chamber->Show(); m_options_btn->Show(); reset_temp_misc_control(); @@ -3779,8 +3866,8 @@ void StatusPanel::msw_rescale() m_line_nozzle->SetSize(wxSize(-1, FromDIP(1))); m_tempCtrl_bed->SetMinSize(TEMP_CTRL_MIN_SIZE); m_tempCtrl_bed->Rescale(); - m_tempCtrl_frame->SetMinSize(TEMP_CTRL_MIN_SIZE); - m_tempCtrl_frame->Rescale(); + m_tempCtrl_chamber->SetMinSize(TEMP_CTRL_MIN_SIZE); + m_tempCtrl_chamber->Rescale(); m_bitmap_speed.msw_rescale(); m_bitmap_speed_active.msw_rescale(); diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index e0dcd39823..ad0fdf8f84 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -305,12 +305,13 @@ protected: /* TempInput */ wxBoxSizer * m_misc_ctrl_sizer; StaticBox* m_fan_panel; - TempInput * m_tempCtrl_nozzle; - int m_temp_nozzle_timeout {0}; StaticLine * m_line_nozzle; + TempInput* m_tempCtrl_nozzle; + int m_temp_nozzle_timeout{ 0 }; TempInput * m_tempCtrl_bed; int m_temp_bed_timeout {0}; - TempInput * m_tempCtrl_frame; + TempInput * m_tempCtrl_chamber; + int m_temp_chamber_timeout {0}; bool m_current_support_cham_fan{true}; FanSwitchButton *m_switch_nozzle_fan; int m_switch_nozzle_fan_timeout{0}; @@ -403,7 +404,7 @@ public: wxBoxSizer *create_ams_group(wxWindow *parent); wxBoxSizer *create_settings_group(wxWindow *parent); - void show_ams_group(bool show = true, bool support_virtual_tray = true, bool support_extrustion_cali = true); + void show_ams_group(bool show = true); }; @@ -446,6 +447,7 @@ protected: wxWebRequest web_request; bool bed_temp_input = false; bool nozzle_temp_input = false; + bool cham_temp_input = false; int speed_lvl = 1; // 0 - 3 int speed_lvl_timeout {0}; boost::posix_time::ptime speed_dismiss_time; @@ -489,9 +491,11 @@ protected: void on_nozzle_temp_kill_focus(wxFocusEvent &event); void on_nozzle_temp_set_focus(wxFocusEvent &event); void on_set_nozzle_temp(); + void on_set_chamber_temp(); /* extruder apis */ void on_ams_load(SimpleEvent &event); + void update_filament_step(); void on_ams_load_curr(); void on_ams_unload(SimpleEvent &event); void on_ams_filament_backup(SimpleEvent& event); @@ -506,6 +510,8 @@ protected: void on_print_error_func(wxCommandEvent& event); void on_fan_changed(wxCommandEvent& event); + void on_cham_temp_kill_focus(wxFocusEvent& event); + void on_cham_temp_set_focus(wxFocusEvent& event); void on_switch_speed(wxCommandEvent& event); void on_lamp_switch(wxCommandEvent &event); void on_printing_fan_switch(wxCommandEvent &event); @@ -539,7 +545,7 @@ protected: void update_misc_ctrl(MachineObject *obj); void update_ams(MachineObject* obj); void update_extruder_status(MachineObject* obj); - void update_ams_control_state(bool is_support_virtual_tray, bool is_curr_tray_selected); + void update_ams_control_state(bool is_curr_tray_selected); void update_cali(MachineObject* obj); void reset_printing_values(); diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index 620a25bb66..242f440838 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -10,11 +10,6 @@ namespace Slic3r { namespace GUI { -static const int LOAD_STEP_COUNT = 5; -static const int LOAD_WITH_TEMP_STEP_COUNT = 3; -static const int UNLOAD_STEP_COUNT = 3; -static const int VT_LOAD_STEP_COUNT = 4; - static const wxColour AMS_TRAY_DEFAULT_COL = wxColour(255, 255, 255); wxDEFINE_EVENT(EVT_AMS_EXTRUSION_CALI, wxCommandEvent); @@ -110,18 +105,18 @@ Description:AMSrefresh AMSrefresh::AMSrefresh() { SetFont(Label::Body_10);} -AMSrefresh::AMSrefresh(wxWindow *parent, wxWindowID id, wxString number, Caninfo info, const wxPoint &pos, const wxSize &size) : AMSrefresh() +AMSrefresh::AMSrefresh(wxWindow *parent, wxString number, Caninfo info, const wxPoint &pos, const wxSize &size) : AMSrefresh() { m_info = info; m_can_id = number.ToStdString(); - create(parent, id, pos, size); + create(parent, wxID_ANY, pos, size); } -AMSrefresh::AMSrefresh(wxWindow *parent, wxWindowID id, int number, Caninfo info, const wxPoint &pos, const wxSize &size) : AMSrefresh() +AMSrefresh::AMSrefresh(wxWindow *parent, int number, Caninfo info, const wxPoint &pos, const wxSize &size) : AMSrefresh() { m_info = info; m_can_id = wxString::Format("%d", number).ToStdString(); - create(parent, id, pos, size); + create(parent, wxID_ANY, pos, size); } AMSrefresh::~AMSrefresh() @@ -617,12 +612,12 @@ void AMSVirtualRoad::msw_rescale() /************************************************* Description:AMSLib **************************************************/ -AMSLib::AMSLib(wxWindow *parent, wxWindowID id, Caninfo info, const wxPoint &pos, const wxSize &size) +AMSLib::AMSLib(wxWindow *parent, Caninfo info) { m_border_color = (wxColour(130, 130, 128)); m_road_def_color = AMS_CONTROL_GRAY500; wxWindow::SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); - create(parent, id, pos, size); + create(parent); Bind(wxEVT_PAINT, &AMSLib::paintEvent, this); Bind(wxEVT_ENTER_WINDOW, &AMSLib::on_enter_window, this); @@ -650,6 +645,16 @@ void AMSLib::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const w m_bitmap_readonly_light = ScalableBitmap(this, "ams_readonly_light", 14); m_bitmap_transparent = ScalableBitmap(this, "transparent_ams_lib", 68); + m_bitmap_extra_tray_left = ScalableBitmap(this, "extra_ams_tray_left", 80); + m_bitmap_extra_tray_right = ScalableBitmap(this, "extra_ams_tray_right", 80); + + m_bitmap_extra_tray_left_hover = ScalableBitmap(this, "extra_ams_tray_left_hover", 80); + m_bitmap_extra_tray_right_hover = ScalableBitmap(this, "extra_ams_tray_right_hover", 80); + + m_bitmap_extra_tray_left_selected = ScalableBitmap(this, "extra_ams_tray_left_selected", 80); + m_bitmap_extra_tray_right_selected = ScalableBitmap(this, "extra_ams_tray_right_selected", 80); + + m_sizer_body->Add(0, 0, 1, wxEXPAND, 0); m_sizer_body->Add(m_sizer_edit, 0, wxALIGN_CENTER, 0); m_sizer_body->Add(0, 0, 0, wxBOTTOM, GetSize().y * 0.12); @@ -671,16 +676,25 @@ void AMSLib::on_leave_window(wxMouseEvent &evt) void AMSLib::on_left_down(wxMouseEvent &evt) { - //dc.DrawBitmap(temp_bitmap, (size.x - m_bitmap_editable.GetSize().x) / 2, ( size.y - FromDIP(10) - temp_bitmap.GetSize().y) ); if (m_info.material_state != AMSCanType::AMS_CAN_TYPE_EMPTY && m_info.material_state != AMSCanType::AMS_CAN_TYPE_NONE) { auto size = GetSize(); auto pos = evt.GetPosition(); if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_THIRDBRAND || m_info.material_state == AMSCanType::AMS_CAN_TYPE_BRAND || m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL) { + auto left = FromDIP(10); - auto top = (size.y - FromDIP(15) - m_bitmap_editable_light.GetBmpSize().y); - auto right = size.x - FromDIP(10);; - auto bottom = size.y - FromDIP(15); + auto right = size.x - FromDIP(10); + auto top = 0; + auto bottom = 0; + + if (m_ams_model == AMSModel::GENERIC_AMS) { + top = (size.y - FromDIP(15) - m_bitmap_editable_light.GetBmpSize().y); + bottom = size.y - FromDIP(15); + } + else if (m_ams_model == AMSModel::EXTRA_AMS) { + top = (size.y - FromDIP(20) - m_bitmap_editable_light.GetBmpSize().y); + bottom = size.y - FromDIP(20); + } if (pos.x >= left && pos.x <= right && pos.y >= top && top <= bottom) { if (m_selected) { @@ -726,12 +740,110 @@ void AMSLib::render(wxDC &dc) #endif // text - auto tmp_lib_colour = m_info.material_colour; + if (m_ams_model == AMSModel::GENERIC_AMS) { + render_generic_text(dc); + } + else if (m_ams_model == AMSModel::EXTRA_AMS) { + render_extra_text(dc); + } +} + +void AMSLib::render_extra_text(wxDC& dc) +{ + auto tmp_lib_colour = m_info.material_colour; auto temp_text_colour = AMS_CONTROL_GRAY800; if (tmp_lib_colour.GetLuminance() < 0.6) { temp_text_colour = AMS_CONTROL_WHITE_COLOUR; - } else { + } + else { + temp_text_colour = AMS_CONTROL_GRAY800; + } + + if (m_info.material_remain < 50) { + temp_text_colour = AMS_CONTROL_GRAY800; + } + + if (tmp_lib_colour.Alpha() == 0) { + temp_text_colour = AMS_CONTROL_GRAY800; + } + + dc.SetFont(::Label::Body_13); + dc.SetTextForeground(temp_text_colour); + + auto libsize = GetSize(); + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_THIRDBRAND + || m_info.material_state == AMSCanType::AMS_CAN_TYPE_BRAND + || m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL) { + + if (m_info.material_name.empty()) { + auto tsize = dc.GetMultiLineTextExtent("?"); + auto pot = wxPoint(0, 0); + pot = wxPoint((libsize.x - tsize.x) / 2 + FromDIP(2), (libsize.y - tsize.y) / 2 - FromDIP(5)); + dc.DrawText(L("?"), pot); + } + else { + auto tsize = dc.GetMultiLineTextExtent(m_info.material_name); + std::vector split_char_arr = { " ", "-" }; + bool has_split = false; + std::string has_split_char = " "; + + for (std::string split_char : split_char_arr) { + if (m_info.material_name.find(split_char) != std::string::npos) { + has_split = true; + has_split_char = split_char; + } + } + + + if (has_split) { + dc.SetFont(::Label::Body_10); + auto line_top = m_info.material_name.substr(0, m_info.material_name.find(has_split_char)); + auto line_bottom = m_info.material_name.substr(m_info.material_name.find(has_split_char)); + + auto line_top_tsize = dc.GetMultiLineTextExtent(line_top); + auto line_bottom_tsize = dc.GetMultiLineTextExtent(line_bottom); + + auto pot_top = wxPoint((libsize.x - line_top_tsize.x) / 2 + FromDIP(3), (libsize.y - line_top_tsize.y) / 2 - line_top_tsize.y); + dc.DrawText(line_top, pot_top); + + auto pot_bottom = wxPoint((libsize.x - line_bottom_tsize.x) / 2 + FromDIP(3), (libsize.y - line_bottom_tsize.y) / 2); + dc.DrawText(line_bottom, pot_bottom); + + + } + else { + dc.SetFont(::Label::Body_10); + auto pot = wxPoint(0, 0); + if (m_obj ) { + pot = wxPoint((libsize.x - tsize.x) / 2 + FromDIP(6), (libsize.y - tsize.y) / 2 - FromDIP(5)); + } + dc.DrawText(m_info.material_name, pot); + } + } + } + + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_EMPTY) { + auto tsize = dc.GetMultiLineTextExtent(_L("/")); + auto pot = wxPoint((libsize.x - tsize.x) / 2 + FromDIP(2), (libsize.y - tsize.y) / 2 + FromDIP(3)); + dc.DrawText(_L("/"), pot); + } +} + +void AMSLib::render_generic_text(wxDC &dc) +{ + bool show_k_value = true; + if (m_obj && (m_obj->get_printer_series() == PrinterSeries::SERIES_X1) && (abs(m_info.k - 0) < 1e-3)) { + show_k_value = false; + } + + auto tmp_lib_colour = m_info.material_colour; + auto temp_text_colour = AMS_CONTROL_GRAY800; + + if (tmp_lib_colour.GetLuminance() < 0.6) { + temp_text_colour = AMS_CONTROL_WHITE_COLOUR; + } + else { temp_text_colour = AMS_CONTROL_GRAY800; } @@ -754,15 +866,12 @@ void AMSLib::render(wxDC &dc) if (m_info.material_name.empty() /*&& m_info.material_state != AMSCanType::AMS_CAN_TYPE_VIRTUAL*/) { auto tsize = dc.GetMultiLineTextExtent("?"); auto pot = wxPoint(0, 0); - if (m_obj->is_function_supported(PrinterFunction::FUNC_EXTRUSION_CALI)) { - pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 - FromDIP(9)); - } else { - pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 + FromDIP(3)); - } + pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 - FromDIP(9)); dc.DrawText(L("?"), pot); - } else { + } + else { auto tsize = dc.GetMultiLineTextExtent(m_info.material_name); - std::vector split_char_arr = {" ", "-"}; + std::vector split_char_arr = { " ", "-" }; bool has_split = false; std::string has_split_char = " "; @@ -777,10 +886,10 @@ void AMSLib::render(wxDC &dc) if (has_split) { dc.SetFont(::Label::Body_12); - auto line_top = m_info.material_name.substr(0, m_info.material_name.find(has_split_char)); + auto line_top = m_info.material_name.substr(0, m_info.material_name.find(has_split_char)); auto line_bottom = m_info.material_name.substr(m_info.material_name.find(has_split_char)); - auto line_top_tsize = dc.GetMultiLineTextExtent(line_top); + auto line_top_tsize = dc.GetMultiLineTextExtent(line_top); auto line_bottom_tsize = dc.GetMultiLineTextExtent(line_bottom); if (!m_show_kn) { @@ -797,20 +906,23 @@ void AMSLib::render(wxDC &dc) auto pot_bottom = wxPoint((libsize.x - line_bottom_tsize.x) / 2, (libsize.y - line_bottom_tsize.y) / 2 - FromDIP(8)); dc.DrawText(line_bottom, pot_bottom); } - - } else { + + } + else { auto pot = wxPoint(0, 0); - if (m_obj) { + if (m_obj && show_k_value) { pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 - FromDIP(9)); - } + } else { + pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 + FromDIP(3)); + } dc.DrawText(m_info.material_name, pot); } } //draw k&n - if (m_obj) { - if (m_show_kn){ + if (m_obj && show_k_value) { + if (m_show_kn) { wxString str_k = wxString::Format("K %1.3f", m_info.k); wxString str_n = wxString::Format("N %1.3f", m_info.n); dc.SetFont(::Label::Body_11); @@ -823,17 +935,111 @@ void AMSLib::render(wxDC &dc) if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_EMPTY) { auto tsize = dc.GetMultiLineTextExtent(_L("Empty")); - auto pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 + FromDIP(3)); + auto pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 + FromDIP(3)); dc.DrawText(_L("Empty"), pot); } } void AMSLib::doRender(wxDC &dc) { - wxSize size = GetSize(); - auto tmp_lib_colour = m_info.material_colour; - auto temp_bitmap_third = m_bitmap_editable_light; - auto temp_bitmap_brand = m_bitmap_readonly_light; + if (m_ams_model == AMSModel::GENERIC_AMS) { + render_generic_lib(dc); + } + else if (m_ams_model == AMSModel::EXTRA_AMS) { + render_extra_lib(dc); + } +} + +void AMSLib::render_extra_lib(wxDC& dc) +{ + wxSize size = GetSize(); + + ScalableBitmap tray_bitmap = m_can_index <= 1 ? m_bitmap_extra_tray_left : m_bitmap_extra_tray_right; + ScalableBitmap tray_bitmap_hover = m_can_index <= 1 ? m_bitmap_extra_tray_left_hover : m_bitmap_extra_tray_right_hover; + ScalableBitmap tray_bitmap_selected = m_can_index <= 1 ? m_bitmap_extra_tray_left_selected : m_bitmap_extra_tray_right_selected; + + + auto tmp_lib_colour = m_info.material_colour; + auto temp_bitmap_third = m_bitmap_editable_light; + auto temp_bitmap_brand = m_bitmap_readonly_light; + + //draw road + + + dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxSOLID)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + + if (m_pass_road) { + dc.SetPen(wxPen(m_info.material_colour, 6, wxSOLID)); + } + + if (m_can_index == 0 || m_can_index == 3) { + dc.DrawLine(size.x / 2, size.y / 2, size.x / 2, size.y); + } + else { + dc.DrawLine(size.x / 2, size.y / 2, size.x / 2, 0); + } + + + //draw def background + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(AMS_CONTROL_DEF_LIB_BK_COLOUR)); + dc.DrawRoundedRectangle(FromDIP(10), FromDIP(10), size.x - FromDIP(20), size.y - FromDIP(20), 0); + + if (tmp_lib_colour.GetLuminance() < 0.6) { + temp_bitmap_third = m_bitmap_editable_light; + temp_bitmap_brand = m_bitmap_readonly_light; + } + else { + temp_bitmap_third = m_bitmap_editable; + temp_bitmap_brand = m_bitmap_readonly; + } + + if (m_info.material_remain < 50) { + temp_bitmap_third = m_bitmap_editable; + temp_bitmap_brand = m_bitmap_readonly; + } + + if (tmp_lib_colour.Alpha() == 0) { + temp_bitmap_third = m_bitmap_editable; + temp_bitmap_brand = m_bitmap_readonly; + } + + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(tmp_lib_colour)); + dc.DrawRoundedRectangle(FromDIP(10), FromDIP(10), size.x - FromDIP(20), size.y - FromDIP(20), 0); + + + if (!m_disable_mode) { + // edit icon + if (m_info.material_state != AMSCanType::AMS_CAN_TYPE_EMPTY && m_info.material_state != AMSCanType::AMS_CAN_TYPE_NONE) + { + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_THIRDBRAND || m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL) + dc.DrawBitmap(temp_bitmap_third.bmp(), (size.x - temp_bitmap_third.GetBmpSize().x) / 2 + FromDIP(2), (size.y - FromDIP(18) - temp_bitmap_third.GetBmpSize().y)); + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_BRAND) + dc.DrawBitmap(temp_bitmap_brand.bmp(), (size.x - temp_bitmap_brand.GetBmpSize().x) / 2 + FromDIP(2), (size.y - FromDIP(18) - temp_bitmap_brand.GetBmpSize().y)); + } + } + + // selected & hover + if (m_selected) { + dc.DrawBitmap(tray_bitmap_selected.bmp(), (size.x - tray_bitmap_selected.GetBmpSize().x) / 2, (size.y - tray_bitmap_selected.GetBmpSize().y) / 2); + } + else if (!m_selected && m_hover) { + dc.DrawBitmap(tray_bitmap_hover.bmp(), (size.x - tray_bitmap_hover.GetBmpSize().x) / 2, (size.y - tray_bitmap_hover.GetBmpSize().y) / 2); + } + else { + dc.DrawBitmap(tray_bitmap.bmp(), (size.x - tray_bitmap.GetBmpSize().x) / 2, (size.y - tray_bitmap.GetBmpSize().y) / 2); + } +} + + +void AMSLib::render_generic_lib(wxDC &dc) +{ + wxSize size = GetSize(); + auto tmp_lib_colour = m_info.material_colour; + auto temp_bitmap_third = m_bitmap_editable_light; + auto temp_bitmap_brand = m_bitmap_readonly_light; //draw def background dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); @@ -843,7 +1049,8 @@ void AMSLib::doRender(wxDC &dc) if (tmp_lib_colour.GetLuminance() < 0.6) { temp_bitmap_third = m_bitmap_editable_light; temp_bitmap_brand = m_bitmap_readonly_light; - } else { + } + else { temp_bitmap_third = m_bitmap_editable; temp_bitmap_brand = m_bitmap_readonly; } @@ -860,24 +1067,19 @@ void AMSLib::doRender(wxDC &dc) // selected if (m_selected) { - // lib dc.SetPen(wxPen(tmp_lib_colour, 2, wxSOLID)); dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); if (m_radius == 0) { dc.DrawRectangle(0, 0, size.x, size.y); - } else { + } + else { dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), size.x - FromDIP(1), size.y - FromDIP(1), m_radius); } dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); dc.SetBrush(wxBrush(tmp_lib_colour)); - /* if (m_radius == 0) { - dc.DrawRectangle(0, 0, size.x, size.y); - } else { - dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4), size.x - FromDIP(8), size.y - FromDIP(8), m_radius); - }*/ } - + if (!m_selected && m_hover) { dc.SetPen(wxPen(AMS_CONTROL_BRAND_COLOUR, 2, wxSOLID)); dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); @@ -890,19 +1092,10 @@ void AMSLib::doRender(wxDC &dc) dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); dc.SetBrush(wxBrush(tmp_lib_colour)); - /* if (m_radius == 0) { - dc.DrawRectangle(0, 0, size.x, size.y); - } else { - dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4), size.x - FromDIP(8), size.y - FromDIP(8), m_radius); - }*/ - } else { + } + else { dc.SetPen(wxPen(tmp_lib_colour, 1, wxSOLID)); dc.SetBrush(wxBrush(tmp_lib_colour)); - /*if (m_radius == 0) { - dc.DrawRectangle(0, 0, size.x, size.y); - } else { - dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4), size.x - FromDIP(8), size.y - FromDIP(8), m_radius); - }*/ } //draw remain @@ -916,7 +1109,7 @@ void AMSLib::doRender(wxDC &dc) //transparent auto alpha = m_info.material_colour.Alpha(); if (alpha == 0) { - dc.DrawBitmap(m_bitmap_transparent.bmp(),FromDIP(4), FromDIP(4)); + dc.DrawBitmap(m_bitmap_transparent.bmp(), FromDIP(4), FromDIP(4)); } //gradient @@ -942,7 +1135,7 @@ void AMSLib::doRender(wxDC &dc) #else dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4) + top, size.x - FromDIP(8), curr_height, m_radius - 1); #endif - } + } } if (top > 2) { @@ -972,7 +1165,7 @@ void AMSLib::doRender(wxDC &dc) #endif } } - + //border dc.SetPen(wxPen(wxColour(130, 130, 128), 1, wxSOLID)); dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); @@ -981,7 +1174,7 @@ void AMSLib::doRender(wxDC &dc) #else dc.DrawRoundedRectangle(FromDIP(3), FromDIP(3), size.x - FromDIP(6), size.y - FromDIP(6), m_radius); #endif - + if (!m_disable_mode) { // edit icon if (m_info.material_state != AMSCanType::AMS_CAN_TYPE_EMPTY && m_info.material_state != AMSCanType::AMS_CAN_TYPE_NONE) @@ -994,6 +1187,12 @@ void AMSLib::doRender(wxDC &dc) } } +void AMSLib::on_pass_road(bool pass) +{ + m_pass_road = pass; + Refresh(); +} + void AMSLib::Update(Caninfo info, bool refresh) { DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); @@ -1329,7 +1528,7 @@ AMSItem::AMSItem(wxWindow *parent, wxWindowID id, AMSinfo amsinfo, const wxSize { m_amsinfo = amsinfo; m_cube_size = cube_size; - create(parent, id, pos, size); + create(parent, id, pos, AMS_ITEM_SIZE); Bind(wxEVT_PAINT, &AMSItem::paintEvent, this); Bind(wxEVT_ENTER_WINDOW, &AMSItem::OnEnterWindow, this); Bind(wxEVT_LEAVE_WINDOW, &AMSItem::OnLeaveWindow, this); @@ -1356,8 +1555,9 @@ void AMSItem::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const { m_ts_bitmap_cube = new ScalableBitmap(this, "ts_bitmap_cube", 14); wxWindow::Create(parent, id, pos, size); + SetMinSize(AMS_ITEM_SIZE); + SetMaxSize(AMS_ITEM_SIZE); SetBackgroundColour(AMS_CONTROL_WHITE_COLOUR); - HideHumidity(); Refresh(); } @@ -1386,28 +1586,6 @@ void AMSItem::UnSelected() Refresh(); } -void AMSItem::ShowHumidity() -{ - m_show_humidity = true; - SetSize(AMS_ITEM_HUMIDITY_SIZE); - SetMinSize(AMS_ITEM_HUMIDITY_SIZE); - Refresh(); -} - -void AMSItem::HideHumidity() -{ - m_show_humidity = false; - SetSize(AMS_ITEM_SIZE); - SetMinSize(AMS_ITEM_SIZE); - Refresh(); -} - -void AMSItem::SetHumidity(int humidity) -{ - m_humidity = humidity; - Refresh(); -} - bool AMSItem::Enable(bool enable) { return wxWindow::Enable(enable); } void AMSItem::paintEvent(wxPaintEvent &evt) @@ -1489,20 +1667,6 @@ void AMSItem::doRender(wxDC &dc) left += m_space; } - m_show_humidity = false; - if (m_show_humidity) { - left = 4 * AMS_ITEM_CUBE_SIZE.x + 6 * m_space; - dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 1)); - dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); - dc.DrawLine(left, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, left, ((size.y - AMS_ITEM_CUBE_SIZE.y) / 2) + AMS_ITEM_CUBE_SIZE.y); - - left += m_space + m_space / 2; - /* dc.SetFont(::Label::Body_13); - dc.SetTextForeground(AMS_CONTROL_GRAY800); - auto tsize = dc.GetTextExtent("00% RH"); - auto text = wxString::Format("%d%% RH", m_humidity);*/ - } - auto border_colour = AMS_CONTROL_BRAND_COLOUR; if (!wxWindow::IsEnabled()) { border_colour = AMS_CONTROL_DISABLE_COLOUR; } @@ -1527,29 +1691,166 @@ Description:AmsCan AmsCans::AmsCans() {} -AmsCans::AmsCans(wxWindow *parent, wxWindowID id, AMSinfo info, const wxPoint &pos, const wxSize &size) : AmsCans() +AmsCans::AmsCans(wxWindow *parent,AMSinfo info, AMSModel model) : AmsCans() { - wxWindow::Create(parent, wxID_ANY, pos, AMS_CANS_WINDOW_SIZE); - create(parent, id, info, pos, size); + m_bitmap_extra_framework = ScalableBitmap(this, "ams_extra_framework_mid", 140); + + SetDoubleBuffered(true); + m_ams_model = model; + m_info = info; + + wxWindow::Create(parent, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE); + create(parent); + Bind(wxEVT_PAINT, &AmsCans::paintEvent, this); } -void AmsCans::create(wxWindow *parent, wxWindowID id, AMSinfo info, const wxPoint &pos, const wxSize &size) +void AmsCans::create(wxWindow *parent) { - sizer_can = new wxBoxSizer(wxHORIZONTAL); - m_info = info; - Freeze(); - for (auto it = m_info.cans.begin(); it != m_info.cans.end(); it++) { - AddCan(*it, m_can_count, m_info.cans.size()); - m_can_count++; + SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + + if (m_ams_model == AMSModel::GENERIC_AMS) { + sizer_can = new wxBoxSizer(wxHORIZONTAL); + for (auto it = m_info.cans.begin(); it != m_info.cans.end(); it++) { + AddCan(*it, m_can_count, m_info.cans.size(), sizer_can); + m_can_count++; + } + SetSizer(sizer_can); + } + else if(m_ams_model == AMSModel::EXTRA_AMS) { + sizer_can = new wxBoxSizer(wxVERTICAL); + sizer_can_middle = new wxBoxSizer(wxHORIZONTAL); + sizer_can_left = new wxBoxSizer(wxVERTICAL); + sizer_can_right = new wxBoxSizer(wxVERTICAL); + + sizer_can_left->Add(0,0,0,wxTOP,FromDIP(8)); + + for (auto it = m_info.cans.begin(); it != m_info.cans.end(); it++) { + if (m_can_count <= 1) { + AddCan(*it, m_can_count, m_info.cans.size(), sizer_can_left); + if (m_can_count == 0) { + sizer_can_left->Add(0,0,0,wxTOP,FromDIP(20)); + } + } + else { + AddCan(*it, m_can_count, m_info.cans.size(), sizer_can_right); + if (m_can_count == 2) { + sizer_can_right->Prepend(0, 0, 0, wxTOP, FromDIP(20)); + } + } + + m_can_count++; + } + + sizer_can_right->Prepend(0,0,0,wxTOP,FromDIP(8)); + sizer_can_middle->Add(0, 0, 0, wxLEFT, FromDIP(8)); + sizer_can_middle->Add(sizer_can_left, 0, wxALL, 0); + sizer_can_middle->Add( 0, 0, 0, wxLEFT, FromDIP(20) ); + sizer_can_middle->Add(sizer_can_right, 0, wxALL, 0); + sizer_can->Add(sizer_can_middle, 1, wxALIGN_CENTER, 0); + SetSizer(sizer_can); } - SetSizer(sizer_can); Layout(); Fit(); Thaw(); } +void AmsCans::AddCan(Caninfo caninfo, int canindex, int maxcan, wxBoxSizer* sizer) +{ + + auto amscan = new wxWindow(this, wxID_ANY); + amscan->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + + wxBoxSizer* m_sizer_ams = new wxBoxSizer(wxVERTICAL); + + + auto m_panel_refresh = new AMSrefresh(amscan, m_can_count, caninfo); + auto m_panel_lib = new AMSLib(amscan, caninfo); + + m_panel_lib->Bind(wxEVT_LEFT_DOWN, [this, canindex](wxMouseEvent& ev) { + m_canlib_selection = canindex; + // m_canlib_id = caninfo.can_id; + + for (auto i = 0; i < m_can_lib_list.GetCount(); i++) { + CanLibs* lib = m_can_lib_list[i]; + if (lib->canLib->m_can_index == m_canlib_selection) { + wxCommandEvent evt(EVT_AMS_UNSELETED_VAMS); + evt.SetString(m_info.ams_id); + wxPostEvent(GetParent()->GetParent(), evt); + lib->canLib->OnSelected(); + } + else { + lib->canLib->UnSelected(); + } + } + ev.Skip(); + }); + + + m_panel_lib->m_ams_model = m_ams_model; + m_panel_lib->m_info.can_id = caninfo.can_id; + m_panel_lib->m_can_index = canindex; + + + auto m_panel_road = new AMSRoad(amscan, wxID_ANY, caninfo, canindex, maxcan, wxDefaultPosition, AMS_CAN_ROAD_SIZE); + + if (m_ams_model == AMSModel::GENERIC_AMS) { + m_sizer_ams->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(14)); + m_sizer_ams->Add(m_panel_refresh, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_sizer_ams->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(2)); + m_sizer_ams->Add(m_panel_lib, 1, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, FromDIP(3)); + m_sizer_ams->Add(m_panel_road, 0, wxALL, 0); + } + else if (m_ams_model == AMSModel::EXTRA_AMS) + { + m_sizer_ams = new wxBoxSizer(wxHORIZONTAL); + m_panel_road->Hide(); + + if (canindex <= 1) { + m_sizer_ams->Add(m_panel_refresh, 0, wxALIGN_CENTER, 0); + m_sizer_ams->Add(m_panel_lib, 0, wxALIGN_CENTER, 0); + } + else { + m_sizer_ams->Add(m_panel_lib, 0, wxALIGN_CENTER, 0); + m_sizer_ams->Add(m_panel_refresh, 0, wxALIGN_CENTER, 0); + } + } + + + amscan->SetSizer(m_sizer_ams); + amscan->Layout(); + amscan->Fit(); + + if (m_ams_model == AMSModel::GENERIC_AMS) { + sizer->Add(amscan, 0, wxALL, 0); + } + else if (m_ams_model == AMSModel::EXTRA_AMS) + { + if (canindex > 1) { + sizer->Prepend(amscan, 0, wxALL, 0); + } + else { + sizer->Add(amscan, 0, wxALL, 0); + } + } + + Canrefreshs* canrefresh = new Canrefreshs; + canrefresh->canID = caninfo.can_id; + canrefresh->canrefresh = m_panel_refresh; + m_can_refresh_list.Add(canrefresh); + + CanLibs* canlib = new CanLibs; + canlib->canID = caninfo.can_id; + canlib->canLib = m_panel_lib; + m_can_lib_list.Add(canlib); + + CanRoads* canroad = new CanRoads; + canroad->canID = caninfo.can_id; + canroad->canRoad = m_panel_road; + m_can_road_list.Add(canroad); +} + void AmsCans::Update(AMSinfo info) { m_info = info; @@ -1587,64 +1888,6 @@ void AmsCans::Update(AMSinfo info) Layout(); } -void AmsCans::AddCan(Caninfo caninfo, int canindex, int maxcan) -{ - auto amscan = new wxWindow(this, wxID_ANY); - amscan->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); - wxBoxSizer *m_sizer_ams = new wxBoxSizer(wxVERTICAL); - m_sizer_ams->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(14)); - - auto m_panel_refresh = new AMSrefresh(amscan, wxID_ANY, m_can_count, caninfo); - m_sizer_ams->Add(m_panel_refresh, 0, wxALIGN_CENTER_HORIZONTAL, 0); - m_sizer_ams->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(2)); - - auto m_panel_lib = new AMSLib(amscan, wxID_ANY, caninfo); - m_panel_lib->Bind(wxEVT_LEFT_DOWN, [this, canindex](wxMouseEvent &ev) { - m_canlib_selection = canindex; - // m_canlib_id = caninfo.can_id; - - for (auto i = 0; i < m_can_lib_list.GetCount(); i++) { - CanLibs *lib = m_can_lib_list[i]; - if (lib->canLib->m_can_index == m_canlib_selection) { - wxCommandEvent evt(EVT_AMS_UNSELETED_VAMS); - evt.SetString(m_info.ams_id); - wxPostEvent(GetParent()->GetParent(), evt); - lib->canLib->OnSelected(); - } else { - lib->canLib->UnSelected(); - } - } - ev.Skip(); - }); - - m_panel_lib->m_info.can_id = caninfo.can_id; - m_panel_lib->m_can_index = canindex; - auto m_panel_road = new AMSRoad(amscan, wxID_ANY, caninfo, canindex, maxcan, wxDefaultPosition, AMS_CAN_ROAD_SIZE); - m_sizer_ams->Add(m_panel_lib, 1, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, FromDIP(3)); - m_sizer_ams->Add(m_panel_road, 0, wxALL, 0); - - amscan->SetSizer(m_sizer_ams); - amscan->Layout(); - amscan->Fit(); - sizer_can->Add(amscan, 0, wxALL, 0); - - Canrefreshs *canrefresh = new Canrefreshs; - canrefresh->canID = caninfo.can_id; - canrefresh->canrefresh = m_panel_refresh; - m_can_refresh_list.Add(canrefresh); - - CanLibs *canlib = new CanLibs; - canlib->canID = caninfo.can_id; - canlib->canLib = m_panel_lib; - m_can_lib_list.Add(canlib); - - CanRoads *canroad = new CanRoads; - canroad->canID = caninfo.can_id; - canroad->canRoad = m_panel_road; - m_can_road_list.Add(canroad); -} - - void AmsCans::SetDefSelectCan() { if (m_can_lib_list.GetCount() > 0) { @@ -1688,6 +1931,40 @@ wxColour AmsCans::GetTagColr(wxString canid) return tag_colour; } +void AmsCans::SetAmsStepExtra(wxString canid, AMSPassRoadType type, AMSPassRoadSTEP step) +{ + wxString type_str = ""; + wxString step_str = ""; + + + if (type == AMSPassRoadType::AMS_ROAD_TYPE_NONE) { + type_str = "AMS_ROAD_TYPE_NONE"; + } + else if (type == AMSPassRoadType::AMS_ROAD_TYPE_LOAD) { + type_str = "AMS_ROAD_TYPE_LOAD"; + } + else if (type == AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD) { + type_str = "AMS_ROAD_TYPE_UNLOAD"; + } + + + if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1) { + step_str = "AMS_ROAD_STEP_COMBO_LOAD_STEP1"; + SetAmsStep(canid.ToStdString()); + } + else if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2) { + step_str = "AMS_ROAD_STEP_COMBO_LOAD_STEP2"; + SetAmsStep(canid.ToStdString()); + } + else if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3) { + step_str = "AMS_ROAD_STEP_COMBO_LOAD_STEP3"; + SetAmsStep(canid.ToStdString()); + }else if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { + step_str = "AMS_ROAD_STEP_NONE"; + SetAmsStep(""); + } +} + void AmsCans::SetAmsStep(wxString canid, AMSPassRoadType type, AMSPassRoadSTEP step) { @@ -1761,6 +2038,14 @@ void AmsCans::SetAmsStep(wxString canid, AMSPassRoadType type, AMSPassRoadSTEP s } } +void AmsCans::SetAmsStep(std::string can_id) +{ + if (m_road_canid != can_id) { + m_road_canid = can_id; + Refresh(); + } +} + void AmsCans::PlayRridLoading(wxString canid) { for (auto i = 0; i < m_can_refresh_list.GetCount(); i++) { @@ -1777,6 +2062,155 @@ std::string AmsCans::GetCurrentCan() return wxString::Format("%d", m_canlib_selection).ToStdString(); } +void AmsCans::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AmsCans::render(wxDC& dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 }); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void AmsCans::doRender(wxDC& dc) +{ + wxSize size = GetSize(); + dc.DrawBitmap(m_bitmap_extra_framework.bmp(), (size.x - m_bitmap_extra_framework.GetBmpSize().x) / 2, (size.y - m_bitmap_extra_framework.GetBmpSize().y) / 2); + + //road for extra + if (m_ams_model == AMSModel::EXTRA_AMS) { + + auto end_top = size.x / 2 - FromDIP(99); + auto passroad_width = 6; + + for (auto i = 0; i < m_can_lib_list.GetCount(); i++) { + CanLibs* lib = m_can_lib_list[i]; + if (lib->canLib->m_info.can_id == m_road_canid) { + m_road_colour = lib->canLib->m_info.material_colour; + if (!m_road_canid.empty()) { + lib->canLib->on_pass_road(true); + } + else { + lib->canLib->on_pass_road(false); + } + } + } + + + // A1 + dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxSOLID)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + + try + { + auto a1_top = size.y / 2 - FromDIP(4); + auto a1_left = m_can_lib_list[0]->canLib->GetScreenPosition().x + m_can_lib_list[0]->canLib->GetSize().x / 2; + auto local_pos1 = GetScreenPosition().x + GetSize().x / 2; + a1_left = size.x / 2 + (a1_left - local_pos1); + dc.DrawLine(a1_left, FromDIP(30), a1_left, a1_top); + dc.DrawLine(a1_left, a1_top, end_top, a1_top); + + + // A2 + auto a2_top = size.y / 2 + FromDIP(8); + auto a2_left = m_can_lib_list[1]->canLib->GetScreenPosition().x + m_can_lib_list[1]->canLib->GetSize().x / 2; + auto local_pos2 = GetScreenPosition().x + GetSize().x / 2; + a2_left = size.x / 2 + (a2_left - local_pos2); + dc.DrawLine(a2_left, FromDIP(160), a2_left, a2_top); + dc.DrawLine(a2_left, a2_top, end_top, a2_top); + + // A3 + auto a3_top = size.y / 2 + FromDIP(4); + auto a3_left = m_can_lib_list[2]->canLib->GetScreenPosition().x + m_can_lib_list[2]->canLib->GetSize().x / 2; + auto local_pos3 = GetScreenPosition().x + GetSize().x / 2; + a3_left = size.x / 2 + (a3_left - local_pos3); + dc.DrawLine(a3_left, FromDIP(160), a3_left, a3_top); + dc.DrawLine(a3_left, a3_top, end_top, a3_top); + + + // A4 + auto a4_top = size.y / 2; + auto a4_left = m_can_lib_list[3]->canLib->GetScreenPosition().x + m_can_lib_list[3]->canLib->GetSize().x / 2; + auto local_pos4 = GetScreenPosition().x + GetSize().x / 2; + a4_left = size.x / 2 + (a4_left - local_pos4); + dc.DrawLine(a4_left, FromDIP(30), a4_left, a4_top); + dc.DrawLine(a4_left, a4_top, end_top, a4_top); + + + if (!m_road_canid.empty()) { + if (m_road_canid == "0") { + dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + dc.DrawLine(a1_left, FromDIP(30), a1_left, a1_top); + dc.DrawLine(a1_left, a1_top, end_top, a1_top); + } + + if (m_road_canid == "1") { + dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + dc.DrawLine(a2_left, FromDIP(160), a2_left, a2_top); + dc.DrawLine(a2_left, a2_top, end_top, a2_top); + } + + if (m_road_canid == "2") { + dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + dc.DrawLine(a3_left, FromDIP(160), a3_left, a3_top); + dc.DrawLine(a3_left, a3_top, end_top, a3_top); + } + + if (m_road_canid == "3") { + dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + dc.DrawLine(a4_left, FromDIP(30), a4_left, a4_top); + dc.DrawLine(a4_left, a4_top, end_top, a4_top); + } + } + + //to Extruder + dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxSOLID)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + + dc.DrawLine(end_top, a1_top, end_top, size.y); + + if (!m_road_canid.empty()) { + if (!m_road_canid.empty()) { + if (m_road_canid == "0") { + dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + dc.DrawLine(end_top, a1_top, end_top, size.y); + } + else if (m_road_canid == "1") { + dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + dc.DrawLine(end_top, a2_top, end_top, size.y); + } + else if (m_road_canid == "2") { + dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + dc.DrawLine(end_top, a3_top, end_top, size.y); + } + else if (m_road_canid == "3") { + dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + dc.DrawLine(end_top, a4_top, end_top, size.y); + } + } + } + } + catch (...){} + } +} + void AmsCans::StopRridLoading(wxString canid) { for (auto i = 0; i < m_can_refresh_list.GetCount(); i++) { @@ -1806,15 +2240,6 @@ void AmsCans::show_sn_value(bool show) } } -//wxColour AmsCans::GetCanColour(wxString canid) -//{ -// wxColour col = *wxWHITE; -// for (auto i = 0; i < m_can_lib_list.GetCount(); i++) { -// CanLibs *lib = m_can_lib_list[i]; -// if (lib->canLib->m_info.can_id == canid) { col = lib->canLib->m_info.material_colour; } -// } -// return col; -//} /************************************************* Description:AMSControl @@ -1853,8 +2278,8 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_panel_top_empty->Layout(); m_sizer_top_empty->Fit(m_panel_top_empty); - m_simplebook_amsitems->AddPage(m_panel_top, wxEmptyString, false); m_simplebook_amsitems->AddPage(m_panel_top_empty, wxEmptyString, false); + m_simplebook_amsitems->AddPage(m_panel_top, wxEmptyString, false); wxBoxSizer *m_sizer_bottom = new wxBoxSizer(wxHORIZONTAL); @@ -1862,18 +2287,18 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons //ams tip m_sizer_ams_tips = new wxBoxSizer(wxHORIZONTAL); - auto m_ams_tip = new Label(m_amswin, _L("AMS")); + m_ams_tip = new Label(m_amswin, _L("AMS")); m_ams_tip->SetFont(::Label::Body_12); m_ams_tip->SetBackgroundColour(*wxWHITE); - auto img_amsmapping_tip = new wxStaticBitmap(m_amswin, wxID_ANY, create_scaled_bitmap("enable_ams", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); - img_amsmapping_tip->SetBackgroundColour(*wxWHITE); + m_img_amsmapping_tip = new wxStaticBitmap(m_amswin, wxID_ANY, create_scaled_bitmap("enable_ams", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); + m_img_amsmapping_tip->SetBackgroundColour(*wxWHITE); m_sizer_ams_tips->Add(m_ams_tip, 0, wxTOP, FromDIP(5)); - m_sizer_ams_tips->Add(img_amsmapping_tip, 0, wxALL, FromDIP(3)); + m_sizer_ams_tips->Add(m_img_amsmapping_tip, 0, wxALL, FromDIP(3)); - img_amsmapping_tip->Bind(wxEVT_ENTER_WINDOW, [this, img_amsmapping_tip](auto& e) { - wxPoint img_pos = img_amsmapping_tip->ClientToScreen(wxPoint(0, 0)); - wxPoint popup_pos(img_pos.x, img_pos.y + img_amsmapping_tip->GetRect().height); + m_img_amsmapping_tip->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { + wxPoint img_pos = m_img_amsmapping_tip->ClientToScreen(wxPoint(0, 0)); + wxPoint popup_pos(img_pos.x, img_pos.y + m_img_amsmapping_tip->GetRect().height); m_ams_introduce_popup.set_mode(true); m_ams_introduce_popup.Position(popup_pos, wxSize(0, 0)); m_ams_introduce_popup.Popup(); @@ -1883,7 +2308,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons wxPostEvent(this, close_event); #endif // __WXMSW__ }); - img_amsmapping_tip->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) { + m_img_amsmapping_tip->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) { m_ams_introduce_popup.Dismiss(); }); @@ -1900,8 +2325,8 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_sizer_ams_tips->Add(m_img_ams_backup, 0, wxALL, FromDIP(3)); m_sizer_ams_tips->Add(m_ams_backup_tip, 0, wxTOP, FromDIP(5)); - m_ams_backup_tip->Bind(wxEVT_ENTER_WINDOW, [this, img_amsmapping_tip](auto& e) {SetCursor(wxCURSOR_HAND); }); - m_img_ams_backup->Bind(wxEVT_ENTER_WINDOW, [this, img_amsmapping_tip](auto& e) {SetCursor(wxCURSOR_HAND); }); + m_ams_backup_tip->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); + m_img_ams_backup->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); m_ams_backup_tip->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); m_img_ams_backup->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); @@ -1923,13 +2348,12 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_sizer_cans->Add(m_simplebook_ams, 0, wxLEFT | wxLEFT, FromDIP(10)); // ams mode - m_simplebook_cans = new wxSimplebook(m_simplebook_ams, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); - m_simplebook_cans->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + m_simplebook_generic_cans = new wxSimplebook(m_simplebook_ams, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); + m_simplebook_generic_cans->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); // none ams mode m_none_ams_panel = new wxPanel(m_simplebook_ams, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); m_none_ams_panel->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); - //m_none_ams_panel->SetDoubleBuffered(true); auto m_tip_none_ams = new wxStaticText(m_none_ams_panel, wxID_ANY, _L("AMS not connected"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL); m_tip_none_ams->SetMinSize(wxSize(AMS_CANS_SIZE.x - FromDIP(20), -1)); @@ -1945,8 +2369,13 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_none_ams_panel->SetSizer(sizer_ams_panel_h); m_none_ams_panel->Layout(); - m_simplebook_ams->AddPage(m_simplebook_cans, wxEmptyString, true); + //extra ams mode + m_simplebook_extra_cans = new wxSimplebook(m_simplebook_ams, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); + m_simplebook_extra_cans->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + m_simplebook_ams->AddPage(m_none_ams_panel, wxEmptyString, false); + m_simplebook_ams->AddPage(m_simplebook_generic_cans, wxEmptyString, false); + m_simplebook_ams->AddPage(m_simplebook_extra_cans, wxEmptyString, false); m_panel_can->SetSizer(m_sizer_cans); m_panel_can->Layout(); @@ -1999,14 +2428,14 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons wxBoxSizer *m_sizer_button = new wxBoxSizer(wxVERTICAL); wxBoxSizer *m_sizer_button_area = new wxBoxSizer(wxHORIZONTAL); - m_button_extrusion_cali = new Button(m_button_area, _L("Cali")); + /*m_button_extrusion_cali = new Button(m_button_area, _L("Cali")); m_button_extrusion_cali->SetToolTip(_L("Calibration of extrusion")); m_button_extrusion_cali->SetBackgroundColor(btn_bg_green); m_button_extrusion_cali->SetBorderColor(btn_bd_green); m_button_extrusion_cali->SetTextColor(btn_text_green); m_button_extrusion_cali->SetFont(Label::Body_13); if (wxGetApp().app_config->get("language") == "de_DE") m_button_extrusion_cali->SetFont(Label::Body_9); - if (wxGetApp().app_config->get("language") == "fr_FR") m_button_extrusion_cali->SetFont(Label::Body_9); + if (wxGetApp().app_config->get("language") == "fr_FR") m_button_extrusion_cali->SetFont(Label::Body_9);*/ m_button_extruder_feed = new Button(m_button_area, _L("Load Filament")); m_button_extruder_feed->SetBackgroundColor(btn_bg_green); @@ -2025,7 +2454,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons if (wxGetApp().app_config->get("language") == "fr_FR") m_button_extruder_back->SetFont(Label::Body_9); m_sizer_button_area->Add(0, 0, 1, wxEXPAND, 0); - m_sizer_button_area->Add(m_button_extrusion_cali, 0, wxLEFT, FromDIP(5)); + //m_sizer_button_area->Add(m_button_extrusion_cali, 0, wxLEFT, FromDIP(5)); m_sizer_button_area->Add(m_button_extruder_back, 0, wxLEFT, FromDIP(6)); m_sizer_button_area->Add(m_button_extruder_feed, 0, wxLEFT, FromDIP(6)); @@ -2052,7 +2481,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons auto vams_panel = new wxWindow(m_panel_virtual, wxID_ANY); vams_panel->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); - m_vams_lib = new AMSLib(vams_panel, wxID_ANY, m_vams_info); + m_vams_lib = new AMSLib(vams_panel, m_vams_info); m_vams_road = new AMSRoad(vams_panel, wxID_ANY, m_vams_info, -1, -1, wxDefaultPosition, AMS_CAN_ROAD_SIZE); m_vams_lib->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { @@ -2082,8 +2511,8 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons wxBoxSizer* m_vams_top_sizer = new wxBoxSizer(wxVERTICAL); m_vams_top_sizer->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(14)); - m_vams_top_sizer->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(2) + AMS_REFRESH_SIZE.y); - m_vams_top_sizer->Add(m_vams_lib, 1, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, FromDIP(4)); + m_vams_top_sizer->Add(0, 0, 0, wxEXPAND | wxTOP, AMS_REFRESH_SIZE.y); + m_vams_top_sizer->Add(m_vams_lib, 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, FromDIP(4)); m_vams_top_sizer->Add(m_vams_road, 0, wxALL, 0); //extra road @@ -2105,11 +2534,11 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons auto m_vams_tip = new wxStaticText(m_amswin, wxID_ANY, _L("Ext Spool")); m_vams_tip->SetFont(::Label::Body_12); m_vams_tip->SetBackgroundColour(*wxWHITE); - auto img_vams_tip = new wxStaticBitmap(m_amswin, wxID_ANY, create_scaled_bitmap("enable_ams", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); - img_vams_tip->SetBackgroundColour(*wxWHITE); - img_vams_tip->Bind(wxEVT_ENTER_WINDOW, [this, img_vams_tip](auto& e) { - wxPoint img_pos = img_vams_tip->ClientToScreen(wxPoint(0, 0)); - wxPoint popup_pos(img_pos.x, img_pos.y + img_vams_tip->GetRect().height); + m_img_vams_tip = new wxStaticBitmap(m_amswin, wxID_ANY, create_scaled_bitmap("enable_ams", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); + m_img_vams_tip->SetBackgroundColour(*wxWHITE); + m_img_vams_tip->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { + wxPoint img_pos = m_img_vams_tip->ClientToScreen(wxPoint(0, 0)); + wxPoint popup_pos(img_pos.x, img_pos.y + m_img_vams_tip->GetRect().height); m_ams_introduce_popup.set_mode(false); m_ams_introduce_popup.Position(popup_pos, wxSize(0, 0)); m_ams_introduce_popup.Popup(); @@ -2120,12 +2549,12 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons #endif // __WXMSW__ }); - img_vams_tip->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) { + m_img_vams_tip->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) { m_ams_introduce_popup.Dismiss(); }); m_sizer_vams_tips->Add(m_vams_tip, 0, wxTOP, FromDIP(5)); - m_sizer_vams_tips->Add(img_vams_tip, 0, wxALL, FromDIP(3)); + m_sizer_vams_tips->Add(m_img_vams_tip, 0, wxALL, FromDIP(3)); m_vams_extra_road = new AMSVirtualRoad(m_amswin, wxID_ANY); m_vams_extra_road->SetMinSize(wxSize(m_panel_virtual->GetSize().x + FromDIP(16), -1)); @@ -2309,7 +2738,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons UpdateStepCtrl(false); - m_button_extrusion_cali->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AMSControl::on_extrusion_cali), NULL, this); + //m_button_extrusion_cali->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AMSControl::on_extrusion_cali), NULL, this); m_button_extruder_feed->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AMSControl::on_filament_load), NULL, this); m_button_extruder_back->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AMSControl::on_filament_unload), NULL, this); @@ -2355,8 +2784,8 @@ void AMSControl::on_retry() void AMSControl::init_scaled_buttons() { - m_button_extrusion_cali->SetMinSize(wxSize(-1, FromDIP(24))); - m_button_extrusion_cali->SetCornerRadius(FromDIP(12)); + //m_button_extrusion_cali->SetMinSize(wxSize(-1, FromDIP(24))); + //m_button_extrusion_cali->SetCornerRadius(FromDIP(12)); m_button_extruder_feed->SetMinSize(wxSize(-1, FromDIP(24))); m_button_extruder_feed->SetCornerRadius(FromDIP(12)); m_button_extruder_back->SetMinSize(wxSize(-1, FromDIP(24))); @@ -2396,8 +2825,8 @@ wxColour AMSControl::GetCanColour(std::string amsid, std::string canid) void AMSControl::SetActionState(bool button_status[]) { - if (button_status[ActionButton::ACTION_BTN_CALI]) m_button_extrusion_cali->Enable(); - else m_button_extrusion_cali->Disable(); + /*if (button_status[ActionButton::ACTION_BTN_CALI]) m_button_extrusion_cali->Enable(); + else m_button_extrusion_cali->Disable();*/ if (button_status[ActionButton::ACTION_BTN_LOAD]) m_button_extruder_feed->Enable(); else m_button_extruder_feed->Disable(); @@ -2406,34 +2835,49 @@ void AMSControl::SetActionState(bool button_status[]) else m_button_extruder_back->Disable(); } -void AMSControl::EnterNoneAMSMode() +void AMSControl::EnterNoneAMSMode(bool support_vt_load) { - if(m_is_none_ams_mode) return; - m_simplebook_amsitems->Hide(); + m_vams_lib->m_ams_model = m_ext_model; + if(m_is_none_ams_mode == AMSModel::NO_AMS) return; m_panel_top->Hide(); - m_simplebook_amsitems->SetSelection(1); - m_simplebook_ams->SetSelection(1); + m_simplebook_amsitems->Hide(); + m_simplebook_amsitems->SetSelection(0); + + m_simplebook_ams->SetSelection(0); m_extruder->no_ams_mode(true); m_button_ams_setting->Hide(); m_button_guide->Hide(); - //m_button_retry->Hide(); - m_button_extruder_feed->Show(); - m_button_extruder_back->Show(); + if (support_vt_load) { + m_button_extruder_feed->Show(); + m_button_extruder_back->Show(); + } else { + m_button_extruder_feed->Hide(); + m_button_extruder_back->Hide(); + } ShowFilamentTip(false); m_amswin->Layout(); m_amswin->Fit(); Layout(); - m_is_none_ams_mode = true; + m_is_none_ams_mode = AMSModel::NO_AMS; } -void AMSControl::ExitNoneAMSMode() +void AMSControl::EnterGenericAMSMode() { - if(!m_is_none_ams_mode) return; - m_simplebook_amsitems->Show(); + m_vams_lib->m_ams_model = m_ext_model; + if(m_is_none_ams_mode == AMSModel::GENERIC_AMS) return; m_panel_top->Show(); - m_simplebook_ams->SetSelection(0); - m_simplebook_amsitems->SetSelection(0); + m_simplebook_amsitems->Show(); + m_simplebook_amsitems->SetSelection(1); + + m_vams_lib->m_ams_model = AMSModel::GENERIC_AMS; + m_ams_tip->SetLabel(_L("AMS")); + m_img_vams_tip->SetBitmap(create_scaled_bitmap("enable_ams", this, 16)); + m_img_vams_tip->Enable(); + m_img_amsmapping_tip->SetBitmap(create_scaled_bitmap("enable_ams", this, 16)); + m_img_amsmapping_tip->Enable(); + + m_simplebook_ams->SetSelection(1); m_extruder->no_ams_mode(false); m_button_ams_setting->Show(); m_button_guide->Show(); @@ -2444,7 +2888,39 @@ void AMSControl::ExitNoneAMSMode() m_amswin->Layout(); m_amswin->Fit(); Layout(); - m_is_none_ams_mode = false; + m_is_none_ams_mode = AMSModel::GENERIC_AMS; +} + +void AMSControl::EnterExtraAMSMode() +{ + m_vams_lib->m_ams_model = m_ext_model; + if(m_is_none_ams_mode == AMSModel::EXTRA_AMS) return; + m_panel_top->Hide(); + m_simplebook_amsitems->Show(); + m_simplebook_amsitems->SetSelection(1); + + + m_vams_lib->m_ams_model = AMSModel::EXTRA_AMS; + m_ams_tip->SetLabel(_L("AMS-Extra")); + m_img_vams_tip->SetBitmap(create_scaled_bitmap("enable_ams_disable", this, 16)); + m_img_vams_tip->Disable(); + m_img_amsmapping_tip->SetBitmap(create_scaled_bitmap("enable_ams_disable", this, 16)); + m_img_amsmapping_tip->Disable(); + + m_simplebook_ams->SetSelection(2); + m_extruder->no_ams_mode(false); + m_button_ams_setting->Show(); + m_button_guide->Show(); + m_button_retry->Show(); + m_button_extruder_feed->Show(); + m_button_extruder_back->Show(); + ShowFilamentTip(true); + m_amswin->Layout(); + m_amswin->Fit(); + Layout(); + Refresh(true); + m_is_none_ams_mode = AMSModel::EXTRA_AMS; + } void AMSControl::EnterCalibrationMode(bool read_to_calibration) @@ -2502,7 +2978,7 @@ void AMSControl::msw_rescale() m_extruder->msw_rescale(); m_vams_extra_road->msw_rescale(); - m_button_extrusion_cali->SetMinSize(wxSize(-1, FromDIP(24))); + //m_button_extrusion_cali->SetMinSize(wxSize(-1, FromDIP(24))); m_button_extruder_feed->SetMinSize(wxSize(-1, FromDIP(24))); m_button_extruder_back->SetMinSize(wxSize(-1, FromDIP(24))); m_button_ams_setting->SetMinSize(wxSize(FromDIP(25), FromDIP(24))); @@ -2521,56 +2997,58 @@ void AMSControl::msw_rescale() void AMSControl::UpdateStepCtrl(bool is_extrusion) { - m_filament_load_step->DeleteAllItems(); - m_filament_unload_step->DeleteAllItems(); - m_filament_vt_load_step->DeleteAllItems(); - - if(is_extrusion){ - wxString FILAMENT_LOAD_STEP_STRING[LOAD_STEP_COUNT] = { + wxString FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_COUNT] = { + _L("Idling..."), _L("Heat the nozzle"), _L("Cut filament"), _L("Pull back current filament"), _L("Push new filament into extruder"), _L("Purge old filament"), - }; - - for (int i = 0; i < LOAD_STEP_COUNT; i++) { - m_filament_load_step->AppendItem(FILAMENT_LOAD_STEP_STRING[i]); - } - }else{ - wxString FILAMENT_LOAD_STEP_STRING[LOAD_WITH_TEMP_STEP_COUNT] = { - _L("Heat the nozzle"), - _L("Push new filament into extruder"), - _L("Purge old filament"), - }; - - for (int i = 0; i < LOAD_WITH_TEMP_STEP_COUNT; i++) { - m_filament_load_step->AppendItem(FILAMENT_LOAD_STEP_STRING[i]); - } - } - - wxString VT_TRAY_LOAD_STEP_STRING[VT_LOAD_STEP_COUNT] = { - _L("Heat the nozzle"), - _L("Push new filament into the extruder"), - _L("Grab new filament"), - _L("Purge old filament"), + _L("Feed Filament"), + _L("Confirm extruded"), + _L("Check filament location") }; - wxString FILAMENT_UNLOAD_STEP_STRING[UNLOAD_STEP_COUNT] = { - _L("Heat the nozzle"), - _L("Cut filament"), - _L("Pull back current filament") - }; + m_filament_load_step->DeleteAllItems(); + m_filament_unload_step->DeleteAllItems(); + m_filament_vt_load_step->DeleteAllItems(); -// for (int i = 0; i < LOAD_STEP_COUNT; i++) { -// m_filament_load_step->AppendItem(FILAMENT_LOAD_STEP_STRING[i]); -// } - for (int i = 0; i < UNLOAD_STEP_COUNT; i++) { - m_filament_unload_step->AppendItem(FILAMENT_UNLOAD_STEP_STRING[i]); + if (m_ams_model == AMSModel::GENERIC_AMS) { + if (is_extrusion) { + m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); + m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT]); + m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PULL_CURR_FILAMENT]); + m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PUSH_NEW_FILAMENT]); + m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PURGE_OLD_FILAMENT]); + } + else { + m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); + m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PUSH_NEW_FILAMENT]); + m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PURGE_OLD_FILAMENT]); + } + + m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); + m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT]); + m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PULL_CURR_FILAMENT]); } - for (int i = 0; i < VT_LOAD_STEP_COUNT; i++) { - m_filament_vt_load_step->AppendItem(VT_TRAY_LOAD_STEP_STRING[i]); + else if (m_ams_model == AMSModel::EXTRA_AMS) { + m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); + m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CHECK_POSITION]); + m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT]); + m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PULL_CURR_FILAMENT]); + m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PUSH_NEW_FILAMENT]); + m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PURGE_OLD_FILAMENT]); + + m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); + m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CHECK_POSITION]); + m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT]); + m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PULL_CURR_FILAMENT]); } + + m_filament_vt_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); + m_filament_vt_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PUSH_NEW_FILAMENT]); + m_filament_vt_load_step->AppendItem( _L("Grab new filament")); + m_filament_vt_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PURGE_OLD_FILAMENT]); } void AMSControl::CreateAms() @@ -2587,7 +3065,13 @@ void AMSControl::CreateAms() std::vector ams_info{ams1, ams2, ams3, ams4}; std::vector::iterator it; Freeze(); - for (it = ams_info.begin(); it != ams_info.end(); it++) { AddAms(*it, true); } + for (it = ams_info.begin(); it != ams_info.end(); it++) { + AddAmsItems(*it); + AddAms(*it); + AddExtraAms(*it); + m_ams_info.push_back(*it); + } + m_sizer_top->Layout(); Thaw(); } @@ -2606,25 +3090,24 @@ void AMSControl::Reset() std::vector ams_info{ams1, ams2, ams3, ams4}; std::vector::iterator it; - UpdateAms(ams_info, false, false, true); + UpdateAms(ams_info, false, true); m_current_show_ams = ""; m_current_ams = ""; m_current_senect = ""; } -void AMSControl::show_noams_mode(bool show, bool support_virtual_tray, bool support_extrustion_cali) +void AMSControl::show_noams_mode() { - show_vams(support_virtual_tray); - m_sizer_ams_tips->Show(support_virtual_tray); + show_vams(true); + m_sizer_ams_tips->Show(true); - if (!support_extrustion_cali) - m_button_extrusion_cali->Hide(); - else { - //m_button_extrusion_cali->Show(); - m_button_extrusion_cali->Hide(); + if (m_ams_model == AMSModel::NO_AMS) { + EnterNoneAMSMode(); + } else if(m_ams_model == AMSModel::GENERIC_AMS){ + EnterGenericAMSMode(); + } else if (m_ams_model == AMSModel::EXTRA_AMS) { + EnterExtraAMSMode(); } - - show?ExitNoneAMSMode() : EnterNoneAMSMode(); } void AMSControl::show_auto_refill(bool show) @@ -2695,7 +3178,7 @@ void AMSControl::reset_vams() } -void AMSControl::UpdateAms(std::vector info, bool keep_selection, bool has_extrusion_cali, bool is_reset) +void AMSControl::UpdateAms(std::vector info, bool keep_selection, bool is_reset) { std::string curr_ams_id = GetCurentAms(); std::string curr_can_id = GetCurrentCan(curr_ams_id); @@ -2705,6 +3188,12 @@ void AMSControl::UpdateAms(std::vector info, bool keep_selection, bool // update item m_ams_info = info; + if (m_ams_model == AMSModel::GENERIC_AMS){ + m_ams_cans_list = m_ams_generic_cans_list; + } + else if (m_ams_model == AMSModel::EXTRA_AMS) { + m_ams_cans_list = m_ams_extra_cans_list; + } if (info.size() > 1) { m_simplebook_amsitems->Show(); @@ -2738,7 +3227,7 @@ void AMSControl::UpdateAms(std::vector info, bool keep_selection, bool if (ifo.ams_id == cans->amsIndex) { cans->amsCans->m_info = ifo; cans->amsCans->Update(ifo); - cans->amsCans->show_sn_value(true); + cans->amsCans->show_sn_value(m_ams_model == AMSModel::EXTRA_AMS?false:true); } } } @@ -2750,37 +3239,46 @@ void AMSControl::UpdateAms(std::vector info, bool keep_selection, bool } } -void AMSControl::AddAms(AMSinfo info, bool refresh) +void AMSControl::AddAmsItems(AMSinfo info) { - if (m_ams_count >= AMS_CONTROL_MAX_COUNT) return; - - // item auto amsitem = new AMSItem(m_panel_top, wxID_ANY, info); - amsitem->Bind(wxEVT_LEFT_DOWN, [this, amsitem](wxMouseEvent &e) { + amsitem->Bind(wxEVT_LEFT_DOWN, [this, amsitem](wxMouseEvent& e) { SwitchAms(amsitem->m_amsinfo.ams_id); e.Skip(); - }); + }); - AmsItems *item = new AmsItems(); + AmsItems* item = new AmsItems(); item->amsIndex = info.ams_id; - item->amsItem = amsitem; + item->amsItem = amsitem; m_ams_item_list.Add(item); - m_sizer_top->Add(amsitem, 0, wxALIGN_CENTER|wxRIGHT, 6); + m_sizer_top->Add(amsitem, 0, wxALIGN_CENTER | wxRIGHT, 6); +} - AmsCansWindow *canswin = new AmsCansWindow(); - auto amscans = new AmsCans(m_simplebook_cans, wxID_ANY, info); +void AMSControl::AddAms(AMSinfo info) +{ + AmsCansWindow* canswin = new AmsCansWindow(); + auto amscans = new AmsCans(m_simplebook_generic_cans, info, AMSModel::GENERIC_AMS); canswin->amsIndex = info.ams_id; - canswin->amsCans = amscans; - m_ams_cans_list.Add(canswin); + canswin->amsCans = amscans; + m_ams_generic_cans_list.Add(canswin); - m_simplebook_cans->AddPage(amscans, wxEmptyString, false); - amscans->m_selection = m_simplebook_cans->GetPageCount() - 1; + m_simplebook_generic_cans->AddPage(amscans, wxEmptyString, false); + amscans->m_selection = m_simplebook_generic_cans->GetPageCount() - 1; +} - if (refresh) { m_sizer_top->Layout(); } - m_ams_count++; - m_ams_info.push_back(info); +void AMSControl::AddExtraAms(AMSinfo info) +{ + AmsCansWindow* canswin = new AmsCansWindow(); + auto amscans = new AmsCans(m_simplebook_extra_cans, info, AMSModel::EXTRA_AMS); + + canswin->amsIndex = info.ams_id; + canswin->amsCans = amscans; + m_ams_extra_cans_list.Add(canswin); + + m_simplebook_extra_cans->AddPage(amscans, wxEmptyString, false); + amscans->m_selection = m_simplebook_extra_cans->GetPageCount() - 1; } void AMSControl::SwitchAms(std::string ams_id) @@ -2817,7 +3315,13 @@ void AMSControl::SwitchAms(std::string ams_id) for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { AmsCansWindow *cans = m_ams_cans_list[i]; if (cans->amsCans->m_info.ams_id == ams_id) { - m_simplebook_cans->SetSelection(cans->amsCans->m_selection); + + if (m_ams_model == AMSModel::GENERIC_AMS) { + m_simplebook_generic_cans->SetSelection(cans->amsCans->m_selection); + } + else if (m_ams_model == AMSModel::EXTRA_AMS) { + m_simplebook_extra_cans->SetSelection(cans->amsCans->m_selection); + } } } @@ -2841,8 +3345,21 @@ void AMSControl::SwitchAms(std::string ams_id) } } -void AMSControl::SetFilamentStep(int item_idx, FilamentStepType f_type, bool is_extrusion_exist) +void AMSControl::SetFilamentStep(int item_idx, FilamentStepType f_type) { + wxString FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_COUNT] = { + _L("Idling..."), + _L("Heat the nozzle"), + _L("Cut filament"), + _L("Pull back current filament"), + _L("Push new filament into extruder"), + _L("Purge old filament"), + _L("Feed Filament"), + _L("Confirm extruded"), + _L("Check filament location") + }; + + if (item_idx == FilamentStep::STEP_IDLE) { m_simplebook_right->SetSelection(0); m_filament_load_step->Idle(); @@ -2851,12 +3368,18 @@ void AMSControl::SetFilamentStep(int item_idx, FilamentStepType f_type, bool is_ return; } + wxString step_str = wxEmptyString; + if (item_idx < FilamentStep::STEP_COUNT) { + step_str = FILAMENT_CHANGE_STEP_STRING[item_idx]; + } + if (f_type == FilamentStepType::STEP_TYPE_LOAD) { if (item_idx > 0 && item_idx < FilamentStep::STEP_COUNT) { if (m_simplebook_right->GetSelection() != 1) { m_simplebook_right->SetSelection(1); } - m_filament_load_step->SelectItem(item_idx - 1); + + m_filament_load_step->SelectItem( m_filament_load_step->GetItemUseText(step_str) ); } else { m_filament_load_step->Idle(); } @@ -2865,24 +3388,20 @@ void AMSControl::SetFilamentStep(int item_idx, FilamentStepType f_type, bool is_ if (m_simplebook_right->GetSelection() != 2) { m_simplebook_right->SetSelection(2); } - m_filament_unload_step->SelectItem(item_idx - 1); + m_filament_unload_step->SelectItem( m_filament_unload_step->GetItemUseText(step_str) ); } else { m_filament_unload_step->Idle(); } } else if (f_type == FilamentStepType::STEP_TYPE_VT_LOAD) { m_simplebook_right->SetSelection(3); - if (item_idx == STEP_HEAT_NOZZLE) { - m_filament_vt_load_step->SelectItem(0); - } - else if (item_idx == STEP_FEED_FILAMENT) { - m_filament_vt_load_step->SelectItem(1); - } - else if (item_idx == STEP_CONFIRM_EXTRUDED) { - m_filament_vt_load_step->SelectItem(2); - } - else if (item_idx == STEP_PURGE_OLD_FILAMENT) { - m_filament_vt_load_step->SelectItem(3); + if (item_idx > 0 && item_idx < FilamentStep::STEP_COUNT) { + if (item_idx == STEP_CONFIRM_EXTRUDED) { + m_filament_vt_load_step->SelectItem(2); + } + else { + m_filament_vt_load_step->SelectItem( m_filament_vt_load_step->GetItemUseText(step_str) ); + } } else { m_filament_vt_load_step->Idle(); @@ -2890,7 +3409,7 @@ void AMSControl::SetFilamentStep(int item_idx, FilamentStepType f_type, bool is_ } else { if (item_idx > 0 && item_idx < FilamentStep::STEP_COUNT) { m_simplebook_right->SetSelection(1); - m_filament_load_step->SelectItem(item_idx - 1); + m_filament_load_step->SelectItem( m_filament_load_step->GetItemUseText(step_str) ); } else { m_filament_load_step->Idle(); @@ -2914,14 +3433,6 @@ void AMSControl::ShowFilamentTip(bool hasams) m_tip_load_info->SetMinSize(AMS_STEP_SIZE); } -void AMSControl::SetHumidity(std::string amsid, int humidity) -{ - for (auto i = 0; i < m_ams_item_list.GetCount(); i++) { - AmsItems *item = m_ams_item_list[i]; - if (amsid == item->amsItem->m_amsinfo.ams_id) { item->amsItem->SetHumidity(humidity); } - } -} - bool AMSControl::Enable(bool enable) { for (auto i = 0; i < m_ams_item_list.GetCount(); i++) { @@ -2933,7 +3444,7 @@ bool AMSControl::Enable(bool enable) AmsCansWindow *cans = m_ams_cans_list[i]; cans->amsCans->Enable(enable); } - m_button_extrusion_cali->Enable(enable); + //m_button_extrusion_cali->Enable(enable); m_button_extruder_feed->Enable(enable); m_button_extruder_back->Enable(enable); m_button_ams_setting->Enable(enable); @@ -2942,28 +3453,63 @@ bool AMSControl::Enable(bool enable) return wxWindow::Enable(enable); } -void AMSControl::SetExtruder(bool on_off, bool is_vams, wxColour col) +void AMSControl::SetExtruder(bool on_off, bool is_vams, std::string ams_now, wxColour col) { - if (!on_off) { - m_extruder->TurnOff(); - m_vams_extra_road->OnVamsLoading(false); - m_extruder->OnVamsLoading(false); - m_vams_road->OnVamsLoading(false); - } else { - m_extruder->TurnOn(col); - m_extruder->OnAmsLoading(true, col); - } + if (m_ams_model == AMSModel::GENERIC_AMS || m_ext_model == AMSModel::GENERIC_AMS ) { + if (!on_off) { + m_extruder->TurnOff(); + m_vams_extra_road->OnVamsLoading(false); + m_extruder->OnVamsLoading(false); + m_vams_road->OnVamsLoading(false); + } + else { + m_extruder->TurnOn(col); - if (is_vams && on_off) { - m_extruder->OnAmsLoading(false, col); - m_vams_extra_road->OnVamsLoading(true, col); - m_extruder->OnVamsLoading(true, col); - m_vams_road->OnVamsLoading(true, col); + if (ams_now != GetCurentShowAms()) { + m_extruder->OnAmsLoading(false, col); + } + else { + m_extruder->OnAmsLoading(true, col); + } + } + + if (is_vams && on_off) { + m_extruder->OnAmsLoading(false, col); + m_vams_extra_road->OnVamsLoading(true, col); + m_extruder->OnVamsLoading(true, col); + m_vams_road->OnVamsLoading(true, col); + } + else { + m_vams_extra_road->OnVamsLoading(false, col); + m_extruder->OnVamsLoading(false, col); + m_vams_road->OnVamsLoading(false, col); + } } - else { - m_vams_extra_road->OnVamsLoading(false, col); - m_extruder->OnVamsLoading(false, col); - m_vams_road->OnVamsLoading(false, col); + else if (m_ams_model == AMSModel::EXTRA_AMS || m_ext_model == AMSModel::EXTRA_AMS) { + if (!is_vams && !on_off) { + m_extruder->TurnOff(); + m_extruder->OnVamsLoading(false); + m_extruder->OnAmsLoading(false); + + m_vams_extra_road->OnVamsLoading(false); + m_vams_road->OnVamsLoading(false); + } + else { + m_extruder->TurnOn(col); + m_extruder->OnAmsLoading(true, col); + } + + if (is_vams && on_off) { + m_extruder->OnAmsLoading(false, col); + m_vams_extra_road->OnVamsLoading(true, col); + m_extruder->OnVamsLoading(true, col); + m_vams_road->OnVamsLoading(true, col); + } + else { + m_vams_extra_road->OnVamsLoading(false, col); + m_extruder->OnVamsLoading(false, col); + m_vams_road->OnVamsLoading(false, col); + } } } @@ -2996,29 +3542,34 @@ void AMSControl::SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadTy m_last_tray_id = canid; - if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); - m_extruder->OnAmsLoading(false); - } + if (m_ams_model == AMSModel::GENERIC_AMS) { + if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { + cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + m_extruder->OnAmsLoading(false); + } - if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1) { - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); - m_extruder->OnAmsLoading(false); - } + if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1) { + cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); + m_extruder->OnAmsLoading(false); + } - if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2) { - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); - if (m_current_show_ams == ams_id) { + if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2) { + cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); + cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); + if (m_current_show_ams == ams_id) { + m_extruder->OnAmsLoading(true, cans->amsCans->GetTagColr(canid)); + } + } + + if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3) { + cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); + cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); + cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_3); m_extruder->OnAmsLoading(true, cans->amsCans->GetTagColr(canid)); - } + } } - - if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3) { - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_3); - m_extruder->OnAmsLoading(true, cans->amsCans->GetTagColr(canid)); + else if (m_ams_model == AMSModel::EXTRA_AMS) { + cans->amsCans->SetAmsStepExtra(canid, type, step); } for (auto i = 0; i < m_ams_info.size(); i++) { diff --git a/src/slic3r/GUI/Widgets/AMSControl.hpp b/src/slic3r/GUI/Widgets/AMSControl.hpp index bf74d0a11d..1d25ca299d 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.hpp +++ b/src/slic3r/GUI/Widgets/AMSControl.hpp @@ -13,6 +13,7 @@ #include #include + #define AMS_CONTROL_BRAND_COLOUR wxColour(0, 174, 66) #define AMS_CONTROL_GRAY700 wxColour(107, 107, 107) #define AMS_CONTROL_GRAY800 wxColour(50, 58, 61) @@ -35,6 +36,12 @@ namespace Slic3r { namespace GUI { +enum AMSModel { + NO_AMS = 0, + GENERIC_AMS = 1, + EXTRA_AMS = 2 +}; + enum ActionButton { ACTION_BTN_CALI = 0, ACTION_BTN_LOAD = 1, @@ -105,6 +112,7 @@ enum FilamentStep { STEP_PURGE_OLD_FILAMENT, STEP_FEED_FILAMENT, STEP_CONFIRM_EXTRUDED, + STEP_CHECK_POSITION, STEP_COUNT, }; @@ -118,11 +126,11 @@ enum FilamentStepType { #define AMS_ITEM_SIZE wxSize(FromDIP(82), FromDIP(27)) #define AMS_ITEM_HUMIDITY_SIZE wxSize(FromDIP(120), FromDIP(27)) #define AMS_CAN_LIB_SIZE wxSize(FromDIP(58), FromDIP(80)) -#define AMS_CAN_ROAD_SIZE wxSize(FromDIP(66), FromDIP(60)) +#define AMS_CAN_ROAD_SIZE wxSize(FromDIP(66), FromDIP(70)) #define AMS_CAN_ITEM_HEIGHT_SIZE FromDIP(27) -#define AMS_CANS_SIZE wxSize(FromDIP(284), FromDIP(186)) -#define AMS_CANS_WINDOW_SIZE wxSize(FromDIP(264), FromDIP(186)) -#define AMS_STEP_SIZE wxSize(FromDIP(172), FromDIP(186)) +#define AMS_CANS_SIZE wxSize(FromDIP(284), FromDIP(196)) +#define AMS_CANS_WINDOW_SIZE wxSize(FromDIP(264), FromDIP(196)) +#define AMS_STEP_SIZE wxSize(FromDIP(172), FromDIP(196)) #define AMS_REFRESH_SIZE wxSize(FromDIP(30), FromDIP(30)) #define AMS_EXTRUDER_SIZE wxSize(FromDIP(86), FromDIP(72)) #define AMS_EXTRUDER_BITMAP_SIZE wxSize(FromDIP(36), FromDIP(55)) @@ -161,8 +169,8 @@ class AMSrefresh : public wxWindow { public: AMSrefresh(); - AMSrefresh(wxWindow *parent, wxWindowID id, wxString number, Caninfo info, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); - AMSrefresh(wxWindow *parent, wxWindowID id, int number, Caninfo info, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); + AMSrefresh(wxWindow *parent, wxString number, Caninfo info, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); + AMSrefresh(wxWindow *parent, int number, Caninfo info, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); ~AMSrefresh(); void PlayLoading(); void StopLoading(); @@ -243,7 +251,7 @@ public: void has_ams(bool hams) {m_has_vams = hams; Refresh();}; void no_ams_mode(bool mode) {m_none_ams_mode = mode; Refresh();}; - bool m_none_ams_mode{false}; + bool m_none_ams_mode{true}; bool m_has_vams{false}; bool m_vams_loading{false}; bool m_ams_loading{false}; @@ -284,13 +292,15 @@ Description:AMSLib class AMSLib : public wxWindow { public: - AMSLib(wxWindow *parent, wxWindowID id, Caninfo info, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); + AMSLib(wxWindow *parent, Caninfo info); void create(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); public: wxColour GetLibColour(); Caninfo m_info; MachineObject* m_obj = {nullptr}; - int m_can_index; + int m_can_index = 0; + AMSModel m_ams_model; + void Update(Caninfo info, bool refresh = true); void UnableSelected() { m_unable_selected = true; }; void EableSelected() { m_unable_selected = false; }; @@ -303,7 +313,7 @@ public: virtual bool Enable(bool enable = true); void set_disable_mode(bool disable) { m_disable_mode = disable; } void msw_rescale(); - + void on_pass_road(bool pass); protected: wxStaticBitmap *m_edit_bitmp = {nullptr}; @@ -314,6 +324,15 @@ protected: ScalableBitmap m_bitmap_readonly_light; ScalableBitmap m_bitmap_transparent; + ScalableBitmap m_bitmap_extra_tray_left; + ScalableBitmap m_bitmap_extra_tray_right; + + ScalableBitmap m_bitmap_extra_tray_left_hover; + ScalableBitmap m_bitmap_extra_tray_right_hover; + + ScalableBitmap m_bitmap_extra_tray_left_selected; + ScalableBitmap m_bitmap_extra_tray_right_selected; + bool m_unable_selected = {false}; bool m_enable = {false}; bool m_selected = {false}; @@ -326,13 +345,18 @@ protected: wxColour m_road_def_color; wxColour m_lib_color; bool m_disable_mode{ false }; + bool m_pass_road{false}; void on_enter_window(wxMouseEvent &evt); void on_leave_window(wxMouseEvent &evt); void on_left_down(wxMouseEvent &evt); void paintEvent(wxPaintEvent &evt); void render(wxDC &dc); - void doRender(wxDC &dc); + void render_extra_text(wxDC& dc); + void render_generic_text(wxDC& dc); + void doRender(wxDC& dc); + void render_extra_lib(wxDC& dc); + void render_generic_lib(wxDC& dc); }; /************************************************* @@ -364,9 +388,11 @@ public: ScalableBitmap ams_humidity_3; ScalableBitmap ams_humidity_4; + int m_humidity = { 0 }; bool m_show_humidity = { false }; bool m_vams_loading{false}; + AMSModel m_ams_model; void OnVamsLoading(bool load, wxColour col = AMS_CONTROL_GRAY500); void SetPassRoadColour(wxColour col); @@ -399,9 +425,6 @@ public: void OnLeaveWindow(wxMouseEvent &evt); void OnSelected(); void UnSelected(); - void ShowHumidity(); - void HideHumidity(); - void SetHumidity(int humidity); virtual bool Enable(bool enable = true); AMSinfo m_amsinfo; @@ -413,8 +436,6 @@ protected: int m_space = {5}; bool m_hover = {false}; bool m_selected = {false}; - bool m_show_humidity = {false}; - int m_humidity = {0}; ScalableBitmap* m_ts_bitmap_cube; void paintEvent(wxPaintEvent &evt); @@ -455,32 +476,45 @@ class AmsCans : public wxWindow { public: AmsCans(); - AmsCans(wxWindow *parent, wxWindowID id, AMSinfo info, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); + AmsCans(wxWindow *parent, AMSinfo info, AMSModel model); void Update(AMSinfo info); - void create(wxWindow *parent, wxWindowID id, AMSinfo info, const wxPoint &pos, const wxSize &size); - void AddCan(Caninfo caninfo, int canindex, int maxcan); + void create(wxWindow *parent); + void AddCan(Caninfo caninfo, int canindex, int maxcan, wxBoxSizer* sizer); void SetDefSelectCan(); void SelectCan(std::string canid); - wxColour GetTagColr(wxString canid); - void SetAmsStep(wxString canid, AMSPassRoadType type, AMSPassRoadSTEP step); - //wxColour GetCanColour(wxString canid); void PlayRridLoading(wxString canid); void StopRridLoading(wxString canid); void msw_rescale(); void show_sn_value(bool show); + void SetAmsStepExtra(wxString canid, AMSPassRoadType type, AMSPassRoadSTEP step); + void SetAmsStep(wxString canid, AMSPassRoadType type, AMSPassRoadSTEP step); + void SetAmsStep(std::string can_id); + void paintEvent(wxPaintEvent& evt); + void render(wxDC& dc); + void doRender(wxDC& dc); + wxColour GetTagColr(wxString canid); std::string GetCurrentCan(); public: + ScalableBitmap m_bitmap_extra_framework; + int m_canlib_selection = { -1 }; + int m_selection = { 0 }; + int m_can_count = { 0 }; + AMSModel m_ams_model; std::string m_canlib_id; - int m_canlib_selection = {-1}; - int m_selection = {0}; - int m_can_count = {0}; + + std::string m_road_canid; + wxColour m_road_colour; + CanLibsHash m_can_lib_list; CansRoadsHash m_can_road_list; CanrefreshsHash m_can_refresh_list; AMSinfo m_info; wxBoxSizer * sizer_can = {nullptr}; + wxBoxSizer * sizer_can_middle = {nullptr}; + wxBoxSizer * sizer_can_left = {nullptr}; + wxBoxSizer * sizer_can_right = {nullptr}; AMSPassRoadSTEP m_step = {AMSPassRoadSTEP ::AMS_ROAD_STEP_NONE}; }; @@ -532,16 +566,16 @@ public: void init_scaled_buttons(); protected: - int m_ams_count = {0}; - - std::map m_ams_selection; - std::vector m_ams_info; - std::string m_current_ams; std::string m_current_show_ams; - + std::map m_ams_selection; + AmsItemsHash m_ams_item_list; + + std::vector m_ams_info; AmsCansHash m_ams_cans_list; + AmsCansHash m_ams_generic_cans_list; + AmsCansHash m_ams_extra_cans_list; AMSextruder *m_extruder = {nullptr}; @@ -551,7 +585,10 @@ protected: wxSimplebook *m_simplebook_calibration = {nullptr}; wxSimplebook *m_simplebook_amsitems = {nullptr}; wxSimplebook *m_simplebook_ams = {nullptr}; - wxSimplebook *m_simplebook_cans = {nullptr}; + + wxSimplebook *m_simplebook_generic_cans= {nullptr}; + wxSimplebook *m_simplebook_extra_cans = {nullptr}; + wxSimplebook *m_simplebook_bottom = {nullptr}; wxStaticText *m_tip_right_top = {nullptr}; @@ -564,6 +601,8 @@ protected: wxBoxSizer* m_sizer_vams_tips = {nullptr}; Label* m_ams_backup_tip = {nullptr}; + Label* m_ams_tip = {nullptr}; + Caninfo m_vams_info; StaticBox* m_panel_virtual = {nullptr}; AMSLib* m_vams_lib = {nullptr}; @@ -584,6 +623,8 @@ protected: Button *m_button_extruder_back = {nullptr}; wxStaticBitmap* m_button_ams_setting = {nullptr}; wxStaticBitmap* m_img_ams_backup = {nullptr}; + wxStaticBitmap* m_img_amsmapping_tip = {nullptr}; + wxStaticBitmap* m_img_vams_tip = {nullptr}; ScalableBitmap m_button_ams_setting_normal; ScalableBitmap m_button_ams_setting_hover; ScalableBitmap m_button_ams_setting_press; @@ -597,16 +638,23 @@ protected: std::string m_last_ams_id; std::string m_last_tray_id; + public: std::string GetCurentAms(); std::string GetCurentShowAms(); std::string GetCurrentCan(std::string amsid); wxColour GetCanColour(std::string amsid, std::string canid); - bool m_is_none_ams_mode{false}; + AMSModel m_ams_model{AMSModel::NO_AMS}; + AMSModel m_ext_model{AMSModel::NO_AMS}; + AMSModel m_is_none_ams_mode{AMSModel::NO_AMS}; + + void SetAmsModel(AMSModel mode, AMSModel ext_mode) {m_ams_model = mode; m_ext_model = ext_mode;}; + void SetActionState(bool button_status[]); - void EnterNoneAMSMode(); - void ExitNoneAMSMode(); + void EnterNoneAMSMode(bool support_vt_load = false); + void EnterGenericAMSMode(); + void EnterExtraAMSMode(); void EnterCalibrationMode(bool read_to_calibration); void ExitcClibrationMode(); @@ -617,15 +665,16 @@ public: void PlayRridLoading(wxString amsid, wxString canid); void StopRridLoading(wxString amsid, wxString canid); - void SetFilamentStep(int item_idx, FilamentStepType f_type, bool is_extrusion_exist = false); + void SetFilamentStep(int item_idx, FilamentStepType f_type); void ShowFilamentTip(bool hasams = true); - void SetHumidity(std::string amsid, int humidity); void UpdateStepCtrl(bool is_extrusion_exist); void CreateAms(); - void UpdateAms(std::vector info, bool keep_selection = true, bool has_extrusion_cali = true, bool is_reset = false); - void AddAms(AMSinfo info, bool refresh = true); - void SetExtruder(bool on_off, bool is_vams, wxColour col); + void UpdateAms(std::vector info, bool keep_selection = true, bool is_reset = false); + void AddAms(AMSinfo info); + void AddAmsItems(AMSinfo info); + void AddExtraAms(AMSinfo info); + void SetExtruder(bool on_off, bool is_vams, std::string ams_now, wxColour col); void SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadType type, AMSPassRoadSTEP step); void SwitchAms(std::string ams_id); @@ -639,7 +688,7 @@ public: void on_clibration_cancel_click(wxMouseEvent &event); void Reset(); - void show_noams_mode(bool show, bool support_virtual_tray, bool support_extrustion_cali); + void show_noams_mode(); void show_auto_refill(bool show); void show_vams(bool show); void show_vams_kn_value(bool show); diff --git a/src/slic3r/GUI/Widgets/StepCtrl.cpp b/src/slic3r/GUI/Widgets/StepCtrl.cpp index c7071a564d..d9a3349fb2 100644 --- a/src/slic3r/GUI/Widgets/StepCtrl.cpp +++ b/src/slic3r/GUI/Widgets/StepCtrl.cpp @@ -87,6 +87,19 @@ wxString StepCtrlBase::GetItemText(unsigned int item) const return item < steps.size() ? steps[item] : wxString{}; } +int StepCtrlBase::GetItemUseText(wxString txt) const +{ + for(int i = 0; i < steps.size(); i++){ + if (steps[i] == txt) { + return i; + } + else { + continue; + } + } + return 0; +} + void StepCtrlBase::SetItemText(unsigned int item, wxString const &value) { if (item >= steps.size()) return; diff --git a/src/slic3r/GUI/Widgets/StepCtrl.hpp b/src/slic3r/GUI/Widgets/StepCtrl.hpp index c7c5ebd475..63df3625ee 100644 --- a/src/slic3r/GUI/Widgets/StepCtrl.hpp +++ b/src/slic3r/GUI/Widgets/StepCtrl.hpp @@ -53,7 +53,8 @@ public: void Idle(); wxString GetItemText(unsigned int item) const; - void SetItemText(unsigned int item, wxString const &value); + int GetItemUseText(wxString txt) const; + void SetItemText(unsigned int item, wxString const& value); private: // some useful events