diff --git a/resources/profiles/Templates.idx b/resources/profiles/Templates.idx index 64a37db6ad..87a024a94b 100644 --- a/resources/profiles/Templates.idx +++ b/resources/profiles/Templates.idx @@ -1,4 +1,5 @@ min_slic3r_version = 2.6.0-alpha0 +1.0.4 Updated compatible printer condition. 1.0.3 Updated compatible printer condition. 1.0.2 Updated compatible printer conditions. 1.0.1 Added Prusament PETG Carbon Fiber, Fiberthree F3 PA-GF30 Pro. diff --git a/resources/profiles/Templates.ini b/resources/profiles/Templates.ini index 541b429a8a..be1af74b62 100644 --- a/resources/profiles/Templates.ini +++ b/resources/profiles/Templates.ini @@ -2,7 +2,7 @@ [vendor] name = Templates -config_version = 1.0.3 +config_version = 1.0.4 config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Templates/ templates_profile = 1 @@ -11,7 +11,7 @@ templates_profile = 1 [filament:*common*] cooling = 1 compatible_printers = -compatible_printers_condition = printer_notes!~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes!~/.*PRINTER_MODEL_MK4IS.*/ and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and num_extruders>1) +compatible_printers_condition = printer_notes!~/.*NO_TEMPLATES.*/ and printer_notes!~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes!~/.*PRINTER_MODEL_MK4IS.*/ and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and num_extruders>1) end_filament_gcode = "; Filament-specific end gcode" extrusion_multiplier = 1 filament_loading_speed = 14 diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index 63e2b3821e..3f0b500c42 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -904,6 +904,10 @@ size_t ConfigBase::load_from_gcode_string_legacy(ConfigBase& config, const char* end = start; } + // Do legacy conversion on a completely loaded dictionary. + // Perform composite conversions, for example merging multiple keys into one key. + config.handle_legacy_composite(); + return num_key_value_pairs; } @@ -1073,6 +1077,10 @@ ConfigSubstitutions ConfigBase::load_from_gcode_file(const std::string &filename if (key_value_pairs < 80) throw Slic3r::RuntimeError(format("Suspiciously low number of configuration values extracted from %1%: %2%", filename, key_value_pairs)); + + // Do legacy conversion on a completely loaded dictionary. + // Perform composite conversions, for example merging multiple keys into one key. + this->handle_legacy_composite(); return std::move(substitutions_ctxt.substitutions); } @@ -1114,6 +1122,9 @@ ConfigSubstitutions ConfigBase::load_from_binary_gcode_file(const std::string& f this->set_deserialize(key, value, substitutions_ctxt); } + // Do legacy conversion on a completely loaded dictionary. + // Perform composite conversions, for example merging multiple keys into one key. + this->handle_legacy_composite(); return std::move(substitutions_ctxt.substitutions); } diff --git a/src/libslic3r/GCode/Thumbnails.cpp b/src/libslic3r/GCode/Thumbnails.cpp index 6e2b51f764..0e088d0368 100644 --- a/src/libslic3r/GCode/Thumbnails.cpp +++ b/src/libslic3r/GCode/Thumbnails.cpp @@ -192,7 +192,7 @@ std::string get_error_string(const ThumbnailErrors& errors) std::string error_str; if (errors.has(ThumbnailError::InvalidVal)) - error_str += "\n - " + format("Invalid input format. Expected vector of dimensions in the following format: \"%1%\"", "XxYxEXT, XxYxEXT, ..."); + error_str += "\n - " + format("Invalid input format. Expected vector of dimensions in the following format: \"%1%\"", "XxY/EXT, XxY/EXT, ..."); if (errors.has(ThumbnailError::OutOfRange)) error_str += "\n - Input value is out of range"; if (errors.has(ThumbnailError::InvalidExt)) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index e7c05e8db0..4ac981c960 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -310,7 +310,7 @@ void PrintConfigDef::init_common_params() def = this->add("thumbnails", coString); def->label = L("G-code thumbnails"); - def->tooltip = L("Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the following format: \"XxYxEXT, XxYxEXT, ...\""); + def->tooltip = L("Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the following format: \"XxY/EXT, XxY/EXT, ...\""); def->mode = comExpert; def->gui_type = ConfigOptionDef::GUIType::one_string; def->set_default_value(new ConfigOptionString()); diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index e82f835587..5be4434211 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -382,7 +382,7 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true set_value(str_out, true); wxString error_str; if (errors.has(ThumbnailError::InvalidVal)) - error_str += format_wxstr(_L("Invalid input format. Expected vector of dimensions in the following format: \"%1%\""), "XxYxEXT, XxYxEXT, ..."); + error_str += format_wxstr(_L("Invalid input format. Expected vector of dimensions in the following format: \"%1%\""), "XxY/EXT, XxY/EXT, ..."); if (errors.has(ThumbnailError::OutOfRange)) { if (!error_str.empty()) error_str += "\n\n"; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index cc92730b74..95bbdf1363 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -4544,22 +4544,24 @@ void SubstitutionManager::init(DynamicPrintConfig* config, wxWindow* parent, wxF m_parent = parent; m_grid_sizer = grid_sizer; m_em = em_unit(parent); + + m_substitutions = m_config->option("gcode_substitutions")->values; } void SubstitutionManager::validate_lenth() { - std::vector& substitutions = m_config->option("gcode_substitutions")->values; - if ((substitutions.size() % 4) != 0) { + if ((m_substitutions.size() % 4) != 0) { WarningDialog(m_parent, "Value of gcode_substitutions parameter will be cut to valid length", "Invalid length of gcode_substitutions parameter").ShowModal(); - substitutions.resize(substitutions.size() - (substitutions.size() % 4)); + m_substitutions.resize(m_substitutions.size() - (m_substitutions.size() % 4)); + // save changes from m_substitutions to config + m_config->option("gcode_substitutions")->values = m_substitutions; } } bool SubstitutionManager::is_compatibile_with_ui() { - const std::vector& substitutions = m_config->option("gcode_substitutions")->values; - if (int(substitutions.size() / 4) != m_grid_sizer->GetEffectiveRowsCount() - 1) { + if (int(m_substitutions.size() / 4) != m_grid_sizer->GetEffectiveRowsCount() - 1) { ErrorDialog(m_parent, "Invalid compatibility between UI and BE", false).ShowModal(); return false; } @@ -4568,8 +4570,7 @@ bool SubstitutionManager::is_compatibile_with_ui() bool SubstitutionManager::is_valid_id(int substitution_id, const wxString& message) { - const std::vector& substitutions = m_config->option("gcode_substitutions")->values; - if (int(substitutions.size() / 4) < substitution_id) { + if (int(m_substitutions.size() / 4) < substitution_id) { ErrorDialog(m_parent, message, false).ShowModal(); return false; } @@ -4600,8 +4601,11 @@ void SubstitutionManager::delete_substitution(int substitution_id) return; // delete substitution - std::vector& substitutions = m_config->option("gcode_substitutions")->values; - substitutions.erase(std::next(substitutions.begin(), substitution_id * 4), std::next(substitutions.begin(), substitution_id * 4 + 4)); + m_substitutions.erase(std::next(m_substitutions.begin(), substitution_id * 4), std::next(m_substitutions.begin(), substitution_id * 4 + 4)); + + // save changes from m_substitutions to config + m_config->option("gcode_substitutions")->values = m_substitutions; + call_ui_update(); // update grid_sizer @@ -4620,15 +4624,16 @@ void SubstitutionManager::add_substitution( int substitution_id, if (substitution_id < 0) { if (m_grid_sizer->IsEmpty()) { create_legend(); - substitution_id = 0; } substitution_id = m_grid_sizer->GetEffectiveRowsCount() - 1; // create new substitution // it have to be added to config too - std::vector& substitutions = m_config->option("gcode_substitutions")->values; for (size_t i = 0; i < 4; i ++) - substitutions.push_back(std::string()); + m_substitutions.push_back(std::string()); + + // save changes from config to m_substitutions + m_config->option("gcode_substitutions")->values = m_substitutions; call_after_layout = true; } @@ -4690,6 +4695,14 @@ void SubstitutionManager::add_substitution( int substitution_id, auto chb_match_single_line = new wxCheckBox(m_parent, wxID_ANY, _L("Match single line")); chb_match_single_line->SetValue(match_single_line); chb_match_single_line->Show(regexp); + + chb_match_single_line->Bind(wxEVT_SHOW, [chb_match_single_line, chb_regexp](wxShowEvent& evt) { + if (evt.IsShown() && !chb_regexp->GetValue()) { + // To avoid a case, when ShowAll() is called for m_grid_sizer but chb_match_single_line have to be hidden + chb_match_single_line->Hide(); + } + }); + params_sizer->Add(chb_match_single_line, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT | wxLEFT, m_em); for (wxCheckBox* chb : std::initializer_list{ chb_regexp, chb_case_insensitive, chb_whole_word, chb_match_single_line }) { @@ -4725,10 +4738,17 @@ void SubstitutionManager::add_substitution( int substitution_id, void SubstitutionManager::update_from_config() { + std::vector& subst = m_config->option("gcode_substitutions")->values; + if (m_substitutions == subst && m_grid_sizer->IsShown(1)) { + // "gcode_substitutions" values didn't changed in config. There is no need to update/recreate controls + return; + } + + m_substitutions = subst; + if (!m_grid_sizer->IsEmpty()) m_grid_sizer->Clear(true); - std::vector& subst = m_config->option("gcode_substitutions")->values; if (subst.empty()) hide_delete_all_btn(); else @@ -4745,7 +4765,8 @@ void SubstitutionManager::update_from_config() void SubstitutionManager::delete_all() { - m_config->option("gcode_substitutions")->values.clear(); + m_substitutions.clear(); + m_config->option("gcode_substitutions")->values.clear(); call_ui_update(); if (!m_grid_sizer->IsEmpty()) @@ -4756,13 +4777,13 @@ void SubstitutionManager::delete_all() void SubstitutionManager::edit_substitution(int substitution_id, int opt_pos, const std::string& value) { - std::vector& substitutions = m_config->option("gcode_substitutions")->values; - validate_lenth(); if(!is_compatibile_with_ui() || !is_valid_id(substitution_id, "Invalid substitution_id to edit")) return; - substitutions[substitution_id * 4 + opt_pos] = value; + m_substitutions[substitution_id * 4 + opt_pos] = value; + // save changes from m_substitutions to config + m_config->option("gcode_substitutions")->values = m_substitutions; call_ui_update(); } diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 0cca2cd339..69a544ad7a 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -70,6 +70,8 @@ class SubstitutionManager std::function m_cb_edited_substitution{ nullptr }; std::function m_cb_hide_delete_all_btn{ nullptr }; + std::vector m_substitutions; + void validate_lenth(); bool is_compatibile_with_ui(); bool is_valid_id(int substitution_id, const wxString& message);