From 462728f4f39c932145e51e79deb312affa7d2e7c Mon Sep 17 00:00:00 2001 From: wjyLearn <93930815+wjyLearn@users.noreply.github.com> Date: Thu, 5 Feb 2026 16:08:33 +0800 Subject: [PATCH] fix some bug --- src/libslic3r/AppConfig.cpp | 1 - src/libslic3r/FilamentGroup.cpp | 1 + src/libslic3r/FilamentGroup.hpp | 8 +- src/libslic3r/Format/qds_3mf.cpp | 14 +- src/libslic3r/Model.hpp | 3 +- src/libslic3r/PrintConfig.hpp | 2 + src/slic3r/GUI/AMSMaterialsSetting.cpp | 6 +- src/slic3r/GUI/AmsMappingPopup.cpp | 3 +- src/slic3r/GUI/Auxiliary.hpp | 3 +- src/slic3r/GUI/DeviceCore/DevManager.cpp | 2 + src/slic3r/GUI/DeviceCore/DevMapping.cpp | 3 +- src/slic3r/GUI/DeviceManager.cpp | 4 +- src/slic3r/GUI/GUI.cpp | 5 + src/slic3r/GUI/GUI_App.cpp | 115 +++--- src/slic3r/GUI/GUI_App.hpp | 11 +- src/slic3r/GUI/HMSPanel.hpp | 3 +- src/slic3r/GUI/MainFrame.cpp | 31 +- src/slic3r/GUI/MediaPlayCtrl.cpp | 3 +- src/slic3r/GUI/Monitor.cpp | 3 +- src/slic3r/GUI/Monitor.hpp | 5 +- src/slic3r/GUI/MultiMachineManagerPage.cpp | 3 +- src/slic3r/GUI/Plater.cpp | 5 +- src/slic3r/GUI/Plater.hpp | 5 +- src/slic3r/GUI/PrinterWebView.cpp | 455 +++++++++++++++------ src/slic3r/GUI/PrinterWebView.hpp | 32 +- src/slic3r/GUI/QDSDeviceManager.cpp | 54 ++- src/slic3r/GUI/QDSDeviceManager.hpp | 7 +- src/slic3r/GUI/SelectMachine.cpp | 13 +- src/slic3r/GUI/StatusPanel.cpp | 68 ++- src/slic3r/GUI/StatusPanel.hpp | 7 + src/slic3r/GUI/UpgradePanel.hpp | 3 +- src/slic3r/GUI/WebViewDialog.cpp | 19 +- src/slic3r/GUI/Widgets/AMSControl.cpp | 18 + src/slic3r/GUI/Widgets/AMSControl.hpp | 5 + src/slic3r/GUI/Widgets/DeviceButton.cpp | 25 +- src/slic3r/GUI/wxExtensions.cpp | 23 +- src/slic3r/GUI/wxExtensions.hpp | 3 + src/slic3r/GUI/wxMediaCtrl3.cpp | 323 ++++++++------- src/slic3r/GUI/wxMediaCtrl3.h | 12 +- src/slic3r/Utils/CalibUtils.cpp | 3 + 40 files changed, 841 insertions(+), 468 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 333d41c..ac8a29d 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -519,7 +519,6 @@ void AppConfig::set_defaults() if(get("switch to device tab after upload").empty()) set_bool("switch to device tab after upload", false); -//y76 if(get("last_selected_machine").empty()) set("last_selected_machine", ""); diff --git a/src/libslic3r/FilamentGroup.cpp b/src/libslic3r/FilamentGroup.cpp index 795df4d..bffd1ed 100644 --- a/src/libslic3r/FilamentGroup.cpp +++ b/src/libslic3r/FilamentGroup.cpp @@ -14,6 +14,7 @@ namespace Slic3r // clear the array and heap,save the groups in heap to the array static void change_memoryed_heaps_to_arrays(MemoryedGroupHeap& heap,const int total_filament_num,const std::vector& used_filaments, std::vector>& arrs) { + // switch the label idx arrs.clear(); while (!heap.empty()) { diff --git a/src/libslic3r/FilamentGroup.hpp b/src/libslic3r/FilamentGroup.hpp index a61a874..023a671 100644 --- a/src/libslic3r/FilamentGroup.hpp +++ b/src/libslic3r/FilamentGroup.hpp @@ -282,10 +282,10 @@ namespace Slic3r protected: MemoryedGroupHeap memoryed_groups; std::shared_ptrm_evaluator; - std::unordered_map> m_unplaceable_limits; // 材料不允许分配到特定喷嘴 - std::unordered_map> m_placeable_limits; // 材料必须分配到特定喷嘴 - std::vectorm_max_cluster_size; // 每个喷嘴能够分配的最大耗材数量 - std::vectorm_cluster_labels; // 分配结果,细化到喷嘴id + std::unordered_map> m_unplaceable_limits; + std::unordered_map> m_placeable_limits; + std::vectorm_max_cluster_size; + std::vectorm_cluster_labels; std::vector,int>> m_cluster_group_size; std::vector m_nozzle_to_extruder; diff --git a/src/libslic3r/Format/qds_3mf.cpp b/src/libslic3r/Format/qds_3mf.cpp index 145dc40..53aaa4e 100644 --- a/src/libslic3r/Format/qds_3mf.cpp +++ b/src/libslic3r/Format/qds_3mf.cpp @@ -1791,17 +1791,17 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) //QDS: version check bool dont_load_config = !m_load_config; - //w18 - /*if (m_qidislicer_generator_version) { + + if (m_qidislicer_generator_version) { Semver app_version = *(Semver::parse(SLIC3R_VERSION)); Semver file_version = *m_qidislicer_generator_version; - if (file_version.maj() > app_version.maj()) - dont_load_config = true; + /*if (file_version.maj() > app_version.maj()) + dont_load_config = true;*/ } else { m_qidislicer_generator_version = Semver::parse("0.0.0.0"); dont_load_config = true; - }*/ + } // we then loop again the entries to read other files stored in the archive for (mz_uint i = 0; i < num_entries; ++i) { @@ -3849,6 +3849,10 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) m_is_qdt_3mf = true; m_qidislicer_generator_version = Semver::parse(m_curr_characters.substr(12)); } + //y77 + if (boost::starts_with(m_curr_characters, "BambuStudio-")) { + m_qidislicer_generator_version = Semver::parse(m_curr_characters.substr(12)); + } //TODO: currently use version 0, no need to load&&save this string /*} else if (m_curr_metadata_name == QDS_FDM_SUPPORTS_PAINTING_VERSION) { m_fdm_supports_painting_version = (unsigned int) atoi(m_curr_characters.c_str()); diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index e4a2618..f62f3ac 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -761,7 +761,8 @@ enum class ConversionType : int { enum class En3mfType : int { From_QDS, From_Prusa, - From_Other + From_Other, + From_BBS }; class FacetsAnnotation final : public ObjectWithTimestamp { diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 1d3b8a0..d7acfd2 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1211,6 +1211,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, support_multi_bed_types)) //y60 ((ConfigOptionBool, is_support_3mf)) + //y76 ((ConfigOptionBool, is_support_mqtt)) ) @@ -1393,6 +1394,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionBool, is_support_timelapse)) //y65 ((ConfigOptionBool, is_support_multi_box)) + //y76 ((ConfigOptionBool, is_support_air_condition))) // This object is mapped to Perl as Slic3r::Config::Full. diff --git a/src/slic3r/GUI/AMSMaterialsSetting.cpp b/src/slic3r/GUI/AMSMaterialsSetting.cpp index 19ffcfa..9377de2 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.cpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.cpp @@ -855,9 +855,9 @@ void AMSMaterialsSetting::setComboBoxValue(wxString curValue) void AMSMaterialsSetting::on_clr_picker(wxMouseEvent &event) { - if(!m_is_third) - return; - + //if(!m_is_third) + /// return; + // return; // if (obj->is_in_printing() || obj->can_resume()) { // if (!obj->is_support_filament_setting_inprinting) { diff --git a/src/slic3r/GUI/AmsMappingPopup.cpp b/src/slic3r/GUI/AmsMappingPopup.cpp index 8f3d215..b6132f3 100644 --- a/src/slic3r/GUI/AmsMappingPopup.cpp +++ b/src/slic3r/GUI/AmsMappingPopup.cpp @@ -27,7 +27,8 @@ #include "DeviceCore/DevFilaSystem.h" #include "DeviceTab/wgtDeviceNozzleSelect.h" - +// cj_2 +#include "DeviceCore/DevNozzleRack.h" namespace Slic3r { namespace GUI { #define MATERIAL_ITEM_SIZE wxSize(FromDIP(65), FromDIP(50)) #define MATERIAL_REC_WHEEL_SIZE wxSize(FromDIP(17), FromDIP(16)) diff --git a/src/slic3r/GUI/Auxiliary.hpp b/src/slic3r/GUI/Auxiliary.hpp index c9adef6..2978481 100644 --- a/src/slic3r/GUI/Auxiliary.hpp +++ b/src/slic3r/GUI/Auxiliary.hpp @@ -42,7 +42,8 @@ #include "wxExtensions.hpp" #include "slic3r/GUI/DeviceManager.hpp" #include "slic3r/GUI/MonitorBasePanel.h" -#include "slic3r/GUI/StatusPanel.hpp" +//cj_2 +//#include "slic3r/GUI/StatusPanel.hpp" #include "slic3r/GUI/UpgradePanel.hpp" #include "slic3r/GUI/AmsWidgets.hpp" #include "Widgets/SideTools.hpp" diff --git a/src/slic3r/GUI/DeviceCore/DevManager.cpp b/src/slic3r/GUI/DeviceCore/DevManager.cpp index 8dc091a..285e634 100644 --- a/src/slic3r/GUI/DeviceCore/DevManager.cpp +++ b/src/slic3r/GUI/DeviceCore/DevManager.cpp @@ -505,6 +505,7 @@ namespace Slic3r MachineObject* DeviceManager::get_selected_machine() { return nullptr; + if (selected_machine.empty()) return nullptr; MachineObject* obj = get_user_machine(selected_machine); @@ -807,6 +808,7 @@ namespace Slic3r { if (MachineObject* obj_ = get_selected_machine()) { //GUI::wxGetApp().sidebar().update_sync_status(obj_); + GUI::wxGetApp().sidebar().load_ams_list(obj_); }; } diff --git a/src/slic3r/GUI/DeviceCore/DevMapping.cpp b/src/slic3r/GUI/DeviceCore/DevMapping.cpp index d3418bf..c41ceca 100644 --- a/src/slic3r/GUI/DeviceCore/DevMapping.cpp +++ b/src/slic3r/GUI/DeviceCore/DevMapping.cpp @@ -126,7 +126,8 @@ namespace Slic3r return -1; std::vector box_filament_infos; - for (int i = 0; i < filament_colors.size(); i++) { + //y77 + for (int i = 0; i < filament_colors.size() - 1; i++) { if (!filament_colors[i].empty() && slot_id[i] != -1) { FilamentInfo box_fila_info; box_fila_info.color = filament_colors[i].erase(0, 1) + "FF"; diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index b4f293b..750c01e 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -535,7 +535,7 @@ MachineObject::MachineObject(DeviceManager* manager, NetworkAgent* agent, std::s BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " called for dev_id=" << QDTCrossTalk::Crosstalk_DevId(id) << ", main_thread=" << wxThread::IsMain(); if (!wxThread::IsMain()) { assert(false && "critical warning"); - BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "called from other thread, callstack: " << boost::stacktrace::stacktrace(); + //BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "called from other thread, callstack: " << boost::stacktrace::stacktrace(); } m_manager = manager; @@ -599,7 +599,7 @@ MachineObject::~MachineObject() BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " called for dev_id=" << QDTCrossTalk::Crosstalk_DevId(get_dev_id()) << ", main_thread=" << wxThread::IsMain(); if (!wxThread::IsMain()) { assert(false && "critical warning"); - BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << " called from other thread, callstack: " << boost::stacktrace::stacktrace(); + //BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << " called from other thread, callstack: " << boost::stacktrace::stacktrace(); } if (subtask_) { diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index 116368b..0cfc051 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -298,6 +298,11 @@ static void add_config_substitutions(const ConfigSubstitutions& conf_substitutio const std::vector& values = def->enum_values; int val = conf_substitution.new_value->getInt(); + //y77 + if (val > values.size() - 1) { + continue; + } + bool is_infill = def->opt_key == "top_surface_pattern" || def->opt_key == "bottom_surface_pattern" || def->opt_key == "internal_solid_infill_pattern" || diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 943eea8..2813fa7 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -112,6 +112,8 @@ #include "HintNotification.hpp" #include "QDTUtil.hpp" #include "PrinterWebView.hpp" +//cj_2 +#include "QDSDeviceManager.hpp" //#ifdef WIN32 //#include "BaseException.h" //#endif @@ -1467,7 +1469,20 @@ void GUI_App::shutdown() BOOST_LOG_TRIVIAL(info) << "GUI_App::shutdown exit"; } +//cj_2 +#if QDT_RELEASE_TO_PUBLIC +std::vector GUI_App::get_devices() +{ + return qdsdevmanager->getNetDevices(); +} + +void GUI_App::set_devices(std::vector devices) +{ + qdsdevmanager->setNetDevices(devices); +} + +#endif std::string GUI_App::get_http_url(std::string country_code, std::string path) { std::string url; @@ -4045,7 +4060,7 @@ void GUI_App::ShowUserLogin(bool show) // 10 void GUI_App::SetOnlineLogin(bool status) { - m_qidi_login = status; + get_login_info(); mainframe->m_printer_view->SetLoginStatus(status); } @@ -4161,6 +4176,7 @@ static void update_scrolls(wxWindow* window) void GUI_App::force_menu_update() { NppDarkMode::SetSystemMenuForApp(app_config->get("sys_menu_enabled") == "1"); + } #endif //_MSW_DARK_MODE #endif //__WINDOWS__ @@ -4304,7 +4320,7 @@ wxString GUI_App::transition_tridid(int trid_id) const //QDS void GUI_App::request_login(bool show_user_info) { -#if QDT_RELEASE_TO_PUBLIC +#if QDT_RELEASE_TO_PUBLIC ShowUserLogin(); if (show_user_info) { @@ -4329,64 +4345,53 @@ void GUI_App::get_login_info() // GUI::wxGetApp().run_script_left(strJS); // } // } - // y15 // y16 - bool m_isloginin = (wxGetApp().app_config->get("user_token") != ""); - if (m_isloginin) { - std::string head_name = wxGetApp().app_config->get("user_head_name"); - if(m_user_name.empty()){ - bool is_link = app_config->get("login_method") != "Maker"; - if(is_link){ - wxString msg; - QIDINetwork m_qidinetwork; - m_user_name = m_qidinetwork.user_info(msg); - } - else{ - m_user_name = MakerHttpHandle::getInstance().get_maker_user_name(); - } - head_name = wxGetApp().app_config->get("user_head_name"); - - if (m_user_name.empty()){ - m_user_name = ""; - wxGetApp().app_config->set("user_token", ""); - wxString user_head_path = (boost::filesystem::path(Slic3r::data_dir()) / "user" / head_name).make_preferred().string(); - wxString strJS = wxString::Format("SetUserOffline()"); - GUI::wxGetApp().run_script_left(strJS); - m_qidi_login = false; - } - else{ - wxString user_head_path = (boost::filesystem::path(Slic3r::data_dir()) / "user" / head_name).make_preferred().string(); - if (!wxGetApp().app_config->get("user_head_name").empty()) { - user_head_path = (boost::filesystem::path(Slic3r::data_dir()) / "user" / head_name).make_preferred().string(); - std::replace(user_head_path.begin(), user_head_path.end(), '\\', '/'); - } - else - user_head_path = ""; - wxString strJS = wxString::Format("SetLoginInfo('%s', '%s');", user_head_path, from_u8(m_user_name)); - GUI::wxGetApp().run_script_left(strJS); - m_qidi_login = true; - } + //y77 + bool has_token = (wxGetApp().app_config->get("user_token") != ""); + if (has_token) { + if (m_qidi_login) + return; + std::string head_name = wxGetApp().app_config->get("user_head_name"); + bool is_link = app_config->get("login_method") != "Maker"; + if(is_link){ + wxString msg; + QIDINetwork m_qidinetwork; + m_user_name = m_qidinetwork.user_info(msg); + } + else{ + m_user_name = MakerHttpHandle::getInstance().get_maker_user_name(); + } + + if(!m_user_name.empty()){ + wxString user_head_path; + if (!head_name.empty()) { + user_head_path = (boost::filesystem::path(Slic3r::data_dir()) / "user" / head_name).make_preferred().string(); + std::replace(user_head_path.begin(), user_head_path.end(), '\\', '/'); + } + else + user_head_path = ""; + wxString strJS = wxString::Format("SetLoginInfo('%s', '%s');", user_head_path, from_u8(m_user_name)); + GUI::wxGetApp().run_script_left(strJS); + m_qidi_login = true; + } + else if(!is_link) { + std::string new_token = MakerHttpHandle::getInstance().refresh_token(); + wxGetApp().app_config->set("user_token", new_token); + } + else { + wxGetApp().app_config->set("user_token", ""); } - else{ - //y34 - wxString user_head_path = (boost::filesystem::path(Slic3r::data_dir()) / "user" / head_name).make_preferred().string(); - if (!wxGetApp().app_config->get("user_head_name").empty()) { - user_head_path = (boost::filesystem::path(Slic3r::data_dir()) / "user" / head_name).make_preferred().string(); - std::replace(user_head_path.begin(), user_head_path.end(), '\\', '/'); - } - else - user_head_path = ""; - wxString strJS = wxString::Format("SetLoginInfo('%s', '%s');", user_head_path, from_u8(m_user_name)); - GUI::wxGetApp().run_script_left(strJS); - m_qidi_login = true; + + if(wxGetApp().app_config->get("user_token") == ""){ + request_user_logout(); } } else { - m_user_name = ""; - wxGetApp().app_config->set("user_token", ""); - wxString strJS = wxString::Format("SetUserOffline()"); - GUI::wxGetApp().run_script_left(strJS); - m_qidi_login = false; + m_user_name = ""; + wxGetApp().app_config->set("user_token", ""); + wxString strJS = wxString::Format("SetUserOffline()"); + GUI::wxGetApp().run_script_left(strJS); + m_qidi_login = false; } #endif } diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 7395d4c..5befb64 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -43,9 +43,6 @@ #include "slic3r/GUI/WebUserLoginDialog.hpp" -//y76 -#include "QDSDeviceManager.hpp" - //#define QDT_HAS_FIRST_PAGE 1 #define STUDIO_INACTIVE_TIMEOUT 15*60*1000 #define LOG_FILES_MAX_NUM 30 @@ -101,6 +98,8 @@ class ModelMallDialog; class PingCodeBindDialog; class NetworkErrorDialog; class OpenGLManager; +//cj_2 +class QDSDeviceManager; enum FileType { @@ -465,8 +464,8 @@ public: #if QDT_RELEASE_TO_PUBLIC //y76 - std::vector get_devices() { return qdsdevmanager->getNetDevices(); }; - void set_devices(std::vector devices) { qdsdevmanager->setNetDevices(devices); }; + std::vector get_devices(); + void set_devices(std::vector devices); #endif @@ -504,6 +503,8 @@ public: bool is_user_login(); // y21 bool is_QIDILogin() { return m_qidi_login; }; + //y77 + void set_QIDILogin(bool val) { m_qidi_login = val; }; void request_user_login(int online_login = 0); void request_user_handle(int online_login = 0); diff --git a/src/slic3r/GUI/HMSPanel.hpp b/src/slic3r/GUI/HMSPanel.hpp index 4991059..6bc2eec 100644 --- a/src/slic3r/GUI/HMSPanel.hpp +++ b/src/slic3r/GUI/HMSPanel.hpp @@ -6,7 +6,8 @@ #include #include #include -#include +//cj_2 +//#include #include #include "DeviceCore/DevHMS.h" diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index edaa3a6..1ad1a2d 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -64,6 +64,8 @@ #include "Widgets/WebView.hpp" #include "DailyTips.hpp" #include "FilamentMapDialog.hpp" +//cj_2 +#include "QDSDeviceManager.hpp" #include "DeviceCore/DevManager.h" @@ -728,13 +730,7 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, BORDERLESS_FRAME_ if(is_webview){ if (event.IsIconized()) { wxString url; - if (m_printer_view->GetNetMode()) { - url = wxString::Format("file://%s/web/qidi/link_missing_connection.html", from_u8(resources_dir())); - } - else { - url = wxString::Format("file://%s/web/qidi/missing_connection.html", from_u8(resources_dir())); - } - m_printer_view->load_disconnect_url(url); + m_printer_view->load_disconnect_url(); } else { if (!printer_view_ip.empty() && new_sel == tpMonitor) { @@ -1157,11 +1153,15 @@ void MainFrame::init_tabpanel() m_settings_dialog.set_tabpanel(m_tabpanel); m_tabpanel->Bind(wxEVT_NOTEBOOK_PAGE_CHANGING, [this](wxBookCtrlEvent& e) { + //y77 + if (e.GetEventObject() != m_tabpanel) { + e.Skip(); + return; + } + int old_sel = e.GetOldSelection(); //y53 new_sel = e.GetSelection(); - //y76 - int tab_panel = m_tabpanel->GetSelection(); if (old_sel != wxNOT_FOUND && new_sel != old_sel && @@ -1227,17 +1227,10 @@ void MainFrame::init_tabpanel() m_calibration->m_filament_choice->update(); m_calibration->m_print_choice->update(); } - //y53 //y76 - if (new_sel != tpMonitor && tab_panel != tpMonitor){ + //y53 //y77 + if (new_sel != tpMonitor){ if(is_webview){ - wxString url; - if (m_printer_view->GetNetMode()) { - url = wxString::Format("file://%s/web/qidi/link_missing_connection.html", from_u8(resources_dir())); - } - else { - url = wxString::Format("file://%s/web/qidi/missing_connection.html", from_u8(resources_dir())); - } - m_printer_view->load_disconnect_url(url); + m_printer_view->load_disconnect_url(); } else m_printer_view->pauseCamera(); diff --git a/src/slic3r/GUI/MediaPlayCtrl.cpp b/src/slic3r/GUI/MediaPlayCtrl.cpp index 8d64a3f..f171d64 100644 --- a/src/slic3r/GUI/MediaPlayCtrl.cpp +++ b/src/slic3r/GUI/MediaPlayCtrl.cpp @@ -55,7 +55,8 @@ MediaPlayCtrl::MediaPlayCtrl(wxWindow *parent, VideoPanel *media_ctrl, const wxP SetLabel("MediaPlayCtrl"); SetBackgroundColour(*wxWHITE); m_media_ctrl->Bind(wxEVT_MEDIA_STATECHANGED, &MediaPlayCtrl::onStateChanged, this); - m_media_ctrl->SetIdleImage(from_u8(resources_dir() + "/images/live_stream_default.png")); + //y77 + m_media_ctrl->SetIdleImage("live_stream_default"); m_button_play = new Button(this, "", "media_play", wxBORDER_NONE); m_button_play->SetCanFocus(false); diff --git a/src/slic3r/GUI/Monitor.cpp b/src/slic3r/GUI/Monitor.cpp index 339aeb9..90b1c52 100644 --- a/src/slic3r/GUI/Monitor.cpp +++ b/src/slic3r/GUI/Monitor.cpp @@ -28,7 +28,8 @@ #include "MediaFilePanel.h" #include "Plater.hpp" #include "BindDialog.hpp" - +//cj_2 +#include #include "DeviceCore/DevManager.h" namespace Slic3r { diff --git a/src/slic3r/GUI/Monitor.hpp b/src/slic3r/GUI/Monitor.hpp index d3032a8..d6602be 100644 --- a/src/slic3r/GUI/Monitor.hpp +++ b/src/slic3r/GUI/Monitor.hpp @@ -43,7 +43,8 @@ #include "slic3r/GUI/MsgDialog.hpp" #include "slic3r/GUI/DeviceManager.hpp" #include "slic3r/GUI/MonitorBasePanel.h" -#include "slic3r/GUI/StatusPanel.hpp" +//cj_2 +//#include "slic3r/GUI/StatusPanel.hpp" #include "slic3r/GUI/UpgradePanel.hpp" #include "slic3r/GUI/HMSPanel.hpp" #include "slic3r/GUI/AmsWidgets.hpp" @@ -53,6 +54,8 @@ namespace Slic3r { namespace GUI { +//cj_2 +class StatusPanel; class MediaFilePanel; class AddMachinePanel : public wxPanel diff --git a/src/slic3r/GUI/MultiMachineManagerPage.cpp b/src/slic3r/GUI/MultiMachineManagerPage.cpp index f16d3c9..0fdaafa 100644 --- a/src/slic3r/GUI/MultiMachineManagerPage.cpp +++ b/src/slic3r/GUI/MultiMachineManagerPage.cpp @@ -3,7 +3,8 @@ #include "MainFrame.hpp" #include "DeviceCore/DevManager.h" - +//cj_2 +#include "StatusPanel.hpp" namespace Slic3r { namespace GUI { diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 0764eba..ed1c83f 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -132,6 +132,9 @@ #include "Widgets/StaticGroup.hpp" #include "Widgets/MultiNozzleSync.hpp" +//cj_2 +#include "QDSDeviceManager.hpp" + #include "GUI_ObjectTable.hpp" #include "libslic3r/Thread.hpp" @@ -6605,7 +6608,7 @@ std::vector Plater::priv::load_files(const std::vector& input_ Semver app_version = *(Semver::parse(SLIC3R_VERSION)); if (en_3mf_file_type == En3mfType::From_Prusa) { // do not reset the model config - //load_config = false; + load_config = false; if(load_type != LoadType::LoadGeometry) show_info(q, _L("The 3mf is not from QIDI Tech, load geometry data only."), _L("Load 3mf")); } diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index b05bf19..2ff0b9d 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -36,7 +36,6 @@ #include "../QIDI/QIDINetwork.hpp" #endif -#include "QDSDeviceManager.hpp" #define FILAMENT_SYSTEM_COLORS_NUM 16 @@ -62,6 +61,7 @@ class SLAPrint; class PartPlateList; class SlicingStatusEvent; class HelioCompletionEvent; + enum SLAPrintObjectStep : unsigned int; enum class ConversionType : int; class DevAms; @@ -98,7 +98,8 @@ class FinishSyncAmsDialog; class Bed3D; class FinishSyncBoxDialog; using t_optgroups = std::vector >; - +//cj_2 +class QDSDevice; class Plater; enum class ActionButtonType : int; diff --git a/src/slic3r/GUI/PrinterWebView.cpp b/src/slic3r/GUI/PrinterWebView.cpp index 3c0ff8e..b0015d7 100644 --- a/src/slic3r/GUI/PrinterWebView.cpp +++ b/src/slic3r/GUI/PrinterWebView.cpp @@ -36,6 +36,10 @@ #include #include "Tab.hpp" +//cj_2 +#include "StatusPanel.hpp" +//cj_2 +#include "QDSDeviceManager.hpp" namespace pt = boost::property_tree; @@ -48,6 +52,9 @@ PrinterWebView::PrinterWebView(wxWindow* parent) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize) { wxPanel* line_area; + + + wxBoxSizer* buttonSizer; wxBoxSizer* menuPanelSizer; wxPanel* titlePanel; @@ -234,6 +241,8 @@ void PrinterWebView::init_scroll_window(wxPanel* Panel) { leftScrolledWindow->Bind(wxEVT_SCROLLWIN_LINEDOWN, &PrinterWebView::OnScroll, this); leftScrolledWindow->Bind(wxEVT_SCROLLWIN_PAGEUP, &PrinterWebView::OnScroll, this); leftScrolledWindow->Bind(wxEVT_SCROLLWIN_PAGEDOWN, &PrinterWebView::OnScroll, this); + + } void PrinterWebView::SetPresetChanged(bool status) { @@ -247,20 +256,65 @@ void PrinterWebView::init_scroll_window(wxPanel* Panel) { m_device_id_to_button.clear(); m_machine.clear(); m_exit_host.clear(); + m_netDeviceExpand = nullptr; + m_localDeviceExpand = nullptr; + //cj_2 + StateColor trans_bg( + std::pair(wxColour(200, 200, 200), StateColor::Pressed), + std::pair(wxColour(233, 233, 233), StateColor::Hovered), + std::pair(wxColour(255, 255, 255), StateColor::Normal) + ); PresetBundle& preset_bundle = *wxGetApp().preset_bundle; PhysicalPrinterCollection& ph_printers = preset_bundle.physical_printers; + + if(!ph_printers.empty()){ wxBoxSizer* label_boxsizer = new wxBoxSizer(wxHORIZONTAL); - wxStaticText* LocalDevicesLabel = new wxStaticText(leftScrolledWindow, wxID_ANY, "Local"); + wxStaticText* LocalDevicesLabel = new wxStaticText(leftScrolledWindow, wxID_ANY, ("Local")); LocalDevicesLabel->SetFont(wxFont(10, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, "Microsoft YaHei")); LocalDevicesLabel->SetForegroundColour(wxColour(74, 74, 74)); - label_boxsizer->AddSpacer(15); - //.Border(wxTOP, 3) - label_boxsizer->Add(LocalDevicesLabel, wxSizerFlags(0).CenterVertical()); + //cj_2 + wxStaticBitmap* localBitmap = new wxStaticBitmap(leftScrolledWindow, wxID_ANY, create_scaled_bitmap("localList", leftScrolledWindow, 13)); + localBitmap->Hide(); + m_localDeviceExpand = new DeviceButton(leftScrolledWindow, "fold", wxBU_LEFT); + m_localIsExpand = true; + m_localDeviceExpand->SetBackgroundColor(trans_bg); + m_localDeviceExpand->Bind(wxEVT_BUTTON, [this](wxCommandEvent& event) { + if (m_localIsExpand) { + m_localDeviceExpand->SetIcon("unfold"); + for (DeviceButton* button : m_buttons) { + button->Hide(); + } + } + else { + m_localDeviceExpand->SetIcon("fold"); + for (DeviceButton* button : m_buttons) { + button->Show(); + } + + m_netIsExpand = false; + if (m_netDeviceExpand != nullptr) { + m_netDeviceExpand->SetIcon("unfold"); + } + for (DeviceButton* button : m_net_buttons) { + button->Hide(); + } + + } + m_localIsExpand = !m_localIsExpand; + leftScrolledWindow->Layout(); + + }); + m_localDeviceExpand->SetCanFocus(false); + + label_boxsizer->AddSpacer(10); + label_boxsizer->Add(LocalDevicesLabel, wxSizerFlags(0).CenterVertical()); + label_boxsizer->AddSpacer(140); + label_boxsizer->Add(m_localDeviceExpand, wxSizerFlags(0).CenterVertical()); devicesizer->Add(label_boxsizer); devicesizer->AddSpacer(6); @@ -321,14 +375,73 @@ void PrinterWebView::init_scroll_window(wxPanel* Panel) { wxStaticText* NetDevicesLabel; bool is_link = wxGetApp().is_link_connect(); if(is_link){ - NetDevicesLabel = new wxStaticText(leftScrolledWindow, wxID_ANY, "Link"); + NetDevicesLabel = new wxStaticText(leftScrolledWindow, wxID_ANY, "QIDI Link"); } else { NetDevicesLabel = new wxStaticText(leftScrolledWindow, wxID_ANY, "QIDI Maker"); } NetDevicesLabel->SetFont(wxFont(10, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, "Microsoft YaHei")); NetDevicesLabel->SetForegroundColour(wxColour(74, 74, 74)); - label_boxsizer_online->AddSpacer(15); + + //cj_2 + wxStaticBitmap* netBitmap = new wxStaticBitmap(leftScrolledWindow, wxID_ANY, create_scaled_bitmap("netList", leftScrolledWindow, 13)); + netBitmap->Hide(); + m_netDeviceExpand = new DeviceButton(leftScrolledWindow, "fold", wxBU_LEFT); + m_netDeviceExpand->SetBackgroundColor(trans_bg); + m_netIsExpand = true; + + m_netDeviceExpand->Bind(wxEVT_BUTTON, [this](wxCommandEvent& event) { + if (m_netIsExpand) { + m_netDeviceExpand->SetIcon("unfold"); + for (DeviceButton* button : m_net_buttons) { + button->Hide(); + } + + + } + else { + m_netDeviceExpand->SetIcon("fold"); + for (DeviceButton* button : m_net_buttons) { + delete button; + } + m_net_buttons.clear(); +#if QDT_RELEASE_TO_PUBLIC + MakerHttpHandle::getInstance().get_maker_device_list(); + m_net_devices = wxGetApp().get_devices(); + for (const auto& device : m_net_devices) { + AddNetButton(device); + } +#endif + + + for (DeviceButton* button : m_net_buttons) { + button->Show(); + } + + m_localIsExpand = false; + if (m_localDeviceExpand != nullptr) { + m_localDeviceExpand->SetIcon("unfold"); + } + for (DeviceButton* button : m_buttons) { + button->Hide(); + } + } + m_netIsExpand = !m_netIsExpand; + leftScrolledWindow->Layout(); + + }); + m_netDeviceExpand->SetCanFocus(false); + + label_boxsizer_online->AddSpacer(10); label_boxsizer_online->Add(NetDevicesLabel, wxSizerFlags(0).CenterVertical()); + if (wxGetApp().is_link_connect()) { + label_boxsizer_online->AddSpacer(113); + } + else { + label_boxsizer_online->AddSpacer(100); + } + label_boxsizer_online->Add(m_netDeviceExpand, wxSizerFlags(0).CenterVertical()); + label_boxsizer_online->AddSpacer(10); + devicesizer->Add(label_boxsizer_online); devicesizer->AddSpacer(7); } @@ -378,10 +491,11 @@ void PrinterWebView::init_scroll_window(wxPanel* Panel) { if(select_dev){ m_device_manager->reconnectDevice(m_cur_deviceId); m_status_book->ChangeSelection(1); + load_disconnect_url(); this->webisNetMode = isLocalWeb; UpdateState(); allsizer->Layout(); - if (wxGetApp().mainframe) { + if (wxGetApp().mainframe != nullptr) { wxGetApp().mainframe->is_webview = false; } wxGetApp().app_config->set("machine_list_net", "0"); @@ -401,28 +515,16 @@ void PrinterWebView::init_scroll_window(wxPanel* Panel) { else { m_status_book->ChangeSelection(0); - wxString strlang = wxGetApp().current_language_code_safe(); - if (m_isNetMode) - { - //y30 - wxString url = wxString::Format("file://%s/web/qidi/link_missing_connection.html", from_u8(resources_dir())); - if (strlang != "") - url = wxString::Format("file://%s/web/qidi/link_missing_connection.html?lang=%s", from_u8(resources_dir()), strlang); - load_disconnect_url(url); - } - else - { - //y30 - wxString url = wxString::Format("file://%s/web/qidi/missing_connection.html", from_u8(resources_dir())); - if (strlang != "") - url = wxString::Format("file://%s/web/qidi/missing_connection.html?lang=%s", from_u8(resources_dir()), strlang); - load_disconnect_url(url); - } + load_disconnect_url(); } UpdateState(); UpdateLayout(); } void PrinterWebView::SetLoginStatus(bool status) { + //y77 + m_isloginin = false; + + m_isloginin = status; if (m_isloginin) { //y76 @@ -440,9 +542,9 @@ void PrinterWebView::SetLoginStatus(bool status) { else { is_get_net_devices = MakerHttpHandle::getInstance().get_maker_device_list(); - MakerHttpHandle::getInstance().setSSEHandle([this](const std::string& event, const std::string& data) { - this->onSSEMessageHandle(event, data); - }); +// MakerHttpHandle::getInstance().setSSEHandle([this](const std::string& event, const std::string& data) { +// this->onSSEMessageHandle(event, data); +// }); } if (is_get_net_devices) { @@ -451,42 +553,6 @@ void PrinterWebView::SetLoginStatus(bool status) { } } - std::thread([this](){ - while(m_isloginin){ - bool is_get_net_devices = false; - wxString msg; - bool is_link = wxGetApp().is_link_connect(); - if(is_link) - { - QIDINetwork m_qidinetwork; - std::string name = m_qidinetwork.user_info(msg); - is_get_net_devices = m_qidinetwork.get_device_list(msg); - } - else - { - is_get_net_devices = MakerHttpHandle::getInstance().get_maker_device_list(); - } - - if (is_get_net_devices) - { - std::vector currentDevices = wxGetApp().get_devices(); - int currentDeviceCount = currentDevices.size(); - static int s_lastDeviceCount = 0; - - if (currentDeviceCount != s_lastDeviceCount) - { - s_lastDeviceCount = currentDeviceCount; - - GUI::wxGetApp().CallAfter([this]() { - this->UpdateState(); - this->SetPresetChanged(true); - }); - } - } - - std::this_thread::sleep_for(std::chrono::seconds(10)); - } - }).detach(); #endif } else { @@ -513,6 +579,10 @@ PrinterWebView::~PrinterWebView() BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " Start"; SetEvtHandlerEnabled(false); + //y77 + m_isloginin = false; + + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " End"; } @@ -540,7 +610,6 @@ PrinterWebView::~PrinterWebView() //machine_button->SetBorderColor(wxColour(57, 51, 55)); machine_button->SetCanFocus(false); machine_button->SetCornerRadius(0); - std::thread([this, device_name, ip, machine_type, machine_button]() { std::string t_device_id = m_device_manager->addDevice( into_u8(device_name), @@ -559,6 +628,8 @@ PrinterWebView::~PrinterWebView() //y76 machine_button->Bind(wxEVT_BUTTON, [this, ip, machine_button](wxCommandEvent &event) { + + clearStatusPanelData(); cancelAllDevButtonSelect(); m_device_manager->unSelected(); @@ -592,6 +663,13 @@ void PrinterWebView::updateDeviceConnectType(const std::string& device_id, const if (machine_button) { //y76 machine_button->Bind(wxEVT_BUTTON, [this, device_ip, machine_button, device_id](wxCommandEvent &event) { + // cj_2 +#if QDT_RELEASE_TO_PUBLIC + if (wxGetApp().app_config->get_bool("last_sel_machine_is_net") && !wxGetApp().is_link_connect()) { + MakerHttpHandle::getInstance().closeSSEClient(); + } +#endif + clearStatusPanelData(); cancelAllDevButtonSelect(); machine_button->SetIsSelected(true); @@ -603,12 +681,13 @@ void PrinterWebView::updateDeviceConnectType(const std::string& device_id, const m_cur_deviceId = it->first; } } + m_status_book->ChangeSelection(1); + load_disconnect_url(); this->webisNetMode = isLocalWeb; UpdateState(); - m_status_book->ChangeSelection(1); allsizer->Layout(); - if (wxGetApp().mainframe) { + if (wxGetApp().mainframe != nullptr) { wxGetApp().mainframe->is_webview = false; } m_ip = device_ip; @@ -710,6 +789,51 @@ void PrinterWebView::updateDeviceConnectType(const std::string& device_id, const if (machine_button == nullptr) { return; } + + + // cj_2 + { + MakerHttpHandle::getInstance().setSSEHandle([this](const std::string& event, const std::string& data) { + this->onSSEMessageHandle(event, data); + }); + + //cj_2 + new std::thread([this]() { + std::vector netDevices = m_device_manager->getNetDevices(); + for (NetDevice device : netDevices) { + HttpData httpData; + json bodyJson; + bodyJson["serialNumber"] = device.mac_address; + httpData.body = bodyJson.dump(); + httpData.env = m_env; + httpData.target = PRINTERTYPE; + + httpData.taskPath = "/set/save/status"; + + bool isSucceed = false; + std::string resultBody = MakerHttpHandle::getInstance().httpPostTask(httpData, isSucceed); + if (!isSucceed) { + std::cout << "http error" << isSucceed << std::endl; + continue;; + } + + try { + json resultJson = json::parse(resultBody); + if (resultJson.contains("data") && resultJson["data"].is_object()) { + if (resultJson["data"].contains("polarCooler") && resultJson["data"]["polarCooler"].is_boolean()) { + std::shared_ptr tempQdsDev = m_device_manager->getDevice(device.mac_address); + tempQdsDev->m_polar_cooler = resultJson["data"]["polarCooler"].get(); + } + } + } + catch (...) { + + } + + } + }); + } + // cj_1 cancelAllDevButtonSelect(); clearStatusPanelData(); @@ -724,10 +848,11 @@ void PrinterWebView::updateDeviceConnectType(const std::string& device_id, const } else { m_status_book->ChangeSelection(1); + load_disconnect_url(); m_device_manager->setSelected(device.mac_address); m_cur_deviceId = device.mac_address; allsizer->Layout(); - if (wxGetApp().mainframe) { + if (wxGetApp().mainframe != nullptr) { wxGetApp().mainframe->is_webview = false; } m_ip = device.local_ip; @@ -841,14 +966,16 @@ void PrinterWebView::OnRefreshButtonClick(wxCommandEvent &event) vec2.clear(); bool result2 = true; #if QDT_RELEASE_TO_PUBLIC - bool is_link = wxGetApp().is_link_connect(); - if(is_link){ - wxString msg; - QIDINetwork m_qidinetwork; - m_qidinetwork.get_device_list(msg); - } - else { - MakerHttpHandle::getInstance().get_maker_device_list(); + if (m_isloginin) { + bool is_link = wxGetApp().is_link_connect(); + if(is_link){ + wxString msg; + QIDINetwork m_qidinetwork; + m_qidinetwork.get_device_list(msg); + } + else { + MakerHttpHandle::getInstance().get_maker_device_list(); + } } m_net_devices = wxGetApp().get_devices(); for (const auto &device : m_net_devices) { @@ -858,7 +985,7 @@ void PrinterWebView::OnRefreshButtonClick(wxCommandEvent &event) vec2.push_back(button->GetLabel().ToStdString()); } result2 = std::equal(vec1.begin(), vec1.end(), vec2.begin(), vec2.end()); - #endif +#endif SetPresetChanged(!result1 || !result2); Refresh(); @@ -1163,22 +1290,45 @@ void PrinterWebView::onStatusPanelTask(wxCommandEvent& event) //cj_1 void PrinterWebView::onSetBoxTask(wxCommandEvent& event) { + //cj_1 get index + wxEventType curEventType = event.GetEventType(); + int index = 1; + std::shared_ptr device = m_device_manager->getDevice(m_cur_deviceId); + std::string curString = event.GetString().ToStdString(); + for (int i = 0; i < device->m_filamentConfig.size(); ++i) { + + if (curEventType == EVT_SET_COLOR + && device->m_filamentConfig[i].colorHexCode == event.GetString().ToStdString()) { + index = i; + break; + } + if (curEventType == EVTSET_FILAMENT_VENDOR + && device->m_filamentConfig[i].vendor == event.GetString().ToStdString()) { + index = i; + break; + } + if (curEventType == EVTSET_FILAMENT_TYPE + && device->m_filamentConfig[i].name == event.GetString().ToStdString()) { + index = i; + break; + } + } //cj_1 if (webisNetMode == isLocalWeb) { - wxEventType curEventType = event.GetEventType(); + std::string megscript; if (curEventType == EVT_SET_COLOR) { megscript = "SAVE_VARIABLE VARIABLE=color_slot" + std::to_string(event.GetInt()) - + " VALUE=\"" + event.GetString().ToStdString() + "\""; + + " VALUE=\"" + std::to_string(index) + "\""; } if (curEventType == EVTSET_FILAMENT_VENDOR) { megscript = "SAVE_VARIABLE VARIABLE=vendor_slot" + std::to_string(event.GetInt()) - + " VALUE=\"" + event.GetString().ToStdString() + "\""; + + " VALUE=\"" + std::to_string(index) + "\""; } if (curEventType == EVTSET_FILAMENT_TYPE) { megscript = "SAVE_VARIABLE VARIABLE=filament_slot" + std::to_string(event.GetInt()) - + " VALUE=\"" + event.GetString().ToStdString() + "\""; + + " VALUE=\"" + std::to_string(index) + "\""; } if (curEventType == EVTSET_FILAMENT_LOAD) { megscript = "E_LOAD slot=" + std::to_string(event.GetInt()); @@ -1190,19 +1340,17 @@ void PrinterWebView::onSetBoxTask(wxCommandEvent& event) m_device_manager->sendCommand(m_cur_deviceId, megscript); return; } - #if QDT_RELEASE_TO_PUBLIC HttpData httpData; json bodyJson; bodyJson["serialNumber"] = m_cur_deviceId; bodyJson["slotIndex"] = event.GetInt(); - long index = -1; - event.GetString().ToLong(&index); + bodyJson["idx"] = index; httpData.body = bodyJson.dump(); httpData.env = m_env; httpData.target = PRINTERTYPE; - wxEventType curEventType = event.GetEventType(); + if (m_boxEventToTaskPath.find(curEventType) != m_boxEventToTaskPath.end()) { httpData.taskPath = m_boxEventToTaskPath[curEventType]; } @@ -1214,13 +1362,14 @@ void PrinterWebView::onSetBoxTask(wxCommandEvent& event) return; } #endif + } void PrinterWebView::onRefreshRfid(wxCommandEvent& event) { long canId = 0; event.GetString().ToLong(&canId); - int slotIndex = event.GetInt() * 4 + canId; + int slotIndex =canId; if (webisNetMode == isLocalWeb) { @@ -1230,7 +1379,7 @@ void PrinterWebView::onRefreshRfid(wxCommandEvent& event) m_device_manager->sendCommand(m_cur_deviceId, megscript); return; } - + #if QDT_RELEASE_TO_PUBLIC //RFID_READ SLOT=slot3 HttpData httpData; @@ -1263,20 +1412,34 @@ void PrinterWebView::OnScroll(wxScrollWinEvent& event) event.Skip(); } -//y28 - void PrinterWebView::load_disconnect_url(wxString& url) +//y77 + void PrinterWebView::load_disconnect_url() { - webisNetMode = isDisconnect; - m_web = url; - m_ip = ""; - m_browser->LoadURL(url); - if (wxGetApp().mainframe) { - wxGetApp().mainframe->is_webview = true; - wxGetApp().mainframe->is_net_url = false; - wxGetApp().mainframe->printer_view_ip = ""; - wxGetApp().mainframe->printer_view_url = m_web; - } - UpdateState(); + wxString strlang = wxGetApp().current_language_code_safe(); + wxString url; + if (m_isNetMode) + { + + url = wxString::Format("file://%s/web/qidi/link_missing_connection.html", from_u8(resources_dir())); + if (strlang != "") + url = wxString::Format("file://%s/web/qidi/link_missing_connection.html?lang=%s", from_u8(resources_dir()), strlang); + } + else + { + + url = wxString::Format("file://%s/web/qidi/missing_connection.html", from_u8(resources_dir())); + if (strlang != "") + url = wxString::Format("file://%s/web/qidi/missing_connection.html?lang=%s", from_u8(resources_dir()), strlang); + } + webisNetMode = isDisconnect; + m_web = url; + m_ip = ""; + m_browser->LoadURL(url); + if (wxGetApp().mainframe != nullptr) { + wxGetApp().mainframe->is_webview = true; + wxGetApp().mainframe->is_net_url = false; + } + UpdateState(); } void PrinterWebView::load_url(wxString &url) @@ -1309,7 +1472,7 @@ void PrinterWebView::OnScroll(wxScrollWinEvent& event) else button->SetIsSelected(false); } - if (wxGetApp().mainframe) { + if (wxGetApp().mainframe != nullptr) { wxGetApp().mainframe->is_webview = true; wxGetApp().mainframe->is_net_url = false; wxGetApp().mainframe->printer_view_ip = m_ip; @@ -1342,7 +1505,7 @@ void PrinterWebView::OnScroll(wxScrollWinEvent& event) // else // button->SetIsSelected(false); } - if (wxGetApp().mainframe) { + if (wxGetApp().mainframe != nullptr) { wxGetApp().mainframe->is_webview = true; wxGetApp().mainframe->is_net_url = true; wxGetApp().mainframe->printer_view_ip = m_ip; @@ -1465,7 +1628,6 @@ void PrinterWebView::OnScroll(wxScrollWinEvent& event) } std::string extractBetweenMarkers(const std::string& path) { - size_t startPos = path.find("/gcodes"); if (startPos == std::string::npos) { return ""; @@ -1500,7 +1662,13 @@ void PrinterWebView::OnScroll(wxScrollWinEvent& event) return; } string dataStr = msgJson["data"].get(); - json dataJson = json::parse(msgJson["data"].get()); + json dataJson; + try { + dataJson = json::parse(msgJson["data"].get()); + } + catch (...){ + std::cout << "sse data parse fail: " << dataStr << std::endl; + } json status; if (dataJson.contains("result") && dataJson["result"].contains("status")) { @@ -1894,6 +2062,11 @@ void PrinterWebView::updateDeviceParameter(const std::string& device_id) { t_status_page->update_fan_speed(AIR_FUN::FAN_REMOTE_COOLING_0_IDX, device->m_auxiliary_fan_speed * 10.0); t_status_page->update_fan_speed(AIR_FUN::FAN_CHAMBER_0_IDX, device->m_chamber_fan_speed * 10.0); + //cj_1 + t_status_page->update_homed_axes(device->m_home_axes); + //cj_2 + t_status_page->update_extruder_filament(device->m_extruder_filament); + if(device->box_is_update){ vector< Slic3r::GUI::Caninfo> cans(17); for (int i = 0; i < 17; ++i) { @@ -1949,8 +2122,6 @@ void PrinterWebView::updateDeviceParameter(const std::string& device_id) { } t_status_page->update_AMSSettingData(device->m_auto_read_rfid, device->m_init_detect, device->m_auto_reload_detect); - //cj_1 - t_status_page->update_homed_axes(device->m_home_axes); PresetBundle *preset_bundle = wxGetApp().preset_bundle; if(preset_bundle){ @@ -1962,30 +2133,44 @@ void PrinterWebView::updateDeviceParameter(const std::string& device_id) { } device->box_is_update = false; } + + if (device->m_is_update_box_temp){ + for (int i = 0; i < device->m_boxTemperature.size(); ++i) { + t_status_page->update_AMS_temp(i, device->m_boxTemperature[i]); + } + for (int i = 0; i < device->m_boxHumidity.size(); ++i) { + t_status_page->update_AMS_humidity(i, device->m_boxHumidity[i]); + } + device->m_is_update_box_temp = false; + } + } } } -void PrinterWebView::init_select_machine(){ +void PrinterWebView::init_select_machine() { std::string last_select_machine = wxGetApp().app_config->get("last_selected_machine"); - if(last_select_machine.empty()) + if (last_select_machine.empty()) { + load_disconnect_url(); return; - + } + bool is_net = wxGetApp().app_config->get_bool("last_sel_machine_is_net"); - DeviceButton* selected_button {nullptr}; - if(is_net){ - for (DeviceButton* button : m_net_buttons){ - wxString button_name = button->getIPLabel(); - if(into_u8(button_name) == last_select_machine){ + DeviceButton* selected_button{ nullptr }; + if (is_net) { + for (DeviceButton* button : m_net_buttons) { + wxString button_name = button->getIPLabel(); + if (into_u8(button_name) == last_select_machine) { selected_button = button; break; } } - } else { - for (DeviceButton *button : m_buttons){ - wxString button_name = button->getIPLabel(); - if(into_u8(button_name) == last_select_machine){ + } + else { + for (DeviceButton* button : m_buttons) { + wxString button_name = button->getIPLabel(); + if (into_u8(button_name) == last_select_machine) { selected_button = button; break; } @@ -2015,11 +2200,12 @@ void PrinterWebView::init_select_machine(){ } m_device_manager->setSelected(m_cur_deviceId); m_device_manager->reconnectDevice(m_cur_deviceId); - this->webisNetMode = isLocalWeb; UpdateState(); m_status_book->ChangeSelection(1); + load_disconnect_url(); + this->webisNetMode = isLocalWeb; allsizer->Layout(); - if (wxGetApp().mainframe) { + if (wxGetApp().mainframe != nullptr) { wxGetApp().mainframe->is_webview = false; } m_ip = selected_button->getIPLabel(); @@ -2045,6 +2231,37 @@ void PrinterWebView::init_select_machine(){ } + + if (m_localDeviceExpand == nullptr || m_netDeviceExpand == nullptr) { + return; + } + if (is_net) { + m_netIsExpand = true; + m_netDeviceExpand->SetIcon("fold"); + for (DeviceButton* button : m_net_buttons) { + button->Show(); + } + + m_localIsExpand = false; + m_localDeviceExpand->SetIcon("unfold"); + for (DeviceButton* button : m_buttons) { + button->Hide(); + } + } + else { + m_localIsExpand = true; + m_localDeviceExpand->SetIcon("fold"); + for (DeviceButton* button : m_buttons) { + button->Show(); + } + + m_netIsExpand = false; + m_netDeviceExpand->SetIcon("unfold"); + for (DeviceButton* button : m_net_buttons) { + button->Hide(); + } + } + } } // GUI diff --git a/src/slic3r/GUI/PrinterWebView.hpp b/src/slic3r/GUI/PrinterWebView.hpp index 5a4d0a9..7faa77c 100644 --- a/src/slic3r/GUI/PrinterWebView.hpp +++ b/src/slic3r/GUI/PrinterWebView.hpp @@ -52,8 +52,8 @@ #include "OctoPrint.hpp" -#include "StatusPanel.hpp" -#include "QDSDeviceManager.hpp" + + namespace Slic3r { namespace GUI { @@ -63,14 +63,22 @@ enum WebState { isDisconnect, isLocalWeb, - isNetWeb + isNetWeb }; +//cj_2 +class StatusPanel; +//cj_2 +class QDSDeviceManager; class PrinterWebView : public wxPanel { public: PrinterWebView(wxWindow *parent); virtual ~PrinterWebView(); + + + + wxBoxSizer *init_menu_bar(wxPanel *Panel); void init_scroll_window(wxPanel *Panel); void CreatThread(); @@ -130,7 +138,7 @@ public: //y53 wxString GetWebIp(){return m_ip;}; bool IsNetUrl() {return webisNetMode == isNetWeb;}; - void load_disconnect_url(wxString& url); + void load_disconnect_url(); void FormatNetUrl(std::string link_url, std::string local_ip, bool isSpecialMachine); void FormatUrl(std::string link_url); @@ -194,7 +202,6 @@ private: DeviceButton * delete_button; DeviceButton * edit_button; DeviceButton * refresh_button; - bool m_isloginin; wxStaticBitmap * staticBitmap; std::map m_machine; @@ -218,7 +225,22 @@ private: #if QDT_RELEASE_TO_PUBLIC std::vector m_net_devices; Environment m_env; + #endif + std::atomic m_isloginin{false}; + + + //cj_2 + wxPanel* m_localPanel; + DeviceButton* m_localDeviceExpand; + wxStaticText* m_localTabel; + bool m_localIsExpand{ true }; + + wxPanel* m_netPanel; + DeviceButton* m_netDeviceExpand; + wxStaticText* m_netTable; + bool m_netIsExpand{ true }; + }; diff --git a/src/slic3r/GUI/QDSDeviceManager.cpp b/src/slic3r/GUI/QDSDeviceManager.cpp index 7160539..51808c1 100644 --- a/src/slic3r/GUI/QDSDeviceManager.cpp +++ b/src/slic3r/GUI/QDSDeviceManager.cpp @@ -131,14 +131,7 @@ std::string QDSFilamentConfig::getFilamentType(int index){ void QDSFilamentConfig::init() { - std::async(std::launch::async, [this]() { - initFilamentData(m_colorHexCode); - initFilamentData(m_colorDes); - initTypeName(); - initFilamentData(m_vendor); - initFilamentData(m_filament_type); - }); - + //y77 #if QDT_RELEASE_TO_PUBLIC std::string region = wxGetApp().app_config->get("region"); if (region == "China") { @@ -148,12 +141,21 @@ void QDSFilamentConfig::init() m_env = FOREIGNENV; } #endif + + new std::thread([this]{ + initFilamentData(m_colorHexCode); + initFilamentData(m_colorDes); + initTypeName(); + initFilamentData(m_vendor); + initFilamentData(m_filament_type); + }); + + } - - void QDSFilamentConfig::initTypeName() { #if QDT_RELEASE_TO_PUBLIC + std::this_thread::sleep_for(std::chrono::seconds(3)); std::string resultBody = MakerHttpHandle::getInstance().httpGetTask(m_env, m_typeName.path); if (resultBody == "") { return; @@ -328,27 +330,20 @@ void QDSDevice::updateByJsonData(json& status) twoStageParse(status, m_chamber_fan_speed, "fan_generic chamber_circulation_fan", "speed"); twoStageParse(status, m_cooling_fan_speed, "fan_generic cooling_fan", "speed"); twoStageParse(status, m_home_axes, "toolhead", "homed_axes"); - - if (status.contains("output_pin Polar_cooler") && status["output_pin Polar_cooler"].contains("value")) { - - if (m_case_light != bool(status["output_pin Polar_cooler"]["value"].get())) { - is_update = true; - m_polar_cooler = bool(status["output_pin Polar_cooler"]["value"].get()); - } - } + twoStageParse(status, m_extruder_filament, "filament_switch_sensor filament_switch_sensor", "filament_detected"); for (int i = 0; i < 4; ++i) { std::string key = "aht20_f heater_box" + std::to_string(i + 1); if (status.contains(key) ) { if (status[key].contains("temperature")) { if (m_boxTemperature[i] != int(status[key]["temperature"].get())) { - box_is_update = true; + m_is_update_box_temp = true; m_boxTemperature[i] = int(status[key]["temperature"].get()); } } if (status[key].contains("humidity")) { if (m_boxHumidity[i] != status[key]["humidity"].get()) { - box_is_update = true; + m_is_update_box_temp = true; m_boxHumidity[i] = status[key]["humidity"].get(); } @@ -406,10 +401,10 @@ void QDSDevice::updateBoxDataByJson(const json status) - int isExit = getJsonCurStageToInt(saveVariables, "enable_box"); - if (isExit != -1) { - m_boxData[16].hasMaterial = bool(isExit); - } + //int isExit = getJsonCurStageToInt(saveVariables, "enable_box"); + //if (isExit != -1) { + m_boxData[16].hasMaterial = true; + //} int count = getJsonCurStageToInt(saveVariables, "box_count"); if (count != -1) { m_box_count = count; @@ -1246,7 +1241,7 @@ void QDSDeviceManager::sendSubscribeMessage(const std::string& device_id) { // {"gcode_macro UNLOAD_T15", nullptr}, // {"gcode_macro UNLOAD_FILAMENT", nullptr}, // {"pause_resume", nullptr}, - // {"filament_switch_sensor filament_switch_sensor", nullptr}, + {"filament_switch_sensor filament_switch_sensor", nullptr}, // {"bed_screws", nullptr}, // {"tmc2209 extruder", nullptr}, // {"z_tilt", nullptr}, @@ -1273,7 +1268,7 @@ void QDSDeviceManager::sendSubscribeMessage(const std::string& device_id) { {"display_status", nullptr}, // {"webhooks", nullptr}, // {"virtual_sdcard", nullptr}, - // {"toolhead", nullptr}, + {"toolhead", nullptr}, {"heater_bed", nullptr}, {"extruder", nullptr}, {"heater_generic chamber", nullptr}, @@ -1639,13 +1634,13 @@ void QDSDeviceManager::updateDeviceData(std::shared_ptr& device, if (result[key].contains("temperature")) { if (device->m_boxTemperature[i] != int(result[key]["temperature"].get())) { - device->box_is_update = true; + device->m_is_update_box_temp = true; device->m_boxTemperature[i] = int(result[key]["temperature"].get()); } } if (result[key].contains("humidity")) { if (device->m_boxHumidity[i] != result[key]["humidity"].get()) { - device->box_is_update = true; + device->m_is_update_box_temp = true; device->m_boxHumidity[i] = result[key]["humidity"].get(); } @@ -1656,7 +1651,8 @@ void QDSDeviceManager::updateDeviceData(std::shared_ptr& device, twoStageParse1(result, device->m_auxiliary_fan_speed, "fan_generic auxiliary_cooling_fan", "speed",is_update); twoStageParse1(result, device->m_chamber_fan_speed, "fan_generic chamber_circulation_fan", "speed", is_update); twoStageParse1(result, device->m_cooling_fan_speed, "fan_generic cooling_fan", "speed", is_update); - + twoStageParse1(result, device->m_home_axes, "toolhead", "homed_axes", is_update); + twoStageParse1(result, device->m_extruder_filament, "filament_switch_sensor filament_switch_sensor", "filament_detected",is_update); if (result.contains("print_stats")){ if(result["print_stats"].contains("filename")) { if (device->m_print_filename != result["print_stats"]["filename"].get()) { diff --git a/src/slic3r/GUI/QDSDeviceManager.hpp b/src/slic3r/GUI/QDSDeviceManager.hpp index ff87075..4755db5 100644 --- a/src/slic3r/GUI/QDSDeviceManager.hpp +++ b/src/slic3r/GUI/QDSDeviceManager.hpp @@ -24,7 +24,6 @@ using namespace nlohmann; namespace Slic3r { namespace GUI{ - struct FileInfo { std::string file_name; std::string filament_weight; @@ -89,6 +88,8 @@ private: QDSFilamentConfig(QDSFilamentConfig&&) = delete; QDSFilamentConfig& operator=(QDSFilamentConfig&&) = delete; + std::future m_future; + }; @@ -143,10 +144,11 @@ public: std::string m_target_extruder{ "0" }; std::string m_target_bed{ "0" }; std::atomic m_case_light{ false }; + bool m_extruder_filament{ false }; // std::string m_home_axes; - bool m_polar_cooler{ false }; + std::atomic m_polar_cooler{ false }; float m_auxiliary_fan_speed{ 0.0 }; float m_chamber_fan_speed{ 0.0 }; float m_cooling_fan_speed{ 0.0 }; @@ -185,6 +187,7 @@ public: std::atomic is_support_mqtt{ false }; std::atomic is_first_connect{ true }; std::atomic should_stop{ false }; + std::atomic m_is_update_box_temp{ false }; std::chrono::steady_clock::time_point last_update = std::chrono::steady_clock::now(); std::vector file_info {}; diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index aad7563..5634be0 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -27,6 +27,8 @@ #include "DeviceCore/DevInfo.h" #include "DeviceCore/DevStorage.h" #include "DeviceCore/DevUpgrade.h" +//cj_2 +#include "DeviceCore/DevNozzleRack.h" #include "DeviceCore/DevManager.h" #include "DeviceCore/DevMapping.h" @@ -47,6 +49,8 @@ #include "BitmapCache.hpp" #include "BindDialog.hpp" #include "PrinterWebView.hpp" +//cj_2 +#include "QDSDeviceManager.hpp" // definitions #define S_RACK_NOZZLE_OFFSET_CALI_WARNING _L(\ @@ -2760,7 +2764,8 @@ void SelectMachineDialog::load_option_vals(MachineObject *obj) //y76 auto sel_obj = wxGetApp().qdsdevmanager->getSelectedDevice(); - if(sel_obj && sel_obj->m_polar_cooler){ + //y77 + if(sel_obj && sel_obj->m_polar_cooler && select_machine.ip == sel_obj->m_ip){ m_checkbox_list["enable_air_condition"]->enable(true); } else { m_checkbox_list["enable_air_condition"]->enable(false); @@ -3178,7 +3183,8 @@ void SelectMachineDialog::on_set_finish_mapping(wxCommandEvent &evt) // m->set_ams_info(ams_colour, selection_data_arr[4], ctype, material_cols); // m->set_nozzle_info(get_mapped_nozzle_str(item->id)); //} - if (f->id == id) { + //y77 + if (f->id == id && f->tray_id != -1) { wxString ams_id; wxColour ams_col; ams_id = wxGetApp().transition_tridid(std::stoi(f->slot_id)); @@ -3389,7 +3395,8 @@ void SelectMachineDialog::update_user_printer() event.SetInt(m_switch_button->GetValue()); m_switch_button->GetEventHandler()->ProcessEvent(event); - load_option_vals(nullptr); + //y77 + //load_option_vals(nullptr); #if 0 Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 263d1a4..9cf3bc8 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -1453,14 +1453,14 @@ wxBoxSizer *StatusBasePanel::create_task_list_group(wxWindow *parent) m_panel_task_title->SetBackgroundColour(STATUS_TITLE_BG); bSizer_task_title = new wxBoxSizer(wxHORIZONTAL); { - m_staticText_task = new Label(m_panel_task_title, _L("Task Lists")); + m_staticText_task = new Label(m_panel_task_title, _L("Task List")); m_staticText_task->Wrap(-1); m_staticText_task->SetForegroundColour(PAGE_TITLE_FONT_COL); bSizer_task_title->Add(m_staticText_task, 1, wxALIGN_CENTER_VERTICAL | wxLEFT, PAGE_TITLE_LEFT_MARGIN); //bSizer_task_title->AddStretchSpacer(1); - // m_refresh_btn = new wxButton(m_panel_task_title, wxID_ANY, _L("刷新"), + // m_refresh_btn = new wxButton(m_panel_task_title, wxID_ANY, _L("Refresh"), // wxDefaultPosition, wxSize(FromDIP(60), FromDIP(25))); // m_refresh_btn->SetBackgroundColour(wxColour(0x1E, 0x90, 0xFF)); // DodgerBlue // m_refresh_btn->SetForegroundColour(*wxWHITE); @@ -2215,6 +2215,8 @@ wxBoxSizer *StatusBasePanel::create_extruder_control(wxWindow *parent) //cj_1 auto extruder_img = new ExtruderImage(m_extruder_book, wxID_ANY, 1); m_extruder_book->InsertPage(0, extruder_img , ""); + m_extruderImage.push_back(extruder_img); + for (int nozzle_num = 1; nozzle_num <= 2; nozzle_num++) { auto extruder_img = new ExtruderImage(m_extruder_book, wxID_ANY, nozzle_num); m_extruder_book->InsertPage(nozzle_num, extruder_img, ""); @@ -2712,8 +2714,6 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co Bind(EVT_SET_COLOR, [this](wxCommandEvent& e) { e.SetInt(curSelectSlotIndex); - int colorIndex = QDSFilamentConfig::getInstance().getColorIndex(e.GetString().ToStdString()); - e.SetString(std::to_string(colorIndex)); e.Skip(); }); //cj_1 @@ -2729,16 +2729,12 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co wxCommandEvent eventType(EVTSET_FILAMENT_TYPE); eventType.SetInt(curSelectSlotIndex); - int typeIndex = QDSFilamentConfig::getInstance().getTypeNameIndex(type.ToStdString()); - eventType.SetString(std::to_string(typeIndex)); + eventType.SetString(type); wxPostEvent(GetParent(), eventType); - - wxCommandEvent eventVendor(EVTSET_FILAMENT_VENDOR); eventVendor.SetInt(curSelectSlotIndex); - int vendorIndex = QDSFilamentConfig::getInstance().getVendorIndex(vendor.ToStdString()); - eventVendor.SetString(std::to_string(vendorIndex)); + eventVendor.SetString(vendor); wxPostEvent(GetParent(), eventVendor); }); @@ -2818,7 +2814,7 @@ void StatusPanel::update_progress(std::string fileName, std::string layer, std:: return; } if (fileName != "") { - m_project_task_panel->update_subtask_name(fileName); + m_project_task_panel->update_subtask_name(from_u8(fileName)); } else { m_project_task_panel->update_subtask_name("N/A"); @@ -2908,9 +2904,9 @@ void StatusPanel::update_boxs(std::vector boxS, std::vector ex std::string printer_type = "X-Max 4"; // 显示外挂料的打印机图片 m_ams_control->SetAmsModel(AMSModel::N3S_AMS, AMSModel::EXT_AMS); m_ams_control->SetData(boxS, ext_info, total_ext_count, dev_id, series_name, printer_type); - m_ams_control->Hide(); + //m_ams_control->Hide(); m_ams_control->Show(); - m_ams_control_box->Hide(); + //m_ams_control_box->Hide(); m_ams_control_box->Show(); m_ams_control->Layout(); m_ams_control_box->Layout(); @@ -3317,7 +3313,7 @@ void StatusPanel::show_recenter_dialog() if (dlg.ShowModal() == wxID_OK) { postEventValueAndEnable(EVTSET_RETURN_SAFEHOME, 1, "value"); if (obj) { obj->GetAxis()->Ctrl_GoHome(); } - } + } } void StatusPanel::update_error_message() @@ -3601,6 +3597,25 @@ void StatusPanel::update_temp_ctrl(std::shared_ptr obj) // } } +//cj_2 +void StatusPanel::update_extruder_filament(bool hasFilament) +{ + ExtruderState state; + state = hasFilament ? ExtruderState::FILLED_LOAD : ExtruderState::EMPTY_LOAD; + m_extruderImage[0]->update(state); +} + +void StatusPanel::update_AMS_temp(int amsId, int temp) +{ + m_ams_control->updateAmsTemp(amsId, temp); +} + +void StatusPanel::update_AMS_humidity(int amsId, int humidity) +{ + m_ams_control->updateAmsHumidity(amsId, humidity); + +} + void StatusPanel::update_misc_ctrl(MachineObject *obj) { auto get_extder_shown_state = [](bool ext_has_filament) -> ExtruderState { @@ -4347,6 +4362,11 @@ void StatusPanel::reset_printing_values() void StatusPanel::on_axis_ctrl_xy(wxCommandEvent &event) { + + if (event.GetInt() == 8) { + postEventValueAndEnable(EVTSET_RETURN_SAFEHOME, 1, "value"); + return; + } if (m_homed_axes == "") { show_recenter_dialog(); return; @@ -4362,7 +4382,7 @@ void StatusPanel::on_axis_ctrl_xy(wxCommandEvent &event) else if (event.GetInt() == 5) { postEventValueAndEnable(EVTSET_X_AXIS, -1, "value"); } else if (event.GetInt() == 6) { postEventValueAndEnable(EVTSET_Y_AXIS, -1, "value"); } else if (event.GetInt() == 7) { postEventValueAndEnable(EVTSET_X_AXIS, 1, "value"); } - else if (event.GetInt() == 8) { postEventValueAndEnable(EVTSET_RETURN_SAFEHOME, 1, "value"); } + if (!obj) return; @@ -4856,17 +4876,17 @@ void StatusPanel::on_ams_filament_backup(SimpleEvent &event) std::tuple, std::vector >colorGroups; - char goupPre = 'A'; + int goupPre = 1; for (AMSinfo box : m_boxS) { - int goupNo = 1; + char goupNo = 'A'; for (Caninfo can : box.cans) { //GetAsString(wxC2S_HTML_SYNTAX) - if (can.material_state != AMSCanType::AMS_CAN_TYPE_NONE) { + if (can.material_state != AMSCanType::AMS_CAN_TYPE_EMPTY) { std::tuple key{ can.ctype, can.material_name.ToStdString(), can.material_colour.GetAsString(wxC2S_HTML_SYNTAX).ToStdString() }; - colorGroups[key].push_back(std::string(1,goupPre) + std::to_string(goupNo)); + colorGroups[key].push_back( std::to_string(goupPre)+ std::string(1, goupNo)); } ++goupNo; } @@ -5197,6 +5217,9 @@ void StatusPanel::on_ams_selected(wxCommandEvent &event) Caninfo can; if (canInfoIndex == 16) { can = m_ext_info[0].cans[0]; + m_ams_control->EnableLoadFilamentBtn(false, "", "", ""); + m_ams_control->EnableUnLoadFilamentBtn(false, "", "", ""); + return; } else { @@ -5422,6 +5445,9 @@ void StatusPanel::on_nozzle_fan_switch(wxCommandEvent &event) fanData.modes[0] = airmode; fanData.m_sub_mode = 0; m_fan_control_popup = new FanControlPopupNew(this, obj, fanData); + for (auto it : m_fan_speeds) { + m_fan_control_popup->update_fan_data(it.first, it.second); + } auto pos = m_switch_fan->GetScreenPosition(); pos.y = pos.y + m_switch_fan->GetSize().y; @@ -5444,9 +5470,7 @@ void StatusPanel::on_nozzle_fan_switch(wxCommandEvent &event) return; } - for (auto it : m_fan_speeds) { - m_fan_control_popup->update_fan_data(it.first, it.second); - } + auto pos = m_switch_fan->GetScreenPosition(); pos.y = pos.y + m_switch_fan->GetSize().y; diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index dfdae19..9da3a0b 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -704,6 +704,11 @@ public: void update_temp_ctrl(std::shared_ptr obj); //cj_1 void update_homed_axes(std::string homed_axes) { m_homed_axes = homed_axes; } +//cj_2 + void update_extruder_filament(bool hasFilament); + //cj_2 + void update_AMS_temp(int amsId, int temp); + void update_AMS_humidity(int amsId, int humidity); private: friend class MonitorPanel; //cj_1 @@ -949,6 +954,8 @@ private: //cj_1 std::string m_homed_axes{ "" }; + //cj_2 + bool m_extruder_filament{ false }; }; } } diff --git a/src/slic3r/GUI/UpgradePanel.hpp b/src/slic3r/GUI/UpgradePanel.hpp index b82eba3..eae1a01 100644 --- a/src/slic3r/GUI/UpgradePanel.hpp +++ b/src/slic3r/GUI/UpgradePanel.hpp @@ -6,7 +6,8 @@ #include "Widgets/ProgressBar.hpp" #include #include -#include +//cj_2 +//#include #include "ReleaseNote.hpp" namespace Slic3r { diff --git a/src/slic3r/GUI/WebViewDialog.cpp b/src/slic3r/GUI/WebViewDialog.cpp index 8c8812f..7d49936 100644 --- a/src/slic3r/GUI/WebViewDialog.cpp +++ b/src/slic3r/GUI/WebViewDialog.cpp @@ -358,7 +358,7 @@ wxString WebViewPanel::MakeDisconnectUrl(std::string MenuName) void WebViewPanel::load_url(wxString& url) { - m_browser->Unbind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &WebViewPanel::onLoginHandle, this, m_browser->GetId()); + //m_browser->Unbind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &WebViewPanel::onLoginHandle, this, m_browser->GetId()); this->Show(); this->Raise(); if (m_url != nullptr) { @@ -598,7 +598,6 @@ void WebViewPanel::onLoginHandle(const wxWebViewEvent& evt) int index = 3; try { json j = json::parse(evt.GetString()); - std::cout << "---" << j << std::endl; index = j["index"].get(); } catch (...) { @@ -1880,6 +1879,9 @@ void WebViewPanel::SwitchWebContent(std::string modelname, int refresh) if (modelname != "login") { m_contentname = modelname; } + else { + m_contentname = "home"; + } CheckMenuNewTag(); wxString strlang = GetStudioLanguage(); @@ -2039,13 +2041,14 @@ void WebViewPanel::SwitchWebContent(std::string modelname, int refresh) if (m_browser->GetCurrentURL().Contains("login.html")) { return; } - wxString htmlUrl = wxString::Format("file:///%s/web/homepage3/login.html", from_u8(resources_dir())); - - m_browser->LoadURL(htmlUrl); - - m_browser->Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED,&WebViewPanel::onLoginHandle,this,m_browser->GetId()); + wxString strJS = "GotoMenu(\"home\")"; + WebView::RunScript(m_browserLeft, strJS); - + wxString htmlUrl = wxString::Format("file:///%s/web/homepage3/login.html", from_u8(resources_dir())); + + m_browser->LoadURL(htmlUrl); + + m_browser->Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &WebViewPanel::onLoginHandle, this, m_browser->GetId()); } diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index 9befc07..50528c3 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -1115,6 +1115,24 @@ void AMSControl::SetData(const std::vector& ams_info, //Layout(); } + +//cj_2 +void AMSControl::updateAmsTemp(int id, int temp) +{ + if (id >= m_ams_info.size()) { + return; + } + m_ams_info[id].current_temperature = temp; +} + +void AMSControl::updateAmsHumidity(int id, int humidity) +{ + if (id >= m_ams_info.size()) { + return; + } + m_ams_info[id].humidity_raw = humidity; +} + void AMSControl::AddAmsPreview(AMSinfo info, AMSModel type) { AMSPreview *ams_prv = nullptr; diff --git a/src/slic3r/GUI/Widgets/AMSControl.hpp b/src/slic3r/GUI/Widgets/AMSControl.hpp index 04d70f1..9a90a86 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.hpp +++ b/src/slic3r/GUI/Widgets/AMSControl.hpp @@ -171,6 +171,11 @@ public: const std::string& series_name = std::string(), const std::string& printer_type = std::string(), bool is_reset = true); + + //cj_2 + void updateAmsTemp(int id, int temp); + void updateAmsHumidity(int id, int humidity); + std::vector GenerateSimulateData(); void AddAms(AMSinfo info, AMSPanelPos pos = AMSPanelPos::LEFT_PANEL); diff --git a/src/slic3r/GUI/Widgets/DeviceButton.cpp b/src/slic3r/GUI/Widgets/DeviceButton.cpp index 28bb176..24195b9 100644 --- a/src/slic3r/GUI/Widgets/DeviceButton.cpp +++ b/src/slic3r/GUI/Widgets/DeviceButton.cpp @@ -72,7 +72,7 @@ bool DeviceButton::Create(wxWindow *parent, wxString text, wxString icon, long s StaticBox::Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, style); state_handler.attach({&text_color}); state_handler.update_binds(); - wxWindow::SetFont(wxFont(10, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, "Microsoft YaHei")); + wxWindow::SetFont(wxFont(15, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, "Microsoft YaHei")); wxString device_nameText = text; wxWindow::SetLabel(device_nameText); @@ -269,7 +269,7 @@ void DeviceButton::render(wxDC &dc) if (GetLabel() == "") { // y20 - dc.DrawBitmap(icon.bmp(), rcContent.x/2, rcContent.y/2-2); + dc.DrawBitmap(icon.bmp(), rcContent.x/2, rcContent.y/2 - 2); } // y2 else if (m_ip_text == "" && m_name_text == "") { @@ -289,18 +289,15 @@ void DeviceButton::render(wxDC &dc) } else { dc.SetTextForeground(wxColour(196, 196, 196)); } - dc.DrawText(m_name_text, 32, rcContent.y); - // int dotRadius = 4; - // int dotX = size.x - dotRadius - 10; - // int dotY = 10; - // if (m_isSelected) { - // dc.SetBrush(wxBrush(wxColour(33, 150, 243))); - // dc.SetPen(wxPen(wxColour(33, 150, 243))); - // } else { - // dc.SetBrush(wxBrush(wxColour(220, 220, 220))); - // dc.SetPen(wxPen(wxColour(220, 220, 220))); - // } - // dc.DrawCircle(dotX, dotY, dotRadius); + dc.DrawText(m_name_text, 32, rcContent.y+5); + + //cj_2 +// if (m_isSelected) { +// dc.SetBrush(wxBrush(wxColour(68, 121, 251))); +// dc.SetPen(wxPen(wxColour(68, 121, 251))); +// //dc.DrawRectangle(0, 0, 10, 49); +// dc.DrawRoundedRectangle(-10, 0, 15, 49, 4.0); +// } } else { dc.DrawBitmap(icon.bmp(), 10, (GetSize().GetHeight() - icon.bmp().GetHeight()) / 2); diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 218b909..f2cb047 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -476,7 +476,7 @@ wxBitmap create_scaled_bitmap( const std::string& bmp_name_in, /*stacktrace is time-consuming, optimize it*/ if (s_bmps_not_found.count(bmp_name) == 0) { - BOOST_LOG_TRIVIAL(error) << "Could not load bitmap: " << boost::stacktrace::stacktrace(); + //BOOST_LOG_TRIVIAL(error) << "Could not load bitmap: " << boost::stacktrace::stacktrace(); s_bmps_not_found.emplace(bmp_name); } @@ -492,6 +492,25 @@ wxBitmap create_scaled_bitmap( const std::string& bmp_name_in, return *bmp; } +//y77 +wxBitmap create_scaled_bitmap_form_path(const std::string& bmp_name_in, const int width, const int height) +{ + static Slic3r::GUI::BitmapCache cache; + + std::string bmp_name = bmp_name_in; + wxBitmap *bmp = cache.load_svg(bmp_name, width, height); + if (bmp == nullptr) { + bmp_name = "printer_placeholder"; + bmp = cache.load_png(bmp_name, width, height); + if (bmp == nullptr) { + // Neither SVG nor PNG has been found, raise error + throw Slic3r::RuntimeError("Could not load bitmap: " + bmp_name); + } + } + + return *bmp; +} + //y33 wxBitmap create_scaled_bitmap_of_login(const std::string& bmp_name_in, wxWindow* win/* = nullptr*/, @@ -552,7 +571,7 @@ wxBitmap create_scaled_bitmap2(const std::string& bmp_name_in, Slic3r::GUI::Bitm if (bmp == nullptr) { /*stacktrace is time-consuming, optimize it*/ if (s_bmps_not_found.count(bmp_name) == 0) { - BOOST_LOG_TRIVIAL(error) << "Could not load bitmap: " << boost::stacktrace::stacktrace(); + //BOOST_LOG_TRIVIAL(error) << "Could not load bitmap: " << boost::stacktrace::stacktrace(); s_bmps_not_found.emplace(bmp_name); } diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 8c0c74a..d695d42 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -72,6 +72,9 @@ wxBitmap create_scaled_bitmap_of_login(const std::string& bmp_name, wxWindow* wi const bool bitmap2 = false,// for create_scaled_bitmap2 const std::vector& array_new_color = std::vector()); +//y77 +wxBitmap create_scaled_bitmap_form_path(const std::string& bmp_name_in, const int width, const int height); + //used for semi transparent material wxBitmap create_scaled_bitmap2(const std::string& bmp_name_in, Slic3r::GUI::BitmapCache& cache, wxWindow* win = nullptr, const int px_cnt = 16, const bool grayscale = false, const bool resize = false, diff --git a/src/slic3r/GUI/wxMediaCtrl3.cpp b/src/slic3r/GUI/wxMediaCtrl3.cpp index 979be59..4153532 100644 --- a/src/slic3r/GUI/wxMediaCtrl3.cpp +++ b/src/slic3r/GUI/wxMediaCtrl3.cpp @@ -10,6 +10,10 @@ #include #endif +//y77 +#include "wxExtensions.hpp" + + //wxDEFINE_EVENT(EVT_MEDIA_CTRL_STAT, wxCommandEvent); #ifdef _WIN32 BEGIN_EVENT_TABLE(wxMediaCtrl3, wxWindow) @@ -359,6 +363,9 @@ VideoPanel::VideoPanel(wxWindow* parent, : wxPanel(parent, id, pos, size) , m_state(wxMEDIASTATE_STOPPED) , m_error(0) + , m_exit_flag(false) + , m_frameCount(0) + , m_last_PTS(0) { SetBackgroundStyle(wxBG_STYLE_PAINT); SetDoubleBuffered(true); @@ -376,7 +383,6 @@ VideoPanel::~VideoPanel() { std::unique_lock lk(m_mutex); m_url.reset(); - m_frame = wxImage(m_idle_image); m_cond.notify_all(); } @@ -384,9 +390,6 @@ VideoPanel::~VideoPanel() m_thread.join(); } - if (m_curl) { - curl_easy_cleanup(m_curl); - } curl_global_cleanup(); } @@ -402,18 +405,8 @@ void VideoPanel::Load(const std::string& url) m_video_size = wxDefaultSize; m_error = 0; - // if (m_state != wxMEDIASTATE_LOADING) { - // m_state = wxMEDIASTATE_LOADING; - // wxMediaEvent event(wxEVT_MEDIA_STATECHANGED); - // event.SetId(GetId()); - // event.SetEventObject(this); - // wxPostEvent(this, event); - // } - m_url = std::make_shared(url); - - wxLogMessage("VideoPanel: Loaded URL: %s", url); - + m_cond.notify_all(); } @@ -428,6 +421,8 @@ void VideoPanel::Play() event.SetId(GetId()); event.SetEventObject(this); wxPostEvent(this, event); + + m_cond.notify_all(); } } @@ -436,10 +431,16 @@ void VideoPanel::Stop() std::unique_lock lk(m_mutex); m_url.reset(); - m_frame = wxImage(m_idle_image); + m_frame = m_idle_image; m_video_size = wxDefaultSize; m_frame_size = wxDefaultSize; - NotifyStopped(); + + m_state = wxMEDIASTATE_STOPPED; + wxMediaEvent event(wxEVT_MEDIA_STATECHANGED); + event.SetId(GetId()); + event.SetEventObject(this); + wxPostEvent(this, event); + m_cond.notify_all(); CallAfter([this] { Refresh(); @@ -448,12 +449,12 @@ void VideoPanel::Stop() void VideoPanel::SetIdleImage(wxString const &image) { - if (m_idle_image == image) - return; - m_idle_image = image; + if (m_url == nullptr) { std::unique_lock lk(m_mutex); - m_frame = wxImage(m_idle_image); + //y77 + m_idle_image = create_scaled_bitmap_form_path(image.ToStdString(), 1046, 601).ConvertToImage(); + m_frame = m_idle_image; if (m_frame.IsOk()) { CallAfter([this] { @@ -493,6 +494,7 @@ void VideoPanel::OnPaint(wxPaintEvent& event) void VideoPanel::OnEraseBackground(wxEraseEvent& event) { + } void VideoPanel::OnSize(wxSizeEvent& event) @@ -550,181 +552,196 @@ void VideoPanel::adjust_frame_size(wxSize& frame, const wxSize& video, const wxS void VideoPanel::PlayThread() { using namespace std::chrono_literals; - std::unique_lock lk(m_mutex); - - std::shared_ptr url; - - int frameCount = 0; - std::chrono::steady_clock::time_point lastSecondTime; - + + std::shared_ptr currentUrl; + CURL* curl = nullptr; + while (!m_exit_flag) { - m_cond.wait(lk, [this, &url] { + { + std::unique_lock lk(m_mutex); + m_cond.wait(lk, [this, ¤tUrl] { return m_exit_flag || - (!m_url && url) || - (m_url && !url) || - (m_url && url && *m_url != *url); + (!m_url && currentUrl) || + (m_url && !currentUrl) || + (m_url && currentUrl && *m_url != *currentUrl); }); - - if (m_exit_flag) { - break; + + if (m_exit_flag) { + break; + } + + currentUrl = m_url; + + if (!currentUrl) { + m_frame = m_idle_image; + m_state = wxMEDIASTATE_STOPPED; + + wxMediaEvent stateEvent(wxEVT_MEDIA_STATECHANGED); + stateEvent.SetId(GetId()); + stateEvent.SetEventObject(this); + wxPostEvent(this, stateEvent); + + CallAfter([this] { + Refresh(); + }); + + continue; + } + + if (currentUrl->empty()) { + continue; + } + + ResetPlaybackState(); + + m_state = wxMEDIASTATE_PLAYING; + // // 发送状态事件 + wxMediaEvent stateEvent(wxEVT_MEDIA_STATECHANGED); + stateEvent.SetId(GetId()); + stateEvent.SetEventObject(this); + wxPostEvent(this, stateEvent); } - url = m_url; - - if (!url) { - continue; + if (curl) { + curl_easy_cleanup(curl); + curl = nullptr; } - - if (url->empty()) { - continue; - } - - frameCount = 0; - lastSecondTime = std::chrono::steady_clock::now(); - - m_last_PTS = 0; - m_last_PTS_expected = std::chrono::steady_clock::now(); - m_last_PTS_practical = std::chrono::steady_clock::now(); - - m_state = wxMEDIASTATE_PLAYING; - wxMediaEvent stateEvent(wxEVT_MEDIA_STATECHANGED); - stateEvent.SetId(GetId()); - stateEvent.SetEventObject(this); - wxPostEvent(this, stateEvent); - - lk.unlock(); - - CURL* curl = curl_easy_init(); + + curl = curl_easy_init(); if (!curl) { - lk.lock(); - m_error = -1; - NotifyStopped(); + SetErrorAndNotify(-1, "Failed to initialize CURL"); continue; } - curl_easy_setopt(curl, CURLOPT_URL, url->c_str()); + curl_easy_setopt(curl, CURLOPT_URL, currentUrl->c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5L); curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3L); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_USERAGENT, "VideoPanel/1.0"); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); - bool shouldCleanup = true; + bool shouldContinue = true; + int consecutiveErrors = 0; + const int maxConsecutiveErrors = 3; - while (true) { - auto now = std::chrono::steady_clock::now(); - uint64_t currentPTS = std::chrono::duration_cast( - now.time_since_epoch()).count(); + while (shouldContinue) { + auto frameStartTime = std::chrono::steady_clock::now(); wxMemoryOutputStream memStream; curl_easy_setopt(curl, CURLOPT_WRITEDATA, &memStream); CURLcode res = curl_easy_perform(curl); - lk.lock(); - - if (m_url != url) { - shouldCleanup = false; - lk.unlock(); - break; + { + std::lock_guard lock(m_mutex); + if (m_exit_flag || m_url != currentUrl) { + shouldContinue = false; + break; + } } if (res == CURLE_OK && memStream.GetSize() > 0) { + consecutiveErrors = 0; + wxMemoryInputStream imgStream(memStream); wxImage newImage; - if (newImage.LoadFile(imgStream, wxBITMAP_TYPE_JPEG)) { - frameCount++; - auto nowStat = std::chrono::steady_clock::now(); - auto elapsedTime = std::chrono::duration_cast( - nowStat - lastSecondTime).count(); - - if (elapsedTime >= 1000) { - int fps = static_cast(frameCount * 1000 / elapsedTime); - wxLogMessage("VideoPanel: Decode Rate: %d FPS", fps); - frameCount = 0; - lastSecondTime = nowStat; - } - - const int minFrameDuration = 100; - - if (m_last_PTS && (currentPTS - m_last_PTS) < 3000000) { - auto next_PTS_expected = m_last_PTS_expected + - std::chrono::microseconds(currentPTS - m_last_PTS); - - auto next_PTS_practical = m_last_PTS_practical + - std::chrono::milliseconds(minFrameDuration); - - auto next_PTS = std::max(next_PTS_expected, next_PTS_practical); - - if (nowStat < next_PTS) { - lk.unlock(); - std::this_thread::sleep_until(next_PTS); - lk.lock(); - - if (m_url != url) { - shouldCleanup = false; - lk.unlock(); - break; - } - } else { - next_PTS = nowStat; - } - - m_last_PTS = currentPTS; - m_last_PTS_expected = next_PTS_expected; - m_last_PTS_practical = next_PTS; - } else { - m_last_PTS = currentPTS; - m_last_PTS_expected = nowStat; - m_last_PTS_practical = nowStat; - } - - m_frame = newImage; - CallAfter([this] { - Refresh(); - }); - + if (newImage.LoadFile(imgStream, wxBITMAP_TYPE_JPEG)) { + { + std::lock_guard lock(m_mutex); + if (m_url == currentUrl) { + m_frame = newImage; + + UpdateFrameStatistics(); + + CallAfter([this] { + Refresh(); + }); + } + } } else { - m_error = -2; wxLogWarning("VideoPanel: Failed to decode JPEG image"); + SetErrorAndNotify(-2, "Image decode failed"); } - } else if (res != CURLE_OK) { - m_error = res; + } else { + consecutiveErrors++; + wxLogWarning("VideoPanel: Network error (attempt %d/%d): %s", + consecutiveErrors, maxConsecutiveErrors, curl_easy_strerror(res)); - lk.unlock(); - std::this_thread::sleep_for(500ms); - lk.lock(); - - if (m_url != url) { - shouldCleanup = false; - lk.unlock(); + if (consecutiveErrors >= maxConsecutiveErrors) { + SetErrorAndNotify(res, "Too many consecutive network errors"); + shouldContinue = false; break; } + + std::this_thread::sleep_for(500ms); + + { + std::lock_guard lock(m_mutex); + if (m_exit_flag || m_url != currentUrl) { + shouldContinue = false; + break; + } + } + continue; } - - lk.unlock(); - - std::this_thread::sleep_for(std::chrono::milliseconds(33)); // ~30FPS } - - curl_easy_cleanup(curl); - - if (shouldCleanup) { - std::unique_lock lockAfterCleanup(m_mutex); - if (m_url == url) { + if (shouldContinue) { + std::lock_guard lock(m_mutex); + if (m_url == currentUrl) { m_error = 0; + m_frame = wxImage(); + m_video_size = wxDefaultSize; + m_frame_size = wxDefaultSize; + + NotifyStopped(); } - - m_frame_size = wxDefaultSize; - m_video_size = wxDefaultSize; - NotifyStopped(); } - - lk = std::unique_lock(m_mutex); } + + if (curl) { + curl_easy_cleanup(curl); + } +} + +void VideoPanel::ResetPlaybackState() +{ + m_frameCount = 0; + m_lastSecondTime = std::chrono::steady_clock::now(); + + m_last_PTS = 0; + m_last_PTS_expected = std::chrono::steady_clock::now(); + m_last_PTS_practical = std::chrono::steady_clock::now(); + + m_error = 0; +} + +void VideoPanel::UpdateFrameStatistics() +{ + m_frameCount++; + auto now = std::chrono::steady_clock::now(); + auto elapsedTime = std::chrono::duration_cast( + now - m_lastSecondTime).count(); + + if (elapsedTime >= 1000) { // 每秒统计一次 + int fps = static_cast(m_frameCount * 1000 / elapsedTime); + wxLogMessage("VideoPanel: Decode Rate: %d FPS", fps); + m_frameCount = 0; + m_lastSecondTime = now; + } +} + +void VideoPanel::SetErrorAndNotify(int errorCode, const std::string& errorMsg) +{ + { + std::lock_guard lock(m_mutex); + m_error = errorCode; + } + NotifyStopped(); + wxLogError("VideoPanel: %s", errorMsg); } void VideoPanel::NotifyStopped() diff --git a/src/slic3r/GUI/wxMediaCtrl3.h b/src/slic3r/GUI/wxMediaCtrl3.h index 40a0566..47e846b 100644 --- a/src/slic3r/GUI/wxMediaCtrl3.h +++ b/src/slic3r/GUI/wxMediaCtrl3.h @@ -128,6 +128,9 @@ protected: private: void PlayThread(); void NotifyStopped(); + void ResetPlaybackState(); + void UpdateFrameStatistics(); + void SetErrorAndNotify(int errorCode, const std::string& errorMsg); static size_t WriteMemoryCallback(void* contents, size_t size, size_t nmemb, void* userp); @@ -136,20 +139,21 @@ private: wxMediaState m_state = wxMEDIASTATE_STOPPED; int m_error = 0; - wxString m_idle_image; + wxImage m_idle_image; wxImage m_frame; wxSize m_video_size = wxDefaultSize; wxSize m_frame_size = wxDefaultSize; - uint64_t m_last_PTS = 0; + int m_frameCount; + std::chrono::steady_clock::time_point m_lastSecondTime; + + uint64_t m_last_PTS; std::chrono::steady_clock::time_point m_last_PTS_expected; std::chrono::steady_clock::time_point m_last_PTS_practical; std::mutex m_mutex; std::condition_variable m_cond; std::thread m_thread; - - CURL* m_curl = nullptr; std::atomic m_exit_flag{false}; wxDECLARE_EVENT_TABLE(); diff --git a/src/slic3r/Utils/CalibUtils.cpp b/src/slic3r/Utils/CalibUtils.cpp index a7e5a9f..505d5f9 100644 --- a/src/slic3r/Utils/CalibUtils.cpp +++ b/src/slic3r/Utils/CalibUtils.cpp @@ -19,6 +19,9 @@ #include "../GUI/DeviceCore/DevNozzleSystem.h" #include "../GUI/DeviceCore/DevNozzleRack.h" +//cj_2 +#include "../GUI/QDSDeviceManager.hpp" + namespace Slic3r { namespace GUI { const double MIN_PA_K_VALUE = 0.0;