diff --git a/resources/localization/cs/PrusaSlicer.mo b/resources/localization/cs/PrusaSlicer.mo index e80adb4755..a19fb22ef2 100644 Binary files a/resources/localization/cs/PrusaSlicer.mo and b/resources/localization/cs/PrusaSlicer.mo differ diff --git a/resources/localization/cs/PrusaSlicer_cs.po b/resources/localization/cs/PrusaSlicer_cs.po index f905737572..f8dea215bf 100644 --- a/resources/localization/cs/PrusaSlicer_cs.po +++ b/resources/localization/cs/PrusaSlicer_cs.po @@ -17011,7 +17011,7 @@ msgstr "Přenést vybraná nastavení do nově zvoleného přednastavení." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1626 msgid "Transfer values from left to right" -msgstr "Přenést hodnoty zprava doleva" +msgstr "Přenést hodnoty zleva doprava" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:678 msgid "Translate" diff --git a/resources/profiles/PrusaResearch/MK2.5MMU2_thumbnail.png b/resources/profiles/PrusaResearch/MK2.5MMU2_thumbnail.png index 4affdf8abc..6f6e2bcb1b 100644 Binary files a/resources/profiles/PrusaResearch/MK2.5MMU2_thumbnail.png and b/resources/profiles/PrusaResearch/MK2.5MMU2_thumbnail.png differ diff --git a/resources/profiles/Templates.idx b/resources/profiles/Templates.idx index 728a7da353..64a37db6ad 100644 --- a/resources/profiles/Templates.idx +++ b/resources/profiles/Templates.idx @@ -1,4 +1,5 @@ min_slic3r_version = 2.6.0-alpha0 +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. 1.0.0 Initial diff --git a/resources/profiles/Templates.ini b/resources/profiles/Templates.ini index d038d572db..541b429a8a 100644 --- a/resources/profiles/Templates.ini +++ b/resources/profiles/Templates.ini @@ -2,7 +2,7 @@ [vendor] name = Templates -config_version = 1.0.2 +config_version = 1.0.3 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.*/ +compatible_printers_condition = 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/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index ed735a38bd..499e7b85af 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -468,11 +468,8 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: f->print_config = &this->object()->print()->config(); f->print_object_config = &this->object()->config(); - if (surface_fill.params.pattern == ipLightning) { - auto *lf = dynamic_cast(f.get()); - lf->generator = lightning_generator; - lf->num_raft_layers = this->object()->slicing_parameters().raft_layers(); - } + if (surface_fill.params.pattern == ipLightning) + dynamic_cast(f.get())->generator = lightning_generator; if (surface_fill.params.pattern == ipEnsuring) { auto *fill_ensuring = dynamic_cast(f.get()); @@ -649,18 +646,15 @@ Polylines Layer::generate_sparse_infill_polylines_for_anchoring(FillAdaptive::Oc // Create the filler object. std::unique_ptr f = std::unique_ptr(Fill::new_from_type(surface_fill.params.pattern)); f->set_bounding_box(bbox); - f->layer_id = this->id(); + f->layer_id = this->id() - this->object()->get_layer(0)->id(); // We need to subtract raft layers. f->z = this->print_z; f->angle = surface_fill.params.angle; f->adapt_fill_octree = (surface_fill.params.pattern == ipSupportCubic) ? support_fill_octree : adaptive_fill_octree; f->print_config = &this->object()->print()->config(); f->print_object_config = &this->object()->config(); - if (surface_fill.params.pattern == ipLightning) { - auto *lf = dynamic_cast(f.get()); - lf->generator = lightning_generator; - lf->num_raft_layers = this->object()->slicing_parameters().raft_layers(); - } + if (surface_fill.params.pattern == ipLightning) + dynamic_cast(f.get())->generator = lightning_generator; // calculate flow spacing for infill pattern generation double link_max_length = 0.; diff --git a/src/libslic3r/Fill/FillLightning.cpp b/src/libslic3r/Fill/FillLightning.cpp index 8c3ac8f1ac..36a48e5547 100644 --- a/src/libslic3r/Fill/FillLightning.cpp +++ b/src/libslic3r/Fill/FillLightning.cpp @@ -13,7 +13,7 @@ void Filler::_fill_surface_single( ExPolygon expolygon, Polylines &polylines_out) { - const Layer &layer = generator->getTreesForLayer(this->layer_id - this->num_raft_layers); + const Layer &layer = generator->getTreesForLayer(this->layer_id); Polylines fill_lines = layer.convertToLines(to_polygons(expolygon), scaled(0.5 * this->spacing - this->overlap)); if (params.dont_connect() || fill_lines.size() <= 1) { diff --git a/src/libslic3r/Fill/FillLightning.hpp b/src/libslic3r/Fill/FillLightning.hpp index 0705dc657f..341399508f 100644 --- a/src/libslic3r/Fill/FillLightning.hpp +++ b/src/libslic3r/Fill/FillLightning.hpp @@ -22,7 +22,6 @@ public: ~Filler() override = default; Generator *generator { nullptr }; - size_t num_raft_layers { 0 }; protected: Fill* clone() const override { return new Filler(*this); } diff --git a/src/libslic3r/Format/SLAArchiveFormatRegistry.cpp b/src/libslic3r/Format/SLAArchiveFormatRegistry.cpp index 17d3fa9a0b..0a72cbcf33 100644 --- a/src/libslic3r/Format/SLAArchiveFormatRegistry.cpp +++ b/src/libslic3r/Format/SLAArchiveFormatRegistry.cpp @@ -11,20 +11,17 @@ namespace Slic3r { -static std::mutex arch_mtx; - class Registry { static std::unique_ptr registry; std::set entries; -public: Registry () { entries = { { "SL1", // id - L("SL1 archive format"), // description + L("SL1 archive"), // description "sl1", // main extension {"sl1s", "zip"}, // extension aliases @@ -38,22 +35,14 @@ public: }, { "SL1SVG", - L("SL1SVG archive files"), + L("SL1 SVG archive"), "sl1_svg", - {}, + {"zip"}, [] (const auto &cfg) { return std::make_unique(cfg); }, [] (const std::string &fname, SLAImportQuality quality, const ProgrFn &progr) { return std::make_unique(fname, quality, progr); } }, - { - "SL2", - "", - "sl1_svg", - {}, - [] (const auto &cfg) { return std::make_unique(cfg); }, - nullptr - }, anycubic_sla_format("pwmo", "Photon Mono"), anycubic_sla_format("pwmx", "Photon Mono X"), anycubic_sla_format("pwms", "Photon Mono SE"), @@ -85,28 +74,26 @@ public: }; } - static Registry& get_instance() +public: + + static const Registry& get_instance() { if (!registry) - registry = std::make_unique(); + registry.reset(new Registry()); return *registry; } - static std::set& get() + static const std::set& get() { return get_instance().entries; } - - std::set& get_entries() { return entries; } }; std::unique_ptr Registry::registry = nullptr; -std::set registered_sla_archives() +const std::set& registered_sla_archives() { - std::lock_guard lk{arch_mtx}; - return Registry::get(); } @@ -123,8 +110,6 @@ std::vector get_extensions(const ArchiveEntry &entry) ArchiveWriterFactory get_writer_factory(const char *formatid) { - std::lock_guard lk{arch_mtx}; - ArchiveWriterFactory ret; auto entry = Registry::get().find(ArchiveEntry{formatid}); if (entry != Registry::get().end()) @@ -135,7 +120,6 @@ ArchiveWriterFactory get_writer_factory(const char *formatid) ArchiveReaderFactory get_reader_factory(const char *formatid) { - std::lock_guard lk{arch_mtx}; ArchiveReaderFactory ret; auto entry = Registry::get().find(ArchiveEntry{formatid}); @@ -145,4 +129,28 @@ ArchiveReaderFactory get_reader_factory(const char *formatid) return ret; } +const char *get_default_extension(const char *formatid) +{ + static constexpr const char *Empty = ""; + + const char * ret = Empty; + + auto entry = Registry::get().find(ArchiveEntry{formatid}); + if (entry != Registry::get().end()) + ret = entry->ext; + + return ret; +} + +const ArchiveEntry * get_archive_entry(const char *formatid) +{ + const ArchiveEntry *ret = nullptr; + + auto entry = Registry::get().find(ArchiveEntry{formatid}); + if (entry != Registry::get().end()) + ret = &(*entry); + + return ret; +} + } // namespace Slic3r::sla diff --git a/src/libslic3r/Format/SLAArchiveFormatRegistry.hpp b/src/libslic3r/Format/SLAArchiveFormatRegistry.hpp index fb1a18ca52..896888bd59 100644 --- a/src/libslic3r/Format/SLAArchiveFormatRegistry.hpp +++ b/src/libslic3r/Format/SLAArchiveFormatRegistry.hpp @@ -48,9 +48,9 @@ struct ArchiveEntry { : id{formatid} , desc{description} , ext{extension} - , ext_aliases{extaliases} , wrfactoryfn{wrfn} , rdfactoryfn{rdfn} + , ext_aliases{extaliases} {} bool operator <(const ArchiveEntry &other) const @@ -61,8 +61,10 @@ struct ArchiveEntry { std::vector get_extensions(const ArchiveEntry &entry); -std::set registered_sla_archives(); +const std::set& registered_sla_archives(); +const ArchiveEntry * get_archive_entry(const char *formatid); +const char * get_default_extension(const char *formatid); ArchiveWriterFactory get_writer_factory(const char *formatid); ArchiveReaderFactory get_reader_factory(const char *formatid); diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 54177d2135..d65e0aa9ff 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1296,8 +1296,12 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato this->placeholder_parser().set("first_layer_print_min", new ConfigOptionFloats({ bbox.min.x(), bbox.min.y() })); this->placeholder_parser().set("first_layer_print_max", new ConfigOptionFloats({ bbox.max.x(), bbox.max.y() })); this->placeholder_parser().set("first_layer_print_size", new ConfigOptionFloats({ bbox.size().x(), bbox.size().y() })); - - std::vector is_extruder_used(print.config().nozzle_diameter.size(), 0); + this->placeholder_parser().set("num_extruders", int(print.config().nozzle_diameter.values.size())); + // PlaceholderParser currently substitues non-existent vector values with the zero'th value, which is harmful in the case of "is_extruder_used[]" + // as Slicer may lie about availability of such non-existent extruder. + // We rather sacrifice 256B of memory before we change the behavior of the PlaceholderParser, which should really only fill in the non-existent + // vector elements for filament parameters. + std::vector is_extruder_used(std::max(size_t(255), print.config().nozzle_diameter.size()), 0); for (unsigned int extruder_id : tool_ordering.all_extruders()) is_extruder_used[extruder_id] = true; this->placeholder_parser().set("is_extruder_used", new ConfigOptionBools(is_extruder_used)); diff --git a/src/libslic3r/GCodeReader.cpp b/src/libslic3r/GCodeReader.cpp index a45ea8439e..cb0366757a 100644 --- a/src/libslic3r/GCodeReader.cpp +++ b/src/libslic3r/GCodeReader.cpp @@ -243,9 +243,10 @@ bool GCodeReader::GCodeLine::has_value(char axis, float &value) const if (c == nullptr) return false; // Try to parse the numeric value. - char *pend = nullptr; - double v = strtod(++ c, &pend); - if (pend != nullptr && is_end_of_word(*pend)) { + double v = 0.; + const char* end = m_raw.c_str() + m_raw.size(); + auto [pend, ec] = fast_float::from_chars(++c, end, v); + if (pend != c && is_end_of_word(*pend)) { // The axis value has been parsed correctly. value = float(v); return true; diff --git a/src/libslic3r/PlaceholderParser.cpp b/src/libslic3r/PlaceholderParser.cpp index 786f4093ca..40126421c4 100644 --- a/src/libslic3r/PlaceholderParser.cpp +++ b/src/libslic3r/PlaceholderParser.cpp @@ -1090,6 +1090,7 @@ namespace client static void scalar_variable_assign_scalar(const MyContext *ctx, OptWithPos &lhs, const expr &rhs) { + assert(! ctx->skipping()); assert(lhs.opt->is_scalar()); check_writable(ctx, lhs); ConfigOption *wropt = const_cast(lhs.opt); @@ -1121,6 +1122,7 @@ namespace client static void vector_variable_element_assign_scalar(const MyContext *ctx, OptWithPos &lhs, const expr &rhs) { + assert(! ctx->skipping()); assert(lhs.opt->is_vector()); check_writable(ctx, lhs); if (! lhs.has_index()) @@ -1158,6 +1160,7 @@ namespace client static void vector_variable_assign_expr_with_count(const MyContext *ctx, OptWithPos &lhs, const expr &rhs_count, const expr &rhs_value) { + assert(! ctx->skipping()); size_t count = evaluate_count(rhs_count); auto *opt = const_cast(lhs.opt); switch (lhs.opt->type()) { diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index c62e274000..8d53dbb5a8 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1541,6 +1541,7 @@ std::string Print::output_filename(const std::string &filename_base) const // These values will be just propagated into the output file name. DynamicConfig config = this->finished() ? this->print_statistics().config() : this->print_statistics().placeholders(); config.set_key_value("num_extruders", new ConfigOptionInt((int)m_config.nozzle_diameter.size())); + config.set_key_value("default_output_extension", new ConfigOptionString(".gcode")); return this->PrintBase::output_filename(m_config.output_filename_format.value, ".gcode", filename_base, &config); } diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index ca8aa76d35..3da804066b 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1983,7 +1983,7 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("You can use all configuration options as variables inside this template. " "For example: [layer_height], [fill_density] etc. You can also use [timestamp], " "[year], [month], [day], [hour], [minute], [second], [version], [input_filename], " - "[input_filename_base]."); + "[input_filename_base], [default_output_extension]."); def->full_width = true; def->mode = comExpert; def->set_default_value(new ConfigOptionString("[input_filename_base].gcode")); @@ -4982,21 +4982,21 @@ std::string get_sla_suptree_prefix(const DynamicPrintConfig &config) return slatree; } -static bool is_XL_printer(const std::string& printer_model) +static bool is_XL_printer(const std::string& printer_notes) { - static constexpr const char *ALIGN_ONLY_FOR = "XL"; - return boost::algorithm::contains(printer_model, ALIGN_ONLY_FOR); + return boost::algorithm::contains(printer_notes, "PRINTER_VENDOR_PRUSA3D") + && boost::algorithm::contains(printer_notes, "PRINTER_MODEL_XL"); } bool is_XL_printer(const DynamicPrintConfig &cfg) { - auto *printer_model = cfg.opt("printer_model"); - return printer_model && is_XL_printer(printer_model->value); + auto *printer_notes = cfg.opt("printer_notes"); + return printer_notes && is_XL_printer(printer_notes->value); } bool is_XL_printer(const PrintConfig &cfg) { - return is_XL_printer(cfg.printer_model.value); + return is_XL_printer(cfg.printer_notes.value); } } // namespace Slic3r diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 1598cd46b2..9df2862a19 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -4,6 +4,8 @@ #include "CSGMesh/PerformCSGMeshBooleans.hpp" #include "format.hpp" +#include "Format/SLAArchiveFormatRegistry.hpp" + #include "Geometry.hpp" #include "Thread.hpp" @@ -522,6 +524,7 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con #endif /* _DEBUG */ m_full_print_config = std::move(config); + return static_cast(apply_status); } @@ -531,7 +534,16 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con std::string SLAPrint::output_filename(const std::string &filename_base) const { DynamicConfig config = this->finished() ? this->print_statistics().config() : this->print_statistics().placeholders(); - return this->PrintBase::output_filename(m_print_config.output_filename_format.value, ".sl1", filename_base, &config); + std::string default_ext = get_default_extension(m_printer_config.sla_archive_format.value.c_str()); + if (default_ext.empty()) + default_ext = "sl1"; + + default_ext.insert(default_ext.begin(), '.'); + + config.set_key_value("default_output_extension", + new ConfigOptionString(default_ext)); + + return this->PrintBase::output_filename(m_print_config.output_filename_format.value, default_ext, filename_base, &config); } std::string SLAPrint::validate(std::vector*) const diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 8773b15a4a..275a5f8643 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -7525,6 +7525,7 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state) wxGetApp().CallAfter([obj_idx, layer_id]() { wxGetApp().plater()->set_preview_layers_slider_values_range(0, layer_id - 1); wxGetApp().plater()->select_view_3D("3D"); + wxGetApp().plater()->canvas3D()->reset_all_gizmos(); wxGetApp().plater()->canvas3D()->get_selection().add_object(obj_idx, true); wxGetApp().obj_list()->update_selections(); }); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index ec7f43ae11..1bd477e73d 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -54,6 +54,7 @@ #include "libslic3r/Model.hpp" #include "libslic3r/PresetBundle.hpp" #include "libslic3r/Color.hpp" +#include "libslic3r/Format/SLAArchiveFormatRegistry.hpp" #include "GUI.hpp" #include "GUI_Utils.hpp" @@ -490,15 +491,13 @@ static const FileWildcards file_wildcards_by_type[FT_SIZE] = { /* FT_TEX */ { "Texture"sv, { ".png"sv, ".svg"sv } }, - /* FT_SL1 */ { "Masked SLA files"sv, { ".sl1"sv, ".sl1s"sv, ".pwmx"sv } }, + /* FT_SL1 (deprecated, overriden by sla_wildcards) */ { "Masked SLA files"sv, { ".sl1"sv, ".sl1s"sv, ".pwmx"sv } }, /* FT_ZIP */ { "Zip files"sv, { ".zip"sv } }, }; -#if ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR -wxString file_wildcards(FileType file_type) +static wxString file_wildcards(const FileWildcards& data) { - const FileWildcards& data = file_wildcards_by_type[file_type]; std::string title; std::string mask; @@ -532,6 +531,14 @@ wxString file_wildcards(FileType file_type) return ret; } + +#if ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR +wxString file_wildcards(FileType file_type) +{ + const FileWildcards& data = file_wildcards_by_type[file_type]; + + return file_wildcards(data); +} #else // This function produces a Win32 file dialog file template mask to be consumed by wxWidgets on all platforms. // The function accepts a custom extension parameter. If the parameter is provided, the custom extension @@ -590,6 +597,34 @@ wxString file_wildcards(FileType file_type, const std::string &custom_extension) } #endif // ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR +wxString sla_wildcards(const char *formatid) +{ + const ArchiveEntry *entry = get_archive_entry(formatid); + wxString ret; + + if (entry) { + FileWildcards wc; + std::string tr_title = I18N::translate_utf8(entry->desc); + tr_title = GUI::format(_u8L("%s files"), tr_title); + wc.title = tr_title; + + std::vector exts = get_extensions(*entry); + + wc.file_extensions.reserve(exts.size()); + for (std::string &ext : exts) { + ext.insert(ext.begin(), '.'); + wc.file_extensions.emplace_back(ext); + } + + ret = file_wildcards(wc); + } + + if (ret.empty()) + ret = file_wildcards(FT_SL1); + + return ret; +} + static std::string libslic3r_translate_callback(const char *s) { return wxGetTranslation(wxString(s, wxConvUTF8)).utf8_str().data(); } #ifdef WIN32 @@ -924,9 +959,9 @@ void GUI_App::init_app_config() { // Profiles for the alpha are stored into the PrusaSlicer-alpha directory to not mix with the current release. -// SetAppName(SLIC3R_APP_KEY); + SetAppName(SLIC3R_APP_KEY); // SetAppName(SLIC3R_APP_KEY "-alpha"); - SetAppName(SLIC3R_APP_KEY "-beta"); +// SetAppName(SLIC3R_APP_KEY "-beta"); // SetAppDisplayName(SLIC3R_APP_NAME); diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 51900a9b61..6773806df2 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -84,6 +84,8 @@ extern wxString file_wildcards(FileType file_type); extern wxString file_wildcards(FileType file_type, const std::string &custom_extension = std::string{}); #endif // ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR +wxString sla_wildcards(const char *formatid); + enum ConfigMenuIDs { ConfigMenuWizard, ConfigMenuSnapshots, diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index da6b25a285..ac0189724f 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -4369,7 +4369,8 @@ void ObjectList::update_and_show_object_settings_item() const wxDataViewItem item = GetSelection(); if (!item) return; - const wxDataViewItem& obj_item = m_objects_model->IsSettingsItem(item) ? m_objects_model->GetParent(item) : item; + // To get object item use GetTopParent(item). This function guarantees return of item with itObject type + const wxDataViewItem obj_item = m_objects_model->GetTopParent(item); select_item([this, obj_item](){ return add_settings_item(obj_item, &get_item_config(obj_item).get()); }); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index aad118e0da..310e6b3f1b 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2043,7 +2043,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) "bed_shape", "bed_custom_texture", "bed_custom_model", "complete_objects", "duplicate_distance", "extruder_clearance_radius", "skirts", "skirt_distance", "brim_width", "brim_separation", "brim_type", "variable_layer_height", "nozzle_diameter", "single_extruder_multi_material", "wipe_tower", "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle", "wipe_tower_brim_width", "wipe_tower_cone_angle", "wipe_tower_extra_spacing", "wipe_tower_extruder", - "extruder_colour", "filament_colour", "material_colour", "max_print_height", "printer_model", "printer_technology", + "extruder_colour", "filament_colour", "material_colour", "max_print_height", "printer_model", "printer_notes", "printer_technology", // These values are necessary to construct SlicingParameters by the Canvas3D variable layer height editor. "layer_height", "first_layer_height", "min_layer_height", "max_layer_height", "brim_width", "perimeters", "perimeter_extruder", "fill_density", "infill_extruder", "top_solid_layers", @@ -6409,9 +6409,11 @@ void Plater::export_gcode(bool prefer_removable) start_dir, from_path(default_output_file.filename()), #if ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR - GUI::file_wildcards((printer_technology() == ptFFF) ? FT_GCODE : FT_SL1), + printer_technology() == ptFFF ? GUI::file_wildcards(FT_GCODE) : + GUI::sla_wildcards(p->sla_print.printer_config().sla_archive_format.value.c_str()), #else - GUI::file_wildcards((printer_technology() == ptFFF) ? FT_GCODE : FT_SL1, ext), + printer_technology() == ptFFF ? GUI::file_wildcards(FT_GCODE, ext) : + GUI::sla_wildcards(p->sla_print.printer_config().sla_archive_format.value.c_str()), #endif // ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 184b8af707..70632b543c 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2267,6 +2267,14 @@ void TabFilament::msw_rescale() Tab::msw_rescale(); } +void TabFilament::sys_color_changed() +{ + m_extruders_cb->Clear(); + update_extruder_combobox(); + + Tab::sys_color_changed(); +} + void TabFilament::load_current_preset() { assert(m_active_extruder >= 0 && m_active_extruder < m_preset_bundle->extruders_filaments.size()); diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 81344c6151..f0be456a5a 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -462,6 +462,7 @@ public: void update() override; void clear_pages() override; void msw_rescale() override; + void sys_color_changed() override; bool supports_printer_technology(const PrinterTechnology tech) const override { return tech == ptFFF; } void load_current_preset() override; diff --git a/version.inc b/version.inc index b8916bd685..2c397b5fa8 100644 --- a/version.inc +++ b/version.inc @@ -3,7 +3,7 @@ set(SLIC3R_APP_NAME "PrusaSlicer") set(SLIC3R_APP_KEY "PrusaSlicer") -set(SLIC3R_VERSION "2.6.0-beta4") +set(SLIC3R_VERSION "2.6.0-rc1") set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN") set(SLIC3R_RC_VERSION "2,6,0,0") set(SLIC3R_RC_VERSION_DOTS "2.6.0.0")