FIX: export and import configs issue

Jira: XXXX
import config lose xxx_settings_id issue
export process config should not have user printer
export process config shoule remove duplicate presets
export filamnent config: filament list should have no third print compatible presets

Change-Id: I94bac062e07b3a989ff86142e3fb8266a48364c6
This commit is contained in:
maosheng.wei 2023-10-31 18:17:41 +08:00 committed by Lane.Wei
parent 7ffbb7d014
commit 5f0dc7faed
4 changed files with 55 additions and 10 deletions

View File

@ -2126,11 +2126,11 @@ bool PresetCollection::clone_presets(std::vector<Preset const *> const &presets,
}
preset.file = this->path_for_preset(preset);
if (m_type == Preset::TYPE_PRINT)
preset.config.option<ConfigOptionString>("print_settings_id", true)->value.clear();
preset.config.option<ConfigOptionString>("print_settings_id", true)->value = preset.name;
else if (m_type == Preset::TYPE_FILAMENT)
preset.config.option<ConfigOptionStrings>("filament_settings_id", true)->values[0].clear();
preset.config.option<ConfigOptionStrings>("filament_settings_id", true)->values[0] = preset.name;
else if (m_type == Preset::TYPE_PRINTER)
preset.config.option<ConfigOptionString>("printer_settings_id", true)->value.clear();
preset.config.option<ConfigOptionString>("printer_settings_id", true)->value = preset.name;
}
if (!failures.empty() && !force_rewritten)
return false;
@ -2245,11 +2245,11 @@ void PresetCollection::save_current_preset(const std::string &new_name, bool det
//BBS: add lock logic for sync preset in background
if (m_type == Preset::TYPE_PRINT)
preset.config.option<ConfigOptionString>("print_settings_id", true)->value.clear();
preset.config.option<ConfigOptionString>("print_settings_id", true)->value = new_name;
else if (m_type == Preset::TYPE_FILAMENT)
preset.config.option<ConfigOptionStrings>("filament_settings_id", true)->values[0].clear();
preset.config.option<ConfigOptionStrings>("filament_settings_id", true)->values[0] = new_name;
else if (m_type == Preset::TYPE_PRINTER)
preset.config.option<ConfigOptionString>("printer_settings_id", true)->value.clear();
preset.config.option<ConfigOptionString>("printer_settings_id", true)->value = new_name;
final_inherits = preset.inherits();
unlock();
// TODO: apply change from custom root to devided presets.
@ -2293,11 +2293,11 @@ void PresetCollection::save_current_preset(const std::string &new_name, bool det
else
preset.is_project_embedded = false;
if (m_type == Preset::TYPE_PRINT)
preset.config.option<ConfigOptionString>("print_settings_id", true)->value.clear();
preset.config.option<ConfigOptionString>("print_settings_id", true)->value = new_name;
else if (m_type == Preset::TYPE_FILAMENT)
preset.config.option<ConfigOptionStrings>("filament_settings_id", true)->values[0].clear();
preset.config.option<ConfigOptionStrings>("filament_settings_id", true)->values[0] = new_name;
else if (m_type == Preset::TYPE_PRINTER)
preset.config.option<ConfigOptionString>("printer_settings_id", true)->value.clear();
preset.config.option<ConfigOptionString>("printer_settings_id", true)->value = new_name;
//BBS: add lock logic for sync preset in background
final_inherits = inherits;
unlock();

View File

@ -707,7 +707,7 @@ PresetsConfigSubstitutions PresetBundle::import_presets(std::vector<std::string>
// create target file path
std::string target_file_path = boost::filesystem::path(temp_folder / file_name).make_preferred().string();
status = mz_zip_reader_extract_to_file(&zip_archive, i, target_file_path.c_str(), MZ_ZIP_FLAG_CASE_SENSITIVE);
status = mz_zip_reader_extract_to_file(&zip_archive, i, encode_path(target_file_path.c_str()).c_str(), MZ_ZIP_FLAG_CASE_SENSITIVE);
// target file is opened
if (MZ_FALSE == status) {
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " Failed to open target file: " << target_file_path;

View File

@ -3084,6 +3084,19 @@ bool ExportConfigsDialog::has_check_box_selected()
return false;
}
bool ExportConfigsDialog::preset_is_not_compatible_bbl_printer(Preset *preset)
{
if (preset->type != Preset::Type::TYPE_PRINT && preset->type != Preset::Type::TYPE_FILAMENT) return true;
PresetBundle * preset_bundle = wxGetApp().preset_bundle;
vector<std::string> printers;
get_filament_compatible_printer(preset, printers);
if (printers.empty()) return true;
Preset *printer_preset = preset_bundle->printers.find_preset(printers[0], false);
if (!printer_preset) return true;
if (!printer_preset->is_bbl_vendor_preset(preset_bundle)) return true;
return false;
}
std::string ExportConfigsDialog::initial_file_path(const wxString &path, const std::string &sub_file_path)
{
std::string export_path = into_u8(path);
@ -3305,6 +3318,7 @@ void ExportConfigsDialog::select_curr_radiobox(std::vector<std::pair<RadioBox *,
m_preset_sizer->Clear(true);
m_printer_name.clear();
m_preset.clear();
PresetBundle *preset_bundle = wxGetApp().preset_bundle;
if (export_type == m_exprot_type.preset_bundle) {
for (std::pair<std::string, Preset *> preset : m_printer_presets) {
std::string preset_name = preset.first;
@ -3316,6 +3330,13 @@ void ExportConfigsDialog::select_curr_radiobox(std::vector<std::pair<RadioBox *,
m_serial_text->SetLabel(_L("Only display printer names with changes to printer, filament, and process presets for uploading to the model mall."));
}else if (export_type == m_exprot_type.filament_bundle) {
for (std::pair<std::string, std::vector<std::pair<std::string, Preset*>>> filament_name_to_preset : m_filament_name_to_presets) {
if (filament_name_to_preset.second.empty()) continue;
bool all_preset_is_compatible_third_printer = true;
for (std::pair<std::string, Preset *> filament_preset : filament_name_to_preset.second) {
if (!preset_is_not_compatible_bbl_printer(filament_preset.second))
all_preset_is_compatible_third_printer = false;
}
if (all_preset_is_compatible_third_printer) continue;
wxString filament_name = wxString::FromUTF8(filament_name_to_preset.first);
m_preset_sizer->Add(create_checkbox(m_presets_window, filament_name, m_printer_name), 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, FromDIP(5));
}
@ -3330,12 +3351,23 @@ void ExportConfigsDialog::select_curr_radiobox(std::vector<std::pair<RadioBox *,
m_serial_text->SetLabel(_L("Only printer names with user printer presets will be displayed, and each preset you choose will be exported as a zip."));
} else if (export_type == m_exprot_type.filament_preset) {
for (std::pair<std::string, std::vector<std::pair<std::string, Preset *>>> filament_name_to_preset : m_filament_name_to_presets) {
if (filament_name_to_preset.second.empty()) continue;
bool all_preset_is_compatible_third_printer = true;
for (std::pair<std::string, Preset*> filament_preset : filament_name_to_preset.second) {
if (!preset_is_not_compatible_bbl_printer(filament_preset.second))
all_preset_is_compatible_third_printer = false;
}
if (all_preset_is_compatible_third_printer) continue;
wxString filament_name = wxString::FromUTF8(filament_name_to_preset.first);
m_preset_sizer->Add(create_checkbox(m_presets_window, filament_name, m_printer_name), 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, FromDIP(5));
}
m_serial_text->SetLabel(_L("Only the filament names with user filament presets will be displayed, \nand all user filament presets in each filament name you select will be exported as a zip."));
} else if (export_type == m_exprot_type.process_preset) {
for (std::pair<std::string, std::vector<Preset *>> presets : m_process_presets) {
Preset * printer_preset = preset_bundle->printers.find_preset(presets.first, false);
if (!printer_preset) continue;
if (!printer_preset->is_system) continue;
if (preset_bundle->printers.get_preset_base(*printer_preset) != printer_preset) continue;
for (Preset *preset : presets.second) {
if (!preset->is_system) {
wxString printer_name = wxString::FromUTF8(presets.first);
@ -3519,10 +3551,14 @@ ExportConfigsDialog::ExportCase ExportConfigsDialog::archive_filament_bundle_to_
BOOST_LOG_TRIVIAL(info) << "Filament name do not find, filament name:" << filament_name;
continue;
}
std::set<std::pair<std::string, std::string>> vendor_to_filament_name;
for (std::pair<std::string, Preset *> printer_name_to_preset : iter->second) {
std::string printer_vendor = printer_name_to_preset.first;
if (printer_vendor.empty()) continue;
Preset * filament_preset = printer_name_to_preset.second;
if (preset_is_not_compatible_bbl_printer(filament_preset)) continue;
if (vendor_to_filament_name.find(std::make_pair(printer_vendor, filament_preset->name)) != vendor_to_filament_name.end()) continue;
vendor_to_filament_name.insert(std::make_pair(printer_vendor, filament_preset->name));
std::string preset_path = boost::filesystem::path(filament_preset->file).make_preferred().string();
if (preset_path.empty()) {
BOOST_LOG_TRIVIAL(info) << "Export printer preset: " << filament_preset->name << " skip because of the preset file path is empty.";
@ -3615,6 +3651,7 @@ ExportConfigsDialog::ExportCase ExportConfigsDialog::archive_filament_preset_to_
std::vector<std::pair<std::string, std::string>> config_paths;
std::set<std::string> filament_presets;
for (std::pair<CheckBox *, std::string> checkbox_preset : m_printer_name) {
if (checkbox_preset.first->GetValue()) {
std::string filament_name = checkbox_preset.second;
@ -3626,6 +3663,9 @@ ExportConfigsDialog::ExportCase ExportConfigsDialog::archive_filament_preset_to_
}
for (std::pair<std::string, Preset*> printer_name_preset : iter->second) {
Preset * filament_preset = printer_name_preset.second;
if (preset_is_not_compatible_bbl_printer(filament_preset)) continue;
if (filament_presets.find(filament_preset->name) != filament_presets.end()) continue;
filament_presets.insert(filament_preset->name);
std::string preset_path = boost::filesystem::path(filament_preset->file).make_preferred().string();
if (preset_path.empty()) {
BOOST_LOG_TRIVIAL(info) << "Export filament preset: " << filament_preset->name << " skip because of the filament file path is empty.";
@ -3655,12 +3695,16 @@ ExportConfigsDialog::ExportCase ExportConfigsDialog::archive_process_preset_to_f
std::vector<std::pair<std::string, std::string>> config_paths;
std::set<std::string> process_presets;
for (std::pair<CheckBox *, std::string> checkbox_preset : m_printer_name) {
if (checkbox_preset.first->GetValue()) {
std::string printer_name = checkbox_preset.second;
std::unordered_map<std::string, std::vector<Preset *>>::iterator iter = m_process_presets.find(printer_name);
if (m_process_presets.end() != iter) {
for (Preset *process_preset : iter->second) {
if (preset_is_not_compatible_bbl_printer(process_preset)) continue;
if (process_presets.find(process_preset->name) != process_presets.end()) continue;
process_presets.insert(process_preset->name);
std::string preset_path = boost::filesystem::path(process_preset->file).make_preferred().string();
if (preset_path.empty()) {
BOOST_LOG_TRIVIAL(info) << "Export process preset: " << process_preset->name << " skip because of the preset file path is empty.";

View File

@ -262,6 +262,7 @@ private:
void on_dpi_changed(const wxRect &suggested_rect) override;
void show_export_result(const ExportCase &export_case);
bool has_check_box_selected();
bool preset_is_not_compatible_bbl_printer(Preset *preset);
std::string initial_file_path(const wxString &path, const std::string &sub_file_path);
std::string initial_file_name(const wxString &path, const std::string file_name);
wxBoxSizer *create_export_config_item(wxWindow *parent);