diff --git a/resources/images/go_last_plate.svg b/resources/images/go_last_plate.svg new file mode 100644 index 000000000..b5192f277 --- /dev/null +++ b/resources/images/go_last_plate.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/resources/images/go_next_plate.svg b/resources/images/go_next_plate.svg new file mode 100644 index 000000000..cf7ee8a4c --- /dev/null +++ b/resources/images/go_next_plate.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/libslic3r/Format/bbs_3mf.cpp b/src/libslic3r/Format/bbs_3mf.cpp index 5a72510a3..cc9dcb511 100644 --- a/src/libslic3r/Format/bbs_3mf.cpp +++ b/src/libslic3r/Format/bbs_3mf.cpp @@ -3188,6 +3188,11 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) bool _BBS_3MF_Importer::_handle_end_object() { + if (!m_load_model) { + delete m_curr_object; + m_curr_object = nullptr; + return true; + } if (!m_curr_object || (m_curr_object->id == -1)) { add_error("Found invalid object"); return false; diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 37f92ddfe..0f521458b 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -1390,21 +1390,28 @@ void MachineObject::parse_version_func() is_support_ai_monitoring = true; is_support_ams_humidity = true; } - if (firmware_type == PrinterFirmwareType::FIRMWARE_TYPE_ENGINEER) - local_use_ssl = false; - else { - local_use_ssl = ota_version->second.sw_ver.compare("01.03.01.04") >= 0; + + if (firmware_type == PrinterFirmwareType::FIRMWARE_TYPE_ENGINEER) { + local_use_ssl_for_mqtt = false; + local_use_ssl_for_ftp = true; + }else { + local_use_ssl_for_mqtt = ota_version->second.sw_ver.compare("01.03.01.04") >= 0; + local_use_ssl_for_ftp = true; } + is_support_remote_tunnel = true; local_camera_proto = (ota_version->second.sw_ver.compare("01.03.01.04") >= 0 || (rv1126_version != module_vers.end() && rv1126_version->second.sw_ver.compare("00.00.20.39") >= 0)) ? 2 : 0; } } else if (printer_type == "C11") { - if (firmware_type == PrinterFirmwareType::FIRMWARE_TYPE_ENGINEER) - local_use_ssl = false; - else { - local_use_ssl = true; + if (firmware_type == PrinterFirmwareType::FIRMWARE_TYPE_ENGINEER) { + local_use_ssl_for_mqtt = false; + local_use_ssl_for_ftp = false; + } else { + local_use_ssl_for_mqtt = true; + local_use_ssl_for_ftp = true; } + is_cloud_print_only = true; if (ota_version != module_vers.end()) { is_support_send_to_sdcard = ota_version->second.sw_ver.compare("01.02.00.00") >= 0; @@ -1415,6 +1422,16 @@ void MachineObject::parse_version_func() if (esp32_version != module_vers.end()) { ams_support_auto_switch_filament_flag = esp32_version->second.sw_ver.compare("00.03.11.50") >= 0; } + } else if (printer_type == "C12") { + is_support_ai_monitoring = true; + if (firmware_type == PrinterFirmwareType::FIRMWARE_TYPE_ENGINEER) { + local_use_ssl_for_mqtt = false; + local_use_ssl_for_ftp = false; + } + else { + local_use_ssl_for_mqtt = true; + local_use_ssl_for_ftp = true; + } } } @@ -2146,8 +2163,9 @@ void MachineObject::set_print_state(std::string status) print_status = status; } -int MachineObject::connect(bool is_anonymous) +int MachineObject::connect(bool is_anonymous, bool use_openssl) { + if (dev_ip.empty()) return -1; std::string username; std::string password; if (!is_anonymous) { @@ -2735,10 +2753,10 @@ int MachineObject::parse_json(std::string payload) /* get fimware type */ try { - if (jj.contains("lifecycle")) { - if (jj["lifecycle"].get() == "engineer") + if (jj.contains("mess_production_state")) { + if (jj["mess_production_state"].get() == "engineer") firmware_type = PrinterFirmwareType::FIRMWARE_TYPE_ENGINEER; - else if (jj["lifecycle"].get() == "product") + else if (jj["mess_production_state"].get() == "product") firmware_type = PrinterFirmwareType::FIRMWARE_TYPE_PRODUCTION; } } @@ -3949,9 +3967,10 @@ void DeviceManager::on_machine_alive(std::string json_str) /* update userMachineList info */ auto it = userMachineList.find(dev_id); if (it != userMachineList.end()) { - it->second->dev_ip = dev_ip; - it->second->bind_state = bind_state; - it->second->bind_sec_link = sec_link; + it->second->dev_ip = dev_ip; + it->second->bind_state = bind_state; + it->second->bind_sec_link = sec_link; + it->second->dev_connection_type = connect_type; } /* update localMachineList */ @@ -4150,7 +4169,7 @@ bool DeviceManager::set_selected_machine(std::string dev_id, bool need_disconnec if (last_selected->second->is_connecting() && !need_disconnect) return false; - if (!need_disconnect) {m_agent->disconnect_printer();} + if (!need_disconnect) {m_agent->disconnect_printer(); } } } @@ -4166,7 +4185,7 @@ bool DeviceManager::set_selected_machine(std::string dev_id, bool need_disconnec if (m_agent) { if (!need_disconnect) {m_agent->disconnect_printer();} it->second->reset(); - it->second->connect(); + it->second->connect(false, it->second->local_use_ssl_for_mqtt); it->second->set_lan_mode_connection_state(true); } } @@ -4182,7 +4201,7 @@ bool DeviceManager::set_selected_machine(std::string dev_id, bool need_disconnec } } else { it->second->reset(); - it->second->connect(); + it->second->connect(false, it->second->local_use_ssl_for_mqtt); it->second->set_lan_mode_connection_state(true); } } diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 44b4c0152..780473bf7 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -410,6 +410,8 @@ public: std::string dev_ip; std::string dev_id; bool local_use_ssl { false }; + bool local_use_ssl_for_mqtt { false }; + bool local_use_ssl_for_ftp { false }; float nozzle_diameter { 0.0f }; std::string dev_connection_type; /* lan | cloud */ std::string connection_type() { return dev_connection_type; } @@ -662,7 +664,7 @@ public: std::vector hms_list; /* machine mqtt apis */ - int connect(bool is_anonymous = false); + int connect(bool is_anonymous = false, bool use_openssl = true); int disconnect(); json_diff print_json; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index aa5051bc7..2301039dd 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -1881,7 +1881,7 @@ void GUI_App::init_networking_callbacks() if (state == ConnectStatus::ConnectStatusOk) { obj->command_request_push_all(); obj->command_get_version(); - event.SetInt(1); + event.SetInt(0); event.SetString(obj->dev_id); } else if (state == ConnectStatus::ConnectStatusFailed) { obj->set_access_code(""); @@ -1895,18 +1895,28 @@ void GUI_App::init_networking_callbacks() text = wxString::Format(_L("Connect %s failed! [SN:%s, code=%s]"), from_u8(obj->dev_name), obj->dev_id, msg); wxGetApp().show_dialog(text); } - event.SetInt(0); + event.SetInt(-1); } else if (state == ConnectStatus::ConnectStatusLost) { m_device_manager->set_selected_machine("", true); - event.SetInt(0); + event.SetInt(-1); BOOST_LOG_TRIVIAL(info) << "set_on_local_connect_fn: state = lost"; } else { - event.SetInt(0); + event.SetInt(-1); BOOST_LOG_TRIVIAL(info) << "set_on_local_connect_fn: state = " << state; } obj->set_lan_mode_connection_state(false); } + else { + if (state == ConnectStatus::ConnectStatusOk) { + event.SetInt(1); + event.SetString(obj->dev_id); + } + else { + event.SetInt(-2); + event.SetString(obj->dev_id); + } + } } event.SetEventObject(this); wxPostEvent(this, event); diff --git a/src/slic3r/GUI/Jobs/PrintJob.cpp b/src/slic3r/GUI/Jobs/PrintJob.cpp index 218f6e4bb..98f0308d5 100644 --- a/src/slic3r/GUI/Jobs/PrintJob.cpp +++ b/src/slic3r/GUI/Jobs/PrintJob.cpp @@ -140,7 +140,7 @@ void PrintJob::process() } /* check gcode is valid */ - if (!plate->is_valid_gcode_file()) { + if (!plate->is_valid_gcode_file() && m_print_type == "from_normal") { update_status(curr_percent, check_gcode_failed_str); return; } @@ -171,11 +171,11 @@ void PrintJob::process() // local print access params.dev_ip = m_dev_ip; - params.use_ssl = m_local_use_ssl; + params.use_ssl_for_ftp = m_local_use_ssl_for_ftp; + params.use_ssl_for_mqtt = m_local_use_ssl_for_mqtt; params.username = "bblp"; params.password = m_access_code; - // check access code and ip address if (this->connection_type == "lan") { params.dev_id = m_dev_id; @@ -190,11 +190,14 @@ void PrintJob::process() m_job_finished = true; return; } + + params.project_name = ""; + params.filename = ""; } params.dev_id = m_dev_id; params.ftp_folder = m_ftp_folder; - //params.project_name = project_name; + //params.project_name = m_project_name; params.filename = job_data._3mf_path.string(); @@ -210,6 +213,8 @@ void PrintJob::process() params.connection_type = this->connection_type; params.task_use_ams = this->task_use_ams; params.task_bed_type = this->task_bed_type; + params.print_type = this->m_print_type; + if (wxGetApp().model().model_info && wxGetApp().model().model_info.get()) { ModelInfo* model_info = wxGetApp().model().model_info.get(); auto origin_profile_id = model_info->metadata_items.find(BBL_DESIGNER_PROFILE_ID_TAG); @@ -245,10 +250,8 @@ void PrintJob::process() } - if (params.preset_name.empty() && params.project_name.empty()) { - params.preset_name = wxString::Format("%s_plate_%d", m_project_name, curr_plate_idx).ToStdString(); - params.project_name = m_project_name; - } + if (params.preset_name.empty()) {params.preset_name = wxString::Format("%s_plate_%d", m_project_name, curr_plate_idx).ToStdString();} + if (params.project_name.empty()) {params.project_name = m_project_name;} wxString error_text; wxString msg_text; diff --git a/src/slic3r/GUI/Jobs/PrintJob.hpp b/src/slic3r/GUI/Jobs/PrintJob.hpp index 9ad27893d..cb9fffd67 100644 --- a/src/slic3r/GUI/Jobs/PrintJob.hpp +++ b/src/slic3r/GUI/Jobs/PrintJob.hpp @@ -46,8 +46,10 @@ public: std::string task_ams_mapping; std::string task_ams_mapping_info; std::string connection_type; + std::string m_print_type; - bool m_local_use_ssl { true }; + bool m_local_use_ssl_for_mqtt { true }; + bool m_local_use_ssl_for_ftp { true }; bool task_bed_leveling; bool task_flow_cali; bool task_vibration_cali; diff --git a/src/slic3r/GUI/Jobs/SendJob.cpp b/src/slic3r/GUI/Jobs/SendJob.cpp index 473727321..8bb93c5ae 100644 --- a/src/slic3r/GUI/Jobs/SendJob.cpp +++ b/src/slic3r/GUI/Jobs/SendJob.cpp @@ -130,7 +130,8 @@ void SendJob::process() params.dev_ip = m_dev_ip; params.username = "bblp"; params.password = m_access_code; - params.use_ssl = m_local_use_ssl; + params.use_ssl_for_ftp = m_local_use_ssl_for_ftp; + params.use_ssl_for_mqtt = m_local_use_ssl_for_mqtt; // check access code and ip address params.dev_id = m_dev_id; @@ -219,7 +220,8 @@ void SendJob::process() params.dev_ip = m_dev_ip; params.username = "bblp"; params.password = m_access_code; - params.use_ssl = m_local_use_ssl; + params.use_ssl_for_ftp = m_local_use_ssl_for_ftp; + params.use_ssl_for_mqtt = m_local_use_ssl_for_mqtt; wxString error_text; wxString msg_text; diff --git a/src/slic3r/GUI/Jobs/SendJob.hpp b/src/slic3r/GUI/Jobs/SendJob.hpp index e35b35bd4..579bebf21 100644 --- a/src/slic3r/GUI/Jobs/SendJob.hpp +++ b/src/slic3r/GUI/Jobs/SendJob.hpp @@ -37,11 +37,12 @@ public: std::string m_project_name; std::string m_dev_ip; std::string m_access_code; - bool m_local_use_ssl{false}; std::string task_bed_type; std::string task_ams_mapping; std::string connection_type; + bool m_local_use_ssl_for_ftp{false}; + bool m_local_use_ssl_for_mqtt{false}; bool cloud_print_only { false }; bool has_sdcard { false }; bool task_use_ams { true }; diff --git a/src/slic3r/GUI/MediaFilePanel.cpp b/src/slic3r/GUI/MediaFilePanel.cpp index 4a32fcfd0..5c42b7eac 100644 --- a/src/slic3r/GUI/MediaFilePanel.cpp +++ b/src/slic3r/GUI/MediaFilePanel.cpp @@ -2,7 +2,7 @@ #include "ImageGrid.h" #include "I18N.hpp" #include "GUI_App.hpp" - +#include "Plater.hpp" #include "Widgets/Button.hpp" #include "Widgets/SwitchButton.hpp" #include "Widgets/Label.hpp" @@ -466,7 +466,7 @@ void Slic3r::GUI::MediaFilePanel::doAction(size_t index, int action) } else if (action == 1) { if (fs->GetFileType() == PrinterFileSystem::F_MODEL) { if (index != -1) { - fs->FetchModel(index, [](std::string const & data) { + fs->FetchModel(index, [fs,index](std::string const & data) { Slic3r::DynamicPrintConfig config; Slic3r::Model model; Slic3r::PlateDataPtrs plate_data_list; @@ -475,6 +475,10 @@ void Slic3r::GUI::MediaFilePanel::doAction(size_t index, int action) if (!Slic3r::load_gcode_3mf_from_stream(is, &config, &model, &plate_data_list, &file_version)) return; // TODO: print gcode 3mf + auto &file = fs->GetFile(index); + Slic3r::GUI::wxGetApp().plater()->update_print_required_data(config, model, plate_data_list, from_u8(file.name).ToStdString()); + wxPostEvent(Slic3r::GUI::wxGetApp().plater(), SimpleEvent(EVT_PRINT_FROM_SDCARD_VIEW)); + }); } return; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index f3181f2c0..e0e9ef421 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -165,6 +165,8 @@ wxDEFINE_EVENT(EVT_INSTALL_PLUGIN_HINT, wxCommandEvent); wxDEFINE_EVENT(EVT_PREVIEW_ONLY_MODE_HINT, wxCommandEvent); //BBS: change light/dark mode wxDEFINE_EVENT(EVT_GLCANVAS_COLOR_MODE_CHANGED, SimpleEvent); +//BBS: print +wxDEFINE_EVENT(EVT_PRINT_FROM_SDCARD_VIEW, SimpleEvent); bool Plater::has_illegal_filename_characters(const wxString& wxs_name) @@ -2092,6 +2094,7 @@ struct Plater::priv //void show_action_buttons(const bool is_ready_to_slice) const; bool show_publish_dlg(bool show = true); void update_publish_dialog_status(wxString &msg, int percent = -1); + void on_action_print_plate_from_sdcard(SimpleEvent&); // Set the bed shape to a single closed 2D polygon(array of two element arrays), // triangulate the bed and store the triangles into m_bed.m_triangles, @@ -2167,6 +2170,7 @@ struct Plater::priv //BBS: add popup object table logic bool PopupObjectTable(int object_id, int volume_id, const wxPoint& position); void on_action_send_to_printer(bool isall = false); + void update_print_required_data(Slic3r::DynamicPrintConfig config, Slic3r::Model model, Slic3r::PlateDataPtrs plate_data_list, std::string file_name); private: bool layers_height_allowed() const; @@ -2490,6 +2494,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) q->Bind(EVT_GLTOOLBAR_SLICE_PLATE, &priv::on_action_slice_plate, this); q->Bind(EVT_GLTOOLBAR_SLICE_ALL, &priv::on_action_slice_all, this); q->Bind(EVT_GLTOOLBAR_PRINT_PLATE, &priv::on_action_print_plate, this); + q->Bind(EVT_PRINT_FROM_SDCARD_VIEW, &priv::on_action_print_plate_from_sdcard, this); q->Bind(EVT_GLTOOLBAR_SELECT_SLICED_PLATE, &priv::on_action_select_sliced_plate, this); q->Bind(EVT_GLTOOLBAR_PRINT_ALL, &priv::on_action_print_all, this); q->Bind(EVT_GLTOOLBAR_EXPORT_GCODE, &priv::on_action_export_gcode, this); @@ -6177,17 +6182,31 @@ void Plater::priv::on_action_print_plate(SimpleEvent&) BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << ":received print plate event\n" ; } - //do not check login for lan printing - ////BBS check login status - //if (!wxGetApp().check_login()) return; - - //BBS if (!m_select_machine_dlg) m_select_machine_dlg = new SelectMachineDialog(q); + m_select_machine_dlg->set_print_type(PrintFromType::FROM_NORMAL); m_select_machine_dlg->prepare(partplate_list.get_curr_plate_index()); m_select_machine_dlg->ShowModal(); } +void Plater::priv::on_action_print_plate_from_sdcard(SimpleEvent&) +{ + if (q != nullptr) { + BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << ":received print plate event\n"; + } + + //BBS + if (!m_select_machine_dlg) m_select_machine_dlg = new SelectMachineDialog(q); + m_select_machine_dlg->set_print_type(PrintFromType::FROM_SDCARD_VIEW); + m_select_machine_dlg->prepare(0); + m_select_machine_dlg->ShowModal(); +} + +void Plater::priv::update_print_required_data(Slic3r::DynamicPrintConfig config, Slic3r::Model model, Slic3r::PlateDataPtrs plate_data_list, std::string file_name) +{ + if (!m_select_machine_dlg) m_select_machine_dlg = new SelectMachineDialog(q); + m_select_machine_dlg->update_print_required_data(config, model, plate_data_list, file_name); +} void Plater::priv::on_action_send_to_printer(bool isall) { @@ -10245,6 +10264,12 @@ bool Plater::undo_redo_string_getter(const bool is_undo, int idx, const char** o return false; } +void Plater::update_print_required_data(Slic3r::DynamicPrintConfig config, Slic3r::Model model, Slic3r::PlateDataPtrs plate_data_list, std::string file_name) +{ + p->update_print_required_data(config, model, plate_data_list, file_name); +} + + void Plater::undo_redo_topmost_string_getter(const bool is_undo, std::string& out_text) { const std::vector& ss_stack = p->undo_redo_stack().snapshots(); diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 39f0b7341..537f662d0 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -91,6 +91,7 @@ wxDECLARE_EVENT(EVT_INSTALL_PLUGIN_HINT, wxCommandEvent); wxDECLARE_EVENT(EVT_UPDATE_PLUGINS_WHEN_LAUNCH, wxCommandEvent); wxDECLARE_EVENT(EVT_PREVIEW_ONLY_MODE_HINT, wxCommandEvent); wxDECLARE_EVENT(EVT_GLCANVAS_COLOR_MODE_CHANGED, SimpleEvent); +wxDECLARE_EVENT(EVT_PRINT_FROM_SDCARD_VIEW, SimpleEvent); const wxString DEFAULT_PROJECT_NAME = "Untitled"; @@ -373,6 +374,7 @@ public: void redo_to(int selection); bool undo_redo_string_getter(const bool is_undo, int idx, const char** out_text); void undo_redo_topmost_string_getter(const bool is_undo, std::string& out_text); + void update_print_required_data(Slic3r::DynamicPrintConfig config, Slic3r::Model model, Slic3r::PlateDataPtrs plate_data_list, std::string file_name); bool search_string_getter(int idx, const char** label, const char** tooltip); // For the memory statistics. const Slic3r::UndoRedo::Stack& undo_redo_stack_main() const; diff --git a/src/slic3r/GUI/ReleaseNote.cpp b/src/slic3r/GUI/ReleaseNote.cpp index 2d7bb80ba..ad6f81ea3 100644 --- a/src/slic3r/GUI/ReleaseNote.cpp +++ b/src/slic3r/GUI/ReleaseNote.cpp @@ -1298,7 +1298,8 @@ void InputIpAddressDialog::on_ok(wxMouseEvent& evt) m_send_job = std::make_shared(m_status_bar, wxGetApp().plater(), m_obj->dev_id); m_send_job->m_dev_ip = ip.ToStdString(); m_send_job->m_access_code = str_access_code.ToStdString(); - m_send_job->m_local_use_ssl = m_obj->local_use_ssl; + m_send_job->m_local_use_ssl_for_mqtt = m_obj->local_use_ssl_for_mqtt; + m_send_job->m_local_use_ssl_for_ftp = m_obj->local_use_ssl_for_ftp; m_send_job->connection_type = m_obj->connection_type(); m_send_job->cloud_print_only = true; m_send_job->has_sdcard = m_obj->has_sdcard(); diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 3e9dc87ba..ddd732d6a 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -1056,19 +1056,40 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) } }); + auto m_sizer_thumbnail_area = new wxBoxSizer(wxHORIZONTAL); + + auto last_plate_panel = new wxWindow(m_scrollable_region, wxID_ANY); + last_plate_panel->SetBackgroundColour(*wxWHITE); + auto last_plate_sizer = new wxBoxSizer(wxVERTICAL); + last_plate_panel->SetMinSize(wxSize(FromDIP(32), FromDIP(32))); + m_bitmap_last_plate = new wxStaticBitmap(last_plate_panel, wxID_ANY, create_scaled_bitmap("go_last_plate", this, 32), wxDefaultPosition, wxSize(FromDIP(32), FromDIP(32)), 0); + last_plate_sizer->Add(m_bitmap_last_plate, 0, wxALIGN_CENTER, 0); + last_plate_panel->SetSizer(last_plate_sizer); m_panel_image = new wxPanel(m_scrollable_region, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); m_panel_image->SetBackgroundColour(m_colour_def_color); - - m_sizer_thumbnail = new wxBoxSizer(wxVERTICAL); + m_sizer_thumbnail = new wxBoxSizer(wxHORIZONTAL); m_thumbnailPanel = new ThumbnailPanel(m_panel_image); m_thumbnailPanel->SetSize(wxSize(FromDIP(256), FromDIP(256))); m_thumbnailPanel->SetMinSize(wxSize(FromDIP(256), FromDIP(256))); m_thumbnailPanel->SetMaxSize(wxSize(FromDIP(256), FromDIP(256))); - m_sizer_thumbnail->Add(m_thumbnailPanel, 0, wxEXPAND, 0); + m_thumbnailPanel->SetBackgroundColour(*wxRED); + m_sizer_thumbnail->Add(m_thumbnailPanel, 0, wxALIGN_CENTER, 0); m_panel_image->SetSizer(m_sizer_thumbnail); m_panel_image->Layout(); + auto next_plate_panel = new wxWindow(m_scrollable_region, wxID_ANY); + next_plate_panel->SetBackgroundColour(*wxWHITE); + auto next_plate_sizer = new wxBoxSizer(wxVERTICAL); + next_plate_panel->SetMinSize(wxSize(FromDIP(32), FromDIP(32))); + m_bitmap_next_plate = new wxStaticBitmap(next_plate_panel, wxID_ANY, create_scaled_bitmap("go_next_plate", this, 32), wxDefaultPosition, wxSize(FromDIP(32), FromDIP(32)), 0); + next_plate_sizer->Add(m_bitmap_next_plate, 0, wxALIGN_CENTER, 0); + next_plate_panel->SetSizer(next_plate_sizer); + + m_sizer_thumbnail_area->Add(last_plate_panel, 0, wxALIGN_CENTER, 0); + m_sizer_thumbnail_area->Add(m_panel_image, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(24)); + m_sizer_thumbnail_area->Add(next_plate_panel, 0, wxALIGN_CENTER, 0); + wxBoxSizer *m_sizer_basic = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *m_sizer_basic_weight = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *m_sizer_basic_time = new wxBoxSizer(wxHORIZONTAL); @@ -1215,8 +1236,7 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_sizer_prepare->Add(0, 0, 1, wxTOP, FromDIP(12)); auto hyperlink_sizer = new wxBoxSizer( wxHORIZONTAL ); - auto m_hyperlink = new wxHyperlinkCtrl(m_panel_prepare, wxID_ANY, _L("Can't find my devices?"), wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); - + m_hyperlink = new wxHyperlinkCtrl(m_panel_prepare, wxID_ANY, _L("Can't connect to the printer"), wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); hyperlink_sizer->Add(m_hyperlink, 0, wxALIGN_CENTER | wxALL, 5); m_sizer_prepare->Add(hyperlink_sizer, 0, wxALIGN_CENTER | wxALL, 5); @@ -1352,41 +1372,10 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3)); sizer_print_failed_info->Add(sizer_extra_info, 0, wxLEFT, 5); - // bind - Bind(EVT_SHOW_ERROR_INFO, [this](auto& e) { - show_print_failed_info(true); - }); - Bind(EVT_UPDATE_USER_MACHINE_LIST, &SelectMachineDialog::update_printer_combobox, this); - Bind(EVT_PRINT_JOB_CANCEL, &SelectMachineDialog::on_print_job_cancel, this); - Bind(EVT_SET_FINISH_MAPPING, &SelectMachineDialog::on_set_finish_mapping, this); - wxGetApp().Bind(EVT_CONNECT_LAN_MODE_PRINT, [this](wxCommandEvent& e) { - if (e.GetInt() == 1) { - DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev) return; - if (dev->get_selected_machine()) { - m_comboBox_printer->SetValue(dev->get_selected_machine()->dev_name + "(LAN)"); - } - } - }); - - m_panel_prepare->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { - check_fcous_state(this); - e.Skip(); - }); - - m_scrollable_region->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { - check_fcous_state(this); - e.Skip(); - }); - - Bind(wxEVT_LEFT_DOWN, [this](auto& e) { - check_fcous_state(this); - e.Skip(); - }); m_sizer_scrollable_region->Add(m_rename_switch_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0); m_sizer_scrollable_region->Add(0, 0, 0, wxTOP, FromDIP(8)); - m_sizer_scrollable_region->Add(m_panel_image, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_sizer_scrollable_region->Add(m_sizer_thumbnail_area, 0, wxALIGN_CENTER_HORIZONTAL, 0); m_sizer_scrollable_region->Add(0, 0, 0, wxTOP, FromDIP(10)); m_sizer_scrollable_region->Add(m_sizer_basic, 0, wxALIGN_CENTER_HORIZONTAL, 0); //m_sizer_scrollable_region->Add(m_sizer_material, 0, wxALIGN_CENTER_HORIZONTAL, 0); @@ -1401,7 +1390,7 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0); m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(13)); - m_sizer_main->Add(m_scrollable_view, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_sizer_main->Add(m_scrollable_view, 0, wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxRIGHT, FromDIP(25)); #ifdef FILAMENT_BACKUP m_sizer_main->Add(m_sizer_backup, 0, wxALIGN_CENTER_HORIZONTAL, 0); @@ -1421,7 +1410,7 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_sizer_main->Add(m_line_schedule, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(30)); m_sizer_main->Add(m_simplebook, 0, wxALIGN_CENTER_HORIZONTAL, 0); m_sizer_main->Add(m_sw_print_failed_info, 0, wxALIGN_CENTER, 0); - m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(13)); + m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(18)); show_print_failed_info(false); @@ -1432,10 +1421,60 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) init_bind(); init_timer(); - // CenterOnParent(); Centre(wxBOTH); wxGetApp().UpdateDlgDarkUI(this); } + +void SelectMachineDialog::init_bind() +{ + Bind(wxEVT_TIMER, &SelectMachineDialog::on_timer, this); + Bind(EVT_CLEAR_IPADDRESS, &SelectMachineDialog::clear_ip_address_config, this); + Bind(EVT_SHOW_ERROR_INFO, [this](auto& e) {show_print_failed_info(true);}); + Bind(EVT_UPDATE_USER_MACHINE_LIST, &SelectMachineDialog::update_printer_combobox, this); + Bind(EVT_PRINT_JOB_CANCEL, &SelectMachineDialog::on_print_job_cancel, this); + Bind(EVT_SET_FINISH_MAPPING, &SelectMachineDialog::on_set_finish_mapping, this); + Bind(wxEVT_LEFT_DOWN, [this](auto& e) {check_fcous_state(this);e.Skip();}); + m_panel_prepare->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {check_fcous_state(this);e.Skip();}); + m_scrollable_region->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {check_fcous_state(this);e.Skip();}); + m_bitmap_last_plate->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); + m_bitmap_last_plate->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); + m_bitmap_next_plate->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); + m_bitmap_next_plate->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); + + + wxGetApp().Bind(EVT_CONNECT_LAN_MODE_PRINT, [this](wxCommandEvent& e) { + if (e.GetInt() == 0) { + DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) return; + if (dev->get_selected_machine()) { + m_comboBox_printer->SetValue(dev->get_selected_machine()->dev_name + "(LAN)"); + } + }else if(e.GetInt() == 1){ + on_send_print(); + } + else if (e.GetInt() == -2) { + MessageDialog msg_wingow(nullptr, _L("Printer local connection failed, please try again."), "", wxAPPLY | wxOK); + msg_wingow.ShowModal(); + } + }); + + m_bitmap_last_plate->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { + if (m_print_plate_idx > 0) { + m_print_plate_idx--; + update_page_turn_state(true); + set_default_from_sdcard(); + } + }); + + m_bitmap_next_plate->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { + if (m_print_plate_idx < (m_print_plate_total - 1)) { + m_print_plate_idx++; + update_page_turn_state(true); + set_default_from_sdcard(); + } + }); +} + void SelectMachineDialog::check_focus(wxWindow* window) { if (window == m_rename_input || window == m_rename_input->GetTextCtrl()) { @@ -2144,12 +2183,6 @@ void SelectMachineDialog::show_status(PrintDialogStatus status, std::vectoron_ok(); + if (m_print_type == PrintFromType::FROM_SDCARD_VIEW) { + this->connect_printer_mqtt(); + } + else { + this->on_send_print(); + } + }); confirm_text.push_back(_L("Please click the confirm button if you still want to proceed with printing.") + "\n"); @@ -2324,11 +2363,30 @@ void SelectMachineDialog::on_ok_btn(wxCommandEvent &event) confirm_dlg.on_show(); } else { - this->on_ok(); + if (m_print_type == PrintFromType::FROM_SDCARD_VIEW) { + this->connect_printer_mqtt(); + } + else { + this->on_send_print(); + } } } -void SelectMachineDialog::on_ok() +void SelectMachineDialog::connect_printer_mqtt() +{ + DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) return; + MachineObject* obj_ = dev->get_selected_machine(); + + if (obj_->connection_type() == "cloud") { + obj_->connect(false, obj_->local_use_ssl_for_mqtt); + } + else { + on_send_print(); + } +} + +void SelectMachineDialog::on_send_print() { BOOST_LOG_TRIVIAL(info) << "print_job: on_ok to send"; m_is_canceled = false; @@ -2341,10 +2399,10 @@ void SelectMachineDialog::on_ok() return; } - DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev) return; - MachineObject *obj_ = dev->get_selected_machine(); + MachineObject* obj_ = dev->get_selected_machine(); assert(obj_->dev_id == m_printer_last_select); if (obj_ == nullptr) { return; @@ -2367,7 +2425,7 @@ void SelectMachineDialog::on_ok() m_is_canceled = true; wxCommandEvent* event = new wxCommandEvent(EVT_PRINT_JOB_CANCEL); wxQueueEvent(this, event); - }); + }); if (m_is_canceled) { BOOST_LOG_TRIVIAL(info) << "print_job: m_is_canceled"; @@ -2387,55 +2445,71 @@ void SelectMachineDialog::on_ok() json mapping_info_json = json::array(); json item; if (m_filaments.size() > 0) { - item["sourceColor"] = m_filaments[0].color.substr(1, 6) + "FF"; + item["sourceColor"] = m_filaments[0].color.substr(1, 6) + "FF"; item["filamentType"] = m_filaments[0].type; mapping_info_json.push_back(item); ams_mapping_info = mapping_info_json.dump(); } } - result = m_plater->send_gcode(m_print_plate_idx, [this](int export_stage, int current, int total, bool &cancel) { - if (this->m_is_canceled) return; - bool cancelled = false; - wxString msg = _L("Preparing print job"); - m_status_bar->update_status(msg, cancelled, 10, true); - m_export_3mf_cancel = cancel = cancelled; - }); - if (m_is_canceled || m_export_3mf_cancel) { - BOOST_LOG_TRIVIAL(info) << "print_job: m_export_3mf_cancel or m_is_canceled"; - m_status_bar->set_status_text(task_canceled_text); - return; - } + if (m_print_type == PrintFromType::FROM_NORMAL) { + result = m_plater->send_gcode(m_print_plate_idx, [this](int export_stage, int current, int total, bool& cancel) { + if (this->m_is_canceled) return; + bool cancelled = false; + wxString msg = _L("Preparing print job"); + m_status_bar->update_status(msg, cancelled, 10, true); + m_export_3mf_cancel = cancel = cancelled; + }); - if (result < 0) { - wxString msg = _L("Abnormal print file data. Please slice again"); - m_status_bar->set_status_text(msg); - return; - } + if (m_is_canceled || m_export_3mf_cancel) { + BOOST_LOG_TRIVIAL(info) << "print_job: m_export_3mf_cancel or m_is_canceled"; + m_status_bar->set_status_text(task_canceled_text); + return; + } - // export config 3mf if needed - if (!obj_->is_lan_mode_printer()) { - result = m_plater->export_config_3mf(m_print_plate_idx); if (result < 0) { - BOOST_LOG_TRIVIAL(trace) << "export_config_3mf failed, result = " << result; + wxString msg = _L("Abnormal print file data. Please slice again"); + m_status_bar->set_status_text(msg); + return; + } + + // export config 3mf if needed + if (!obj_->is_lan_mode_printer()) { + result = m_plater->export_config_3mf(m_print_plate_idx); + if (result < 0) { + BOOST_LOG_TRIVIAL(trace) << "export_config_3mf failed, result = " << result; + return; + } + } + if (m_is_canceled || m_export_3mf_cancel) { + BOOST_LOG_TRIVIAL(info) << "print_job: m_export_3mf_cancel or m_is_canceled"; + m_status_bar->set_status_text(task_canceled_text); return; } } - if (m_is_canceled || m_export_3mf_cancel) { - BOOST_LOG_TRIVIAL(info) << "print_job: m_export_3mf_cancel or m_is_canceled"; - m_status_bar->set_status_text(task_canceled_text); - return; - } - m_print_job = std::make_shared(m_status_bar, m_plater, m_printer_last_select); - m_print_job->m_dev_ip = obj_->dev_ip; - m_print_job->m_ftp_folder = obj_->get_ftp_folder(); - m_print_job->m_access_code = obj_->get_access_code(); - m_print_job->m_local_use_ssl = obj_->local_use_ssl; + m_print_job = std::make_shared(m_status_bar, m_plater, m_printer_last_select); + m_print_job->m_dev_ip = obj_->dev_ip; + m_print_job->m_ftp_folder = obj_->get_ftp_folder(); + m_print_job->m_access_code = obj_->get_access_code(); + m_print_job->m_local_use_ssl_for_ftp = obj_->local_use_ssl_for_ftp; + m_print_job->m_local_use_ssl_for_mqtt = obj_->local_use_ssl_for_mqtt; m_print_job->connection_type = obj_->connection_type(); - m_print_job->cloud_print_only= obj_->is_cloud_print_only; - m_print_job->set_project_name(m_current_project_name.utf8_string()); + m_print_job->cloud_print_only = obj_->is_cloud_print_only; + + if (m_print_type == PrintFromType::FROM_NORMAL) { + m_print_job->m_print_type = "from_normal"; + m_print_job->set_project_name(m_current_project_name.utf8_string()); + } + else if(m_print_type == PrintFromType::FROM_SDCARD_VIEW){ + m_print_job->m_print_type = "from_sdcard_view"; + m_print_job->connection_type = "lan"; + auto input_str_arr = wxGetApp().split_str(m_required_data_file_name,".gcode.3mf"); + if (input_str_arr.size() > 1) { + m_print_job->set_project_name(input_str_arr[0]); + } + } if (obj_->is_support_ams_mapping()) { m_print_job->task_ams_mapping = ams_mapping_array; @@ -2580,6 +2654,14 @@ bool SelectMachineDialog::is_timeout() return false; } +void SelectMachineDialog::update_print_required_data(Slic3r::DynamicPrintConfig config, Slic3r::Model model, Slic3r::PlateDataPtrs plate_data_list, std::string file_name) +{ + m_required_data_config = config; + m_required_data_model = model; + m_required_data_plate_data_list = plate_data_list; + m_required_data_file_name = file_name; +} + void SelectMachineDialog::reset_timeout() { m_timeout_count = 0; @@ -2877,10 +2959,13 @@ void SelectMachineDialog::update_show_status() dev->check_pushing(); PartPlate* plate = m_plater->get_partplate_list().get_curr_plate(); + // blank plate has no valid gcode file - if (plate&& !plate->is_valid_gcode_file()) { - show_status(PrintDialogStatus::PrintStatusBlankPlate); - return; + if (m_print_type == PrintFromType::FROM_NORMAL) { + if (plate && !plate->is_valid_gcode_file()) { + show_status(PrintDialogStatus::PrintStatusBlankPlate); + return; + } } MachineObject* obj_ = dev->get_my_machine(m_printer_last_select); @@ -3195,11 +3280,30 @@ void SelectMachineDialog::set_flow_calibration_state(bool state) void SelectMachineDialog::set_default() { + if (m_print_type == PrintFromType::FROM_NORMAL) { + m_stext_printer_title->Show(true); + m_comboBox_printer->Show(true); + m_button_refresh->Show(true); + m_rename_normal_panel->Show(true); + m_hyperlink->Show(true); + } + else if (m_print_type == PrintFromType::FROM_SDCARD_VIEW) { + m_stext_printer_title->Show(false); + m_comboBox_printer->Show(false); + m_button_refresh->Show(false); + m_rename_normal_panel->Show(false); + m_hyperlink->Show(false); + + /* DeviceManager* dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev_manager) return; + MachineObject* obj_ = dev_manager->get_selected_machine();*/ + } + //project name m_rename_switch_panel->SetSelection(0); wxString filename = m_plater->get_export_gcode_filename("", false, - m_print_plate_idx == PLATE_ALL_IDX ?true:false); + m_print_plate_idx == PLATE_ALL_IDX ? true : false); if (m_print_plate_idx == PLATE_ALL_IDX && filename.empty()) { filename = _L("Untitled"); @@ -3208,7 +3312,7 @@ void SelectMachineDialog::set_default() if (filename.empty()) { filename = m_plater->get_export_gcode_filename("", true); if (std::strstr(filename.c_str(), _L("Untitled").c_str()) == NULL) { - filename = wxString::Format("Untitled%s",filename); + filename = wxString::Format("Untitled%s", filename); } } @@ -3217,7 +3321,6 @@ void SelectMachineDialog::set_default() m_rename_text->SetLabelText(m_current_project_name); m_rename_normal_panel->Layout(); - //clear combobox m_list.clear(); m_comboBox_printer->Clear(); @@ -3225,6 +3328,7 @@ void SelectMachineDialog::set_default() m_print_info = ""; m_comboBox_printer->SetValue(wxEmptyString); m_comboBox_printer->Enable(); + // rset status bar m_status_bar->reset(); @@ -3232,7 +3336,8 @@ void SelectMachineDialog::set_default() if (agent) { if (agent->is_user_login()) { show_status(PrintDialogStatus::PrintStatusInit); - } else { + } + else { show_status(PrintDialogStatus::PrintStatusNoUserLogin); } } @@ -3243,73 +3348,85 @@ void SelectMachineDialog::set_default() AppConfig* config = wxGetApp().app_config; if (config && config->get("print", "bed_leveling") == "0") { m_checkbox_list["bed_leveling"]->SetValue(false); - } else { + } + else { m_checkbox_list["bed_leveling"]->SetValue(true); } if (config && config->get("print", "flow_cali") == "0") { m_checkbox_list["flow_cali"]->SetValue(false); - } else { + } + else { m_checkbox_list["flow_cali"]->SetValue(true); } if (config && config->get("print", "timelapse") == "0") { m_checkbox_list["timelapse"]->SetValue(false); - } else { + } + else { m_checkbox_list["timelapse"]->SetValue(true); } + m_ams_check->SetValue(true); - // thumbmail - //wxBitmap bitmap; - ThumbnailData &data = m_plater->get_partplate_list().get_curr_plate()->thumbnail_data; + if (m_print_type == PrintFromType::FROM_NORMAL) { + set_default_normal(); + } + else if (m_print_type == PrintFromType::FROM_SDCARD_VIEW) { + set_default_from_sdcard(); + } + + Layout(); + Fit(); +} + +void SelectMachineDialog::set_default_normal() +{ + update_page_turn_state(false); + ThumbnailData& data = m_plater->get_partplate_list().get_curr_plate()->thumbnail_data; if (data.is_valid()) { wxImage image(data.width, data.height); image.InitAlpha(); for (unsigned int r = 0; r < data.height; ++r) { unsigned int rr = (data.height - 1 - r) * data.width; for (unsigned int c = 0; c < data.width; ++c) { - unsigned char *px = (unsigned char *) data.pixels.data() + 4 * (rr + c); - image.SetRGB((int) c, (int) r, px[0], px[1], px[2]); - image.SetAlpha((int) c, (int) r, px[3]); + unsigned char* px = (unsigned char*)data.pixels.data() + 4 * (rr + c); + image.SetRGB((int)c, (int)r, px[0], px[1], px[2]); + image.SetAlpha((int)c, (int)r, px[3]); } } - image = image.Rescale(FromDIP(256), FromDIP(256)); + image = image.Rescale(FromDIP(256), FromDIP(256)); m_thumbnailPanel->set_thumbnail(image); - //bitmap = wxBitmap(image); } - //m_staticbitmap->SetBitmap(bitmap); - //m_sizer_thumbnail->Layout(); - + //for black list std::vector materials; std::vector brands; std::vector display_materials; - { - auto preset_bundle = wxGetApp().preset_bundle; - for (auto filament_name : preset_bundle->filament_presets) { - for (auto iter = preset_bundle->filaments.lbegin(); iter != preset_bundle->filaments.end(); iter++) { - if (filament_name.compare(iter->name) == 0) { - std::string display_filament_type; - std::string filament_type = iter->config.get_filament_type(display_filament_type); - display_materials.push_back(display_filament_type); - materials.push_back(filament_type); + + auto preset_bundle = wxGetApp().preset_bundle; + for (auto filament_name : preset_bundle->filament_presets) { + for (auto iter = preset_bundle->filaments.lbegin(); iter != preset_bundle->filaments.end(); iter++) { + if (filament_name.compare(iter->name) == 0) { + std::string display_filament_type; + std::string filament_type = iter->config.get_filament_type(display_filament_type); + display_materials.push_back(display_filament_type); + materials.push_back(filament_type); - if (iter->vendor && !iter->vendor->name.empty()) - brands.push_back(iter->vendor->name); - else - brands.push_back(""); - } + if (iter->vendor && !iter->vendor->name.empty()) + brands.push_back(iter->vendor->name); + else + brands.push_back(""); } } } - // material info + //init MaterialItem auto extruders = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_used_extruders(); BitmapCache bmcache; MaterialHash::iterator iter = m_materialList.begin(); while (iter != m_materialList.end()) { - int id = iter->first; - Material *item = iter->second; + int id = iter->first; + Material* item = iter->second; item->item->Destroy(); delete item; iter++; @@ -3321,36 +3438,24 @@ void SelectMachineDialog::set_default() for (auto i = 0; i < extruders.size(); i++) { auto extruder = extruders[i] - 1; - auto colour = wxGetApp().preset_bundle->project_config.opt_string("filament_colour", (unsigned int) extruder); + auto colour = wxGetApp().preset_bundle->project_config.opt_string("filament_colour", (unsigned int)extruder); unsigned char rgb[3]; bmcache.parse_color(colour, rgb); - auto colour_rgb = wxColour((int) rgb[0], (int) rgb[1], (int) rgb[2]); + auto colour_rgb = wxColour((int)rgb[0], (int)rgb[1], (int)rgb[2]); if (extruder >= materials.size() || extruder < 0 || extruder >= display_materials.size()) continue; - /* if (m_materialList.size() == 0) { - auto tips_panel = new wxPanel(m_scrollable_region, wxID_ANY); - tips_panel->SetSize(wxSize(60,40)); - tips_panel->SetMinSize(wxSize(60,40)); - tips_panel->SetMaxSize(wxSize(60,40)); - tips_panel->SetBackgroundColour(*wxRED); - m_sizer_material->Add(tips_panel, 0, wxALL, FromDIP(4)); - }*/ - - MaterialItem *item = new MaterialItem(m_scrollable_region, colour_rgb, _L(display_materials[extruder])); + MaterialItem* item = new MaterialItem(m_scrollable_region, colour_rgb, _L(display_materials[extruder])); m_sizer_material->Add(item, 0, wxALL, FromDIP(4)); - item->Bind(wxEVT_LEFT_UP, [this, item, materials, extruder](wxMouseEvent &e) { - - }); - - item->Bind(wxEVT_LEFT_DOWN, [this, item, materials, extruder](wxMouseEvent &e) { + item->Bind(wxEVT_LEFT_UP, [this, item, materials, extruder](wxMouseEvent& e) {}); + item->Bind(wxEVT_LEFT_DOWN, [this, item, materials, extruder](wxMouseEvent& e) { MaterialHash::iterator iter = m_materialList.begin(); while (iter != m_materialList.end()) { - int id = iter->first; - Material * item = iter->second; - MaterialItem *m = item->item; + int id = iter->first; + Material* item = iter->second; + MaterialItem* m = item->item; m->on_normal(); iter++; } @@ -3360,11 +3465,11 @@ void SelectMachineDialog::set_default() auto mouse_pos = ClientToScreen(e.GetPosition()); - wxPoint rect = item->ClientToScreen(wxPoint(0, 0)); + wxPoint rect = item->ClientToScreen(wxPoint(0, 0)); // update ams data - DeviceManager *dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager(); + DeviceManager* dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev_manager) return; - MachineObject *obj_ = dev_manager->get_selected_machine(); + MachineObject* obj_ = dev_manager->get_selected_machine(); if (obj_ && obj_->is_support_ams_mapping()) { if (m_mapping_popup.IsShown()) return; @@ -3372,10 +3477,10 @@ void SelectMachineDialog::set_default() pos.y += item->GetRect().height; m_mapping_popup.Move(pos); - if (obj_ && - obj_->has_ams() && + if (obj_ && + obj_->has_ams() && m_ams_check->GetValue() && - obj_->dev_id == m_printer_last_select) + obj_->dev_id == m_printer_last_select) { m_mapping_popup.set_parent_item(item); m_mapping_popup.set_current_filament_id(extruder); @@ -3384,18 +3489,18 @@ void SelectMachineDialog::set_default() m_mapping_popup.Popup(); } } - }); + }); - Material *material_item = new Material(); - material_item->id = extruder; - material_item->item = item; - m_materialList[i] = material_item; + Material* material_item = new Material(); + material_item->id = extruder; + material_item->item = item; + m_materialList[i] = material_item; // build for ams mapping if (extruder < materials.size() && extruder >= 0) { FilamentInfo info; - info.id = extruder; - info.type = materials[extruder]; + info.id = extruder; + info.type = materials[extruder]; info.brand = brands[extruder]; info.color = colour_rgb.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(); m_filaments.push_back(info); @@ -3404,16 +3509,14 @@ void SelectMachineDialog::set_default() if (extruders.size() <= 4) { m_sizer_material->SetCols(extruders.size()); - } else { + } + else { m_sizer_material->SetCols(4); } m_scrollable_region->Layout(); m_scrollable_region->Fit(); - //m_scrollable_view->Layout(); - //m_scrollable_view->Fit(); - m_scrollable_view->SetSize(m_scrollable_region->GetSize()); m_scrollable_view->SetMinSize(m_scrollable_region->GetSize()); m_scrollable_view->SetMaxSize(m_scrollable_region->GetSize()); @@ -3427,27 +3530,21 @@ void SelectMachineDialog::set_default() set_flow_calibration_state(true); } - Layout(); - Fit(); - - wxSize screenSize = wxGetDisplaySize(); auto dialogSize = this->GetSize(); - #ifdef __WINDOWS__ +#ifdef __WINDOWS__ if (screenSize.y < dialogSize.y) { m_need_adaptation_screen = true; m_scrollable_view->SetScrollRate(0, 5); m_scrollable_view->SetSize(wxSize(-1, FromDIP(220))); m_scrollable_view->SetMinSize(wxSize(-1, FromDIP(220))); m_scrollable_view->SetMaxSize(wxSize(-1, FromDIP(220))); - } else { - /* m_scrollable_view->SetSize(m_scrollable_region->GetSize()); - m_scrollable_view->SetMinSize(m_scrollable_region->GetSize()); - m_scrollable_view->SetMaxSize(m_scrollable_region->GetSize());*/ + } + else { m_scrollable_view->SetScrollRate(0, 0); } - #endif // __WXOSX_MAC__ +#endif // __WXOSX_MAC__ reset_ams_material(); @@ -3455,7 +3552,7 @@ void SelectMachineDialog::set_default() // basic info auto aprint_stats = m_plater->get_partplate_list().get_current_fff_print().print_statistics(); wxString time; - PartPlate *plate = m_plater->get_partplate_list().get_curr_plate(); + PartPlate* plate = m_plater->get_partplate_list().get_curr_plate(); if (plate) { if (plate->get_slice_result()) { time = wxString::Format("%s", short_time(get_time_dhms(plate->get_slice_result()->print_statistics.modes[0].time))); } } @@ -3467,6 +3564,181 @@ void SelectMachineDialog::set_default() m_stext_weight->SetLabel(weight); } +void SelectMachineDialog::set_default_from_sdcard() +{ + m_print_plate_total = m_required_data_plate_data_list.size(); + update_page_turn_state(true); + + ThumbnailData& data = m_required_data_plate_data_list[m_print_plate_idx]->plate_thumbnail; + wxMemoryInputStream mis((unsigned char*)data.pixels.data(), data.pixels.size()); + wxImage image = wxImage(mis); + image = image.Rescale(FromDIP(256), FromDIP(256)); + m_thumbnailPanel->set_thumbnail(image); + + //for black list + std::vector materials; + std::vector brands; + std::vector display_materials; + + for (auto i = 0; i < m_required_data_plate_data_list[m_print_plate_idx]->slice_filaments_info.size(); i++) { + FilamentInfo fo = m_required_data_plate_data_list[m_print_plate_idx]->slice_filaments_info[i]; + display_materials.push_back(fo.type); + materials.push_back(fo.type); + brands.push_back(fo.brand); + } + + //init MaterialItem + MaterialHash::iterator iter = m_materialList.begin(); + while (iter != m_materialList.end()) { + int id = iter->first; + Material* item = iter->second; + item->item->Destroy(); + delete item; + iter++; + } + + m_ams_mapping_result.clear(); + m_sizer_material->Clear(); + m_materialList.clear(); + m_filaments.clear(); + + + for (auto i = 0; i < m_required_data_plate_data_list[m_print_plate_idx]->slice_filaments_info.size(); i++) { + FilamentInfo fo = m_required_data_plate_data_list[m_print_plate_idx]->slice_filaments_info[i]; + + MaterialItem* item = new MaterialItem(m_scrollable_region, wxColour(fo.color), fo.type); + m_sizer_material->Add(item, 0, wxALL, FromDIP(4)); + + item->Bind(wxEVT_LEFT_UP, [this, item, materials](wxMouseEvent& e) {}); + item->Bind(wxEVT_LEFT_DOWN, [this, item, materials, fo](wxMouseEvent& e) { + MaterialHash::iterator iter = m_materialList.begin(); + while (iter != m_materialList.end()) { + int id = iter->first; + Material* item = iter->second; + MaterialItem* m = item->item; + m->on_normal(); + iter++; + } + + try { + m_current_filament_id = fo.id; + } + catch (...) {} + item->on_selected(); + + + auto mouse_pos = ClientToScreen(e.GetPosition()); + wxPoint rect = item->ClientToScreen(wxPoint(0, 0)); + // update ams data + DeviceManager* dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev_manager) return; + MachineObject* obj_ = dev_manager->get_selected_machine(); + + if (obj_ && obj_->is_support_ams_mapping()) { + if (m_mapping_popup.IsShown()) return; + wxPoint pos = item->ClientToScreen(wxPoint(0, 0)); + pos.y += item->GetRect().height; + m_mapping_popup.Move(pos); + + if (obj_ && + obj_->has_ams() && + m_ams_check->GetValue() && + obj_->dev_id == m_printer_last_select) + { + m_mapping_popup.set_parent_item(item); + m_mapping_popup.set_current_filament_id(fo.id); + m_mapping_popup.set_tag_texture(fo.type); + m_mapping_popup.update_ams_data(obj_->amsList); + m_mapping_popup.Popup(); + } + } + }); + + Material* material_item = new Material(); + material_item->id = fo.id; + material_item->item = item; + m_materialList[i] = material_item; + + // build for ams mapping + m_filaments.push_back(fo); + } + + if (m_required_data_plate_data_list[m_print_plate_idx]->slice_filaments_info.size() <= 4) { + m_sizer_material->SetCols(m_required_data_plate_data_list[m_print_plate_idx]->slice_filaments_info.size()); + } + else { + m_sizer_material->SetCols(4); + } + + m_scrollable_region->Layout(); + m_scrollable_region->Fit(); + + m_scrollable_view->SetSize(m_scrollable_region->GetSize()); + m_scrollable_view->SetMinSize(m_scrollable_region->GetSize()); + m_scrollable_view->SetMaxSize(m_scrollable_region->GetSize()); + + //disable pei bed + auto bed_type = m_plater->get_partplate_list().get_curr_plate()->get_bed_type(true); + if (bed_type == BedType::btPTE) { + set_flow_calibration_state(false); + } + else { + set_flow_calibration_state(true); + } + + wxSize screenSize = wxGetDisplaySize(); + auto dialogSize = this->GetSize(); + +#ifdef __WINDOWS__ + if (screenSize.y < dialogSize.y) { + m_need_adaptation_screen = true; + m_scrollable_view->SetScrollRate(0, 5); + m_scrollable_view->SetSize(wxSize(-1, FromDIP(220))); + m_scrollable_view->SetMinSize(wxSize(-1, FromDIP(220))); + m_scrollable_view->SetMaxSize(wxSize(-1, FromDIP(220))); + } + else { + m_scrollable_view->SetScrollRate(0, 0); + } +#endif // __WXOSX_MAC__ + + + reset_ams_material(); + + // basic info + auto aprint_stats = m_plater->get_partplate_list().get_current_fff_print().print_statistics(); + wxString time; + PartPlate* plate = m_plater->get_partplate_list().get_curr_plate(); + if (plate) { + if (plate->get_slice_result()) { time = wxString::Format("%s", short_time(get_time_dhms(plate->get_slice_result()->print_statistics.modes[0].time))); } + } + + char weight[64]; + ::sprintf(weight, " %.2f g", aprint_stats.total_weight); + + m_stext_time->SetLabel(time); + m_stext_weight->SetLabel(weight); +} + +void SelectMachineDialog::update_page_turn_state(bool show) +{ + m_bitmap_last_plate->Show(show); + m_bitmap_next_plate->Show(show); + + if (show) { + if (m_print_plate_idx <= 0) { m_bitmap_last_plate->Hide(); } + else { m_bitmap_last_plate->Show(); } + + if ((m_print_plate_idx + 1) >= m_print_plate_total) { m_bitmap_next_plate->Hide(); } + else { m_bitmap_next_plate->Show(); } + + if (m_print_plate_total == 1) { + m_bitmap_last_plate->Show(false); + m_bitmap_next_plate->Show(false); + } + } +} + void SelectMachineDialog::sys_color_changed() { if (wxGetApp(). dark_mode()) { @@ -3490,6 +3762,15 @@ bool SelectMachineDialog::Show(bool show) update_user_machine_list(); //update_lan_machine_list(); } + else { + DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (dev) { + MachineObject* obj_ = dev->get_selected_machine(); + if (obj_->connection_type() == "cloud") { + obj_->disconnect(); + } + } + } if (show) { m_refresh_timer->Start(LIST_REFRESH_INTERVAL); @@ -3697,7 +3978,7 @@ void EditDevNameDialog::on_edit_name(wxCommandEvent &e) SetBackgroundStyle(wxBG_STYLE_CUSTOM); wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); m_staticbitmap = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize); - sizer->Add(m_staticbitmap, 1, wxEXPAND|wxALL, 0); + sizer->Add(m_staticbitmap, 1, wxEXPAND, 0); SetSizer(sizer); Layout(); Fit(); diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index 913fdff06..ef3ec35ab 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -57,6 +57,11 @@ enum PrinterBindState { ALLOW_UNBIND }; +enum PrintFromType { + FROM_NORMAL, + FROM_SDCARD_VIEW, +}; + class Material { public: @@ -272,7 +277,9 @@ class SelectMachineDialog : public DPIDialog private: int m_current_filament_id{0}; int m_print_plate_idx{0}; + int m_print_plate_total{0}; int m_timeout_count{0}; + int m_print_error_code; bool m_is_in_sending_mode{ false }; bool m_ams_mapping_res{ false }; bool m_ams_mapping_valid{ false }; @@ -280,22 +287,32 @@ private: bool m_export_3mf_cancel{ false }; bool m_is_canceled{ false }; bool m_is_rename_mode{ false }; - + std::string m_print_error_msg; + std::string m_print_error_extra; std::string m_printer_last_select; std::string m_print_info; wxString m_current_project_name; PrintDialogStatus m_print_status { PrintStatusInit }; - wxColour m_colour_def_color{wxColour(255, 255, 255)}; wxColour m_colour_bold_color{wxColour(38, 46, 48)}; StateColor m_btn_bg_enable; - + + std::map m_checkbox_list; + std::map m_checkbox_state_list; std::vector m_bedtype_list; + std::vector m_list; + std::vector m_filaments; + std::vector m_ams_mapping_result; + std::shared_ptr m_status_bar; + wxObjectDataPtr m_machine_model; - std::map m_checkbox_list; - std::map m_checkbox_state_list; + Slic3r::DynamicPrintConfig m_required_data_config; + Slic3r::Model m_required_data_model; + Slic3r::PlateDataPtrs m_required_data_plate_data_list; + std::string m_required_data_file_name; protected: + PrintFromType m_print_type{FROM_NORMAL}; AmsMapingPopup m_mapping_popup{ nullptr }; AmsMapingTipPopup m_mapping_tip_popup{ nullptr }; AmsTutorialPopup m_mapping_tutorial_popup{ nullptr }; @@ -316,6 +333,8 @@ protected: ComboBox* m_comboBox_printer{ nullptr }; ComboBox* m_comboBox_bed{ nullptr }; wxStaticBitmap* m_staticbitmap{ nullptr }; + wxStaticBitmap* m_bitmap_last_plate{ nullptr }; + wxStaticBitmap* m_bitmap_next_plate{ nullptr }; ThumbnailPanel* m_thumbnailPanel{ nullptr }; wxWindow* select_bed{ nullptr }; wxWindow* select_flow{ nullptr }; @@ -351,19 +370,7 @@ protected: std::shared_ptr m_print_job; wxScrolledWindow* m_scrollable_view; wxScrolledWindow* m_sw_print_failed_info{nullptr}; - - /* model */ - wxObjectDataPtr m_machine_model; - std::shared_ptr m_status_bar; - - /*error info*/ - int m_print_error_code; - std::string m_print_error_msg; - std::string m_print_error_extra; - - std::vector m_list; - std::vector m_filaments; - std::vector m_ams_mapping_result; /* ams mapping data */ + wxHyperlinkCtrl* m_hyperlink{nullptr}; public: SelectMachineDialog(Plater *plater = nullptr); ~SelectMachineDialog(); @@ -394,12 +401,16 @@ public: void on_cancel(wxCloseEvent& event); void show_errors(wxString& info); void on_ok_btn(wxCommandEvent& event); - void on_ok(); + void connect_printer_mqtt(); + void on_send_print(); void clear_ip_address_config(wxCommandEvent& e); void on_refresh(wxCommandEvent& event); void on_set_finish_mapping(wxCommandEvent& evt); void on_print_job_cancel(wxCommandEvent& evt); void set_default(); + void set_default_normal(); + void set_default_from_sdcard(); + void update_page_turn_state(bool show); void on_timer(wxTimerEvent& event); void on_selection_changed(wxCommandEvent& event); void Enable_Refresh_Button(bool en); @@ -417,10 +428,13 @@ public: bool is_same_printer_model(); bool has_tips(MachineObject* obj); bool is_timeout(); + void update_print_required_data(Slic3r::DynamicPrintConfig config, Slic3r::Model model, Slic3r::PlateDataPtrs plate_data_list, std::string file_name); + void set_print_type(PrintFromType type) {m_print_type = type;}; bool Show(bool show); bool do_ams_mapping(MachineObject* obj_); bool get_ams_mapping_result(std::string& mapping_array_str, std::string& ams_mapping_info); + PrintFromType get_print_type() {return m_print_type;}; wxString format_text(wxString &m_msg); wxWindow* create_ams_checkbox(wxString title, wxWindow* parent, wxString tooltip); wxWindow* create_item_checkbox(wxString title, wxWindow* parent, wxString tooltip, std::string param); @@ -449,10 +463,10 @@ public: void on_dpi_changed(const wxRect &suggested_rect) override; void on_edit_name(wxCommandEvent &e); - MachineObject *m_info {nullptr}; - wxStaticText* m_static_valid {nullptr}; - ::TextInput* m_textCtr {nullptr}; - Button* m_button_confirm {nullptr}; + Button* m_button_confirm{nullptr}; + TextInput* m_textCtr{nullptr}; + wxStaticText* m_static_valid{nullptr}; + MachineObject* m_info{nullptr}; }; @@ -466,11 +480,13 @@ public: wxWindowID winid = wxID_ANY, const wxPoint & pos = wxDefaultPosition, const wxSize & size = wxDefaultSize); + ~ThumbnailPanel(); + void OnPaint(wxPaintEvent &event); void PaintBackground(wxDC &dc); void OnEraseBackground(wxEraseEvent &event); void set_thumbnail(wxImage img); - ~ThumbnailPanel(); + }; }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/SendToPrinter.cpp b/src/slic3r/GUI/SendToPrinter.cpp index 46dc52a8a..a52ce2c3d 100644 --- a/src/slic3r/GUI/SendToPrinter.cpp +++ b/src/slic3r/GUI/SendToPrinter.cpp @@ -791,7 +791,8 @@ void SendToPrinterDialog::on_ok(wxCommandEvent &event) m_send_job = std::make_shared(m_status_bar, m_plater, m_printer_last_select); m_send_job->m_dev_ip = obj_->dev_ip; m_send_job->m_access_code = obj_->get_access_code(); - m_send_job->m_local_use_ssl = obj_->local_use_ssl; + m_send_job->m_local_use_ssl_for_ftp = obj_->local_use_ssl_for_ftp; + m_send_job->m_local_use_ssl_for_mqtt = obj_->local_use_ssl_for_mqtt; m_send_job->connection_type = obj_->connection_type(); m_send_job->cloud_print_only = true; m_send_job->has_sdcard = obj_->has_sdcard(); diff --git a/src/slic3r/Utils/bambu_networking.hpp b/src/slic3r/Utils/bambu_networking.hpp index 3a4f770b8..3250b6673 100644 --- a/src/slic3r/Utils/bambu_networking.hpp +++ b/src/slic3r/Utils/bambu_networking.hpp @@ -170,10 +170,12 @@ struct PrintParams { std::string comments; int origin_profile_id = 0; std::string origin_model_id; + std::string print_type; /* access options */ std::string dev_ip; - bool use_ssl; + bool use_ssl_for_ftp; + bool use_ssl_for_mqtt; std::string username; std::string password;