From 7d147cc550f0f2e514843a29bab10d6a69d32599 Mon Sep 17 00:00:00 2001 From: hemai Date: Tue, 8 Jul 2025 19:23:38 +0800 Subject: [PATCH] FIX: parts file download failed && canvas display error Jira: [STUDIO-13253] Change-Id: I6ce11c0ceb1c4f7ed49c41eb9c6d7a6d96e866f9 (cherry picked from commit 37f742007bc168d8a3365ca617c7bd27bafca038) --- src/slic3r/GUI/DeviceManager.cpp | 4 +- src/slic3r/GUI/PartSkipDialog.cpp | 575 +++++++++---------- src/slic3r/GUI/PartSkipDialog.hpp | 110 ++-- src/slic3r/GUI/Printer/PrinterFileSystem.cpp | 30 +- src/slic3r/GUI/Printer/PrinterFileSystem.h | 2 + src/slic3r/GUI/SkipPartCanvas.cpp | 18 +- src/slic3r/GUI/SkipPartCanvas.hpp | 2 +- src/slic3r/GUI/Widgets/AnimaController.cpp | 14 +- 8 files changed, 379 insertions(+), 376 deletions(-) diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 2e4ae75ada..396ed8e17b 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -5216,6 +5216,7 @@ void MachineObject::update_slice_info(std::string project_id, std::string profil if (plate_idx >= 0) { plate_index = plate_idx; + this->m_plate_index = plate_idx; } else { std::string subtask_json; @@ -5278,8 +5279,7 @@ void MachineObject::update_slice_info(std::string project_id, std::string profil BOOST_LOG_TRIVIAL(error) << "task_info: get subtask id failed!"; } } - - this->m_plate_index = plate_index; + // this->m_plate_index = plate_index; }); } } diff --git a/src/slic3r/GUI/PartSkipDialog.cpp b/src/slic3r/GUI/PartSkipDialog.cpp index 2b847fd0a0..9b927aa594 100644 --- a/src/slic3r/GUI/PartSkipDialog.cpp +++ b/src/slic3r/GUI/PartSkipDialog.cpp @@ -27,16 +27,14 @@ #include "SkipPartCanvas.hpp" #include "MediaPlayCtrl.h" - namespace Slic3r { namespace GUI { extern wxString hide_passwd(wxString url, std::vector const &passwords); extern void refresh_agora_url(char const *device, char const *dev_ver, char const *channel, void *context, void (*callback)(void *context, char const *url)); - -PartSkipDialog::PartSkipDialog(wxWindow* parent): DPIDialog(parent, wxID_ANY, _L("Skip Objects"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) +PartSkipDialog::PartSkipDialog(wxWindow *parent) : DPIDialog(parent, wxID_ANY, _L("Skip Objects"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) { - std::time_t t = std::time(0); + std::time_t t = std::time(0); std::stringstream buf; buf << put_time(std::localtime(&t), "%a_%b_%d_%H_%M_%S/"); m_timestamp = buf.str(); @@ -45,37 +43,35 @@ PartSkipDialog::PartSkipDialog(wxWindow* parent): DPIDialog(parent, wxID_ANY, _L SetIcon(wxIcon(Slic3r::encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); SetBackgroundColour(*wxWHITE); - m_sizer = new wxBoxSizer( wxVERTICAL ); + m_sizer = new wxBoxSizer(wxVERTICAL); m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); m_line_top->SetMinSize(wxSize(-1, 1)); m_line_top->SetBackgroundColour(wxColour(0xA6, 0xa9, 0xAA)); - m_sizer->Add(m_line_top, 0, wxEXPAND | wxTOP, FromDIP(5)); + m_sizer->Add(m_line_top, 0, wxEXPAND | wxTOP, FromDIP(0)); - - m_simplebook = new wxSimplebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0); + m_simplebook = new wxSimplebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0); m_simplebook->SetMinSize(wxSize(FromDIP(720), FromDIP(535))); m_simplebook->SetMaxSize(wxSize(FromDIP(720), FromDIP(535))); - m_book_first_panel = new wxPanel(m_simplebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_book_first_panel = new wxPanel(m_simplebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); m_book_third_panel = new wxPanel(m_simplebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); m_book_third_panel->SetBackgroundColour(*wxWHITE); - m_dlg_sizer = new wxBoxSizer( wxVERTICAL ); - m_dlg_content_sizer = new wxBoxSizer( wxHORIZONTAL ); - m_canvas_sizer = new wxBoxSizer( wxVERTICAL ); + m_dlg_sizer = new wxBoxSizer(wxVERTICAL); + m_dlg_content_sizer = new wxBoxSizer(wxHORIZONTAL); + m_canvas_sizer = new wxBoxSizer(wxVERTICAL); // page 3 - wxGLAttributes canvasAttrs; + wxGLAttributes canvasAttrs; canvasAttrs.PlatformDefaults().Defaults().Stencil(8).EndList(); m_canvas = new SkipPartCanvas(m_book_third_panel, canvasAttrs); - m_canvas->SetMinSize( wxSize( FromDIP(400),FromDIP(400) ) ); - m_canvas->SetMaxSize( wxSize( FromDIP(400),FromDIP(400) ) ); + m_canvas->SetMinSize(wxSize(FromDIP(400), FromDIP(400))); + m_canvas->SetMaxSize(wxSize(FromDIP(400), FromDIP(400))); - - m_canvas_btn_sizer = new wxBoxSizer( wxHORIZONTAL ); - m_canvas_btn_sizer->SetMinSize( wxSize( -1,FromDIP(28))); + m_canvas_btn_sizer = new wxBoxSizer(wxHORIZONTAL); + m_canvas_btn_sizer->SetMinSize(wxSize(-1, FromDIP(28))); StateColor zoom_bg(std::pair(wxColour(255, 255, 255), StateColor::Disabled), std::pair(wxColour(206, 206, 206), StateColor::Pressed), - std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(wxColour(255, 255, 255), StateColor::Enabled), + std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(wxColour(255, 255, 255), StateColor::Enabled), std::pair(wxColour(255, 255, 255), StateColor::Normal)); zoom_bg.setTakeFocusedAsHovered(false); StateColor zoom_bd(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); @@ -89,10 +85,9 @@ PartSkipDialog::PartSkipDialog(wxWindow* parent): DPIDialog(parent, wxID_ANY, _L m_zoom_out_btn->SetCornerRadius(0); m_zoom_out_btn->SetMinSize(wxSize(FromDIP(56), FromDIP(28))); - StateColor percent_bg(std::pair(wxColour(255, 255, 255), StateColor::Disabled), std::pair(wxColour(255, 255, 255), StateColor::Pressed), std::pair(wxColour(255, 255, 255), StateColor::Hovered), std::pair(wxColour(255, 255, 255), StateColor::Enabled), - std::pair(wxColour(255, 255, 255), StateColor::Normal)); + std::pair(wxColour(255, 255, 255), StateColor::Normal)); m_percent_label = new Button(m_book_third_panel, _L("100 %")); m_percent_label->SetBackgroundColor(percent_bg); m_percent_label->SetBorderColor(wxColour(238, 238, 238)); @@ -107,24 +102,24 @@ PartSkipDialog::PartSkipDialog(wxWindow* parent): DPIDialog(parent, wxID_ANY, _L m_zoom_in_btn->SetMinSize(wxSize(FromDIP(56), FromDIP(28))); m_zoom_in_btn->SetCornerRadius(0); - m_switch_drag_btn = new Button(m_book_third_panel, wxEmptyString); + m_switch_drag_btn = new Button(m_book_third_panel, wxEmptyString); m_switch_drag_btn->SetIcon("canvas_drag"); m_switch_drag_btn->SetToolTip(_L("Drag")); m_switch_drag_btn->SetBackgroundColor(*wxWHITE); m_switch_drag_btn->SetBorderColor(wxColour(238, 238, 238)); - m_switch_drag_btn->SetMinSize(wxSize(FromDIP(56),FromDIP(28))); + m_switch_drag_btn->SetMinSize(wxSize(FromDIP(56), FromDIP(28))); m_switch_drag_btn->SetCornerRadius(0); m_canvas_btn_sizer->Add(m_zoom_out_btn, 0, wxEXPAND | wxLEFT, FromDIP(105)); - m_canvas_btn_sizer->Add( m_percent_label, 0, wxEXPAND, 0 ); - m_canvas_btn_sizer->Add(m_zoom_in_btn, 0, wxEXPAND, 0); - m_canvas_btn_sizer->Add( m_switch_drag_btn, 0, wxEXPAND | wxRIGHT, FromDIP(88) ); + m_canvas_btn_sizer->Add(m_percent_label, 0, wxEXPAND, 0); + m_canvas_btn_sizer->Add(m_zoom_in_btn, 0, wxEXPAND, 0); + m_canvas_btn_sizer->Add(m_switch_drag_btn, 0, wxEXPAND | wxRIGHT, FromDIP(88)); - m_list_sizer = new wxBoxSizer( wxVERTICAL ); - m_list_sizer->SetMinSize( wxSize( FromDIP(267),FromDIP(422) ) ); + m_list_sizer = new wxBoxSizer(wxVERTICAL); + m_list_sizer->SetMinSize(wxSize(FromDIP(267), FromDIP(422))); - auto all_checkbox_sizer = new wxBoxSizer(wxHORIZONTAL); - m_all_checkbox = new CheckBox(m_book_third_panel, wxID_ANY); + auto all_checkbox_sizer = new wxBoxSizer(wxHORIZONTAL); + m_all_checkbox = new CheckBox(m_book_third_panel, wxID_ANY); m_all_checkbox->SetValue(false); m_all_checkbox->SetMinSize(wxSize(FromDIP(18), FromDIP(18))); m_all_checkbox->SetBackgroundColour(*wxWHITE); @@ -136,36 +131,36 @@ PartSkipDialog::PartSkipDialog(wxWindow* parent): DPIDialog(parent, wxID_ANY, _L m_all_label->SetMinSize(wxSize(267, -1)); m_all_label->SetMaxSize(wxSize(267, -1)); all_checkbox_sizer->Add(m_all_checkbox, 0, wxALIGN_CENTER_VERTICAL, 0); - all_checkbox_sizer->Add(m_all_label, 0, wxLEFT| wxALIGN_CENTER_VERTICAL, FromDIP(8)); + all_checkbox_sizer->Add(m_all_label, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(8)); - m_line = new wxPanel(m_book_third_panel, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(267), FromDIP(1)), wxTAB_TRAVERSAL); - m_line->SetMinSize(wxSize(FromDIP(267), 1)); + m_line = new wxPanel(m_book_third_panel, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(267), FromDIP(1)), wxTAB_TRAVERSAL); + m_line->SetMinSize(wxSize(FromDIP(267), 1)); m_line->SetMaxSize(wxSize(FromDIP(267), 1)); - m_line->SetBackgroundColour( wxColor(238, 238, 238) ); + m_line->SetBackgroundColour(wxColor(238, 238, 238)); - m_list_view = new wxScrolledWindow( m_book_third_panel, wxID_ANY, wxDefaultPosition, wxSize( 267,-1 ), wxHSCROLL|wxVSCROLL ); - m_list_view->SetScrollRate( 5, 5 ); - m_list_view->SetMinSize( wxSize( FromDIP(267),FromDIP(378))); + m_list_view = new wxScrolledWindow(m_book_third_panel, wxID_ANY, wxDefaultPosition, wxSize(267, -1), wxHSCROLL | wxVSCROLL); + m_list_view->SetScrollRate(5, 5); + m_list_view->SetMinSize(wxSize(FromDIP(267), FromDIP(378))); m_list_view->SetMaxSize(wxSize(FromDIP(267), FromDIP(378))); m_list_view->SetBackgroundColour(*wxWHITE); m_scroll_sizer = new wxBoxSizer(wxVERTICAL); - m_list_view->SetSizer(m_scroll_sizer); - m_list_view->Layout(); + m_list_view->SetSizer(m_scroll_sizer); + m_list_view->Layout(); - m_dlg_btn_sizer = new wxBoxSizer( wxHORIZONTAL ); + m_dlg_btn_sizer = new wxBoxSizer(wxHORIZONTAL); m_dlg_btn_sizer->SetMinSize(wxSize(-1, FromDIP(54))); - m_cnt_label = new Label(m_book_third_panel, wxEmptyString); - m_cnt_label->Wrap( -1 ); + m_cnt_label = new Label(m_book_third_panel, wxEmptyString); + m_cnt_label->Wrap(-1); m_cnt_label->SetBackgroundColour(*wxWHITE); m_cnt_label->SetForegroundColour(wxColour(0, 174, 66)); - m_cnt_label->SetFont(Label::Head_15); + m_cnt_label->SetFont(Label::Head_16); m_cnt_label->SetSize(wxSize(-1, FromDIP(20))); m_cnt_label->SetMaxSize(wxSize(-1, FromDIP(20))); - m_tot_label = new Label(m_book_third_panel, wxEmptyString); - m_tot_label->Wrap( -1 ); + m_tot_label = new Label(m_book_third_panel, wxEmptyString); + m_tot_label->Wrap(-1); m_tot_label->SetBackgroundColour(*wxWHITE); m_tot_label->SetMinSize(wxSize(FromDIP(200), FromDIP(20))); @@ -184,55 +179,54 @@ PartSkipDialog::PartSkipDialog(wxWindow* parent): DPIDialog(parent, wxID_ANY, _L m_apply_btn->SetMinSize(wxSize(FromDIP(80), FromDIP(32))); m_apply_btn->SetCornerRadius(FromDIP(16)); - - m_canvas_sizer->Add( m_canvas, 0, wxLEFT | wxTOP | wxEXPAND, FromDIP(17) ); - m_canvas_sizer->Add(m_canvas_btn_sizer, 0, wxTOP , FromDIP(8)); + m_canvas_sizer->Add(m_canvas, 0, wxLEFT | wxTOP | wxEXPAND, FromDIP(17)); + m_canvas_sizer->Add(m_canvas_btn_sizer, 0, wxTOP, FromDIP(8)); m_list_sizer->Add(0, 0, 1, wxEXPAND, 0); - m_list_sizer->Add(0, 0, 0, wxTOP , FromDIP(27)); - m_list_sizer->Add(all_checkbox_sizer, 0, wxLEFT , FromDIP(0)); - m_list_sizer->Add(m_line, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(12)); + m_list_sizer->Add(0, 0, 0, wxTOP, FromDIP(27)); + m_list_sizer->Add(all_checkbox_sizer, 0, wxLEFT, FromDIP(0)); + m_list_sizer->Add(m_line, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(12)); m_list_sizer->Add(m_list_view, 0, wxEXPAND, 0); m_list_sizer->Add(0, 0, 1, wxEXPAND, 0); - m_dlg_content_sizer->Add( m_canvas_sizer, 0, wxEXPAND, FromDIP(0) ); - m_dlg_content_sizer->Add( 0, 0, 0, wxEXPAND | wxLEFT, FromDIP(22) ); - m_dlg_content_sizer->Add( m_list_sizer, 0, wxRIGHT | wxEXPAND, FromDIP(14) ); + m_dlg_content_sizer->Add(m_canvas_sizer, 0, wxEXPAND, FromDIP(0)); + m_dlg_content_sizer->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(22)); + m_dlg_content_sizer->Add(m_list_sizer, 0, wxRIGHT | wxEXPAND, FromDIP(14)); m_dlg_btn_sizer->Add(0, 0, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(21)); m_dlg_btn_sizer->Add(m_cnt_label, 0, wxALIGN_CENTER_VERTICAL, FromDIP(0) ); #ifdef __WXMSW__ m_dlg_btn_sizer->Add(m_tot_label, 0, wxLEFT |wxTOP| wxALIGN_CENTER_VERTICAL, FromDIP(2)); #else - m_dlg_btn_sizer->Add(m_tot_label, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 0); + m_dlg_btn_sizer->Add(m_tot_label, 0, wxALIGN_CENTER_VERTICAL, 0); #endif m_dlg_btn_sizer->Add(0, 0, 1, wxEXPAND | wxALIGN_CENTER_VERTICAL, FromDIP(0)); - m_dlg_btn_sizer->Add(m_apply_btn, 0, wxALIGN_CENTER_VERTICAL, FromDIP(0)); - m_dlg_btn_sizer->Add(0, 0, 0, wxLEFT | wxEXPAND| wxALIGN_CENTER_VERTICAL, FromDIP(24)); + m_dlg_btn_sizer->Add(m_apply_btn, 0, wxALIGN_CENTER_VERTICAL, FromDIP(0)); + m_dlg_btn_sizer->Add(0, 0, 0, wxLEFT | wxEXPAND | wxALIGN_CENTER_VERTICAL, FromDIP(24)); m_dlg_placeholder = new wxPanel(m_book_third_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); m_dlg_placeholder->SetMinSize(wxSize(-1, FromDIP(15))); m_dlg_placeholder->SetMaxSize(wxSize(-1, FromDIP(15))); m_dlg_placeholder->SetBackgroundColour(*wxWHITE); - m_dlg_sizer->Add( m_dlg_content_sizer, 1, wxEXPAND, FromDIP(0) ); + m_dlg_sizer->Add(m_dlg_content_sizer, 1, wxEXPAND, FromDIP(0)); // m_dlg_sizer->Add( 0, 0, 1, wxEXPAND, FromDIP(0)); - m_dlg_sizer->Add( m_dlg_btn_sizer, 0, wxEXPAND, FromDIP(0)); - m_dlg_sizer->Add( m_dlg_placeholder, 0, 0, wxEXPAND, 0); + m_dlg_sizer->Add(m_dlg_btn_sizer, 0, wxEXPAND, FromDIP(0)); + m_dlg_sizer->Add(m_dlg_placeholder, 0, 0, wxEXPAND, 0); - m_book_third_panel->SetSizer( m_dlg_sizer ); - m_book_third_panel->Layout(); - m_dlg_sizer->Fit( m_book_third_panel ); + m_book_third_panel->SetSizer(m_dlg_sizer); + m_book_third_panel->Layout(); + m_dlg_sizer->Fit(m_book_third_panel); // page 2 - m_book_second_panel = new wxPanel( m_simplebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_book_second_panel = new wxPanel(m_simplebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); m_book_second_panel->SetBackgroundColour(*wxWHITE); - m_book_second_sizer = new wxBoxSizer( wxVERTICAL ); - m_book_second_btn_sizer = new wxBoxSizer( wxHORIZONTAL ); + m_book_second_sizer = new wxBoxSizer(wxVERTICAL); + m_book_second_btn_sizer = new wxBoxSizer(wxHORIZONTAL); m_retry_bitmap = new wxStaticBitmap(m_book_second_panel, -1, create_scaled_bitmap("partskip_retry", m_book_second_panel, 200), wxDefaultPosition, wxDefaultSize); - m_retry_label = new Label( m_book_second_panel, _L("Load skipping objects information failed. Please try again.")); - m_retry_label->Wrap( -1 ); + m_retry_label = new Label(m_book_second_panel, _L("Load skipping objects information failed. Please try again.")); + m_retry_label->Wrap(-1); m_retry_label->SetBackgroundColour(*wxWHITE); m_book_second_sizer->Add(0, 0, 1, wxEXPAND, 0); m_book_second_sizer->Add(m_retry_bitmap, 0, wxALIGN_CENTER_HORIZONTAL, 0); @@ -251,42 +245,41 @@ PartSkipDialog::PartSkipDialog(wxWindow* parent): DPIDialog(parent, wxID_ANY, _L m_book_second_btn_sizer->Add(m_second_retry_btn, 0, wxALL, FromDIP(24)); m_book_second_sizer->Add(m_book_second_btn_sizer, 0, wxALIGN_RIGHT, 0); - m_book_second_panel->SetSizer( m_book_second_sizer ); - m_book_second_panel->Layout(); - m_book_second_sizer->Fit( m_book_second_panel ); + m_book_second_panel->SetSizer(m_book_second_sizer); + m_book_second_panel->Layout(); + m_book_second_sizer->Fit(m_book_second_panel); // page 1 - m_book_first_panel = new wxPanel( m_simplebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_book_first_sizer = new wxBoxSizer( wxVERTICAL ); + m_book_first_panel = new wxPanel(m_simplebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_book_first_sizer = new wxBoxSizer(wxVERTICAL); // m_book_first_sizer->SetMinSize(wxSize(FromDIP(720), FromDIP(500))); - auto m_loading_sizer = new wxBoxSizer(wxHORIZONTAL); + auto m_loading_sizer = new wxBoxSizer(wxHORIZONTAL); std::vector list{"ams_rfid_1", "ams_rfid_2", "ams_rfid_3", "ams_rfid_4"}; m_loading_icon = new AnimaIcon(m_book_first_panel, wxID_ANY, list, "refresh_printer", 100); m_loading_icon->SetMinSize(wxSize(FromDIP(25), FromDIP(25))); - m_loading_label = new Label( m_book_first_panel, _L("Loading ...")); - m_loading_label->Wrap( -1 ); + m_loading_label = new Label(m_book_first_panel, _L("Loading ...")); + m_loading_label->Wrap(-1); m_loading_label->SetBackgroundColour(*wxWHITE); - m_loading_sizer->Add(m_loading_icon, 0, wxALL, FromDIP(5)); - m_loading_sizer->Add(m_loading_label, 0, wxALL, FromDIP(5)); + m_loading_sizer->Add(m_loading_icon, 0, wxALIGN_CENTER_VERTICAL, FromDIP(0)); + m_loading_sizer->Add(m_loading_label, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(5)); m_book_first_sizer->Add(0, 0, 1, wxEXPAND, 0); - m_book_first_sizer->Add( m_loading_sizer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0); + m_book_first_sizer->Add(m_loading_sizer, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_CENTER_HORIZONTAL, 0); m_book_first_sizer->Add(0, 0, 1, wxEXPAND, 0); - m_book_first_panel->SetSizer( m_book_first_sizer ); - m_book_first_panel->Layout(); - m_book_first_sizer->Fit( m_book_first_panel ); + m_book_first_panel->SetSizer(m_book_first_sizer); + m_book_first_panel->Layout(); + m_book_first_sizer->Fit(m_book_first_panel); - m_simplebook->AddPage( m_book_first_panel, _("loading page"), false ); - m_simplebook->AddPage( m_book_second_panel, _("retry page"), false ); - m_simplebook->AddPage( m_book_third_panel, _("dialog page"), false ); - m_sizer->Add( m_simplebook, 1, wxEXPAND | wxALL, 5 ); + m_simplebook->AddPage(m_book_first_panel, _("loading page"), false); + m_simplebook->AddPage(m_book_second_panel, _("retry page"), false); + m_simplebook->AddPage(m_book_third_panel, _("dialog page"), false); + m_sizer->Add(m_simplebook, 1, wxEXPAND | wxALL, 5); - - SetSizer( m_sizer ); + SetSizer(m_sizer); m_zoom_in_btn->Bind(wxEVT_BUTTON, &PartSkipDialog::OnZoomIn, this); m_zoom_out_btn->Bind(wxEVT_BUTTON, &PartSkipDialog::OnZoomOut, this); m_switch_drag_btn->Bind(wxEVT_BUTTON, &PartSkipDialog::OnSwitchDrag, this); @@ -296,14 +289,15 @@ PartSkipDialog::PartSkipDialog(wxWindow* parent): DPIDialog(parent, wxID_ANY, _L m_apply_btn->Bind(wxEVT_BUTTON, &PartSkipDialog::OnApplyDialog, this); m_all_checkbox->Bind(wxEVT_TOGGLEBUTTON, &PartSkipDialog::OnAllCheckbox, this); - Fit(); Layout(); + Fit(); CentreOnParent(); } PartSkipDialog::~PartSkipDialog() {} -void PartSkipDialog::on_dpi_changed(const wxRect& suggested_rect) { +void PartSkipDialog::on_dpi_changed(const wxRect &suggested_rect) +{ m_canvas->LoadPickImage(m_local_paths[0]); m_loading_icon->SetMinSize(wxSize(FromDIP(25), FromDIP(25))); @@ -332,7 +326,6 @@ void PartSkipDialog::on_dpi_changed(const wxRect& suggested_rect) { m_line->SetMinSize(wxSize(FromDIP(267), 1)); m_line->SetMaxSize(wxSize(FromDIP(267), 1)); - m_apply_btn->SetMinSize(wxSize(FromDIP(80), FromDIP(32))); m_apply_btn->SetCornerRadius(FromDIP(16)); m_apply_btn->Rescale(); @@ -345,18 +338,16 @@ void PartSkipDialog::on_dpi_changed(const wxRect& suggested_rect) { m_second_retry_btn->SetCornerRadius(FromDIP(16)); m_second_retry_btn->Rescale(); - m_all_checkbox->SetMinSize(wxSize(FromDIP(18), FromDIP(18))); m_all_checkbox->Rescale(); for (auto it = m_scroll_sizer->GetChildren().begin(); it != m_scroll_sizer->GetChildren().end(); ++it) { wxSizerItem *item = *it; if (item && item->IsSizer()) { - wxSizer* sizer = item->GetSizer(); - auto check_item = sizer->GetItem((size_t)0); - if (check_item && check_item->IsWindow()) - { - wxWindow *window = check_item->GetWindow(); + wxSizer *sizer = item->GetSizer(); + auto check_item = sizer->GetItem((size_t) 0); + if (check_item && check_item->IsWindow()) { + wxWindow *window = check_item->GetWindow(); CheckBox *checkbox = dynamic_cast(window); checkbox->SetMinSize(wxSize(FromDIP(18), FromDIP(18))); checkbox->Rescale(); @@ -373,8 +364,8 @@ void PartSkipDialog::on_dpi_changed(const wxRect& suggested_rect) { Layout(); } - -std::string PartSkipDialog::create_tmp_path(){ +std::string PartSkipDialog::create_tmp_path() +{ boost::filesystem::path parent_path(temporary_dir()); std::stringstream buf; @@ -386,53 +377,52 @@ std::string PartSkipDialog::create_tmp_path(){ } else { buf << 1 << "_" << 1 << "/"; } - std::string tmp_path = (parent_path / buf.str() ).string(); + std::string tmp_path = (parent_path / buf.str()).string(); - if (!std::filesystem::exists(tmp_path + "Metadata/") && !fs::create_directories(tmp_path + "Metadata/")) { - wxMessageBox("create file failed."); - } + if (!std::filesystem::exists(tmp_path + "Metadata/") && !fs::create_directories(tmp_path + "Metadata/")) { wxMessageBox("create file failed."); } return tmp_path; } - bool PartSkipDialog::is_local_file_existed(const std::vector &local_paths) { for (auto path : local_paths) { - if (!std::filesystem::exists(path)) { - return false; - } + if (!std::filesystem::exists(path)) { return false; } } return true; } void PartSkipDialog::DownloadPartsFile() { - m_tmp_path = create_tmp_path(); //wxGetApp().app_config->get("download_path"); + m_tmp_path = create_tmp_path(); // wxGetApp().app_config->get("download_path"); m_local_paths.clear(); m_target_paths.clear(); - int plate_idx = m_obj ? m_obj->m_plate_index : 1; + m_plate_idx = m_obj ? m_obj->m_plate_index : -1; + if (m_plate_idx < 0) { + m_plate_idx = 1; + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << "part skip: printer plate index is invalid."; + } - m_local_paths.push_back(m_tmp_path + "Metadata/pick_" + std::to_string(plate_idx) + ".png"); + m_local_paths.push_back(m_tmp_path + "Metadata/pick_" + std::to_string(m_plate_idx) + ".png"); m_local_paths.push_back(m_tmp_path + "Metadata/model_settings.config"); m_local_paths.push_back(m_tmp_path + "Metadata/slice_info.config"); - m_target_paths.push_back("Metadata/pick_" + std::to_string(plate_idx) + ".png"); + m_target_paths.push_back("Metadata/pick_" + std::to_string(m_plate_idx) + ".png"); m_target_paths.push_back("Metadata/model_settings.config"); m_target_paths.push_back("Metadata/slice_info.config"); if (!is_local_file_existed(m_local_paths)) { - if(!m_file_sys){ + if (!m_file_sys) { m_file_sys = boost::make_shared(); m_file_sys->Attached(); m_file_sys->Bind(EVT_STATUS_CHANGED, &PartSkipDialog::OnFileSystemEvent, this); m_file_sys->Bind(EVT_RAMDOWNLOAD, &PartSkipDialog::OnFileSystemResult, this); m_file_sys->Start(); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ <<"part skip: print file system start."; - }else{ + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "part skip: print file system start."; + } else { m_file_sys->Retry(); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ <<"part skip: print file system retry."; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "part skip: print file system retry."; } } else { m_file_sys->SendExistedFile(); @@ -451,59 +441,57 @@ void PartSkipDialog::fetchUrl(boost::weak_ptr wfs) fs->SetUrl("0"); return; } - std::string dev_ver = obj->get_ota_version(); - std::string dev_id = obj->dev_id; + std::string dev_ver = obj->get_ota_version(); + std::string dev_id = obj->dev_id; // int remote_proto = obj->get_file_remote(); NetworkAgent *agent = wxGetApp().getAgent(); std::string agent_version = agent ? agent->get_version() : ""; auto url_state = m_url_state; - if(obj->is_lan_mode_printer()){ - url_state = URL_TCP; - } + if (obj->is_lan_mode_printer()) { url_state = URL_TCP; } if (agent) { switch (url_state) { - case URL_TCP: { - std::string devIP = obj->dev_ip; - std::string accessCode = obj->get_access_code(); - std::string tcp_url = "bambu:///local/" + devIP + "?port=6000&user=" + "bblp" + "&passwd=" + accessCode; - CallAfter([=] { - boost::shared_ptr fs(wfs.lock()); - if (!fs) return; - if (boost::algorithm::starts_with(tcp_url, "bambu:///")) { - fs->SetUrl(tcp_url); - } else { - fs->SetUrl("3"); - } - }); - break; + case URL_TCP: { + std::string devIP = obj->dev_ip; + std::string accessCode = obj->get_access_code(); + std::string tcp_url = "bambu:///local/" + devIP + "?port=6000&user=" + "bblp" + "&passwd=" + accessCode; + CallAfter([=] { + boost::shared_ptr fs(wfs.lock()); + if (!fs) return; + if (boost::algorithm::starts_with(tcp_url, "bambu:///")) { + fs->SetUrl(tcp_url); + } else { + fs->SetUrl("3"); } - case URL_TUTK: { - std::string protocols[] = {"", "\"tutk\"", "\"agora\"", "\"tutk\",\"agora\""}; - agent->get_camera_url(obj->dev_id + "|" + dev_ver + "|" + protocols[3], [this, wfs, m = dev_id, v = agent->get_version(), dv = dev_ver](std::string url) { - if (boost::algorithm::starts_with(url, "bambu:///")) { - url += "&device=" + m; - url += "&net_ver=" + v; - url += "&dev_ver=" + dv; - url += "&refresh_url=" + boost::lexical_cast(&refresh_agora_url); - url += "&cli_id=" + wxGetApp().app_config->get("slicer_uuid"); - url += "&cli_ver=" + std::string(SLIC3R_VERSION); - } - CallAfter([=] { - boost::shared_ptr fs(wfs.lock()); - if (!fs) return; - if (boost::algorithm::starts_with(url, "bambu:///")) { - fs->SetUrl(url); - } else { - fs->SetUrl("3"); - } - }); - }); - break; + }); + break; + } + case URL_TUTK: { + std::string protocols[] = {"", "\"tutk\"", "\"agora\"", "\"tutk\",\"agora\""}; + agent->get_camera_url(obj->dev_id + "|" + dev_ver + "|" + protocols[3], [this, wfs, m = dev_id, v = agent->get_version(), dv = dev_ver](std::string url) { + if (boost::algorithm::starts_with(url, "bambu:///")) { + url += "&device=" + m; + url += "&net_ver=" + v; + url += "&dev_ver=" + dv; + url += "&refresh_url=" + boost::lexical_cast(&refresh_agora_url); + url += "&cli_id=" + wxGetApp().app_config->get("slicer_uuid"); + url += "&cli_ver=" + std::string(SLIC3R_VERSION); } - default: break; + CallAfter([=] { + boost::shared_ptr fs(wfs.lock()); + if (!fs) return; + if (boost::algorithm::starts_with(url, "bambu:///")) { + fs->SetUrl(url); + } else { + fs->SetUrl("3"); + } + }); + }); + break; + } + default: break; } } } @@ -511,7 +499,7 @@ void PartSkipDialog::fetchUrl(boost::weak_ptr wfs) void PartSkipDialog::OnFileSystemEvent(wxCommandEvent &e) { e.Skip(); - auto wfs = boost::weak_ptr(m_file_sys); + auto wfs = boost::weak_ptr(m_file_sys); boost::shared_ptr fs(wfs.lock()); if (!fs) return; @@ -520,25 +508,25 @@ void PartSkipDialog::OnFileSystemEvent(wxCommandEvent &e) // int extra = e.GetExtraLong(); switch (status) { - case PrinterFileSystem::Initializing: - case PrinterFileSystem::Connecting: break; - case PrinterFileSystem::ListSyncing: { - m_file_sys->GetPickImages(m_local_paths, m_target_paths); - break; + case PrinterFileSystem::Initializing: + case PrinterFileSystem::Connecting: break; + case PrinterFileSystem::ListSyncing: { + m_file_sys->GetPickImages(m_local_paths, m_target_paths); + break; + } + case PrinterFileSystem::Failed: { + m_file_sys->Stop(); + if (m_url_state == URL_TCP) { + m_url_state = URL_TUTK; + m_file_sys->Retry(); + BOOST_LOG_TRIVIAL(info) << "part skip: print file system connnect failed first."; + } else { + m_file_sys->SendConnectFail(); + BOOST_LOG_TRIVIAL(info) << "part skip: print file system connnect failed second."; } - case PrinterFileSystem::Failed: { - m_file_sys->Stop(); - if( m_url_state == URL_TCP){ - m_url_state = URL_TUTK; - m_file_sys->Retry(); - BOOST_LOG_TRIVIAL(info) << "part skip: print file system connnect failed first."; - }else{ - m_file_sys->SendConnectFail(); - BOOST_LOG_TRIVIAL(info) << "part skip: print file system connnect failed second."; - } - break; - } - case PrinterFileSystem::Reconnecting: break; + break; + } + case PrinterFileSystem::Reconnecting: break; } if (e.GetInt() == PrinterFileSystem::Initializing) { CallAfter([=] { @@ -551,60 +539,61 @@ void PartSkipDialog::OnFileSystemEvent(wxCommandEvent &e) } // reseter: [TCP -> TUTK(TCP)] -> [TCP -> TUTK(TCP)] -void PartSkipDialog::OnFileSystemResult(wxCommandEvent &event){ +void PartSkipDialog::OnFileSystemResult(wxCommandEvent &event) +{ int result = event.GetInt(); m_loading_icon->Stop(); if (result == 0) { InitDialogUI(); SetSimplebookPage(2); m_file_sys->Stop(); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ <<"part skip: on file system result success."; - }else{ + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "part skip: on file system result success."; + } else { m_url_state = URL_TCP; SetSimplebookPage(1); m_file_sys->Stop(); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ <<"part skip: on file system result failed."; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "part skip: on file system result failed."; } } -void PartSkipDialog::InitSchedule(MachineObject *obj){ +void PartSkipDialog::InitSchedule(MachineObject *obj) +{ m_obj = obj; SetSimplebookPage(0); m_loading_icon->Play(); DownloadPartsFile(); } -void PartSkipDialog::OnRetryButton(wxCommandEvent &event) { +void PartSkipDialog::OnRetryButton(wxCommandEvent &event) +{ event.Skip(); InitSchedule(m_obj); Refresh(); } +bool PartSkipDialog::is_drag_mode() { return m_is_drag == true; } -bool PartSkipDialog::is_drag_mode(){ - return m_is_drag == true; -} - -PartsInfo PartSkipDialog::GetPartsInfo(){ +PartsInfo PartSkipDialog::GetPartsInfo() +{ PartsInfo parts_info; - for (auto [part_id, part_state] : this->m_parts_state) - { - parts_info.push_back(std::pair(part_id, part_state)); - } + for (auto [part_id, part_state] : this->m_parts_state) { parts_info.push_back(std::pair(part_id, part_state)); } return parts_info; } -void PartSkipDialog::OnZoomIn(wxCommandEvent &event){ +void PartSkipDialog::OnZoomIn(wxCommandEvent &event) +{ m_canvas->ZoomIn(20); UpdateZoomPercent(); } -void PartSkipDialog::OnZoomOut(wxCommandEvent &event){ +void PartSkipDialog::OnZoomOut(wxCommandEvent &event) +{ m_canvas->ZoomOut(20); UpdateZoomPercent(); } -void PartSkipDialog::OnSwitchDrag(wxCommandEvent& event){ +void PartSkipDialog::OnSwitchDrag(wxCommandEvent &event) +{ if (this->is_drag_mode()) { m_is_drag = false; m_switch_drag_btn->SetBackgroundColor(*wxWHITE); @@ -617,7 +606,8 @@ void PartSkipDialog::OnSwitchDrag(wxCommandEvent& event){ m_canvas->SwitchDrag(m_is_drag); } -void PartSkipDialog::OnZoomPercent(wxCommandEvent &event) { +void PartSkipDialog::OnZoomPercent(wxCommandEvent &event) +{ m_zoom_percent = event.GetInt(); if (m_zoom_percent >= 1000) { m_zoom_percent = 1000; @@ -637,25 +627,21 @@ void PartSkipDialog::OnZoomPercent(wxCommandEvent &event) { UpdateZoomPercent(); } -void PartSkipDialog::UpdatePartsStateFromCanvas(wxCommandEvent &event) { - int part_id = event.GetExtraLong(); +void PartSkipDialog::UpdatePartsStateFromCanvas(wxCommandEvent &event) +{ + int part_id = event.GetExtraLong(); PartState part_state = PartState(event.GetInt()); m_parts_state[part_id] = part_state; - if(part_state == psUnCheck){ - m_all_checkbox->SetValue(false); - } - if(IsAllChecked()){ - m_all_checkbox->SetValue(true); - } + if (part_state == psUnCheck) { m_all_checkbox->SetValue(false); } + if (IsAllChecked()) { m_all_checkbox->SetValue(true); } UpdateDialogUI(); } -void PartSkipDialog::UpdateZoomPercent() { - m_percent_label->SetLabel(wxString::Format(_L("%d%%"), m_zoom_percent)); -} +void PartSkipDialog::UpdateZoomPercent() { m_percent_label->SetLabel(wxString::Format(_L("%d%%"), m_zoom_percent)); } -void PartSkipDialog::UpdateCountLabel() { +void PartSkipDialog::UpdateCountLabel() +{ int check_cnt = 0; int tot_cnt = 0; for (auto [part_id, part_state] : m_parts_state) { @@ -678,7 +664,8 @@ bool PartSkipDialog::Show(bool show) return DPIDialog::Show(show); } -void PartSkipDialog::InitDialogUI() { +void PartSkipDialog::InitDialogUI() +{ m_print_lock = true; BOOST_LOG_TRIVIAL(info) << "part skip: lock parts info from printer."; m_scroll_sizer->Clear(true); @@ -686,7 +673,7 @@ void PartSkipDialog::InitDialogUI() { m_parts_state.clear(); m_parts_name.clear(); - string pick_img = m_local_paths[0]; + string pick_img = m_local_paths[0]; string slice_info = m_local_paths[2]; m_switch_drag_btn->SetIcon("canvas_drag"); @@ -702,40 +689,40 @@ void PartSkipDialog::InitDialogUI() { ModelSettingHelper helper(slice_info); if (helper.Parse()) { - int plate_idx = m_obj ? m_obj->m_plate_index : 0; - auto parse_result = helper.GetPlates()[plate_idx - 1].objects; - for (const auto& part : parse_result) { + auto parse_result = helper.GetPlateObjects(m_plate_idx); + for (const auto &part : parse_result) { m_parts_state[part.identify_id] = part.state; - m_parts_name[part.identify_id] = part.name; + m_parts_name[part.identify_id] = part.name; } if (m_obj) { std::vector partskip_ids = m_obj->m_partskip_ids; - for (auto part_id : partskip_ids) { - m_parts_state[part_id] = PartState::psSkipped; - } + for (auto part_id : partskip_ids) { m_parts_state[part_id] = PartState::psSkipped; } } - for(const auto& [part_id, part_state] : m_parts_state) { + for (const auto &[part_id, part_state] : m_parts_state) { auto line_sizer = new wxBoxSizer(wxHORIZONTAL); auto checkbox = new CheckBox(m_list_view); auto label = new Label(m_list_view, wxEmptyString); - checkbox->Bind(wxEVT_TOGGLEBUTTON, [this, part_id=part_id](wxCommandEvent& event) { - m_parts_state[part_id] = event.IsChecked() ? PartState::psChecked : PartState::psUnCheck; - if(!event.IsChecked()){ - m_all_checkbox->SetValue(false); - }else if(IsAllChecked()){ - m_all_checkbox->SetValue(true); - } - m_canvas->UpdatePartsInfo(GetPartsInfo()); - UpdateCountLabel(); - event.Skip(); - }, checkbox->GetId()); + checkbox->Bind( + wxEVT_TOGGLEBUTTON, + [this, part_id = part_id](wxCommandEvent &event) { + m_parts_state[part_id] = event.IsChecked() ? PartState::psChecked : PartState::psUnCheck; + if (!event.IsChecked()) { + m_all_checkbox->SetValue(false); + } else if (IsAllChecked()) { + m_all_checkbox->SetValue(true); + } + m_canvas->UpdatePartsInfo(GetPartsInfo()); + UpdateCountLabel(); + event.Skip(); + }, + checkbox->GetId()); if (part_state == PartState::psChecked) { checkbox->SetValue(true); checkbox->Enable(true); - } else if(part_state == PartState::psUnCheck) { + } else if (part_state == PartState::psUnCheck) { checkbox->SetValue(false); checkbox->Enable(true); } else if (part_state == PartState::psSkipped) { @@ -744,14 +731,14 @@ void PartSkipDialog::InitDialogUI() { } label->SetLabel(wxString::FromUTF8(m_parts_name[part_id])); label->SetBackgroundColour(*wxWHITE); - label->SetForegroundColour(wxColor(107,107,107)); + label->SetForegroundColour(wxColor(107, 107, 107)); label->Wrap(-1); label->SetMinSize(wxSize(-1, FromDIP(18))); checkbox->SetBackgroundColour(*wxWHITE); checkbox->SetMinSize(wxSize(FromDIP(18), FromDIP(18))); checkbox->SetMaxSize(wxSize(FromDIP(18), FromDIP(18))); - line_sizer->Add(checkbox, 0, wxALIGN_CENTER_VERTICAL, 0); + line_sizer->Add(checkbox, 0, wxALIGN_CENTER_VERTICAL, 0); line_sizer->Add(label, 1, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(8)); m_scroll_sizer->Add(line_sizer, 0, wxBOTTOM | wxEXPAND, FromDIP(12)); } @@ -766,47 +753,47 @@ void PartSkipDialog::InitDialogUI() { BOOST_LOG_TRIVIAL(info) << "part skip: unlock parts info from printer."; } -void PartSkipDialog::UpdatePartsStateFromPrinter(MachineObject *obj) { +void PartSkipDialog::UpdatePartsStateFromPrinter(MachineObject *obj) +{ if (m_print_lock) { BOOST_LOG_TRIVIAL(info) << "part skip: parts info from printer is locked."; return; } m_obj = obj; if (m_obj) { - bool update_flag = false; + bool update_flag = false; std::vector partskip_ids = m_obj->m_partskip_ids; - for(auto part_id : partskip_ids) { - if(m_parts_state[part_id] != PartState::psSkipped){ + for (auto part_id : partskip_ids) { + if (m_parts_state[part_id] != PartState::psSkipped) { m_parts_state[part_id] = PartState::psSkipped; - update_flag = true; + update_flag = true; } } - if(update_flag){ + if (update_flag) { m_canvas->UpdatePartsInfo(GetPartsInfo()); UpdateDialogUI(); } } } - -void PartSkipDialog::UpdateDialogUI(){ - if(m_parts_state.size() != m_scroll_sizer->GetItemCount()){ +void PartSkipDialog::UpdateDialogUI() +{ + if (m_parts_state.size() != m_scroll_sizer->GetItemCount()) { BOOST_LOG_TRIVIAL(warning) << "part skip: m_parts_state and m_scroll_sizer mismatch."; return; } for (auto it = m_parts_state.begin(); it != m_parts_state.end(); ++it) { - int idx = std::distance(m_parts_state.begin(), it); + int idx = std::distance(m_parts_state.begin(), it); auto part_state = it->second; wxSizerItem *item = m_scroll_sizer->GetItem(idx); if (item && item->IsSizer()) { - wxSizer* sizer = item->GetSizer(); - auto check_item = sizer->GetItem((size_t)0); + wxSizer *sizer = item->GetSizer(); + auto check_item = sizer->GetItem((size_t) 0); - if (check_item && check_item->IsWindow()) - { - wxWindow *window = check_item->GetWindow(); + if (check_item && check_item->IsWindow()) { + wxWindow *window = check_item->GetWindow(); CheckBox *checkbox = dynamic_cast(window); if (part_state == PartState::psChecked) { checkbox->SetValue(true); @@ -824,14 +811,12 @@ void PartSkipDialog::UpdateDialogUI(){ Refresh(); } -void PartSkipDialog::SetSimplebookPage(int page) { - m_simplebook->SetSelection(page); -} +void PartSkipDialog::SetSimplebookPage(int page) { m_simplebook->SetSelection(page); } -bool PartSkipDialog::IsAllChecked() { - for (auto& [part_id, part_state] : m_parts_state) { - if (part_state == PartState::psUnCheck) - return false; +bool PartSkipDialog::IsAllChecked() +{ + for (auto &[part_id, part_state] : m_parts_state) { + if (part_state == PartState::psUnCheck) return false; } return true; } @@ -839,15 +824,12 @@ bool PartSkipDialog::IsAllChecked() { void PartSkipDialog::OnAllCheckbox(wxCommandEvent &event) { if (m_all_checkbox->GetValue()) { - for (auto& [part_id, part_state] : m_parts_state) { - if (part_state == PartState::psUnCheck) - part_state = PartState::psChecked; + for (auto &[part_id, part_state] : m_parts_state) { + if (part_state == PartState::psUnCheck) part_state = PartState::psChecked; } - } - else{ - for (auto& [part_id, part_state] : m_parts_state) { - if (part_state == PartState::psChecked) - part_state = PartState::psUnCheck; + } else { + for (auto &[part_id, part_state] : m_parts_state) { + if (part_state == PartState::psChecked) part_state = PartState::psUnCheck; } } m_canvas->UpdatePartsInfo(GetPartsInfo()); @@ -855,15 +837,12 @@ void PartSkipDialog::OnAllCheckbox(wxCommandEvent &event) event.Skip(); } - void PartSkipDialog::OnApplyDialog(wxCommandEvent &event) { event.Skip(); m_partskip_ids.clear(); - for (const auto& [part_id, part_state] : m_parts_state) { - if (part_state == PartState::psChecked) { - m_partskip_ids.push_back(part_id); - } + for (const auto &[part_id, part_state] : m_parts_state) { + if (part_state == PartState::psChecked) { m_partskip_ids.push_back(part_id); } } bool all_skipped = true; @@ -872,17 +851,17 @@ void PartSkipDialog::OnApplyDialog(wxCommandEvent &event) } PartSkipConfirmDialog confirm_dialog(this); - if (all_skipped){ + if (all_skipped) { confirm_dialog.SetMsgLabel(_L("Skipping all objects.")); confirm_dialog.SetTipLabel(_L("The printing job will be stopped. Continue?")); - }else{ + } else { confirm_dialog.SetMsgLabel(wxString::Format(_L("Skipping %d objects."), m_partskip_ids.size())); confirm_dialog.SetTipLabel(_L("This action cannot be undone. Continue?")); } - if(confirm_dialog.ShowModal() == wxID_OK){ + if (confirm_dialog.ShowModal() == wxID_OK) { if (m_obj) { - BOOST_LOG_TRIVIAL(info) << "part skip: skipping "<< m_partskip_ids.size() <<" objects."; + BOOST_LOG_TRIVIAL(info) << "part skip: skipping " << m_partskip_ids.size() << " objects."; if (all_skipped) { m_obj->command_task_abort(); @@ -898,11 +877,11 @@ void PartSkipDialog::OnApplyDialog(wxCommandEvent &event) } } -int PartSkipDialog::GetAllSkippedPartsNum() { +int PartSkipDialog::GetAllSkippedPartsNum() +{ int skipped_cnt = 0; - for (auto& [part_id, part_state] : m_parts_state) { - if (part_state == PartState::psSkipped || part_state == PartState::psChecked) - skipped_cnt++; + for (auto &[part_id, part_state] : m_parts_state) { + if (part_state == PartState::psSkipped || part_state == PartState::psChecked) skipped_cnt++; } return skipped_cnt; } @@ -915,8 +894,8 @@ PartSkipConfirmDialog::PartSkipConfirmDialog(wxWindow *parent) : DPIDialog(paren SetMinSize(wxSize(FromDIP(480), FromDIP(215))); SetSizeHints(wxDefaultSize, wxDefaultSize); - wxBoxSizer* m_sizer; - m_sizer = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer *m_sizer; + m_sizer = new wxBoxSizer(wxVERTICAL); auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); m_line_top->SetMinSize(wxSize(FromDIP(480), 1)); @@ -925,24 +904,23 @@ PartSkipConfirmDialog::PartSkipConfirmDialog(wxWindow *parent) : DPIDialog(paren m_sizer->Add(m_line_top, 0, wxEXPAND, 0); m_sizer->Add(0, 0, 0, wxALL, FromDIP(15)); - m_msg_label = new Label( this, _L("Skipping objects.")); - m_msg_label->Wrap( -1 ); + m_msg_label = new Label(this, _L("Skipping objects.")); + m_msg_label->Wrap(-1); m_msg_label->SetBackgroundColour(*wxWHITE); m_tip_label = new Label(this, _L("This action cannot be undone. Continue?")); m_tip_label->Wrap(-1); m_tip_label->SetBackgroundColour(*wxWHITE); - m_tip_label->SetForegroundColour(wxColor(92,92,92)); + m_tip_label->SetForegroundColour(wxColor(92, 92, 92)); m_sizer->Add(m_msg_label, 0, wxLEFT, FromDIP(29)); m_sizer->Add(0, 0, 0, wxTOP, FromDIP(9)); m_sizer->Add(m_tip_label, 0, wxLEFT, FromDIP(29)); - wxBoxSizer* m_button_sizer; + wxBoxSizer *m_button_sizer; m_button_sizer = new wxBoxSizer(wxHORIZONTAL); m_button_sizer->SetMinSize(wxSize(FromDIP(480), FromDIP(54))); - m_button_sizer->Add(0, 0, 1, wxEXPAND, 0); - + m_button_sizer->Add(0, 0, 1, wxEXPAND, 0); StateColor btn_bg_white(std::pair(wxColour(206, 206, 206), StateColor::Pressed), std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(*wxWHITE, StateColor::Normal)); @@ -958,23 +936,21 @@ PartSkipConfirmDialog::PartSkipConfirmDialog(wxWindow *parent) : DPIDialog(paren m_apply_button->SetSize(wxSize(FromDIP(80), FromDIP(32))); m_apply_button->SetMinSize(wxSize(FromDIP(80), FromDIP(32))); m_apply_button->SetCornerRadius(FromDIP(16)); - m_apply_button->Bind(wxEVT_BUTTON, [this](auto& e){ + m_apply_button->Bind(wxEVT_BUTTON, [this](auto &e) { EndModal(wxID_OK); e.Skip(); }); m_button_sizer->Add(m_apply_button, 0, wxRIGHT | wxBOTTOM, FromDIP(24)); - m_sizer->Add(m_button_sizer, 1, wxEXPAND, FromDIP(5)); - m_sizer->Fit( this ); + m_sizer->Add(m_button_sizer, 1, wxEXPAND, FromDIP(5)); + m_sizer->Fit(this); - SetSizer( m_sizer ); + SetSizer(m_sizer); Layout(); Fit(); } -PartSkipConfirmDialog::~PartSkipConfirmDialog() -{ -} +PartSkipConfirmDialog::~PartSkipConfirmDialog() {} bool PartSkipConfirmDialog::Show(bool show) { @@ -988,7 +964,8 @@ bool PartSkipConfirmDialog::Show(bool show) return DPIDialog::Show(show); } -void PartSkipConfirmDialog::on_dpi_changed(const wxRect& suggested_rect) { +void PartSkipConfirmDialog::on_dpi_changed(const wxRect &suggested_rect) +{ m_apply_button->SetMinSize(wxSize(FromDIP(80), FromDIP(32))); m_apply_button->SetCornerRadius(FromDIP(16)); m_apply_button->Rescale(); @@ -996,20 +973,10 @@ void PartSkipConfirmDialog::on_dpi_changed(const wxRect& suggested_rect) { Fit(); } +Button *PartSkipConfirmDialog::GetConfirmButton() { return m_apply_button; } -Button* PartSkipConfirmDialog::GetConfirmButton() -{ - return m_apply_button; -} +void PartSkipConfirmDialog::SetMsgLabel(wxString msg) { m_msg_label->SetLabel(msg); } -void PartSkipConfirmDialog::SetMsgLabel(wxString msg){ - m_msg_label->SetLabel(msg); -} +void PartSkipConfirmDialog::SetTipLabel(wxString msg) { m_tip_label->SetLabel(msg); } -void PartSkipConfirmDialog::SetTipLabel(wxString msg){ - m_tip_label->SetLabel(msg); -} - - -} -} // namespace Slic3r::GUI +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/PartSkipDialog.hpp b/src/slic3r/GUI/PartSkipDialog.hpp index ef5cb743af..92abbed0b9 100644 --- a/src/slic3r/GUI/PartSkipDialog.hpp +++ b/src/slic3r/GUI/PartSkipDialog.hpp @@ -38,19 +38,19 @@ class PartSkipConfirmDialog : public DPIDialog { private: protected: - Label *m_msg_label; - Label *m_tip_label; - Button *m_apply_button; + Label *m_msg_label; + Label *m_tip_label; + Button *m_apply_button; public: PartSkipConfirmDialog(wxWindow *parent); ~PartSkipConfirmDialog(); - void on_dpi_changed(const wxRect &suggested_rect); - Button* GetConfirmButton(); - void SetMsgLabel(wxString msg); - void SetTipLabel(wxString msg); - bool Show(bool show); + void on_dpi_changed(const wxRect &suggested_rect); + Button *GetConfirmButton(); + void SetMsgLabel(wxString msg); + void SetTipLabel(wxString msg); + bool Show(bool show); }; class PartSkipDialog : public DPIDialog @@ -69,68 +69,69 @@ public: MachineObject *m_obj{nullptr}; - wxSimplebook* m_simplebook; - wxPanel* m_book_third_panel; - wxPanel* m_book_second_panel; - wxPanel* m_book_first_panel; + wxSimplebook *m_simplebook; + wxPanel *m_book_third_panel; + wxPanel *m_book_second_panel; + wxPanel *m_book_first_panel; - SkipPartCanvas* m_canvas; - Button* m_zoom_in_btn; - Button* m_zoom_out_btn; - Button* m_switch_drag_btn; - CheckBox* m_all_checkbox; - Button* m_percent_label; - Label* m_all_label; - wxPanel* m_line; - wxPanel* m_line_top; - wxScrolledWindow* m_list_view; + SkipPartCanvas *m_canvas; + Button *m_zoom_in_btn; + Button *m_zoom_out_btn; + Button *m_switch_drag_btn; + CheckBox *m_all_checkbox; + Button *m_percent_label; + Label *m_all_label; + wxPanel *m_line; + wxPanel *m_line_top; + wxScrolledWindow *m_list_view; - wxPanel* m_dlg_placeholder; - Label* m_cnt_label; - Label* m_tot_label; + wxPanel *m_dlg_placeholder; + Label *m_cnt_label; + Label *m_tot_label; - Button* m_apply_btn; + Button *m_apply_btn; - Label* m_loading_label; - Label* m_retry_label; - ScalableBitmap* m_retry_icon; - wxStaticBitmap* m_retry_bitmap; + Label *m_loading_label; + Label *m_retry_label; + ScalableBitmap *m_retry_icon; + wxStaticBitmap *m_retry_bitmap; - wxBoxSizer* m_sizer; - wxBoxSizer* m_dlg_sizer; - wxBoxSizer* m_dlg_content_sizer; - wxBoxSizer* m_dlg_btn_sizer; - wxBoxSizer* m_canvas_sizer; - wxBoxSizer* m_canvas_btn_sizer; - wxBoxSizer* m_list_sizer; - wxBoxSizer* m_scroll_sizer; - wxBoxSizer* m_book_first_sizer; - wxBoxSizer* m_book_second_sizer; - wxBoxSizer* m_book_second_btn_sizer; - Button* m_second_retry_btn; - AnimaIcon* m_loading_icon; + wxBoxSizer *m_sizer; + wxBoxSizer *m_dlg_sizer; + wxBoxSizer *m_dlg_content_sizer; + wxBoxSizer *m_dlg_btn_sizer; + wxBoxSizer *m_canvas_sizer; + wxBoxSizer *m_canvas_btn_sizer; + wxBoxSizer *m_list_sizer; + wxBoxSizer *m_scroll_sizer; + wxBoxSizer *m_book_first_sizer; + wxBoxSizer *m_book_second_sizer; + wxBoxSizer *m_book_second_btn_sizer; + Button *m_second_retry_btn; + AnimaIcon *m_loading_icon; private: - int m_zoom_percent{100}; + int m_plate_idx{-1}; + int m_zoom_percent{100}; bool m_is_drag{false}; bool m_print_lock{true}; - std::map m_parts_state; + std::map m_parts_state; std::map m_parts_name; - std::vector m_partskip_ids; + std::vector m_partskip_ids; enum URL_STATE m_url_state = URL_STATE::URL_TCP; PartsInfo GetPartsInfo(); - bool is_drag_mode(); + bool is_drag_mode(); boost::shared_ptr m_file_sys; - bool m_file_sys_result{false}; - std::string m_timestamp; - std::string m_tmp_path; - std::vector m_local_paths; - std::vector m_target_paths; - std::string create_tmp_path(); + bool m_file_sys_result{false}; + std::string m_timestamp; + std::string m_tmp_path; + std::vector m_local_paths; + std::vector m_target_paths; + std::string create_tmp_path(); bool is_local_file_existed(const std::vector &local_paths); @@ -139,7 +140,6 @@ private: void OnFileSystemResult(wxCommandEvent &event); void fetchUrl(boost::weak_ptr wfs); - void OnZoomIn(wxCommandEvent &event); void OnZoomOut(wxCommandEvent &event); void OnSwitchDrag(wxCommandEvent &event); @@ -156,4 +156,4 @@ private: void OnApplyDialog(wxCommandEvent &event); }; -}} \ No newline at end of file +}} // namespace Slic3r::GUI \ No newline at end of file diff --git a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp index a48310254d..d961971d0e 100644 --- a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp +++ b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp @@ -252,6 +252,7 @@ struct PrinterFileSystem::Download : Progress void PrinterFileSystem::GetPickImages(const std::vector &local_paths, const std::vector &targetpaths) { + m_download_states.clear(); GetPickImage(1, local_paths[0], targetpaths[0]); GetPickImage(2, local_paths[1], targetpaths[1]); @@ -303,6 +304,9 @@ void PrinterFileSystem::DownloadRamFile(int index, const std::string &local_path wxLogWarning("Download failed: result = 1"); return ERROR_JSON; } + if(mem_dl_json.contains("size") && mem_dl_json["size"] == 0 ) + return FILE_SIZE_ERR; + return CONTINUE; } @@ -355,13 +359,27 @@ void PrinterFileSystem::DownloadRamFile(int index, const std::string &local_path if (result == CONTINUE) { return; } std::string msg; if (result == SUCCESS) { - wxLogMessage("DownloadImageFromRam finished: %s", download->local_path); - msg = "SUCCESS"; - SendChangedEvent(EVT_RAMDOWNLOAD, result, result ? download->error : download->local_path); + if (std::filesystem::exists(download->local_path)) { + m_download_states.emplace_back(true); + BOOST_LOG_TRIVIAL(info) <<"DownloadImageFromRam finished: " << download->local_path << "result = " << result; + }else{ + m_download_states.emplace_back(false); + BOOST_LOG_TRIVIAL(warning) <<"DownloadImageFromRam finished, but file not exist: " << download->local_path << "result = " << result; + } } else if (result != CONTINUE) { - wxLogWarning("DownloadImageFromRam failed: %s", download->error); - msg = "ERROR"; - SendChangedEvent(EVT_RAMDOWNLOAD, result, result ? download->error : download->local_path); + m_download_states.emplace_back(false); + BOOST_LOG_TRIVIAL(warning) << "DownloadImageFromRam failed: " << download->error << "result = " << result; + } + + if(m_download_states.size() == 3){ + if(m_download_states[0] && m_download_states[1] && m_download_states[2]){ + SendChangedEvent(EVT_RAMDOWNLOAD, SUCCESS); + }else{ + // FILE_NO_EXIST is not really error_code + SendChangedEvent(EVT_RAMDOWNLOAD, FILE_NO_EXIST); + } + }else{ + BOOST_LOG_TRIVIAL(warning) << "m_download_states current size is : " << m_download_states.size(); } },param); } diff --git a/src/slic3r/GUI/Printer/PrinterFileSystem.h b/src/slic3r/GUI/Printer/PrinterFileSystem.h index a94a5e3e96..259baf7e45 100644 --- a/src/slic3r/GUI/Printer/PrinterFileSystem.h +++ b/src/slic3r/GUI/Printer/PrinterFileSystem.h @@ -317,6 +317,8 @@ private: size_t m_lock_end = 0; int m_task_flags = 0; + std::vector m_download_states; + private: struct Session { diff --git a/src/slic3r/GUI/SkipPartCanvas.cpp b/src/slic3r/GUI/SkipPartCanvas.cpp index 85c2cc6c6d..75b99d4cc5 100644 --- a/src/slic3r/GUI/SkipPartCanvas.cpp +++ b/src/slic3r/GUI/SkipPartCanvas.cpp @@ -9,6 +9,7 @@ #include #include #include +#include wxDEFINE_EVENT(EVT_ZOOM_PERCENT, wxCommandEvent); wxDEFINE_EVENT(EVT_CANVAS_PART, wxCommandEvent); @@ -32,6 +33,8 @@ SkipPartCanvas::SkipPartCanvas(wxWindow *parent, const wxGLAttributes& dispAttrs void SkipPartCanvas::LoadPickImage(const std::string & path) { + if(!std::filesystem::exists(path)) return; + auto ParseShapeId = [](cv::Mat image, const std::vector> &contours, const std::vector &hierarchy, int root_idx) -> uint32_t { cv::Mat mask = cv::Mat::zeros(image.size(), CV_8UC1); @@ -249,8 +252,12 @@ void SkipPartCanvas::Render() int w, h; GetClientSize(&w, &h); +#if defined(__APPLE__) + double scale = GetDPIScaleFactor(); + glViewport(0, 0, w * scale, h * scale); +#else glViewport(0, 0, w, h); - +#endif glMatrixMode(GL_PROJECTION); glLoadIdentity(); auto view_rect = ViewPtToImagePt(wxPoint(w, h)); @@ -661,7 +668,14 @@ void XMLCALL ModelSettingHelper::EndElementHandler(void *userData, const XML_Cha } } -std::vector ModelSettingHelper::GetPlates() { return context_.plates; } +std::vector ModelSettingHelper::GetPlateObjects(int plate_idx) { + for (const auto &plate : context_.plates) { + if (plate.index == plate_idx) { + return plate.objects; + } + } + return std::vector(); +} void ModelSettingHelper::DataHandler(const XML_Char *s, int len) { diff --git a/src/slic3r/GUI/SkipPartCanvas.hpp b/src/slic3r/GUI/SkipPartCanvas.hpp index 77dd4ffa42..038b53d371 100644 --- a/src/slic3r/GUI/SkipPartCanvas.hpp +++ b/src/slic3r/GUI/SkipPartCanvas.hpp @@ -150,7 +150,7 @@ public: ModelSettingHelper(const std::string &path); bool Parse(); - std::vector GetPlates(); + std::vector GetPlateObjects(int plate_idx); private: std::string path_; diff --git a/src/slic3r/GUI/Widgets/AnimaController.cpp b/src/slic3r/GUI/Widgets/AnimaController.cpp index d034fe9fd8..4cd110342f 100644 --- a/src/slic3r/GUI/Widgets/AnimaController.cpp +++ b/src/slic3r/GUI/Widgets/AnimaController.cpp @@ -9,12 +9,13 @@ AnimaIcon::AnimaIcon(wxWindow *parent, wxWindowID id, std::vector img_list, std::string img_enable, int ivt) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize), m_ivt(ivt) { + auto sizer = new wxBoxSizer(wxHORIZONTAL); SetBackgroundColour((wxColour(255, 255, 255))); - m_size = 20; + m_size = 25; //add ScalableBitmap - for (const auto &filename : img_list) m_images.emplace_back(create_scaled_bitmap(filename, this, FromDIP(m_size))); - m_image_enable = create_scaled_bitmap(img_enable, this, FromDIP(m_size-8)); + for (const auto &filename : img_list) m_images.emplace_back(create_scaled_bitmap(filename, this, m_size)); + m_image_enable = create_scaled_bitmap(img_enable, this, m_size-8); // show first wxStaticBitmap if (!m_images.empty()) m_bitmap = new wxStaticBitmap(this, wxID_ANY, m_images[0], wxDefaultPosition, wxSize(FromDIP(m_size), FromDIP(m_size))); @@ -47,12 +48,13 @@ AnimaIcon::AnimaIcon(wxWindow *parent, wxWindowID id, std::vector i SetCursor(wxCursor(wxCURSOR_ARROW)); e.Skip(); }); - + sizer->Add(m_bitmap, 0, wxALIGN_CENTER, 0); + SetSizer(sizer); SetSize(wxSize(FromDIP(m_size), FromDIP(m_size))); SetMaxSize(wxSize(FromDIP(m_size), FromDIP(m_size))); SetMinSize(wxSize(FromDIP(m_size), FromDIP(m_size))); - Refresh(); - + Layout(); + Fit(); Play(); }