From 14cb2449c6b4b60ea9587e8f94ae32d554b10a8f Mon Sep 17 00:00:00 2001 From: Stone Li Date: Tue, 20 Jun 2023 11:54:31 +0800 Subject: [PATCH] FIX: fix plate name encoding issue Change-Id: Ia89b2c5bbb4519ed938ae23ff124719cfe6203de Signed-off-by: Stone Li --- src/libslic3r/Format/bbs_3mf.cpp | 6 +++--- src/libslic3r/PrintBase.hpp | 2 +- src/libslic3r/Utils.hpp | 13 ++++++++++++ src/slic3r/GUI/GLTexture.cpp | 2 +- src/slic3r/GUI/ObjectDataViewModel.cpp | 14 ++++++------- src/slic3r/GUI/PartPlate.hpp | 2 +- src/slic3r/GUI/Plater.cpp | 29 ++++++++++++++++---------- src/slic3r/GUI/SelectMachine.cpp | 15 +------------ src/slic3r/GUI/SelectMachine.hpp | 1 - src/slic3r/GUI/SendToPrinter.cpp | 15 +------------ src/slic3r/GUI/SendToPrinter.hpp | 1 - 11 files changed, 45 insertions(+), 55 deletions(-) diff --git a/src/libslic3r/Format/bbs_3mf.cpp b/src/libslic3r/Format/bbs_3mf.cpp index 51bce332d..45f630b25 100644 --- a/src/libslic3r/Format/bbs_3mf.cpp +++ b/src/libslic3r/Format/bbs_3mf.cpp @@ -2044,7 +2044,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) } plate_data_list[it->first-1]->locked = it->second->locked; plate_data_list[it->first-1]->plate_index = it->second->plate_index-1; - plate_data_list[it->first - 1]->plate_name = it->second->plate_name; + plate_data_list[it->first-1]->plate_name = it->second->plate_name; plate_data_list[it->first-1]->obj_inst_map = it->second->obj_inst_map; plate_data_list[it->first-1]->gcode_file = (m_load_restore || it->second->gcode_file.empty()) ? it->second->gcode_file : m_backup_path + "/" + it->second->gcode_file; plate_data_list[it->first-1]->gcode_prediction = it->second->gcode_prediction; @@ -3831,7 +3831,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) m_curr_plater->plate_index = atoi(value.c_str()); } else if (key == PLATER_NAME_ATTR) { - m_curr_plater->plate_name = xml_unescape(encode_path(value.c_str())); + m_curr_plater->plate_name = xml_unescape(value.c_str()); } else if (key == LOCK_ATTR) { @@ -6997,7 +6997,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) stream << " <" << PLATE_TAG << ">\n"; //plate index stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << PLATERID_ATTR << "\" " << VALUE_ATTR << "=\"" << plate_data->plate_index + 1 << "\"/>\n"; - stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << PLATER_NAME_ATTR << "\" " << VALUE_ATTR << "=\"" << xml_escape(decode_path(plate_data->plate_name.c_str())) << "\"/>\n"; + stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << PLATER_NAME_ATTR << "\" " << VALUE_ATTR << "=\"" << xml_escape(plate_data->plate_name.c_str()) << "\"/>\n"; stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << LOCK_ATTR << "\" " << VALUE_ATTR << "=\"" << std::boolalpha<< plate_data->locked<< "\"/>\n"; ConfigOption* bed_type_opt = plate_data->config.option("curr_bed_type"); t_config_enum_names bed_type_names = ConfigOptionEnum::get_enum_names(); diff --git a/src/libslic3r/PrintBase.hpp b/src/libslic3r/PrintBase.hpp index db9ff4719..df86db6d1 100644 --- a/src/libslic3r/PrintBase.hpp +++ b/src/libslic3r/PrintBase.hpp @@ -552,7 +552,7 @@ protected: bool m_no_check = false; // current plate name - std::string m_plate_name; + std::string m_plate_name; // utf8 string // Callback to be evoked regularly to update state of the UI thread. status_callback_type m_status_callback; diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp index 120db2ff9..7039592f2 100644 --- a/src/libslic3r/Utils.hpp +++ b/src/libslic3r/Utils.hpp @@ -571,6 +571,19 @@ inline std::string get_bbl_remain_time_dhms(float time_in_secs) bool bbl_calc_md5(std::string &filename, std::string &md5_out); +inline std::string filter_characters(const std::string& str, const std::string& filterChars) +{ + std::string filteredStr = str; + + auto removeFunc = [&filterChars](char ch) { + return filterChars.find(ch) != std::string::npos; + }; + + filteredStr.erase(std::remove_if(filteredStr.begin(), filteredStr.end(), removeFunc), filteredStr.end()); + + return filteredStr; +} + } // namespace Slic3r #if WIN32 diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index b0e28f3e6..0b1586694 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -483,7 +483,7 @@ bool GLTexture::generate_from_text(const std::string &text_str, wxFont &font, wx return false; } - wxString msg = text_str; + wxString msg = from_u8(text_str); wxMemoryDC memDC; memDC.SetFont(font); diff --git a/src/slic3r/GUI/ObjectDataViewModel.cpp b/src/slic3r/GUI/ObjectDataViewModel.cpp index 1c0acab65..82e1baa65 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.cpp +++ b/src/slic3r/GUI/ObjectDataViewModel.cpp @@ -455,14 +455,12 @@ wxBitmap& ObjectDataViewModel::GetWarningBitmap(const std::string& warning_icon_ wxDataViewItem ObjectDataViewModel::AddPlate(PartPlate* part_plate, wxString name, bool refresh) { int plate_idx = part_plate ? part_plate->get_index() : -1; - wxString plate_name = name; - if (plate_name == "") { - plate_name = _L("Plate"); - std::string plate_CustomName = part_plate ? part_plate->get_plate_name() : ""; - if (plate_CustomName.length() > 0) { - plate_name << " " << plate_idx + 1 << " (" << plate_CustomName << ")"; - } else { - plate_name << " " << plate_idx + 1; + wxString plate_name; + if (name.empty()) { + plate_name = _L("Plate"); + plate_name += wxString::Format(" %d", plate_idx + 1); + if (!part_plate->get_plate_name().empty()) { + plate_name += wxString(" (", wxConvUTF8) + from_u8(part_plate->get_plate_name()) + wxString(")", wxConvUTF8); } } auto plate_node = new ObjectDataViewModelNode(part_plate, plate_name); diff --git a/src/slic3r/GUI/PartPlate.hpp b/src/slic3r/GUI/PartPlate.hpp index a131eff70..9ef3b41f8 100644 --- a/src/slic3r/GUI/PartPlate.hpp +++ b/src/slic3r/GUI/PartPlate.hpp @@ -149,7 +149,7 @@ private: DynamicPrintConfig m_config; // part plate name - std::string m_name; + std::string m_name; // utf8 string bool m_name_change = false; GeometryBuffer m_plate_name_icon; mutable unsigned int m_plate_name_vbo_id{0}; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 84239c6c7..ea0962a64 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6690,9 +6690,15 @@ wxString Plater::priv::get_project_filename(const wxString& extension) const wxString Plater::priv::get_export_gcode_filename(const wxString& extension, bool only_filename, bool export_all) { - std::string plate_index_str = ""; + wxString curr_project_name = m_project_name; + + std::string plate_index_str = ""; + std::string plate_name = partplate_list.get_curr_plate()->get_plate_name(); + + // remove unsupported characters in filename + curr_project_name = from_u8(filter_characters(curr_project_name.ToUTF8().data(), "<>[]:/\\|?*\"")); + plate_name = filter_characters(plate_name, "<>[]:/\\|?*\""); - auto plate_name = partplate_list.get_curr_plate()->get_plate_name(); if (!plate_name.empty()) plate_index_str = (boost::format("_%1%") % plate_name).str(); else if (partplate_list.get_plate_count() > 1) @@ -6701,24 +6707,24 @@ wxString Plater::priv::get_export_gcode_filename(const wxString& extension, bool if (!m_project_folder.empty()) { if (!only_filename) { if (export_all) { - auto full_filename = m_project_folder / std::string((m_project_name + extension).mb_str(wxConvUTF8)); + auto full_filename = m_project_folder / std::string((curr_project_name + extension).mb_str(wxConvUTF8)); return from_path(full_filename); } else { - auto full_filename = m_project_folder / std::string((m_project_name + plate_index_str + extension).mb_str(wxConvUTF8)); + auto full_filename = m_project_folder / std::string((curr_project_name + from_u8(plate_index_str) + extension).mb_str(wxConvUTF8)); return from_path(full_filename); } } else { if (export_all) - return m_project_name + wxString(plate_index_str) + extension; + return curr_project_name + extension; else - return m_project_name + extension; + return curr_project_name + from_u8(plate_index_str) + extension; } } else { if (only_filename) { if (export_all) - return m_project_name + extension; + return curr_project_name + extension; else - return m_project_name + wxString(plate_index_str) + extension; + return curr_project_name + from_u8(plate_index_str) + extension; } else return ""; @@ -9876,7 +9882,6 @@ void Plater::export_gcode_3mf(bool export_all) //BBS replace gcode extension to .gcode.3mf default_output_file = default_output_file.replace_extension(".gcode.3mf"); - default_output_file = fs::path(Slic3r::fold_utf8_to_ascii(default_output_file.string(),true)); //Get a last save path start_dir = appconfig.get_last_output_dir(default_output_file.parent_path().string(), false); @@ -11914,7 +11919,8 @@ int Plater::select_plate_by_hover_id(int hover_id, bool right_click, bool isModi else dlg.sync_print_seq(0); - dlg.set_plate_name(curr_plate->get_plate_name()); + wxString curr_plate_name = from_u8(curr_plate->get_plate_name()); + dlg.set_plate_name(curr_plate_name); dlg.Bind(EVT_SET_BED_TYPE_CONFIRM, [this, plate_index, &dlg](wxCommandEvent& e) { PartPlate *curr_plate = p->partplate_list.get_curr_plate(); @@ -11941,7 +11947,8 @@ int Plater::select_plate_by_hover_id(int hover_id, bool right_click, bool isModi }); dlg.ShowModal(); - curr_plate->set_plate_name(dlg.get_plate_name().ToStdString()); + wxString dlg_plate_name = dlg.get_plate_name(); + curr_plate->set_plate_name(dlg_plate_name.ToUTF8().data()); this->schedule_background_process(); } diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index e449e1d41..e5b7610a8 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -3318,19 +3318,6 @@ void SelectMachineDialog::set_flow_calibration_state(bool state) } } -std::string SelectMachineDialog::filter_characters(const std::string& str, const std::string& filterChars) -{ - std::string filteredStr = str; - - auto removeFunc = [&filterChars](char ch) { - return filterChars.find(ch) != std::string::npos; - }; - - filteredStr.erase(std::remove_if(filteredStr.begin(), filteredStr.end(), removeFunc), filteredStr.end()); - - return filteredStr; -} - void SelectMachineDialog::set_default() { if (m_print_type == PrintFromType::FROM_NORMAL) { @@ -3365,7 +3352,7 @@ void SelectMachineDialog::set_default() m_current_project_name = wxString::FromUTF8(filename_path.filename().string()); //unsupported character filter - m_current_project_name = filter_characters(m_current_project_name.ToStdString(), "<>[]:/\\|?*\""); + m_current_project_name = from_u8(filter_characters(m_current_project_name.ToUTF8().data(), "<>[]:/\\|?*\"")); m_rename_text->SetLabelText(m_current_project_name); m_rename_normal_panel->Layout(); diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index f757d8339..2c3baf6ee 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -455,7 +455,6 @@ public: wxWindow* create_item_checkbox(wxString title, wxWindow* parent, wxString tooltip, std::string param); wxImage * LoadImageFromBlob(const unsigned char *data, int size); PrintDialogStatus get_status() { return m_print_status; } - std::string filter_characters(const std::string& str, const std::string& filterChars); std::vector sort_string(std::vector strArray); }; diff --git a/src/slic3r/GUI/SendToPrinter.cpp b/src/slic3r/GUI/SendToPrinter.cpp index 79886a920..0dc159f93 100644 --- a/src/slic3r/GUI/SendToPrinter.cpp +++ b/src/slic3r/GUI/SendToPrinter.cpp @@ -1211,19 +1211,6 @@ void SendToPrinterDialog::on_dpi_changed(const wxRect &suggested_rect) Refresh(); } -std::string SendToPrinterDialog::filter_characters(const std::string& str, const std::string& filterChars) -{ - std::string filteredStr = str; - - auto removeFunc = [&filterChars](char ch) { - return filterChars.find(ch) != std::string::npos; - }; - - filteredStr.erase(std::remove_if(filteredStr.begin(), filteredStr.end(), removeFunc), filteredStr.end()); - - return filteredStr; -} - void SendToPrinterDialog::set_default() { //project name @@ -1244,7 +1231,7 @@ void SendToPrinterDialog::set_default() m_current_project_name = wxString::FromUTF8(filename_path.filename().string()); //unsupported character filter - m_current_project_name = filter_characters(m_current_project_name.ToStdString(), "<>[]:/\\|?*\""); + m_current_project_name = from_u8(filter_characters(m_current_project_name.ToUTF8().data(), "<>[]:/\\|?*\"")); m_rename_text->SetLabelText(m_current_project_name); m_rename_normal_panel->Layout(); diff --git a/src/slic3r/GUI/SendToPrinter.hpp b/src/slic3r/GUI/SendToPrinter.hpp index 4eb1410e6..df924b373 100644 --- a/src/slic3r/GUI/SendToPrinter.hpp +++ b/src/slic3r/GUI/SendToPrinter.hpp @@ -152,7 +152,6 @@ public: void show_print_failed_info(bool show, int code = 0, wxString description = wxEmptyString, wxString extra = wxEmptyString); void update_print_error_info(int code, std::string msg, std::string extra); wxString format_text(wxString& m_msg); - std::string filter_characters(const std::string& str, const std::string& filterChars); std::vector sort_string(std::vector strArray); };