From fc453df38fee744b0ea9e60af51aafe136d7678e Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 4 Mar 2020 13:47:35 +0100 Subject: [PATCH 01/37] Implemented "Detach preset from system" button --- src/slic3r/GUI/OptionsGroup.cpp | 17 +++- src/slic3r/GUI/Tab.cpp | 151 ++++++++++++++++++++++---------- src/slic3r/GUI/Tab.hpp | 6 +- 3 files changed, 124 insertions(+), 50 deletions(-) diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index f0b108bd7e..d14bdd9a4d 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -113,7 +113,11 @@ void OptionsGroup::add_undo_buttuns_to_sizer(wxSizer* sizer, const t_field& fiel } void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = nullptr*/) { - if ( (line.sizer != nullptr || line.widget != nullptr) && line.full_width) { + if ( line.full_width && ( + line.sizer != nullptr || + line.widget != nullptr || + !line.get_extra_widgets().empty() ) + ) { if (line.sizer != nullptr) { sizer->Add(line.sizer, 0, wxEXPAND | wxALL, wxOSX ? 0 : 15); return; @@ -122,6 +126,17 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n sizer->Add(line.widget(this->ctrl_parent()), 0, wxEXPAND | wxALL, wxOSX ? 0 : 15); return; } + if (!line.get_extra_widgets().empty()) { + const auto h_sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(h_sizer, 1, wxEXPAND | wxALL, wxOSX ? 0 : 15); + + bool is_first_item = true; + for (auto extra_widget : line.get_extra_widgets()) { + h_sizer->Add(extra_widget(this->ctrl_parent()), is_first_item ? 1 : 0, wxLEFT, 15); + is_first_item = false; + } + return; + } } auto option_set = line.get_options(); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index ac141caa49..a2e5c665ab 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -754,10 +754,17 @@ void Tab::update_visibility() { Freeze(); // There is needed Freeze/Thaw to avoid a flashing after Show/Layout + // m_detach_preset_btn will be shown always after call page->update_visibility() + // So let save a "show state" of m_detach_preset_btn before update_visibility + bool was_shown = m_detach_preset_btn->IsShown(); + for (auto page : m_pages) page->update_visibility(m_mode); update_page_tree_visibility(); + // update visibility for detach_preset_btn + m_detach_preset_btn->Show(was_shown); + Layout(); Thaw(); } @@ -942,6 +949,71 @@ void Tab::on_presets_changed() m_dependent_tabs.clear(); } +void Tab::detach_preset(Preset& preset) +{ + preset.inherits().clear(); + preset.renamed_from.clear(); + preset.vendor = nullptr; + + update_ui_items_related_on_parent_preset(m_presets->get_selected_preset_parent()); + + update_dirty(); + reload_config(); + update(); +} + +void Tab::build_preset_description_line(ConfigOptionsGroup* optgroup) +{ + auto description_line = [this](wxWindow* parent) { + return description_line_widget(parent, &m_parent_preset_description_line); + }; + + auto detach_preset_btn = [this](wxWindow* parent) { + add_scaled_button(parent, &m_detach_preset_btn, "lock_open_sys", _(L("Detach from system preset")), wxBU_LEFT | wxBU_EXACTFIT); + ScalableButton* btn = m_detach_preset_btn; + btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); + + auto sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(btn); + + btn->Bind(wxEVT_BUTTON, [this, parent](wxCommandEvent&) + { + wxString msg_text; + + if (m_presets->get_edited_preset().is_system) + msg_text = _(L("You want to detach system preset. \n" + "New preset will be created as a copy of the current preset.\n" + "Created preset will be detached from system parent preset.")) + "\n\n"; + else + msg_text = _(L("You want to detach current custom preset from the system parent preset. \n" + "This action is not revertable.")) + "\n\n"; + + msg_text += _(L("Are you sure you want to continue?")); + + wxMessageDialog dialog(parent, msg_text, _(L("Detach preset")), wxICON_WARNING | wxYES_NO); + + if (dialog.ShowModal() == wxID_YES) + { + if (m_presets->get_edited_preset().is_system) + save_preset("", _utf8(L("Detached"))); + + detach_preset(m_presets->get_edited_preset()); + } + }); + + btn->Hide(); + + return sizer; + }; + + Line line = Line{ "", "" }; + line.full_width = 1; + + line.append_widget(description_line); + line.append_widget(detach_preset_btn); + optgroup->append_line(line); +} + void Tab::update_preset_description_line() { const Preset* parent = m_presets->get_selected_preset_parent(); @@ -1008,14 +1080,18 @@ void Tab::update_preset_description_line() default: break; } } - else + else if (!preset.alias.empty()) { - description_line += "\n\n\t" + _(L("full profile name")) + ": \n\t\t" + parent->name; - description_line += "\n\t" + _(L("symbolic profile name")) + ": \n\t\t" + parent->alias; + description_line += "\n\n\t" + _(L("full profile name")) + ": \n\t\t" + preset.name; + description_line += "\n\t" + _(L("symbolic profile name")) + ": \n\t\t" + preset.alias; } } m_parent_preset_description_line->SetText(description_line, false); + + if (m_detach_preset_btn) + m_detach_preset_btn->Show(parent && parent->is_system && !preset.is_default); + Layout(); } void Tab::update_frequently_changed_parameters() @@ -1266,12 +1342,7 @@ void TabPrint::build() option.opt.full_width = true; optgroup->append_single_option_line(option); - line = Line{ "", "" }; - line.full_width = 1; - line.widget = [this](wxWindow* parent) { - return description_line_widget(parent, &m_parent_preset_description_line); - }; - optgroup->append_line(line); + build_preset_description_line(optgroup.get()); } // Reload current config (aka presets->edited_preset->config) into the UI fields. @@ -1566,12 +1637,7 @@ void TabFilament::build() option.opt.full_width = true; optgroup->append_single_option_line(option); - line = Line{ "", "" }; - line.full_width = 1; - line.widget = [this](wxWindow* parent) { - return description_line_widget(parent, &m_parent_preset_description_line); - }; - optgroup->append_line(line); + build_preset_description_line(optgroup.get()); } // Reload current config (aka presets->edited_preset->config) into the UI fields. @@ -2018,12 +2084,8 @@ void TabPrinter::build_fff() page = add_options_page(_(L("Dependencies")), "wrench.png"); optgroup = page->new_optgroup(_(L("Profile dependencies"))); - line = Line{ "", "" }; - line.full_width = 1; - line.widget = [this](wxWindow* parent) { - return description_line_widget(parent, &m_parent_preset_description_line); - }; - optgroup->append_line(line); + + build_preset_description_line(optgroup.get()); build_unregular_pages(); @@ -2134,12 +2196,8 @@ void TabPrinter::build_sla() page = add_options_page(_(L("Dependencies")), "wrench.png"); optgroup = page->new_optgroup(_(L("Profile dependencies"))); - line = Line{ "", "" }; - line.full_width = 1; - line.widget = [this](wxWindow* parent) { - return description_line_widget(parent, &m_parent_preset_description_line); - }; - optgroup->append_line(line); + + build_preset_description_line(optgroup.get()); } void TabPrinter::update_serial_ports() @@ -2602,6 +2660,15 @@ void TabPrinter::update_fff() void TabPrinter::update_sla() { ; } +void Tab::update_ui_items_related_on_parent_preset(const Preset* selected_preset_parent) +{ + m_is_default_preset = selected_preset_parent != nullptr && selected_preset_parent->is_default; + + m_bmp_non_system = selected_preset_parent ? &m_bmp_value_unlock : &m_bmp_white_bullet; + m_ttg_non_system = selected_preset_parent ? &m_ttg_value_unlock : &m_ttg_white_bullet_ns; + m_tt_non_system = selected_preset_parent ? &m_tt_value_unlock : &m_ttg_white_bullet_ns; +} + // Initialize the UI from the current preset void Tab::load_current_preset() { @@ -2620,12 +2687,7 @@ void Tab::load_current_preset() // Reload preset pages with the new configuration values. reload_config(); - const Preset* selected_preset_parent = m_presets->get_selected_preset_parent(); - m_is_default_preset = selected_preset_parent != nullptr && selected_preset_parent->is_default; - - m_bmp_non_system = selected_preset_parent ? &m_bmp_value_unlock : &m_bmp_white_bullet; - m_ttg_non_system = selected_preset_parent ? &m_ttg_value_unlock : &m_ttg_white_bullet_ns; - m_tt_non_system = selected_preset_parent ? &m_tt_value_unlock : &m_ttg_white_bullet_ns; + update_ui_items_related_on_parent_preset(m_presets->get_selected_preset_parent()); // m_undo_to_sys_btn->Enable(!preset.is_default); @@ -3031,18 +3093,21 @@ void Tab::OnKeyDown(wxKeyEvent& event) // and activates the new preset. // Wizard calls save_preset with a name "My Settings", otherwise no name is provided and this method // opens a Slic3r::GUI::SavePresetWindow dialog. -void Tab::save_preset(std::string name /*= ""*/) +void Tab::save_preset(std::string name /*= ""*/, std::string suffix/* = ""*/) { // since buttons(and choices too) don't get focus on Mac, we set focus manually // to the treectrl so that the EVT_* events are fired for the input field having // focus currently.is there anything better than this ? //! m_treectrl->OnSetFocus(); + if (suffix.empty()) + suffix = _CTX_utf8(L_CONTEXT("Copy", "PresetName"), "PresetName"); + if (name.empty()) { const Preset &preset = m_presets->get_selected_preset(); auto default_name = preset.is_default ? "Untitled" : -// preset.is_system ? (boost::format(_utf8(L("%1% - Copy"))) % preset.name).str() : - preset.is_system ? (boost::format(_CTX_utf8(L_CONTEXT("%1% - Copy", "PresetName"), "PresetName")) % preset.name).str() : +// preset.is_system ? (boost::format(_CTX_utf8(L_CONTEXT("%1% - Copy", "PresetName"), "PresetName")) % preset.name).str() : + preset.is_system ? (boost::format(("%1% - %2%")) % preset.name % suffix).str() : preset.name; bool have_extention = boost::iends_with(default_name, ".ini"); @@ -3560,12 +3625,7 @@ void TabSLAMaterial::build() option.opt.full_width = true; optgroup->append_single_option_line(option); - line = Line{ "", "" }; - line.full_width = 1; - line.widget = [this](wxWindow* parent) { - return description_line_widget(parent, &m_parent_preset_description_line); - }; - optgroup->append_line(line); + build_preset_description_line(optgroup.get()); } // Reload current config (aka presets->edited_preset->config) into the UI fields. @@ -3682,12 +3742,7 @@ void TabSLAPrint::build() option.opt.full_width = true; optgroup->append_single_option_line(option); - line = Line{ "", "" }; - line.full_width = 1; - line.widget = [this](wxWindow* parent) { - return description_line_widget(parent, &m_parent_preset_description_line); - }; - optgroup->append_line(line); + build_preset_description_line(optgroup.get()); } // Reload current config (aka presets->edited_preset->config) into the UI fields. diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index c3016fa04c..987f715a88 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -227,6 +227,7 @@ public: PresetCollection* m_presets; DynamicPrintConfig* m_config; ogStaticText* m_parent_preset_description_line; + ScalableButton* m_detach_preset_btn = nullptr; wxStaticText* m_colored_Label = nullptr; // Counter for the updating (because of an update() function can have a recursive behavior): // 1. increase value from the very beginning of an update() function @@ -253,6 +254,7 @@ public: const wxString& label = wxEmptyString, long style = wxBU_EXACTFIT | wxNO_BORDER); void add_scaled_bitmap(wxWindow* parent, ScalableBitmap& btn, const std::string& icon_name); + void update_ui_items_related_on_parent_preset(const Preset* selected_preset_parent); void load_current_preset(); void rebuild_page_tree(); void update_page_tree_visibility(); @@ -264,7 +266,7 @@ public: void OnTreeSelChange(wxTreeEvent& event); void OnKeyDown(wxKeyEvent& event); - void save_preset(std::string name = ""); + void save_preset(std::string name = "", std::string suffix = ""); void delete_preset(); void toggle_show_hide_incompatible(); void update_show_hide_incompatible_button(); @@ -311,6 +313,8 @@ protected: void load_key_value(const std::string& opt_key, const boost::any& value, bool saved_value = false); void on_presets_changed(); + void detach_preset(Preset& preset); + void build_preset_description_line(ConfigOptionsGroup* optgroup); void update_preset_description_line(); void update_frequently_changed_parameters(); void fill_icon_descriptions(); From 57f3f299cdec6f9293931ce6dbe3b84ea44c2127 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 4 Mar 2020 20:58:14 +0100 Subject: [PATCH 02/37] Fixed 2 bugs : 1. "Revert" buttons on the bar don't work for a "Compatible printers" and a "Compatible prints profiles". And cause a crash if they are pressed in Print(SLA) Settings. 2. A label of a "Compatible printers" option is always black in Filament(Materials) Settings Tab --- src/slic3r/GUI/OptionsGroup.cpp | 6 +- src/slic3r/GUI/Tab.cpp | 179 +++++++++++++++----------------- src/slic3r/GUI/Tab.hpp | 9 +- 3 files changed, 93 insertions(+), 101 deletions(-) diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index d14bdd9a4d..207d42b5b3 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -427,7 +427,9 @@ void ConfigOptionsGroup::back_to_config_value(const DynamicPrintConfig& config, auto *nozzle_diameter = dynamic_cast(config.option("nozzle_diameter")); value = int(nozzle_diameter->values.size()); } - else if (m_opt_map.find(opt_key) == m_opt_map.end() || opt_key == "bed_shape") { + else if (m_opt_map.find(opt_key) == m_opt_map.end() || + // This option don't have corresponded field + opt_key == "bed_shape" || opt_key == "compatible_printers" || opt_key == "compatible_prints" ) { value = get_config_value(config, opt_key); change_opt_value(*m_config, opt_key, value); return; @@ -644,7 +646,7 @@ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config ret = static_cast(config.opt_string(opt_key)); break; case coStrings: - if (opt_key.compare("compatible_printers") == 0) { + if (opt_key == "compatible_printers" || opt_key == "compatible_prints") { ret = config.option(opt_key)->values; break; } diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index a2e5c665ab..337815cea5 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -359,9 +359,10 @@ void Tab::update_labels_colour() color = &m_modified_label_clr; } if (opt.first == "bed_shape" || opt.first == "compatible_prints" || opt.first == "compatible_printers") { - if (m_colored_Label != nullptr) { - m_colored_Label->SetForegroundColour(*color); - m_colored_Label->Refresh(true); + wxStaticText* label = (m_colored_Labels.find(opt.first) == m_colored_Labels.end()) ? nullptr : m_colored_Labels.at(opt.first); + if (label) { + label->SetForegroundColour(*color); + label->Refresh(true); } continue; } @@ -449,9 +450,10 @@ void Tab::update_changed_ui() tt = &m_tt_white_bullet; } if (opt.first == "bed_shape" || opt.first == "compatible_prints" || opt.first == "compatible_printers") { - if (m_colored_Label != nullptr) { - m_colored_Label->SetForegroundColour(*color); - m_colored_Label->Refresh(true); + wxStaticText* label = (m_colored_Labels.find(opt.first) == m_colored_Labels.end()) ? nullptr : m_colored_Labels.at(opt.first); + if (label) { + label->SetForegroundColour(*color); + label->Refresh(true); } continue; } @@ -668,7 +670,8 @@ void Tab::on_roll_back_value(const bool to_sys /*= true*/) } if (group->title == _("Profile dependencies")) { - if (m_type != Slic3r::Preset::TYPE_PRINTER && (m_options_list["compatible_printers"] & os) == 0) { + // "compatible_printers" option doesn't exists in Printer Settimgs Tab + if (m_type != Preset::TYPE_PRINTER && (m_options_list["compatible_printers"] & os) == 0) { to_sys ? group->back_to_sys_value("compatible_printers") : group->back_to_initial_value("compatible_printers"); load_key_value("compatible_printers", true/*some value*/, true); @@ -676,7 +679,8 @@ void Tab::on_roll_back_value(const bool to_sys /*= true*/) m_compatible_printers.checkbox->SetValue(is_empty); is_empty ? m_compatible_printers.btn->Disable() : m_compatible_printers.btn->Enable(); } - if ((m_type == Slic3r::Preset::TYPE_PRINT || m_type == Slic3r::Preset::TYPE_SLA_PRINT) && (m_options_list["compatible_prints"] & os) == 0) { + // "compatible_prints" option exists only in Filament Settimgs and Materials Tabs + if ((m_type == Preset::TYPE_FILAMENT || m_type == Preset::TYPE_SLA_MATERIAL) && (m_options_list["compatible_prints"] & os) == 0) { to_sys ? group->back_to_sys_value("compatible_prints") : group->back_to_initial_value("compatible_prints"); load_key_value("compatible_prints", true/*some value*/, true); @@ -1333,11 +1337,11 @@ void TabPrint::build() page = add_options_page(_(L("Dependencies")), "wrench.png"); optgroup = page->new_optgroup(_(L("Profile dependencies"))); - line = optgroup->create_single_option_line("compatible_printers"); - line.widget = [this](wxWindow* parent) { + + create_line_with_widget(optgroup.get(), "compatible_printers", [this](wxWindow* parent) { return compatible_widget_create(parent, m_compatible_printers); - }; - optgroup->append_line(line, &m_colored_Label); + }); + option = optgroup->get_option("compatible_printers_condition"); option.opt.full_width = true; optgroup->append_single_option_line(option); @@ -1618,21 +1622,18 @@ void TabFilament::build() page = add_options_page(_(L("Dependencies")), "wrench.png"); optgroup = page->new_optgroup(_(L("Profile dependencies"))); - - line = optgroup->create_single_option_line("compatible_printers"); - line.widget = [this](wxWindow* parent) { + create_line_with_widget(optgroup.get(), "compatible_printers", [this](wxWindow* parent) { return compatible_widget_create(parent, m_compatible_printers); - }; - optgroup->append_line(line, &m_colored_Label); + }); + option = optgroup->get_option("compatible_printers_condition"); option.opt.full_width = true; optgroup->append_single_option_line(option); - line = optgroup->create_single_option_line("compatible_prints"); - line.widget = [this](wxWindow* parent) { + create_line_with_widget(optgroup.get(), "compatible_prints", [this](wxWindow* parent) { return compatible_widget_create(parent, m_compatible_prints); - }; - optgroup->append_line(line, &m_colored_Label); + }); + option = optgroup->get_option("compatible_prints_condition"); option.opt.full_width = true; optgroup->append_single_option_line(option); @@ -1862,38 +1863,10 @@ void TabPrinter::build_fff() auto page = add_options_page(_(L("General")), "printer"); auto optgroup = page->new_optgroup(_(L("Size and coordinates"))); - Line line = optgroup->create_single_option_line("bed_shape");//{ _(L("Bed shape")), "" }; - line.widget = [this](wxWindow* parent) { - ScalableButton* btn; - add_scaled_button(parent, &btn, "printer_white", " " + _(L("Set")) + " " + dots, wxBU_LEFT | wxBU_EXACTFIT); - btn->SetFont(wxGetApp().normal_font()); + create_line_with_widget(optgroup.get(), "bed_shape", [this](wxWindow* parent) { + return create_bed_shape_widget(parent); + }); - auto sizer = new wxBoxSizer(wxHORIZONTAL); - sizer->Add(btn); - - btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) - { - BedShapeDialog dlg(this); - dlg.build_dialog(*m_config->option("bed_shape"), - *m_config->option("bed_custom_texture"), - *m_config->option("bed_custom_model")); - if (dlg.ShowModal() == wxID_OK) { - const std::vector& shape = dlg.get_shape(); - const std::string& custom_texture = dlg.get_custom_texture(); - const std::string& custom_model = dlg.get_custom_model(); - if (!shape.empty()) - { - load_key_value("bed_shape", shape); - load_key_value("bed_custom_texture", custom_texture); - load_key_value("bed_custom_model", custom_model); - update_changed_ui(); - } - } - })); - - return sizer; - }; - optgroup->append_line(line, &m_colored_Label); optgroup->append_single_option_line("max_print_height"); optgroup->append_single_option_line("z_offset"); @@ -2102,39 +2075,9 @@ void TabPrinter::build_sla() auto page = add_options_page(_(L("General")), "printer"); auto optgroup = page->new_optgroup(_(L("Size and coordinates"))); - Line line = optgroup->create_single_option_line("bed_shape");//{ _(L("Bed shape")), "" }; - line.widget = [this](wxWindow* parent) { - ScalableButton* btn; - add_scaled_button(parent, &btn, "printer_white", " " + _(L("Set")) + " " + dots, wxBU_LEFT | wxBU_EXACTFIT); - btn->SetFont(wxGetApp().normal_font()); - - - auto sizer = new wxBoxSizer(wxHORIZONTAL); - sizer->Add(btn); - - btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) - { - BedShapeDialog dlg(this); - dlg.build_dialog(*m_config->option("bed_shape"), - *m_config->option("bed_custom_texture"), - *m_config->option("bed_custom_model")); - if (dlg.ShowModal() == wxID_OK) { - const std::vector& shape = dlg.get_shape(); - const std::string& custom_texture = dlg.get_custom_texture(); - const std::string& custom_model = dlg.get_custom_model(); - if (!shape.empty()) - { - load_key_value("bed_shape", shape); - load_key_value("bed_custom_texture", custom_texture); - load_key_value("bed_custom_model", custom_model); - update_changed_ui(); - } - } - })); - - return sizer; - }; - optgroup->append_line(line, &m_colored_Label); + create_line_with_widget(optgroup.get(), "bed_shape", [this](wxWindow* parent) { + return create_bed_shape_widget(parent); + }); optgroup->append_single_option_line("max_print_height"); optgroup = page->new_optgroup(_(L("Display"))); @@ -2142,7 +2085,7 @@ void TabPrinter::build_sla() optgroup->append_single_option_line("display_height"); auto option = optgroup->get_option("display_pixels_x"); - line = { _(option.opt.full_label), "" }; + Line line = { _(option.opt.full_label), "" }; line.append_option(option); line.append_option(optgroup->get_option("display_pixels_y")); optgroup->append_line(line); @@ -3233,6 +3176,15 @@ void Tab::update_ui_from_settings() } } +void Tab::create_line_with_widget(ConfigOptionsGroup* optgroup, const std::string& opt_key, widget_t widget) +{ + Line line = optgroup->create_single_option_line(opt_key); + line.widget = widget; + + m_colored_Labels[opt_key] = nullptr; + optgroup->append_line(line, &m_colored_Labels[opt_key]); +} + // Return a callback to create a Tab widget to mark the preferences as compatible / incompatible to the current printer. wxSizer* Tab::compatible_widget_create(wxWindow* parent, PresetDependencies &deps) { @@ -3304,6 +3256,39 @@ wxSizer* Tab::compatible_widget_create(wxWindow* parent, PresetDependencies &dep return sizer; } +// Return a callback to create a TabPrinter widget to edit bed shape +wxSizer* TabPrinter::create_bed_shape_widget(wxWindow* parent) +{ + ScalableButton* btn; + add_scaled_button(parent, &btn, "printer_white", " " + _(L("Set")) + " " + dots, wxBU_LEFT | wxBU_EXACTFIT); + btn->SetFont(wxGetApp().normal_font()); + + auto sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(btn); + + btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) + { + BedShapeDialog dlg(this); + dlg.build_dialog(*m_config->option("bed_shape"), + *m_config->option("bed_custom_texture"), + *m_config->option("bed_custom_model")); + if (dlg.ShowModal() == wxID_OK) { + const std::vector& shape = dlg.get_shape(); + const std::string& custom_texture = dlg.get_custom_texture(); + const std::string& custom_model = dlg.get_custom_model(); + if (!shape.empty()) + { + load_key_value("bed_shape", shape); + load_key_value("bed_custom_texture", custom_texture); + load_key_value("bed_custom_model", custom_model); + update_changed_ui(); + } + } + })); + + return sizer; +} + void Tab::compatible_widget_reload(PresetDependencies &deps) { bool has_any = ! m_config->option(deps.key_list)->values.empty(); @@ -3607,20 +3592,19 @@ void TabSLAMaterial::build() page = add_options_page(_(L("Dependencies")), "wrench.png"); optgroup = page->new_optgroup(_(L("Profile dependencies"))); - Line line = optgroup->create_single_option_line("compatible_printers"); - line.widget = [this](wxWindow* parent) { + + create_line_with_widget(optgroup.get(), "compatible_printers", [this](wxWindow* parent) { return compatible_widget_create(parent, m_compatible_printers); - }; - optgroup->append_line(line, &m_colored_Label); + }); + option = optgroup->get_option("compatible_printers_condition"); option.opt.full_width = true; optgroup->append_single_option_line(option); - line = optgroup->create_single_option_line("compatible_prints"); - line.widget = [this](wxWindow* parent) { + create_line_with_widget(optgroup.get(), "compatible_prints", [this](wxWindow* parent) { return compatible_widget_create(parent, m_compatible_prints); - }; - optgroup->append_line(line, &m_colored_Label); + }); + option = optgroup->get_option("compatible_prints_condition"); option.opt.full_width = true; optgroup->append_single_option_line(option); @@ -3732,11 +3716,10 @@ void TabSLAPrint::build() page = add_options_page(_(L("Dependencies")), "wrench"); optgroup = page->new_optgroup(_(L("Profile dependencies"))); - Line line = optgroup->create_single_option_line("compatible_printers");//Line { _(L("Compatible printers")), "" }; - line.widget = [this](wxWindow* parent) { + + create_line_with_widget(optgroup.get(), "compatible_printers", [this](wxWindow* parent) { return compatible_widget_create(parent, m_compatible_printers); - }; - optgroup->append_line(line, &m_colored_Label); + }); option = optgroup->get_option("compatible_printers_condition"); option.opt.full_width = true; diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 987f715a88..d37645d7e6 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -228,7 +228,11 @@ public: DynamicPrintConfig* m_config; ogStaticText* m_parent_preset_description_line; ScalableButton* m_detach_preset_btn = nullptr; - wxStaticText* m_colored_Label = nullptr; + + // map of option name -> wxStaticText (colored label, associated with option) + // Used for options which don't have corresponded field + std::map m_colored_Labels; + // Counter for the updating (because of an update() function can have a recursive behavior): // 1. increase value from the very beginning of an update() function // 2. decrease value at the end of an update() function @@ -308,6 +312,7 @@ public: void update_wiping_button_visibility(); protected: + void create_line_with_widget(ConfigOptionsGroup* optgroup, const std::string& opt_key, widget_t widget); wxSizer* compatible_widget_create(wxWindow* parent, PresetDependencies &deps); void compatible_widget_reload(PresetDependencies &deps); void load_key_value(const std::string& opt_key, const boost::any& value, bool saved_value = false); @@ -410,6 +415,8 @@ public: void init_options_list() override; void msw_rescale() override; bool supports_printer_technology(const PrinterTechnology /* tech */) override { return true; } + + wxSizer* create_bed_shape_widget(wxWindow* parent); }; class TabSLAMaterial : public Tab From 8137f7c4d48fa2c5f63fc73c1ad55b07f1ba5715 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 5 Mar 2020 12:00:23 +0100 Subject: [PATCH 03/37] Added a missing include --- src/slic3r/GUI/Mouse3DController.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/Mouse3DController.hpp b/src/slic3r/GUI/Mouse3DController.hpp index 99c5511a51..5d6b5ba8cf 100644 --- a/src/slic3r/GUI/Mouse3DController.hpp +++ b/src/slic3r/GUI/Mouse3DController.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #include From ca55e8e6df7a3a34c8735e27391783bf62b4b008 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 5 Mar 2020 12:00:39 +0100 Subject: [PATCH 04/37] Fix of #3775 - wrong background color in ErrorDialog on macOS Sierra --- src/slic3r/GUI/MsgDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index d4a82a03d6..5b583ba2a3 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -81,7 +81,7 @@ ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &msg) html->SetMinSize(wxSize(40 * wxGetApp().em_unit(), -1)); wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); wxColour text_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT); - wxColour bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_FRAMEBK); // wxSYS_COLOUR_WINDOW + wxColour bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); auto text_clr_str = wxString::Format(wxT("#%02X%02X%02X"), text_clr.Red(), text_clr.Green(), text_clr.Blue()); auto bgr_clr_str = wxString::Format(wxT("#%02X%02X%02X"), bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue()); const int font_size = font.GetPointSize()-1; From e11b9b0fafdac6556924bc0c4b45ecabe8151399 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 5 Mar 2020 13:38:51 +0100 Subject: [PATCH 05/37] Added missed icon --- resources/icons/lock_open_sys.svg | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 resources/icons/lock_open_sys.svg diff --git a/resources/icons/lock_open_sys.svg b/resources/icons/lock_open_sys.svg new file mode 100644 index 0000000000..e0aef4ad2a --- /dev/null +++ b/resources/icons/lock_open_sys.svg @@ -0,0 +1,11 @@ + + + + + + + + From 04ebdd8b3fd88989a36d96386b90f822163fd55d Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 5 Mar 2020 13:59:20 +0100 Subject: [PATCH 06/37] localization: updated PrusaSlicer.pot --- resources/localization/PrusaSlicer.pot | 1962 ++++++++++++------------ 1 file changed, 987 insertions(+), 975 deletions(-) diff --git a/resources/localization/PrusaSlicer.pot b/resources/localization/PrusaSlicer.pot index 41c5577132..e44bf69b55 100644 --- a/resources/localization/PrusaSlicer.pot +++ b/resources/localization/PrusaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-02-27 14:12+0100\n" +"POT-Creation-Date: 2020-03-05 13:51+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,46 +18,46 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:291 +#: src/slic3r/GUI/AboutDialog.cpp:41 src/slic3r/GUI/AboutDialog.cpp:294 msgid "Portions copyright" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:127 src/slic3r/GUI/AboutDialog.cpp:256 +#: src/slic3r/GUI/AboutDialog.cpp:129 src/slic3r/GUI/AboutDialog.cpp:258 msgid "Copyright" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:129 +#: src/slic3r/GUI/AboutDialog.cpp:131 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:199 +#: src/slic3r/GUI/AboutDialog.cpp:201 #, possible-c-format msgid "About %s" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64 +#: src/slic3r/GUI/AboutDialog.cpp:233 src/slic3r/GUI/MainFrame.cpp:64 msgid "Version" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:258 +#: src/slic3r/GUI/AboutDialog.cpp:260 msgid "is licensed under the" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:259 +#: src/slic3r/GUI/AboutDialog.cpp:261 msgid "GNU Affero General Public License, version 3" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:260 +#: src/slic3r/GUI/AboutDialog.cpp:262 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:261 +#: src/slic3r/GUI/AboutDialog.cpp:263 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -71,56 +71,56 @@ msgid "" "not be affected." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:109 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:110 msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " "card is write locked?" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:113 msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " "problem with target device, please try exporting again or using different " "device. The corrupted output G-code is at %1%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:116 msgid "" "Renaming of the G-code after copying to the selected destination folder has " "failed. Current path is %1%.tmp. Please try exporting again." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:118 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:119 msgid "" "Copying of the temporary G-code has finished but the original code at %1% " "couldn't be opened during copy check. The output G-code is at %2%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:122 msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " "be opened during copy check. The output G-code is at %1%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:129 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:479 msgid "Running post-processing scripts" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:130 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:131 msgid "G-code file exported to %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:135 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:185 msgid "Slicing complete" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:181 msgid "Masked SLA file exported to %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:222 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:223 #, possible-c-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -128,15 +128,15 @@ msgid "" "and we would be glad if you reported it." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:480 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:481 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:506 msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2059 +#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2060 msgid "Shape" msgstr "" @@ -146,7 +146,7 @@ msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:77 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:160 -#: src/slic3r/GUI/Tab.cpp:2324 +#: src/slic3r/GUI/Tab.cpp:2326 msgid "Size" msgstr "" @@ -196,15 +196,15 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2484 #: src/libslic3r/PrintConfig.cpp:2623 src/libslic3r/PrintConfig.cpp:2632 #: src/libslic3r/PrintConfig.cpp:2641 src/libslic3r/PrintConfig.cpp:2651 -#: src/libslic3r/PrintConfig.cpp:2695 src/libslic3r/PrintConfig.cpp:2705 -#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2737 -#: src/libslic3r/PrintConfig.cpp:2747 src/libslic3r/PrintConfig.cpp:2757 -#: src/libslic3r/PrintConfig.cpp:2775 src/libslic3r/PrintConfig.cpp:2790 -#: src/libslic3r/PrintConfig.cpp:2804 src/libslic3r/PrintConfig.cpp:2815 -#: src/libslic3r/PrintConfig.cpp:2828 src/libslic3r/PrintConfig.cpp:2873 -#: src/libslic3r/PrintConfig.cpp:2883 src/libslic3r/PrintConfig.cpp:2892 -#: src/libslic3r/PrintConfig.cpp:2902 src/libslic3r/PrintConfig.cpp:2918 -#: src/libslic3r/PrintConfig.cpp:2942 +#: src/libslic3r/PrintConfig.cpp:2705 src/libslic3r/PrintConfig.cpp:2715 +#: src/libslic3r/PrintConfig.cpp:2727 src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2757 src/libslic3r/PrintConfig.cpp:2767 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2800 +#: src/libslic3r/PrintConfig.cpp:2814 src/libslic3r/PrintConfig.cpp:2825 +#: src/libslic3r/PrintConfig.cpp:2838 src/libslic3r/PrintConfig.cpp:2883 +#: src/libslic3r/PrintConfig.cpp:2893 src/libslic3r/PrintConfig.cpp:2902 +#: src/libslic3r/PrintConfig.cpp:2912 src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:2952 msgid "mm" msgstr "" @@ -240,7 +240,7 @@ msgid "Load..." msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269 -#: src/slic3r/GUI/Tab.cpp:3124 +#: src/slic3r/GUI/Tab.cpp:3126 msgid "Remove" msgstr "" @@ -336,7 +336,7 @@ msgid "" msgstr "" #: src/slic3r/GUI/ConfigManipulation.cpp:49 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1049 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1048 #: src/libslic3r/PrintConfig.cpp:71 msgid "Layer height" msgstr "" @@ -353,7 +353,7 @@ msgid "First layer height" msgstr "" #: src/slic3r/GUI/ConfigManipulation.cpp:81 -#, possible-c-format +#, no-c-format msgid "" "The Spiral Vase mode requires:\n" "- one perimeter\n" @@ -424,8 +424,8 @@ msgstr "" #: src/slic3r/GUI/ConfigManipulation.cpp:211 #: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:96 -#: src/slic3r/GUI/GUI_ObjectList.cpp:614 src/slic3r/GUI/Plater.cpp:527 -#: src/slic3r/GUI/Tab.cpp:1091 src/slic3r/GUI/Tab.cpp:1092 +#: src/slic3r/GUI/GUI_ObjectList.cpp:615 src/slic3r/GUI/Plater.cpp:527 +#: src/slic3r/GUI/Tab.cpp:1090 src/slic3r/GUI/Tab.cpp:1091 #: src/libslic3r/PrintConfig.cpp:203 src/libslic3r/PrintConfig.cpp:416 #: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:776 #: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:827 @@ -480,7 +480,7 @@ msgstr "" msgid "PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1521 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1533 msgid "print" msgstr "" @@ -488,11 +488,11 @@ msgstr "" msgid "filaments" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1525 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1537 msgid "printer" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:971 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:970 msgid "vendor" msgstr "" @@ -546,7 +546,7 @@ msgid "Standard" msgstr "" #: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573 -#: src/slic3r/GUI/Tab.cpp:3174 +#: src/slic3r/GUI/Tab.cpp:3176 msgid "All" msgstr "" @@ -662,9 +662,9 @@ msgid "" "an update is applied." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1664 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3956 src/slic3r/GUI/Plater.cpp:3225 -#: src/slic3r/GUI/Plater.cpp:3934 src/slic3r/GUI/Plater.cpp:3963 +#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1665 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3957 src/slic3r/GUI/Plater.cpp:3227 +#: src/slic3r/GUI/Plater.cpp:3936 src/slic3r/GUI/Plater.cpp:3965 msgid "Reload from disk" msgstr "" @@ -719,7 +719,7 @@ msgstr "" msgid "Firmware Type" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:891 src/slic3r/GUI/Tab.cpp:1947 +#: src/slic3r/GUI/ConfigWizard.cpp:891 src/slic3r/GUI/Tab.cpp:1949 msgid "Firmware" msgstr "" @@ -822,7 +822,7 @@ msgid "SLA Technology Printers" msgstr "" #: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1905 -#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:246 msgid "Notice" msgstr "" @@ -875,7 +875,7 @@ msgstr "" msgid "Filament Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2013 src/slic3r/GUI/GUI_ObjectList.cpp:3553 +#: src/slic3r/GUI/ConfigWizard.cpp:2013 src/slic3r/GUI/GUI_ObjectList.cpp:3554 msgid "Type:" msgstr "" @@ -1025,13 +1025,13 @@ msgid "Edit tick mark - Right click" msgstr "" #: src/slic3r/GUI/DoubleSlider.cpp:1134 src/slic3r/GUI/DoubleSlider.cpp:1170 -#: src/slic3r/GUI/GLCanvas3D.cpp:977 src/slic3r/GUI/GUI_ObjectList.cpp:1704 -#: src/slic3r/GUI/Tab.cpp:2320 src/libslic3r/GCode/PreviewData.cpp:445 +#: src/slic3r/GUI/GLCanvas3D.cpp:977 src/slic3r/GUI/GUI_ObjectList.cpp:1705 +#: src/slic3r/GUI/Tab.cpp:2322 src/libslic3r/GCode/PreviewData.cpp:445 #, possible-c-format msgid "Extruder %d" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1705 +#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1706 msgid "active" msgstr "" @@ -1039,7 +1039,7 @@ msgstr "" msgid "Switch code to Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1144 src/slic3r/GUI/GUI_ObjectList.cpp:1671 +#: src/slic3r/GUI/DoubleSlider.cpp:1144 src/slic3r/GUI/GUI_ObjectList.cpp:1672 msgid "Change extruder" msgstr "" @@ -1146,8 +1146,8 @@ msgstr "" #: src/slic3r/GUI/DoubleSlider.cpp:1917 msgid "" "Select YES if you want to delete all saved tool changes, \n" -"\tNO if you want all tool changes switch to color changes, \n" -"\tor CANCEL to leave it unchanged." +"NO if you want all tool changes switch to color changes, \n" +"or CANCEL to leave it unchanged." msgstr "" #: src/slic3r/GUI/DoubleSlider.cpp:1920 @@ -1200,7 +1200,7 @@ msgstr "" msgid "parameter name" msgstr "" -#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:580 +#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:581 msgid "N/A" msgstr "" @@ -1302,8 +1302,8 @@ msgstr "" msgid "Firmware image:" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1658 -#: src/slic3r/GUI/Tab.cpp:1721 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1657 +#: src/slic3r/GUI/Tab.cpp:1719 msgid "Browse" msgstr "" @@ -1336,7 +1336,7 @@ msgid "Advanced: Output log" msgstr "" #: src/slic3r/GUI/FirmwareDialog.cpp:852 -#: src/slic3r/GUI/Mouse3DController.cpp:364 +#: src/slic3r/GUI/Mouse3DController.cpp:336 #: src/slic3r/GUI/PrintHostDialogs.cpp:161 msgid "Close" msgstr "" @@ -1503,12 +1503,12 @@ msgid "Mirror Object" msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:2921 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:570 msgid "Gizmo-Move" msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:3001 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:564 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:572 msgid "Gizmo-Rotate" msgstr "" @@ -1542,19 +1542,19 @@ msgstr[1] "" msgid "Add..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4475 src/slic3r/GUI/GUI_ObjectList.cpp:1718 -#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953 -#: src/slic3r/GUI/Tab.cpp:3124 +#: src/slic3r/GUI/GLCanvas3D.cpp:4475 src/slic3r/GUI/GUI_ObjectList.cpp:1719 +#: src/slic3r/GUI/Plater.cpp:3933 src/slic3r/GUI/Plater.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3126 msgid "Delete" msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:4484 src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/Plater.cpp:4669 +#: src/slic3r/GUI/Plater.cpp:4671 msgid "Delete all" msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:157 -#: src/slic3r/GUI/Plater.cpp:2754 +#: src/slic3r/GUI/Plater.cpp:2756 msgid "Arrange" msgstr "" @@ -1570,12 +1570,12 @@ msgstr "" msgid "Paste" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4526 src/slic3r/GUI/Plater.cpp:3788 -#: src/slic3r/GUI/Plater.cpp:3800 src/slic3r/GUI/Plater.cpp:3940 +#: src/slic3r/GUI/GLCanvas3D.cpp:4526 src/slic3r/GUI/Plater.cpp:3790 +#: src/slic3r/GUI/Plater.cpp:3802 src/slic3r/GUI/Plater.cpp:3942 msgid "Add instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4537 src/slic3r/GUI/Plater.cpp:3942 +#: src/slic3r/GUI/GLCanvas3D.cpp:4537 src/slic3r/GUI/Plater.cpp:3944 msgid "Remove instance" msgstr "" @@ -1583,12 +1583,12 @@ msgstr "" msgid "Split to objects" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/GUI_ObjectList.cpp:1487 +#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/GUI_ObjectList.cpp:1488 msgid "Split to parts" msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/KBShortcutsDialog.cpp:130 -#: src/slic3r/GUI/MainFrame.cpp:581 +#: src/slic3r/GUI/MainFrame.cpp:592 msgid "Undo" msgstr "" @@ -1601,7 +1601,7 @@ msgid "Next Undo action: %1%" msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:4657 src/slic3r/GUI/KBShortcutsDialog.cpp:131 -#: src/slic3r/GUI/MainFrame.cpp:584 +#: src/slic3r/GUI/MainFrame.cpp:595 msgid "Redo" msgstr "" @@ -1617,29 +1617,29 @@ msgstr "" msgid "Selection-Remove from rectangle" msgstr "" -#: src/slic3r/GUI/GLCanvas3DManager.cpp:284 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:306 #, possible-c-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" "while OpenGL version %s, render %s, vendor %s was detected." msgstr "" -#: src/slic3r/GUI/GLCanvas3DManager.cpp:287 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:309 msgid "You may need to update your graphics card driver." msgstr "" -#: src/slic3r/GUI/GLCanvas3DManager.cpp:290 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:312 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw_renderer parameter." msgstr "" -#: src/slic3r/GUI/GLCanvas3DManager.cpp:292 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:314 msgid "Unsupported OpenGL version" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3402 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3412 msgid "Cut" msgstr "" @@ -1663,78 +1663,78 @@ msgstr "" msgid "Place on face" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 msgid "Hollow this object" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 msgid "Preview hollowed and drilled model" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 msgid "Offset" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 msgid "Quality" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 -#: src/libslic3r/PrintConfig.cpp:2934 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +#: src/libslic3r/PrintConfig.cpp:2944 msgid "Closing distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 msgid "Hole diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 msgid "Hole depth" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 msgid "Remove selected holes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 msgid "Remove all holes" msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 +msgid "Clipping of view" +msgstr "" + #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 -msgid "Clipping of view" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59 msgid "Reset direction" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 msgid "Show supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:421 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:423 msgid "Add drainage hole" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:539 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:541 msgid "Delete drainage hole" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:813 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:815 msgid "Hollowing parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:885 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:887 msgid "Change drainage hole diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:977 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:979 msgid "Hollow and drill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1059 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1061 msgid "Move drainage hole" msgstr "" @@ -1746,7 +1746,7 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517 -#: src/libslic3r/PrintConfig.cpp:3451 +#: src/libslic3r/PrintConfig.cpp:3461 msgid "Rotate" msgstr "" @@ -1754,194 +1754,194 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518 -#: src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3476 msgid "Scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 msgid "Head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 msgid "Lock supports under new islands" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1371 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1361 msgid "Remove selected points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 msgid "Remove all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1374 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 msgid "Apply changes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1375 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365 msgid "Discard changes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 msgid "Minimal points distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 -#: src/libslic3r/PrintConfig.cpp:2764 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Support points density" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1377 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 msgid "Auto-generate points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 msgid "Manual editing" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:494 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:484 msgid "Add support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:621 msgid "Delete support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:820 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:810 msgid "Change point head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:888 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:878 msgid "Support parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:996 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:986 msgid "SLA Support Points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1017 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1007 msgid "SLA gizmo turned on" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1045 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1035 msgid "Do you want to save your manually edited support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1046 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1036 msgid "Save changes?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1058 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048 msgid "SLA gizmo turned off" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1097 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1087 msgid "Move support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1196 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 msgid "Support points edit" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1258 msgid "Autogeneration will erase all manually edited points." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1259 msgid "Are you sure you want to do it?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 src/slic3r/GUI/GUI.cpp:251 -#: src/slic3r/GUI/Tab.cpp:3084 src/slic3r/GUI/WipeTowerDialog.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/Tab.cpp:3086 src/slic3r/GUI/WipeTowerDialog.cpp:45 #: src/slic3r/GUI/WipeTowerDialog.cpp:366 msgid "Warning" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 msgid "Autogenerate support points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1334 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1324 msgid "SLA gizmo keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1335 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1357 msgid "Left click" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353 msgid "Add point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354 msgid "Right click" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354 msgid "Remove point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1358 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1359 msgid "Drag" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355 msgid "Move point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356 msgid "Add point to selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1357 msgid "Remove point from selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1358 msgid "Select by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1359 msgid "Deselect by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1370 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1360 msgid "Select all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1362 msgid "Mouse wheel" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1362 msgid "Move clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1373 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 msgid "Reset clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1376 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 msgid "Switch to editing mode" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:489 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:497 msgid "Gizmo-Place on Face" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:563 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:571 msgid "Gizmo-Scale" msgstr "" @@ -1959,180 +1959,180 @@ msgstr "" msgid "Fatal error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:442 +#: src/slic3r/GUI/GUI_App.cpp:446 msgid "Changing of an application language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459 +#: src/slic3r/GUI/GUI_App.cpp:454 src/slic3r/GUI/GUI_App.cpp:463 msgid "Recreating" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:466 +#: src/slic3r/GUI/GUI_App.cpp:470 msgid "Loading of current presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:474 +#: src/slic3r/GUI/GUI_App.cpp:478 msgid "Loading of a mode view" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:555 +#: src/slic3r/GUI/GUI_App.cpp:559 msgid "Choose one file (3MF/AMF):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:567 +#: src/slic3r/GUI/GUI_App.cpp:571 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:629 +#: src/slic3r/GUI/GUI_App.cpp:633 msgid "Select the language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:629 +#: src/slic3r/GUI/GUI_App.cpp:633 msgid "Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:797 +#: src/slic3r/GUI/GUI_App.cpp:801 #, possible-c-format msgid "Run %s" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:800 +#: src/slic3r/GUI/GUI_App.cpp:804 msgid "&Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:800 +#: src/slic3r/GUI/GUI_App.cpp:804 msgid "Inspect / activate configuration snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:801 +#: src/slic3r/GUI/GUI_App.cpp:805 msgid "Take Configuration &Snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:801 +#: src/slic3r/GUI/GUI_App.cpp:805 msgid "Capture a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:802 +#: src/slic3r/GUI/GUI_App.cpp:806 msgid "Check for updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:802 +#: src/slic3r/GUI/GUI_App.cpp:806 msgid "Check for configuration updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:804 +#: src/slic3r/GUI/GUI_App.cpp:808 msgid "&Preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:810 +#: src/slic3r/GUI/GUI_App.cpp:814 msgid "Application preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:753 +#: src/slic3r/GUI/GUI_App.cpp:817 src/slic3r/GUI/wxExtensions.cpp:756 msgid "Simple" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:813 +#: src/slic3r/GUI/GUI_App.cpp:817 msgid "Simple View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:814 src/slic3r/GUI/GUI_ObjectList.cpp:104 -#: src/slic3r/GUI/GUI_ObjectList.cpp:622 src/slic3r/GUI/Tab.cpp:1087 -#: src/slic3r/GUI/Tab.cpp:1102 src/slic3r/GUI/Tab.cpp:1201 -#: src/slic3r/GUI/Tab.cpp:1204 src/slic3r/GUI/Tab.cpp:1470 -#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:3661 -#: src/slic3r/GUI/wxExtensions.cpp:754 src/libslic3r/PrintConfig.cpp:88 +#: src/slic3r/GUI/GUI_App.cpp:818 src/slic3r/GUI/GUI_ObjectList.cpp:104 +#: src/slic3r/GUI/GUI_ObjectList.cpp:623 src/slic3r/GUI/Tab.cpp:1086 +#: src/slic3r/GUI/Tab.cpp:1101 src/slic3r/GUI/Tab.cpp:1200 +#: src/slic3r/GUI/Tab.cpp:1203 src/slic3r/GUI/Tab.cpp:1469 +#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:3665 +#: src/slic3r/GUI/wxExtensions.cpp:757 src/libslic3r/PrintConfig.cpp:88 #: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:223 #: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:2276 #: src/libslic3r/PrintConfig.cpp:2448 msgid "Advanced" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:814 +#: src/slic3r/GUI/GUI_App.cpp:818 msgid "Advanced View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:755 +#: src/slic3r/GUI/GUI_App.cpp:819 src/slic3r/GUI/wxExtensions.cpp:758 msgid "Expert" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:815 +#: src/slic3r/GUI/GUI_App.cpp:819 msgid "Expert View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:820 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:820 +#: src/slic3r/GUI/GUI_App.cpp:824 #, possible-c-format msgid "%s View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:822 +#: src/slic3r/GUI/GUI_App.cpp:826 msgid "&Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:824 +#: src/slic3r/GUI/GUI_App.cpp:828 msgid "Flash printer &firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:824 +#: src/slic3r/GUI/GUI_App.cpp:828 msgid "Upload a firmware image into an Arduino based printer" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:839 +#: src/slic3r/GUI/GUI_App.cpp:843 msgid "Taking configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:839 +#: src/slic3r/GUI/GUI_App.cpp:843 msgid "Snapshot name" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:882 +#: src/slic3r/GUI/GUI_App.cpp:886 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:884 +#: src/slic3r/GUI/GUI_App.cpp:888 msgid "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:885 +#: src/slic3r/GUI/GUI_App.cpp:889 msgid "Language selection" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:908 +#: src/slic3r/GUI/GUI_App.cpp:912 msgid "&Configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:932 +#: src/slic3r/GUI/GUI_App.cpp:936 msgid "The presets on the following tabs were modified" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:932 src/slic3r/GUI/Tab.cpp:2946 +#: src/slic3r/GUI/GUI_App.cpp:936 src/slic3r/GUI/Tab.cpp:2948 msgid "Discard changes and continue anyway?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:935 +#: src/slic3r/GUI/GUI_App.cpp:939 msgid "Unsaved Presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2958 +#: src/slic3r/GUI/GUI_App.cpp:1088 src/slic3r/GUI/Tab.cpp:2960 msgid "It's impossible to print multi-part object(s) with SLA technology." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1085 +#: src/slic3r/GUI/GUI_App.cpp:1089 msgid "Please check and fix your object list." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2313 -#: src/slic3r/GUI/Tab.cpp:2960 +#: src/slic3r/GUI/GUI_App.cpp:1090 src/slic3r/GUI/Plater.cpp:2315 +#: src/slic3r/GUI/Tab.cpp:2962 msgid "Attention!" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1103 +#: src/slic3r/GUI/GUI_App.cpp:1107 msgid "Select a gcode file:" msgstr "" @@ -2153,7 +2153,7 @@ msgid "Add layer range" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:95 -#: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/libslic3r/PrintConfig.cpp:72 +#: src/slic3r/GUI/GUI_ObjectList.cpp:614 src/libslic3r/PrintConfig.cpp:72 #: src/libslic3r/PrintConfig.cpp:175 src/libslic3r/PrintConfig.cpp:184 #: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470 #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:890 @@ -2165,8 +2165,8 @@ msgid "Layers and Perimeters" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:97 -#: src/slic3r/GUI/GUI_ObjectList.cpp:615 src/slic3r/GUI/GUI_Preview.cpp:246 -#: src/slic3r/GUI/Tab.cpp:1120 src/slic3r/GUI/Tab.cpp:1121 +#: src/slic3r/GUI/GUI_ObjectList.cpp:616 src/slic3r/GUI/GUI_Preview.cpp:246 +#: src/slic3r/GUI/Tab.cpp:1119 src/slic3r/GUI/Tab.cpp:1120 #: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:370 #: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1866 #: src/libslic3r/PrintConfig.cpp:1872 src/libslic3r/PrintConfig.cpp:1880 @@ -2182,7 +2182,7 @@ msgid "Support material" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:101 -#: src/slic3r/GUI/GUI_ObjectList.cpp:619 src/libslic3r/PrintConfig.cpp:2252 +#: src/slic3r/GUI/GUI_ObjectList.cpp:620 src/libslic3r/PrintConfig.cpp:2252 #: src/libslic3r/PrintConfig.cpp:2260 msgid "Wipe options" msgstr "" @@ -2207,8 +2207,8 @@ msgstr "" msgid "Add support blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:616 -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/Tab.cpp:1145 +#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:617 +#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/Tab.cpp:1144 #: src/libslic3r/PrintConfig.cpp:235 src/libslic3r/PrintConfig.cpp:458 #: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1048 #: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1668 @@ -2217,15 +2217,15 @@ msgstr "" msgid "Speed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:617 -#: src/slic3r/GUI/Tab.cpp:1180 src/slic3r/GUI/Tab.cpp:1838 +#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:618 +#: src/slic3r/GUI/Tab.cpp:1179 src/slic3r/GUI/Tab.cpp:1840 #: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1002 #: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1737 #: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1965 msgid "Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:618 +#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:619 #: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555 #: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:1010 #: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1757 @@ -2233,38 +2233,38 @@ msgstr "" msgid "Extrusion Width" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/GUI_ObjectList.cpp:624 -#: src/slic3r/GUI/Plater.cpp:495 src/slic3r/GUI/Tab.cpp:3604 -#: src/slic3r/GUI/Tab.cpp:3605 src/libslic3r/PrintConfig.cpp:2614 +#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/GUI_ObjectList.cpp:625 +#: src/slic3r/GUI/Plater.cpp:495 src/slic3r/GUI/Tab.cpp:3606 +#: src/slic3r/GUI/Tab.cpp:3607 src/libslic3r/PrintConfig.cpp:2614 #: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2630 #: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2649 -#: src/libslic3r/PrintConfig.cpp:2675 src/libslic3r/PrintConfig.cpp:2682 -#: src/libslic3r/PrintConfig.cpp:2693 src/libslic3r/PrintConfig.cpp:2703 -#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2725 -#: src/libslic3r/PrintConfig.cpp:2735 src/libslic3r/PrintConfig.cpp:2744 -#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2765 -#: src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2685 src/libslic3r/PrintConfig.cpp:2692 +#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2713 +#: src/libslic3r/PrintConfig.cpp:2722 src/libslic3r/PrintConfig.cpp:2735 +#: src/libslic3r/PrintConfig.cpp:2745 src/libslic3r/PrintConfig.cpp:2754 +#: src/libslic3r/PrintConfig.cpp:2764 src/libslic3r/PrintConfig.cpp:2775 +#: src/libslic3r/PrintConfig.cpp:2783 msgid "Supports" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:107 src/slic3r/GUI/GUI_ObjectList.cpp:625 -#: src/slic3r/GUI/Plater.cpp:635 src/slic3r/GUI/Tab.cpp:3636 -#: src/slic3r/GUI/Tab.cpp:3637 src/libslic3r/PrintConfig.cpp:2781 -#: src/libslic3r/PrintConfig.cpp:2788 src/libslic3r/PrintConfig.cpp:2802 -#: src/libslic3r/PrintConfig.cpp:2813 src/libslic3r/PrintConfig.cpp:2823 -#: src/libslic3r/PrintConfig.cpp:2845 src/libslic3r/PrintConfig.cpp:2856 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:2870 -#: src/libslic3r/PrintConfig.cpp:2881 src/libslic3r/PrintConfig.cpp:2890 -#: src/libslic3r/PrintConfig.cpp:2899 +#: src/slic3r/GUI/GUI_ObjectList.cpp:107 src/slic3r/GUI/GUI_ObjectList.cpp:626 +#: src/slic3r/GUI/Plater.cpp:635 src/slic3r/GUI/Tab.cpp:3640 +#: src/slic3r/GUI/Tab.cpp:3641 src/libslic3r/PrintConfig.cpp:2791 +#: src/libslic3r/PrintConfig.cpp:2798 src/libslic3r/PrintConfig.cpp:2812 +#: src/libslic3r/PrintConfig.cpp:2823 src/libslic3r/PrintConfig.cpp:2833 +#: src/libslic3r/PrintConfig.cpp:2855 src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2873 src/libslic3r/PrintConfig.cpp:2880 +#: src/libslic3r/PrintConfig.cpp:2891 src/libslic3r/PrintConfig.cpp:2900 +#: src/libslic3r/PrintConfig.cpp:2909 msgid "Pad" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:108 src/slic3r/GUI/Tab.cpp:3654 -#: src/slic3r/GUI/Tab.cpp:3655 src/libslic3r/SLA/Hollowing.cpp:46 +#: src/slic3r/GUI/GUI_ObjectList.cpp:108 src/slic3r/GUI/Tab.cpp:3658 +#: src/slic3r/GUI/Tab.cpp:3659 src/libslic3r/SLA/Hollowing.cpp:46 #: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67 -#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2909 -#: src/libslic3r/PrintConfig.cpp:2916 src/libslic3r/PrintConfig.cpp:2926 -#: src/libslic3r/PrintConfig.cpp:2935 +#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:2926 src/libslic3r/PrintConfig.cpp:2936 +#: src/libslic3r/PrintConfig.cpp:2945 msgid "Hollowing" msgstr "" @@ -2273,68 +2273,68 @@ msgstr "" msgid "Name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1434 +#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1433 #: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487 msgid "Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:282 src/slic3r/GUI/GUI_ObjectList.cpp:394 +#: src/slic3r/GUI/GUI_ObjectList.cpp:282 src/slic3r/GUI/GUI_ObjectList.cpp:395 msgid "Editing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:340 #, possible-c-format msgid "Auto-repaired (%d errors):" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:346 +#: src/slic3r/GUI/GUI_ObjectList.cpp:347 msgid "degenerate facets" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:347 +#: src/slic3r/GUI/GUI_ObjectList.cpp:348 msgid "edges fixed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:348 +#: src/slic3r/GUI/GUI_ObjectList.cpp:349 msgid "facets removed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:349 +#: src/slic3r/GUI/GUI_ObjectList.cpp:350 msgid "facets added" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:350 +#: src/slic3r/GUI/GUI_ObjectList.cpp:351 msgid "facets reversed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:351 +#: src/slic3r/GUI/GUI_ObjectList.cpp:352 msgid "backwards edges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:359 +#: src/slic3r/GUI/GUI_ObjectList.cpp:360 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:396 +#: src/slic3r/GUI/GUI_ObjectList.cpp:397 msgid "Right button click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:398 +#: src/slic3r/GUI/GUI_ObjectList.cpp:399 msgid "Click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:402 +#: src/slic3r/GUI/GUI_ObjectList.cpp:403 msgid "Right button click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:404 +#: src/slic3r/GUI/GUI_ObjectList.cpp:405 msgid "Click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:457 src/slic3r/GUI/GUI_ObjectList.cpp:469 -#: src/slic3r/GUI/GUI_ObjectList.cpp:917 src/slic3r/GUI/GUI_ObjectList.cpp:3967 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3977 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4012 +#: src/slic3r/GUI/GUI_ObjectList.cpp:458 src/slic3r/GUI/GUI_ObjectList.cpp:470 +#: src/slic3r/GUI/GUI_ObjectList.cpp:918 src/slic3r/GUI/GUI_ObjectList.cpp:3968 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3978 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4013 #: src/slic3r/GUI/ObjectDataViewModel.cpp:200 #: src/slic3r/GUI/ObjectDataViewModel.cpp:257 #: src/slic3r/GUI/ObjectDataViewModel.cpp:282 @@ -2343,368 +2343,368 @@ msgstr "" msgid "default" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:536 +#: src/slic3r/GUI/GUI_ObjectList.cpp:537 msgid "Change Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:551 +#: src/slic3r/GUI/GUI_ObjectList.cpp:552 msgid "Rename Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:551 +#: src/slic3r/GUI/GUI_ObjectList.cpp:552 msgid "Rename Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1091 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3781 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1092 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3782 msgid "Instances to Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1106 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1107 msgid "Volumes in Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1106 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1107 msgid "Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1182 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1530 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1536 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1849 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1183 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1531 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1537 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 #, possible-c-format msgid "Quick Add Settings (%s)" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1265 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1266 msgid "Select showing settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1314 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1315 msgid "Add Settings for Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1315 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1316 msgid "Add Settings for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1316 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1317 msgid "Add Settings for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1387 msgid "Add Settings Bundle for Height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1387 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1388 msgid "Add Settings Bundle for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1388 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1389 msgid "Add Settings Bundle for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1427 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1428 msgid "Load" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1464 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1468 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1433 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1465 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1469 msgid "Box" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1433 msgid "Cylinder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1433 msgid "Sphere" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1433 msgid "Slab" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1501 msgid "Height range Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1510 msgid "Add settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1589 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1590 msgid "Change type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1599 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1600 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1612 msgid "Set as a Separated Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1612 msgid "Set as a Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1621 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1622 msgid "Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1636 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1637 msgid "Rename" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1647 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1648 msgid "Fix through the Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1657 src/slic3r/GUI/Plater.cpp:3966 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1658 src/slic3r/GUI/Plater.cpp:3968 msgid "Export as STL" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1664 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3956 src/slic3r/GUI/Plater.cpp:3934 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1665 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3957 src/slic3r/GUI/Plater.cpp:3936 msgid "Reload the selected volumes from disk" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1671 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1672 msgid "Set extruder for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1704 src/libslic3r/PrintConfig.cpp:335 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1705 src/libslic3r/PrintConfig.cpp:335 msgid "Default" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1724 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1725 msgid "Scale to print volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1724 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1725 msgid "Scale the selected object to fit the print volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1793 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2051 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1794 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2052 msgid "Add Shape" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1879 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1880 msgid "Load Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1918 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1919 msgid "Error!" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1993 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1994 msgid "Add Generic Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2022 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2023 msgid "Generic" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2140 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2242 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2141 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2243 msgid "Last instance of an object cannot be deleted." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2152 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2153 msgid "Delete Settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2176 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2177 msgid "Delete All Instances from Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2192 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2193 msgid "Delete Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2223 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2224 msgid "From Object List You can't delete the last solid part from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2227 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2228 msgid "Delete Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2246 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2247 msgid "Delete Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2270 src/slic3r/GUI/Plater.cpp:2978 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2271 src/slic3r/GUI/Plater.cpp:2980 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2274 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2275 msgid "Split to Parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2328 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2329 msgid "Add Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2454 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2455 msgid "Group manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2466 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2467 msgid "Object manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2479 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2480 msgid "Object Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2483 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2484 msgid "Part Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2489 msgid "Layer range Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2494 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 msgid "Part manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 msgid "Instance manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2508 msgid "Height ranges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2508 msgid "Settings for height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2693 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2694 msgid "Delete Selected Item" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2830 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2831 msgid "Delete Selected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2896 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2925 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2897 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2926 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2944 msgid "Add Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3003 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3004 msgid "Edit Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3291 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3292 msgid "Selection-Remove from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3300 msgid "Selection-Add from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3418 msgid "Object or Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3418 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3552 msgid "Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3419 msgid "Layer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3420 -msgid "Unsupported selection" -msgstr "" - #: src/slic3r/GUI/GUI_ObjectList.cpp:3421 -#, possible-c-format -msgid "You started your selection with %s Item." +msgid "Unsupported selection" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:3422 #, possible-c-format +msgid "You started your selection with %s Item." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3423 +#, possible-c-format msgid "In this mode you can select only other %s Items%s" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3425 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3426 msgid "of a current Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3430 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3505 src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3431 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3506 src/slic3r/GUI/Plater.cpp:141 msgid "Info" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3546 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3547 msgid "You can't change a type of the last solid part of the object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3552 msgid "Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3552 msgid "Support Enforcer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3552 msgid "Support Blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3553 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3554 msgid "Select type of part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3558 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3559 msgid "Change Part Type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3803 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3804 msgid "Enter new name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3803 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3804 msgid "Renaming" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3819 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3926 src/slic3r/GUI/Tab.cpp:3456 -#: src/slic3r/GUI/Tab.cpp:3460 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3820 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 src/slic3r/GUI/Tab.cpp:3458 +#: src/slic3r/GUI/Tab.cpp:3462 msgid "The supplied name is not valid;" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3820 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 src/slic3r/GUI/Tab.cpp:3457 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3821 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3928 src/slic3r/GUI/Tab.cpp:3459 msgid "the following characters are not allowed:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3971 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3972 msgid "Select extruder number:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3972 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3973 msgid "This extruder will be set for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3997 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3998 msgid "Change Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4095 src/slic3r/GUI/Selection.cpp:1475 msgid "Set Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4095 src/slic3r/GUI/Selection.cpp:1475 msgid "Set Unprintable" msgstr "" @@ -2733,8 +2733,8 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458 -#: src/slic3r/GUI/Mouse3DController.cpp:304 -#: src/slic3r/GUI/Mouse3DController.cpp:321 +#: src/slic3r/GUI/Mouse3DController.cpp:271 +#: src/slic3r/GUI/Mouse3DController.cpp:294 msgid "Rotation" msgstr "" @@ -2840,7 +2840,7 @@ msgstr "" msgid "Width" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1457 +#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1456 msgid "Fan speed" msgstr "" @@ -2902,7 +2902,7 @@ msgstr "" msgid "Gap fill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1111 +#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1110 #: src/libslic3r/ExtrusionEntity.cpp:318 msgid "Skirt" msgstr "" @@ -2912,7 +2912,7 @@ msgstr "" msgid "Support material interface" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1191 +#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1190 #: src/libslic3r/ExtrusionEntity.cpp:321 msgid "Wipe tower" msgstr "" @@ -2941,7 +2941,7 @@ msgstr "" msgid "ERROR: not enough resources to execute a new job." msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:708 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:719 msgid "Keyboard Shortcuts" msgstr "" @@ -2978,11 +2978,11 @@ msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:891 -#: src/slic3r/GUI/Plater.cpp:5521 src/libslic3r/PrintConfig.cpp:3353 +#: src/slic3r/GUI/Plater.cpp:5522 src/libslic3r/PrintConfig.cpp:3363 msgid "Export G-code" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5522 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5523 msgid "Send G-code" msgstr "" @@ -3210,12 +3210,12 @@ msgstr "" msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:204 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:214 msgid "Plater" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:195 -#, possible-c-format +#, no-c-format msgid "" "Press to snap by 5% in Gizmo scale\n" "or to snap by 1mm in Gizmo move" @@ -3255,8 +3255,8 @@ msgstr "" msgid "Show/Hide Legend" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/Plater.cpp:4105 -#: src/slic3r/GUI/Tab.cpp:2390 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/Plater.cpp:4107 +#: src/slic3r/GUI/Tab.cpp:2392 msgid "Preview" msgstr "" @@ -3298,608 +3298,610 @@ msgid "" "releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:174 +#: src/slic3r/GUI/MainFrame.cpp:184 msgid "based on Slic3r" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:405 +#: src/slic3r/GUI/MainFrame.cpp:415 msgid "&New Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:405 +#: src/slic3r/GUI/MainFrame.cpp:415 msgid "Start a new project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:408 +#: src/slic3r/GUI/MainFrame.cpp:418 msgid "&Open Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:408 +#: src/slic3r/GUI/MainFrame.cpp:418 msgid "Open a project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:413 +#: src/slic3r/GUI/MainFrame.cpp:423 msgid "Recent projects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:422 -msgid "The selected project is no more available" +#: src/slic3r/GUI/MainFrame.cpp:432 +msgid "" +"The selected project is no longer available.\n" +"Do you want to remove it from the recent projects list ?" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:785 +#: src/slic3r/GUI/MainFrame.cpp:432 src/slic3r/GUI/MainFrame.cpp:796 #: src/slic3r/GUI/PrintHostDialogs.cpp:231 msgid "Error" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:446 +#: src/slic3r/GUI/MainFrame.cpp:457 msgid "&Save Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:446 +#: src/slic3r/GUI/MainFrame.cpp:457 msgid "Save current project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 +#: src/slic3r/GUI/MainFrame.cpp:461 src/slic3r/GUI/MainFrame.cpp:463 msgid "Save Project &as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 +#: src/slic3r/GUI/MainFrame.cpp:461 src/slic3r/GUI/MainFrame.cpp:463 msgid "Save current project file as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:460 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Import STL/OBJ/AM&F/3MF" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:460 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Load a model" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:464 +#: src/slic3r/GUI/MainFrame.cpp:475 msgid "Import &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:464 +#: src/slic3r/GUI/MainFrame.cpp:475 msgid "Load exported configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:467 +#: src/slic3r/GUI/MainFrame.cpp:478 msgid "Import Config from &project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:467 +#: src/slic3r/GUI/MainFrame.cpp:478 msgid "Load configuration from project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:482 msgid "Import Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:482 msgid "Load presets from a bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:474 +#: src/slic3r/GUI/MainFrame.cpp:485 msgid "&Import" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:749 +#: src/slic3r/GUI/MainFrame.cpp:488 src/slic3r/GUI/MainFrame.cpp:760 msgid "Export &G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:477 +#: src/slic3r/GUI/MainFrame.cpp:488 msgid "Export current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:750 +#: src/slic3r/GUI/MainFrame.cpp:492 src/slic3r/GUI/MainFrame.cpp:761 msgid "S&end G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:481 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Send to print current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:486 +#: src/slic3r/GUI/MainFrame.cpp:497 msgid "Export plate as &STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:486 +#: src/slic3r/GUI/MainFrame.cpp:497 msgid "Export current plate as STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export plate as STL &including supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export current plate as STL including supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:492 +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export plate as &AMF" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:492 +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export current plate as AMF" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:496 +#: src/slic3r/GUI/MainFrame.cpp:507 msgid "Export &toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:496 +#: src/slic3r/GUI/MainFrame.cpp:507 msgid "Export toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:500 +#: src/slic3r/GUI/MainFrame.cpp:511 msgid "Export &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:500 +#: src/slic3r/GUI/MainFrame.cpp:511 msgid "Export current configuration to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:503 +#: src/slic3r/GUI/MainFrame.cpp:514 msgid "Export Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:503 +#: src/slic3r/GUI/MainFrame.cpp:514 msgid "Export all presets to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:506 +#: src/slic3r/GUI/MainFrame.cpp:517 msgid "&Export" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:512 +#: src/slic3r/GUI/MainFrame.cpp:523 msgid "Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:512 +#: src/slic3r/GUI/MainFrame.cpp:523 msgid "Slice a file into a G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:518 +#: src/slic3r/GUI/MainFrame.cpp:529 msgid "Quick Slice and Save As" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:518 +#: src/slic3r/GUI/MainFrame.cpp:529 msgid "Slice a file into a G-code, save as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:524 +#: src/slic3r/GUI/MainFrame.cpp:535 msgid "Repeat Last Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:524 +#: src/slic3r/GUI/MainFrame.cpp:535 msgid "Repeat last quick slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:532 +#: src/slic3r/GUI/MainFrame.cpp:543 msgid "(Re)Slice No&w" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:532 +#: src/slic3r/GUI/MainFrame.cpp:543 msgid "Start new slicing process" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:536 +#: src/slic3r/GUI/MainFrame.cpp:547 msgid "&Repair STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:536 +#: src/slic3r/GUI/MainFrame.cpp:547 msgid "Automatically repair an STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:540 +#: src/slic3r/GUI/MainFrame.cpp:551 msgid "&Quit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:540 +#: src/slic3r/GUI/MainFrame.cpp:551 #, possible-c-format msgid "Quit %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:565 +#: src/slic3r/GUI/MainFrame.cpp:576 msgid "&Select all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:566 +#: src/slic3r/GUI/MainFrame.cpp:577 msgid "Selects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:568 +#: src/slic3r/GUI/MainFrame.cpp:579 msgid "D&eselect all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:569 +#: src/slic3r/GUI/MainFrame.cpp:580 msgid "Deselects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:572 +#: src/slic3r/GUI/MainFrame.cpp:583 msgid "&Delete selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:573 +#: src/slic3r/GUI/MainFrame.cpp:584 msgid "Deletes the current selection" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:575 +#: src/slic3r/GUI/MainFrame.cpp:586 msgid "Delete &all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:576 +#: src/slic3r/GUI/MainFrame.cpp:587 msgid "Deletes all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:580 +#: src/slic3r/GUI/MainFrame.cpp:591 msgid "&Undo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:583 +#: src/slic3r/GUI/MainFrame.cpp:594 msgid "&Redo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:588 +#: src/slic3r/GUI/MainFrame.cpp:599 msgid "&Copy" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:589 +#: src/slic3r/GUI/MainFrame.cpp:600 msgid "Copy selection to clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:591 +#: src/slic3r/GUI/MainFrame.cpp:602 msgid "&Paste" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:592 +#: src/slic3r/GUI/MainFrame.cpp:603 msgid "Paste clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:596 +#: src/slic3r/GUI/MainFrame.cpp:607 msgid "Re&load from disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:597 +#: src/slic3r/GUI/MainFrame.cpp:608 msgid "Reload the plater from disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:606 +#: src/slic3r/GUI/MainFrame.cpp:617 msgid "&Plater Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:606 +#: src/slic3r/GUI/MainFrame.cpp:617 msgid "Show the plater" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:614 +#: src/slic3r/GUI/MainFrame.cpp:625 msgid "P&rint Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:614 +#: src/slic3r/GUI/MainFrame.cpp:625 msgid "Show the print settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:752 +#: src/slic3r/GUI/MainFrame.cpp:628 src/slic3r/GUI/MainFrame.cpp:763 msgid "&Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:617 +#: src/slic3r/GUI/MainFrame.cpp:628 msgid "Show the filament settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:621 +#: src/slic3r/GUI/MainFrame.cpp:632 msgid "Print&er Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:621 +#: src/slic3r/GUI/MainFrame.cpp:632 msgid "Show the printer settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:626 +#: src/slic3r/GUI/MainFrame.cpp:637 msgid "3&D" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:626 +#: src/slic3r/GUI/MainFrame.cpp:637 msgid "Show the 3D editing view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:629 +#: src/slic3r/GUI/MainFrame.cpp:640 msgid "Pre&view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:629 +#: src/slic3r/GUI/MainFrame.cpp:640 msgid "Show the 3D slices preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:648 +#: src/slic3r/GUI/MainFrame.cpp:659 msgid "Print &Host Upload Queue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:648 +#: src/slic3r/GUI/MainFrame.cpp:659 msgid "Display the Print Host Upload Queue window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:658 +#: src/slic3r/GUI/MainFrame.cpp:669 msgid "Iso" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:658 +#: src/slic3r/GUI/MainFrame.cpp:669 msgid "Iso View" msgstr "" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:662 src/libslic3r/PrintConfig.cpp:2132 +#: src/slic3r/GUI/MainFrame.cpp:673 src/libslic3r/PrintConfig.cpp:2132 #: src/libslic3r/PrintConfig.cpp:2141 msgid "Top" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:662 +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Top View" msgstr "" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:665 src/libslic3r/PrintConfig.cpp:174 +#: src/slic3r/GUI/MainFrame.cpp:676 src/libslic3r/PrintConfig.cpp:174 #: src/libslic3r/PrintConfig.cpp:183 msgid "Bottom" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:665 +#: src/slic3r/GUI/MainFrame.cpp:676 msgid "Bottom View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:667 +#: src/slic3r/GUI/MainFrame.cpp:678 msgid "Front" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:667 +#: src/slic3r/GUI/MainFrame.cpp:678 msgid "Front View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:680 src/libslic3r/PrintConfig.cpp:1632 msgid "Rear" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:669 +#: src/slic3r/GUI/MainFrame.cpp:680 msgid "Rear View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:671 +#: src/slic3r/GUI/MainFrame.cpp:682 msgid "Left" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:671 +#: src/slic3r/GUI/MainFrame.cpp:682 msgid "Left View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:673 +#: src/slic3r/GUI/MainFrame.cpp:684 msgid "Right" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:673 +#: src/slic3r/GUI/MainFrame.cpp:684 msgid "Right View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:676 +#: src/slic3r/GUI/MainFrame.cpp:687 msgid "Show &labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:676 +#: src/slic3r/GUI/MainFrame.cpp:687 msgid "Show object/instance labels in 3D scene" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:684 +#: src/slic3r/GUI/MainFrame.cpp:695 msgid "Prusa 3D &Drivers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:684 +#: src/slic3r/GUI/MainFrame.cpp:695 msgid "Open the Prusa3D drivers download page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:686 +#: src/slic3r/GUI/MainFrame.cpp:697 msgid "Software &Releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:686 +#: src/slic3r/GUI/MainFrame.cpp:697 msgid "Open the software releases page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:692 +#: src/slic3r/GUI/MainFrame.cpp:703 #, possible-c-format msgid "%s &Website" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:693 +#: src/slic3r/GUI/MainFrame.cpp:704 #, possible-c-format msgid "Open the %s website in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:699 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "System &Info" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:699 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "Show system information" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:701 +#: src/slic3r/GUI/MainFrame.cpp:712 msgid "Show &Configuration Folder" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:701 +#: src/slic3r/GUI/MainFrame.cpp:712 msgid "Show user configuration folder (datadir)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:703 +#: src/slic3r/GUI/MainFrame.cpp:714 msgid "Report an I&ssue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:703 +#: src/slic3r/GUI/MainFrame.cpp:714 #, possible-c-format msgid "Report an issue on %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:705 +#: src/slic3r/GUI/MainFrame.cpp:716 #, possible-c-format msgid "&About %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:705 +#: src/slic3r/GUI/MainFrame.cpp:716 msgid "Show about dialog" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:708 +#: src/slic3r/GUI/MainFrame.cpp:719 msgid "Show the list of the keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:721 +#: src/slic3r/GUI/MainFrame.cpp:732 msgid "&File" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:722 +#: src/slic3r/GUI/MainFrame.cpp:733 msgid "&Edit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:723 +#: src/slic3r/GUI/MainFrame.cpp:734 msgid "&Window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:724 +#: src/slic3r/GUI/MainFrame.cpp:735 msgid "&View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:727 +#: src/slic3r/GUI/MainFrame.cpp:738 msgid "&Help" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:749 +#: src/slic3r/GUI/MainFrame.cpp:760 msgid "E&xport" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:750 +#: src/slic3r/GUI/MainFrame.cpp:761 msgid "S&end to print" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:752 +#: src/slic3r/GUI/MainFrame.cpp:763 msgid "Mate&rial Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:773 +#: src/slic3r/GUI/MainFrame.cpp:784 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:784 +#: src/slic3r/GUI/MainFrame.cpp:795 msgid "No previously sliced file." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:790 +#: src/slic3r/GUI/MainFrame.cpp:801 msgid "Previously sliced file (" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:790 +#: src/slic3r/GUI/MainFrame.cpp:801 msgid ") not found." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:791 +#: src/slic3r/GUI/MainFrame.cpp:802 msgid "File Not Found" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:826 +#: src/slic3r/GUI/MainFrame.cpp:837 #, possible-c-format msgid "Save %s file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:826 +#: src/slic3r/GUI/MainFrame.cpp:837 msgid "SVG" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:826 +#: src/slic3r/GUI/MainFrame.cpp:837 msgid "G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:838 +#: src/slic3r/GUI/MainFrame.cpp:849 msgid "Save zip file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:847 src/slic3r/GUI/Plater.cpp:3121 -#: src/slic3r/GUI/Plater.cpp:5107 src/slic3r/GUI/Tab.cpp:1221 -#: src/slic3r/GUI/Tab.cpp:3662 +#: src/slic3r/GUI/MainFrame.cpp:858 src/slic3r/GUI/Plater.cpp:3123 +#: src/slic3r/GUI/Plater.cpp:5109 src/slic3r/GUI/Tab.cpp:1220 +#: src/slic3r/GUI/Tab.cpp:3666 msgid "Slicing" msgstr "" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:849 +#: src/slic3r/GUI/MainFrame.cpp:860 #, possible-c-format msgid "Processing %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:872 +#: src/slic3r/GUI/MainFrame.cpp:883 msgid " was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:874 +#: src/slic3r/GUI/MainFrame.cpp:885 msgid "Slicing Done!" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:889 +#: src/slic3r/GUI/MainFrame.cpp:900 msgid "Select the STL file to repair:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:899 +#: src/slic3r/GUI/MainFrame.cpp:910 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:911 +#: src/slic3r/GUI/MainFrame.cpp:922 msgid "Your file was repaired." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:911 src/libslic3r/PrintConfig.cpp:3447 +#: src/slic3r/GUI/MainFrame.cpp:922 src/libslic3r/PrintConfig.cpp:3457 msgid "Repair" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:925 +#: src/slic3r/GUI/MainFrame.cpp:936 msgid "Save configuration as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:944 src/slic3r/GUI/MainFrame.cpp:1006 +#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1017 msgid "Select configuration to load:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:980 +#: src/slic3r/GUI/MainFrame.cpp:991 msgid "Save presets bundle as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1027 +#: src/slic3r/GUI/MainFrame.cpp:1038 #, possible-c-format msgid "%d presets successfully imported." msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:274 +#: src/slic3r/GUI/Mouse3DController.cpp:239 msgid "3Dconnexion settings" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:289 +#: src/slic3r/GUI/Mouse3DController.cpp:254 msgid "Device:" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:296 +#: src/slic3r/GUI/Mouse3DController.cpp:261 msgid "Speed:" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:300 -#: src/slic3r/GUI/Mouse3DController.cpp:317 +#: src/slic3r/GUI/Mouse3DController.cpp:265 +#: src/slic3r/GUI/Mouse3DController.cpp:288 msgid "Translation" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:308 -#: src/slic3r/GUI/Mouse3DController.cpp:317 +#: src/slic3r/GUI/Mouse3DController.cpp:277 +#: src/slic3r/GUI/Mouse3DController.cpp:288 msgid "Zoom" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:313 +#: src/slic3r/GUI/Mouse3DController.cpp:284 msgid "Deadzone:" msgstr "" @@ -3923,8 +3925,8 @@ msgstr "" msgid "Instance %d" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3512 -#: src/slic3r/GUI/Tab.cpp:3600 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3514 +#: src/slic3r/GUI/Tab.cpp:3602 msgid "Layers" msgstr "" @@ -3932,12 +3934,12 @@ msgstr "" msgid "Range" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:258 +#: src/slic3r/GUI/OptionsGroup.cpp:259 msgctxt "Layers" msgid "Top" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:258 +#: src/slic3r/GUI/OptionsGroup.cpp:259 msgctxt "Layers" msgid "Bottom" msgstr "" @@ -4000,7 +4002,7 @@ msgid "Select what kind of support do you need" msgstr "" #: src/slic3r/GUI/Plater.cpp:500 src/libslic3r/PrintConfig.cpp:1901 -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2684 msgid "Support on build plate only" msgstr "" @@ -4012,7 +4014,7 @@ msgstr "" msgid "Everywhere" msgstr "" -#: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1117 +#: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1116 msgid "Brim" msgstr "" @@ -4042,8 +4044,8 @@ msgstr "" msgid "Print settings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:816 src/slic3r/GUI/Tab.cpp:1425 -#: src/slic3r/GUI/Tab.cpp:1426 +#: src/slic3r/GUI/Plater.cpp:816 src/slic3r/GUI/Tab.cpp:1424 +#: src/slic3r/GUI/Tab.cpp:1425 msgid "Filament" msgstr "" @@ -4051,7 +4053,7 @@ msgstr "" msgid "SLA print settings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:818 src/slic3r/GUI/Preset.cpp:1524 +#: src/slic3r/GUI/Plater.cpp:818 src/slic3r/GUI/Preset.cpp:1536 msgid "SLA material" msgstr "" @@ -4059,7 +4061,7 @@ msgstr "" msgid "Printer" msgstr "" -#: src/slic3r/GUI/Plater.cpp:878 src/slic3r/GUI/Plater.cpp:5522 +#: src/slic3r/GUI/Plater.cpp:878 src/slic3r/GUI/Plater.cpp:5523 msgid "Send to printer" msgstr "" @@ -4071,8 +4073,8 @@ msgstr "" msgid "Export to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/Plater.cpp:892 src/slic3r/GUI/Plater.cpp:3121 -#: src/slic3r/GUI/Plater.cpp:5110 +#: src/slic3r/GUI/Plater.cpp:892 src/slic3r/GUI/Plater.cpp:3123 +#: src/slic3r/GUI/Plater.cpp:5112 msgid "Slice now" msgstr "" @@ -4150,416 +4152,416 @@ msgstr "" msgid "Load Files" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2151 +#: src/slic3r/GUI/Plater.cpp:2155 msgid "New Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2273 +#: src/slic3r/GUI/Plater.cpp:2275 msgid "Loading" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2283 +#: src/slic3r/GUI/Plater.cpp:2285 #, possible-c-format msgid "Processing input file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2311 +#: src/slic3r/GUI/Plater.cpp:2313 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2312 src/slic3r/GUI/Tab.cpp:2959 +#: src/slic3r/GUI/Plater.cpp:2314 src/slic3r/GUI/Tab.cpp:2961 msgid "Please check your object list before preset changing." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2357 +#: src/slic3r/GUI/Plater.cpp:2359 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should I consider\n" "this file as a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2360 src/slic3r/GUI/Plater.cpp:2413 +#: src/slic3r/GUI/Plater.cpp:2362 src/slic3r/GUI/Plater.cpp:2415 msgid "Multi-part object detected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2367 +#: src/slic3r/GUI/Plater.cpp:2369 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2368 +#: src/slic3r/GUI/Plater.cpp:2370 msgid "Detected advanced data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2390 +#: src/slic3r/GUI/Plater.cpp:2392 #, possible-c-format msgid "" "You can't to add the object(s) from %s because of one or some of them " "is(are) multi-part" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2410 +#: src/slic3r/GUI/Plater.cpp:2412 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" "these files to represent a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2426 +#: src/slic3r/GUI/Plater.cpp:2428 msgid "Loaded" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2528 +#: src/slic3r/GUI/Plater.cpp:2530 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2529 +#: src/slic3r/GUI/Plater.cpp:2531 msgid "Object too large?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2591 +#: src/slic3r/GUI/Plater.cpp:2593 msgid "Export STL file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2598 +#: src/slic3r/GUI/Plater.cpp:2600 msgid "Export AMF file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2604 +#: src/slic3r/GUI/Plater.cpp:2606 msgid "Save file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2610 +#: src/slic3r/GUI/Plater.cpp:2612 msgid "Export OBJ file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2712 +#: src/slic3r/GUI/Plater.cpp:2714 msgid "Delete Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2723 +#: src/slic3r/GUI/Plater.cpp:2725 msgid "Reset Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2760 +#: src/slic3r/GUI/Plater.cpp:2762 msgid "Hollow" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2767 +#: src/slic3r/GUI/Plater.cpp:2769 msgid "Optimize Rotation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2813 +#: src/slic3r/GUI/Plater.cpp:2815 msgid "Arranging" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2835 +#: src/slic3r/GUI/Plater.cpp:2837 msgid "Could not arrange model objects! Some geometries may be invalid." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2841 +#: src/slic3r/GUI/Plater.cpp:2843 msgid "Arranging canceled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2842 +#: src/slic3r/GUI/Plater.cpp:2844 msgid "Arranging done." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2858 +#: src/slic3r/GUI/Plater.cpp:2860 msgid "Searching for optimal orientation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:2893 msgid "Orientation search canceled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2892 +#: src/slic3r/GUI/Plater.cpp:2894 msgid "Orientation found." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2922 +#: src/slic3r/GUI/Plater.cpp:2924 msgid "Indexing hollowed object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2926 +#: src/slic3r/GUI/Plater.cpp:2928 msgid "Hollowing cancelled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/Plater.cpp:2929 msgid "Hollowing done." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2929 +#: src/slic3r/GUI/Plater.cpp:2931 msgid "Hollowing failed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2970 +#: src/slic3r/GUI/Plater.cpp:2972 msgid "" "The selected object can't be split because it contains more than one volume/" "material." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2981 +#: src/slic3r/GUI/Plater.cpp:2983 msgid "Split to Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3106 +#: src/slic3r/GUI/Plater.cpp:3108 msgid "Invalid data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3115 +#: src/slic3r/GUI/Plater.cpp:3117 msgid "Ready to slice" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3153 src/slic3r/GUI/PrintHostDialogs.cpp:232 +#: src/slic3r/GUI/Plater.cpp:3155 src/slic3r/GUI/PrintHostDialogs.cpp:232 msgid "Cancelling" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3170 +#: src/slic3r/GUI/Plater.cpp:3172 msgid "Another export job is currently running." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3286 +#: src/slic3r/GUI/Plater.cpp:3288 msgid "Please select the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3321 +#: src/slic3r/GUI/Plater.cpp:3323 msgid "It is not allowed to change the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3321 +#: src/slic3r/GUI/Plater.cpp:3323 msgid "Do you want to retry" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3339 +#: src/slic3r/GUI/Plater.cpp:3341 msgid "Reload from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3428 +#: src/slic3r/GUI/Plater.cpp:3430 msgid "Unable to reload:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3433 +#: src/slic3r/GUI/Plater.cpp:3435 msgid "Error during reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3452 +#: src/slic3r/GUI/Plater.cpp:3454 msgid "Reload all from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3473 +#: src/slic3r/GUI/Plater.cpp:3475 msgid "Fix Throught NetFabb" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3664 +#: src/slic3r/GUI/Plater.cpp:3666 msgid "Export failed" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3669 src/slic3r/GUI/PrintHostDialogs.cpp:233 +#: src/slic3r/GUI/Plater.cpp:3671 src/slic3r/GUI/PrintHostDialogs.cpp:233 msgid "Cancelled" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953 +#: src/slic3r/GUI/Plater.cpp:3933 src/slic3r/GUI/Plater.cpp:3955 msgid "Remove the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3940 +#: src/slic3r/GUI/Plater.cpp:3942 msgid "Add one more instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3942 +#: src/slic3r/GUI/Plater.cpp:3944 msgid "Remove one instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3944 +#: src/slic3r/GUI/Plater.cpp:3946 msgid "Set number of instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3944 +#: src/slic3r/GUI/Plater.cpp:3946 msgid "Change the number of instances of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3963 +#: src/slic3r/GUI/Plater.cpp:3965 msgid "Reload the selected object from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3966 +#: src/slic3r/GUI/Plater.cpp:3968 msgid "Export the selected object as STL file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3995 +#: src/slic3r/GUI/Plater.cpp:3997 msgid "Along X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3995 +#: src/slic3r/GUI/Plater.cpp:3997 msgid "Mirror the selected object along the X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3997 +#: src/slic3r/GUI/Plater.cpp:3999 msgid "Along Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3997 +#: src/slic3r/GUI/Plater.cpp:3999 msgid "Mirror the selected object along the Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3999 +#: src/slic3r/GUI/Plater.cpp:4001 msgid "Along Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3999 +#: src/slic3r/GUI/Plater.cpp:4001 msgid "Mirror the selected object along the Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4002 +#: src/slic3r/GUI/Plater.cpp:4004 msgid "Mirror" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4002 +#: src/slic3r/GUI/Plater.cpp:4004 msgid "Mirror the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4014 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "To objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4014 src/slic3r/GUI/Plater.cpp:4034 +#: src/slic3r/GUI/Plater.cpp:4016 src/slic3r/GUI/Plater.cpp:4036 msgid "Split the selected object into individual objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4016 +#: src/slic3r/GUI/Plater.cpp:4018 msgid "To parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4016 src/slic3r/GUI/Plater.cpp:4048 +#: src/slic3r/GUI/Plater.cpp:4018 src/slic3r/GUI/Plater.cpp:4050 msgid "Split the selected object into individual sub-parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4019 src/slic3r/GUI/Plater.cpp:4034 -#: src/slic3r/GUI/Plater.cpp:4048 src/libslic3r/PrintConfig.cpp:3471 +#: src/slic3r/GUI/Plater.cpp:4021 src/slic3r/GUI/Plater.cpp:4036 +#: src/slic3r/GUI/Plater.cpp:4050 src/libslic3r/PrintConfig.cpp:3481 msgid "Split" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4019 +#: src/slic3r/GUI/Plater.cpp:4021 msgid "Split the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4040 +#: src/slic3r/GUI/Plater.cpp:4042 msgid "Optimize orientation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4040 +#: src/slic3r/GUI/Plater.cpp:4042 msgid "Optimize the rotation of the object for better print results." msgstr "" -#: src/slic3r/GUI/Plater.cpp:4097 +#: src/slic3r/GUI/Plater.cpp:4099 msgid "3D editor view" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4400 +#: src/slic3r/GUI/Plater.cpp:4402 msgid "" "%1% printer was active at the time the target Undo / Redo snapshot was " "taken. Switching to %1% printer requires reloading of %1% presets." msgstr "" -#: src/slic3r/GUI/Plater.cpp:4575 +#: src/slic3r/GUI/Plater.cpp:4577 msgid "Load Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4603 +#: src/slic3r/GUI/Plater.cpp:4605 msgid "Import Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4607 +#: src/slic3r/GUI/Plater.cpp:4609 msgid "Import Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4669 +#: src/slic3r/GUI/Plater.cpp:4671 msgid "All objects will be removed, continue?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4677 +#: src/slic3r/GUI/Plater.cpp:4679 msgid "Delete Selected Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4685 +#: src/slic3r/GUI/Plater.cpp:4687 msgid "Increase Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4720 +#: src/slic3r/GUI/Plater.cpp:4722 msgid "Decrease Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4751 +#: src/slic3r/GUI/Plater.cpp:4753 msgid "Enter the number of copies:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4752 +#: src/slic3r/GUI/Plater.cpp:4754 msgid "Copies of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4756 +#: src/slic3r/GUI/Plater.cpp:4758 #, possible-c-format msgid "Set numbers of copies to %d" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4786 +#: src/slic3r/GUI/Plater.cpp:4788 msgid "Cut by Plane" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4839 +#: src/slic3r/GUI/Plater.cpp:4841 msgid "Save G-code file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4839 +#: src/slic3r/GUI/Plater.cpp:4841 msgid "Save SL1 file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4985 +#: src/slic3r/GUI/Plater.cpp:4987 #, possible-c-format msgid "STL file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5002 +#: src/slic3r/GUI/Plater.cpp:5004 #, possible-c-format msgid "AMF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5005 +#: src/slic3r/GUI/Plater.cpp:5007 #, possible-c-format msgid "Error exporting AMF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5038 +#: src/slic3r/GUI/Plater.cpp:5040 #, possible-c-format msgid "3MF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5043 +#: src/slic3r/GUI/Plater.cpp:5045 #, possible-c-format msgid "Error exporting 3MF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5203 +#: src/slic3r/GUI/Plater.cpp:5205 #, possible-c-format msgid "" "Unmounting successful. The device %s(%s) can now be safely removed from the " "computer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5521 +#: src/slic3r/GUI/Plater.cpp:5522 msgid "Export" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5606 +#: src/slic3r/GUI/Plater.cpp:5608 msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1796 -#: src/slic3r/GUI/Tab.cpp:2040 +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1798 +#: src/slic3r/GUI/Tab.cpp:2042 msgid "General" msgstr "" @@ -4699,34 +4701,34 @@ msgstr "" msgid "modified" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1109 src/slic3r/GUI/Preset.cpp:1164 -#: src/slic3r/GUI/Preset.cpp:1242 src/slic3r/GUI/Preset.cpp:1284 -#: src/slic3r/GUI/PresetBundle.cpp:1583 src/slic3r/GUI/PresetBundle.cpp:1672 +#: src/slic3r/GUI/Preset.cpp:1121 src/slic3r/GUI/Preset.cpp:1176 +#: src/slic3r/GUI/Preset.cpp:1254 src/slic3r/GUI/Preset.cpp:1296 +#: src/slic3r/GUI/PresetBundle.cpp:1583 src/slic3r/GUI/PresetBundle.cpp:1679 msgid "System presets" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1168 src/slic3r/GUI/Preset.cpp:1288 -#: src/slic3r/GUI/PresetBundle.cpp:1677 +#: src/slic3r/GUI/Preset.cpp:1180 src/slic3r/GUI/Preset.cpp:1300 +#: src/slic3r/GUI/PresetBundle.cpp:1684 msgid "User presets" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1201 +#: src/slic3r/GUI/Preset.cpp:1213 msgid "Add/Remove materials" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1203 +#: src/slic3r/GUI/Preset.cpp:1215 msgid "Add/Remove printers" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1522 +#: src/slic3r/GUI/Preset.cpp:1534 msgid "filament" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1523 +#: src/slic3r/GUI/Preset.cpp:1535 msgid "SLA print" msgstr "" -#: src/slic3r/GUI/PresetBundle.cpp:1704 +#: src/slic3r/GUI/PresetBundle.cpp:1711 msgid "Add/Remove filaments" msgstr "" @@ -4971,47 +4973,47 @@ msgstr "" msgid "mm³/s" msgstr "" -#: src/slic3r/GUI/Selection.cpp:146 +#: src/slic3r/GUI/Selection.cpp:147 msgid "Selection-Add" msgstr "" -#: src/slic3r/GUI/Selection.cpp:187 +#: src/slic3r/GUI/Selection.cpp:188 msgid "Selection-Remove" msgstr "" -#: src/slic3r/GUI/Selection.cpp:219 +#: src/slic3r/GUI/Selection.cpp:220 msgid "Selection-Add Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:238 +#: src/slic3r/GUI/Selection.cpp:239 msgid "Selection-Remove Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:256 +#: src/slic3r/GUI/Selection.cpp:257 msgid "Selection-Add Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:275 +#: src/slic3r/GUI/Selection.cpp:276 msgid "Selection-Remove Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:376 +#: src/slic3r/GUI/Selection.cpp:377 msgid "Selection-Add All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:402 +#: src/slic3r/GUI/Selection.cpp:403 msgid "Selection-Remove All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:939 +#: src/slic3r/GUI/Selection.cpp:940 msgid "Scale To Fit" msgstr "" -#: src/slic3r/GUI/Selection.cpp:1475 +#: src/slic3r/GUI/Selection.cpp:1477 msgid "Set Printable Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:1475 +#: src/slic3r/GUI/Selection.cpp:1477 msgid "Set Unprintable Instance" msgstr "" @@ -5071,308 +5073,312 @@ msgstr "" msgid "Current preset is inherited from the default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:960 -#, possible-c-format -msgid "" -"Current preset is inherited from:\n" -"\t%s" +#: src/slic3r/GUI/Tab.cpp:959 +msgid "Current preset is inherited from" msgstr "" -#: src/slic3r/GUI/Tab.cpp:964 +#: src/slic3r/GUI/Tab.cpp:963 msgid "It can't be deleted or modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:965 +#: src/slic3r/GUI/Tab.cpp:964 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "" -#: src/slic3r/GUI/Tab.cpp:966 +#: src/slic3r/GUI/Tab.cpp:965 msgid "To do that please specify a new name for the preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:970 +#: src/slic3r/GUI/Tab.cpp:969 msgid "Additional information:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:976 +#: src/slic3r/GUI/Tab.cpp:975 msgid "printer model" msgstr "" -#: src/slic3r/GUI/Tab.cpp:984 +#: src/slic3r/GUI/Tab.cpp:983 msgid "default print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:987 +#: src/slic3r/GUI/Tab.cpp:986 msgid "default filament profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1001 +#: src/slic3r/GUI/Tab.cpp:1000 msgid "default SLA material profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1005 +#: src/slic3r/GUI/Tab.cpp:1004 msgid "default SLA print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1013 +#: src/slic3r/GUI/Tab.cpp:1012 msgid "full profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1014 +#: src/slic3r/GUI/Tab.cpp:1013 msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1048 src/slic3r/GUI/Tab.cpp:3598 +#: src/slic3r/GUI/Tab.cpp:1047 src/slic3r/GUI/Tab.cpp:3600 msgid "Layers and perimeters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1053 +#: src/slic3r/GUI/Tab.cpp:1052 msgid "Vertical shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1064 +#: src/slic3r/GUI/Tab.cpp:1063 msgid "Horizontal shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1065 src/libslic3r/PrintConfig.cpp:1780 +#: src/slic3r/GUI/Tab.cpp:1064 src/libslic3r/PrintConfig.cpp:1780 msgid "Solid layers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1069 +#: src/slic3r/GUI/Tab.cpp:1068 msgid "Minimum shell thickness" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1080 +#: src/slic3r/GUI/Tab.cpp:1079 msgid "Quality (slower slicing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1098 +#: src/slic3r/GUI/Tab.cpp:1097 msgid "Reducing printing time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1110 +#: src/slic3r/GUI/Tab.cpp:1109 msgid "Skirt and brim" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1127 +#: src/slic3r/GUI/Tab.cpp:1126 msgid "Raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1131 +#: src/slic3r/GUI/Tab.cpp:1130 msgid "Options for support material and raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1146 +#: src/slic3r/GUI/Tab.cpp:1145 msgid "Speed for print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1158 +#: src/slic3r/GUI/Tab.cpp:1157 msgid "Speed for non-print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1161 +#: src/slic3r/GUI/Tab.cpp:1160 msgid "Modifiers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1164 +#: src/slic3r/GUI/Tab.cpp:1163 msgid "Acceleration control (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1171 +#: src/slic3r/GUI/Tab.cpp:1170 msgid "Autospeed (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1179 +#: src/slic3r/GUI/Tab.cpp:1178 msgid "Multiple Extruders" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1187 +#: src/slic3r/GUI/Tab.cpp:1186 msgid "Ooze prevention" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1205 +#: src/slic3r/GUI/Tab.cpp:1204 msgid "Extrusion width" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1215 +#: src/slic3r/GUI/Tab.cpp:1214 msgid "Overlap" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1218 +#: src/slic3r/GUI/Tab.cpp:1217 msgid "Flow" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1227 +#: src/slic3r/GUI/Tab.cpp:1226 msgid "Other" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1230 src/slic3r/GUI/Tab.cpp:3665 +#: src/slic3r/GUI/Tab.cpp:1229 src/slic3r/GUI/Tab.cpp:3669 msgid "Output options" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1231 +#: src/slic3r/GUI/Tab.cpp:1230 msgid "Sequential printing" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1233 +#: src/slic3r/GUI/Tab.cpp:1232 msgid "Extruder clearance (mm)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1238 src/slic3r/GUI/Tab.cpp:3666 +#: src/slic3r/GUI/Tab.cpp:1237 src/slic3r/GUI/Tab.cpp:3670 msgid "Output file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1245 src/libslic3r/PrintConfig.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1244 src/libslic3r/PrintConfig.cpp:1453 msgid "Post-processing scripts" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1251 src/slic3r/GUI/Tab.cpp:1252 -#: src/slic3r/GUI/Tab.cpp:1540 src/slic3r/GUI/Tab.cpp:1541 -#: src/slic3r/GUI/Tab.cpp:2012 src/slic3r/GUI/Tab.cpp:2013 -#: src/slic3r/GUI/Tab.cpp:2128 src/slic3r/GUI/Tab.cpp:2129 -#: src/slic3r/GUI/Tab.cpp:3535 src/slic3r/GUI/Tab.cpp:3536 +#: src/slic3r/GUI/Tab.cpp:1250 src/slic3r/GUI/Tab.cpp:1251 +#: src/slic3r/GUI/Tab.cpp:1539 src/slic3r/GUI/Tab.cpp:1540 +#: src/slic3r/GUI/Tab.cpp:2014 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/Tab.cpp:2130 src/slic3r/GUI/Tab.cpp:2131 +#: src/slic3r/GUI/Tab.cpp:3537 src/slic3r/GUI/Tab.cpp:3538 msgid "Notes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1258 src/slic3r/GUI/Tab.cpp:1548 -#: src/slic3r/GUI/Tab.cpp:2019 src/slic3r/GUI/Tab.cpp:2135 -#: src/slic3r/GUI/Tab.cpp:3543 src/slic3r/GUI/Tab.cpp:3671 +#: src/slic3r/GUI/Tab.cpp:1257 src/slic3r/GUI/Tab.cpp:1547 +#: src/slic3r/GUI/Tab.cpp:2021 src/slic3r/GUI/Tab.cpp:2137 +#: src/slic3r/GUI/Tab.cpp:3545 src/slic3r/GUI/Tab.cpp:3675 msgid "Dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1259 src/slic3r/GUI/Tab.cpp:1549 -#: src/slic3r/GUI/Tab.cpp:2020 src/slic3r/GUI/Tab.cpp:2136 -#: src/slic3r/GUI/Tab.cpp:3544 src/slic3r/GUI/Tab.cpp:3672 +#: src/slic3r/GUI/Tab.cpp:1258 src/slic3r/GUI/Tab.cpp:1548 +#: src/slic3r/GUI/Tab.cpp:2022 src/slic3r/GUI/Tab.cpp:2138 +#: src/slic3r/GUI/Tab.cpp:3546 src/slic3r/GUI/Tab.cpp:3676 msgid "Profile dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1323 src/slic3r/GUI/Tab.cpp:1378 +#: src/slic3r/GUI/Tab.cpp:1322 src/slic3r/GUI/Tab.cpp:1377 msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1324 src/slic3r/GUI/Tab.cpp:1383 -#: src/slic3r/GUI/Tab.cpp:2370 +#: src/slic3r/GUI/Tab.cpp:1323 src/slic3r/GUI/Tab.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:2372 msgid "Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1433 src/libslic3r/PrintConfig.cpp:2067 +#: src/slic3r/GUI/Tab.cpp:1432 src/libslic3r/PrintConfig.cpp:2067 msgid "Temperature" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1439 +#: src/slic3r/GUI/Tab.cpp:1438 msgid "Bed" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1444 +#: src/slic3r/GUI/Tab.cpp:1443 msgid "Cooling" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1445 src/libslic3r/PrintConfig.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1444 src/libslic3r/PrintConfig.cpp:1355 #: src/libslic3r/PrintConfig.cpp:2200 msgid "Enable" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1456 +#: src/slic3r/GUI/Tab.cpp:1455 msgid "Fan settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1464 msgid "Cooling thresholds" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1470 msgid "Filament properties" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1478 +#: src/slic3r/GUI/Tab.cpp:1477 msgid "Print speed override" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1488 +#: src/slic3r/GUI/Tab.cpp:1487 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1491 +#: src/slic3r/GUI/Tab.cpp:1490 msgid "Toolchange parameters with single extruder MM printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1505 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Ramming settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1975 +#: src/slic3r/GUI/Tab.cpp:1526 src/slic3r/GUI/Tab.cpp:1977 msgid "Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1528 src/slic3r/GUI/Tab.cpp:1976 +#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1978 #: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828 msgid "Start G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:1982 +#: src/slic3r/GUI/Tab.cpp:1533 src/slic3r/GUI/Tab.cpp:1984 #: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395 msgid "End G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1591 +#: src/slic3r/GUI/Tab.cpp:1590 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1677 src/slic3r/GUI/Tab.cpp:1915 +#: src/slic3r/GUI/Tab.cpp:1676 src/slic3r/GUI/Tab.cpp:1917 msgid "Test" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Could not get a valid Printer Host reference" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:1928 +#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:1930 msgid "Success!" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1713 +#: src/slic3r/GUI/Tab.cpp:1711 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1728 +#: src/slic3r/GUI/Tab.cpp:1726 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1729 +#: src/slic3r/GUI/Tab.cpp:1727 msgid "Open CA certificate file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1757 -#, possible-c-format -msgid "" -"HTTPS CA File:\n" -" \tOn this system, %s uses HTTPS certificates from the system Certificate " -"Store or Keychain.\n" -" \tTo use a custom CA file, please import your CA file into Certificate " -"Store / Keychain." +#: src/slic3r/GUI/Tab.cpp:1754 src/libslic3r/PrintConfig.cpp:111 +msgid "HTTPS CA File" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1797 src/slic3r/GUI/Tab.cpp:2041 +#: src/slic3r/GUI/Tab.cpp:1755 +#, possible-c-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1756 +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1799 src/slic3r/GUI/Tab.cpp:2043 msgid "Size and coordinates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1802 src/slic3r/GUI/Tab.cpp:2046 -#: src/slic3r/GUI/Tab.cpp:3176 +#: src/slic3r/GUI/Tab.cpp:1804 src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:3178 msgid "Set" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1834 +#: src/slic3r/GUI/Tab.cpp:1836 msgid "Capabilities" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1839 +#: src/slic3r/GUI/Tab.cpp:1841 msgid "Number of extruders of the printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:1869 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -5380,72 +5386,72 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2340 +#: src/slic3r/GUI/Tab.cpp:1872 src/slic3r/GUI/Tab.cpp:2342 #: src/libslic3r/PrintConfig.cpp:1326 msgid "Nozzle diameter" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:1902 msgid "USB/Serial connection" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1901 src/libslic3r/PrintConfig.cpp:1661 +#: src/slic3r/GUI/Tab.cpp:1903 src/libslic3r/PrintConfig.cpp:1661 msgid "Serial port" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1906 +#: src/slic3r/GUI/Tab.cpp:1908 msgid "Rescan serial ports" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1928 +#: src/slic3r/GUI/Tab.cpp:1930 msgid "Connection to printer works correctly." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1931 +#: src/slic3r/GUI/Tab.cpp:1933 msgid "Connection failed." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1944 src/slic3r/GUI/Tab.cpp:2123 +#: src/slic3r/GUI/Tab.cpp:1946 src/slic3r/GUI/Tab.cpp:2125 msgid "Print Host upload" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1988 src/libslic3r/PrintConfig.cpp:153 +#: src/slic3r/GUI/Tab.cpp:1990 src/libslic3r/PrintConfig.cpp:153 msgid "Before layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1994 src/libslic3r/PrintConfig.cpp:1080 +#: src/slic3r/GUI/Tab.cpp:1996 src/libslic3r/PrintConfig.cpp:1080 msgid "After layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2000 src/libslic3r/PrintConfig.cpp:2093 +#: src/slic3r/GUI/Tab.cpp:2002 src/libslic3r/PrintConfig.cpp:2093 msgid "Tool change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2006 +#: src/slic3r/GUI/Tab.cpp:2008 msgid "Between objects G-code (for sequential printing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2078 +#: src/slic3r/GUI/Tab.cpp:2080 msgid "Display" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2093 +#: src/slic3r/GUI/Tab.cpp:2095 msgid "Tilt" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2094 +#: src/slic3r/GUI/Tab.cpp:2096 msgid "Tilt time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:3519 +#: src/slic3r/GUI/Tab.cpp:2102 src/slic3r/GUI/Tab.cpp:3521 msgid "Corrections" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:3515 +#: src/slic3r/GUI/Tab.cpp:2119 src/slic3r/GUI/Tab.cpp:3517 msgid "Exposure" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2188 src/slic3r/GUI/Tab.cpp:2273 +#: src/slic3r/GUI/Tab.cpp:2190 src/slic3r/GUI/Tab.cpp:2275 #: src/libslic3r/PrintConfig.cpp:1129 src/libslic3r/PrintConfig.cpp:1146 #: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1179 #: src/libslic3r/PrintConfig.cpp:1189 src/libslic3r/PrintConfig.cpp:1199 @@ -5453,175 +5459,175 @@ msgstr "" msgid "Machine limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2202 +#: src/slic3r/GUI/Tab.cpp:2204 msgid "Values in this column are for Normal mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2203 +#: src/slic3r/GUI/Tab.cpp:2205 msgid "Normal" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2208 +#: src/slic3r/GUI/Tab.cpp:2210 msgid "Values in this column are for Stealth mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2209 +#: src/slic3r/GUI/Tab.cpp:2211 msgid "Stealth" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2217 +#: src/slic3r/GUI/Tab.cpp:2219 msgid "Maximum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2222 +#: src/slic3r/GUI/Tab.cpp:2224 msgid "Maximum accelerations" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2229 +#: src/slic3r/GUI/Tab.cpp:2231 msgid "Jerk limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2234 +#: src/slic3r/GUI/Tab.cpp:2236 msgid "Minimum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2298 src/slic3r/GUI/Tab.cpp:2306 +#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/Tab.cpp:2308 msgid "Single extruder MM setup" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2307 +#: src/slic3r/GUI/Tab.cpp:2309 msgid "Single extruder multimaterial parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2338 +#: src/slic3r/GUI/Tab.cpp:2340 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2362 +#: src/slic3r/GUI/Tab.cpp:2364 msgid "Layer height limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2367 +#: src/slic3r/GUI/Tab.cpp:2369 msgid "Position (for multi-extruder printers)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2373 +#: src/slic3r/GUI/Tab.cpp:2375 msgid "Only lift Z" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2386 +#: src/slic3r/GUI/Tab.cpp:2388 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2394 +#: src/slic3r/GUI/Tab.cpp:2396 msgid "Reset to Filament Color" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:2577 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" "Shall I disable it in order to enable Firmware Retraction?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2577 +#: src/slic3r/GUI/Tab.cpp:2579 msgid "Firmware Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2919 +#: src/slic3r/GUI/Tab.cpp:2921 #, possible-c-format msgid "Default preset (%s)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2920 +#: src/slic3r/GUI/Tab.cpp:2922 #, possible-c-format msgid "Preset (%s)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2937 +#: src/slic3r/GUI/Tab.cpp:2939 msgid "has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2940 +#: src/slic3r/GUI/Tab.cpp:2942 msgid "is not compatible with printer" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2941 +#: src/slic3r/GUI/Tab.cpp:2943 msgid "is not compatible with print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2943 +#: src/slic3r/GUI/Tab.cpp:2945 msgid "and it has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2947 +#: src/slic3r/GUI/Tab.cpp:2949 msgid "Unsaved Changes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3045 +#: src/slic3r/GUI/Tab.cpp:3047 msgctxt "PresetName" msgid "%1% - Copy" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3068 +#: src/slic3r/GUI/Tab.cpp:3070 msgid "The supplied name is empty. It can't be saved." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3073 +#: src/slic3r/GUI/Tab.cpp:3075 msgid "Cannot overwrite a system profile." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3077 +#: src/slic3r/GUI/Tab.cpp:3079 msgid "Cannot overwrite an external profile." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3082 +#: src/slic3r/GUI/Tab.cpp:3084 msgid "Preset with name \"%1%\" already exists." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3083 +#: src/slic3r/GUI/Tab.cpp:3085 msgid "Replace?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3121 +#: src/slic3r/GUI/Tab.cpp:3123 msgid "remove" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3121 +#: src/slic3r/GUI/Tab.cpp:3123 msgid "delete" msgstr "" #. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:3123 +#: src/slic3r/GUI/Tab.cpp:3125 msgid "Are you sure you want to %1% the selected preset?" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3126 +#: src/slic3r/GUI/Tab.cpp:3128 msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3252 +#: src/slic3r/GUI/Tab.cpp:3254 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3254 +#: src/slic3r/GUI/Tab.cpp:3256 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3256 +#: src/slic3r/GUI/Tab.cpp:3258 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3258 +#: src/slic3r/GUI/Tab.cpp:3260 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -5629,23 +5635,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3263 +#: src/slic3r/GUI/Tab.cpp:3265 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3265 +#: src/slic3r/GUI/Tab.cpp:3267 msgid "" -"for the left button: \tindicates a non-system (or non-default) preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3268 +#: src/slic3r/GUI/Tab.cpp:3270 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3270 +#: src/slic3r/GUI/Tab.cpp:3272 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -5653,13 +5659,13 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3280 +#: src/slic3r/GUI/Tab.cpp:3282 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3282 +#: src/slic3r/GUI/Tab.cpp:3284 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -5667,17 +5673,17 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3285 +#: src/slic3r/GUI/Tab.cpp:3287 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3288 +#: src/slic3r/GUI/Tab.cpp:3290 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3290 +#: src/slic3r/GUI/Tab.cpp:3292 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -5685,26 +5691,26 @@ msgid "" "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3296 +#: src/slic3r/GUI/Tab.cpp:3298 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3297 +#: src/slic3r/GUI/Tab.cpp:3299 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" "Click to reset current value to the system (or default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3303 +#: src/slic3r/GUI/Tab.cpp:3305 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3304 +#: src/slic3r/GUI/Tab.cpp:3306 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -5712,36 +5718,36 @@ msgid "" msgstr "" #. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3417 +#: src/slic3r/GUI/Tab.cpp:3419 #, possible-c-format msgid "Save %s as:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3461 +#: src/slic3r/GUI/Tab.cpp:3463 msgid "the following suffix is not allowed:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3465 +#: src/slic3r/GUI/Tab.cpp:3467 msgid "The supplied name is not available." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3478 src/slic3r/GUI/Tab.cpp:3480 +#: src/slic3r/GUI/Tab.cpp:3480 src/slic3r/GUI/Tab.cpp:3482 msgid "Material" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3608 +#: src/slic3r/GUI/Tab.cpp:3610 msgid "Support head" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3613 +#: src/slic3r/GUI/Tab.cpp:3615 msgid "Support pillar" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3627 +#: src/slic3r/GUI/Tab.cpp:3631 msgid "Connection of the support sticks and junctions" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3632 +#: src/slic3r/GUI/Tab.cpp:3636 msgid "Automatic generation" msgstr "" @@ -5893,19 +5899,19 @@ msgid "" "choose whether to enable automatic preset updates." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:286 +#: src/slic3r/GUI/UpdateDialogs.cpp:287 msgid "For more information please visit our wiki page:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:303 +#: src/slic3r/GUI/UpdateDialogs.cpp:304 msgid "Configuration updates" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:303 +#: src/slic3r/GUI/UpdateDialogs.cpp:304 msgid "No updates available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:308 +#: src/slic3r/GUI/UpdateDialogs.cpp:309 #, possible-c-format msgid "%s has no configuration updates available." msgstr "" @@ -5999,30 +6005,30 @@ msgstr "" msgid "Show advanced settings" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:703 +#: src/slic3r/GUI/wxExtensions.cpp:706 #, possible-c-format msgid "Switch to the %s mode" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:704 +#: src/slic3r/GUI/wxExtensions.cpp:707 #, possible-c-format msgid "Current mode is %s" msgstr "" -#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:69 #, possible-c-format msgid "Mismatched type of print host: %s" msgstr "" -#: src/slic3r/Utils/AstroBox.cpp:83 +#: src/slic3r/Utils/AstroBox.cpp:84 msgid "Connection to AstroBox works correctly." msgstr "" -#: src/slic3r/Utils/AstroBox.cpp:89 +#: src/slic3r/Utils/AstroBox.cpp:90 msgid "Could not connect to AstroBox" msgstr "" -#: src/slic3r/Utils/AstroBox.cpp:89 +#: src/slic3r/Utils/AstroBox.cpp:92 msgid "Note: AstroBox version at least 1.1.0 is required." msgstr "" @@ -6030,21 +6036,21 @@ msgstr "" msgid "Connection to Duet works correctly." msgstr "" -#: src/slic3r/Utils/Duet.cpp:54 +#: src/slic3r/Utils/Duet.cpp:55 msgid "Could not connect to Duet" msgstr "" -#: src/slic3r/Utils/Duet.cpp:82 src/slic3r/Utils/Duet.cpp:137 -#: src/slic3r/Utils/FlashAir.cpp:119 src/slic3r/Utils/FlashAir.cpp:140 -#: src/slic3r/Utils/FlashAir.cpp:156 +#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:139 +#: src/slic3r/Utils/FlashAir.cpp:122 src/slic3r/Utils/FlashAir.cpp:143 +#: src/slic3r/Utils/FlashAir.cpp:159 msgid "Unknown error occured" msgstr "" -#: src/slic3r/Utils/Duet.cpp:131 +#: src/slic3r/Utils/Duet.cpp:133 msgid "Wrong password" msgstr "" -#: src/slic3r/Utils/Duet.cpp:134 +#: src/slic3r/Utils/Duet.cpp:136 msgid "Could not get resources to create a new connection" msgstr "" @@ -6137,33 +6143,33 @@ msgstr "" msgid "Connection to FlashAir works correctly and upload is enabled." msgstr "" -#: src/slic3r/Utils/FlashAir.cpp:73 +#: src/slic3r/Utils/FlashAir.cpp:74 msgid "Could not connect to FlashAir" msgstr "" -#: src/slic3r/Utils/FlashAir.cpp:73 +#: src/slic3r/Utils/FlashAir.cpp:76 msgid "" "Note: FlashAir with firmware 2.00.02 or newer and activated upload function " "is required." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:83 +#: src/slic3r/Utils/OctoPrint.cpp:84 msgid "Connection to OctoPrint works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:89 +#: src/slic3r/Utils/OctoPrint.cpp:90 msgid "Could not connect to OctoPrint" msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:89 +#: src/slic3r/Utils/OctoPrint.cpp:92 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:176 +#: src/slic3r/Utils/OctoPrint.cpp:179 msgid "Connection to Prusa SL1 works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:181 +#: src/slic3r/Utils/OctoPrint.cpp:185 msgid "Could not connect to Prusa SLA" msgstr "" @@ -6325,7 +6331,7 @@ msgstr "" #: src/libslic3r/GCode.cpp:639 msgid "" "This is usually caused by negligibly small extrusions or by a faulty model. " -"Try to repair the model or change its orientation on the bed." +"Try to repair the model or change its orientation on the bed." msgstr "" #: src/libslic3r/ExtrusionEntity.cpp:323 @@ -6502,34 +6508,34 @@ msgstr "" msgid "Generating G-code" msgstr "" -#: src/libslic3r/SLAPrint.cpp:613 +#: src/libslic3r/SLAPrint.cpp:615 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." msgstr "" -#: src/libslic3r/SLAPrint.cpp:625 +#: src/libslic3r/SLAPrint.cpp:627 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." msgstr "" -#: src/libslic3r/SLAPrint.cpp:631 +#: src/libslic3r/SLAPrint.cpp:633 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " "the 'Pad object gap' parameter to avoid this." msgstr "" -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:648 msgid "Exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:653 +#: src/libslic3r/SLAPrint.cpp:655 msgid "Initial exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:760 +#: src/libslic3r/SLAPrint.cpp:762 msgid "Slicing done" msgstr "" @@ -6670,10 +6676,6 @@ msgid "" "the API Key or the password required for authentication." msgstr "" -#: src/libslic3r/PrintConfig.cpp:111 -msgid "HTTPS CA File" -msgstr "" - #: src/libslic3r/PrintConfig.cpp:112 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " @@ -6786,8 +6788,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:207 src/libslic3r/PrintConfig.cpp:780 #: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1650 #: src/libslic3r/PrintConfig.cpp:1894 src/libslic3r/PrintConfig.cpp:2049 -#: src/libslic3r/PrintConfig.cpp:2247 src/libslic3r/PrintConfig.cpp:2727 -#: src/libslic3r/PrintConfig.cpp:2848 +#: src/libslic3r/PrintConfig.cpp:2247 src/libslic3r/PrintConfig.cpp:2737 +#: src/libslic3r/PrintConfig.cpp:2858 msgid "°" msgstr "" @@ -6802,7 +6804,7 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:215 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1282 #: src/libslic3r/PrintConfig.cpp:1532 src/libslic3r/PrintConfig.cpp:2425 -#: src/libslic3r/PrintConfig.cpp:2767 +#: src/libslic3r/PrintConfig.cpp:2777 msgid "%" msgstr "" @@ -7101,7 +7103,7 @@ msgid "Extra perimeters if needed" msgstr "" #: src/libslic3r/PrintConfig.cpp:479 -#, possible-c-format +#, no-c-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -7829,7 +7831,7 @@ msgid "This setting represents the maximum speed of your fan." msgstr "" #: src/libslic3r/PrintConfig.cpp:1227 -#, possible-c-format +#, no-c-format msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -8525,7 +8527,7 @@ msgid "" "plane." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2686 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -9188,134 +9190,144 @@ msgid "Diameter in mm of the support pillars" msgstr "" #: src/libslic3r/PrintConfig.cpp:2658 +msgid "Max bridges on a pillar" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2660 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2668 msgid "Support pillar connection mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2659 +#: src/libslic3r/PrintConfig.cpp:2669 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " "the first two depending on the distance of the two pillars." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2677 msgid "Zig-Zag" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2668 +#: src/libslic3r/PrintConfig.cpp:2678 msgid "Cross" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2679 msgid "Dynamic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2681 +#: src/libslic3r/PrintConfig.cpp:2691 msgid "Pillar widening factor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2683 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2692 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "Support base diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2704 msgid "Diameter in mm of the pillar base" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2712 msgid "Support base height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2714 msgid "The height of the pillar base cone" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2721 msgid "Support base safety distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "" "The minimum distance of the pillar base from the model in mm. Makes sense in " "zero elevation mode where a gap according to this parameter is inserted " "between the model and the pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2724 +#: src/libslic3r/PrintConfig.cpp:2734 msgid "Critical angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2726 +#: src/libslic3r/PrintConfig.cpp:2736 msgid "The default angle for connecting support sticks and junctions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2734 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "Max bridge length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2736 +#: src/libslic3r/PrintConfig.cpp:2746 msgid "The max length of a bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2743 +#: src/libslic3r/PrintConfig.cpp:2753 msgid "Max pillar linking distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2745 +#: src/libslic3r/PrintConfig.cpp:2755 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2763 msgid "Object elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2765 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2766 +#: src/libslic3r/PrintConfig.cpp:2776 msgid "This is a relative measure of support points density." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:2782 msgid "Minimal distance of the support points" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2774 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "No support points will be placed closer than this threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2780 +#: src/libslic3r/PrintConfig.cpp:2790 msgid "Use pad" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2782 +#: src/libslic3r/PrintConfig.cpp:2792 msgid "Add a pad underneath the supported model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2787 +#: src/libslic3r/PrintConfig.cpp:2797 msgid "Pad wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2789 +#: src/libslic3r/PrintConfig.cpp:2799 msgid "The thickness of the pad and its optional cavity walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2807 msgid "Pad wall height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2798 +#: src/libslic3r/PrintConfig.cpp:2808 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -9323,115 +9335,115 @@ msgid "" "difficult." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2821 msgid "Pad brim size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2812 +#: src/libslic3r/PrintConfig.cpp:2822 msgid "How far should the pad extend around the contained geometry" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2822 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "Max merge distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2824 +#: src/libslic3r/PrintConfig.cpp:2834 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " "be. If theyare closer, they will get merged into one pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2844 +#: src/libslic3r/PrintConfig.cpp:2854 msgid "Pad wall slope" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2846 +#: src/libslic3r/PrintConfig.cpp:2856 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2855 +#: src/libslic3r/PrintConfig.cpp:2865 msgid "Pad around object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2867 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2862 +#: src/libslic3r/PrintConfig.cpp:2872 msgid "Pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2864 +#: src/libslic3r/PrintConfig.cpp:2874 msgid "Force pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2869 +#: src/libslic3r/PrintConfig.cpp:2879 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2871 +#: src/libslic3r/PrintConfig.cpp:2881 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2880 +#: src/libslic3r/PrintConfig.cpp:2890 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2882 +#: src/libslic3r/PrintConfig.cpp:2892 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2889 +#: src/libslic3r/PrintConfig.cpp:2899 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2901 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2898 +#: src/libslic3r/PrintConfig.cpp:2908 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2901 +#: src/libslic3r/PrintConfig.cpp:2911 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2908 +#: src/libslic3r/PrintConfig.cpp:2918 msgid "Enable hollowing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2910 +#: src/libslic3r/PrintConfig.cpp:2920 msgid "Hollow out a model to have an empty interior" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2915 +#: src/libslic3r/PrintConfig.cpp:2925 msgid "Wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2917 +#: src/libslic3r/PrintConfig.cpp:2927 msgid "Minimum wall thickness of a hollowed model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2925 +#: src/libslic3r/PrintConfig.cpp:2935 msgid "Accuracy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2927 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2937 +#: src/libslic3r/PrintConfig.cpp:2947 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -9440,255 +9452,255 @@ msgid "" "most." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3320 +#: src/libslic3r/PrintConfig.cpp:3330 msgid "Export OBJ" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3321 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "Export the model(s) as OBJ." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3332 +#: src/libslic3r/PrintConfig.cpp:3342 msgid "Export SLA" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3343 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3348 msgid "Export 3MF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3349 msgid "Export the model(s) as 3MF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3343 +#: src/libslic3r/PrintConfig.cpp:3353 msgid "Export AMF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3344 +#: src/libslic3r/PrintConfig.cpp:3354 msgid "Export the model(s) as AMF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3348 +#: src/libslic3r/PrintConfig.cpp:3358 msgid "Export STL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3359 msgid "Export the model(s) as STL." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3364 msgid "Slice the model and export toolpaths as G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3359 +#: src/libslic3r/PrintConfig.cpp:3369 msgid "Slice" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3360 +#: src/libslic3r/PrintConfig.cpp:3370 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3375 msgid "Help" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3376 msgid "Show this help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3381 msgid "Help (FFF options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3372 +#: src/libslic3r/PrintConfig.cpp:3382 msgid "Show the full list of print/G-code configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3376 +#: src/libslic3r/PrintConfig.cpp:3386 msgid "Help (SLA options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3377 +#: src/libslic3r/PrintConfig.cpp:3387 msgid "Show the full list of SLA print configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3391 msgid "Output Model Info" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3382 +#: src/libslic3r/PrintConfig.cpp:3392 msgid "Write information about the model to the console." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3386 +#: src/libslic3r/PrintConfig.cpp:3396 msgid "Save config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3397 msgid "Save configuration to the specified file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3397 +#: src/libslic3r/PrintConfig.cpp:3407 msgid "Align XY" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3398 +#: src/libslic3r/PrintConfig.cpp:3408 msgid "Align the model to the given point." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3403 +#: src/libslic3r/PrintConfig.cpp:3413 msgid "Cut model at the given Z." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3424 +#: src/libslic3r/PrintConfig.cpp:3434 msgid "Center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3425 +#: src/libslic3r/PrintConfig.cpp:3435 msgid "Center the print around the given center." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3439 msgid "Don't arrange" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3430 +#: src/libslic3r/PrintConfig.cpp:3440 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:3443 msgid "Duplicate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3444 msgid "Multiply copies by this factor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3438 +#: src/libslic3r/PrintConfig.cpp:3448 msgid "Duplicate by grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3439 +#: src/libslic3r/PrintConfig.cpp:3449 msgid "Multiply copies by creating a grid." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3452 msgid "Merge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3443 +#: src/libslic3r/PrintConfig.cpp:3453 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3448 +#: src/libslic3r/PrintConfig.cpp:3458 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3452 +#: src/libslic3r/PrintConfig.cpp:3462 msgid "Rotation angle around the Z axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3466 msgid "Rotate around X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3457 +#: src/libslic3r/PrintConfig.cpp:3467 msgid "Rotation angle around the X axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3461 +#: src/libslic3r/PrintConfig.cpp:3471 msgid "Rotate around Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3462 +#: src/libslic3r/PrintConfig.cpp:3472 msgid "Rotation angle around the Y axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3467 +#: src/libslic3r/PrintConfig.cpp:3477 msgid "Scaling factor or percentage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3472 +#: src/libslic3r/PrintConfig.cpp:3482 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3475 +#: src/libslic3r/PrintConfig.cpp:3485 msgid "Scale to Fit" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3476 +#: src/libslic3r/PrintConfig.cpp:3486 msgid "Scale to fit the given volume." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3485 +#: src/libslic3r/PrintConfig.cpp:3495 msgid "Ignore non-existent config files" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3486 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "Do not fail if a file supplied to --load does not exist." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3499 msgid "Load config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:3500 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3493 +#: src/libslic3r/PrintConfig.cpp:3503 msgid "Output File" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3504 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3504 +#: src/libslic3r/PrintConfig.cpp:3514 msgid "Data directory" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3505 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " "storage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3518 msgid "Logging level" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3509 +#: src/libslic3r/PrintConfig.cpp:3519 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" "For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3515 +#: src/libslic3r/PrintConfig.cpp:3525 msgid "Render with a software renderer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3516 +#: src/libslic3r/PrintConfig.cpp:3526 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." From 0869a63eaf1822825ba4710ef81889ac4a2bce51 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 5 Mar 2020 15:03:48 +0100 Subject: [PATCH 07/37] Fix of #3769 - wipe into infill --- src/libslic3r/GCode/ToolOrdering.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index db7c58a9ce..9bdda3a4c2 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -212,10 +212,8 @@ void ToolOrdering::collect_extruders(const PrintObject &object, const std::vecto if (m_print_config_ptr) { // in this case complete_objects is false (see ToolOrdering constructors) something_nonoverriddable = false; for (const auto& eec : layerm->perimeters.entities) // let's check if there are nonoverriddable entities - if (!layer_tools.wiping_extrusions().is_overriddable_and_mark(dynamic_cast(*eec), *m_print_config_ptr, object, region)) { + if (!layer_tools.wiping_extrusions().is_overriddable_and_mark(dynamic_cast(*eec), *m_print_config_ptr, object, region)) something_nonoverriddable = true; - break; - } } if (something_nonoverriddable) @@ -237,7 +235,7 @@ void ToolOrdering::collect_extruders(const PrintObject &object, const std::vecto has_infill = true; if (m_print_config_ptr) { - if (!something_nonoverriddable && !layer_tools.wiping_extrusions().is_overriddable_and_mark(*fill, *m_print_config_ptr, object, region)) + if (! layer_tools.wiping_extrusions().is_overriddable_and_mark(*fill, *m_print_config_ptr, object, region)) something_nonoverriddable = true; } } From 85bf78f7e779d838404bef0854bc7c29fd20dbbb Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 4 Mar 2020 15:18:44 +0100 Subject: [PATCH 08/37] Fix of #3765 - relaxed empty layer detection --- src/libslic3r/GCode.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 55e0c26e4e..cfc60ffe35 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -632,8 +632,11 @@ std::vector GCode::collect_layers_to_print(const PrintObjec // Negative support_contact_z is not taken into account, it can result in false positives in cases // where previous layer has object extrusions too (https://github.com/prusa3d/PrusaSlicer/issues/2752) + // Only check this layer in case it has some extrusions. + bool has_extrusions = (layer_to_print.object_layer && layer_to_print.object_layer->has_extrusions()) + || (layer_to_print.support_layer && layer_to_print.support_layer->has_extrusions()); - if (layer_to_print.print_z() > maximal_print_z + 2. * EPSILON) + if (has_extrusions && layer_to_print.print_z() > maximal_print_z + 2. * EPSILON) throw std::runtime_error(_(L("Empty layers detected, the output would not be printable.")) + "\n\n" + _(L("Object name")) + ": " + object.model_object()->name + "\n" + _(L("Print z")) + ": " + std::to_string(layers_to_print.back().print_z()) + "\n\n" + _(L("This is " From 6f67a5bcccadfc74ffbb75f2e05aac6b7424a341 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 6 Mar 2020 14:22:14 +0100 Subject: [PATCH 09/37] Fixed : * the editing of extruder color from PresetComboBox, when incompatible filament preset is selected and red flag is shown. *OSX specific bug : empty icons for PresetComboBox had non-scaled width --- src/slic3r/GUI/Plater.cpp | 17 +++++++++++------ src/slic3r/GUI/PresetBundle.cpp | 20 +++++++++++--------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 0ebad64d1c..739a4e50b9 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -296,15 +296,20 @@ PresetBitmapComboBox(parent, wxSize(15 * wxGetApp().em_unit(), -1)), if (preset_type == Slic3r::Preset::TYPE_FILAMENT) { Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &event) { - int shifl_Left = 0; + PresetBundle* preset_bundle = wxGetApp().preset_bundle; + const Preset* selected_preset = preset_bundle->filaments.find_preset(preset_bundle->filament_presets[extruder_idx]); + // Wide icons are shown if the currently selected preset is not compatible with the current printer, + // and red flag is drown in front of the selected preset. + bool wide_icons = selected_preset != nullptr && !selected_preset->is_compatible; float scale = m_em_unit*0.1f; + + int shifl_Left = wide_icons ? int(scale * 16 + 0.5) : 0; #if defined(wxBITMAPCOMBOBOX_OWNERDRAWN_BASED) - shifl_Left = int(scale * 4 + 0.5f); // IMAGE_SPACING_RIGHT = 4 for wxBitmapComboBox -> Space left of image + shifl_Left += int(scale * 4 + 0.5f); // IMAGE_SPACING_RIGHT = 4 for wxBitmapComboBox -> Space left of image #endif - int icon_right_pos = int(scale * (24+4) + 0.5); + int icon_right_pos = shifl_Left + int(scale * (24+4) + 0.5); int mouse_pos = event.GetLogicalPosition(wxClientDC(this)).x; -// if (extruder_idx < 0 || event.GetLogicalPosition(wxClientDC(this)).x > 24) { - if ( extruder_idx < 0 || mouse_pos < shifl_Left || mouse_pos > icon_right_pos ) { + if (mouse_pos < shifl_Left || mouse_pos > icon_right_pos ) { // Let the combo box process the mouse click. event.Skip(); return; @@ -333,7 +338,7 @@ PresetBitmapComboBox(parent, wxSize(15 * wxGetApp().em_unit(), -1)), cfg_new.set_key_value("extruder_colour", colors); wxGetApp().get_tab(Preset::TYPE_PRINTER)->load_config(cfg_new); - wxGetApp().preset_bundle->update_plater_filament_ui(extruder_idx, this); + preset_bundle->update_plater_filament_ui(extruder_idx, this); wxGetApp().plater()->on_config_change(cfg_new); } }); diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index 5c9dc2ec9a..3aa947f1b2 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -1599,21 +1599,23 @@ void PresetBundle::update_plater_filament_ui(unsigned int idx_extruder, GUI::Pre // To avoid asserts, each added bitmap to wxBitmapCombobox should be the same size, so // set a bitmap height to m_bitmapLock->GetHeight() - // Note, under OSX we should use a ScaledHeight because of Retina scale + // + // To avoid asserts, each added bitmap to wxBitmapCombobox should be the same size. + // But for some display scaling (for example 125% or 175%) normal_icon_width differs from icon width. + // So: + // for nonsystem presets set a width of empty bitmap to m_bitmapLock->GetWidth() + // for compatible presets set a width of empty bitmap to m_bitmapIncompatible->GetWidth() + // + // Note, under OSX we should use a Scaled Height/Width because of Retina scale #ifdef __APPLE__ const int icon_height = m_bitmapLock->GetScaledHeight(); + const int lock_icon_width = m_bitmapLock->GetScaledWidth(); + const int flag_icon_width = m_bitmapIncompatible->GetScaledWidth(); #else const int icon_height = m_bitmapLock->GetHeight(); -#endif - - /* To avoid asserts, each added bitmap to wxBitmapCombobox should be the same size. - * But for some display scaling (for example 125% or 175%) normal_icon_width differs from icon width. - * So: - * for nonsystem presets set a width of empty bitmap to m_bitmapLock->GetWidth() - * for compatible presets set a width of empty bitmap to m_bitmapIncompatible->GetWidth() - **/ const int lock_icon_width = m_bitmapLock->GetWidth(); const int flag_icon_width = m_bitmapIncompatible->GetWidth(); +#endif wxString tooltip = ""; From fa001801704fbc96c08a8160145e1f64789dd074 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 6 Mar 2020 14:44:06 +0100 Subject: [PATCH 10/37] Fixed uninitialized "Connected" flag of the Mouse3DController after refactoring. --- src/slic3r/GUI/Mouse3DController.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Mouse3DController.hpp b/src/slic3r/GUI/Mouse3DController.hpp index 5d6b5ba8cf..e686e12cc2 100644 --- a/src/slic3r/GUI/Mouse3DController.hpp +++ b/src/slic3r/GUI/Mouse3DController.hpp @@ -139,7 +139,7 @@ class Mouse3DController std::map m_params_by_device; mutable State m_state; - std::atomic m_connected; + std::atomic m_connected { false }; std::string m_device_str; #if ! __APPLE__ From baad542d15cb250b570114133f37ac2ca3aa1fa3 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 6 Mar 2020 14:49:21 +0100 Subject: [PATCH 11/37] Refactoring of RemovableDriveManager 1) On Windows and Linux, polling of removable drives is done at a background thread, not at a UI thread. 2) On OSX, there is no polling, but a OS notification callback. 3) Refactored for clarity of the RemovableDriveManager interface. --- src/slic3r/GUI/BackgroundSlicingProcess.cpp | 5 +- src/slic3r/GUI/Event.hpp | 17 +- src/slic3r/GUI/GUI_App.cpp | 6 +- src/slic3r/GUI/GUI_App.hpp | 8 +- src/slic3r/GUI/MainFrame.cpp | 4 + src/slic3r/GUI/Mouse3DController.cpp | 5 +- src/slic3r/GUI/Plater.cpp | 148 ++-- src/slic3r/GUI/Plater.hpp | 1 - src/slic3r/GUI/RemovableDriveManager.cpp | 840 +++++++++----------- src/slic3r/GUI/RemovableDriveManager.hpp | 204 ++--- src/slic3r/GUI/RemovableDriveManagerMM.mm | 155 ++-- 11 files changed, 640 insertions(+), 753 deletions(-) diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.cpp b/src/slic3r/GUI/BackgroundSlicingProcess.cpp index 536d6d6344..8921960bba 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.cpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.cpp @@ -101,10 +101,9 @@ void BackgroundSlicingProcess::process_fff() //FIXME localize the messages // Perform the final post-processing of the export path by applying the print statistics over the file name. std::string export_path = m_fff_print->print_statistics().finalize_output_path(m_export_path); - GUI::RemovableDriveManager::get_instance().update(); - bool with_check = GUI::RemovableDriveManager::get_instance().is_path_on_removable_drive(export_path); + bool with_check = GUI::wxGetApp().removable_drive_manager()->is_path_on_removable_drive(export_path); int copy_ret_val = copy_file(m_temp_output_path, export_path, with_check); - switch (copy_ret_val){ + switch (copy_ret_val) { case SUCCESS: break; // no error case FAIL_COPY_FILE: throw std::runtime_error(_utf8(L("Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?"))); diff --git a/src/slic3r/GUI/Event.hpp b/src/slic3r/GUI/Event.hpp index 429ef99b02..b9816a747e 100644 --- a/src/slic3r/GUI/Event.hpp +++ b/src/slic3r/GUI/Event.hpp @@ -40,11 +40,19 @@ template struct ArrayEvent : public wxEvent return new ArrayEvent(GetEventType(), data, GetEventObject()); } }; -template struct ArrayEvent : public wxEvent + +template struct Event : public wxEvent { T data; - ArrayEvent(wxEventType type, T data, wxObject* origin = nullptr) + Event(wxEventType type, const T &data, wxObject* origin = nullptr) + : wxEvent(0, type), data(std::move(data)) + { + m_propagationLevel = wxEVENT_PROPAGATE_MAX; + SetEventObject(origin); + } + + Event(wxEventType type, T&& data, wxObject* origin = nullptr) : wxEvent(0, type), data(std::move(data)) { m_propagationLevel = wxEVENT_PROPAGATE_MAX; @@ -53,13 +61,10 @@ template struct ArrayEvent : public wxEvent virtual wxEvent* Clone() const { - return new ArrayEvent(GetEventType(), data, GetEventObject()); + return new Event(GetEventType(), data, GetEventObject()); } }; -template using Event = ArrayEvent; - - } } diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 7ca8753a18..40d818e930 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -155,6 +155,7 @@ GUI_App::GUI_App() , m_em_unit(10) , m_imgui(new ImGuiWrapper()) , m_wizard(nullptr) + , m_removable_drive_manager(std::make_unique()) {} GUI_App::~GUI_App() @@ -262,7 +263,6 @@ bool GUI_App::on_init_inner() m_printhost_job_queue.reset(new PrintHostJobQueue(mainframe->printhost_queue_dlg())); - RemovableDriveManager::get_instance().init(); Bind(wxEVT_IDLE, [this](wxIdleEvent& event) { @@ -274,10 +274,6 @@ bool GUI_App::on_init_inner() this->obj_manipul()->update_if_dirty(); -#if !__APPLE__ - RemovableDriveManager::get_instance().update(wxGetLocalTime(), true); -#endif - // Preset updating & Configwizard are done after the above initializations, // and after MainFrame is created & shown. // The extra CallAfter() is needed because of Mac, where this is the only way diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 10b09b1da7..d02a60ba91 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -29,9 +29,9 @@ class PresetUpdater; class ModelObject; class PrintHostJobQueue; -namespace GUI -{ +namespace GUI{ +class RemovableDriveManager; enum FileType { FT_STL, @@ -96,6 +96,8 @@ class GUI_App : public wxApp // Best translation language, provided by Windows or OSX, owned by wxWidgets. const wxLanguageInfo *m_language_info_best = nullptr; + std::unique_ptr m_removable_drive_manager; + std::unique_ptr m_imgui; std::unique_ptr m_printhost_job_queue; ConfigWizard* m_wizard; // Managed by wxWindow tree @@ -180,6 +182,8 @@ public: std::vector tabs_list; + RemovableDriveManager* removable_drive_manager() { return m_removable_drive_manager.get(); } + ImGuiWrapper* imgui() { return m_imgui.get(); } PrintHostJobQueue& printhost_job_queue() { return *m_printhost_job_queue.get(); } diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 2bbdaaffcf..834ec6ff0a 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -25,6 +25,7 @@ #include "wxExtensions.hpp" #include "GUI_ObjectList.hpp" #include "Mouse3DController.hpp" +#include "RemovableDriveManager.hpp" #include "I18N.hpp" #include @@ -124,6 +125,9 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S // Store the device parameter database back to appconfig. m_plater->get_mouse3d_controller().save_config(*wxGetApp().app_config); + // Stop the background thread of the removable drive manager, so that no new updates will be sent to the Plater. + wxGetApp().removable_drive_manager()->shutdown(); + // Save the slic3r.ini.Usually the ini file is saved from "on idle" callback, // but in rare cases it may not have been called yet. wxGetApp().app_config->save(); diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp index 6781ba9ff2..8bc9744f1f 100644 --- a/src/slic3r/GUI/Mouse3DController.cpp +++ b/src/slic3r/GUI/Mouse3DController.cpp @@ -451,12 +451,13 @@ void Mouse3DController::shutdown() // Stop the worker thread, if running. { // Notify the worker thread to cancel wait on detection polling. - std::unique_lock lock(m_stop_condition_mutex); + std::lock_guard lock(m_stop_condition_mutex); m_stop = true; - m_stop_condition.notify_all(); } + m_stop_condition.notify_all(); // Wait for the worker thread to stop. m_thread.join(); + m_stop = false; } } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 613a6246f8..278d8ab654 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1958,6 +1958,11 @@ struct Plater::priv wxString get_project_filename(const wxString& extension = wxEmptyString) const; void set_project_filename(const wxString& filename); + // Caching last value of show_action_buttons parameter for show_action_buttons(), so that a callback which does not know this state will not override it. + mutable bool ready_to_slice = { false }; + // Flag indicating that the G-code export targets a removable device, therefore the show_action_buttons() needs to be called at any case when the background processing finishes. + bool writing_to_removable_device = { false }; + private: bool init_object_menu(); bool init_common_menu(wxMenu* menu, const bool is_part = false); @@ -1983,8 +1988,8 @@ private: * we should call tack_snapshot just ones * instead of calls for each action separately * */ - std::string m_last_fff_printer_profile_name; - std::string m_last_sla_printer_profile_name; + std::string m_last_fff_printer_profile_name; + std::string m_last_sla_printer_profile_name; }; const std::regex Plater::priv::pattern_bundle(".*[.](amf|amf[.]xml|zip[.]amf|3mf|prusa)", std::regex::icase); @@ -2156,11 +2161,17 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) // Connect to a 3DConnextion driver (OSX). mouse3d_controller.init(); + this->q->Bind(EVT_REMOVABLE_DRIVE_EJECTED, [this](RemovableDriveEjectEvent &evt) { + this->show_action_buttons(this->ready_to_slice); + Slic3r::GUI::show_info(this->q, (boost::format(_utf8(L("Unmounting successful. The device %s(%s) can now be safely removed from the computer."))) + % evt.data.name % evt.data.path).str()); + }); + this->q->Bind(EVT_REMOVABLE_DRIVES_CHANGED, [this](RemovableDrivesChangedEvent &) { this->show_action_buttons(this->ready_to_slice); }); + // Start the background thread and register this window as a target for update events. + wxGetApp().removable_drive_manager()->init(this->q); + // Initialize the Undo / Redo stack with a first snapshot. this->take_snapshot(_(L("New Project"))); - - //void Plater::priv::show_action_buttons(const bool is_ready_to_slice) const - RemovableDriveManager::get_instance().set_drive_count_changed_callback(std::bind(&Plater::priv::show_action_buttons, this, std::placeholders::_1)); } Plater::priv::~priv() @@ -3702,14 +3713,9 @@ void Plater::priv::on_process_completed(wxCommandEvent &evt) sidebar->set_btn_label(ActionButtonType::abReslice, "Slice now"); show_action_buttons(true); } - else if (wxGetApp().get_mode() == comSimple) - show_action_buttons(false); - - if(!canceled && RemovableDriveManager::get_instance().get_is_writing()) - { - RemovableDriveManager::get_instance().set_is_writing(false); - show_action_buttons(false); - } + else if (this->writing_to_removable_device || wxGetApp().get_mode() == comSimple) + show_action_buttons(false); + this->writing_to_removable_device = false; } void Plater::priv::on_layer_editing_toggled(bool enable) @@ -4269,32 +4275,36 @@ void Plater::priv::update_object_menu() sidebar->obj_list()->append_menu_items_add_volume(&object_menu); } -void Plater::priv::show_action_buttons(const bool is_ready_to_slice) const +void Plater::priv::show_action_buttons(const bool ready_to_slice) const { - RemovableDriveManager::get_instance().set_plater_ready_to_slice(is_ready_to_slice); + // Cache this value, so that the callbacks from the RemovableDriveManager may repeat that value when calling show_action_buttons(). + this->ready_to_slice = ready_to_slice; + wxWindowUpdateLocker noUpdater(sidebar); const auto prin_host_opt = config->option("print_host"); const bool send_gcode_shown = prin_host_opt != nullptr && !prin_host_opt->value.empty(); - bool disconnect_shown = !RemovableDriveManager::get_instance().is_last_drive_removed(); - bool export_removable_shown = RemovableDriveManager::get_instance().get_drives_count() > 0; // when a background processing is ON, export_btn and/or send_btn are showing if (wxGetApp().app_config->get("background_processing") == "1") { + RemovableDriveManager::RemovableDrivesStatus removable_media_status = wxGetApp().removable_drive_manager()->status(); if (sidebar->show_reslice(false) | sidebar->show_export(true) | sidebar->show_send(send_gcode_shown) | - sidebar->show_export_removable(export_removable_shown) | - sidebar->show_disconnect(disconnect_shown)) + sidebar->show_export_removable(removable_media_status.has_removable_drives) | + sidebar->show_disconnect(removable_media_status.has_eject)) sidebar->Layout(); } else { - if (sidebar->show_reslice(is_ready_to_slice) | - sidebar->show_export(!is_ready_to_slice) | - sidebar->show_send(send_gcode_shown && !is_ready_to_slice) | - sidebar->show_export_removable(export_removable_shown && !is_ready_to_slice) | - sidebar->show_disconnect(disconnect_shown && !is_ready_to_slice)) + RemovableDriveManager::RemovableDrivesStatus removable_media_status; + if (! ready_to_slice) + removable_media_status = wxGetApp().removable_drive_manager()->status(); + if (sidebar->show_reslice(ready_to_slice) | + sidebar->show_export(!ready_to_slice) | + sidebar->show_send(send_gcode_shown && !ready_to_slice) | + sidebar->show_export_removable(!ready_to_slice && removable_media_status.has_removable_drives) | + sidebar->show_disconnect(!ready_to_slice && removable_media_status.has_eject)) sidebar->Layout(); } } @@ -4827,51 +4837,38 @@ void Plater::export_gcode(bool prefer_removable) return; } default_output_file = fs::path(Slic3r::fold_utf8_to_ascii(default_output_file.string())); - auto start_dir = wxGetApp().app_config->get_last_output_dir(default_output_file.parent_path().string()); - bool removable_drives_connected = GUI::RemovableDriveManager::get_instance().update(); - if(prefer_removable) - { - if(removable_drives_connected) - { - auto start_dir_removable = wxGetApp().app_config->get_last_output_dir(default_output_file.parent_path().string(), true); - if (RemovableDriveManager::get_instance().is_path_on_removable_drive(start_dir_removable)) - { - start_dir = start_dir_removable; - }else - { - start_dir = RemovableDriveManager::get_instance().get_drive_path(); - } - } + AppConfig &appconfig = *wxGetApp().app_config; + RemovableDriveManager &removable_drive_manager = *wxGetApp().removable_drive_manager(); + // Get a last save path, either to removable media or to an internal media. + std::string start_dir = appconfig.get_last_output_dir(default_output_file.parent_path().string(), prefer_removable); + if (prefer_removable) { + // Returns a path to a removable media if it exists, prefering start_dir. Update the internal removable drives database. + start_dir = removable_drive_manager.get_removable_drive_path(start_dir); + if (start_dir.empty()) + // Direct user to the last internal media. + start_dir = appconfig.get_last_output_dir(default_output_file.parent_path().string(), false); } - wxFileDialog dlg(this, (printer_technology() == ptFFF) ? _(L("Save G-code file as:")) : _(L("Save SL1 file as:")), - start_dir, - from_path(default_output_file.filename()), - GUI::file_wildcards((printer_technology() == ptFFF) ? FT_GCODE : FT_PNGZIP, default_output_file.extension().string()), - wxFD_SAVE | wxFD_OVERWRITE_PROMPT - ); fs::path output_path; - if (dlg.ShowModal() == wxID_OK) { - fs::path path = into_path(dlg.GetPath()); - wxGetApp().app_config->update_last_output_dir(path.parent_path().string(), RemovableDriveManager::get_instance().is_path_on_removable_drive(path.parent_path().string())); - output_path = std::move(path); + { + wxFileDialog dlg(this, (printer_technology() == ptFFF) ? _(L("Save G-code file as:")) : _(L("Save SL1 file as:")), + start_dir, + from_path(default_output_file.filename()), + GUI::file_wildcards((printer_technology() == ptFFF) ? FT_GCODE : FT_PNGZIP, default_output_file.extension().string()), + wxFD_SAVE | wxFD_OVERWRITE_PROMPT + ); + if (dlg.ShowModal() == wxID_OK) + output_path = into_path(dlg.GetPath()); } - if (! output_path.empty()) - { - std::string path = output_path.string(); - p->export_gcode(std::move(output_path), PrintHostJob()); - RemovableDriveManager::get_instance().update(0, false); - RemovableDriveManager::get_instance().set_last_save_path(path); - RemovableDriveManager::get_instance().verify_last_save_path(); - - if(!RemovableDriveManager::get_instance().is_last_drive_removed()) - { - RemovableDriveManager::get_instance().set_is_writing(true); - RemovableDriveManager::get_instance().erase_callbacks(); - RemovableDriveManager::get_instance().add_remove_callback(std::bind(&Plater::drive_ejected_callback, this)); - } - + if (! output_path.empty()) { + p->export_gcode(output_path, PrintHostJob()); + bool path_on_removable_media = removable_drive_manager.set_and_verify_last_save_path(output_path.string()); + // Storing a path to AppConfig either as path to removable media or a path to internal media. + // is_path_on_removable_drive() is called with the "true" parameter to update its internal database as the user may have shuffled the external drives + // while the dialog was open. + appconfig.update_last_output_dir(output_path.parent_path().string(), path_on_removable_media); + p->writing_to_removable_device = path_on_removable_media; } } @@ -5193,28 +5190,11 @@ void Plater::send_gcode() } } +// Called when the Eject button is pressed. void Plater::eject_drive() { - RemovableDriveManager::get_instance().update(0, true); - RemovableDriveManager::get_instance().erase_callbacks(); - RemovableDriveManager::get_instance().add_remove_callback(std::bind(&Plater::drive_ejected_callback, this)); - RemovableDriveManager::get_instance().eject_drive(RemovableDriveManager::get_instance().get_last_save_path()); - + wxGetApp().removable_drive_manager()->eject_drive(); } -void Plater::drive_ejected_callback() -{ - if (RemovableDriveManager::get_instance().get_did_eject()) - { - RemovableDriveManager::get_instance().set_did_eject(false); - show_info(this, - (boost::format(_utf8(L("Unmounting successful. The device %s(%s) can now be safely removed from the computer."))) - % RemovableDriveManager::get_instance().get_ejected_name() - % RemovableDriveManager::get_instance().get_ejected_path()).str()); - } - p->show_action_buttons(false); -} - - void Plater::take_snapshot(const std::string &snapshot_name) { p->take_snapshot(snapshot_name); } void Plater::take_snapshot(const wxString &snapshot_name) { p->take_snapshot(snapshot_name); } @@ -5597,7 +5577,7 @@ void Plater::suppress_background_process(const bool stop_background_process) void Plater::fix_through_netfabb(const int obj_idx, const int vol_idx/* = -1*/) { p->fix_through_netfabb(obj_idx, vol_idx); } void Plater::update_object_menu() { p->update_object_menu(); } -void Plater::show_action_buttons(const bool is_ready_to_slice) const { p->show_action_buttons(is_ready_to_slice); } +void Plater::show_action_buttons(const bool ready_to_slice) const { p->show_action_buttons(ready_to_slice); } void Plater::copy_selection_to_clipboard() { diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 249e0a043c..dbf7069882 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -213,7 +213,6 @@ public: void fix_through_netfabb(const int obj_idx, const int vol_idx = -1); void send_gcode(); void eject_drive(); - void drive_ejected_callback(); void take_snapshot(const std::string &snapshot_name); void take_snapshot(const wxString &snapshot_name); diff --git a/src/slic3r/GUI/RemovableDriveManager.cpp b/src/slic3r/GUI/RemovableDriveManager.cpp index aa7a3d6a31..c97a745af2 100644 --- a/src/slic3r/GUI/RemovableDriveManager.cpp +++ b/src/slic3r/GUI/RemovableDriveManager.cpp @@ -1,6 +1,8 @@ #include "RemovableDriveManager.hpp" -#include -#include "boost/nowide/convert.hpp" +#include + +#include +#include #if _WIN32 #include @@ -9,11 +11,9 @@ #include #include -GUID WceusbshGUID = { 0x25dbce51, 0x6c8f, 0x4a72, - 0x8a,0x6d,0xb5,0x4c,0x2b,0x4f,0xc8,0x35 }; #else -//linux includes +// unix, linux & OSX includes #include #include #include @@ -26,124 +26,171 @@ GUID WceusbshGUID = { 0x25dbce51, 0x6c8f, 0x4a72, namespace Slic3r { namespace GUI { +wxDEFINE_EVENT(EVT_REMOVABLE_DRIVE_EJECTED, RemovableDriveEjectEvent); +wxDEFINE_EVENT(EVT_REMOVABLE_DRIVES_CHANGED, RemovableDrivesChangedEvent); + #if _WIN32 -/* currently not used, left for possible future use -INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); -*/ -void RemovableDriveManager::search_for_drives() +std::vector RemovableDriveManager::search_for_removable_drives() const { - m_current_drives.clear(); //get logical drives flags by letter in alphabetical order - DWORD drives_mask = GetLogicalDrives(); - for (size_t i = 0; i < 26; i++) - { - if(drives_mask & (1 << i)) - { - std::string path (1,(char)('A' + i)); - path+=":"; - UINT drive_type = GetDriveTypeA(path.c_str()); + DWORD drives_mask = ::GetLogicalDrives(); + + // Allocate the buffers before the loop. + std::wstring volume_name; + volume_name.resize(MAX_PATH + 1); + std::wstring file_system_name; + file_system_name.resize(MAX_PATH + 1); + + // Iterate the Windows drives from 'A' to 'Z' + std::vector current_drives; + for (size_t i = 0; i < 26; ++ i) + if (drives_mask & (1 << i)) { + std::string path { char('A' + i), ':' }; + UINT drive_type = ::GetDriveTypeA(path.c_str()); // DRIVE_REMOVABLE on W are sd cards and usb thumbnails (not usb harddrives) - if (drive_type == DRIVE_REMOVABLE) - { + if (drive_type == DRIVE_REMOVABLE) { // get name of drive std::wstring wpath = boost::nowide::widen(path); - std::wstring volume_name; - volume_name.resize(1024); - std::wstring file_system_name; - file_system_name.resize(1024); - LPWSTR lp_volume_name_buffer = new wchar_t; - BOOL error = GetVolumeInformationW(wpath.c_str(), &volume_name[0], sizeof(volume_name), NULL, NULL, NULL, &file_system_name[0], sizeof(file_system_name)); - if(error != 0) - { - volume_name.erase(std::find(volume_name.begin(), volume_name.end(), '\0'), volume_name.end()); - if (file_system_name != L"") - { + BOOL error = ::GetVolumeInformationW(wpath.c_str(), volume_name.data(), sizeof(volume_name), nullptr, nullptr, nullptr, file_system_name.data(), sizeof(file_system_name)); + if (error != 0) { + volume_name.erase(volume_name.begin() + wcslen(volume_name.c_str()), volume_name.end()); + if (! file_system_name.empty()) { ULARGE_INTEGER free_space; - GetDiskFreeSpaceExA(path.c_str(), &free_space, NULL, NULL); - if (free_space.QuadPart > 0) - { + ::GetDiskFreeSpaceExA(path.c_str(), &free_space, nullptr, nullptr); + if (free_space.QuadPart > 0) { path += "\\"; - m_current_drives.push_back(DriveData(boost::nowide::narrow(volume_name), path)); + current_drives.emplace_back(DriveData{ boost::nowide::narrow(volume_name), path }); } } } } } + return current_drives; +} + +// Called from UI therefore it blocks the UI thread. +// It also blocks updates at the worker thread. +// Win32 implementation. +void RemovableDriveManager::eject_drive() +{ + if (m_last_save_path.empty()) + return; + +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + this->update(); +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + + tbb::mutex::scoped_lock lock(m_drives_mutex); + auto it_drive_data = this->find_last_save_path_drive_data(); + if (it_drive_data != m_current_drives.end()) { + // get handle to device + std::string mpath = "\\\\.\\" + m_last_save_path; + mpath = mpath.substr(0, mpath.size() - 1); + HANDLE handle = CreateFileA(mpath.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr); + if (handle == INVALID_HANDLE_VALUE) { + std::cerr << "Ejecting " << mpath << " failed " << GetLastError() << " \n"; + return; + } + DWORD deviceControlRetVal(0); + //these 3 commands should eject device safely but they dont, the device does disappear from file explorer but the "device was safely remove" notification doesnt trigger. + //sd cards does trigger WM_DEVICECHANGE messege, usb drives dont + DeviceIoControl(handle, FSCTL_LOCK_VOLUME, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr); + DeviceIoControl(handle, FSCTL_DISMOUNT_VOLUME, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr); + // some implemenatations also calls IOCTL_STORAGE_MEDIA_REMOVAL here but it returns error to me + BOOL error = DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr); + if (error == 0) { + CloseHandle(handle); + BOOST_LOG_TRIVIAL(error) << "Ejecting " << mpath << " failed " << deviceControlRetVal << " " << GetLastError() << " \n"; + return; + } + CloseHandle(handle); + m_drive_data_last_eject = *it_drive_data; } } -void RemovableDriveManager::eject_drive(const std::string &path) + +std::string RemovableDriveManager::get_removable_drive_path(const std::string &path) { - if(m_current_drives.empty()) - return; - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + this->update(); +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + + tbb::mutex::scoped_lock lock(m_drives_mutex); + if (m_current_drives.empty()) + return std::string(); + std::size_t found = path.find_last_of("\\"); + std::string new_path = path.substr(0, found); + int letter = PathGetDriveNumberA(new_path.c_str()); + for (const DriveData &drive_data : m_current_drives) { + char drive = drive_data.path[0]; + if (drive == 'A' + letter) + return path; + } + return m_current_drives.front().path; +} + +std::string RemovableDriveManager::get_removable_drive_from_path(const std::string& path) +{ + tbb::mutex::scoped_lock lock(m_drives_mutex); + std::size_t found = path.find_last_of("\\"); + std::string new_path = path.substr(0, found); + int letter = PathGetDriveNumberA(new_path.c_str()); + for (const DriveData &drive_data : m_current_drives) { + assert(! drive_data.path.empty()); + if (drive_data.path.front() == 'A' + letter) + return drive_data.path; + } + return std::string(); +} + +#if 0 +// currently not used, left for possible future use +INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + // here we need to catch messeges about device removal + // problem is that when ejecting usb (how is it implemented above) there is no messege dispached. Only after physical removal of the device. + //uncomment register_window() in init() to register and comment update() in GUI_App.cpp (only for windows!) to stop recieving periodical updates + + LRESULT lRet = 1; + static HDEVNOTIFY hDeviceNotify; + static constexpr GUID WceusbshGUID = { 0x25dbce51, 0x6c8f, 0x4a72, 0x8a,0x6d,0xb5,0x4c,0x2b,0x4f,0xc8,0x35 }; + + switch (message) { - if ((*it).path == path) + case WM_CREATE: + DEV_BROADCAST_DEVICEINTERFACE NotificationFilter; + + ZeroMemory(&NotificationFilter, sizeof(NotificationFilter)); + NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); + NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; + NotificationFilter.dbcc_classguid = WceusbshGUID; + + hDeviceNotify = RegisterDeviceNotification(hWnd, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE); + break; + + case WM_DEVICECHANGE: + { + // here is the important + if(wParam == DBT_DEVICEREMOVECOMPLETE) { - // get handle to device - std::string mpath = "\\\\.\\" + path; - mpath = mpath.substr(0, mpath.size() - 1); - HANDLE handle = CreateFileA(mpath.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr); - if (handle == INVALID_HANDLE_VALUE) - { - std::cerr << "Ejecting " << mpath << " failed " << GetLastError() << " \n"; - return; - } - DWORD deviceControlRetVal(0); - //these 3 commands should eject device safely but they dont, the device does disappear from file explorer but the "device was safely remove" notification doesnt trigger. - //sd cards does trigger WM_DEVICECHANGE messege, usb drives dont - - DeviceIoControl(handle, FSCTL_LOCK_VOLUME, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr); - DeviceIoControl(handle, FSCTL_DISMOUNT_VOLUME, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr); - // some implemenatations also calls IOCTL_STORAGE_MEDIA_REMOVAL here but it returns error to me - BOOL error = DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr); - if (error == 0) - { - CloseHandle(handle); - std::cerr << "Ejecting " << mpath << " failed " << deviceControlRetVal << " " << GetLastError() << " \n"; - return; - } - CloseHandle(handle); - m_did_eject = true; - m_current_drives.erase(it); - m_ejected_path = m_last_save_path; - m_ejected_name = m_last_save_name; - break; + RemovableDriveManager::get_instance().update(0, true); } } -} -bool RemovableDriveManager::is_path_on_removable_drive(const std::string &path) -{ - if (m_current_drives.empty()) - return false; - std::size_t found = path.find_last_of("\\"); - std::string new_path = path.substr(0, found); - int letter = PathGetDriveNumberA(new_path.c_str()); - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) - { - char drive = (*it).path[0]; - if (drive == ('A' + letter)) - return true; + break; + + default: + // Send all other messages on to the default windows handler. + lRet = DefWindowProc(hWnd, message, wParam, lParam); + break; } - return false; -} -std::string RemovableDriveManager::get_drive_from_path(const std::string& path) -{ - std::size_t found = path.find_last_of("\\"); - std::string new_path = path.substr(0, found); - int letter = PathGetDriveNumberA(new_path.c_str()); - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) - { - char drive = (*it).path[0]; - if (drive == ('A' + letter)) - return (*it).path; - } - return ""; + return lRet; + } + void RemovableDriveManager::register_window() { //creates new unvisible window that is recieving callbacks from system // structure to register - /* currently not used, left for possible future use + // currently not used, left for possible future use WNDCLASSEX wndClass; wndClass.cbSize = sizeof(WNDCLASSEX); wndClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; @@ -179,432 +226,291 @@ void RemovableDriveManager::register_window() } //ShowWindow(hWnd, SW_SHOWNORMAL); UpdateWindow(hWnd); - */ } -/* currently not used, left for possible future use -INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +#endif + +#else + +namespace search_for_drives_internal { - // here we need to catch messeges about device removal - // problem is that when ejecting usb (how is it implemented above) there is no messege dispached. Only after physical removal of the device. - //uncomment register_window() in init() to register and comment update() in GUI_App.cpp (only for windows!) to stop recieving periodical updates - - LRESULT lRet = 1; - static HDEVNOTIFY hDeviceNotify; - - switch (message) + static bool compare_filesystem_id(const std::string &path_a, const std::string &path_b) { - case WM_CREATE: - DEV_BROADCAST_DEVICEINTERFACE NotificationFilter; + struct stat buf; + stat(path_a.c_str() ,&buf); + dev_t id_a = buf.st_dev; + stat(path_b.c_str() ,&buf); + dev_t id_b = buf.st_dev; + return id_a == id_b; + } - ZeroMemory(&NotificationFilter, sizeof(NotificationFilter)); - NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); - NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; - NotificationFilter.dbcc_classguid = WceusbshGUID; - - hDeviceNotify = RegisterDeviceNotification(hWnd, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE); - break; - - case WM_DEVICECHANGE: + void inspect_file(const std::string &path, const std::string &parent_path, std::vector &out) { - // here is the important - if(wParam == DBT_DEVICEREMOVECOMPLETE) - { -- RemovableDriveManager::get_instance().update(0, true); + //confirms if the file is removable drive and adds it to vector + + //if not same file system - could be removable drive + if (! compare_filesystem_id(path, parent_path)) { + //free space + boost::filesystem::space_info si = boost::filesystem::space(path); + if (si.available != 0) { + //user id + struct stat buf; + stat(path.c_str(), &buf); + uid_t uid = buf.st_uid; + std::string username(std::getenv("USER")); + struct passwd *pw = getpwuid(uid); + if (pw != 0 && pw->pw_name == username) + out.emplace_back(DriveData{ boost::filesystem::basename(boost::filesystem::path(path)), path }); + } } } - break; - - default: - // Send all other messages on to the default windows handler. - lRet = DefWindowProc(hWnd, message, wParam, lParam); - break; - } - return lRet; - -} -*/ -#else -void RemovableDriveManager::search_for_drives() -{ - - m_current_drives.clear(); - -#if __APPLE__ - // if on macos obj-c class will enumerate - if(m_rdmmm) - { - m_rdmmm->list_devices(); - } -#else + static void search_path(const std::string &path, const std::string &parent_path, std::vector &out) + { + glob_t globbuf; + globbuf.gl_offs = 2; + int error = glob(path.c_str(), GLOB_TILDE, NULL, &globbuf); + if (error == 0) { + for (size_t i = 0; i < globbuf.gl_pathc; ++ i) + inspect_file(globbuf.gl_pathv[i], parent_path, out); + } else { + //if error - path probably doesnt exists so function just exits + //std::cout<<"glob error "<< error<< "\n"; + } + globfree(&globbuf); + } +} + +std::vector RemovableDriveManager::search_for_removable_drives() const +{ + std::vector current_drives; + +#if __APPLE__ + + this->list_devices(current_drives); + +#else //search /media/* folder - search_path("/media/*", "/media"); + search_for_drives_internal::search_path("/media/*", "/media", current_drives); //search_path("/Volumes/*", "/Volumes"); std::string path(std::getenv("USER")); std::string pp(path); - { - //search /media/USERNAME/* folder - pp = "/media/"+pp; - path = "/media/" + path + "/*"; - search_path(path, pp); + //search /media/USERNAME/* folder + pp = "/media/"+pp; + path = "/media/" + path + "/*"; + search_for_drives_internal::search_path(path, pp, current_drives); - //search /run/media/USERNAME/* folder - path = "/run" + path; - pp = "/run"+pp; - search_path(path, pp); - - } + //search /run/media/USERNAME/* folder + path = "/run" + path; + pp = "/run"+pp; + search_for_drives_internal::search_path(path, pp, current_drives); #endif -} -void RemovableDriveManager::search_path(const std::string &path,const std::string &parent_path) -{ - glob_t globbuf; - globbuf.gl_offs = 2; - int error = glob(path.c_str(), GLOB_TILDE, NULL, &globbuf); - if(error == 0) - { - for(size_t i = 0; i < globbuf.gl_pathc; i++) - { - inspect_file(globbuf.gl_pathv[i], parent_path); - } - }else - { - //if error - path probably doesnt exists so function just exits - //std::cout<<"glob error "<< error<< "\n"; - } - - globfree(&globbuf); -} -void RemovableDriveManager::inspect_file(const std::string &path, const std::string &parent_path) -{ - //confirms if the file is removable drive and adds it to vector - //if not same file system - could be removable drive - if(!compare_filesystem_id(path, parent_path)) - { - //free space - boost::filesystem::space_info si = boost::filesystem::space(path); - if(si.available != 0) - { - //user id - struct stat buf; - stat(path.c_str(), &buf); - uid_t uid = buf.st_uid; - std::string username(std::getenv("USER")); - struct passwd *pw = getpwuid(uid); - if (pw != 0 && pw->pw_name == username) - m_current_drives.push_back(DriveData(boost::filesystem::basename(boost::filesystem::path(path)), path)); - } - - } + return current_drives; } -bool RemovableDriveManager::compare_filesystem_id(const std::string &path_a, const std::string &path_b) + +// Called from UI therefore it blocks the UI thread. +// It also blocks updates at the worker thread. +// Unix & OSX implementation. +void RemovableDriveManager::eject_drive() { - struct stat buf; - stat(path_a.c_str() ,&buf); - dev_t id_a = buf.st_dev; - stat(path_b.c_str() ,&buf); - dev_t id_b = buf.st_dev; - return id_a == id_b; -} -void RemovableDriveManager::eject_drive(const std::string &path) -{ - if (m_current_drives.empty()) + if (m_last_save_path.empty()) return; - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) - { - if((*it).path == path) - { - - std::string correct_path(path); - for (size_t i = 0; i < correct_path.size(); ++i) - { - if(correct_path[i]==' ') - { - correct_path = correct_path.insert(i,1,'\\'); - i++; - } - } - //std::cout<<"Ejecting "<<(*it).name<<" from "<< correct_path<<"\n"; -// there is no usable command in c++ so terminal command is used instead -// but neither triggers "succesful safe removal messege" - std::string command = ""; -#if __APPLE__ - //m_rdmmm->eject_device(path); - command = "diskutil unmount "; -#else - command = "umount "; -#endif - command += correct_path; - int err = system(command.c_str()); - if(err) - { - std::cerr<<"Ejecting failed\n"; - return; - } +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + this->update(); +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS - m_did_eject = true; - m_current_drives.erase(it); - m_ejected_path = m_last_save_path; - m_ejected_name = m_last_save_name; - break; + tbb::mutex::scoped_lock lock(m_drives_mutex); + auto it_drive_data = this->find_last_save_path_drive_data(); + if (it_drive_data != m_current_drives.end()) { + std::string correct_path(m_last_save_path); + for (size_t i = 0; i < correct_path.size(); ++i) + if (correct_path[i]==' ') { + correct_path = correct_path.insert(i,1,'\\'); + ++ i; + } + //std::cout<<"Ejecting "<<(*it).name<<" from "<< correct_path<<"\n"; + // there is no usable command in c++ so terminal command is used instead + // but neither triggers "succesful safe removal messege" + std::string command = +#if __APPLE__ + //this->eject_device(m_last_save_path); + "diskutil unmount "; +#else + "umount "; +#endif + command += correct_path; + int err = system(command.c_str()); + if (err) { + BOOST_LOG_TRIVIAL(error) << "Ejecting " << m_last_save_path << " failed"; + return; } + m_drive_data_last_eject = *it_drive_data; } +} -} -bool RemovableDriveManager::is_path_on_removable_drive(const std::string &path) +std::string RemovableDriveManager::get_removable_drive_path(const std::string &path) { - if (m_current_drives.empty()) - return false; +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + this->update(); +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + std::size_t found = path.find_last_of("/"); std::string new_path = found == path.size() - 1 ? path.substr(0, found) : path; - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) - { - if(compare_filesystem_id(new_path, (*it).path)) - return true; - } - return false; + + tbb::mutex::scoped_lock lock(m_drives_mutex); + for (const DriveData &data : m_current_drives) + if (search_for_drives_internal::compare_filesystem_id(new_path, data.path)) + return path; + return m_current_drives.empty() ? std::string() : m_current_drives.front().path; } -std::string RemovableDriveManager::get_drive_from_path(const std::string& path) + +std::string RemovableDriveManager::get_removable_drive_from_path(const std::string& path) { std::size_t found = path.find_last_of("/"); std::string new_path = found == path.size() - 1 ? path.substr(0, found) : path; - // trim the filename found = new_path.find_last_of("/"); new_path = new_path.substr(0, found); - //check if same filesystem - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) - { - if (compare_filesystem_id(new_path, (*it).path)) - return (*it).path; - } - return ""; + // check if same filesystem + tbb::mutex::scoped_lock lock(m_drives_mutex); + for (const DriveData &drive_data : m_current_drives) + if (search_for_drives_internal::compare_filesystem_id(new_path, drive_data.path)) + return drive_data.path; + return std::string(); } #endif -RemovableDriveManager::RemovableDriveManager(): - m_drives_count(0), - m_last_update(0), - m_last_save_path(""), - m_last_save_name(""), - m_last_save_path_verified(false), - m_is_writing(false), - m_did_eject(false), - m_plater_ready_to_slice(true), - m_ejected_path(""), - m_ejected_name("") -#if __APPLE__ - , m_rdmmm(new RDMMMWrapper()) -#endif -{} -RemovableDriveManager::~RemovableDriveManager() +void RemovableDriveManager::init(wxEvtHandler *callback_evt_handler) { -#if __APPLE__ - delete m_rdmmm; -#endif -} -void RemovableDriveManager::init() -{ - //add_callback([](void) { RemovableDriveManager::get_instance().print(); }); + assert(! m_initialized); + assert(m_callback_evt_handler == nullptr); + + if (m_initialized) + return; + + m_initialized = true; + m_callback_evt_handler = callback_evt_handler; + #if _WIN32 - //register_window(); + //this->register_window_msw(); #elif __APPLE__ - m_rdmmm->register_window(); + this->register_window_osx(); #endif - update(0, true); -} -bool RemovableDriveManager::update(const long time,const bool check) -{ - if(time != 0) //time = 0 is forced update - { - long diff = m_last_update - time; - if(diff <= -2) - { - m_last_update = time; - }else - { - return false; // return value shouldnt matter if update didnt run - } - } - search_for_drives(); - if (m_drives_count != m_current_drives.size()) - { - if (check) - { - check_and_notify(); - } - m_drives_count = m_current_drives.size(); - } - return !m_current_drives.empty(); + +#ifdef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + this->update(); +#else // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + // Don't call update() manually, as the UI triggered APIs call this->update() anyways. + m_thread = boost::thread((boost::bind(&RemovableDriveManager::thread_proc, this))); +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS } -bool RemovableDriveManager::is_drive_mounted(const std::string &path) const +void RemovableDriveManager::shutdown() { - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) - { - if ((*it).path == path) +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + if (m_thread.joinable()) { + // Stop the worker thread, if running. { - return true; + // Notify the worker thread to cancel wait on detection polling. + std::lock_guard lck(m_thread_stop_mutex); + m_stop = true; + } + m_thread_stop_condition.notify_all(); + // Wait for the worker thread to stop. + m_thread.join(); + m_stop = false; + } +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + +#if _WIN32 + //this->unregister_window_msw(); +#elif __APPLE__ + this->unregister_window_osx(); +#endif + + m_initialized = false; +} + +bool RemovableDriveManager::set_and_verify_last_save_path(const std::string &path) +{ +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + this->update(); +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + + m_last_save_path = this->get_removable_drive_from_path(path); + return ! m_last_save_path.empty(); +} + +RemovableDriveManager::RemovableDrivesStatus RemovableDriveManager::status() +{ +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + this->update(); +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + + RemovableDriveManager::RemovableDrivesStatus out; + { + tbb::mutex::scoped_lock lock(m_drives_mutex); + out.has_eject = this->find_last_save_path_drive_data() != m_current_drives.end(); + out.has_removable_drives = ! m_current_drives.empty(); + } + if (! out.has_eject) + m_last_save_path.clear(); + return out; +} + +// Update is called from thread_proc() and from most of the public methods on demand. +void RemovableDriveManager::update() +{ + std::vector current_drives = this->search_for_removable_drives(); + + // Post update events. + tbb::mutex::scoped_lock lock(m_drives_mutex); + std::sort(current_drives.begin(), current_drives.end()); + if (current_drives != m_current_drives) { + if (! m_drive_data_last_eject.empty() && std::find(current_drives.begin(), current_drives.end(), m_drive_data_last_eject) == current_drives.end()) { + assert(m_callback_evt_handler); + if (m_callback_evt_handler) + wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::move(m_drive_data_last_eject))); + m_drive_data_last_eject.clear(); + } else { + assert(m_callback_evt_handler); + if (m_callback_evt_handler) + wxPostEvent(m_callback_evt_handler, RemovableDrivesChangedEvent(EVT_REMOVABLE_DRIVES_CHANGED)); } } - return false; + m_current_drives = std::move(current_drives); } -std::string RemovableDriveManager::get_drive_path() + +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS +void RemovableDriveManager::thread_proc() { - if (m_current_drives.size() == 0) - { - reset_last_save_path(); - return ""; - } - if (m_last_save_path_verified) - return m_last_save_path; - return m_current_drives.back().path; -} -std::string RemovableDriveManager::get_last_save_path() const -{ - if (!m_last_save_path_verified) - return ""; - return m_last_save_path; -} -std::string RemovableDriveManager::get_last_save_name() const -{ - return m_last_save_name; -} -std::vector RemovableDriveManager::get_all_drives() const -{ - return m_current_drives; -} -void RemovableDriveManager::check_and_notify() -{ - if(m_drive_count_changed_callback) - { - m_drive_count_changed_callback(m_plater_ready_to_slice); - } - if(m_callbacks.size() != 0 && m_drives_count > m_current_drives.size() && !is_drive_mounted(m_last_save_path)) - { - for (auto it = m_callbacks.begin(); it != m_callbacks.end(); ++it) + for (;;) { + // Wait for 2 seconds before running the disk enumeration. + // Cancellable. { - (*it)(); + std::unique_lock lck(m_thread_stop_mutex); + m_thread_stop_condition.wait_for(lck, std::chrono::seconds(2), [this]{ return m_stop; }); } + if (m_stop) + // Stop the worker thread. + break; + // Update m_current drives and send out update events. + this->update(); } } -void RemovableDriveManager::add_remove_callback(std::function callback) +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + +std::vector::const_iterator RemovableDriveManager::find_last_save_path_drive_data() const { - m_callbacks.push_back(callback); + return Slic3r::binary_find_by_predicate(m_current_drives.begin(), m_current_drives.end(), + [this](const DriveData &data){ return data.path < m_last_save_path; }, + [this](const DriveData &data){ return data.path == m_last_save_path; }); } -void RemovableDriveManager::erase_callbacks() -{ - m_callbacks.clear(); -} -void RemovableDriveManager::set_drive_count_changed_callback(std::function callback) -{ - m_drive_count_changed_callback = callback; -} -void RemovableDriveManager::set_plater_ready_to_slice(bool b) -{ - m_plater_ready_to_slice = b; -} -void RemovableDriveManager::set_last_save_path(const std::string& path) -{ - if(m_last_save_path_verified)// if old path is on drive - { - if(get_drive_from_path(path) != "") //and new is too, rewrite the path - { - m_last_save_path_verified = false; - m_last_save_path = path; - }//else do nothing - }else - { - m_last_save_path = path; - } -} -void RemovableDriveManager::verify_last_save_path() -{ - std::string last_drive = get_drive_from_path(m_last_save_path); - if (last_drive != "") - { - m_last_save_path_verified = true; - m_last_save_path = last_drive; - m_last_save_name = get_drive_name(last_drive); - }else - { - reset_last_save_path(); - } -} -std::string RemovableDriveManager::get_drive_name(const std::string& path) const -{ - if (m_current_drives.size() == 0) - return ""; - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) - { - if ((*it).path == path) - { - return (*it).name; - } - } - return ""; -} -bool RemovableDriveManager::is_last_drive_removed() -{ - if(!m_last_save_path_verified) - { - return true; - } - bool r = !is_drive_mounted(m_last_save_path); - if (r) - { - reset_last_save_path(); - } - return r; -} -bool RemovableDriveManager::is_last_drive_removed_with_update(const long time) -{ - update(time, false); - return is_last_drive_removed(); -} -void RemovableDriveManager::reset_last_save_path() -{ - m_last_save_path_verified = false; - m_last_save_path = ""; - m_last_save_name = ""; -} -void RemovableDriveManager::set_is_writing(const bool b) -{ - m_is_writing = b; - if (b) - { - m_did_eject = false; - } -} -bool RemovableDriveManager::get_is_writing() const -{ - return m_is_writing; -} -bool RemovableDriveManager::get_did_eject() const -{ - return m_did_eject; -} -void RemovableDriveManager::set_did_eject(const bool b) -{ - m_did_eject = b; -} -size_t RemovableDriveManager::get_drives_count() const -{ - return m_current_drives.size(); -} -std::string RemovableDriveManager::get_ejected_path() const -{ - return m_ejected_path; -} -std::string RemovableDriveManager::get_ejected_name() const -{ - return m_ejected_name; -} -}}//namespace Slicer::Gui + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/RemovableDriveManager.hpp b/src/slic3r/GUI/RemovableDriveManager.hpp index 032eef682b..3b808d9d79 100644 --- a/src/slic3r/GUI/RemovableDriveManager.hpp +++ b/src/slic3r/GUI/RemovableDriveManager.hpp @@ -3,119 +3,129 @@ #include #include -#include + +#include +#include +#include + +// Custom wxWidget events +#include "Event.hpp" namespace Slic3r { namespace GUI { -#if __APPLE__ -class RDMMMWrapper; -#endif - + struct DriveData { std::string name; std::string path; - DriveData(std::string n, std::string p):name(n),path(p){} + + void clear() { + name.clear(); + path.clear(); + } + bool empty() const { + return path.empty(); + } }; + +inline bool operator< (const DriveData &lhs, const DriveData &rhs) { return lhs.path < rhs.path; } +inline bool operator> (const DriveData &lhs, const DriveData &rhs) { return lhs.path > rhs.path; } +inline bool operator==(const DriveData &lhs, const DriveData &rhs) { return lhs.path == rhs.path; } + +using RemovableDriveEjectEvent = Event; +wxDECLARE_EVENT(EVT_REMOVABLE_DRIVE_EJECTED, RemovableDriveEjectEvent); + +using RemovableDrivesChangedEvent = SimpleEvent; +wxDECLARE_EVENT(EVT_REMOVABLE_DRIVES_CHANGED, RemovableDrivesChangedEvent); + +#if __APPLE__ + // Callbacks on device plug / unplug work reliably on OSX. + #define REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS +#endif // __APPLE__ + class RemovableDriveManager { -#if __APPLE__ -friend class RDMMMWrapper; -#endif public: - static RemovableDriveManager& get_instance() - { - static RemovableDriveManager instance; - return instance; - } + RemovableDriveManager() = default; RemovableDriveManager(RemovableDriveManager const&) = delete; void operator=(RemovableDriveManager const&) = delete; - ~RemovableDriveManager(); - //call only once. on apple register for unmnount callbacks. on windows register for device notification is prepared but not called (eject usb drive on widnows doesnt trigger the callback, sdc ard does), also enumerates devices for first time so init shoud be called on linux too. - void init(); - //update() searches for removable devices, returns false if empty. /time = 0 is forced update, time expects wxGetLocalTime() - bool update(const long time = 0,const bool check = false); - bool is_drive_mounted(const std::string &path) const; - void eject_drive(const std::string &path); - //returns path to last drive which was used, if none was used, returns device that was enumerated last - std::string get_last_save_path() const; - std::string get_last_save_name() const; - //returns path to last drive which was used, if none was used, returns empty string - std::string get_drive_path(); - std::vector get_all_drives() const; - bool is_path_on_removable_drive(const std::string &path); - // callback will notify only if device with last save path was removed - void add_remove_callback(std::function callback); - // erases all remove callbacks added by add_remove_callback() - void erase_callbacks(); - //drive_count_changed callback is called on every added or removed device - void set_drive_count_changed_callback(std::function callback); - //thi serves to set correct value for drive_count_changed callback - void set_plater_ready_to_slice(bool b); - // marks one of the eveices in vector as last used - void set_last_save_path(const std::string &path); - void verify_last_save_path(); - bool is_last_drive_removed(); - // param as update() - bool is_last_drive_removed_with_update(const long time = 0); - void set_is_writing(const bool b); - bool get_is_writing() const; - bool get_did_eject() const; - void set_did_eject(const bool b); - std::string get_drive_name(const std::string& path) const; - size_t get_drives_count() const; - std::string get_ejected_path() const; - std::string get_ejected_name() const; -private: - RemovableDriveManager(); - void search_for_drives(); - //triggers callbacks if last used drive was removed - void check_and_notify(); - //returns drive path (same as path in DriveData) if exists otherwise empty string "" - std::string get_drive_from_path(const std::string& path); - void reset_last_save_path(); + ~RemovableDriveManager() { assert(! m_initialized); } + + // Start the background thread and register this window as a target for update events. + // Register for OSX notifications. + void init(wxEvtHandler *callback_evt_handler); + // Stop the background thread of the removable drive manager, so that no new updates will be sent out. + // Deregister OSX notifications. + void shutdown(); + + // Returns path to a removable media if it exists, prefering the input path. + std::string get_removable_drive_path(const std::string &path); + bool is_path_on_removable_drive(const std::string &path) { return this->get_removable_drive_path(path) == path; } + + // Verify whether the path provided is on removable media. If so, save the path for further eject and return true, otherwise return false. + bool set_and_verify_last_save_path(const std::string &path); + // Eject drive of a file set by set_and_verify_last_save_path(). + void eject_drive(); + + struct RemovableDrivesStatus { + bool has_removable_drives { false }; + bool has_eject { false }; + }; + RemovableDrivesStatus status(); + + // Enumerates current drives and sends out wxWidget events on change or eject. + // Called by each public method, by the background thread and from RemovableDriveManagerMM::on_device_unmount OSX notification handler. + // Not to be called manually. + // Public to be accessible from RemovableDriveManagerMM::on_device_unmount OSX notification handler. + // It would be better to make this method private and friend to RemovableDriveManagerMM, but RemovableDriveManagerMM is an ObjectiveC class. + void update(); + +private: + bool m_initialized { false }; + wxEvtHandler* m_callback_evt_handler { nullptr }; + +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + // Worker thread, worker thread synchronization and callbacks to the UI thread. + void thread_proc(); + boost::thread m_thread; + std::condition_variable m_thread_stop_condition; + mutable std::mutex m_thread_stop_mutex; + bool m_stop { false }; +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + + // Called from update() to enumerate removable drives. + std::vector search_for_removable_drives() const; + + // m_current_drives is guarded by m_drives_mutex + // sorted ascending by path + std::vector m_current_drives; + // When user requested an eject, the drive to be forcefuly ejected is stored here, so the next update will + // recognize that the eject was finished with success and an eject event is sent out. + // guarded with m_drives_mutex + DriveData m_drive_data_last_eject; + mutable tbb::mutex m_drives_mutex; + + // Returns drive path (same as path in DriveData) if exists otherwise empty string. + std::string get_removable_drive_from_path(const std::string& path); + // Returns iterator to a drive in m_current_drives with path equal to m_last_save_path or end(). + std::vector::const_iterator find_last_save_path_drive_data() const; + // Set with set_and_verify_last_save_path() to a removable drive path to be ejected. + std::string m_last_save_path; - std::vector m_current_drives; - std::vector> m_callbacks; - std::function m_drive_count_changed_callback; - size_t m_drives_count; - long m_last_update; - std::string m_last_save_path; - bool m_last_save_path_verified; - std::string m_last_save_name; - bool m_is_writing;//on device - bool m_did_eject; - bool m_plater_ready_to_slice; - std::string m_ejected_path; - std::string m_ejected_name; #if _WIN32 //registers for notifications by creating invisible window - void register_window(); -#else -#if __APPLE__ - RDMMMWrapper * m_rdmmm; - #endif - void search_path(const std::string &path, const std::string &parent_path); - bool compare_filesystem_id(const std::string &path_a, const std::string &path_b); - void inspect_file(const std::string &path, const std::string &parent_path); -#endif -}; -// apple wrapper for RemovableDriveManagerMM which searches for drives and/or ejects them -#if __APPLE__ -class RDMMMWrapper -{ -public: - RDMMMWrapper(); - ~RDMMMWrapper(); - void register_window(); - void list_devices(); + //void register_window_msw(); +#elif __APPLE__ + void register_window_osx(); + void unregister_window_osx(); + void list_devices(std::vector &out) const; + // not used as of now void eject_device(const std::string &path); - void log(const std::string &msg); -protected: - void *m_imp; - //friend void RemovableDriveManager::inspect_file(const std::string &path, const std::string &parent_path); + // Opaque pointer to RemovableDriveManagerMM + void *m_impl_osx; +#endif }; -#endif -}} -#endif +}} + +#endif // slic3r_GUI_RemovableDriveManager_hpp_ diff --git a/src/slic3r/GUI/RemovableDriveManagerMM.mm b/src/slic3r/GUI/RemovableDriveManagerMM.mm index 01d38b1855..c2f55bb790 100644 --- a/src/slic3r/GUI/RemovableDriveManagerMM.mm +++ b/src/slic3r/GUI/RemovableDriveManagerMM.mm @@ -1,5 +1,6 @@ #import "RemovableDriveManager.hpp" #import "RemovableDriveManagerMM.h" +#import "GUI_App.hpp" #import #import @@ -10,22 +11,23 @@ -(instancetype) init { self = [super init]; - if(self) - { - } + //if(self){} return self; } + -(void) on_device_unmount: (NSNotification*) notification { - NSLog(@"on device change"); - Slic3r::GUI::RemovableDriveManager::get_instance().update(0,true); + //NSLog(@"on device change"); + Slic3r::GUI::wxGetApp().removable_drive_manager()->update(); } + -(void) add_unmount_observer { - NSLog(@"add unmount observer"); + //NSLog(@"add unmount observer"); [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector: @selector(on_device_unmount:) name:NSWorkspaceDidUnmountNotification object:nil]; [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector: @selector(on_device_unmount:) name:NSWorkspaceDidMountNotification object:nil]; } + -(NSArray*) list_dev { // DEPRICATED: @@ -40,118 +42,99 @@ DADiskRef disk; DASessionRef session; CFDictionaryRef descDict; - session = DASessionCreate(NULL); - if (session == NULL) { + session = DASessionCreate(nullptr); + if (session == nullptr) err = EINVAL; - } if (err == 0) { - disk = DADiskCreateFromVolumePath(NULL,session,(CFURLRef)volURL); - if (session == NULL) { + disk = DADiskCreateFromVolumePath(nullptr,session,(CFURLRef)volURL); + if (session == nullptr) err = EINVAL; - } } if (err == 0) { descDict = DADiskCopyDescription(disk); - if (descDict == NULL) { + if (descDict == nullptr) err = EINVAL; - } } if (err == 0) { CFTypeRef mediaEjectableKey = CFDictionaryGetValue(descDict,kDADiskDescriptionMediaEjectableKey); BOOL ejectable = [mediaEjectableKey boolValue]; CFTypeRef deviceProtocolName = CFDictionaryGetValue(descDict,kDADiskDescriptionDeviceProtocolKey); CFTypeRef deviceModelKey = CFDictionaryGetValue(descDict, kDADiskDescriptionDeviceModelKey); - if (mediaEjectableKey != NULL) - { + if (mediaEjectableKey != nullptr) { BOOL op = ejectable && (CFEqual(deviceProtocolName, CFSTR("USB")) || CFEqual(deviceModelKey, CFSTR("SD Card Reader"))); //!CFEqual(deviceModelKey, CFSTR("Disk Image")); - // - if (op) { + if (op) [result addObject:volURL.path]; - } } } - if (descDict != NULL) { + if (descDict != nullptr) CFRelease(descDict); - } - - } return result; } + +//this eject drive is not used now -(void)eject_drive:(NSString *)path { DADiskRef disk; DASessionRef session; NSURL *url = [[NSURL alloc] initFileURLWithPath:path]; int err = 0; - session = DASessionCreate(NULL); - if (session == NULL) { + session = DASessionCreate(nullptr); + if (session == nullptr) err = EINVAL; - } - if (err == 0) { - disk = DADiskCreateFromVolumePath(NULL,session,(CFURLRef)url); - } + if (err == 0) + disk = DADiskCreateFromVolumePath(nullptr,session,(CFURLRef)url); if( err == 0) - { - DADiskUnmount(disk, kDADiskUnmountOptionDefault, - NULL, NULL); - } - if (disk != NULL) { + DADiskUnmount(disk, kDADiskUnmountOptionDefault, nullptr, nullptr); + if (disk != nullptr) CFRelease(disk); - } - if (session != NULL) { + if (session != nullptr) CFRelease(session); - } } -namespace Slic3r { -namespace GUI { -RDMMMWrapper::RDMMMWrapper():m_imp(nullptr){ - m_imp = [[RemovableDriveManagerMM alloc] init]; -} -RDMMMWrapper::~RDMMMWrapper() -{ - if(m_imp) - { - [m_imp release]; - } -} -void RDMMMWrapper::register_window() -{ - if(m_imp) - { - [m_imp add_unmount_observer]; - } -} -void RDMMMWrapper::list_devices() -{ - if(m_imp) - { - NSArray* devices = [m_imp list_dev]; - for (NSString* volumePath in devices) - { - NSLog(@"%@", volumePath); - Slic3r::GUI::RemovableDriveManager::get_instance().inspect_file(std::string([volumePath UTF8String]), "/Volumes"); - } - } -} -void RDMMMWrapper::log(const std::string &msg) -{ - NSLog(@"%s", msg.c_str()); -} -void RDMMMWrapper::eject_device(const std::string &path) -{ - if(m_imp) - { - NSString * pth = [NSString stringWithCString:path.c_str() - encoding:[NSString defaultCStringEncoding]]; - [m_imp eject_drive:pth]; - } -} -}}//namespace Slicer::GUI - -/* - -*/ @end + +namespace Slic3r { +namespace GUI { + +void RemovableDriveManager::register_window_osx() +{ + assert(m_impl_osx == nullptr); + m_impl_osx = [[RemovableDriveManagerMM alloc] init]; + if (m_impl_osx) + [m_impl_osx add_unmount_observer]; +} + +void RemovableDriveManager::unregister_window_osx() +{ + if (m_impl_osx) + [m_impl_osx release]; +} + +namespace search_for_drives_internal +{ + void inspect_file(const std::string &path, const std::string &parent_path, std::vector &out); +} + +void RemovableDriveManager::list_devices(std::vector &out) const +{ + assert(m_impl_osx != nullptr); + if (m_impl_osx) { + NSArray* devices = [m_impl_osx list_dev]; + for (NSString* volumePath in devices) + search_for_drives_internal::inspect_file(std::string([volumePath UTF8String]), "/Volumes", out); + } +} + +// not used as of now +void RemovableDriveManager::eject_device(const std::string &path) +{ + assert(m_impl_osx != nullptr); + if (m_impl_osx) { + NSString * pth = [NSString stringWithCString:path.c_str() encoding:[NSString defaultCStringEncoding]]; + [m_impl_osx eject_drive:pth]; + } +} + +}}//namespace Slicer::GUI From b3b800de656db89d0b50ca574b15eea0796383f7 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 6 Mar 2020 15:10:58 +0100 Subject: [PATCH 12/37] Refactoring of RemovableDriveManager: 1) On Windows and Linux, the device enumeration now runs at a background thread, while it ran on the UI thread on idle, which may have been blocking on some rare Windows setups, see GH #3515 #3733 #3746 #3766 2) On OSX, the device enumeration now relies on OS callback, no polling is required. 3) Refactored for cleaner interface. --- src/slic3r/GUI/BackgroundSlicingProcess.cpp | 5 +- src/slic3r/GUI/Event.hpp | 17 +- src/slic3r/GUI/GUI_App.cpp | 6 +- src/slic3r/GUI/GUI_App.hpp | 8 +- src/slic3r/GUI/MainFrame.cpp | 4 + src/slic3r/GUI/Mouse3DController.cpp | 5 +- src/slic3r/GUI/Plater.cpp | 148 ++-- src/slic3r/GUI/Plater.hpp | 1 - src/slic3r/GUI/RemovableDriveManager.cpp | 840 +++++++++----------- src/slic3r/GUI/RemovableDriveManager.hpp | 204 ++--- src/slic3r/GUI/RemovableDriveManagerMM.mm | 155 ++-- 11 files changed, 640 insertions(+), 753 deletions(-) diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.cpp b/src/slic3r/GUI/BackgroundSlicingProcess.cpp index 536d6d6344..8921960bba 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.cpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.cpp @@ -101,10 +101,9 @@ void BackgroundSlicingProcess::process_fff() //FIXME localize the messages // Perform the final post-processing of the export path by applying the print statistics over the file name. std::string export_path = m_fff_print->print_statistics().finalize_output_path(m_export_path); - GUI::RemovableDriveManager::get_instance().update(); - bool with_check = GUI::RemovableDriveManager::get_instance().is_path_on_removable_drive(export_path); + bool with_check = GUI::wxGetApp().removable_drive_manager()->is_path_on_removable_drive(export_path); int copy_ret_val = copy_file(m_temp_output_path, export_path, with_check); - switch (copy_ret_val){ + switch (copy_ret_val) { case SUCCESS: break; // no error case FAIL_COPY_FILE: throw std::runtime_error(_utf8(L("Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?"))); diff --git a/src/slic3r/GUI/Event.hpp b/src/slic3r/GUI/Event.hpp index 429ef99b02..b9816a747e 100644 --- a/src/slic3r/GUI/Event.hpp +++ b/src/slic3r/GUI/Event.hpp @@ -40,11 +40,19 @@ template struct ArrayEvent : public wxEvent return new ArrayEvent(GetEventType(), data, GetEventObject()); } }; -template struct ArrayEvent : public wxEvent + +template struct Event : public wxEvent { T data; - ArrayEvent(wxEventType type, T data, wxObject* origin = nullptr) + Event(wxEventType type, const T &data, wxObject* origin = nullptr) + : wxEvent(0, type), data(std::move(data)) + { + m_propagationLevel = wxEVENT_PROPAGATE_MAX; + SetEventObject(origin); + } + + Event(wxEventType type, T&& data, wxObject* origin = nullptr) : wxEvent(0, type), data(std::move(data)) { m_propagationLevel = wxEVENT_PROPAGATE_MAX; @@ -53,13 +61,10 @@ template struct ArrayEvent : public wxEvent virtual wxEvent* Clone() const { - return new ArrayEvent(GetEventType(), data, GetEventObject()); + return new Event(GetEventType(), data, GetEventObject()); } }; -template using Event = ArrayEvent; - - } } diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 7ca8753a18..40d818e930 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -155,6 +155,7 @@ GUI_App::GUI_App() , m_em_unit(10) , m_imgui(new ImGuiWrapper()) , m_wizard(nullptr) + , m_removable_drive_manager(std::make_unique()) {} GUI_App::~GUI_App() @@ -262,7 +263,6 @@ bool GUI_App::on_init_inner() m_printhost_job_queue.reset(new PrintHostJobQueue(mainframe->printhost_queue_dlg())); - RemovableDriveManager::get_instance().init(); Bind(wxEVT_IDLE, [this](wxIdleEvent& event) { @@ -274,10 +274,6 @@ bool GUI_App::on_init_inner() this->obj_manipul()->update_if_dirty(); -#if !__APPLE__ - RemovableDriveManager::get_instance().update(wxGetLocalTime(), true); -#endif - // Preset updating & Configwizard are done after the above initializations, // and after MainFrame is created & shown. // The extra CallAfter() is needed because of Mac, where this is the only way diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 10b09b1da7..d02a60ba91 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -29,9 +29,9 @@ class PresetUpdater; class ModelObject; class PrintHostJobQueue; -namespace GUI -{ +namespace GUI{ +class RemovableDriveManager; enum FileType { FT_STL, @@ -96,6 +96,8 @@ class GUI_App : public wxApp // Best translation language, provided by Windows or OSX, owned by wxWidgets. const wxLanguageInfo *m_language_info_best = nullptr; + std::unique_ptr m_removable_drive_manager; + std::unique_ptr m_imgui; std::unique_ptr m_printhost_job_queue; ConfigWizard* m_wizard; // Managed by wxWindow tree @@ -180,6 +182,8 @@ public: std::vector tabs_list; + RemovableDriveManager* removable_drive_manager() { return m_removable_drive_manager.get(); } + ImGuiWrapper* imgui() { return m_imgui.get(); } PrintHostJobQueue& printhost_job_queue() { return *m_printhost_job_queue.get(); } diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 2bbdaaffcf..834ec6ff0a 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -25,6 +25,7 @@ #include "wxExtensions.hpp" #include "GUI_ObjectList.hpp" #include "Mouse3DController.hpp" +#include "RemovableDriveManager.hpp" #include "I18N.hpp" #include @@ -124,6 +125,9 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S // Store the device parameter database back to appconfig. m_plater->get_mouse3d_controller().save_config(*wxGetApp().app_config); + // Stop the background thread of the removable drive manager, so that no new updates will be sent to the Plater. + wxGetApp().removable_drive_manager()->shutdown(); + // Save the slic3r.ini.Usually the ini file is saved from "on idle" callback, // but in rare cases it may not have been called yet. wxGetApp().app_config->save(); diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp index 6781ba9ff2..8bc9744f1f 100644 --- a/src/slic3r/GUI/Mouse3DController.cpp +++ b/src/slic3r/GUI/Mouse3DController.cpp @@ -451,12 +451,13 @@ void Mouse3DController::shutdown() // Stop the worker thread, if running. { // Notify the worker thread to cancel wait on detection polling. - std::unique_lock lock(m_stop_condition_mutex); + std::lock_guard lock(m_stop_condition_mutex); m_stop = true; - m_stop_condition.notify_all(); } + m_stop_condition.notify_all(); // Wait for the worker thread to stop. m_thread.join(); + m_stop = false; } } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 2177d622cd..89087be988 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1953,6 +1953,11 @@ struct Plater::priv wxString get_project_filename(const wxString& extension = wxEmptyString) const; void set_project_filename(const wxString& filename); + // Caching last value of show_action_buttons parameter for show_action_buttons(), so that a callback which does not know this state will not override it. + mutable bool ready_to_slice = { false }; + // Flag indicating that the G-code export targets a removable device, therefore the show_action_buttons() needs to be called at any case when the background processing finishes. + bool writing_to_removable_device = { false }; + private: bool init_object_menu(); bool init_common_menu(wxMenu* menu, const bool is_part = false); @@ -1978,8 +1983,8 @@ private: * we should call tack_snapshot just ones * instead of calls for each action separately * */ - std::string m_last_fff_printer_profile_name; - std::string m_last_sla_printer_profile_name; + std::string m_last_fff_printer_profile_name; + std::string m_last_sla_printer_profile_name; }; const std::regex Plater::priv::pattern_bundle(".*[.](amf|amf[.]xml|zip[.]amf|3mf|prusa)", std::regex::icase); @@ -2151,11 +2156,17 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) // Connect to a 3DConnextion driver (OSX). mouse3d_controller.init(); + this->q->Bind(EVT_REMOVABLE_DRIVE_EJECTED, [this](RemovableDriveEjectEvent &evt) { + this->show_action_buttons(this->ready_to_slice); + Slic3r::GUI::show_info(this->q, (boost::format(_utf8(L("Unmounting successful. The device %s(%s) can now be safely removed from the computer."))) + % evt.data.name % evt.data.path).str()); + }); + this->q->Bind(EVT_REMOVABLE_DRIVES_CHANGED, [this](RemovableDrivesChangedEvent &) { this->show_action_buttons(this->ready_to_slice); }); + // Start the background thread and register this window as a target for update events. + wxGetApp().removable_drive_manager()->init(this->q); + // Initialize the Undo / Redo stack with a first snapshot. this->take_snapshot(_(L("New Project"))); - - //void Plater::priv::show_action_buttons(const bool is_ready_to_slice) const - RemovableDriveManager::get_instance().set_drive_count_changed_callback(std::bind(&Plater::priv::show_action_buttons, this, std::placeholders::_1)); } Plater::priv::~priv() @@ -3697,14 +3708,9 @@ void Plater::priv::on_process_completed(wxCommandEvent &evt) sidebar->set_btn_label(ActionButtonType::abReslice, "Slice now"); show_action_buttons(true); } - else if (wxGetApp().get_mode() == comSimple) - show_action_buttons(false); - - if(!canceled && RemovableDriveManager::get_instance().get_is_writing()) - { - RemovableDriveManager::get_instance().set_is_writing(false); - show_action_buttons(false); - } + else if (this->writing_to_removable_device || wxGetApp().get_mode() == comSimple) + show_action_buttons(false); + this->writing_to_removable_device = false; } void Plater::priv::on_layer_editing_toggled(bool enable) @@ -4264,32 +4270,36 @@ void Plater::priv::update_object_menu() sidebar->obj_list()->append_menu_items_add_volume(&object_menu); } -void Plater::priv::show_action_buttons(const bool is_ready_to_slice) const +void Plater::priv::show_action_buttons(const bool ready_to_slice) const { - RemovableDriveManager::get_instance().set_plater_ready_to_slice(is_ready_to_slice); + // Cache this value, so that the callbacks from the RemovableDriveManager may repeat that value when calling show_action_buttons(). + this->ready_to_slice = ready_to_slice; + wxWindowUpdateLocker noUpdater(sidebar); const auto prin_host_opt = config->option("print_host"); const bool send_gcode_shown = prin_host_opt != nullptr && !prin_host_opt->value.empty(); - bool disconnect_shown = !RemovableDriveManager::get_instance().is_last_drive_removed(); - bool export_removable_shown = RemovableDriveManager::get_instance().get_drives_count() > 0; // when a background processing is ON, export_btn and/or send_btn are showing if (wxGetApp().app_config->get("background_processing") == "1") { + RemovableDriveManager::RemovableDrivesStatus removable_media_status = wxGetApp().removable_drive_manager()->status(); if (sidebar->show_reslice(false) | sidebar->show_export(true) | sidebar->show_send(send_gcode_shown) | - sidebar->show_export_removable(export_removable_shown) | - sidebar->show_disconnect(disconnect_shown)) + sidebar->show_export_removable(removable_media_status.has_removable_drives) | + sidebar->show_disconnect(removable_media_status.has_eject)) sidebar->Layout(); } else { - if (sidebar->show_reslice(is_ready_to_slice) | - sidebar->show_export(!is_ready_to_slice) | - sidebar->show_send(send_gcode_shown && !is_ready_to_slice) | - sidebar->show_export_removable(export_removable_shown && !is_ready_to_slice) | - sidebar->show_disconnect(disconnect_shown && !is_ready_to_slice)) + RemovableDriveManager::RemovableDrivesStatus removable_media_status; + if (! ready_to_slice) + removable_media_status = wxGetApp().removable_drive_manager()->status(); + if (sidebar->show_reslice(ready_to_slice) | + sidebar->show_export(!ready_to_slice) | + sidebar->show_send(send_gcode_shown && !ready_to_slice) | + sidebar->show_export_removable(!ready_to_slice && removable_media_status.has_removable_drives) | + sidebar->show_disconnect(!ready_to_slice && removable_media_status.has_eject)) sidebar->Layout(); } } @@ -4822,51 +4832,38 @@ void Plater::export_gcode(bool prefer_removable) return; } default_output_file = fs::path(Slic3r::fold_utf8_to_ascii(default_output_file.string())); - auto start_dir = wxGetApp().app_config->get_last_output_dir(default_output_file.parent_path().string()); - bool removable_drives_connected = GUI::RemovableDriveManager::get_instance().update(); - if(prefer_removable) - { - if(removable_drives_connected) - { - auto start_dir_removable = wxGetApp().app_config->get_last_output_dir(default_output_file.parent_path().string(), true); - if (RemovableDriveManager::get_instance().is_path_on_removable_drive(start_dir_removable)) - { - start_dir = start_dir_removable; - }else - { - start_dir = RemovableDriveManager::get_instance().get_drive_path(); - } - } + AppConfig &appconfig = *wxGetApp().app_config; + RemovableDriveManager &removable_drive_manager = *wxGetApp().removable_drive_manager(); + // Get a last save path, either to removable media or to an internal media. + std::string start_dir = appconfig.get_last_output_dir(default_output_file.parent_path().string(), prefer_removable); + if (prefer_removable) { + // Returns a path to a removable media if it exists, prefering start_dir. Update the internal removable drives database. + start_dir = removable_drive_manager.get_removable_drive_path(start_dir); + if (start_dir.empty()) + // Direct user to the last internal media. + start_dir = appconfig.get_last_output_dir(default_output_file.parent_path().string(), false); } - wxFileDialog dlg(this, (printer_technology() == ptFFF) ? _(L("Save G-code file as:")) : _(L("Save SL1 file as:")), - start_dir, - from_path(default_output_file.filename()), - GUI::file_wildcards((printer_technology() == ptFFF) ? FT_GCODE : FT_PNGZIP, default_output_file.extension().string()), - wxFD_SAVE | wxFD_OVERWRITE_PROMPT - ); fs::path output_path; - if (dlg.ShowModal() == wxID_OK) { - fs::path path = into_path(dlg.GetPath()); - wxGetApp().app_config->update_last_output_dir(path.parent_path().string(), RemovableDriveManager::get_instance().is_path_on_removable_drive(path.parent_path().string())); - output_path = std::move(path); + { + wxFileDialog dlg(this, (printer_technology() == ptFFF) ? _(L("Save G-code file as:")) : _(L("Save SL1 file as:")), + start_dir, + from_path(default_output_file.filename()), + GUI::file_wildcards((printer_technology() == ptFFF) ? FT_GCODE : FT_PNGZIP, default_output_file.extension().string()), + wxFD_SAVE | wxFD_OVERWRITE_PROMPT + ); + if (dlg.ShowModal() == wxID_OK) + output_path = into_path(dlg.GetPath()); } - if (! output_path.empty()) - { - std::string path = output_path.string(); - p->export_gcode(std::move(output_path), PrintHostJob()); - RemovableDriveManager::get_instance().update(0, false); - RemovableDriveManager::get_instance().set_last_save_path(path); - RemovableDriveManager::get_instance().verify_last_save_path(); - - if(!RemovableDriveManager::get_instance().is_last_drive_removed()) - { - RemovableDriveManager::get_instance().set_is_writing(true); - RemovableDriveManager::get_instance().erase_callbacks(); - RemovableDriveManager::get_instance().add_remove_callback(std::bind(&Plater::drive_ejected_callback, this)); - } - + if (! output_path.empty()) { + p->export_gcode(output_path, PrintHostJob()); + bool path_on_removable_media = removable_drive_manager.set_and_verify_last_save_path(output_path.string()); + // Storing a path to AppConfig either as path to removable media or a path to internal media. + // is_path_on_removable_drive() is called with the "true" parameter to update its internal database as the user may have shuffled the external drives + // while the dialog was open. + appconfig.update_last_output_dir(output_path.parent_path().string(), path_on_removable_media); + p->writing_to_removable_device = path_on_removable_media; } } @@ -5188,28 +5185,11 @@ void Plater::send_gcode() } } +// Called when the Eject button is pressed. void Plater::eject_drive() { - RemovableDriveManager::get_instance().update(0, true); - RemovableDriveManager::get_instance().erase_callbacks(); - RemovableDriveManager::get_instance().add_remove_callback(std::bind(&Plater::drive_ejected_callback, this)); - RemovableDriveManager::get_instance().eject_drive(RemovableDriveManager::get_instance().get_last_save_path()); - + wxGetApp().removable_drive_manager()->eject_drive(); } -void Plater::drive_ejected_callback() -{ - if (RemovableDriveManager::get_instance().get_did_eject()) - { - RemovableDriveManager::get_instance().set_did_eject(false); - show_info(this, - (boost::format(_utf8(L("Unmounting successful. The device %s(%s) can now be safely removed from the computer."))) - % RemovableDriveManager::get_instance().get_ejected_name() - % RemovableDriveManager::get_instance().get_ejected_path()).str()); - } - p->show_action_buttons(false); -} - - void Plater::take_snapshot(const std::string &snapshot_name) { p->take_snapshot(snapshot_name); } void Plater::take_snapshot(const wxString &snapshot_name) { p->take_snapshot(snapshot_name); } @@ -5592,7 +5572,7 @@ void Plater::suppress_background_process(const bool stop_background_process) void Plater::fix_through_netfabb(const int obj_idx, const int vol_idx/* = -1*/) { p->fix_through_netfabb(obj_idx, vol_idx); } void Plater::update_object_menu() { p->update_object_menu(); } -void Plater::show_action_buttons(const bool is_ready_to_slice) const { p->show_action_buttons(is_ready_to_slice); } +void Plater::show_action_buttons(const bool ready_to_slice) const { p->show_action_buttons(ready_to_slice); } void Plater::copy_selection_to_clipboard() { diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 249e0a043c..dbf7069882 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -213,7 +213,6 @@ public: void fix_through_netfabb(const int obj_idx, const int vol_idx = -1); void send_gcode(); void eject_drive(); - void drive_ejected_callback(); void take_snapshot(const std::string &snapshot_name); void take_snapshot(const wxString &snapshot_name); diff --git a/src/slic3r/GUI/RemovableDriveManager.cpp b/src/slic3r/GUI/RemovableDriveManager.cpp index aa7a3d6a31..c97a745af2 100644 --- a/src/slic3r/GUI/RemovableDriveManager.cpp +++ b/src/slic3r/GUI/RemovableDriveManager.cpp @@ -1,6 +1,8 @@ #include "RemovableDriveManager.hpp" -#include -#include "boost/nowide/convert.hpp" +#include + +#include +#include #if _WIN32 #include @@ -9,11 +11,9 @@ #include #include -GUID WceusbshGUID = { 0x25dbce51, 0x6c8f, 0x4a72, - 0x8a,0x6d,0xb5,0x4c,0x2b,0x4f,0xc8,0x35 }; #else -//linux includes +// unix, linux & OSX includes #include #include #include @@ -26,124 +26,171 @@ GUID WceusbshGUID = { 0x25dbce51, 0x6c8f, 0x4a72, namespace Slic3r { namespace GUI { +wxDEFINE_EVENT(EVT_REMOVABLE_DRIVE_EJECTED, RemovableDriveEjectEvent); +wxDEFINE_EVENT(EVT_REMOVABLE_DRIVES_CHANGED, RemovableDrivesChangedEvent); + #if _WIN32 -/* currently not used, left for possible future use -INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); -*/ -void RemovableDriveManager::search_for_drives() +std::vector RemovableDriveManager::search_for_removable_drives() const { - m_current_drives.clear(); //get logical drives flags by letter in alphabetical order - DWORD drives_mask = GetLogicalDrives(); - for (size_t i = 0; i < 26; i++) - { - if(drives_mask & (1 << i)) - { - std::string path (1,(char)('A' + i)); - path+=":"; - UINT drive_type = GetDriveTypeA(path.c_str()); + DWORD drives_mask = ::GetLogicalDrives(); + + // Allocate the buffers before the loop. + std::wstring volume_name; + volume_name.resize(MAX_PATH + 1); + std::wstring file_system_name; + file_system_name.resize(MAX_PATH + 1); + + // Iterate the Windows drives from 'A' to 'Z' + std::vector current_drives; + for (size_t i = 0; i < 26; ++ i) + if (drives_mask & (1 << i)) { + std::string path { char('A' + i), ':' }; + UINT drive_type = ::GetDriveTypeA(path.c_str()); // DRIVE_REMOVABLE on W are sd cards and usb thumbnails (not usb harddrives) - if (drive_type == DRIVE_REMOVABLE) - { + if (drive_type == DRIVE_REMOVABLE) { // get name of drive std::wstring wpath = boost::nowide::widen(path); - std::wstring volume_name; - volume_name.resize(1024); - std::wstring file_system_name; - file_system_name.resize(1024); - LPWSTR lp_volume_name_buffer = new wchar_t; - BOOL error = GetVolumeInformationW(wpath.c_str(), &volume_name[0], sizeof(volume_name), NULL, NULL, NULL, &file_system_name[0], sizeof(file_system_name)); - if(error != 0) - { - volume_name.erase(std::find(volume_name.begin(), volume_name.end(), '\0'), volume_name.end()); - if (file_system_name != L"") - { + BOOL error = ::GetVolumeInformationW(wpath.c_str(), volume_name.data(), sizeof(volume_name), nullptr, nullptr, nullptr, file_system_name.data(), sizeof(file_system_name)); + if (error != 0) { + volume_name.erase(volume_name.begin() + wcslen(volume_name.c_str()), volume_name.end()); + if (! file_system_name.empty()) { ULARGE_INTEGER free_space; - GetDiskFreeSpaceExA(path.c_str(), &free_space, NULL, NULL); - if (free_space.QuadPart > 0) - { + ::GetDiskFreeSpaceExA(path.c_str(), &free_space, nullptr, nullptr); + if (free_space.QuadPart > 0) { path += "\\"; - m_current_drives.push_back(DriveData(boost::nowide::narrow(volume_name), path)); + current_drives.emplace_back(DriveData{ boost::nowide::narrow(volume_name), path }); } } } } } + return current_drives; +} + +// Called from UI therefore it blocks the UI thread. +// It also blocks updates at the worker thread. +// Win32 implementation. +void RemovableDriveManager::eject_drive() +{ + if (m_last_save_path.empty()) + return; + +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + this->update(); +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + + tbb::mutex::scoped_lock lock(m_drives_mutex); + auto it_drive_data = this->find_last_save_path_drive_data(); + if (it_drive_data != m_current_drives.end()) { + // get handle to device + std::string mpath = "\\\\.\\" + m_last_save_path; + mpath = mpath.substr(0, mpath.size() - 1); + HANDLE handle = CreateFileA(mpath.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr); + if (handle == INVALID_HANDLE_VALUE) { + std::cerr << "Ejecting " << mpath << " failed " << GetLastError() << " \n"; + return; + } + DWORD deviceControlRetVal(0); + //these 3 commands should eject device safely but they dont, the device does disappear from file explorer but the "device was safely remove" notification doesnt trigger. + //sd cards does trigger WM_DEVICECHANGE messege, usb drives dont + DeviceIoControl(handle, FSCTL_LOCK_VOLUME, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr); + DeviceIoControl(handle, FSCTL_DISMOUNT_VOLUME, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr); + // some implemenatations also calls IOCTL_STORAGE_MEDIA_REMOVAL here but it returns error to me + BOOL error = DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr); + if (error == 0) { + CloseHandle(handle); + BOOST_LOG_TRIVIAL(error) << "Ejecting " << mpath << " failed " << deviceControlRetVal << " " << GetLastError() << " \n"; + return; + } + CloseHandle(handle); + m_drive_data_last_eject = *it_drive_data; } } -void RemovableDriveManager::eject_drive(const std::string &path) + +std::string RemovableDriveManager::get_removable_drive_path(const std::string &path) { - if(m_current_drives.empty()) - return; - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + this->update(); +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + + tbb::mutex::scoped_lock lock(m_drives_mutex); + if (m_current_drives.empty()) + return std::string(); + std::size_t found = path.find_last_of("\\"); + std::string new_path = path.substr(0, found); + int letter = PathGetDriveNumberA(new_path.c_str()); + for (const DriveData &drive_data : m_current_drives) { + char drive = drive_data.path[0]; + if (drive == 'A' + letter) + return path; + } + return m_current_drives.front().path; +} + +std::string RemovableDriveManager::get_removable_drive_from_path(const std::string& path) +{ + tbb::mutex::scoped_lock lock(m_drives_mutex); + std::size_t found = path.find_last_of("\\"); + std::string new_path = path.substr(0, found); + int letter = PathGetDriveNumberA(new_path.c_str()); + for (const DriveData &drive_data : m_current_drives) { + assert(! drive_data.path.empty()); + if (drive_data.path.front() == 'A' + letter) + return drive_data.path; + } + return std::string(); +} + +#if 0 +// currently not used, left for possible future use +INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + // here we need to catch messeges about device removal + // problem is that when ejecting usb (how is it implemented above) there is no messege dispached. Only after physical removal of the device. + //uncomment register_window() in init() to register and comment update() in GUI_App.cpp (only for windows!) to stop recieving periodical updates + + LRESULT lRet = 1; + static HDEVNOTIFY hDeviceNotify; + static constexpr GUID WceusbshGUID = { 0x25dbce51, 0x6c8f, 0x4a72, 0x8a,0x6d,0xb5,0x4c,0x2b,0x4f,0xc8,0x35 }; + + switch (message) { - if ((*it).path == path) + case WM_CREATE: + DEV_BROADCAST_DEVICEINTERFACE NotificationFilter; + + ZeroMemory(&NotificationFilter, sizeof(NotificationFilter)); + NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); + NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; + NotificationFilter.dbcc_classguid = WceusbshGUID; + + hDeviceNotify = RegisterDeviceNotification(hWnd, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE); + break; + + case WM_DEVICECHANGE: + { + // here is the important + if(wParam == DBT_DEVICEREMOVECOMPLETE) { - // get handle to device - std::string mpath = "\\\\.\\" + path; - mpath = mpath.substr(0, mpath.size() - 1); - HANDLE handle = CreateFileA(mpath.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr); - if (handle == INVALID_HANDLE_VALUE) - { - std::cerr << "Ejecting " << mpath << " failed " << GetLastError() << " \n"; - return; - } - DWORD deviceControlRetVal(0); - //these 3 commands should eject device safely but they dont, the device does disappear from file explorer but the "device was safely remove" notification doesnt trigger. - //sd cards does trigger WM_DEVICECHANGE messege, usb drives dont - - DeviceIoControl(handle, FSCTL_LOCK_VOLUME, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr); - DeviceIoControl(handle, FSCTL_DISMOUNT_VOLUME, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr); - // some implemenatations also calls IOCTL_STORAGE_MEDIA_REMOVAL here but it returns error to me - BOOL error = DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr); - if (error == 0) - { - CloseHandle(handle); - std::cerr << "Ejecting " << mpath << " failed " << deviceControlRetVal << " " << GetLastError() << " \n"; - return; - } - CloseHandle(handle); - m_did_eject = true; - m_current_drives.erase(it); - m_ejected_path = m_last_save_path; - m_ejected_name = m_last_save_name; - break; + RemovableDriveManager::get_instance().update(0, true); } } -} -bool RemovableDriveManager::is_path_on_removable_drive(const std::string &path) -{ - if (m_current_drives.empty()) - return false; - std::size_t found = path.find_last_of("\\"); - std::string new_path = path.substr(0, found); - int letter = PathGetDriveNumberA(new_path.c_str()); - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) - { - char drive = (*it).path[0]; - if (drive == ('A' + letter)) - return true; + break; + + default: + // Send all other messages on to the default windows handler. + lRet = DefWindowProc(hWnd, message, wParam, lParam); + break; } - return false; -} -std::string RemovableDriveManager::get_drive_from_path(const std::string& path) -{ - std::size_t found = path.find_last_of("\\"); - std::string new_path = path.substr(0, found); - int letter = PathGetDriveNumberA(new_path.c_str()); - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) - { - char drive = (*it).path[0]; - if (drive == ('A' + letter)) - return (*it).path; - } - return ""; + return lRet; + } + void RemovableDriveManager::register_window() { //creates new unvisible window that is recieving callbacks from system // structure to register - /* currently not used, left for possible future use + // currently not used, left for possible future use WNDCLASSEX wndClass; wndClass.cbSize = sizeof(WNDCLASSEX); wndClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; @@ -179,432 +226,291 @@ void RemovableDriveManager::register_window() } //ShowWindow(hWnd, SW_SHOWNORMAL); UpdateWindow(hWnd); - */ } -/* currently not used, left for possible future use -INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +#endif + +#else + +namespace search_for_drives_internal { - // here we need to catch messeges about device removal - // problem is that when ejecting usb (how is it implemented above) there is no messege dispached. Only after physical removal of the device. - //uncomment register_window() in init() to register and comment update() in GUI_App.cpp (only for windows!) to stop recieving periodical updates - - LRESULT lRet = 1; - static HDEVNOTIFY hDeviceNotify; - - switch (message) + static bool compare_filesystem_id(const std::string &path_a, const std::string &path_b) { - case WM_CREATE: - DEV_BROADCAST_DEVICEINTERFACE NotificationFilter; + struct stat buf; + stat(path_a.c_str() ,&buf); + dev_t id_a = buf.st_dev; + stat(path_b.c_str() ,&buf); + dev_t id_b = buf.st_dev; + return id_a == id_b; + } - ZeroMemory(&NotificationFilter, sizeof(NotificationFilter)); - NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); - NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; - NotificationFilter.dbcc_classguid = WceusbshGUID; - - hDeviceNotify = RegisterDeviceNotification(hWnd, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE); - break; - - case WM_DEVICECHANGE: + void inspect_file(const std::string &path, const std::string &parent_path, std::vector &out) { - // here is the important - if(wParam == DBT_DEVICEREMOVECOMPLETE) - { -- RemovableDriveManager::get_instance().update(0, true); + //confirms if the file is removable drive and adds it to vector + + //if not same file system - could be removable drive + if (! compare_filesystem_id(path, parent_path)) { + //free space + boost::filesystem::space_info si = boost::filesystem::space(path); + if (si.available != 0) { + //user id + struct stat buf; + stat(path.c_str(), &buf); + uid_t uid = buf.st_uid; + std::string username(std::getenv("USER")); + struct passwd *pw = getpwuid(uid); + if (pw != 0 && pw->pw_name == username) + out.emplace_back(DriveData{ boost::filesystem::basename(boost::filesystem::path(path)), path }); + } } } - break; - - default: - // Send all other messages on to the default windows handler. - lRet = DefWindowProc(hWnd, message, wParam, lParam); - break; - } - return lRet; - -} -*/ -#else -void RemovableDriveManager::search_for_drives() -{ - - m_current_drives.clear(); - -#if __APPLE__ - // if on macos obj-c class will enumerate - if(m_rdmmm) - { - m_rdmmm->list_devices(); - } -#else + static void search_path(const std::string &path, const std::string &parent_path, std::vector &out) + { + glob_t globbuf; + globbuf.gl_offs = 2; + int error = glob(path.c_str(), GLOB_TILDE, NULL, &globbuf); + if (error == 0) { + for (size_t i = 0; i < globbuf.gl_pathc; ++ i) + inspect_file(globbuf.gl_pathv[i], parent_path, out); + } else { + //if error - path probably doesnt exists so function just exits + //std::cout<<"glob error "<< error<< "\n"; + } + globfree(&globbuf); + } +} + +std::vector RemovableDriveManager::search_for_removable_drives() const +{ + std::vector current_drives; + +#if __APPLE__ + + this->list_devices(current_drives); + +#else //search /media/* folder - search_path("/media/*", "/media"); + search_for_drives_internal::search_path("/media/*", "/media", current_drives); //search_path("/Volumes/*", "/Volumes"); std::string path(std::getenv("USER")); std::string pp(path); - { - //search /media/USERNAME/* folder - pp = "/media/"+pp; - path = "/media/" + path + "/*"; - search_path(path, pp); + //search /media/USERNAME/* folder + pp = "/media/"+pp; + path = "/media/" + path + "/*"; + search_for_drives_internal::search_path(path, pp, current_drives); - //search /run/media/USERNAME/* folder - path = "/run" + path; - pp = "/run"+pp; - search_path(path, pp); - - } + //search /run/media/USERNAME/* folder + path = "/run" + path; + pp = "/run"+pp; + search_for_drives_internal::search_path(path, pp, current_drives); #endif -} -void RemovableDriveManager::search_path(const std::string &path,const std::string &parent_path) -{ - glob_t globbuf; - globbuf.gl_offs = 2; - int error = glob(path.c_str(), GLOB_TILDE, NULL, &globbuf); - if(error == 0) - { - for(size_t i = 0; i < globbuf.gl_pathc; i++) - { - inspect_file(globbuf.gl_pathv[i], parent_path); - } - }else - { - //if error - path probably doesnt exists so function just exits - //std::cout<<"glob error "<< error<< "\n"; - } - - globfree(&globbuf); -} -void RemovableDriveManager::inspect_file(const std::string &path, const std::string &parent_path) -{ - //confirms if the file is removable drive and adds it to vector - //if not same file system - could be removable drive - if(!compare_filesystem_id(path, parent_path)) - { - //free space - boost::filesystem::space_info si = boost::filesystem::space(path); - if(si.available != 0) - { - //user id - struct stat buf; - stat(path.c_str(), &buf); - uid_t uid = buf.st_uid; - std::string username(std::getenv("USER")); - struct passwd *pw = getpwuid(uid); - if (pw != 0 && pw->pw_name == username) - m_current_drives.push_back(DriveData(boost::filesystem::basename(boost::filesystem::path(path)), path)); - } - - } + return current_drives; } -bool RemovableDriveManager::compare_filesystem_id(const std::string &path_a, const std::string &path_b) + +// Called from UI therefore it blocks the UI thread. +// It also blocks updates at the worker thread. +// Unix & OSX implementation. +void RemovableDriveManager::eject_drive() { - struct stat buf; - stat(path_a.c_str() ,&buf); - dev_t id_a = buf.st_dev; - stat(path_b.c_str() ,&buf); - dev_t id_b = buf.st_dev; - return id_a == id_b; -} -void RemovableDriveManager::eject_drive(const std::string &path) -{ - if (m_current_drives.empty()) + if (m_last_save_path.empty()) return; - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) - { - if((*it).path == path) - { - - std::string correct_path(path); - for (size_t i = 0; i < correct_path.size(); ++i) - { - if(correct_path[i]==' ') - { - correct_path = correct_path.insert(i,1,'\\'); - i++; - } - } - //std::cout<<"Ejecting "<<(*it).name<<" from "<< correct_path<<"\n"; -// there is no usable command in c++ so terminal command is used instead -// but neither triggers "succesful safe removal messege" - std::string command = ""; -#if __APPLE__ - //m_rdmmm->eject_device(path); - command = "diskutil unmount "; -#else - command = "umount "; -#endif - command += correct_path; - int err = system(command.c_str()); - if(err) - { - std::cerr<<"Ejecting failed\n"; - return; - } +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + this->update(); +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS - m_did_eject = true; - m_current_drives.erase(it); - m_ejected_path = m_last_save_path; - m_ejected_name = m_last_save_name; - break; + tbb::mutex::scoped_lock lock(m_drives_mutex); + auto it_drive_data = this->find_last_save_path_drive_data(); + if (it_drive_data != m_current_drives.end()) { + std::string correct_path(m_last_save_path); + for (size_t i = 0; i < correct_path.size(); ++i) + if (correct_path[i]==' ') { + correct_path = correct_path.insert(i,1,'\\'); + ++ i; + } + //std::cout<<"Ejecting "<<(*it).name<<" from "<< correct_path<<"\n"; + // there is no usable command in c++ so terminal command is used instead + // but neither triggers "succesful safe removal messege" + std::string command = +#if __APPLE__ + //this->eject_device(m_last_save_path); + "diskutil unmount "; +#else + "umount "; +#endif + command += correct_path; + int err = system(command.c_str()); + if (err) { + BOOST_LOG_TRIVIAL(error) << "Ejecting " << m_last_save_path << " failed"; + return; } + m_drive_data_last_eject = *it_drive_data; } +} -} -bool RemovableDriveManager::is_path_on_removable_drive(const std::string &path) +std::string RemovableDriveManager::get_removable_drive_path(const std::string &path) { - if (m_current_drives.empty()) - return false; +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + this->update(); +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + std::size_t found = path.find_last_of("/"); std::string new_path = found == path.size() - 1 ? path.substr(0, found) : path; - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) - { - if(compare_filesystem_id(new_path, (*it).path)) - return true; - } - return false; + + tbb::mutex::scoped_lock lock(m_drives_mutex); + for (const DriveData &data : m_current_drives) + if (search_for_drives_internal::compare_filesystem_id(new_path, data.path)) + return path; + return m_current_drives.empty() ? std::string() : m_current_drives.front().path; } -std::string RemovableDriveManager::get_drive_from_path(const std::string& path) + +std::string RemovableDriveManager::get_removable_drive_from_path(const std::string& path) { std::size_t found = path.find_last_of("/"); std::string new_path = found == path.size() - 1 ? path.substr(0, found) : path; - // trim the filename found = new_path.find_last_of("/"); new_path = new_path.substr(0, found); - //check if same filesystem - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) - { - if (compare_filesystem_id(new_path, (*it).path)) - return (*it).path; - } - return ""; + // check if same filesystem + tbb::mutex::scoped_lock lock(m_drives_mutex); + for (const DriveData &drive_data : m_current_drives) + if (search_for_drives_internal::compare_filesystem_id(new_path, drive_data.path)) + return drive_data.path; + return std::string(); } #endif -RemovableDriveManager::RemovableDriveManager(): - m_drives_count(0), - m_last_update(0), - m_last_save_path(""), - m_last_save_name(""), - m_last_save_path_verified(false), - m_is_writing(false), - m_did_eject(false), - m_plater_ready_to_slice(true), - m_ejected_path(""), - m_ejected_name("") -#if __APPLE__ - , m_rdmmm(new RDMMMWrapper()) -#endif -{} -RemovableDriveManager::~RemovableDriveManager() +void RemovableDriveManager::init(wxEvtHandler *callback_evt_handler) { -#if __APPLE__ - delete m_rdmmm; -#endif -} -void RemovableDriveManager::init() -{ - //add_callback([](void) { RemovableDriveManager::get_instance().print(); }); + assert(! m_initialized); + assert(m_callback_evt_handler == nullptr); + + if (m_initialized) + return; + + m_initialized = true; + m_callback_evt_handler = callback_evt_handler; + #if _WIN32 - //register_window(); + //this->register_window_msw(); #elif __APPLE__ - m_rdmmm->register_window(); + this->register_window_osx(); #endif - update(0, true); -} -bool RemovableDriveManager::update(const long time,const bool check) -{ - if(time != 0) //time = 0 is forced update - { - long diff = m_last_update - time; - if(diff <= -2) - { - m_last_update = time; - }else - { - return false; // return value shouldnt matter if update didnt run - } - } - search_for_drives(); - if (m_drives_count != m_current_drives.size()) - { - if (check) - { - check_and_notify(); - } - m_drives_count = m_current_drives.size(); - } - return !m_current_drives.empty(); + +#ifdef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + this->update(); +#else // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + // Don't call update() manually, as the UI triggered APIs call this->update() anyways. + m_thread = boost::thread((boost::bind(&RemovableDriveManager::thread_proc, this))); +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS } -bool RemovableDriveManager::is_drive_mounted(const std::string &path) const +void RemovableDriveManager::shutdown() { - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) - { - if ((*it).path == path) +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + if (m_thread.joinable()) { + // Stop the worker thread, if running. { - return true; + // Notify the worker thread to cancel wait on detection polling. + std::lock_guard lck(m_thread_stop_mutex); + m_stop = true; + } + m_thread_stop_condition.notify_all(); + // Wait for the worker thread to stop. + m_thread.join(); + m_stop = false; + } +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + +#if _WIN32 + //this->unregister_window_msw(); +#elif __APPLE__ + this->unregister_window_osx(); +#endif + + m_initialized = false; +} + +bool RemovableDriveManager::set_and_verify_last_save_path(const std::string &path) +{ +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + this->update(); +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + + m_last_save_path = this->get_removable_drive_from_path(path); + return ! m_last_save_path.empty(); +} + +RemovableDriveManager::RemovableDrivesStatus RemovableDriveManager::status() +{ +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + this->update(); +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + + RemovableDriveManager::RemovableDrivesStatus out; + { + tbb::mutex::scoped_lock lock(m_drives_mutex); + out.has_eject = this->find_last_save_path_drive_data() != m_current_drives.end(); + out.has_removable_drives = ! m_current_drives.empty(); + } + if (! out.has_eject) + m_last_save_path.clear(); + return out; +} + +// Update is called from thread_proc() and from most of the public methods on demand. +void RemovableDriveManager::update() +{ + std::vector current_drives = this->search_for_removable_drives(); + + // Post update events. + tbb::mutex::scoped_lock lock(m_drives_mutex); + std::sort(current_drives.begin(), current_drives.end()); + if (current_drives != m_current_drives) { + if (! m_drive_data_last_eject.empty() && std::find(current_drives.begin(), current_drives.end(), m_drive_data_last_eject) == current_drives.end()) { + assert(m_callback_evt_handler); + if (m_callback_evt_handler) + wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::move(m_drive_data_last_eject))); + m_drive_data_last_eject.clear(); + } else { + assert(m_callback_evt_handler); + if (m_callback_evt_handler) + wxPostEvent(m_callback_evt_handler, RemovableDrivesChangedEvent(EVT_REMOVABLE_DRIVES_CHANGED)); } } - return false; + m_current_drives = std::move(current_drives); } -std::string RemovableDriveManager::get_drive_path() + +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS +void RemovableDriveManager::thread_proc() { - if (m_current_drives.size() == 0) - { - reset_last_save_path(); - return ""; - } - if (m_last_save_path_verified) - return m_last_save_path; - return m_current_drives.back().path; -} -std::string RemovableDriveManager::get_last_save_path() const -{ - if (!m_last_save_path_verified) - return ""; - return m_last_save_path; -} -std::string RemovableDriveManager::get_last_save_name() const -{ - return m_last_save_name; -} -std::vector RemovableDriveManager::get_all_drives() const -{ - return m_current_drives; -} -void RemovableDriveManager::check_and_notify() -{ - if(m_drive_count_changed_callback) - { - m_drive_count_changed_callback(m_plater_ready_to_slice); - } - if(m_callbacks.size() != 0 && m_drives_count > m_current_drives.size() && !is_drive_mounted(m_last_save_path)) - { - for (auto it = m_callbacks.begin(); it != m_callbacks.end(); ++it) + for (;;) { + // Wait for 2 seconds before running the disk enumeration. + // Cancellable. { - (*it)(); + std::unique_lock lck(m_thread_stop_mutex); + m_thread_stop_condition.wait_for(lck, std::chrono::seconds(2), [this]{ return m_stop; }); } + if (m_stop) + // Stop the worker thread. + break; + // Update m_current drives and send out update events. + this->update(); } } -void RemovableDriveManager::add_remove_callback(std::function callback) +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + +std::vector::const_iterator RemovableDriveManager::find_last_save_path_drive_data() const { - m_callbacks.push_back(callback); + return Slic3r::binary_find_by_predicate(m_current_drives.begin(), m_current_drives.end(), + [this](const DriveData &data){ return data.path < m_last_save_path; }, + [this](const DriveData &data){ return data.path == m_last_save_path; }); } -void RemovableDriveManager::erase_callbacks() -{ - m_callbacks.clear(); -} -void RemovableDriveManager::set_drive_count_changed_callback(std::function callback) -{ - m_drive_count_changed_callback = callback; -} -void RemovableDriveManager::set_plater_ready_to_slice(bool b) -{ - m_plater_ready_to_slice = b; -} -void RemovableDriveManager::set_last_save_path(const std::string& path) -{ - if(m_last_save_path_verified)// if old path is on drive - { - if(get_drive_from_path(path) != "") //and new is too, rewrite the path - { - m_last_save_path_verified = false; - m_last_save_path = path; - }//else do nothing - }else - { - m_last_save_path = path; - } -} -void RemovableDriveManager::verify_last_save_path() -{ - std::string last_drive = get_drive_from_path(m_last_save_path); - if (last_drive != "") - { - m_last_save_path_verified = true; - m_last_save_path = last_drive; - m_last_save_name = get_drive_name(last_drive); - }else - { - reset_last_save_path(); - } -} -std::string RemovableDriveManager::get_drive_name(const std::string& path) const -{ - if (m_current_drives.size() == 0) - return ""; - for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) - { - if ((*it).path == path) - { - return (*it).name; - } - } - return ""; -} -bool RemovableDriveManager::is_last_drive_removed() -{ - if(!m_last_save_path_verified) - { - return true; - } - bool r = !is_drive_mounted(m_last_save_path); - if (r) - { - reset_last_save_path(); - } - return r; -} -bool RemovableDriveManager::is_last_drive_removed_with_update(const long time) -{ - update(time, false); - return is_last_drive_removed(); -} -void RemovableDriveManager::reset_last_save_path() -{ - m_last_save_path_verified = false; - m_last_save_path = ""; - m_last_save_name = ""; -} -void RemovableDriveManager::set_is_writing(const bool b) -{ - m_is_writing = b; - if (b) - { - m_did_eject = false; - } -} -bool RemovableDriveManager::get_is_writing() const -{ - return m_is_writing; -} -bool RemovableDriveManager::get_did_eject() const -{ - return m_did_eject; -} -void RemovableDriveManager::set_did_eject(const bool b) -{ - m_did_eject = b; -} -size_t RemovableDriveManager::get_drives_count() const -{ - return m_current_drives.size(); -} -std::string RemovableDriveManager::get_ejected_path() const -{ - return m_ejected_path; -} -std::string RemovableDriveManager::get_ejected_name() const -{ - return m_ejected_name; -} -}}//namespace Slicer::Gui + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/RemovableDriveManager.hpp b/src/slic3r/GUI/RemovableDriveManager.hpp index 032eef682b..3b808d9d79 100644 --- a/src/slic3r/GUI/RemovableDriveManager.hpp +++ b/src/slic3r/GUI/RemovableDriveManager.hpp @@ -3,119 +3,129 @@ #include #include -#include + +#include +#include +#include + +// Custom wxWidget events +#include "Event.hpp" namespace Slic3r { namespace GUI { -#if __APPLE__ -class RDMMMWrapper; -#endif - + struct DriveData { std::string name; std::string path; - DriveData(std::string n, std::string p):name(n),path(p){} + + void clear() { + name.clear(); + path.clear(); + } + bool empty() const { + return path.empty(); + } }; + +inline bool operator< (const DriveData &lhs, const DriveData &rhs) { return lhs.path < rhs.path; } +inline bool operator> (const DriveData &lhs, const DriveData &rhs) { return lhs.path > rhs.path; } +inline bool operator==(const DriveData &lhs, const DriveData &rhs) { return lhs.path == rhs.path; } + +using RemovableDriveEjectEvent = Event; +wxDECLARE_EVENT(EVT_REMOVABLE_DRIVE_EJECTED, RemovableDriveEjectEvent); + +using RemovableDrivesChangedEvent = SimpleEvent; +wxDECLARE_EVENT(EVT_REMOVABLE_DRIVES_CHANGED, RemovableDrivesChangedEvent); + +#if __APPLE__ + // Callbacks on device plug / unplug work reliably on OSX. + #define REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS +#endif // __APPLE__ + class RemovableDriveManager { -#if __APPLE__ -friend class RDMMMWrapper; -#endif public: - static RemovableDriveManager& get_instance() - { - static RemovableDriveManager instance; - return instance; - } + RemovableDriveManager() = default; RemovableDriveManager(RemovableDriveManager const&) = delete; void operator=(RemovableDriveManager const&) = delete; - ~RemovableDriveManager(); - //call only once. on apple register for unmnount callbacks. on windows register for device notification is prepared but not called (eject usb drive on widnows doesnt trigger the callback, sdc ard does), also enumerates devices for first time so init shoud be called on linux too. - void init(); - //update() searches for removable devices, returns false if empty. /time = 0 is forced update, time expects wxGetLocalTime() - bool update(const long time = 0,const bool check = false); - bool is_drive_mounted(const std::string &path) const; - void eject_drive(const std::string &path); - //returns path to last drive which was used, if none was used, returns device that was enumerated last - std::string get_last_save_path() const; - std::string get_last_save_name() const; - //returns path to last drive which was used, if none was used, returns empty string - std::string get_drive_path(); - std::vector get_all_drives() const; - bool is_path_on_removable_drive(const std::string &path); - // callback will notify only if device with last save path was removed - void add_remove_callback(std::function callback); - // erases all remove callbacks added by add_remove_callback() - void erase_callbacks(); - //drive_count_changed callback is called on every added or removed device - void set_drive_count_changed_callback(std::function callback); - //thi serves to set correct value for drive_count_changed callback - void set_plater_ready_to_slice(bool b); - // marks one of the eveices in vector as last used - void set_last_save_path(const std::string &path); - void verify_last_save_path(); - bool is_last_drive_removed(); - // param as update() - bool is_last_drive_removed_with_update(const long time = 0); - void set_is_writing(const bool b); - bool get_is_writing() const; - bool get_did_eject() const; - void set_did_eject(const bool b); - std::string get_drive_name(const std::string& path) const; - size_t get_drives_count() const; - std::string get_ejected_path() const; - std::string get_ejected_name() const; -private: - RemovableDriveManager(); - void search_for_drives(); - //triggers callbacks if last used drive was removed - void check_and_notify(); - //returns drive path (same as path in DriveData) if exists otherwise empty string "" - std::string get_drive_from_path(const std::string& path); - void reset_last_save_path(); + ~RemovableDriveManager() { assert(! m_initialized); } + + // Start the background thread and register this window as a target for update events. + // Register for OSX notifications. + void init(wxEvtHandler *callback_evt_handler); + // Stop the background thread of the removable drive manager, so that no new updates will be sent out. + // Deregister OSX notifications. + void shutdown(); + + // Returns path to a removable media if it exists, prefering the input path. + std::string get_removable_drive_path(const std::string &path); + bool is_path_on_removable_drive(const std::string &path) { return this->get_removable_drive_path(path) == path; } + + // Verify whether the path provided is on removable media. If so, save the path for further eject and return true, otherwise return false. + bool set_and_verify_last_save_path(const std::string &path); + // Eject drive of a file set by set_and_verify_last_save_path(). + void eject_drive(); + + struct RemovableDrivesStatus { + bool has_removable_drives { false }; + bool has_eject { false }; + }; + RemovableDrivesStatus status(); + + // Enumerates current drives and sends out wxWidget events on change or eject. + // Called by each public method, by the background thread and from RemovableDriveManagerMM::on_device_unmount OSX notification handler. + // Not to be called manually. + // Public to be accessible from RemovableDriveManagerMM::on_device_unmount OSX notification handler. + // It would be better to make this method private and friend to RemovableDriveManagerMM, but RemovableDriveManagerMM is an ObjectiveC class. + void update(); + +private: + bool m_initialized { false }; + wxEvtHandler* m_callback_evt_handler { nullptr }; + +#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + // Worker thread, worker thread synchronization and callbacks to the UI thread. + void thread_proc(); + boost::thread m_thread; + std::condition_variable m_thread_stop_condition; + mutable std::mutex m_thread_stop_mutex; + bool m_stop { false }; +#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS + + // Called from update() to enumerate removable drives. + std::vector search_for_removable_drives() const; + + // m_current_drives is guarded by m_drives_mutex + // sorted ascending by path + std::vector m_current_drives; + // When user requested an eject, the drive to be forcefuly ejected is stored here, so the next update will + // recognize that the eject was finished with success and an eject event is sent out. + // guarded with m_drives_mutex + DriveData m_drive_data_last_eject; + mutable tbb::mutex m_drives_mutex; + + // Returns drive path (same as path in DriveData) if exists otherwise empty string. + std::string get_removable_drive_from_path(const std::string& path); + // Returns iterator to a drive in m_current_drives with path equal to m_last_save_path or end(). + std::vector::const_iterator find_last_save_path_drive_data() const; + // Set with set_and_verify_last_save_path() to a removable drive path to be ejected. + std::string m_last_save_path; - std::vector m_current_drives; - std::vector> m_callbacks; - std::function m_drive_count_changed_callback; - size_t m_drives_count; - long m_last_update; - std::string m_last_save_path; - bool m_last_save_path_verified; - std::string m_last_save_name; - bool m_is_writing;//on device - bool m_did_eject; - bool m_plater_ready_to_slice; - std::string m_ejected_path; - std::string m_ejected_name; #if _WIN32 //registers for notifications by creating invisible window - void register_window(); -#else -#if __APPLE__ - RDMMMWrapper * m_rdmmm; - #endif - void search_path(const std::string &path, const std::string &parent_path); - bool compare_filesystem_id(const std::string &path_a, const std::string &path_b); - void inspect_file(const std::string &path, const std::string &parent_path); -#endif -}; -// apple wrapper for RemovableDriveManagerMM which searches for drives and/or ejects them -#if __APPLE__ -class RDMMMWrapper -{ -public: - RDMMMWrapper(); - ~RDMMMWrapper(); - void register_window(); - void list_devices(); + //void register_window_msw(); +#elif __APPLE__ + void register_window_osx(); + void unregister_window_osx(); + void list_devices(std::vector &out) const; + // not used as of now void eject_device(const std::string &path); - void log(const std::string &msg); -protected: - void *m_imp; - //friend void RemovableDriveManager::inspect_file(const std::string &path, const std::string &parent_path); + // Opaque pointer to RemovableDriveManagerMM + void *m_impl_osx; +#endif }; -#endif -}} -#endif +}} + +#endif // slic3r_GUI_RemovableDriveManager_hpp_ diff --git a/src/slic3r/GUI/RemovableDriveManagerMM.mm b/src/slic3r/GUI/RemovableDriveManagerMM.mm index 01d38b1855..c2f55bb790 100644 --- a/src/slic3r/GUI/RemovableDriveManagerMM.mm +++ b/src/slic3r/GUI/RemovableDriveManagerMM.mm @@ -1,5 +1,6 @@ #import "RemovableDriveManager.hpp" #import "RemovableDriveManagerMM.h" +#import "GUI_App.hpp" #import #import @@ -10,22 +11,23 @@ -(instancetype) init { self = [super init]; - if(self) - { - } + //if(self){} return self; } + -(void) on_device_unmount: (NSNotification*) notification { - NSLog(@"on device change"); - Slic3r::GUI::RemovableDriveManager::get_instance().update(0,true); + //NSLog(@"on device change"); + Slic3r::GUI::wxGetApp().removable_drive_manager()->update(); } + -(void) add_unmount_observer { - NSLog(@"add unmount observer"); + //NSLog(@"add unmount observer"); [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector: @selector(on_device_unmount:) name:NSWorkspaceDidUnmountNotification object:nil]; [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector: @selector(on_device_unmount:) name:NSWorkspaceDidMountNotification object:nil]; } + -(NSArray*) list_dev { // DEPRICATED: @@ -40,118 +42,99 @@ DADiskRef disk; DASessionRef session; CFDictionaryRef descDict; - session = DASessionCreate(NULL); - if (session == NULL) { + session = DASessionCreate(nullptr); + if (session == nullptr) err = EINVAL; - } if (err == 0) { - disk = DADiskCreateFromVolumePath(NULL,session,(CFURLRef)volURL); - if (session == NULL) { + disk = DADiskCreateFromVolumePath(nullptr,session,(CFURLRef)volURL); + if (session == nullptr) err = EINVAL; - } } if (err == 0) { descDict = DADiskCopyDescription(disk); - if (descDict == NULL) { + if (descDict == nullptr) err = EINVAL; - } } if (err == 0) { CFTypeRef mediaEjectableKey = CFDictionaryGetValue(descDict,kDADiskDescriptionMediaEjectableKey); BOOL ejectable = [mediaEjectableKey boolValue]; CFTypeRef deviceProtocolName = CFDictionaryGetValue(descDict,kDADiskDescriptionDeviceProtocolKey); CFTypeRef deviceModelKey = CFDictionaryGetValue(descDict, kDADiskDescriptionDeviceModelKey); - if (mediaEjectableKey != NULL) - { + if (mediaEjectableKey != nullptr) { BOOL op = ejectable && (CFEqual(deviceProtocolName, CFSTR("USB")) || CFEqual(deviceModelKey, CFSTR("SD Card Reader"))); //!CFEqual(deviceModelKey, CFSTR("Disk Image")); - // - if (op) { + if (op) [result addObject:volURL.path]; - } } } - if (descDict != NULL) { + if (descDict != nullptr) CFRelease(descDict); - } - - } return result; } + +//this eject drive is not used now -(void)eject_drive:(NSString *)path { DADiskRef disk; DASessionRef session; NSURL *url = [[NSURL alloc] initFileURLWithPath:path]; int err = 0; - session = DASessionCreate(NULL); - if (session == NULL) { + session = DASessionCreate(nullptr); + if (session == nullptr) err = EINVAL; - } - if (err == 0) { - disk = DADiskCreateFromVolumePath(NULL,session,(CFURLRef)url); - } + if (err == 0) + disk = DADiskCreateFromVolumePath(nullptr,session,(CFURLRef)url); if( err == 0) - { - DADiskUnmount(disk, kDADiskUnmountOptionDefault, - NULL, NULL); - } - if (disk != NULL) { + DADiskUnmount(disk, kDADiskUnmountOptionDefault, nullptr, nullptr); + if (disk != nullptr) CFRelease(disk); - } - if (session != NULL) { + if (session != nullptr) CFRelease(session); - } } -namespace Slic3r { -namespace GUI { -RDMMMWrapper::RDMMMWrapper():m_imp(nullptr){ - m_imp = [[RemovableDriveManagerMM alloc] init]; -} -RDMMMWrapper::~RDMMMWrapper() -{ - if(m_imp) - { - [m_imp release]; - } -} -void RDMMMWrapper::register_window() -{ - if(m_imp) - { - [m_imp add_unmount_observer]; - } -} -void RDMMMWrapper::list_devices() -{ - if(m_imp) - { - NSArray* devices = [m_imp list_dev]; - for (NSString* volumePath in devices) - { - NSLog(@"%@", volumePath); - Slic3r::GUI::RemovableDriveManager::get_instance().inspect_file(std::string([volumePath UTF8String]), "/Volumes"); - } - } -} -void RDMMMWrapper::log(const std::string &msg) -{ - NSLog(@"%s", msg.c_str()); -} -void RDMMMWrapper::eject_device(const std::string &path) -{ - if(m_imp) - { - NSString * pth = [NSString stringWithCString:path.c_str() - encoding:[NSString defaultCStringEncoding]]; - [m_imp eject_drive:pth]; - } -} -}}//namespace Slicer::GUI - -/* - -*/ @end + +namespace Slic3r { +namespace GUI { + +void RemovableDriveManager::register_window_osx() +{ + assert(m_impl_osx == nullptr); + m_impl_osx = [[RemovableDriveManagerMM alloc] init]; + if (m_impl_osx) + [m_impl_osx add_unmount_observer]; +} + +void RemovableDriveManager::unregister_window_osx() +{ + if (m_impl_osx) + [m_impl_osx release]; +} + +namespace search_for_drives_internal +{ + void inspect_file(const std::string &path, const std::string &parent_path, std::vector &out); +} + +void RemovableDriveManager::list_devices(std::vector &out) const +{ + assert(m_impl_osx != nullptr); + if (m_impl_osx) { + NSArray* devices = [m_impl_osx list_dev]; + for (NSString* volumePath in devices) + search_for_drives_internal::inspect_file(std::string([volumePath UTF8String]), "/Volumes", out); + } +} + +// not used as of now +void RemovableDriveManager::eject_device(const std::string &path) +{ + assert(m_impl_osx != nullptr); + if (m_impl_osx) { + NSString * pth = [NSString stringWithCString:path.c_str() encoding:[NSString defaultCStringEncoding]]; + [m_impl_osx eject_drive:pth]; + } +} + +}}//namespace Slicer::GUI From 3baea9b45847e00f3e202116703cf77aa38ed1c8 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 6 Mar 2020 14:44:06 +0100 Subject: [PATCH 13/37] Fixed uninitialized "Connected" flag of the Mouse3DController after refactoring. --- src/slic3r/GUI/Mouse3DController.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Mouse3DController.hpp b/src/slic3r/GUI/Mouse3DController.hpp index 5d6b5ba8cf..e686e12cc2 100644 --- a/src/slic3r/GUI/Mouse3DController.hpp +++ b/src/slic3r/GUI/Mouse3DController.hpp @@ -139,7 +139,7 @@ class Mouse3DController std::map m_params_by_device; mutable State m_state; - std::atomic m_connected; + std::atomic m_connected { false }; std::string m_device_str; #if ! __APPLE__ From b6aeffb618b2f09be1b655492934407302bdcb4e Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 6 Mar 2020 15:16:46 +0100 Subject: [PATCH 14/37] Link libcurl and wxWidgets to libslic3r_gui Also enhance and remove duplicate CURL search in cmake --- CMakeLists.txt | 15 ++++++++++++--- src/CMakeLists.txt | 28 +--------------------------- src/slic3r/CMakeLists.txt | 2 +- 3 files changed, 14 insertions(+), 31 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c69052c85..8d1d93c5cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -328,13 +328,21 @@ find_package(TBB REQUIRED) # add_definitions(-DTBB_USE_CAPTURED_EXCEPTION=0) find_package(CURL REQUIRED) -include_directories(${CURL_INCLUDE_DIRS}) + +add_library(libcurl INTERFACE) +target_link_libraries(libcurl INTERFACE CURL::libcurl) + +if (NOT WIN32) + # Required by libcurl + find_package(ZLIB REQUIRED) + target_link_libraries(libcurl INTERFACE ZLIB::ZLIB) +endif() if (SLIC3R_STATIC) if (NOT APPLE) # libcurl is always linked dynamically to the system libcurl on OSX. # On other systems, libcurl is linked statically if SLIC3R_STATIC is set. - add_definitions(-DCURL_STATICLIB) + target_compile_definitions(libcurl INTERFACE CURL_STATICLIB) endif() if (CMAKE_SYSTEM_NAME STREQUAL "Linux") # As of now, our build system produces a statically linked libcurl, @@ -342,7 +350,8 @@ if (SLIC3R_STATIC) find_package(OpenSSL REQUIRED) message("OpenSSL include dir: ${OPENSSL_INCLUDE_DIR}") message("OpenSSL libraries: ${OPENSSL_LIBRARIES}") - include_directories(${OPENSSL_INCLUDE_DIR}) + target_include_directories(libcurl INTERFACE ${OPENSSL_INCLUDE_DIR}) + target_link_libraries(libcurl INTERFACE ${OPENSSL_LIBRARIES}) endif() endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 11996af1a4..b0eab9bcc1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -104,33 +104,7 @@ endif () # Add the Slic3r GUI library, libcurl, OpenGL and GLU libraries. if (SLIC3R_GUI) # target_link_libraries(PrusaSlicer ws2_32 uxtheme setupapi libslic3r_gui ${wxWidgets_LIBRARIES}) -target_link_libraries(PrusaSlicer libslic3r_gui ${wxWidgets_LIBRARIES}) - - # Configure libcurl and its dependencies OpenSSL & zlib - find_package(CURL REQUIRED) - if (NOT WIN32) - # Required by libcurl - find_package(ZLIB REQUIRED) - endif() - target_include_directories(PrusaSlicer PRIVATE ${CURL_INCLUDE_DIRS}) - target_link_libraries(PrusaSlicer ${CURL_LIBRARIES} ${ZLIB_LIBRARIES}) - if (SLIC3R_STATIC) - if (NOT APPLE) - # libcurl is always linked dynamically to the system libcurl on OSX. - # On other systems, libcurl is linked statically if SLIC3R_STATIC is set. - target_compile_definitions(PrusaSlicer PRIVATE CURL_STATICLIB) - endif() - if (CMAKE_SYSTEM_NAME STREQUAL "Linux") - # As of now, our build system produces a statically linked libcurl, - # which links the OpenSSL library dynamically. - find_package(OpenSSL REQUIRED) - message("OpenSSL include dir: ${OPENSSL_INCLUDE_DIR}") - message("OpenSSL libraries: ${OPENSSL_LIBRARIES}") - target_include_directories(PrusaSlicer PRIVATE ${OPENSSL_INCLUDE_DIR}) - target_link_libraries(PrusaSlicer ${OPENSSL_LIBRARIES}) - endif() - endif() - +target_link_libraries(PrusaSlicer libslic3r_gui) if (MSVC) # Generate debug symbols even in release mode. target_link_options(PrusaSlicer PUBLIC "$<$:/DEBUG>") diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index c8589903e1..5e0c34da0e 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -191,7 +191,7 @@ add_library(libslic3r_gui STATIC ${SLIC3R_GUI_SOURCES}) encoding_check(libslic3r_gui) -target_link_libraries(libslic3r_gui libslic3r avrdude cereal imgui GLEW::GLEW OpenGL::GL OpenGL::GLU hidapi) +target_link_libraries(libslic3r_gui libslic3r avrdude cereal imgui GLEW::GLEW OpenGL::GL OpenGL::GLU hidapi libcurl ${wxWidgets_LIBRARIES}) if(APPLE) target_link_libraries(libslic3r_gui ${DISKARBITRATION_LIBRARY}) From f4f236e82e9c7b680d3c583ddac403869e83d52c Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 6 Mar 2020 15:18:14 +0100 Subject: [PATCH 15/37] Added test for libcurl https handling disabled on build server. Linux docker image does not expose port 80 --- tests/CMakeLists.txt | 2 +- tests/libslic3r/CMakeLists.txt | 1 + .../test_timeutils.cpp} | 23 +++++++++---------- .../{timeutils => slic3rutils}/CMakeLists.txt | 7 +++--- tests/slic3rutils/slic3rutils_tests_main.cpp | 22 ++++++++++++++++++ 5 files changed, 38 insertions(+), 17 deletions(-) rename tests/{timeutils/timeutils_tests_main.cpp => libslic3r/test_timeutils.cpp} (89%) rename tests/{timeutils => slic3rutils}/CMakeLists.txt (55%) create mode 100644 tests/slic3rutils/slic3rutils_tests_main.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 61fe972772..b91f75be41 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -29,7 +29,7 @@ set_property(GLOBAL PROPERTY USE_FOLDERS ON) add_subdirectory(libnest2d) add_subdirectory(libslic3r) -add_subdirectory(timeutils) +add_subdirectory(slic3rutils) add_subdirectory(fff_print) add_subdirectory(sla_print) add_subdirectory(cpp17 EXCLUDE_FROM_ALL) # does not have to be built all the time diff --git a/tests/libslic3r/CMakeLists.txt b/tests/libslic3r/CMakeLists.txt index d8dac3c10b..2353414f96 100644 --- a/tests/libslic3r/CMakeLists.txt +++ b/tests/libslic3r/CMakeLists.txt @@ -13,6 +13,7 @@ add_executable(${_TEST_NAME}_tests test_stl.cpp test_meshsimplify.cpp test_meshboolean.cpp + test_timeutils.cpp ) if (TARGET OpenVDB::openvdb) diff --git a/tests/timeutils/timeutils_tests_main.cpp b/tests/libslic3r/test_timeutils.cpp similarity index 89% rename from tests/timeutils/timeutils_tests_main.cpp rename to tests/libslic3r/test_timeutils.cpp index 9989f98716..6630d7055b 100644 --- a/tests/timeutils/timeutils_tests_main.cpp +++ b/tests/libslic3r/test_timeutils.cpp @@ -1,4 +1,4 @@ -#include +#include #include "libslic3r/Time.hpp" @@ -6,45 +6,44 @@ #include #include -namespace { +using namespace Slic3r; -void test_time_fmt(Slic3r::Utils::TimeFormat fmt) { +static void test_time_fmt(Slic3r::Utils::TimeFormat fmt) { using namespace Slic3r::Utils; time_t t = get_current_time_utc(); - + std::string tstr = time2str(t, TimeZone::local, fmt); time_t parsedtime = str2time(tstr, TimeZone::local, fmt); REQUIRE(t == parsedtime); - + tstr = time2str(t, TimeZone::utc, fmt); parsedtime = str2time(tstr, TimeZone::utc, fmt); REQUIRE(t == parsedtime); - + parsedtime = str2time("not valid string", TimeZone::local, fmt); REQUIRE(parsedtime == time_t(-1)); - + parsedtime = str2time("not valid string", TimeZone::utc, fmt); REQUIRE(parsedtime == time_t(-1)); } -} TEST_CASE("ISO8601Z", "[Timeutils]") { test_time_fmt(Slic3r::Utils::TimeFormat::iso8601Z); - + std::string mydate = "20190710T085000Z"; time_t t = Slic3r::Utils::parse_iso_utc_timestamp(mydate); std::string date = Slic3r::Utils::iso_utc_timestamp(t); - + REQUIRE(date == mydate); } TEST_CASE("Slic3r_UTC_Time_Format", "[Timeutils]") { using namespace Slic3r::Utils; test_time_fmt(TimeFormat::gcode); - + std::string mydate = "2019-07-10 at 08:50:00 UTC"; time_t t = Slic3r::Utils::str2time(mydate, TimeZone::utc, TimeFormat::gcode); std::string date = Slic3r::Utils::utc_timestamp(t); - + REQUIRE(date == mydate); } diff --git a/tests/timeutils/CMakeLists.txt b/tests/slic3rutils/CMakeLists.txt similarity index 55% rename from tests/timeutils/CMakeLists.txt rename to tests/slic3rutils/CMakeLists.txt index 6ece9f4d10..f03d8d69ac 100644 --- a/tests/timeutils/CMakeLists.txt +++ b/tests/slic3rutils/CMakeLists.txt @@ -1,11 +1,10 @@ get_filename_component(_TEST_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) add_executable(${_TEST_NAME}_tests ${_TEST_NAME}_tests_main.cpp - ${PROJECT_SOURCE_DIR}/src/libslic3r/Time.cpp - ${PROJECT_SOURCE_DIR}/src/libslic3r/Time.hpp ) -target_link_libraries(${_TEST_NAME}_tests test_common) + +target_link_libraries(${_TEST_NAME}_tests test_common libslic3r_gui) set_property(TARGET ${_TEST_NAME}_tests PROPERTY FOLDER "tests") # catch_discover_tests(${_TEST_NAME}_tests TEST_PREFIX "${_TEST_NAME}: ") -add_test(${_TEST_NAME}_tests ${_TEST_NAME}_tests ${CATCH_EXTRA_ARGS}) +add_test(${_TEST_NAME}_tests ${_TEST_NAME}_tests "${CATCH_EXTRA_ARGS} exclude:[NotWorking]") diff --git a/tests/slic3rutils/slic3rutils_tests_main.cpp b/tests/slic3rutils/slic3rutils_tests_main.cpp new file mode 100644 index 0000000000..b821149763 --- /dev/null +++ b/tests/slic3rutils/slic3rutils_tests_main.cpp @@ -0,0 +1,22 @@ +#include + +#include "slic3r/Utils/Http.hpp" + +TEST_CASE("Http", "[Http][NotWorking]") { + + Slic3r::Http g = Slic3r::Http::get("https://github.com/"); + + unsigned status = 0; + g.on_error([&status](std::string, std::string, unsigned http_status) { + status = http_status; + }); + + g.on_complete([&status](std::string /* body */, unsigned http_status){ + status = http_status; + }); + + g.perform_sync(); + + REQUIRE(status == 200); +} + From e39e9b05ae2058db5ba1cdba186a40abf7a8f779 Mon Sep 17 00:00:00 2001 From: David Kocik Date: Fri, 6 Mar 2020 15:33:30 +0100 Subject: [PATCH 16/37] keyboard and file menu shortcuts for save to sd card and eject --- src/slic3r/GUI/KBShortcutsDialog.cpp | 2 ++ src/slic3r/GUI/MainFrame.cpp | 28 ++++++++++++++++++++++++++++ src/slic3r/GUI/MainFrame.hpp | 2 ++ src/slic3r/GUI/Plater.cpp | 4 ++-- 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index b6e55a7c9d..b595f12752 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -122,6 +122,8 @@ void KBShortcutsDialog::fill_shortcuts() { ctrl + "G", L("Export G-code") }, { ctrl + "Shift+" + "G", L("Send G-code") }, { ctrl + "E", L("Export config") }, + { ctrl + "U", L("Export to SD card / Flash drive") }, + { ctrl + "T", L("Eject SD card / Flash drive") }, // Edit { ctrl + "A", L("Select all objects") }, { "Esc", L("Deselect all") }, diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 834ec6ff0a..65f73b776b 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -327,6 +327,27 @@ bool MainFrame::can_send_gcode() const return print_host_opt != nullptr && !print_host_opt->value.empty(); } +bool MainFrame::can_export_gcode_sd() const +{ + if (m_plater == nullptr) + return false; + + if (m_plater->model().objects.empty()) + return false; + + if (m_plater->is_export_gcode_scheduled()) + return false; + + // TODO:: add other filters + + return wxGetApp().removable_drive_manager()->status().has_removable_drives; +} + +bool MainFrame::can_eject() const +{ + return wxGetApp().removable_drive_manager()->status().has_eject; +} + bool MainFrame::can_slice() const { bool bg_proc = wxGetApp().app_config->get("background_processing") == "1"; @@ -497,6 +518,9 @@ void MainFrame::init_menubar() [this](wxCommandEvent&) { if (m_plater) m_plater->send_gcode(); }, "export_gcode", nullptr, [this](){return can_send_gcode(); }, this); m_changeable_menu_items.push_back(item_send_gcode); + append_menu_item(export_menu, wxID_ANY, _(L("Export G-code to SD card / Flash drive")) + dots + "\tCtrl+U", _(L("Export current plate as G-code to SD card / Flash drive")), + [this](wxCommandEvent&) { if (m_plater) m_plater->export_gcode(true); }, "export_to_sd", nullptr, + [this]() {return can_export_gcode_sd(); }, this); export_menu->AppendSeparator(); append_menu_item(export_menu, wxID_ANY, _(L("Export plate as &STL")) + dots, _(L("Export current plate as STL")), [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(); }, "export_plater", nullptr, @@ -520,6 +544,10 @@ void MainFrame::init_menubar() [this]() {return true; }, this); append_submenu(fileMenu, export_menu, wxID_ANY, _(L("&Export")), ""); + append_menu_item(fileMenu, wxID_ANY, _(L("Ejec&t SD card / Flash drive")) + dots + "\tCtrl+T", _(L("Eject SD card / Flash drive after the G-code was exported to it.")), + [this](wxCommandEvent&) { if (m_plater) m_plater->eject_drive(); }, "eject_sd", nullptr, + [this]() {return can_eject(); }, this); + fileMenu->AppendSeparator(); #if 0 diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index a6d0749ab6..20e18fc53f 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -70,6 +70,8 @@ class MainFrame : public DPIFrame bool can_export_supports() const; bool can_export_gcode() const; bool can_send_gcode() const; + bool can_export_gcode_sd() const; + bool can_eject() const; bool can_slice() const; bool can_change_view() const; bool can_select() const; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 89087be988..71106b8264 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -876,8 +876,8 @@ Sidebar::Sidebar(Plater *parent) }; init_scalable_btn(&p->btn_send_gcode , "export_gcode", _(L("Send to printer")) + "\tCtrl+Shift+G"); - init_scalable_btn(&p->btn_remove_device, "eject_sd" , _(L("Remove device"))); - init_scalable_btn(&p->btn_export_gcode_removable, "export_to_sd", _(L("Export to SD card / Flash drive"))); + init_scalable_btn(&p->btn_remove_device, "eject_sd" , _(L("Remove device")) + "\tCtrl+T"); + init_scalable_btn(&p->btn_export_gcode_removable, "export_to_sd", _(L("Export to SD card / Flash drive")) + "\tCtrl+U"); // regular buttons "Slice now" and "Export G-code" From 9453c644dd24bf1b7cd8e3a0d497368ebbe6bda6 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 6 Mar 2020 14:09:31 +0100 Subject: [PATCH 17/37] Fixed encoding in error messages sent from the backend --- src/slic3r/GUI/BackgroundSlicingProcess.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.cpp b/src/slic3r/GUI/BackgroundSlicingProcess.cpp index 8921960bba..44b5a8bb87 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.cpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.cpp @@ -235,7 +235,7 @@ void BackgroundSlicingProcess::thread_proc() // Only post the canceled event, if canceled by user. // Don't post the canceled event, if canceled from Print::apply(). wxCommandEvent evt(m_event_finished_id); - evt.SetString(error); + evt.SetString(GUI::from_u8(error)); evt.SetInt(m_print->canceled() ? -1 : (error.empty() ? 1 : 0)); wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, evt.Clone()); } From e22cc58397404706e57d3bc6c7d17ad544afbdb8 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 6 Mar 2020 14:23:40 +0100 Subject: [PATCH 18/37] Copyright year incremented (AboutDialog, manifests) --- src/platform/msw/PrusaSlicer.rc.in | 2 +- src/platform/osx/Info.plist.in | 2 +- src/slic3r/GUI/AboutDialog.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/platform/msw/PrusaSlicer.rc.in b/src/platform/msw/PrusaSlicer.rc.in index 2d4186a5d3..fb75305c8a 100644 --- a/src/platform/msw/PrusaSlicer.rc.in +++ b/src/platform/msw/PrusaSlicer.rc.in @@ -12,7 +12,7 @@ PRODUCTVERSION @SLIC3R_RC_VERSION@ VALUE "ProductName", "@SLIC3R_APP_NAME@" VALUE "ProductVersion", "@SLIC3R_BUILD_ID@" VALUE "InternalName", "@SLIC3R_APP_NAME@" - VALUE "LegalCopyright", "Copyright \251 2016-2019 Prusa Research, \251 2011-2018 Alessandro Ranelucci" + VALUE "LegalCopyright", "Copyright \251 2016-2020 Prusa Research, \251 2011-2018 Alessandro Ranelucci" VALUE "OriginalFilename", "prusa-slicer.exe" } } diff --git a/src/platform/osx/Info.plist.in b/src/platform/osx/Info.plist.in index f4e298180b..fc4b6a8756 100644 --- a/src/platform/osx/Info.plist.in +++ b/src/platform/osx/Info.plist.in @@ -5,7 +5,7 @@ CFBundleExecutable @SLIC3R_APP_KEY@ CFBundleGetInfoString - @SLIC3R_APP_NAME@ Copyright (C) 2011-2019 Alessandro Ranellucci, (C) 2016-2019 Prusa Reseach + @SLIC3R_APP_NAME@ Copyright (C) 2011-2019 Alessandro Ranellucci, (C) 2016-2020 Prusa Reseach CFBundleIconFile PrusaSlicer.icns CFBundleName diff --git a/src/slic3r/GUI/AboutDialog.cpp b/src/slic3r/GUI/AboutDialog.cpp index bd95630a0b..98b04a63db 100644 --- a/src/slic3r/GUI/AboutDialog.cpp +++ b/src/slic3r/GUI/AboutDialog.cpp @@ -266,7 +266,7 @@ AboutDialog::AboutDialog() "" "" "" - "%4% © 2016-2019 Prusa Research.
" + "%4% © 2016-2020 Prusa Research.
" "%5% © 2011-2018 Alessandro Ranellucci.
" "Slic3r %6% " "%7%." From c47565430f41f58b8a326c46f2c3af537a15cc3b Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 6 Mar 2020 10:51:22 +0100 Subject: [PATCH 19/37] Localization: "\t" symbols are deleted from community translations (ko, nl, pt_br, tr, zc_CN(TW)), fixed some phrases --- resources/localization/ko/PrusaSlicer.mo | Bin 247994 -> 247944 bytes .../localization/ko/PrusaSlicer_ko_KR.po | 34 ++++++++------- resources/localization/nl/PrusaSlicer.mo | Bin 236510 -> 236454 bytes resources/localization/nl/PrusaSlicer_nl.po | 40 +++++++++--------- resources/localization/pt_br/PrusaSlicer.mo | Bin 217152 -> 217099 bytes .../localization/pt_br/PrusaSlicer_pt_br.po | 32 +++++++------- resources/localization/tr/PrusaSlicer.mo | Bin 198687 -> 198645 bytes resources/localization/tr/PrusaSlicer_tr.po | 22 +++++----- resources/localization/zh_cn/PrusaSlicer.mo | Bin 191628 -> 191580 bytes .../localization/zh_cn/PrusaSlicer_zh_CN.po | 26 ++++++------ resources/localization/zh_tw/PrusaSlicer.mo | Bin 167773 -> 167761 bytes .../localization/zh_tw/PrusaSlicer_zh_TW.po | 29 +++++++------ src/slic3r/GUI/MainFrame.cpp | 2 +- 13 files changed, 96 insertions(+), 89 deletions(-) diff --git a/resources/localization/ko/PrusaSlicer.mo b/resources/localization/ko/PrusaSlicer.mo index 867fdc1e93b477eba897f745f1daa4b8baaef6a5..7ebda09fd517eb059e92a88078e7aa1eb4b20962 100644 GIT binary patch delta 39907 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

n$oIZ3!{P1e@*tQcysw6XR_ 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 F0RSURcd!5e diff --git a/resources/localization/ko/PrusaSlicer_ko_KR.po b/resources/localization/ko/PrusaSlicer_ko_KR.po index 71bc4488a3..dd3b29b1bf 100644 --- a/resources/localization/ko/PrusaSlicer_ko_KR.po +++ b/resources/localization/ko/PrusaSlicer_ko_KR.po @@ -1207,13 +1207,13 @@ msgstr "다중 압출기 인쇄를 위해 마지막 색상 변경 데이터가 #: src/slic3r/GUI/DoubleSlider.cpp:1889 msgid "" -"Select YES if you want to delete all saved tool changes, \n" -"\tNO if you want all tool changes switch to color changes, \n" -"\tor CANCEL for do nothing" +"Select YES if you want to delete all saved tool changes,\n" +"NO if you want all tool changes switch to color changes,\n" +"or CANCEL for do nothing" msgstr "" -"저장된 도구 변경 내용을 모두 삭제하려면 YES를 선택합니다. \n" -"\t아니오 모든 도구 변경 이 색상 변경으로 전환하려면 \n" -"\t또는 아무것도 하지 않는 취소" +"저장된 도구 변경 내용을 모두 삭제하려면 YES를 선택합니다.\n" +"아니오 모든 도구 변경 이 색상 변경으로 전환하려면\n" +"또는 아무것도 하지 않는 취소" #: src/slic3r/GUI/DoubleSlider.cpp:1892 msgid "Do you want to delete all saved tool changes?" @@ -5411,16 +5411,18 @@ msgstr "CA 인증서 파일 열기" #: src/slic3r/GUI/Tab.cpp:1741 #, c-format msgid "" -"HTTPS CA File:\n" -" \tOn this system, %s uses HTTPS certificates from the system Certificate " +"On this system, %s uses HTTPS certificates from the system Certificate " "Store or Keychain.\n" -" \tTo use a custom CA file, please import your CA file into Certificate " +msgstr "" +"이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 " +"합니다.\n" + +#: src/slic3r/GUI/Tab.cpp:1741 +msgid "" +"To use a custom CA file, please import your CA file into Certificate " "Store / Keychain." msgstr "" -"HTTPS CA 파일:\n" -" \t이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 " -"합니다.\n" -" \t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져" +"사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져" "오십시오." #: src/slic3r/GUI/Tab.cpp:1781 src/slic3r/GUI/Tab.cpp:2025 @@ -5717,8 +5719,8 @@ msgstr "흰색 글머리 기호" #. TRN Description for "WHITE BULLET" #: src/slic3r/GUI/Tab.cpp:3235 msgid "" -"for the left button: \tindicates a non-system (or non-default) preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." msgstr "" "왼쪽 단추의 경우: 비시스템(또는 기본이 아닌) 사전 설정을 나타냅니다.\n" "오른쪽 버튼: 설정이 수정되지 않았음을 나타냅니다." @@ -6478,7 +6480,7 @@ msgstr "인쇄 z" #: src/libslic3r/GCode.cpp:639 msgid "" "This is usually caused by negligibly small extrusions or by a faulty model. " -"Try to repair the model or change its orientation on the bed." +"Try to repair the model or change its orientation on the bed." msgstr "" "이는 일반적으로 무시할 수 있는 작은 돌출 또는 결함이 있는 모델에 의해 발생합" "니다. 모델을 수리하거나 배드에서 방향을 변경하십시오." diff --git a/resources/localization/nl/PrusaSlicer.mo b/resources/localization/nl/PrusaSlicer.mo index 68dab14a0f1b63442270f23e16c0853b52f0353c..f4d98c4a17a0ab13e7fbfa442756ce500cfee6b4 100644 GIT binary patch delta 40510 zcmY)11$b1)!p8BlS%O;#5FkJjLI@rpxVt;W-Q8UmcVFC{LV*@{DDGO^iaV52pcE*4 z|95A&PrrShy}y|`bH-=RW|MO7Y)`mqdqU5hBr#?>ydq;ePHOz2gyTGl>o^mKE7fsA zH#kmB48xSz3tc!F6XH}PyR#U_;aV(;xqo(?%-9o^ZxMFG^%#I@f1ymr@i;jM#3P|5 z#=#~SAKPIl_Qo_g3u&XX1%q)f?#Ju+5a(`moQybRlj9`8)tJW5adzQf#IJ2J<)7Ya z8gvCyP`~qtfIk_&Vq%Q3&BT*oEaJhK9K&sTL7QIO#>?AyRa6J+pgPdZrgz2!#Cu~* z9D(Zac#Kc|&MX3Iz;f#vR6~A7-S{i&hO_qi4eMQ010UP?Yt&G`Lp8*`-I%}{glbqA zs=VyzQAGs_xUrJWPz_a3BTR}NF$jmEDx8D6a0%|ihC3XmET-DYJ=h$x<37}VuTWFs z&rO=b6sU5-b}{}T1TxtR6|6N;L)Fm6TVOKc9Z?M)hT%9JwfMGSdOUz>@iC@D|J|km z8Lh=pYo{J+gnI2}{Iwc~kf6mg702RERDmV;m;&3PDjto&I2*MnH)Bh@fSEAQUQ=FE zRKvR4_#g}=J{eQs�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 delta 40547 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 diff --git a/resources/localization/nl/PrusaSlicer_nl.po b/resources/localization/nl/PrusaSlicer_nl.po index 8dbac533e5..379f8e73c2 100644 --- a/resources/localization/nl/PrusaSlicer_nl.po +++ b/resources/localization/nl/PrusaSlicer_nl.po @@ -1223,9 +1223,9 @@ msgstr "Weet u zeker dat u wilt doorgaan?" #: src/slic3r/GUI/DoubleSlider.cpp:1915 msgid "" -"Select YES if you want to delete all saved tool changes, \n" -"\tNO if you want all tool changes switch to color changes, \n" -"\tor CANCEL to leave it unchanged" +"Select YES if you want to delete all saved tool changes,\n" +"NO if you want all tool changes switch to color changes,\n" +"or CANCEL to leave it unchanged" msgstr "" "Selecteer JA als u alle opgeslagen toolwisselingen wilt verwijdere,\n" "Selecteer NEE als u alle toolwisselingen wil omzetten in kleurwisselingen\n" @@ -5264,11 +5264,9 @@ msgstr "Huidige preset is gebaseerd op de standaard preset." #: src/slic3r/GUI/Tab.cpp:962 #, c-format msgid "" -"Current preset is inherited from:\n" -"\t%s" +"Current preset is inherited from" msgstr "" -"Huidige preset is gebaseerd op:\n" -"\t%s" +"Huidige preset is gebaseerd op" #: src/slic3r/GUI/Tab.cpp:966 msgid "It can't be deleted or modified." @@ -5544,16 +5542,18 @@ msgstr "Open een CA-certificaatbestand" #: src/slic3r/GUI/Tab.cpp:1759 #, c-format msgid "" -"HTTPS CA File:\n" -" \tOn this system, %s uses HTTPS certificates from the system Certificate " -"Store or Keychain.\n" -" \tTo use a custom CA file, please import your CA file into Certificate " +"On this system, %s uses HTTPS certificates from the system Certificate " +"Store or Keychain." +msgstr "" +"%s gebruikt op dit systeem HTTPS-certificaten van de Certificate Store " +"of Keychain." + +#: src/slic3r/GUI/Tab.cpp:1759 +msgid "" +"To use a custom CA file, please import your CA file into Certificate " "Store / Keychain." msgstr "" -"HTTPS-CA-bestand:\n" -" \t%s gebruikt op dit systeem HTTPS-certificaten van de Certificate Store " -"of Keychain.\n" -" \tOm een aangepast CA-bestand te gebruiken moet uw CA-bestand in de " +"Om een aangepast CA-bestand te gebruiken moet uw CA-bestand in de " "Certificate Store of Keychain geïmporteerd worden." #: src/slic3r/GUI/Tab.cpp:1799 src/slic3r/GUI/Tab.cpp:2043 @@ -5855,11 +5855,11 @@ msgstr "Wit bolletje" #. TRN Description for "WHITE BULLET" #: src/slic3r/GUI/Tab.cpp:3255 msgid "" -"for the left button: \tindicates a non-system (or non-default) preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." msgstr "" -"linker knop: \tgeeft een niet-systeempreset aan,\n" -"rechter knop: \tgeeft aan dat de instelling niet veranderd is." +"linker knop: geeft een niet-systeempreset aan,\n" +"rechter knop: geeft aan dat de instelling niet veranderd is." #: src/slic3r/GUI/Tab.cpp:3258 msgid "BACK ARROW" @@ -6623,7 +6623,7 @@ msgstr "Print Z" #: src/libslic3r/GCode.cpp:639 msgid "" "This is usually caused by negligibly small extrusions or by a faulty model. " -"Try to repair the model or change its orientation on the bed." +"Try to repair the model or change its orientation on the bed." msgstr "" "Dit komt meestal voor bij verwaarloosbare extrusiehoeveelheden of door een " "foutief model. Probeer het model te repareren of verander de oriëntatie." diff --git a/resources/localization/pt_br/PrusaSlicer.mo b/resources/localization/pt_br/PrusaSlicer.mo index 0c01dd31a21a8e1f7eededa68511d1dfbb584668..88d9d6ba0c2f831686b6b4023191c99f8b269a8e 100644 GIT binary patch delta 35139 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 delta 35199 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 diff --git a/resources/localization/pt_br/PrusaSlicer_pt_br.po b/resources/localization/pt_br/PrusaSlicer_pt_br.po index 30c0687a58..ea20d2e88c 100644 --- a/resources/localization/pt_br/PrusaSlicer_pt_br.po +++ b/resources/localization/pt_br/PrusaSlicer_pt_br.po @@ -4196,11 +4196,9 @@ msgstr "Predefinição atual é herdada da predefinição padrão." #: src/slic3r/GUI/Tab.cpp:950 #, c-format msgid "" -"Current preset is inherited from:\n" -"\t%s" +"Current preset is inherited from" msgstr "" -"Predefinição atual é herdada de:\n" -"\t%s" +"Predefinição atual é herdada de" #: src/slic3r/GUI/Tab.cpp:954 msgid "It can't be deleted or modified." @@ -4472,16 +4470,18 @@ msgstr "Abra o arquivo de certificado da CA" #: src/slic3r/GUI/Tab.cpp:1962 #, c-format msgid "" -"HTTPS CA File:\n" -" \tOn this system, %s uses HTTPS certificates from the system Certificate " -"Store or Keychain.\n" -" \tTo use a custom CA file, please import your CA file into Certificate " +"On this system, %s uses HTTPS certificates from the system Certificate " +"Store or Keychain." +msgstr "" +"Neste sistema, %s usa certificados HTTPS do sistema Certificate Store " +"ou keychain." + +#: src/slic3r/GUI/Tab.cpp:1962 +msgid "" +"To use a custom CA file, please import your CA file into Certificate " "Store / Keychain." msgstr "" -"Arquivo HTTPS CA:\n" -" \tNeste sistema, %s usa certificados HTTPS do sistema Certificate Store " -"ou keychain.\n" -" \tPara usar um arquivo de CA personalizado, importe seu arquivo de CA " +"Para usar um arquivo de CA personalizado, importe seu arquivo de CA " "para o repositório de certificados/chaveiro." #: src/slic3r/GUI/Tab.cpp:2002 src/slic3r/GUI/Tab.cpp:2243 @@ -4778,12 +4778,12 @@ msgstr "PONTO BRANCO" #. TRN Description for "WHITE BULLET" #: src/slic3r/GUI/Tab.cpp:3427 msgid "" -"for the left button: \tindicates a non-system (or non-default) preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." msgstr "" -"para o botão esquerdo: \t indica uma predefinição que não é do sistema (ou " +"para o botão esquerdo: indica uma predefinição que não é do sistema (ou " "não-padrão),\n" -"para o botão direito: \t indica que as config. não foram modificadas." +"para o botão direito: indica que as config. não foram modificadas." #: src/slic3r/GUI/Tab.cpp:3430 msgid "BACK ARROW" diff --git a/resources/localization/tr/PrusaSlicer.mo b/resources/localization/tr/PrusaSlicer.mo index ad28072e06a47592f036cb70d84c56f21527b235..8b8b27069b40e15e04e1dfb92b9cec477a1e0211 100644 GIT binary patch delta 31875 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 delta 31924 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 diff --git a/resources/localization/tr/PrusaSlicer_tr.po b/resources/localization/tr/PrusaSlicer_tr.po index be59157426..16af1a8367 100644 --- a/resources/localization/tr/PrusaSlicer_tr.po +++ b/resources/localization/tr/PrusaSlicer_tr.po @@ -3679,13 +3679,15 @@ msgstr "CA sertifika dosyasını aç" #: src/slic3r/GUI/Tab.cpp:1810 #, c-format msgid "" -"HTTPS CA File:\n" -" \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n" -" \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain." +"On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain." msgstr "" -"HTTPS CA Dosyası:\n" -" \tBu sistemde, %s , sistem Sertifika Deposu veya Anahtarlıktan HTTPS sertifikaları kullanır.\n" -" \tÖzel bir CA dosyası kullanmak için, lütfen CA dosyanızı Sertifika Deposu/Anahtarlık içine aktarın." +"Bu sistemde, %s , sistem Sertifika Deposu veya Anahtarlıktan HTTPS sertifikaları kullanır." + +#: src/slic3r/GUI/Tab.cpp:1810 +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / Keychain." +msgstr "" +"Özel bir CA dosyası kullanmak için, lütfen CA dosyanızı Sertifika Deposu/Anahtarlık içine aktarın." #: src/slic3r/GUI/Tab.cpp:1850 src/slic3r/GUI/Tab.cpp:2051 msgid "Size and coordinates" @@ -3948,11 +3950,11 @@ msgstr "BEYAZ NOKTA" #. TRN Description for "WHITE BULLET" #: src/slic3r/GUI/Tab.cpp:3129 msgid "" -"for the left button: \tindicates a non-system preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." +"for the left button: indicates a non-system preset,\n" +"for the right button: indicates that the settings hasn't been modified." msgstr "" -"sol tuş için: \tsistem dışı bir ön ayarı gösterir,\n" -"sağ tuş için: \tayarların değiştirilmediğini gösterir." +"sol tuş için: sistem dışı bir ön ayarı gösterir,\n" +"sağ tuş için: ayarların değiştirilmediğini gösterir." #: src/slic3r/GUI/Tab.cpp:3103 msgid "BACK ARROW" diff --git a/resources/localization/zh_cn/PrusaSlicer.mo b/resources/localization/zh_cn/PrusaSlicer.mo index 2d8b31823e551f53c331370062677f3f758e068b..74bbb3d69d8ce75a3137ab71c12e600d3498e472 100644 GIT binary patch delta 35094 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

O-SFmP8-wk-G=e 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 delta 35143 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�wN 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 Y>V^3=%DwGVO~0yxw@o|lcOvZn0q}xJPyhe` diff --git a/resources/localization/zh_cn/PrusaSlicer_zh_CN.po b/resources/localization/zh_cn/PrusaSlicer_zh_CN.po index 3a13519bb5..a46b217415 100644 --- a/resources/localization/zh_cn/PrusaSlicer_zh_CN.po +++ b/resources/localization/zh_cn/PrusaSlicer_zh_CN.po @@ -4106,11 +4106,9 @@ msgstr "当前预设从默认预设继承。" #: src/slic3r/GUI/Tab.cpp:947 #, c-format msgid "" -"Current preset is inherited from:\n" -"\t%s" +"Current preset is inherited from" msgstr "" -"当前预设继承自:\n" -"\t%s" +"当前预设继承自" #: src/slic3r/GUI/Tab.cpp:951 msgid "It can't be deleted or modified." @@ -4375,15 +4373,17 @@ msgstr "打开 CA 证书文件" #: src/slic3r/GUI/Tab.cpp:1959 #, c-format msgid "" -"HTTPS CA File:\n" -" \tOn this system, %s uses HTTPS certificates from the system Certificate " -"Store or Keychain.\n" -" \tTo use a custom CA file, please import your CA file into Certificate " +"On this system, %s uses HTTPS certificates from the system Certificate " +"Store or Keychain." +msgstr "" +"在此系统上,%s 使用来自系统证书存储或钥匙串的 HTTPS 证书。" + +#: src/slic3r/GUI/Tab.cpp:1959 +msgid "" +"To use a custom CA file, please import your CA file into Certificate " "Store / Keychain." msgstr "" -"HTTPS CA 文件:\n" -" \t在此系统上,%s 使用来自系统证书存储或钥匙串的 HTTPS 证书。\n" -" \t要使用自定义 CA 文件,请将 CA 文件导入证书存储/钥匙串。" +"要使用自定义 CA 文件,请将 CA 文件导入证书存储/钥匙串。" #: src/slic3r/GUI/Tab.cpp:1999 src/slic3r/GUI/Tab.cpp:2240 msgid "Size and coordinates" @@ -4671,8 +4671,8 @@ msgstr "白色子弹" #. TRN Description for "WHITE BULLET" #: src/slic3r/GUI/Tab.cpp:3424 msgid "" -"for the left button: \tindicates a non-system (or non-default) preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." msgstr "" "对于左侧按钮:指示非系统(或非默认)预设,\n" "对于右侧按钮:指示设置尚未修改。" diff --git a/resources/localization/zh_tw/PrusaSlicer.mo b/resources/localization/zh_tw/PrusaSlicer.mo index 12b1a17eb0ef11ef24809c5ce2902d2c2987ac6f..61b0de019163397125bc02dce3d7d7900d96c08b 100644 GIT binary patch delta 33457 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 RGfoWfXW9N{fWJfh{|7*HFi!vg delta 33413 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�zo;JH;5AwfoPb8d@cDqn!A9=b0^(-*O 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 else { - wxMessageDialog msg(this, _(L("The selected project is no longer available.\nDo you want to remove it from the recent projects list ?")), _(L("Error")), wxYES_NO | wxYES_DEFAULT); + wxMessageDialog msg(this, _(L("The selected project is no longer available.\nDo you want to remove it from the recent projects list?")), _(L("Error")), wxYES_NO | wxYES_DEFAULT); if (msg.ShowModal() == wxID_YES) { m_recent_projects.RemoveFileFromHistory(file_id); From 2816b5a9fb49798d260a91835d6929c7a09013d0 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 6 Mar 2020 17:41:00 +0100 Subject: [PATCH 20/37] WIP Detaching of system profiles and user profiles derived from system profiles. --- src/slic3r/GUI/Preset.cpp | 22 ++++++++++++++-- src/slic3r/GUI/Preset.hpp | 2 +- src/slic3r/GUI/Tab.cpp | 54 ++++++++++++++++++++++----------------- src/slic3r/GUI/Tab.hpp | 5 ++-- 4 files changed, 53 insertions(+), 30 deletions(-) diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index c0af7bceae..b5d6392f93 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -851,7 +851,7 @@ Preset& PresetCollection::load_preset(const std::string &path, const std::string return preset; } -void PresetCollection::save_current_preset(const std::string &new_name) +void PresetCollection::save_current_preset(const std::string &new_name, bool detach) { // 1) Find the preset with a new_name or create a new one, // initialize it with the edited config. @@ -866,6 +866,13 @@ void PresetCollection::save_current_preset(const std::string &new_name) preset.config = std::move(m_edited_preset.config); // The newly saved preset will be activated -> make it visible. preset.is_visible = true; + if (detach) { + // Clear the link to the parent profile. + preset.vendor = nullptr; + preset.inherits().clear(); + preset.alias.clear(); + preset.renamed_from.clear(); + } } else { // Creating a new preset. Preset &preset = *m_presets.insert(it, m_edited_preset); @@ -874,7 +881,12 @@ void PresetCollection::save_current_preset(const std::string &new_name) preset.name = new_name; preset.file = this->path_from_name(new_name); preset.vendor = nullptr; - if (preset.is_system) { + preset.alias.clear(); + preset.renamed_from.clear(); + if (detach) { + // Clear the link to the parent profile. + inherits.clear(); + } else if (preset.is_system) { // Inheriting from a system preset. inherits = /* preset.vendor->name + "/" + */ old_name; } else if (inherits.empty()) { @@ -1061,6 +1073,7 @@ size_t PresetCollection::update_compatible_internal(const PresetWithVendorProfil const ConfigOption *opt = active_printer.preset.config.option("nozzle_diameter"); if (opt) config.set_key_value("num_extruders", new ConfigOptionInt((int)static_cast(opt)->values.size())); + bool some_compatible = false; for (size_t idx_preset = m_num_default_presets; idx_preset < m_presets.size(); ++ idx_preset) { bool selected = idx_preset == m_idx_selected; Preset &preset_selected = m_presets[idx_preset]; @@ -1068,6 +1081,7 @@ size_t PresetCollection::update_compatible_internal(const PresetWithVendorProfil const PresetWithVendorProfile this_preset_with_vendor_profile = this->get_preset_with_vendor_profile(preset_edited); bool was_compatible = preset_edited.is_compatible; preset_edited.is_compatible = is_compatible_with_printer(this_preset_with_vendor_profile, active_printer, &config); + some_compatible |= preset_edited.is_compatible; if (active_print != nullptr) preset_edited.is_compatible &= is_compatible_with_print(this_preset_with_vendor_profile, *active_print, active_printer); if (! preset_edited.is_compatible && selected && @@ -1076,6 +1090,10 @@ size_t PresetCollection::update_compatible_internal(const PresetWithVendorProfil if (selected) preset_selected.is_compatible = preset_edited.is_compatible; } + // Update visibility of the default profiles here if the defaults are suppressed, the current profile is not compatible and we don't want to select another compatible profile. + if (m_idx_selected >= m_num_default_presets && m_default_suppressed) + for (size_t i = 0; i < m_num_default_presets; ++ i) + m_presets[i].is_visible = ! some_compatible; return m_idx_selected; } diff --git a/src/slic3r/GUI/Preset.hpp b/src/slic3r/GUI/Preset.hpp index 46008eadb4..1116070b26 100644 --- a/src/slic3r/GUI/Preset.hpp +++ b/src/slic3r/GUI/Preset.hpp @@ -312,7 +312,7 @@ public: // Save the preset under a new name. If the name is different from the old one, // a new preset is stored into the list of presets. // All presets are marked as not modified and the new preset is activated. - void save_current_preset(const std::string &new_name); + void save_current_preset(const std::string &new_name, bool detach = false); // Delete the current preset, activate the first visible preset. // returns true if the preset was deleted successfully. diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 2c877ce76b..e8dc6b128d 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -953,19 +953,6 @@ void Tab::on_presets_changed() m_dependent_tabs.clear(); } -void Tab::detach_preset(Preset& preset) -{ - preset.inherits().clear(); - preset.renamed_from.clear(); - preset.vendor = nullptr; - - update_ui_items_related_on_parent_preset(m_presets->get_selected_preset_parent()); - - update_dirty(); - reload_config(); - update(); -} - void Tab::build_preset_description_line(ConfigOptionsGroup* optgroup) { auto description_line = [this](wxWindow* parent) { @@ -997,12 +984,7 @@ void Tab::build_preset_description_line(ConfigOptionsGroup* optgroup) wxMessageDialog dialog(parent, msg_text, _(L("Detach preset")), wxICON_WARNING | wxYES_NO); if (dialog.ShowModal() == wxID_YES) - { - if (m_presets->get_edited_preset().is_system) - save_preset("", _utf8(L("Detached"))); - - detach_preset(m_presets->get_edited_preset()); - } + save_preset(m_presets->get_edited_preset().is_system ? std::string() : m_presets->get_edited_preset().name, true); }); btn->Hide(); @@ -2784,7 +2766,7 @@ void Tab::select_preset(std::string preset_name, bool delete_current) bool printer_tab = m_presets->type() == Preset::TYPE_PRINTER; bool canceled = false; bool technology_changed = false; - m_dependent_tabs = {}; + m_dependent_tabs.clear(); if (current_dirty && ! may_discard_current_dirty_preset()) { canceled = true; } else if (print_tab) { @@ -3038,15 +3020,14 @@ void Tab::OnKeyDown(wxKeyEvent& event) // and activates the new preset. // Wizard calls save_preset with a name "My Settings", otherwise no name is provided and this method // opens a Slic3r::GUI::SavePresetWindow dialog. -void Tab::save_preset(std::string name /*= ""*/, std::string suffix/* = ""*/) +void Tab::save_preset(std::string name /*= ""*/, bool detach) { // since buttons(and choices too) don't get focus on Mac, we set focus manually // to the treectrl so that the EVT_* events are fired for the input field having // focus currently.is there anything better than this ? //! m_treectrl->OnSetFocus(); - if (suffix.empty()) - suffix = _CTX_utf8(L_CONTEXT("Copy", "PresetName"), "PresetName"); + std::string suffix = detach ? _utf8(L("Detached")) : _CTX_utf8(L_CONTEXT("Copy", "PresetName"), "PresetName"); if (name.empty()) { const Preset &preset = m_presets->get_selected_preset(); @@ -3102,8 +3083,9 @@ void Tab::save_preset(std::string name /*= ""*/, std::string suffix/* = ""*/) } // Save the preset into Slic3r::data_dir / presets / section_name / preset_name.ini - m_presets->save_current_preset(name); + m_presets->save_current_preset(name, detach); // Mark the print & filament enabled if they are compatible with the currently selected preset. + // If saving the preset changes compatibility with other presets, keep the now incompatible dependent presets selected, however with a "red flag" icon showing that they are no more compatible. m_preset_bundle->update_compatible(PresetSelectCompatibleType::Never); // Add the new item into the UI component, remove dirty flags and activate the saved item. update_tab_ui(); @@ -3121,6 +3103,30 @@ void Tab::save_preset(std::string name /*= ""*/, std::string suffix/* = ""*/) * but in full_config a filament_colors option aren't.*/ if (m_type == Preset::TYPE_FILAMENT && wxGetApp().extruders_edited_cnt() > 1) wxGetApp().plater()->force_filament_colors_update(); + + { + // Profile compatiblity is updated first when the profile is saved. + // Update profile selection combo boxes at the depending tabs to reflect modifications in profile compatibility. + std::vector dependent; + switch (m_type) { + case Preset::TYPE_PRINT: + dependent = { Preset::TYPE_FILAMENT }; + break; + case Preset::TYPE_SLA_PRINT: + dependent = { Preset::TYPE_SLA_MATERIAL }; + break; + case Preset::TYPE_PRINTER: + if (static_cast(this)->m_printer_technology == ptFFF) + dependent = { Preset::TYPE_PRINT, Preset::TYPE_FILAMENT }; + else + dependent = { Preset::TYPE_SLA_PRINT, Preset::TYPE_SLA_MATERIAL }; + break; + default: + break; + } + for (Preset::Type preset_type : dependent) + wxGetApp().get_tab(preset_type)->update_tab_ui(); + } } // Called for a currently selected preset. diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index d37645d7e6..e2b00dc407 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -201,7 +201,7 @@ protected: bool m_disable_tree_sel_changed_event; bool m_show_incompatible_presets; - std::vector m_dependent_tabs = {}; + std::vector m_dependent_tabs; enum OptStatus { osSystemValue = 1, osInitValue = 2 }; std::map m_options_list; int m_opt_status_value = 0; @@ -270,7 +270,7 @@ public: void OnTreeSelChange(wxTreeEvent& event); void OnKeyDown(wxKeyEvent& event); - void save_preset(std::string name = "", std::string suffix = ""); + void save_preset(std::string name = std::string(), bool detach = false); void delete_preset(); void toggle_show_hide_incompatible(); void update_show_hide_incompatible_button(); @@ -318,7 +318,6 @@ protected: void load_key_value(const std::string& opt_key, const boost::any& value, bool saved_value = false); void on_presets_changed(); - void detach_preset(Preset& preset); void build_preset_description_line(ConfigOptionsGroup* optgroup); void update_preset_description_line(); void update_frequently_changed_parameters(); From 2363f2a4a32e9be7b94b3ad0862d85c1821cb823 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 6 Mar 2020 19:15:37 +0100 Subject: [PATCH 21/37] Fixed update of UI values, related on parent preset, when preset is detached from system --- src/slic3r/GUI/Tab.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index e8dc6b128d..0c08fcb29b 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3096,6 +3096,11 @@ void Tab::save_preset(std::string name /*= ""*/, bool detach) if (m_type == Preset::TYPE_PRINTER) static_cast(this)->m_initial_extruders_count = static_cast(this)->m_extruders_count; + + // Parent preset is "default" after detaching, so we should to update UI values, related on parent preset + if (detach) + update_ui_items_related_on_parent_preset(m_presets->get_selected_preset_parent()); + update_changed_ui(); /* If filament preset is saved for multi-material printer preset, From 5052ef88db0a38e2bde638d1164220e930b0c527 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 7 Mar 2020 10:17:58 +0100 Subject: [PATCH 22/37] Fixed crash on removable device plug in event due to recent RemovableDriveManager refactoring. --- src/slic3r/GUI/RemovableDriveManager.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/RemovableDriveManager.cpp b/src/slic3r/GUI/RemovableDriveManager.cpp index c97a745af2..a363d8ae8f 100644 --- a/src/slic3r/GUI/RemovableDriveManager.cpp +++ b/src/slic3r/GUI/RemovableDriveManager.cpp @@ -37,10 +37,7 @@ std::vector RemovableDriveManager::search_for_removable_drives() cons // Allocate the buffers before the loop. std::wstring volume_name; - volume_name.resize(MAX_PATH + 1); std::wstring file_system_name; - file_system_name.resize(MAX_PATH + 1); - // Iterate the Windows drives from 'A' to 'Z' std::vector current_drives; for (size_t i = 0; i < 26; ++ i) @@ -51,6 +48,8 @@ std::vector RemovableDriveManager::search_for_removable_drives() cons if (drive_type == DRIVE_REMOVABLE) { // get name of drive std::wstring wpath = boost::nowide::widen(path); + volume_name.resize(MAX_PATH + 1); + file_system_name.resize(MAX_PATH + 1); BOOL error = ::GetVolumeInformationW(wpath.c_str(), volume_name.data(), sizeof(volume_name), nullptr, nullptr, nullptr, file_system_name.data(), sizeof(file_system_name)); if (error != 0) { volume_name.erase(volume_name.begin() + wcslen(volume_name.c_str()), volume_name.end()); From 1efa21c88293dc6c62284655ff98b9462f3c9d37 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 7 Mar 2020 10:26:40 +0100 Subject: [PATCH 23/37] Polished the new "detach preset from the system preset" messages. --- src/slic3r/GUI/Tab.cpp | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 0c08fcb29b..8e49b3ad45 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -969,20 +969,19 @@ void Tab::build_preset_description_line(ConfigOptionsGroup* optgroup) btn->Bind(wxEVT_BUTTON, [this, parent](wxCommandEvent&) { - wxString msg_text; - - if (m_presets->get_edited_preset().is_system) - msg_text = _(L("You want to detach system preset. \n" - "New preset will be created as a copy of the current preset.\n" - "Created preset will be detached from system parent preset.")) + "\n\n"; - else - msg_text = _(L("You want to detach current custom preset from the system parent preset. \n" - "This action is not revertable.")) + "\n\n"; - - msg_text += _(L("Are you sure you want to continue?")); - - wxMessageDialog dialog(parent, msg_text, _(L("Detach preset")), wxICON_WARNING | wxYES_NO); + bool system = m_presets->get_edited_preset().is_system; + bool dirty = m_presets->get_edited_preset().is_dirty; + wxString msg_text = system ? + _(L("A copy of the current system preset will be created, which will be detached from the system preset.")) : + _(L("The current custom preset will be detached from the parent system preset.")); + if (dirty) { + msg_text += "\n\n"; + msg_text += _(L("Modifications to the current profile will be saved.")); + } + msg_text += "\n\n"; + msg_text += _(L("This action is not revertable.\nDo you want to proceed?")); + wxMessageDialog dialog(parent, msg_text, _(L("Detach preset")), wxICON_WARNING | wxYES_NO | wxCANCEL); if (dialog.ShowModal() == wxID_YES) save_preset(m_presets->get_edited_preset().is_system ? std::string() : m_presets->get_edited_preset().name, true); }); From b6ee1c12634a28b2743b2de131d4e0a6f781e179 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 7 Mar 2020 10:34:54 +0100 Subject: [PATCH 24/37] Updated dictionaries. --- resources/localization/cs/PrusaSlicer.mo | Bin 245289 -> 247936 bytes resources/localization/cs/PrusaSlicer_cs.po | 80 ++- resources/localization/de/PrusaSlicer.mo | Bin 253014 -> 255301 bytes resources/localization/de/PrusaSlicer_de.po | 56 +- resources/localization/es/PrusaSlicer.mo | Bin 251531 -> 254169 bytes resources/localization/es/PrusaSlicer_es.po | 694 +++++++------------- resources/localization/fr/PrusaSlicer.mo | Bin 259246 -> 261495 bytes resources/localization/fr/PrusaSlicer_fr.po | 61 +- resources/localization/it/PrusaSlicer.mo | Bin 247925 -> 250047 bytes resources/localization/it/PrusaSlicer_it.po | 54 +- resources/localization/ja/PrusaSlicer.mo | Bin 272310 -> 274689 bytes resources/localization/ja/PrusaSlicer_ja.po | 58 +- resources/localization/pl/PrusaSlicer.mo | Bin 246620 -> 248701 bytes resources/localization/pl/PrusaSlicer_pl.po | 58 +- 14 files changed, 593 insertions(+), 468 deletions(-) diff --git a/resources/localization/cs/PrusaSlicer.mo b/resources/localization/cs/PrusaSlicer.mo index d1105a97ec88b1b5b07d20014591da21c9b8217b..f57e6ad853576c3d11c922d5bad8b09d50645b65 100644 GIT binary patch delta 46397 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�k~)5EO#5Y))z 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 Bi_HK4 delta 45232 zcmZVH1#}e2!ng6B48b9g-~hh|YOtRem69Sfhi|M-+7-5RTl{vEG1mox;j`Jd_<9r*aRL5Dj#&N3R zdQ6BB);f*{lVVH^L9#npa0KSXf_Mj+DR=~a38t-Ge4W`1F8yzQ*cpgmR=Q!o@E%7#+P5BMBmI!_7ARgiSwZSzHtZRpNzmxd*izGK5D35*!Vk)OZ+>k!9hD6CncsrExyv23aepK?1d?C8ma+1 ztmiN>@u#Q}inxpMk4+%fE~Wuf;BYL5D)0iTz|W|P6YMqxq(d#r64(@*Vmds6D(^L_ zVP1wu@t7EbA(#M*pr)dZk3ax{mNua$E+Re{Gh*moGh{VT`5K^F-T~ubFH}L}ur1EU zAdI}vOkFUl0ohO^S`0O%Wv#x31oS{R>u}VN&Bn&K2{l*o_M3(zMa^Ye)Z)yGDzG$m z^f*p^)H!kTfXV*|HC6wj%8B!rS!=;a2YpTmfi&Exfa*y%>j3Lm>nv2o%PtALp*K;_Kf`SJ16yeSXFX&W3nt^n4%84|Lp^vO)$%u}q5Oia zG5TSXuLo)b`=h34GHUJ@Ti2qt+YZ#~Ka8XBwC+>CQ}>8zX$w>Zf1rkRJZdQa#6-9k zHA2@=tN0P-MDJ0PKM(5piWq{8Z2ACHIa5&$TZb2LC;Fxm82`7~UTKe+xha4efg-3O zD~DSB4Xhn)dVf^DNvNLB!QXK;s=?`wo9BvSB;qwt9jK35ylsv%{#gkOAVEXD!MYD4 z5-7&#k|C;peh=Tnwr_x)z&?jne@|`1b<)v2A?rgoe?!f zzM=#)l=V?PnPfA}L-lwws(`Dg-SH7MwDHe6P7X|mS+G84#4*+#s0tooHuO7Z48zF8 zTVSa6e@6njNSKZ);52IWe?#rx*yl|T)1g1{yf$9g#;c$jUJLbHQ`Cs|!n8OSW8-0a z{|c%@FEFz9e>C=jS`-JhO_HE`9*#j+7xh3#)V3Rgn%m{5x!s65)Ayj>q%NZx{=({i z(KIXxs=VwrUJ{eL`=3BuZuCRV{Ui*;`KUSEi0a8*RKucP;$swMMuyO7XPts+i0?r? z{{R=_CuI7aS(nW&XnTdNO}s1m@)OuhKo7h@wb1{nX;4B`&$FO*MFrFdR7DMG2Wx*E zL3|>P$KY#@lMh#8LwtfqvCMTda)CF@hy~wZ{55wuNl*nvP$N(h3u84@114ia++gD; zFe&k;)+jgayCr5Py#|)Y;YgdDiN%t z!Y-(7I0)zCNYsAL@Q;~-JQ$OB6O4nMtwYgEd={!>^H3dGg<5lmeFRj{X;c9>QH$$2 zszD!6Cs&j^=Hq#6+)X?)YLPw11Q_8im0%Lo6mGYk#JI%o;1v9b$#Bd)rUiYg2`Iy~ z`=*DhQB$%BLvSCez&oe|*{fCYz%$WRlzU}w}SzmL`N1IEL0k4*(lP;=M@lVev*jZ-ik?nFKJ05zp~8E?&f zaU6mTFcI}T_X(({KQR>sJT(=Bq1Hrx490S(p0>jD*ca8{rKl-6fExNUsB#};4Q%zy zjNl%uO8h*Q!ZgpxH;O<90@@y5FgJ$1FmFcfaSZXpm>sLXG!DZ|#CM=7e2khx=aqRr zF2*2Q5ks*aYK;xSC^!ov;GeH(r+To0gvNLXqhZ>AO~xFkDJXy%fl3$&+gZC|HsXCz z`PN`m+=n`Vj-%#0(rdFz5@8DBIZ)-*e9btiz^){yA-`i{oQiF614j37*t{_#l;N$} zCCyP&(GJsMe~g98Fe7e99n}vp8qY_4=Qz8F$9r$4_&la3{>eu`El&BttlrF+hIo05 zj9oDq_QiBK8)M>OEQS}c7AE{?3hsq0jk5>v8dMR zK?0hBNZ-uo`2g%gygjO*$Ecxwg<2cVcat6+H4;JA6qtZ`HdF;=tu;{3H$pAK&ZxyX z%)QV2Pq7*1y9s>LVcliZk6bV_Q8jqsR ziP%3GA?kO+6~OYS#nc$Jh(@3a-eNsxeQAyAc-*y;29uGm0&0lcqk239wfd)GJY0_1 za35-Iy+NN^_LYD#M)7#uxei91R9R64mPHlN1T_-9Q3Xs!P01WogO{VGbH^fy$#7O48VM(}yulc=9f7>Mf8Xq$05>cKxzJ>G~Ksa@97s42RO zvGE70=dt`fOat?e%0C;`k+rCi-GdsLD?S3M;5n*?Ur;Rzh-e;2h^jagwW_nBdXV2* z273~(i5c+}w!*Kd=bA+_wntUi16AKh)EemMQ{h8ZG!#|tOw5ieFdyEu_Y+2ON8aaTB9N6E*-?wDDfYrYtRGQlcBiNw z_uXp}E+hUB^(Hco^Ob|dnT-B;88uQj(LFz~EAdyTscOo3t`YEIM!iptA>bup2WrUn zpbn%XxEoKS=4?z1wi{>pQq+i?is^Ae@E=s%6JUBAgqrJ=r~@ZEYN$)28c-WmUU!U7 z{mwW7s&J_ia4qVABd8PY3TjQfM)m9~Y7In;Wu`0$m7WYW^yyLe3)=hTP$N+bwN@IS zM(z^&G}qT{hL@lcSjZc9<_G9VGE2LWP0AwIt2Cn zEX;z-@prr$#Qs-HYQ!;%u8y@mRwBJWrol6)2S1_;N*mYXzP;u|^}IGJy&0-OT~H&~ z8?`G&qB^=2HIm0ri}*rZ_PT z{oAND^aM2(Z?FPJOkhT?I%=_w$8bFFBhZaNw1ghV5BpvKzgJ4-afT9qhn4a7)E@Wk`2?!sQf!G~xD~f!p|l=n0e-g5 z3iUWSX>fsboFCXVy?K6Q26y-P9RG}FyQD#Fmz=0=QVvsLOVr$sM)$n{wM&+x4wn6> zHS!L#Vd6}toC>II))Y1O{ZQqONA0Rr7*WgkkWDy&S_=X3Os)AXlDcp+M6?akjUZU1ege)HSb3#mvrEQdnfGRGCs<@(VU@M#68`a_w zsC~T*`?svtcHnXmxr z3~!6-X=l_N|AE?0>rn+A!lZZ})$lhq{WI!3h!ke>1)_#N#F`5=mE}=WQ6-H1uLtUq zpoX+S71-O_A4?J+hE4F4P0z-XRzbO~1yBb~QB=VlQRViw@xiDLjkV6gDa4og2xzVg z<}$0j5_TZo4MXrA>RmBHxS8u@sP~FosD>7_@e=la1yufKHts`>*i@Uo7(F^`$jNels!|Q5`IZ+GX{m_J3QO z(8oFgHHXu!8?C3TPjDmmBNQ;ZWgGS;z6aA`?t*5wG(qj29;m5UjvDFJm;DXK?#Q3ck<=$zeyP}^yIVY3F7U?}m!sJVZI>Y=BIDK8o7`Eb;nH%3+5 z54DCC7h(Ua;)5iF;0?@x-?2QVD{5AG57a8|hdKvFp+;yPD*q1aLu+6$)1ZQ=4pv5; zD_v0AwwI0fE9NtcVGs%0pG#3a+=Ngi~~?>YOarf4vO`d5qDXiSmTv2>BUeFbV9us3_|US+4u);L5)bxk{~zTW=}5YW)nz{=Pg_uw(q+>I!2 zdNRkl5p$9LHx@*vf~mL=wjkOSbwFK1jm&FQ#nCF7@`6z#mlXrG|ML@2hDxZZXoLr` z3#z5zl}vgm)JW7uO+h0pj~%fJ?n14Nn3YWhX;J0nu$I8o#A~6-?T5Zn1jZ21gBMXf zerffqVir+6RFBi4MyipG55_FSccLnKhMKzXSO5d7dYn^O8C7wzYNosrs9o?|HTJ)H z)SU#)RbSLTABb8+<55F32UWpx8{df<;v=Y$xP@BnFRV^=vsi;r9ZHN^?O9Mg&w(nh zSatTlT2g}qRon&hV1Eq39jIM!9ksnaqAComVG2r)if2PLpfKv)uNrE%)JKg-bJU{k zgF5hhs0K_^Ks{fM%D5KQ!h<$`0aefwR0Chz`#&)~@qn7<`Mju}7DjcbI%?!PV|DC@ zYS=kcLvNtY9p5Vgn$s^Bj!A2op{55^BosV;X#hIWh1zGh(Gt6|_d3 zlzpv3Q2EEAD&B15?|%rSCE++~Xx^e8j8@z9AP(w$2tmEs6h`fq*7klMRKY`02hM6# zd4Hi6?K9NkOHs$;G{e$Z99Lse?f*9fG{iaUnhy*GP`jZKYAAc#_*B%?tVPY;Uew&5 zMV*-cpgK^lp6Ovz)cp>qsqKfVXCkVhGck(x|2lhP2dZZWP>b$7sv)mXLm#=mS%mRW zL!1q@ONyf!Rs~gIWBeC8p`L5pz?9Pw)uG|22K|XX4fPHJ@-NgPIf3foCDi-*W7OFm zv7tF=QsYqKJyDD92Zr(aAh40g`IC65#->3pP(%M6)sd7<%n0O1#fvv#|EuNoNzl-> zN3Gf+Ha-D0WXmxku19U7ZK!;^QA7DRrsc=y+o+yJYHmg-*qQ}3vPDtlR735$I?a71 zVsSLV5|F8Z3s{P;XM*Q77D5 zRQ`vk?f3@O!-ySC!(&*Jpw>nv)JT^?pIXwAfcF1T%!uQxyR1)81;*=S9!!E-0|ihc zRo150MvX*o)Y=(_8ljn}gJ%P3L{Fm{dcPC4J)7u z^r7C*r=fa23pK|}Q59@My?LFq=~26w@)M&Pm^MdN^=zNb@CG#{KT)eS zX*aVi!>|bPs;B}cqef^UYA$!8@?S^&#Pb@}@SyIdL0M59DvH{+^>8ZsdJ)i&1@tgI zNrmb`II4g$sJUu^Iv@IADV&ZPfq$%@Pz{gO)8x;Bd5IUpF#H3jc1Q9byK?os=@SzK9AJ*k5l!5*ld&$a1Wa1Zfw zsP~8oea)BKTQDAP*AM!!|5Fh7_6HSWvi|(m3iA%&+b&!-kashTHkcM;gCQR0CIz(` z>T#-J$zi6TnWzS=A8x+Yx{5kaI*u?M>V+AIPs9Sa2Mgo35$u26C@|9eP}mx^UDl!w zoXx0_*oErpWz^KXwdtQwQxP=EOic)Ch_j=%Wf{zf^-ybO1gfD+P$Pb76#HLu^N0iu z-Ftf@#%NP<8fy{E#r=Ai2PdHlI*FR=_o(On$Cw@`L8XUdD3-!Z*a@|0=VA!1^$}1{ z&)6H6QH$*{YCFBd?HDxHwD=^dz=x=j2pDH}M;z1vmJT(7)llWsMjg@3Q6tq2_1pk# zh`yl&1`~LQBe3mwb27b06%;zbj6`N+zdB`5L)RX)iie^`W;|xWBUlwbq8d7{D!J9ofmM6V4p29uY3CBz|Z_7VW zYoh2hGjeS(oOmZxLzdwJ+>F}hwWjm7ul?VdfLgX2)w1)r8(-lRTs_0=-(oXO16yHc zw&P+fto*ag`4DHeSuY zP3kD-z%Qr~%RJXCu0p7IMH_F3+W#F;<@7|2KtI%pIuf-z=FVmRyA_b2o*zXu=srfm zXV$l;!7NUPqk+Ur+~8;6l@obf|_GKs{Fy)zF4M z0<{Qq#}GV;S`#l(1$J0uR{t1O4>qBCx*t`+c~n79u|7JBJx+6IfMf6=s+_8Sn&&&C zcE=y6hWjQE&=AeXB)A*37Ovwge1xiC&=OO?4AizCuQ>W+6|0#IRZMlrr`uUg8i}f2J_9v zHEc{g)<*NAS{EEidum)z@>2d$yXb`3& zegfy?2h{y(yI5;83A`Xs6o>CNzbHJ8I_tk+GEBP1{E0?E)QQ#+SK(6ZiPiUd-2d+9 z1okGLZl8HCS%mF~XWDOe!A#^7ch=x@(u@4X{@+3%^Ffa@lN%4PF!n!edcOY%+mCpe zqh@t?`P=-gcm{c6bZQ?n@9&R}dz^Qa6Xyimi}WZb&FB9Vr_7W##OS2I#wz&Zv>Ca| zXMN`Fb=g^u^Na$Tobxz6u;O{MxDH`n;=vcp8mNUju(o4PJdXn~%0;uUM`1qVi*W<~ zgPn2GB{MSqm(6d@eRzWOR|=FRu-Yor{Nr&Z;qE);J)z27^DAE8Z~`OzIC?PxR()W; z1+VppgN6nz!^J$f<1yd)5O4Uz<6I>E@TuAVyPlcvf)1k2g>ui$+i_)7ybh{?4e=Ca zePPa%pGKb(_oZ3&8BjkcoJM_&j_}GHnE|LHGXd)8&4wzt0_we@D(Xb5jk&NL>f`t# ztbj{VNAG*o5&r|DW5B<9mt_A16VQ!H)<&oUr!(qJ=sx?2{jZ}j`DgPZRXNm% z^uQ1tjXDWequw3QqNd~(YJ>v6n77eHsCYV5hq9q6E`nMcB~cBmj9N3zF&nn?5zwlh zi(2(NP!%3RJ@5oo@efqbgTI=dWWplE^I|vbi`DQo>V3V$H`Ac%)_SOpHbYI#SR94E z%>>R7DDs_?&BGD;gNiWoPmi;b^g@oG`$fSsd_jDm$ItyEl1_ep?qA6l_xia9%U0BC zFUKLGj#RkHSMvy_Wx=E z`lRy3nkR;7VJ{3NeFdrk=WRSnOh5OB(Ck=@^meFiwGJENQPhbS8sO*t?k5|TCO#Ck zNKc~{=VkOM;RXRca38gQU!WG(XVgKGFP5LXYRjO8vNCEhHNhYpjhfT>sMWvOdI+^> zFQN{php6r8jqT_DSROC7pU-VkF%p!a9BNKmq4xhk)LhR(HDo=i0eex~=q#$iS1<(c zqjr;jplMig)Edf(+7(4n4XlD8*f`KU_;^<*Ea;B%;ouA&-n54G5y zp+?{*YRF?HFy}`yR7L4g`Lm+dOm0+pB~i~+ur|P8?f;GhIPjd&sFsbj&O#Nm4Aro8 zr~(e4hWb2e7d$}?c~C;rpxmf@rBI9QH`L;8g&L6|s3{+d@wETf6Hw2Nq88l^)S3SZ z)q@y`%+M!BH6#R8PeA$ybTZb}AceMyLg9$XlTb?uj#S6xPPn{Cf-8(1*&m9@W8ps1Yli)a?73sI@gH zDf?e@Jl!TNL=DYWR12@6din-6B46|OqNOq; z^bj?*FHjYKL9Mxf)bw9-l{mFoY#C8Ea-j~AqNt&5fEvOUs3Gr+%Gb-r2cvpC3e};R zsHt3x>cCc1J^N74okiul=_8;D9-)Tx6)K}QjcIWlRE5b=4~C*vc^Ilec~NVk1ZuI> zLgj0TS_@rKb{K{>bK}N zJeR3BKGr9_IBH53=3@VAi1(17hFnE$n`fw=e?}GPA8v*^Au8W^bPGU@#2!=!Zdjk7 z%K2c8klUP;fvAyPg(0}nM?ej@fLdg)Q19CTc}#}PsKr$YGh$0Dj+0SycojADZ&A-h z&uiv51EwZk3DvOf7?Y_Qh`WeS$Y;v+Rm^XOs0FH`-lzg6pnAB%#t)+!dK;DRi;V{s z@N*Ur&xFc<8g+g=L+y9Jf~EnHQ6m`_HI?a1y3eUjKqpsYbdOfl(Dg#i{ZP~p&&Fc7 z1GO!Gpz;S5G6zf|)H#q0wGB(78c++h*y^K3Y&5>YCFs8YPc3W;+K6h%4%DhWhB|;Q zqI&!tRbkvBrh&nzlQBJNv1LcC@?xm7y}V7YiPea=M4fy)QB!>jTXOz5KM3f77DY`D zI-x3>foi~fEQLo=6~!uM7GZMKkmj(KLLE4DQTu!hD*t-alpL^L#SFy%MfdOjgNvIC zq1Hl}oD4NlpKN-ehHehl!mXGS14{V0zfdTFWrYAObzhIAsT2eVLfx&gIDwxQO-Vbt^2F$;Q1n?;-rwP?$t zMx;4vq(`8(_oUK3vu);)pvAKXHP??&+vz8&;G|{DnkbH{xDu*C^{w4d`A4CqWCd#R z?m_LQ3#j}rP~}A^YwAhwBcR1r6xEXos0>X|+hn+nZ$$0;t2RApIWq-iP;==+z00k{ zHFyzE;o$P7$JHvBx9j>?nDiy6hWZ{6(7yd@jbG8UEC;G#Zj>XxeFG219 zVwKEKwGXfp@zj<5oLe{*wFtXcF;hAewQHs#Q|oi)63~8Kit6DO)KGp!ExJTi%^ZfI z&Vfp(`|VNtdNgXW?Zn^k13t$})yx+T`Kz0XN1{LJGf``5KDvMZyPQCN6858p{0Hic zPglca%!g}<7e_71cc_XZ)HEk&4phTRqUO38YWwy>9le85Q#!$>Z$*`}NB6b=PZ7|f zx{g`{Pf)A$2kO9xT+7e>Z@My|R`W+|;BS8JZ!|KYM&u-F(LG0voL_A}_xFdvsB$)- zKkoq-QH%U~9rnLk`j&uN`UOKUQeCqqLQ!v@#Ze8cg?g|#s-gW*J)Vea*h8`o^rNo|Z-} zswP+%+n_35iK=)jYK#`EfY$dZ;z_0M(#azQ$(pBt!L}0BXCGKowjQH3hvf zFOJ3#Jc1hP$EYdzf*UcYiJ$vT=@HZrCunMp<}6s0cpn^tyRkg_$~E(I{~mujwj|*e zPQsGS%__f!S%^nzVZNlwgBsFas0v17He7^i_(jxic!(OI2rbQGPK6q|%&7Aw9NTOE zS0kWRyB~GnT(%$#Pxe8j_14d{wmoFlO+PDibgXP6eftxX3qpvtR@ zDsL#J(dYlM1PYR{8OP&0-SF^XvW=hno6A*g%>!>ybNm$xV3Kxbt<=R_#5sG;qNdbb*d8rrp}MR^D7;0LUXRXUk` z3sLzFqdQ`#kxALvj8tCKT=&3h_!ln6xn0=*TBW7Cn#EKRLy0%CjzINzgY^P#ApQY$ z0xs`n8hizHjyy+I{1$b9MeT0laZvX&U^UE++MYwZv;Q?`6G@nj4{XMPJSHMbj4yW%+N1IjJbcJlT#2BI309Myr`sNGV>-fw5`|K8JQ9++rvEU-7$p?Y`( zH6f+$5_JJ)H(q5em@Vjy^f>S$}`l78SuLqp^O+pyf~^O%~4Z588!4XQ6uPELO?y- zjvC67sDj_18WPyoynAIu?cbWH0vcjgY>PUwXQT43LM_%~s5hnCsPcc{ZVc?_=l)&6 z8Dx$4oOXYhIqrcfXc%fgPeaYwpZ5M%)LDNNwV3XrDtv-k^^urLjbwII16!f;cSEh2 zv8X9og4+MPFhKkNpc~*b8hW{LAJu@zs2+bn_24IJWPJ0XJc#}99ID5a2l8V$4n^&f z_o#+DgUkpwO00`ruyk{=2R_zNrGDDKf=%b?RE^* z5Z%MP9@c=3XB%bawm51{G_-a_l`{-AQgbl`x1bt)88vdxt; zpR?5joDA&6rO0_RtKR9+JTwyBx-kjMKwI?B-5ZosPiHPX2CGj&^JRp-y8Lb zYBXvD)}s6O|Az_GXO6F-3dlXh%wbv7;%b6QZ;O?%A8P1Mq6)fzYS1&(Iq(H*V7#fO zA?;8NpN(1Z7>>uU$oi*6)6AR5IMn;|HcUo?CQbKqJ`&$JgZBpFD`)!gPxbJn@hm@Q zGG3kS=l*R-hdB%>_ut_J(tplnu8B{W=jSvbK5M?8(+Gc{J_j^h;OG7!!YcHQC1KJ+ zKR%o@bc_6)lf+XlHZ6ROt%(o()6Cs->`T1e5Rh_6}d=l(rVt!2gt%lWuY zdFxRPdA7pOnMS_%E6s?ES!G6e_bU3IoEsNO2*Hn-4HK+3LtYj&clA(1+Y!s*C`^r) zQH$$4>QiveH6~w0)ZDj0&AAVC&MZVN-n|%#N7k_amGNH^bWr%OH5pT41mcBJb6Wxn zV0BbOCZbNvHK>#AAZEmSsO=hSokpiaz$sG&_|4M&}XWlfp@z6OYECz!Dn4Sph8md{s2=~oIT&M`SsN=c znfCuN0zL65G9*ru?Pk@EMfG?+s$pkQ72ibl5qZV~7)aq}Cnu2kt zMffLb3Xh}v_dmA@Xo%mVK4AFoG!+G*dK8R$FbirM)j$n>7gWK0Q4O4k8p*k+sat|+ za4+gj>LKdQE$S|_#!~HK|0_cw5@ZY1b{d1Ka21xqbEpCn?KbAHmbW%XHS7=TEbBJw zMN|XcptfneJ!Zs;?P34xY;Hw@R_j#Ms$Y#d4-Q%HSv`AAdNS0(RlwTNI>5RJ)u2O| z7Vo0gNYs7CU~6Wd4HQN_P}SPeI@-D%k8}SpY7I=>@8`_LSr~?S516Uwh-HZnK~2RO z)ONmt>G3UUtt9=+bi`MTKz0%uV>+CSDsT_Bs_xrzqQ|4oKJk(QlB>Yil7=$5j8RmZM-AqA>JRg_;#QgcKbB@zchi!XUu-D zf{}^$L=9K`x9k~mzHQvPhSn90#c5E;z-(J-7f1?_70o|!WHTXShiesPi znQy0&|)!?=0P8C)qp7w&t-v>3c6Hw)>L@mmF=&l)? z{s6V8zxW8~hz-2x=l-)>sZlNciE4SkCDWr2)OJgc6|fYx!zrkq_+2*nLr@iGvzEkg z;&oArdlL4+6{r)@m->n+xD0Arv_Ng2Ay^4lqZZkBtcV$|ny=~mpn9;^dKopxukb#m zyJkir=5_OC6N)+y@}s7x1v1q>rxO7!uHLAgkFxPusG(eK<3~^}zKR;L?>0Tw4Ku_k zP;;Ie)v#iyit3_9q`6J+gX-u+Oi2CCdIFl$&cg>oMc9;FHp$#QL849E3 zuna1_I_d~*hx)`a7FEGQ)b`to8li_6j&D$lF#SEV*qUKk;$u;Z`6`ycbob2^bkuh} z+7>-Y&|Hp1t^O659?zjF{*GE3u^*V8X2ZtBi=ukC7&Rp)?fq-0@}8llF4992kB^Gy zK#gcI9|85K0&0IZLG@heYS=W?Vq1gSB}Y(md=<6G9$CNO1L83rnFhYa5aJOYn>U}- zsPamq7GFcui2GU+P)jmSkAP=g8HBgJPA*ul_(Ea@1n}7fl*{df*^x$d98MdKC-f z3v7a!Uz_bV0aej+)LH)l^_>43Go?YO@-ko!%#H~-f1DNsG&DZckj+8O)ppdJpTQ8k zYxTZ0pO#ah7Hc`wlyyao*d)|;o`qUVdr=3^WmHFBpgQseeX20#JF{rgqaMhI>9Cqj z?}r+hv8aa4L@mnosQkxJBX$?7<2O`ARo=Be-?RU<>cc+xxqs(h z1vNx}VNN`TxzPD&J^_VeUZO2A6)wayc*Ob=H3e}$nGPjGjciubYOjbIsamLfJwLJk zHN*o*&^DZe>d`V(OZVCIGu8+8{udh${A@-hEo#VfpgL3wRbe+&x&1H`PDItW4{P8# zAAvdqLcf>?2BAh^G-~lo!fLnxb&|bDoR2ww~9Z{=&GOFT5sI{;aljB*`h`dE@ z%UC~5$1)(>(C6eKprI;{T8uSNL)ICy;ZRfo+t7;_QExU^QB(C4mEZ5D`2r(8s)3DB zBhwSr@bRd%Fdx;xJ(y1K|5pg8AQi8Q5}{fijw-k|>V5}QkB6cvSc&SkVk3eJV4h}T3l zY%Xe~wxfph5^4>+!y@R7=ykVg3DlzPk2*Jwqt@D8RQb^(dHL_Z2;_|9b?3eus=$`0 z3WlIQt1U#m-|t5?^k39s^N(!uCq(5BN9C`M%HI{$!G)-)+ktB6ZOno%Bl}E&Nuzk( z9}aV%7FQlr#@|YSB(Y&FyT|b4yYCdmDz}G1STT4As$?QB6D*szIfE z1k~eps5u;oI?-03rs6DWSA0YrAVJa0{UVr^cq`P<&Or5i9qz}|m;)z7_c~=fd=Y^K zF(4*u3M&S9oqXt98q2HyX4ttG+w082;Xz)fC#H(aF2LFGyzZaV?1}Gnno{7(1YRd1 z=>ZAN5XMX7b+(aS5;YP(F$AL~_PU>-GN2ZBO)QV|P*d|9D{B8I4)(h5?`=>8bVQ9r z9}K~nsG;788nT0^A%23I+pm}$gOZr3%87Z2S4O=%jzW#ZMpU_vP|rt7suA}lx8tKLk)FsD$}#ns39zbT6`^0_otvnWG-qE{)6=~c52hpj;J0E zv++r&MY_^@0ClikP3`r$?{eAGm?S1-%{;Y@EcB8GcQ4LsyS}U7TJ>6$Lje6I- zh1zbVH}8R_+NMv&!Z|_pV907+;AARtwVj8%<3(Umq}=Wld)iCQ}B7z zwt0qCX<+UwW@JWXH3!K~)S|qFc`!mYGc^Tq9P$2G7h`4jx}SL3q1HkV)GqM#wSloV z!+g}LUV)n1gQ$Yvqk51fhq1V|wzUIl1O}m|a5U;foQzuif1(!oZVbUQNIgF1HGv2u zL<=)5i-r0G6c4p6lb}AUWka<%pS1$2z=o*p*9G++Fdj4DYSdb|ifX_k)LQt7>R_Ur zYB2jhjDQjfV0DJL7HUXW9)j+N0=BOV2jw)z67R7bg3*X`lY?s%psfhW^ zbD`FPsE$-ejaVmi|NXDA1T<%>aXW5C^{8WhlRgMFMWbwdJmw=l9rdPj0lVQ_e2%RO zc->#q)hK9o*8;3g`fKzs!X*nCOBZJU*WpIlB3}2q-#>96@pwhO?msR+1BVfhQq1dq z-!}n!5dVtWC0&Yp-Tw$RQVG@$1^2-`r1vlBbq?STyoCKqnKzy4rAT7$sCDeD|_AlYt=`Xm-K~I%uwINio_FEHMT-6(ydqv zZ(=>nSUrJ&Z;2T7z0M*1TPK$Zv?arw zhFl7kB1vP{hn|R${GFNQsb2*_g_>>(Z%ZwBEAZrV%Dx+_sgop-B>&P_vcPE0-BS3 z-M#ML<<;%sbtV$`?`c-;bc{^CBdEDP)646A#Twe%y#L4O!{>eO7f1cNz5efZXxu}zK2Wop>MtvYj zJeK{RfI#-K=AbEu+6CuPC)-<8#ew6@n^0oZC!5r$4-(l>b6wcRx1mPh2Ulp@$9e*fFjW01ewwi3-l)7UU;&V|AJcYXd6ZJ_a z`V{jKD;U-AlBjYUpoV@D7RPm{2E9i*;&T#AHA9{Ob)y{i!wy&gpJNE7pJrNK&e{Yu zBE3;PnS`3MRjAJk$5CtKBBsZ;*b0+QH|NJN%&h&tgFqr~JVEW_2s6ykW<)ipHmZQW zsDhWGrffZG%8sDc!b#K=+(6C!BhozGtFWS!Vuy`F$VQJO$q3T?TmVGDXKx+ zQFDC(wVEHH_Wyg-a}{Qp51}Vf&t;fx8c+bWXiH-#RzY>F4=%)oxCBegp`5zx@8<+E zVd;71=wRR6!Xw zm<-{l{aqNfm?~o&>}?&38q!5Jz8+QHVbr$#2Q@{XF$2chXm(M4WOw_ByN!pV=DG;#`6{T2YFpc) zrm7z@@Xm~#?0>D^StQ8is2*%Zt%-f823$kU^()leMcrion95&quxKEI}2#9<{$u zqMo~kn$l;e^8NOhsZN19*nFu8Xej(?<^~o)4K0NK=juj=dyMlx8fz{;o(#}@aXsh7 zJF9aS8_}Y~Y9-fqUQq~_#8IR_C(k^d?@v8^f_LT;p26>*l-Ef_rS&NAr>#I~3Kk_J zf8^p`BlzE5gl|*84_kRh>n@Ek*9ICIn`Z`VXt;V3{&lq^Z7KP$QAQ#f){SSz_*1|B zw6-^iBgk->7r&fxdi|#%c`4)`5AySf`>FO+f%hQczjj(o2M+(z@als%sq?=h#B7*j~NjnZ33!lZ#H+Kzj1; zri{k6f^n2nmAv{9Y#Cv#jZ4&Zf%tS@?)aA_u$midcr~;Q$zTh(Lt*+pSl13-M|j1g zz$o1RMEJPP|Aw?NRKSk}&TGP6T!{QLaqjh+{~bvOUhrH!TlUci)Zds2_&2AV9lS1( zX_?9I@QW_z7=`pFy%P^4C0}A&S#OL+dS%iZP{}RgDTwPTKw28Y@yH*Qd%C(4?qh=d z15_sP03U1qlQ7%|sLYQ{ZEdFW+-%9iiFi%mUOp=5!o8#98BYAy)z5}A*r`!^Px5fA zxZkFS@cesTC2YRd+^?!Hjc>bQPI&cm7+EAsvaCOq%4|?)^#G18o^f`(ncff9?Nx6w-o+n&5g0h(~W*@Zj&n zb;YBAH9T~fd*ey#YSUYgw$fyAnv&<&m6vDz$uo%8aN7~xoBp3XCNKS;K&F!vRF>BS zUVrdFa)$j9uT+H7^3Zi#NE_SJRljP&G349BYc?IoWb<7k{(y2j@zPb2=VEd%EAb56 zOGyW}la^lZ|G%#DHnZYuxS9MvalMP3CvU3%uLtyydw-L@h6;KU=J%OSX~K&Lm!ga; zwvHKe?xF2KM8dj!BS|RA13P&j8m&sejRwSP@lZToRf*r?-c&MYvJL7>T2k_iBYmAM z=rg@lkBzM`S_<8oxZk!ZX`bDwU2lgUZn{0qn`Uu zrp6?!D+Lcv<)!O9c_vcPQLIP4SX3CFLIVg7quk_#b?GBn67t0&pDsV1FGT#0NSr^T zd1#Q$SlZlo|MwsMcNGsT;x(HG=2PgeD+XzAZG0p5a@yhFPx>X|{Gp8dRa_;?4Wc5Q za>GcwiFHudOY%jJ%$>3({=ff?#zVWv)Y}$X1B>%&OG6v*TFw3F`0EN`*XSB=^M??A zU>nz!eDNtO3YF>VM4mgg0d9g?rYji_6xWLf_=6_*YEFCt4-}xnLKJX9J-2-?#oHSKq|~hWDa46jP0->!*=jL1$86- z(Z>HI&tl@b@(^xl!&NA!9);hwl^xT4;@^pPr_62S>r5ISqTPQ>ilFI#3tIpQP68V8 zig+7a$Vdt;$iw?>TzPaovU-uwC87$^07+ z>uO2<QG>R($i4cc3vBKbtL}l`po^Wydv4ru<88&e~{SGCMKZJ=G=)( z+Gh$l%_}YOv=r39Hq1kV%9F1Zd7krJHeTC_XXJh=+t}sY`*j77_P2d@59R4<#{Gdj z^K1P%=P2Y2(ScOtN2aL6M-$)5gAK|2l%Ad-K8sfh3VcPpBzgbhei-+slYh~FD*c!H zi+TOJMo{K^@*g8lGoGnTxFz?O>hs@6S~BH75BpPCB;wOBj7&o*Wgce1ZKO@&ncB8T z6)=S7`*W`|&qU$=edKQs-Rrb%#2jLaNy|*dZ^?6wXOhwp-xZV3Ic*D6w6IMReq_$i zL%R4P#5qfW4R}~r1`7C2W&geOE0;p#>%?>Ic^&yrx#8q(XyeBzXTSNk?pggLKIS3) zXPCO$b5q~t{<{2aZ*tj+b5Zbf3L8xRWV}+_UcMlG0C`rB*4j2~E`@Zo&#AolHoZA{ z5=YYhC$WL<*lP-zhf<(^xs;F|h7jJ)LqoX#8x3heIGB5Vd2O-{%S1k1scl7Du{!rs zlDCP?qx+3WKWs;{2=@Zr|Nk{^{6(f?6qtj=(exrR1-`Vs`qLIVp7dgbKa<{rLiB}& zuDd+fpY(ou*}|3nf_$ems(6-X>yWmA@^$IoeT~C&I)9v|+)TrbPZW@XFn_A&UO)KX zUKG%r%tc7o)zsiDB=0`b3X?Z2jqOeR1F!j{h4V~l>_P<&CZlW>nU?#yw(`nh>hL+k z$<&-ox}K3CGdFHfz(ii_2tT9phZL}z@G$aCB0U=~U766I%DWQ2%d>uV8g%b4&-~7_ zUkM+wv zNqEhq94?=;i41*gVX4TNm2ghmh|OfGO!zVnwCCPUo4%a%2fWr2Z%Y1!c0BU9Wzrbp zy?7=B4^VLj@@}*DA`-txS^PWE{FajS5}5*ua`Ot-wwWRk9>l8^6?`P)4btCGh^|Yd z#kCbGet=gTJGK$XGldGOVj*5p2p?Cb|6ECIIT^Xevi=<|UPNwUt%Z zJ+4#qtP<%7DBukD*3&?JskfU~Jkp+VUspxKkGQ8RH{pl8zEMVTUY7}Hqzqp;5xye- z-<6s8S#CVz!F&{6lfoL?0t1Qfqj5WJp-;%SlyC>0$$?pkzrg7>e~2x268E|P)F-?Th< zoxBTdBXwgVX&o>#>N-#U0fcuEE@mqa;F%ZhU4Cff{sQiw_yB(}h~WXjCVH28!E!)+la$^4CQYPwjTLYCR|Hn^5}4GMii zo-#DJ1J4d2eHZE)#l2sb?>}Lsz4W=Q;D9F5j+@c#LvL;RDm=t%1L@=J!z0NXN_+;D zedb;%8lQ=98SH{9xUZ`s9r!}N1U$E&R}b#zBmW1|E)vc`9@~Gm3oUN!KE{V~!bfdo zeeoR+4d&ib(vR@qEMC76)*o@qqQXyvb=~1rj@LCRh-cHP;~nzp3LtMr;u$GVS8RXk z|3qR^9!OymH6m|#%_40H73pe1JPaojFGm5Ld37UP(mwNvym<(J!`gU>*B2`Nm)By_ zg2@|5M;`Gi$Gt(eLEH3sDJF&K^5@0|8gqvSbZx_0Cg>dC-T^xz-^rt^0 zoYyqs?|9v@52^586jGB`Pf&y_FAc3mo}4D?%p~5E{C!A^X48)HOm524@UT57g!6W&6-U9*D|=neDqIS)5|z(N&MexEJ?AseBXZY3#iL+}O|k z<$8eYZ^GfcvJ>7)+96&S^nF<*Dyl+aD=I00ZETO55Y|#)kKvV{Jgay(8@9%?r0F`y^SUaKmYTHDJXhxbx;huIo)0yS|1X^oMYm&xsfj~0 zHJ6i+rsXcTY95zojD|uoGOWVfo!tIbI7oKfG7HIXV=KyKZF1?XL(8S(K^vP}b~$tD zeBS6B_15@z9%+|O4 zI$ugGrFVfHGa!`I(|xLYZ=+qK`5F3N@QO8EK;~NAjyq5WO_H)SA|ca-vcdi*|ITI&1Np+lK8BnO=@j`q@_2gJbkVP1Yrx*a#X`V8wx_0llDC3; zo0!3(hU8XsKETUZc!l@}OAj&|MgK#ctNk-O`~mzJJU}$z;Sgh}|BH`duopuc5S)XH z^+M1Qp9*gmeX(frJaPxEAA!9MR%a*C^<-wJ_D|4giGJ!JS&9`Zxg&X{TuFTZ4=1l8 zwt{>S7i$4l1J)bggL~sScx(Ef>5(Du*1{93VCgaXf9S4CYJYmy?0;35o%E9H>MRD4 z=G1dl>|F-FMEnJ@HMk4IeaSyZaHh?7ue;4B-67S?iqAmZiDJL$`uPkN8JrSKey!8$J*eN^Ki+ndrqMcgk9wf1m7MW;YMPG2S24=I7>KH>_RR}mad z?W~Jr?mGA)t=kHq){U8IED-b8UveK%m&5nRGs*Me{GFpFzS-J;b_Ne4KMU^%@b=U<@EKq)(QK%%#1(qa$#26G3)6kK zQX#entl-Kb74;^U{#tM+l3Vy9hF$Bu8b|b~Qf4;7A4+{1{$kY#0IP4WP%LJ?1f5v8 zzu+a*shbgBSdaXidK7gLgg(U6)MLoS5?FACdYjhgS+)sG%#GZcm-R3UD(mS5QHzab z*?+*7X+4Siy-#br`=4i2Xz%*fQwbp zTglQq@=@r0M}0w$^#nUkz1o4Ve>mW9e3OvymUtsP7s3vXvLfz{x6lJbyd%QjQLljG zu21v>*g58&)#JTJ|2ME%aN04q8Nbf1EI5(m1LU{UGze#LF+W6-Xs*|KBUmcK-o%#l zeuuwbpD>yDjM`V<^|Rpg#z%u~Wd0$`hY*`EKShtEU2BnO`O}x*N=?Ojv5mn;G+H1m z|1C?M4W;&`Cw2<%I${fWVw({Wt75?pmUUCyUGV|n?U;EBjSBjs!Oy}kuWBQr;YZ_uMESav0W`V7yH=p`vavL#2=iFHE zghO1wSHQUh{)D^>oIX5Ad)^;S=%iO3wGg4;4WrnH}1-!2Vh<42QuWvY&E!;1HDkV7x2emQ}CS}o-5yi?oCpPJJOVW z>3U%dM{EcC39=V{LXTNRF7||Y7VaC&u7M}kodd)gfsI!FAnldV+s8~1cwf9T`abd= zNT&D~z82skSO*Oym;!b=(*xsSYA%7vs9}*8C4=e<+xZYB{(zK6|77zws-l+3O-D+eJmOY zr!)0A@D$?vEIq0R6zNbPnjeBW!R-mwk$j0GtM4#WXSc}v>)?;%H+6{x!C>m~Jh7Oc zJ(yhe-~;p*l6NKU)cN6X{FyQ1MPSbI9pu`NJ>R41s9(GV%03TvgWLy|<+@dtyn}CL z>j=dncnmkN{-`Fv@5{y!#OrWu;8)2*iQT9J;Veh*9&xq4q;2IB{8$Jh8SKCj$BANv z5VjGALq4dFSpA%o=HfG1+lgZ2Bg{k&quxF~7DBnfc z3h*jTFNk8jA#cQeb=fw=S2Hk|{w5XiptqAe3I4nEF4j)+y%UWRE{hH`ZB+LiX3F%* z%gAq%kCKl)Id~6%EFEsmD^ZHL0|MO@b0ja<?}H08jsw=20qGlD>=M0?@N|4IZbGOPVGnU8GamR< zj_XBzNBY=2u%^;SBZoMUI+{F#2lduN^WbK}ZBYAvKazw&bcbYvyb5BV67Q;L8NDN- zj>K=2)8GykZT8pN zF~Bsy6G}eJ5k0{g^921MZl^Z|kAnSzn26ugS7*1*h|qm}7qcPs#cJ?gxU<&hiDQ(% znAk6qOXospz_LL!R|5W3$-uQ1OznhEWT7+s`Ea7@J>fxf?%kYKfw}7|BiwR_Rr@rt zrPtig`@$R)Vpw{bqa2JIeata##@dnQqwS0<^Uaqd440GUg_ai%M)R*N zF`mZx>y{<28%>?9Zoy_B!#Bbj+T6$=XKmERNL*x%_B7h0TW@tRHl4IaSuzH0wKg`Y J3$1B?`9EL@MK}Ne diff --git a/resources/localization/cs/PrusaSlicer_cs.po b/resources/localization/cs/PrusaSlicer_cs.po index a892a4dac6..a9c7dab9c4 100644 --- a/resources/localization/cs/PrusaSlicer_cs.po +++ b/resources/localization/cs/PrusaSlicer_cs.po @@ -5,7 +5,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Poedit 2.2.1\n" +"X-Generator: Poedit 2.3\n" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" @@ -1561,6 +1561,10 @@ msgstr "Kubická" msgid "Current mode is %s" msgstr "Aktuální režim je %s" +#: src/slic3r/GUI/Tab.cpp:959 +msgid "Current preset is inherited from" +msgstr "Aktuální nastavení je zděděné od" + #: src/slic3r/GUI/Tab.cpp:957 msgid "Current preset is inherited from the default preset." msgstr "Aktuální nastavení je zděděno z výchozího nastavení." @@ -2136,6 +2140,18 @@ msgstr "Upravit značku - Pravé tlačítko myši" msgid "Editing" msgstr "Editace" +#: src/slic3r/GUI/MainFrame.cpp:547 +msgid "Ejec&t SD card / Flash drive" +msgstr "Vysunou&t SD kartu / Flash disk" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Eject SD card / Flash drive" +msgstr "Vysunout SD kartu / Flash disk" + +#: src/slic3r/GUI/MainFrame.cpp:547 +msgid "Eject SD card / Flash drive after the G-code was exported to it." +msgstr "Vysunout SD kartu / Flash disk po vyexportování G-codu." + #: src/libslic3r/PrintConfig.cpp:118 msgid "Elephant foot compensation" msgstr "Kompenzace rozplácnutí první vrstvy" @@ -2426,6 +2442,10 @@ msgstr "Exportovat stávající plochu jako AMF" msgid "Export current plate as G-code" msgstr "Exportovat stávající plochu do G-code" +#: src/slic3r/GUI/MainFrame.cpp:521 +msgid "Export current plate as G-code to SD card / Flash drive" +msgstr "Exportovat aktuální podložku jako G-code na SD kartu / Flash disk" + #: src/slic3r/GUI/MainFrame.cpp:486 msgid "Export current plate as STL" msgstr "Exportovat stávající plochu jako STL" @@ -2447,6 +2467,10 @@ msgstr "Exportovat úplné zdrojové cesty modelů a dílů do souborů 3mf a am msgid "Export G-code" msgstr "Exportovat G-code" +#: src/slic3r/GUI/MainFrame.cpp:521 +msgid "Export G-code to SD card / Flash drive" +msgstr "Exportovat G-code na SD kartu / Flash disk" + #: src/libslic3r/PrintConfig.cpp:3320 msgid "Export OBJ" msgstr "Exportovat OBJ" @@ -2956,6 +2980,15 @@ msgstr "" "na levé straně: indikuje nesystémové (jiné než výchozí) přednastavení,\n" "na pravé straně: indikuje, že nastavení nebylo změněno." +#. TRN Description for "WHITE BULLET" +#: src/slic3r/GUI/Tab.cpp:3267 +msgid "" +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." +msgstr "" +"na levé straně: indikuje nesystémové (jiné než výchozí) přednastavení,\n" +"na pravé straně: indikuje, že nastavení nebylo změněno." + #: src/slic3r/GUI/ConfigManipulation.cpp:136 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers\n" @@ -3589,7 +3622,9 @@ msgstr "indikuje, že nastavení jsou stejná jako systémové (výchozí) hodno msgid "" "indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n" "Click the BACK ARROW icon to reset all settings for the current option group to the last saved preset." -msgstr "indikuje, že došlo ke změně nastavení, které není shodné s naposledy uloženým přednastavením pro aktuální skupinu nastavení. Klikněte na ikonu ŠIPKY ZPĚT pro reset všech nastavení pro aktuální skupinu nastavení na naposledy uložené přednastavení." +msgstr "" +"indikuje, že došlo ke změně nastavení, které není shodné s naposledy uloženým přednastavením pro aktuální skupinu nastavení.\n" +"Klikněte na ikonu ŠIPKY ZPĚT pro reset všech nastavení pro aktuální skupinu nastavení na naposledy uložené přednastavení." #: src/slic3r/GUI/ConfigManipulation.cpp:211 #: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:96 @@ -4118,6 +4153,10 @@ msgstr "Maximum" msgid "Max bridge length" msgstr "Maximální délka mostu" +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Max bridges on a pillar" +msgstr "Max počet mostů na sloupu" + #: src/libslic3r/PrintConfig.cpp:2822 msgid "Max merge distance" msgstr "Maximální vzdálenost pro sloučení" @@ -4286,6 +4325,10 @@ msgstr "Maximální ryv Y" msgid "Maximum jerk Z" msgstr "Maximální ryv Z" +#: src/libslic3r/PrintConfig.cpp:2660 +msgid "Maximum number of bridges that can be placed on a pillar. Bridges hold support point pinheads and connect to pillars as small branches." +msgstr "Maximální počet mostů, které mohou být umístěny na podpěrný sloup. Mosty drží hroty podpěr a připojují se ke sloupům jako malé větve." + #: src/libslic3r/PrintConfig.cpp:598 msgid "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit." msgstr "Maximální povolený objem průtoku pro tento filament. Omezuje maximální rychlost průtoku pro tisk až na minimální rychlost průtoku pro tisk a filament. Zadejte nulu pro nastavení bez omezení." @@ -4957,6 +5000,11 @@ msgstr "současného Objektu" msgid "Offset" msgstr "Odsazení" +#: src/slic3r/GUI/Tab.cpp:1755 +#, c-format +msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain." +msgstr "V tomto systému používá %s certifikáty HTTPS ze systému Certificate Store nebo Keychain." + #: src/slic3r/GUI/DoubleSlider.cpp:950 msgid "One layer mode" msgstr "Zobrazení po jedné vrstvě" @@ -6430,6 +6478,16 @@ msgstr "" "NE, pokud chcete, aby se všechny změny nástroje přepnout na změny barev,\n" "nebo ZRUŠIT pro ponechání beze změny." +#: src/slic3r/GUI/DoubleSlider.cpp:1917 +msgid "" +"Select YES if you want to delete all saved tool changes, \n" +"NO if you want all tool changes switch to color changes, \n" +"or CANCEL to leave it unchanged." +msgstr "" +"Vyberte ANO, pokud chcete odstranit všechny uložené změny nástroje,\n" +"NE, pokud chcete, aby se všechny změny nástroje přepnout na změny barev,\n" +"nebo ZRUŠIT pro ponechání beze změny." + #: src/slic3r/GUI/Selection.cpp:146 msgid "Selection-Add" msgstr "Výběř - Přidání" @@ -7569,7 +7627,7 @@ msgstr "Textura" #: src/slic3r/GUI/ConfigManipulation.cpp:208 msgid "The %1% infill pattern is not supposed to work at 100%% density." -msgstr "Vzor výplně %1% není určen pro 100 %% hustotu výplně." +msgstr "Vzor výplně %1% není určen pro 100%% hustotu výplně." #: src/slic3r/GUI/FirmwareDialog.cpp:548 #, c-format @@ -7737,6 +7795,14 @@ msgstr "Vybraný objekt nemůže být rozdělen, protože obsahuje více než je msgid "The selected object couldn't be split because it contains only one part." msgstr "Vybraný objekt nemůže být rozdělen, protože obsahuje pouze jednu část." +#: src/slic3r/GUI/MainFrame.cpp:432 +msgid "" +"The selected project is no longer available.\n" +"Do you want to remove it from the recent projects list ?" +msgstr "" +"Vybraný projekt již není k dispozici.\n" +"Chcete ho odstranit ze seznamu posledních projektů?" + #: src/slic3r/GUI/MainFrame.cpp:422 msgid "The selected project is no more available" msgstr "Vybraný projekt již není dostupný" @@ -8087,6 +8153,10 @@ msgstr "Nejmenší tisknutelná výška vrstvy pro tento extruder. Omezuje rozli msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed." msgstr "To je obvykle způsobeno zanedbatelně malým množstvím extrudovaného materiálu nebo chybným modelem. Zkuste model opravit nebo změnit jeho orientaci na podložce." +#: src/libslic3r/GCode.cpp:639 +msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed." +msgstr "To je obvykle způsobeno zanedbatelně malým množstvím extrudovaného materiálu nebo chybným modelem. Zkuste model opravit nebo změnit jeho orientaci na podložce." + #: src/libslic3r/PrintConfig.cpp:2215 msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools." msgstr "Tato matice popisuje objemy (v kubických milimetrech) nutné k vyčištění nového filamentu na čistící věži pro danou dvojici nástrojů." @@ -8228,6 +8298,10 @@ msgstr "Na objekty" msgid "To parts" msgstr "Na části" +#: src/slic3r/GUI/Tab.cpp:1756 +msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain." +msgstr "Chcete-li použít vlastní soubor CA, importujte soubor CA do Certificate Store / Keychain." + #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 #, c-format msgid "Toggle %c axis mirroring" diff --git a/resources/localization/de/PrusaSlicer.mo b/resources/localization/de/PrusaSlicer.mo index fe2a2a42d59659c841c5589ee7dacea723f62de4..67e23b0130939b27409dd861c37b6edec9c153f9 100644 GIT binary patch delta 45960 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

!220 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 delta 45168 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 diff --git a/resources/localization/de/PrusaSlicer_de.po b/resources/localization/de/PrusaSlicer_de.po index e404fed5c0..f1ddeeab0b 100644 --- a/resources/localization/de/PrusaSlicer_de.po +++ b/resources/localization/de/PrusaSlicer_de.po @@ -5,7 +5,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.2.1\n" +"X-Generator: Poedit 2.3\n" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" @@ -1557,6 +1557,10 @@ msgstr "Kubisch" msgid "Current mode is %s" msgstr "Aktueller Modus ist %s" +#: src/slic3r/GUI/Tab.cpp:959 +msgid "Current preset is inherited from" +msgstr "Aktuelle Voreinstellung ist abgeleitet von" + #: src/slic3r/GUI/Tab.cpp:957 msgid "Current preset is inherited from the default preset." msgstr "Aktuelle Voreinstellung ist abgeleitet von der Standardvoreinstellung." @@ -2952,6 +2956,15 @@ msgstr "" "Beim linken Knopf: zeigt eine Nicht-System- (oder Nicht-Standard-) Einstellung an.\n" "Beim rechten Knopf: zeigt an, dass die Einstellung nicht geändert wurde." +#. TRN Description for "WHITE BULLET" +#: src/slic3r/GUI/Tab.cpp:3267 +msgid "" +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." +msgstr "" +"Beim linken Knopf: zeigt eine Nicht-System- (oder Nicht-Standard-) Einstellung an.\n" +"Beim rechten Knopf: zeigt an, dass die Einstellung nicht geändert wurde." + #: src/slic3r/GUI/ConfigManipulation.cpp:136 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers\n" @@ -3582,7 +3595,7 @@ msgid "" "indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n" "Click the BACK ARROW icon to reset all settings for the current option group to the last saved preset." msgstr "" -"zeigt an, dass die Einstellungen geändert wurden und nicht mit dem zuletzt gespeicherten Preset für die aktuelle Optionsgruppe übereinstimmen. \n" +"zeigt an, dass die Einstellungen geändert wurden und nicht mit dem zuletzt gespeicherten Preset für die aktuelle Optionsgruppe übereinstimmen.\n" "Klicken Sie auf das Symbol PFEIL ZURÜCK, um alle Einstellungen für die aktuelle Optionsgruppe auf das zuletzt gespeicherte Preset zurückzusetzen." #: src/slic3r/GUI/ConfigManipulation.cpp:211 @@ -4112,6 +4125,10 @@ msgstr "Max" msgid "Max bridge length" msgstr "Max Überbrückungslänge" +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Max bridges on a pillar" +msgstr "Max Brücken auf einem Pfeiler" + #: src/libslic3r/PrintConfig.cpp:2822 msgid "Max merge distance" msgstr "Maximaler Zusammenfügeabstand" @@ -4280,6 +4297,10 @@ msgstr "Maximaler Ruck Y" msgid "Maximum jerk Z" msgstr "Maximaler Ruck Z" +#: src/libslic3r/PrintConfig.cpp:2660 +msgid "Maximum number of bridges that can be placed on a pillar. Bridges hold support point pinheads and connect to pillars as small branches." +msgstr "Maximale Anzahl von Brücken, die auf einen Pfeiler gesetzt werden können. Brücken halten Stützpunkt-Nadelköpfe und verbinden sich als kleine Äste mit den Pfeilern." + #: src/libslic3r/PrintConfig.cpp:598 msgid "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit." msgstr "Maximale volumetrische Geschwindigkeit, die für dieses Filament zulässig ist. Begrenzt die maximale volumetrische Geschwindigkeit eines Drucks auf das Minimum von Druck- und Filament-Volumengeschwindigkeit. Wird auf null gesetzt, wenn es keine Begrenzung gibt." @@ -4951,6 +4972,11 @@ msgstr "des aktuellen Objekts" msgid "Offset" msgstr "Offset" +#: src/slic3r/GUI/Tab.cpp:1755 +#, c-format +msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain." +msgstr "Auf diesem System verwendet %s HTTPS-Zertifikate aus dem System Zertifikatsspeicher oder Schlüsselbund." + #: src/slic3r/GUI/DoubleSlider.cpp:950 msgid "One layer mode" msgstr "Eine Schicht Modus" @@ -6421,6 +6447,16 @@ msgstr "" "NEIN, wenn Sie möchten, dass alle Werkzeugänderungen auf Farbwechsel umgestellt werden, \n" "oder ABBRECHEN, um sie unverändert zu lassen." +#: src/slic3r/GUI/DoubleSlider.cpp:1917 +msgid "" +"Select YES if you want to delete all saved tool changes, \n" +"NO if you want all tool changes switch to color changes, \n" +"or CANCEL to leave it unchanged." +msgstr "" +"Wählen Sie JA, wenn Sie alle gespeicherten Werkzeugänderungen löschen möchten, \n" +"NEIN, wenn Sie möchten, dass alle Werkzeugänderungen auf Farbwechsel umgestellt werden, \n" +"oder ABBRECHEN, um sie unverändert zu lassen." + #: src/slic3r/GUI/Selection.cpp:146 msgid "Selection-Add" msgstr "Auswahl hinzufügen" @@ -7733,6 +7769,14 @@ msgstr "Das ausgewählte Objekt konnte nicht getrennt werden, weil es aus mehr a msgid "The selected object couldn't be split because it contains only one part." msgstr "Das ausgewählte Objekt konnte nicht getrennt werden, da es nur aus einem Teil besteht." +#: src/slic3r/GUI/MainFrame.cpp:432 +msgid "" +"The selected project is no longer available.\n" +"Do you want to remove it from the recent projects list ?" +msgstr "" +"Das ausgewählte Projekt ist nicht mehr verfügbar.\n" +"Wollen Sie es aus der Liste der letzten Projekte entfernen ?" + #: src/slic3r/GUI/MainFrame.cpp:422 msgid "The selected project is no more available" msgstr "Das ausgewählte Projekt ist nicht mehr verfügbar" @@ -8077,6 +8121,10 @@ msgstr "Dies ist die niedrigste druckbare Schichthöhe für diesen Extruder und msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed." msgstr "Dies wird in der Regel durch vernachlässigbar kleine Extrusionen oder durch ein fehlerhaftes Modell verursacht. Versuchen Sie, das Modell zu reparieren oder seine Ausrichtung auf dem Druckbett zu ändern." +#: src/libslic3r/GCode.cpp:639 +msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed." +msgstr "Dies wird in der Regel durch vernachlässigbar kleine Extrusionen oder durch ein fehlerhaftes Modell verursacht. Versuchen Sie, das Modell zu reparieren oder seine Ausrichtung auf dem Druckbett zu ändern." + #: src/libslic3r/PrintConfig.cpp:2215 msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools." msgstr "Diese Matrix beschreibt die Volumina (in Kubikmillimetern), die benötigt werden, um das neue Filament auf dem Reinigungsturm für ein bestimmtes Werkzeugpaar zu reinigen." @@ -8218,6 +8266,10 @@ msgstr "Zu Objekten" msgid "To parts" msgstr "Zu Teilen" +#: src/slic3r/GUI/Tab.cpp:1756 +msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain." +msgstr "Um eine benutzerdefinierte CA-Datei zu verwenden, importieren Sie bitte Ihre CA-Datei in den Zertifikatsspeicher / Schlüsselbund." + #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 #, c-format msgid "Toggle %c axis mirroring" diff --git a/resources/localization/es/PrusaSlicer.mo b/resources/localization/es/PrusaSlicer.mo index 6f8e14beada2306b3ed3222dd698604519786e97..b6ac06005a655e2a39e19875d5b673c2016f75eb 100644 GIT binary patch delta 46501 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
{zRr+22?%uP>4}BWkLxibZo;*A8#(Np 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
LjH#>z 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 diff --git a/resources/localization/es/PrusaSlicer_es.po b/resources/localization/es/PrusaSlicer_es.po index 367d779c02..a82b4905f4 100644 --- a/resources/localization/es/PrusaSlicer_es.po +++ b/resources/localization/es/PrusaSlicer_es.po @@ -5,12 +5,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.8.7.1\n" -"Project-Id-Version: \n" -"POT-Creation-Date: \n" -"PO-Revision-Date: \n" -"Last-Translator: \n" -"Language-Team: \n" +"X-Generator: PhraseApp (phraseapp.com)\n" #: src/slic3r/GUI/MainFrame.cpp:66 msgid " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/releases" @@ -28,7 +23,7 @@ msgid "%" msgstr "%" #: src/slic3r/GUI/GLCanvas3D.cpp:963 -#, c-format +#, possible-c-format msgid "%.2f - %.2f mm" msgstr "%.2f - %.2f mm" @@ -46,125 +41,97 @@ msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "%1%=%2% mm es demasiado bajo para ser impreso a una altura de capa de %3% mm" #: src/slic3r/GUI/PresetHints.cpp:229 -#, c-format +#, possible-c-format msgid "%3.2f mm³/s at filament speed %3.2f mm/s." msgstr "%3.2f mm³/s a una velocidad de filamento de %3.2f mm/s." #: src/slic3r/GUI/Plater.cpp:1152 -#, c-format +#, possible-c-format msgid "%d (%d shells)" msgstr "%d (%d pieles)" #: src/slic3r/GUI/Plater.cpp:1160 -#, c-format +#, possible-c-format msgid "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d facets reversed, %d backwards edges" msgstr "%d facetas problemáticas, %d aristas corregidas, %d facetas eliminadas, %d facetas añadidas, %d facetas invertidas, %d aristas del revés" #: src/slic3r/GUI/PresetHints.cpp:270 -#, c-format +#, possible-c-format msgid "%d lines: %.2f mm" msgstr "%d líneas: %.2f mm" #: src/slic3r/GUI/MainFrame.cpp:1027 -#, c-format +#, possible-c-format msgid "%d presets successfully imported." msgstr "%d ajustes iniciales importados con éxito." #: src/slic3r/GUI/MainFrame.cpp:692 -#, c-format +#, possible-c-format msgid "%s &Website" msgstr "%s Sitio &Web" #: src/slic3r/GUI/UpdateDialogs.cpp:211 -#, c-format +#, possible-c-format msgid "%s configuration is incompatible" msgstr "%s la configuración es incompatible" #: src/slic3r/GUI/Field.cpp:175 -#, c-format +#, possible-c-format msgid "%s doesn't support percentage" msgstr "%s no permite porcentajes" #: src/slic3r/GUI/MsgDialog.cpp:73 -#, c-format +#, possible-c-format msgid "%s error" msgstr "%s error" #: src/slic3r/GUI/ConfigWizard.cpp:481 -#, c-format +#, possible-c-format msgid "%s Family" msgstr "%s Familia" #: src/slic3r/GUI/MsgDialog.cpp:74 -#, c-format +#, possible-c-format msgid "%s has encountered an error" msgstr "%s ha ocurrido un error" #: src/slic3r/GUI/GUI_App.cpp:138 -#, c-format -msgid "" -"%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it.\n" -"\n" -"The application will now terminate." -msgstr "" -"%s ha encontrado un error. Probablemente fue causado por quedarse sin memoria. Si estás seguro de tener suficiente RAM en su sistema, esto también puede ser un error y nos complacería que lo informaras.\n" -"\n" -"La aplicación se cerrará." +#, possible-c-format +msgid "%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it.\n\nThe application will now terminate." +msgstr "%s ha encontrado un error. Probablemente fue causado por quedarse sin memoria. Si estás seguro de tener suficiente RAM en su sistema, esto también puede ser un error y nos complacería que lo informaras.\n\nLa aplicación se cerrará." #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:222 -#, c-format +#, possible-c-format msgid "%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it." msgstr "%s ha encontrado un error. Probablemente fue causado por quedarse sin memoria. Si estás seguro de tener suficiente RAM en su sistema, esto también puede ser un error y nos complacería que lo informaras." #: src/slic3r/GUI/UpdateDialogs.cpp:308 -#, c-format +#, possible-c-format msgid "%s has no configuration updates available." msgstr "%s no tiene actualizaciones de configuración disponibles." #: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210 -#, c-format +#, possible-c-format msgid "%s incompatibility" msgstr "%s incompatibilidad" #: src/slic3r/GUI/UpdateDialogs.cpp:270 -#, c-format -msgid "" -"%s now uses an updated configuration structure.\n" -"\n" -"So called 'System presets' have been introduced, which hold the built-in default settings for various printers. These System presets cannot be modified, instead, users now may create their own presets inheriting settings from one of the System presets.\n" -"An inheriting preset may either inherit a particular value from its parent or override it with a customized value.\n" -"\n" -"Please proceed with the %s that follows to set up the new presets and to choose whether to enable automatic preset updates." -msgstr "" -"Ahora %s usa una estructura actualizada para la configuración. \n" -"\n" -"Se han introducido los llamados 'Ajustes del sistema' , que tienen valores por defecto para varias impresoras. Estos ajustes del sistema no pueden modificarse, por el contrario, los usuarios pueden crear nuevos ajustes que se basan en alguno de ellos.\n" -"Un ajuste nuevo puede heredar un valor de un ajuste existente o bien tener un nuevo valor personalizado.\n" -"\n" -"Por favof, continúa con el %s que sigue para establecer los nuevos ajustes y seleccionar si quieres que estos se actualicen automáticamente." +#, possible-c-format +msgid "%s now uses an updated configuration structure.\n\nSo called 'System presets' have been introduced, which hold the built-in default settings for various printers. These System presets cannot be modified, instead, users now may create their own presets inheriting settings from one of the System presets.\nAn inheriting preset may either inherit a particular value from its parent or override it with a customized value.\n\nPlease proceed with the %s that follows to set up the new presets and to choose whether to enable automatic preset updates." +msgstr "Ahora %s usa una estructura actualizada para la configuración. \n\nSe han introducido los llamados 'Ajustes del sistema' , que tienen valores por defecto para varias impresoras. Estos ajustes del sistema no pueden modificarse, por el contrario, los usuarios pueden crear nuevos ajustes que se basan en alguno de ellos.\nUn ajuste nuevo puede heredar un valor de un ajuste existente o bien tener un nuevo valor personalizado.\n\nPor favof, continúa con el %s que sigue para establecer los nuevos ajustes y seleccionar si quieres que estos se actualicen automáticamente." #: src/slic3r/GUI/GUI_App.cpp:820 -#, c-format +#, possible-c-format msgid "%s View Mode" msgstr "%s Tipo de vista" #: src/slic3r/GUI/UpdateDialogs.cpp:151 -#, c-format -msgid "" -"%s will now start updates. Otherwise it won't be able to start.\n" -"\n" -"Note that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n" -"\n" -"Updated configuration bundles:" -msgstr "" -"%s comenzará las actualizaciones. De otro modo no podrá comenzar.\n" -"\n" -"Ten en cuenta que primero se creará una copia de seguridad. Puedes volver a ella si en algún momento hay problemas con la nueva versión.\n" -"\n" -"Configuraciones actualizadas:" +#, possible-c-format +msgid "%s will now start updates. Otherwise it won't be able to start.\n\nNote that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n\nUpdated configuration bundles:" +msgstr "%s comenzará las actualizaciones. De otro modo no podrá comenzar.\n\nTen en cuenta que primero se creará una copia de seguridad. Puedes volver a ella si en algún momento hay problemas con la nueva versión.\n\nConfiguraciones actualizadas:" #: src/slic3r/GUI/MainFrame.cpp:705 -#, c-format +#, possible-c-format msgid "&About %s" msgstr "&Acerca de %s" @@ -321,7 +288,7 @@ msgid "3Dconnexion settings" msgstr "Ajustes 3Dconnexion" #: src/slic3r/GUI/Plater.cpp:5038 -#, c-format +#, possible-c-format msgid "3MF file exported to %s" msgstr "Archivo 3MF exportado a %s" @@ -350,12 +317,12 @@ msgid "A toolpath outside the print area was detected" msgstr "Se detectó una trayectoria fuera del área de impresión" #: src/slic3r/GUI/AboutDialog.cpp:199 -#, c-format +#, possible-c-format msgid "About %s" msgstr "Acerca de %s" #: src/slic3r/GUI/GLCanvas3D.cpp:959 -#, c-format +#, possible-c-format msgid "above %.2f mm" msgstr "sobre %.2f mm" @@ -666,17 +633,13 @@ msgid "Alternate nozzles:" msgstr "Alternar nozzles:" #: src/slic3r/GUI/Plater.cpp:5002 -#, c-format +#, possible-c-format msgid "AMF file exported to %s" msgstr "Archivo AMF exportado a %s" #: src/slic3r/GUI/GLCanvas3D.cpp:690 -msgid "" -"An object outside the print area was detected\n" -"Resolve the current problem to continue slicing" -msgstr "" -"Se ha detectado una pieza fuera del área de impresión\n" -"Soluciona el problema actual para continuar el laminado" +msgid "An object outside the print area was detected\nResolve the current problem to continue slicing" +msgstr "Se ha detectado una pieza fuera del área de impresión\nSoluciona el problema actual para continuar el laminado" #: src/slic3r/GUI/GLCanvas3D.cpp:685 msgid "An object outside the print area was detected" @@ -730,12 +693,8 @@ msgid "Are you sure you want to %1% the selected preset?" msgstr "¿Estás seguro de que deseas %1% el preset seleccionado?" #: src/slic3r/GUI/FirmwareDialog.cpp:902 -msgid "" -"Are you sure you want to cancel firmware flashing?\n" -"This could leave your printer in an unusable state!" -msgstr "" -"¿Estas seguro de cancelar el flaseo del firmware?\n" -"¡Esto podría dejar tu impresora en un estado inusable!" +msgid "Are you sure you want to cancel firmware flashing?\nThis could leave your printer in an unusable state!" +msgstr "¿Estas seguro de cancelar el flaseo del firmware?\n¡Esto podría dejar tu impresora en un estado inusable!" #: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924 msgid "Are you sure you want to continue?" @@ -823,12 +782,12 @@ msgid "Auto-generate points" msgstr "Auto-generar puntos" #: src/slic3r/GUI/Plater.cpp:1157 -#, c-format +#, possible-c-format msgid "Auto-repaired (%d errors)" msgstr "Reparados automáticamente (%d errores)" #: src/slic3r/GUI/GUI_ObjectList.cpp:339 -#, c-format +#, possible-c-format msgid "Auto-repaired (%d errors):" msgstr "Reparado automáticamente (%d errores):" @@ -869,20 +828,12 @@ msgid "BACK ARROW" msgstr "FLECHA HACIA ATRÁS" #: src/slic3r/GUI/Tab.cpp:3290 -msgid "" -"BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n" -"Click to reset all settings for the current option group to the last saved preset." -msgstr "" -"El símbolo de FLECHA ATRÁS indica que los ajustes cambiaron y que no son iguales a los que se guardaron para el grupo de opciones actual.\n" -"Haz clic para devolver esos valores a los últimos guardados." +msgid "BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\nClick to reset all settings for the current option group to the last saved preset." +msgstr "El símbolo de FLECHA ATRÁS indica que los ajustes cambiaron y que no son iguales a los que se guardaron para el grupo de opciones actual.\nHaz clic para devolver esos valores a los últimos guardados." #: src/slic3r/GUI/Tab.cpp:3304 -msgid "" -"BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\n" -"Click to reset current value to the last saved preset." -msgstr "" -"La FLECHA ATRÁS indica que el valor ha cambiado y ya no es el mismo que el guardado la última vez.\n" -"Haz clic para restaurar el valor al último ajuste guardado." +msgid "BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\nClick to reset current value to the last saved preset." +msgstr "La FLECHA ATRÁS indica que el valor ha cambiado y ya no es el mismo que el guardado la última vez.\nHaz clic para restaurar el valor al último ajuste guardado." #: src/slic3r/GUI/Preferences.cpp:55 msgid "Background processing" @@ -1145,7 +1096,7 @@ msgid "Change Extruders" msgstr "Cambiar Extrusores" #: src/slic3r/GUI/GUI_ObjectSettings.cpp:152 -#, c-format +#, possible-c-format msgid "Change Option %s" msgstr "Cambiar opción %s" @@ -1266,7 +1217,7 @@ msgid "Color change (\"%1%\") for Extruder %2%" msgstr "Cambio de color (\"%1%\") para el Extrusor %2%" #: src/slic3r/GUI/GLCanvas3D.cpp:995 -#, c-format +#, possible-c-format msgid "Color change for Extruder %d at %.2f mm" msgstr "Cambio de color para Extrusor %d en %.2f mm" @@ -1557,22 +1508,22 @@ msgid "Cubic" msgstr "Cúbico" #: src/slic3r/GUI/wxExtensions.cpp:704 -#, c-format +#, possible-c-format msgid "Current mode is %s" msgstr "El modo actual es %s" +#: src/slic3r/GUI/Tab.cpp:959 +msgid "Current preset is inherited from" +msgstr "El preajuste fue heredado de" + #: src/slic3r/GUI/Tab.cpp:957 msgid "Current preset is inherited from the default preset." msgstr "El preajuste fue heredado del preajuste predeterminado." #: src/slic3r/GUI/Tab.cpp:960 -#, c-format -msgid "" -"Current preset is inherited from:\n" -"\t%s" -msgstr "" -"El preajuste fue heredado de:\n" -"%s" +#, possible-c-format +msgid "Current preset is inherited from:\n\t%s" +msgstr "El preajuste fue heredado de:\n%s" #: src/slic3r/GUI/UpdateDialogs.cpp:43 msgid "Current version:" @@ -1681,7 +1632,7 @@ msgid "Default filament profile associated with the current printer profile. On msgstr "Perfil de filamento por defecto asociado con el perfil de impresora actual. Al seleccionar el perfil de impresora actual se activará este perfil de filamento." #: src/slic3r/GUI/Tab.cpp:2919 -#, c-format +#, possible-c-format msgid "Default preset (%s)" msgstr "Ajustes por defecto (%s)" @@ -1786,7 +1737,7 @@ msgid "Delete Object" msgstr "Eliminar Objeto" #: src/slic3r/GUI/GUI_ObjectSettings.cpp:101 -#, c-format +#, possible-c-format msgid "Delete Option %s" msgstr "Eliminar Opción %s" @@ -2011,15 +1962,9 @@ msgid "Do not rearrange the given models before merging and keep their original msgstr "No reorganizar los modelos dados antes de fusionar y mantener sus coordenadas XY originales." #: src/slic3r/GUI/Field.cpp:240 -#, c-format -msgid "" -"Do you mean %s%% instead of %s %s?\n" -"Select YES if you want to change this value to %s%%, \n" -"or NO if you are sure that %s %s is a correct value." -msgstr "" -"¿Quieres decir %s%% en vez de %s %s?\n" -"Escoge SI si deseas cambiar este valor a %s%%,\n" -"o NO si estás seguro que %s %s es el valor correcto." +#, possible-c-format +msgid "Do you mean %s%% instead of %s %s?\nSelect YES if you want to change this value to %s%%, \nor NO if you are sure that %s %s is a correct value." +msgstr "¿Quieres decir %s%% en vez de %s %s?\nEscoge SI si deseas cambiar este valor a %s%%,\no NO si estás seguro que %s %s es el valor correcto." #: src/slic3r/GUI/ConfigWizard.cpp:1761 msgid "Do you want to automatic select default filaments?" @@ -2136,6 +2081,18 @@ msgstr "Editar marca de verificación - Clic derecho" msgid "Editing" msgstr "Edición" +#: src/slic3r/GUI/MainFrame.cpp:547 +msgid "Ejec&t SD card / Flash drive" +msgstr "Expul&sa tarjeta SD / disco USB" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Eject SD card / Flash drive" +msgstr "Expulsa la tarjeta SD / disco USB" + +#: src/slic3r/GUI/MainFrame.cpp:547 +msgid "Eject SD card / Flash drive after the G-code was exported to it." +msgstr "Expulsa la tarjeta SD / disco USB después de que se haya exportado a él." + #: src/libslic3r/PrintConfig.cpp:118 msgid "Elephant foot compensation" msgstr "Compensación del pie de elefante" @@ -2273,7 +2230,7 @@ msgid "Error" msgstr "Error" #: src/slic3r/GUI/FirmwareDialog.cpp:645 -#, c-format +#, possible-c-format msgid "Error accessing port at %s: %s" msgstr "Error al acceder al puerto en %s: %s" @@ -2282,12 +2239,12 @@ msgid "Error during reload" msgstr "Error al recargar" #: src/slic3r/GUI/Plater.cpp:5043 -#, c-format +#, possible-c-format msgid "Error exporting 3MF file %s" msgstr "Error al exportar archivo 3MF %s" #: src/slic3r/GUI/Plater.cpp:5005 -#, c-format +#, possible-c-format msgid "Error exporting AMF file %s" msgstr "Error exportando archivo AMF %s" @@ -2316,7 +2273,7 @@ msgid "Error! Invalid model" msgstr "Error! Modelo inválido" #: src/slic3r/GUI/FirmwareDialog.cpp:647 -#, c-format +#, possible-c-format msgid "Error: %s" msgstr "Error: %s" @@ -2346,7 +2303,7 @@ msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "%1%=%2% mm excesivos para ser imprimible con un nozzle de diámetro de %3% mm" #: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 -#, c-format +#, possible-c-format msgid "Exit %s" msgstr "Salir %s" @@ -2426,6 +2383,10 @@ msgstr "Exportar plataforma actual como AMF" msgid "Export current plate as G-code" msgstr "Exportar plataforma actual como código G" +#: src/slic3r/GUI/MainFrame.cpp:521 +msgid "Export current plate as G-code to SD card / Flash drive" +msgstr "Exporta a G-code en la tarjeta SD / disco USB" + #: src/slic3r/GUI/MainFrame.cpp:486 msgid "Export current plate as STL" msgstr "Exportar plataforma actual como STL" @@ -2447,6 +2408,10 @@ msgstr "Exportar nombres de ruta completos de las fuentes de los modelos y de pi msgid "Export G-code" msgstr "Exportar código G" +#: src/slic3r/GUI/MainFrame.cpp:521 +msgid "Export G-code to SD card / Flash drive" +msgstr "Exporta G-code a la tarjeta SD / disco USB" + #: src/libslic3r/PrintConfig.cpp:3320 msgid "Export OBJ" msgstr "Exportar OBJ" @@ -2576,7 +2541,7 @@ msgstr "Extrusor" #: src/slic3r/GUI/DoubleSlider.cpp:1134 src/slic3r/GUI/DoubleSlider.cpp:1170 #: src/slic3r/GUI/GLCanvas3D.cpp:977 src/slic3r/GUI/GUI_ObjectList.cpp:1704 #: src/slic3r/GUI/Tab.cpp:2320 src/libslic3r/GCode/PreviewData.cpp:445 -#, c-format +#, possible-c-format msgid "Extruder %d" msgstr "Extrusor %d" @@ -2949,20 +2914,17 @@ msgstr "Sólo para modificadores de soportes" #. TRN Description for "WHITE BULLET" #: src/slic3r/GUI/Tab.cpp:3265 -msgid "" -"for the left button: \tindicates a non-system (or non-default) preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." -msgstr "" -"para el botón izquierdo: indica un preajuste que no es del sistema (o no predeterminado),\n" -"para el botón derecho: indica que la configuración no se ha modificado." +msgid "for the left button: \tindicates a non-system (or non-default) preset,\nfor the right button: \tindicates that the settings hasn't been modified." +msgstr "para el botón izquierdo: indica un preajuste que no es del sistema (o no predeterminado),\npara el botón derecho: indica que la configuración no se ha modificado." + +#. TRN Description for "WHITE BULLET" +#: src/slic3r/GUI/Tab.cpp:3267 +msgid "for the left button: indicates a non-system (or non-default) preset,\nfor the right button: indicates that the settings hasn't been modified." +msgstr "para el botón izquierdo: indica un preajuste que no es del sistema (o no predeterminado),\npara el botón derecho: indica que la configuración no se ha modificado." #: src/slic3r/GUI/ConfigManipulation.cpp:136 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers." -msgstr "" -"Para que la Torre de Limpieza funcione con los soportes solubles, las capas de soporte\n" -"deben sincronizarse con las capas de objetos." +msgid "For the Wipe Tower to work with the soluble supports, the support layers\nneed to be synchronized with the object layers." +msgstr "Para que la Torre de Limpieza funcione con los soportes solubles, las capas de soporte\ndeben sincronizarse con las capas de objetos." #: src/libslic3r/Print.cpp:1396 msgid "For the Wipe Tower to work with the soluble supports, the support layers need to be synchronized with the object layers." @@ -3005,12 +2967,8 @@ msgid "G-code" msgstr "Código G" #: src/slic3r/GUI/DoubleSlider.cpp:1021 -msgid "" -"G-code associated to this tick mark is in a conflict with print mode.\n" -"Editing it will cause changes of Slider data." -msgstr "" -"El código G asociado a esta marca de verificación está en conflicto con el modo de impresión.\n" -"Su edición provocará cambios en los datos del Slider." +msgid "G-code associated to this tick mark is in a conflict with print mode.\nEditing it will cause changes of Slider data." +msgstr "El código G asociado a esta marca de verificación está en conflicto con el modo de impresión.\nSu edición provocará cambios en los datos del Slider." #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:130 msgid "G-code file exported to %1%" @@ -3213,7 +3171,7 @@ msgid "Heights at which a filament change is to occur." msgstr "Alturas en las que se producirá un cambio de filamento." #: src/slic3r/GUI/ConfigWizard.cpp:433 -#, c-format +#, possible-c-format msgid "Hello, welcome to %s! This %s helps you with the initial configuration; just a few settings and you will be ready to print." msgstr "Hola, bienvenido a %s! Este %s te ayuda con la configuración inicial; sólo unos pocos ajustes y estarás preparado para imprimir." @@ -3335,9 +3293,7 @@ msgid "Hostname, IP or URL" msgstr "Nombre de equipo, IP o URL" #: src/slic3r/GUI/Tab.cpp:139 -msgid "" -"Hover the cursor over buttons to find more information \n" -"or click this button." +msgid "Hover the cursor over buttons to find more information \nor click this button." msgstr "Sitúa el cursos sobre los botones para más información o haz clic en este botón." #: src/libslic3r/PrintConfig.cpp:2812 @@ -3365,15 +3321,9 @@ msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self msgstr "El archivo HTTPS CA es opcional. Sólo se necesita si vas a usar HTTPS con un certificado auto-firmado." #: src/slic3r/GUI/Tab.cpp:1757 -#, c-format -msgid "" -"HTTPS CA File:\n" -" \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n" -" \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain." -msgstr "" -"Archivo CA HTTPS:\n" -"En este sistema,%s usa certificados HTTPS del almacén de certificados o llavero. \n" -"Para usar un archivo CA personalizado, importa tu archivo CA al Almacén de Certificados/Llavero." +#, possible-c-format +msgid "HTTPS CA File:\n \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain." +msgstr "Archivo CA HTTPS:\nEn este sistema,%s usa certificados HTTPS del almacén de certificados o llavero. \nPara usar un archivo CA personalizado, importa tu archivo CA al Almacén de Certificados/Llavero." #: src/slic3r/GUI/Preferences.cpp:222 msgid "Icon size in a respect to the default size" @@ -3388,12 +3338,12 @@ msgid "If checked, supports will be generated automatically based on the overhan msgstr "Si se marca, los soportes se generarán automáticamente según el valor del umbral de voladizo. Si no se selecciona, los apoyos se generarán solo dentro de los volúmenes \"Forzar soportes\"." #: src/slic3r/GUI/ConfigWizard.cpp:773 -#, c-format +#, possible-c-format msgid "If enabled, %s checks for new application versions online. When a new version becomes available, a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done." msgstr "Si está activado, %s comprueba si hay nuevas versiones de Slic3r PE en la red. Cuando hay disponible una nueva versión se muestra una notificación al iniciar la aplicación (nunca durante el uso del programa). Esto es sólo un mecanismo de notificación, sin que se realice una instalación automática." #: src/slic3r/GUI/ConfigWizard.cpp:783 -#, c-format +#, possible-c-format msgid "If enabled, %s downloads updates of built-in system presets in the background.These updates are downloaded into a separate temporary location.When a new preset version becomes available it is offered at application startup." msgstr "Si está activado, %s descargará actualizaciones de los ajustes del sistema mientras lo usamos. Estas actualizaciones se descargan a una ubicación temporal. Cuando hay un nuevo ajuste disponible, este se podrá incorporar y usar cuando la aplicación se vuelva a iniciar." @@ -3402,12 +3352,8 @@ msgid "If enabled, all printing extruders will be primed at the front edge of th msgstr "Si está habilitado, todos los extrusores de impresión estarán cebados en el borde frontal de la cama de impresión al comienzo de la impresión." #: src/slic3r/GUI/ConfigWizard.cpp:805 -msgid "" -"If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\n" -"If not enabled, the Reload from disk command will ask to select each file using an open file dialog." -msgstr "" -"Si está activado, permite que la orden de Recarga desde el disco encuentre y cargue los archivos al invocarla. \n" -"Si no está activado, la orden de Recarga desde el disco te pedirá que selecciones cada archivo en un cuadro de abrir archivo." +msgid "If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\nIf not enabled, the Reload from disk command will ask to select each file using an open file dialog." +msgstr "Si está activado, permite que la orden de Recarga desde el disco encuentre y cargue los archivos al invocarla. \nSi no está activado, la orden de Recarga desde el disco te pedirá que selecciones cada archivo en un cuadro de abrir archivo." #: src/slic3r/GUI/Preferences.cpp:74 msgid "If enabled, allows the Reload from disk command to automatically find and load the files when invoked." @@ -3542,7 +3488,7 @@ msgid "Import STL/OBJ/AMF/3MF without config, keep plater" msgstr "Importar STL/OBJ/AMF/3MF sin configuración, mantener la base" #: src/slic3r/GUI/GUI_ObjectList.cpp:3422 -#, c-format +#, possible-c-format msgid "In this mode you can select only other %s Items%s" msgstr "En este modo, solo puede seleccionar otros %s Items %s" @@ -3551,7 +3497,7 @@ msgid "Incompatible bundles:" msgstr "Grupos incompatibles:" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 -#, c-format +#, possible-c-format msgid "Incompatible with this %s" msgstr "Incompatible con este %s" @@ -3569,12 +3515,8 @@ msgstr "Indexando pieza vaciada" #. TRN Description for "UNLOCKED LOCK" #: src/slic3r/GUI/Tab.cpp:3258 -msgid "" -"indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n" -"Click the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values." -msgstr "" -"indica que se modificaron algunas configuraciones y no son iguales a los valores del sistema (o predeterminados) para el grupo de opciones actual.\n" -"Haz clic en el icono CANDADO DESBLOQUEADO para restablecer todos los ajustes del grupo de opciones actual a los valores del sistema (o predeterminados)." +msgid "indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\nClick the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values." +msgstr "indica que se modificaron algunas configuraciones y no son iguales a los valores del sistema (o predeterminados) para el grupo de opciones actual.\nHaz clic en el icono CANDADO DESBLOQUEADO para restablecer todos los ajustes del grupo de opciones actual a los valores del sistema (o predeterminados)." #. TRN Description for "LOCKED LOCK" #: src/slic3r/GUI/Tab.cpp:3254 @@ -3583,10 +3525,8 @@ msgstr "indica que los ajustes son los mismos que los valores del sistema (o por #. TRN Description for "BACK ARROW" #: src/slic3r/GUI/Tab.cpp:3270 -msgid "" -"indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n" -"Click the BACK ARROW icon to reset all settings for the current option group to the last saved preset." -msgstr "indica que los ajustes cambiaron y no son iguales que los ajustes grabados la última vez para el grupo de opciones actual. Haz clic en el símbolo de FLECHA ATRÁS para resetear todos los ajustes del grupo de opciones actual a los grabados la vez anterior." +msgid "indicates that the settings were changed and are not equal to the last saved preset for the current option group.\nClick the BACK ARROW icon to reset all settings for the current option group to the last saved preset." +msgstr "indica que los ajustes cambiaron y no son iguales que los ajustes grabados la última vez para el grupo de opciones actual.\nHaz clic en el símbolo de FLECHA ATRÁS para resetear todos los ajustes del grupo de opciones actual a los grabados la vez anterior." #: src/slic3r/GUI/ConfigManipulation.cpp:211 #: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:96 @@ -3653,7 +3593,7 @@ msgstr "Inspeccionar / activar instantáneas de configuración" #: src/slic3r/GUI/ObjectDataViewModel.cpp:60 #: src/slic3r/GUI/ObjectDataViewModel.cpp:216 -#, c-format +#, possible-c-format msgid "Instance %d" msgstr "Instancia %d" @@ -3779,7 +3719,7 @@ msgid "Jump to height" msgstr "Salta a la altura" #: src/slic3r/GUI/DoubleSlider.cpp:955 -#, c-format +#, possible-c-format msgid "Jump to height %s or Set extruder sequence for the entire print" msgstr "Salta a la altura %s o Fija la secuencia del extrusor para toda la impresión" @@ -4115,6 +4055,10 @@ msgstr "Max" msgid "Max bridge length" msgstr "Distancia máxima de puentes" +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Max bridges on a pillar" +msgstr "Puentes maximos en un pilar" + #: src/libslic3r/PrintConfig.cpp:2822 msgid "Max merge distance" msgstr "Distancia máxima de combinación" @@ -4283,6 +4227,10 @@ msgstr "Máximo jerk Y" msgid "Maximum jerk Z" msgstr "Máximo jerk Z" +#: src/libslic3r/PrintConfig.cpp:2660 +msgid "Maximum number of bridges that can be placed on a pillar. Bridges hold support point pinheads and connect to pillars as small branches." +msgstr "Número máximo de puentes que se pueden colocar en un pilar. Los puentes sostienen cabezas de alfiler de puntos de apoyo y se conectan a los pilares como pequeñas ramas." + #: src/libslic3r/PrintConfig.cpp:598 msgid "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit." msgstr "Velocidad volumétrica máxima permitida para este filamento. Limita la velocidad volumétrica máxima de una impresión al mínimo de velocidad volumétrica de impresión y filamento. Establecer en cero para usar sin límite." @@ -4436,7 +4384,7 @@ msgid "Mirror vertically" msgstr "Reflejar verticalmente" #: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68 -#, c-format +#, possible-c-format msgid "Mismatched type of print host: %s" msgstr "Tipo de host de impresión no coincidente: %s" @@ -4674,7 +4622,7 @@ msgid "Multi-part object detected" msgstr "Objeto de piezas múltiples detectado" #: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454 -#, c-format +#, possible-c-format msgid "Multiple %s devices found. Please only connect one at a time for flashing." msgstr "Se encontraron múltiples dispositivos %s. Por favor, conecta solo uno a la vez para flashear." @@ -4683,14 +4631,8 @@ msgid "Multiple Extruders" msgstr "Múltiples Extrusores" #: src/slic3r/GUI/Plater.cpp:2410 -msgid "" -"Multiple objects were loaded for a multi-material printer.\n" -"Instead of considering them as multiple objects, should I consider\n" -"these files to represent a single object having multiple parts?" -msgstr "" -"Se cargaron varios objetos para una impresora de varios materiales.\n" -"En lugar de considerarlos como objetos múltiples, ¿debería considerar\n" -"estos archivos para formar un solo objeto que tiene varias partes?" +msgid "Multiple objects were loaded for a multi-material printer.\nInstead of considering them as multiple objects, should I consider\nthese files to represent a single object having multiple parts?" +msgstr "Se cargaron varios objetos para una impresora de varios materiales.\nEn lugar de considerarlos como objetos múltiples, ¿debería considerar\nestos archivos para formar un solo objeto que tiene varias partes?" #: src/libslic3r/PrintConfig.cpp:3439 msgid "Multiply copies by creating a grid." @@ -4738,7 +4680,7 @@ msgid "New project, clear plater" msgstr "Nuevo proyecto, limpiar plataforma" #: src/slic3r/GUI/UpdateDialogs.cpp:38 -#, c-format +#, possible-c-format msgid "New version of %s is available" msgstr "Nueva versión de %s disponible" @@ -4954,6 +4896,11 @@ msgstr "del Objeto actual" msgid "Offset" msgstr "Desplazamiento" +#: src/slic3r/GUI/Tab.cpp:1755 +#, possible-c-format +msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain." +msgstr "En este sistema,%s usa certificados HTTPS del almacén de certificados o llavero." + #: src/slic3r/GUI/DoubleSlider.cpp:950 msgid "One layer mode" msgstr "Modo de capa única" @@ -5016,7 +4963,7 @@ msgid "Open project STL/OBJ/AMF/3MF with config, clear plater" msgstr "Abrir proyecto STL/OBJ/AMF/3MF con configuración, limpiar plataforma" #: src/slic3r/GUI/MainFrame.cpp:693 -#, c-format +#, possible-c-format msgid "Open the %s website in your browser" msgstr "Abrir el sitio web de %s en su navegador" @@ -5272,7 +5219,7 @@ msgid "Perimeters" msgstr "Perímetros" #: src/slic3r/GUI/ConfigWizard.cpp:860 -#, c-format +#, possible-c-format msgid "Pick another vendor supported by %s" msgstr "Elije otro proveedor compatible con% s" @@ -5366,7 +5313,7 @@ msgid "Preparing infill" msgstr "Preparando relleno" #: src/slic3r/GUI/Tab.cpp:2920 -#, c-format +#, possible-c-format msgid "Preset (%s)" msgstr "Ajuste inicial (%s)" @@ -5392,29 +5339,17 @@ msgid "Press to activate selection rectangle" msgstr "Presionar para activar el rectángulo de selección" #: src/slic3r/GUI/KBShortcutsDialog.cpp:198 -msgid "" -"Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\n" -"selected objects around their own center" -msgstr "" -"Presionar para escalar (en escalar Gizmo) o rotar(en rotar Gizmo)\n" -"objetos seleccionados alrededor de su propio centro" +msgid "Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\nselected objects around their own center" +msgstr "Presionar para escalar (en escalar Gizmo) o rotar(en rotar Gizmo)\nobjetos seleccionados alrededor de su propio centro" #: src/slic3r/GUI/KBShortcutsDialog.cpp:161 -msgid "" -"Press to select multiple objects\n" -"or move multiple objects with mouse" -msgstr "" -"Presiona para seleccionar objetos múltiples\n" -"o mover objetos múltiples con el ratón" +msgid "Press to select multiple objects\nor move multiple objects with mouse" +msgstr "Presiona para seleccionar objetos múltiples\no mover objetos múltiples con el ratón" #: src/slic3r/GUI/KBShortcutsDialog.cpp:195 #, no-c-format -msgid "" -"Press to snap by 5% in Gizmo scale\n" -"or to snap by 1mm in Gizmo move" -msgstr "" -"Presiona para ajustar un 5% en escala Gizmo\n" -"o para ajustar cada 1mm en mover Gizmo" +msgid "Press to snap by 5% in Gizmo scale\nor to snap by 1mm in Gizmo move" +msgstr "Presiona para ajustar un 5% en escala Gizmo\no para ajustar cada 1mm en mover Gizmo" #: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/Plater.cpp:4105 #: src/slic3r/GUI/Tab.cpp:2390 @@ -5541,12 +5476,12 @@ msgstr "Imprimir con múltiples extrusoras de diferentes diámetros de boquilla. #. TRN "Processing input_file_basename" #: src/slic3r/GUI/MainFrame.cpp:849 -#, c-format +#, possible-c-format msgid "Processing %s" msgstr "Procesando %s" #: src/slic3r/GUI/Plater.cpp:2283 -#, c-format +#, possible-c-format msgid "Processing input file %s" msgstr "Procesando el archivo de entrada %s" @@ -5589,27 +5524,17 @@ msgid "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap co msgstr "PrusaSlicer está basado en Slic3r de Alessandro Ranellucci y la comunidad RepRap." #: src/slic3r/GUI/GLCanvas3DManager.cpp:284 -#, c-format -msgid "" -"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" -"while OpenGL version %s, render %s, vendor %s was detected." -msgstr "" -"PrusaSlicer requiere el controlador de gráficos OpenGL 2.0 para que funcione correctamente, \n" -"mientras que la versión %s OpenGL, renderizado %s, vendedor %s fue detectada." +#, possible-c-format +msgid "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \nwhile OpenGL version %s, render %s, vendor %s was detected." +msgstr "PrusaSlicer requiere el controlador de gráficos OpenGL 2.0 para que funcione correctamente, \nmientras que la versión %s OpenGL, renderizado %s, vendedor %s fue detectada." #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50 msgid "PrusaSlicer version" msgstr "Versión PrusaSlicer" #: src/slic3r/GUI/ConfigWizard.cpp:815 -msgid "" -"PrusaSlicer's user interfaces comes in three variants:\n" -"Simple, Advanced, and Expert.\n" -"The Simple mode shows only the most frequently used settings relevant for regular 3D printing. The other two offer progressively more sophisticated fine-tuning, they are suitable for advanced and expert users, respectively." -msgstr "" -"Las interfaces de usuario de PrusaSlicer tiene tres variantes:\n" -"Simple, avanzado y experto.\n" -"El modo Simple muestra solo las configuraciones usadas con más frecuencia relevantes para la impresión 3D normal. Los otros dos ofrecen ajustes progresivamente más sofisticados, son adecuados para usuarios avanzados y expertos, respectivamente." +msgid "PrusaSlicer's user interfaces comes in three variants:\nSimple, Advanced, and Expert.\nThe Simple mode shows only the most frequently used settings relevant for regular 3D printing. The other two offer progressively more sophisticated fine-tuning, they are suitable for advanced and expert users, respectively." +msgstr "Las interfaces de usuario de PrusaSlicer tiene tres variantes:\nSimple, avanzado y experto.\nEl modo Simple muestra solo las configuraciones usadas con más frecuencia relevantes para la impresión 3D normal. Los otros dos ofrecen ajustes progresivamente más sofisticados, son adecuados para usuarios avanzados y expertos, respectivamente." #: src/libslic3r/PrintConfig.cpp:2254 msgid "Purging after toolchange will done inside this object's infills. This lowers the amount of waste but may result in longer print time due to additional travel moves." @@ -5643,7 +5568,7 @@ msgstr "Calidad / Velocidad" #: src/slic3r/GUI/GUI_ObjectList.cpp:1530 #: src/slic3r/GUI/GUI_ObjectList.cpp:1536 #: src/slic3r/GUI/GUI_ObjectList.cpp:1849 -#, c-format +#, possible-c-format msgid "Quick Add Settings (%s)" msgstr "Añadir ajustes rápidos (%s)" @@ -5656,7 +5581,7 @@ msgid "Quick Slice and Save As" msgstr "Laminado rápido y Guardar como" #: src/slic3r/GUI/MainFrame.cpp:540 -#, c-format +#, possible-c-format msgid "Quit %s" msgstr "Cerrar %s" @@ -5677,14 +5602,8 @@ msgid "Ramming customization" msgstr "Configuración de empuje" #: src/slic3r/GUI/WipeTowerDialog.cpp:41 -msgid "" -"Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n" -"\n" -"This is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc." -msgstr "" -"El empuje señala la extrusión rápida justo antes de un cambio de filamento en una impresora MM de un sólo extrusor. Su propósito es asegurar una forma adecuada para el extremo de filamento que se va a descargar, para que no haya problemas al insertar uno nuevo y para que se pueda volver a insertar este más tarde. Esta fase es importante y diferentes materiales puede precisar diferentes velocidades para obtener la forma correcta. Por este motivo, las velocidades extrusión durante el empuje son ajustables.\n" -"\n" -"Este es un ajuste para expertos, ajustarlo incorrectamente podrá producir atascos, que la rueda del extrusor arañe el filamento, etc." +msgid "Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n\nThis is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc." +msgstr "El empuje señala la extrusión rápida justo antes de un cambio de filamento en una impresora MM de un sólo extrusor. Su propósito es asegurar una forma adecuada para el extremo de filamento que se va a descargar, para que no haya problemas al insertar uno nuevo y para que se pueda volver a insertar este más tarde. Esta fase es importante y diferentes materiales puede precisar diferentes velocidades para obtener la forma correcta. Por este motivo, las velocidades extrusión durante el empuje son ajustables.\n\nEste es un ajuste para expertos, ajustarlo incorrectamente podrá producir atascos, que la rueda del extrusor arañe el filamento, etc." #: src/slic3r/GUI/WipeTowerDialog.cpp:91 msgid "Ramming line spacing" @@ -5743,7 +5662,7 @@ msgid "Recent projects" msgstr "Proy&ectos recientes" #: src/slic3r/GUI/PresetHints.cpp:263 -#, c-format +#, possible-c-format msgid "Recommended object thin wall thickness for layer height %.2f and" msgstr "Espesor de pared delgada del objeto recomendado para una altura de capa %.2f y" @@ -5778,7 +5697,7 @@ msgid "Redo" msgstr "Rehacer" #: src/slic3r/GUI/GLCanvas3D.cpp:4065 -#, c-format +#, possible-c-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "Rehacer %1$d Acción" @@ -5970,22 +5889,22 @@ msgid "Report an I&ssue" msgstr "Informar de un &problema" #: src/slic3r/GUI/MainFrame.cpp:703 -#, c-format +#, possible-c-format msgid "Report an issue on %s" msgstr "Reportar un problema a %s" #: src/slic3r/Utils/PresetUpdater.cpp:713 -#, c-format +#, possible-c-format msgid "requires max. %s" msgstr "requiere max. %s" #: src/slic3r/Utils/PresetUpdater.cpp:710 -#, c-format +#, possible-c-format msgid "requires min. %s" msgstr "requiere min. %s" #: src/slic3r/Utils/PresetUpdater.cpp:705 -#, c-format +#, possible-c-format msgid "requires min. %s and max. %s" msgstr "requiere un min. %s y un max. %s" @@ -6152,7 +6071,7 @@ msgid "Rotation angle around the Z axis in degrees." msgstr "Ángulo de rotación alrededor del eje Z en grados." #: src/slic3r/GUI/GUI_App.cpp:797 -#, c-format +#, possible-c-format msgid "Run %s" msgstr "Ejecutar %s" @@ -6181,12 +6100,12 @@ msgstr "E&nviar para imprimir" #. TRN Preset #: src/slic3r/GUI/Tab.cpp:3417 -#, c-format +#, possible-c-format msgid "Save %s as:" msgstr "Guardar %s como:" #: src/slic3r/GUI/MainFrame.cpp:826 -#, c-format +#, possible-c-format msgid "Save %s file as:" msgstr "Guardar archivo %s como:" @@ -6208,7 +6127,7 @@ msgstr "Guarda la configuración al archivo especificado." #. TRN "Save current Settings" #: src/slic3r/GUI/Tab.cpp:133 -#, c-format +#, possible-c-format msgid "Save current %s" msgstr "Guardar lo actual %s" @@ -6279,12 +6198,8 @@ msgid "Scale factors" msgstr "Factores de escala" #: src/slic3r/GUI/KBShortcutsDialog.cpp:196 -msgid "" -"Scale selection to fit print volume\n" -"in Gizmo scale" -msgstr "" -"Redimensiona para ajustar el volumen de impresión\n" -"en escala Gizmo" +msgid "Scale selection to fit print volume\nin Gizmo scale" +msgstr "Redimensiona para ajustar el volumen de impresión\nen escala Gizmo" #: src/slic3r/GUI/GUI_ObjectList.cpp:1724 msgid "Scale the selected object to fit the print volume" @@ -6419,14 +6334,12 @@ msgid "Select what kind of support do you need" msgstr "Selecciona qué clase de soporte necesitas" #: src/slic3r/GUI/DoubleSlider.cpp:1917 -msgid "" -"Select YES if you want to delete all saved tool changes, \n" -"\tNO if you want all tool changes switch to color changes, \n" -"\tor CANCEL to leave it unchanged." -msgstr "" -"Escoge SI si deseas borrar todos los cambios de herramienta,\n" -"NO si deseas que los cambios de herramienta sean cambios de color,\n" -"o CANCELAR para no hacer cambios." +msgid "Select YES if you want to delete all saved tool changes, \n\tNO if you want all tool changes switch to color changes, \n\tor CANCEL to leave it unchanged." +msgstr "Escoge SI si deseas borrar todos los cambios de herramienta,\nNO si deseas que los cambios de herramienta sean cambios de color,\no CANCELAR para no hacer cambios." + +#: src/slic3r/GUI/DoubleSlider.cpp:1917 +msgid "Select YES if you want to delete all saved tool changes, \nNO if you want all tool changes switch to color changes, \nor CANCEL to leave it unchanged." +msgstr "Escoge SI si deseas borrar todos los cambios de herramienta,\nNO si deseas que los cambios de herramienta sean cambios de color,\no CANCELAR para no hacer cambios." #: src/slic3r/GUI/Selection.cpp:146 msgid "Selection-Add" @@ -6567,7 +6480,7 @@ msgid "Set number of instances" msgstr "Establecer número de instancias" #: src/slic3r/GUI/Plater.cpp:4756 -#, c-format +#, possible-c-format msgid "Set numbers of copies to %d" msgstr "Establecer el número de copias a %d" @@ -6656,12 +6569,8 @@ msgid "Set upper thumb to current slider thumb" msgstr "Coloca el pulgar superior en el control deslizante actual" #: src/libslic3r/PrintConfig.cpp:3509 -msgid "" -"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\n" -"For example. loglevel=2 logs fatal, error and warning level messages." -msgstr "" -"Ajusta el nivel de avisos: 0:fallo, 1:error, 2:peligro, 3:info, 4:depuración, 5:traza\n" -"Por ejemplo. loglevel=2 registrará mensajes de fallo, error y peligro." +msgid "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\nFor example. loglevel=2 logs fatal, error and warning level messages." +msgstr "Ajusta el nivel de avisos: 0:fallo, 1:error, 2:peligro, 3:info, 4:depuración, 5:traza\nPor ejemplo. loglevel=2 registrará mensajes de fallo, error y peligro." #: src/slic3r/GUI/BedShapeDialog.cpp:155 msgid "Settings" @@ -6832,14 +6741,8 @@ msgid "Single Extruder Multi Material" msgstr "Extrusor único de múltiples materiales" #: src/slic3r/GUI/Tab.cpp:1867 -msgid "" -"Single Extruder Multi Material is selected, \n" -"and all extruders must have the same diameter.\n" -"Do you want to change the diameter for all extruders to first extruder nozzle diameter value?" -msgstr "" -"Multi Material en extrusor único seleccionado,\n" -"y todos los extrusores deben tener el mismo diámetro.\n" -"¿Deseas cambiar el diámetro de todos los extrusores al valor del diámetro del nozzle del primer extrusor?" +msgid "Single Extruder Multi Material is selected, \nand all extruders must have the same diameter.\nDo you want to change the diameter for all extruders to first extruder nozzle diameter value?" +msgstr "Multi Material en extrusor único seleccionado,\ny todos los extrusores deben tener el mismo diámetro.\n¿Deseas cambiar el diámetro de todos los extrusores al valor del diámetro del nozzle del primer extrusor?" #: src/slic3r/GUI/Tab.cpp:2307 msgid "Single extruder multimaterial parameters" @@ -7294,7 +7197,7 @@ msgid "stealth mode" msgstr "modo silencioso" #: src/slic3r/GUI/Plater.cpp:4985 -#, c-format +#, possible-c-format msgid "STL file exported to %s" msgstr "Archivo STL exportado a %s" @@ -7445,12 +7348,8 @@ msgid "Supports stealth mode" msgstr "Soporta modo silencioso" #: src/slic3r/GUI/ConfigManipulation.cpp:159 -msgid "" -"Supports work better, if the following feature is enabled:\n" -"- Detect bridging perimeters" -msgstr "" -"Los soportes funcionan mejor si la siguiente característica está habilitada:\n" -"- Detectar perímetros con puentes" +msgid "Supports work better, if the following feature is enabled:\n- Detect bridging perimeters" +msgstr "Los soportes funcionan mejor si la siguiente característica está habilitada:\n- Detectar perímetros con puentes" #: src/slic3r/GUI/Preferences.cpp:87 msgid "Suppress \" - default - \" presets" @@ -7485,27 +7384,17 @@ msgid "Switch to Preview" msgstr "Cambiar a Previsualización" #: src/slic3r/GUI/wxExtensions.cpp:703 -#, c-format +#, possible-c-format msgid "Switch to the %s mode" msgstr "Cambiar al modo %s" #: src/slic3r/GUI/GUI_App.cpp:882 -msgid "" -"Switching the language will trigger application restart.\n" -"You will lose content of the plater." -msgstr "" -"Cambiar el idioma necesita reiniciar la aplicación.\n" -"Perderás todo el contenido situado en la base." +msgid "Switching the language will trigger application restart.\nYou will lose content of the plater." +msgstr "Cambiar el idioma necesita reiniciar la aplicación.\nPerderás todo el contenido situado en la base." #: src/slic3r/GUI/WipeTowerDialog.cpp:365 -msgid "" -"Switching to simple settings will discard changes done in the advanced mode!\n" -"\n" -"Do you want to proceed?" -msgstr "" -"¡Cambiar a los ajustes sencillos descartará los cambios realizados en el modo avanzado!\n" -"\n" -"¿Quiere continuar?" +msgid "Switching to simple settings will discard changes done in the advanced mode!\n\nDo you want to proceed?" +msgstr "¡Cambiar a los ajustes sencillos descartará los cambios realizados en el modo avanzado!\n\n¿Quiere continuar?" #: src/slic3r/GUI/Tab.cpp:1014 msgid "symbolic profile name" @@ -7570,24 +7459,17 @@ msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "Se supone que el patrón de relleno %1% no funciona a una densidad del 100%%." #: src/slic3r/GUI/FirmwareDialog.cpp:548 -#, c-format +#, possible-c-format msgid "The %s device could not have been found" msgstr "El dispositivo %s no se pudo encontrar" #: src/slic3r/GUI/FirmwareDialog.cpp:436 -#, c-format -msgid "" -"The %s device was not found.\n" -"If the device is connected, please press the Reset button next to the USB connector ..." -msgstr "" -"No se encontró el dispositivo %s. \n" -"Si el dispositivo está conectado, presione el botón Reset al lado del conector USB ..." +#, possible-c-format +msgid "The %s device was not found.\nIf the device is connected, please press the Reset button next to the USB connector ..." +msgstr "No se encontró el dispositivo %s. \nSi el dispositivo está conectado, presione el botón Reset al lado del conector USB ..." #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875 -msgid "" -"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n" -"Non-uniform scaling of tilted objects is only possible in the World coordinate system,\n" -"once the rotation is embedded into the object coordinates." +msgid "The currently manipulated object is tilted (rotation angles are not multiples of 90°).\nNon-uniform scaling of tilted objects is only possible in the World coordinate system,\nonce the rotation is embedded into the object coordinates." msgstr "El objeto que está manipulando está inclinado (los ángulos de rotación no son múltiplos de 90º). El escalado no uniforme de objetos inclinados sólo es posible en sistema de coordenadas Mundo, una vez que la rotación se ha aplicado a las coordenadas del objeto." #: src/libslic3r/PrintConfig.cpp:2726 @@ -7696,14 +7578,8 @@ msgid "The object will be raised by this number of layers, and support material msgstr "El objeto será elevado por este número de capas y se generará material de soporte debajo de él." #: src/libslic3r/PrintConfig.cpp:2424 -msgid "" -"The percentage of the bed area. \n" -"If the print area exceeds the specified value, \n" -"then a slow tilt will be used, otherwise - a fast tilt" -msgstr "" -"El porcentaje del área de la cama. \n" -"Si el área de impresión excede el valor especificado, \n" -"entonces se utilizará una inclinación lenta, de lo contrario - una inclinación rápida" +msgid "The percentage of the bed area. \nIf the print area exceeds the specified value, \nthen a slow tilt will be used, otherwise - a fast tilt" +msgstr "El porcentaje del área de la cama. \nSi el área de impresión excede el valor especificado, \nentonces se utilizará una inclinación lenta, de lo contrario - una inclinación rápida" #: src/slic3r/GUI/GUI_App.cpp:932 msgid "The presets on the following tabs were modified" @@ -7737,19 +7613,17 @@ msgstr "El objeto seleccionado no se puede dividir porque contiene más de un vo msgid "The selected object couldn't be split because it contains only one part." msgstr "El objeto seleccionado no se pudo dividir porque contiene solo una parte." +#: src/slic3r/GUI/MainFrame.cpp:432 +msgid "The selected project is no longer available.\nDo you want to remove it from the recent projects list ?" +msgstr "El proyecto seleccionado no está disponible.\n¿Desea eliminarlo de la lista de proyectos recientes?" + #: src/slic3r/GUI/MainFrame.cpp:422 msgid "The selected project is no more available" msgstr "El proyecto seleccionado no está diponible" #: src/slic3r/GUI/DoubleSlider.cpp:998 -msgid "" -"The sequential print is on.\n" -"It's impossible to apply any custom G-code for objects printing sequentually.\n" -"This code won't be processed during G-code generation." -msgstr "" -"La impresión secuencial está activada.\n" -"Es imposible incluir G-code personalizado para piezas que se imprimen secuencialmente.\n" -"Este código no se procesará durante la generación del G-code." +msgid "The sequential print is on.\nIt's impossible to apply any custom G-code for objects printing sequentually.\nThis code won't be processed during G-code generation." +msgstr "La impresión secuencial está activada.\nEs imposible incluir G-code personalizado para piezas que se imprimen secuencialmente.\nEste código no se procesará durante la generación del G-code." #: src/libslic3r/PrintConfig.cpp:2846 msgid "The slope of the pad wall relative to the bed plane. 90 degrees means straight walls." @@ -7765,22 +7639,8 @@ msgstr "La velocidad para las retracciones (solo se aplica al motor del extrusor #: src/slic3r/GUI/ConfigManipulation.cpp:81 #, no-c-format -msgid "" -"The Spiral Vase mode requires:\n" -"- one perimeter\n" -"- no top solid layers\n" -"- 0% fill density\n" -"- no support material\n" -"- Ensure vertical shell thickness enabled\n" -"- Detect thin walls disabled" -msgstr "" -"El modo Vaso Espiral necesita:\n" -"-un perímetro\n" -"-cero capas de tapa superior\n" -"-0% densidad de relleno\n" -"-sin soportes\n" -"-Comprueba que está activado el espesor de pared vertical\n" -"-Desactiva la detección de paredes finas" +msgid "The Spiral Vase mode requires:\n- one perimeter\n- no top solid layers\n- 0% fill density\n- no support material\n- Ensure vertical shell thickness enabled\n- Detect thin walls disabled" +msgstr "El modo Vaso Espiral necesita:\n-un perímetro\n-cero capas de tapa superior\n-0% densidad de relleno\n-sin soportes\n-Comprueba que está activado el espesor de pared vertical\n-Desactiva la detección de paredes finas" #: src/libslic3r/Print.cpp:1237 msgid "The Spiral Vase option can only be used when printing a single object." @@ -7817,10 +7677,7 @@ msgid "The vertical distance between object and support material interface. Sett msgstr "La distancia vertical entre el objeto y la interfaz del material de soporte. Establecer esto en 0 también evitará que Slic3r use el flujo y la velocidad del puente para la primera capa de los objetos." #: src/slic3r/GUI/Tab.cpp:2575 -msgid "" -"The Wipe option is not available when using the Firmware Retraction mode.\n" -"\n" -"Shall I disable it in order to enable Firmware Retraction?" +msgid "The Wipe option is not available when using the Firmware Retraction mode.\n\nShall I disable it in order to enable Firmware Retraction?" msgstr "La opción Limpiar no está disponible cuando se usa el modo Retracción de firmware. ¿Lo inhabilito para habilitar la Retracción de firmware?" #: src/libslic3r/Print.cpp:1268 @@ -7828,13 +7685,8 @@ msgid "The Wipe Tower currently does not support volumetric E (use_volumetric_e= msgstr "La Torre de Limpieza actualmente no es compatible con E volumétrico (use_volumetric_e=0)." #: src/slic3r/GUI/ConfigManipulation.cpp:115 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool change.\n" -"(both support_material_extruder and support_material_interface_extruder need to be set to 0)." -msgstr "" -"La Torre de Limpieza actualmente admite los soportes no solubles solo si están impresos con el extrusor actual sin activar un cambio de herramienta. \n" -"(tanto support_material_extruder como support_material_interface_extruder deben configurarse en 0)." +msgid "The Wipe Tower currently supports the non-soluble supports only\nif they are printed with the current extruder without triggering a tool change.\n(both support_material_extruder and support_material_interface_extruder need to be set to 0)." +msgstr "La Torre de Limpieza actualmente admite los soportes no solubles solo si están impresos con el extrusor actual sin activar un cambio de herramienta. \n(tanto support_material_extruder como support_material_interface_extruder deben configurarse en 0)." #: src/libslic3r/Print.cpp:1400 msgid "The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder without triggering a tool change. (both support_material_extruder and support_material_interface_extruder need to be set to 0)." @@ -7881,29 +7733,19 @@ msgid "There are unprintable objects. Try to adjust support settings to make the msgstr "Hay objetos no imprimibles. Intenta ajustar la configuración de soportes para que los objetos se puedan imprimir." #: src/slic3r/GUI/DoubleSlider.cpp:1030 -msgid "" -"There is a color change for extruder that has not been used before.\n" -"Check your settings to avoid redundant color changes." -msgstr "" -"Hay un cambio de color para el extrusor que no se ha usado antes. \n" -"Comprueba tus ajustes para evitar cambios de color innecesarios." +msgid "There is a color change for extruder that has not been used before.\nCheck your settings to avoid redundant color changes." +msgstr "Hay un cambio de color para el extrusor que no se ha usado antes. \nComprueba tus ajustes para evitar cambios de color innecesarios." #: src/slic3r/GUI/DoubleSlider.cpp:1024 -msgid "" -"There is a color change for extruder that won't be used till the end of print job.\n" -"This code won't be processed during G-code generation." +msgid "There is a color change for extruder that won't be used till the end of print job.\nThis code won't be processed during G-code generation." msgstr "Hay un cambio de color para el extrusor que no será usado hasta el final del trabajo de impresión. Este código no será procesado durante la generación del G-code." #: src/slic3r/GUI/DoubleSlider.cpp:1027 -msgid "" -"There is an extruder change set to the same extruder.\n" -"This code won't be processed during G-code generation." -msgstr "" -"Hay un cambio de extrusor establecido en el mismo extrusor.\n" -"Este código no se procesará durante la generación del código G." +msgid "There is an extruder change set to the same extruder.\nThis code won't be processed during G-code generation." +msgstr "Hay un cambio de extrusor establecido en el mismo extrusor.\nEste código no se procesará durante la generación del código G." #: src/slic3r/GUI/UpdateDialogs.cpp:225 -#, c-format +#, possible-c-format msgid "This %s version: %s" msgstr "Esta %s versión: %s" @@ -7980,29 +7822,13 @@ msgid "This file cannot be loaded in a simple mode. Do you want to switch to an msgstr "Este archivo no puede ser cargado en un modo sencillo. ¿Quieres cambiar al modo experto?" #: src/slic3r/GUI/Plater.cpp:2357 -msgid "" -"This file contains several objects positioned at multiple heights.\n" -"Instead of considering them as multiple objects, should I consider\n" -"this file as a single object having multiple parts?" -msgstr "" -"Este archivo contiene varios objetos posicionados en múltiples alturas. En lugar de considerarlos como objetos múltiples, ¿debería considerar\n" -" este archivo como un único objeto que tiene varias partes?" +msgid "This file contains several objects positioned at multiple heights.\nInstead of considering them as multiple objects, should I consider\nthis file as a single object having multiple parts?" +msgstr "Este archivo contiene varios objetos posicionados en múltiples alturas. En lugar de considerarlos como objetos múltiples, ¿debería considerar\n este archivo como un único objeto que tiene varias partes?" #: src/slic3r/GUI/FirmwareDialog.cpp:332 -#, c-format -msgid "" -"This firmware hex file does not match the printer model.\n" -"The hex file is intended for: %s\n" -"Printer reported: %s\n" -"\n" -"Do you want to continue and flash this hex file anyway?\n" -"Please only continue if you are sure this is the right thing to do." -msgstr "" -"Este archivo hex del firmware no se corresponde con el modelo de impresora. El archivo hex está preparado para: %s\n" -"Esta Impresora: %s\n" -"\n" -"¿Quieres continuar y grabar este archivo hex de todos modos?\n" -"Por favor continúa solo si estás seguro de que es lo correcto." +#, possible-c-format +msgid "This firmware hex file does not match the printer model.\nThe hex file is intended for: %s\nPrinter reported: %s\n\nDo you want to continue and flash this hex file anyway?\nPlease only continue if you are sure this is the right thing to do." +msgstr "Este archivo hex del firmware no se corresponde con el modelo de impresora. El archivo hex está preparado para: %s\nEsta Impresora: %s\n\n¿Quieres continuar y grabar este archivo hex de todos modos?\nPor favor continúa solo si estás seguro de que es lo correcto." #: src/libslic3r/PrintConfig.cpp:314 msgid "This flag enables the automatic cooling logic that adjusts print speed and fan speed according to layer printing time." @@ -8077,17 +7903,17 @@ msgstr "Esta es la altura más baja de la capa imprimible para este extrusor y l msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed." msgstr "Esto generalmente es causado por extrusiones insignificantemente pequeñas o por un modelo defectuoso. Intenta reparar el modelo o cambia su orientación en la cama." +#: src/libslic3r/GCode.cpp:639 +msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed." +msgstr "Esto generalmente es causado por extrusiones insignificantemente pequeñas o por un modelo defectuoso. Intenta reparar el modelo o cambia su orientación en la cama." + #: src/libslic3r/PrintConfig.cpp:2215 msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools." msgstr "Esta matriz detalla los volúmenes (en milímetros cúbicos) necesarios para purgar el nuevo filamento en la torre de limpieza para cualquier par de filamentos." #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878 -msgid "" -"This operation is irreversible.\n" -"Do you want to proceed?" -msgstr "" -"Esta operación es irreversible. \n" -"¿Deseas continuar?" +msgid "This operation is irreversible.\nDo you want to proceed?" +msgstr "Esta operación es irreversible. \n¿Deseas continuar?" #: src/libslic3r/PrintConfig.cpp:1442 msgid "This option sets the number of perimeters to generate for each layer. Note that Slic3r may increase this number automatically when it detects sloping surfaces which benefit from a higher number of perimeters if the Extra Perimeters option is enabled." @@ -8150,16 +7976,9 @@ msgid "This vector saves required volumes to change from/to each tool used on th msgstr "Este vector guarda los volúmenes necesarios para cambiar desde/hasta cada herramienta usada en la torre de limpieza. Estos valores se emplean para simplificar la creación de los volúmenes totales de purga más abajo." #: src/slic3r/GUI/UpdateDialogs.cpp:216 -#, c-format -msgid "" -"This version of %s is not compatible with currently installed configuration bundles.\n" -"This probably happened as a result of running an older %s after using a newer one.\n" -"\n" -"You may either exit %s and try again with a newer version, or you may re-run the initial configuration. Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s." -msgstr "" -"Esta versión de %s no es compatible con los grupos de configuraciones instaladas. Esto sucede probablemente por ejecutar una versión de %s después de haber usado una más reciente.\n" -"\n" -"Puedes salir de %s e intentarlo de nuevo con una versión más reciente, o puedes volver a ejecutar la configuración inicial. Al hacerlo se creará una copia de respaldo de la configuración existente antes de instalar la nueva compatible con esta versión de %s." +#, possible-c-format +msgid "This version of %s is not compatible with currently installed configuration bundles.\nThis probably happened as a result of running an older %s after using a newer one.\n\nYou may either exit %s and try again with a newer version, or you may re-run the initial configuration. Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s." +msgstr "Esta versión de %s no es compatible con los grupos de configuraciones instaladas. Esto sucede probablemente por ejecutar una versión de %s después de haber usado una más reciente.\n\nPuedes salir de %s e intentarlo de nuevo con una versión más reciente, o puedes volver a ejecutar la configuración inicial. Al hacerlo se creará una copia de respaldo de la configuración existente antes de instalar la nueva compatible con esta versión de %s." #: src/libslic3r/PrintConfig.cpp:2458 msgid "This will apply a gamma correction to the rasterized 2D polygons. A gamma value of zero means thresholding with the threshold in the middle. This behaviour eliminates antialiasing without losing holes in polygons." @@ -8217,8 +8036,12 @@ msgstr "A los objetos" msgid "To parts" msgstr "A las piezas" +#: src/slic3r/GUI/Tab.cpp:1756 +msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain." +msgstr "Para usar un archivo CA personalizado, importa tu archivo CA al Almacén de Certificados/Llavero." + #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 -#, c-format +#, possible-c-format msgid "Toggle %c axis mirroring" msgstr "Activar reflejo del eje %c" @@ -8343,7 +8166,7 @@ msgid "Undo" msgstr "Deshacer" #: src/slic3r/GUI/GLCanvas3D.cpp:4065 -#, c-format +#, possible-c-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "Deshacer %1$d Acción" @@ -8384,23 +8207,15 @@ msgid "UNLOCKED LOCK" msgstr "CANDADO ABIERTO" #: src/slic3r/GUI/Tab.cpp:3282 -msgid "" -"UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n" -"Click to reset all settings for current option group to the system (or default) values." -msgstr "" -"El icono de CANDADO DESBLOQUEADO indica que se cambiaron algunas configuraciones y no son iguales a los valores del sistema (o predeterminados) para el grupo de opciones actual.\n" -"Haz clic para restablecer todas las configuraciones para el grupo de opciones actual a los valores del sistema (o predeterminados)." +msgid "UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\nClick to reset all settings for current option group to the system (or default) values." +msgstr "El icono de CANDADO DESBLOQUEADO indica que se cambiaron algunas configuraciones y no son iguales a los valores del sistema (o predeterminados) para el grupo de opciones actual.\nHaz clic para restablecer todas las configuraciones para el grupo de opciones actual a los valores del sistema (o predeterminados)." #: src/slic3r/GUI/Tab.cpp:3297 -msgid "" -"UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\n" -"Click to reset current value to the system (or default) value." -msgstr "" -"El icono de CANDADO DESBLOQUEADO indica que se cambiaron algunas configuraciones y no son iguales a los valores del sistema (o predeterminados).\n" -"Haz clic para reiniciar el valor actual a los del sistema (o predeterminados)" +msgid "UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\nClick to reset current value to the system (or default) value." +msgstr "El icono de CANDADO DESBLOQUEADO indica que se cambiaron algunas configuraciones y no son iguales a los valores del sistema (o predeterminados).\nHaz clic para reiniciar el valor actual a los del sistema (o predeterminados)" #: src/slic3r/GUI/Plater.cpp:5203 -#, c-format +#, possible-c-format msgid "Unmounting successful. The device %s(%s) can now be safely removed from the computer." msgstr "Expulsión exitosa. El dispositivo %s (%s) puede desconectarse del ordenador de forma segura." @@ -8449,7 +8264,7 @@ msgid "Unsupported selection" msgstr "Selección no soportada" #: src/slic3r/GUI/GLCanvas3D.cpp:955 -#, c-format +#, possible-c-format msgid "up to %.2f mm" msgstr "hasta %.2f mm" @@ -8711,12 +8526,12 @@ msgid "Welcome" msgstr "Bienvenido" #: src/slic3r/GUI/ConfigWizard.cpp:427 -#, c-format +#, possible-c-format msgid "Welcome to the %s Configuration Assistant" msgstr "Bienvenido al %s Asistente de Configuración" #: src/slic3r/GUI/ConfigWizard.cpp:429 -#, c-format +#, possible-c-format msgid "Welcome to the %s Configuration Wizard" msgstr "Bienvenido al %s Ayudante de Configuración" @@ -8882,17 +8697,8 @@ msgid "World coordinates" msgstr "Coordenadas mundiales" #: src/slic3r/GUI/UpdateDialogs.cpp:92 -msgid "" -"Would you like to install it?\n" -"\n" -"Note that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n" -"\n" -"Updated configuration bundles:" -msgstr "" -"¿Te gustaría instalarlo?\n" -"\n" -"Ten en cuenta que primero se creará una instantánea de la configuración. Así que se puede recuperar en cualquier momento en caso de que hubiera algún problema con la nueva versión.\n" -"Updated configuration bundles:" +msgid "Would you like to install it?\n\nNote that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n\nUpdated configuration bundles:" +msgstr "¿Te gustaría instalarlo?\n\nTen en cuenta que primero se creará una instantánea de la configuración. Así que se puede recuperar en cualquier momento en caso de que hubiera algún problema con la nueva versión.\nUpdated configuration bundles:" #: src/libslic3r/Zipper.cpp:92 msgid "write calledback failed" @@ -8959,7 +8765,7 @@ msgid "You can't change a type of the last solid part of the object." msgstr "No puede cambiar un tipo de la última parte sólida del objeto." #: src/slic3r/GUI/Plater.cpp:2390 -#, c-format +#, possible-c-format msgid "You can't to add the object(s) from %s because of one or some of them is(are) multi-part" msgstr "No puede agregar el(los) objeto(s) desde % s porque uno o algunos de ellos son de varias piezas" @@ -8988,12 +8794,12 @@ msgid "You must install a configuration update." msgstr "Es necesario instalar una actualización de la configuración." #: src/slic3r/GUI/Preferences.cpp:172 -#, c-format +#, possible-c-format msgid "You need to restart %s to make the changes effective." msgstr "Es necesario reiniciar %s para hacer los cambios efectivos." #: src/slic3r/GUI/GUI_ObjectList.cpp:3421 -#, c-format +#, possible-c-format msgid "You started your selection with %s Item." msgstr "Has empezado la selección con %s Items." @@ -9018,24 +8824,12 @@ msgid "Z offset" msgstr "Ajuste en altura Z" #: src/slic3r/GUI/ConfigManipulation.cpp:60 -msgid "" -"Zero first layer height is not valid.\n" -"\n" -"The first layer height will be reset to 0.01." -msgstr "" -"Cero como la altura de la primera capa no es válido.\n" -"\n" -"La altura de la primera capa se restablecerá a 0.01." +msgid "Zero first layer height is not valid.\n\nThe first layer height will be reset to 0.01." +msgstr "Cero como la altura de la primera capa no es válido.\n\nLa altura de la primera capa se restablecerá a 0.01." #: src/slic3r/GUI/ConfigManipulation.cpp:48 -msgid "" -"Zero layer height is not valid.\n" -"\n" -"The layer height will be reset to 0.01." -msgstr "" -"Cero como la altura de capa no es válido.\n" -"\n" -"La altura de capa se restablecerá a 0.01." +msgid "Zero layer height is not valid.\n\nThe layer height will be reset to 0.01." +msgstr "Cero como la altura de capa no es válido.\n\nLa altura de capa se restablecerá a 0.01." #: src/libslic3r/PrintConfig.cpp:2667 msgid "Zig-Zag" @@ -9059,12 +8853,8 @@ msgid "Zoom to Bed" msgstr "Zoom a la Cama" #: src/slic3r/GUI/KBShortcutsDialog.cpp:182 -msgid "" -"Zoom to selected object\n" -"or all objects in scene, if none selected" -msgstr "" -"Zoom a objetos seleccionados\n" -"o a todos los objetos en escena, si no se seleccionó ninguno" +msgid "Zoom to selected object\nor all objects in scene, if none selected" +msgstr "Zoom a objetos seleccionados\no a todos los objetos en escena, si no se seleccionó ninguno" #: src/libslic3r/PrintConfig.cpp:207 src/libslic3r/PrintConfig.cpp:780 #: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1650 diff --git a/resources/localization/fr/PrusaSlicer.mo b/resources/localization/fr/PrusaSlicer.mo index 7fd27690eea16a31c49df933c275a5edb582554a..03bcd7046ba8bce7efe718420ec4240628a3993f 100644 GIT binary patch delta 46034 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 delta 45234 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 diff --git a/resources/localization/fr/PrusaSlicer_fr.po b/resources/localization/fr/PrusaSlicer_fr.po index 235c6dd08d..4cf4b627e8 100644 --- a/resources/localization/fr/PrusaSlicer_fr.po +++ b/resources/localization/fr/PrusaSlicer_fr.po @@ -5,7 +5,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 1.8.7.1\n" +"X-Generator: Poedit 2.3\n" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" @@ -1561,6 +1561,10 @@ msgstr "Cubique" msgid "Current mode is %s" msgstr "Le mode actuel est %s" +#: src/slic3r/GUI/Tab.cpp:959 +msgid "Current preset is inherited from" +msgstr "Le préréglage actuel est hérité de" + #: src/slic3r/GUI/Tab.cpp:957 msgid "Current preset is inherited from the default preset." msgstr "Le préréglage actuel est hérité du préréglage par défaut." @@ -2956,6 +2960,15 @@ msgstr "" "pour le bouton gauche : indique un préréglage non-système (ou non par défaut),\n" "pour le bouton droit : indique que le réglage n'a pas été modifié." +#. TRN Description for "WHITE BULLET" +#: src/slic3r/GUI/Tab.cpp:3267 +msgid "" +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." +msgstr "" +"pour le bouton gauche : indique un préréglage non-système (ou non par défaut),\n" +"pour le bouton droit : indique que le réglage n'a pas été modifié." + #: src/slic3r/GUI/ConfigManipulation.cpp:136 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers\n" @@ -3578,7 +3591,6 @@ msgid "" "Click the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values." msgstr "" "indique que certains paramètres ont été modifiés et ne sont pas égaux aux valeurs du système (ou par défaut) pour le groupe d'options actuel.\n" -"\n" "Cliquez sur l'icône CADENAS OUVERT pour régler tous les paramètres pour le groupe d'options actuel sur les valeurs du système (ou par défaut)." #. TRN Description for "LOCKED LOCK" @@ -4055,15 +4067,15 @@ msgstr "Verrouiller les supports sous de nouveaux îlots" #: src/slic3r/GUI/Tab.cpp:3252 msgid "LOCKED LOCK" -msgstr "VERROU VERROUILLE" +msgstr "CADENAS FERMÉ" #: src/slic3r/GUI/Tab.cpp:3280 msgid "LOCKED LOCK icon indicates that the settings are the same as the system (or default) values for the current option group" -msgstr "L'icône VERROU VERROUILLE indique que les réglages sont les mêmes que les valeurs système (ou par défaut) pour le groupe d'options actuel" +msgstr "L'icône CADENAS FERMÉ indique que les réglages sont les mêmes que les valeurs système (ou par défaut) pour le groupe d'options actuel" #: src/slic3r/GUI/Tab.cpp:3296 msgid "LOCKED LOCK icon indicates that the value is the same as the system (or default) value." -msgstr "L'icône VERROU VERROUILLÉ indique que la valeur est la même que la valeur système (ou par défaut)." +msgstr "L'icône CADENAS FERMÉ indique que la valeur est la même que la valeur système (ou par défaut)." #: src/libslic3r/PrintConfig.cpp:3508 msgid "Logging level" @@ -4122,6 +4134,10 @@ msgstr "Maximum" msgid "Max bridge length" msgstr "Longueur maximum de pont" +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Max bridges on a pillar" +msgstr "Nombre de ponts maximum par pilier" + #: src/libslic3r/PrintConfig.cpp:2822 msgid "Max merge distance" msgstr "Distance maximum de fusion" @@ -4290,6 +4306,10 @@ msgstr "Mouvement brusque maximum Y" msgid "Maximum jerk Z" msgstr "Mouvement brusque maximum Z" +#: src/libslic3r/PrintConfig.cpp:2660 +msgid "Maximum number of bridges that can be placed on a pillar. Bridges hold support point pinheads and connect to pillars as small branches." +msgstr "Le nombre de ponts maximum pouvant être placés sur un pilier. Les ponts soutiennent les têtes des points de support et sont connectés aux piliers comme de petites branches." + #: src/libslic3r/PrintConfig.cpp:598 msgid "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit." msgstr "Vitesse volumétrique maximale autorisée pour ce filament. Limite la vitesse volumétrique d'une impression au minimum des vitesses volumétriques d'impression et de filament. Mettez à zéro pour enlever la limite." @@ -4961,6 +4981,11 @@ msgstr "d'un Objet en cours" msgid "Offset" msgstr "Décalage" +#: src/slic3r/GUI/Tab.cpp:1755 +#, c-format +msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain." +msgstr "Dans ce système, %s utilise des certificats HTTPS issus du système Magasin de Certificats ou Trousseau." + #: src/slic3r/GUI/DoubleSlider.cpp:950 msgid "One layer mode" msgstr "Mode couche unique" @@ -6437,6 +6462,16 @@ msgstr "" "NON si vous souhaitez que tous les changements d'outil soient remplacés par des modifications de couleur, \n" "ou ANNULER pour ne pas les modifier." +#: src/slic3r/GUI/DoubleSlider.cpp:1917 +msgid "" +"Select YES if you want to delete all saved tool changes, \n" +"NO if you want all tool changes switch to color changes, \n" +"or CANCEL to leave it unchanged." +msgstr "" +"Sélectionnez OUI si vous souhaitez supprimer tous les changements d'outil enregistrées, \n" +"NON si vous souhaitez que tous les changements d'outil soient remplacés par des modifications de couleur, \n" +"ou ANNULER pour ne pas les modifier." + #: src/slic3r/GUI/Selection.cpp:146 msgid "Selection-Add" msgstr "Sélection-Ajouter" @@ -7745,6 +7780,14 @@ msgstr "L'objet sélectionné ne peut être scindé car il contient plus d'un vo msgid "The selected object couldn't be split because it contains only one part." msgstr "L'objet sélectionné n'a pu être scindé car il ne contient qu'une seule pièce." +#: src/slic3r/GUI/MainFrame.cpp:432 +msgid "" +"The selected project is no longer available.\n" +"Do you want to remove it from the recent projects list ?" +msgstr "" +"Le projet sélectionné n'est plus disponible.\n" +"Voulez-vous le retirer de la liste des projets récents ?" + #: src/slic3r/GUI/MainFrame.cpp:422 msgid "The selected project is no more available" msgstr "Le projet sélectionné n'est plus disponible" @@ -8092,6 +8135,10 @@ msgstr "Cette valeur est la hauteur de couche imprimable minimum pour cet extrud msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed." msgstr "Ceci est généralement provoqué par de petites extrusions négligeables ou par un modèle défectueux. Essayez de réparer le modèle ou de changer son orientation sur le lit." +#: src/libslic3r/GCode.cpp:639 +msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed." +msgstr "Ceci est généralement provoqué par de petites extrusions négligeables ou par un modèle défectueux. Essayez de réparer le modèle ou de changer son orientation sur le lit." + #: src/libslic3r/PrintConfig.cpp:2215 msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools." msgstr "Cette matrice décrit les volumes (en millimètres cube) nécessaires pour purger le nouveau filament dans la tour de nettoyage pour une paire d'outils donnée." @@ -8233,6 +8280,10 @@ msgstr "Vers les objets" msgid "To parts" msgstr "Vers les parties" +#: src/slic3r/GUI/Tab.cpp:1756 +msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain." +msgstr "Pour utiliser un fichier CA personnalisé, veuillez importer votre fichier CA dans le Magasin de Certificats / Trousseau." + #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 #, c-format msgid "Toggle %c axis mirroring" diff --git a/resources/localization/it/PrusaSlicer.mo b/resources/localization/it/PrusaSlicer.mo index 9130c6abf4b8e4940777cb740e22c2b6e63755c3..dde2a330b3f11cb0283140be829118268b5e9bd2 100644 GIT binary patch delta 45934 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 Sbv6=ntq*${#pkW<+WrqaLp-wp diff --git a/resources/localization/it/PrusaSlicer_it.po b/resources/localization/it/PrusaSlicer_it.po index 7a6c3e0a06..cfc083c54f 100644 --- a/resources/localization/it/PrusaSlicer_it.po +++ b/resources/localization/it/PrusaSlicer_it.po @@ -5,7 +5,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.8.7.1\n" +"X-Generator: Poedit 2.3\n" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" @@ -1561,6 +1561,10 @@ msgstr "Cubico" msgid "Current mode is %s" msgstr "La modalità corrente è %s" +#: src/slic3r/GUI/Tab.cpp:959 +msgid "Current preset is inherited from" +msgstr "Il preset corrente è ereditato da" + #: src/slic3r/GUI/Tab.cpp:957 msgid "Current preset is inherited from the default preset." msgstr "Il preset attuale è stato ereditato dal preset predefinito." @@ -2956,6 +2960,15 @@ msgstr "" "per il tasto sinistro: indica un preset non di sistema (o non-predefinito),\n" "per il tasto destro: indica che le impostazioni non sono state modificate." +#. TRN Description for "WHITE BULLET" +#: src/slic3r/GUI/Tab.cpp:3267 +msgid "" +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." +msgstr "" +"per il tasto sinistro: indica un preset non di sistema (o non-predefinito),\n" +"per il tasto destro: indica che le impostazioni non sono state modificate." + #: src/slic3r/GUI/ConfigManipulation.cpp:136 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers\n" @@ -4115,6 +4128,10 @@ msgstr "Massimo" msgid "Max bridge length" msgstr "Lunghezza massima Bridge" +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Max bridges on a pillar" +msgstr "Ponteggi massimi su un pilastro" + #: src/libslic3r/PrintConfig.cpp:2822 msgid "Max merge distance" msgstr "Massima distanza di unione" @@ -4283,6 +4300,10 @@ msgstr "Jerk massimo Y" msgid "Maximum jerk Z" msgstr "Jerk massimo Z" +#: src/libslic3r/PrintConfig.cpp:2660 +msgid "Maximum number of bridges that can be placed on a pillar. Bridges hold support point pinheads and connect to pillars as small branches." +msgstr "Numero massimo di ponteggi che può essere posizionato su un pilastro. I ponteggi mantengono le capocchie dei punti di supporto e si collegano ai pilastri come piccoli rami." + #: src/libslic3r/PrintConfig.cpp:598 msgid "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit." msgstr "Massima velocità volumetrica consentita per questo filamento. Limita la velocità volumetrica massima di una stampa alla velocità volumetrica minima del filamento e di stampa. Imposta a zero per non avere limite." @@ -4953,6 +4974,11 @@ msgstr "di un Oggetto corrente" msgid "Offset" msgstr "Offset" +#: src/slic3r/GUI/Tab.cpp:1755 +#, c-format +msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain." +msgstr "Su questo sistema, %s utilizza certificati HTTPS provenienti dal sistema Certificate Store o da Keychain." + #: src/slic3r/GUI/DoubleSlider.cpp:950 msgid "One layer mode" msgstr "Modalità Un Layer" @@ -6425,6 +6451,16 @@ msgstr "" "NO se vuoi che tutti i cambi attrezzo passino a cambi colore,\n" "o ANNULLA per lasciarlo invariato." +#: src/slic3r/GUI/DoubleSlider.cpp:1917 +msgid "" +"Select YES if you want to delete all saved tool changes, \n" +"NO if you want all tool changes switch to color changes, \n" +"or CANCEL to leave it unchanged." +msgstr "" +"Seleziona SI se vuoi cancellare tutti i cambi attrezzo salvati,\n" +"NO se vuoi che tutti i cambi attrezzo passino a cambi colore,\n" +"o ANNULLA per lasciarlo invariato." + #: src/slic3r/GUI/Selection.cpp:146 msgid "Selection-Add" msgstr "Selezione-Aggiungi" @@ -7736,6 +7772,14 @@ msgstr "L'oggetto selezionato non può essere diviso perché contiene più di un msgid "The selected object couldn't be split because it contains only one part." msgstr "L'oggetto selezionato non può essere diviso perché contiene solo una parte." +#: src/slic3r/GUI/MainFrame.cpp:432 +msgid "" +"The selected project is no longer available.\n" +"Do you want to remove it from the recent projects list ?" +msgstr "" +"Il progetto selezionato non è più disponibile.\n" +"Vuoi rimuoverlo dall'elenco dei progetti recenti?" + #: src/slic3r/GUI/MainFrame.cpp:422 msgid "The selected project is no more available" msgstr "Il progetto selezionato non è più disponibile" @@ -8080,6 +8124,10 @@ msgstr "Questa è l'altezza minima stampabile per questo estrusore e limita la r msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed." msgstr "Questo solitamente è causato da estrusioni molto piccole o da un modello difettoso. Provare a riparare il modello o cambiare il suo orientamento sul piano." +#: src/libslic3r/GCode.cpp:639 +msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed." +msgstr "Questo solitamente è causato da estrusioni molto piccole o da un modello difettoso. Provare a riparare il modello o cambiare il suo orientamento sul piano." + #: src/libslic3r/PrintConfig.cpp:2215 msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools." msgstr "Questa matrice descrive il volume (in millimetri cubici) necessario per spurgare il filamento nella torre di spurgo per una qualunque coppia di attrezzi." @@ -8221,6 +8269,10 @@ msgstr "In oggetti" msgid "To parts" msgstr "In parti" +#: src/slic3r/GUI/Tab.cpp:1756 +msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain." +msgstr "Per utilizzare un file CA personalizzato, importa il tuo file CA sul Certificate Store / Keychain." + #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 #, c-format msgid "Toggle %c axis mirroring" diff --git a/resources/localization/ja/PrusaSlicer.mo b/resources/localization/ja/PrusaSlicer.mo index 9211b25b0ffcc72027a43e2cf651498358895afd..cdc5e8d751c6c9c26ac5c031e114d97b7ab08d3b 100644 GIT binary patch delta 45842 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 Or&pSBsh3xz&wl|d0>>Bt diff --git a/resources/localization/ja/PrusaSlicer_ja.po b/resources/localization/ja/PrusaSlicer_ja.po index 1db540918b..c7889b1110 100644 --- a/resources/localization/ja/PrusaSlicer_ja.po +++ b/resources/localization/ja/PrusaSlicer_ja.po @@ -5,7 +5,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 2.2.1\n" +"X-Generator: Poedit 2.3\n" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" @@ -1553,6 +1553,10 @@ msgstr "立方" msgid "Current mode is %s" msgstr "現在のモードは%sです" +#: src/slic3r/GUI/Tab.cpp:959 +msgid "Current preset is inherited from" +msgstr "現在のプリセット継承元" + #: src/slic3r/GUI/Tab.cpp:957 msgid "Current preset is inherited from the default preset." msgstr "現在の設定はデフォルト設定から継承されます。" @@ -2941,6 +2945,15 @@ msgid "" "for the right button: \tindicates that the settings hasn't been modified." msgstr "左ボタンの場合:システム(デフォルト)プリセットでないことを示し、右側ボタンの場合:設定が変更されていないことを示します。" +#. TRN Description for "WHITE BULLET" +#: src/slic3r/GUI/Tab.cpp:3267 +msgid "" +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." +msgstr "" +"左ボタンの場合:システム(デフォルト)プリセットでないことを示し、\n" +"右側ボタンの場合:設定が変更されていないことを示します。" + #: src/slic3r/GUI/ConfigManipulation.cpp:136 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers\n" @@ -3571,7 +3584,9 @@ msgstr "設定が現在の設定グループのシステム(デフォルト) msgid "" "indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n" "Click the BACK ARROW icon to reset all settings for the current option group to the last saved preset." -msgstr "設定が変更され、現在のオプショングループに最後に保存されたプリセットと等しくないことを示します。戻る矢印アイコンをクリックして、現在のオプショングループのすべての設定を最後に保存されたプリセットに戻します。" +msgstr "" +"設定が変更され、現在のオプショングループに最後に保存されたプリセットと等しくないことを示します。\n" +"戻る矢印アイコンをクリックして、現在のオプショングループのすべての設定を最後に保存されたプリセットに戻します。" #: src/slic3r/GUI/ConfigManipulation.cpp:211 #: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:96 @@ -4100,6 +4115,10 @@ msgstr "最大" msgid "Max bridge length" msgstr "最長ブリッジ長さ" +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Max bridges on a pillar" +msgstr "柱の上の最大ブリッジ数" + #: src/libslic3r/PrintConfig.cpp:2822 msgid "Max merge distance" msgstr "最大結合距離" @@ -4268,6 +4287,10 @@ msgstr "Yの最大ジャーク" msgid "Maximum jerk Z" msgstr "Zの最大ジャーク" +#: src/libslic3r/PrintConfig.cpp:2660 +msgid "Maximum number of bridges that can be placed on a pillar. Bridges hold support point pinheads and connect to pillars as small branches." +msgstr "柱の上に置くことができるブリッジの最大数。 ブリッジはサポートポイントのピンヘッドを保持し、小さな枝として柱に接続します。" + #: src/libslic3r/PrintConfig.cpp:598 msgid "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit." msgstr "このフィラメントに許容される最大体積押出し速度。プリントの最大体積押出し速度を、プリントとフィラメントの体積押出し速度の最小値にに制限します。 制限なしに設定するにはゼロを入力します。" @@ -4922,6 +4945,11 @@ msgstr "現在のオブジェクトの" msgid "Offset" msgstr "オフセット" +#: src/slic3r/GUI/Tab.cpp:1755 +#, c-format +msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain." +msgstr "このシステムでは、%sはシステムの証明書ストアまたはキーチェーンからのHTTPS証明書を使用します。" + #: src/slic3r/GUI/DoubleSlider.cpp:950 msgid "One layer mode" msgstr "1レイヤーモード" @@ -6391,6 +6419,16 @@ msgstr "" "すべてのツールの変更を色の変更に切り替えたい場合は「いいえ」、\n" "または「キャンセル」で変更せずにそのままにします" +#: src/slic3r/GUI/DoubleSlider.cpp:1917 +msgid "" +"Select YES if you want to delete all saved tool changes, \n" +"NO if you want all tool changes switch to color changes, \n" +"or CANCEL to leave it unchanged." +msgstr "" +"保存したツールの変更をすべて削除する場合は、「はい」を選択します。\n" +"すべてのツールの変更を色の変更に切り替えたい場合は「いいえ」、\n" +"または「キャンセル」で変更せずにそのままにします" + #: src/slic3r/GUI/Selection.cpp:146 msgid "Selection-Add" msgstr "選択-追加" @@ -7696,6 +7734,14 @@ msgstr "選択したオブジェクトには複数のボリューム/マテリ msgid "The selected object couldn't be split because it contains only one part." msgstr "選択したオブジェクトには、1つのパーツしか含まれていないため、分割できませんでした。" +#: src/slic3r/GUI/MainFrame.cpp:432 +msgid "" +"The selected project is no longer available.\n" +"Do you want to remove it from the recent projects list ?" +msgstr "" +"選択したプロジェクトは使用できなくなりました。\n" +"最近のプロジェクトリストから削除しますか?" + #: src/slic3r/GUI/MainFrame.cpp:422 msgid "The selected project is no more available" msgstr "選択したプロジェクトはもう利用できません" @@ -8040,6 +8086,10 @@ msgstr "このエクストルーダーの最小プリント可能なレイヤー msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed." msgstr "これは通常、無視できるほど少量の押出量またはモデルの欠陥が原因です。 ベッド上のモデルの修復または向きを再配置してみてください。" +#: src/libslic3r/GCode.cpp:639 +msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed." +msgstr "これは通常、無視できるほど少量の押出量またはモデルの欠陥が原因です。 ベッド上のモデルの修復または向きを再配置してみてください。" + #: src/libslic3r/PrintConfig.cpp:2215 msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools." msgstr "この行列は、任意のツールチェンジ間においてワイプタワーの新しいフィラメントをパージするために必要な体積(立方ミリメートル)を示しています。" @@ -8180,6 +8230,10 @@ msgstr "オブジェクト" msgid "To parts" msgstr "パーツへ" +#: src/slic3r/GUI/Tab.cpp:1756 +msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain." +msgstr "カスタムCAファイルを使用するには、CAファイルを証明書ストア/キーチェーンにインポートしてください。" + #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 #, c-format msgid "Toggle %c axis mirroring" diff --git a/resources/localization/pl/PrusaSlicer.mo b/resources/localization/pl/PrusaSlicer.mo index 6b70e132bdf3fa6a1e62ca448b43de17e860acc3..6b20f720251d226ccab343aafa076e44dcaaf69c 100644 GIT binary patch delta 45931 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

    >^q;bm>miF(Umnp|FUk_GKJOytC*c3D+!~qC; z5wrD}w{>V27MgJ0Qd}18r#BgVRSfnqv+Kc=;O2WGs!ns7i#0YoS^isi(fpx>}_zU3Y82lWM)|0vfPBOVzvBo0eOn5z*vmI}Y{)31R>RDh} zfnL{xcoC9i1Ia5GaH9nfkAMw<*O_H~S!!7VOGYwtoa$euZ`m+r^aXE+?v(st@MVgj z2ofMAAPTA|q62%xh|^=1I2rT~+ys1d%maKveie;fb@}kbjtiMSabj6cl4<*HeSW+|9h6LbGW9_IK`v`68% z^x)|G{|3cZG(LdP0%9?ut+=0hEV$Ti26|c0f;f;5kywCQY`(@E=H$b_1D+GA3$@pPZV>q*c30g%(huNcifxcyWN{Mj?=k9KTBc28BAnrj_#DXjIEZYtLJJlqz=zh&J;C9!;7ZWF-yTA;wdN?KcOU&I@ zMe`hqW#8z_)&TaDJPl7P_6+qv9ln;~VRTvapVub|!ugThqf5RgU!k*Bp<9fXGoze% zl3uOOs#;00jbbR|z2ufX6_Yn1{E$Zf80;$i2X#R{_)IwYTCaioIC&k%oX2<5dkhzw z26w3*xuAu9Gq#!LcAn^08p9w}l0OFVuX?2jzW`g0TlPE)j-WdP=UVU=$q$nEfG}1M z5$?lawQ{(TVT^NnoSp(_nGy6Ej$)^y)Tmp%X~u1JXHLE}F{Pl)RaoQ<7(TCI8h)4C zZI(qA-fo-NqRJbJihR=zixVt1gNDQO8U;?n?=~II!dO|RF-&I_``m>_AmsP^%7TX9 z=koH^`@BUwnK{#Rxy=H%Gc)l%pHblp8RaHhSy1Nm z_+~l{SJ0SV=JOcAVkeNpDJPZrO1L6mxLtvuF(k5Xhi&DJ;Vn(J@sU<1Y~Q7Xb32m$ zaK^T)XD1&o9!j@!deA5c1%p0swhm2qd}mp} zcOvB>~1WW7d$_=k+1R5U?`AZ{L zcG%69RsYxTYm^4->&i@{5`pP;IgOCV@vy&ewVY% zENQ4V8Xs?{c2s&@pu%FD;Zl%p^LDG%wk$I)$1Dw0@UD2x@WF!k>m%j6?MA2Y;l=jC zNbOO3Lq=qSJw7e>5nqAJSsFCtrV=MFWl5-Ur%}lEhLwJAMP}l?l@)yM92{$e0wHfh zb;FZJkID>Tc!J_A_=Z(D_8cDF#fRwIXexY+v53dq#B%|TlN$daUTljgKhIXvpb$(z{Z1tU zVad=MV_-)ccQHKi;TR9c+4LngeU*)GwDIkz4(vyD;Dk-TicyK*#c=ov)#3LTh58+5 zn`uB)Yiv|Q5~3c=h0s?;9gJ$&SX6m4(N#rD2>5Y} z&9DPi&{2$omoYv*M^zZGo$10zxEGILNgTGraq8nq48rte(sQ*?Q_=}Fg+ox~jNQrj zCnqq)-q>W_jT)*WHhv1@62FXU@C!_Z|DqOO;4bDFGhs5Uj481bssWR&t1vO~gQyX@ zvy1W9YJ5sUdi;u`Fx75T;2Knc=TQ~EMHS%NV-{snY(~5QX21og@{Xe#cGJcmV<7R* zm;e(pY?_K3E`jI-ir9oo_&f3Xm>IRiHDp;(`SPGzUJ~PBWmG|}upM^C*mw^$b?;FP zin!m5Xkt`)N~;@8Ko69+HbxCucWi>cq2}r}sv#dybNLgsIAa|!1qNa#pX204ofAtB zn*94vQ}rjRoR{dw_ecj_=QDw{B&0cHdQ#q6$J)}`4OQ_V%z{&}0Up5gnEbFAnbKI6 zcvVzK=Ajz81@-(P%#K&ErS^Y>BX+T1a&AmU4e>_QgS$~JKY<#`3)lu9qViQdYDTa& zYKq#U=DxpmBx<`&MvdTn9E;0!pZcAg$4pBLqbjJ0nxodJp&WpTa0Y6wH=-8dKFp0b zQTb#3X`WAufyDEo((9ng>4<9BD7=JI(49`8^>MSkexjdv+!Ll}2~k6q3bp$4SWDUT z+Ncp|hw6C`?1#fq4fdTh&n3a|#Iv9}kQ=pli=AZrvk|C6f`)pGbtZ-*z6>MdTGS%l zfvV^bdw zG^)UAm`1VoFT!o?+z^D2KJN3r4{c z7>HL<4fu>1@F(WS3};P6%~4a+-8$Sl9fL?;j!E$fM#uN4lQhgZGevG90vgKPsGhV# zW$1I$U}zC zr~;OwR_!I!{(Xiq(09?iOU6RQ6WDkLRKv5Po-2SF(aM+(dtywSZ|`qFb?692(Efkm z1vr^d+vEeP=h4|Cu`ws=fl{b#*8(-SgHdxk7ImgiM~&QiRKt&0Z(|(dA5i5*x@_Xf zFon1O3FyHZsJU;4v9LF44#%Q;vJ=&?`&bCWT`?zLacc)mOZs%w^LubHo2}rZ zg3xPxY9d|^-GT(h5zqrCP%XTTaq%6h=i#rLU6BSg0vS<5TGCn@M-y+06Y)J3z~MI> zrx6}N&Kf7hO*3-OF@f^kWc)REQE!)kb8`i^x*c7#& z{rAii#KdUC^P}dvjI|;9iFZSFtQV>y!!QEQcL}JV<){L-pcdC*RD;f-POiT&2|mL; z8165#$PS~1@)pj)52z`ebl?4CBI=H&O{Zs z19gC$Mm6|0Y8$?=>Hng79_5i~SPE4Be5ib7P`jlrs=OA+l(|kH0(x+nbr-7V=THSa zu<8HU^azj5u1Ji^R~A)Z15AotP$M=03*ijZ&|gO7zi;CoFs}B0z!Nh92~a0i5O&2f zs8zljtK%7rhpC>L3i6}ouo$Mma+n4?UUVY%P*1O7 zYJ7s>G0JnZCgPyxJ{78`A(#=XqZ;g@rerqi;8}qxcR$v^kQZizr(;#(tFaXRKzA&G zk}u8nxPWFW`1pKgjtABMpd{UHHFtu&%eT`nD&j?9l20ztN}*E zZWsm!yrG@y!4MLf;5>|sKW)ayZ_O0MMU6l@)W{UKmdEVGtD~lB1V+M{r~~MC)STZ% z?UKJSB}RT{$_skOIH|yLB&Z?PFfn$-b~py3`1sU|IzasYm|ao`H5J7%9oEJeI0#wQ z&Lm8QdoeQ4-^bm=U%xj~y!wNg!gDSGwfGxq^@jUs&hXS2fp|Ggj@2;(cE@NqA4731 z*1~tFwNvJkIlwxi;=iLh^e3tV53v#^`^+JSZbt&M2{im-PQov!x%-L9FzQ#+)6A%X zLag<13Gv>jd`Z8V-BA$35wC_?6LnE@-U;JlA5@1YVKJ@Kxdb!?cd-FJ!M<4HUsKS2 z)X*M7t&M9o{UK^3URb}P<~ZVaQ$b2=7S!{3QH!t)s)LQZ`^cNxN>!=}qf{8K84>JYP{*87;2`#&%_rg41U5SKvpxB+VQcf@!&7_;L{)Y>|Mu3C1HfHMAtvGF}7 z#0Wl9U`kX0`B5WL1yw+M)Rgo)$dOQ|2Qd6zVQB$-NW8xK5&!1uk3>Vhq?~dxoNYuzq zM~%z|mw+lbjOyV9RLh>A9(aeU*a_$JwoOD-58_x;U@zi9m>HL0YrKehu3&g$2~>p@ zQS~)Ntr52~0S)zFRL>`&dN>dB;s#XDo}t#jH&jDoMKDv4&RPUD6}3neRRuWDH3GFTGxa+y2xyT^Mh)3?)Pb}B_uz8WoVAGRbJB8_yQmRa z7R~1b;&xR0I;zJnP*e8}b>KvbZiYG#)qw1%@+x3_>UUZZP=&4%a3pGO7NAbF4X8D7 z9M!Xns5Nj0HDxbs`X|)T2gES<BTm zW14h-EHj5OQ4OzvD)=<2qD$Bk@1c5LDz>o!s@!gv6$fKK{3AB|UoFWJ$1J)W))H8W z^xBvfSD+p|iz?_R>g_dZTr(osQRxLy4JwNo!78X-(G=Cu38;}=j9SEN;R0lTN``b`!=m2UePGAMRgIfKW6PU%?8iR?i zb_sMR@Bjm_c0!-`*{&XLAU*;)0-WGPKIbm+LWwDuc+w<3=MnMjNqtTyjGxR5{YX4X z{54L*oymR9Q!E$gbBbfG6h7}Oqdu6QxO^Ac3W$=MPkaRTnZ`00GkB0O*Hmfq*&ronMDaDHI9jOO{KnY`WOI=2aE zyZk^cny8u0Hc5r4i5Ef5ZF5wvH?m6Ilm*=7Y$b6*3s{aT}T z)i4aFWjxO&EJ4lr9@PFkjao!cP;>m*#=m1e;?Y~ zYY`ufn!>+OBk%@Q&X*kQe^n5W)8~Cb5f^oahoX8~1~tbuQQK)Ws-StOAzY2x?SjAc!OA>E{O>vn`kI0hNnuuYI zi#li$p$aaADz}P_*GF}zrL`MQBR{{jn_hrSVx=QA9aAuz~tzzv>A@0=J+aV4xgab!au0F3dn2Xkx>sO zLRFX_b-xO#;JT<0XpdTqJ#Bhl)Cm8E+9eB+j=Rn-0;>2F>Z8*w>sQn&Pms^-iY!== zcqvrH!>n_x8?DDtpBL^~{rOEit+fp5y`w#P@Bb4C=%CqyS@1q;(ZncVOp9uHL2D&z zQ)>^@VjN{%Zar#!gc_MJ1x*Lzp++{B)cy~(30194P;=PXI@Y?(dH^?Z{}yVuOf2Mc z`rvfTfH4Z2-I5=*dn%%)VlZl?hoer+Y3QaPu$zF6)H|rT`H1RKtRkks>==c!yB=y} zT8Ef5Fc8xdpO5O{G1L@ZN0s*p)u8A_O}Y6{71uzmq5ehL|H?R*gh1SkneZ}}M_)0s z$}6H)aShZt&hj7pcsvr zajNxz^|du|3G+Z{)O$fa)O$sD9EjslBNDZw&->|DdQ=77P#T$HvKJVM}8BqsK6V&Q$gX&>#R6~ZLdN?075_?c1dBS?nrhmi| zr2ETw4R)O}1hg2MqxSbO)X*P5HRuZJNWO_0srxql6>4?=jru5-rmWBVfy6+}MSLS_ z&Yz&3e}y_}-=lUx*m7E=?7z4KG&EVTGFHL8xEM8eP0E{|^stV_Jftte!gvjHV*Co` zBUm}q0ksh|GRILBKR}iD9yM|iDl$dd|8WQ?Lpsz{W#gKJSOJZimxT12l=J@!>GBb65w zua8-A3aX+*sHwY*h449^!Sq#4#h*~+C9P(5LAGk_fAy#W37V_wsC`}+wTN1ydeQ?` z!C)Jof*RrlsFB!;D)@-?8fvk=Ky~OJ)M^i3-Sj*%s=UP2+5g&)Sx8XDWicPt#z35m z+69|X+v_ZJfyeFrtC*4a6V&suYMP!VKy@fHYUIjbb*zDE*ecXWZAR@T_ZR`K{tFn4 zA5lXaRLg9~5}1kj5L5%!p{8s%ro}^;8=qq!2G%we6h)ns)vXOs`CFnY9%tnDe+Z-_ z;dj)~oJ2kN0M&z+sPo}7>dhuW9kW}CqV88k72FVY;0#BVHwU#y52055S8R@fb$T8H=-$O0J*Qhy+*udW;uoTet8q$&GfEzeDYhOPu^P8-;G8`J}XF&vIYZKH{(eA7@v zxd_wo|D<7VLiwWnL20<8r8jr-9AT7B!@uQ5CzW z5gLYS_;?J#`Pc~WVpS~C(yW2WsD{q7u0&1o7F2mhT>|>FdJY(`zRlqh>L;gfH;4*3o-k};EzKvO=$xv%0AF3f^Q58-`jr2lf&AHA-0;5RSh1%!E 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 G^?w0kUNP4I diff --git a/resources/localization/pl/PrusaSlicer_pl.po b/resources/localization/pl/PrusaSlicer_pl.po index 7ad85d44cc..444993eefd 100644 --- a/resources/localization/pl/PrusaSlicer_pl.po +++ b/resources/localization/pl/PrusaSlicer_pl.po @@ -5,7 +5,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || n%10 == 1 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 12 && n%100 <= 14)) ? 2 : 3);\n" -"X-Generator: Poedit 2.2.1\n" +"X-Generator: Poedit 2.3\n" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" @@ -1032,7 +1032,7 @@ msgstr "Mosty objętościowe" #: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1117 msgid "Brim" -msgstr "Brim (obramowanie)" +msgstr "Brim" #: src/libslic3r/PrintConfig.cpp:244 msgid "Brim width" @@ -1561,6 +1561,10 @@ msgstr "Sześcienny" msgid "Current mode is %s" msgstr "Obecny tryb to %s" +#: src/slic3r/GUI/Tab.cpp:959 +msgid "Current preset is inherited from" +msgstr "Obecny zestaw ustawień jest dziedziczony z" + #: src/slic3r/GUI/Tab.cpp:957 msgid "Current preset is inherited from the default preset." msgstr "Obecny zestaw ustawień jest dziedziczony z zestawu domyślnego." @@ -2956,6 +2960,15 @@ msgstr "" "dla lewego przycisku: wskazuje na niesystemowy (lub inny niż domyślny) zestaw ustawień,\n" "dla prawego przycisku: wskazuje, że ustawienia nie zostały zmodyfikowane." +#. TRN Description for "WHITE BULLET" +#: src/slic3r/GUI/Tab.cpp:3267 +msgid "" +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." +msgstr "" +"dla lewego przycisku: wskazuje na niesystemowy (lub inny niż domyślny) zestaw ustawień,\n" +"dla prawego przycisku: wskazuje, że ustawienia nie zostały zmodyfikowane." + #: src/slic3r/GUI/ConfigManipulation.cpp:136 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers\n" @@ -3572,7 +3585,7 @@ msgid "" "indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n" "Click the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values." msgstr "" -"oznacza, że niektóre ustawienia zostały zmodyfikowane i nie odpowiadają wartościom systemowym (lub domyślnym) w obecnej grupie opcji. \n" +"oznacza, że niektóre ustawienia zostały zmodyfikowane i nie odpowiadają wartościom systemowym (lub domyślnym) w obecnej grupie opcji.\n" "Kliknij ikonę OTWARTEJ KŁÓDKI, aby zresetować wszystkie ustawienia obecnej grupy ustawień do wartości systemowych (lub domyślnych)." #. TRN Description for "LOCKED LOCK" @@ -4116,6 +4129,10 @@ msgstr "Max" msgid "Max bridge length" msgstr "Maksymalna długość mostu" +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Max bridges on a pillar" +msgstr "Maks. liczba mostków na słupku" + #: src/libslic3r/PrintConfig.cpp:2822 msgid "Max merge distance" msgstr "Maksymalny dystans łączenia" @@ -4284,6 +4301,10 @@ msgstr "Maksymalny jerk Y" msgid "Maximum jerk Z" msgstr "Maksymalny jerk Z" +#: src/libslic3r/PrintConfig.cpp:2660 +msgid "Maximum number of bridges that can be placed on a pillar. Bridges hold support point pinheads and connect to pillars as small branches." +msgstr "Maksymalna liczba mostków, która zostanie umieszczona na słupku podpory. Mostki wspierają łączniki podpór i łączą słupki podpór." + #: src/libslic3r/PrintConfig.cpp:598 msgid "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit." msgstr "Maksymalna prędkość objętościowa dla tego filamentu. Ogranicza maksymalną prędkość objętościową do minimum objętościowej prędkości druku i filamentu. Ustaw zero aby usunąć ograniczenie." @@ -4954,6 +4975,11 @@ msgstr "obecnego Modelu" msgid "Offset" msgstr "Offset" +#: src/slic3r/GUI/Tab.cpp:1755 +#, c-format +msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain." +msgstr "W tym systemie, %s używa certyfikatu HTTPS z magazynu systemowego (Certificate Store) lub Keychain." + #: src/slic3r/GUI/DoubleSlider.cpp:950 msgid "One layer mode" msgstr "Tryb jednej warstwy" @@ -6430,6 +6456,16 @@ msgstr "" "NIE, jeśli chcesz przełączyć zmiany narzędzi na zmiany koloru lub\n" "ANULUJ, aby pozostawić bez zmian." +#: src/slic3r/GUI/DoubleSlider.cpp:1917 +msgid "" +"Select YES if you want to delete all saved tool changes, \n" +"NO if you want all tool changes switch to color changes, \n" +"or CANCEL to leave it unchanged." +msgstr "" +"Wybierz TAK, jeśli chcesz usunąć wszystkie zapisane zmiany narzędzi,\n" +"NIE, jeśli chcesz przełączyć zmiany narzędzi na zmiany koloru lub\n" +"ANULUJ, aby pozostawić bez zmian." + #: src/slic3r/GUI/Selection.cpp:146 msgid "Selection-Add" msgstr "Zaznaczenie-Dodaj" @@ -7738,6 +7774,14 @@ msgstr "Wybrany model nie może być podzielony ponieważ składa się z więcej msgid "The selected object couldn't be split because it contains only one part." msgstr "Wybrany model nie może być rozdzielony ponieważ zawiera tylko jedną część." +#: src/slic3r/GUI/MainFrame.cpp:432 +msgid "" +"The selected project is no longer available.\n" +"Do you want to remove it from the recent projects list ?" +msgstr "" +"Wybrany obiekt nie jest już dostępny.\n" +"Czy chcesz usunąć go z listy niedawno używanych projektów?" + #: src/slic3r/GUI/MainFrame.cpp:422 msgid "The selected project is no more available" msgstr "Wybrany projekt nie jest dostępny" @@ -8083,6 +8127,10 @@ msgstr "To jest najniższa możliwa do wydrukowania wysokość warstwy dla tego msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed." msgstr "Dzieje się to zazwyczaj z powodu zbyt małych odcinków ekstruzji (są one pomijane) lub uszkodzenia modelu. Spróbuj naprawić model lub zmienić jego orientację na stole." +#: src/libslic3r/GCode.cpp:639 +msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed." +msgstr "Dzieje się to zazwyczaj z powodu zbyt małych odcinków ekstruzji (są one pomijane) lub uszkodzenia modelu. Spróbuj naprawić model lub zmienić jego orientację na stole." + #: src/libslic3r/PrintConfig.cpp:2215 msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools." msgstr "Ta formuła określa objętość (w milimetrach sześciennych) wymaganą do wyczyszczenia filamentu na wieży czyszczącej dla danej pary narzędzi (filamentów)." @@ -8224,6 +8272,10 @@ msgstr "Do modeli" msgid "To parts" msgstr "Na części" +#: src/slic3r/GUI/Tab.cpp:1756 +msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain." +msgstr "Aby użyć własnego certyfikatu, zaimportuj plik do Certificate Store / Keychain." + #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 #, c-format msgid "Toggle %c axis mirroring" From c5d2507dd4cd2779d833729640c23674bfdfccf2 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 7 Mar 2020 10:36:06 +0100 Subject: [PATCH 25/37] Bumped up version number. --- version.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.inc b/version.inc index 2e916f2610..2638989930 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.2.0-rc") +set(SLIC3R_VERSION "2.2.0-rc2") set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN") set(SLIC3R_RC_VERSION "2,2,0,0") set(SLIC3R_RC_VERSION_DOTS "2.2.0.0") From fb10e2777823f27af93bed162e9e8602a8aa6ab0 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Sat, 7 Mar 2020 11:39:36 +0100 Subject: [PATCH 26/37] Added missed lock_open_sys.svg icon for dark mode --- resources/icons/white/lock_open_sys.svg | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 resources/icons/white/lock_open_sys.svg diff --git a/resources/icons/white/lock_open_sys.svg b/resources/icons/white/lock_open_sys.svg new file mode 100644 index 0000000000..c1aa64aec2 --- /dev/null +++ b/resources/icons/white/lock_open_sys.svg @@ -0,0 +1,11 @@ + + + + + + + + From d4ac4df21cf03827e63c7a088c2036a36d1a663d Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 7 Mar 2020 12:24:40 +0100 Subject: [PATCH 27/37] Fixed crash on switching the application language. This crash was caused by the RemovableDriveManager and 3DConnexion detection services not being stopped correctly. The fix executes all the tasks of the MainFrame at the language switch, that are normally performed on application shut down. --- src/slic3r/GUI/GUI_App.cpp | 36 ++++--------- src/slic3r/GUI/MainFrame.cpp | 68 +++++++++++++----------- src/slic3r/GUI/MainFrame.hpp | 3 ++ src/slic3r/GUI/RemovableDriveManager.cpp | 1 + 4 files changed, 49 insertions(+), 59 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 40d818e930..47b49748d9 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -433,46 +433,30 @@ float GUI_App::toolbar_icon_scale(const bool is_limited/* = false*/) const void GUI_App::recreate_GUI() { - // Weird things happen as the Paint messages are floating around the windows being destructed. - // Avoid the Paint messages by hiding the main window. - // Also the application closes much faster without these unnecessary screen refreshes. - // In addition, there were some crashes due to the Paint events sent to already destructed windows. - mainframe->Show(false); + mainframe->shutdown(); const auto msg_name = _(L("Changing of an application language")) + dots; wxProgressDialog dlg(msg_name, msg_name); dlg.Pulse(); - - // to make sure nobody accesses data from the soon-to-be-destroyed widgets: - tabs_list.clear(); - plater_ = nullptr; - dlg.Update(10, _(L("Recreating")) + dots); - MainFrame* topwindow = mainframe; + MainFrame *old_main_frame = mainframe; mainframe = new MainFrame(); - sidebar().obj_list()->init_objects(); // propagate model objects to object list + // Propagate model objects to object list. + sidebar().obj_list()->init_objects(); + SetTopWindow(mainframe); - if (topwindow) { - SetTopWindow(mainframe); - - dlg.Update(30, _(L("Recreating")) + dots); - topwindow->Destroy(); - - // For this moment ConfigWizard is deleted, invalidate it - m_wizard = nullptr; - } + dlg.Update(30, _(L("Recreating")) + dots); + old_main_frame->Destroy(); + // For this moment ConfigWizard is deleted, invalidate it. + m_wizard = nullptr; dlg.Update(80, _(L("Loading of current presets")) + dots); - m_printhost_job_queue.reset(new PrintHostJobQueue(mainframe->printhost_queue_dlg())); - load_current_presets(); - mainframe->Show(true); dlg.Update(90, _(L("Loading of a mode view")) + dots); - /* Temporary workaround for the correct behavior of the Scrolled sidebar panel: * change min hight of object list to the normal min value (15 * wxGetApp().em_unit()) * after first whole Mainframe updating/layouting @@ -480,7 +464,6 @@ void GUI_App::recreate_GUI() const int list_min_height = 15 * em_unit(); if (obj_list()->GetMinSize().GetY() > list_min_height) obj_list()->SetMinSize(wxSize(-1, list_min_height)); - update_mode(); // #ys_FIXME_delete_after_testing Do we still need this ? @@ -575,7 +558,6 @@ void GUI_App::import_model(wxWindow *parent, wxArrayString& input_files) const bool GUI_App::switch_language() { if (select_language()) { - _3DScene::remove_all_canvases(); recreate_GUI(); return true; } else { diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 0d16231785..defd0b53af 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -109,38 +109,7 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S event.Veto(); return; } - - if (m_plater) - m_plater->stop_jobs(); - - // Weird things happen as the Paint messages are floating around the windows being destructed. - // Avoid the Paint messages by hiding the main window. - // Also the application closes much faster without these unnecessary screen refreshes. - // In addition, there were some crashes due to the Paint events sent to already destructed windows. - this->Show(false); - - // Stop the background thread (Windows and Linux). - // Disconnect from a 3DConnextion driver (OSX). - m_plater->get_mouse3d_controller().shutdown(); - // Store the device parameter database back to appconfig. - m_plater->get_mouse3d_controller().save_config(*wxGetApp().app_config); - - // Stop the background thread of the removable drive manager, so that no new updates will be sent to the Plater. - wxGetApp().removable_drive_manager()->shutdown(); - - // Save the slic3r.ini.Usually the ini file is saved from "on idle" callback, - // but in rare cases it may not have been called yet. - wxGetApp().app_config->save(); -// if (m_plater) -// m_plater->print = undef; - _3DScene::remove_all_canvases(); -// Slic3r::GUI::deregister_on_request_update_callback(); - - // set to null tabs and a plater - // to avoid any manipulations with them from App->wxEVT_IDLE after of the mainframe closing - wxGetApp().tabs_list.clear(); - wxGetApp().plater_ = nullptr; - + this->shutdown(); // propagate event event.Skip(); }); @@ -159,6 +128,41 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S m_plater->show_action_buttons(true); } +// Called when closing the application and when switching the application language. +void MainFrame::shutdown() +{ + if (m_plater) + m_plater->stop_jobs(); + + // Weird things happen as the Paint messages are floating around the windows being destructed. + // Avoid the Paint messages by hiding the main window. + // Also the application closes much faster without these unnecessary screen refreshes. + // In addition, there were some crashes due to the Paint events sent to already destructed windows. + this->Show(false); + + // Stop the background thread (Windows and Linux). + // Disconnect from a 3DConnextion driver (OSX). + m_plater->get_mouse3d_controller().shutdown(); + // Store the device parameter database back to appconfig. + m_plater->get_mouse3d_controller().save_config(*wxGetApp().app_config); + + // Stop the background thread of the removable drive manager, so that no new updates will be sent to the Plater. + wxGetApp().removable_drive_manager()->shutdown(); + + // Save the slic3r.ini.Usually the ini file is saved from "on idle" callback, + // but in rare cases it may not have been called yet. + wxGetApp().app_config->save(); +// if (m_plater) +// m_plater->print = undef; + _3DScene::remove_all_canvases(); +// Slic3r::GUI::deregister_on_request_update_callback(); + + // set to null tabs and a plater + // to avoid any manipulations with them from App->wxEVT_IDLE after of the mainframe closing + wxGetApp().tabs_list.clear(); + wxGetApp().plater_ = nullptr; +} + void MainFrame::update_title() { wxString title = wxEmptyString; diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 20e18fc53f..2ccd77666e 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -100,6 +100,9 @@ public: MainFrame(); ~MainFrame() = default; + // Called when closing the application and when switching the application language. + void shutdown(); + Plater* plater() { return m_plater; } void update_title(); diff --git a/src/slic3r/GUI/RemovableDriveManager.cpp b/src/slic3r/GUI/RemovableDriveManager.cpp index a363d8ae8f..2264cc954e 100644 --- a/src/slic3r/GUI/RemovableDriveManager.cpp +++ b/src/slic3r/GUI/RemovableDriveManager.cpp @@ -434,6 +434,7 @@ void RemovableDriveManager::shutdown() #endif m_initialized = false; + m_callback_evt_handler = nullptr; } bool RemovableDriveManager::set_and_verify_last_save_path(const std::string &path) From 93f2be7ac426c5acbaf7b30c1149d222b02ff58a Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 7 Mar 2020 14:21:05 +0100 Subject: [PATCH 28/37] Fixed localization of "Save preset as" dialog message. --- src/slic3r/GUI/Tab.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 8e49b3ad45..9a6313e707 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3476,7 +3476,7 @@ ConfigOptionsGroupShp Page::new_optgroup(const wxString& title, int noncommon_la void SavePresetWindow::build(const wxString& title, const std::string& default_name, std::vector &values) { // TRN Preset - auto text = new wxStaticText(this, wxID_ANY, from_u8((boost::format(_utf8(L("Save %s as:"))) % title).str()), + auto text = new wxStaticText(this, wxID_ANY, from_u8((boost::format(_utf8(L("Save %s as:"))) % into_u8(title)).str()), wxDefaultPosition, wxDefaultSize); m_combo = new wxComboBox(this, wxID_ANY, from_u8(default_name), wxDefaultPosition, wxDefaultSize, 0, 0, wxTE_PROCESS_ENTER); From 76fecc91a5465d1167a1e105876f473e2bf449dd Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 7 Mar 2020 16:31:14 +0100 Subject: [PATCH 29/37] Improved error reporting and error handling when loading vendor config bundles into installation wizard. --- src/slic3r/GUI/ConfigWizard.cpp | 39 +++++++++++++++++-------- src/slic3r/GUI/ConfigWizard_private.hpp | 11 ++++--- src/slic3r/GUI/PresetBundle.cpp | 12 ++++++-- 3 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index 9d241b0daf..e66922630d 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -42,16 +42,27 @@ using Config::SnapshotDB; // Configuration data structures extensions needed for the wizard -Bundle::Bundle(fs::path source_path, bool is_in_resources, bool is_prusa_bundle) - : preset_bundle(new PresetBundle) - , vendor_profile(nullptr) - , is_in_resources(is_in_resources) - , is_prusa_bundle(is_prusa_bundle) +bool Bundle::load(fs::path source_path, bool ais_in_resources, bool ais_prusa_bundle) { - preset_bundle->load_configbundle(source_path.string(), PresetBundle::LOAD_CFGBNDLE_SYSTEM); + this->preset_bundle = std::make_unique(); + this->is_in_resources = ais_in_resources; + this->is_prusa_bundle = ais_prusa_bundle; + + std::string path_string = source_path.string(); + size_t presets_loaded = preset_bundle->load_configbundle(path_string, PresetBundle::LOAD_CFGBNDLE_SYSTEM); auto first_vendor = preset_bundle->vendors.begin(); - wxCHECK_RET(first_vendor != preset_bundle->vendors.end(), "Failed to load preset bundle"); - vendor_profile = &first_vendor->second; + if (first_vendor == preset_bundle->vendors.end()) { + BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: No vendor information defined, cannot install.") % path_string; + return false; + } + if (presets_loaded == 0) { + BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: No profile loaded.") % path_string; + return false; + } + + BOOST_LOG_TRIVIAL(trace) << boost::format("Vendor bundle: `%1%`: %2% profiles loaded.") % path_string % presets_loaded; + this->vendor_profile = &first_vendor->second; + return true; } Bundle::Bundle(Bundle &&other) @@ -76,8 +87,11 @@ BundleMap BundleMap::load() prusa_bundle_path = (rsrc_vendor_dir / PresetBundle::PRUSA_BUNDLE).replace_extension(".ini"); prusa_bundle_rsrc = true; } - Bundle prusa_bundle(std::move(prusa_bundle_path), prusa_bundle_rsrc, true); - res.emplace(PresetBundle::PRUSA_BUNDLE, std::move(prusa_bundle)); + { + Bundle prusa_bundle; + if (prusa_bundle.load(std::move(prusa_bundle_path), prusa_bundle_rsrc, true)) + res.emplace(PresetBundle::PRUSA_BUNDLE, std::move(prusa_bundle)); + } // Load the other bundles in the datadir/vendor directory // and then additionally from resources/profiles. @@ -90,8 +104,9 @@ BundleMap BundleMap::load() // Don't load this bundle if we've already loaded it. if (res.find(id) != res.end()) { continue; } - Bundle bundle(dir_entry.path(), is_in_resources); - res.emplace(std::move(id), std::move(bundle)); + Bundle bundle; + if (bundle.load(dir_entry.path(), is_in_resources)) + res.emplace(std::move(id), std::move(bundle)); } } diff --git a/src/slic3r/GUI/ConfigWizard_private.hpp b/src/slic3r/GUI/ConfigWizard_private.hpp index 1d4b642212..64081153d1 100644 --- a/src/slic3r/GUI/ConfigWizard_private.hpp +++ b/src/slic3r/GUI/ConfigWizard_private.hpp @@ -100,13 +100,16 @@ struct Materials struct Bundle { std::unique_ptr preset_bundle; - VendorProfile *vendor_profile; - const bool is_in_resources; - const bool is_prusa_bundle; + VendorProfile *vendor_profile { nullptr }; + bool is_in_resources { false }; + bool is_prusa_bundle { false }; - Bundle(fs::path source_path, bool is_in_resources, bool is_prusa_bundle = false); + Bundle() = default; Bundle(Bundle &&other); + // Returns false if not loaded. Reason for that is logged as boost::log error. + bool load(fs::path source_path, bool is_in_resources, bool is_prusa_bundle = false); + const std::string& vendor_id() const { return vendor_profile->id; } }; diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index 3aa947f1b2..2b5c062e63 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -703,7 +703,10 @@ void PresetBundle::load_config_file(const std::string &path) boost::nowide::ifstream ifs(path); boost::property_tree::read_ini(ifs, tree); } catch (const std::ifstream::failure &err) { - throw std::runtime_error(std::string("The config file cannot be loaded: ") + path + "\n\tReason: " + err.what()); + throw std::runtime_error(std::string("The Config Bundle cannot be loaded: ") + path + "\n\tReason: " + err.what()); + } catch (const boost::property_tree::file_parser_error &err) { + throw std::runtime_error((boost::format("Failed loading the Config Bundle \"%1%\": %2% at line %3%") + % err.filename() % err.message() % err.line()).str()); } catch (const std::runtime_error &err) { throw std::runtime_error(std::string("Failed loading the preset file: ") + path + "\n\tReason: " + err.what()); } @@ -1109,8 +1112,13 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla const VendorProfile *vendor_profile = nullptr; if (flags & (LOAD_CFGBNDLE_SYSTEM | LOAD_CFGBUNDLE_VENDOR_ONLY)) { auto vp = VendorProfile::from_ini(tree, path); - if (vp.num_variants() == 0) + if (vp.models.size() == 0) { + BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: No printer model defined.") % path; return 0; + } else if (vp.num_variants() == 0) { + BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: No printer variant defined") % path; + return 0; + } vendor_profile = &this->vendors.insert({vp.id, vp}).first->second; } From cbf5459f5d2b5ee976cbe32e5af5e8fec77a945e Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 7 Mar 2020 16:31:46 +0100 Subject: [PATCH 30/37] Initial Lutzbot printer definition by Mikolas Zuza --- resources/profiles/Lulzbot.ini | 380 +++++++++++++++++++++++++++++++++ 1 file changed, 380 insertions(+) create mode 100644 resources/profiles/Lulzbot.ini diff --git a/resources/profiles/Lulzbot.ini b/resources/profiles/Lulzbot.ini new file mode 100644 index 0000000000..05f9a406f7 --- /dev/null +++ b/resources/profiles/Lulzbot.ini @@ -0,0 +1,380 @@ +# generated by PrusaSlicer 2.1.1+win64 on 2020-02-25 at 01:51:21 UTC + +[vendor] +# Vendor name will be shown by the Config Wizard. +name = Lulzbot +config_version = 0.0.1 +config_update_url = + +[printer_model:Mini Aero 0.5mm] +#bed_custom_model = C:\\Users\\r9staff\\Desktop\\PrusaSlicer 2.1.0\\PrinterBeds\\lulzbot_mini.stl +bed_custom_texture = +bed_shape = 0x0,154x0,154x154,0x154 +before_layer_gcode = +between_objects_gcode = +cooling_tube_length = 5 +cooling_tube_retraction = 91.5 +default_filament_profile = "" +default_print_profile = +deretract_speed = 20 +end_gcode = M400 ; wait for moves to finish\nM140 S40 ; start bed cooling\nM104 S0 ; disable hotend\nM107 ; disable fans\nG92 E1 ; set extruder to 1mm for retract on print end (LulzBot Cura had 5mm, might be a contributing factor to between print Aerostruder jamming)\nM117 Cooling please wait ; progress indicator message on LCD\nG1 X5 Y5 Z158 E0 F10000 ; move to cooling position\nG1 E1 ; re-prime extruder\nM190 R40 ; wait for bed to cool down to removal temp\nM77 ; Stop GLCD Timer\nG1 X145 F1000 ; move extruder out of the way\nG1 Y175 F1000 ; present finished print\nM140 S0; cool downs\nM84 ; disable steppers\nG90 ; absolute positioning\nM117 Print Complete. ; print complete message\n +extra_loading_move = -2 +extruder_colour = "" +extruder_offset = 0x0 +gcode_flavor = marlin +high_current_on_filament_swap = 0 +host_type = octoprint +inherits = +layer_gcode = +machine_max_acceleration_e = 10000,5000 +machine_max_acceleration_extruding = 1500,1250 +machine_max_acceleration_retracting = 1500,1250 +machine_max_acceleration_x = 9000,1000 +machine_max_acceleration_y = 9000,1000 +machine_max_acceleration_z = 100,200 +machine_max_feedrate_e = 40,120 +machine_max_feedrate_x = 800,200 +machine_max_feedrate_y = 800,200 +machine_max_feedrate_z = 8,12 +machine_max_jerk_e = 2.5,2.5 +machine_max_jerk_x = 20,10 +machine_max_jerk_y = 20,10 +machine_max_jerk_z = 0.2,0.4 +machine_min_extruding_rate = 0,0 +machine_min_travel_rate = 0,0 +max_layer_height = 0 +max_print_height = 158 +min_layer_height = 0.07 +nozzle_diameter = 0.5 +parking_pos_retraction = 92 +print_host = +printer_model = +printer_notes = LulzBot Mini w/ Aerostruder profile for Delaware Library System, Rt9 Library and Innovation Center. +printer_settings_id = +printer_technology = FFF +printer_variant = +printer_vendor = +printhost_apikey = +printhost_cafile = +remaining_times = 0 +retract_before_travel = 2 +retract_before_wipe = 0% +retract_layer_change = 1 +retract_length = 1 +retract_length_toolchange = 10 +retract_lift = 0 +retract_lift_above = 0 +retract_lift_below = 0 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 40 +serial_port = +serial_speed = 250000 +silent_mode = 0 +single_extruder_multi_material = 0 +start_gcode = ;This G-Code has been generated specifically for the LulzBot Mini with Aerosturder\nM73 P0 ; clear GLCD progress bar\nM75 ; start GLCD timer\nG26 ; clear potential 'probe fail' condition\nM107 ; disable fans\nM420 S0 ; disable leveling matrix\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nG92 E0 ; set extruder position to 0\nM140 S{first_layer_bed_temperature[0]} ; start bed heating up\nG28; home all axes\nG0 X0 Y187 Z156 F200 ; move away from endstops\nM109 R{first_layer_temperature[0] - 60} ; soften filament before retraction\n;G1 E-15 F75 ; retract filament (LulzBot Cura is apparently trying to cold pull, might be a contributing factor to hob gear filling with filament)\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach wiping temp\nG1 X45 Y173 F11520 ; move above wiper pad\nG1 Z0 F1200 ; push nozzle into wiper\nG1 X42 Y173 Z-.5 F4000 ; wiping\nG1 X52 Y171 Z-.5 F4000 ; wiping\nG1 X42 Y173 Z0 F4000 ; wiping\nG1 X52 Y171 F4000 ; wiping\nG1 X42 Y173 F4000 ; wiping\nG1 X52 Y171 F4000 ; wiping\nG1 X42 Y173 F4000 ; wiping\nG1 X52 Y171 F4000 ; wiping\nG1 X57 Y173 F4000 ; wiping\nG1 X77 Y171 F4000 ; wiping\nG1 X57 Y173 F4000 ; wiping\nG1 X77 Y171 F4000 ; wiping\nG1 X57 Y173 F4000 ; wiping\nG1 X87 Y171 F4000 ; wiping\nG1 X77 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X77 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X77 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X107 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X107 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X107 Y173 F4000 ; wiping\nG1 X112 Y171 Z-0.5 F1000 ; wiping\nG1 Z10 ; raise extruder\nG28 X0 Y0 ; home X and Y\nG0 X0 Y187 F200 ; move away from endstops\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach probe temp\nM204 S300 ; set probing acceleration\nG29 ; start auto-leveling sequence\nM420 S1 ; enable leveling matrix\nM425 Z ; use measured Z backlash for compensation\nM425 Z F0 ; turn off measured Z backlash compensation. (if activated in the quality settings, this command will automatically be ignored)\nM204 S2000 ; restore standard acceleration\nG28 X0 Y0 ; re-home to account for build variance of earlier mini builds\nG0 X0 Y187 F200 ; move away from endstops\nG0 Y152 F4000 ; move in front of wiper pad\nG4 S1 ; pause\nM400 ; wait for moves to finish\nM117 Heating... ; progress indicator message on LCD\nM109 R{first_layer_temperature[0]} ; wait for extruder to reach printing temp\nM190 R{first_layer_bed_temperature[0]} ; wait for bed to reach printing temp\nG1 Z2 E0 F75 ; prime tiny bit of filament into the nozzle\nM117 Mini Printing... ; progress indicator message on LCD\nM221 S74 ; Printer specific extrusion modifier. +thumbnails = +toolchange_gcode = +use_firmware_retraction = 0 +use_relative_e_distances = 0 +use_volumetric_e = 0 +variable_layer_height = 1 +wipe = 1 +z_offset = 0 + +[printer_model:Taz6 Aero 0.5mm] +#bed_custom_model = C:\\Program Files (x86)\\cura-lulzbot 3.6\\resources\\meshes\\lulzbot_taz6.stl +bed_custom_texture = +bed_shape = 0x0,280x0,280x280,0x280 +before_layer_gcode = +between_objects_gcode = +cooling_tube_length = 5 +cooling_tube_retraction = 91.5 +default_filament_profile = "" +default_print_profile = +deretract_speed = 20 +end_gcode = M400 ; wait for moves to finish\nM140 S40 ; start bed cooling\nM104 S0 ; disable hotend\nM107 ; disable fans\nG91 ; relative positioning\nG1 E-1 F300 ; filament retraction to release pressure\nG1 Z20 E-5 X-20 Y-20 F3000 ; lift up and retract even more filament\nG1 E6 ; re-prime extruder\nM117 Cooling please wait ; progress indicator message on LCD\nG90 ; absolute positioning\nG1 Y0 F3000 ; move to cooling position\nM190 R40 ; wait for bed to cool down to removal temp\nG1 Y280 F3000 ; present finished print\nM140 S0; cool downs\nM77 ; stop GLCD timer\nM84 ; disable steppers\nG90 ; absolute positioning\nM117 Print Complete. ; print complete message\n +extra_loading_move = -2 +extruder_colour = "" +extruder_offset = 0x0 +gcode_flavor = marlin +high_current_on_filament_swap = 0 +host_type = octoprint +inherits = +layer_gcode = +machine_max_acceleration_e = 1000,5000 +machine_max_acceleration_extruding = 1000,1250 +machine_max_acceleration_retracting = 1000,1250 +machine_max_acceleration_x = 9000,1000 +machine_max_acceleration_y = 9000,1000 +machine_max_acceleration_z = 100,200 +machine_max_feedrate_e = 40,120 +machine_max_feedrate_x = 800,200 +machine_max_feedrate_y = 800,200 +machine_max_feedrate_z = 3,12 +machine_max_jerk_e = 2.5,2.5 +machine_max_jerk_x = 12,10 +machine_max_jerk_y = 12,10 +machine_max_jerk_z = 0.2,0.4 +machine_min_extruding_rate = 0,0 +machine_min_travel_rate = 0,0 +max_layer_height = 0 +max_print_height = 250 +min_layer_height = 0.07 +nozzle_diameter = 0.5 +parking_pos_retraction = 92 +print_host = +printer_model = +printer_notes = LulzBot Taz 6 w/ Aerostruder profile for Delaware Library System, Rt9 Library and Innovation Center. +printer_settings_id = +printer_technology = FFF +printer_variant = +printer_vendor = +printhost_apikey = +printhost_cafile = +remaining_times = 0 +retract_before_travel = 2 +retract_before_wipe = 0% +retract_layer_change = 0 +retract_length = 2 +retract_length_toolchange = 10 +retract_lift = 0 +retract_lift_above = 0 +retract_lift_below = 0 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 40 +serial_port = +serial_speed = 250000 +silent_mode = 0 +single_extruder_multi_material = 0 +start_gcode = ;This G-Code has been generated specifically for the LulzBot TAZ 6 with Aerosturder\nM73 P0 ; clear GLCD progress bar\nM75 ; start GLCD timer\nG26 ; clear potential 'probe fail' condition\nM107 ; disable fans\nM420 S0 ; disable leveling matrix\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nG92 E0 ; set extruder position to 0\nM140 S{first_layer_bed_temperature[0]} ; start bed heating up\nG28 XY ; home X and Y\nG1 X-19 Y258 F1000 ; move to safe homing position\nM109 R{first_layer_temperature[0] - 60} ; soften filament before homing Z\nG28 Z ; home Z\nG1 E-15 F100 ; retract filament\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach wiping temp\nG1 X-15 Y100 F3000 ; move above wiper pad\nG1 Z1 ; push nozzle into wiper\nG1 X-17 Y95 F1000 ; slow wipe\nG1 X-17 Y90 F1000 ; slow wipe\nG1 X-17 Y85 F1000 ; slow wipe\nG1 X-15 Y90 F1000 ; slow wipe\nG1 X-17 Y80 F1000 ; slow wipe\nG1 X-15 Y95 F1000 ; slow wipe\nG1 X-17 Y75 F2000 ; fast wipe\nG1 X-15 Y65 F2000 ; fast wipe\nG1 X-17 Y70 F2000 ; fast wipe\nG1 X-15 Y60 F2000 ; fast wipe\nG1 X-17 Y55 F2000 ; fast wipe\nG1 X-15 Y50 F2000 ; fast wipe\nG1 X-17 Y40 F2000 ; fast wipe\nG1 X-15 Y45 F2000 ; fast wipe\nG1 X-17 Y35 F2000 ; fast wipe\nG1 X-15 Y40 F2000 ; fast wipe\nG1 X-17 Y70 F2000 ; fast wipe\nG1 X-15 Y30 Z2 F2000 ; fast wipe\nG1 X-17 Y35 F2000 ; fast wipe\nG1 X-15 Y25 F2000 ; fast wipe\nG1 X-17 Y30 F2000 ; fast wipe\nG1 X-15 Y25 Z1.5 F1000 ; slow wipe\nG1 X-17 Y23 F1000 ; slow wipe\nG1 Z10 ; raise extruder\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach probe temp\nG1 X-9 Y-9 ; move above first probe point\nM204 S100 ; set probing acceleration\nG29 ; start auto-leveling sequence\nM420 S1 ; enable leveling matrix\nM425 Z ; use measured Z backlash for compensation\nM425 Z F0 ; turn off measured Z backlash compensation. (if activated in the quality settings, this command will automatically be ignored)\nM204 S500 ; restore standard acceleration\nG1 X0 Y0 Z15 F5000 ; move up off last probe point\nG4 S1 ; pause\nM400 ; wait for moves to finish\nM117 Heating... ; progress indicator message on LCD\nM109 R{first_layer_temperature[0]} ; wait for extruder to reach printing temp\nM190 R{first_layer_bed_temperature[0]} ; wait for bed to reach printing temp\nG1 Z2 E0 F75 ; prime tiny bit of filament into the nozzle\nM117 TAZ 6 Printing... ; progress indicator message on LCD\n +thumbnails = +toolchange_gcode = +use_firmware_retraction = 0 +use_relative_e_distances = 0 +use_volumetric_e = 0 +variable_layer_height = 1 +wipe = 1 +z_offset = 0 + +[print:0.3mm @luzbot] +avoid_crossing_perimeters = 0 +bottom_fill_pattern = rectilinear +bottom_solid_layers = 3 +bridge_acceleration = 500 +bridge_angle = 0 +bridge_flow_ratio = 1 +bridge_speed = 30 +brim_width = 0 +clip_multipart_objects = 0 +compatible_printers = +compatible_printers_condition = +complete_objects = 0 +default_acceleration = 500 +dont_support_bridges = 1 +elefant_foot_compensation = 0 +ensure_vertical_shell_thickness = 0 +external_perimeter_extrusion_width = 0.56 +external_perimeter_speed = 50% +external_perimeters_first = 0 +extra_perimeters = 1 +extruder_clearance_height = 20 +extruder_clearance_radius = 20 +extrusion_width = 0.56 +fill_angle = 45 +fill_density = 20% +fill_pattern = gyroid +first_layer_acceleration = 500 +first_layer_extrusion_width = 0.6 +first_layer_height = 100% +first_layer_speed = 40% +gap_fill_speed = 20 +gcode_comments = 0 +gcode_label_objects = 0 +infill_acceleration = 500 +infill_every_layers = 1 +infill_extruder = 1 +infill_extrusion_width = 0.56 +infill_first = 0 +infill_only_where_needed = 0 +infill_overlap = 25% +infill_speed = 60 +inherits = +interface_shells = 0 +layer_height = 0.3 +max_print_speed = 80 +max_volumetric_speed = 0 +min_skirt_length = 0 +notes = +only_retract_when_crossing_perimeters = 1 +ooze_prevention = 0 +output_filename_format = [printer_settings_id]_[input_filename_base]_[layer_height]_[filament_type]_[print_time].gcode +overhangs = 1 +perimeter_acceleration = 500 +perimeter_extruder = 1 +perimeter_extrusion_width = 0.56 +perimeter_speed = 60 +perimeters = 3 +post_process = +print_settings_id = +raft_layers = 0 +resolution = 0 +seam_position = nearest +single_extruder_multi_material_priming = 1 +skirt_distance = 3 +skirt_height = 1 +skirts = 3 +slice_closing_radius = 0.049 +small_perimeter_speed = 15 +solid_infill_below_area = 70 +solid_infill_every_layers = 0 +solid_infill_extruder = 1 +solid_infill_extrusion_width = 0.56 +solid_infill_speed = 60 +spiral_vase = 0 +standby_temperature_delta = -5 +support_material = 0 +support_material_angle = 0 +support_material_auto = 1 +support_material_buildplate_only = 0 +support_material_contact_distance = 0.2 +support_material_enforce_layers = 0 +support_material_extruder = 1 +support_material_extrusion_width = 0.44 +support_material_interface_contact_loops = 0 +support_material_interface_extruder = 1 +support_material_interface_layers = 3 +support_material_interface_spacing = 0 +support_material_interface_speed = 100% +support_material_pattern = rectilinear +support_material_spacing = 2.5 +support_material_speed = 60 +support_material_synchronize_layers = 0 +support_material_threshold = 0 +support_material_with_sheath = 1 +support_material_xy_spacing = 50% +thin_walls = 1 +threads = 12 +top_fill_pattern = rectilinear +top_infill_extrusion_width = 0.52 +top_solid_infill_speed = 40 +top_solid_layers = 3 +travel_speed = 175 +wipe_tower = 0 +wipe_tower_bridging = 10 +wipe_tower_rotation_angle = 0 +wipe_tower_width = 60 +wipe_tower_x = 180 +wipe_tower_y = 140 +xy_size_compensation = 0 + +[filament:ColorFabb PLA_PHA @luzbot] +bed_temperature = 60 +bridge_fan_speed = 100 +compatible_printers = +compatible_printers_condition = +compatible_prints = +compatible_prints_condition = +cooling = 1 +disable_fan_first_layers = 3 +end_filament_gcode = "; Filament-specific end gcode \n;END gcode for filament\n" +extrusion_multiplier = 1 +fan_always_on = 0 +fan_below_layer_time = 60 +filament_colour = #29B2B2 +filament_cooling_final_speed = 3.4 +filament_cooling_initial_speed = 2.2 +filament_cooling_moves = 4 +filament_cost = 0 +filament_density = 1.25 +filament_deretract_speed = nil +filament_diameter = 2.85 +filament_load_time = 0 +filament_loading_speed = 28 +filament_loading_speed_start = 3 +filament_max_volumetric_speed = 0 +filament_minimal_purge_on_wipe_tower = 15 +filament_notes = "" +filament_ramming_parameters = "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" +filament_retract_before_travel = nil +filament_retract_before_wipe = nil +filament_retract_layer_change = nil +filament_retract_length = nil +filament_retract_lift = nil +filament_retract_lift_above = nil +filament_retract_lift_below = nil +filament_retract_restart_extra = nil +filament_retract_speed = nil +filament_settings_id = "" +filament_soluble = 0 +filament_toolchange_delay = 0 +filament_type = PLA +filament_unload_time = 0 +filament_unloading_speed = 90 +filament_unloading_speed_start = 100 +filament_wipe = nil +first_layer_bed_temperature = 60 +first_layer_temperature = 200 +inherits = +max_fan_speed = 100 +min_fan_speed = 35 +min_print_speed = 10 +slowdown_below_layer_time = 5 +start_filament_gcode = "; Filament gcode\n" +temperature = 200 + +[filament:PrintedSolid Jesse PLA @luzbot] +bed_temperature = 60 +bridge_fan_speed = 100 +compatible_printers = +compatible_printers_condition = +compatible_prints = +compatible_prints_condition = +cooling = 1 +disable_fan_first_layers = 3 +end_filament_gcode = "; Filament-specific end gcode \n;END gcode for filament\n" +extrusion_multiplier = 1 +fan_always_on = 0 +fan_below_layer_time = 60 +filament_colour = #29B2B2 +filament_cooling_final_speed = 3.4 +filament_cooling_initial_speed = 2.2 +filament_cooling_moves = 4 +filament_cost = 27 +filament_density = 1.25 +filament_deretract_speed = nil +filament_diameter = 2.85 +filament_load_time = 0 +filament_loading_speed = 28 +filament_loading_speed_start = 3 +filament_max_volumetric_speed = 0 +filament_minimal_purge_on_wipe_tower = 15 +filament_notes = "" +filament_ramming_parameters = "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" +filament_retract_before_travel = nil +filament_retract_before_wipe = nil +filament_retract_layer_change = nil +filament_retract_length = nil +filament_retract_lift = nil +filament_retract_lift_above = nil +filament_retract_lift_below = nil +filament_retract_restart_extra = nil +filament_retract_speed = nil +filament_settings_id = "" +filament_soluble = 0 +filament_toolchange_delay = 0 +filament_type = PLA +filament_unload_time = 0 +filament_unloading_speed = 90 +filament_unloading_speed_start = 100 +filament_wipe = nil +first_layer_bed_temperature = 60 +first_layer_temperature = 220 +inherits = +max_fan_speed = 100 +min_fan_speed = 35 +min_print_speed = 10 +slowdown_below_layer_time = 5 +start_filament_gcode = "; Filament gcode\n" +temperature = 220 From 6723b5f3cd2dd164971594d249682a3a11b8925a Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 7 Mar 2020 16:33:03 +0100 Subject: [PATCH 31/37] Vojtech's adjustments to Lutzbot config, now it installs. --- resources/profiles/Lulzbot.ini | 318 +++++++++++++++++---------------- 1 file changed, 161 insertions(+), 157 deletions(-) diff --git a/resources/profiles/Lulzbot.ini b/resources/profiles/Lulzbot.ini index 05f9a406f7..721a9250ab 100644 --- a/resources/profiles/Lulzbot.ini +++ b/resources/profiles/Lulzbot.ini @@ -4,161 +4,23 @@ # Vendor name will be shown by the Config Wizard. name = Lulzbot config_version = 0.0.1 -config_update_url = +config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Lulzbot/ -[printer_model:Mini Aero 0.5mm] -#bed_custom_model = C:\\Users\\r9staff\\Desktop\\PrusaSlicer 2.1.0\\PrinterBeds\\lulzbot_mini.stl -bed_custom_texture = -bed_shape = 0x0,154x0,154x154,0x154 -before_layer_gcode = -between_objects_gcode = -cooling_tube_length = 5 -cooling_tube_retraction = 91.5 -default_filament_profile = "" -default_print_profile = -deretract_speed = 20 -end_gcode = M400 ; wait for moves to finish\nM140 S40 ; start bed cooling\nM104 S0 ; disable hotend\nM107 ; disable fans\nG92 E1 ; set extruder to 1mm for retract on print end (LulzBot Cura had 5mm, might be a contributing factor to between print Aerostruder jamming)\nM117 Cooling please wait ; progress indicator message on LCD\nG1 X5 Y5 Z158 E0 F10000 ; move to cooling position\nG1 E1 ; re-prime extruder\nM190 R40 ; wait for bed to cool down to removal temp\nM77 ; Stop GLCD Timer\nG1 X145 F1000 ; move extruder out of the way\nG1 Y175 F1000 ; present finished print\nM140 S0; cool downs\nM84 ; disable steppers\nG90 ; absolute positioning\nM117 Print Complete. ; print complete message\n -extra_loading_move = -2 -extruder_colour = "" -extruder_offset = 0x0 -gcode_flavor = marlin -high_current_on_filament_swap = 0 -host_type = octoprint -inherits = -layer_gcode = -machine_max_acceleration_e = 10000,5000 -machine_max_acceleration_extruding = 1500,1250 -machine_max_acceleration_retracting = 1500,1250 -machine_max_acceleration_x = 9000,1000 -machine_max_acceleration_y = 9000,1000 -machine_max_acceleration_z = 100,200 -machine_max_feedrate_e = 40,120 -machine_max_feedrate_x = 800,200 -machine_max_feedrate_y = 800,200 -machine_max_feedrate_z = 8,12 -machine_max_jerk_e = 2.5,2.5 -machine_max_jerk_x = 20,10 -machine_max_jerk_y = 20,10 -machine_max_jerk_z = 0.2,0.4 -machine_min_extruding_rate = 0,0 -machine_min_travel_rate = 0,0 -max_layer_height = 0 -max_print_height = 158 -min_layer_height = 0.07 -nozzle_diameter = 0.5 -parking_pos_retraction = 92 -print_host = -printer_model = -printer_notes = LulzBot Mini w/ Aerostruder profile for Delaware Library System, Rt9 Library and Innovation Center. -printer_settings_id = -printer_technology = FFF -printer_variant = -printer_vendor = -printhost_apikey = -printhost_cafile = -remaining_times = 0 -retract_before_travel = 2 -retract_before_wipe = 0% -retract_layer_change = 1 -retract_length = 1 -retract_length_toolchange = 10 -retract_lift = 0 -retract_lift_above = 0 -retract_lift_below = 0 -retract_restart_extra = 0 -retract_restart_extra_toolchange = 0 -retract_speed = 40 -serial_port = -serial_speed = 250000 -silent_mode = 0 -single_extruder_multi_material = 0 -start_gcode = ;This G-Code has been generated specifically for the LulzBot Mini with Aerosturder\nM73 P0 ; clear GLCD progress bar\nM75 ; start GLCD timer\nG26 ; clear potential 'probe fail' condition\nM107 ; disable fans\nM420 S0 ; disable leveling matrix\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nG92 E0 ; set extruder position to 0\nM140 S{first_layer_bed_temperature[0]} ; start bed heating up\nG28; home all axes\nG0 X0 Y187 Z156 F200 ; move away from endstops\nM109 R{first_layer_temperature[0] - 60} ; soften filament before retraction\n;G1 E-15 F75 ; retract filament (LulzBot Cura is apparently trying to cold pull, might be a contributing factor to hob gear filling with filament)\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach wiping temp\nG1 X45 Y173 F11520 ; move above wiper pad\nG1 Z0 F1200 ; push nozzle into wiper\nG1 X42 Y173 Z-.5 F4000 ; wiping\nG1 X52 Y171 Z-.5 F4000 ; wiping\nG1 X42 Y173 Z0 F4000 ; wiping\nG1 X52 Y171 F4000 ; wiping\nG1 X42 Y173 F4000 ; wiping\nG1 X52 Y171 F4000 ; wiping\nG1 X42 Y173 F4000 ; wiping\nG1 X52 Y171 F4000 ; wiping\nG1 X57 Y173 F4000 ; wiping\nG1 X77 Y171 F4000 ; wiping\nG1 X57 Y173 F4000 ; wiping\nG1 X77 Y171 F4000 ; wiping\nG1 X57 Y173 F4000 ; wiping\nG1 X87 Y171 F4000 ; wiping\nG1 X77 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X77 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X77 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X107 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X107 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X107 Y173 F4000 ; wiping\nG1 X112 Y171 Z-0.5 F1000 ; wiping\nG1 Z10 ; raise extruder\nG28 X0 Y0 ; home X and Y\nG0 X0 Y187 F200 ; move away from endstops\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach probe temp\nM204 S300 ; set probing acceleration\nG29 ; start auto-leveling sequence\nM420 S1 ; enable leveling matrix\nM425 Z ; use measured Z backlash for compensation\nM425 Z F0 ; turn off measured Z backlash compensation. (if activated in the quality settings, this command will automatically be ignored)\nM204 S2000 ; restore standard acceleration\nG28 X0 Y0 ; re-home to account for build variance of earlier mini builds\nG0 X0 Y187 F200 ; move away from endstops\nG0 Y152 F4000 ; move in front of wiper pad\nG4 S1 ; pause\nM400 ; wait for moves to finish\nM117 Heating... ; progress indicator message on LCD\nM109 R{first_layer_temperature[0]} ; wait for extruder to reach printing temp\nM190 R{first_layer_bed_temperature[0]} ; wait for bed to reach printing temp\nG1 Z2 E0 F75 ; prime tiny bit of filament into the nozzle\nM117 Mini Printing... ; progress indicator message on LCD\nM221 S74 ; Printer specific extrusion modifier. -thumbnails = -toolchange_gcode = -use_firmware_retraction = 0 -use_relative_e_distances = 0 -use_volumetric_e = 0 -variable_layer_height = 1 -wipe = 1 -z_offset = 0 +[printer_model:MINI_AERO] +name = Mini Aero +variants = 0.5 +technology = FFF +#bed_model = mini_bed.stl +#bed_texture = mini.svg +default_materials = ColorFabb PLA-PHA @lulzbot;PrintedSolid Jesse PLA @lulzbot -[printer_model:Taz6 Aero 0.5mm] -#bed_custom_model = C:\\Program Files (x86)\\cura-lulzbot 3.6\\resources\\meshes\\lulzbot_taz6.stl -bed_custom_texture = -bed_shape = 0x0,280x0,280x280,0x280 -before_layer_gcode = -between_objects_gcode = -cooling_tube_length = 5 -cooling_tube_retraction = 91.5 -default_filament_profile = "" -default_print_profile = -deretract_speed = 20 -end_gcode = M400 ; wait for moves to finish\nM140 S40 ; start bed cooling\nM104 S0 ; disable hotend\nM107 ; disable fans\nG91 ; relative positioning\nG1 E-1 F300 ; filament retraction to release pressure\nG1 Z20 E-5 X-20 Y-20 F3000 ; lift up and retract even more filament\nG1 E6 ; re-prime extruder\nM117 Cooling please wait ; progress indicator message on LCD\nG90 ; absolute positioning\nG1 Y0 F3000 ; move to cooling position\nM190 R40 ; wait for bed to cool down to removal temp\nG1 Y280 F3000 ; present finished print\nM140 S0; cool downs\nM77 ; stop GLCD timer\nM84 ; disable steppers\nG90 ; absolute positioning\nM117 Print Complete. ; print complete message\n -extra_loading_move = -2 -extruder_colour = "" -extruder_offset = 0x0 -gcode_flavor = marlin -high_current_on_filament_swap = 0 -host_type = octoprint -inherits = -layer_gcode = -machine_max_acceleration_e = 1000,5000 -machine_max_acceleration_extruding = 1000,1250 -machine_max_acceleration_retracting = 1000,1250 -machine_max_acceleration_x = 9000,1000 -machine_max_acceleration_y = 9000,1000 -machine_max_acceleration_z = 100,200 -machine_max_feedrate_e = 40,120 -machine_max_feedrate_x = 800,200 -machine_max_feedrate_y = 800,200 -machine_max_feedrate_z = 3,12 -machine_max_jerk_e = 2.5,2.5 -machine_max_jerk_x = 12,10 -machine_max_jerk_y = 12,10 -machine_max_jerk_z = 0.2,0.4 -machine_min_extruding_rate = 0,0 -machine_min_travel_rate = 0,0 -max_layer_height = 0 -max_print_height = 250 -min_layer_height = 0.07 -nozzle_diameter = 0.5 -parking_pos_retraction = 92 -print_host = -printer_model = -printer_notes = LulzBot Taz 6 w/ Aerostruder profile for Delaware Library System, Rt9 Library and Innovation Center. -printer_settings_id = -printer_technology = FFF -printer_variant = -printer_vendor = -printhost_apikey = -printhost_cafile = -remaining_times = 0 -retract_before_travel = 2 -retract_before_wipe = 0% -retract_layer_change = 0 -retract_length = 2 -retract_length_toolchange = 10 -retract_lift = 0 -retract_lift_above = 0 -retract_lift_below = 0 -retract_restart_extra = 0 -retract_restart_extra_toolchange = 0 -retract_speed = 40 -serial_port = -serial_speed = 250000 -silent_mode = 0 -single_extruder_multi_material = 0 -start_gcode = ;This G-Code has been generated specifically for the LulzBot TAZ 6 with Aerosturder\nM73 P0 ; clear GLCD progress bar\nM75 ; start GLCD timer\nG26 ; clear potential 'probe fail' condition\nM107 ; disable fans\nM420 S0 ; disable leveling matrix\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nG92 E0 ; set extruder position to 0\nM140 S{first_layer_bed_temperature[0]} ; start bed heating up\nG28 XY ; home X and Y\nG1 X-19 Y258 F1000 ; move to safe homing position\nM109 R{first_layer_temperature[0] - 60} ; soften filament before homing Z\nG28 Z ; home Z\nG1 E-15 F100 ; retract filament\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach wiping temp\nG1 X-15 Y100 F3000 ; move above wiper pad\nG1 Z1 ; push nozzle into wiper\nG1 X-17 Y95 F1000 ; slow wipe\nG1 X-17 Y90 F1000 ; slow wipe\nG1 X-17 Y85 F1000 ; slow wipe\nG1 X-15 Y90 F1000 ; slow wipe\nG1 X-17 Y80 F1000 ; slow wipe\nG1 X-15 Y95 F1000 ; slow wipe\nG1 X-17 Y75 F2000 ; fast wipe\nG1 X-15 Y65 F2000 ; fast wipe\nG1 X-17 Y70 F2000 ; fast wipe\nG1 X-15 Y60 F2000 ; fast wipe\nG1 X-17 Y55 F2000 ; fast wipe\nG1 X-15 Y50 F2000 ; fast wipe\nG1 X-17 Y40 F2000 ; fast wipe\nG1 X-15 Y45 F2000 ; fast wipe\nG1 X-17 Y35 F2000 ; fast wipe\nG1 X-15 Y40 F2000 ; fast wipe\nG1 X-17 Y70 F2000 ; fast wipe\nG1 X-15 Y30 Z2 F2000 ; fast wipe\nG1 X-17 Y35 F2000 ; fast wipe\nG1 X-15 Y25 F2000 ; fast wipe\nG1 X-17 Y30 F2000 ; fast wipe\nG1 X-15 Y25 Z1.5 F1000 ; slow wipe\nG1 X-17 Y23 F1000 ; slow wipe\nG1 Z10 ; raise extruder\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach probe temp\nG1 X-9 Y-9 ; move above first probe point\nM204 S100 ; set probing acceleration\nG29 ; start auto-leveling sequence\nM420 S1 ; enable leveling matrix\nM425 Z ; use measured Z backlash for compensation\nM425 Z F0 ; turn off measured Z backlash compensation. (if activated in the quality settings, this command will automatically be ignored)\nM204 S500 ; restore standard acceleration\nG1 X0 Y0 Z15 F5000 ; move up off last probe point\nG4 S1 ; pause\nM400 ; wait for moves to finish\nM117 Heating... ; progress indicator message on LCD\nM109 R{first_layer_temperature[0]} ; wait for extruder to reach printing temp\nM190 R{first_layer_bed_temperature[0]} ; wait for bed to reach printing temp\nG1 Z2 E0 F75 ; prime tiny bit of filament into the nozzle\nM117 TAZ 6 Printing... ; progress indicator message on LCD\n -thumbnails = -toolchange_gcode = -use_firmware_retraction = 0 -use_relative_e_distances = 0 -use_volumetric_e = 0 -variable_layer_height = 1 -wipe = 1 -z_offset = 0 +[printer_model:TAZ6_AERO] +name = Taz6 Aero +variants = 0.5 +technology = FFF +default_materials = ColorFabb PLA-PHA @lulzbot;PrintedSolid Jesse PLA @lulzbot -[print:0.3mm @luzbot] +[print:0.3mm @lulzbot] avoid_crossing_perimeters = 0 bottom_fill_pattern = rectilinear bottom_solid_layers = 3 @@ -217,7 +79,6 @@ perimeter_extrusion_width = 0.56 perimeter_speed = 60 perimeters = 3 post_process = -print_settings_id = raft_layers = 0 resolution = 0 seam_position = nearest @@ -269,7 +130,8 @@ wipe_tower_x = 180 wipe_tower_y = 140 xy_size_compensation = 0 -[filament:ColorFabb PLA_PHA @luzbot] +[filament:ColorFabb PLA-PHA @lulzbot] +filament_vendor = ColorFabb bed_temperature = 60 bridge_fan_speed = 100 compatible_printers = @@ -306,7 +168,6 @@ filament_retract_lift_above = nil filament_retract_lift_below = nil filament_retract_restart_extra = nil filament_retract_speed = nil -filament_settings_id = "" filament_soluble = 0 filament_toolchange_delay = 0 filament_type = PLA @@ -324,7 +185,8 @@ slowdown_below_layer_time = 5 start_filament_gcode = "; Filament gcode\n" temperature = 200 -[filament:PrintedSolid Jesse PLA @luzbot] +[filament:PrintedSolid Jesse PLA @lulzbot] +filament_vendor = PrintedSolid bed_temperature = 60 bridge_fan_speed = 100 compatible_printers = @@ -361,7 +223,6 @@ filament_retract_lift_above = nil filament_retract_lift_below = nil filament_retract_restart_extra = nil filament_retract_speed = nil -filament_settings_id = "" filament_soluble = 0 filament_toolchange_delay = 0 filament_type = PLA @@ -378,3 +239,146 @@ min_print_speed = 10 slowdown_below_layer_time = 5 start_filament_gcode = "; Filament gcode\n" temperature = 220 + +[printer:Mini Aero 0.5mm] +printer_model = MINI_AERO +printer_variant = 0.5 +default_print_profile = 0.3mm @lulzbot +default_filament_profile = PrintedSolid Jesse PLA @lulzbot +bed_shape = 0x0,154x0,154x154,0x154 +before_layer_gcode = +between_objects_gcode = +cooling_tube_length = 5 +cooling_tube_retraction = 91.5 +deretract_speed = 20 +end_gcode = M400 ; wait for moves to finish\nM140 S40 ; start bed cooling\nM104 S0 ; disable hotend\nM107 ; disable fans\nG92 E1 ; set extruder to 1mm for retract on print end (LulzBot Cura had 5mm, might be a contributing factor to between print Aerostruder jamming)\nM117 Cooling please wait ; progress indicator message on LCD\nG1 X5 Y5 Z158 E0 F10000 ; move to cooling position\nG1 E1 ; re-prime extruder\nM190 R40 ; wait for bed to cool down to removal temp\nM77 ; Stop GLCD Timer\nG1 X145 F1000 ; move extruder out of the way\nG1 Y175 F1000 ; present finished print\nM140 S0; cool downs\nM84 ; disable steppers\nG90 ; absolute positioning\nM117 Print Complete. ; print complete message\n +extra_loading_move = -2 +extruder_colour = "" +extruder_offset = 0x0 +gcode_flavor = marlin +high_current_on_filament_swap = 0 +host_type = octoprint +inherits = +layer_gcode = +machine_max_acceleration_e = 10000,5000 +machine_max_acceleration_extruding = 1500,1250 +machine_max_acceleration_retracting = 1500,1250 +machine_max_acceleration_x = 9000,1000 +machine_max_acceleration_y = 9000,1000 +machine_max_acceleration_z = 100,200 +machine_max_feedrate_e = 40,120 +machine_max_feedrate_x = 800,200 +machine_max_feedrate_y = 800,200 +machine_max_feedrate_z = 8,12 +machine_max_jerk_e = 2.5,2.5 +machine_max_jerk_x = 20,10 +machine_max_jerk_y = 20,10 +machine_max_jerk_z = 0.2,0.4 +machine_min_extruding_rate = 0,0 +machine_min_travel_rate = 0,0 +max_layer_height = 0 +max_print_height = 158 +min_layer_height = 0.07 +nozzle_diameter = 0.5 +parking_pos_retraction = 92 +print_host = +printer_notes = LulzBot Mini w/ Aerostruder profile for Delaware Library System, Rt9 Library and Innovation Center. +printhost_apikey = +printhost_cafile = +remaining_times = 0 +retract_before_travel = 2 +retract_before_wipe = 0% +retract_layer_change = 1 +retract_length = 1 +retract_length_toolchange = 10 +retract_lift = 0 +retract_lift_above = 0 +retract_lift_below = 0 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 40 +serial_port = +serial_speed = 250000 +silent_mode = 0 +single_extruder_multi_material = 0 +start_gcode = ;This G-Code has been generated specifically for the LulzBot Mini with Aerosturder\nM73 P0 ; clear GLCD progress bar\nM75 ; start GLCD timer\nG26 ; clear potential 'probe fail' condition\nM107 ; disable fans\nM420 S0 ; disable leveling matrix\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nG92 E0 ; set extruder position to 0\nM140 S{first_layer_bed_temperature[0]} ; start bed heating up\nG28; home all axes\nG0 X0 Y187 Z156 F200 ; move away from endstops\nM109 R{first_layer_temperature[0] - 60} ; soften filament before retraction\n;G1 E-15 F75 ; retract filament (LulzBot Cura is apparently trying to cold pull, might be a contributing factor to hob gear filling with filament)\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach wiping temp\nG1 X45 Y173 F11520 ; move above wiper pad\nG1 Z0 F1200 ; push nozzle into wiper\nG1 X42 Y173 Z-.5 F4000 ; wiping\nG1 X52 Y171 Z-.5 F4000 ; wiping\nG1 X42 Y173 Z0 F4000 ; wiping\nG1 X52 Y171 F4000 ; wiping\nG1 X42 Y173 F4000 ; wiping\nG1 X52 Y171 F4000 ; wiping\nG1 X42 Y173 F4000 ; wiping\nG1 X52 Y171 F4000 ; wiping\nG1 X57 Y173 F4000 ; wiping\nG1 X77 Y171 F4000 ; wiping\nG1 X57 Y173 F4000 ; wiping\nG1 X77 Y171 F4000 ; wiping\nG1 X57 Y173 F4000 ; wiping\nG1 X87 Y171 F4000 ; wiping\nG1 X77 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X77 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X77 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X107 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X107 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X107 Y173 F4000 ; wiping\nG1 X112 Y171 Z-0.5 F1000 ; wiping\nG1 Z10 ; raise extruder\nG28 X0 Y0 ; home X and Y\nG0 X0 Y187 F200 ; move away from endstops\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach probe temp\nM204 S300 ; set probing acceleration\nG29 ; start auto-leveling sequence\nM420 S1 ; enable leveling matrix\nM425 Z ; use measured Z backlash for compensation\nM425 Z F0 ; turn off measured Z backlash compensation. (if activated in the quality settings, this command will automatically be ignored)\nM204 S2000 ; restore standard acceleration\nG28 X0 Y0 ; re-home to account for build variance of earlier mini builds\nG0 X0 Y187 F200 ; move away from endstops\nG0 Y152 F4000 ; move in front of wiper pad\nG4 S1 ; pause\nM400 ; wait for moves to finish\nM117 Heating... ; progress indicator message on LCD\nM109 R{first_layer_temperature[0]} ; wait for extruder to reach printing temp\nM190 R{first_layer_bed_temperature[0]} ; wait for bed to reach printing temp\nG1 Z2 E0 F75 ; prime tiny bit of filament into the nozzle\nM117 Mini Printing... ; progress indicator message on LCD\nM221 S74 ; Printer specific extrusion modifier. +thumbnails = +toolchange_gcode = +use_firmware_retraction = 0 +use_relative_e_distances = 0 +use_volumetric_e = 0 +variable_layer_height = 1 +wipe = 1 +z_offset = 0 + +[printer:Taz6 Aero 0.5mm] +printer_model = TAZ6_AERO +printer_variant = 0.5 +default_print_profile = 0.3mm @lulzbot +default_filament_profile = PrintedSolid Jesse PLA @lulzbot +bed_shape = 0x0,280x0,280x280,0x280 +before_layer_gcode = +between_objects_gcode = +cooling_tube_length = 5 +cooling_tube_retraction = 91.5 +deretract_speed = 20 +end_gcode = M400 ; wait for moves to finish\nM140 S40 ; start bed cooling\nM104 S0 ; disable hotend\nM107 ; disable fans\nG91 ; relative positioning\nG1 E-1 F300 ; filament retraction to release pressure\nG1 Z20 E-5 X-20 Y-20 F3000 ; lift up and retract even more filament\nG1 E6 ; re-prime extruder\nM117 Cooling please wait ; progress indicator message on LCD\nG90 ; absolute positioning\nG1 Y0 F3000 ; move to cooling position\nM190 R40 ; wait for bed to cool down to removal temp\nG1 Y280 F3000 ; present finished print\nM140 S0; cool downs\nM77 ; stop GLCD timer\nM84 ; disable steppers\nG90 ; absolute positioning\nM117 Print Complete. ; print complete message\n +extra_loading_move = -2 +extruder_colour = "" +extruder_offset = 0x0 +gcode_flavor = marlin +high_current_on_filament_swap = 0 +host_type = octoprint +inherits = +layer_gcode = +machine_max_acceleration_e = 1000,5000 +machine_max_acceleration_extruding = 1000,1250 +machine_max_acceleration_retracting = 1000,1250 +machine_max_acceleration_x = 9000,1000 +machine_max_acceleration_y = 9000,1000 +machine_max_acceleration_z = 100,200 +machine_max_feedrate_e = 40,120 +machine_max_feedrate_x = 800,200 +machine_max_feedrate_y = 800,200 +machine_max_feedrate_z = 3,12 +machine_max_jerk_e = 2.5,2.5 +machine_max_jerk_x = 12,10 +machine_max_jerk_y = 12,10 +machine_max_jerk_z = 0.2,0.4 +machine_min_extruding_rate = 0,0 +machine_min_travel_rate = 0,0 +max_layer_height = 0 +max_print_height = 250 +min_layer_height = 0.07 +nozzle_diameter = 0.5 +parking_pos_retraction = 92 +print_host = +printer_notes = LulzBot Taz 6 w/ Aerostruder profile for Delaware Library System, Rt9 Library and Innovation Center. +printer_technology = FFF +printhost_apikey = +printhost_cafile = +remaining_times = 0 +retract_before_travel = 2 +retract_before_wipe = 0% +retract_layer_change = 0 +retract_length = 2 +retract_length_toolchange = 10 +retract_lift = 0 +retract_lift_above = 0 +retract_lift_below = 0 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 40 +serial_port = +serial_speed = 250000 +silent_mode = 0 +single_extruder_multi_material = 0 +start_gcode = ;This G-Code has been generated specifically for the LulzBot TAZ 6 with Aerosturder\nM73 P0 ; clear GLCD progress bar\nM75 ; start GLCD timer\nG26 ; clear potential 'probe fail' condition\nM107 ; disable fans\nM420 S0 ; disable leveling matrix\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nG92 E0 ; set extruder position to 0\nM140 S{first_layer_bed_temperature[0]} ; start bed heating up\nG28 XY ; home X and Y\nG1 X-19 Y258 F1000 ; move to safe homing position\nM109 R{first_layer_temperature[0] - 60} ; soften filament before homing Z\nG28 Z ; home Z\nG1 E-15 F100 ; retract filament\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach wiping temp\nG1 X-15 Y100 F3000 ; move above wiper pad\nG1 Z1 ; push nozzle into wiper\nG1 X-17 Y95 F1000 ; slow wipe\nG1 X-17 Y90 F1000 ; slow wipe\nG1 X-17 Y85 F1000 ; slow wipe\nG1 X-15 Y90 F1000 ; slow wipe\nG1 X-17 Y80 F1000 ; slow wipe\nG1 X-15 Y95 F1000 ; slow wipe\nG1 X-17 Y75 F2000 ; fast wipe\nG1 X-15 Y65 F2000 ; fast wipe\nG1 X-17 Y70 F2000 ; fast wipe\nG1 X-15 Y60 F2000 ; fast wipe\nG1 X-17 Y55 F2000 ; fast wipe\nG1 X-15 Y50 F2000 ; fast wipe\nG1 X-17 Y40 F2000 ; fast wipe\nG1 X-15 Y45 F2000 ; fast wipe\nG1 X-17 Y35 F2000 ; fast wipe\nG1 X-15 Y40 F2000 ; fast wipe\nG1 X-17 Y70 F2000 ; fast wipe\nG1 X-15 Y30 Z2 F2000 ; fast wipe\nG1 X-17 Y35 F2000 ; fast wipe\nG1 X-15 Y25 F2000 ; fast wipe\nG1 X-17 Y30 F2000 ; fast wipe\nG1 X-15 Y25 Z1.5 F1000 ; slow wipe\nG1 X-17 Y23 F1000 ; slow wipe\nG1 Z10 ; raise extruder\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach probe temp\nG1 X-9 Y-9 ; move above first probe point\nM204 S100 ; set probing acceleration\nG29 ; start auto-leveling sequence\nM420 S1 ; enable leveling matrix\nM425 Z ; use measured Z backlash for compensation\nM425 Z F0 ; turn off measured Z backlash compensation. (if activated in the quality settings, this command will automatically be ignored)\nM204 S500 ; restore standard acceleration\nG1 X0 Y0 Z15 F5000 ; move up off last probe point\nG4 S1 ; pause\nM400 ; wait for moves to finish\nM117 Heating... ; progress indicator message on LCD\nM109 R{first_layer_temperature[0]} ; wait for extruder to reach printing temp\nM190 R{first_layer_bed_temperature[0]} ; wait for bed to reach printing temp\nG1 Z2 E0 F75 ; prime tiny bit of filament into the nozzle\nM117 TAZ 6 Printing... ; progress indicator message on LCD\n +thumbnails = +toolchange_gcode = +use_firmware_retraction = 0 +use_relative_e_distances = 0 +use_volumetric_e = 0 +variable_layer_height = 1 +wipe = 1 +z_offset = 0 From ec75b760b8e7277ed90f0e4cd7113190db4607bf Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 9 Mar 2020 10:36:55 +0100 Subject: [PATCH 32/37] Fix of saving the 3DConnexion status on OSX. Fixes 2.2.0 RC2 - 3Dconnexion settings not saved / Zoom digital (#3791) --- src/slic3r/GUI/Mouse3DController.cpp | 10 ++++++---- src/slic3r/GUI/Mouse3DHandlerMac.mm | 4 ++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp index 8bc9744f1f..0cd39b092a 100644 --- a/src/slic3r/GUI/Mouse3DController.cpp +++ b/src/slic3r/GUI/Mouse3DController.cpp @@ -368,6 +368,8 @@ void Mouse3DController::render_settings_dialog(GLCanvas3D& canvas) const void Mouse3DController::connected(std::string device_name) { + assert(! m_connected); + assert(m_device_str.empty()); m_device_str = device_name; // Copy the parameters for m_device_str into the current parameters. if (auto it_params = m_params_by_device.find(m_device_str); it_params != m_params_by_device.end()) { @@ -380,13 +382,13 @@ void Mouse3DController::connected(std::string device_name) void Mouse3DController::disconnected() { // Copy the current parameters for m_device_str into the parameter database. - assert(! m_device_str.empty()); - if (! m_device_str.empty()) { + assert(m_connected == ! m_device_str.empty()); + if (m_connected) { tbb::mutex::scoped_lock lock(m_params_ui_mutex); m_params_by_device[m_device_str] = m_params_ui; + m_device_str.clear(); + m_connected = false; } - m_device_str.clear(); - m_connected = false; } bool Mouse3DController::handle_input(const DataPacketAxis& packet) diff --git a/src/slic3r/GUI/Mouse3DHandlerMac.mm b/src/slic3r/GUI/Mouse3DHandlerMac.mm index d40948cd1a..eaf580908c 100644 --- a/src/slic3r/GUI/Mouse3DHandlerMac.mm +++ b/src/slic3r/GUI/Mouse3DHandlerMac.mm @@ -152,6 +152,8 @@ static void DeviceAdded(uint32_t unused) static void DeviceRemoved(uint32_t unused) { BOOST_LOG_TRIVIAL(info) << "3dx device removed\n"; + assert(m_connected); + assert(! m_device_str.empty()); mouse_3d_controller->disconnected(); } @@ -214,6 +216,8 @@ void Mouse3DController::shutdown() CleanupConnexionHandlers(); unload_driver(); } + // Copy the current parameters to parameter database, mark the device as disconnected. + this->disconnected(); mouse_3d_controller = nullptr; } From e83fb4582c1de8477fd10d8675e3b0a1e5ef9767 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 9 Mar 2020 10:56:51 +0100 Subject: [PATCH 33/37] Reworked the eject on unix systems to wait for the return of the system call to the command line utility and send out the unmount wxWidgets event immediately. Hopefully improves 2.2.0-RC Eject is very slow in Linux (#3795) --- src/slic3r/GUI/RemovableDriveManager.cpp | 10 ++++++++-- src/slic3r/GUI/RemovableDriveManager.hpp | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/RemovableDriveManager.cpp b/src/slic3r/GUI/RemovableDriveManager.cpp index 2264cc954e..5054d061e1 100644 --- a/src/slic3r/GUI/RemovableDriveManager.cpp +++ b/src/slic3r/GUI/RemovableDriveManager.cpp @@ -348,7 +348,10 @@ void RemovableDriveManager::eject_drive() return; } - m_drive_data_last_eject = *it_drive_data; + assert(m_callback_evt_handler); + if (m_callback_evt_handler) + wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::move(*it_drive_data))); + m_current_drives.erase(it_drive_data); } } @@ -473,12 +476,15 @@ void RemovableDriveManager::update() tbb::mutex::scoped_lock lock(m_drives_mutex); std::sort(current_drives.begin(), current_drives.end()); if (current_drives != m_current_drives) { +#ifdef WIN32 if (! m_drive_data_last_eject.empty() && std::find(current_drives.begin(), current_drives.end(), m_drive_data_last_eject) == current_drives.end()) { assert(m_callback_evt_handler); if (m_callback_evt_handler) wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::move(m_drive_data_last_eject))); m_drive_data_last_eject.clear(); - } else { + } else +#endif // WIN32 + { assert(m_callback_evt_handler); if (m_callback_evt_handler) wxPostEvent(m_callback_evt_handler, RemovableDrivesChangedEvent(EVT_REMOVABLE_DRIVES_CHANGED)); diff --git a/src/slic3r/GUI/RemovableDriveManager.hpp b/src/slic3r/GUI/RemovableDriveManager.hpp index 3b808d9d79..7ada13e5a7 100644 --- a/src/slic3r/GUI/RemovableDriveManager.hpp +++ b/src/slic3r/GUI/RemovableDriveManager.hpp @@ -65,6 +65,8 @@ public: // Verify whether the path provided is on removable media. If so, save the path for further eject and return true, otherwise return false. bool set_and_verify_last_save_path(const std::string &path); // Eject drive of a file set by set_and_verify_last_save_path(). + // On Unix / OSX, the function blocks and sends out the EVT_REMOVABLE_DRIVE_EJECTED event on success. + // On Windows, the function does not block, and the eject is detected in the background thread. void eject_drive(); struct RemovableDrivesStatus { @@ -102,7 +104,9 @@ private: // When user requested an eject, the drive to be forcefuly ejected is stored here, so the next update will // recognize that the eject was finished with success and an eject event is sent out. // guarded with m_drives_mutex +#ifdef WIN32 DriveData m_drive_data_last_eject; +#endif // WIN32 mutable tbb::mutex m_drives_mutex; // Returns drive path (same as path in DriveData) if exists otherwise empty string. From aac691c0e7aa19e697d00ac0e92bf4bdb8d121f5 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 9 Mar 2020 11:47:20 +0100 Subject: [PATCH 34/37] Forced SD card / USB drive eject now sends out the event immediately on Windows as well as on Unix platforms including OSX. --- src/slic3r/GUI/RemovableDriveManager.cpp | 21 +++++++-------------- src/slic3r/GUI/RemovableDriveManager.hpp | 6 ------ 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/src/slic3r/GUI/RemovableDriveManager.cpp b/src/slic3r/GUI/RemovableDriveManager.cpp index 5054d061e1..0c4c417b25 100644 --- a/src/slic3r/GUI/RemovableDriveManager.cpp +++ b/src/slic3r/GUI/RemovableDriveManager.cpp @@ -103,7 +103,10 @@ void RemovableDriveManager::eject_drive() return; } CloseHandle(handle); - m_drive_data_last_eject = *it_drive_data; + assert(m_callback_evt_handler); + if (m_callback_evt_handler) + wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::move(*it_drive_data))); + m_current_drives.erase(it_drive_data); } } @@ -476,19 +479,9 @@ void RemovableDriveManager::update() tbb::mutex::scoped_lock lock(m_drives_mutex); std::sort(current_drives.begin(), current_drives.end()); if (current_drives != m_current_drives) { -#ifdef WIN32 - if (! m_drive_data_last_eject.empty() && std::find(current_drives.begin(), current_drives.end(), m_drive_data_last_eject) == current_drives.end()) { - assert(m_callback_evt_handler); - if (m_callback_evt_handler) - wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::move(m_drive_data_last_eject))); - m_drive_data_last_eject.clear(); - } else -#endif // WIN32 - { - assert(m_callback_evt_handler); - if (m_callback_evt_handler) - wxPostEvent(m_callback_evt_handler, RemovableDrivesChangedEvent(EVT_REMOVABLE_DRIVES_CHANGED)); - } + assert(m_callback_evt_handler); + if (m_callback_evt_handler) + wxPostEvent(m_callback_evt_handler, RemovableDrivesChangedEvent(EVT_REMOVABLE_DRIVES_CHANGED)); } m_current_drives = std::move(current_drives); } diff --git a/src/slic3r/GUI/RemovableDriveManager.hpp b/src/slic3r/GUI/RemovableDriveManager.hpp index 7ada13e5a7..8b661d19c2 100644 --- a/src/slic3r/GUI/RemovableDriveManager.hpp +++ b/src/slic3r/GUI/RemovableDriveManager.hpp @@ -101,12 +101,6 @@ private: // m_current_drives is guarded by m_drives_mutex // sorted ascending by path std::vector m_current_drives; - // When user requested an eject, the drive to be forcefuly ejected is stored here, so the next update will - // recognize that the eject was finished with success and an eject event is sent out. - // guarded with m_drives_mutex -#ifdef WIN32 - DriveData m_drive_data_last_eject; -#endif // WIN32 mutable tbb::mutex m_drives_mutex; // Returns drive path (same as path in DriveData) if exists otherwise empty string. From cbd80685c28398d0f8174f6c3a707ba1d5b7aa08 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 9 Mar 2020 12:29:40 +0100 Subject: [PATCH 35/37] Fix of Print settings dropdown list messed up after deleting an entry (#3800) --- src/slic3r/GUI/Tab.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 9a6313e707..9e49dc5bdb 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2861,10 +2861,10 @@ void Tab::select_preset(std::string preset_name, bool delete_current) // Mark the print & filament enabled if they are compatible with the currently selected preset. // The following method should not discard changes of current print or filament presets on change of a printer profile, // if they are compatible with the current printer. - auto update_compatible_type = [](bool technology_changed, bool on_page, bool show_incompatible_presets) { - return technology_changed ? PresetSelectCompatibleType::Always : - on_page ? PresetSelectCompatibleType::Never : - (show_incompatible_presets ? PresetSelectCompatibleType::OnlyIfWasCompatible : PresetSelectCompatibleType::Always); + auto update_compatible_type = [delete_current](bool technology_changed, bool on_page, bool show_incompatible_presets) { + return (delete_current || technology_changed) ? PresetSelectCompatibleType::Always : + on_page ? PresetSelectCompatibleType::Never : + show_incompatible_presets ? PresetSelectCompatibleType::OnlyIfWasCompatible : PresetSelectCompatibleType::Always; }; if (current_dirty || delete_current || print_tab || printer_tab) m_preset_bundle->update_compatible( From c489663126828fde0d27ac405aad9f3c82f135d8 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 9 Mar 2020 14:05:54 +0100 Subject: [PATCH 36/37] Add arrange support for unprintable items --- src/slic3r/GUI/Plater.cpp | 71 +++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 18 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 48eb86743a..e1f75d07da 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1509,6 +1509,7 @@ struct Plater::priv ret.poly.contour = std::move(p); ret.translation = scaled(m_pos); ret.rotation = m_rotation; + ret.priority++; return ret; } } wipetower; @@ -1572,18 +1573,23 @@ struct Plater::priv // the current bed width. static const constexpr double LOGICAL_BED_GAP = 1. / 5.; - ArrangePolygons m_selected, m_unselected; + ArrangePolygons m_selected, m_unselected, m_unprintable; // clear m_selected and m_unselected, reserve space for next usage void clear_input() { const Model &model = plater().model; - size_t count = 0; // To know how much space to reserve - for (auto obj : model.objects) count += obj->instances.size(); + size_t count = 0, cunprint = 0; // To know how much space to reserve + for (auto obj : model.objects) + for (auto mi : obj->instances) + mi->printable ? count++ : cunprint++; + m_selected.clear(); m_unselected.clear(); + m_unprintable.clear(); m_selected.reserve(count + 1 /* for optional wti */); m_unselected.reserve(count + 1 /* for optional wti */); + m_unprintable.reserve(cunprint /* for optional wti */); } // Stride between logical beds @@ -1612,8 +1618,10 @@ struct Plater::priv clear_input(); for (ModelObject *obj: plater().model.objects) - for (ModelInstance *mi : obj->instances) - m_selected.emplace_back(get_arrange_poly(mi)); + for (ModelInstance *mi : obj->instances) { + ArrangePolygons & cont = mi->printable ? m_selected : m_unprintable; + cont.emplace_back(get_arrange_poly(mi)); + } auto& wti = plater().updated_wipe_tower(); if (wti) m_selected.emplace_back(get_arrange_poly(&wti)); @@ -1648,9 +1656,12 @@ struct Plater::priv for (size_t i = 0; i < inst_sel.size(); ++i) { ArrangePolygon &&ap = get_arrange_poly(mo->instances[i]); - inst_sel[i] ? - m_selected.emplace_back(std::move(ap)) : - m_unselected.emplace_back(std::move(ap)); + ArrangePolygons &cont = mo->instances[i]->printable ? + (inst_sel[i] ? m_selected : + m_unselected) : + m_unprintable; + + cont.emplace_back(std::move(ap)); } } @@ -1682,16 +1693,35 @@ struct Plater::priv public: using PlaterJob::PlaterJob; - int status_range() const override { return int(m_selected.size()); } + int status_range() const override + { + return int(m_selected.size() + m_unprintable.size()); + } void process() override; void finalize() override { // Ignore the arrange result if aborted. if (was_canceled()) return; - + + // Unprintable items go to the last virtual bed + int beds = 0; + // Apply the arrange result to all selected objects - for (ArrangePolygon &ap : m_selected) ap.apply(); + for (ArrangePolygon &ap : m_selected) { + beds = std::max(ap.bed_idx, beds); + ap.apply(); + } + + // Get the virtual beds from the unselected items + for (ArrangePolygon &ap : m_unselected) + beds = std::max(ap.bed_idx, beds); + + // Move the unprintable items to the last virtual bed. + for (ArrangePolygon &ap : m_unprintable) { + ap.bed_idx += beds + 1; + ap.apply(); + } plater().update(); } @@ -2838,16 +2868,21 @@ void Plater::priv::ArrangeJob::process() { } coord_t min_d = scaled(dist); - auto count = unsigned(m_selected.size()); + auto count = unsigned(m_selected.size() + m_unprintable.size()); arrangement::BedShapeHint bedshape = plater().get_bed_shape_hint(); - + + auto stopfn = [this]() { return was_canceled(); }; + try { arrangement::arrange(m_selected, m_unselected, min_d, bedshape, - [this, count](unsigned st) { - if (st > 0) // will not finalize after last one - update_status(int(count - st), arrangestr); - }, - [this]() { return was_canceled(); }); + [this, count](unsigned st) { + st += m_unprintable.size(); + if (st > 0) update_status(int(count - st), arrangestr); + }, stopfn); + arrangement::arrange(m_unprintable, {}, min_d, bedshape, + [this, count](unsigned st) { + if (st > 0) update_status(int(count - st), arrangestr); + }, stopfn); } catch (std::exception & /*e*/) { GUI::show_error(plater().q, _(L("Could not arrange model objects! " From 6c36577e8e48e27a372f9a53cd2ba2a07e3a49a3 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 9 Mar 2020 15:23:29 +0100 Subject: [PATCH 37/37] #3782 - World Z axis always vertical for non-free camera --- src/slic3r/GUI/Camera.cpp | 3 ++- src/slic3r/GUI/Camera.hpp | 3 ++- src/slic3r/GUI/GLCanvas3D.cpp | 1 - src/slic3r/GUI/Plater.cpp | 8 ++++++++ 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 0a0b02c6f0..74c21d3e80 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -260,7 +260,7 @@ void Camera::debug_render() const imgui.begin(std::string("Camera statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); std::string type = get_type_as_string(); - if (wxGetApp().plater()->get_mouse3d_controller().is_running() || (wxGetApp().app_config->get("use_free_camera") == "1")) + if (wxGetApp().plater()->get_mouse3d_controller().connected() || (wxGetApp().app_config->get("use_free_camera") == "1")) type += "/free"; else type += "/constrained"; @@ -537,6 +537,7 @@ void Camera::look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up Vec3d unit_y = unit_z.cross(unit_x).normalized(); m_target = target; + m_distance = (position - target).norm(); Vec3d new_position = m_target + m_distance * unit_z; m_view_matrix(0, 0) = unit_x(0); diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index f592dbcd22..4b91445199 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -122,6 +122,8 @@ public: // returns true if the camera z axis (forward) is pointing in the negative direction of the world z axis bool is_looking_downward() const { return get_dir_forward().dot(Vec3d::UnitZ()) < 0.0; } + void look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up); + double max_zoom() const { return 100.0; } double min_zoom() const; @@ -137,7 +139,6 @@ private: #endif // ENABLE_THUMBNAIL_GENERATOR void set_distance(double distance) const; - void look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up); void set_default_orientation(); Vec3d validate_target(const Vec3d& target) const; void update_zenit(); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 540f82b4cf..fc8a800d16 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3932,7 +3932,6 @@ void GLCanvas3D::handle_layers_data_focus_event(const t_layer_height_range range void GLCanvas3D::update_ui_from_settings() { - m_camera.set_type(wxGetApp().app_config->get("use_perspective_camera")); m_dirty = true; #if ENABLE_RETINA_GL diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 48eb86743a..c207640674 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2245,6 +2245,14 @@ void Plater::priv::update_ui_from_settings() // $self->{buttons_sizer}->Layout; // } + camera.set_type(wxGetApp().app_config->get("use_perspective_camera")); + if (wxGetApp().app_config->get("use_free_camera") != "1") + { + // forces camera right vector to be parallel to XY plane + if (std::abs(camera.get_dir_right()(2)) > EPSILON) + camera.look_at(camera.get_position(), camera.get_target(), Vec3d::UnitZ()); + } + view3D->get_canvas3d()->update_ui_from_settings(); preview->get_canvas3d()->update_ui_from_settings(); }