From 5bc21568cfaafac49e6099f3ee5fa145440e89e6 Mon Sep 17 00:00:00 2001 From: hemai Date: Mon, 30 Jun 2025 17:17:27 +0800 Subject: [PATCH] ENH: advance part skip dialog Jira: [STUDIO-12687] Change-Id: Ie6805c57f478ae5a10f81b49dc5a4e45fb40dbc7 (cherry picked from commit 8ed17efc32f8c635dc50e27bf7146fd2eb70941d) --- localization/i18n/list.txt | 4 + src/slic3r/GUI/DeviceManager.cpp | 1 + src/slic3r/GUI/DeviceManager.hpp | 1 + src/slic3r/GUI/PartSkipDialog.cpp | 437 ++++++++++++------- src/slic3r/GUI/PartSkipDialog.hpp | 24 +- src/slic3r/GUI/Printer/PrinterFileSystem.cpp | 4 +- src/slic3r/GUI/SkipPartCanvas.cpp | 72 +-- src/slic3r/GUI/SkipPartCanvas.hpp | 10 +- src/slic3r/GUI/StatusPanel.cpp | 88 ++-- src/slic3r/GUI/Widgets/AnimaController.cpp | 6 +- 10 files changed, 356 insertions(+), 291 deletions(-) diff --git a/localization/i18n/list.txt b/localization/i18n/list.txt index f3792b3453..a2c2b64dce 100644 --- a/localization/i18n/list.txt +++ b/localization/i18n/list.txt @@ -177,3 +177,7 @@ src/slic3r/Utils/Flashforge.cpp src/slic3r/GUI/Jobs/OAuthJob.cpp src/slic3r/GUI/BackgroundSlicingProcess.cpp src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp +src/slic3r/GUI/PartSkipDialog.cpp +src/slic3r/GUI/PartSkipDialog.hpp +src/slic3r/GUI/SkipCanvas.cpp +src/slic3r/GUI/SkipCanvas.cpp diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index ada83175d0..2e4ae75ada 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -5609,6 +5609,7 @@ void MachineObject::parse_new_info(json print) is_support_upgrade_kit = get_flag_bits(cfg, 14); is_support_command_homing = get_flag_bits(fun, 32); is_support_brtc = get_flag_bits(fun, 31); + is_support_partskip = get_flag_bits(fun, 49); } /*aux*/ diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 7f66c30f25..ea42c723b2 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -876,6 +876,7 @@ public: bool is_support_upgrade_kit{false}; bool is_support_command_homing { false };// fun[32] bool is_support_brtc{false}; // fun[31], support tcp and upload protocol + bool is_support_partskip{false}; bool installed_upgrade_kit{false}; int nozzle_max_temperature = -1; diff --git a/src/slic3r/GUI/PartSkipDialog.cpp b/src/slic3r/GUI/PartSkipDialog.cpp index 2f72abdb0f..bfe98371d2 100644 --- a/src/slic3r/GUI/PartSkipDialog.cpp +++ b/src/slic3r/GUI/PartSkipDialog.cpp @@ -40,24 +40,25 @@ PartSkipDialog::PartSkipDialog(wxWindow* parent): DPIDialog(parent, wxID_ANY, _L std::stringstream buf; buf << put_time(std::localtime(&t), "%a_%b_%d_%H_%M_%S/"); m_timestamp = buf.str(); - + std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % Slic3r::resources_dir()).str(); SetIcon(wxIcon(Slic3r::encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); SetBackgroundColour(*wxWHITE); - SetSizeHints( wxDefaultSize, wxDefaultSize ); - + m_sizer = new wxBoxSizer( wxVERTICAL ); - auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); + + 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, FromDIP(5)); - m_sizer->Add(0, 0, 0, wxTOP, FromDIP(5)); - + m_sizer->Add(m_line_top, 0, wxEXPAND | wxTOP, FromDIP(5)); + m_simplebook = new wxSimplebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0); - m_book_first_panel = new wxPanel( m_simplebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + 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_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 ); @@ -66,14 +67,13 @@ PartSkipDialog::PartSkipDialog(wxWindow* parent): DPIDialog(parent, wxID_ANY, _L wxGLAttributes canvasAttrs; canvasAttrs.PlatformDefaults().Defaults().Stencil(8).EndList(); m_canvas = new SkipPartCanvas(m_book_third_panel, canvasAttrs); - m_canvas->SetPosition(wxPoint(FromDIP(10), FromDIP(10))); m_canvas->SetMinSize( wxSize( FromDIP(400),FromDIP(400) ) ); + m_canvas->SetMaxSize( wxSize( FromDIP(400),FromDIP(400) ) ); - m_canvas_sizer->Add( m_canvas, 0, wxALL, FromDIP(10) ); m_canvas_btn_sizer = new wxBoxSizer( wxHORIZONTAL ); - m_canvas_btn_sizer->SetMinSize( wxSize( FromDIP(214),FromDIP(28) ) ); - + 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(255, 255, 255), StateColor::Normal)); @@ -81,15 +81,14 @@ PartSkipDialog::PartSkipDialog(wxWindow* parent): DPIDialog(parent, wxID_ANY, _L StateColor zoom_bd(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); StateColor zoom_text(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); - m_zoom_out_btn = new Button(m_book_third_panel, _L("")); + m_zoom_out_btn = new Button(m_book_third_panel, wxEmptyString); m_zoom_out_btn->SetIcon("canvas_zoom_out"); m_zoom_out_btn->SetToolTip(_L("Zoom Out")); m_zoom_out_btn->SetBackgroundColor(zoom_bg); m_zoom_out_btn->SetBorderColor(wxColour(238, 238, 238)); m_zoom_out_btn->SetCornerRadius(0); - m_zoom_out_btn->SetMinSize(wxSize(FromDIP(54), FromDIP(26))); + m_zoom_out_btn->SetMinSize(wxSize(FromDIP(56), FromDIP(28))); - m_canvas_btn_sizer->Add(m_zoom_out_btn, 0, wxEXPAND, 0); 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), @@ -97,114 +96,134 @@ PartSkipDialog::PartSkipDialog(wxWindow* parent): DPIDialog(parent, wxID_ANY, _L 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)); - m_percent_label->SetMinSize(wxSize(FromDIP(54), FromDIP(26))); + m_percent_label->SetMinSize(wxSize(FromDIP(56), FromDIP(28))); m_percent_label->SetCornerRadius(0); - m_canvas_btn_sizer->Add( m_percent_label, 0, wxEXPAND, 0 ); - m_zoom_in_btn = new Button(m_book_third_panel, _L("")); + m_zoom_in_btn = new Button(m_book_third_panel, wxEmptyString); m_zoom_in_btn->SetIcon("canvas_zoom_in"); m_zoom_in_btn->SetToolTip(_L("Zoom In")); m_zoom_in_btn->SetBackgroundColor(zoom_bg); m_zoom_in_btn->SetBorderColor(wxColour(238, 238, 238)); - m_zoom_in_btn->SetMinSize(wxSize(FromDIP(54), FromDIP(26))); + m_zoom_in_btn->SetMinSize(wxSize(FromDIP(56), FromDIP(28))); m_zoom_in_btn->SetCornerRadius(0); - m_canvas_btn_sizer->Add(m_zoom_in_btn, 0, wxEXPAND, 0); - m_switch_drag_btn = new Button(m_book_third_panel, _L("")); + 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(54),FromDIP(26))); + m_switch_drag_btn->SetMinSize(wxSize(FromDIP(56),FromDIP(28))); m_switch_drag_btn->SetCornerRadius(0); - m_canvas_btn_sizer->Add( m_switch_drag_btn, 0, wxEXPAND, FromDIP(5) ); - m_canvas_sizer->Add(m_canvas_btn_sizer, 0, wxALIGN_CENTER_HORIZONTAL, FromDIP(10)); - - m_dlg_content_sizer->Add( m_canvas_sizer, 0, wxALL, FromDIP(10) ); + 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_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); + 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); m_all_label = new Label(m_book_third_panel, _L("Select All")); m_all_label->Wrap(-1); + m_all_label->SetMinSize(wxSize(-1, FromDIP(18))); m_all_label->SetBackgroundColour(*wxWHITE); - + m_all_label->SetMinSize(wxSize(267, -1)); m_all_label->SetMaxSize(wxSize(267, -1)); - all_checkbox_sizer->Add(m_all_checkbox, 0, wxALL | wxALIGN_CENTER_VERTICAL, 0); - all_checkbox_sizer->Add(m_all_label, 0, wxALL | wxALIGN_CENTER_VERTICAL, 0); - - m_list_sizer->Add(all_checkbox_sizer, 0, wxALL, FromDIP(5)); + 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)); m_line = new wxPanel(m_book_third_panel, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(267), FromDIP(1)), wxTAB_TRAVERSAL); - m_line->SetBackgroundColour( wxColor(238, 238, 238) ); - - m_list_sizer->Add(m_line, 0, wxEXPAND, 0); + m_line->SetMinSize(wxSize(FromDIP(267), 1)); + m_line->SetMaxSize(wxSize(FromDIP(267), 1)); + 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(410) ) ); - m_list_view->SetMaxSize(wxSize(FromDIP(267), FromDIP(410))); + 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_sizer->Add(m_list_view, 0, wxEXPAND, 0); - - m_dlg_content_sizer->Add( m_list_sizer, 0, wxALL, FromDIP(15) ); - - - m_dlg_sizer->Add( m_dlg_content_sizer, 0, wxEXPAND, FromDIP(5) ); - m_dlg_btn_sizer = new wxBoxSizer( wxHORIZONTAL ); - m_dlg_btn_sizer->SetMinSize(wxSize(FromDIP(720), FromDIP(54))); + m_dlg_btn_sizer->SetMinSize(wxSize(-1, FromDIP(54))); - m_cnt_label = new Label(m_book_third_panel, _L("cnt 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_dlg_btn_sizer->Add(0, 0, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(5)); - m_dlg_btn_sizer->Add( m_cnt_label, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(0) ); + 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, _L("tot 15")); + m_tot_label = new Label(m_book_third_panel, wxEmptyString); m_tot_label->Wrap( -1 ); m_tot_label->SetBackgroundColour(*wxWHITE); - - m_dlg_btn_sizer->Add(m_tot_label, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); - m_dlg_btn_sizer->Add(0, 0, 1, wxEXPAND | wxALIGN_CENTER_VERTICAL, FromDIP(5)); + m_tot_label->SetMinSize(wxSize(FromDIP(200), FromDIP(20))); 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)); - StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), std::pair(wxColour(0, 177, 66), StateColor::Normal)); - - m_apply_btn = new Button(m_book_third_panel, wxString(_L("Skip"))); + + m_apply_btn = new Button(m_book_third_panel, _L("Skip")); m_apply_btn->SetBackgroundColor(btn_bg_green); m_apply_btn->SetTextColor(*wxWHITE); // m_apply_btn->SetBorderColor(wxColour(38, 46, 48)); m_apply_btn->SetFont(Label::Body_14); - m_apply_btn->SetSize(wxSize(-1, FromDIP(32))); + m_apply_btn->SetSize(wxSize(FromDIP(80), FromDIP(32))); m_apply_btn->SetMinSize(wxSize(FromDIP(80), FromDIP(32))); m_apply_btn->SetCornerRadius(FromDIP(16)); - m_dlg_btn_sizer->Add(m_apply_btn, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(15)); - m_dlg_sizer->Add( m_dlg_btn_sizer, 0, wxEXPAND, FromDIP(5) ); + + 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(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_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); + #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_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( 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_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->SetBackgroundColour(*wxWHITE); @@ -237,35 +256,34 @@ PartSkipDialog::PartSkipDialog(wxWindow* parent): DPIDialog(parent, wxID_ANY, _L // 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_sizer->SetMinSize(wxSize(FromDIP(720), FromDIP(500))); + // m_book_first_sizer->SetMinSize(wxSize(FromDIP(720), FromDIP(500))); - // 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); + 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, wxString(_L("Skipping Objects Information Loading ..."))); + 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(0, 0, 1, wxEXPAND, 0); - // 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(0, 0, 1, wxEXPAND, 0); + m_loading_sizer->Add(m_loading_icon, 0, wxALL, FromDIP(5)); + m_loading_sizer->Add(m_loading_label, 0, wxALL, FromDIP(5)); m_book_first_sizer->Add(0, 0, 1, wxEXPAND, 0); - m_book_first_sizer->Add( m_loading_label, 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_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 ); m_zoom_in_btn->Bind(wxEVT_BUTTON, &PartSkipDialog::OnZoomIn, this); m_zoom_out_btn->Bind(wxEVT_BUTTON, &PartSkipDialog::OnZoomOut, this); @@ -275,7 +293,7 @@ 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(); CentreOnParent(); @@ -283,7 +301,74 @@ PartSkipDialog::PartSkipDialog(wxWindow* parent): DPIDialog(parent, wxID_ANY, _L PartSkipDialog::~PartSkipDialog() {} -void PartSkipDialog::on_dpi_changed(const wxRect& suggested_rect) { Fit(); } +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))); + + m_percent_label->SetMinSize(wxSize(FromDIP(56), FromDIP(28))); + m_percent_label->SetMaxSize(wxSize(FromDIP(56), FromDIP(28))); + m_zoom_out_btn->SetMinSize(wxSize(FromDIP(56), FromDIP(28))); + m_zoom_out_btn->SetMaxSize(wxSize(FromDIP(56), FromDIP(28))); + m_zoom_in_btn->SetMinSize(wxSize(FromDIP(56), FromDIP(28))); + m_zoom_in_btn->SetMaxSize(wxSize(FromDIP(56), FromDIP(28))); + m_switch_drag_btn->SetMinSize(wxSize(FromDIP(56), FromDIP(28))); + m_switch_drag_btn->SetMaxSize(wxSize(FromDIP(56), FromDIP(28))); + m_percent_label->Rescale(); + m_zoom_out_btn->Rescale(); + m_zoom_in_btn->Rescale(); + m_switch_drag_btn->Rescale(); + + m_cnt_label->SetMaxSize(wxSize(-1, FromDIP(20))); + + m_tot_label->SetMinSize(wxSize(FromDIP(200), FromDIP(20))); + m_tot_label->SetLabel(m_tot_label->GetLabel()); + m_tot_label->Refresh(); + + m_line_top->SetMinSize(wxSize(-1, 1)); + 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(); + + m_dlg_placeholder->SetMinSize(wxSize(-1, FromDIP(15))); + m_dlg_placeholder->SetMaxSize(wxSize(-1, FromDIP(15))); + + // m_second_retry_btn->SetSize(wxSize(-1, FromDIP(32))); + m_second_retry_btn->SetMinSize(wxSize(FromDIP(80), FromDIP(32))); + 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(); + CheckBox *checkbox = dynamic_cast(window); + checkbox->SetMinSize(wxSize(FromDIP(18), FromDIP(18))); + checkbox->Rescale(); + } + } + } + m_canvas_btn_sizer->SetMinSize(wxSize(-1, FromDIP(28))); + m_canvas_btn_sizer->Layout(); + m_canvas_sizer->Layout(); + m_dlg_content_sizer->Layout(); + m_dlg_sizer->Layout(); + + Fit(); + Layout(); +} std::string PartSkipDialog::create_tmp_path(){ @@ -307,10 +392,10 @@ std::string PartSkipDialog::create_tmp_path(){ } -bool PartSkipDialog::is_local_file_existed(const std::vector &local_paths) -{ - for (auto path : local_paths) { - if (!std::filesystem::exists(path)) { +bool PartSkipDialog::is_local_file_existed(const std::vector &local_paths) +{ + for (auto path : local_paths) { + if (!std::filesystem::exists(path)) { return false; } } @@ -323,7 +408,7 @@ void PartSkipDialog::DownloadPartsFile() m_local_paths.clear(); m_target_paths.clear(); - + int plate_idx = m_obj ? m_obj->m_plate_index : 1; m_local_paths.push_back(m_tmp_path + "Metadata/pick_" + std::to_string(plate_idx) + ".png"); @@ -333,17 +418,22 @@ void PartSkipDialog::DownloadPartsFile() m_target_paths.push_back("Metadata/pick_" + std::to_string(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)) { - 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(); + 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(); + }else{ + m_file_sys->Retry(); + } } else { m_file_sys->SendExistedFile(); } } +// actor void PartSkipDialog::fetchUrl(boost::weak_ptr wfs) { boost::shared_ptr fs(wfs.lock()); @@ -358,13 +448,18 @@ void PartSkipDialog::fetchUrl(boost::weak_ptr wfs) } std::string dev_ver = obj->get_ota_version(); std::string dev_id = obj->dev_id; - int remote_proto = obj->get_file_remote(); + // 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 (agent) { - switch (m_url_state) { + switch (url_state) { case URL_TCP: { std::string devIP = obj->dev_ip; std::string accessCode = obj->get_access_code(); @@ -379,10 +474,10 @@ void PartSkipDialog::fetchUrl(boost::weak_ptr wfs) } }); break; - } + } case URL_TUTK: { std::string protocols[] = {"", "\"tutk\"", "\"agora\"", "\"tutk\",\"agora\""}; - agent->get_camera_url(obj->dev_id + "|" + dev_ver + "|" + protocols[1], [this, wfs, m = dev_id, v = agent->get_version(), dv = dev_ver](std::string url) { + 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; @@ -391,8 +486,6 @@ void PartSkipDialog::fetchUrl(boost::weak_ptr wfs) url += "&cli_id=" + wxGetApp().app_config->get("slicer_uuid"); url += "&cli_ver=" + std::string(SLIC3R_VERSION); } - BOOST_LOG_TRIVIAL(info) << "SendToPrinter::fetchUrl: camera_url: " << hide_passwd(url, {"?uid=", "authkey=", "passwd="}); - std::cout << "SendToPrinter::fetchUrl: camera_url: " << hide_passwd(url, {"?uid=", "authkey=", "passwd="}); CallAfter([=] { boost::shared_ptr fs(wfs.lock()); if (!fs) return; @@ -402,14 +495,14 @@ void PartSkipDialog::fetchUrl(boost::weak_ptr wfs) fs->SetUrl("3"); } }); - }); + }); break; } default: break; } } } - +// controller void PartSkipDialog::OnFileSystemEvent(wxCommandEvent &e) { e.Skip(); @@ -419,20 +512,26 @@ void PartSkipDialog::OnFileSystemEvent(wxCommandEvent &e) wxString msg; int status = e.GetInt(); - int extra = e.GetExtraLong(); + // 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::Failed: { - m_file_sys->SendConnectFail(); - break; - } - case PrinterFileSystem::Reconnecting: 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(); + }else{ + m_file_sys->SendConnectFail(); + } + break; + } + case PrinterFileSystem::Reconnecting: break; } if (e.GetInt() == PrinterFileSystem::Initializing) { CallAfter([=] { @@ -442,33 +541,26 @@ void PartSkipDialog::OnFileSystemEvent(wxCommandEvent &e) }); } } + +// reseter: [TCP -> TUTK(TCP)] -> [TCP -> TUTK(TCP)] void PartSkipDialog::OnFileSystemResult(wxCommandEvent &event){ int result = event.GetInt(); + m_loading_icon->Stop(); if (result == 0) { InitDialogUI(); SetSimplebookPage(2); + m_file_sys->Stop(); }else{ - switch (m_url_state) { - case URL_TCP: { - m_url_state = URL_TUTK; - break; - } - case URL_TUTK: { - m_url_state = URL_TCP; - break; - } - } + m_url_state = URL_TCP; SetSimplebookPage(1); + m_file_sys->Stop(); } - // wxMilliSleep(1000); - // m_loading_icon->Stop(); - Refresh(); } void PartSkipDialog::InitSchedule(MachineObject *obj){ m_obj = obj; SetSimplebookPage(0); - // m_loading_icon->Play(); + m_loading_icon->Play(); DownloadPartsFile(); } @@ -485,9 +577,9 @@ bool PartSkipDialog::is_drag_mode(){ 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; } @@ -497,7 +589,7 @@ void PartSkipDialog::OnZoomIn(wxCommandEvent &event){ UpdateZoomPercent(); } -void PartSkipDialog::OnZoomOut(wxCommandEvent &event){ +void PartSkipDialog::OnZoomOut(wxCommandEvent &event){ m_canvas->ZoomOut(20); UpdateZoomPercent(); } @@ -512,7 +604,7 @@ void PartSkipDialog::OnSwitchDrag(wxCommandEvent& event){ m_switch_drag_btn->SetBackgroundColor(wxColour(0, 174, 66)); m_switch_drag_btn->SetIcon("canvas_drag_active"); } - m_canvas->SwitchDrag(m_is_drag); + m_canvas->SwitchDrag(m_is_drag); } void PartSkipDialog::OnZoomPercent(wxCommandEvent &event) { @@ -549,14 +641,14 @@ void PartSkipDialog::UpdatePartsStateFromCanvas(wxCommandEvent &event) { 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() { int check_cnt = 0; int tot_cnt = 0; - for (auto [part_id, part_state] : m_parts_state) { + for (auto [part_id, part_state] : m_parts_state) { if (part_state == PartState::psChecked) check_cnt++; if (part_state != PartState::psSkipped) tot_cnt++; } @@ -584,7 +676,7 @@ void PartSkipDialog::InitDialogUI() { m_parts_name.clear(); string pick_img = m_local_paths[0]; - string model_settings = m_local_paths[1]; + string slice_info = m_local_paths[2]; m_switch_drag_btn->SetIcon("canvas_drag"); m_switch_drag_btn->SetBackgroundColor(*wxWHITE); @@ -593,7 +685,7 @@ void PartSkipDialog::InitDialogUI() { m_canvas->SetZoomPercent(100); m_canvas->SetOffset(wxPoint(0, 0)); m_canvas->LoadPickImage(pick_img); - ModelSettingHelper helper(model_settings); + ModelSettingHelper helper(slice_info); if (helper.Parse()) { auto parse_result = helper.GetResults(); @@ -607,13 +699,13 @@ void PartSkipDialog::InitDialogUI() { m_parts_state[part_id] = PartState::psSkipped; } } - + 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, _L("file 0")); - - checkbox->Bind(wxEVT_TOGGLEBUTTON, [this, part_id=part_id](wxCommandEvent& event) { + 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); @@ -624,7 +716,7 @@ void PartSkipDialog::InitDialogUI() { UpdateCountLabel(); event.Skip(); }, checkbox->GetId()); - + if (part_state == PartState::psChecked) { checkbox->SetValue(true); checkbox->Enable(true); @@ -639,15 +731,18 @@ void PartSkipDialog::InitDialogUI() { label->SetBackgroundColour(*wxWHITE); label->SetForegroundColour(wxColor(107,107,107)); label->Wrap(-1); + label->SetMinSize(wxSize(-1, FromDIP(18))); checkbox->SetBackgroundColour(*wxWHITE); - - line_sizer->Add(checkbox, 0, wxALL | wxALIGN_CENTER_VERTICAL, 0); - line_sizer->Add(label, 1, wxALL | wxALIGN_CENTER_VERTICAL, 0); - m_scroll_sizer->Add(line_sizer, 0, wxALL, FromDIP(5)); + 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(label, 1, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(8)); + m_scroll_sizer->Add(line_sizer, 0, wxBOTTOM | wxEXPAND, FromDIP(12)); } m_canvas->UpdatePartsInfo(GetPartsInfo()); } - + m_scroll_sizer->Layout(); UpdateCountLabel(); Refresh(); @@ -674,26 +769,25 @@ void PartSkipDialog::UpdateDialogUI(){ return; } - for (auto it = m_parts_state.begin(); it != m_parts_state.end(); ++it) { - int idx = std::distance(m_parts_state.begin(), it); - auto part_id = it->first; + for (auto it = m_parts_state.begin(); it != m_parts_state.end(); ++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); - - 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) { + if (part_state == PartState::psChecked) { checkbox->SetValue(true); } else if (part_state == PartState::psUnCheck) { - checkbox->SetValue(false); + checkbox->SetValue(false); } else { - checkbox->SetValue(true); + checkbox->SetValue(true); checkbox->Enable(false); } } @@ -721,13 +815,13 @@ 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; + part_state = PartState::psChecked; } } else{ for (auto& [part_id, part_state] : m_parts_state) { if (part_state == PartState::psChecked) - part_state = PartState::psUnCheck; + part_state = PartState::psUnCheck; } } m_canvas->UpdatePartsInfo(GetPartsInfo()); @@ -750,15 +844,15 @@ void PartSkipDialog::OnApplyDialog(wxCommandEvent &event) if(confirm_dialog.ShowModal() == wxID_OK){ if (m_obj) { - BOOST_LOG_TRIVIAL(info) << "monitor: skipping "<< m_partskip_ids.size() <<" parts dev_id =" << m_obj->dev_id; - + BOOST_LOG_TRIVIAL(info) << "monitor: skipping "<< m_partskip_ids.size() <<" objects."; + bool all_skipped = true; - for (auto [part_id, part_state] : m_parts_state) { + for (auto [part_id, part_state] : m_parts_state) { if (part_state == PartState::psUnCheck) all_skipped = false; } - if (all_skipped) { - m_obj->command_task_abort(); + if (all_skipped) { + m_obj->command_task_abort(); } else { m_obj->command_task_partskip(m_partskip_ids); } @@ -775,27 +869,33 @@ PartSkipConfirmDialog::PartSkipConfirmDialog(wxWindow *parent) : DPIDialog(paren std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % Slic3r::resources_dir()).str(); SetIcon(wxIcon(Slic3r::encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); SetBackgroundColour(*wxWHITE); + SetMinSize(wxSize(FromDIP(480), FromDIP(215))); SetSizeHints(wxDefaultSize, wxDefaultSize); 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)); + m_line_top->SetMaxSize(wxSize(FromDIP(480), 1)); m_line_top->SetBackgroundColour(wxColour(0xA6, 0xa9, 0xAA)); m_sizer->Add(m_line_top, 0, wxEXPAND, 0); m_sizer->Add(0, 0, 0, wxALL, FromDIP(15)); - m_msg_label = new Label( this, wxString(_L("Skipping objects."))); + m_msg_label = new Label( this, _L("Skipping objects.")); m_msg_label->Wrap( -1 ); m_msg_label->SetBackgroundColour(*wxWHITE); - m_sizer->Add(m_msg_label, 0, wxLEFT, FromDIP(15)); - auto m_tip_label = new Label(this, wxString(_("This action cannot be undone. Continue?"))); + + auto 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_sizer->Add(m_tip_label, 0, wxLEFT | wxTOP, FromDIP(15)); + + 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; m_button_sizer = new wxBoxSizer(wxHORIZONTAL); @@ -809,7 +909,7 @@ PartSkipConfirmDialog::PartSkipConfirmDialog(wxWindow *parent) : DPIDialog(paren StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), std::pair(wxColour(0, 177, 66), StateColor::Normal)); - m_apply_button = new Button(this, wxString(_L("Continue"))); + m_apply_button = new Button(this, _L("Continue")); m_apply_button->SetBackgroundColor(btn_bg_green); m_apply_button->SetTextColor(*wxWHITE); // m_apply_button->SetBorderColor(wxColour(38, 46, 48)); @@ -822,7 +922,7 @@ PartSkipConfirmDialog::PartSkipConfirmDialog(wxWindow *parent) : DPIDialog(paren e.Skip(); }); - m_button_sizer->Add(m_apply_button, 0, wxALL, FromDIP(15)); + 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 ); @@ -847,7 +947,13 @@ bool PartSkipConfirmDialog::Show(bool show) return DPIDialog::Show(show); } -void PartSkipConfirmDialog::on_dpi_changed(const wxRect& suggested_rect) { Fit(); } +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(); + Layout(); + Fit(); +} Button* PartSkipConfirmDialog::GetConfirmButton() @@ -860,4 +966,5 @@ void PartSkipConfirmDialog::SetMsgLabel(wxString msg){ } -}} // namespace Slic3r::GUI +} +} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/PartSkipDialog.hpp b/src/slic3r/GUI/PartSkipDialog.hpp index cd8fca3be7..1428f15ee8 100644 --- a/src/slic3r/GUI/PartSkipDialog.hpp +++ b/src/slic3r/GUI/PartSkipDialog.hpp @@ -29,8 +29,8 @@ namespace Slic3r { namespace GUI { class SkipPartCanvas; -enum URL_STATE { - URL_TCP, +enum URL_STATE { + URL_TCP, URL_TUTK, }; @@ -78,13 +78,15 @@ public: Button* m_switch_drag_btn; CheckBox* m_all_checkbox; Button* m_percent_label; - Label * m_all_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; - + Button* m_apply_btn; Label* m_loading_label; @@ -108,7 +110,7 @@ private: int m_zoom_percent{100}; bool m_is_drag{false}; bool m_print_lock{true}; - + std::map m_parts_state; std::map m_parts_name; std::vector m_partskip_ids; @@ -117,7 +119,7 @@ private: PartsInfo GetPartsInfo(); bool is_drag_mode(); - + boost::shared_ptr m_file_sys; bool m_file_sys_result{false}; std::string m_timestamp; @@ -127,19 +129,19 @@ private: std::string create_tmp_path(); bool is_local_file_existed(const std::vector &local_paths); - + void DownloadPartsFile(); void OnFileSystemEvent(wxCommandEvent &event); void OnFileSystemResult(wxCommandEvent &event); void fetchUrl(boost::weak_ptr wfs); - + void OnZoomIn(wxCommandEvent &event); void OnZoomOut(wxCommandEvent &event); - void OnSwitchDrag(wxCommandEvent &event); + void OnSwitchDrag(wxCommandEvent &event); void OnZoomPercent(wxCommandEvent &event); void UpdatePartsStateFromCanvas(wxCommandEvent &event); - + void UpdateZoomPercent(); void UpdateCountLabel(); void UpdateDialogUI(); diff --git a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp index 4385cbfb52..a48310254d 100644 --- a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp +++ b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp @@ -263,7 +263,7 @@ void PrinterFileSystem::GetPickImage(int id, const std::string &local_path, cons { json j; - j["sequence_id"] = id; + j["sequence_id"] = id; j["version"] = 1; j["peer_host"] = "studio"; j["command"] = "get_project_file"; @@ -836,7 +836,7 @@ void PrinterFileSystem::DownloadNextFile() file.download.reset(), file.flags &= ~FF_DOWNLOAD; else // FAILED file.download.reset(); - if (&file_index.first == &m_file_list) + if (&file_index.first == &m_file_list) SendChangedEvent(EVT_DOWNLOAD, download->index, result ? download->error : file.local_path, result); } } diff --git a/src/slic3r/GUI/SkipPartCanvas.cpp b/src/slic3r/GUI/SkipPartCanvas.cpp index e9218aa714..09e6987a7a 100644 --- a/src/slic3r/GUI/SkipPartCanvas.cpp +++ b/src/slic3r/GUI/SkipPartCanvas.cpp @@ -33,8 +33,11 @@ SkipPartCanvas::SkipPartCanvas(wxWindow *parent, const wxGLAttributes& dispAttrs void SkipPartCanvas::LoadPickImage(const std::string & path) { parts_state_.clear(); + pick_parts_.clear(); + parts_triangles_.clear(); int preffered_w{FromDIP(400)}, preffered_h{FromDIP(400)}; cv::Mat src_image = cv::imread(path, cv::IMREAD_UNCHANGED); + cv::cvtColor(src_image, src_image, cv::COLOR_BGRA2BGR); // remove alpha float zoom_x{static_cast(preffered_w) / src_image.cols}; float zoom_y{static_cast(preffered_h) / src_image.rows}; float image_scale{0}; @@ -42,12 +45,12 @@ void SkipPartCanvas::LoadPickImage(const std::string & path) image_scale = zoom_x; else image_scale = zoom_y; - cv::resize(src_image, pick_image_, cv::Size(), image_scale, image_scale); + cv::resize(src_image, pick_image_, cv::Size(), image_scale, image_scale, cv::INTER_NEAREST); std::vector channels; - cv::split(pick_image_, channels); // channels[3] 是 Alpha - cv::Mat alpha = channels[3]; - cv::Mat mask; - cv::threshold(alpha, mask, 0, 255, cv::THRESH_BINARY); + cv::Mat gray; // convert to gray + cv::cvtColor(pick_image_, gray, cv::COLOR_BGR2GRAY); + cv::Mat mask; // convery to binary + cv::threshold(gray, mask, 0, 255, cv::THRESH_BINARY); std::vector> pick_counters; cv::findContours(mask, pick_counters, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_TC89_KCOS); std::vector> polygon; @@ -328,7 +331,7 @@ uint32_t SkipPartCanvas::GetIdAtImagePt(const wxPoint& image_pt) const if (image_pt.x >= 0 && image_pt.x < pick_image_.cols && image_pt.y >= 0 && image_pt.y < pick_image_.rows) { // at(row, col)=>at(y, x) - cv::Vec4b bgr = pick_image_.at(image_pt.y, image_pt.x); + cv::Vec3b bgr = pick_image_.at(image_pt.y, image_pt.x); SkipIdHelper helper{bgr[2], bgr[1], bgr[0]}; helper.reverse(); return helper.value; @@ -392,7 +395,7 @@ void SkipPartCanvas::ProcessHover(const wxPoint& mouse_pt) int new_hover_id { -1 }; auto part_state = parts_state_.find(id_at_mouse); if (part_state != parts_state_.end() && part_state->second == psUnCheck) { - new_hover_id = id_at_mouse; + new_hover_id = id_at_mouse; }; if (new_hover_id != this->hover_id_) { this->hover_id_ = new_hover_id; @@ -457,9 +460,9 @@ void SkipPartCanvas::OnMouseLeftUp(wxMouseEvent& event) left_down_ = false; if (fixed_draging_) EndDrag(); - else { + else { Refresh(); - } + } } void SkipPartCanvas::OnMouseRightDown(wxMouseEvent& event) @@ -556,44 +559,19 @@ bool ModelSettingHelper::Parse() return true; } -std::vector ModelSettingHelper::GetResults() { return context_.objects; } - +std::vector ModelSettingHelper::GetResults() { + return context_.objects; +} void XMLCALL ModelSettingHelper::StartElementHandler(void *userData, const XML_Char *name, const XML_Char **atts) { ModelSettingHelper* self = static_cast(userData); if (strcmp(name, "object") == 0) { for (int i = 0; atts[i]; i += 2) { - if (strcmp(atts[i], "id") == 0) { - self->context_.current_object_id = atoi(atts[i+1]); - } - } - } else if ((self->context_.current_object_id != -1) - && (strcmp(name, "metadata") == 0) - && (self->context_.node_name.top() == "object")) { - const XML_Char *key{nullptr}, *value{nullptr}; - for (int i = 0; atts[i]; i += 2) { - if (strcmp(atts[i], "key") == 0) key = atts[i+1]; - if (strcmp(atts[i], "value") == 0) value = atts[i+1]; - } - if (key && value && (strcmp(key, "name") == 0)) { - self->context_.temp_object.id = self->context_.current_object_id; - self->context_.temp_object.name = std::string(value); - } - } else if ((strcmp(name, "metadata") == 0) - && (self->context_.node_name.top() == "model_instance")) { - const XML_Char *key{nullptr}, *value{nullptr}; - for (int i = 0; atts[i]; i += 2) { - if (strcmp(atts[i], "key") == 0) key = atts[i+1]; - if (strcmp(atts[i], "value") == 0) value = atts[i+1]; - } - if (key && value && (strcmp(key, "object_id") == 0)) { - self->context_.current_instance_object_id = atoi(value); - } else if (key && value && (strcmp(key, "identify_id") == 0)) { - self->context_.current_instance_identify_id = atoi(value); + if (strcmp(atts[i], "identify_id") == 0) { self->context_.temp_object.identify_id = atoi(atts[i + 1]); } + if (strcmp(atts[i], "name") == 0) { self->context_.temp_object.name = std::string(atts[i + 1]); } } } - self->context_.node_name.push(std::string(name)); } void XMLCALL ModelSettingHelper::EndElementHandler(void *userData, const XML_Char *name) @@ -601,23 +579,7 @@ void XMLCALL ModelSettingHelper::EndElementHandler(void *userData, const XML_Cha ModelSettingHelper* self = static_cast(userData); if (strcmp(name, "object") == 0) { self->context_.objects.push_back(self->context_.temp_object); - self->context_.current_object_id = -1; } - else if ((strcmp(name, "model_instance") == 0) - && (self->context_.current_instance_identify_id != -1) - && (self->context_.current_instance_object_id != -1)) { - for (auto& obj : self->context_.objects) { - if (obj.id == self->context_.current_instance_object_id) { - obj.identify_id = self->context_.current_instance_identify_id; - break; - } - } - self->context_.current_instance_identify_id = -1; - self->context_.current_instance_object_id = -1; - } else if (strcmp(name, "object") == 0) { - self->context_.current_object_id = -1; - } - self->context_.node_name.pop(); } void ModelSettingHelper::DataHandler(const XML_Char *s, int len) diff --git a/src/slic3r/GUI/SkipPartCanvas.hpp b/src/slic3r/GUI/SkipPartCanvas.hpp index b4a6ad3d2c..6f02510872 100644 --- a/src/slic3r/GUI/SkipPartCanvas.hpp +++ b/src/slic3r/GUI/SkipPartCanvas.hpp @@ -23,7 +23,6 @@ using FloatPoint = std::array; struct ObjectInfo { - int id{-1}; std::string name{""}; int identify_id{-1}; PartState state{psUnCheck}; @@ -107,7 +106,7 @@ private: inline wxPoint ViewPtToImagePt(const wxPoint& view_pt) const; uint32_t GetIdAtImagePt(const wxPoint& image_pt) const; inline uint32_t GetIdAtViewPt(const wxPoint& view_pt) const; - + void ProcessHover(const wxPoint& mouse_pt); void AutoSetCursor(); void StartDrag(const wxPoint& mouse_pt); @@ -136,16 +135,11 @@ class ModelSettingHelper : public _BBS_3MF_Base { struct ParseContext{ std::vector objects; ObjectInfo temp_object; - - std::stack node_name; - int current_object_id{-1}; - int current_instance_identify_id{-1}; - int current_instance_object_id{-1}; }; public: ModelSettingHelper(const std::string& path); - + bool Parse(); std::vector GetResults(); diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 25138c0168..7763563b5c 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -233,12 +233,6 @@ void PrintingTaskPanel::create_panel(wxWindow* parent) bSizer_task_name->Add(task_name_panel, 0, wxEXPAND, FromDIP(5)); - - /* wxFlexGridSizer *fgSizer_task = new wxFlexGridSizer(2, 2, 0, 0); - fgSizer_task->AddGrowableCol(0); - fgSizer_task->SetFlexibleDirection(wxVERTICAL); - fgSizer_task->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);*/ - m_printing_stage_value = new wxStaticText(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END); m_printing_stage_value->Wrap(-1); m_printing_stage_value->SetMaxSize(wxSize(FromDIP(800),-1)); @@ -261,18 +255,12 @@ void PrintingTaskPanel::create_panel(wxWindow* parent) m_staticText_profile_value->SetForegroundColour(0x6B6B6B); + auto progress_lr_panel = new wxPanel(parent, wxID_ANY); + progress_lr_panel->SetBackgroundColour(*wxWHITE); - auto m_panel_progress = new wxPanel(parent, wxID_ANY); - m_panel_progress->SetBackgroundColour(*wxWHITE); - auto m_sizer_progressbar = new wxBoxSizer(wxHORIZONTAL); - m_gauge_progress = new ProgressBar(m_panel_progress, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize); + m_gauge_progress = new ProgressBar(progress_lr_panel, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize); m_gauge_progress->SetValue(0); m_gauge_progress->SetHeight(PROGRESSBAR_HEIGHT); - m_gauge_progress->SetMaxSize(wxSize(FromDIP(600), -1)); - m_panel_progress->SetSizer(m_sizer_progressbar); - m_panel_progress->Layout(); - m_panel_progress->SetSize(wxSize(-1, FromDIP(24))); - m_panel_progress->SetMaxSize(wxSize(-1, FromDIP(24))); wxBoxSizer *bSizer_task_btn = new wxBoxSizer(wxHORIZONTAL); @@ -281,8 +269,9 @@ void PrintingTaskPanel::create_panel(wxWindow* parent) StateColor white_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)); - m_button_partskip = new Button(m_panel_progress, ""); + m_button_partskip = new Button(progress_lr_panel, ""); m_button_partskip->Enable(false); + m_button_partskip->Hide(); m_button_partskip->SetBackgroundColor(white_bg); m_button_partskip->SetIcon("print_control_partskip_disable"); m_button_partskip->SetBorderColor(*wxWHITE); @@ -292,7 +281,7 @@ void PrintingTaskPanel::create_panel(wxWindow* parent) m_button_partskip->Bind(wxEVT_ENTER_WINDOW, [this](auto &e) { m_button_partskip->SetIcon("print_control_partskip"); }); m_button_partskip->Bind(wxEVT_LEAVE_WINDOW, [this](auto &e) { m_button_partskip->SetIcon("print_control_partskip"); }); - m_button_pause_resume = new ScalableButton(m_panel_progress, wxID_ANY, "print_control_pause", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER,true); + m_button_pause_resume = new ScalableButton(progress_lr_panel, wxID_ANY, "print_control_pause", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER,true); m_button_pause_resume->Bind(wxEVT_ENTER_WINDOW, [this](auto &e) { if (m_button_pause_resume->GetToolTipText() == _L("Pause")) { @@ -315,7 +304,7 @@ void PrintingTaskPanel::create_panel(wxWindow* parent) } }); - m_button_abort = new ScalableButton(m_panel_progress, wxID_ANY, "print_control_stop", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true); + m_button_abort = new ScalableButton(progress_lr_panel, wxID_ANY, "print_control_stop", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true); m_button_abort->SetToolTip(_L("Stop")); m_button_abort->Bind(wxEVT_ENTER_WINDOW, [this](auto &e) { @@ -326,14 +315,6 @@ void PrintingTaskPanel::create_panel(wxWindow* parent) m_button_abort->SetBitmap_("print_control_stop"); } ); - m_sizer_progressbar->Add(m_gauge_progress, 1, wxALIGN_CENTER_VERTICAL, 0); - m_sizer_progressbar->Add(0, 0, 0, wxEXPAND|wxLEFT, FromDIP(18)); - m_sizer_progressbar->Add(m_button_partskip, 0, wxALL, FromDIP(5)); - m_sizer_progressbar->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(18)); - m_sizer_progressbar->Add(m_button_pause_resume, 0, wxALL, FromDIP(5)); - m_sizer_progressbar->Add(0, 0, 0, wxEXPAND|wxLEFT, FromDIP(18)); - m_sizer_progressbar->Add(m_button_abort, 0, wxALL, FromDIP(5)); - wxBoxSizer *bSizer_buttons = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *bSizer_text = new wxBoxSizer(wxHORIZONTAL); wxPanel* penel_bottons = new wxPanel(parent); @@ -380,48 +361,55 @@ void PrintingTaskPanel::create_panel(wxWindow* parent) wxFont(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC"))); m_staticText_progress_end->SetForegroundColour(wxColour(146, 146, 146)); - //fgSizer_task->Add(bSizer_buttons, 0, wxEXPAND, 0); - //fgSizer_task->Add(0, 0, 0, wxEXPAND, FromDIP(5)); - - wxPanel* panel_button_block = new wxPanel(penel_bottons, wxID_ANY); - panel_button_block->SetMinSize(wxSize(TASK_BUTTON_SIZE.x * 2 + FromDIP(5) * 4, -1)); - panel_button_block->SetMinSize(wxSize(TASK_BUTTON_SIZE.x * 2 + FromDIP(5) * 4, -1)); - panel_button_block->SetSize(wxSize(TASK_BUTTON_SIZE.x * 2 + FromDIP(5) * 2, -1)); - panel_button_block->SetBackgroundColour(*wxWHITE); - m_staticText_layers = new wxStaticText(penel_text, wxID_ANY, _L("Layer: N/A")); m_staticText_layers->SetFont(wxFont(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC"))); m_staticText_layers->SetForegroundColour(wxColour(146, 146, 146)); m_staticText_layers->Hide(); - //bSizer_text->Add(m_staticText_progress_percent, 0, wxALL, 0); bSizer_text->Add(sizer_percent, 0, wxEXPAND, 0); bSizer_text->Add(sizer_percent_icon, 0, wxEXPAND, 0); bSizer_text->Add(0, 0, 1, wxEXPAND, 0); - bSizer_text->Add(m_staticText_layers, 0, wxALIGN_CENTER | wxALL, 0); + bSizer_text->Add(m_staticText_layers, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); bSizer_text->Add(0, 0, 0, wxLEFT, FromDIP(20)); - bSizer_text->Add(m_staticText_progress_left, 0, wxALIGN_CENTER | wxALL, 0); + bSizer_text->Add(m_staticText_progress_left, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); // Orca: display the end time of the print bSizer_text->Add(0, 0, 0, wxLEFT, FromDIP(8)); bSizer_text->Add(m_staticText_progress_end, 0, wxALIGN_CENTER | wxALL, 0); - penel_text->SetMaxSize(wxSize(FromDIP(600), -1)); + // penel_text->SetMaxSize(wxSize(FromDIP(600), -1)); penel_text->SetSizer(bSizer_text); penel_text->Layout(); - bSizer_buttons->Add(penel_text, 1, wxEXPAND | wxALL, 0); - bSizer_buttons->Add(panel_button_block, 0, wxALIGN_CENTER | wxALL, 0); + auto progress_lr_sizer = new wxBoxSizer(wxHORIZONTAL); + auto progress_left_sizer = new wxBoxSizer(wxVERTICAL); + auto progress_right_sizer = new wxBoxSizer(wxHORIZONTAL); - penel_bottons->SetSizer(bSizer_buttons); - penel_bottons->Layout(); + progress_left_sizer->Add(penel_text, 0, wxEXPAND | wxALL, 0); + progress_left_sizer->Add(m_gauge_progress, 0, wxEXPAND | wxALL, 0); + // progress_left_sizer->SetMaxSize(wxSize(FromDIP(600), -1)); + + progress_right_sizer->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(18)); + progress_right_sizer->Add(m_button_partskip, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(0));//5 + progress_right_sizer->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(18)); + progress_right_sizer->Add(m_button_pause_resume, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(0)); + progress_right_sizer->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(18)); + progress_right_sizer->Add(m_button_abort, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(0)); + progress_right_sizer->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(18)); + + progress_lr_sizer->Add(progress_left_sizer, 1, wxEXPAND | wxALL, 0); + progress_lr_sizer->Add(progress_right_sizer, 0, wxEXPAND | wxALL , 0); + + progress_lr_panel->SetSizer(progress_lr_sizer); + progress_lr_panel->SetMaxSize(wxSize(FromDIP(720), -1)); + + progress_lr_panel->Layout(); + progress_lr_panel->Fit(); bSizer_subtask_info->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(14)); bSizer_subtask_info->Add(bSizer_task_name, 0, wxEXPAND|wxRIGHT, FromDIP(18)); bSizer_subtask_info->Add(m_staticText_profile_value, 0, wxEXPAND | wxTOP, FromDIP(5)); bSizer_subtask_info->Add(m_printing_stage_value, 0, wxEXPAND | wxTOP, FromDIP(5)); - bSizer_subtask_info->Add(penel_bottons, 0, wxEXPAND | wxTOP, FromDIP(10)); - bSizer_subtask_info->Add(m_panel_progress, 0, wxEXPAND|wxRIGHT, FromDIP(25)); - + bSizer_subtask_info->Add(progress_lr_panel, 0, wxEXPAND | wxTOP, FromDIP(5)); m_printing_sizer = new wxBoxSizer(wxHORIZONTAL); m_printing_sizer->SetMinSize(wxSize(PAGE_MIN_WIDTH, -1)); @@ -660,6 +648,14 @@ void PrintingTaskPanel::update_machine_object(MachineObject* obj){ void PrintingTaskPanel::enable_partskip_button(bool enable) { + if(m_obj){ + if( m_obj->is_support_partskip ){ + m_button_partskip->Show(); + }else{ + m_button_partskip->Hide(); + } + } + if (!enable) { m_button_partskip->Enable(false); m_button_partskip->SetLabel(""); diff --git a/src/slic3r/GUI/Widgets/AnimaController.cpp b/src/slic3r/GUI/Widgets/AnimaController.cpp index 10f0061dbf..d034fe9fd8 100644 --- a/src/slic3r/GUI/Widgets/AnimaController.cpp +++ b/src/slic3r/GUI/Widgets/AnimaController.cpp @@ -13,8 +13,8 @@ AnimaIcon::AnimaIcon(wxWindow *parent, wxWindowID id, std::vector i m_size = 20; //add ScalableBitmap - 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); + 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)); // 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))); @@ -73,5 +73,3 @@ void AnimaIcon::Enable() { if (m_bitmap) { m_bitmap->SetBitmap(m_image_enable); } } - -