From 545db33a9752fe3610653ad61357fa09f5b72e5e Mon Sep 17 00:00:00 2001 From: Ray Ackley <38403586+rackley096794@users.noreply.github.com> Date: Tue, 3 Nov 2020 13:18:37 -0500 Subject: [PATCH 001/143] Update How to build - Windows.md Fixing up Visual Studio 2019 build steps as they were missing a few steps that caused issues during building. Ref: https://github.com/prusa3d/PrusaSlicer/issues/3743. Also moved the current step-by-step instructions to the top of the page and left the older/outdated instructions for reference purposes at the bottom as they still contain some useful details. --- doc/How to build - Windows.md | 84 +++++++++++++++++------------------ 1 file changed, 40 insertions(+), 44 deletions(-) diff --git a/doc/How to build - Windows.md b/doc/How to build - Windows.md index cd5227dafc7..6490f5bbbea 100644 --- a/doc/How to build - Windows.md +++ b/doc/How to build - Windows.md @@ -1,5 +1,44 @@ +# Step by Step Visual Studio 2019 Instructions -# This how-to is out of date +Install Visual Studio Community 2019 from [visualstudio.microsoft.com/vs/](https://visualstudio.microsoft.com/vs/) +Select all workload options for C++ + +Install git for Windows from [gitforwindows.org](https://gitforwindows.org/) +Download and run the exe accepting all defaults + +Clone the respository. To place it in C:\PrusaSlicer, run: +c:\>git clone https://github.com/prusa3d/PrusaSlicer.git + +Go to the Windows Start Menu and Click on "Visual Studio 2019" folder, then select the ->"x64 Native Tools Command Prompt" to open a command window and run the following: + +cd c:\PrusaSlicer\deps +mkdir build +cd build +cmake .. -G "Visual Studio 16 2019" -DDESTDIR="c:\PrusaSlicer" + +msbuild /m ALL_BUILD.vcxproj // This took 13.5 minutes on my machine: core I7-7700K @ 4.2Ghz with 32GB main memory and 20min on a average laptop + +cd c:\PrusaSlicer\ +mkdir build +cd build +cmake .. -G "Visual Studio 16 2019" -DCMAKE_PREFIX_PATH="c:\PrusaSlicer\usr\local" + +Double-click c:\PrusaSlicer\build\PrusaSlicer.sln to open in Visual Studio 2019. +OR +Open Visual Studio for C++ development (VS asks this the first time you start it). + +Select PrusaSlicer_app_gui as your startup project (right-click->Set as Startup Project). + +Run Build->Rebuild Solution once to populate all required dependency modules. This is NOT done automatically when you build/run. If you run both Debug and Release variants, you will need to do this once for each. + +Debug->Start Debugging or press F5 + +PrusaSlicer should start. You're up and running! + +note: Thanks to @douggorgen for the original guide, as an answer for a issue + + +# The below information is out of date, but still useful for reference purposes We have switched to MS Visual Studio 2019. @@ -122,47 +161,4 @@ Refer to the CMake scripts inside the `deps` directory to see which dependencies intermediate files, which are not handled correctly by either `b2.exe` or possibly `ninja` (?). -# Noob guide (step by step) - -Install Visual Studio Community 2019 from -[visualstudio.microsoft.com/vs/](https://visualstudio.microsoft.com/vs/) -Select all workload options for C++ - -Install git for Windows from -[gitforwindows.org](https://gitforwindows.org/) -download and run the exe accepting all defaults - -download PrusaSlicer-master.zip from github -I downloaded this to c:\PrusaSlicer and unzipped to c:\PrusaSlicer\PrusaSlicer-master\ so this will be my prefix for all my steps. Substitute your prefix. - -Go to the Windows Start Menu and Click on "Visual Studio 2019" folder, then select the ->"x64 Native Tools Command Prompt" to open a command window - -cd c:\PrusaSlicer\PrusaSlicer-master\deps - -mkdir build - -cd build - -cmake .. -G "Visual Studio 16 2019" -DDESTDIR="c:\PrusaSlicer\PrusaSlicer-master" - -msbuild /m ALL_BUILD.vcxproj // This took 13.5 minutes on my machine: core I7-7700K @ 4.2Ghz with 32GB main memory and 20min on a average laptop - -cd c:\PrusaSlicer\PrusaSlicer-master\ -mkdir build - -cd build - -cmake .. -G "Visual Studio 16 2019" -DCMAKE_PREFIX_PATH="c:\PrusaSlicer\PrusaSlicer-master\usr\local" - -open Visual Studio for c++ development (VS asks this the first time you start it) - -Open->Project/Solution or File->Open->Project/Solution (depending on which dialog comes up first) - -click on c:\PrusaSlicer\PrusaSlicer-master\build\PrusaSlicer.sln - -Debug->Start Debugging or Debug->Start Without debugging -PrusaSlicer should start. You're up and running! - - -note: Thanks to @douggorgen for the original guide, as an answer for a issue From 7832e8aee17a7305f19a064a668dd75fc43ebffc Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 11 Dec 2020 12:38:14 +0100 Subject: [PATCH 002/143] Enabled tech ENABLE_GCODE_VIEWER_STATISTICS --- src/libslic3r/Technologies.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 75b228155a7..b650809bb11 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -24,7 +24,7 @@ // Use wxDataViewRender instead of wxDataViewCustomRenderer #define ENABLE_NONCUSTOM_DATA_VIEW_RENDERING 0 // Enable G-Code viewer statistics imgui dialog -#define ENABLE_GCODE_VIEWER_STATISTICS 0 +#define ENABLE_GCODE_VIEWER_STATISTICS 1 // Enable G-Code viewer comparison between toolpaths height and width detected from gcode and calculated at gcode generation #define ENABLE_GCODE_VIEWER_DATA_CHECKING 0 From 40fb39f5e1a2ba9cf2554e66164f52cd186b054a Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 29 Dec 2020 18:47:42 +0100 Subject: [PATCH 003/143] Change the y_step for sidebar slider to fix strange layout of the sidebar --- src/slic3r/GUI/Plater.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 4526bc51d9b..71e17b48989 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -633,7 +633,11 @@ Sidebar::Sidebar(Plater *parent) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(42 * wxGetApp().em_unit(), -1)), p(new priv(parent)) { p->scrolled = new wxScrolledWindow(this); - p->scrolled->SetScrollbars(0, 100, 1, 2); +// p->scrolled->SetScrollbars(0, 100, 1, 2); // ys_DELETE_after_testing. pixelsPerUnitY = 100 from https://github.com/prusa3d/PrusaSlicer/commit/8f019e5fa992eac2c9a1e84311c990a943f80b01, + // but this cause the bad layout of the sidebar, when all infoboxes appear. + // As a result we can see the empty block at the bottom of the sidebar + // But if we set this value to 5, layout will be better + p->scrolled->SetScrollRate(0, 5); SetFont(wxGetApp().normal_font()); #ifndef __APPLE__ From 0331bcefd951ff789ff8ff4b8d26ca9476ca363f Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 29 Dec 2020 19:10:14 +0100 Subject: [PATCH 004/143] ObjectList: Smart update of the min height in respect to the items count. Min 7 items and max 15 items --- src/slic3r/GUI/GUI_ObjectList.cpp | 36 ++++++++++++++++++++++--------- src/slic3r/GUI/GUI_ObjectList.hpp | 3 +++ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 20cb774ee12..4475e30ca2d 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -260,13 +260,27 @@ ObjectList::~ObjectList() void ObjectList::set_min_height() { - /* Temporary workaround for the correct behavior of the Scrolled sidebar panel: - * change min hight of object list to the normal min value (20 * wxGetApp().em_unit()) - * after first whole Mainframe updating/layouting - */ - const int list_min_height = 20 * wxGetApp().em_unit(); - if (this->GetMinSize().GetY() > list_min_height) - this->SetMinSize(wxSize(-1, list_min_height)); + if (m_items_count == size_t(-1)) + m_items_count = 7; + int list_min_height = lround(2.25 * (m_items_count + 1) * wxGetApp().em_unit()); // +1 is for height of control header + this->SetMinSize(wxSize(1, list_min_height)); +} + +void ObjectList::update_min_height() +{ + wxDataViewItemArray all_items; + m_objects_model->GetAllChildren(wxDataViewItem(nullptr), all_items); + size_t items_cnt = all_items.Count(); + if (items_cnt < 7) + items_cnt = 7; + else if (items_cnt >= 15) + items_cnt = 15; + + if (m_items_count == items_cnt) + return; + + m_items_count = items_cnt; + set_min_height(); } @@ -274,7 +288,7 @@ void ObjectList::create_objects_ctrl() { /* Temporary workaround for the correct behavior of the Scrolled sidebar panel: * 1. set a height of the list to some big value - * 2. change it to the normal min value (20 * wxGetApp().em_unit()) after first whole Mainframe updating/layouting + * 2. change it to the normal(meaningful) min value after first whole Mainframe updating/layouting */ SetMinSize(wxSize(-1, 3000)); @@ -2989,6 +3003,8 @@ void ObjectList::part_selection_changed() else if (update_and_show_layers) wxGetApp().obj_layers()->get_og()->set_name(" " + og_name + " "); + update_min_height(); + Sidebar& panel = wxGetApp().sidebar(); panel.Freeze(); @@ -4463,9 +4479,9 @@ void ObjectList::update_item_error_icon(const int obj_idx, const int vol_idx) co void ObjectList::msw_rescale() { + set_min_height(); + const int em = wxGetApp().em_unit(); - // update min size !!! A width of control shouldn't be a wxDefaultCoord - SetMinSize(wxSize(1, 15 * em)); GetColumn(colName )->SetWidth(20 * em); GetColumn(colPrint )->SetWidth( 3 * em); diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index 52aefe0e655..15d5ecb08e1 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -197,6 +197,8 @@ class ObjectList : public wxDataViewCtrl SettingsBundle m_freq_settings_sla; #endif + size_t m_items_count { size_t(-1) }; + inline void ensure_current_item_visible() { if (const auto &item = this->GetCurrentItem()) @@ -208,6 +210,7 @@ class ObjectList : public wxDataViewCtrl ~ObjectList(); void set_min_height(); + void update_min_height(); std::map CATEGORY_ICON; From 6effa3032231088a0da5d882666c4ac7451b9223 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 30 Dec 2020 11:55:26 +0100 Subject: [PATCH 005/143] Move text color selection from ButtonsDescription to Preferences dialog (related to #5489) --- src/slic3r/GUI/GUI_App.cpp | 17 ++++++++++++-- src/slic3r/GUI/GUI_App.hpp | 1 + src/slic3r/GUI/Preferences.cpp | 41 ++++++++++++++++++++++++++++++++++ src/slic3r/GUI/Preferences.hpp | 4 ++++ src/slic3r/GUI/Tab.cpp | 28 +++++++++++------------ src/slic3r/GUI/Tab.hpp | 2 +- 6 files changed, 75 insertions(+), 18 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 3e82d6a3ca2..5fce4deb5e2 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -1024,6 +1024,12 @@ void GUI_App::update_label_colours_from_appconfig() } } +void GUI_App::update_label_colours() +{ + for (Tab* tab : tabs_list) + tab->update_label_colours(); +} + void GUI_App::init_fonts() { m_small_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); @@ -1057,7 +1063,10 @@ void GUI_App::update_fonts(const MainFrame *main_frame) m_code_font.SetPointSize(m_normal_font.GetPointSize()); } -void GUI_App::set_label_clr_modified(const wxColour& clr) { +void GUI_App::set_label_clr_modified(const wxColour& clr) +{ + if (m_color_label_modified == clr) + return; m_color_label_modified = clr; auto clr_str = wxString::Format(wxT("#%02X%02X%02X"), clr.Red(), clr.Green(), clr.Blue()); std::string str = clr_str.ToStdString(); @@ -1065,7 +1074,10 @@ void GUI_App::set_label_clr_modified(const wxColour& clr) { app_config->save(); } -void GUI_App::set_label_clr_sys(const wxColour& clr) { +void GUI_App::set_label_clr_sys(const wxColour& clr) +{ + if (m_color_label_sys == clr) + return; m_color_label_sys = clr; auto clr_str = wxString::Format(wxT("#%02X%02X%02X"), clr.Red(), clr.Green(), clr.Blue()); std::string str = clr_str.ToStdString(); @@ -1220,6 +1232,7 @@ void fatal_error(wxWindow* parent) // Update the UI based on the current preferences. void GUI_App::update_ui_from_settings(bool apply_free_camera_correction) { + update_label_colours(); mainframe->update_ui_from_settings(apply_free_camera_correction); } diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 8aceb7a6979..132776dcb3d 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -167,6 +167,7 @@ class GUI_App : public wxApp static bool dark_mode(); void init_label_colours(); void update_label_colours_from_appconfig(); + void update_label_colours(); void init_fonts(); void update_fonts(const MainFrame *main_frame = nullptr); void set_label_clr_modified(const wxColour& clr); diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 9c9ea8c4b35..0a8a6c886e1 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -312,6 +312,7 @@ void PreferencesDialog::build() m_icon_size_sizer->ShowItems(app_config->get("use_custom_toolbar_size") == "1"); create_settings_mode_widget(); + create_settings_text_color_widget(); } #if ENABLE_ENVIRONMENT_MAP @@ -379,6 +380,10 @@ void PreferencesDialog::accept() app_config->set(it->first, it->second); app_config->save(); + + wxGetApp().set_label_clr_sys(m_sys_colour->GetColour()); + wxGetApp().set_label_clr_modified(m_mod_colour->GetColour()); + EndModal(wxID_OK); if (m_settings_layout_changed) @@ -498,6 +503,42 @@ void PreferencesDialog::create_settings_mode_widget() m_optgroup_gui->sizer->Add(sizer, 0, wxEXPAND); } +void PreferencesDialog::create_settings_text_color_widget() +{ + wxWindow* parent = m_optgroup_gui->parent(); + + wxStaticBox* stb = new wxStaticBox(parent, wxID_ANY, _L("Text color Settings")); + if (!wxOSX) stb->SetBackgroundStyle(wxBG_STYLE_PAINT); + + wxSizer* sizer = new wxStaticBoxSizer(stb, wxVERTICAL); + wxFlexGridSizer* grid_sizer = new wxFlexGridSizer(2, 10, 20); + sizer->Add(grid_sizer, 0, wxEXPAND); + + auto sys_label = new wxStaticText(parent, wxID_ANY, _L("Value is the same as the system value")); + sys_label->SetForegroundColour(wxGetApp().get_label_clr_sys()); + m_sys_colour = new wxColourPickerCtrl(parent, wxID_ANY, wxGetApp().get_label_clr_sys()); + m_sys_colour->Bind(wxEVT_COLOURPICKER_CHANGED, [this, sys_label](wxCommandEvent&) { + sys_label->SetForegroundColour(m_sys_colour->GetColour()); + sys_label->Refresh(); + }); + + grid_sizer->Add(m_sys_colour, -1, wxALIGN_CENTRE_VERTICAL); + grid_sizer->Add(sys_label, -1, wxALIGN_CENTRE_VERTICAL | wxEXPAND); + + auto mod_label = new wxStaticText(parent, wxID_ANY, _L("Value was changed and is not equal to the system value or the last saved preset")); + mod_label->SetForegroundColour(wxGetApp().get_label_clr_modified()); + m_mod_colour = new wxColourPickerCtrl(parent, wxID_ANY, wxGetApp().get_label_clr_modified()); + m_mod_colour->Bind(wxEVT_COLOURPICKER_CHANGED, [this, mod_label](wxCommandEvent&) { + mod_label->SetForegroundColour(m_mod_colour->GetColour()); + mod_label->Refresh(); + }); + + grid_sizer->Add(m_mod_colour, -1, wxALIGN_CENTRE_VERTICAL); + grid_sizer->Add(mod_label, -1, wxALIGN_CENTRE_VERTICAL | wxEXPAND); + + m_optgroup_gui->sizer->Add(sizer, 0, wxEXPAND | wxTOP, em_unit()); +} + } // GUI } // Slic3r diff --git a/src/slic3r/GUI/Preferences.hpp b/src/slic3r/GUI/Preferences.hpp index 68574fbcca3..0da04473655 100644 --- a/src/slic3r/GUI/Preferences.hpp +++ b/src/slic3r/GUI/Preferences.hpp @@ -8,6 +8,7 @@ #include class wxRadioBox; +class wxColourPickerCtrl; namespace Slic3r { namespace GUI { @@ -25,6 +26,8 @@ class PreferencesDialog : public DPIDialog #endif // ENABLE_ENVIRONMENT_MAP wxSizer* m_icon_size_sizer; wxRadioBox* m_layout_mode_box; + wxColourPickerCtrl* m_sys_colour {nullptr}; + wxColourPickerCtrl* m_mod_colour {nullptr}; bool isOSX {false}; bool m_settings_layout_changed {false}; bool m_seq_top_layer_only_changed{ false }; @@ -43,6 +46,7 @@ class PreferencesDialog : public DPIDialog void layout(); void create_icon_size_slider(); void create_settings_mode_widget(); + void create_settings_text_color_widget(); }; } // GUI diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 0656c7e0d5d..963f3c13bbf 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -235,18 +235,11 @@ void Tab::create_preset_tab() m_undo_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_roll_back_value(); })); m_undo_to_sys_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_roll_back_value(true); })); - m_question_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) - { + m_question_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent) { ButtonsDescription dlg(this, m_icon_descriptions); - if (dlg.ShowModal() == wxID_OK) { - // Colors for ui "decoration" - for (Tab *tab : wxGetApp().tabs_list) { - tab->m_sys_label_clr = wxGetApp().get_label_clr_sys(); - tab->m_modified_label_clr = wxGetApp().get_label_clr_modified(); - tab->update_labels_colour(); - } - } - })); + if (dlg.ShowModal() == wxID_OK) + wxGetApp().update_label_colours(); + }); m_search_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent) { wxGetApp().plater()->search(false); }); // Colors for ui "decoration" @@ -482,8 +475,13 @@ void Tab::OnActivate() Refresh(); } -void Tab::update_labels_colour() +void Tab::update_label_colours() { + if (m_sys_label_clr == wxGetApp().get_label_clr_sys() && m_modified_label_clr == wxGetApp().get_label_clr_modified()) + return; + m_sys_label_clr = wxGetApp().get_label_clr_sys(); + m_modified_label_clr = wxGetApp().get_label_clr_modified(); + //update options "decoration" for (const auto opt : m_options_list) { @@ -529,6 +527,8 @@ void Tab::update_labels_colour() } cur_item = m_treectrl->GetNextVisible(cur_item); } + + decorate(); } void Tab::decorate() @@ -992,9 +992,7 @@ void Tab::sys_color_changed() m_treectrl->AssignImageList(m_icons); // Colors for ui "decoration" - m_sys_label_clr = wxGetApp().get_label_clr_sys(); - m_modified_label_clr = wxGetApp().get_label_clr_modified(); - update_labels_colour(); + update_label_colours(); // update options_groups if (m_active_page) diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 04aa9a0ef6f..bf0b9216365 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -295,7 +295,7 @@ class Tab: public wxPanel void toggle_show_hide_incompatible(); void update_show_hide_incompatible_button(); void update_ui_from_settings(); - void update_labels_colour(); + void update_label_colours(); void decorate(); void update_changed_ui(); void get_sys_and_mod_flags(const std::string& opt_key, bool& sys_page, bool& modified_page); From c747502db94da693734ada7194544bb904970dd2 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 30 Dec 2020 12:44:07 +0100 Subject: [PATCH 006/143] Fix of #5517 "Unsupported Selection" error when copy pasting objects with modifiers... --- src/slic3r/GUI/GUI_ObjectList.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 4475e30ca2d..a2cb9c64bf7 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -3671,16 +3671,28 @@ void ObjectList::update_selections() return; sels.Add(m_objects_model->GetItemById(selection.get_object_idx())); } - if (selection.is_single_volume() || selection.is_any_modifier()) { + else if (selection.is_single_volume() || selection.is_any_modifier()) { const auto gl_vol = selection.get_volume(*selection.get_volume_idxs().begin()); if (m_objects_model->GetVolumeIdByItem(m_objects_model->GetParent(item)) == gl_vol->volume_idx()) return; } - // but if there is selected only one of several instances by context menu, // then select this instance in ObjectList - if (selection.is_single_full_instance()) + else if (selection.is_single_full_instance()) sels.Add(m_objects_model->GetItemByInstanceId(selection.get_object_idx(), selection.get_instance_idx())); + // Can be the case, when we have selected itSettings | itLayerRoot | itLayer in the ObjectList and selected object/instance in the Scene + // and then select some object/instance in 3DScene using Ctrt+left click + // see https://github.com/prusa3d/PrusaSlicer/issues/5517 + else { + // Unselect all items in ObjectList + m_last_selected_item = wxDataViewItem(nullptr); + m_prevent_list_events = true; + UnselectAll(); + m_prevent_list_events = false; + // call this function again to update selection from the canvas + update_selections(); + return; + } } else if (selection.is_single_full_object() || selection.is_multiple_full_object()) { From c3f88db392fb8cb600d5c90f67369ab1470f2c4e Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 4 Jan 2021 18:05:20 +0100 Subject: [PATCH 007/143] Fix of #5638 --- src/slic3r/GUI/SavePresetDialog.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/slic3r/GUI/SavePresetDialog.cpp b/src/slic3r/GUI/SavePresetDialog.cpp index 65bd3acb90c..e659f8e02a3 100644 --- a/src/slic3r/GUI/SavePresetDialog.cpp +++ b/src/slic3r/GUI/SavePresetDialog.cpp @@ -153,6 +153,11 @@ void SavePresetDialog::Item::update() m_valid_type = NoValid; } + if (m_valid_type == Valid && m_presets->get_preset_name_by_alias(m_preset_name) != m_preset_name) { + info_line = _L("The name cannot be the same as a preset alias name."); + m_valid_type = NoValid; + } + m_valid_label->SetLabel(info_line); m_valid_label->Show(!info_line.IsEmpty()); From 3070e66aaee5d0b72c37d201a74b861ecadb2f47 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 7 Jan 2021 08:52:45 +0100 Subject: [PATCH 008/143] Fixed black rects for extruder colors, when we load 3mf project with MM-printer profile and extruder colors is set to the filament colors + Fixed a bug with updating colors in extruder editors in ObjectList, when we use filaments colors for extruders and some filament profile is switched --- src/slic3r/GUI/Plater.cpp | 41 ++++++++++++++++++++++++--------------- src/slic3r/GUI/Plater.hpp | 1 + 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 71e17b48989..f6b22a5b2c6 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2384,6 +2384,10 @@ std::vector Plater::priv::load_files(const std::vector& input_ CustomGCode::update_custom_gcode_per_print_z_from_config(model.custom_gcode_per_print_z, &wxGetApp().preset_bundle->project_config); // For exporting from the amf/3mf we shouldn't check printer_presets for the containing information about "Print Host upload" wxGetApp().load_current_presets(false); + // Update filament colors for the MM-printer profile in the full config + // to avoid black (default) colors for Extruders in the ObjectList, + // when for extruder colors are used filament colors + q->update_filament_colors_in_full_config(); is_project_file = true; } wxGetApp().app_config->update_config_dir(path.parent_path().string()); @@ -5786,6 +5790,26 @@ void Plater::on_extruders_change(size_t num_extruders) sidebar().scrolled_panel()->Refresh(); } +bool Plater::update_filament_colors_in_full_config() +{ + // There is a case, when we use filament_color instead of extruder_color (when extruder_color == ""). + // Thus plater config option "filament_colour" should be filled with filament_presets values. + // Otherwise, on 3dScene will be used last edited filament color for all volumes with extruder_color == "". + const std::vector filament_presets = wxGetApp().preset_bundle->filament_presets; + if (filament_presets.size() == 1 || !p->config->has("filament_colour")) + return false; + + const PresetCollection& filaments = wxGetApp().preset_bundle->filaments; + std::vector filament_colors; + filament_colors.reserve(filament_presets.size()); + + for (const std::string& filament_preset : filament_presets) + filament_colors.push_back(filaments.find_preset(filament_preset, true)->config.opt_string("filament_colour", (unsigned)0)); + + p->config->option("filament_colour")->values = filament_colors; + return true; +} + void Plater::on_config_change(const DynamicPrintConfig &config) { bool update_scheduled = false; @@ -5795,22 +5819,7 @@ void Plater::on_config_change(const DynamicPrintConfig &config) { update_scheduled = true; // update should be scheduled (for update 3DScene) #2738 - /* There is a case, when we use filament_color instead of extruder_color (when extruder_color == ""). - * Thus plater config option "filament_colour" should be filled with filament_presets values. - * Otherwise, on 3dScene will be used last edited filament color for all volumes with extruder_color == "". - */ - const std::vector filament_presets = wxGetApp().preset_bundle->filament_presets; - if (filament_presets.size() > 1 && - p->config->option(opt_key)->values.size() != config.option(opt_key)->values.size()) - { - const PresetCollection& filaments = wxGetApp().preset_bundle->filaments; - std::vector filament_colors; - filament_colors.reserve(filament_presets.size()); - - for (const std::string& filament_preset : filament_presets) - filament_colors.push_back(filaments.find_preset(filament_preset, true)->config.opt_string("filament_colour", (unsigned)0)); - - p->config->option(opt_key)->values = filament_colors; + if (update_filament_colors_in_full_config()) { p->sidebar->obj_list()->update_extruder_colors(); continue; } diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 5c7c6d7c981..5407a6e858a 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -233,6 +233,7 @@ class Plater: public wxPanel void leave_gizmos_stack(); void on_extruders_change(size_t extruders_count); + bool update_filament_colors_in_full_config(); void on_config_change(const DynamicPrintConfig &config); void force_filament_colors_update(); void force_print_bed_update(); From 27bd79e409aebc5a5910da999d981a85ba65aa02 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 7 Jan 2021 09:06:15 +0100 Subject: [PATCH 009/143] Fixed merging error after merge with master --- src/slic3r/GUI/GCodeViewer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 0af10270e2d..097511565c8 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1964,7 +1964,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool #if ENABLE_GCODE_VIEWER_STATISTICS for (const TBuffer& buffer : m_buffers) { - m_statistics.render_paths_size += SLIC3R_STDVEC_MEMSIZE(buffer.render_paths, RenderPath); + m_statistics.render_paths_size += SLIC3R_STDUNORDEREDSET_MEMSIZE(buffer.render_paths, RenderPath); for (const RenderPath& path : buffer.render_paths) { m_statistics.render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.sizes, unsigned int); m_statistics.render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.offsets, size_t); From ebed29708de1d544c8ae31af5b31d8e52465af53 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 7 Jan 2021 09:57:37 +0100 Subject: [PATCH 010/143] Refactoring of GCodeViewer initialization --- src/slic3r/GUI/GCodeViewer.cpp | 88 +++++++++++++++------------------- src/slic3r/GUI/GCodeViewer.hpp | 8 ++-- 2 files changed, 42 insertions(+), 54 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 097511565c8..1ae18444772 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -306,10 +306,47 @@ const std::vector GCodeViewer::Range_Colors {{ { 0.581f, 0.149f, 0.087f } // reddish }}; -void GCodeViewer::load(const GCodeProcessor::Result& gcode_result, const Print& print, bool initialized) +GCodeViewer::GCodeViewer() { - init(); + // initializes non opengl data of TBuffers + for (size_t i = 0; i < m_buffers.size(); ++i) { + TBuffer& buffer = m_buffers[i]; + switch (buffer_type(i)) + { + default: { break; } + case EMoveType::Tool_change: + case EMoveType::Color_change: + case EMoveType::Pause_Print: + case EMoveType::Custom_GCode: + case EMoveType::Retract: + case EMoveType::Unretract: + { + buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Point; + buffer.vertices.format = VBuffer::EFormat::Position; + break; + } + case EMoveType::Wipe: + case EMoveType::Extrude: + { + buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Triangle; + buffer.vertices.format = VBuffer::EFormat::PositionNormal3; + break; + } + case EMoveType::Travel: + { + buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Line; + buffer.vertices.format = VBuffer::EFormat::PositionNormal1; + break; + } + } + } + + set_toolpath_move_type_visible(EMoveType::Extrude, true); +// m_sequential_view.skip_invisible_moves = true; +} +void GCodeViewer::load(const GCodeProcessor::Result& gcode_result, const Print& print, bool initialized) +{ // avoid processing if called with the same gcode_result if (m_last_result_id == gcode_result.id) return; @@ -460,9 +497,6 @@ void GCodeViewer::update_shells_color_by_extruder(const DynamicPrintConfig* conf void GCodeViewer::reset() { - m_initialized = false; - m_gl_data_initialized = false; - m_moves_count = 0; for (TBuffer& buffer : m_buffers) { buffer.reset(); @@ -955,50 +989,6 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const fclose(fp); } -void GCodeViewer::init() -{ - if (m_initialized) - return; - - // initializes non opengl data of TBuffers - for (size_t i = 0; i < m_buffers.size(); ++i) { - TBuffer& buffer = m_buffers[i]; - switch (buffer_type(i)) - { - default: { break; } - case EMoveType::Tool_change: - case EMoveType::Color_change: - case EMoveType::Pause_Print: - case EMoveType::Custom_GCode: - case EMoveType::Retract: - case EMoveType::Unretract: - { - buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Point; - buffer.vertices.format = VBuffer::EFormat::Position; - break; - } - case EMoveType::Wipe: - case EMoveType::Extrude: - { - buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Triangle; - buffer.vertices.format = VBuffer::EFormat::PositionNormal3; - break; - } - case EMoveType::Travel: - { - buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Line; - buffer.vertices.format = VBuffer::EFormat::PositionNormal1; - break; - } - } - } - - set_toolpath_move_type_visible(EMoveType::Extrude, true); -// m_sequential_view.skip_invisible_moves = true; - - m_initialized = true; -} - void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) { #if ENABLE_GCODE_VIEWER_STATISTICS diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 31092e30d97..a929fcc6bfe 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -195,7 +195,7 @@ class GCodeViewer std::string shader; std::vector paths; - // std::set seems to perform singificantly better, at least on Windows. + // std::set seems to perform significantly better, at least on Windows. // std::unordered_set render_paths; std::set render_paths; bool visible{ false }; @@ -228,7 +228,7 @@ class GCodeViewer { case ERenderPrimitiveType::Point: { return 0; } case ERenderPrimitiveType::Line: { return 1; } - case ERenderPrimitiveType::Triangle: { return 36; } // 1 vertex of 13th triangle + case ERenderPrimitiveType::Triangle: { return 36; } // 1st vertex of 13th triangle default: { return 0; } } } @@ -461,7 +461,6 @@ class GCodeViewer }; private: - bool m_initialized{ false }; mutable bool m_gl_data_initialized{ false }; unsigned int m_last_result_id{ 0 }; size_t m_moves_count{ 0 }; @@ -490,7 +489,7 @@ class GCodeViewer GCodeProcessor::Result::SettingsIds m_settings_ids; public: - GCodeViewer() = default; + GCodeViewer(); ~GCodeViewer() { reset(); } // extract rendering data from the given parameters @@ -536,7 +535,6 @@ class GCodeViewer void export_toolpaths_to_obj(const char* filename) const; private: - void init(); void load_toolpaths(const GCodeProcessor::Result& gcode_result); void load_shells(const Print& print, bool initialized); void refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const; From 83f60a9dd118d526fa4819c3cda999ca6cde48ea Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 7 Jan 2021 10:11:50 +0100 Subject: [PATCH 011/143] Small refactoring in GCodeViewer::load_toolpaths() --- src/slic3r/GUI/GCodeViewer.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 1ae18444772..6ecbcf2806a 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1053,7 +1053,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) // format data into the buffers to be rendered as lines auto add_vertices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, - TBuffer& buffer, std::vector& buffer_vertices) { + std::vector& buffer_vertices) { // x component of the normal to the current segment (the normal is parallel to the XY plane) float normal_x = (curr.position - prev.position).normalized()[1]; @@ -1413,7 +1413,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) break; } case TBuffer::ERenderPrimitiveType::Line: { - add_vertices_as_line(prev, curr, buffer, buffer_vertices); + add_vertices_as_line(prev, curr, buffer_vertices); break; } case TBuffer::ERenderPrimitiveType::Triangle: { @@ -1422,11 +1422,9 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) } } - EMoveType type = buffer_type(id); - if (type == EMoveType::Pause_Print || type == EMoveType::Custom_GCode) { + if (curr.type == EMoveType::Pause_Print || curr.type == EMoveType::Custom_GCode) { const float* const last_z = options_zs.empty() ? nullptr : &options_zs.back(); - float z = static_cast(curr.position[2]); - if (last_z == nullptr || z < *last_z - EPSILON || *last_z + EPSILON < z) + if (last_z == nullptr || curr.position[2] < *last_z - EPSILON || *last_z + EPSILON < curr.position[2]) options_zs.emplace_back(curr.position[2]); } } From 77f6606771215047fc723a3b3267b34ae5a54dd9 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 7 Jan 2021 11:13:07 +0100 Subject: [PATCH 012/143] Another refactoring in GCodeViewer::load_toolpaths() --- src/libslic3r/Technologies.hpp | 10 ++ src/slic3r/GUI/GCodeViewer.cpp | 204 ++++++++++++++++----------------- src/slic3r/GUI/GCodeViewer.hpp | 1 + 3 files changed, 113 insertions(+), 102 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index d09f1c6eec6..eabd711d536 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -107,4 +107,14 @@ #define ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING (1 && ENABLE_2_3_0_RC1) + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +//======= +// 2.3.1 +//======= +#define ENABLE_2_3_1 1 + +#define ENABLE_SPLITTED_VERTEX_BUFFER (1 && ENABLE_2_3_1) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 6ecbcf2806a..103c1f77707 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -748,7 +748,7 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const // get vertices data from vertex buffer on gpu size_t floats_per_vertex = buffer.vertices.vertex_size_floats(); - std::vector vertices = std::vector(buffer.vertices.count * floats_per_vertex); + VertexBuffer vertices = VertexBuffer(buffer.vertices.count * floats_per_vertex); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, buffer.vertices.id)); glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, 0, buffer.vertices.data_size_bytes(), vertices.data())); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); @@ -1025,7 +1025,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) m_max_bounding_box = m_paths_bounding_box; m_max_bounding_box.merge(m_paths_bounding_box.max + m_sequential_view.marker.get_bounding_box().size()[2] * Vec3d::UnitZ()); - auto log_memory_usage = [this](const std::string& label, const std::vector>& vertices, const std::vector& indices) { + auto log_memory_usage = [this](const std::string& label, const std::vector& vertices, const std::vector& indices) { int64_t vertices_size = 0; for (size_t i = 0; i < vertices.size(); ++i) { vertices_size += SLIC3R_STDVEC_MEMSIZE(vertices[i], float); @@ -1040,30 +1040,30 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) }; // format data into the buffers to be rendered as points - auto add_vertices_as_point = [](const GCodeProcessor::MoveVertex& curr, std::vector& buffer_vertices) { - for (int j = 0; j < 3; ++j) { - buffer_vertices.push_back(curr.position[j]); - } + auto add_vertices_as_point = [](const GCodeProcessor::MoveVertex& curr, VertexBuffer& vertices) { + vertices.push_back(curr.position[0]); + vertices.push_back(curr.position[1]); + vertices.push_back(curr.position[2]); }; auto add_indices_as_point = [](const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, - unsigned int index_buffer_id, IndexBuffer& buffer_indices, size_t move_id) { - buffer.add_path(curr, index_buffer_id, buffer_indices.size(), move_id); - buffer_indices.push_back(static_cast(buffer_indices.size())); + unsigned int index_buffer_id, IndexBuffer& indices, size_t move_id) { + buffer.add_path(curr, index_buffer_id, indices.size(), move_id); + indices.push_back(static_cast(indices.size())); }; // format data into the buffers to be rendered as lines auto add_vertices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, - std::vector& buffer_vertices) { + VertexBuffer& vertices) { // x component of the normal to the current segment (the normal is parallel to the XY plane) float normal_x = (curr.position - prev.position).normalized()[1]; - auto add_vertex = [&buffer_vertices, normal_x](const GCodeProcessor::MoveVertex& vertex) { + auto add_vertex = [&vertices, normal_x](const GCodeProcessor::MoveVertex& vertex) { // add position - for (int j = 0; j < 3; ++j) { - buffer_vertices.push_back(vertex.position[j]); - } + vertices.push_back(vertex.position[0]); + vertices.push_back(vertex.position[1]); + vertices.push_back(vertex.position[2]); // add normal x component - buffer_vertices.push_back(normal_x); + vertices.push_back(normal_x); }; // add previous vertex @@ -1072,48 +1072,48 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) add_vertex(curr); }; auto add_indices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, - unsigned int index_buffer_id, IndexBuffer& buffer_indices, size_t move_id) { + unsigned int index_buffer_id, IndexBuffer& indices, size_t move_id) { // x component of the normal to the current segment (the normal is parallel to the XY plane) float normal_x = (curr.position - prev.position).normalized()[1]; if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { // add starting index - buffer_indices.push_back(static_cast(buffer_indices.size())); - buffer.add_path(curr, index_buffer_id, buffer_indices.size() - 1, move_id - 1); + indices.push_back(static_cast(indices.size())); + buffer.add_path(curr, index_buffer_id, indices.size() - 1, move_id - 1); buffer.paths.back().first.position = prev.position; } Path& last_path = buffer.paths.back(); if (last_path.first.i_id != last_path.last.i_id) { // add previous index - buffer_indices.push_back(static_cast(buffer_indices.size())); + indices.push_back(static_cast(indices.size())); } // add current index - buffer_indices.push_back(static_cast(buffer_indices.size())); - last_path.last = { index_buffer_id, buffer_indices.size() - 1, move_id, curr.position }; + indices.push_back(static_cast(indices.size())); + last_path.last = { index_buffer_id, indices.size() - 1, move_id, curr.position }; }; // format data into the buffers to be rendered as solid auto add_vertices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, - std::vector& buffer_vertices, size_t move_id) { + VertexBuffer& vertices, size_t move_id) { static Vec3f prev_dir; static Vec3f prev_up; static float prev_length; - auto store_vertex = [](std::vector& buffer_vertices, const Vec3f& position, const Vec3f& normal) { + auto store_vertex = [](VertexBuffer& vertices, const Vec3f& position, const Vec3f& normal) { // append position - for (int j = 0; j < 3; ++j) { - buffer_vertices.push_back(position[j]); - } + vertices.push_back(position[0]); + vertices.push_back(position[1]); + vertices.push_back(position[2]); // append normal - for (int j = 0; j < 3; ++j) { - buffer_vertices.push_back(normal[j]); - } + vertices.push_back(normal[0]); + vertices.push_back(normal[1]); + vertices.push_back(normal[2]); }; - auto extract_position_at = [](const std::vector& vertices, size_t id) { + auto extract_position_at = [](const VertexBuffer& vertices, size_t id) { return Vec3f(vertices[id + 0], vertices[id + 1], vertices[id + 2]); }; - auto update_position_at = [](std::vector& vertices, size_t id, const Vec3f& position) { + auto update_position_at = [](VertexBuffer& vertices, size_t id, const Vec3f& position) { vertices[id + 0] = position[0]; vertices[id + 1] = position[1]; vertices[id + 2] = position[2]; @@ -1124,7 +1124,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) buffer.paths.back().first.position = prev.position; } - unsigned int starting_vertices_size = static_cast(buffer_vertices.size() / buffer.vertices.vertex_size_floats()); + unsigned int starting_vertices_size = static_cast(vertices.size() / buffer.vertices.vertex_size_floats()); Vec3f dir = (curr.position - prev.position).normalized(); Vec3f right = (std::abs(std::abs(dir.dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) ? -Vec3f::UnitY() : Vec3f(dir[1], -dir[0], 0.0f).normalized(); @@ -1145,16 +1145,16 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) // 1st segment // vertices 1st endpoint - store_vertex(buffer_vertices, prev_pos + half_height * up, up); - store_vertex(buffer_vertices, prev_pos + half_width * right, right); - store_vertex(buffer_vertices, prev_pos + half_height * down, down); - store_vertex(buffer_vertices, prev_pos + half_width * left, left); + store_vertex(vertices, prev_pos + half_height * up, up); + store_vertex(vertices, prev_pos + half_width * right, right); + store_vertex(vertices, prev_pos + half_height * down, down); + store_vertex(vertices, prev_pos + half_width * left, left); // vertices 2nd endpoint - store_vertex(buffer_vertices, curr_pos + half_height * up, up); - store_vertex(buffer_vertices, curr_pos + half_width * right, right); - store_vertex(buffer_vertices, curr_pos + half_height * down, down); - store_vertex(buffer_vertices, curr_pos + half_width * left, left); + store_vertex(vertices, curr_pos + half_height * up, up); + store_vertex(vertices, curr_pos + half_width * right, right); + store_vertex(vertices, curr_pos + half_height * down, down); + store_vertex(vertices, curr_pos + half_width * left, left); } else { // any other segment @@ -1171,8 +1171,8 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) size_t prev_right_id = (starting_vertices_size - 3) * buffer.vertices.vertex_size_floats(); size_t prev_left_id = (starting_vertices_size - 1) * buffer.vertices.vertex_size_floats(); - Vec3f prev_right_pos = extract_position_at(buffer_vertices, prev_right_id); - Vec3f prev_left_pos = extract_position_at(buffer_vertices, prev_left_id); + Vec3f prev_right_pos = extract_position_at(vertices, prev_right_id); + Vec3f prev_left_pos = extract_position_at(vertices, prev_left_id); bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f; // whether the angle between adjacent segments is greater than 45 degrees @@ -1185,12 +1185,12 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) if (can_displace) { if (is_right_turn) { prev_right_pos -= displacement_vec; - update_position_at(buffer_vertices, prev_right_id, prev_right_pos); + update_position_at(vertices, prev_right_id, prev_right_pos); right_displaced = true; } else { prev_left_pos -= displacement_vec; - update_position_at(buffer_vertices, prev_left_id, prev_left_pos); + update_position_at(vertices, prev_left_id, prev_left_pos); left_displaced = true; } } @@ -1200,39 +1200,39 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) if (can_displace) { if (is_right_turn) { prev_left_pos += displacement_vec; - update_position_at(buffer_vertices, prev_left_id, prev_left_pos); + update_position_at(vertices, prev_left_id, prev_left_pos); left_displaced = true; } else { prev_right_pos += displacement_vec; - update_position_at(buffer_vertices, prev_right_id, prev_right_pos); + update_position_at(vertices, prev_right_id, prev_right_pos); right_displaced = true; } } // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint) // vertices position matches that of the previous segment 2nd endpoint, if displaced - store_vertex(buffer_vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right); - store_vertex(buffer_vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); + store_vertex(vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right); + store_vertex(vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); } else { // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint) // the inner corner vertex position matches that of the previous segment 2nd endpoint, if displaced if (is_right_turn) { - store_vertex(buffer_vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right); - store_vertex(buffer_vertices, prev_pos + half_width * left, left); + store_vertex(vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right); + store_vertex(vertices, prev_pos + half_width * left, left); } else { - store_vertex(buffer_vertices, prev_pos + half_width * right, right); - store_vertex(buffer_vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); + store_vertex(vertices, prev_pos + half_width * right, right); + store_vertex(vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); } } // vertices 2nd endpoint - store_vertex(buffer_vertices, curr_pos + half_height * up, up); - store_vertex(buffer_vertices, curr_pos + half_width * right, right); - store_vertex(buffer_vertices, curr_pos + half_height * down, down); - store_vertex(buffer_vertices, curr_pos + half_width * left, left); + store_vertex(vertices, curr_pos + half_height * up, up); + store_vertex(vertices, curr_pos + half_width * right, right); + store_vertex(vertices, curr_pos + half_height * down, down); + store_vertex(vertices, curr_pos + half_width * left, left); } last_path.last = { 0, 0, move_id, curr.position }; @@ -1242,22 +1242,22 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) }; auto add_indices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, - size_t& buffer_vertices_size, unsigned int index_buffer_id, IndexBuffer& buffer_indices, size_t move_id) { + size_t& buffer_vertices_size, unsigned int index_buffer_id, IndexBuffer& indices, size_t move_id) { static Vec3f prev_dir; static Vec3f prev_up; static float prev_length; - auto store_triangle = [](IndexBuffer& buffer_indices, unsigned int i1, unsigned int i2, unsigned int i3) { - buffer_indices.push_back(i1); - buffer_indices.push_back(i2); - buffer_indices.push_back(i3); + auto store_triangle = [](IndexBuffer& indices, unsigned int i1, unsigned int i2, unsigned int i3) { + indices.push_back(i1); + indices.push_back(i2); + indices.push_back(i3); }; - auto append_dummy_cap = [store_triangle](IndexBuffer& buffer_indices, unsigned int id) { - store_triangle(buffer_indices, id, id, id); - store_triangle(buffer_indices, id, id, id); + auto append_dummy_cap = [store_triangle](IndexBuffer& indices, unsigned int id) { + store_triangle(indices, id, id, id); + store_triangle(indices, id, id, id); }; if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { - buffer.add_path(curr, index_buffer_id, buffer_indices.size(), move_id - 1); + buffer.add_path(curr, index_buffer_id, indices.size(), move_id - 1); buffer.paths.back().first.position = prev.position; } @@ -1281,25 +1281,25 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) buffer_vertices_size += 8; // triangles starting cap - store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size + 2, starting_vertices_size + 1); - store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size + 3, starting_vertices_size + 2); + store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 2, starting_vertices_size + 1); + store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 3, starting_vertices_size + 2); // dummy triangles outer corner cap - append_dummy_cap(buffer_indices, starting_vertices_size); + append_dummy_cap(indices, starting_vertices_size); // triangles sides - store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size + 1, starting_vertices_size + 4); - store_triangle(buffer_indices, starting_vertices_size + 1, starting_vertices_size + 5, starting_vertices_size + 4); - store_triangle(buffer_indices, starting_vertices_size + 1, starting_vertices_size + 2, starting_vertices_size + 5); - store_triangle(buffer_indices, starting_vertices_size + 2, starting_vertices_size + 6, starting_vertices_size + 5); - store_triangle(buffer_indices, starting_vertices_size + 2, starting_vertices_size + 3, starting_vertices_size + 6); - store_triangle(buffer_indices, starting_vertices_size + 3, starting_vertices_size + 7, starting_vertices_size + 6); - store_triangle(buffer_indices, starting_vertices_size + 3, starting_vertices_size + 0, starting_vertices_size + 7); - store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size + 4, starting_vertices_size + 7); + store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 1, starting_vertices_size + 4); + store_triangle(indices, starting_vertices_size + 1, starting_vertices_size + 5, starting_vertices_size + 4); + store_triangle(indices, starting_vertices_size + 1, starting_vertices_size + 2, starting_vertices_size + 5); + store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 6, starting_vertices_size + 5); + store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 3, starting_vertices_size + 6); + store_triangle(indices, starting_vertices_size + 3, starting_vertices_size + 7, starting_vertices_size + 6); + store_triangle(indices, starting_vertices_size + 3, starting_vertices_size + 0, starting_vertices_size + 7); + store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 4, starting_vertices_size + 7); // triangles ending cap - store_triangle(buffer_indices, starting_vertices_size + 4, starting_vertices_size + 6, starting_vertices_size + 7); - store_triangle(buffer_indices, starting_vertices_size + 4, starting_vertices_size + 5, starting_vertices_size + 6); + store_triangle(indices, starting_vertices_size + 4, starting_vertices_size + 6, starting_vertices_size + 7); + store_triangle(indices, starting_vertices_size + 4, starting_vertices_size + 5, starting_vertices_size + 6); } else { // any other segment @@ -1333,45 +1333,45 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) buffer_vertices_size += 6; // triangles starting cap - store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size - 2, starting_vertices_size + 0); - store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size + 1, starting_vertices_size - 2); + store_triangle(indices, starting_vertices_size - 4, starting_vertices_size - 2, starting_vertices_size + 0); + store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 1, starting_vertices_size - 2); // triangles outer corner cap if (is_right_turn) { if (left_displaced) // dummy triangles - append_dummy_cap(buffer_indices, starting_vertices_size); + append_dummy_cap(indices, starting_vertices_size); else { - store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size + 1, starting_vertices_size - 1); - store_triangle(buffer_indices, starting_vertices_size + 1, starting_vertices_size - 2, starting_vertices_size - 1); + store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 1, starting_vertices_size - 1); + store_triangle(indices, starting_vertices_size + 1, starting_vertices_size - 2, starting_vertices_size - 1); } } else { if (right_displaced) // dummy triangles - append_dummy_cap(buffer_indices, starting_vertices_size); + append_dummy_cap(indices, starting_vertices_size); else { - store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size - 3, starting_vertices_size + 0); - store_triangle(buffer_indices, starting_vertices_size - 3, starting_vertices_size - 2, starting_vertices_size + 0); + store_triangle(indices, starting_vertices_size - 4, starting_vertices_size - 3, starting_vertices_size + 0); + store_triangle(indices, starting_vertices_size - 3, starting_vertices_size - 2, starting_vertices_size + 0); } } // triangles sides - store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size + 0, starting_vertices_size + 2); - store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size + 3, starting_vertices_size + 2); - store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size - 2, starting_vertices_size + 3); - store_triangle(buffer_indices, starting_vertices_size - 2, starting_vertices_size + 4, starting_vertices_size + 3); - store_triangle(buffer_indices, starting_vertices_size - 2, starting_vertices_size + 1, starting_vertices_size + 4); - store_triangle(buffer_indices, starting_vertices_size + 1, starting_vertices_size + 5, starting_vertices_size + 4); - store_triangle(buffer_indices, starting_vertices_size + 1, starting_vertices_size - 4, starting_vertices_size + 5); - store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size + 2, starting_vertices_size + 5); + store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 0, starting_vertices_size + 2); + store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 3, starting_vertices_size + 2); + store_triangle(indices, starting_vertices_size + 0, starting_vertices_size - 2, starting_vertices_size + 3); + store_triangle(indices, starting_vertices_size - 2, starting_vertices_size + 4, starting_vertices_size + 3); + store_triangle(indices, starting_vertices_size - 2, starting_vertices_size + 1, starting_vertices_size + 4); + store_triangle(indices, starting_vertices_size + 1, starting_vertices_size + 5, starting_vertices_size + 4); + store_triangle(indices, starting_vertices_size + 1, starting_vertices_size - 4, starting_vertices_size + 5); + store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 2, starting_vertices_size + 5); // triangles ending cap - store_triangle(buffer_indices, starting_vertices_size + 2, starting_vertices_size + 4, starting_vertices_size + 5); - store_triangle(buffer_indices, starting_vertices_size + 2, starting_vertices_size + 3, starting_vertices_size + 4); + store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 4, starting_vertices_size + 5); + store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 3, starting_vertices_size + 4); } - last_path.last = { index_buffer_id, buffer_indices.size() - 1, move_id, curr.position }; + last_path.last = { index_buffer_id, indices.size() - 1, move_id, curr.position }; prev_dir = dir; prev_up = up; prev_length = length; @@ -1381,7 +1381,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) // to reduce the peak in memory usage, we split the generation of the vertex and index buffers in two steps. // the data are deleted as soon as they are sent to the gpu. - std::vector> vertices(m_buffers.size()); + std::vector vertices(m_buffers.size()); std::vector indices(m_buffers.size()); std::vector options_zs; @@ -1404,7 +1404,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) unsigned char id = buffer_id(curr.type); TBuffer& buffer = m_buffers[id]; - std::vector& buffer_vertices = vertices[id]; + VertexBuffer& buffer_vertices = vertices[id]; switch (buffer.render_primitive_type) { @@ -1430,7 +1430,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) } // move the wipe toolpaths half height up to render them on proper position - std::vector& wipe_vertices = vertices[buffer_id(EMoveType::Wipe)]; + VertexBuffer& wipe_vertices = vertices[buffer_id(EMoveType::Wipe)]; for (size_t i = 2; i < wipe_vertices.size(); i += 3) { wipe_vertices[i] += 0.5f * GCodeProcessor::Wipe_Height; } @@ -1441,7 +1441,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) for (size_t i = 0; i < m_buffers.size(); ++i) { TBuffer& buffer = m_buffers[i]; - const std::vector& buffer_vertices = vertices[i]; + const VertexBuffer& buffer_vertices = vertices[i]; buffer.vertices.count = buffer_vertices.size() / buffer.vertices.vertex_size_floats(); #if ENABLE_GCODE_VIEWER_STATISTICS m_statistics.total_vertices_gpu_size += buffer_vertices.size() * sizeof(float); @@ -1461,7 +1461,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) } // dismiss vertices data, no more needed - std::vector>().swap(vertices); + std::vector().swap(vertices); // toolpaths data -> extract indices from result // paths may have been filled while extracting vertices, diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index a929fcc6bfe..5f276b09f0a 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -20,6 +20,7 @@ namespace GUI { class GCodeViewer { using Color = std::array; + using VertexBuffer = std::vector; using IndexBuffer = std::vector; using MultiIndexBuffer = std::vector; From fb7dada01dfe45f5f5c822bdd0a0684f135aa4eb Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 12 Jan 2021 09:03:35 +0100 Subject: [PATCH 013/143] 1st installment of tech ENABLE_SPLITTED_VERTEX_BUFFER - split vertex buffer when greater than a fixed max size --- src/slic3r/GUI/GCodeViewer.cpp | 1905 +++++++++++++++++++++++++++----- src/slic3r/GUI/GCodeViewer.hpp | 182 ++- 2 files changed, 1763 insertions(+), 324 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 103c1f77707..aaafd333d00 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -79,6 +79,20 @@ static float round_to_nearest(float value, unsigned int decimals) return res; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER +void GCodeViewer::VBuffer::reset() +{ + // release gpu memory + if (!ids.empty()) { + glsafe(::glDeleteBuffers(static_cast(ids.size()), static_cast(ids.data()))); + ids.clear(); + } + + count = 0; +} +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GCodeViewer::VBuffer::reset() { // release gpu memory @@ -89,15 +103,35 @@ void GCodeViewer::VBuffer::reset() count = 0; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GCodeViewer::IBuffer::reset() { // release gpu memory +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER + // release gpu memory + if (ibo > 0) { + glsafe(::glDeleteBuffers(1, &ibo)); + ibo = 0; + } +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (id > 0) { glsafe(::glDeleteBuffers(1, &id)); id = 0; } - +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER + vbo = 0; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ count = 0; } @@ -119,6 +153,21 @@ bool GCodeViewer::Path::matches(const GCodeProcessor::MoveVertex& move) const case EMoveType::Unretract: case EMoveType::Extrude: { // use rounding to reduce the number of generated paths +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER +#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE + return type == move.type && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id && role == move.extrusion_role && + move.position[2] <= sub_paths.front().first.position[2] && feedrate == move.feedrate && fan_speed == move.fan_speed && + height == round_to_nearest(move.height, 2) && width == round_to_nearest(move.width, 2) && + matches_percent(volumetric_rate, move.volumetric_rate(), 0.05f); +#else + return type == move.type && move.position[2] <= sub_paths.front().position[2] && role == move.extrusion_role && height == round_to_nearest(move.height, 2) && + width == round_to_nearest(move.width, 2) && feedrate == move.feedrate && fan_speed == move.fan_speed && + volumetric_rate == round_to_nearest(move.volumetric_rate(), 2) && extruder_id == move.extruder_id && + cp_color_id == move.cp_color_id; +#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE return type == move.type && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id && role == move.extrusion_role && move.position[2] <= first.position[2] && feedrate == move.feedrate && fan_speed == move.fan_speed && @@ -130,6 +179,9 @@ bool GCodeViewer::Path::matches(const GCodeProcessor::MoveVertex& move) const volumetric_rate == round_to_nearest(move.volumetric_rate(), 2) && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id; #endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } case EMoveType::Travel: { return type == move.type && feedrate == move.feedrate && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id; @@ -156,6 +208,19 @@ void GCodeViewer::TBuffer::add_path(const GCodeProcessor::MoveVertex& move, unsi { Path::Endpoint endpoint = { b_id, i_id, s_id, move.position }; // use rounding to reduce the number of generated paths +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER +#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE + paths.push_back({ move.type, move.extrusion_role, move.delta_extruder, + round_to_nearest(move.height, 2), round_to_nearest(move.width, 2), move.feedrate, move.fan_speed, + move.volumetric_rate(), move.extruder_id, move.cp_color_id, { { endpoint, endpoint } } }); +#else + paths.push_back({ move.type, move.extrusion_role, move.delta_extruder, + round_to_nearest(move.height, 2), round_to_nearest(move.width, 2), move.feedrate, move.fan_speed, + round_to_nearest(move.volumetric_rate(), 2), move.extruder_id, move.cp_color_id, { { endpoint, endpoint } } }); +#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE paths.push_back({ move.type, move.extrusion_role, endpoint, endpoint, move.delta_extruder, round_to_nearest(move.height, 2), round_to_nearest(move.width, 2), move.feedrate, move.fan_speed, @@ -165,6 +230,9 @@ void GCodeViewer::TBuffer::add_path(const GCodeProcessor::MoveVertex& move, unsi round_to_nearest(move.height, 2), round_to_nearest(move.width, 2), move.feedrate, move.fan_speed, round_to_nearest(move.volumetric_rate(), 2), move.extruder_id, move.cp_color_id }); #endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } GCodeViewer::Color GCodeViewer::Extrusions::Range::get_color_at(float value) const @@ -319,21 +387,18 @@ GCodeViewer::GCodeViewer() case EMoveType::Pause_Print: case EMoveType::Custom_GCode: case EMoveType::Retract: - case EMoveType::Unretract: - { + case EMoveType::Unretract: { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Point; buffer.vertices.format = VBuffer::EFormat::Position; break; } case EMoveType::Wipe: - case EMoveType::Extrude: - { + case EMoveType::Extrude: { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Triangle; buffer.vertices.format = VBuffer::EFormat::PositionNormal3; break; } - case EMoveType::Travel: - { + case EMoveType::Travel: { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Line; buffer.vertices.format = VBuffer::EFormat::PositionNormal1; break; @@ -357,6 +422,7 @@ void GCodeViewer::load(const GCodeProcessor::Result& gcode_result, const Print& reset(); load_toolpaths(gcode_result); + if (m_layers.empty()) return; @@ -526,7 +592,8 @@ void GCodeViewer::render() const // initializes opengl data of TBuffers for (size_t i = 0; i < m_buffers.size(); ++i) { TBuffer& buffer = m_buffers[i]; - switch (buffer_type(i)) { + switch (buffer_type(i)) + { default: { break; } case EMoveType::Tool_change: case EMoveType::Color_change: @@ -590,8 +657,16 @@ void GCodeViewer::update_sequential_view_current(unsigned int first, unsigned in for (const TBuffer& buffer : m_buffers) { if (buffer.visible) { for (const Path& path : buffer.paths) { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER + if (path.sub_paths.front().first.s_id <= id && id <= path.sub_paths.back().last.s_id) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (path.first.s_id <= id && id <= path.last.s_id) - return true; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + return true; } } } @@ -694,6 +769,10 @@ void GCodeViewer::set_layers_z_range(const std::array& layers_z void GCodeViewer::export_toolpaths_to_obj(const char* filename) const { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + if (filename == nullptr) return; @@ -820,6 +899,7 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const // get paths segments from buffer paths const IndexBuffer& ibuffer = indices[render_path.index_buffer_id]; const Path& path = buffer.paths[render_path.path_id]; + float half_width = 0.5f * path.width; // clamp height to avoid artifacts due to z-fighting when importing the obj file into blender and similar float half_height = std::max(0.5f * path.height, 0.005f); @@ -987,53 +1067,27 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const } fclose(fp); + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) { -#if ENABLE_GCODE_VIEWER_STATISTICS - auto start_time = std::chrono::high_resolution_clock::now(); - m_statistics.results_size = SLIC3R_STDVEC_MEMSIZE(gcode_result.moves, GCodeProcessor::MoveVertex); - m_statistics.results_time = gcode_result.time; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - // vertices data - m_moves_count = gcode_result.moves.size(); - if (m_moves_count == 0) - return; - - unsigned int progress_count = 0; - static const unsigned int progress_threshold = 1000; - wxProgressDialog* progress_dialog = wxGetApp().is_gcode_viewer() ? - new wxProgressDialog(_L("Generating toolpaths"), "...", - 100, wxGetApp().plater(), wxPD_AUTO_HIDE | wxPD_APP_MODAL) : nullptr; - - m_extruders_count = gcode_result.extruders_count; - - for (size_t i = 0; i < m_moves_count; ++i) { - const GCodeProcessor::MoveVertex& move = gcode_result.moves[i]; - if (wxGetApp().is_gcode_viewer()) - // for the gcode viewer we need all moves to correctly size the printbed - m_paths_bounding_box.merge(move.position.cast()); - else { - if (move.type == EMoveType::Extrude && move.width != 0.0f && move.height != 0.0f) - m_paths_bounding_box.merge(move.position.cast()); - } - } - - // max bounding box (account for tool marker) - m_max_bounding_box = m_paths_bounding_box; - m_max_bounding_box.merge(m_paths_bounding_box.max + m_sequential_view.marker.get_bounding_box().size()[2] * Vec3d::UnitZ()); - - auto log_memory_usage = [this](const std::string& label, const std::vector& vertices, const std::vector& indices) { + auto log_memory_usage = [this](const std::string& label, const std::vector& vertices, const std::vector& indices) { int64_t vertices_size = 0; - for (size_t i = 0; i < vertices.size(); ++i) { - vertices_size += SLIC3R_STDVEC_MEMSIZE(vertices[i], float); + for (const MultiVertexBuffer& v_multibuffer : vertices) { + for (const VertexBuffer& v_buffer : v_multibuffer) { + vertices_size += SLIC3R_STDVEC_MEMSIZE(v_buffer, float); + } } int64_t indices_size = 0; - for (size_t i = 0; i < indices.size(); ++i) { - for (size_t j = 0; j < indices[i].size(); ++j) { - indices_size += SLIC3R_STDVEC_MEMSIZE(indices[i][j], unsigned int); + for (const MultiIndexBuffer& i_multibuffer : indices) { + for (const IndexBuffer& i_buffer : i_multibuffer) { + indices_size += SLIC3R_STDVEC_MEMSIZE(i_buffer, unsigned int); } } log_memory_used(label, vertices_size + indices_size); @@ -1046,203 +1100,200 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) vertices.push_back(curr.position[2]); }; auto add_indices_as_point = [](const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, - unsigned int index_buffer_id, IndexBuffer& indices, size_t move_id) { - buffer.add_path(curr, index_buffer_id, indices.size(), move_id); + unsigned int i_buffer_id, IndexBuffer& indices, size_t move_id) { + buffer.add_path(curr, i_buffer_id, indices.size(), move_id); indices.push_back(static_cast(indices.size())); }; // format data into the buffers to be rendered as lines - auto add_vertices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, - VertexBuffer& vertices) { - // x component of the normal to the current segment (the normal is parallel to the XY plane) - float normal_x = (curr.position - prev.position).normalized()[1]; - - auto add_vertex = [&vertices, normal_x](const GCodeProcessor::MoveVertex& vertex) { - // add position - vertices.push_back(vertex.position[0]); - vertices.push_back(vertex.position[1]); - vertices.push_back(vertex.position[2]); - // add normal x component - vertices.push_back(normal_x); - }; + auto add_vertices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, VertexBuffer& vertices) { + // x component of the normal to the current segment (the normal is parallel to the XY plane) + float normal_x = (curr.position - prev.position).normalized()[1]; + + auto add_vertex = [&vertices, normal_x](const GCodeProcessor::MoveVertex& vertex) { + // add position + vertices.push_back(vertex.position[0]); + vertices.push_back(vertex.position[1]); + vertices.push_back(vertex.position[2]); + // add normal x component + vertices.push_back(normal_x); + }; - // add previous vertex - add_vertex(prev); - // add current vertex - add_vertex(curr); + // add previous vertex + add_vertex(prev); + // add current vertex + add_vertex(curr); }; auto add_indices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, - unsigned int index_buffer_id, IndexBuffer& indices, size_t move_id) { - // x component of the normal to the current segment (the normal is parallel to the XY plane) - float normal_x = (curr.position - prev.position).normalized()[1]; - + unsigned int i_buffer_id, IndexBuffer& indices, size_t move_id) { if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { // add starting index indices.push_back(static_cast(indices.size())); - buffer.add_path(curr, index_buffer_id, indices.size() - 1, move_id - 1); - buffer.paths.back().first.position = prev.position; + buffer.add_path(curr, i_buffer_id, indices.size() - 1, move_id - 1); + buffer.paths.back().sub_paths.front().first.position = prev.position; } Path& last_path = buffer.paths.back(); - if (last_path.first.i_id != last_path.last.i_id) { + if (last_path.sub_paths.front().first.i_id != last_path.sub_paths.back().last.i_id) { // add previous index indices.push_back(static_cast(indices.size())); } // add current index indices.push_back(static_cast(indices.size())); - last_path.last = { index_buffer_id, indices.size() - 1, move_id, curr.position }; + last_path.sub_paths.back().last = { i_buffer_id, indices.size() - 1, move_id, curr.position }; }; // format data into the buffers to be rendered as solid - auto add_vertices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, - VertexBuffer& vertices, size_t move_id) { - static Vec3f prev_dir; - static Vec3f prev_up; - static float prev_length; - auto store_vertex = [](VertexBuffer& vertices, const Vec3f& position, const Vec3f& normal) { - // append position - vertices.push_back(position[0]); - vertices.push_back(position[1]); - vertices.push_back(position[2]); - // append normal - vertices.push_back(normal[0]); - vertices.push_back(normal[1]); - vertices.push_back(normal[2]); - }; - auto extract_position_at = [](const VertexBuffer& vertices, size_t id) { - return Vec3f(vertices[id + 0], vertices[id + 1], vertices[id + 2]); - }; - auto update_position_at = [](VertexBuffer& vertices, size_t id, const Vec3f& position) { - vertices[id + 0] = position[0]; - vertices[id + 1] = position[1]; - vertices[id + 2] = position[2]; - }; + auto add_vertices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, VertexBuffer& vertices, size_t move_id) { + static Vec3f prev_dir; + static Vec3f prev_up; + static float prev_length; + auto store_vertex = [](VertexBuffer& vertices, const Vec3f& position, const Vec3f& normal) { + // append position + vertices.push_back(position[0]); + vertices.push_back(position[1]); + vertices.push_back(position[2]); + // append normal + vertices.push_back(normal[0]); + vertices.push_back(normal[1]); + vertices.push_back(normal[2]); + }; + auto extract_position_at = [](const VertexBuffer& vertices, size_t id) { + return Vec3f(vertices[id + 0], vertices[id + 1], vertices[id + 2]); + }; + auto update_position_at = [](VertexBuffer& vertices, size_t id, const Vec3f& position) { + vertices[id + 0] = position[0]; + vertices[id + 1] = position[1]; + vertices[id + 2] = position[2]; + }; - if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { - buffer.add_path(curr, 0, 0, move_id - 1); - buffer.paths.back().first.position = prev.position; - } + if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { + buffer.add_path(curr, 0, 0, move_id - 1); + buffer.paths.back().sub_paths.back().first.position = prev.position; + } - unsigned int starting_vertices_size = static_cast(vertices.size() / buffer.vertices.vertex_size_floats()); + unsigned int starting_vertices_size = static_cast(vertices.size() / buffer.vertices.vertex_size_floats()); - Vec3f dir = (curr.position - prev.position).normalized(); - Vec3f right = (std::abs(std::abs(dir.dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) ? -Vec3f::UnitY() : Vec3f(dir[1], -dir[0], 0.0f).normalized(); - Vec3f left = -right; - Vec3f up = right.cross(dir); - Vec3f down = -up; + Vec3f dir = (curr.position - prev.position).normalized(); + Vec3f right = (std::abs(std::abs(dir.dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) ? -Vec3f::UnitY() : Vec3f(dir[1], -dir[0], 0.0f).normalized(); + Vec3f left = -right; + Vec3f up = right.cross(dir); + Vec3f down = -up; - Path& last_path = buffer.paths.back(); + Path& last_path = buffer.paths.back(); - float half_width = 0.5f * last_path.width; - float half_height = 0.5f * last_path.height; + float half_width = 0.5f * last_path.width; + float half_height = 0.5f * last_path.height; - Vec3f prev_pos = prev.position - half_height * up; - Vec3f curr_pos = curr.position - half_height * up; + Vec3f prev_pos = prev.position - half_height * up; + Vec3f curr_pos = curr.position - half_height * up; - float length = (curr_pos - prev_pos).norm(); - if (last_path.vertices_count() == 1) { - // 1st segment + float length = (curr_pos - prev_pos).norm(); + if (last_path.vertices_count() == 1 || vertices.empty()) { + // 1st segment or restart into a new vertex buffer + // =============================================== - // vertices 1st endpoint - store_vertex(vertices, prev_pos + half_height * up, up); - store_vertex(vertices, prev_pos + half_width * right, right); - store_vertex(vertices, prev_pos + half_height * down, down); - store_vertex(vertices, prev_pos + half_width * left, left); + // vertices 1st endpoint + store_vertex(vertices, prev_pos + half_height * up, up); + store_vertex(vertices, prev_pos + half_width * right, right); + store_vertex(vertices, prev_pos + half_height * down, down); + store_vertex(vertices, prev_pos + half_width * left, left); - // vertices 2nd endpoint - store_vertex(vertices, curr_pos + half_height * up, up); - store_vertex(vertices, curr_pos + half_width * right, right); - store_vertex(vertices, curr_pos + half_height * down, down); - store_vertex(vertices, curr_pos + half_width * left, left); + // vertices 2nd endpoint + store_vertex(vertices, curr_pos + half_height * up, up); + store_vertex(vertices, curr_pos + half_width * right, right); + store_vertex(vertices, curr_pos + half_height * down, down); + store_vertex(vertices, curr_pos + half_width * left, left); + } + else { + // any other segment + // ================= + + float displacement = 0.0f; + float cos_dir = prev_dir.dot(dir); + if (cos_dir > -0.9998477f) { + // if the angle between adjacent segments is smaller than 179 degrees + Vec3f med_dir = (prev_dir + dir).normalized(); + displacement = half_width * ::tan(::acos(std::clamp(dir.dot(med_dir), -1.0f, 1.0f))); } - else { - // any other segment - float displacement = 0.0f; - float cos_dir = prev_dir.dot(dir); - if (cos_dir > -0.9998477f) { - // if the angle between adjacent segments is smaller than 179 degrees - Vec3f med_dir = (prev_dir + dir).normalized(); - displacement = half_width * ::tan(::acos(std::clamp(dir.dot(med_dir), -1.0f, 1.0f))); - } - Vec3f displacement_vec = displacement * prev_dir; - bool can_displace = displacement > 0.0f && displacement < prev_length&& displacement < length; + Vec3f displacement_vec = displacement * prev_dir; + bool can_displace = displacement > 0.0f && displacement < prev_length&& displacement < length; - size_t prev_right_id = (starting_vertices_size - 3) * buffer.vertices.vertex_size_floats(); - size_t prev_left_id = (starting_vertices_size - 1) * buffer.vertices.vertex_size_floats(); - Vec3f prev_right_pos = extract_position_at(vertices, prev_right_id); - Vec3f prev_left_pos = extract_position_at(vertices, prev_left_id); + size_t prev_right_id = (starting_vertices_size - 3) * buffer.vertices.vertex_size_floats(); + size_t prev_left_id = (starting_vertices_size - 1) * buffer.vertices.vertex_size_floats(); + Vec3f prev_right_pos = extract_position_at(vertices, prev_right_id); + Vec3f prev_left_pos = extract_position_at(vertices, prev_left_id); - bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f; - // whether the angle between adjacent segments is greater than 45 degrees - bool is_sharp = cos_dir < 0.7071068f; + bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f; + // whether the angle between adjacent segments is greater than 45 degrees + bool is_sharp = cos_dir < 0.7071068f; - bool right_displaced = false; - bool left_displaced = false; + bool right_displaced = false; + bool left_displaced = false; - // displace the vertex (inner with respect to the corner) of the previous segment 2nd enpoint, if possible + // displace the vertex (inner with respect to the corner) of the previous segment 2nd endpoint, if possible + if (can_displace) { + if (is_right_turn) { + prev_right_pos -= displacement_vec; + update_position_at(vertices, prev_right_id, prev_right_pos); + right_displaced = true; + } + else { + prev_left_pos -= displacement_vec; + update_position_at(vertices, prev_left_id, prev_left_pos); + left_displaced = true; + } + } + + if (!is_sharp) { + // displace the vertex (outer with respect to the corner) of the previous segment 2nd endpoint, if possible if (can_displace) { if (is_right_turn) { - prev_right_pos -= displacement_vec; - update_position_at(vertices, prev_right_id, prev_right_pos); - right_displaced = true; - } - else { - prev_left_pos -= displacement_vec; + prev_left_pos += displacement_vec; update_position_at(vertices, prev_left_id, prev_left_pos); left_displaced = true; } - } - - if (!is_sharp) { - // displace the vertex (outer with respect to the corner) of the previous segment 2nd enpoint, if possible - if (can_displace) { - if (is_right_turn) { - prev_left_pos += displacement_vec; - update_position_at(vertices, prev_left_id, prev_left_pos); - left_displaced = true; - } - else { - prev_right_pos += displacement_vec; - update_position_at(vertices, prev_right_id, prev_right_pos); - right_displaced = true; - } + else { + prev_right_pos += displacement_vec; + update_position_at(vertices, prev_right_id, prev_right_pos); + right_displaced = true; } + } - // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint) - // vertices position matches that of the previous segment 2nd endpoint, if displaced + // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint) + // vertices position matches that of the previous segment 2nd endpoint, if displaced + store_vertex(vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right); + store_vertex(vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); + } + else { + // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint) + // the inner corner vertex position matches that of the previous segment 2nd endpoint, if displaced + if (is_right_turn) { store_vertex(vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right); - store_vertex(vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); + store_vertex(vertices, prev_pos + half_width * left, left); } else { - // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint) - // the inner corner vertex position matches that of the previous segment 2nd endpoint, if displaced - if (is_right_turn) { - store_vertex(vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right); - store_vertex(vertices, prev_pos + half_width * left, left); - } - else { - store_vertex(vertices, prev_pos + half_width * right, right); - store_vertex(vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); - } + store_vertex(vertices, prev_pos + half_width * right, right); + store_vertex(vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); } - - // vertices 2nd endpoint - store_vertex(vertices, curr_pos + half_height * up, up); - store_vertex(vertices, curr_pos + half_width * right, right); - store_vertex(vertices, curr_pos + half_height * down, down); - store_vertex(vertices, curr_pos + half_width * left, left); } - last_path.last = { 0, 0, move_id, curr.position }; - prev_dir = dir; - prev_up = up; - prev_length = length; - }; + // vertices 2nd endpoint + store_vertex(vertices, curr_pos + half_height * up, up); + store_vertex(vertices, curr_pos + half_width * right, right); + store_vertex(vertices, curr_pos + half_height * down, down); + store_vertex(vertices, curr_pos + half_width * left, left); + } + last_path.sub_paths.back().last = { 0, 0, move_id, curr.position }; + prev_dir = dir; + prev_up = up; + prev_length = length; + }; auto add_indices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, - size_t& buffer_vertices_size, unsigned int index_buffer_id, IndexBuffer& indices, size_t move_id) { + size_t& vbuffer_size, unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { static Vec3f prev_dir; static Vec3f prev_up; static float prev_length; @@ -1257,12 +1308,10 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) }; if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { - buffer.add_path(curr, index_buffer_id, indices.size(), move_id - 1); - buffer.paths.back().first.position = prev.position; + buffer.add_path(curr, ibuffer_id, indices.size(), move_id - 1); + buffer.paths.back().sub_paths.back().first.position = prev.position; } - unsigned int starting_vertices_size = static_cast(buffer_vertices_size); - Vec3f dir = (curr.position - prev.position).normalized(); Vec3f right = (std::abs(std::abs(dir.dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) ? -Vec3f::UnitY() : Vec3f(dir[1], -dir[0], 0.0f).normalized(); Vec3f up = right.cross(dir); @@ -1276,30 +1325,803 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) Vec3f curr_pos = curr.position - half_height * up; float length = (curr_pos - prev_pos).norm(); - if (last_path.vertices_count() == 1) { - // 1st segment - buffer_vertices_size += 8; + if (last_path.vertices_count() == 1 || vbuffer_size == 0) { + // 1st segment or restart into a new vertex buffer + // =============================================== // triangles starting cap - store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 2, starting_vertices_size + 1); - store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 3, starting_vertices_size + 2); + store_triangle(indices, vbuffer_size + 0, vbuffer_size + 2, vbuffer_size + 1); + store_triangle(indices, vbuffer_size + 0, vbuffer_size + 3, vbuffer_size + 2); // dummy triangles outer corner cap - append_dummy_cap(indices, starting_vertices_size); + append_dummy_cap(indices, vbuffer_size); // triangles sides - store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 1, starting_vertices_size + 4); - store_triangle(indices, starting_vertices_size + 1, starting_vertices_size + 5, starting_vertices_size + 4); - store_triangle(indices, starting_vertices_size + 1, starting_vertices_size + 2, starting_vertices_size + 5); - store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 6, starting_vertices_size + 5); - store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 3, starting_vertices_size + 6); - store_triangle(indices, starting_vertices_size + 3, starting_vertices_size + 7, starting_vertices_size + 6); - store_triangle(indices, starting_vertices_size + 3, starting_vertices_size + 0, starting_vertices_size + 7); - store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 4, starting_vertices_size + 7); + store_triangle(indices, vbuffer_size + 0, vbuffer_size + 1, vbuffer_size + 4); + store_triangle(indices, vbuffer_size + 1, vbuffer_size + 5, vbuffer_size + 4); + store_triangle(indices, vbuffer_size + 1, vbuffer_size + 2, vbuffer_size + 5); + store_triangle(indices, vbuffer_size + 2, vbuffer_size + 6, vbuffer_size + 5); + store_triangle(indices, vbuffer_size + 2, vbuffer_size + 3, vbuffer_size + 6); + store_triangle(indices, vbuffer_size + 3, vbuffer_size + 7, vbuffer_size + 6); + store_triangle(indices, vbuffer_size + 3, vbuffer_size + 0, vbuffer_size + 7); + store_triangle(indices, vbuffer_size + 0, vbuffer_size + 4, vbuffer_size + 7); // triangles ending cap - store_triangle(indices, starting_vertices_size + 4, starting_vertices_size + 6, starting_vertices_size + 7); - store_triangle(indices, starting_vertices_size + 4, starting_vertices_size + 5, starting_vertices_size + 6); + store_triangle(indices, vbuffer_size + 4, vbuffer_size + 6, vbuffer_size + 7); + store_triangle(indices, vbuffer_size + 4, vbuffer_size + 5, vbuffer_size + 6); + + vbuffer_size += 8; + } + else { + // any other segment + // ================= + + float displacement = 0.0f; + float cos_dir = prev_dir.dot(dir); + if (cos_dir > -0.9998477f) { + // if the angle between adjacent segments is smaller than 179 degrees + Vec3f med_dir = (prev_dir + dir).normalized(); + displacement = half_width * ::tan(::acos(std::clamp(dir.dot(med_dir), -1.0f, 1.0f))); + } + + Vec3f displacement_vec = displacement * prev_dir; + bool can_displace = displacement > 0.0f && displacement < prev_length&& displacement < length; + + bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f; + // whether the angle between adjacent segments is greater than 45 degrees + bool is_sharp = cos_dir < 0.7071068f; + + bool right_displaced = false; + bool left_displaced = false; + + if (!is_sharp) { + if (can_displace) { + if (is_right_turn) + left_displaced = true; + else + right_displaced = true; + } + } + + // triangles starting cap + store_triangle(indices, vbuffer_size - 4, vbuffer_size - 2, vbuffer_size + 0); + store_triangle(indices, vbuffer_size - 4, vbuffer_size + 1, vbuffer_size - 2); + + // triangles outer corner cap + if (is_right_turn) { + if (left_displaced) + // dummy triangles + append_dummy_cap(indices, vbuffer_size); + else { + store_triangle(indices, vbuffer_size - 4, vbuffer_size + 1, vbuffer_size - 1); + store_triangle(indices, vbuffer_size + 1, vbuffer_size - 2, vbuffer_size - 1); + } + } + else { + if (right_displaced) + // dummy triangles + append_dummy_cap(indices, vbuffer_size); + else { + store_triangle(indices, vbuffer_size - 4, vbuffer_size - 3, vbuffer_size + 0); + store_triangle(indices, vbuffer_size - 3, vbuffer_size - 2, vbuffer_size + 0); + } + } + + // triangles sides + store_triangle(indices, vbuffer_size - 4, vbuffer_size + 0, vbuffer_size + 2); + store_triangle(indices, vbuffer_size + 0, vbuffer_size + 3, vbuffer_size + 2); + store_triangle(indices, vbuffer_size + 0, vbuffer_size - 2, vbuffer_size + 3); + store_triangle(indices, vbuffer_size - 2, vbuffer_size + 4, vbuffer_size + 3); + store_triangle(indices, vbuffer_size - 2, vbuffer_size + 1, vbuffer_size + 4); + store_triangle(indices, vbuffer_size + 1, vbuffer_size + 5, vbuffer_size + 4); + store_triangle(indices, vbuffer_size + 1, vbuffer_size - 4, vbuffer_size + 5); + store_triangle(indices, vbuffer_size - 4, vbuffer_size + 2, vbuffer_size + 5); + + // triangles ending cap + store_triangle(indices, vbuffer_size + 2, vbuffer_size + 4, vbuffer_size + 5); + store_triangle(indices, vbuffer_size + 2, vbuffer_size + 3, vbuffer_size + 4); + + vbuffer_size += 6; + } + + last_path.sub_paths.back().last = { ibuffer_id, indices.size() - 1, move_id, curr.position }; + prev_dir = dir; + prev_up = up; + prev_length = length; + }; + +#if ENABLE_GCODE_VIEWER_STATISTICS + auto start_time = std::chrono::high_resolution_clock::now(); + m_statistics.results_size = SLIC3R_STDVEC_MEMSIZE(gcode_result.moves, GCodeProcessor::MoveVertex); + m_statistics.results_time = gcode_result.time; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + m_moves_count = gcode_result.moves.size(); + if (m_moves_count == 0) + return; + + unsigned int progress_count = 0; + static const unsigned int progress_threshold = 1000; + wxProgressDialog* progress_dialog = wxGetApp().is_gcode_viewer() ? + new wxProgressDialog(_L("Generating toolpaths"), "...", + 100, wxGetApp().plater(), wxPD_AUTO_HIDE | wxPD_APP_MODAL) : nullptr; + + wxBusyCursor busy; + + // extract approximate paths bounding box from result + for (const GCodeProcessor::MoveVertex& move : gcode_result.moves) { + if (wxGetApp().is_gcode_viewer()) + // for the gcode viewer we need to take in account all moves to correctly size the printbed + m_paths_bounding_box.merge(move.position.cast()); + else { + if (move.type == EMoveType::Extrude && move.width != 0.0f && move.height != 0.0f) + m_paths_bounding_box.merge(move.position.cast()); + } + } + + // set approximate max bounding box (take in account also the tool marker) + m_max_bounding_box = m_paths_bounding_box; + m_max_bounding_box.merge(m_paths_bounding_box.max + m_sequential_view.marker.get_bounding_box().size()[2] * Vec3d::UnitZ()); + + std::vector vertices(m_buffers.size()); + std::vector indices(m_buffers.size()); + std::vector options_zs; + + // max vertex buffer size, in bytes + const size_t VBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024; + + // toolpaths data -> extract vertices from result + for (size_t i = 0; i < m_moves_count; ++i) { + const GCodeProcessor::MoveVertex& curr = gcode_result.moves[i]; + + // skip first vertex + if (i == 0) + continue; + + const GCodeProcessor::MoveVertex& prev = gcode_result.moves[i - 1]; + + // update progress dialog + ++progress_count; + if (progress_dialog != nullptr && progress_count % progress_threshold == 0) { + progress_dialog->Update(int(100.0f * float(i) / (2.0f * float(m_moves_count))), + _L("Generating vertex buffer") + ": " + wxNumberFormatter::ToString(100.0 * double(i) / double(m_moves_count), 0, wxNumberFormatter::Style_None) + "%"); + progress_dialog->Fit(); + progress_count = 0; + } + + unsigned char id = buffer_id(curr.type); + TBuffer& t_buffer = m_buffers[id]; + MultiVertexBuffer& v_multibuffer = vertices[id]; + + // ensure there is at least one vertex buffer + if (v_multibuffer.empty()) + v_multibuffer.push_back(VertexBuffer()); + + // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer + // add another vertex buffer + if (v_multibuffer.back().size() * sizeof(float) > VBUFFER_THRESHOLD_BYTES - t_buffer.max_vertices_per_segment_size_bytes()) + v_multibuffer.push_back(VertexBuffer()); + + VertexBuffer& v_buffer = v_multibuffer.back(); + + switch (t_buffer.render_primitive_type) + { + case TBuffer::ERenderPrimitiveType::Point: { add_vertices_as_point(curr, v_buffer); break; } + case TBuffer::ERenderPrimitiveType::Line: { add_vertices_as_line(prev, curr, v_buffer); break; } + case TBuffer::ERenderPrimitiveType::Triangle: { add_vertices_as_solid(prev, curr, t_buffer, v_buffer, i); break; } + } + + // collect options zs for later use + if (curr.type == EMoveType::Pause_Print || curr.type == EMoveType::Custom_GCode) { + const float* const last_z = options_zs.empty() ? nullptr : &options_zs.back(); + if (last_z == nullptr || curr.position[2] < *last_z - EPSILON || *last_z + EPSILON < curr.position[2]) + options_zs.emplace_back(curr.position[2]); + } + } + + for (MultiVertexBuffer& v_multibuffer : vertices) { + for (VertexBuffer& v_buffer : v_multibuffer) { + v_buffer.shrink_to_fit(); + } + } + + // move the wipe toolpaths half height up to render them on proper position + MultiVertexBuffer& wipe_vertices = vertices[buffer_id(EMoveType::Wipe)]; + for (VertexBuffer& v_buffer : wipe_vertices) { + for (size_t i = 2; i < v_buffer.size(); i += 3) { + v_buffer[i] += 0.5f * GCodeProcessor::Wipe_Height; + } + } + + // send vertices data to gpu + for (size_t i = 0; i < m_buffers.size(); ++i) { + TBuffer& t_buffer = m_buffers[i]; + + const MultiVertexBuffer& v_multibuffer = vertices[i]; + for (const VertexBuffer& v_buffer : v_multibuffer) { + size_t size_elements = v_buffer.size(); + size_t size_bytes = size_elements * sizeof(float); + size_t vertices_count = size_elements / t_buffer.vertices.vertex_size_floats(); + t_buffer.vertices.count += vertices_count; + +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.total_vertices_gpu_size += static_cast(size_bytes); + m_statistics.max_vbuffer_gpu_size = std::max(m_statistics.max_vbuffer_gpu_size, static_cast(size_bytes)); + ++m_statistics.vbuffers_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + GLuint id = 0; + glsafe(::glGenBuffers(1, &id)); + t_buffer.vertices.ids.push_back(static_cast(id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, id)); + glsafe(::glBufferData(GL_ARRAY_BUFFER, size_bytes, v_buffer.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + } + } + + log_memory_usage("Loaded G-code generated vertex buffers ", vertices, indices); + + // dismiss vertices data, no more needed + std::vector().swap(vertices); + + // toolpaths data -> extract indices from result + // paths may have been filled while extracting vertices, + // so reset them, they will be filled again while extracting indices + for (TBuffer& buffer : m_buffers) { + buffer.paths.clear(); + } + + // max index buffer size, in bytes + const size_t IBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024; + + // variable used to keep track of the current vertex buffers index and size + using CurrVertexBuffer = std::pair; + std::vector curr_vertex_buffers(m_buffers.size(), { 0, 0 }); + + // variable used to keep track of the vertex buffers ids + using VboIndexList = std::vector; + std::vector vbo_indices(m_buffers.size()); + + for (size_t i = 0; i < m_moves_count; ++i) { + const GCodeProcessor::MoveVertex& curr = gcode_result.moves[i]; + + // skip first vertex + if (i == 0) + continue; + + const GCodeProcessor::MoveVertex& prev = gcode_result.moves[i - 1]; + + ++progress_count; + if (progress_dialog != nullptr && progress_count % progress_threshold == 0) { + progress_dialog->Update(int(100.0f * float(m_moves_count + i) / (2.0f * float(m_moves_count))), + _L("Generating index buffers") + ": " + wxNumberFormatter::ToString(100.0 * double(i) / double(m_moves_count), 0, wxNumberFormatter::Style_None) + "%"); + progress_dialog->Fit(); + progress_count = 0; + } + + unsigned char id = buffer_id(curr.type); + TBuffer& t_buffer = m_buffers[id]; + MultiIndexBuffer& i_multibuffer = indices[id]; + CurrVertexBuffer& curr_vertex_buffer = curr_vertex_buffers[id]; + VboIndexList& vbo_index_list = vbo_indices[id]; + + // ensure there is at least one index buffer + if (i_multibuffer.empty()) { + i_multibuffer.push_back(IndexBuffer()); + vbo_index_list.push_back(t_buffer.vertices.ids[curr_vertex_buffer.first]); + } + + // if adding the indices for the current segment exceeds the threshold size of the current index buffer + // create another index buffer + if (i_multibuffer.back().size() * sizeof(unsigned int) >= IBUFFER_THRESHOLD_BYTES - t_buffer.indices_per_segment_size_bytes()) { + i_multibuffer.push_back(IndexBuffer()); + vbo_index_list.push_back(t_buffer.vertices.ids[curr_vertex_buffer.first]); + } + + // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer + // create another index buffer + if (curr_vertex_buffer.second * t_buffer.vertices.vertex_size_bytes() > VBUFFER_THRESHOLD_BYTES - t_buffer.max_vertices_per_segment_size_bytes()) { + i_multibuffer.push_back(IndexBuffer()); + + ++curr_vertex_buffer.first; + curr_vertex_buffer.second = 0; + vbo_index_list.push_back(t_buffer.vertices.ids[curr_vertex_buffer.first]); + + if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) { + Path& last_path = t_buffer.paths.back(); + last_path.add_sub_path(curr, static_cast(i_multibuffer.size()) - 1, 0, i); + } + } + + IndexBuffer& i_buffer = i_multibuffer.back(); + + switch (t_buffer.render_primitive_type) + { + case TBuffer::ERenderPrimitiveType::Point: { + add_indices_as_point(curr, t_buffer, static_cast(i_multibuffer.size()) - 1, i_buffer, i); + curr_vertex_buffer.second += t_buffer.max_vertices_per_segment(); + break; + } + case TBuffer::ERenderPrimitiveType::Line: { + add_indices_as_line(prev, curr, t_buffer, static_cast(i_multibuffer.size()) - 1, i_buffer, i); + curr_vertex_buffer.second += t_buffer.max_vertices_per_segment(); + break; + } + case TBuffer::ERenderPrimitiveType::Triangle: { + add_indices_as_solid(prev, curr, t_buffer, curr_vertex_buffer.second, static_cast(i_multibuffer.size()) - 1, i_buffer, i); + break; + } + } + } + + for (MultiIndexBuffer& i_multibuffer : indices) { + for (IndexBuffer& i_buffer : i_multibuffer) { + i_buffer.shrink_to_fit(); + } + } + + // toolpaths data -> send indices data to gpu + for (size_t i = 0; i < m_buffers.size(); ++i) { + TBuffer& t_buffer = m_buffers[i]; + const MultiIndexBuffer& i_multibuffer = indices[i]; + for (const IndexBuffer& i_buffer : i_multibuffer) { + size_t size_elements = i_buffer.size(); + size_t size_bytes = size_elements * sizeof(unsigned int); + + if (size_elements == 0) { + continue; + } + + // stores index buffer informations into TBuffer + t_buffer.indices.push_back(IBuffer()); + IBuffer& ibuf = t_buffer.indices.back(); + ibuf.count = size_elements; + ibuf.vbo = vbo_indices[i][t_buffer.indices.size() - 1]; + +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.total_indices_gpu_size += static_cast(size_bytes); + m_statistics.max_ibuffer_gpu_size = std::max(m_statistics.max_ibuffer_gpu_size, static_cast(size_bytes)); + ++m_statistics.ibuffers_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + glsafe(::glGenBuffers(1, &ibuf.ibo)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuf.ibo)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, size_bytes, i_buffer.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } + } + + if (progress_dialog != nullptr) { + progress_dialog->Update(100, ""); + progress_dialog->Fit(); + } + +#if ENABLE_GCODE_VIEWER_STATISTICS + for (const TBuffer& buffer : m_buffers) { + m_statistics.paths_size += SLIC3R_STDVEC_MEMSIZE(buffer.paths, Path); + } + unsigned int travel_buffer_id = buffer_id(EMoveType::Travel); + const MultiIndexBuffer& travel_buffers = indices[travel_buffer_id]; + for (const IndexBuffer& buffer : travel_buffers) { + m_statistics.travel_segments_count += buffer.size() / m_buffers[travel_buffer_id].indices_per_segment(); + } + unsigned int wipe_buffer_id = buffer_id(EMoveType::Wipe); + const MultiIndexBuffer& wipe_buffers = indices[wipe_buffer_id]; + for (const IndexBuffer& buffer : wipe_buffers) { + m_statistics.wipe_segments_count += buffer.size() / m_buffers[wipe_buffer_id].indices_per_segment(); + } + unsigned int extrude_buffer_id = buffer_id(EMoveType::Extrude); + const MultiIndexBuffer& extrude_buffers = indices[extrude_buffer_id]; + for (const IndexBuffer& buffer : extrude_buffers) { + m_statistics.extrude_segments_count += buffer.size() / m_buffers[extrude_buffer_id].indices_per_segment(); + } +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + log_memory_usage("Loaded G-code generated indices buffers ", vertices, indices); + + // dismiss indices data, no more needed + std::vector().swap(indices); + + // layers zs / roles / extruder ids -> extract from result + size_t last_travel_s_id = 0; + for (size_t i = 0; i < m_moves_count; ++i) { + const GCodeProcessor::MoveVertex& move = gcode_result.moves[i]; + if (move.type == EMoveType::Extrude) { + // layers zs + const double* const last_z = m_layers.empty() ? nullptr : &m_layers.get_zs().back(); + double z = static_cast(move.position[2]); + if (last_z == nullptr || z < *last_z - EPSILON || *last_z + EPSILON < z) + m_layers.append(z, { last_travel_s_id, i }); + else + m_layers.get_endpoints().back().last = i; + // extruder ids + m_extruder_ids.emplace_back(move.extruder_id); + // roles + if (i > 0) + m_roles.emplace_back(move.extrusion_role); + } + else if (move.type == EMoveType::Travel) { + if (i - last_travel_s_id > 1 && !m_layers.empty()) + m_layers.get_endpoints().back().last = i; + + last_travel_s_id = i; + } + } + + // roles -> remove duplicates + std::sort(m_roles.begin(), m_roles.end()); + m_roles.erase(std::unique(m_roles.begin(), m_roles.end()), m_roles.end()); + m_roles.shrink_to_fit(); + + // extruder ids -> remove duplicates + std::sort(m_extruder_ids.begin(), m_extruder_ids.end()); + m_extruder_ids.erase(std::unique(m_extruder_ids.begin(), m_extruder_ids.end()), m_extruder_ids.end()); + m_extruder_ids.shrink_to_fit(); + + // set layers z range + if (!m_layers.empty()) + m_layers_z_range = { 0, static_cast(m_layers.size() - 1) }; + + // change color of paths whose layer contains option points + if (!options_zs.empty()) { + TBuffer& extrude_buffer = m_buffers[buffer_id(EMoveType::Extrude)]; + for (Path& path : extrude_buffer.paths) { + float z = path.sub_paths.front().first.position[2]; + if (std::find_if(options_zs.begin(), options_zs.end(), [z](float f) { return f - EPSILON <= z && z <= f + EPSILON; }) != options_zs.end()) + path.cp_color_id = 255 - path.cp_color_id; + } + } + +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.load_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + if (progress_dialog != nullptr) + progress_dialog->Destroy(); +} +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) +{ +#if ENABLE_GCODE_VIEWER_STATISTICS + auto start_time = std::chrono::high_resolution_clock::now(); + m_statistics.results_size = SLIC3R_STDVEC_MEMSIZE(gcode_result.moves, GCodeProcessor::MoveVertex); + m_statistics.results_time = gcode_result.time; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + // vertices data + m_moves_count = gcode_result.moves.size(); + if (m_moves_count == 0) + return; + + unsigned int progress_count = 0; + static const unsigned int progress_threshold = 1000; + wxProgressDialog* progress_dialog = wxGetApp().is_gcode_viewer() ? + new wxProgressDialog(_L("Generating toolpaths"), "...", + 100, wxGetApp().plater(), wxPD_AUTO_HIDE | wxPD_APP_MODAL) : nullptr; + + m_extruders_count = gcode_result.extruders_count; + + for (size_t i = 0; i < m_moves_count; ++i) { + const GCodeProcessor::MoveVertex& move = gcode_result.moves[i]; + if (wxGetApp().is_gcode_viewer()) + // for the gcode viewer we need all moves to correctly size the printbed + m_paths_bounding_box.merge(move.position.cast()); + else { + if (move.type == EMoveType::Extrude && move.width != 0.0f && move.height != 0.0f) + m_paths_bounding_box.merge(move.position.cast()); + } + } + + // max bounding box (account for tool marker) + m_max_bounding_box = m_paths_bounding_box; + m_max_bounding_box.merge(m_paths_bounding_box.max + m_sequential_view.marker.get_bounding_box().size()[2] * Vec3d::UnitZ()); + + auto log_memory_usage = [this](const std::string& label, const std::vector& vertices, const std::vector& indices) { + int64_t vertices_size = 0; + for (size_t i = 0; i < vertices.size(); ++i) { + vertices_size += SLIC3R_STDVEC_MEMSIZE(vertices[i], float); + } + int64_t indices_size = 0; + for (size_t i = 0; i < indices.size(); ++i) { + for (size_t j = 0; j < indices[i].size(); ++j) { + indices_size += SLIC3R_STDVEC_MEMSIZE(indices[i][j], unsigned int); + } + } + log_memory_used(label, vertices_size + indices_size); + }; + + // format data into the buffers to be rendered as points + auto add_vertices_as_point = [](const GCodeProcessor::MoveVertex& curr, VertexBuffer& vertices) { + vertices.push_back(curr.position[0]); + vertices.push_back(curr.position[1]); + vertices.push_back(curr.position[2]); + }; + auto add_indices_as_point = [](const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, + unsigned int index_buffer_id, IndexBuffer& indices, size_t move_id) { + buffer.add_path(curr, index_buffer_id, indices.size(), move_id); + indices.push_back(static_cast(indices.size())); + }; + + // format data into the buffers to be rendered as lines + auto add_vertices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, + VertexBuffer& vertices) { + // x component of the normal to the current segment (the normal is parallel to the XY plane) + float normal_x = (curr.position - prev.position).normalized()[1]; + + auto add_vertex = [&vertices, normal_x](const GCodeProcessor::MoveVertex& vertex) { + // add position + vertices.push_back(vertex.position[0]); + vertices.push_back(vertex.position[1]); + vertices.push_back(vertex.position[2]); + // add normal x component + vertices.push_back(normal_x); + }; + + // add previous vertex + add_vertex(prev); + // add current vertex + add_vertex(curr); + }; + auto add_indices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, + unsigned int index_buffer_id, IndexBuffer& indices, size_t move_id) { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +// // x component of the normal to the current segment (the normal is parallel to the XY plane) +// float normal_x = (curr.position - prev.position).normalized()[1]; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { + // add starting index + indices.push_back(static_cast(indices.size())); + buffer.add_path(curr, index_buffer_id, indices.size() - 1, move_id - 1); + buffer.paths.back().first.position = prev.position; + } + + Path& last_path = buffer.paths.back(); + if (last_path.first.i_id != last_path.last.i_id) { + // add previous index + indices.push_back(static_cast(indices.size())); + } + + // add current index + indices.push_back(static_cast(indices.size())); + last_path.last = { index_buffer_id, indices.size() - 1, move_id, curr.position }; + }; + + // format data into the buffers to be rendered as solid + auto add_vertices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, + VertexBuffer& vertices, size_t move_id) { + static Vec3f prev_dir; + static Vec3f prev_up; + static float prev_length; + auto store_vertex = [](VertexBuffer& vertices, const Vec3f& position, const Vec3f& normal) { + // append position + vertices.push_back(position[0]); + vertices.push_back(position[1]); + vertices.push_back(position[2]); + // append normal + vertices.push_back(normal[0]); + vertices.push_back(normal[1]); + vertices.push_back(normal[2]); + }; + auto extract_position_at = [](const VertexBuffer& vertices, size_t id) { + return Vec3f(vertices[id + 0], vertices[id + 1], vertices[id + 2]); + }; + auto update_position_at = [](VertexBuffer& vertices, size_t id, const Vec3f& position) { + vertices[id + 0] = position[0]; + vertices[id + 1] = position[1]; + vertices[id + 2] = position[2]; + }; + + if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { + buffer.add_path(curr, 0, 0, move_id - 1); + buffer.paths.back().first.position = prev.position; + } + + unsigned int starting_vertices_size = static_cast(vertices.size() / buffer.vertices.vertex_size_floats()); + + Vec3f dir = (curr.position - prev.position).normalized(); + Vec3f right = (std::abs(std::abs(dir.dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) ? -Vec3f::UnitY() : Vec3f(dir[1], -dir[0], 0.0f).normalized(); + Vec3f left = -right; + Vec3f up = right.cross(dir); + Vec3f down = -up; + + Path& last_path = buffer.paths.back(); + + float half_width = 0.5f * last_path.width; + float half_height = 0.5f * last_path.height; + + Vec3f prev_pos = prev.position - half_height * up; + Vec3f curr_pos = curr.position - half_height * up; + + float length = (curr_pos - prev_pos).norm(); + if (last_path.vertices_count() == 1) { + // 1st segment + + // vertices 1st endpoint + store_vertex(vertices, prev_pos + half_height * up, up); + store_vertex(vertices, prev_pos + half_width * right, right); + store_vertex(vertices, prev_pos + half_height * down, down); + store_vertex(vertices, prev_pos + half_width * left, left); + + // vertices 2nd endpoint + store_vertex(vertices, curr_pos + half_height * up, up); + store_vertex(vertices, curr_pos + half_width * right, right); + store_vertex(vertices, curr_pos + half_height * down, down); + store_vertex(vertices, curr_pos + half_width * left, left); + } + else { + // any other segment + float displacement = 0.0f; + float cos_dir = prev_dir.dot(dir); + if (cos_dir > -0.9998477f) { + // if the angle between adjacent segments is smaller than 179 degrees + Vec3f med_dir = (prev_dir + dir).normalized(); + displacement = half_width * ::tan(::acos(std::clamp(dir.dot(med_dir), -1.0f, 1.0f))); + } + + Vec3f displacement_vec = displacement * prev_dir; + bool can_displace = displacement > 0.0f && displacement < prev_length&& displacement < length; + + size_t prev_right_id = (starting_vertices_size - 3) * buffer.vertices.vertex_size_floats(); + size_t prev_left_id = (starting_vertices_size - 1) * buffer.vertices.vertex_size_floats(); + Vec3f prev_right_pos = extract_position_at(vertices, prev_right_id); + Vec3f prev_left_pos = extract_position_at(vertices, prev_left_id); + + bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f; + // whether the angle between adjacent segments is greater than 45 degrees + bool is_sharp = cos_dir < 0.7071068f; + + bool right_displaced = false; + bool left_displaced = false; + + // displace the vertex (inner with respect to the corner) of the previous segment 2nd enpoint, if possible + if (can_displace) { + if (is_right_turn) { + prev_right_pos -= displacement_vec; + update_position_at(vertices, prev_right_id, prev_right_pos); + right_displaced = true; + } + else { + prev_left_pos -= displacement_vec; + update_position_at(vertices, prev_left_id, prev_left_pos); + left_displaced = true; + } + } + + if (!is_sharp) { + // displace the vertex (outer with respect to the corner) of the previous segment 2nd enpoint, if possible + if (can_displace) { + if (is_right_turn) { + prev_left_pos += displacement_vec; + update_position_at(vertices, prev_left_id, prev_left_pos); + left_displaced = true; + } + else { + prev_right_pos += displacement_vec; + update_position_at(vertices, prev_right_id, prev_right_pos); + right_displaced = true; + } + } + + // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint) + // vertices position matches that of the previous segment 2nd endpoint, if displaced + store_vertex(vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right); + store_vertex(vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); + } + else { + // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint) + // the inner corner vertex position matches that of the previous segment 2nd endpoint, if displaced + if (is_right_turn) { + store_vertex(vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right); + store_vertex(vertices, prev_pos + half_width * left, left); + } + else { + store_vertex(vertices, prev_pos + half_width * right, right); + store_vertex(vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); + } + } + + // vertices 2nd endpoint + store_vertex(vertices, curr_pos + half_height * up, up); + store_vertex(vertices, curr_pos + half_width * right, right); + store_vertex(vertices, curr_pos + half_height * down, down); + store_vertex(vertices, curr_pos + half_width * left, left); + } + + last_path.last = { 0, 0, move_id, curr.position }; + prev_dir = dir; + prev_up = up; + prev_length = length; + }; + auto add_indices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, + size_t& buffer_vertices_size, unsigned int index_buffer_id, IndexBuffer& indices, size_t move_id) { + static Vec3f prev_dir; + static Vec3f prev_up; + static float prev_length; + auto store_triangle = [](IndexBuffer& indices, unsigned int i1, unsigned int i2, unsigned int i3) { + indices.push_back(i1); + indices.push_back(i2); + indices.push_back(i3); + }; + auto append_dummy_cap = [store_triangle](IndexBuffer& indices, unsigned int id) { + store_triangle(indices, id, id, id); + store_triangle(indices, id, id, id); + }; + + if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { + buffer.add_path(curr, index_buffer_id, indices.size(), move_id - 1); + buffer.paths.back().first.position = prev.position; + } + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +// unsigned int starting_vertices_size = static_cast(buffer_vertices_size); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + Vec3f dir = (curr.position - prev.position).normalized(); + Vec3f right = (std::abs(std::abs(dir.dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) ? -Vec3f::UnitY() : Vec3f(dir[1], -dir[0], 0.0f).normalized(); + Vec3f up = right.cross(dir); + + Path& last_path = buffer.paths.back(); + + float half_width = 0.5f * last_path.width; + float half_height = 0.5f * last_path.height; + + Vec3f prev_pos = prev.position - half_height * up; + Vec3f curr_pos = curr.position - half_height * up; + + float length = (curr_pos - prev_pos).norm(); + if (last_path.vertices_count() == 1) { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + // 1st segment + + // triangles starting cap + store_triangle(indices, buffer_vertices_size + 0, buffer_vertices_size + 2, buffer_vertices_size + 1); + store_triangle(indices, buffer_vertices_size + 0, buffer_vertices_size + 3, buffer_vertices_size + 2); + + // dummy triangles outer corner cap + append_dummy_cap(indices, buffer_vertices_size); + + // triangles sides + store_triangle(indices, buffer_vertices_size + 0, buffer_vertices_size + 1, buffer_vertices_size + 4); + store_triangle(indices, buffer_vertices_size + 1, buffer_vertices_size + 5, buffer_vertices_size + 4); + store_triangle(indices, buffer_vertices_size + 1, buffer_vertices_size + 2, buffer_vertices_size + 5); + store_triangle(indices, buffer_vertices_size + 2, buffer_vertices_size + 6, buffer_vertices_size + 5); + store_triangle(indices, buffer_vertices_size + 2, buffer_vertices_size + 3, buffer_vertices_size + 6); + store_triangle(indices, buffer_vertices_size + 3, buffer_vertices_size + 7, buffer_vertices_size + 6); + store_triangle(indices, buffer_vertices_size + 3, buffer_vertices_size + 0, buffer_vertices_size + 7); + store_triangle(indices, buffer_vertices_size + 0, buffer_vertices_size + 4, buffer_vertices_size + 7); + + // triangles ending cap + store_triangle(indices, buffer_vertices_size + 4, buffer_vertices_size + 6, buffer_vertices_size + 7); + store_triangle(indices, buffer_vertices_size + 4, buffer_vertices_size + 5, buffer_vertices_size + 6); + + buffer_vertices_size += 8; + +// // 1st segment +// buffer_vertices_size += 8; +// +// // triangles starting cap +// store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 2, starting_vertices_size + 1); +// store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 3, starting_vertices_size + 2); +// +// // dummy triangles outer corner cap +// append_dummy_cap(indices, starting_vertices_size); +// +// // triangles sides +// store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 1, starting_vertices_size + 4); +// store_triangle(indices, starting_vertices_size + 1, starting_vertices_size + 5, starting_vertices_size + 4); +// store_triangle(indices, starting_vertices_size + 1, starting_vertices_size + 2, starting_vertices_size + 5); +// store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 6, starting_vertices_size + 5); +// store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 3, starting_vertices_size + 6); +// store_triangle(indices, starting_vertices_size + 3, starting_vertices_size + 7, starting_vertices_size + 6); +// store_triangle(indices, starting_vertices_size + 3, starting_vertices_size + 0, starting_vertices_size + 7); +// store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 4, starting_vertices_size + 7); +// +// // triangles ending cap +// store_triangle(indices, starting_vertices_size + 4, starting_vertices_size + 6, starting_vertices_size + 7); +// store_triangle(indices, starting_vertices_size + 4, starting_vertices_size + 5, starting_vertices_size + 6); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } else { // any other segment @@ -1330,45 +2152,87 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) } } - buffer_vertices_size += 6; - +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // triangles starting cap - store_triangle(indices, starting_vertices_size - 4, starting_vertices_size - 2, starting_vertices_size + 0); - store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 1, starting_vertices_size - 2); + store_triangle(indices, buffer_vertices_size - 4, buffer_vertices_size - 2, buffer_vertices_size + 0); + store_triangle(indices, buffer_vertices_size - 4, buffer_vertices_size + 1, buffer_vertices_size - 2); // triangles outer corner cap if (is_right_turn) { if (left_displaced) // dummy triangles - append_dummy_cap(indices, starting_vertices_size); + append_dummy_cap(indices, buffer_vertices_size); else { - store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 1, starting_vertices_size - 1); - store_triangle(indices, starting_vertices_size + 1, starting_vertices_size - 2, starting_vertices_size - 1); + store_triangle(indices, buffer_vertices_size - 4, buffer_vertices_size + 1, buffer_vertices_size - 1); + store_triangle(indices, buffer_vertices_size + 1, buffer_vertices_size - 2, buffer_vertices_size - 1); } } else { if (right_displaced) // dummy triangles - append_dummy_cap(indices, starting_vertices_size); + append_dummy_cap(indices, buffer_vertices_size); else { - store_triangle(indices, starting_vertices_size - 4, starting_vertices_size - 3, starting_vertices_size + 0); - store_triangle(indices, starting_vertices_size - 3, starting_vertices_size - 2, starting_vertices_size + 0); + store_triangle(indices, buffer_vertices_size - 4, buffer_vertices_size - 3, buffer_vertices_size + 0); + store_triangle(indices, buffer_vertices_size - 3, buffer_vertices_size - 2, buffer_vertices_size + 0); } } // triangles sides - store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 0, starting_vertices_size + 2); - store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 3, starting_vertices_size + 2); - store_triangle(indices, starting_vertices_size + 0, starting_vertices_size - 2, starting_vertices_size + 3); - store_triangle(indices, starting_vertices_size - 2, starting_vertices_size + 4, starting_vertices_size + 3); - store_triangle(indices, starting_vertices_size - 2, starting_vertices_size + 1, starting_vertices_size + 4); - store_triangle(indices, starting_vertices_size + 1, starting_vertices_size + 5, starting_vertices_size + 4); - store_triangle(indices, starting_vertices_size + 1, starting_vertices_size - 4, starting_vertices_size + 5); - store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 2, starting_vertices_size + 5); + store_triangle(indices, buffer_vertices_size - 4, buffer_vertices_size + 0, buffer_vertices_size + 2); + store_triangle(indices, buffer_vertices_size + 0, buffer_vertices_size + 3, buffer_vertices_size + 2); + store_triangle(indices, buffer_vertices_size + 0, buffer_vertices_size - 2, buffer_vertices_size + 3); + store_triangle(indices, buffer_vertices_size - 2, buffer_vertices_size + 4, buffer_vertices_size + 3); + store_triangle(indices, buffer_vertices_size - 2, buffer_vertices_size + 1, buffer_vertices_size + 4); + store_triangle(indices, buffer_vertices_size + 1, buffer_vertices_size + 5, buffer_vertices_size + 4); + store_triangle(indices, buffer_vertices_size + 1, buffer_vertices_size - 4, buffer_vertices_size + 5); + store_triangle(indices, buffer_vertices_size - 4, buffer_vertices_size + 2, buffer_vertices_size + 5); // triangles ending cap - store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 4, starting_vertices_size + 5); - store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 3, starting_vertices_size + 4); + store_triangle(indices, buffer_vertices_size + 2, buffer_vertices_size + 4, buffer_vertices_size + 5); + store_triangle(indices, buffer_vertices_size + 2, buffer_vertices_size + 3, buffer_vertices_size + 4); + + buffer_vertices_size += 6; + +// buffer_vertices_size += 6; +// +// // triangles starting cap +// store_triangle(indices, starting_vertices_size - 4, starting_vertices_size - 2, starting_vertices_size + 0); +// store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 1, starting_vertices_size - 2); +// +// // triangles outer corner cap +// if (is_right_turn) { +// if (left_displaced) +// // dummy triangles +// append_dummy_cap(indices, starting_vertices_size); +// else { +// store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 1, starting_vertices_size - 1); +// store_triangle(indices, starting_vertices_size + 1, starting_vertices_size - 2, starting_vertices_size - 1); +// } +// } +// else { +// if (right_displaced) +// // dummy triangles +// append_dummy_cap(indices, starting_vertices_size); +// else { +// store_triangle(indices, starting_vertices_size - 4, starting_vertices_size - 3, starting_vertices_size + 0); +// store_triangle(indices, starting_vertices_size - 3, starting_vertices_size - 2, starting_vertices_size + 0); +// } +// } +// +// // triangles sides +// store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 0, starting_vertices_size + 2); +// store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 3, starting_vertices_size + 2); +// store_triangle(indices, starting_vertices_size + 0, starting_vertices_size - 2, starting_vertices_size + 3); +// store_triangle(indices, starting_vertices_size - 2, starting_vertices_size + 4, starting_vertices_size + 3); +// store_triangle(indices, starting_vertices_size - 2, starting_vertices_size + 1, starting_vertices_size + 4); +// store_triangle(indices, starting_vertices_size + 1, starting_vertices_size + 5, starting_vertices_size + 4); +// store_triangle(indices, starting_vertices_size + 1, starting_vertices_size - 4, starting_vertices_size + 5); +// store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 2, starting_vertices_size + 5); +// +// // triangles ending cap +// store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 4, starting_vertices_size + 5); +// store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 3, starting_vertices_size + 4); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } last_path.last = { index_buffer_id, indices.size() - 1, move_id, curr.position }; @@ -1446,7 +2310,9 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) #if ENABLE_GCODE_VIEWER_STATISTICS m_statistics.total_vertices_gpu_size += buffer_vertices.size() * sizeof(float); m_statistics.max_vbuffer_gpu_size = std::max(m_statistics.max_vbuffer_gpu_size, static_cast(buffer_vertices.size() * sizeof(float))); - m_statistics.max_vertices_in_vertex_buffer = std::max(m_statistics.max_vertices_in_vertex_buffer, static_cast(buffer.vertices.count)); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +// m_statistics.max_vertices_in_vertex_buffer = std::max(m_statistics.max_vertices_in_vertex_buffer, static_cast(buffer.vertices.count)); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_GCODE_VIEWER_STATISTICS if (buffer.vertices.count > 0) { @@ -1557,7 +2423,9 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) #if ENABLE_GCODE_VIEWER_STATISTICS m_statistics.total_indices_gpu_size += ibuffer.count * sizeof(unsigned int); m_statistics.max_ibuffer_gpu_size = std::max(m_statistics.max_ibuffer_gpu_size, static_cast(ibuffer.count * sizeof(unsigned int))); - m_statistics.max_indices_in_index_buffer = std::max(m_statistics.max_indices_in_index_buffer, static_cast(ibuffer.count)); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +// m_statistics.max_indices_in_index_buffer = std::max(m_statistics.max_indices_in_index_buffer, static_cast(ibuffer.count)); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_GCODE_VIEWER_STATISTICS if (ibuffer.count > 0) { @@ -1579,17 +2447,26 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) unsigned int travel_buffer_id = buffer_id(EMoveType::Travel); const MultiIndexBuffer& travel_buffer_indices = indices[travel_buffer_id]; for (size_t i = 0; i < travel_buffer_indices.size(); ++i) { - m_statistics.travel_segments_count = travel_buffer_indices[i].size() / m_buffers[travel_buffer_id].indices_per_segment(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + m_statistics.travel_segments_count += travel_buffer_indices[i].size() / m_buffers[travel_buffer_id].indices_per_segment(); +// m_statistics.travel_segments_count = travel_buffer_indices[i].size() / m_buffers[travel_buffer_id].indices_per_segment(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } unsigned int wipe_buffer_id = buffer_id(EMoveType::Wipe); const MultiIndexBuffer& wipe_buffer_indices = indices[wipe_buffer_id]; for (size_t i = 0; i < wipe_buffer_indices.size(); ++i) { - m_statistics.wipe_segments_count = wipe_buffer_indices[i].size() / m_buffers[wipe_buffer_id].indices_per_segment(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + m_statistics.wipe_segments_count += wipe_buffer_indices[i].size() / m_buffers[wipe_buffer_id].indices_per_segment(); +// m_statistics.wipe_segments_count = wipe_buffer_indices[i].size() / m_buffers[wipe_buffer_id].indices_per_segment(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } unsigned int extrude_buffer_id = buffer_id(EMoveType::Extrude); const MultiIndexBuffer& extrude_buffer_indices = indices[extrude_buffer_id]; for (size_t i = 0; i < extrude_buffer_indices.size(); ++i) { - m_statistics.extrude_segments_count = extrude_buffer_indices[i].size() / m_buffers[extrude_buffer_id].indices_per_segment(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + m_statistics.extrude_segments_count += extrude_buffer_indices[i].size() / m_buffers[extrude_buffer_id].indices_per_segment(); +// m_statistics.extrude_segments_count = extrude_buffer_indices[i].size() / m_buffers[extrude_buffer_id].indices_per_segment(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } #endif // ENABLE_GCODE_VIEWER_STATISTICS @@ -1641,79 +2518,340 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) m_roles.erase(std::unique(m_roles.begin(), m_roles.end()), m_roles.end()); m_roles.shrink_to_fit(); - // extruder ids -> remove duplicates - std::sort(m_extruder_ids.begin(), m_extruder_ids.end()); - m_extruder_ids.erase(std::unique(m_extruder_ids.begin(), m_extruder_ids.end()), m_extruder_ids.end()); - m_extruder_ids.shrink_to_fit(); + // extruder ids -> remove duplicates + std::sort(m_extruder_ids.begin(), m_extruder_ids.end()); + m_extruder_ids.erase(std::unique(m_extruder_ids.begin(), m_extruder_ids.end()), m_extruder_ids.end()); + m_extruder_ids.shrink_to_fit(); + + log_memory_usage("Loaded G-code generated extrusion paths, ", vertices, indices); + +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.load_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + if (progress_dialog != nullptr) + progress_dialog->Destroy(); +} +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +void GCodeViewer::load_shells(const Print& print, bool initialized) +{ + if (print.objects().empty()) + // no shells, return + return; + + // adds objects' volumes + int object_id = 0; + for (const PrintObject* obj : print.objects()) { + const ModelObject* model_obj = obj->model_object(); + + std::vector instance_ids(model_obj->instances.size()); + for (int i = 0; i < (int)model_obj->instances.size(); ++i) { + instance_ids[i] = i; + } + + m_shells.volumes.load_object(model_obj, object_id, instance_ids, "object", initialized); + + ++object_id; + } + + if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptFFF) { + // adds wipe tower's volume + double max_z = print.objects()[0]->model_object()->get_model()->bounding_box().max(2); + const PrintConfig& config = print.config(); + size_t extruders_count = config.nozzle_diameter.size(); + if ((extruders_count > 1) && config.wipe_tower && !config.complete_objects) { + const DynamicPrintConfig& print_config = wxGetApp().preset_bundle->prints.get_edited_preset().config; + double layer_height = print_config.opt_float("layer_height"); + double first_layer_height = print_config.get_abs_value("first_layer_height", layer_height); + double nozzle_diameter = print.config().nozzle_diameter.values[0]; + float depth = print.wipe_tower_data(extruders_count, first_layer_height, nozzle_diameter).depth; + float brim_width = print.wipe_tower_data(extruders_count, first_layer_height, nozzle_diameter).brim_width; + + m_shells.volumes.load_wipe_tower_preview(1000, config.wipe_tower_x, config.wipe_tower_y, config.wipe_tower_width, depth, max_z, config.wipe_tower_rotation_angle, + !print.is_step_done(psWipeTower), brim_width, initialized); + } + } + + // remove modifiers + while (true) { + GLVolumePtrs::iterator it = std::find_if(m_shells.volumes.volumes.begin(), m_shells.volumes.volumes.end(), [](GLVolume* volume) { return volume->is_modifier; }); + if (it != m_shells.volumes.volumes.end()) { + delete (*it); + m_shells.volumes.volumes.erase(it); + } + else + break; + } + + for (GLVolume* volume : m_shells.volumes.volumes) { + volume->zoom_to_volumes = false; + volume->color[3] = 0.25f; + volume->force_native_color = true; + volume->set_render_color(); + } +} + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER +void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const +{ +#if ENABLE_GCODE_VIEWER_STATISTICS + auto start_time = std::chrono::high_resolution_clock::now(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + auto extrusion_color = [this](const Path& path) { + Color color; + switch (m_view_type) + { + case EViewType::FeatureType: { color = Extrusion_Role_Colors[static_cast(path.role)]; break; } + case EViewType::Height: { color = m_extrusions.ranges.height.get_color_at(path.height); break; } + case EViewType::Width: { color = m_extrusions.ranges.width.get_color_at(path.width); break; } + case EViewType::Feedrate: { color = m_extrusions.ranges.feedrate.get_color_at(path.feedrate); break; } + case EViewType::FanSpeed: { color = m_extrusions.ranges.fan_speed.get_color_at(path.fan_speed); break; } + case EViewType::VolumetricRate: { color = m_extrusions.ranges.volumetric_rate.get_color_at(path.volumetric_rate); break; } + case EViewType::Tool: { color = m_tool_colors[path.extruder_id]; break; } + case EViewType::ColorPrint: { + if (path.cp_color_id >= static_cast(m_tool_colors.size())) { + color = { 0.5f, 0.5f, 0.5f }; +// // complementary color +// color = m_tool_colors[255 - path.cp_color_id]; +// color = { 1.0f - color[0], 1.0f - color[1], 1.0f - color[2] }; + } + else + color = m_tool_colors[path.cp_color_id]; + + break; + } + default: { color = { 1.0f, 1.0f, 1.0f }; break; } + } + + return color; + }; + + auto travel_color = [this](const Path& path) { + return (path.delta_extruder < 0.0f) ? Travel_Colors[2] /* Retract */ : + ((path.delta_extruder > 0.0f) ? Travel_Colors[1] /* Extrude */ : + Travel_Colors[0] /* Move */); + }; + + auto is_in_layers_range = [this](const Path& path, size_t min_id, size_t max_id) { + auto in_layers_range = [this, min_id, max_id](size_t id) { + return m_layers.get_endpoints_at(min_id).first <= id && id <= m_layers.get_endpoints_at(max_id).last; + }; + + return in_layers_range(path.sub_paths.front().first.s_id) || in_layers_range(path.sub_paths.back().last.s_id); + }; + + auto is_travel_in_layers_range = [this](size_t path_id, size_t min_id, size_t max_id) { + auto is_in_z_range = [](const Path& path, double min_z, double max_z) { + auto in_z_range = [min_z, max_z](double z) { + return min_z - EPSILON < z && z < max_z + EPSILON; + }; + + return in_z_range(path.sub_paths.front().first.position[2]) || in_z_range(path.sub_paths.back().last.position[2]); + }; + + const TBuffer& buffer = m_buffers[buffer_id(EMoveType::Travel)]; + if (path_id >= buffer.paths.size()) + return false; + + Path path = buffer.paths[path_id]; + size_t first = path_id; + size_t last = path_id; + + // check adjacent paths + while (first > 0 && path.sub_paths.front().first.position.isApprox(buffer.paths[first - 1].sub_paths.back().last.position)) { + --first; + path.sub_paths.front().first = buffer.paths[first].sub_paths.front().first; + } + while (last < buffer.paths.size() - 1 && path.sub_paths.back().last.position.isApprox(buffer.paths[last + 1].sub_paths.front().first.position)) { + ++last; + path.sub_paths.back().last = buffer.paths[last].sub_paths.back().last; + } + + size_t min_s_id = m_layers.get_endpoints_at(min_id).first; + size_t max_s_id = m_layers.get_endpoints_at(max_id).last; + + return (min_s_id <= path.sub_paths.front().first.s_id && path.sub_paths.front().first.s_id <= max_s_id) || + (min_s_id <= path.sub_paths.back().last.s_id && path.sub_paths.back().last.s_id <= max_s_id); + }; + +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.render_paths_size = 0; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + bool top_layer_only = get_app_config()->get("seq_top_layer_only") == "1"; + + SequentialView::Endpoints global_endpoints = { m_moves_count , 0 }; + SequentialView::Endpoints top_layer_endpoints = global_endpoints; + if (top_layer_only || !keep_sequential_current_first) m_sequential_view.current.first = 0; + if (!keep_sequential_current_last) m_sequential_view.current.last = m_moves_count; + + // first pass: collect visible paths and update sequential view data + std::vector> paths; + for (TBuffer& buffer : m_buffers) { + // reset render paths + buffer.render_paths.clear(); + + if (!buffer.visible) + continue; + + for (size_t i = 0; i < buffer.paths.size(); ++i) { + const Path& path = buffer.paths[i]; + if (path.type == EMoveType::Travel) { + if (!is_travel_in_layers_range(i, m_layers_z_range[0], m_layers_z_range[1])) + continue; + } + else if (!is_in_layers_range(path, m_layers_z_range[0], m_layers_z_range[1])) + continue; + + if (path.type == EMoveType::Extrude && !is_visible(path)) + continue; + + // store valid path + for (size_t j = 0; j < path.sub_paths.size(); ++j) { + paths.push_back({ &buffer, path.sub_paths[j].first.b_id, static_cast(i), static_cast(j) }); + } + + global_endpoints.first = std::min(global_endpoints.first, path.sub_paths.front().first.s_id); + global_endpoints.last = std::max(global_endpoints.last, path.sub_paths.back().last.s_id); + + if (top_layer_only) { + if (path.type == EMoveType::Travel) { + if (is_travel_in_layers_range(i, m_layers_z_range[1], m_layers_z_range[1])) { + top_layer_endpoints.first = std::min(top_layer_endpoints.first, path.sub_paths.front().first.s_id); + top_layer_endpoints.last = std::max(top_layer_endpoints.last, path.sub_paths.back().last.s_id); + } + } + else if (is_in_layers_range(path, m_layers_z_range[1], m_layers_z_range[1])) { + top_layer_endpoints.first = std::min(top_layer_endpoints.first, path.sub_paths.front().first.s_id); + top_layer_endpoints.last = std::max(top_layer_endpoints.last, path.sub_paths.back().last.s_id); + } + } + } + } + + // update current sequential position + m_sequential_view.current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(m_sequential_view.current.first, global_endpoints.first, global_endpoints.last) : global_endpoints.first; + m_sequential_view.current.last = keep_sequential_current_last ? std::clamp(m_sequential_view.current.last, global_endpoints.first, global_endpoints.last) : global_endpoints.last; + + // get the world position from gpu + bool found = false; + for (const TBuffer& buffer : m_buffers) { + // searches the path containing the current position + for (const Path& path : buffer.paths) { + int sub_path_id = path.get_id_of_sub_path_containing(m_sequential_view.current.last); + if (sub_path_id != -1) { + const Path::Sub_Path& sub_path = path.sub_paths[sub_path_id]; + unsigned int offset = static_cast(m_sequential_view.current.last - sub_path.first.s_id); + if (offset > 0) { + if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Line) + offset = 2 * offset - 1; + else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { + unsigned int indices_count = buffer.indices_per_segment(); + offset = indices_count * (offset - 1) + (indices_count - 6); + } + } + offset += static_cast(sub_path.first.i_id); + + // gets the index from the index buffer on gpu + const IBuffer& i_buffer = buffer.indices[sub_path.first.b_id]; + unsigned int index = 0; + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(offset * sizeof(unsigned int)), static_cast(sizeof(unsigned int)), static_cast(&index))); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - log_memory_usage("Loaded G-code generated extrusion paths, ", vertices, indices); + // gets the position from the vertices buffer on gpu + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); + glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, static_cast(index * buffer.vertices.vertex_size_bytes()), static_cast(3 * sizeof(float)), static_cast(m_sequential_view.current_position.data()))); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + found = true; + break; + } + } -#if ENABLE_GCODE_VIEWER_STATISTICS - m_statistics.load_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS + if (found) + break; + } - if (progress_dialog != nullptr) - progress_dialog->Destroy(); -} + // second pass: filter paths by sequential data and collect them by color + RenderPath* render_path = nullptr; + for (const auto& [buffer, index_buffer_id, path_id, sub_path_id] : paths) { + const Path& path = buffer->paths[path_id]; + const Path::Sub_Path& sub_path = path.sub_paths[sub_path_id]; + if (m_sequential_view.current.last <= sub_path.first.s_id || sub_path.last.s_id <= m_sequential_view.current.first) + continue; -void GCodeViewer::load_shells(const Print& print, bool initialized) -{ - if (print.objects().empty()) - // no shells, return - return; + Color color; + switch (path.type) + { + case EMoveType::Extrude: { + if (!top_layer_only || + m_sequential_view.current.last == global_endpoints.last || + is_in_layers_range(path, m_layers_z_range[1], m_layers_z_range[1])) + color = extrusion_color(path); + else + color = { 0.25f, 0.25f, 0.25f }; - // adds objects' volumes - int object_id = 0; - for (const PrintObject* obj : print.objects()) { - const ModelObject* model_obj = obj->model_object(); + break; + } + case EMoveType::Travel: { + if (!top_layer_only || m_sequential_view.current.last == global_endpoints.last || is_travel_in_layers_range(path_id, m_layers_z_range[1], m_layers_z_range[1])) + color = (m_view_type == EViewType::Feedrate || m_view_type == EViewType::Tool || m_view_type == EViewType::ColorPrint) ? extrusion_color(path) : travel_color(path); + else + color = { 0.25f, 0.25f, 0.25f }; - std::vector instance_ids(model_obj->instances.size()); - for (int i = 0; i < (int)model_obj->instances.size(); ++i) { - instance_ids[i] = i; + break; + } + case EMoveType::Wipe: { color = Wipe_Color; break; } + default: { color = { 0.0f, 0.0f, 0.0f }; break; } } - m_shells.volumes.load_object(model_obj, object_id, instance_ids, "object", initialized); + RenderPath key{ color, static_cast(index_buffer_id), path_id }; + if (render_path == nullptr || !RenderPathPropertyEqual()(*render_path, key)) + render_path = const_cast(&(*buffer->render_paths.emplace(key).first)); + unsigned int segments_count = std::min(m_sequential_view.current.last, sub_path.last.s_id) - std::max(m_sequential_view.current.first, sub_path.first.s_id) + 1; + unsigned int size_in_indices = 0; + switch (buffer->render_primitive_type) + { + case TBuffer::ERenderPrimitiveType::Point: { size_in_indices = segments_count; break; } + case TBuffer::ERenderPrimitiveType::Line: + case TBuffer::ERenderPrimitiveType::Triangle: { size_in_indices = buffer->indices_per_segment() * (segments_count - 1); break; } + } + render_path->sizes.push_back(size_in_indices); - ++object_id; - } + unsigned int delta_1st = 0; + if (sub_path.first.s_id < m_sequential_view.current.first && m_sequential_view.current.first <= sub_path.last.s_id) + delta_1st = m_sequential_view.current.first - sub_path.first.s_id; - if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptFFF) { - // adds wipe tower's volume - double max_z = print.objects()[0]->model_object()->get_model()->bounding_box().max(2); - const PrintConfig& config = print.config(); - size_t extruders_count = config.nozzle_diameter.size(); - if ((extruders_count > 1) && config.wipe_tower && !config.complete_objects) { - const DynamicPrintConfig& print_config = wxGetApp().preset_bundle->prints.get_edited_preset().config; - double layer_height = print_config.opt_float("layer_height"); - double first_layer_height = print_config.get_abs_value("first_layer_height", layer_height); - double nozzle_diameter = print.config().nozzle_diameter.values[0]; - float depth = print.wipe_tower_data(extruders_count, first_layer_height, nozzle_diameter).depth; - float brim_width = print.wipe_tower_data(extruders_count, first_layer_height, nozzle_diameter).brim_width; + if (buffer->render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) + delta_1st *= buffer->indices_per_segment(); - m_shells.volumes.load_wipe_tower_preview(1000, config.wipe_tower_x, config.wipe_tower_y, config.wipe_tower_width, depth, max_z, config.wipe_tower_rotation_angle, - !print.is_step_done(psWipeTower), brim_width, initialized); - } + render_path->offsets.push_back(static_cast((sub_path.first.i_id + delta_1st) * sizeof(unsigned int))); } - // remove modifiers - while (true) { - GLVolumePtrs::iterator it = std::find_if(m_shells.volumes.volumes.begin(), m_shells.volumes.volumes.end(), [](GLVolume* volume) { return volume->is_modifier; }); - if (it != m_shells.volumes.volumes.end()) { - delete (*it); - m_shells.volumes.volumes.erase(it); - } - else - break; - } + // set sequential data to their final value + m_sequential_view.endpoints = top_layer_only ? top_layer_endpoints : global_endpoints; + m_sequential_view.current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(m_sequential_view.current.first, m_sequential_view.endpoints.first, m_sequential_view.endpoints.last) : m_sequential_view.endpoints.first; - for (GLVolume* volume : m_shells.volumes.volumes) { - volume->zoom_to_volumes = false; - volume->color[3] = 0.25f; - volume->force_native_color = true; - volume->set_render_color(); + wxGetApp().plater()->enable_preview_moves_slider(!paths.empty()); + +#if ENABLE_GCODE_VIEWER_STATISTICS + for (const TBuffer& buffer : m_buffers) { + m_statistics.render_paths_size += SLIC3R_STDUNORDEREDSET_MEMSIZE(buffer.render_paths, RenderPath); + for (const RenderPath& path : buffer.render_paths) { + m_statistics.render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.sizes, unsigned int); + m_statistics.render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.offsets, size_t); + } } + m_statistics.refresh_paths_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS } - +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const { #if ENABLE_GCODE_VIEWER_STATISTICS @@ -1961,7 +3099,159 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool m_statistics.refresh_paths_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); #endif // ENABLE_GCODE_VIEWER_STATISTICS } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER +void GCodeViewer::render_toolpaths() const +{ +#if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS + float point_size = 20.0f; +#else + float point_size = 0.8f; +#endif // ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS + std::array light_intensity = { 0.25f, 0.70f, 0.75f, 0.75f }; + const Camera& camera = wxGetApp().plater()->get_camera(); + double zoom = camera.get_zoom(); + const std::array& viewport = camera.get_viewport(); + float near_plane_height = camera.get_type() == Camera::Perspective ? static_cast(viewport[3]) / (2.0f * static_cast(2.0 * std::tan(0.5 * Geometry::deg2rad(camera.get_fov())))) : + static_cast(viewport[3]) * 0.0005; + + auto set_uniform_color = [](const std::array& color, GLShaderProgram& shader) { + std::array color4 = { color[0], color[1], color[2], 1.0f }; + shader.set_uniform("uniform_color", color4); + }; + + auto render_as_points = [this, zoom, point_size, near_plane_height, set_uniform_color] + (const TBuffer& buffer, unsigned int i_buffer_id, EOptionsColors color_id, GLShaderProgram& shader) { + set_uniform_color(Options_Colors[static_cast(color_id)], shader); +#if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS + shader.set_uniform("use_fixed_screen_size", 1); +#else + shader.set_uniform("use_fixed_screen_size", 0); +#endif // ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS + shader.set_uniform("zoom", zoom); + shader.set_uniform("percent_outline_radius", 0.0f); + shader.set_uniform("percent_center_radius", 0.33f); + shader.set_uniform("point_size", point_size); + shader.set_uniform("near_plane_height", near_plane_height); + + glsafe(::glEnable(GL_VERTEX_PROGRAM_POINT_SIZE)); + glsafe(::glEnable(GL_POINT_SPRITE)); + + for (const RenderPath& path : buffer.render_paths) { + if (path.index_buffer_id == i_buffer_id) { + glsafe(::glMultiDrawElements(GL_POINTS, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#if ENABLE_GCODE_VIEWER_STATISTICS + ++m_statistics.gl_multi_points_calls_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + } + } + + glsafe(::glDisable(GL_POINT_SPRITE)); + glsafe(::glDisable(GL_VERTEX_PROGRAM_POINT_SIZE)); + }; + + auto render_as_lines = [this, light_intensity, set_uniform_color](const TBuffer& buffer, unsigned int index_buffer_id, GLShaderProgram& shader) { + shader.set_uniform("light_intensity", light_intensity); + for (const RenderPath& path : buffer.render_paths) { + if (path.index_buffer_id == index_buffer_id) { + set_uniform_color(path.color, shader); + glsafe(::glMultiDrawElements(GL_LINES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#if ENABLE_GCODE_VIEWER_STATISTICS + ++m_statistics.gl_multi_lines_calls_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + } + } + }; + + auto render_as_triangles = [this, set_uniform_color](const TBuffer& buffer, unsigned int index_buffer_id, GLShaderProgram& shader) { + for (const RenderPath& path : buffer.render_paths) { + if (path.index_buffer_id == index_buffer_id) { + set_uniform_color(path.color, shader); + glsafe(::glMultiDrawElements(GL_TRIANGLES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#if ENABLE_GCODE_VIEWER_STATISTICS + ++m_statistics.gl_multi_triangles_calls_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + } + } + }; + + auto line_width = [](double zoom) { + return (zoom < 5.0) ? 1.0 : (1.0 + 5.0 * (zoom - 5.0) / (100.0 - 5.0)); + }; + + glsafe(::glLineWidth(static_cast(line_width(zoom)))); + + unsigned char begin_id = buffer_id(EMoveType::Retract); + unsigned char end_id = buffer_id(EMoveType::Count); + + for (unsigned char i = begin_id; i < end_id; ++i) { + const TBuffer& buffer = m_buffers[i]; + if (!buffer.visible || !buffer.has_data()) + continue; + + GLShaderProgram* shader = wxGetApp().get_shader(buffer.shader.c_str()); + if (shader != nullptr) { + shader->start_using(); + + for (size_t j = 0; j < buffer.indices.size(); ++j) { + const IBuffer& i_buffer = buffer.indices[j]; + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); + glsafe(::glVertexPointer(buffer.vertices.position_size_floats(), GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_size())); + glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); + bool has_normals = buffer.vertices.normal_size_floats() > 0; + if (has_normals) { + glsafe(::glNormalPointer(GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_size())); + glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); + } + + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); + + switch (buffer.render_primitive_type) + { + case TBuffer::ERenderPrimitiveType::Point: { + EOptionsColors color; + switch (buffer_type(i)) + { + case EMoveType::Tool_change: { color = EOptionsColors::ToolChanges; break; } + case EMoveType::Color_change: { color = EOptionsColors::ColorChanges; break; } + case EMoveType::Pause_Print: { color = EOptionsColors::PausePrints; break; } + case EMoveType::Custom_GCode: { color = EOptionsColors::CustomGCodes; break; } + case EMoveType::Retract: { color = EOptionsColors::Retractions; break; } + case EMoveType::Unretract: { color = EOptionsColors::Unretractions; break; } + } + render_as_points(buffer, static_cast(j), color, *shader); + break; + } + case TBuffer::ERenderPrimitiveType::Line: { + render_as_lines(buffer, static_cast(j), *shader); + break; + } + case TBuffer::ERenderPrimitiveType::Triangle: { + render_as_triangles(buffer, static_cast(j), *shader); + break; + } + } + + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + + if (has_normals) + glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); + glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + } + + shader->stop_using(); + } + } +} +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GCodeViewer::render_toolpaths() const { #if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS @@ -2108,6 +3398,9 @@ void GCodeViewer::render_toolpaths() const } } } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GCodeViewer::render_shells() const { @@ -2908,10 +4201,12 @@ void GCodeViewer::render_statistics() const add_counter(std::string("Extrude segments count:"), m_statistics.extrude_segments_count); ImGui::Separator(); add_counter(std::string("VBuffers count:"), m_statistics.vbuffers_count); - add_counter(std::string("IBuffers count:"), m_statistics.ibuffers_count); - ImGui::Separator(); - add_counter(std::string("Max vertices in VBuffer:"), m_statistics.max_vertices_in_vertex_buffer); - add_counter(std::string("Max indices in IBuffer:"), m_statistics.max_indices_in_index_buffer); + add_counter(std::string("IBuffers count:"), m_statistics.ibuffers_count); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +// ImGui::Separator(); +// add_counter(std::string("Max vertices in VBuffer:"), m_statistics.max_vertices_in_vertex_buffer); +// add_counter(std::string("Max indices in IBuffer:"), m_statistics.max_indices_in_index_buffer); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); } @@ -2935,9 +4230,19 @@ void GCodeViewer::log_memory_used(const std::string& label, int64_t additional) } int64_t layers_size = SLIC3R_STDVEC_MEMSIZE(m_layers.get_zs(), double); layers_size += SLIC3R_STDVEC_MEMSIZE(m_layers.get_endpoints(), Layers::Endpoints); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER + BOOST_LOG_TRIVIAL(trace) << label + << "(" << format_memsize_MB(additional + paths_size + render_paths_size + layers_size) << ");" + << log_memory_info(); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BOOST_LOG_TRIVIAL(trace) << label << format_memsize_MB(additional + paths_size + render_paths_size + layers_size) << log_memory_info(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } } diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 5f276b09f0a..51fd560a347 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -21,6 +21,11 @@ class GCodeViewer { using Color = std::array; using VertexBuffer = std::vector; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER + using MultiVertexBuffer = std::vector; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ using IndexBuffer = std::vector; using MultiIndexBuffer = std::vector; @@ -40,7 +45,7 @@ class GCodeViewer CustomGCodes }; - // vbo buffer containing vertices data used to rendder a specific toolpath type + // vbo buffer containing vertices data used to render a specific toolpath type struct VBuffer { enum class EFormat : unsigned char @@ -54,8 +59,17 @@ class GCodeViewer }; EFormat format{ EFormat::Position }; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER + // vbos id + std::vector ids; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // vbo id unsigned int id{ 0 }; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // count of vertices, updated after data are sent to gpu size_t count{ 0 }; @@ -66,26 +80,24 @@ class GCodeViewer size_t position_offset_floats() const { return 0; } size_t position_offset_size() const { return position_offset_floats() * sizeof(float); } - size_t position_size_floats() const - { + size_t position_size_floats() const { switch (format) { case EFormat::Position: case EFormat::PositionNormal3: { return 3; } case EFormat::PositionNormal1: { return 4; } - default: { return 0; } + default: { return 0; } } } size_t position_size_bytes() const { return position_size_floats() * sizeof(float); } - size_t normal_offset_floats() const - { + size_t normal_offset_floats() const { switch (format) { case EFormat::Position: case EFormat::PositionNormal1: { return 0; } case EFormat::PositionNormal3: { return 3; } - default: { return 0; } + default: { return 0; } } } size_t normal_offset_size() const { return normal_offset_floats() * sizeof(float); } @@ -103,11 +115,22 @@ class GCodeViewer void reset(); }; - // ibo buffer containing indices data (lines/triangles) used to render a specific toolpath type + // ibo buffer containing indices data (for lines/triangles) used to render a specific toolpath type struct IBuffer { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER + // id of the associated vertex buffer + unsigned int vbo{ 0 }; + // ibo id + unsigned int ibo{ 0 }; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // ibo id unsigned int id{ 0 }; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // count of indices, updated after data are sent to gpu size_t count{ 0 }; @@ -128,10 +151,30 @@ class GCodeViewer Vec3f position{ Vec3f::Zero() }; }; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER + struct Sub_Path + { + Endpoint first; + Endpoint last; + + bool contains(size_t s_id) const { + return first.s_id <= s_id && s_id <= last.s_id; + } + }; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + EMoveType type{ EMoveType::Noop }; ExtrusionRole role{ erNone }; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Endpoint first; Endpoint last; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float delta_extruder{ 0.0f }; float height{ 0.0f }; float width{ 0.0f }; @@ -140,13 +183,46 @@ class GCodeViewer float volumetric_rate{ 0.0f }; unsigned char extruder_id{ 0 }; unsigned char cp_color_id{ 0 }; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER + std::vector sub_paths; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool matches(const GCodeProcessor::MoveVertex& move) const; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER + size_t vertices_count() const { + return sub_paths.empty() ? 0 : sub_paths.back().last.s_id - sub_paths.front().first.s_id + 1; + } + bool contains(size_t s_id) const { + return sub_paths.empty() ? false : sub_paths.front().first.s_id <= s_id && s_id <= sub_paths.back().last.s_id; + } + int get_id_of_sub_path_containing(size_t s_id) const { + if (sub_paths.empty()) + return -1; + else { + for (int i = 0; i < static_cast(sub_paths.size()); ++i) { + if (sub_paths[i].contains(s_id)) + return i; + } + return -1; + } + } + void add_sub_path(const GCodeProcessor::MoveVertex& move, unsigned int b_id, size_t i_id, size_t s_id) { + Endpoint endpoint = { b_id, i_id, s_id, move.position }; + sub_paths.push_back({ endpoint , endpoint }); + } +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ size_t vertices_count() const { return last.s_id - first.s_id + 1; } bool contains(size_t id) const { return first.s_id <= id && id <= last.s_id; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }; - // Used to batch the indices needed to render paths + // Used to batch the indices needed to render the paths struct RenderPath { // Render path property @@ -202,28 +278,54 @@ class GCodeViewer bool visible{ false }; void reset(); + // b_id index of buffer contained in this->indices // i_id index of first index contained in this->indices[b_id] // s_id index of first vertex contained in this->vertices void add_path(const GCodeProcessor::MoveVertex& move, unsigned int b_id, size_t i_id, size_t s_id); - unsigned int indices_per_segment() const { + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER + unsigned int max_vertices_per_segment() const { switch (render_primitive_type) { case ERenderPrimitiveType::Point: { return 1; } case ERenderPrimitiveType::Line: { return 2; } - case ERenderPrimitiveType::Triangle: { return 42; } // 3 indices x 14 triangles + case ERenderPrimitiveType::Triangle: { return 8; } default: { return 0; } } } - unsigned int start_segment_vertex_offset() const { + + size_t max_vertices_per_segment_size_floats() const { return vertices.vertex_size_floats() * static_cast(max_vertices_per_segment()); } + size_t max_vertices_per_segment_size_bytes() const { return max_vertices_per_segment_size_floats() * sizeof(float); } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + unsigned int indices_per_segment() const { switch (render_primitive_type) { - case ERenderPrimitiveType::Point: - case ERenderPrimitiveType::Line: - case ERenderPrimitiveType::Triangle: - default: { return 0; } + case ERenderPrimitiveType::Point: { return 1; } + case ERenderPrimitiveType::Line: { return 2; } + case ERenderPrimitiveType::Triangle: { return 42; } // 3 indices x 14 triangles + default: { return 0; } } } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER + size_t indices_per_segment_size_bytes() const { return static_cast(indices_per_segment() * sizeof(unsigned int)); } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + unsigned int start_segment_vertex_offset() const { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + return 0; +// switch (render_primitive_type) +// { +// case ERenderPrimitiveType::Point: +// case ERenderPrimitiveType::Line: +// case ERenderPrimitiveType::Triangle: +// default: { return 0; } +// } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + } unsigned int end_segment_vertex_offset() const { switch (render_primitive_type) { @@ -234,7 +336,17 @@ class GCodeViewer } } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER + bool has_data() const { + return !vertices.ids.empty() && vertices.ids.front() != 0 && !indices.empty() && indices.front().ibo != 0; + } +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool has_data() const { return vertices.id != 0 && !indices.empty() && indices.front().id != 0; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }; // helper to render shells @@ -309,6 +421,13 @@ class GCodeViewer { size_t first{ 0 }; size_t last{ 0 }; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER + bool operator == (const Endpoints& other) const { + return first == other.first && last == other.last; + } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }; private: @@ -316,14 +435,12 @@ class GCodeViewer std::vector m_endpoints; public: - void append(double z, Endpoints endpoints) - { + void append(double z, Endpoints endpoints) { m_zs.emplace_back(z); m_endpoints.emplace_back(endpoints); } - void reset() - { + void reset() { m_zs = std::vector(); m_endpoints = std::vector(); } @@ -335,6 +452,19 @@ class GCodeViewer std::vector& get_endpoints() { return m_endpoints; } double get_z_at(unsigned int id) const { return (id < m_zs.size()) ? m_zs[id] : 0.0; } Endpoints get_endpoints_at(unsigned int id) const { return (id < m_endpoints.size()) ? m_endpoints[id] : Endpoints(); } + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SPLITTED_VERTEX_BUFFER + bool operator != (const Layers& other) const { + if (m_zs != other.m_zs) + return true; + if (!(m_endpoints == other.m_endpoints)) + return true; + + return false; + } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }; #if ENABLE_GCODE_VIEWER_STATISTICS @@ -363,8 +493,10 @@ class GCodeViewer int64_t extrude_segments_count{ 0 }; int64_t vbuffers_count{ 0 }; int64_t ibuffers_count{ 0 }; - int64_t max_vertices_in_vertex_buffer{ 0 }; - int64_t max_indices_in_index_buffer{ 0 }; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +// int64_t max_vertices_in_vertex_buffer{ 0 }; +// int64_t max_indices_in_index_buffer{ 0 }; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void reset_all() { reset_times(); @@ -402,8 +534,10 @@ class GCodeViewer extrude_segments_count = 0; vbuffers_count = 0; ibuffers_count = 0; - max_vertices_in_vertex_buffer = 0; - max_indices_in_index_buffer = 0; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +// max_vertices_in_vertex_buffer = 0; +// max_indices_in_index_buffer = 0; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } }; #endif // ENABLE_GCODE_VIEWER_STATISTICS From e443fe49ad6de3dbc36225d638f095fcad30d303 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 12 Jan 2021 14:03:58 +0100 Subject: [PATCH 014/143] ENABLE_SPLITTED_VERTEX_BUFFER - fixed visualization of last segment for paths whose vertex buffer has been splitted --- src/slic3r/GUI/GCodeViewer.cpp | 216 ++++++++++----------------------- src/slic3r/GUI/GCodeViewer.hpp | 23 +--- 2 files changed, 65 insertions(+), 174 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index aaafd333d00..64d064a33b3 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1079,15 +1079,15 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) { auto log_memory_usage = [this](const std::string& label, const std::vector& vertices, const std::vector& indices) { int64_t vertices_size = 0; - for (const MultiVertexBuffer& v_multibuffer : vertices) { - for (const VertexBuffer& v_buffer : v_multibuffer) { - vertices_size += SLIC3R_STDVEC_MEMSIZE(v_buffer, float); + for (const MultiVertexBuffer& buffers : vertices) { + for (const VertexBuffer& buffer : buffers) { + vertices_size += SLIC3R_STDVEC_MEMSIZE(buffer, float); } } int64_t indices_size = 0; - for (const MultiIndexBuffer& i_multibuffer : indices) { - for (const IndexBuffer& i_buffer : i_multibuffer) { - indices_size += SLIC3R_STDVEC_MEMSIZE(i_buffer, unsigned int); + for (const MultiIndexBuffer& buffers : indices) { + for (const IndexBuffer& buffer : buffers) { + indices_size += SLIC3R_STDVEC_MEMSIZE(buffer, unsigned int); } } log_memory_used(label, vertices_size + indices_size); @@ -1100,8 +1100,8 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) vertices.push_back(curr.position[2]); }; auto add_indices_as_point = [](const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, - unsigned int i_buffer_id, IndexBuffer& indices, size_t move_id) { - buffer.add_path(curr, i_buffer_id, indices.size(), move_id); + unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { + buffer.add_path(curr, ibuffer_id, indices.size(), move_id); indices.push_back(static_cast(indices.size())); }; @@ -1125,11 +1125,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) add_vertex(curr); }; auto add_indices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, - unsigned int i_buffer_id, IndexBuffer& indices, size_t move_id) { + unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { // add starting index indices.push_back(static_cast(indices.size())); - buffer.add_path(curr, i_buffer_id, indices.size() - 1, move_id - 1); + buffer.add_path(curr, ibuffer_id, indices.size() - 1, move_id - 1); buffer.paths.back().sub_paths.front().first.position = prev.position; } @@ -1141,7 +1141,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) // add current index indices.push_back(static_cast(indices.size())); - last_path.sub_paths.back().last = { i_buffer_id, indices.size() - 1, move_id, curr.position }; + last_path.sub_paths.back().last = { ibuffer_id, indices.size() - 1, move_id, curr.position }; }; // format data into the buffers to be rendered as solid @@ -1629,7 +1629,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) { Path& last_path = t_buffer.paths.back(); - last_path.add_sub_path(curr, static_cast(i_multibuffer.size()) - 1, 0, i); + last_path.add_sub_path(prev, static_cast(i_multibuffer.size()) - 1, 0, i - 1); } } @@ -1700,21 +1700,18 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) for (const TBuffer& buffer : m_buffers) { m_statistics.paths_size += SLIC3R_STDVEC_MEMSIZE(buffer.paths, Path); } - unsigned int travel_buffer_id = buffer_id(EMoveType::Travel); - const MultiIndexBuffer& travel_buffers = indices[travel_buffer_id]; - for (const IndexBuffer& buffer : travel_buffers) { - m_statistics.travel_segments_count += buffer.size() / m_buffers[travel_buffer_id].indices_per_segment(); - } - unsigned int wipe_buffer_id = buffer_id(EMoveType::Wipe); - const MultiIndexBuffer& wipe_buffers = indices[wipe_buffer_id]; - for (const IndexBuffer& buffer : wipe_buffers) { - m_statistics.wipe_segments_count += buffer.size() / m_buffers[wipe_buffer_id].indices_per_segment(); - } - unsigned int extrude_buffer_id = buffer_id(EMoveType::Extrude); - const MultiIndexBuffer& extrude_buffers = indices[extrude_buffer_id]; - for (const IndexBuffer& buffer : extrude_buffers) { - m_statistics.extrude_segments_count += buffer.size() / m_buffers[extrude_buffer_id].indices_per_segment(); - } + + auto update_segments_count = [&](EMoveType type, int64_t& count) { + unsigned int id = buffer_id(type); + const MultiIndexBuffer& buffers = indices[id]; + for (const IndexBuffer& buffer : buffers) { + count += buffer.size() / m_buffers[id].indices_per_segment(); + } + }; + + update_segments_count(EMoveType::Travel, m_statistics.travel_segments_count); + update_segments_count(EMoveType::Wipe, m_statistics.wipe_segments_count); + update_segments_count(EMoveType::Extrude, m_statistics.extrude_segments_count); #endif // ENABLE_GCODE_VIEWER_STATISTICS log_memory_usage("Loaded G-code generated indices buffers ", vertices, indices); @@ -1865,11 +1862,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) }; auto add_indices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, unsigned int index_buffer_id, IndexBuffer& indices, size_t move_id) { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -// // x component of the normal to the current segment (the normal is parallel to the XY plane) -// float normal_x = (curr.position - prev.position).normalized()[1]; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { // add starting index indices.push_back(static_cast(indices.size())); @@ -2054,10 +2046,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) buffer.paths.back().first.position = prev.position; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -// unsigned int starting_vertices_size = static_cast(buffer_vertices_size); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - Vec3f dir = (curr.position - prev.position).normalized(); Vec3f right = (std::abs(std::abs(dir.dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) ? -Vec3f::UnitY() : Vec3f(dir[1], -dir[0], 0.0f).normalized(); Vec3f up = right.cross(dir); @@ -2072,7 +2060,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) float length = (curr_pos - prev_pos).norm(); if (last_path.vertices_count() == 1) { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // 1st segment // triangles starting cap @@ -2097,31 +2084,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) store_triangle(indices, buffer_vertices_size + 4, buffer_vertices_size + 5, buffer_vertices_size + 6); buffer_vertices_size += 8; - -// // 1st segment -// buffer_vertices_size += 8; -// -// // triangles starting cap -// store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 2, starting_vertices_size + 1); -// store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 3, starting_vertices_size + 2); -// -// // dummy triangles outer corner cap -// append_dummy_cap(indices, starting_vertices_size); -// -// // triangles sides -// store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 1, starting_vertices_size + 4); -// store_triangle(indices, starting_vertices_size + 1, starting_vertices_size + 5, starting_vertices_size + 4); -// store_triangle(indices, starting_vertices_size + 1, starting_vertices_size + 2, starting_vertices_size + 5); -// store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 6, starting_vertices_size + 5); -// store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 3, starting_vertices_size + 6); -// store_triangle(indices, starting_vertices_size + 3, starting_vertices_size + 7, starting_vertices_size + 6); -// store_triangle(indices, starting_vertices_size + 3, starting_vertices_size + 0, starting_vertices_size + 7); -// store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 4, starting_vertices_size + 7); -// -// // triangles ending cap -// store_triangle(indices, starting_vertices_size + 4, starting_vertices_size + 6, starting_vertices_size + 7); -// store_triangle(indices, starting_vertices_size + 4, starting_vertices_size + 5, starting_vertices_size + 6); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } else { // any other segment @@ -2152,7 +2114,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) } } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // triangles starting cap store_triangle(indices, buffer_vertices_size - 4, buffer_vertices_size - 2, buffer_vertices_size + 0); store_triangle(indices, buffer_vertices_size - 4, buffer_vertices_size + 1, buffer_vertices_size - 2); @@ -2192,47 +2153,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) store_triangle(indices, buffer_vertices_size + 2, buffer_vertices_size + 3, buffer_vertices_size + 4); buffer_vertices_size += 6; - -// buffer_vertices_size += 6; -// -// // triangles starting cap -// store_triangle(indices, starting_vertices_size - 4, starting_vertices_size - 2, starting_vertices_size + 0); -// store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 1, starting_vertices_size - 2); -// -// // triangles outer corner cap -// if (is_right_turn) { -// if (left_displaced) -// // dummy triangles -// append_dummy_cap(indices, starting_vertices_size); -// else { -// store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 1, starting_vertices_size - 1); -// store_triangle(indices, starting_vertices_size + 1, starting_vertices_size - 2, starting_vertices_size - 1); -// } -// } -// else { -// if (right_displaced) -// // dummy triangles -// append_dummy_cap(indices, starting_vertices_size); -// else { -// store_triangle(indices, starting_vertices_size - 4, starting_vertices_size - 3, starting_vertices_size + 0); -// store_triangle(indices, starting_vertices_size - 3, starting_vertices_size - 2, starting_vertices_size + 0); -// } -// } -// -// // triangles sides -// store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 0, starting_vertices_size + 2); -// store_triangle(indices, starting_vertices_size + 0, starting_vertices_size + 3, starting_vertices_size + 2); -// store_triangle(indices, starting_vertices_size + 0, starting_vertices_size - 2, starting_vertices_size + 3); -// store_triangle(indices, starting_vertices_size - 2, starting_vertices_size + 4, starting_vertices_size + 3); -// store_triangle(indices, starting_vertices_size - 2, starting_vertices_size + 1, starting_vertices_size + 4); -// store_triangle(indices, starting_vertices_size + 1, starting_vertices_size + 5, starting_vertices_size + 4); -// store_triangle(indices, starting_vertices_size + 1, starting_vertices_size - 4, starting_vertices_size + 5); -// store_triangle(indices, starting_vertices_size - 4, starting_vertices_size + 2, starting_vertices_size + 5); -// -// // triangles ending cap -// store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 4, starting_vertices_size + 5); -// store_triangle(indices, starting_vertices_size + 2, starting_vertices_size + 3, starting_vertices_size + 4); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } last_path.last = { index_buffer_id, indices.size() - 1, move_id, curr.position }; @@ -2310,9 +2230,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) #if ENABLE_GCODE_VIEWER_STATISTICS m_statistics.total_vertices_gpu_size += buffer_vertices.size() * sizeof(float); m_statistics.max_vbuffer_gpu_size = std::max(m_statistics.max_vbuffer_gpu_size, static_cast(buffer_vertices.size() * sizeof(float))); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -// m_statistics.max_vertices_in_vertex_buffer = std::max(m_statistics.max_vertices_in_vertex_buffer, static_cast(buffer.vertices.count)); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_GCODE_VIEWER_STATISTICS if (buffer.vertices.count > 0) { @@ -2423,9 +2340,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) #if ENABLE_GCODE_VIEWER_STATISTICS m_statistics.total_indices_gpu_size += ibuffer.count * sizeof(unsigned int); m_statistics.max_ibuffer_gpu_size = std::max(m_statistics.max_ibuffer_gpu_size, static_cast(ibuffer.count * sizeof(unsigned int))); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -// m_statistics.max_indices_in_index_buffer = std::max(m_statistics.max_indices_in_index_buffer, static_cast(ibuffer.count)); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_GCODE_VIEWER_STATISTICS if (ibuffer.count > 0) { @@ -2447,26 +2361,17 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) unsigned int travel_buffer_id = buffer_id(EMoveType::Travel); const MultiIndexBuffer& travel_buffer_indices = indices[travel_buffer_id]; for (size_t i = 0; i < travel_buffer_indices.size(); ++i) { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_statistics.travel_segments_count += travel_buffer_indices[i].size() / m_buffers[travel_buffer_id].indices_per_segment(); -// m_statistics.travel_segments_count = travel_buffer_indices[i].size() / m_buffers[travel_buffer_id].indices_per_segment(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } unsigned int wipe_buffer_id = buffer_id(EMoveType::Wipe); const MultiIndexBuffer& wipe_buffer_indices = indices[wipe_buffer_id]; for (size_t i = 0; i < wipe_buffer_indices.size(); ++i) { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_statistics.wipe_segments_count += wipe_buffer_indices[i].size() / m_buffers[wipe_buffer_id].indices_per_segment(); -// m_statistics.wipe_segments_count = wipe_buffer_indices[i].size() / m_buffers[wipe_buffer_id].indices_per_segment(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } unsigned int extrude_buffer_id = buffer_id(EMoveType::Extrude); const MultiIndexBuffer& extrude_buffer_indices = indices[extrude_buffer_id]; for (size_t i = 0; i < extrude_buffer_indices.size(); ++i) { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_statistics.extrude_segments_count += extrude_buffer_indices[i].size() / m_buffers[extrude_buffer_id].indices_per_segment(); -// m_statistics.extrude_segments_count = extrude_buffer_indices[i].size() / m_buffers[extrude_buffer_id].indices_per_segment(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } #endif // ENABLE_GCODE_VIEWER_STATISTICS @@ -2743,33 +2648,36 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool for (const TBuffer& buffer : m_buffers) { // searches the path containing the current position for (const Path& path : buffer.paths) { - int sub_path_id = path.get_id_of_sub_path_containing(m_sequential_view.current.last); - if (sub_path_id != -1) { - const Path::Sub_Path& sub_path = path.sub_paths[sub_path_id]; - unsigned int offset = static_cast(m_sequential_view.current.last - sub_path.first.s_id); - if (offset > 0) { - if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Line) - offset = 2 * offset - 1; - else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { - unsigned int indices_count = buffer.indices_per_segment(); - offset = indices_count * (offset - 1) + (indices_count - 6); + if (path.contains(m_sequential_view.current.last)) { + int sub_path_id = path.get_id_of_sub_path_containing(m_sequential_view.current.last); + if (sub_path_id != -1) { + const Path::Sub_Path& sub_path = path.sub_paths[sub_path_id]; + unsigned int offset = static_cast(m_sequential_view.current.last - sub_path.first.s_id); + if (offset > 0) { + if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Line) + offset = 2 * offset - 1; + else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { + unsigned int indices_count = buffer.indices_per_segment(); + offset = indices_count * (offset - 1) + (indices_count - 6); + } } - } - offset += static_cast(sub_path.first.i_id); + offset += static_cast(sub_path.first.i_id); - // gets the index from the index buffer on gpu - const IBuffer& i_buffer = buffer.indices[sub_path.first.b_id]; - unsigned int index = 0; - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); - glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(offset * sizeof(unsigned int)), static_cast(sizeof(unsigned int)), static_cast(&index))); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + // gets the vertex index from the index buffer on gpu + const IBuffer& i_buffer = buffer.indices[sub_path.first.b_id]; + unsigned int index = 0; + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(offset * sizeof(unsigned int)), static_cast(sizeof(unsigned int)), static_cast(&index))); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - // gets the position from the vertices buffer on gpu - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); - glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, static_cast(index * buffer.vertices.vertex_size_bytes()), static_cast(3 * sizeof(float)), static_cast(m_sequential_view.current_position.data()))); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); - found = true; - break; + // gets the position from the vertices buffer on gpu + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); + glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, static_cast(index * buffer.vertices.vertex_size_bytes()), static_cast(3 * sizeof(float)), static_cast(m_sequential_view.current_position.data()))); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + + found = true; + break; + } } } @@ -2779,7 +2687,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool // second pass: filter paths by sequential data and collect them by color RenderPath* render_path = nullptr; - for (const auto& [buffer, index_buffer_id, path_id, sub_path_id] : paths) { + for (const auto& [buffer, ibuffer_id, path_id, sub_path_id] : paths) { const Path& path = buffer->paths[path_id]; const Path::Sub_Path& sub_path = path.sub_paths[sub_path_id]; if (m_sequential_view.current.last <= sub_path.first.s_id || sub_path.last.s_id <= m_sequential_view.current.first) @@ -2810,17 +2718,24 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool default: { color = { 0.0f, 0.0f, 0.0f }; break; } } - RenderPath key{ color, static_cast(index_buffer_id), path_id }; + RenderPath key{ color, static_cast(ibuffer_id), path_id }; if (render_path == nullptr || !RenderPathPropertyEqual()(*render_path, key)) render_path = const_cast(&(*buffer->render_paths.emplace(key).first)); - unsigned int segments_count = std::min(m_sequential_view.current.last, sub_path.last.s_id) - std::max(m_sequential_view.current.first, sub_path.first.s_id) + 1; unsigned int size_in_indices = 0; switch (buffer->render_primitive_type) { - case TBuffer::ERenderPrimitiveType::Point: { size_in_indices = segments_count; break; } + case TBuffer::ERenderPrimitiveType::Point: { + size_in_indices = buffer->indices_per_segment(); + break; + } case TBuffer::ERenderPrimitiveType::Line: - case TBuffer::ERenderPrimitiveType::Triangle: { size_in_indices = buffer->indices_per_segment() * (segments_count - 1); break; } + case TBuffer::ERenderPrimitiveType::Triangle: { + unsigned int segments_count = std::min(m_sequential_view.current.last, sub_path.last.s_id) - std::max(m_sequential_view.current.first, sub_path.first.s_id); + size_in_indices = buffer->indices_per_segment() * segments_count; + break; } + } + render_path->sizes.push_back(size_in_indices); unsigned int delta_1st = 0; @@ -4202,11 +4117,6 @@ void GCodeViewer::render_statistics() const ImGui::Separator(); add_counter(std::string("VBuffers count:"), m_statistics.vbuffers_count); add_counter(std::string("IBuffers count:"), m_statistics.ibuffers_count); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -// ImGui::Separator(); -// add_counter(std::string("Max vertices in VBuffer:"), m_statistics.max_vertices_in_vertex_buffer); -// add_counter(std::string("Max indices in IBuffer:"), m_statistics.max_indices_in_index_buffer); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); } diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 51fd560a347..0aecf7eba30 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -146,7 +146,7 @@ class GCodeViewer unsigned int b_id{ 0 }; // index into the index buffer size_t i_id{ 0 }; - // sequential id (index into the vertex buffer) + // move id size_t s_id{ 0 }; Vec3f position{ Vec3f::Zero() }; }; @@ -314,18 +314,7 @@ class GCodeViewer size_t indices_per_segment_size_bytes() const { return static_cast(indices_per_segment() * sizeof(unsigned int)); } #endif // ENABLE_SPLITTED_VERTEX_BUFFER //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - unsigned int start_segment_vertex_offset() const { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - return 0; -// switch (render_primitive_type) -// { -// case ERenderPrimitiveType::Point: -// case ERenderPrimitiveType::Line: -// case ERenderPrimitiveType::Triangle: -// default: { return 0; } -// } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - } + unsigned int start_segment_vertex_offset() const { return 0; } unsigned int end_segment_vertex_offset() const { switch (render_primitive_type) { @@ -493,10 +482,6 @@ class GCodeViewer int64_t extrude_segments_count{ 0 }; int64_t vbuffers_count{ 0 }; int64_t ibuffers_count{ 0 }; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -// int64_t max_vertices_in_vertex_buffer{ 0 }; -// int64_t max_indices_in_index_buffer{ 0 }; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void reset_all() { reset_times(); @@ -534,10 +519,6 @@ class GCodeViewer extrude_segments_count = 0; vbuffers_count = 0; ibuffers_count = 0; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -// max_vertices_in_vertex_buffer = 0; -// max_indices_in_index_buffer = 0; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } }; #endif // ENABLE_GCODE_VIEWER_STATISTICS From dc781535b2067a019d2bd72603fcef4acdbd02d9 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 12 Jan 2021 14:34:52 +0100 Subject: [PATCH 015/143] Code cleanup --- src/libslic3r/Technologies.hpp | 3 +-- src/slic3r/GUI/GCodeViewer.cpp | 44 +--------------------------------- src/slic3r/GUI/GCodeViewer.hpp | 35 +-------------------------- 3 files changed, 3 insertions(+), 79 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index eabd711d536..010f109729f 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -108,13 +108,12 @@ #define ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING (1 && ENABLE_2_3_0_RC1) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //======= // 2.3.1 //======= #define ENABLE_2_3_1 1 #define ENABLE_SPLITTED_VERTEX_BUFFER (1 && ENABLE_2_3_1) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 64d064a33b3..c67e1c7a2b5 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -79,7 +79,6 @@ static float round_to_nearest(float value, unsigned int decimals) return res; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER void GCodeViewer::VBuffer::reset() { @@ -92,7 +91,6 @@ void GCodeViewer::VBuffer::reset() count = 0; } #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GCodeViewer::VBuffer::reset() { // release gpu memory @@ -103,14 +101,10 @@ void GCodeViewer::VBuffer::reset() count = 0; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GCodeViewer::IBuffer::reset() { - // release gpu memory -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER // release gpu memory if (ibo > 0) { @@ -118,20 +112,16 @@ void GCodeViewer::IBuffer::reset() ibo = 0; } #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + // release gpu memory if (id > 0) { glsafe(::glDeleteBuffers(1, &id)); id = 0; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER vbo = 0; #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ count = 0; } @@ -153,7 +143,6 @@ bool GCodeViewer::Path::matches(const GCodeProcessor::MoveVertex& move) const case EMoveType::Unretract: case EMoveType::Extrude: { // use rounding to reduce the number of generated paths -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER #if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE return type == move.type && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id && role == move.extrusion_role && @@ -167,7 +156,6 @@ bool GCodeViewer::Path::matches(const GCodeProcessor::MoveVertex& move) const cp_color_id == move.cp_color_id; #endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE return type == move.type && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id && role == move.extrusion_role && move.position[2] <= first.position[2] && feedrate == move.feedrate && fan_speed == move.fan_speed && @@ -179,9 +167,7 @@ bool GCodeViewer::Path::matches(const GCodeProcessor::MoveVertex& move) const volumetric_rate == round_to_nearest(move.volumetric_rate(), 2) && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id; #endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } case EMoveType::Travel: { return type == move.type && feedrate == move.feedrate && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id; @@ -208,7 +194,6 @@ void GCodeViewer::TBuffer::add_path(const GCodeProcessor::MoveVertex& move, unsi { Path::Endpoint endpoint = { b_id, i_id, s_id, move.position }; // use rounding to reduce the number of generated paths -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER #if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE paths.push_back({ move.type, move.extrusion_role, move.delta_extruder, @@ -220,7 +205,6 @@ void GCodeViewer::TBuffer::add_path(const GCodeProcessor::MoveVertex& move, unsi round_to_nearest(move.volumetric_rate(), 2), move.extruder_id, move.cp_color_id, { { endpoint, endpoint } } }); #endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE paths.push_back({ move.type, move.extrusion_role, endpoint, endpoint, move.delta_extruder, round_to_nearest(move.height, 2), round_to_nearest(move.width, 2), move.feedrate, move.fan_speed, @@ -230,9 +214,7 @@ void GCodeViewer::TBuffer::add_path(const GCodeProcessor::MoveVertex& move, unsi round_to_nearest(move.height, 2), round_to_nearest(move.width, 2), move.feedrate, move.fan_speed, round_to_nearest(move.volumetric_rate(), 2), move.extruder_id, move.cp_color_id }); #endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } GCodeViewer::Color GCodeViewer::Extrusions::Range::get_color_at(float value) const @@ -657,15 +639,11 @@ void GCodeViewer::update_sequential_view_current(unsigned int first, unsigned in for (const TBuffer& buffer : m_buffers) { if (buffer.visible) { for (const Path& path : buffer.paths) { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER if (path.sub_paths.front().first.s_id <= id && id <= path.sub_paths.back().last.s_id) #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (path.first.s_id <= id && id <= path.last.s_id) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ return true; } } @@ -769,9 +747,7 @@ void GCodeViewer::set_layers_z_range(const std::array& layers_z void GCodeViewer::export_toolpaths_to_obj(const char* filename) const { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (filename == nullptr) return; @@ -1068,12 +1044,9 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const fclose(fp); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) { @@ -1777,7 +1750,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) progress_dialog->Destroy(); } #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) { #if ENABLE_GCODE_VIEWER_STATISTICS @@ -2437,9 +2409,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) if (progress_dialog != nullptr) progress_dialog->Destroy(); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GCodeViewer::load_shells(const Print& print, bool initialized) { @@ -2499,7 +2469,6 @@ void GCodeViewer::load_shells(const Print& print, bool initialized) } } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const { @@ -2766,7 +2735,6 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool #endif // ENABLE_GCODE_VIEWER_STATISTICS } #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const { #if ENABLE_GCODE_VIEWER_STATISTICS @@ -3014,11 +2982,8 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool m_statistics.refresh_paths_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); #endif // ENABLE_GCODE_VIEWER_STATISTICS } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER void GCodeViewer::render_toolpaths() const { @@ -3166,7 +3131,6 @@ void GCodeViewer::render_toolpaths() const } } #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GCodeViewer::render_toolpaths() const { #if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS @@ -3313,9 +3277,7 @@ void GCodeViewer::render_toolpaths() const } } } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GCodeViewer::render_shells() const { @@ -4140,19 +4102,15 @@ void GCodeViewer::log_memory_used(const std::string& label, int64_t additional) } int64_t layers_size = SLIC3R_STDVEC_MEMSIZE(m_layers.get_zs(), double); layers_size += SLIC3R_STDVEC_MEMSIZE(m_layers.get_endpoints(), Layers::Endpoints); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER BOOST_LOG_TRIVIAL(trace) << label << "(" << format_memsize_MB(additional + paths_size + render_paths_size + layers_size) << ");" << log_memory_info(); #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BOOST_LOG_TRIVIAL(trace) << label << format_memsize_MB(additional + paths_size + render_paths_size + layers_size) << log_memory_info(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } } diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 0aecf7eba30..a334f08e013 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -21,11 +21,9 @@ class GCodeViewer { using Color = std::array; using VertexBuffer = std::vector; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER using MultiVertexBuffer = std::vector; #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ using IndexBuffer = std::vector; using MultiIndexBuffer = std::vector; @@ -59,17 +57,13 @@ class GCodeViewer }; EFormat format{ EFormat::Position }; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER // vbos id std::vector ids; #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // vbo id unsigned int id{ 0 }; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // count of vertices, updated after data are sent to gpu size_t count{ 0 }; @@ -118,19 +112,15 @@ class GCodeViewer // ibo buffer containing indices data (for lines/triangles) used to render a specific toolpath type struct IBuffer { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER // id of the associated vertex buffer unsigned int vbo{ 0 }; // ibo id unsigned int ibo{ 0 }; #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // ibo id unsigned int id{ 0 }; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // count of indices, updated after data are sent to gpu size_t count{ 0 }; @@ -151,7 +141,6 @@ class GCodeViewer Vec3f position{ Vec3f::Zero() }; }; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER struct Sub_Path { @@ -163,18 +152,13 @@ class GCodeViewer } }; #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ EMoveType type{ EMoveType::Noop }; ExtrusionRole role{ erNone }; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Endpoint first; Endpoint last; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float delta_extruder{ 0.0f }; float height{ 0.0f }; float width{ 0.0f }; @@ -183,14 +167,11 @@ class GCodeViewer float volumetric_rate{ 0.0f }; unsigned char extruder_id{ 0 }; unsigned char cp_color_id{ 0 }; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER std::vector sub_paths; #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool matches(const GCodeProcessor::MoveVertex& move) const; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER size_t vertices_count() const { return sub_paths.empty() ? 0 : sub_paths.back().last.s_id - sub_paths.front().first.s_id + 1; @@ -214,12 +195,9 @@ class GCodeViewer sub_paths.push_back({ endpoint , endpoint }); } #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ size_t vertices_count() const { return last.s_id - first.s_id + 1; } bool contains(size_t id) const { return first.s_id <= id && id <= last.s_id; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }; // Used to batch the indices needed to render the paths @@ -284,7 +262,6 @@ class GCodeViewer // s_id index of first vertex contained in this->vertices void add_path(const GCodeProcessor::MoveVertex& move, unsigned int b_id, size_t i_id, size_t s_id); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER unsigned int max_vertices_per_segment() const { switch (render_primitive_type) @@ -299,7 +276,6 @@ class GCodeViewer size_t max_vertices_per_segment_size_floats() const { return vertices.vertex_size_floats() * static_cast(max_vertices_per_segment()); } size_t max_vertices_per_segment_size_bytes() const { return max_vertices_per_segment_size_floats() * sizeof(float); } #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ unsigned int indices_per_segment() const { switch (render_primitive_type) { @@ -309,11 +285,9 @@ class GCodeViewer default: { return 0; } } } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER size_t indices_per_segment_size_bytes() const { return static_cast(indices_per_segment() * sizeof(unsigned int)); } #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ unsigned int start_segment_vertex_offset() const { return 0; } unsigned int end_segment_vertex_offset() const { switch (render_primitive_type) @@ -325,17 +299,13 @@ class GCodeViewer } } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER bool has_data() const { return !vertices.ids.empty() && vertices.ids.front() != 0 && !indices.empty() && indices.front().ibo != 0; } #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool has_data() const { return vertices.id != 0 && !indices.empty() && indices.front().id != 0; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }; // helper to render shells @@ -410,13 +380,12 @@ class GCodeViewer { size_t first{ 0 }; size_t last{ 0 }; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + #if ENABLE_SPLITTED_VERTEX_BUFFER bool operator == (const Endpoints& other) const { return first == other.first && last == other.last; } #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }; private: @@ -442,7 +411,6 @@ class GCodeViewer double get_z_at(unsigned int id) const { return (id < m_zs.size()) ? m_zs[id] : 0.0; } Endpoints get_endpoints_at(unsigned int id) const { return (id < m_endpoints.size()) ? m_endpoints[id] : Endpoints(); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_SPLITTED_VERTEX_BUFFER bool operator != (const Layers& other) const { if (m_zs != other.m_zs) @@ -453,7 +421,6 @@ class GCodeViewer return false; } #endif // ENABLE_SPLITTED_VERTEX_BUFFER -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }; #if ENABLE_GCODE_VIEWER_STATISTICS From 0369caa9e1e407bfce32b35446b2ca9e40eaba8a Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 12 Jan 2021 14:54:58 +0100 Subject: [PATCH 016/143] Fix of #5163 and #5505 - Vertical cutting of the preset comboboxes on a sidebar --- src/slic3r/GUI/PresetComboBoxes.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index 8dd35a59158..a13924ccb75 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -887,9 +887,13 @@ void PlaterPresetComboBox::update() if (!tooltip.IsEmpty()) SetToolTip(tooltip); +#ifdef __WXMSW__ + // Use this part of code just on Windows to avoid of some layout issues on Linux + // see https://github.com/prusa3d/PrusaSlicer/issues/5163 and https://github.com/prusa3d/PrusaSlicer/issues/5505 // Update control min size after rescale (changed Display DPI under MSW) if (GetMinWidth() != 20 * m_em_unit) SetMinSize(wxSize(20 * m_em_unit, GetSize().GetHeight())); +#endif //__WXMSW__ } void PlaterPresetComboBox::msw_rescale() From 293f85b6cf9b805af93b9f79f5ff878b6d673969 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Wed, 13 Jan 2021 09:22:13 +0100 Subject: [PATCH 017/143] Fix of Invoking prusa-slicer from $PATH environment variable crashes #5542 Also it likely fixes Crashes when started from symbolic link #5751 --- src/PrusaSlicer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index 60f3a13218b..277bf125038 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "unix/fhs.hpp" // Generated by CMake from ../platform/unix/fhs.hpp.in @@ -594,7 +595,9 @@ bool CLI::setup(int argc, char **argv) } } - boost::filesystem::path path_to_binary = boost::filesystem::system_complete(argv[0]); + // See Invoking prusa-slicer from $PATH environment variable crashes #5542 + // boost::filesystem::path path_to_binary = boost::filesystem::system_complete(argv[0]); + boost::filesystem::path path_to_binary = boost::dll::program_location(); // Path from the Slic3r binary to its resources. #ifdef __APPLE__ From 67e144f32910c59a499d6671e292ee298cba4291 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 13 Jan 2021 10:45:52 +0100 Subject: [PATCH 018/143] ENABLE_SPLITTED_VERTEX_BUFFER - fixed export of toolpaths to obj files --- src/slic3r/GUI/GCodeViewer.cpp | 119 ++++++++++++++++++++++++++++----- src/slic3r/GUI/GCodeViewer.hpp | 9 ++- src/slic3r/GUI/GLCanvas3D.cpp | 4 ++ 3 files changed, 114 insertions(+), 18 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index c67e1c7a2b5..882ac97eacd 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -83,11 +83,11 @@ static float round_to_nearest(float value, unsigned int decimals) void GCodeViewer::VBuffer::reset() { // release gpu memory - if (!ids.empty()) { - glsafe(::glDeleteBuffers(static_cast(ids.size()), static_cast(ids.data()))); - ids.clear(); + if (!vbos.empty()) { + glsafe(::glDeleteBuffers(static_cast(vbos.size()), static_cast(vbos.data()))); + vbos.clear(); } - + sizes.clear(); count = 0; } #else @@ -358,7 +358,8 @@ const std::vector GCodeViewer::Range_Colors {{ GCodeViewer::GCodeViewer() { - // initializes non opengl data of TBuffers + // initializes non OpenGL data of TBuffers + // OpenGL data are initialized into render().init_gl_data() for (size_t i = 0; i < m_buffers.size(); ++i) { TBuffer& buffer = m_buffers[i]; switch (buffer_type(i)) @@ -633,6 +634,13 @@ void GCodeViewer::render() const #endif // ENABLE_GCODE_VIEWER_STATISTICS } +#if ENABLE_SPLITTED_VERTEX_BUFFER +bool GCodeViewer::can_export_toolpaths() const +{ + return has_data() && m_buffers[buffer_id(EMoveType::Extrude)].render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle; +} +#endif // ENABLE_SPLITTED_VERTEX_BUFFER + void GCodeViewer::update_sequential_view_current(unsigned int first, unsigned int last) { auto is_visible = [this](unsigned int id) { @@ -747,8 +755,6 @@ void GCodeViewer::set_layers_z_range(const std::array& layers_z void GCodeViewer::export_toolpaths_to_obj(const char* filename) const { -#if !ENABLE_SPLITTED_VERTEX_BUFFER - if (filename == nullptr) return; @@ -758,15 +764,24 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const wxBusyCursor busy; // the data needed is contained into the Extrude TBuffer - const TBuffer& buffer = m_buffers[buffer_id(EMoveType::Extrude)]; - if (!buffer.has_data()) + const TBuffer& t_buffer = m_buffers[buffer_id(EMoveType::Extrude)]; + if (!t_buffer.has_data()) return; +#if ENABLE_SPLITTED_VERTEX_BUFFER + if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Triangle) + return; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER + // collect color information to generate materials std::vector colors; - for (const RenderPath& path : buffer.render_paths) { + for (const RenderPath& path : t_buffer.render_paths) { colors.push_back(path.color); } +#if ENABLE_SPLITTED_VERTEX_BUFFER + std::sort(colors.begin(), colors.end()); + colors.erase(std::unique(colors.begin(), colors.end()), colors.end()); +#endif // ENABLE_SPLITTED_VERTEX_BUFFER // save materials file boost::filesystem::path mat_filename(filename); @@ -801,6 +816,78 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const fprintf(fp, "# Generated by %s based on Slic3r\n", SLIC3R_BUILD_ID); fprintf(fp, "\nmtllib ./%s\n", mat_filename.filename().string().c_str()); +#if ENABLE_SPLITTED_VERTEX_BUFFER + const size_t floats_per_vertex = t_buffer.vertices.vertex_size_floats(); + + std::vector out_vertices; + std::vector out_normals; + std::vector vertices_offsets; + vertices_offsets.push_back(0); + + // get vertices/normals data from vertex buffers on gpu + for (size_t i = 0; i < t_buffer.vertices.vbos.size(); ++i) { + const size_t floats_count = t_buffer.vertices.sizes[i] / sizeof(float); + VertexBuffer vertices(floats_count); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, t_buffer.vertices.vbos[i])); + glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, 0, static_cast(t_buffer.vertices.sizes[i]), static_cast(vertices.data()))); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + const size_t vertices_count = floats_count / floats_per_vertex; + for (size_t j = 0; j < vertices_count; ++j) { + const size_t base = j * floats_per_vertex; + out_vertices.push_back({ vertices[base + 0], vertices[base + 1], vertices[base + 2] }); + out_normals.push_back({ vertices[base + 3], vertices[base + 4], vertices[base + 5] }); + } + vertices_offsets.push_back(vertices_offsets.back() + vertices_count); + } + + // save vertices to file + fprintf(fp, "\n# vertices\n"); + for (const Vec3f& v : out_vertices) { + fprintf(fp, "v %g %g %g\n", v[0], v[1], v[2]); + } + + // save normals to file + fprintf(fp, "\n# normals\n"); + for (const Vec3f& n : out_normals) { + fprintf(fp, "vn %g %g %g\n", n[0], n[1], n[2]); + } + + size_t i = 0; + for (const Color& color : colors) { + // save material triangles to file + fprintf(fp, "\nusemtl material_%zu\n", i + 1); + fprintf(fp, "# triangles material %zu\n", i + 1); + + for (const RenderPath& render_path : t_buffer.render_paths) { + if (render_path.color != color) + continue; + + const IBuffer& ibuffer = t_buffer.indices[render_path.index_buffer_id]; + const size_t vertices_offset = vertices_offsets[render_path.index_buffer_id]; + + // get indices data from index buffer on gpu + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer.ibo)); + for (size_t j = 0; j < render_path.sizes.size(); ++j) { + const size_t triangles_count = render_path.sizes[j] / 3; + IndexBuffer indices(render_path.sizes[j]); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(render_path.offsets[j]), + static_cast(render_path.sizes[j] * sizeof(unsigned int)), static_cast(indices.data()))); + + for (size_t k = 0; k < triangles_count; ++k) { + const size_t base = k * 3; + const size_t v1 = 1 + static_cast(indices[base + 0]) + vertices_offset; + const size_t v2 = 1 + static_cast(indices[base + 1]) + vertices_offset; + const size_t v3 = 1 + static_cast(indices[base + 2]) + vertices_offset; + if (v1 != v2) + // do not export dummy triangles + fprintf(fp, "f %zu//%zu %zu//%zu %zu//%zu\n", v1, v1, v2, v2, v3, v3); + } + } + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } + ++i; + } +#else // get vertices data from vertex buffer on gpu size_t floats_per_vertex = buffer.vertices.vertex_size_floats(); VertexBuffer vertices = VertexBuffer(buffer.vertices.count * floats_per_vertex); @@ -1041,10 +1128,9 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const ++ i; } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER fclose(fp); - -#endif // !ENABLE_SPLITTED_VERTEX_BUFFER } #if ENABLE_SPLITTED_VERTEX_BUFFER @@ -1525,7 +1611,8 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) GLuint id = 0; glsafe(::glGenBuffers(1, &id)); - t_buffer.vertices.ids.push_back(static_cast(id)); + t_buffer.vertices.vbos.push_back(static_cast(id)); + t_buffer.vertices.sizes.push_back(size_bytes); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, id)); glsafe(::glBufferData(GL_ARRAY_BUFFER, size_bytes, v_buffer.data(), GL_STATIC_DRAW)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); @@ -1581,14 +1668,14 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) // ensure there is at least one index buffer if (i_multibuffer.empty()) { i_multibuffer.push_back(IndexBuffer()); - vbo_index_list.push_back(t_buffer.vertices.ids[curr_vertex_buffer.first]); + vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); } // if adding the indices for the current segment exceeds the threshold size of the current index buffer // create another index buffer if (i_multibuffer.back().size() * sizeof(unsigned int) >= IBUFFER_THRESHOLD_BYTES - t_buffer.indices_per_segment_size_bytes()) { i_multibuffer.push_back(IndexBuffer()); - vbo_index_list.push_back(t_buffer.vertices.ids[curr_vertex_buffer.first]); + vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); } // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer @@ -1598,7 +1685,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) ++curr_vertex_buffer.first; curr_vertex_buffer.second = 0; - vbo_index_list.push_back(t_buffer.vertices.ids[curr_vertex_buffer.first]); + vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) { Path& last_path = t_buffer.paths.back(); diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index a334f08e013..6602bbcf818 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -59,7 +59,9 @@ class GCodeViewer EFormat format{ EFormat::Position }; #if ENABLE_SPLITTED_VERTEX_BUFFER // vbos id - std::vector ids; + std::vector vbos; + // sizes of the buffers, in bytes, used in export to obj + std::vector sizes; #else // vbo id unsigned int id{ 0 }; @@ -301,7 +303,7 @@ class GCodeViewer #if ENABLE_SPLITTED_VERTEX_BUFFER bool has_data() const { - return !vertices.ids.empty() && vertices.ids.front() != 0 && !indices.empty() && indices.front().ibo != 0; + return !vertices.vbos.empty() && vertices.vbos.front() != 0 && !indices.empty() && indices.front().ibo != 0; } #else bool has_data() const { return vertices.id != 0 && !indices.empty() && indices.front().id != 0; } @@ -588,6 +590,9 @@ class GCodeViewer void render() const; bool has_data() const { return !m_roles.empty(); } +#if ENABLE_SPLITTED_VERTEX_BUFFER + bool can_export_toolpaths() const; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER const BoundingBoxf3& get_paths_bounding_box() const { return m_paths_bounding_box; } const BoundingBoxf3& get_max_bounding_box() const { return m_max_bounding_box; } diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 03d6b94ce56..388db4a278a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3866,7 +3866,11 @@ void GLCanvas3D::update_tooltip_for_settings_item_in_main_toolbar() bool GLCanvas3D::has_toolpaths_to_export() const { +#if ENABLE_SPLITTED_VERTEX_BUFFER + return m_gcode_viewer.can_export_toolpaths(); +#else return m_gcode_viewer.has_data(); +#endif // ENABLE_SPLITTED_VERTEX_BUFFER } void GLCanvas3D::export_toolpaths_to_obj(const char* filename) const From 2081290d85517308c2fd92765f55908fba0d1dde Mon Sep 17 00:00:00 2001 From: Andy Date: Thu, 14 Jan 2021 15:31:58 +0700 Subject: [PATCH 019/143] Updated RU dictionary Updating the Russian translation PrusaSlicer-2.3.0-rc3 by Andylg --- resources/localization/ru/PrusaSlicer.mo | Bin 261986 -> 402899 bytes resources/localization/ru/PrusaSlicer_ru.po | 11770 +++++++++--------- 2 files changed, 5791 insertions(+), 5979 deletions(-) diff --git a/resources/localization/ru/PrusaSlicer.mo b/resources/localization/ru/PrusaSlicer.mo index c0b9a51e970c1a0106c1c038865c7ad8795de200..e292895138b5453b59033de08526c88198585361 100644 GIT binary patch literal 402899 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⋙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 delta 75671 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 diff --git a/resources/localization/ru/PrusaSlicer_ru.po b/resources/localization/ru/PrusaSlicer_ru.po index 93c9145425b..604dff5be56 100644 --- a/resources/localization/ru/PrusaSlicer_ru.po +++ b/resources/localization/ru/PrusaSlicer_ru.po @@ -1,170 +1,170 @@ -# Copyright (C) 2018 -# This file is distributed under the same license as the Slic3r Prusa Edition package. +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. # -# Alexander Golikov , 2018. -# Alexander Khvostuk , 2018. -# Andylg N. , 2018. -# Andrey Tarasik , 2018. -# Yuri Kozlov , 2020. msgid "" msgstr "" -"Project-Id-Version: Slic3r Prusa Edition 1.41.1\n" +"Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-12-01 16:23+0100\n" -"PO-Revision-Date: 2020-12-01 13:18+0100\n" -"Last-Translator: Oleksandra Iushchenko \n" -"Language-Team: Russian \n" -"Language: ru\n" +"POT-Creation-Date: 2021-01-09 15:30+0700\n" +"PO-Revision-Date: 2021-01-10 02:38+0700\n" +"Language-Team: Andylg \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 2.4.2\n" -"X-Poedit-Flags-xgettext: --add-comments\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && " +"(n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 1.8.7\n" +"Last-Translator: \n" +"Language: ru_RU\n" -#: src/slic3r/GUI/AboutDialog.cpp:42 src/slic3r/GUI/AboutDialog.cpp:297 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:299 msgid "Portions copyright" -msgstr "Части авторских прав" +msgstr "С использованием разработок" -#: src/slic3r/GUI/AboutDialog.cpp:132 src/slic3r/GUI/AboutDialog.cpp:261 +#: src/slic3r/GUI/AboutDialog.cpp:135 src/slic3r/GUI/AboutDialog.cpp:263 msgid "Copyright" -msgstr "Авторские права" +msgstr "Copyright" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:134 +#: src/slic3r/GUI/AboutDialog.cpp:137 msgid "" -"License agreements of all following programs (libraries) are part of " -"application license agreement" +"License agreements of all following programs (libraries) are part of application " +"license agreement" msgstr "" "Лицензионные соглашения всех следующих программ (библиотек) являются частью " -"лицензионного соглашения приложения" +"лицензионного соглашения" -#: src/slic3r/GUI/AboutDialog.cpp:204 +#: src/slic3r/GUI/AboutDialog.cpp:206 #, c-format msgid "About %s" msgstr "О %s" -#: src/slic3r/GUI/AboutDialog.cpp:236 src/slic3r/GUI/GUI_App.cpp:231 -#: src/slic3r/GUI/MainFrame.cpp:153 +#: src/slic3r/GUI/AboutDialog.cpp:238 src/slic3r/GUI/AboutDialog.cpp:361 +#: src/slic3r/GUI/GUI_App.cpp:235 src/slic3r/GUI/MainFrame.cpp:151 msgid "Version" msgstr "Версия" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:263 src/slic3r/GUI/GUI_App.cpp:236 +#: src/slic3r/GUI/AboutDialog.cpp:265 src/slic3r/GUI/GUI_App.cpp:240 msgid "is licensed under the" -msgstr "лицензирована на условиях" +msgstr "лицензирован в соответствии с" -#: src/slic3r/GUI/AboutDialog.cpp:264 src/slic3r/GUI/GUI_App.cpp:236 +#: src/slic3r/GUI/AboutDialog.cpp:266 src/slic3r/GUI/GUI_App.cpp:240 msgid "GNU Affero General Public License, version 3" -msgstr "GNU Affero General Public License версии 3" +msgstr "GNU Affero General Public License, version 3" -#: src/slic3r/GUI/AboutDialog.cpp:265 +#: src/slic3r/GUI/AboutDialog.cpp:267 msgid "" -"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " -"community." +"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "" -"PrusaSlicer основана на Slic3r, которая написана Alessandro Ranellucci и " -"сообществом RepRap." +"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community." -#: src/slic3r/GUI/AboutDialog.cpp:266 +#: src/slic3r/GUI/AboutDialog.cpp:268 msgid "" -"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " -"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " -"numerous others." +"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr " +"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others." msgstr "" -"При участии Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr " -"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik и многих " -"других." +"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr " +"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous " +"others. Если вы нашли ошибки в русском переводе пишите на andylg@yandex.ru." + +#: src/slic3r/GUI/AboutDialog.cpp:304 +msgid "Copy Version Info" +msgstr "Скопировать информацию о версии" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:77 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:78 #, 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." +"%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. Вероятно, это вызвано нехваткой памяти. Если в вашей " -"системе много оперативной памяти, то, возможно, вы обнаружили ошибку в " -"программе, пожалуйста, сообщите о этом." +"При работе с %s произошла ошибка. Скорее всего, это было вызвано нехваткой памяти. " +"Если вы уверены, что в вашей системе достаточно оперативной памяти, но тем не менее " +"произошла эта ошибка, сообщите нам об этом." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 +msgid "Unknown error occured during exporting G-code." +msgstr "При экспорте G-кода произошла неизвестная ошибка." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:156 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:168 msgid "" -"Copying of the temporary G-code to the output G-code failed. Maybe the SD " -"card is write locked?\n" +"Copying of the temporary G-code to the output G-code failed. Maybe the SD card is " +"write locked?\n" "Error message: %1%" msgstr "" +"Не удалось скопировать временный G-код в местонахождение выходного G-код файла. " +"Может ваша SD карта защищена от записи?\n" +"Сообщение об ошибке: %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:159 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:171 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." +"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 "" -"Не удалось скопировать временный G-код в конечный G-код. Это может быть из-" -"за проблемы с устройством куда выполняется запись, попробуйте запустить " -"экспорт ещё раз или используйте другое устройство. Повреждённый конечный G-" -"код находится в файле %1%.tmp." +"Не удалось скопировать временный G-код в местонахождение выходного G-код файла. " +"Возможно, проблема с устройством назначения, попробуйте снова выполнить экспорт или " +"использовать другое устройство. Повреждённый выходной G-код файл находится в %1%." +"tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:174 msgid "" -"Renaming of the G-code after copying to the selected destination folder has " -"failed. Current path is %1%.tmp. Please try exporting again." +"Renaming of the G-code after copying to the selected destination folder has failed. " +"Current path is %1%.tmp. Please try exporting again." msgstr "" -"Не удалось переименовать G-код после копирования в указанный каталог " -"назначения. Текущий путь: %1%.tmp. Попробуйте выполнить экспорт ещё раз." +"Не удалось переименовать G-код после копирования в выбранную папку назначения. " +"Текущий путь %1%.tmp. Пожалуйста, попробуйте экспортировать ещё раз." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:165 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:177 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." +"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 "" -"Копирование временного G-кода выполнено, но не удалось открыть оригинальный " -"код %1% для проверки копирования. Конечный G-код в файле %2%.tmp." +"Копирование временного G-кода завершено, но исходный код в %1% не удалось открыть " +"во время проверки копии. Выходной G-код находится в %2%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:168 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180 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." +"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 "" -"Копирование временного G-кода выполнено, но экспортированный код не удалось " -"открыть во время проверки копирования. Конечный G-код записан в файл %1%.tmp." +"Копирование временного G-кода завершено, но экспортированный код не удалось открыть " +"во время проверки копии. Выходной G-код находится в %1%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:171 -msgid "Unknown error occured during exporting G-code." -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:176 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:525 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:187 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:536 msgid "Running post-processing scripts" -msgstr "Выполняются сценарии постобработки" +msgstr "Запуск скриптов постобработки" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:178 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:189 msgid "G-code file exported to %1%" msgstr "Файл G-кода экспортирован в %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:232 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:194 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:243 msgid "Slicing complete" -msgstr "Нарезка выполнена" +msgstr "Нарезка завершена" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:227 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:238 msgid "Masked SLA file exported to %1%" -msgstr "Файл SLA-маски экспортирован в %1%" +msgstr "MSLA файл экспортирован в %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:528 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:539 msgid "Copying of the temporary G-code to the output G-code failed" -msgstr "Не удалось скопировать временный G-код в конечный G-код" +msgstr "" +"Не удалось скопировать временный G-код в местонахождение выходного G-код файла" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:551 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:562 msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" -"Запланирована отправка в «%1%». Смотрите Окна -> Очередь отправки на узел " -"печати" +"Планирование загрузки на `%1%`. Смотрите Окна -> Очередь загрузки на хост печати" -#: src/slic3r/GUI/BedShapeDialog.cpp:93 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:162 -#: src/slic3r/GUI/Tab.cpp:2531 +#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 +#: src/slic3r/GUI/Plater.cpp:162 src/slic3r/GUI/Tab.cpp:2536 msgid "Size" msgstr "Размер" @@ -172,73 +172,69 @@ msgstr "Размер" msgid "Origin" msgstr "Начало координат" -#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:754 +#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:771 msgid "Diameter" msgstr "Диаметр" #: src/slic3r/GUI/BedShapeDialog.cpp:110 msgid "Size in X and Y of the rectangular plate." -msgstr "Размеры прямоугольной платформы в XY координатах." +msgstr "Размеры прямоугольного стола в XY координатах." #: src/slic3r/GUI/BedShapeDialog.cpp:121 msgid "" -"Distance of the 0,0 G-code coordinate from the front left corner of the " -"rectangle." +"Distance of the 0,0 G-code coordinate from the front left corner of the rectangle." msgstr "" -"Расстояние от координаты 0,0 G-кода. Отсчёт от левого переднего угла " -"прямоугольной платформы." +"Расстояние до точки начало координат. Отсчёт от левого переднего угла " +"прямоугольного стола." -#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:237 -#: src/slic3r/GUI/ConfigWizard.cpp:1359 src/slic3r/GUI/ConfigWizard.cpp:1373 -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:88 -#: src/slic3r/GUI/GCodeViewer.cpp:2324 src/slic3r/GUI/GCodeViewer.cpp:2330 -#: src/slic3r/GUI/GCodeViewer.cpp:2338 src/slic3r/GUI/GUI_ObjectLayers.cpp:145 +#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:242 +#: src/slic3r/GUI/ConfigWizard.cpp:1368 src/slic3r/GUI/ConfigWizard.cpp:1382 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:88 src/slic3r/GUI/GCodeViewer.cpp:2337 +#: src/slic3r/GUI/GCodeViewer.cpp:2343 src/slic3r/GUI/GCodeViewer.cpp:2351 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 src/slic3r/GUI/GUI_ObjectLayers.cpp:145 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:96 -#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75 -#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:93 -#: src/libslic3r/PrintConfig.cpp:131 src/libslic3r/PrintConfig.cpp:229 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:362 -#: src/libslic3r/PrintConfig.cpp:370 src/libslic3r/PrintConfig.cpp:420 -#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:561 -#: src/libslic3r/PrintConfig.cpp:579 src/libslic3r/PrintConfig.cpp:757 -#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:1411 -#: src/libslic3r/PrintConfig.cpp:1472 src/libslic3r/PrintConfig.cpp:1490 -#: src/libslic3r/PrintConfig.cpp:1508 src/libslic3r/PrintConfig.cpp:1566 -#: src/libslic3r/PrintConfig.cpp:1576 src/libslic3r/PrintConfig.cpp:1697 -#: src/libslic3r/PrintConfig.cpp:1705 src/libslic3r/PrintConfig.cpp:1746 -#: src/libslic3r/PrintConfig.cpp:1754 src/libslic3r/PrintConfig.cpp:1764 -#: src/libslic3r/PrintConfig.cpp:1772 src/libslic3r/PrintConfig.cpp:1780 -#: src/libslic3r/PrintConfig.cpp:1843 src/libslic3r/PrintConfig.cpp:2109 -#: src/libslic3r/PrintConfig.cpp:2180 src/libslic3r/PrintConfig.cpp:2214 -#: src/libslic3r/PrintConfig.cpp:2343 src/libslic3r/PrintConfig.cpp:2422 -#: src/libslic3r/PrintConfig.cpp:2429 src/libslic3r/PrintConfig.cpp:2436 -#: src/libslic3r/PrintConfig.cpp:2466 src/libslic3r/PrintConfig.cpp:2476 -#: src/libslic3r/PrintConfig.cpp:2486 src/libslic3r/PrintConfig.cpp:2646 -#: src/libslic3r/PrintConfig.cpp:2680 src/libslic3r/PrintConfig.cpp:2819 -#: src/libslic3r/PrintConfig.cpp:2828 src/libslic3r/PrintConfig.cpp:2837 -#: src/libslic3r/PrintConfig.cpp:2847 src/libslic3r/PrintConfig.cpp:2912 -#: src/libslic3r/PrintConfig.cpp:2922 src/libslic3r/PrintConfig.cpp:2934 -#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2964 -#: src/libslic3r/PrintConfig.cpp:2974 src/libslic3r/PrintConfig.cpp:2992 -#: src/libslic3r/PrintConfig.cpp:3007 src/libslic3r/PrintConfig.cpp:3021 -#: src/libslic3r/PrintConfig.cpp:3032 src/libslic3r/PrintConfig.cpp:3045 -#: src/libslic3r/PrintConfig.cpp:3090 src/libslic3r/PrintConfig.cpp:3100 -#: src/libslic3r/PrintConfig.cpp:3109 src/libslic3r/PrintConfig.cpp:3119 -#: src/libslic3r/PrintConfig.cpp:3135 src/libslic3r/PrintConfig.cpp:3159 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:96 src/slic3r/GUI/WipeTowerDialog.cpp:85 +#: src/libslic3r/PrintConfig.cpp:77 src/libslic3r/PrintConfig.cpp:84 +#: src/libslic3r/PrintConfig.cpp:95 src/libslic3r/PrintConfig.cpp:135 +#: src/libslic3r/PrintConfig.cpp:244 src/libslic3r/PrintConfig.cpp:302 +#: src/libslic3r/PrintConfig.cpp:377 src/libslic3r/PrintConfig.cpp:385 +#: src/libslic3r/PrintConfig.cpp:435 src/libslic3r/PrintConfig.cpp:565 +#: src/libslic3r/PrintConfig.cpp:576 src/libslic3r/PrintConfig.cpp:594 +#: src/libslic3r/PrintConfig.cpp:774 src/libslic3r/PrintConfig.cpp:1258 +#: src/libslic3r/PrintConfig.cpp:1439 src/libslic3r/PrintConfig.cpp:1500 +#: src/libslic3r/PrintConfig.cpp:1518 src/libslic3r/PrintConfig.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:1594 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1729 src/libslic3r/PrintConfig.cpp:1737 +#: src/libslic3r/PrintConfig.cpp:1778 src/libslic3r/PrintConfig.cpp:1786 +#: src/libslic3r/PrintConfig.cpp:1796 src/libslic3r/PrintConfig.cpp:1804 +#: src/libslic3r/PrintConfig.cpp:1812 src/libslic3r/PrintConfig.cpp:1875 +#: src/libslic3r/PrintConfig.cpp:2141 src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2375 +#: src/libslic3r/PrintConfig.cpp:2454 src/libslic3r/PrintConfig.cpp:2461 +#: src/libslic3r/PrintConfig.cpp:2468 src/libslic3r/PrintConfig.cpp:2498 +#: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:2518 +#: src/libslic3r/PrintConfig.cpp:2678 src/libslic3r/PrintConfig.cpp:2712 +#: src/libslic3r/PrintConfig.cpp:2851 src/libslic3r/PrintConfig.cpp:2860 +#: src/libslic3r/PrintConfig.cpp:2869 src/libslic3r/PrintConfig.cpp:2879 +#: src/libslic3r/PrintConfig.cpp:2944 src/libslic3r/PrintConfig.cpp:2954 +#: src/libslic3r/PrintConfig.cpp:2966 src/libslic3r/PrintConfig.cpp:2986 +#: src/libslic3r/PrintConfig.cpp:2996 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3024 src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3053 src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3077 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3151 src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3191 msgid "mm" msgstr "мм" #: src/slic3r/GUI/BedShapeDialog.cpp:131 msgid "" -"Diameter of the print bed. It is assumed that origin (0,0) is located in the " -"center." -msgstr "" -"Диаметр платформы печати. Предполагается, что начало координат (0,0) " -"находится в центре." +"Diameter of the print bed. It is assumed that origin (0,0) is located in the center." +msgstr "Диаметр стола. Предполагается, что начало координат (0,0) находится в центре." #: src/slic3r/GUI/BedShapeDialog.cpp:141 msgid "Rectangular" @@ -248,27 +244,27 @@ msgstr "Прямоугольная" msgid "Circular" msgstr "Круглая" -#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:257 +#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:243 #: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:358 msgid "Custom" msgstr "Пользовательская" #: src/slic3r/GUI/BedShapeDialog.cpp:145 msgid "Invalid" -msgstr "" +msgstr "Недопустимо" #: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2215 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2288 msgid "Shape" msgstr "Форма" #: src/slic3r/GUI/BedShapeDialog.cpp:243 msgid "Load shape from STL..." -msgstr "Загрузить форму платформы из STL-файла…" +msgstr "Загрузка формы стола из STL файла..." -#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1826 msgid "Settings" -msgstr "Параметры" +msgstr "Настройки" #: src/slic3r/GUI/BedShapeDialog.cpp:315 msgid "Texture" @@ -276,16 +272,16 @@ msgstr "Текстура" #: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405 msgid "Load..." -msgstr "Загрузить…" +msgstr "Загрузить..." #: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413 -#: src/slic3r/GUI/Tab.cpp:3474 +#: src/slic3r/GUI/Tab.cpp:3484 msgid "Remove" -msgstr "Убрать" +msgstr "Удалить" #: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446 msgid "Not found:" -msgstr "Не найден:" +msgstr "Не найдено:" #: src/slic3r/GUI/BedShapeDialog.cpp:395 msgid "Model" @@ -293,39 +289,38 @@ msgstr "Модель" #: src/slic3r/GUI/BedShapeDialog.cpp:563 msgid "Choose an STL file to import bed shape from:" -msgstr "Выберите файл STL для импорта формы платформы из:" +msgstr "Выберите STL файл для импорта формы стола из:" #: src/slic3r/GUI/BedShapeDialog.cpp:570 src/slic3r/GUI/BedShapeDialog.cpp:619 #: src/slic3r/GUI/BedShapeDialog.cpp:642 msgid "Invalid file format." -msgstr "Неправильный формат файла." +msgstr "Неверный формат файла." #: src/slic3r/GUI/BedShapeDialog.cpp:581 msgid "Error! Invalid model" -msgstr "Ошибка! Некорректная модель" +msgstr "Ошибка! Недопустимая модель" #: src/slic3r/GUI/BedShapeDialog.cpp:589 msgid "The selected file contains no geometry." msgstr "Выбранный файл не содержит геометрии." #: src/slic3r/GUI/BedShapeDialog.cpp:593 -msgid "" -"The selected file contains several disjoint areas. This is not supported." +msgid "The selected file contains several disjoint areas. This is not supported." msgstr "" "Выбранный файл содержит несколько не пересекающихся областей. Такие файлы не " "поддерживаются." #: src/slic3r/GUI/BedShapeDialog.cpp:608 msgid "Choose a file to import bed texture from (PNG/SVG):" -msgstr "Выберите файл для импорта текстуры платформы из (PNG/SVG):" +msgstr "Выберите файл для импорта текстуры стола из PNG/SVG:" #: src/slic3r/GUI/BedShapeDialog.cpp:631 msgid "Choose an STL file to import bed model from:" -msgstr "Выберите файл STL для импорта модели платформы из:" +msgstr "Выберите STL файл для импорта формы стола из:" -#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1318 +#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1327 msgid "Bed Shape" -msgstr "Форма платформы" +msgstr "Форма и размеры стола" #: src/slic3r/GUI/BonjourDialog.cpp:55 msgid "Network lookup" @@ -337,7 +332,7 @@ msgstr "Адрес" #: src/slic3r/GUI/BonjourDialog.cpp:73 msgid "Hostname" -msgstr "Имя узла" +msgstr "Имя хоста" #: src/slic3r/GUI/BonjourDialog.cpp:74 msgid "Service name" @@ -365,43 +360,41 @@ msgstr "Значение совпадает с системным значени #: src/slic3r/GUI/ButtonsDescription.cpp:53 msgid "" -"Value was changed and is not equal to the system value or the last saved " -"preset" +"Value was changed and is not equal to the system value or the last saved preset" msgstr "" -"Значение изменено и не равно системному значению или последнему сохранённому " -"профилю" +"Значение изменено и не равно системному значению или последнему сохранённому профилю" -#: src/slic3r/GUI/ConfigManipulation.cpp:47 +#: 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 "" -"Нулевая высота слоя не допускается.\n" +"Нулевая высота слоя недопустима.\n" "\n" -"Высота слоя будет установлена равной 0.01." +"Высота слоя будет сброшена на 0.01." -#: src/slic3r/GUI/ConfigManipulation.cpp:48 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1389 -#: src/libslic3r/PrintConfig.cpp:71 +#: src/slic3r/GUI/ConfigManipulation.cpp:49 src/slic3r/GUI/GUI_ObjectLayers.cpp:29 +#: src/slic3r/GUI/Tab.cpp:1387 src/libslic3r/PrintConfig.cpp:73 msgid "Layer height" msgstr "Высота слоя" -#: src/slic3r/GUI/ConfigManipulation.cpp:59 +#: 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 "" -"Нулевая высота первого слоя не допускается.\n" +"Нулевая высота первого слоя недопустима.\n" "\n" -"Высота первого слоя будет установлена равной 0.01." +"Высота первого слоя будет сброшена на 0.01." -#: src/slic3r/GUI/ConfigManipulation.cpp:60 src/libslic3r/PrintConfig.cpp:952 +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:969 msgid "First layer height" msgstr "Высота первого слоя" -#: src/slic3r/GUI/ConfigManipulation.cpp:80 +#: src/slic3r/GUI/ConfigManipulation.cpp:81 +#, c-format msgid "" "The Spiral Vase mode requires:\n" "- one perimeter\n" @@ -411,57 +404,57 @@ msgid "" "- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" -"Для режима «Спиральная ваза» требуются настройки:\n" -"- периметр в одну стенку\n" -"- выключение верхних сплошных слоёв\n" +"Требования для режима \"Спиральная ваза\" - т.е. печати внешнего контура по " +"спирали:\n" +"- одностеночный периметр\n" +"- отсутствие верхних сплошных слоёв\n" "- плотность заполнения 0%\n" -"- выключение материала поддержек\n" -"- включение обеспечения толщины вертикальной оболочки\n" -"- выключение обнаружения тонких стенок" +"- отсутствие поддержки\n" +"- отключено \"Обеспечивать вертикальную толщину оболочки\"\n" +"- отключено \"Обнаружение тонких стенок\"" -#: src/slic3r/GUI/ConfigManipulation.cpp:88 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" -msgstr "Изменить эти настройки, чтобы задействовать режим «Спиральная ваза»?" +msgstr "Изменить эти настройки, чтобы включить режим \"Спиральная ваза\"?" -#: src/slic3r/GUI/ConfigManipulation.cpp:89 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "Спиральная ваза" -#: src/slic3r/GUI/ConfigManipulation.cpp:114 +#: 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)." +"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 "" -"В настоящее время башня очистки поддерживается для нерастворимых поддержек\n" -"только в том случае, если они печатаются текущим экструдером, без запуска\n" -"смены сопла (значения support_material_extruder и\n" -"support_material_interface_extruder должны быть установлены в 0)." +"В настоящее время режим черновой башни поддерживает нерастворимую поддержку\n" +"только в том случае, если она печатается текущим экструдером, без запуска\n" +"смены инструмента. (Значения \"Экструдер, печатающий поддержки/подложки/юбки\"\n" +"и \"Экструдер, печатающий связующий слой поддержки/подложки\" должны быть\n" +"установлены в 0).\"" -#: src/slic3r/GUI/ConfigManipulation.cpp:118 +#: src/slic3r/GUI/ConfigManipulation.cpp:119 msgid "Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "Изменить эти настройки, чтобы включить башню очистки?" +msgstr "Изменить эти настройки, чтобы включить черновую башню?" -#: src/slic3r/GUI/ConfigManipulation.cpp:119 -#: src/slic3r/GUI/ConfigManipulation.cpp:139 +#: src/slic3r/GUI/ConfigManipulation.cpp:120 src/slic3r/GUI/ConfigManipulation.cpp:140 msgid "Wipe Tower" -msgstr "Башня очистки" +msgstr "Черновая башня" -#: src/slic3r/GUI/ConfigManipulation.cpp:135 +#: 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 "" -"Для того, чтобы башня очистки работала для растворимых поддержек,\n" -"слои поддержек должны быть синхронизированы со слоями объекта." +"Для того, чтобы режим черновой башни работал с растворимой поддержкой, \n" +"слои поддержки должны быть синхронизированы со слоями модели." -#: src/slic3r/GUI/ConfigManipulation.cpp:138 +#: src/slic3r/GUI/ConfigManipulation.cpp:139 msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "Синхронизировать слои поддержек, чтобы включить башню очистки?" +msgstr "Синхронизировать слои поддержки, чтобы включить черновую башню?" -#: src/slic3r/GUI/ConfigManipulation.cpp:158 +#: src/slic3r/GUI/ConfigManipulation.cpp:159 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" @@ -469,52 +462,50 @@ msgstr "" "Поддержки работают лучше, если включена следующая функция:\n" "- Определять нависающие периметры" -#: src/slic3r/GUI/ConfigManipulation.cpp:161 +#: src/slic3r/GUI/ConfigManipulation.cpp:162 msgid "Shall I adjust those settings for supports?" -msgstr "Изменить эти настройки для поддержек?" +msgstr "Включить данный параметр для поддержки?" -#: src/slic3r/GUI/ConfigManipulation.cpp:162 +#: src/slic3r/GUI/ConfigManipulation.cpp:163 msgid "Support Generator" -msgstr "Генератор поддержек" +msgstr "Генератор поддержки" -#: src/slic3r/GUI/ConfigManipulation.cpp:207 +#: src/slic3r/GUI/ConfigManipulation.cpp:198 msgid "The %1% infill pattern is not supposed to work at 100%% density." -msgstr "Шаблон заполнения %1% не предполагает работу со 100%% заполнением." +msgstr "Шаблон заполнения %1% не поддерживает 100%% заполнение." -#: src/slic3r/GUI/ConfigManipulation.cpp:209 +#: src/slic3r/GUI/ConfigManipulation.cpp:201 msgid "Shall I switch to rectilinear fill pattern?" msgstr "Заменить его на прямолинейный (Rectilinear)?" -#: src/slic3r/GUI/ConfigManipulation.cpp:210 -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93 -#: src/slic3r/GUI/GUI_ObjectList.cpp:652 src/slic3r/GUI/Plater.cpp:389 -#: src/slic3r/GUI/Tab.cpp:1433 src/slic3r/GUI/Tab.cpp:1435 -#: src/libslic3r/PrintConfig.cpp:244 src/libslic3r/PrintConfig.cpp:457 -#: src/libslic3r/PrintConfig.cpp:481 src/libslic3r/PrintConfig.cpp:831 -#: src/libslic3r/PrintConfig.cpp:845 src/libslic3r/PrintConfig.cpp:882 -#: src/libslic3r/PrintConfig.cpp:1048 src/libslic3r/PrintConfig.cpp:1058 -#: src/libslic3r/PrintConfig.cpp:1125 src/libslic3r/PrintConfig.cpp:1144 -#: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1896 -#: src/libslic3r/PrintConfig.cpp:1913 +#: src/slic3r/GUI/ConfigManipulation.cpp:202 src/slic3r/GUI/GUI_ObjectList.cpp:35 +#: src/slic3r/GUI/GUI_ObjectList.cpp:93 src/slic3r/GUI/GUI_ObjectList.cpp:668 +#: src/slic3r/GUI/Plater.cpp:389 src/slic3r/GUI/Tab.cpp:1432 +#: src/slic3r/GUI/Tab.cpp:1434 src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:848 src/libslic3r/PrintConfig.cpp:862 +#: src/libslic3r/PrintConfig.cpp:899 src/libslic3r/PrintConfig.cpp:1076 +#: src/libslic3r/PrintConfig.cpp:1086 src/libslic3r/PrintConfig.cpp:1153 +#: src/libslic3r/PrintConfig.cpp:1172 src/libslic3r/PrintConfig.cpp:1191 +#: src/libslic3r/PrintConfig.cpp:1928 src/libslic3r/PrintConfig.cpp:1945 msgid "Infill" msgstr "Заполнение" -#: src/slic3r/GUI/ConfigManipulation.cpp:325 +#: src/slic3r/GUI/ConfigManipulation.cpp:320 msgid "Head penetration should not be greater than the head width." -msgstr "" -"Погружение головной части не должно быть больше толщины головной части." +msgstr "Глубина проникновения носика поддержки не должна превышать его длину." -#: src/slic3r/GUI/ConfigManipulation.cpp:327 +#: src/slic3r/GUI/ConfigManipulation.cpp:322 msgid "Invalid Head penetration" -msgstr "Некорректное погружение головной части" +msgstr "Недопустимая глубина проникновения носика поддержки" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:333 msgid "Pinhead diameter should be smaller than the pillar diameter." -msgstr "Диаметр точки крепления должен быть меньше диаметра колонны." +msgstr "Диаметр носика поддержки должен быть меньше диаметра тела поддержки." -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:335 msgid "Invalid pinhead diameter" -msgstr "Некорректный диаметр точки крепления" +msgstr "Недопустимый диаметр носика поддержки" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 msgid "Upgrade" @@ -528,24 +519,24 @@ msgstr "Понизить версию" msgid "Before roll back" msgstr "Перед откатом к прежнему" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:139 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:143 msgid "User" msgstr "Пользователь" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:309 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 src/slic3r/GUI/GUI_Preview.cpp:229 +#: src/libslic3r/ExtrusionEntity.cpp:309 msgid "Unknown" msgstr "Неизвестно" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:44 msgid "Active" -msgstr "Активировать" +msgstr "Активный" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 msgid "PrusaSlicer version" msgstr "Версия PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 src/libslic3r/Preset.cpp:1257 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 src/libslic3r/Preset.cpp:1298 msgid "print" msgstr "печать" @@ -553,20 +544,20 @@ msgstr "печать" msgid "filaments" msgstr "пруток" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1259 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1300 msgid "SLA print" -msgstr "Печать SLA" +msgstr "Профиль SLA печати:" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 src/slic3r/GUI/Plater.cpp:696 -#: src/libslic3r/Preset.cpp:1260 +#: src/libslic3r/Preset.cpp:1301 msgid "SLA material" -msgstr "Материал SLA" +msgstr "Профиль SLA материала" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:62 src/libslic3r/Preset.cpp:1261 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:62 src/libslic3r/Preset.cpp:1302 msgid "printer" msgstr "принтер" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66 src/slic3r/GUI/Tab.cpp:1306 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66 src/slic3r/GUI/Tab.cpp:1304 msgid "vendor" msgstr "производитель" @@ -588,7 +579,7 @@ msgstr "модель" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72 msgid "variants" -msgstr "модификации" +msgstr "модификация" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:84 #, c-format @@ -603,157 +594,156 @@ msgstr "Активировать" msgid "Configuration Snapshots" msgstr "Резервные копии конфигурации (снапшот)" -#: src/slic3r/GUI/ConfigWizard.cpp:237 +#: src/slic3r/GUI/ConfigWizard.cpp:242 msgid "nozzle" msgstr "сопло" -#: src/slic3r/GUI/ConfigWizard.cpp:241 +#: src/slic3r/GUI/ConfigWizard.cpp:246 msgid "Alternate nozzles:" -msgstr "Другие сопла:" +msgstr "Альтернативные сопла:" -#: src/slic3r/GUI/ConfigWizard.cpp:305 +#: src/slic3r/GUI/ConfigWizard.cpp:310 msgid "All standard" msgstr "Все стандартные" -#: src/slic3r/GUI/ConfigWizard.cpp:305 +#: src/slic3r/GUI/ConfigWizard.cpp:310 msgid "Standard" msgstr "Стандартные" -#: src/slic3r/GUI/ConfigWizard.cpp:306 src/slic3r/GUI/ConfigWizard.cpp:596 -#: src/slic3r/GUI/Tab.cpp:3555 src/slic3r/GUI/UnsavedChangesDialog.cpp:927 +#: src/slic3r/GUI/ConfigWizard.cpp:311 src/slic3r/GUI/ConfigWizard.cpp:605 +#: src/slic3r/GUI/Tab.cpp:3565 src/slic3r/GUI/UnsavedChangesDialog.cpp:933 msgid "All" msgstr "Все" -#: src/slic3r/GUI/ConfigWizard.cpp:307 src/slic3r/GUI/ConfigWizard.cpp:597 -#: src/slic3r/GUI/DoubleSlider.cpp:1824 src/slic3r/GUI/Plater.cpp:361 +#: src/slic3r/GUI/ConfigWizard.cpp:312 src/slic3r/GUI/ConfigWizard.cpp:606 +#: src/slic3r/GUI/DoubleSlider.cpp:1859 src/slic3r/GUI/Plater.cpp:361 #: src/slic3r/GUI/Plater.cpp:504 msgid "None" msgstr "Нет" -#: src/slic3r/GUI/ConfigWizard.cpp:443 +#: src/slic3r/GUI/ConfigWizard.cpp:452 #, c-format msgid "Welcome to the %s Configuration Assistant" -msgstr "Помощник по настройке %s" +msgstr "Приветствуем вас в мастере настройки %s" -#: src/slic3r/GUI/ConfigWizard.cpp:445 +#: src/slic3r/GUI/ConfigWizard.cpp:454 #, c-format msgid "Welcome to the %s Configuration Wizard" -msgstr "Мастер настройки %s" +msgstr "Приветствуем вас в мастере настройки %s" -#: src/slic3r/GUI/ConfigWizard.cpp:447 +#: src/slic3r/GUI/ConfigWizard.cpp:456 msgid "Welcome" msgstr "Начало" -#: src/slic3r/GUI/ConfigWizard.cpp:449 +#: src/slic3r/GUI/ConfigWizard.cpp:458 #, 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." +"Hello, welcome to %s! This %s helps you with the initial configuration; just a few " +"settings and you will be ready to print." msgstr "" -"Приветствуем вас в %s! %s поможет вам с начальной настройкой программы; " -"всего несколько вопросов и вы сможете печатать." +"Приветствуем вас в %s! Этот мастер настройки %s поможет вам с начальной настройкой " +"программы." -#: src/slic3r/GUI/ConfigWizard.cpp:454 +#: src/slic3r/GUI/ConfigWizard.cpp:463 msgid "Remove user profiles (a snapshot will be taken beforehand)" -msgstr "Удалить профили пользователей (перед этим будет сделан снапшот)" +msgstr "Удалить профили пользователя (снапшот будет сделан заранее)" -#: src/slic3r/GUI/ConfigWizard.cpp:497 +#: src/slic3r/GUI/ConfigWizard.cpp:506 #, c-format msgid "%s Family" -msgstr "Семейство %s" +msgstr "Семейство принтеров %s" -#: src/slic3r/GUI/ConfigWizard.cpp:585 +#: src/slic3r/GUI/ConfigWizard.cpp:594 msgid "Printer:" -msgstr "" +msgstr "Принтер:" -#: src/slic3r/GUI/ConfigWizard.cpp:587 +#: src/slic3r/GUI/ConfigWizard.cpp:596 msgid "Vendor:" msgstr "Производитель:" -#: src/slic3r/GUI/ConfigWizard.cpp:588 +#: src/slic3r/GUI/ConfigWizard.cpp:597 msgid "Profile:" msgstr "Профиль:" -#: src/slic3r/GUI/ConfigWizard.cpp:660 src/slic3r/GUI/ConfigWizard.cpp:810 -#: src/slic3r/GUI/ConfigWizard.cpp:871 src/slic3r/GUI/ConfigWizard.cpp:1008 +#: src/slic3r/GUI/ConfigWizard.cpp:669 src/slic3r/GUI/ConfigWizard.cpp:819 +#: src/slic3r/GUI/ConfigWizard.cpp:880 src/slic3r/GUI/ConfigWizard.cpp:1017 msgid "(All)" msgstr "(Все)" -#: src/slic3r/GUI/ConfigWizard.cpp:689 +#: src/slic3r/GUI/ConfigWizard.cpp:698 msgid "" "Filaments marked with * are not compatible with some installed " "printers." msgstr "" +"Прутки помеченные знаком *, не несовместимы с некоторыми " +"установленными принтерами." -#: src/slic3r/GUI/ConfigWizard.cpp:692 +#: src/slic3r/GUI/ConfigWizard.cpp:701 msgid "All installed printers are compatible with the selected filament." -msgstr "" +msgstr "Все установленные принтеры совместимы с выбранным прутком." -#: src/slic3r/GUI/ConfigWizard.cpp:712 +#: src/slic3r/GUI/ConfigWizard.cpp:721 msgid "" -"Only the following installed printers are compatible with the selected " -"filament:" +"Only the following installed printers are compatible with the selected filament:" msgstr "" +"Только следующие установленные принтеры совместимы с выбранным прутком:" -#: src/slic3r/GUI/ConfigWizard.cpp:1098 +#: src/slic3r/GUI/ConfigWizard.cpp:1107 msgid "Custom Printer Setup" -msgstr "Установки заказного принтера" +msgstr "Настройка пользовательского принтера" -#: src/slic3r/GUI/ConfigWizard.cpp:1098 +#: src/slic3r/GUI/ConfigWizard.cpp:1107 msgid "Custom Printer" -msgstr "Заказной принтер" +msgstr "Пользовательский принтер" -#: src/slic3r/GUI/ConfigWizard.cpp:1100 +#: src/slic3r/GUI/ConfigWizard.cpp:1109 msgid "Define a custom printer profile" -msgstr "Создать профиль заказного принтера" +msgstr "Задать имя пользовательского профиля" -#: src/slic3r/GUI/ConfigWizard.cpp:1102 +#: src/slic3r/GUI/ConfigWizard.cpp:1111 msgid "Custom profile name:" -msgstr "Имя заказного профиля:" +msgstr "Имя пользовательского профиля:" -#: src/slic3r/GUI/ConfigWizard.cpp:1127 +#: src/slic3r/GUI/ConfigWizard.cpp:1136 msgid "Automatic updates" msgstr "Автоматическое обновление" -#: src/slic3r/GUI/ConfigWizard.cpp:1127 +#: src/slic3r/GUI/ConfigWizard.cpp:1136 msgid "Updates" msgstr "Обновления" -#: src/slic3r/GUI/ConfigWizard.cpp:1135 src/slic3r/GUI/Preferences.cpp:73 +#: src/slic3r/GUI/ConfigWizard.cpp:1144 src/slic3r/GUI/Preferences.cpp:94 msgid "Check for application updates" -msgstr "Проверять обновления" +msgstr "Проверка обновлений" -#: src/slic3r/GUI/ConfigWizard.cpp:1139 +#: src/slic3r/GUI/ConfigWizard.cpp:1148 #, 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." +"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 "" -"Если включено, то %s проверяет наличие новых версий приложения в сети. Если " -"доступна новая версия, то при следующем запуске отображается уведомление (не " -"отображается во время работы программы). Автоматическая установка не " -"производится. Вы увидите только уведомление." +"Если включено, %s проверяет наличие новых версий программы в сети. Если доступна " +"новая версия, при следующем запуске отображается уведомление (не во время работы " +"программы). Автоматическая установка не производится. Вы увидите только уведомление." -#: src/slic3r/GUI/ConfigWizard.cpp:1145 src/slic3r/GUI/Preferences.cpp:108 +#: src/slic3r/GUI/ConfigWizard.cpp:1154 src/slic3r/GUI/Preferences.cpp:129 msgid "Update built-in Presets automatically" msgstr "Обновлять встроенные профили автоматически" -#: src/slic3r/GUI/ConfigWizard.cpp:1149 +#: src/slic3r/GUI/ConfigWizard.cpp:1158 #, 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." +"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 "" -"Если включено, то %s будет скачивать обновления встроенных системных " -"профилей в фоновом режиме. Эти обновления скачиваются в отдельный временный " -"каталог. Когда новые профили становятся доступны, они предлагаются при " -"запуске приложения." +"Если включено, %s будет загружать обновления встроенных системных профилей в " +"фоновом режиме. Эти обновления загружаются в отдельную временную папку. Когда новые " +"профили становятся доступны, они предлагаются при запуске приложения." -#: src/slic3r/GUI/ConfigWizard.cpp:1152 +#: src/slic3r/GUI/ConfigWizard.cpp:1161 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." @@ -761,685 +751,725 @@ msgstr "" "Обновления никогда не применяются без согласия пользователя и никогда не " "перезаписывают пользовательские настройки." -#: src/slic3r/GUI/ConfigWizard.cpp:1157 +#: src/slic3r/GUI/ConfigWizard.cpp:1166 msgid "" -"Additionally a backup snapshot of the whole configuration is created before " -"an update is applied." +"Additionally a backup snapshot of the whole configuration is created before an " +"update is applied." msgstr "" -"Кроме того, перед обновлением создаётся резервная копия всех настроек " -"(снапшот)." +"Кроме того, перед обновлением создаётся резервная копия всей конфигурации (снапшот)." -#: src/slic3r/GUI/ConfigWizard.cpp:1164 src/slic3r/GUI/GUI_ObjectList.cpp:1793 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3091 -#: src/slic3r/GUI/Plater.cpp:3924 src/slic3r/GUI/Plater.cpp:3955 +#: src/slic3r/GUI/ConfigWizard.cpp:1173 src/slic3r/GUI/GUI_ObjectList.cpp:1825 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4567 src/slic3r/GUI/Plater.cpp:3116 +#: src/slic3r/GUI/Plater.cpp:4001 src/slic3r/GUI/Plater.cpp:4032 msgid "Reload from disk" msgstr "Перезагрузить с диска" -#: src/slic3r/GUI/ConfigWizard.cpp:1167 -msgid "" -"Export full pathnames of models and parts sources into 3mf and amf files" -msgstr "" -"Экспортировать полные имена источников моделей и частей в файлы 3mf и amf" +#: src/slic3r/GUI/ConfigWizard.cpp:1176 +msgid "Export full pathnames of models and parts sources into 3mf and amf files" +msgstr "При экспорте в 3mf и amf, сохранять полные пути к исходным файлам" -#: src/slic3r/GUI/ConfigWizard.cpp:1171 +#: src/slic3r/GUI/ConfigWizard.cpp:1180 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." +"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 "" -"Если включено, команда перезагрузки с диска автоматически будет находить и " -"загружать файлы при вызове.\n" -"Если выключено, то команда перезагрузки с диска будет запрашивать каждый " -"файл через окно диалога открытия файлов." +"Если включено, при выполнении команды \"Перезагрузить с диска\" программа будут " +"автоматически находить и загружать файлы проекта. \n" +"В противном случае, будет предложено выбрать каждый файл с помощью диалогового окна " +"открытия файла." -#: src/slic3r/GUI/ConfigWizard.cpp:1181 +#: src/slic3r/GUI/ConfigWizard.cpp:1190 msgid "Files association" -msgstr "" +msgstr "Ассоциация файлов" -#: src/slic3r/GUI/ConfigWizard.cpp:1183 src/slic3r/GUI/Preferences.cpp:91 +#: src/slic3r/GUI/ConfigWizard.cpp:1192 src/slic3r/GUI/Preferences.cpp:112 msgid "Associate .3mf files to PrusaSlicer" -msgstr "" +msgstr "Ассоциировать файлы .3mf с PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1184 src/slic3r/GUI/Preferences.cpp:98 +#: src/slic3r/GUI/ConfigWizard.cpp:1193 src/slic3r/GUI/Preferences.cpp:119 msgid "Associate .stl files to PrusaSlicer" -msgstr "" +msgstr "Ассоциировать файлы .stl с PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1195 +#: src/slic3r/GUI/ConfigWizard.cpp:1204 msgid "View mode" msgstr "Режим просмотра" -#: src/slic3r/GUI/ConfigWizard.cpp:1197 +#: src/slic3r/GUI/ConfigWizard.cpp:1206 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 "" -"В PrusaSlicer есть три режима пользовательского интерфейса:\n" -"простой, расширенный и экспертный.\n" -"В простом режиме показываются только наиболее часто употребляемые настройки " -"обычной печати 3D. В других двух по нарастающей предлагаются дополнительные " -"технически сложные параметры для точной настройки; эти режимы подходят для " -"понимающих процесс и экспертных пользователей." - -#: src/slic3r/GUI/ConfigWizard.cpp:1202 +"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 "" +"Пользовательский интерфейс PrusaSlicer представлен тремя вариантами:\n" +"Простой, Расширенный, Продвинутый.\n" +"В простом режиме отображаются только наиболее часто используемые параметры 3D-" +"печати. Два других предлагают более тонкую расширенную настройку. Они подходят для " +"продвинутых и опытных пользователей." + +#: src/slic3r/GUI/ConfigWizard.cpp:1211 msgid "Simple mode" -msgstr "Простой режим" +msgstr "Простой" -#: src/slic3r/GUI/ConfigWizard.cpp:1203 +#: src/slic3r/GUI/ConfigWizard.cpp:1212 msgid "Advanced mode" -msgstr "Расширенный режим" +msgstr "Расширенный" -#: src/slic3r/GUI/ConfigWizard.cpp:1204 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 msgid "Expert mode" -msgstr "Экспертный режим" +msgstr "Продвинутый" -#: src/slic3r/GUI/ConfigWizard.cpp:1210 +#: src/slic3r/GUI/ConfigWizard.cpp:1219 msgid "The size of the object can be specified in inches" -msgstr "" +msgstr "Размер модели может быть указан в дюймах" -#: src/slic3r/GUI/ConfigWizard.cpp:1211 +#: src/slic3r/GUI/ConfigWizard.cpp:1220 msgid "Use inches" -msgstr "" +msgstr "Использовать дюймы" -#: src/slic3r/GUI/ConfigWizard.cpp:1245 +#: src/slic3r/GUI/ConfigWizard.cpp:1254 msgid "Other Vendors" msgstr "Другие производители" -#: src/slic3r/GUI/ConfigWizard.cpp:1249 +#: src/slic3r/GUI/ConfigWizard.cpp:1258 #, c-format msgid "Pick another vendor supported by %s" -msgstr "Выберите другого производителя, поддерживаемого %s" +msgstr "Выберите другого производителя, поддерживающего %s" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1289 msgid "Firmware Type" msgstr "Тип прошивки" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 src/slic3r/GUI/Tab.cpp:2172 +#: src/slic3r/GUI/ConfigWizard.cpp:1289 src/slic3r/GUI/Tab.cpp:2172 msgid "Firmware" msgstr "Прошивка" -#: src/slic3r/GUI/ConfigWizard.cpp:1284 +#: src/slic3r/GUI/ConfigWizard.cpp:1293 msgid "Choose the type of firmware used by your printer." msgstr "Выберите тип прошивки вашего принтера." -#: src/slic3r/GUI/ConfigWizard.cpp:1318 +#: src/slic3r/GUI/ConfigWizard.cpp:1327 msgid "Bed Shape and Size" -msgstr "Форма и размеры" +msgstr "Форма и размеры стола" -#: src/slic3r/GUI/ConfigWizard.cpp:1321 +#: src/slic3r/GUI/ConfigWizard.cpp:1330 msgid "Set the shape of your printer's bed." -msgstr "Задайте форму и размеры платформы принтера." +msgstr "Задайте форму и размеры вашего стола." -#: src/slic3r/GUI/ConfigWizard.cpp:1341 +#: src/slic3r/GUI/ConfigWizard.cpp:1350 msgid "Filament and Nozzle Diameters" msgstr "Диаметр прутка и сопла" -#: src/slic3r/GUI/ConfigWizard.cpp:1341 +#: src/slic3r/GUI/ConfigWizard.cpp:1350 msgid "Print Diameters" msgstr "Диаметры печати" -#: src/slic3r/GUI/ConfigWizard.cpp:1355 +#: src/slic3r/GUI/ConfigWizard.cpp:1364 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "Введите диаметр сопла." -#: src/slic3r/GUI/ConfigWizard.cpp:1358 +#: src/slic3r/GUI/ConfigWizard.cpp:1367 msgid "Nozzle Diameter:" msgstr "Диаметр сопла:" -#: src/slic3r/GUI/ConfigWizard.cpp:1368 +#: src/slic3r/GUI/ConfigWizard.cpp:1377 msgid "Enter the diameter of your filament." msgstr "Введите диаметр прутка." -#: src/slic3r/GUI/ConfigWizard.cpp:1369 +#: src/slic3r/GUI/ConfigWizard.cpp:1378 msgid "" -"Good precision is required, so use a caliper and do multiple measurements " -"along the filament, then compute the average." +"Good precision is required, so use a caliper and do multiple measurements along the " +"filament, then compute the average." msgstr "" "Необходима хорошая точность, поэтому используйте штангенциркуль и выполните " "несколько измерений вдоль прутка, а затем вычислите среднее значение." -#: src/slic3r/GUI/ConfigWizard.cpp:1372 +#: src/slic3r/GUI/ConfigWizard.cpp:1381 msgid "Filament Diameter:" msgstr "Диаметр прутка:" -#: src/slic3r/GUI/ConfigWizard.cpp:1406 +#: src/slic3r/GUI/ConfigWizard.cpp:1415 msgid "Nozzle and Bed Temperatures" -msgstr "" +msgstr "Температуры сопла и стола" -#: src/slic3r/GUI/ConfigWizard.cpp:1406 +#: src/slic3r/GUI/ConfigWizard.cpp:1415 msgid "Temperatures" -msgstr "Температуры" +msgstr "Температура" -#: src/slic3r/GUI/ConfigWizard.cpp:1422 +#: src/slic3r/GUI/ConfigWizard.cpp:1431 msgid "Enter the temperature needed for extruding your filament." -msgstr "Введите температуру, которая требуется для экструзии прутка." +msgstr "Введите температуру, требуемую для экструзии прутка." -#: src/slic3r/GUI/ConfigWizard.cpp:1423 +#: src/slic3r/GUI/ConfigWizard.cpp:1432 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "Как правило для PLA это 160-230 °C, а для ABS 215-250 °C." -#: src/slic3r/GUI/ConfigWizard.cpp:1426 +#: src/slic3r/GUI/ConfigWizard.cpp:1435 msgid "Extrusion Temperature:" msgstr "Температура экструзии:" -#: src/slic3r/GUI/ConfigWizard.cpp:1427 src/slic3r/GUI/ConfigWizard.cpp:1441 -#: src/libslic3r/PrintConfig.cpp:187 src/libslic3r/PrintConfig.cpp:933 -#: src/libslic3r/PrintConfig.cpp:977 src/libslic3r/PrintConfig.cpp:2262 +#: src/slic3r/GUI/ConfigWizard.cpp:1436 src/slic3r/GUI/ConfigWizard.cpp:1450 +#: src/libslic3r/PrintConfig.cpp:202 src/libslic3r/PrintConfig.cpp:950 +#: src/libslic3r/PrintConfig.cpp:994 src/libslic3r/PrintConfig.cpp:2294 msgid "°C" msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:1436 +#: src/slic3r/GUI/ConfigWizard.cpp:1445 msgid "" -"Enter the bed temperature needed for getting your filament to stick to your " -"heated bed." +"Enter the bed temperature needed for getting your filament to stick to your heated " +"bed." msgstr "" -"Введите температуру платформы, необходимую для того, чтобы пруток прилипал к " -"ней." +"Введите температуру стола, необходимую для того, чтобы пруток прилипал к нему." -#: src/slic3r/GUI/ConfigWizard.cpp:1437 +#: src/slic3r/GUI/ConfigWizard.cpp:1446 msgid "" -"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " -"no heated bed." +"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no " +"heated bed." msgstr "" -"Как правило для PLA это 60 °C, а для ABS 110 °С. Если у вас платформы без " -"подогрева, оставьте 0." +"Как правило для PLA это 60 °C, а для ABS 110 °С. Если у вас не подогреваемый стол, " +"установите 0." -#: src/slic3r/GUI/ConfigWizard.cpp:1440 +#: src/slic3r/GUI/ConfigWizard.cpp:1449 msgid "Bed Temperature:" -msgstr "Температура платформы:" +msgstr "Температура стола:" -#: src/slic3r/GUI/ConfigWizard.cpp:1900 src/slic3r/GUI/ConfigWizard.cpp:2572 +#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2582 msgid "Filaments" -msgstr "Прутки" +msgstr "Пластиковые нити (прутки)" -#: src/slic3r/GUI/ConfigWizard.cpp:1900 src/slic3r/GUI/ConfigWizard.cpp:2574 +#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2584 msgid "SLA Materials" -msgstr "Материалы SLA" +msgstr "SLA материалы (фотополимерная смола)" -#: src/slic3r/GUI/ConfigWizard.cpp:1954 +#: src/slic3r/GUI/ConfigWizard.cpp:1963 msgid "FFF Technology Printers" -msgstr "Принтеры с технологией печати FFF" +msgstr "Принтеры, печатающие по технологии методом наплавления нитей (FFF)" -#: src/slic3r/GUI/ConfigWizard.cpp:1959 +#: src/slic3r/GUI/ConfigWizard.cpp:1968 msgid "SLA Technology Printers" -msgstr "Принтеры с технологией печати SLA" +msgstr "Принтеры, печатающие по технологии масочной ЖК-стереолитографии (SLA)" -#: src/slic3r/GUI/ConfigWizard.cpp:2265 src/slic3r/GUI/DoubleSlider.cpp:2207 -#: src/slic3r/GUI/DoubleSlider.cpp:2227 src/slic3r/GUI/GUI.cpp:244 +#: src/slic3r/GUI/ConfigWizard.cpp:2274 src/slic3r/GUI/DoubleSlider.cpp:2245 +#: src/slic3r/GUI/DoubleSlider.cpp:2265 src/slic3r/GUI/GUI.cpp:244 msgid "Notice" msgstr "Примечание" -#: src/slic3r/GUI/ConfigWizard.cpp:2285 +#: src/slic3r/GUI/ConfigWizard.cpp:2295 msgid "The following FFF printer models have no filament selected:" -msgstr "Для следующих моделей принтеров FFF не указаны прутки:" +msgstr "В следующих моделях FFF принтеров не выбран пруток:" -#: src/slic3r/GUI/ConfigWizard.cpp:2289 +#: src/slic3r/GUI/ConfigWizard.cpp:2299 msgid "Do you want to select default filaments for these FFF printer models?" -msgstr "Хотите выбрать прутки по умолчанию для этих моделей принтеров FFF?" +msgstr "Выбрать пруки по умолчанию для этих моделей FFF принтеров?" -#: src/slic3r/GUI/ConfigWizard.cpp:2303 +#: src/slic3r/GUI/ConfigWizard.cpp:2313 msgid "The following SLA printer models have no materials selected:" -msgstr "Для следующих моделей принтеров SLA не указан материал:" +msgstr "В следующих моделях SLA принтеров не выбрана фотополимерная смола:" -#: src/slic3r/GUI/ConfigWizard.cpp:2307 +#: src/slic3r/GUI/ConfigWizard.cpp:2317 msgid "Do you want to select default SLA materials for these printer models?" -msgstr "Хотите выбрать материалы по умолчанию для этих моделей принтеров SLA?" +msgstr "Выбрать фотополимерный смолы по умолчанию для этих моделей SLA принтеров?" -#: src/slic3r/GUI/ConfigWizard.cpp:2535 +#: src/slic3r/GUI/ConfigWizard.cpp:2545 msgid "Select all standard printers" msgstr "Выбрать все стандартные принтеры" -#: src/slic3r/GUI/ConfigWizard.cpp:2538 +#: src/slic3r/GUI/ConfigWizard.cpp:2548 msgid "< &Back" msgstr "< &Назад" -#: src/slic3r/GUI/ConfigWizard.cpp:2539 +#: src/slic3r/GUI/ConfigWizard.cpp:2549 msgid "&Next >" msgstr "&Далее >" -#: src/slic3r/GUI/ConfigWizard.cpp:2540 +#: src/slic3r/GUI/ConfigWizard.cpp:2550 msgid "&Finish" msgstr "&Завершить" -#: src/slic3r/GUI/ConfigWizard.cpp:2541 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ConfigWizard.cpp:2551 src/slic3r/GUI/FirmwareDialog.cpp:151 #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:248 -#: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:650 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 src/slic3r/GUI/UnsavedChangesDialog.cpp:656 msgid "Cancel" msgstr "Отмена" -#: src/slic3r/GUI/ConfigWizard.cpp:2554 +#: src/slic3r/GUI/ConfigWizard.cpp:2564 msgid "Prusa FFF Technology Printers" -msgstr "Принтеры Prusa с технологией печати FFF" +msgstr "Принтеры Prusa, печатающие по технологии методом наплавления нитей (FFF)" -#: src/slic3r/GUI/ConfigWizard.cpp:2557 +#: src/slic3r/GUI/ConfigWizard.cpp:2567 msgid "Prusa MSLA Technology Printers" -msgstr "Принтеры Prusa с технологией печати MSLA" +msgstr "Принтеры Prusa, печатающие по технологии масочной ЖК-стереолитографии (MSLA)" -#: src/slic3r/GUI/ConfigWizard.cpp:2572 +#: src/slic3r/GUI/ConfigWizard.cpp:2582 msgid "Filament Profiles Selection" msgstr "Выбор профилей прутка" -#: src/slic3r/GUI/ConfigWizard.cpp:2572 src/slic3r/GUI/ConfigWizard.cpp:2574 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 +#: src/slic3r/GUI/ConfigWizard.cpp:2582 src/slic3r/GUI/ConfigWizard.cpp:2584 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4144 msgid "Type:" msgstr "Тип:" -#: src/slic3r/GUI/ConfigWizard.cpp:2574 +#: src/slic3r/GUI/ConfigWizard.cpp:2584 msgid "SLA Material Profiles Selection" -msgstr "Выбор профилей материалов SLA" +msgstr "Выбор профилей фотополимерной смолы (SLA)" -#: src/slic3r/GUI/ConfigWizard.cpp:2677 +#: src/slic3r/GUI/ConfigWizard.cpp:2701 msgid "Configuration Assistant" msgstr "Помощник по настройке" -#: src/slic3r/GUI/ConfigWizard.cpp:2678 +#: src/slic3r/GUI/ConfigWizard.cpp:2702 msgid "Configuration &Assistant" -msgstr "Помощник по настройке" +msgstr "Помощник по &настройке" -#: src/slic3r/GUI/ConfigWizard.cpp:2680 +#: src/slic3r/GUI/ConfigWizard.cpp:2704 msgid "Configuration Wizard" msgstr "Мастер настройки" -#: src/slic3r/GUI/ConfigWizard.cpp:2681 +#: src/slic3r/GUI/ConfigWizard.cpp:2705 msgid "Configuration &Wizard" -msgstr "Мастер настройки" +msgstr "&Мастер настройки" -#: src/slic3r/GUI/DoubleSlider.cpp:96 +#: src/slic3r/GUI/DoubleSlider.cpp:97 msgid "Place bearings in slots and resume printing" -msgstr "" +msgstr "Поместите в посадочное место необходимую деталь и возобновите печать" -#: src/slic3r/GUI/DoubleSlider.cpp:1211 +#: src/slic3r/GUI/DoubleSlider.cpp:1224 msgid "One layer mode" -msgstr "Однослойный режим" +msgstr "Режим одного слоя" -#: src/slic3r/GUI/DoubleSlider.cpp:1213 +#: src/slic3r/GUI/DoubleSlider.cpp:1226 msgid "Discard all custom changes" -msgstr "Отбросить все пользовательские изменения" +msgstr "Отменить все пользовательские изменения" -#: src/slic3r/GUI/DoubleSlider.cpp:1217 src/slic3r/GUI/DoubleSlider.cpp:1960 +#: src/slic3r/GUI/DoubleSlider.cpp:1230 src/slic3r/GUI/DoubleSlider.cpp:1995 msgid "Jump to move" -msgstr "" +msgstr "Перейти к заданному перемещению" -#: src/slic3r/GUI/DoubleSlider.cpp:1220 +#: src/slic3r/GUI/DoubleSlider.cpp:1233 #, c-format msgid "" -"Jump to height %s Set ruler mode\n" -" or Set extruder sequence for the entire print" +"Jump to height %s\n" +"Set ruler mode\n" +"or Set extruder sequence for the entire print" msgstr "" +"Перейти к заданной высоте %s\n" +"Задать режимы линейки\n" +"или задать последовательность экструдеров для всей печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1222 +#: src/slic3r/GUI/DoubleSlider.cpp:1236 #, c-format -msgid "Jump to height %s or Set ruler mode" +msgid "" +"Jump to height %s\n" +"or Set ruler mode" msgstr "" +"Перейти к заданной высоте %s\n" +"или задать режимы линейки" -#: src/slic3r/GUI/DoubleSlider.cpp:1226 +#: src/slic3r/GUI/DoubleSlider.cpp:1241 msgid "Edit current color - Right click the colored slider segment" -msgstr "Изменить текущий цвет — Правым щелчком по раскрашенной части ползунка" +msgstr "Изменить текущий цвет - Правая кнопка мыши по цветному сегменту ползунка ???" -#: src/slic3r/GUI/DoubleSlider.cpp:1236 +#: src/slic3r/GUI/DoubleSlider.cpp:1251 msgid "Print mode" -msgstr "Режим принтера" +msgstr "Режим печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1250 +#: src/slic3r/GUI/DoubleSlider.cpp:1265 msgid "Add extruder change - Left click" -msgstr "Добавить \"Сменить экструдер\" - левый щелчок мыши" +msgstr "Добавить маркер смены экструдера - Левая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1252 +#: src/slic3r/GUI/DoubleSlider.cpp:1267 msgid "" -"Add color change - Left click for predefined color or Shift + Left click for " -"custom color selection" +"Add color change - Left click for predefined color or Shift + Left click for custom " +"color selection" msgstr "" +"Добавить маркер смены цвета - Левая кнопка мыши для цвета из списка цветов по " +"умолчанию или Shift + Левая кнопка мыши для выбора своего цвета" -#: src/slic3r/GUI/DoubleSlider.cpp:1254 +#: src/slic3r/GUI/DoubleSlider.cpp:1269 msgid "Add color change - Left click" -msgstr "Добавить \"Сменить цвет\" - левый щелчок мыши" +msgstr "Добавить маркер смены цвета - Левая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1255 +#: src/slic3r/GUI/DoubleSlider.cpp:1270 msgid "or press \"+\" key" -msgstr "" +msgstr "или клавиша \"+\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1257 +#: src/slic3r/GUI/DoubleSlider.cpp:1272 msgid "Add another code - Ctrl + Left click" -msgstr "" +msgstr "Для добавления другого кода - Ctrl + левая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1258 +#: src/slic3r/GUI/DoubleSlider.cpp:1273 msgid "Add another code - Right click" -msgstr "" +msgstr "Для добавления другого кода - Правая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1264 +#: src/slic3r/GUI/DoubleSlider.cpp:1279 msgid "" "The sequential print is on.\n" -"It's impossible to apply any custom G-code for objects printing " -"sequentually.\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 "" +"Включена последовательная печать.\n" +"При последовательной печати, невозможно применение какого-либо пользовательского G-" +"кода.\n" +"Этот код не будет обрабатываться во время генерации G-кода." -#: src/slic3r/GUI/DoubleSlider.cpp:1273 +#: src/slic3r/GUI/DoubleSlider.cpp:1288 msgid "Color change (\"%1%\")" -msgstr "Смена цвета («%1%»)" +msgstr "Маркер смены цвета (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1274 +#: src/slic3r/GUI/DoubleSlider.cpp:1289 msgid "Color change (\"%1%\") for Extruder %2%" -msgstr "Смена цвета («%1%») для экструдера %2%" +msgstr "Смена цвета (\"%1%\") для экструдера %2%" -#: src/slic3r/GUI/DoubleSlider.cpp:1276 +#: src/slic3r/GUI/DoubleSlider.cpp:1291 msgid "Pause print (\"%1%\")" -msgstr "Пауза печати («%1%»)" +msgstr "Пауза печати (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1278 +#: src/slic3r/GUI/DoubleSlider.cpp:1293 msgid "Custom template (\"%1%\")" -msgstr "" +msgstr "Пользовательский шаблон \"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1280 +#: src/slic3r/GUI/DoubleSlider.cpp:1295 msgid "Extruder (tool) is changed to Extruder \"%1%\"" -msgstr "Экструдер (инструмент) сменен на экструдер «%1%»" +msgstr "Экструдер (инструмент) заменён на экструдер \"%1%\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1287 +#: src/slic3r/GUI/DoubleSlider.cpp:1302 msgid "Note" msgstr "Примечание" -#: src/slic3r/GUI/DoubleSlider.cpp:1289 +#: src/slic3r/GUI/DoubleSlider.cpp:1304 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 "" +"G-код, связанный с этим маркером, конфликтует с режимом печати.\n" +"Его редактирование приведёт к изменениям данных ползунка." -#: src/slic3r/GUI/DoubleSlider.cpp:1292 +#: src/slic3r/GUI/DoubleSlider.cpp:1307 msgid "" -"There is a color change for extruder that won't be used till the end of " -"print job.\n" +"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." msgstr "" +"Произведена смена цвета для экструдера, который не будет использоваться до конца " +"печати.\n" +"Этот код не будет обрабатываться во время генерации G-кода." -#: src/slic3r/GUI/DoubleSlider.cpp:1295 +#: src/slic3r/GUI/DoubleSlider.cpp:1310 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." msgstr "" +"Существующий экструдер заменён на тот же экструдер.\n" +"Этот код не будет обрабатываться во время генерации G-кода." -#: src/slic3r/GUI/DoubleSlider.cpp:1298 +#: src/slic3r/GUI/DoubleSlider.cpp:1313 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." msgstr "" +"Произведена смена цвета для экструдера, который ранее не использовался.\n" +"Проверьте настройки, чтобы избежать лишней смены цвета." -#: src/slic3r/GUI/DoubleSlider.cpp:1303 +#: src/slic3r/GUI/DoubleSlider.cpp:1318 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "" +"Удалить маркер - Левая кнопка мыши \n" +"или клавиша \"-\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1305 +#: src/slic3r/GUI/DoubleSlider.cpp:1320 msgid "Edit tick mark - Ctrl + Left click" -msgstr "" +msgstr "Редактировать маркер - Ctrl + левая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1306 +#: src/slic3r/GUI/DoubleSlider.cpp:1321 msgid "Edit tick mark - Right click" -msgstr "" +msgstr "Редактировать маркер - Правая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1406 src/slic3r/GUI/DoubleSlider.cpp:1440 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 src/slic3r/GUI/Tab.cpp:2527 +#: src/slic3r/GUI/DoubleSlider.cpp:1417 src/slic3r/GUI/DoubleSlider.cpp:1451 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1864 #, c-format msgid "Extruder %d" msgstr "Экструдер %d" -#: src/slic3r/GUI/DoubleSlider.cpp:1407 src/slic3r/GUI/GUI_ObjectList.cpp:1833 +#: src/slic3r/GUI/DoubleSlider.cpp:1418 src/slic3r/GUI/GUI_ObjectList.cpp:1865 msgid "active" msgstr "активный" -#: src/slic3r/GUI/DoubleSlider.cpp:1416 +#: src/slic3r/GUI/DoubleSlider.cpp:1427 msgid "Switch code to Change extruder" -msgstr "Изменить код на \"Сменить экструдер\"" +msgstr "Переключить код на смену экструдера" -#: src/slic3r/GUI/DoubleSlider.cpp:1416 src/slic3r/GUI/GUI_ObjectList.cpp:1800 +#: src/slic3r/GUI/DoubleSlider.cpp:1427 src/slic3r/GUI/GUI_ObjectList.cpp:1832 msgid "Change extruder" -msgstr "Сменить экструдер" +msgstr "Маркер смены экструдера" -#: src/slic3r/GUI/DoubleSlider.cpp:1417 +#: src/slic3r/GUI/DoubleSlider.cpp:1428 msgid "Change extruder (N/A)" -msgstr "Сменить экструдер (нед.)" +msgstr "Маркер смены экструдера (Нет данных)" -#: src/slic3r/GUI/DoubleSlider.cpp:1419 +#: src/slic3r/GUI/DoubleSlider.cpp:1430 msgid "Use another extruder" msgstr "Использовать другой экструдер" -#: src/slic3r/GUI/DoubleSlider.cpp:1441 +#: src/slic3r/GUI/DoubleSlider.cpp:1452 msgid "used" msgstr "используется" -#: src/slic3r/GUI/DoubleSlider.cpp:1449 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 msgid "Switch code to Color change (%1%) for:" msgstr "Переключить код на смену цвета (%1%) для:" -#: src/slic3r/GUI/DoubleSlider.cpp:1450 +#: src/slic3r/GUI/DoubleSlider.cpp:1461 msgid "Add color change (%1%) for:" -msgstr "Добавить смену цвета (%1%) для:" +msgstr "Добавить маркер смены цвета (%1%) для:" -#: src/slic3r/GUI/DoubleSlider.cpp:1763 +#: src/slic3r/GUI/DoubleSlider.cpp:1797 msgid "Add color change" -msgstr "Добавить смену цвета" +msgstr "Добавить маркер смены цвета" -#: src/slic3r/GUI/DoubleSlider.cpp:1773 +#: src/slic3r/GUI/DoubleSlider.cpp:1808 msgid "Add pause print" -msgstr "Добавить паузу печати" +msgstr "Добавить маркер паузы печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1777 +#: src/slic3r/GUI/DoubleSlider.cpp:1812 msgid "Add custom template" -msgstr "" +msgstr "Добавить пользовательский шаблон" -#: src/slic3r/GUI/DoubleSlider.cpp:1780 +#: src/slic3r/GUI/DoubleSlider.cpp:1815 msgid "Add custom G-code" -msgstr "Добавить пользовательский G-код" +msgstr "Добавить маркер пользовательского G-кода" -#: src/slic3r/GUI/DoubleSlider.cpp:1798 +#: src/slic3r/GUI/DoubleSlider.cpp:1833 msgid "Edit color" -msgstr "Редактировать цвет" +msgstr "Изменить цвет" -#: src/slic3r/GUI/DoubleSlider.cpp:1799 +#: src/slic3r/GUI/DoubleSlider.cpp:1834 msgid "Edit pause print message" -msgstr "Редактировать сообщение паузы печати" +msgstr "Изменить сообщение при приостановке печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1800 +#: src/slic3r/GUI/DoubleSlider.cpp:1835 msgid "Edit custom G-code" -msgstr "Редактировать пользовательский G-код" +msgstr "Изменить пользовательский G-код" -#: src/slic3r/GUI/DoubleSlider.cpp:1806 +#: src/slic3r/GUI/DoubleSlider.cpp:1841 msgid "Delete color change" -msgstr "Удалить смену цвета" +msgstr "Удалить маркер смены цвета" -#: src/slic3r/GUI/DoubleSlider.cpp:1807 +#: src/slic3r/GUI/DoubleSlider.cpp:1842 msgid "Delete tool change" -msgstr "Удалить смену инструмента" +msgstr "Удалить маркер смены инструмента" -#: src/slic3r/GUI/DoubleSlider.cpp:1808 +#: src/slic3r/GUI/DoubleSlider.cpp:1843 msgid "Delete pause print" msgstr "Удалить паузу печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1809 +#: src/slic3r/GUI/DoubleSlider.cpp:1844 msgid "Delete custom G-code" msgstr "Удалить пользовательский G-код" -#: src/slic3r/GUI/DoubleSlider.cpp:1819 src/slic3r/GUI/DoubleSlider.cpp:1960 +#: src/slic3r/GUI/DoubleSlider.cpp:1854 src/slic3r/GUI/DoubleSlider.cpp:1995 msgid "Jump to height" -msgstr "Переместиться на высоту" +msgstr "Перейти на заданную высоту" -#: src/slic3r/GUI/DoubleSlider.cpp:1824 -msgid "Supprese show the ruler" -msgstr "" +#: src/slic3r/GUI/DoubleSlider.cpp:1859 +msgid "Hide ruler" +msgstr "Скрыть линейку" -#: src/slic3r/GUI/DoubleSlider.cpp:1828 +#: src/slic3r/GUI/DoubleSlider.cpp:1863 msgid "Show object height" -msgstr "" +msgstr "Показывать высоту модели" -#: src/slic3r/GUI/DoubleSlider.cpp:1828 +#: src/slic3r/GUI/DoubleSlider.cpp:1863 msgid "Show object height on the ruler" -msgstr "" +msgstr "Показывать высоту модели на линейке" -#: src/slic3r/GUI/DoubleSlider.cpp:1832 +#: src/slic3r/GUI/DoubleSlider.cpp:1867 msgid "Show estimated print time" -msgstr "" +msgstr "Показывать расчётное время печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1832 +#: src/slic3r/GUI/DoubleSlider.cpp:1867 msgid "Show estimated print time on the ruler" -msgstr "" +msgstr "Показать расчётное время печати на линейке" -#: src/slic3r/GUI/DoubleSlider.cpp:1836 +#: src/slic3r/GUI/DoubleSlider.cpp:1871 msgid "Ruler mode" -msgstr "" +msgstr "Режим линейки" -#: src/slic3r/GUI/DoubleSlider.cpp:1836 +#: src/slic3r/GUI/DoubleSlider.cpp:1871 msgid "Set ruler mode" -msgstr "" +msgstr "Задать режим линейки" -#: src/slic3r/GUI/DoubleSlider.cpp:1841 +#: src/slic3r/GUI/DoubleSlider.cpp:1876 msgid "Set extruder sequence for the entire print" -msgstr "Установить последовательность экструдеров для всей печати" +msgstr "Задать последовательность экструдеров для всей печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1927 +#: src/slic3r/GUI/DoubleSlider.cpp:1962 msgid "Enter custom G-code used on current layer" -msgstr "" +msgstr "Введите пользовательский G-код для текущего слоя" -#: src/slic3r/GUI/DoubleSlider.cpp:1928 +#: src/slic3r/GUI/DoubleSlider.cpp:1963 msgid "Custom G-code on current layer (%1% mm)." -msgstr "" +msgstr "Пользовательский G-код для текущего слоя (%1% мм)." -#: src/slic3r/GUI/DoubleSlider.cpp:1943 +#: src/slic3r/GUI/DoubleSlider.cpp:1978 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" +"Введите короткое сообщение, которое будет отображаться на экране принтера при паузе " +"печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1944 +#: src/slic3r/GUI/DoubleSlider.cpp:1979 msgid "Message for pause print on current layer (%1% mm)." -msgstr "" +msgstr "Сообщение при паузе печати на текущем слое (%1% мм)." -#: src/slic3r/GUI/DoubleSlider.cpp:1959 +#: src/slic3r/GUI/DoubleSlider.cpp:1994 msgid "Enter the move you want to jump to" -msgstr "" +msgstr "Введите нужное перемещение, на который хотите перейти" -#: src/slic3r/GUI/DoubleSlider.cpp:1959 +#: src/slic3r/GUI/DoubleSlider.cpp:1994 msgid "Enter the height you want to jump to" -msgstr "" +msgstr "Введите значение для перехода на нужную высоту" -#: src/slic3r/GUI/DoubleSlider.cpp:2201 +#: src/slic3r/GUI/DoubleSlider.cpp:2239 msgid "The last color change data was saved for a single extruder printing." msgstr "" -"Последние данные для смены цвет были сохранены для одноэкструдерной печати." +"Последние данные об изменении цвета были сохранены для одноэкструдерной печати." -#: src/slic3r/GUI/DoubleSlider.cpp:2202 src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2240 src/slic3r/GUI/DoubleSlider.cpp:2255 msgid "The last color change data was saved for a multi extruder printing." msgstr "" +"Последние данные об изменении цвета были сохранены для многоэкструдерной печати." -#: src/slic3r/GUI/DoubleSlider.cpp:2204 +#: src/slic3r/GUI/DoubleSlider.cpp:2242 msgid "Your current changes will delete all saved color changes." -msgstr "" +msgstr "Текущие изменения приведут к удалению всех сохранённых изменений цвета." -#: src/slic3r/GUI/DoubleSlider.cpp:2205 src/slic3r/GUI/DoubleSlider.cpp:2225 +#: src/slic3r/GUI/DoubleSlider.cpp:2243 src/slic3r/GUI/DoubleSlider.cpp:2263 msgid "Are you sure you want to continue?" -msgstr "" +msgstr "Вы действительно хотите продолжить?" -#: src/slic3r/GUI/DoubleSlider.cpp:2218 +#: src/slic3r/GUI/DoubleSlider.cpp:2256 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/DoubleSlider.cpp:2221 +#: src/slic3r/GUI/DoubleSlider.cpp:2259 msgid "Do you want to delete all saved tool changes?" -msgstr "" +msgstr "Удалить все сохранённые данные о смене инструмента?" -#: src/slic3r/GUI/DoubleSlider.cpp:2223 +#: src/slic3r/GUI/DoubleSlider.cpp:2261 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." msgstr "" +"Последние данные об изменении цвета были сохранены для многоэкструдерной печати со " +"сменой инструмента для всей печати." -#: src/slic3r/GUI/DoubleSlider.cpp:2224 +#: src/slic3r/GUI/DoubleSlider.cpp:2262 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" +"Текущие изменения приведут к удалению всех сохранённых изменений экструдера " +"(инструмента)." -#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:496 -#: src/slic3r/GUI/GUI_ObjectList.cpp:508 src/slic3r/GUI/GUI_ObjectList.cpp:1015 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4454 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4464 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4499 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:209 +#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:524 src/slic3r/GUI/GUI_ObjectList.cpp:1033 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4582 src/slic3r/GUI/GUI_ObjectList.cpp:4592 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4627 src/slic3r/GUI/ObjectDataViewModel.cpp:209 #: src/slic3r/GUI/ObjectDataViewModel.cpp:266 #: src/slic3r/GUI/ObjectDataViewModel.cpp:291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:499 src/libslic3r/PrintConfig.cpp:537 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:499 src/libslic3r/PrintConfig.cpp:552 msgid "default" msgstr "по умолчанию" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:24 msgid "Set extruder sequence" -msgstr "Установить последовательность экструдеров" +msgstr "Задать последовательность экструдеров" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:40 msgid "Set extruder change for every" -msgstr "Установите смену экструдера для каждых" +msgstr "Задать смену экструдера на каждом" -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:53 -#: src/libslic3r/PrintConfig.cpp:403 src/libslic3r/PrintConfig.cpp:1061 -#: src/libslic3r/PrintConfig.cpp:1686 src/libslic3r/PrintConfig.cpp:1851 -#: src/libslic3r/PrintConfig.cpp:1918 src/libslic3r/PrintConfig.cpp:2125 -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:53 src/libslic3r/PrintConfig.cpp:418 +#: src/libslic3r/PrintConfig.cpp:1089 src/libslic3r/PrintConfig.cpp:1718 +#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:1950 +#: src/libslic3r/PrintConfig.cpp:2157 src/libslic3r/PrintConfig.cpp:2203 msgid "layers" -msgstr "слои" +msgstr "слой(-я)" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:137 msgid "Set extruder(tool) sequence" -msgstr "" +msgstr "Задать последовательность экструдеров (инструментов)" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:183 msgid "Remove extruder from sequence" -msgstr "" +msgstr "Удалить экструдер из последовательности" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:193 msgid "Add extruder to sequence" -msgstr "" +msgstr "Добавить экструдер в последовательность" -#: src/slic3r/GUI/Field.cpp:184 +#: src/slic3r/GUI/Field.cpp:197 msgid "default value" msgstr "значение по умолчанию" -#: src/slic3r/GUI/Field.cpp:187 +#: src/slic3r/GUI/Field.cpp:200 msgid "parameter name" msgstr "имя параметра" -#: src/slic3r/GUI/Field.cpp:198 src/slic3r/GUI/OptionsGroup.cpp:779 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:880 +#: src/slic3r/GUI/Field.cpp:211 src/slic3r/GUI/OptionsGroup.cpp:781 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:886 msgid "N/A" msgstr "Н/Д" -#: src/slic3r/GUI/Field.cpp:220 +#: src/slic3r/GUI/Field.cpp:233 #, c-format msgid "%s doesn't support percentage" -msgstr "%s не поддерживает значение в процентах" +msgstr "%s не поддерживает проценты" -#: src/slic3r/GUI/Field.cpp:240 src/slic3r/GUI/Field.cpp:276 -#: src/slic3r/GUI/Field.cpp:1430 src/slic3r/GUI/GUI_ObjectLayers.cpp:413 +#: src/slic3r/GUI/Field.cpp:253 src/slic3r/GUI/Field.cpp:307 +#: src/slic3r/GUI/Field.cpp:1520 src/slic3r/GUI/GUI_ObjectLayers.cpp:413 msgid "Invalid numeric input." msgstr "Неправильное числовое значение." -#: src/slic3r/GUI/Field.cpp:249 src/slic3r/GUI/Field.cpp:1442 +#: src/slic3r/GUI/Field.cpp:264 +#, c-format +msgid "" +"Input value is out of range\n" +"Are you sure that %s is a correct value and that you want to continue?" +msgstr "" +"Введённое значение вне диапазона\n" +"Вы уверены, что %s является правильным значением и что вы хотите продолжить?" + +#: src/slic3r/GUI/Field.cpp:266 src/slic3r/GUI/Field.cpp:326 +msgid "Parameter validation" +msgstr "Проверка правильности параметра" + +#: src/slic3r/GUI/Field.cpp:279 src/slic3r/GUI/Field.cpp:373 +#: src/slic3r/GUI/Field.cpp:1532 msgid "Input value is out of range" msgstr "Введённое значение вне диапазона" -#: src/slic3r/GUI/Field.cpp:292 +#: src/slic3r/GUI/Field.cpp:323 #, 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 "" -"Вы имели ввиду %s%% вместо %s %s?\n" -"Выберите ДА, если хотите изменить это значение на %s%%, \n" -"или НЕТ, если %s %s действительно правильные значения." +"Вы имеете в виду %s%% вместо %s %s?\n" +"Выберите Да, если вы хотите изменить это значение на %s%%, \n" +"или Нет, если уверены, что %s %s является правильным значением." -#: src/slic3r/GUI/Field.cpp:295 -msgid "Parameter validation" -msgstr "Проверка корректности параметров" +#: src/slic3r/GUI/Field.cpp:381 +msgid "" +"Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" +msgstr "" +"Неверный входной формат. Ожидаемый вектор размеров в следующем формате: \"%1%\"" #: src/slic3r/GUI/FirmwareDialog.cpp:150 msgid "Flash!" @@ -1447,23 +1477,23 @@ msgstr "Прошить!" #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flashing in progress. Please do not disconnect the printer!" -msgstr "Выполняется прошивка. Не отключайте принтер!" +msgstr "Идёт прошивка. Пожалуйста, не отключайте принтер!" #: src/slic3r/GUI/FirmwareDialog.cpp:199 msgid "Flashing failed" -msgstr "Ошибка при прошивке" +msgstr "Не удалось выполнить прошивку" #: src/slic3r/GUI/FirmwareDialog.cpp:282 msgid "Flashing succeeded!" -msgstr "Прошивка завершена успешно!" +msgstr "Прошито успешно!" #: src/slic3r/GUI/FirmwareDialog.cpp:283 msgid "Flashing failed. Please see the avrdude log below." -msgstr "При прошивке возникла ошибка. Смотрите журнал avrdude ниже." +msgstr "Не удалось выполнить прошивку. Смотрите журнал avrdude ниже." #: src/slic3r/GUI/FirmwareDialog.cpp:284 msgid "Flashing cancelled." -msgstr "Прошивка отменена." +msgstr "Процесс прошивки отменён." #: src/slic3r/GUI/FirmwareDialog.cpp:332 #, c-format @@ -1475,18 +1505,19 @@ msgid "" "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 "" -"Данный hex-файл прошивки не соответствует модели принтера.\n" -"Файл hex предназначен для: %s\n" -"Принтер выдаёт: %s\n" +"Данный hex-файл прошивки не соответствует модели принтера. \n" +"Файл предназначен для: %s\n" +"Принтер сообщил: %s\n" "\n" -"Хотите продолжить и всё равно прошить этот hex-файл?\n" -"Подумайте, всё ли правильно вы делаете." +"Вы все равно хотите прошить этот файл?\n" +"Пожалуйста, продолжайте лишь в том случае, если вы уверены в своих действиях." #: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454 #, c-format -msgid "" -"Multiple %s devices found. Please only connect one at a time for flashing." -msgstr "Обнаружено несколько устройств %s. Для прошивки оставьте только одно." +msgid "Multiple %s devices found. Please only connect one at a time for flashing." +msgstr "" +"Найдено несколько устройств %s. Для прошивки оставьте только одно подключённое " +"устройство." #: src/slic3r/GUI/FirmwareDialog.cpp:436 #, c-format @@ -1496,7 +1527,7 @@ msgid "" "connector ..." msgstr "" "Устройство %s не найдено.\n" -"Если устройство подключено, то нажмите кнопку сброса около разъёма USB …" +"Если устройство подключено, нажмите кнопку Reset рядом с USB-разъёмом..." #: src/slic3r/GUI/FirmwareDialog.cpp:548 #, c-format @@ -1506,7 +1537,7 @@ msgstr "Не удалось найти устройство %s" #: src/slic3r/GUI/FirmwareDialog.cpp:645 #, c-format msgid "Error accessing port at %s: %s" -msgstr "Ошибка доступа по порту в %s: %s" +msgstr "Ошибка доступа к порту в %s: %s" #: src/slic3r/GUI/FirmwareDialog.cpp:647 #, c-format @@ -1519,10 +1550,9 @@ msgstr "Прошивальшик" #: src/slic3r/GUI/FirmwareDialog.cpp:802 msgid "Firmware image:" -msgstr "Файл прошивки:" +msgstr "Файл прошивки (*.hex):" -#: src/slic3r/GUI/FirmwareDialog.cpp:805 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/PhysicalPrinterDialog.cpp:289 #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 msgid "Browse" msgstr "Обзор" @@ -1553,11 +1583,10 @@ msgstr "Готово" #: src/slic3r/GUI/FirmwareDialog.cpp:841 msgid "Advanced: Output log" -msgstr "Дополнительно: журнал результата" +msgstr "Дополнительно: журнал вывода" -#: src/slic3r/GUI/FirmwareDialog.cpp:852 -#: src/slic3r/GUI/Mouse3DController.cpp:552 -#: src/slic3r/GUI/PrintHostDialogs.cpp:187 +#: src/slic3r/GUI/FirmwareDialog.cpp:852 src/slic3r/GUI/Mouse3DController.cpp:551 +#: src/slic3r/GUI/PrintHostDialogs.cpp:189 msgid "Close" msgstr "Закрыть" @@ -1575,676 +1604,685 @@ msgstr "Подтверждение" #: src/slic3r/GUI/FirmwareDialog.cpp:906 msgid "Cancelling..." -msgstr "Отмена…" +msgstr "Отмена..." -#: src/slic3r/GUI/GCodeViewer.cpp:220 +#: src/slic3r/GUI/GCodeViewer.cpp:239 msgid "Tool position" -msgstr "" +msgstr "Положение инструмента" -#: src/slic3r/GUI/GCodeViewer.cpp:984 +#: src/slic3r/GUI/GCodeViewer.cpp:1016 msgid "Generating toolpaths" -msgstr "" +msgstr "Создание траекторий инструмента" -#: src/slic3r/GUI/GCodeViewer.cpp:1375 +#: src/slic3r/GUI/GCodeViewer.cpp:1405 msgid "Generating vertex buffer" -msgstr "" +msgstr "Генерация буфера вершин" -#: src/slic3r/GUI/GCodeViewer.cpp:1468 +#: src/slic3r/GUI/GCodeViewer.cpp:1496 msgid "Generating index buffers" -msgstr "" +msgstr "Генерация буферов индекса" -#: src/slic3r/GUI/GCodeViewer.cpp:2212 +#: src/slic3r/GUI/GCodeViewer.cpp:2225 msgid "Click to hide" -msgstr "" +msgstr "Нажмите, чтобы скрыть" -#: src/slic3r/GUI/GCodeViewer.cpp:2212 +#: src/slic3r/GUI/GCodeViewer.cpp:2225 msgid "Click to show" -msgstr "" +msgstr "Нажмите, чтобы отобразить" -#: src/slic3r/GUI/GCodeViewer.cpp:2324 +#: src/slic3r/GUI/GCodeViewer.cpp:2337 msgid "up to" -msgstr "" +msgstr "до" -#: src/slic3r/GUI/GCodeViewer.cpp:2330 +#: src/slic3r/GUI/GCodeViewer.cpp:2343 msgid "above" -msgstr "" +msgstr "после" -#: src/slic3r/GUI/GCodeViewer.cpp:2338 +#: src/slic3r/GUI/GCodeViewer.cpp:2351 msgid "from" -msgstr "" +msgstr "из" -#: src/slic3r/GUI/GCodeViewer.cpp:2338 +#: src/slic3r/GUI/GCodeViewer.cpp:2351 msgid "to" -msgstr "" +msgstr "в" -#: src/slic3r/GUI/GCodeViewer.cpp:2366 src/slic3r/GUI/GCodeViewer.cpp:2374 -#: src/slic3r/GUI/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:526 +#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387 +#: src/slic3r/GUI/GUI_Preview.cpp:214 src/slic3r/GUI/GUI_Preview.cpp:533 +#: src/slic3r/GUI/GUI_Preview.cpp:942 msgid "Feature type" msgstr "Типы линий" -#: src/slic3r/GUI/GCodeViewer.cpp:2366 src/slic3r/GUI/GCodeViewer.cpp:2374 +#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387 #: src/slic3r/GUI/RammingChart.cpp:76 msgid "Time" msgstr "Время" -#: src/slic3r/GUI/GCodeViewer.cpp:2374 +#: src/slic3r/GUI/GCodeViewer.cpp:2387 msgid "Percentage" -msgstr "" +msgstr "Процент" -#: src/slic3r/GUI/GCodeViewer.cpp:2377 +#: src/slic3r/GUI/GCodeViewer.cpp:2390 msgid "Height (mm)" msgstr "Высота (мм)" -#: src/slic3r/GUI/GCodeViewer.cpp:2378 +#: src/slic3r/GUI/GCodeViewer.cpp:2391 msgid "Width (mm)" msgstr "Ширина (мм)" -#: src/slic3r/GUI/GCodeViewer.cpp:2379 +#: src/slic3r/GUI/GCodeViewer.cpp:2392 msgid "Speed (mm/s)" msgstr "Скорость (мм/с)" -#: src/slic3r/GUI/GCodeViewer.cpp:2380 +#: src/slic3r/GUI/GCodeViewer.cpp:2393 msgid "Fan Speed (%)" msgstr "Скорость вентилятора (%)" -#: src/slic3r/GUI/GCodeViewer.cpp:2381 +#: src/slic3r/GUI/GCodeViewer.cpp:2394 msgid "Volumetric flow rate (mm³/s)" msgstr "Объёмный расход (мм³/с)" -#: src/slic3r/GUI/GCodeViewer.cpp:2382 src/slic3r/GUI/GUI_Preview.cpp:234 -#: src/slic3r/GUI/GUI_Preview.cpp:341 src/slic3r/GUI/GUI_Preview.cpp:477 -#: src/slic3r/GUI/GUI_Preview.cpp:525 src/slic3r/GUI/GUI_Preview.cpp:850 +#: src/slic3r/GUI/GCodeViewer.cpp:2395 src/slic3r/GUI/GUI_Preview.cpp:220 +#: src/slic3r/GUI/GUI_Preview.cpp:326 src/slic3r/GUI/GUI_Preview.cpp:471 +#: src/slic3r/GUI/GUI_Preview.cpp:532 src/slic3r/GUI/GUI_Preview.cpp:878 +#: src/slic3r/GUI/GUI_Preview.cpp:942 msgid "Tool" msgstr "Инструмент" -#: src/slic3r/GUI/GCodeViewer.cpp:2383 src/slic3r/GUI/GUI_Preview.cpp:235 -#: src/slic3r/GUI/GUI_Preview.cpp:523 +#: src/slic3r/GUI/GCodeViewer.cpp:2396 src/slic3r/GUI/GUI_Preview.cpp:221 +#: src/slic3r/GUI/GUI_Preview.cpp:530 src/slic3r/GUI/GUI_Preview.cpp:941 msgid "Color Print" msgstr "Цвет печати" -#: src/slic3r/GUI/GCodeViewer.cpp:2419 src/slic3r/GUI/GCodeViewer.cpp:2454 -#: src/slic3r/GUI/GCodeViewer.cpp:2459 src/slic3r/GUI/GUI_ObjectList.cpp:296 -#: src/slic3r/GUI/wxExtensions.cpp:515 src/libslic3r/PrintConfig.cpp:532 +#: src/slic3r/GUI/GCodeViewer.cpp:2432 src/slic3r/GUI/GCodeViewer.cpp:2467 +#: src/slic3r/GUI/GCodeViewer.cpp:2472 src/slic3r/GUI/GUI_ObjectList.cpp:312 +#: src/slic3r/GUI/wxExtensions.cpp:519 src/libslic3r/PrintConfig.cpp:547 msgid "Extruder" msgstr "Экструдер" -#: src/slic3r/GUI/GCodeViewer.cpp:2430 +#: src/slic3r/GUI/GCodeViewer.cpp:2443 msgid "Default color" -msgstr "" +msgstr "Цвет по умолчанию" -#: src/slic3r/GUI/GCodeViewer.cpp:2454 +#: src/slic3r/GUI/GCodeViewer.cpp:2467 msgid "default color" -msgstr "" +msgstr "цвет по умолчанию" -#: src/slic3r/GUI/GCodeViewer.cpp:2549 src/slic3r/GUI/GCodeViewer.cpp:2595 +#: src/slic3r/GUI/GCodeViewer.cpp:2562 src/slic3r/GUI/GCodeViewer.cpp:2608 msgid "Color change" -msgstr "" +msgstr "Смена цвета" -#: src/slic3r/GUI/GCodeViewer.cpp:2568 src/slic3r/GUI/GCodeViewer.cpp:2593 +#: src/slic3r/GUI/GCodeViewer.cpp:2581 src/slic3r/GUI/GCodeViewer.cpp:2606 msgid "Print" -msgstr "" +msgstr "Печать" -#: src/slic3r/GUI/GCodeViewer.cpp:2594 src/slic3r/GUI/GCodeViewer.cpp:2611 +#: src/slic3r/GUI/GCodeViewer.cpp:2607 src/slic3r/GUI/GCodeViewer.cpp:2624 msgid "Pause" msgstr "Пауза" -#: src/slic3r/GUI/GCodeViewer.cpp:2599 src/slic3r/GUI/GCodeViewer.cpp:2602 +#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615 msgid "Event" -msgstr "" +msgstr "Событие" -#: src/slic3r/GUI/GCodeViewer.cpp:2599 src/slic3r/GUI/GCodeViewer.cpp:2602 +#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615 msgid "Remaining time" -msgstr "" +msgstr "Точное время печати" -#: src/slic3r/GUI/GCodeViewer.cpp:2602 +#: src/slic3r/GUI/GCodeViewer.cpp:2615 msgid "Duration" -msgstr "" +msgstr "Продолжительность" -#: src/slic3r/GUI/GCodeViewer.cpp:2637 src/slic3r/GUI/GUI_Preview.cpp:976 -#: src/libslic3r/PrintConfig.cpp:2348 +#: src/slic3r/GUI/GCodeViewer.cpp:2650 src/slic3r/GUI/GUI_Preview.cpp:1023 +#: src/libslic3r/PrintConfig.cpp:2380 msgid "Travel" msgstr "Перемещение" -#: src/slic3r/GUI/GCodeViewer.cpp:2640 +#: src/slic3r/GUI/GCodeViewer.cpp:2653 msgid "Movement" -msgstr "" +msgstr "Перемещение" -#: src/slic3r/GUI/GCodeViewer.cpp:2641 +#: src/slic3r/GUI/GCodeViewer.cpp:2654 msgid "Extrusion" -msgstr "" +msgstr "Экструзия" -#: src/slic3r/GUI/GCodeViewer.cpp:2642 src/slic3r/GUI/Tab.cpp:1695 -#: src/slic3r/GUI/Tab.cpp:2577 +#: src/slic3r/GUI/GCodeViewer.cpp:2655 src/slic3r/GUI/Tab.cpp:1694 +#: src/slic3r/GUI/Tab.cpp:2582 msgid "Retraction" msgstr "Ретракт (втягивание)" -#: src/slic3r/GUI/GCodeViewer.cpp:2660 src/slic3r/GUI/GCodeViewer.cpp:2663 -#: src/slic3r/GUI/GUI_Preview.cpp:978 +#: src/slic3r/GUI/GCodeViewer.cpp:2672 src/slic3r/GUI/GCodeViewer.cpp:2675 +#: src/slic3r/GUI/GUI_Preview.cpp:1024 msgid "Wipe" -msgstr "" +msgstr "Очистка" -#: src/slic3r/GUI/GCodeViewer.cpp:2695 src/slic3r/GUI/GUI_Preview.cpp:262 -#: src/slic3r/GUI/GUI_Preview.cpp:278 +#: src/slic3r/GUI/GCodeViewer.cpp:2706 src/slic3r/GUI/GUI_Preview.cpp:248 +#: src/slic3r/GUI/GUI_Preview.cpp:262 msgid "Options" -msgstr "" +msgstr "Опции" -#: src/slic3r/GUI/GCodeViewer.cpp:2698 src/slic3r/GUI/GUI_Preview.cpp:980 +#: src/slic3r/GUI/GCodeViewer.cpp:2709 src/slic3r/GUI/GUI_Preview.cpp:1025 msgid "Retractions" msgstr "Ретракт" -#: src/slic3r/GUI/GCodeViewer.cpp:2699 src/slic3r/GUI/GUI_Preview.cpp:981 +#: src/slic3r/GUI/GCodeViewer.cpp:2710 src/slic3r/GUI/GUI_Preview.cpp:1026 msgid "Deretractions" -msgstr "" +msgstr "Подача (выдавливание)" -#: src/slic3r/GUI/GCodeViewer.cpp:2700 src/slic3r/GUI/GUI_Preview.cpp:982 +#: src/slic3r/GUI/GCodeViewer.cpp:2711 src/slic3r/GUI/GUI_Preview.cpp:1027 msgid "Tool changes" -msgstr "" +msgstr "Смена инструмента" -#: src/slic3r/GUI/GCodeViewer.cpp:2701 src/slic3r/GUI/GUI_Preview.cpp:983 +#: src/slic3r/GUI/GCodeViewer.cpp:2712 src/slic3r/GUI/GUI_Preview.cpp:1028 msgid "Color changes" -msgstr "" +msgstr "Смена цвета" -#: src/slic3r/GUI/GCodeViewer.cpp:2702 src/slic3r/GUI/GUI_Preview.cpp:984 +#: src/slic3r/GUI/GCodeViewer.cpp:2713 src/slic3r/GUI/GUI_Preview.cpp:1029 msgid "Print pauses" -msgstr "" +msgstr "Паузы печати" -#: src/slic3r/GUI/GCodeViewer.cpp:2703 src/slic3r/GUI/GUI_Preview.cpp:985 +#: src/slic3r/GUI/GCodeViewer.cpp:2714 src/slic3r/GUI/GUI_Preview.cpp:1030 msgid "Custom G-codes" -msgstr "" +msgstr "Пользовательский G-код" -#: src/slic3r/GUI/GCodeViewer.cpp:2714 src/slic3r/GUI/GCodeViewer.cpp:2738 -#: src/slic3r/GUI/Plater.cpp:697 src/libslic3r/PrintConfig.cpp:113 +#: src/slic3r/GUI/GCodeViewer.cpp:2725 src/slic3r/GUI/GCodeViewer.cpp:2749 +#: src/slic3r/GUI/Plater.cpp:697 src/libslic3r/PrintConfig.cpp:117 msgid "Printer" -msgstr "Принтер" +msgstr "Профиль принтера" -#: src/slic3r/GUI/GCodeViewer.cpp:2716 src/slic3r/GUI/GCodeViewer.cpp:2743 +#: src/slic3r/GUI/GCodeViewer.cpp:2727 src/slic3r/GUI/GCodeViewer.cpp:2754 #: src/slic3r/GUI/Plater.cpp:693 msgid "Print settings" -msgstr "Настройки печати" +msgstr "Профиль печати" -#: src/slic3r/GUI/GCodeViewer.cpp:2719 src/slic3r/GUI/GCodeViewer.cpp:2749 -#: src/slic3r/GUI/Plater.cpp:694 src/slic3r/GUI/Tab.cpp:1795 -#: src/slic3r/GUI/Tab.cpp:1796 +#: src/slic3r/GUI/GCodeViewer.cpp:2730 src/slic3r/GUI/GCodeViewer.cpp:2760 +#: src/slic3r/GUI/Plater.cpp:694 src/slic3r/GUI/Tab.cpp:1794 +#: src/slic3r/GUI/Tab.cpp:1795 msgid "Filament" -msgstr "Пруток" +msgstr "Профиль прутка" -#: src/slic3r/GUI/GCodeViewer.cpp:2774 src/slic3r/GUI/GCodeViewer.cpp:2779 +#: src/slic3r/GUI/GCodeViewer.cpp:2785 src/slic3r/GUI/GCodeViewer.cpp:2790 #: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1135 #: src/slic3r/GUI/Plater.cpp:1220 msgid "Estimated printing time" msgstr "Расчётное время печати" -#: src/slic3r/GUI/GCodeViewer.cpp:2774 +#: src/slic3r/GUI/GCodeViewer.cpp:2785 msgid "Normal mode" msgstr "Нормальный режим" -#: src/slic3r/GUI/GCodeViewer.cpp:2779 +#: src/slic3r/GUI/GCodeViewer.cpp:2790 msgid "Stealth mode" msgstr "Тихий режим" -#: src/slic3r/GUI/GCodeViewer.cpp:2806 +#: src/slic3r/GUI/GCodeViewer.cpp:2817 msgid "Show stealth mode" -msgstr "Показывать нормальный режим" +msgstr "Показать в тихом режиме" -#: src/slic3r/GUI/GCodeViewer.cpp:2810 +#: src/slic3r/GUI/GCodeViewer.cpp:2821 msgid "Show normal mode" -msgstr "Показывать тихий режим" +msgstr "Показать в нормальном режиме" -#: src/slic3r/GUI/GLCanvas3D.cpp:228 src/slic3r/GUI/GLCanvas3D.cpp:4470 +#: src/slic3r/GUI/GLCanvas3D.cpp:236 src/slic3r/GUI/GLCanvas3D.cpp:4610 msgid "Variable layer height" -msgstr "Переменная высота слоя" +msgstr "Переменная высота слоёв" -#: src/slic3r/GUI/GLCanvas3D.cpp:230 +#: src/slic3r/GUI/GLCanvas3D.cpp:238 msgid "Left mouse button:" -msgstr "Левая кнопку мыши:" +msgstr "Левая кнопка мыши:" -#: src/slic3r/GUI/GLCanvas3D.cpp:232 +#: src/slic3r/GUI/GLCanvas3D.cpp:240 msgid "Add detail" -msgstr "" +msgstr "Увеличить детализацию" -#: src/slic3r/GUI/GLCanvas3D.cpp:234 +#: src/slic3r/GUI/GLCanvas3D.cpp:242 msgid "Right mouse button:" msgstr "Правая кнопка мыши:" -#: src/slic3r/GUI/GLCanvas3D.cpp:236 +#: src/slic3r/GUI/GLCanvas3D.cpp:244 msgid "Remove detail" -msgstr "Убрать подробности" +msgstr "Уменьшить детализацию" -#: src/slic3r/GUI/GLCanvas3D.cpp:238 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Shift + Left mouse button:" -msgstr "" +msgstr "Shift + Левая кнопка мыши:" -#: src/slic3r/GUI/GLCanvas3D.cpp:240 +#: src/slic3r/GUI/GLCanvas3D.cpp:248 msgid "Reset to base" -msgstr "" +msgstr "Сброс до базовой высоты слоя" -#: src/slic3r/GUI/GLCanvas3D.cpp:242 +#: src/slic3r/GUI/GLCanvas3D.cpp:250 msgid "Shift + Right mouse button:" -msgstr "" +msgstr "Shift + Правая кнопка мыши:" -#: src/slic3r/GUI/GLCanvas3D.cpp:244 +#: src/slic3r/GUI/GLCanvas3D.cpp:252 msgid "Smoothing" msgstr "Сглаживание" -#: src/slic3r/GUI/GLCanvas3D.cpp:246 +#: src/slic3r/GUI/GLCanvas3D.cpp:254 msgid "Mouse wheel:" msgstr "Колесо мыши:" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:256 msgid "Increase/decrease edit area" -msgstr "" +msgstr "Увелич. /уменьш. области редактирования" -#: src/slic3r/GUI/GLCanvas3D.cpp:251 +#: src/slic3r/GUI/GLCanvas3D.cpp:259 msgid "Adaptive" -msgstr "Адаптивный" +msgstr "Адаптивная" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:265 msgid "Quality / Speed" msgstr "Качество / Скорость" -#: src/slic3r/GUI/GLCanvas3D.cpp:260 +#: src/slic3r/GUI/GLCanvas3D.cpp:268 msgid "Higher print quality versus higher print speed." -msgstr "" +msgstr "Выбор между высоким качеством печати или высокой скоростью." -#: src/slic3r/GUI/GLCanvas3D.cpp:271 +#: src/slic3r/GUI/GLCanvas3D.cpp:279 msgid "Smooth" -msgstr "" +msgstr "Сгладить" -#: src/slic3r/GUI/GLCanvas3D.cpp:277 src/libslic3r/PrintConfig.cpp:556 +#: src/slic3r/GUI/GLCanvas3D.cpp:285 src/libslic3r/PrintConfig.cpp:571 msgid "Radius" msgstr "Радиус" -#: src/slic3r/GUI/GLCanvas3D.cpp:287 +#: src/slic3r/GUI/GLCanvas3D.cpp:295 msgid "Keep min" -msgstr "" +msgstr "Сохранять минимумы" -#: src/slic3r/GUI/GLCanvas3D.cpp:296 src/slic3r/GUI/GLCanvas3D.cpp:3908 +#: src/slic3r/GUI/GLCanvas3D.cpp:304 src/slic3r/GUI/GLCanvas3D.cpp:4050 msgid "Reset" msgstr "Сброс" -#: src/slic3r/GUI/GLCanvas3D.cpp:558 +#: src/slic3r/GUI/GLCanvas3D.cpp:566 msgid "Variable layer height - Manual edit" -msgstr "Переменная высота слоёв - Ручная правка" +msgstr "Переменная высота слоёв - Ручное редактирование" -#: src/slic3r/GUI/GLCanvas3D.cpp:626 +#: src/slic3r/GUI/GLCanvas3D.cpp:634 msgid "An object outside the print area was detected." -msgstr "" +msgstr "Обнаружена модель вне области печати." -#: src/slic3r/GUI/GLCanvas3D.cpp:627 +#: src/slic3r/GUI/GLCanvas3D.cpp:635 msgid "A toolpath outside the print area was detected." -msgstr "" +msgstr "Траектория движения инструмента выходит за пределы области печати." -#: src/slic3r/GUI/GLCanvas3D.cpp:628 +#: src/slic3r/GUI/GLCanvas3D.cpp:636 msgid "SLA supports outside the print area were detected." -msgstr "" +msgstr "Обнаружены SLA поддержки вне области печати." -#: src/slic3r/GUI/GLCanvas3D.cpp:629 +#: src/slic3r/GUI/GLCanvas3D.cpp:637 msgid "Some objects are not visible." -msgstr "" +msgstr "Некоторые модели не отображаются." -#: src/slic3r/GUI/GLCanvas3D.cpp:631 +#: src/slic3r/GUI/GLCanvas3D.cpp:639 msgid "" "An object outside the print area was detected.\n" "Resolve the current problem to continue slicing." msgstr "" +"Обнаружена модель вне области печати. \n" +"Решите текущую проблему, чтобы продолжить нарезку." -#: src/slic3r/GUI/GLCanvas3D.cpp:941 +#: src/slic3r/GUI/GLCanvas3D.cpp:949 msgid "Seq." -msgstr "" +msgstr "Очерёдность печати" -#: src/slic3r/GUI/GLCanvas3D.cpp:1416 +#: src/slic3r/GUI/GLCanvas3D.cpp:1455 msgid "Variable layer height - Reset" -msgstr "Переменная высота слоя - Сброс" +msgstr "Переменная высота слоёв - Сброс" -#: src/slic3r/GUI/GLCanvas3D.cpp:1424 +#: src/slic3r/GUI/GLCanvas3D.cpp:1463 msgid "Variable layer height - Adaptive" -msgstr "Переменная высота слоя - Адаптивная" +msgstr "Переменная высота слоёв - Адаптивная" -#: src/slic3r/GUI/GLCanvas3D.cpp:1432 +#: src/slic3r/GUI/GLCanvas3D.cpp:1471 msgid "Variable layer height - Smooth all" -msgstr "Переменная высота слоя - Сглаживание всех" +msgstr "Переменная высота слоёв - Сгладить всё" -#: src/slic3r/GUI/GLCanvas3D.cpp:1831 +#: src/slic3r/GUI/GLCanvas3D.cpp:1876 msgid "Mirror Object" -msgstr "Отразить обект" +msgstr "Отражение модели" -#: src/slic3r/GUI/GLCanvas3D.cpp:2682 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520 +#: src/slic3r/GUI/GLCanvas3D.cpp:2746 src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520 msgid "Gizmo-Move" -msgstr "" +msgstr "Гизмо перемещения" -#: src/slic3r/GUI/GLCanvas3D.cpp:2760 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522 +#: src/slic3r/GUI/GLCanvas3D.cpp:2832 src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522 msgid "Gizmo-Rotate" -msgstr "Повернуть" +msgstr "Гизмо поворота" -#: src/slic3r/GUI/GLCanvas3D.cpp:3275 +#: src/slic3r/GUI/GLCanvas3D.cpp:3388 msgid "Move Object" -msgstr "Переместить объект" +msgstr "Перемещение модели" -#: src/slic3r/GUI/GLCanvas3D.cpp:3744 src/slic3r/GUI/GLCanvas3D.cpp:4431 +#: src/slic3r/GUI/GLCanvas3D.cpp:3858 src/slic3r/GUI/GLCanvas3D.cpp:4571 msgid "Switch to Settings" -msgstr "" +msgstr "Переключение настроек" -#: src/slic3r/GUI/GLCanvas3D.cpp:3745 src/slic3r/GUI/GLCanvas3D.cpp:4431 +#: src/slic3r/GUI/GLCanvas3D.cpp:3859 src/slic3r/GUI/GLCanvas3D.cpp:4571 msgid "Print Settings Tab" -msgstr "" +msgstr "Вкладка настройки печати" -#: src/slic3r/GUI/GLCanvas3D.cpp:3746 src/slic3r/GUI/GLCanvas3D.cpp:4432 +#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572 msgid "Filament Settings Tab" -msgstr "" +msgstr "Вкладка настройки прутка" -#: src/slic3r/GUI/GLCanvas3D.cpp:3746 src/slic3r/GUI/GLCanvas3D.cpp:4432 +#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572 msgid "Material Settings Tab" -msgstr "" +msgstr "Вкладка настройки материала" -#: src/slic3r/GUI/GLCanvas3D.cpp:3747 src/slic3r/GUI/GLCanvas3D.cpp:4433 +#: src/slic3r/GUI/GLCanvas3D.cpp:3861 src/slic3r/GUI/GLCanvas3D.cpp:4573 msgid "Printer Settings Tab" -msgstr "" +msgstr "Вкладка настройки принтера" -#: src/slic3r/GUI/GLCanvas3D.cpp:3795 +#: src/slic3r/GUI/GLCanvas3D.cpp:3909 msgid "Undo History" -msgstr "Откатить по истории" +msgstr "История отмен" -#: src/slic3r/GUI/GLCanvas3D.cpp:3795 +#: src/slic3r/GUI/GLCanvas3D.cpp:3909 msgid "Redo History" -msgstr "Вернуть по истории" +msgstr "История повторов" -#: src/slic3r/GUI/GLCanvas3D.cpp:3816 +#: src/slic3r/GUI/GLCanvas3D.cpp:3930 #, c-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Отмена %1$d действия" +msgstr[1] "Отмена %1$d действий" +msgstr[2] "Отмена %1$d действий" -#: src/slic3r/GUI/GLCanvas3D.cpp:3816 +#: src/slic3r/GUI/GLCanvas3D.cpp:3930 #, c-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Повтор %1$d действия" +msgstr[1] "Повтор %1$d действий" +msgstr[2] "Повтор %1$d действий" -#: src/slic3r/GUI/GLCanvas3D.cpp:3836 src/slic3r/GUI/GLCanvas3D.cpp:4449 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Search.cpp:351 +#: src/slic3r/GUI/GLCanvas3D.cpp:3950 src/slic3r/GUI/GLCanvas3D.cpp:4589 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 src/slic3r/GUI/Search.cpp:351 msgid "Search" msgstr "Поиск" -#: src/slic3r/GUI/GLCanvas3D.cpp:3850 src/slic3r/GUI/GLCanvas3D.cpp:3858 +#: src/slic3r/GUI/GLCanvas3D.cpp:3964 src/slic3r/GUI/GLCanvas3D.cpp:3972 #: src/slic3r/GUI/Search.cpp:358 msgid "Enter a search term" -msgstr "" +msgstr "Ввод поискового запроса" -#: src/slic3r/GUI/GLCanvas3D.cpp:3889 +#: src/slic3r/GUI/GLCanvas3D.cpp:4003 msgid "Arrange options" -msgstr "" +msgstr "Параметры расстановки" -#: src/slic3r/GUI/GLCanvas3D.cpp:3896 -msgid "Gap size" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4033 +msgid "Press %1%left mouse button to enter the exact value" +msgstr "Нажмите %1% левую кнопку мыши для ввода точного значения" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4035 +msgid "Spacing" +msgstr "Расстояние" -#: src/slic3r/GUI/GLCanvas3D.cpp:3901 +#: src/slic3r/GUI/GLCanvas3D.cpp:4042 msgid "Enable rotations (slow)" -msgstr "" +msgstr "Разрешить вращение (замедление)" -#: src/slic3r/GUI/GLCanvas3D.cpp:3920 src/slic3r/GUI/GLCanvas3D.cpp:4341 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 src/slic3r/GUI/Plater.cpp:1645 +#: src/slic3r/GUI/GLCanvas3D.cpp:4060 src/slic3r/GUI/GLCanvas3D.cpp:4481 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Plater.cpp:1648 msgid "Arrange" msgstr "Расставить" -#: src/slic3r/GUI/GLCanvas3D.cpp:4315 +#: src/slic3r/GUI/GLCanvas3D.cpp:4455 msgid "Add..." msgstr "Добавить..." -#: src/slic3r/GUI/GLCanvas3D.cpp:4323 src/slic3r/GUI/GUI_ObjectList.cpp:1846 -#: src/slic3r/GUI/Plater.cpp:3921 src/slic3r/GUI/Plater.cpp:3945 -#: src/slic3r/GUI/Tab.cpp:3474 +#: src/slic3r/GUI/GLCanvas3D.cpp:4463 src/slic3r/GUI/GUI_ObjectList.cpp:1878 +#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022 +#: src/slic3r/GUI/Tab.cpp:3484 msgid "Delete" msgstr "Удалить" -#: src/slic3r/GUI/GLCanvas3D.cpp:4332 src/slic3r/GUI/KBShortcutsDialog.cpp:116 -#: src/slic3r/GUI/Plater.cpp:5025 +#: src/slic3r/GUI/GLCanvas3D.cpp:4472 src/slic3r/GUI/KBShortcutsDialog.cpp:88 +#: src/slic3r/GUI/Plater.cpp:5107 msgid "Delete all" msgstr "Удалить всё" -#: src/slic3r/GUI/GLCanvas3D.cpp:4341 src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/GLCanvas3D.cpp:4481 src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Arrange selection" -msgstr "Расставить выделенное" +msgstr "Расставить только выбранные модели" -#: src/slic3r/GUI/GLCanvas3D.cpp:4341 +#: src/slic3r/GUI/GLCanvas3D.cpp:4481 msgid "Click right mouse button to show arrangement options" -msgstr "" +msgstr "Правая кнопку мыши, чтобы отобразить параметры расстановки" -#: src/slic3r/GUI/GLCanvas3D.cpp:4363 +#: src/slic3r/GUI/GLCanvas3D.cpp:4503 msgid "Copy" msgstr "Копировать" -#: src/slic3r/GUI/GLCanvas3D.cpp:4372 +#: src/slic3r/GUI/GLCanvas3D.cpp:4512 msgid "Paste" msgstr "Вставить" -#: src/slic3r/GUI/GLCanvas3D.cpp:4384 src/slic3r/GUI/Plater.cpp:3780 -#: src/slic3r/GUI/Plater.cpp:3792 src/slic3r/GUI/Plater.cpp:3930 +#: src/slic3r/GUI/GLCanvas3D.cpp:4524 src/slic3r/GUI/Plater.cpp:3857 +#: src/slic3r/GUI/Plater.cpp:3869 src/slic3r/GUI/Plater.cpp:4007 msgid "Add instance" -msgstr "Добавить экземпляр" +msgstr "Добавить копию" -#: src/slic3r/GUI/GLCanvas3D.cpp:4395 src/slic3r/GUI/Plater.cpp:3932 +#: src/slic3r/GUI/GLCanvas3D.cpp:4535 src/slic3r/GUI/Plater.cpp:4009 msgid "Remove instance" -msgstr "Удалить экземпляр" +msgstr "Удалить копию" -#: src/slic3r/GUI/GLCanvas3D.cpp:4408 +#: src/slic3r/GUI/GLCanvas3D.cpp:4548 msgid "Split to objects" -msgstr "Разбить на объекты" +msgstr "Разделить на модели" -#: src/slic3r/GUI/GLCanvas3D.cpp:4418 src/slic3r/GUI/GUI_ObjectList.cpp:1618 +#: src/slic3r/GUI/GLCanvas3D.cpp:4558 src/slic3r/GUI/GUI_ObjectList.cpp:1650 msgid "Split to parts" -msgstr "Разбить на части" +msgstr "Разделить на части" -#: src/slic3r/GUI/GLCanvas3D.cpp:4520 src/slic3r/GUI/KBShortcutsDialog.cpp:117 -#: src/slic3r/GUI/MainFrame.cpp:1129 +#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Undo" -msgstr "Отменить" +msgstr "Отмена действия" -#: src/slic3r/GUI/GLCanvas3D.cpp:4520 src/slic3r/GUI/GLCanvas3D.cpp:4559 +#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/GLCanvas3D.cpp:4699 msgid "Click right mouse button to open/close History" -msgstr "Щелчок по правой кнопке мыши открывает/закрывает историю действий" +msgstr "Правая кнопку мыши, чтобы показать/скрыть историю действий" -#: src/slic3r/GUI/GLCanvas3D.cpp:4543 +#: src/slic3r/GUI/GLCanvas3D.cpp:4683 msgid "Next Undo action: %1%" -msgstr "Следующее отменяемое действие: %1%" +msgstr "Следующее действие отмены: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:4559 src/slic3r/GUI/KBShortcutsDialog.cpp:118 -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:90 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Redo" -msgstr "Вернуть" +msgstr "Повтор действия" -#: src/slic3r/GUI/GLCanvas3D.cpp:4581 +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 msgid "Next Redo action: %1%" -msgstr "Следующее возвращаемое действие: %1%" +msgstr "Следующее действие повтора: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:6203 +#: src/slic3r/GUI/GLCanvas3D.cpp:6345 msgid "Selection-Add from rectangle" -msgstr "" +msgstr "Выбор\\Добавление из прямоугольника" -#: src/slic3r/GUI/GLCanvas3D.cpp:6222 +#: src/slic3r/GUI/GLCanvas3D.cpp:6364 msgid "Selection-Remove from rectangle" -msgstr "" +msgstr "Выбор\\Удаление из прямоугольника" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:146 src/libslic3r/PrintConfig.cpp:3655 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:54 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 +#: src/libslic3r/PrintConfig.cpp:3690 msgid "Cut" -msgstr "Обрезать" +msgstr "Разрезать" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 +msgid "in" +msgstr "дюйм" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:185 msgid "Keep upper part" msgstr "Оставить верхнюю часть" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:171 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:186 msgid "Keep lower part" msgstr "Оставить нижнюю часть" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:172 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:187 msgid "Rotate lower part upwards" -msgstr "Повернуть нижней частью вверх" +msgstr "Развернуть нижнюю часть" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:177 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:192 msgid "Perform cut" -msgstr "Выполнить обрезку" +msgstr "Выполнить разрез" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 msgid "Paint-on supports" -msgstr "" +msgstr "Рисование поддержек" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 msgid "Clipping of view" -msgstr "" +msgstr "Отсечение вида" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 msgid "Reset direction" -msgstr "Сбросить направление" +msgstr "Сброс направления" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:27 msgid "Brush size" -msgstr "" +msgstr "Размер кисти" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28 msgid "Brush shape" -msgstr "" +msgstr "Форма кисти" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:29 msgid "Left mouse button" -msgstr "" +msgstr "Левая кнопка мыши" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 msgid "Enforce supports" -msgstr "" +msgstr "Принудительная поддержка" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 msgid "Right mouse button" -msgstr "" +msgstr "Правая кнопка мыши" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:373 msgid "Block supports" -msgstr "" +msgstr "Блокировка поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 msgid "Shift + Left mouse button" -msgstr "" +msgstr "Shift + Левая кнопка мыши" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:368 #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:378 msgid "Remove selection" -msgstr "" +msgstr "Удалить выделенное" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 msgid "Remove all selection" -msgstr "" +msgstr "Удалить всё выделенное" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 msgid "Circle" -msgstr "" +msgstr "Круг" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1563 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 src/slic3r/GUI/GUI_ObjectList.cpp:1595 msgid "Sphere" msgstr "Сфера" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:129 msgid "Autoset by angle" -msgstr "" +msgstr "Автоустановка по углу" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118 msgid "Reset selection" -msgstr "" +msgstr "Сброс выбранного" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:160 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 msgid "Alt + Mouse wheel" -msgstr "" +msgstr "Alt + Колесо мыши" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:178 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:159 msgid "Paints all facets inside, regardless of their orientation." -msgstr "" +msgstr "Закрашивает все грани внутри, независимо от их ориентации." #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:192 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:173 msgid "Ignores facets facing away from the camera." -msgstr "" +msgstr "Игнорирует грани, обращённые в сторону от камеры." #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:203 msgid "Ctrl + Mouse wheel" -msgstr "" +msgstr "Ctrl + Колесо мыши" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233 msgid "Autoset custom supports" -msgstr "" +msgstr "Автоустановка пользовательских поддержек ???" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235 msgid "Threshold:" -msgstr "" +msgstr "Порог:" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 msgid "Enforce" -msgstr "" +msgstr "Принудительная" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245 msgid "Block" -msgstr "" +msgstr "Блокировка" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:295 msgid "Block supports by angle" -msgstr "" +msgstr "Блокировка поддержек по углу" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:296 msgid "Add supports by angle" -msgstr "" +msgstr "Добавление поддержек по углу" #: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 msgid "Place on face" -msgstr "Положить гранью" +msgstr "Поверхностью на стол" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 msgid "Hollow this object" -msgstr "" +msgstr "Пустотелая модель" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 msgid "Preview hollowed and drilled model" -msgstr "" +msgstr "Предпросмотр полости и отверстий в модели" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 msgid "Offset" msgstr "Смещение" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 src/slic3r/GUI/Jobs/SLAImportJob.cpp:56 msgid "Quality" msgstr "Качество" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 src/libslic3r/PrintConfig.cpp:3183 msgid "Closing distance" -msgstr "Расстояние закрытия" +msgstr "Расстояние смыкания полости" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 msgid "Hole diameter" @@ -2252,7 +2290,7 @@ msgstr "Диаметр отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 msgid "Hole depth" -msgstr "" +msgstr "Глубина отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 msgid "Remove selected holes" @@ -2264,73 +2302,71 @@ msgstr "Удалить все отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 msgid "Show supports" -msgstr "Показать поддержки" +msgstr "Отображать поддержку" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308 msgid "Add drainage hole" -msgstr "" +msgstr "Добавление отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424 msgid "Delete drainage hole" -msgstr "Удалить дренажное отверстие" +msgstr "Удаление отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624 msgid "Hollowing parameter change" -msgstr "" +msgstr "Изменение параметров пустотелой модели" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693 msgid "Change drainage hole diameter" -msgstr "Изменить диаметр дренажного отверстия" +msgstr "Изменение диаметра отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785 msgid "Hollow and drill" -msgstr "" +msgstr "Пустотелая модель и отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835 msgid "Move drainage hole" -msgstr "" +msgstr "Перемещение отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64 msgid "Move" -msgstr "Переместить" +msgstr "Перемещение" #: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:461 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/libslic3r/PrintConfig.cpp:3704 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 src/libslic3r/PrintConfig.cpp:3739 msgid "Rotate" -msgstr "Повернуть" +msgstr "Поворот" #: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 src/libslic3r/PrintConfig.cpp:3754 msgid "Scale" -msgstr "Масштабировать" +msgstr "Масштаб " #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30 #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381 msgid "Enforce seam" -msgstr "" +msgstr "Принудительный шов" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383 msgid "Block seam" -msgstr "" +msgstr "Блокировка шва" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46 msgid "Seam painting" -msgstr "" +msgstr "Рисование шва" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 msgid "Head diameter" -msgstr "Диаметр головы" +msgstr "Диаметр носика поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 msgid "Lock supports under new islands" -msgstr "" +msgstr "Блокировка поддержки под новые острова" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 @@ -2344,30 +2380,29 @@ msgstr "Удалить все точки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 msgid "Apply changes" -msgstr "Выполнить изменения" +msgstr "Применить изменения" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 msgid "Discard changes" -msgstr "Отбросить изменения" +msgstr "Отменить изменения" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 msgid "Minimal points distance" -msgstr "" +msgstr "Мин. расстояние м/у точками" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 src/libslic3r/PrintConfig.cpp:3013 msgid "Support points density" -msgstr "Плотность опорных точек" +msgstr "Плотность точек поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 msgid "Auto-generate points" -msgstr "Автоматическая генерация точек" +msgstr "Сгенерировать точки автоматически" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 msgid "Manual editing" -msgstr "Правка вручную" +msgstr "Ручное редактирование" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374 msgid "Add support point" @@ -2379,23 +2414,23 @@ msgstr "Удалить точку поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694 msgid "Change point head diameter" -msgstr "" +msgstr "Изменение диаметра носика поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762 msgid "Support parameter change" -msgstr "" +msgstr "Изменение параметра поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 msgid "SLA Support Points" -msgstr "Точки поддержек SLA" +msgstr "Точки SLA поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 msgid "SLA gizmo turned on" -msgstr "" +msgstr "Гизмо SLA включено" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911 msgid "Do you want to save your manually edited support points?" -msgstr "" +msgstr "Сохранить отредактированные вручную точки поддержки?" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912 msgid "Save changes?" @@ -2403,48 +2438,49 @@ msgstr "Сохранить изменения?" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924 msgid "SLA gizmo turned off" -msgstr "" +msgstr "Гизмо SLA отключено" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955 msgid "Move support point" -msgstr "Переместить точку поддержки" +msgstr "Перемещение точки поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048 msgid "Support points edit" -msgstr "Правка точек поддержки" +msgstr "Редактирование точек поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127 msgid "Autogeneration will erase all manually edited points." -msgstr "" +msgstr "Автогенерация сотрёт все опорные точки, отредактированные вручную." #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128 msgid "Are you sure you want to do it?" -msgstr "Вы уверены, что хотите сделать это?" +msgstr "Вы уверены, что хотите это сделать?" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256 #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:557 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:581 -#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:581 src/slic3r/GUI/WipeTowerDialog.cpp:45 +#: src/slic3r/GUI/WipeTowerDialog.cpp:366 msgid "Warning" msgstr "Предупреждение" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134 msgid "Autogenerate support points" -msgstr "Автоматическая генерация точек поддержки" +msgstr "Автогенерация точек поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181 msgid "SLA gizmo keyboard shortcuts" -msgstr "" +msgstr "Горячие клавиши \"Гизмо SLA\"" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "" +"Примечание: некоторые сочетания клавиш работают только в режиме (не)редактирования." #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 msgid "Left click" -msgstr "Щелчок левой клавишей" +msgstr "Левая кнопка мыши" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 msgid "Add point" @@ -2452,37 +2488,37 @@ msgstr "Добавить точку" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 msgid "Right click" -msgstr "Щелчок правой клавишей" +msgstr "Правая кнопка мыши" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 msgid "Remove point" -msgstr "Убрать точку" +msgstr "Удалить точку" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 msgid "Drag" -msgstr "Перетащить" +msgstr "Перетащить мышь" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 msgid "Move point" -msgstr "Переместить точку" +msgstr "Передвинуть точку" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 msgid "Add point to selection" -msgstr "Добавить точку к выделению" +msgstr "Добавить точку к выбранным точкам" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 msgid "Remove point from selection" -msgstr "Удалить точку из выделения" +msgstr "Удалить точку из выбранных точек" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 msgid "Select by rectangle" -msgstr "Выбрать прямоугольником" +msgstr "Выбрать точки прямоугольником" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 msgid "Deselect by rectangle" -msgstr "Удалить выбор прямоугольником" +msgstr "Убрать выбранные точки прямоугольником" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 msgid "Select all points" @@ -2494,11 +2530,11 @@ msgstr "Колесо мыши" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 msgid "Move clipping plane" -msgstr "" +msgstr "Переместить плоскость отсечения" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 msgid "Reset clipping plane" -msgstr "" +msgstr "Сброс плоскости отсечения" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 msgid "Switch to editing mode" @@ -2506,109 +2542,134 @@ msgstr "Переключиться в режим редактирования" #: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521 msgid "Gizmo-Scale" -msgstr "Масштабировать" +msgstr "Гизмо масштаба" #: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:630 msgid "Gizmo-Place on Face" -msgstr "Поместить на грань" +msgstr "Гизмо поверхностью на стол" #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39 msgid "Entering Paint-on supports" -msgstr "" +msgstr "Войти в режим рисования поддержек" #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40 msgid "Entering Seam painting" -msgstr "" +msgstr "Войти в режим рисования шва" #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47 msgid "Leaving Seam painting" -msgstr "" +msgstr "Выйти из режима рисования шва" #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48 msgid "Leaving Paint-on supports" -msgstr "" +msgstr "Выйти из режима рисования поддержек" #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371 msgid "Add supports" -msgstr "" +msgstr "Добавление поддержек" -#: src/slic3r/GUI/GUI_App.cpp:235 +#: src/slic3r/GUI/GUI_App.cpp:239 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." -msgstr "" +msgstr "is based on Slic3r by Alessandro Ranellucci and the RepRap community." -#: src/slic3r/GUI/GUI_App.cpp:237 +#: src/slic3r/GUI/GUI_App.cpp:241 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." msgstr "" +"Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " +"Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." -#: src/slic3r/GUI/GUI_App.cpp:238 +#: src/slic3r/GUI/GUI_App.cpp:242 msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles" -msgstr "" +msgstr "Artwork model by Nora Al-Badri and Jan Nikolai Nelles" -#: src/slic3r/GUI/GUI_App.cpp:378 +#: src/slic3r/GUI/GUI_App.cpp:382 msgid "" -"Starting with %1% 2.3, configuration directory on Linux has changed " -"(according to XDG Base Directory Specification) to \n" +"Starting with %1% 2.3, configuration directory on Linux has changed (according to " +"XDG Base Directory Specification) to \n" "%2%.\n" "\n" -"This directory did not exist yet (maybe you run the new version for the " -"first time).\n" +"This directory did not exist yet (maybe you run the new version for the first " +"time).\n" "However, an old %1% configuration directory was detected in \n" "%3%.\n" "\n" -"Consider moving the contents of the old directory to the new location in " -"order to access your profiles, etc.\n" -"Note that if you decide to downgrade %1% in future, it will use the old " -"location again.\n" +"Consider moving the contents of the old directory to the new location in order to " +"access your profiles, etc.\n" +"Note that if you decide to downgrade %1% in future, it will use the old location " +"again.\n" "\n" "What do you want to do now?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:386 +#: src/slic3r/GUI/GUI_App.cpp:390 #, c-format msgid "%s - BREAKING CHANGE" -msgstr "" +msgstr "%s - КРИТИЧЕСКОЕ ИЗМЕНЕНИЕ" -#: src/slic3r/GUI/GUI_App.cpp:388 +#: src/slic3r/GUI/GUI_App.cpp:392 msgid "Quit, I will move my data now" -msgstr "" +msgstr "Выйти и перенести свои данные" -#: src/slic3r/GUI/GUI_App.cpp:388 +#: src/slic3r/GUI/GUI_App.cpp:392 msgid "Start the application" -msgstr "" +msgstr "Запустить приложение" -#: src/slic3r/GUI/GUI_App.cpp:576 +#: src/slic3r/GUI/GUI_App.cpp:580 #, 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" +"%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 произошла с ошибкой. Скорее всего, это было вызвано нехваткой " +"памяти. Если вы уверены, что в вашей системе достаточно оперативной памяти и " +"произошла эта ошибка, сообщите нам об этом.\n" +"\n" +"Приложение будет закрыто." -#: src/slic3r/GUI/GUI_App.cpp:579 +#: src/slic3r/GUI/GUI_App.cpp:583 msgid "Fatal error" msgstr "Критическая ошибка" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:587 +msgid "" +"PrusaSlicer has encountered a localization error. Please report to PrusaSlicer " +"team, what language was active and in which scenario this issue happened. Thank " +"you.\n" +"\n" +"The application will now terminate." +msgstr "" +"PrusaSlicer обнаружил непредвиденную ошибку в локализации приложения. Пожалуйста, " +"сообщите команде PrusaSlicer, какой язык был активен и при каком сценарии произошла " +"эта ошибка.\n" +"Теперь приложение будет закрыто." + +#: src/slic3r/GUI/GUI_App.cpp:590 +msgid "Critical error" +msgstr "Критическая ошибка" + +#: src/slic3r/GUI/GUI_App.cpp:711 msgid "" -"Error parsing PrusaSlicer config file, it is probably corrupted. Try to " -"manually delete the file to recover from the error. Your user profiles will " -"not be affected." +"Error parsing PrusaSlicer config file, it is probably corrupted. Try to manually " +"delete the file to recover from the error. Your user profiles will not be affected." msgstr "" -"Ошибка при разборе файла настроек PrusaSlicer, вероятно, он повреждён. Чтобы " -"ошибка пропала, попробуйте удалить файл. Это не повлияет на ваши " -"пользовательские профили." +"Ошибка обработки конфигурационного файла PrusaSlicer. Вероятно, он повреждён. \n" +"Попробуйте вручную удалить файл для восстановления после ошибки. Пользовательские " +"профили не будут затронуты." -#: src/slic3r/GUI/GUI_App.cpp:705 +#: src/slic3r/GUI/GUI_App.cpp:717 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." msgstr "" +"Ошибка обработки конфигурационного файла PrusaGCodeViewer. Вероятно, он повреждён. " +"Попробуйте вручную удалить файл для восстановления после ошибки." -#: src/slic3r/GUI/GUI_App.cpp:759 +#: src/slic3r/GUI/GUI_App.cpp:771 #, c-format msgid "" "%s\n" @@ -2617,282 +2678,301 @@ msgstr "" "%s\n" "Хотите продолжить?" -#: src/slic3r/GUI/GUI_App.cpp:761 src/slic3r/GUI/UnsavedChangesDialog.cpp:659 +#: src/slic3r/GUI/GUI_App.cpp:773 src/slic3r/GUI/UnsavedChangesDialog.cpp:665 msgid "Remember my choice" -msgstr "" +msgstr "Запомнить мой выбор" -#: src/slic3r/GUI/GUI_App.cpp:796 +#: src/slic3r/GUI/GUI_App.cpp:808 msgid "Loading configuration" -msgstr "" +msgstr "Загрузка конфигурации" -#: src/slic3r/GUI/GUI_App.cpp:864 +#: src/slic3r/GUI/GUI_App.cpp:876 msgid "Preparing settings tabs" -msgstr "" +msgstr "Подготовка вкладок настроек" -#: src/slic3r/GUI/GUI_App.cpp:1109 -msgid "" -"You have the following presets with saved options for \"Print Host upload\"" +#: src/slic3r/GUI/GUI_App.cpp:1115 +msgid "You have the following presets with saved options for \"Print Host upload\"" msgstr "" +"У вас имеются следующие профили с сохраненными параметрами для загрузки на хост " +"печати" -#: src/slic3r/GUI/GUI_App.cpp:1113 +#: src/slic3r/GUI/GUI_App.cpp:1119 msgid "" -"But since this version of PrusaSlicer we don't show this information in " -"Printer Settings anymore.\n" +"But since this version of PrusaSlicer we don't show this information in Printer " +"Settings anymore.\n" "Settings will be available in physical printers settings." msgstr "" +"Начиная с этой версии PrusaSlicer мы больше не показываем эту информацию в " +"настройках принтера.\n" +"Теперь эти настройки будут доступны в разделе настройки физических принтеров." -#: src/slic3r/GUI/GUI_App.cpp:1115 +#: src/slic3r/GUI/GUI_App.cpp:1121 msgid "" -"By default new Printer devices will be named as \"Printer N\" during its " -"creation.\n" +"By default new Printer devices will be named as \"Printer N\" during its creation.\n" "Note: This name can be changed later from the physical printers settings" msgstr "" +"При создании новых принтеров они будут именоваться как \"Принтер N\".\n" +"Примечание: это имя можно изменить позже в настройках физических принтеров." -#: src/slic3r/GUI/GUI_App.cpp:1118 +#: src/slic3r/GUI/GUI_App.cpp:1124 src/slic3r/GUI/PhysicalPrinterDialog.cpp:626 msgid "Information" -msgstr "" +msgstr "Информация" -#: src/slic3r/GUI/GUI_App.cpp:1131 src/slic3r/GUI/GUI_App.cpp:1142 +#: src/slic3r/GUI/GUI_App.cpp:1137 src/slic3r/GUI/GUI_App.cpp:1148 msgid "Recreating" -msgstr "Пересоздание" +msgstr "Воссоздание" -#: src/slic3r/GUI/GUI_App.cpp:1147 +#: src/slic3r/GUI/GUI_App.cpp:1153 msgid "Loading of current presets" -msgstr "" +msgstr "Загрузка текущих профилей" -#: src/slic3r/GUI/GUI_App.cpp:1152 +#: src/slic3r/GUI/GUI_App.cpp:1158 msgid "Loading of a mode view" -msgstr "" +msgstr "Загрузка режима просмотра" -#: src/slic3r/GUI/GUI_App.cpp:1233 +#: src/slic3r/GUI/GUI_App.cpp:1234 msgid "Choose one file (3MF/AMF):" -msgstr "Выберите файл (3MF/AMF):" +msgstr "Выберите один файл (3MF/AMF):" -#: src/slic3r/GUI/GUI_App.cpp:1245 +#: src/slic3r/GUI/GUI_App.cpp:1246 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Выберите один или несколько файлов (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/GUI_App.cpp:1257 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" -msgstr "" +msgstr "Выберите один файл (GCODE/.GCO/.G/.ngc/NGC):" -#: src/slic3r/GUI/GUI_App.cpp:1268 +#: src/slic3r/GUI/GUI_App.cpp:1269 msgid "Changing of an application language" -msgstr "Изменить язык приложения" +msgstr "Изменение языка приложения" -#: src/slic3r/GUI/GUI_App.cpp:1330 +#: src/slic3r/GUI/GUI_App.cpp:1392 msgid "Select the language" msgstr "Выбор языка" -#: src/slic3r/GUI/GUI_App.cpp:1330 +#: src/slic3r/GUI/GUI_App.cpp:1392 msgid "Language" msgstr "Язык" -#: src/slic3r/GUI/GUI_App.cpp:1460 +#: src/slic3r/GUI/GUI_App.cpp:1541 msgid "modified" msgstr "изменено" -#: src/slic3r/GUI/GUI_App.cpp:1509 +#: src/slic3r/GUI/GUI_App.cpp:1590 #, c-format msgid "Run %s" -msgstr "Запустите %s" +msgstr "Запустить %s" -#: src/slic3r/GUI/GUI_App.cpp:1513 +#: src/slic3r/GUI/GUI_App.cpp:1594 msgid "&Configuration Snapshots" -msgstr "Снапшоты настроек" +msgstr "&Резервные копии конфигурации (снапшот)" -#: src/slic3r/GUI/GUI_App.cpp:1513 +#: src/slic3r/GUI/GUI_App.cpp:1594 msgid "Inspect / activate configuration snapshots" -msgstr "Посмотреть/вернуть настройки из снапшота" +msgstr "Проверка и активация резервных копий конфигурации" -#: src/slic3r/GUI/GUI_App.cpp:1514 +#: src/slic3r/GUI/GUI_App.cpp:1595 msgid "Take Configuration &Snapshot" -msgstr "Сделать снапшот настроек" +msgstr "Сделать &снапшот" -#: src/slic3r/GUI/GUI_App.cpp:1514 +#: src/slic3r/GUI/GUI_App.cpp:1595 msgid "Capture a configuration snapshot" -msgstr "Сделать снапшот настроек" +msgstr "Сделать резервную копию конфигурации (снапшот)" -#: src/slic3r/GUI/GUI_App.cpp:1515 +#: src/slic3r/GUI/GUI_App.cpp:1596 msgid "Check for updates" -msgstr "Проверить обновления" +msgstr "Проверить наличие обновлений" -#: src/slic3r/GUI/GUI_App.cpp:1515 +#: src/slic3r/GUI/GUI_App.cpp:1596 msgid "Check for configuration updates" -msgstr "Проверить обновления настроек" +msgstr "Проверка наличие обновлений конфигурации" -#: src/slic3r/GUI/GUI_App.cpp:1518 +#: src/slic3r/GUI/GUI_App.cpp:1599 msgid "&Preferences" -msgstr "&Настройки" +msgstr "&Настройки приложения" -#: src/slic3r/GUI/GUI_App.cpp:1524 +#: src/slic3r/GUI/GUI_App.cpp:1605 msgid "Application preferences" msgstr "Настройки приложения" -#: src/slic3r/GUI/GUI_App.cpp:1529 src/slic3r/GUI/wxExtensions.cpp:673 +#: src/slic3r/GUI/GUI_App.cpp:1610 src/slic3r/GUI/wxExtensions.cpp:685 msgid "Simple" msgstr "Простой" -#: src/slic3r/GUI/GUI_App.cpp:1529 +#: src/slic3r/GUI/GUI_App.cpp:1610 msgid "Simple View Mode" -msgstr "Простой режим интерфейса" +msgstr "Простой режим просмотра интерфейса приложения" -#: src/slic3r/GUI/GUI_App.cpp:1531 src/slic3r/GUI/wxExtensions.cpp:675 +#: src/slic3r/GUI/GUI_App.cpp:1612 src/slic3r/GUI/wxExtensions.cpp:687 msgctxt "Mode" msgid "Advanced" msgstr "Расширенный" -#: src/slic3r/GUI/GUI_App.cpp:1531 +#: src/slic3r/GUI/GUI_App.cpp:1612 msgid "Advanced View Mode" -msgstr "Расширенный режим интерфейса" +msgstr "Расширенный режим просмотра интерфейса приложения" -#: src/slic3r/GUI/GUI_App.cpp:1532 src/slic3r/GUI/wxExtensions.cpp:676 +#: src/slic3r/GUI/GUI_App.cpp:1613 src/slic3r/GUI/wxExtensions.cpp:688 msgid "Expert" -msgstr "Экспертный" +msgstr "Продвинутый" -#: src/slic3r/GUI/GUI_App.cpp:1532 +#: src/slic3r/GUI/GUI_App.cpp:1613 msgid "Expert View Mode" -msgstr "Экспертный режим интерфейса" +msgstr "Продвинутый режим просмотра интерфейса приложения" -#: src/slic3r/GUI/GUI_App.cpp:1537 +#: src/slic3r/GUI/GUI_App.cpp:1618 msgid "Mode" -msgstr "Режим" +msgstr "Режим интерфейса" -#: src/slic3r/GUI/GUI_App.cpp:1537 +#: src/slic3r/GUI/GUI_App.cpp:1618 #, c-format msgid "%s View Mode" -msgstr "%s режим интерфейса" +msgstr "%s режим просмотра" -#: src/slic3r/GUI/GUI_App.cpp:1540 +#: src/slic3r/GUI/GUI_App.cpp:1621 msgid "&Language" -msgstr "&Язык" +msgstr "&Язык программы" -#: src/slic3r/GUI/GUI_App.cpp:1543 +#: src/slic3r/GUI/GUI_App.cpp:1624 msgid "Flash printer &firmware" -msgstr "Прошить принтер" +msgstr "&Прошивка принтера" -#: src/slic3r/GUI/GUI_App.cpp:1543 +#: src/slic3r/GUI/GUI_App.cpp:1624 msgid "Upload a firmware image into an Arduino based printer" msgstr "Загрузить прошивку в принтер на основе Arduino" -#: src/slic3r/GUI/GUI_App.cpp:1559 +#: src/slic3r/GUI/GUI_App.cpp:1640 msgid "Taking configuration snapshot" msgstr "Создание снапшота" -#: src/slic3r/GUI/GUI_App.cpp:1559 +#: src/slic3r/GUI/GUI_App.cpp:1640 msgid "Snapshot name" msgstr "Имя снапшота" -#: src/slic3r/GUI/GUI_App.cpp:1635 +#: src/slic3r/GUI/GUI_App.cpp:1669 +msgid "Failed to activate configuration snapshot." +msgstr "Сбой активации снапшота." + +#: src/slic3r/GUI/GUI_App.cpp:1719 msgid "Language selection" msgstr "Выбор языка" -#: src/slic3r/GUI/GUI_App.cpp:1637 +#: src/slic3r/GUI/GUI_App.cpp:1721 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." msgstr "" -"При смене языка приложение будет перезапущено.\n" -"Исчезнет содержимое компоновки." +"Смена языка вызовет перезапуск приложения.\n" +"Вы потеряете содержимое стола." -#: src/slic3r/GUI/GUI_App.cpp:1639 +#: src/slic3r/GUI/GUI_App.cpp:1723 msgid "Do you want to proceed?" msgstr "Хотите продолжить?" -#: src/slic3r/GUI/GUI_App.cpp:1666 +#: src/slic3r/GUI/GUI_App.cpp:1750 msgid "&Configuration" msgstr "&Настройки" -#: src/slic3r/GUI/GUI_App.cpp:1697 +#: src/slic3r/GUI/GUI_App.cpp:1781 msgid "The preset(s) modifications are successfully saved" -msgstr "" +msgstr "Изменения в профиле(-ях) успешно сохранены." + +#: src/slic3r/GUI/GUI_App.cpp:1802 +msgid "The uploads are still ongoing" +msgstr "Загрузки всё ещё продолжаются" + +#: src/slic3r/GUI/GUI_App.cpp:1802 +msgid "Stop them and continue anyway?" +msgstr "Остановить их и продолжить?" -#: src/slic3r/GUI/GUI_App.cpp:1907 src/slic3r/GUI/Tab.cpp:3232 +#: src/slic3r/GUI/GUI_App.cpp:1805 +msgid "Ongoing uploads" +msgstr "Текущие загрузки" + +#: src/slic3r/GUI/GUI_App.cpp:2019 src/slic3r/GUI/Tab.cpp:3242 msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "" -"Невозможно напечатать объект(ы), состоящий из нескольких частей с помощью " -"технологии SLA." +msgstr "По технологии SLA невозможно напечатать составную модель(и)." -#: src/slic3r/GUI/GUI_App.cpp:1908 +#: src/slic3r/GUI/GUI_App.cpp:2020 msgid "Please check and fix your object list." -msgstr "Проверьте и исправьте список объектов." +msgstr "Пожалуйста, проверьте и исправьте ваш список моделей." -#: src/slic3r/GUI/GUI_App.cpp:1909 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210 -#: src/slic3r/GUI/Plater.cpp:2337 src/slic3r/GUI/Tab.cpp:3234 +#: src/slic3r/GUI/GUI_App.cpp:2021 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210 +#: src/slic3r/GUI/Plater.cpp:2359 src/slic3r/GUI/Tab.cpp:3244 msgid "Attention!" msgstr "Внимание!" -#: src/slic3r/GUI/GUI_App.cpp:1926 +#: src/slic3r/GUI/GUI_App.cpp:2038 msgid "Select a gcode file:" -msgstr "Выберите файл gcode:" +msgstr "Выбрать файл G-кода:" #: src/slic3r/GUI/GUI_Init.cpp:73 src/slic3r/GUI/GUI_Init.cpp:76 msgid "PrusaSlicer GUI initialization failed" -msgstr "" +msgstr "Ошибка инициализации графического интерфейса PrusaSlicer" #: src/slic3r/GUI/GUI_Init.cpp:76 msgid "Fatal error, exception catched: %1%" -msgstr "" +msgstr "Критическая ошибка, обнаружено исключение: %1%" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 msgid "Start at height" -msgstr "Начать с высоты" +msgstr "Начинать с" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 msgid "Stop at height" -msgstr "Закончить на высоте" +msgstr "Закончить на" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:161 msgid "Remove layer range" -msgstr "Удалить диапазон слоев" +msgstr "Удалить диапазон слоёв" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:165 msgid "Add layer range" -msgstr "Добавить диапазон слоев" +msgstr "Добавить диапазон слоёв" #: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92 -#: src/slic3r/GUI/GUI_ObjectList.cpp:651 src/libslic3r/PrintConfig.cpp:72 -#: src/libslic3r/PrintConfig.cpp:216 src/libslic3r/PrintConfig.cpp:225 -#: src/libslic3r/PrintConfig.cpp:449 src/libslic3r/PrintConfig.cpp:515 -#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:953 -#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1556 -#: src/libslic3r/PrintConfig.cpp:1622 src/libslic3r/PrintConfig.cpp:1803 -#: src/libslic3r/PrintConfig.cpp:2270 src/libslic3r/PrintConfig.cpp:2329 -#: src/libslic3r/PrintConfig.cpp:2338 +#: src/slic3r/GUI/GUI_ObjectList.cpp:667 src/libslic3r/PrintConfig.cpp:74 +#: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:231 +#: src/libslic3r/PrintConfig.cpp:240 src/libslic3r/PrintConfig.cpp:464 +#: src/libslic3r/PrintConfig.cpp:530 src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:970 src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2361 src/libslic3r/PrintConfig.cpp:2370 msgid "Layers and Perimeters" msgstr "Слои и периметры" #: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95 -#: src/slic3r/GUI/GUI_ObjectList.cpp:654 src/slic3r/GUI/GUI_Preview.cpp:254 -#: src/slic3r/GUI/Tab.cpp:1473 src/slic3r/GUI/Tab.cpp:1475 +#: src/slic3r/GUI/GUI_ObjectList.cpp:670 src/slic3r/GUI/GUI_Preview.cpp:240 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1474 #: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:352 -#: src/libslic3r/PrintConfig.cpp:411 src/libslic3r/PrintConfig.cpp:1683 -#: src/libslic3r/PrintConfig.cpp:2061 src/libslic3r/PrintConfig.cpp:2067 -#: src/libslic3r/PrintConfig.cpp:2075 src/libslic3r/PrintConfig.cpp:2087 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2105 -#: src/libslic3r/PrintConfig.cpp:2120 src/libslic3r/PrintConfig.cpp:2141 -#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2169 -#: src/libslic3r/PrintConfig.cpp:2178 src/libslic3r/PrintConfig.cpp:2187 -#: src/libslic3r/PrintConfig.cpp:2198 src/libslic3r/PrintConfig.cpp:2212 -#: src/libslic3r/PrintConfig.cpp:2220 src/libslic3r/PrintConfig.cpp:2221 -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 -#: src/libslic3r/PrintConfig.cpp:2252 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:1715 +#: src/libslic3r/PrintConfig.cpp:2093 src/libslic3r/PrintConfig.cpp:2099 +#: src/libslic3r/PrintConfig.cpp:2107 src/libslic3r/PrintConfig.cpp:2119 +#: src/libslic3r/PrintConfig.cpp:2129 src/libslic3r/PrintConfig.cpp:2137 +#: src/libslic3r/PrintConfig.cpp:2152 src/libslic3r/PrintConfig.cpp:2173 +#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2201 +#: src/libslic3r/PrintConfig.cpp:2210 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2244 +#: src/libslic3r/PrintConfig.cpp:2252 src/libslic3r/PrintConfig.cpp:2253 +#: src/libslic3r/PrintConfig.cpp:2262 src/libslic3r/PrintConfig.cpp:2270 +#: src/libslic3r/PrintConfig.cpp:2284 msgid "Support material" -msgstr "Материал поддержки" +msgstr "Поддержка" #: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99 -#: src/slic3r/GUI/GUI_ObjectList.cpp:658 src/libslic3r/PrintConfig.cpp:2448 -#: src/libslic3r/PrintConfig.cpp:2456 +#: src/slic3r/GUI/GUI_ObjectList.cpp:674 src/libslic3r/PrintConfig.cpp:2480 +#: src/libslic3r/PrintConfig.cpp:2488 msgid "Wipe options" msgstr "Параметры очистки" #: src/slic3r/GUI/GUI_ObjectList.cpp:45 msgid "Pad and Support" -msgstr "" +msgstr "Подложка и Поддержка" #: src/slic3r/GUI/GUI_ObjectList.cpp:51 msgid "Add part" -msgstr "" +msgstr "Добавить элемент" #: src/slic3r/GUI/GUI_ObjectList.cpp:52 msgid "Add modifier" @@ -2900,629 +2980,623 @@ msgstr "Добавить модификатор" #: src/slic3r/GUI/GUI_ObjectList.cpp:53 msgid "Add support enforcer" -msgstr "" +msgstr "Принудительная поддержка" #: src/slic3r/GUI/GUI_ObjectList.cpp:54 msgid "Add support blocker" -msgstr "" +msgstr "Блокировщик поддержки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:653 -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/slic3r/GUI/Tab.cpp:1443 +#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:669 +#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1442 #: src/libslic3r/ExtrusionEntity.cpp:316 src/libslic3r/ExtrusionEntity.cpp:344 -#: src/libslic3r/PrintConfig.cpp:1198 src/libslic3r/PrintConfig.cpp:1204 -#: src/libslic3r/PrintConfig.cpp:1218 src/libslic3r/PrintConfig.cpp:1228 -#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:1238 +#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1232 +#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1256 +#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1266 msgid "Ironing" msgstr "Разглаживание" -#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:655 -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/slic3r/GUI/Tab.cpp:1499 -#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:503 -#: src/libslic3r/PrintConfig.cpp:984 src/libslic3r/PrintConfig.cpp:1164 -#: src/libslic3r/PrintConfig.cpp:1237 src/libslic3r/PrintConfig.cpp:1612 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2314 +#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:671 +#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/Tab.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:291 src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:1012 src/libslic3r/PrintConfig.cpp:1192 +#: src/libslic3r/PrintConfig.cpp:1265 src/libslic3r/PrintConfig.cpp:1640 +#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:2346 msgid "Speed" msgstr "Скорость" -#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:656 -#: src/slic3r/GUI/Tab.cpp:1535 src/slic3r/GUI/Tab.cpp:2112 -#: src/libslic3r/PrintConfig.cpp:533 src/libslic3r/PrintConfig.cpp:1118 -#: src/libslic3r/PrintConfig.cpp:1590 src/libslic3r/PrintConfig.cpp:1905 -#: src/libslic3r/PrintConfig.cpp:2133 src/libslic3r/PrintConfig.cpp:2160 +#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:672 +#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:1146 +#: src/libslic3r/PrintConfig.cpp:1618 src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2192 msgid "Extruders" msgstr "Экструдеры" -#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:657 -#: src/libslic3r/PrintConfig.cpp:492 src/libslic3r/PrintConfig.cpp:600 -#: src/libslic3r/PrintConfig.cpp:940 src/libslic3r/PrintConfig.cpp:1126 -#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1925 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:2302 +#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:673 +#: src/libslic3r/PrintConfig.cpp:507 src/libslic3r/PrintConfig.cpp:616 +#: src/libslic3r/PrintConfig.cpp:957 src/libslic3r/PrintConfig.cpp:1154 +#: src/libslic3r/PrintConfig.cpp:1627 src/libslic3r/PrintConfig.cpp:1957 +#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:2334 msgid "Extrusion Width" msgstr "Ширина экструзии" -#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:661 -#: src/slic3r/GUI/Tab.cpp:1429 src/slic3r/GUI/Tab.cpp:1453 -#: src/slic3r/GUI/Tab.cpp:1556 src/slic3r/GUI/Tab.cpp:1559 -#: src/slic3r/GUI/Tab.cpp:1855 src/slic3r/GUI/Tab.cpp:2192 -#: src/slic3r/GUI/Tab.cpp:4104 src/libslic3r/PrintConfig.cpp:90 -#: src/libslic3r/PrintConfig.cpp:128 src/libslic3r/PrintConfig.cpp:264 -#: src/libslic3r/PrintConfig.cpp:1069 src/libslic3r/PrintConfig.cpp:1153 -#: src/libslic3r/PrintConfig.cpp:2472 src/libslic3r/PrintConfig.cpp:2644 +#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:677 +#: src/slic3r/GUI/Tab.cpp:1428 src/slic3r/GUI/Tab.cpp:1452 src/slic3r/GUI/Tab.cpp:1555 +#: src/slic3r/GUI/Tab.cpp:1558 src/slic3r/GUI/Tab.cpp:1855 src/slic3r/GUI/Tab.cpp:2197 +#: src/slic3r/GUI/Tab.cpp:4114 src/libslic3r/PrintConfig.cpp:92 +#: src/libslic3r/PrintConfig.cpp:132 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:2504 src/libslic3r/PrintConfig.cpp:2676 msgid "Advanced" -msgstr "Расширенный" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:663 -#: src/slic3r/GUI/Plater.cpp:357 src/slic3r/GUI/Tab.cpp:4038 -#: src/slic3r/GUI/Tab.cpp:4039 src/libslic3r/PrintConfig.cpp:2810 -#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2826 -#: src/libslic3r/PrintConfig.cpp:2835 src/libslic3r/PrintConfig.cpp:2845 -#: src/libslic3r/PrintConfig.cpp:2855 src/libslic3r/PrintConfig.cpp:2892 -#: src/libslic3r/PrintConfig.cpp:2899 src/libslic3r/PrintConfig.cpp:2910 -#: src/libslic3r/PrintConfig.cpp:2920 src/libslic3r/PrintConfig.cpp:2929 -#: src/libslic3r/PrintConfig.cpp:2942 src/libslic3r/PrintConfig.cpp:2952 -#: src/libslic3r/PrintConfig.cpp:2961 src/libslic3r/PrintConfig.cpp:2971 -#: src/libslic3r/PrintConfig.cpp:2982 src/libslic3r/PrintConfig.cpp:2990 +msgstr "Дополнительно" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:679 +#: src/slic3r/GUI/Plater.cpp:357 src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4049 src/libslic3r/PrintConfig.cpp:2842 +#: src/libslic3r/PrintConfig.cpp:2849 src/libslic3r/PrintConfig.cpp:2858 +#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2877 +#: src/libslic3r/PrintConfig.cpp:2887 src/libslic3r/PrintConfig.cpp:2924 +#: src/libslic3r/PrintConfig.cpp:2931 src/libslic3r/PrintConfig.cpp:2942 +#: src/libslic3r/PrintConfig.cpp:2952 src/libslic3r/PrintConfig.cpp:2961 +#: src/libslic3r/PrintConfig.cpp:2974 src/libslic3r/PrintConfig.cpp:2984 +#: src/libslic3r/PrintConfig.cpp:2993 src/libslic3r/PrintConfig.cpp:3003 +#: src/libslic3r/PrintConfig.cpp:3014 src/libslic3r/PrintConfig.cpp:3022 msgid "Supports" -msgstr "Поддержки" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:664 -#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:4079 -#: src/slic3r/GUI/Tab.cpp:4080 src/slic3r/GUI/Tab.cpp:4151 -#: src/libslic3r/PrintConfig.cpp:2998 src/libslic3r/PrintConfig.cpp:3005 -#: src/libslic3r/PrintConfig.cpp:3019 src/libslic3r/PrintConfig.cpp:3030 -#: src/libslic3r/PrintConfig.cpp:3040 src/libslic3r/PrintConfig.cpp:3062 -#: src/libslic3r/PrintConfig.cpp:3073 src/libslic3r/PrintConfig.cpp:3080 -#: src/libslic3r/PrintConfig.cpp:3087 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3116 +msgstr "Поддержка" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:680 +#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:4089 +#: src/slic3r/GUI/Tab.cpp:4090 src/slic3r/GUI/Tab.cpp:4161 +#: src/libslic3r/PrintConfig.cpp:3030 src/libslic3r/PrintConfig.cpp:3037 +#: src/libslic3r/PrintConfig.cpp:3051 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3072 src/libslic3r/PrintConfig.cpp:3094 +#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3119 src/libslic3r/PrintConfig.cpp:3130 +#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3148 msgid "Pad" -msgstr "" +msgstr "Подложка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4097 -#: src/slic3r/GUI/Tab.cpp:4098 src/libslic3r/SLA/Hollowing.cpp:45 +#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4107 +#: src/slic3r/GUI/Tab.cpp:4108 src/libslic3r/SLA/Hollowing.cpp:45 #: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66 -#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3126 -#: src/libslic3r/PrintConfig.cpp:3133 src/libslic3r/PrintConfig.cpp:3143 -#: src/libslic3r/PrintConfig.cpp:3152 +#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3165 src/libslic3r/PrintConfig.cpp:3175 +#: src/libslic3r/PrintConfig.cpp:3184 msgid "Hollowing" -msgstr "" +msgstr "Полость" -#: src/slic3r/GUI/GUI_ObjectList.cpp:284 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161 +#: src/slic3r/GUI/GUI_ObjectList.cpp:300 src/slic3r/GUI/GUI_ObjectManipulation.cpp:161 msgid "Name" -msgstr "Имя" +msgstr "Файл" -#: src/slic3r/GUI/GUI_ObjectList.cpp:300 src/slic3r/GUI/GUI_ObjectList.cpp:441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:457 msgid "Editing" -msgstr "Редактирование" +msgstr "Правка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:386 +#: src/slic3r/GUI/GUI_ObjectList.cpp:402 #, c-format msgid "Auto-repaired (%d errors):" msgstr "Исправлено ошибок: %d" -#: src/slic3r/GUI/GUI_ObjectList.cpp:393 +#: src/slic3r/GUI/GUI_ObjectList.cpp:409 msgid "degenerate facets" -msgstr "граней вырождено" +msgstr "Вырожденных граней" -#: src/slic3r/GUI/GUI_ObjectList.cpp:394 +#: src/slic3r/GUI/GUI_ObjectList.cpp:410 msgid "edges fixed" -msgstr "рёбер починено" +msgstr "Рёбер починено" -#: src/slic3r/GUI/GUI_ObjectList.cpp:395 +#: src/slic3r/GUI/GUI_ObjectList.cpp:411 msgid "facets removed" -msgstr "граней удалено" +msgstr "Граней удалено" -#: src/slic3r/GUI/GUI_ObjectList.cpp:396 +#: src/slic3r/GUI/GUI_ObjectList.cpp:412 msgid "facets added" -msgstr "граней добавлено" +msgstr "Граней добавлено" -#: src/slic3r/GUI/GUI_ObjectList.cpp:397 +#: src/slic3r/GUI/GUI_ObjectList.cpp:413 msgid "facets reversed" -msgstr "граней реверсировано" +msgstr "Граней реверсировано" -#: src/slic3r/GUI/GUI_ObjectList.cpp:398 +#: src/slic3r/GUI/GUI_ObjectList.cpp:414 msgid "backwards edges" -msgstr "рёбер вывернуто" +msgstr "Вывернуто рёбер" -#: src/slic3r/GUI/GUI_ObjectList.cpp:406 +#: src/slic3r/GUI/GUI_ObjectList.cpp:422 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" +"Щёлкните правой кнопкой мыши на восклицательный знак, чтобы исправить STL с помощью " +"сервиса Netfabb." -#: src/slic3r/GUI/GUI_ObjectList.cpp:443 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 msgid "Right button click the icon to change the object settings" -msgstr "" +msgstr "Щёлкните правой кнопкой мыши на значок, чтобы изменить настройки модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:445 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Click the icon to change the object settings" -msgstr "" +msgstr "Щёлкните кнопкой мыши на значок, чтобы изменить настройки модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:449 +#: src/slic3r/GUI/GUI_ObjectList.cpp:465 msgid "Right button click the icon to change the object printable property" msgstr "" +"Щёлкните правой кнопкой мыши на значок, чтобы разрешить\\запретить печать модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:451 +#: src/slic3r/GUI/GUI_ObjectList.cpp:467 msgid "Click the icon to change the object printable property" -msgstr "" +msgstr "Щёлкните кнопкой мыши на значок, чтобы разрешить\\запретить печать модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:574 +#: src/slic3r/GUI/GUI_ObjectList.cpp:590 msgid "Change Extruder" -msgstr "Сменить экструдер" +msgstr "Смена экструдера" -#: src/slic3r/GUI/GUI_ObjectList.cpp:589 +#: src/slic3r/GUI/GUI_ObjectList.cpp:605 msgid "Rename Object" -msgstr "Переименовать объект" +msgstr "Переименование модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:589 +#: src/slic3r/GUI/GUI_ObjectList.cpp:605 msgid "Rename Sub-object" -msgstr "Переименовать подобъект" +msgstr "Переименование подобъекта" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1215 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4244 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1247 src/slic3r/GUI/GUI_ObjectList.cpp:4372 msgid "Instances to Separated Objects" -msgstr "" +msgstr "Копия как отдельная модель" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1262 msgid "Volumes in Object reordered" -msgstr "" +msgstr "Объёмы в модели переупорядочены" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1262 msgid "Object reordered" -msgstr "Объект переупорядочен" +msgstr "Модель переупорядочена" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1306 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1661 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1667 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1338 src/slic3r/GUI/GUI_ObjectList.cpp:1693 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1699 src/slic3r/GUI/GUI_ObjectList.cpp:2081 #, c-format msgid "Quick Add Settings (%s)" -msgstr "" +msgstr "Быстрое добавление настроек (%s)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1396 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1428 msgid "Select showing settings" -msgstr "Выбор настроек отображения" +msgstr "Выбор параметров отображения" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1445 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1477 msgid "Add Settings for Layers" -msgstr "" +msgstr "Добавление параметров для слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1478 msgid "Add Settings for Sub-object" -msgstr "" +msgstr "Добавление параметров для подобъекта" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1447 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1479 msgid "Add Settings for Object" -msgstr "" +msgstr "Добавление параметров для модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1517 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1549 msgid "Add Settings Bundle for Height range" -msgstr "" +msgstr "Добавление набора настроек для переменной высоты слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1518 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1550 msgid "Add Settings Bundle for Sub-object" -msgstr "" +msgstr "Добавление набора параметров для подобъекта" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1519 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1551 msgid "Add Settings Bundle for Object" -msgstr "" +msgstr "Добавление набора параметров для модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1558 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1590 msgid "Load" msgstr "Загрузить" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1563 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1599 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 src/slic3r/GUI/GUI_ObjectList.cpp:1627 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1631 msgid "Box" -msgstr "" +msgstr "Куб" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1563 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 msgid "Cylinder" msgstr "Цилиндр" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1563 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 msgid "Slab" -msgstr "" +msgstr "Плита" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 msgid "Height range Modifier" -msgstr "" +msgstr "Модификатор переменной высоты слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1640 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1672 msgid "Add settings" msgstr "Добавить настройки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1718 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1750 msgid "Change type" msgstr "Изменить тип" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1728 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1740 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1760 src/slic3r/GUI/GUI_ObjectList.cpp:1772 msgid "Set as a Separated Object" -msgstr "" +msgstr "Превратить в отдельную модель" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1740 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 msgid "Set as a Separated Objects" -msgstr "" +msgstr "Превратить в отдельные модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1750 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 msgid "Printable" -msgstr "" +msgstr "Для печати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1765 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1797 msgid "Rename" msgstr "Переименовать" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1776 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1808 msgid "Fix through the Netfabb" -msgstr "Починить в Netfabb" +msgstr "Ремонт модели службой Netfabb" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1786 src/slic3r/GUI/Plater.cpp:3958 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1818 src/slic3r/GUI/Plater.cpp:4035 msgid "Export as STL" msgstr "Экспорт в STL" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1793 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3924 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1825 src/slic3r/GUI/GUI_ObjectList.cpp:4567 +#: src/slic3r/GUI/Plater.cpp:4001 msgid "Reload the selected volumes from disk" -msgstr "Перезагрузить выделенные объёмы с диска" +msgstr "Перезагрузить выбранные объёмы с диска" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1800 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 msgid "Set extruder for selected items" -msgstr "" +msgstr "Задать экструдер для выбранных частей" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 src/libslic3r/PrintConfig.cpp:376 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1864 src/libslic3r/PrintConfig.cpp:391 msgid "Default" msgstr "По умолчанию" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1852 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1884 msgid "Scale to print volume" -msgstr "Масштабировать к объёму принтера" +msgstr "Отмасштабировать под область печати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1852 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1884 msgid "Scale the selected object to fit the print volume" -msgstr "Масштабировать выделенный объект до объёма принтера" +msgstr "Отмасштабировать выбранную модель до объёма стола" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 src/slic3r/GUI/Plater.cpp:5142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1913 src/slic3r/GUI/Plater.cpp:5224 msgid "Convert from imperial units" -msgstr "" +msgstr "Преобразовать размер из английской системы мер" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1861 src/slic3r/GUI/Plater.cpp:5142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1915 src/slic3r/GUI/Plater.cpp:5224 msgid "Revert conversion from imperial units" -msgstr "" +msgstr "Отменить преобразование размера из английской системы мер" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1868 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2569 src/libslic3r/PrintConfig.cpp:3695 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1944 src/slic3r/GUI/GUI_ObjectList.cpp:1952 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2630 src/libslic3r/PrintConfig.cpp:3730 msgid "Merge" msgstr "Объединить" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1868 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1944 msgid "Merge objects to the one multipart object" -msgstr "" +msgstr "Объединить модели в одну составную модель" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 msgid "Merge objects to the one single object" -msgstr "" +msgstr "Объединить модели в одну единую модель" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2210 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2026 src/slic3r/GUI/GUI_ObjectList.cpp:2283 msgid "Add Shape" -msgstr "" +msgstr "Добавить фигуру" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2038 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2111 msgid "Load Part" -msgstr "Загрузить часть" +msgstr "Загрузка элемента" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2077 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2150 msgid "Error!" msgstr "Ошибка!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2152 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2225 msgid "Add Generic Subobject" -msgstr "" +msgstr "Добавление сгенерированного элемента" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2254 msgid "Generic" -msgstr "Общие" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2307 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2408 -msgid "Last instance of an object cannot be deleted." -msgstr "" +msgstr "Сгенерирован" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2319 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2380 msgid "Delete Settings" -msgstr "Удалить настройки" +msgstr "Удаление настроек" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2402 msgid "Delete All Instances from Object" -msgstr "Удалить все экземпляры из объекта" +msgstr "Удаление всех копий из модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2357 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2418 msgid "Delete Height Range" -msgstr "" +msgstr "Удаление переменной высоты слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2389 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2450 msgid "From Object List You can't delete the last solid part from object." msgstr "" +"Вы не можете удалить из списка моделей последний твердотельный элемент модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2393 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2454 msgid "Delete Subobject" -msgstr "Удалить подобъект" +msgstr "Удаление части" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2469 +msgid "Last instance of an object cannot be deleted." +msgstr "Последняя копия модели не может быть удалена." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2473 msgid "Delete Instance" -msgstr "Удалить экземпляр" +msgstr "Удаление копии" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2436 src/slic3r/GUI/Plater.cpp:2840 -msgid "" -"The selected object couldn't be split because it contains only one part." -msgstr "" -"Выбранный объект не может быть разделен, так как он состоит из одной части." +#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:2865 +msgid "The selected object couldn't be split because it contains only one part." +msgstr "Выбранная модель не может быть разделена, так как она состоит из одной части." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2440 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 msgid "Split to Parts" -msgstr "Разбить на части" +msgstr "Разделение на части" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2576 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2637 msgid "Merged" -msgstr "" +msgstr "Объединённые" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2660 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2721 msgid "Merge all parts to the one single object" -msgstr "" +msgstr "Объединить все части в одну единую модель" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2692 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2753 msgid "Add Layers" -msgstr "Добавить слои" +msgstr "Добавление слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2846 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2907 msgid "Group manipulation" -msgstr "Действия с группой" +msgstr "Групповые манипуляции" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2858 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2919 msgid "Object manipulation" -msgstr "Действия с объектом" +msgstr "Манипуляция над моделями" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2871 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2932 msgid "Object Settings to modify" -msgstr "" +msgstr "Параметры модели для изменения" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2936 msgid "Part Settings to modify" -msgstr "" +msgstr "Параметры элемента для изменения" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2880 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2941 msgid "Layer range Settings to modify" -msgstr "" +msgstr "Изменение параметров диапазона слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2886 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2947 msgid "Part manipulation" -msgstr "" +msgstr "Манипуляция над элементом" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2892 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2953 msgid "Instance manipulation" -msgstr "Действия с экземпляром" +msgstr "Манипуляция с копиями" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2899 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2960 msgid "Height ranges" -msgstr "Диапазоны высот" +msgstr "Переменная высота слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2899 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2960 msgid "Settings for height range" -msgstr "" +msgstr "Настройки для переменной высоты слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3083 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3144 msgid "Delete Selected Item" -msgstr "Удалить выделенный элемент" +msgstr "Удаление выбранных частей" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3221 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3332 msgid "Delete Selected" -msgstr "Удалить выбранное" +msgstr "Удаление выбранного" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3297 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3325 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3345 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3408 src/slic3r/GUI/GUI_ObjectList.cpp:3436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3456 msgid "Add Height Range" -msgstr "" +msgstr "Добавить переменную высоту слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3391 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3502 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" "without violating the minimum layer height." msgstr "" +"Невозможно вставить новый диапазон слоёв после текущего \n" +"диапазона слоёв. Следующий диапазон слоёв слишком тонкий, \n" +"чтобы его можно было разделить на два слоя \n" +"без нарушения минимальной высоты слоя." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3395 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3506 msgid "" -"Cannot insert a new layer range between the current and the next layer " -"range.\n" +"Cannot insert a new layer range between the current and the next layer range.\n" "The gap between the current layer range and the next layer range\n" "is thinner than the minimum layer height allowed." msgstr "" +"Невозможно вставить новый диапазон слоёв между текущим \n" +"и следующим диапазонами слоёв. Зазор между текущим \n" +"диапазоном слоёв и следующим диапазоном слоёв меньше \n" +"минимально допустимой высоты слоя." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3511 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." msgstr "" +"Невозможно вставить новый диапазон слоёв после \n" +"текущего диапазона слоёв. Текущий диапазон слоёв \n" +"перекрывается со следующим диапазоном слоёв." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3459 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3570 msgid "Edit Height Range" -msgstr "" +msgstr "Редактирование переменной высоты слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3754 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3865 msgid "Selection-Remove from list" -msgstr "" +msgstr "Выбор\\Удаление из списка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3762 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3873 msgid "Selection-Add from list" -msgstr "Выделение-Добавлено из списка" +msgstr "Выбор\\Добавление из списка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3880 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4008 msgid "Object or Instance" -msgstr "Объект или экземпляр" +msgstr "Модель или копия" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3881 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 src/slic3r/GUI/GUI_ObjectList.cpp:4142 msgid "Part" -msgstr "" +msgstr "элемент" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3881 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 msgid "Layer" -msgstr "Слой" +msgstr "Слои" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3883 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4011 msgid "Unsupported selection" -msgstr "Неподдерживаемое выделение" +msgstr "Неподдерживаемый выбор" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3884 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4012 #, c-format msgid "You started your selection with %s Item." -msgstr "" +msgstr "Вы начали свой выбор с сущности %s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3885 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4013 #, c-format msgid "In this mode you can select only other %s Items%s" -msgstr "" +msgstr "В этом режиме можно выбирать только сущности %s%s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3888 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 msgid "of a current Object" -msgstr "текущего объекта" +msgstr "текущей модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3893 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3968 src/slic3r/GUI/Plater.cpp:143 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4021 src/slic3r/GUI/GUI_ObjectList.cpp:4096 +#: src/slic3r/GUI/Plater.cpp:143 msgid "Info" msgstr "Информация" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4137 msgid "You can't change a type of the last solid part of the object." -msgstr "" +msgstr "Вы не можете изменить тип последнего твердотельного элемента модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 msgid "Modifier" msgstr "Модификатор" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 msgid "Support Enforcer" -msgstr "" +msgstr "Принудительная поддержка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 msgid "Support Blocker" msgstr "Блокировщик поддержки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4144 msgid "Select type of part" -msgstr "Выберите тип части" +msgstr "Выбор типа элемента" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4021 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4149 msgid "Change Part Type" -msgstr "" +msgstr "Изменение типа элемента" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4266 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4394 msgid "Enter new name" msgstr "Введите новое имя" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4266 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4394 msgid "Renaming" msgstr "Переименование" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4282 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4409 -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4410 src/slic3r/GUI/GUI_ObjectList.cpp:4537 +#: src/slic3r/GUI/SavePresetDialog.cpp:101 src/slic3r/GUI/SavePresetDialog.cpp:109 msgid "The supplied name is not valid;" msgstr "Заданное имя недопустимо;" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4283 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4410 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4411 src/slic3r/GUI/GUI_ObjectList.cpp:4538 #: src/slic3r/GUI/SavePresetDialog.cpp:102 msgid "the following characters are not allowed:" msgstr "следующие знаки не разрешаются:" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4458 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4586 msgid "Select extruder number:" -msgstr "Задайте номер экструдера:" +msgstr "Выберите номер экструдера:" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4459 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4587 msgid "This extruder will be set for selected items" -msgstr "" +msgstr "Этот экструдер будет задан для выбранных частей" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4612 msgid "Change Extruders" msgstr "Смена экструдеров" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485 msgid "Set Printable" -msgstr "Установить печатным" +msgstr "Задать \"Для печати\"" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485 msgid "Set Unprintable" -msgstr "Установить непечатным" +msgstr "Задать \"Не для печати\"" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111 msgid "World coordinates" -msgstr "Мировые координаты" +msgstr "Мировая СК" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112 msgid "Local coordinates" -msgstr "Локальные координаты" +msgstr "Локальная СК" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88 msgid "Select coordinate space, in which the transformation will be performed." msgstr "" +"Выберите координатное пространство, в котором будет выполняться преобразование." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:629 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:537 msgid "Object name" -msgstr "Имя объекта" +msgstr "Имя модели" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505 msgid "Position" -msgstr "Положение" +msgstr "Позиция" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506 -#: src/slic3r/GUI/Mouse3DController.cpp:487 -#: src/slic3r/GUI/Mouse3DController.cpp:508 +#: src/slic3r/GUI/Mouse3DController.cpp:486 src/slic3r/GUI/Mouse3DController.cpp:507 msgid "Rotation" msgstr "Вращение" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271 #, c-format msgid "Toggle %c axis mirroring" -msgstr "" +msgstr "Отразить вдоль оси %c" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305 msgid "Set Mirror" -msgstr "Отражение" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 -msgid "in" -msgstr "дюйм" +msgstr "Задание отражения" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357 msgid "Drop to bed" -msgstr "" +msgstr "Положить на стол" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372 msgid "Reset rotation" -msgstr "Сбросить поворот" +msgstr "Сброс вращения" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394 msgid "Reset Rotation" -msgstr "Сбросить поворот" +msgstr "Сброс вращения" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 msgid "Reset scale" -msgstr "" +msgstr "Сброс масштаба" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:423 +msgid "Inches" +msgstr "Дюймы" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507 msgid "Scale factors" @@ -3530,33 +3604,37 @@ msgstr "Масштаб" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561 msgid "Translate" -msgstr "" +msgstr "Перемещение" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625 -msgid "" -"You cannot use non-uniform scaling mode for multiple objects/parts selection" +msgid "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" +"Нельзя использовать режим неравномерного масштабирования, когда выбрано несколько " +"моделей/частей." #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797 msgid "Set Position" -msgstr "Задать положение" +msgstr "Задание позиции" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828 msgid "Set Orientation" -msgstr "Задать ориентацию" +msgstr "Задание поворота" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893 msgid "Set Scale" -msgstr "Задать масштаб" +msgstr "Задание масштаба" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925 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" +"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." msgstr "" +"Модель, с которой вы работаете, наклонена (углы поворота не кратен 90 °).\n" +"Неравномерное масштабирование наклонных объектов возможно только в мировой \n" +"системе координат, когда информация о вращении записывается в координаты модели." #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928 msgid "" @@ -3564,7 +3642,7 @@ msgid "" "Do you want to proceed?" msgstr "" "Эта операция необратима.\n" -"Продолжить?" +"Хотите продолжить?" #: src/slic3r/GUI/GUI_ObjectSettings.cpp:62 msgid "Additional Settings" @@ -3577,133 +3655,134 @@ msgstr "Удалить параметр" #: src/slic3r/GUI/GUI_ObjectSettings.cpp:104 #, c-format msgid "Delete Option %s" -msgstr "Удалить параметр %s" +msgstr "Удаление параметра %s" #: src/slic3r/GUI/GUI_ObjectSettings.cpp:157 #, c-format msgid "Change Option %s" -msgstr "Изменить параметр %s" +msgstr "Изменение параметра %s" -#: src/slic3r/GUI/GUI_Preview.cpp:226 +#: src/slic3r/GUI/GUI_Preview.cpp:212 msgid "View" msgstr "Вид" -#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/PrintConfig.cpp:545 +#: src/slic3r/GUI/GUI_Preview.cpp:215 src/libslic3r/PrintConfig.cpp:560 msgid "Height" msgstr "Высота" -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/PrintConfig.cpp:2434 +#: src/slic3r/GUI/GUI_Preview.cpp:216 src/libslic3r/PrintConfig.cpp:2466 msgid "Width" msgstr "Ширина" -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/slic3r/GUI/Tab.cpp:1841 +#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/Tab.cpp:1840 msgid "Fan speed" msgstr "Скорость вентилятора" -#: src/slic3r/GUI/GUI_Preview.cpp:233 +#: src/slic3r/GUI/GUI_Preview.cpp:219 msgid "Volumetric flow rate" msgstr "Объёмный расход" -#: src/slic3r/GUI/GUI_Preview.cpp:238 +#: src/slic3r/GUI/GUI_Preview.cpp:224 msgid "Show" msgstr "Отображать" -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/slic3r/GUI/GUI_Preview.cpp:259 +#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:245 msgid "Feature types" msgstr "Типы линий" -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:310 +#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/ExtrusionEntity.cpp:310 #: src/libslic3r/ExtrusionEntity.cpp:332 msgid "Perimeter" -msgstr "Периметр" +msgstr "Внутренний периметр" -#: src/slic3r/GUI/GUI_Preview.cpp:245 src/libslic3r/ExtrusionEntity.cpp:311 +#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/ExtrusionEntity.cpp:311 #: src/libslic3r/ExtrusionEntity.cpp:334 msgid "External perimeter" msgstr "Внешний периметр" -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:312 +#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/ExtrusionEntity.cpp:312 #: src/libslic3r/ExtrusionEntity.cpp:336 msgid "Overhang perimeter" msgstr "Нависающий периметр" -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:313 +#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/ExtrusionEntity.cpp:313 #: src/libslic3r/ExtrusionEntity.cpp:338 msgid "Internal infill" msgstr "Заполнение" -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:314 -#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:1924 -#: src/libslic3r/PrintConfig.cpp:1935 +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1967 msgid "Solid infill" msgstr "Сплошное заполнение" -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/libslic3r/ExtrusionEntity.cpp:315 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2301 -#: src/libslic3r/PrintConfig.cpp:2313 +#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2345 msgid "Top solid infill" msgstr "Верхний сплошной слой" -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:317 #: src/libslic3r/ExtrusionEntity.cpp:346 msgid "Bridge infill" -msgstr "Заполнение моста" +msgstr "Мосты" -#: src/slic3r/GUI/GUI_Preview.cpp:252 src/libslic3r/ExtrusionEntity.cpp:318 -#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:983 +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:318 +#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:1011 msgid "Gap fill" msgstr "Заполнение пробелов" -#: src/slic3r/GUI/GUI_Preview.cpp:253 src/slic3r/GUI/Tab.cpp:1463 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/slic3r/GUI/Tab.cpp:1462 #: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/ExtrusionEntity.cpp:350 msgid "Skirt" msgstr "Юбка" -#: src/slic3r/GUI/GUI_Preview.cpp:255 src/libslic3r/ExtrusionEntity.cpp:321 -#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2186 +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:321 +#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2218 msgid "Support material interface" msgstr "Связующий слой поддержки" -#: src/slic3r/GUI/GUI_Preview.cpp:256 src/slic3r/GUI/Tab.cpp:1546 +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/slic3r/GUI/Tab.cpp:1545 #: src/libslic3r/ExtrusionEntity.cpp:322 src/libslic3r/ExtrusionEntity.cpp:356 msgid "Wipe tower" -msgstr "Башня очистки" +msgstr "Черновая башня" -#: src/slic3r/GUI/GUI_Preview.cpp:986 +#: src/slic3r/GUI/GUI_Preview.cpp:1031 msgid "Shells" msgstr "Оболочка" -#: src/slic3r/GUI/GUI_Preview.cpp:987 +#: src/slic3r/GUI/GUI_Preview.cpp:1032 msgid "Tool marker" -msgstr "" +msgstr "Маркер инструмента" -#: src/slic3r/GUI/GUI_Preview.cpp:988 +#: src/slic3r/GUI/GUI_Preview.cpp:1033 msgid "Legend/Estimated printing time" -msgstr "" +msgstr "Условные обозначения/Расчётное время печати" #: src/slic3r/GUI/ImGuiWrapper.cpp:804 src/slic3r/GUI/Search.cpp:389 msgid "Use for search" -msgstr "" +msgstr "Использовать для поиска" #: src/slic3r/GUI/ImGuiWrapper.cpp:805 src/slic3r/GUI/Search.cpp:383 msgid "Category" -msgstr "" +msgstr "Категория" #: src/slic3r/GUI/ImGuiWrapper.cpp:807 src/slic3r/GUI/Search.cpp:385 msgid "Search in English" -msgstr "" +msgstr "Искать на английском языке" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:146 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:145 msgid "Arranging" msgstr "Расстановка" #: src/slic3r/GUI/Jobs/ArrangeJob.cpp:175 msgid "Could not arrange model objects! Some geometries may be invalid." msgstr "" +"Не удалось расставить части модели! Некоторые геометрии могут быть недопустимыми." #: src/slic3r/GUI/Jobs/ArrangeJob.cpp:181 msgid "Arranging canceled." -msgstr "Авторасположение отменено." +msgstr "Расстановка отменена." #: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182 msgid "Arranging done." @@ -3715,655 +3794,754 @@ msgstr "ОШИБКА: недостаточно ресурсов для выпо #: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41 msgid "Searching for optimal orientation" -msgstr "" +msgstr "Поиск оптимального положения." #: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73 msgid "Orientation search canceled." -msgstr "" +msgstr "Поиск оптимального положения отменён." #: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:74 msgid "Orientation found." -msgstr "Ориентация найдена." +msgstr "Оптимальное положения найдено." #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:35 msgid "Choose SLA archive:" -msgstr "" +msgstr "Выберите SLA архив:" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:39 msgid "Import file" -msgstr "" +msgstr "Файл для импорта" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:46 msgid "Import model and profile" -msgstr "" +msgstr "Импортировать модель и профиль" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 msgid "Import profile only" -msgstr "" +msgstr "Импортировать только профиль" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 msgid "Import model only" -msgstr "" +msgstr "Импортировать только модель" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:59 msgid "Accurate" -msgstr "" +msgstr "Точность" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 msgid "Balanced" -msgstr "" +msgstr "Баланс" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 msgid "Quick" -msgstr "" +msgstr "Скорость" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "Importing SLA archive" -msgstr "" +msgstr "Импорт SLA архива" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:159 msgid "Importing canceled." -msgstr "" +msgstr "Импорт отменен." #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:160 msgid "Importing done." -msgstr "" +msgstr "Импорт завершён." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2335 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2357 msgid "You cannot load SLA project with a multi-part object on the bed" -msgstr "" +msgstr "Вы не можете загрузить SLA проект с составной моделью на столе." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2336 -#: src/slic3r/GUI/Tab.cpp:3233 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2358 +#: src/slic3r/GUI/Tab.cpp:3243 msgid "Please check your object list before preset changing." -msgstr "Проверьте список объектов перед изменением профиля." +msgstr "Пожалуйста, проверьте список моделей перед изменением профиля." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:34 src/slic3r/GUI/MainFrame.cpp:898 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:17 src/slic3r/GUI/MainFrame.cpp:894 msgid "Keyboard Shortcuts" -msgstr "Клавиатурные комбинации" +msgstr "Горячие клавиши" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:69 msgid "New project, clear plater" -msgstr "Новый проект, очистить компоновку" +msgstr "Новый проект, пустой стол" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:70 msgid "Open project STL/OBJ/AMF/3MF with config, clear plater" -msgstr "Открыть проект STL/OBJ/AMF/3MF с настройками, очистить компоновку" +msgstr "Открыть STL/OBJ/AMF/3MF проект с конфигурацией, очистив стол" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:71 msgid "Save project (3mf)" msgstr "Сохранить проект (3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:72 msgid "Save project as (3mf)" -msgstr "Сохранить проект как (3mf)" +msgstr "Сохранить проект (3MF)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:101 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:73 msgid "(Re)slice" -msgstr "Нарезать" +msgstr "(Пере)Нарезать" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:75 msgid "Import STL/OBJ/AMF/3MF without config, keep plater" -msgstr "Импортировать проект STL/OBJ/AMF/3MF без настроек, оставить компоновку" +msgstr "Загрузить STL/OBJ/AMF/3MF проект с конфигурацией, не очищая стол" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:76 msgid "Import Config from ini/amf/3mf/gcode" -msgstr "Импортировать настройки из ini/amf/3mf/gcode" +msgstr "Загрузить конфигурацию из ini/amf/3mf/g-кода" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 msgid "Load Config from ini/amf/3mf/gcode and merge" -msgstr "Загрузить настройки из ini/amf/3mf/gcode и объединить" +msgstr "Загрузить конфигурацию из ini/amf/3mf/g-кода и объединить" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/Plater.cpp:770 -#: src/slic3r/GUI/Plater.cpp:5961 src/libslic3r/PrintConfig.cpp:3600 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 src/slic3r/GUI/Plater.cpp:770 +#: src/slic3r/GUI/Plater.cpp:6054 src/libslic3r/PrintConfig.cpp:3635 msgid "Export G-code" -msgstr "Экспортировать G-код" +msgstr "Экспорт в G-код" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 src/slic3r/GUI/Plater.cpp:5962 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 src/slic3r/GUI/Plater.cpp:6055 msgid "Send G-code" -msgstr "Послать G-код" +msgstr "Отправить G-код" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 msgid "Export config" -msgstr "Экспортировать настройки" +msgstr "Сохранить текущую конфигурацию" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 src/slic3r/GUI/Plater.cpp:758 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:82 src/slic3r/GUI/Plater.cpp:758 msgid "Export to SD card / Flash drive" -msgstr "Экспортировать на SD-карту / Flash-накопитель" +msgstr "Экспорт на SD-карту / USB-накопитель" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 msgid "Eject SD card / Flash drive" -msgstr "Извлечь SD-карту / Flash-накопитель" +msgstr "Извлечь SD-карту / USB-накопитель" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 msgid "Select all objects" -msgstr "Выбрать все объекты" +msgstr "Выбрать все модели" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "Deselect all" -msgstr "Отменить всё" +msgstr "Снять выбор со всего" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Delete selected" -msgstr "Удалить выбранное" +msgstr "Удалить выбранные" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 msgid "Copy to clipboard" -msgstr "Скопировать в буфер обмена" +msgstr "Копировать в буфер" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Paste from clipboard" msgstr "Вставить из буфера обмена" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 src/slic3r/GUI/KBShortcutsDialog.cpp:96 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 msgid "Reload plater from disk" -msgstr "Перезагрузить компоновку с диска" +msgstr "Перезагрузить стол с диска" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Select Plater Tab" -msgstr "Вкладка компоновки" +msgstr "Вкладка стола" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:101 msgid "Select Print Settings Tab" msgstr "Вкладка настройки печати" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select Filament Settings Tab" msgstr "Вкладка настройки прутка" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Select Printer Settings Tab" msgstr "Вкладка настройки принтера" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Switch to 3D" -msgstr "Переключиться в 3D" +msgstr "Переключиться на 3D вид" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 msgid "Switch to Preview" -msgstr "Переключиться в предварительный просмотр" +msgstr "Переключиться на предпросмотр" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 -#: src/slic3r/GUI/PrintHostDialogs.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/PrintHostDialogs.cpp:165 msgid "Print host upload queue" -msgstr "Очередь отправки на узел печати" +msgstr "Очередь загрузки на хост печати" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/MainFrame.cpp:65 +#: src/slic3r/GUI/MainFrame.cpp:1191 +msgid "Open new instance" +msgstr "Запустить новый экземпляр программы" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Camera view" -msgstr "Виды с камеры" +msgstr "Позиция камеры" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 msgid "Show/Hide object/instance labels" -msgstr "Показать/скрыть метки объекта/экземпляра" +msgstr "Показать/Скрыть имена файлов модели/копии" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 src/slic3r/GUI/Preferences.cpp:12 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 src/slic3r/GUI/Preferences.cpp:13 msgid "Preferences" -msgstr "Параметры" +msgstr "Настройки приложения" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 msgid "Show keyboard shortcuts list" -msgstr "Показать список клавиш доступа к командам" +msgstr "Показать список сочетаний клавиш" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Commands" msgstr "Команды" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Add Instance of the selected object" -msgstr "Добавить экземпляр выбранного объекта" +msgstr "Сделать копию выбранной модели" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 msgid "Remove Instance of the selected object" -msgstr "Удалить экземпляр выбранного объекта" +msgstr "Удалить копию выбранной модели" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" msgstr "" -"Нажмите для выбора или перемещения\n" -"нескольких объектов мышью" +"Выбор нескольких моделей или перемещение \n" +"нескольких моделей с помощью мышки" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 msgid "Press to activate selection rectangle" -msgstr "" +msgstr "Активация прямоугольника выделения" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Press to activate deselection rectangle" -msgstr "" +msgstr "Активация прямоугольника отмены выделения" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/KBShortcutsDialog.cpp:219 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Arrow Up" msgstr "Стрелка вверх" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Move selection 10 mm in positive Y direction" -msgstr "" +msgstr "Перемещение выбранного на 10 мм по оси Y+" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 src/slic3r/GUI/KBShortcutsDialog.cpp:220 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Arrow Down" msgstr "Стрелка вниз" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 msgid "Move selection 10 mm in negative Y direction" -msgstr "" +msgstr "Перемещение выбранного на 10 мм по оси Y-" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 src/slic3r/GUI/KBShortcutsDialog.cpp:228 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 src/slic3r/GUI/KBShortcutsDialog.cpp:246 msgid "Arrow Left" msgstr "Стрелка влево" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 msgid "Move selection 10 mm in negative X direction" -msgstr "" +msgstr "Перемещение выбранного на 10 мм по оси X-" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 src/slic3r/GUI/KBShortcutsDialog.cpp:199 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 src/slic3r/GUI/KBShortcutsDialog.cpp:229 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 src/slic3r/GUI/KBShortcutsDialog.cpp:247 msgid "Arrow Right" msgstr "Стрелка вправо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 msgid "Move selection 10 mm in positive X direction" -msgstr "" +msgstr "Перемещение выбранного на 10 мм по оси X+" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 src/slic3r/GUI/KBShortcutsDialog.cpp:132 msgid "Any arrow" msgstr "Любая стрелка" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 msgid "Movement step set to 1 mm" -msgstr "" +msgstr "Зафиксировать шаг перемещения на 1 мм" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 msgid "Movement in camera space" -msgstr "" +msgstr "Перемещение выбранного по отношению к камере" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 msgid "Page Up" msgstr "Page Up" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 msgid "Rotate selection 45 degrees CCW" -msgstr "" +msgstr "Поворот выбранного на 45° против часовой стрелки" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 msgid "Page Down" msgstr "Page Down" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 msgid "Rotate selection 45 degrees CW" -msgstr "" +msgstr "Поворот выбранного на 45° по часовой стрелки" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Gizmo move" -msgstr "" +msgstr "Гизмо перемещения" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 msgid "Gizmo scale" -msgstr "" +msgstr "Гизмо масштаба" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 msgid "Gizmo rotate" -msgstr "" +msgstr "Гизмо поворота" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 msgid "Gizmo cut" -msgstr "" +msgstr "Гизмо разреза" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 msgid "Gizmo Place face on bed" -msgstr "" +msgstr "Гизмо поверхностью на стол" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 msgid "Gizmo SLA hollow" -msgstr "" +msgstr "Гизмо полости" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 msgid "Gizmo SLA support points" -msgstr "" +msgstr "Гизмо точки SLA поддержки" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Unselect gizmo or clear selection" -msgstr "" +msgstr "Убрать гизмо выделение или очистить выбор" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Change camera type (perspective, orthographic)" -msgstr "" +msgstr "Тип камеры (вид в перспективе или ортогональный)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Zoom to Bed" -msgstr "" +msgstr "Приблизить до размера стола" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" msgstr "" +"Приближение камеры к выбранной модели \n" +"или всем моделям в сцене, если ничего не выбрано" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Zoom in" -msgstr "" +msgstr "Приблизить" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Zoom out" -msgstr "" +msgstr "Отдалить" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Switch between Editor/Preview" -msgstr "" +msgstr "Переключение между редактором/предпросмотром" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Collapse/Expand the sidebar" -msgstr "" +msgstr "Свернуть/Развернуть боковую панель" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "" +"Показать/скрыть диалоговое окно настроек устройств 3Dconnexion (если включено)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "" +"Показать/Скрыть диалоговое окно настроек \n" +"устройств 3Dconnexion" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 src/slic3r/GUI/MainFrame.cpp:328 -#: src/slic3r/GUI/MainFrame.cpp:340 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 src/slic3r/GUI/MainFrame.cpp:331 +#: src/slic3r/GUI/MainFrame.cpp:343 msgid "Plater" -msgstr "Компоновка" +msgstr "Стол" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "" +"Все гизмо: Вращение камеры - левая кнопка мыши; Перемещение камеры - правая кнопка " +"мыши" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Gizmo move: Press to snap by 1mm" -msgstr "" +msgstr "Гизмо перемещения: Фиксации перемещения на 1 мм" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Gizmo scale: Press to snap by 5%" -msgstr "" +msgstr "Гизмо масштаба: Фиксация увеличения на 5%" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Gizmo scale: Scale selection to fit print volume" -msgstr "" +msgstr "Гизмо масштаба: Масштабирование модели под область печати" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Gizmo scale: Press to activate one direction scaling" -msgstr "" +msgstr "Гизмо масштаба: Активация масштабирования в одном направлении" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 msgid "Gizmo scale: Press to scale selected objects around their own center" -msgstr "" +msgstr "Гизмо масштаба: Масштабирование выбранных моделей вокруг своего центра" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Gizmo rotate: Press to rotate selected objects around their own center" -msgstr "" +msgstr "Гизмо поворота: Поворот выбранных моделей вокруг своего центра" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 msgid "Gizmos" -msgstr "" +msgstr "Гизмо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 -msgid "Upper Layer" -msgstr "Верхний слой" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "The following shortcuts are applicable when the specified gizmo is active" +msgstr "Следующие сочетания клавиш применимы, когда активна выбранная гизмо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 -msgid "Lower Layer" -msgstr "Нижний слой" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 src/slic3r/GUI/MainFrame.cpp:1244 +msgid "Open a G-code file" +msgstr "Выберите G-код файл" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:210 -msgid "Show/Hide Legend & Estimated printing time" -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 src/slic3r/GUI/MainFrame.cpp:1142 +#: src/slic3r/GUI/MainFrame.cpp:1146 src/slic3r/GUI/MainFrame.cpp:1249 +#: src/slic3r/GUI/MainFrame.cpp:1253 +msgid "Reload the plater from disk" +msgstr "Перезагрузить стол с диска" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/Plater.cpp:4124 -#: src/slic3r/GUI/Tab.cpp:2597 -msgid "Preview" -msgstr "Предпросмотр" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 src/slic3r/GUI/KBShortcutsDialog.cpp:200 +msgid "Vertical slider - Move active thumb Up" +msgstr "Вертикальный ползунок - Сдвинуть активный ползунок вверх" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 -msgid "Move current slider thumb Up" -msgstr "Переместить текущий ползунок вверх" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 src/slic3r/GUI/KBShortcutsDialog.cpp:201 +msgid "Vertical slider - Move active thumb Down" +msgstr "Вертикальный ползунок - Сдвинуть активный ползунок вниз" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -msgid "Move current slider thumb Down" -msgstr "Переместить текущий ползунок вниз" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 src/slic3r/GUI/KBShortcutsDialog.cpp:202 +msgid "Horizontal slider - Move active thumb Left" +msgstr "Горизонтальный ползунок - Сдвинуть активный ползунок влево" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -msgid "Set upper thumb to current slider thumb" -msgstr "Сделать верхний ползунок текущим" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 src/slic3r/GUI/KBShortcutsDialog.cpp:203 +msgid "Horizontal slider - Move active thumb Right" +msgstr "Горизонтальный ползунок - Сдвинуть активный ползунок вправо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -msgid "Set lower thumb to current slider thumb" -msgstr "Сделать нижний ползунок текущим" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +msgid "On/Off one layer mode of the vertical slider" +msgstr "Включение/Отключение функции \"Режим одного слоя\" у вертикального ползунка" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +msgid "Show/Hide Legend and Estimated printing time" +msgstr "Показать/Скрыть условные обозначения/расчётное время печати" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 +msgid "Upper layer" +msgstr "Слой +" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 +msgid "Lower layer" +msgstr "Слой -" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +msgid "Upper Layer" +msgstr "Слой +" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:210 +msgid "Lower Layer" +msgstr "Слой -" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 +msgid "Show/Hide Legend & Estimated printing time" +msgstr "Показать/Скрыть условные обозначения/расчётное время печати" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 src/slic3r/GUI/Plater.cpp:4200 +#: src/slic3r/GUI/Tab.cpp:2602 +msgid "Preview" +msgstr "Предпросмотр нарезки" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 +msgid "Move active thumb Up" +msgstr "Сдвинуть активный ползунок вверх" #: src/slic3r/GUI/KBShortcutsDialog.cpp:220 +msgid "Move active thumb Down" +msgstr "Сдвинуть активный ползунок вниз" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +msgid "Set upper thumb as active" +msgstr "Переместить ползунок в верхнее положение" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +msgid "Set lower thumb as active" +msgstr "Переместить ползунок в нижнее положение" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Add color change marker for current layer" msgstr "Добавить маркер смены цвета для текущего слоя" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "Delete color change marker for current layer" msgstr "Удалить маркер смены цвета для текущего слоя" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +msgid "Move current slider thumb Up" +msgstr "Сдвинуть ползунок вверх" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +msgid "Move current slider thumb Down" +msgstr "Сдвинуть ползунок вниз" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 +msgid "Set upper thumb to current slider thumb" +msgstr "Переместить ползунок в верхнее положение" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 +msgid "Set lower thumb to current slider thumb" +msgstr "Переместить ползунок в нижнее положение" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 src/slic3r/GUI/KBShortcutsDialog.cpp:250 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" msgstr "" +"Ускорить перемещение ползунка в 5 раз с помощью \n" +"стрелок на клавиатуре или колесом мыши" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Layers Slider" -msgstr "Ползунок по слоям" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +msgid "Vertical Slider" +msgstr "Вертикальный ползунок" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 -msgid "Move current slider thumb Left" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +msgid "" +"The following shortcuts are applicable in G-code preview when the vertical slider " +"is active" msgstr "" +"Следующие сочетания клавиш применимы в окне предпросмотра G-кода, когда " +"вертикальный ползунок активен" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 -msgid "Move current slider thumb Right" -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +msgid "Move active thumb Left" +msgstr "Сдвинуть активный ползунок влево" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -msgid "Sequential Slider" -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +msgid "Move active thumb Right" +msgstr "Сдвинуть активный ползунок вправо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:258 -msgid "Keyboard shortcuts" -msgstr "Клавиатурные комбинации" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +msgid "Set left thumb as active" +msgstr "Переместить ползунок в левое положение" -#: src/slic3r/GUI/MainFrame.cpp:64 src/slic3r/GUI/MainFrame.cpp:1189 -msgid "Open new instance" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 +msgid "Set right thumb as active" +msgstr "Переместить ползунок в правое положение" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +msgid "Move active slider thumb Left" +msgstr "Сдвинуть активный ползунок влево" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +msgid "Move active slider thumb Right" +msgstr "Сдвинуть активный ползунок вправо" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 +msgid "Horizontal Slider" +msgstr "Горизонтальный ползунок" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 +msgid "" +"The following shortcuts are applicable in G-code preview when the horizontal slider " +"is active" msgstr "" +"Следующие сочетания клавиш применимы в окне предпросмотра G-кода, когда " +"горизонтальный ползунок активен" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:276 +msgid "Keyboard shortcuts" +msgstr "Горячие клавиши" -#: src/slic3r/GUI/MainFrame.cpp:64 src/slic3r/GUI/MainFrame.cpp:78 -#: src/slic3r/GUI/MainFrame.cpp:1189 +#: src/slic3r/GUI/MainFrame.cpp:65 src/slic3r/GUI/MainFrame.cpp:79 +#: src/slic3r/GUI/MainFrame.cpp:1191 msgid "Open a new PrusaSlicer instance" -msgstr "" +msgstr "Запустить новый экземпляр PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:67 src/slic3r/GUI/MainFrame.cpp:80 +#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:81 msgid "G-code preview" -msgstr "" +msgstr "Предпросмотр G-кода" -#: src/slic3r/GUI/MainFrame.cpp:67 src/slic3r/GUI/MainFrame.cpp:1095 +#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:1091 msgid "Open G-code viewer" -msgstr "" +msgstr "Открыть просмотрщик G-кода" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1250 +#: src/slic3r/GUI/MainFrame.cpp:79 src/slic3r/GUI/MainFrame.cpp:1260 msgid "Open PrusaSlicer" -msgstr "" +msgstr "Открыть PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:80 +#: src/slic3r/GUI/MainFrame.cpp:81 msgid "Open new G-code viewer" -msgstr "" +msgstr "Открыть новый просмотрщик G-кода" -#: src/slic3r/GUI/MainFrame.cpp:155 +#: src/slic3r/GUI/MainFrame.cpp:153 msgid "" -"Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/" -"releases" +"Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/releases" msgstr "" +"- Не забывайте периодически проверять обновления на https://github.com/prusa3d/" +"PrusaSlicer/releases" -#: src/slic3r/GUI/MainFrame.cpp:507 +#: src/slic3r/GUI/MainFrame.cpp:510 msgid "based on Slic3r" -msgstr "основывается на Slic3r" +msgstr "созданная на остове Slic3r" -#: src/slic3r/GUI/MainFrame.cpp:870 +#: src/slic3r/GUI/MainFrame.cpp:866 msgid "Prusa 3D &Drivers" -msgstr "Драйверы Prusa 3D" +msgstr "&Драйверы Prusa 3D" -#: src/slic3r/GUI/MainFrame.cpp:870 +#: src/slic3r/GUI/MainFrame.cpp:866 msgid "Open the Prusa3D drivers download page in your browser" -msgstr "Открыть страницу загрузки драйверов Prusa3D в браузере" +msgstr "Открыть страницу загрузки драйверов Prusa3D" -#: src/slic3r/GUI/MainFrame.cpp:872 +#: src/slic3r/GUI/MainFrame.cpp:868 msgid "Software &Releases" -msgstr "Выпуски ПО" +msgstr "PrusaSlicer на Github" -#: src/slic3r/GUI/MainFrame.cpp:872 +#: src/slic3r/GUI/MainFrame.cpp:868 msgid "Open the software releases page in your browser" -msgstr "Открыть страницу выпусков ПО в браузере" +msgstr "Открыть страницу программы PrusaSlicer на Github" -#: src/slic3r/GUI/MainFrame.cpp:878 +#: src/slic3r/GUI/MainFrame.cpp:874 #, c-format msgid "%s &Website" msgstr "Сайт %s" -#: src/slic3r/GUI/MainFrame.cpp:879 +#: src/slic3r/GUI/MainFrame.cpp:875 #, c-format msgid "Open the %s website in your browser" -msgstr "Открыть сайт %s в браузере" +msgstr "Открыть сайт %s" -#: src/slic3r/GUI/MainFrame.cpp:885 +#: src/slic3r/GUI/MainFrame.cpp:881 msgid "System &Info" -msgstr "Системная информация" +msgstr "&Информация о системе" -#: src/slic3r/GUI/MainFrame.cpp:885 +#: src/slic3r/GUI/MainFrame.cpp:881 msgid "Show system information" msgstr "Показать системную информацию" -#: src/slic3r/GUI/MainFrame.cpp:887 +#: src/slic3r/GUI/MainFrame.cpp:883 msgid "Show &Configuration Folder" -msgstr "Каталог настроек" +msgstr "Показать &конфигурационную папку" -#: src/slic3r/GUI/MainFrame.cpp:887 +#: src/slic3r/GUI/MainFrame.cpp:883 msgid "Show user configuration folder (datadir)" -msgstr "Открыть каталог настроек пользователя (datadir) во внешней программе" +msgstr "Показать папку конфигурации пользователя (datadir)" -#: src/slic3r/GUI/MainFrame.cpp:889 +#: src/slic3r/GUI/MainFrame.cpp:885 msgid "Report an I&ssue" -msgstr "Сообщить о проблеме" +msgstr "Сообщить о &проблеме" -#: src/slic3r/GUI/MainFrame.cpp:889 +#: src/slic3r/GUI/MainFrame.cpp:885 #, c-format msgid "Report an issue on %s" -msgstr "Сообщить о проблеме с %s" +msgstr "Сообщить о проблеме в %s" -#: src/slic3r/GUI/MainFrame.cpp:892 src/slic3r/GUI/MainFrame.cpp:895 +#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891 #, c-format msgid "&About %s" -msgstr "О %s" +msgstr "&O программе %s" -#: src/slic3r/GUI/MainFrame.cpp:892 src/slic3r/GUI/MainFrame.cpp:895 +#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891 msgid "Show about dialog" msgstr "Показать окно с информацией о программе" -#: src/slic3r/GUI/MainFrame.cpp:898 +#: src/slic3r/GUI/MainFrame.cpp:894 msgid "Show the list of the keyboard shortcuts" -msgstr "Показать список клавиш доступа к командам" +msgstr "Показать список сочетаний клавиш" -#: src/slic3r/GUI/MainFrame.cpp:912 +#: src/slic3r/GUI/MainFrame.cpp:908 msgid "Iso" msgstr "Изометрия" -#: src/slic3r/GUI/MainFrame.cpp:912 +#: src/slic3r/GUI/MainFrame.cpp:908 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:916 src/libslic3r/PrintConfig.cpp:2328 -#: src/libslic3r/PrintConfig.cpp:2337 +#: src/slic3r/GUI/MainFrame.cpp:912 src/libslic3r/PrintConfig.cpp:2360 +#: src/libslic3r/PrintConfig.cpp:2369 msgid "Top" msgstr "Сверху" -#: src/slic3r/GUI/MainFrame.cpp:916 +#: src/slic3r/GUI/MainFrame.cpp:912 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:919 src/libslic3r/PrintConfig.cpp:215 -#: src/libslic3r/PrintConfig.cpp:224 +#: src/slic3r/GUI/MainFrame.cpp:915 src/libslic3r/PrintConfig.cpp:230 +#: src/libslic3r/PrintConfig.cpp:239 msgid "Bottom" msgstr "Снизу" -#: src/slic3r/GUI/MainFrame.cpp:919 +#: src/slic3r/GUI/MainFrame.cpp:915 msgid "Bottom View" msgstr "Вид снизу" -#: src/slic3r/GUI/MainFrame.cpp:921 +#: src/slic3r/GUI/MainFrame.cpp:917 msgid "Front" msgstr "Спереди" -#: src/slic3r/GUI/MainFrame.cpp:921 +#: src/slic3r/GUI/MainFrame.cpp:917 msgid "Front View" msgstr "Вид спереди" -#: src/slic3r/GUI/MainFrame.cpp:923 src/libslic3r/PrintConfig.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:919 src/libslic3r/PrintConfig.cpp:1845 msgid "Rear" msgstr "Сзади" -#: src/slic3r/GUI/MainFrame.cpp:923 +#: src/slic3r/GUI/MainFrame.cpp:919 msgid "Rear View" msgstr "Вид сзади" -#: src/slic3r/GUI/MainFrame.cpp:925 +#: src/slic3r/GUI/MainFrame.cpp:921 msgid "Left" msgstr "Слева" -#: src/slic3r/GUI/MainFrame.cpp:925 +#: src/slic3r/GUI/MainFrame.cpp:921 msgid "Left View" msgstr "Вид слева" -#: src/slic3r/GUI/MainFrame.cpp:927 +#: src/slic3r/GUI/MainFrame.cpp:923 msgid "Right" msgstr "Справа" -#: src/slic3r/GUI/MainFrame.cpp:927 +#: src/slic3r/GUI/MainFrame.cpp:923 msgid "Right View" msgstr "Вид справа" -#: src/slic3r/GUI/MainFrame.cpp:940 +#: src/slic3r/GUI/MainFrame.cpp:936 msgid "&New Project" msgstr "&Новый проект" -#: src/slic3r/GUI/MainFrame.cpp:940 +#: src/slic3r/GUI/MainFrame.cpp:936 msgid "Start a new project" msgstr "Начать новый проект" -#: src/slic3r/GUI/MainFrame.cpp:943 +#: src/slic3r/GUI/MainFrame.cpp:939 msgid "&Open Project" msgstr "&Открыть проект" -#: src/slic3r/GUI/MainFrame.cpp:943 +#: src/slic3r/GUI/MainFrame.cpp:939 msgid "Open a project file" msgstr "Открыть файл проекта" -#: src/slic3r/GUI/MainFrame.cpp:948 +#: src/slic3r/GUI/MainFrame.cpp:944 msgid "Recent projects" msgstr "Недавние проекты" -#: src/slic3r/GUI/MainFrame.cpp:957 +#: src/slic3r/GUI/MainFrame.cpp:953 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -4371,617 +4549,618 @@ msgstr "" "Выбранный проект больше недоступен.\n" "Удалить его из списка последних проектов?" -#: src/slic3r/GUI/MainFrame.cpp:957 src/slic3r/GUI/MainFrame.cpp:1333 -#: src/slic3r/GUI/PrintHostDialogs.cpp:259 +#: src/slic3r/GUI/MainFrame.cpp:953 src/slic3r/GUI/MainFrame.cpp:1343 +#: src/slic3r/GUI/PrintHostDialogs.cpp:263 msgid "Error" msgstr "Ошибка" -#: src/slic3r/GUI/MainFrame.cpp:982 +#: src/slic3r/GUI/MainFrame.cpp:978 msgid "&Save Project" msgstr "&Сохранить проект" -#: src/slic3r/GUI/MainFrame.cpp:982 +#: src/slic3r/GUI/MainFrame.cpp:978 msgid "Save current project file" -msgstr "Сохранить файл текущего проекта" +msgstr "Сохранить текущий файл проекта" -#: src/slic3r/GUI/MainFrame.cpp:986 src/slic3r/GUI/MainFrame.cpp:988 +#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984 msgid "Save Project &as" -msgstr "Сохранить проект как" +msgstr "Сохранить проект &как" -#: src/slic3r/GUI/MainFrame.cpp:986 src/slic3r/GUI/MainFrame.cpp:988 +#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984 msgid "Save current project file as" -msgstr "Сохранить файл текущего проекта под другим именем" +msgstr "Сохранить текущий файл проекта как" -#: src/slic3r/GUI/MainFrame.cpp:996 +#: src/slic3r/GUI/MainFrame.cpp:992 msgid "Import STL/OBJ/AM&F/3MF" -msgstr "Импортировать STL/OBJ/AM&F/3MF" +msgstr "Загрузить STL/OBJ/AMF/3MF" -#: src/slic3r/GUI/MainFrame.cpp:996 +#: src/slic3r/GUI/MainFrame.cpp:992 msgid "Load a model" msgstr "Загрузить модель" -#: src/slic3r/GUI/MainFrame.cpp:1000 +#: src/slic3r/GUI/MainFrame.cpp:996 msgid "Import STL (imperial units)" -msgstr "" +msgstr "Загрузить STL (английская система мер)" -#: src/slic3r/GUI/MainFrame.cpp:1000 +#: src/slic3r/GUI/MainFrame.cpp:996 msgid "Load an model saved with imperial units" -msgstr "" +msgstr "Загрузить модель, сохраненную с размерами в английской системе мер" -#: src/slic3r/GUI/MainFrame.cpp:1004 +#: src/slic3r/GUI/MainFrame.cpp:1000 msgid "Import SL1 archive" -msgstr "" +msgstr "Импорт SL1 архива" -#: src/slic3r/GUI/MainFrame.cpp:1004 +#: src/slic3r/GUI/MainFrame.cpp:1000 msgid "Load an SL1 archive" -msgstr "" +msgstr "Импорт SL1 архива" -#: src/slic3r/GUI/MainFrame.cpp:1009 +#: src/slic3r/GUI/MainFrame.cpp:1005 msgid "Import &Config" -msgstr "Импортировать настройки" +msgstr "Загрузить текущую конфигурацию" -#: src/slic3r/GUI/MainFrame.cpp:1009 +#: src/slic3r/GUI/MainFrame.cpp:1005 msgid "Load exported configuration file" -msgstr "Загрузить сохранённый файл настроек" +msgstr "Загрузить сохранённый файл конфигурации" -#: src/slic3r/GUI/MainFrame.cpp:1012 +#: src/slic3r/GUI/MainFrame.cpp:1008 msgid "Import Config from &project" -msgstr "Импортировать настройки из проекта" +msgstr "Загрузить конфигурацию из проекта" -#: src/slic3r/GUI/MainFrame.cpp:1012 +#: src/slic3r/GUI/MainFrame.cpp:1008 msgid "Load configuration from project file" -msgstr "Загрузить настройки из файла проекта" +msgstr "Загрузить конфигурацию из файла проекта" -#: src/slic3r/GUI/MainFrame.cpp:1016 +#: src/slic3r/GUI/MainFrame.cpp:1012 msgid "Import Config &Bundle" -msgstr "Импортировать комплект настроек" +msgstr "Импортировать все профили" -#: src/slic3r/GUI/MainFrame.cpp:1016 +#: src/slic3r/GUI/MainFrame.cpp:1012 msgid "Load presets from a bundle" -msgstr "Загрузить все профили из комплекта" +msgstr "Импортировать все профили из файла" -#: src/slic3r/GUI/MainFrame.cpp:1019 +#: src/slic3r/GUI/MainFrame.cpp:1015 msgid "&Import" -msgstr "Импорт" +msgstr "&Импорт" -#: src/slic3r/GUI/MainFrame.cpp:1022 src/slic3r/GUI/MainFrame.cpp:1295 +#: src/slic3r/GUI/MainFrame.cpp:1018 src/slic3r/GUI/MainFrame.cpp:1305 msgid "Export &G-code" -msgstr "Экспортировать G-код" +msgstr "Экспорт в G-&код" -#: src/slic3r/GUI/MainFrame.cpp:1022 +#: src/slic3r/GUI/MainFrame.cpp:1018 msgid "Export current plate as G-code" -msgstr "Экспортировать текущую компоновку как G-код" +msgstr "Экспортировать текущие модели со стола в G-код" -#: src/slic3r/GUI/MainFrame.cpp:1026 src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1022 src/slic3r/GUI/MainFrame.cpp:1306 msgid "S&end G-code" -msgstr "Послать G-код" +msgstr "&Отправить G-код" -#: src/slic3r/GUI/MainFrame.cpp:1026 +#: src/slic3r/GUI/MainFrame.cpp:1022 msgid "Send to print current plate as G-code" -msgstr "Послать на печать текущую компоновку как G-код" +msgstr "Отправить на печать текущий стол как G-код" -#: src/slic3r/GUI/MainFrame.cpp:1030 +#: src/slic3r/GUI/MainFrame.cpp:1026 msgid "Export G-code to SD card / Flash drive" -msgstr "Экспортировать G-код на SD-карту/флешку" +msgstr "Экспорт G-кода на SD-карту / USB-накопитель" -#: src/slic3r/GUI/MainFrame.cpp:1030 +#: src/slic3r/GUI/MainFrame.cpp:1026 msgid "Export current plate as G-code to SD card / Flash drive" -msgstr "Экспортировать текущую компоновку как G-код на SD-карту/флешку" +msgstr "Экспортировать текущие модели со стола в G-код на SD-карту / USB-накопитель" -#: src/slic3r/GUI/MainFrame.cpp:1034 +#: src/slic3r/GUI/MainFrame.cpp:1030 msgid "Export plate as &STL" -msgstr "Экспортировать компоновку в STL" +msgstr "Экспорт &стола в STL" -#: src/slic3r/GUI/MainFrame.cpp:1034 +#: src/slic3r/GUI/MainFrame.cpp:1030 msgid "Export current plate as STL" -msgstr "Экспортировать текущую компоновку в STL" +msgstr "Экспортировать текущие модели со стола в STL" -#: src/slic3r/GUI/MainFrame.cpp:1037 +#: src/slic3r/GUI/MainFrame.cpp:1033 msgid "Export plate as STL &including supports" -msgstr "Экспортировать компоновку в STL с поддержками" +msgstr "Экспорт стола в STL вместе с &поддержками" -#: src/slic3r/GUI/MainFrame.cpp:1037 +#: src/slic3r/GUI/MainFrame.cpp:1033 msgid "Export current plate as STL including supports" -msgstr "Экспортировать текущую компоновку в STL включая поддержки" +msgstr "Экспортировать текущий стол в STL, включая поддержки" -#: src/slic3r/GUI/MainFrame.cpp:1040 +#: src/slic3r/GUI/MainFrame.cpp:1036 msgid "Export plate as &AMF" -msgstr "Экспортировать компоновку в &AMF" +msgstr "Экспорт стол&а в AMF" -#: src/slic3r/GUI/MainFrame.cpp:1040 +#: src/slic3r/GUI/MainFrame.cpp:1036 msgid "Export current plate as AMF" -msgstr "Экспортировать текущую компоновку в AMF" +msgstr "Экспортировать текущие модели со стола в AMF" -#: src/slic3r/GUI/MainFrame.cpp:1044 src/slic3r/GUI/MainFrame.cpp:1247 +#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257 msgid "Export &toolpaths as OBJ" -msgstr "Экспортировать траектории в OBJ" +msgstr "Экспорт траектории &инструмента в OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1044 src/slic3r/GUI/MainFrame.cpp:1247 +#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257 msgid "Export toolpaths as OBJ" -msgstr "Экспортировать траектории в OBJ" +msgstr "Экспортировать траекторию инструмента в OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1048 +#: src/slic3r/GUI/MainFrame.cpp:1044 msgid "Export &Config" -msgstr "Экспортировать настройки" +msgstr "Экспорт &текущей конфигурации" -#: src/slic3r/GUI/MainFrame.cpp:1048 +#: src/slic3r/GUI/MainFrame.cpp:1044 msgid "Export current configuration to file" -msgstr "Экспортировать текущие настройки в файл" +msgstr "Экспортировать текущую конфигурацию в файл" -#: src/slic3r/GUI/MainFrame.cpp:1051 +#: src/slic3r/GUI/MainFrame.cpp:1047 msgid "Export Config &Bundle" -msgstr "Экспортировать комплект настроек" +msgstr "Экспорт &всех профилей" -#: src/slic3r/GUI/MainFrame.cpp:1051 +#: src/slic3r/GUI/MainFrame.cpp:1047 msgid "Export all presets to file" -msgstr "Экспортировать комплект настроек в файл" +msgstr "Экспортировать все профили в единый файл" -#: src/slic3r/GUI/MainFrame.cpp:1054 +#: src/slic3r/GUI/MainFrame.cpp:1050 msgid "Export Config Bundle With Physical Printers" -msgstr "" +msgstr "Экспорт всех профилей с физическими принтерами" -#: src/slic3r/GUI/MainFrame.cpp:1054 +#: src/slic3r/GUI/MainFrame.cpp:1050 msgid "Export all presets including physical printers to file" -msgstr "" +msgstr "Экспорт всех профилей в файл, включая физические принтеры" -#: src/slic3r/GUI/MainFrame.cpp:1057 +#: src/slic3r/GUI/MainFrame.cpp:1053 msgid "&Export" -msgstr "Экспорт" +msgstr "&Экспорт" -#: src/slic3r/GUI/MainFrame.cpp:1059 +#: src/slic3r/GUI/MainFrame.cpp:1055 msgid "Ejec&t SD card / Flash drive" -msgstr "Извлечь SD-карту / Flash-накопитель" +msgstr "Из&влечь SD-карту / USB-накопитель" -#: src/slic3r/GUI/MainFrame.cpp:1059 +#: src/slic3r/GUI/MainFrame.cpp:1055 msgid "Eject SD card / Flash drive after the G-code was exported to it." -msgstr "" -"Извлечь SD-карту / Flash-накопитель после экспортирования на неё G-кода." +msgstr "Извлечение SD-карты / USB-накопителя (после экспорта G-кода на носитель)" -#: src/slic3r/GUI/MainFrame.cpp:1067 +#: src/slic3r/GUI/MainFrame.cpp:1063 msgid "Quick Slice" -msgstr "Быстрая нарезка" +msgstr "Быстро нарезать" -#: src/slic3r/GUI/MainFrame.cpp:1067 +#: src/slic3r/GUI/MainFrame.cpp:1063 msgid "Slice a file into a G-code" -msgstr "Нарезать файл в G-код" +msgstr "Нарезать файл" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1069 msgid "Quick Slice and Save As" msgstr "Быстро нарезать и сохранить как" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1069 msgid "Slice a file into a G-code, save as" -msgstr "Нарезать файл в G-код, сохранить как" +msgstr "Нарезать файл и сохранить как" -#: src/slic3r/GUI/MainFrame.cpp:1079 +#: src/slic3r/GUI/MainFrame.cpp:1075 msgid "Repeat Last Quick Slice" msgstr "Повторить последнюю быструю нарезку" -#: src/slic3r/GUI/MainFrame.cpp:1079 +#: src/slic3r/GUI/MainFrame.cpp:1075 msgid "Repeat last quick slice" -msgstr "Повторить последнюю быструю нарезку" +msgstr "Повтор последней быстрой нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1087 +#: src/slic3r/GUI/MainFrame.cpp:1083 msgid "(Re)Slice No&w" -msgstr "(Пере)Нарезать" +msgstr "(&Пере)Нарезать" -#: src/slic3r/GUI/MainFrame.cpp:1087 +#: src/slic3r/GUI/MainFrame.cpp:1083 msgid "Start new slicing process" msgstr "Начать новый процесс нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1091 +#: src/slic3r/GUI/MainFrame.cpp:1087 msgid "&Repair STL file" -msgstr "Починить STL-файл" +msgstr "По&чинить STL файл" -#: src/slic3r/GUI/MainFrame.cpp:1091 +#: src/slic3r/GUI/MainFrame.cpp:1087 msgid "Automatically repair an STL file" -msgstr "Автоматическая починка STL-файла" +msgstr "Автоматическая починка STL файла" -#: src/slic3r/GUI/MainFrame.cpp:1095 +#: src/slic3r/GUI/MainFrame.cpp:1091 msgid "&G-code preview" -msgstr "" +msgstr "Пред&просмотр G-кода" -#: src/slic3r/GUI/MainFrame.cpp:1098 src/slic3r/GUI/MainFrame.cpp:1254 +#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264 msgid "&Quit" msgstr "&Выход" -#: src/slic3r/GUI/MainFrame.cpp:1098 src/slic3r/GUI/MainFrame.cpp:1254 +#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264 #, c-format msgid "Quit %s" -msgstr "Выход из %s" +msgstr "Выйти из %s" -#: src/slic3r/GUI/MainFrame.cpp:1113 +#: src/slic3r/GUI/MainFrame.cpp:1109 msgid "&Select all" -msgstr "Выбрать всё" +msgstr "Выбрать &всё" -#: src/slic3r/GUI/MainFrame.cpp:1114 +#: src/slic3r/GUI/MainFrame.cpp:1110 msgid "Selects all objects" -msgstr "Выбрать все объекты" +msgstr "Выбрать все модели" -#: src/slic3r/GUI/MainFrame.cpp:1116 +#: src/slic3r/GUI/MainFrame.cpp:1112 msgid "D&eselect all" -msgstr "Отменить всё" +msgstr "&Снять выбор со всего" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1113 msgid "Deselects all objects" -msgstr "Отменить выбор всех объектов" +msgstr "Выбрать все модели" -#: src/slic3r/GUI/MainFrame.cpp:1120 +#: src/slic3r/GUI/MainFrame.cpp:1116 msgid "&Delete selected" -msgstr "Удалить выбранное" +msgstr "&Удалить выбранные" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1117 msgid "Deletes the current selection" -msgstr "Удалить текущее выделение" +msgstr "Удалить текущие выбранные модели" -#: src/slic3r/GUI/MainFrame.cpp:1123 +#: src/slic3r/GUI/MainFrame.cpp:1119 msgid "Delete &all" -msgstr "Удалить всё" +msgstr "Уд&алить всё" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1120 msgid "Deletes all objects" -msgstr "Удалить все объекты" +msgstr "Удалить все модели" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1124 msgid "&Undo" -msgstr "&Отменить" +msgstr "&Отмена" -#: src/slic3r/GUI/MainFrame.cpp:1131 +#: src/slic3r/GUI/MainFrame.cpp:1127 msgid "&Redo" -msgstr "&Вернуть" +msgstr "&Повтор" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "&Copy" -msgstr "&Копировать" +msgstr "С&копировать" -#: src/slic3r/GUI/MainFrame.cpp:1137 +#: src/slic3r/GUI/MainFrame.cpp:1133 msgid "Copy selection to clipboard" -msgstr "Скопировать выделение в буфер обмена" +msgstr "Скопировать выделенное в буфер обмена" -#: src/slic3r/GUI/MainFrame.cpp:1139 +#: src/slic3r/GUI/MainFrame.cpp:1135 msgid "&Paste" msgstr "&Вставить" -#: src/slic3r/GUI/MainFrame.cpp:1140 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Paste clipboard" msgstr "Вставить из буфера обмена" -#: src/slic3r/GUI/MainFrame.cpp:1144 +#: src/slic3r/GUI/MainFrame.cpp:1141 src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1248 src/slic3r/GUI/MainFrame.cpp:1252 msgid "Re&load from disk" -msgstr "Перезагрузить с диска" - -#: src/slic3r/GUI/MainFrame.cpp:1145 -msgid "Reload the plater from disk" -msgstr "Перезагрузить компоновку с диска" +msgstr "Пере&загрузить с диска" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1151 msgid "Searc&h" -msgstr "Поиск" +msgstr "&Поиск" -#: src/slic3r/GUI/MainFrame.cpp:1150 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Search in settings" -msgstr "" +msgstr "Поиск в настройках" -#: src/slic3r/GUI/MainFrame.cpp:1158 +#: src/slic3r/GUI/MainFrame.cpp:1160 msgid "&Plater Tab" -msgstr "&Вкладка компоновки" +msgstr "Вкладка &стола" -#: src/slic3r/GUI/MainFrame.cpp:1158 +#: src/slic3r/GUI/MainFrame.cpp:1160 msgid "Show the plater" -msgstr "Показать компоновку" +msgstr "Показать вкладку стола" -#: src/slic3r/GUI/MainFrame.cpp:1163 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "P&rint Settings Tab" -msgstr "Вкладка настройки печати" +msgstr "Вкладка настройки &печати" -#: src/slic3r/GUI/MainFrame.cpp:1163 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show the print settings" msgstr "Показать настройки печати" -#: src/slic3r/GUI/MainFrame.cpp:1166 src/slic3r/GUI/MainFrame.cpp:1298 +#: src/slic3r/GUI/MainFrame.cpp:1168 src/slic3r/GUI/MainFrame.cpp:1308 msgid "&Filament Settings Tab" -msgstr "Вкладка настройки прутка" +msgstr "Вкладка настройки п&рутка" -#: src/slic3r/GUI/MainFrame.cpp:1166 +#: src/slic3r/GUI/MainFrame.cpp:1168 msgid "Show the filament settings" msgstr "Показать настройки прутка" -#: src/slic3r/GUI/MainFrame.cpp:1170 +#: src/slic3r/GUI/MainFrame.cpp:1172 msgid "Print&er Settings Tab" -msgstr "Вкладка настройки принтера" +msgstr "Вкладка настройки прин&тера" -#: src/slic3r/GUI/MainFrame.cpp:1170 +#: src/slic3r/GUI/MainFrame.cpp:1172 msgid "Show the printer settings" msgstr "Показать настройки принтера" -#: src/slic3r/GUI/MainFrame.cpp:1176 +#: src/slic3r/GUI/MainFrame.cpp:1178 msgid "3&D" -msgstr "3D" +msgstr "&3D-вид" -#: src/slic3r/GUI/MainFrame.cpp:1176 +#: src/slic3r/GUI/MainFrame.cpp:1178 msgid "Show the 3D editing view" -msgstr "Показать редактируемое отображение в 3D" +msgstr "Показать вкладку 3D-вид" -#: src/slic3r/GUI/MainFrame.cpp:1179 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "Pre&view" -msgstr "Предварительный просмотр" +msgstr "Предпр&осмотр нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1179 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "Show the 3D slices preview" -msgstr "Показать 3D нарезку" +msgstr "Показать предпросмотр нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1185 +#: src/slic3r/GUI/MainFrame.cpp:1187 msgid "Print &Host Upload Queue" -msgstr "Очередь отправки на узел печати" +msgstr "Очередь загрузки на &хост печати" -#: src/slic3r/GUI/MainFrame.cpp:1185 +#: src/slic3r/GUI/MainFrame.cpp:1187 msgid "Display the Print Host Upload Queue window" -msgstr "Показать окно очереди отправки на узел печати" +msgstr "Показать очередь загрузки на хост печати" -#: src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1201 msgid "Show &labels" -msgstr "Показать метки" +msgstr "Показать &имена файлов" -#: src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1201 msgid "Show object/instance labels in 3D scene" -msgstr "Показать метки объекта/экземпляра в 3D-сцене" +msgstr "Отображать имена файлов моделей\\копий в окне 3D-вида" -#: src/slic3r/GUI/MainFrame.cpp:1203 +#: src/slic3r/GUI/MainFrame.cpp:1204 msgid "&Collapse sidebar" -msgstr "Скрыть боковую панель" +msgstr "&Свернуть боковую панель" -#: src/slic3r/GUI/MainFrame.cpp:1203 src/slic3r/GUI/Plater.cpp:2225 +#: src/slic3r/GUI/MainFrame.cpp:1204 src/slic3r/GUI/Plater.cpp:2247 msgid "Collapse sidebar" -msgstr "Скрыть боковую панель" +msgstr "Свернуть боковую панель" -#: src/slic3r/GUI/MainFrame.cpp:1215 src/slic3r/GUI/MainFrame.cpp:1269 +#: src/slic3r/GUI/MainFrame.cpp:1216 src/slic3r/GUI/MainFrame.cpp:1279 msgid "&File" msgstr "&Файл" -#: src/slic3r/GUI/MainFrame.cpp:1216 +#: src/slic3r/GUI/MainFrame.cpp:1217 msgid "&Edit" msgstr "&Правка" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1218 msgid "&Window" msgstr "&Окна" -#: src/slic3r/GUI/MainFrame.cpp:1218 src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1219 src/slic3r/GUI/MainFrame.cpp:1280 msgid "&View" msgstr "&Вид" -#: src/slic3r/GUI/MainFrame.cpp:1221 src/slic3r/GUI/MainFrame.cpp:1273 +#: src/slic3r/GUI/MainFrame.cpp:1222 src/slic3r/GUI/MainFrame.cpp:1283 msgid "&Help" -msgstr "&Справка" +msgstr "&Помощь" -#: src/slic3r/GUI/MainFrame.cpp:1243 +#: src/slic3r/GUI/MainFrame.cpp:1244 msgid "&Open G-code" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:1243 -msgid "Open a G-code file" -msgstr "" +msgstr "&Открыть G-код файл" -#: src/slic3r/GUI/MainFrame.cpp:1250 +#: src/slic3r/GUI/MainFrame.cpp:1260 msgid "Open &PrusaSlicer" -msgstr "" +msgstr "Открыть &PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:1295 +#: src/slic3r/GUI/MainFrame.cpp:1305 msgid "E&xport" msgstr "&Экспорт" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1306 msgid "S&end to print" -msgstr "Послать на печать" +msgstr "&Отправить на печать" -#: src/slic3r/GUI/MainFrame.cpp:1298 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Mate&rial Settings Tab" msgstr "Вкладка настройки материала" -#: src/slic3r/GUI/MainFrame.cpp:1321 +#: src/slic3r/GUI/MainFrame.cpp:1331 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Выберите файл для нарезки (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "No previously sliced file." msgstr "Нет ранее нарезанного файла." -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1348 msgid "Previously sliced file (" msgstr "Ранее нарезанный файл" -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1348 msgid ") not found." msgstr ") не найден." -#: src/slic3r/GUI/MainFrame.cpp:1339 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "File Not Found" msgstr "Файл не найден" -#: src/slic3r/GUI/MainFrame.cpp:1374 +#: src/slic3r/GUI/MainFrame.cpp:1384 #, c-format msgid "Save %s file as:" -msgstr "Сохранить файл %s как:" +msgstr "Сохранить %s файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1374 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1374 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "G-code" msgstr "G-код" -#: src/slic3r/GUI/MainFrame.cpp:1386 +#: src/slic3r/GUI/MainFrame.cpp:1396 msgid "Save zip file as:" -msgstr "Сохранить zip-файл как:" +msgstr "Сохранить .zip файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1395 src/slic3r/GUI/Plater.cpp:2984 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:1576 -#: src/slic3r/GUI/Tab.cpp:4105 +#: src/slic3r/GUI/MainFrame.cpp:1405 src/slic3r/GUI/Plater.cpp:3009 +#: src/slic3r/GUI/Plater.cpp:5581 src/slic3r/GUI/Tab.cpp:1575 +#: src/slic3r/GUI/Tab.cpp:4115 msgid "Slicing" msgstr "Нарезка" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1397 +#: src/slic3r/GUI/MainFrame.cpp:1407 #, c-format msgid "Processing %s" -msgstr "Обрабатывается %s" +msgstr "Обработка %s" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1430 msgid "%1% was successfully sliced." -msgstr "" +msgstr "%1% успешно нарезан." -#: src/slic3r/GUI/MainFrame.cpp:1422 +#: src/slic3r/GUI/MainFrame.cpp:1432 msgid "Slicing Done!" msgstr "Нарезка завершена!" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1447 msgid "Select the STL file to repair:" msgstr "Выберите STL файл для починки:" -#: src/slic3r/GUI/MainFrame.cpp:1447 +#: src/slic3r/GUI/MainFrame.cpp:1457 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" -msgstr "Сохранить в OBJ как (меньше подвержен ошибкам в координатах, чем STL:" +msgstr "Сохранить в OBJ как (меньше подвержен ошибкам в координатах, чем STL):" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Your file was repaired." msgstr "Ваш файл был починен." -#: src/slic3r/GUI/MainFrame.cpp:1459 src/libslic3r/PrintConfig.cpp:3700 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/libslic3r/PrintConfig.cpp:3735 msgid "Repair" -msgstr "Починка" +msgstr "Ремонт" -#: src/slic3r/GUI/MainFrame.cpp:1473 +#: src/slic3r/GUI/MainFrame.cpp:1483 msgid "Save configuration as:" msgstr "Сохранить конфигурацию в файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1492 src/slic3r/GUI/MainFrame.cpp:1554 +#: src/slic3r/GUI/MainFrame.cpp:1502 src/slic3r/GUI/MainFrame.cpp:1564 msgid "Select configuration to load:" msgstr "Выберите файл конфигурации для загрузки:" -#: src/slic3r/GUI/MainFrame.cpp:1528 +#: src/slic3r/GUI/MainFrame.cpp:1538 msgid "Save presets bundle as:" msgstr "Сохранить все профили в файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1575 +#: src/slic3r/GUI/MainFrame.cpp:1585 #, c-format msgid "%d presets successfully imported." msgstr "Успешно импортировано профилей: %d шт." -#: src/slic3r/GUI/Mouse3DController.cpp:462 +#: src/slic3r/GUI/Mouse3DController.cpp:461 msgid "3Dconnexion settings" msgstr "Настройки 3Dconnexion" -#: src/slic3r/GUI/Mouse3DController.cpp:473 +#: src/slic3r/GUI/Mouse3DController.cpp:472 msgid "Device:" msgstr "Устройство:" -#: src/slic3r/GUI/Mouse3DController.cpp:478 +#: src/slic3r/GUI/Mouse3DController.cpp:477 msgid "Speed:" msgstr "Скорость:" -#: src/slic3r/GUI/Mouse3DController.cpp:481 -#: src/slic3r/GUI/Mouse3DController.cpp:502 +#: src/slic3r/GUI/Mouse3DController.cpp:480 src/slic3r/GUI/Mouse3DController.cpp:501 msgid "Translation" -msgstr "" +msgstr "Перемещение" -#: src/slic3r/GUI/Mouse3DController.cpp:493 -#: src/slic3r/GUI/Mouse3DController.cpp:502 +#: src/slic3r/GUI/Mouse3DController.cpp:492 src/slic3r/GUI/Mouse3DController.cpp:501 msgid "Zoom" -msgstr "Увеличение" +msgstr "Масштаб" -#: src/slic3r/GUI/Mouse3DController.cpp:499 +#: src/slic3r/GUI/Mouse3DController.cpp:498 msgid "Deadzone:" -msgstr "" +msgstr "Мёртвая зона:" -#: src/slic3r/GUI/Mouse3DController.cpp:514 +#: src/slic3r/GUI/Mouse3DController.cpp:513 msgid "Options:" -msgstr "Параметры:" +msgstr "Опции:" -#: src/slic3r/GUI/Mouse3DController.cpp:517 +#: src/slic3r/GUI/Mouse3DController.cpp:516 msgid "Swap Y/Z axes" -msgstr "" +msgstr "Поменять местами оси Y/Z" -#: src/slic3r/GUI/MsgDialog.cpp:73 +#: src/slic3r/GUI/MsgDialog.cpp:70 #, c-format msgid "%s error" -msgstr "Ошибка %s" +msgstr "%s ошибка" -#: src/slic3r/GUI/MsgDialog.cpp:74 +#: src/slic3r/GUI/MsgDialog.cpp:71 #, c-format msgid "%s has encountered an error" -msgstr "В %s возникла ошибка" +msgstr "%s обнаружил ошибку" -#: src/slic3r/GUI/NotificationManager.hpp:398 +#: src/slic3r/GUI/NotificationManager.hpp:471 msgid "3D Mouse disconnected." -msgstr "" +msgstr "3D-мышь отключена." -#: src/slic3r/GUI/NotificationManager.hpp:401 +#: src/slic3r/GUI/NotificationManager.hpp:474 msgid "Configuration update is available." -msgstr "" +msgstr "Доступно обновление конфигурации." -#: src/slic3r/GUI/NotificationManager.hpp:401 +#: src/slic3r/GUI/NotificationManager.hpp:474 msgid "See more." -msgstr "" +msgstr "Подробнее." -#: src/slic3r/GUI/NotificationManager.hpp:403 +#: src/slic3r/GUI/NotificationManager.hpp:476 msgid "New version is available." -msgstr "" +msgstr "Доступна новая версия." -#: src/slic3r/GUI/NotificationManager.hpp:403 +#: src/slic3r/GUI/NotificationManager.hpp:476 msgid "See Releases page." +msgstr "Смотрите страницу релизов." + +#: src/slic3r/GUI/NotificationManager.hpp:479 +msgid "" +"You have just added a G-code for color change, but its value is empty.\n" +"To export the G-code correctly, check the \"Color Change G-code\" in \"Printer " +"Settings > Custom G-code\"" msgstr "" +"Вы только что добавили G-код смена цвета, но его значение в соответствующем поле не " +"задано.\n" +"Для правильного экспорта G-кода, проверьте пункт \"G-код смены цвета\" в разделе " +"Настройки принтера > Пользовательский G-код." -#: src/slic3r/GUI/NotificationManager.cpp:387 -#: src/slic3r/GUI/NotificationManager.cpp:397 +#: src/slic3r/GUI/NotificationManager.cpp:490 +#: src/slic3r/GUI/NotificationManager.cpp:500 msgid "More" -msgstr "Больше" +msgstr "Подробнее." -#: src/slic3r/GUI/NotificationManager.cpp:690 -#: src/slic3r/GUI/NotificationManager.cpp:961 +#: src/slic3r/GUI/NotificationManager.cpp:864 +#: src/slic3r/GUI/NotificationManager.cpp:1141 msgid "Export G-Code." -msgstr "" +msgstr "Экспорт в G-код." -#: src/slic3r/GUI/NotificationManager.cpp:734 +#: src/slic3r/GUI/NotificationManager.cpp:908 msgid "Open Folder." -msgstr "" +msgstr "Открыть папку." -#: src/slic3r/GUI/NotificationManager.cpp:772 +#: src/slic3r/GUI/NotificationManager.cpp:946 msgid "Eject drive" -msgstr "" +msgstr "Извлечь диск" -#: src/slic3r/GUI/NotificationManager.cpp:880 -#: src/slic3r/GUI/NotificationManager.cpp:896 -#: src/slic3r/GUI/NotificationManager.cpp:907 +#: src/slic3r/GUI/NotificationManager.cpp:1060 +#: src/slic3r/GUI/NotificationManager.cpp:1076 +#: src/slic3r/GUI/NotificationManager.cpp:1087 msgid "ERROR:" -msgstr "" +msgstr "ОШИБКА:" -#: src/slic3r/GUI/NotificationManager.cpp:885 -#: src/slic3r/GUI/NotificationManager.cpp:900 -#: src/slic3r/GUI/NotificationManager.cpp:915 +#: src/slic3r/GUI/NotificationManager.cpp:1065 +#: src/slic3r/GUI/NotificationManager.cpp:1080 +#: src/slic3r/GUI/NotificationManager.cpp:1095 msgid "WARNING:" -msgstr "" +msgstr "ПРЕДУПРЕЖДЕНИЕ:" -#: src/slic3r/GUI/NotificationManager.cpp:964 +#: src/slic3r/GUI/NotificationManager.cpp:1144 msgid "Slicing finished." -msgstr "" +msgstr "Нарезка завершена." -#: src/slic3r/GUI/NotificationManager.cpp:1007 +#: src/slic3r/GUI/NotificationManager.cpp:1186 msgid "Exporting finished." -msgstr "" +msgstr "Экспорт завершён." #: src/slic3r/GUI/ObjectDataViewModel.cpp:58 msgid "Instances" -msgstr "Экземпляры" +msgstr "Копии" #: src/slic3r/GUI/ObjectDataViewModel.cpp:62 #: src/slic3r/GUI/ObjectDataViewModel.cpp:225 #, c-format msgid "Instance %d" -msgstr "Экземпляр %d" +msgstr "Копия %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3952 -#: src/slic3r/GUI/Tab.cpp:4034 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3962 +#: src/slic3r/GUI/Tab.cpp:4044 msgid "Layers" msgstr "Слои" @@ -4995,16 +5174,23 @@ msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" "while OpenGL version %s, render %s, vendor %s was detected." msgstr "" +"Обнаружена графическая подсистема с поддержкой OpenGL версии %s (рендеринг %s, " +"поставщик %s).\n" +"Для правильной же работы PrusaSlicer требуется драйвер графической подсистемы, " +"поддерживающий OpenGL 2.0." #: src/slic3r/GUI/OpenGLManager.cpp:262 msgid "You may need to update your graphics card driver." -msgstr "" +msgstr "Возможно, вам потребуется обновить драйвер видеокарты." #: src/slic3r/GUI/OpenGLManager.cpp:265 msgid "" -"As a workaround, you may run PrusaSlicer with a software rendered 3D " -"graphics by running prusa-slicer.exe with the --sw_renderer parameter." +"As a workaround, you may run PrusaSlicer with a software rendered 3D graphics by " +"running prusa-slicer.exe with the --sw_renderer parameter." msgstr "" +"В качестве обходного пути вы можете запустить PrusaSlicer с программным рендерингом " +"(построения изображения без помощи GPU), запустив prusa-slicer.exe с параметром --" +"sw_renderer." #: src/slic3r/GUI/OpenGLManager.cpp:267 msgid "Unsupported OpenGL version" @@ -5016,52 +5202,54 @@ msgid "" "Unable to load the following shaders:\n" "%s" msgstr "" +"Не удалось загрузить следующие шейдеры:\n" +"%s" #: src/slic3r/GUI/OpenGLManager.cpp:276 msgid "Error loading shaders" -msgstr "" +msgstr "Ошибка загрузки шейдеров" -#: src/slic3r/GUI/OptionsGroup.cpp:333 +#: src/slic3r/GUI/OptionsGroup.cpp:335 msgctxt "Layers" msgid "Top" msgstr "Сверху" -#: src/slic3r/GUI/OptionsGroup.cpp:333 +#: src/slic3r/GUI/OptionsGroup.cpp:335 msgctxt "Layers" msgid "Bottom" msgstr "Снизу" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:51 msgid "Delete this preset from this printer device" -msgstr "" +msgstr "Удалить этот профиль у данного принтера" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:81 msgid "This printer will be shown in the presets list as" -msgstr "" +msgstr "Этот принтер будет отображаться в списке профилей как" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:155 msgid "Physical Printer" -msgstr "" +msgstr "Физический принтер" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:161 msgid "Type here the name of your printer device" -msgstr "" +msgstr "Введите здесь имя вашего принтера" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:172 msgid "Descriptive name for the printer" -msgstr "" +msgstr "Имя принтера" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:176 msgid "Add preset for this printer device" -msgstr "" +msgstr "Добавить профиль для этого принтера" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:205 src/slic3r/GUI/Tab.cpp:2064 msgid "Print Host upload" -msgstr "Отправка на узел печати" +msgstr "Загрузка на хост печати" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:260 msgid "Connection to printers connected via the print host failed." -msgstr "" +msgstr "Не удалось подключиться к принтерам, подключенным через через хост печати." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:302 msgid "Test" @@ -5069,7 +5257,7 @@ msgstr "Тест" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:307 msgid "Could not get a valid Printer Host reference" -msgstr "Невозможно получить корректную ссылку узла печати" +msgstr "Не удалось получить действительную ссылку на хост принтера" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319 msgid "Success!" @@ -5077,15 +5265,15 @@ msgstr "Успешно!" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329 msgid "Refresh Printers" -msgstr "" +msgstr "Обновить принтеры" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:356 msgid "" -"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -"signed certificate." +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed " +"certificate." msgstr "" -"Файл УЦ для HTTPS не является обязательным. Файл необходим, только если вы " -"используете HTTPS с самоподписанным сертификатом." +"Файл HTTPS CA не обязателен. Он необходим только при использовании HTTPS с " +"самоподписанным сертификатом." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:366 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" @@ -5093,29 +5281,28 @@ msgstr "Файлы сертификатов (*.crt, *.pem)|*.crt;*.pem|Все ф #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "Open CA certificate file" -msgstr "Открыть файл сертификата УЦ" +msgstr "Открыть файл сертификата CA" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:395 -#: src/libslic3r/PrintConfig.cpp:120 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:395 src/libslic3r/PrintConfig.cpp:124 msgid "HTTPS CA File" -msgstr "Файл УЦ для HTTPS" +msgstr "Файл HTTPS CA сертификата" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:396 #, c-format msgid "" -"On this system, %s uses HTTPS certificates from the system Certificate Store " -"or Keychain." +"On this system, %s uses HTTPS certificates from the system Certificate Store or " +"Keychain." msgstr "" -"В этой системе %s использует сертификаты HTTPS из системного хранилища " -"сертификатов или связки ключей." +"В этой системе %s использует HTTPS сертификаты из системного хранилища сертификатов/" +"Keychain." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:397 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." msgstr "" -"Чтобы использовать свой файл УЦ, импортируйте этот файл в хранилище " -"сертификатов/связку ключей." +"Чтобы использовать пользовательский файл CA, импортируйте его в хранилище " +"сертификатов/Keychain." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:543 msgid "The supplied name is empty. It can't be saved." @@ -5123,11 +5310,11 @@ msgstr "Имя не задано. Невозможно сохранить." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:547 msgid "You should change the name of your printer device." -msgstr "" +msgstr "Пожалуйста, измените имя вашего принтера." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555 msgid "Printer with name \"%1%\" already exists." -msgstr "" +msgstr "Принтер с именем \"%1%\" уже существует." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:556 msgid "Replace?" @@ -5135,17 +5322,15 @@ msgstr "Заменить?" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:579 msgid "" -"Following printer preset(s) is duplicated:%1%The above preset for printer " -"\"%2%\" will be used just once." +"Following printer preset(s) is duplicated:%1%The above preset for printer \"%2%\" " +"will be used just once." msgstr "" +"Следующий профиль(-и) принтера будет продублирован: %1% Вышеуказанный профиль для " +"принтера %2% будет использован только один раз." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:625 msgid "It's not possible to delete the last related preset for the printer." -msgstr "" - -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:626 -msgid "Infornation" -msgstr "" +msgstr "Невозможно удалить последний связанный профиль принтера." #: src/slic3r/GUI/Plater.cpp:163 msgid "Volume" @@ -5169,7 +5354,7 @@ msgstr "Информация о нарезке" #: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1151 msgid "Used Filament (m)" -msgstr "" +msgstr "Использовано прутка в метрах" #: src/slic3r/GUI/Plater.cpp:238 src/slic3r/GUI/Plater.cpp:1163 msgid "Used Filament (mm³)" @@ -5181,44 +5366,46 @@ msgstr "Использовано прутка (г)" #: src/slic3r/GUI/Plater.cpp:240 msgid "Used Material (unit)" -msgstr "Использовано материалов (шт)" +msgstr "Использовано материала (единиц)" #: src/slic3r/GUI/Plater.cpp:241 msgid "Cost (money)" -msgstr "Стоимость (денег)" +msgstr "Стоимость" #: src/slic3r/GUI/Plater.cpp:243 msgid "Number of tool changes" -msgstr "Количество смен сопла" +msgstr "Количество инструментов" #: src/slic3r/GUI/Plater.cpp:360 msgid "Select what kind of support do you need" -msgstr "Выбор варианта поддержек" +msgstr "Выбор варианта поддержки" -#: src/slic3r/GUI/Plater.cpp:362 src/libslic3r/PrintConfig.cpp:2096 -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:362 src/libslic3r/PrintConfig.cpp:2128 +#: src/libslic3r/PrintConfig.cpp:2923 msgid "Support on build plate only" -msgstr "Только от платформы" +msgstr "Только от стола" #: src/slic3r/GUI/Plater.cpp:363 src/slic3r/GUI/Plater.cpp:489 msgid "For support enforcers only" -msgstr "Только для принудительных поддержек" +msgstr "Только принудительная" #: src/slic3r/GUI/Plater.cpp:364 msgid "Everywhere" msgstr "Везде" -#: src/slic3r/GUI/Plater.cpp:396 src/slic3r/GUI/Tab.cpp:1470 +#: src/slic3r/GUI/Plater.cpp:396 src/slic3r/GUI/Tab.cpp:1469 msgid "Brim" msgstr "Кайма" #: src/slic3r/GUI/Plater.cpp:398 msgid "" -"This flag enables the brim that will be printed around each object on the " -"first layer." +"This flag enables the brim that will be printed around each object on the first " +"layer." msgstr "" -"Включает кайму, которая будет печататься вокруг каждого объекта на первом " -"слое." +"Расстояние от модели до самой дальней линии каймы. Широкая кайма повышает адгезию к " +"столу, но уменьшает полезную площадь печати. Увеличение этого параметра очень важно " +"для моделей с маленькой площадью контакта со столом и особенно важно при печати ABS " +"пластиком." #: src/slic3r/GUI/Plater.cpp:406 msgid "Purging volumes" @@ -5226,32 +5413,32 @@ msgstr "Объём очистки" #: src/slic3r/GUI/Plater.cpp:503 msgid "Select what kind of pad do you need" -msgstr "" +msgstr "Выбор варианта подложки" #: src/slic3r/GUI/Plater.cpp:505 msgid "Below object" -msgstr "Ниже объекта" +msgstr "Ниже модели" #: src/slic3r/GUI/Plater.cpp:506 msgid "Around object" -msgstr "Вокруг объекта" +msgstr "Вокруг модели" #: src/slic3r/GUI/Plater.cpp:695 msgid "SLA print settings" -msgstr "Настройки печати SLA" +msgstr "Настройки SLA печати" -#: src/slic3r/GUI/Plater.cpp:756 src/slic3r/GUI/Plater.cpp:5962 +#: src/slic3r/GUI/Plater.cpp:756 src/slic3r/GUI/Plater.cpp:6055 msgid "Send to printer" -msgstr "Отправить на принтер" +msgstr "На принтер" -#: src/slic3r/GUI/Plater.cpp:771 src/slic3r/GUI/Plater.cpp:2984 -#: src/slic3r/GUI/Plater.cpp:5499 +#: src/slic3r/GUI/Plater.cpp:771 src/slic3r/GUI/Plater.cpp:3009 +#: src/slic3r/GUI/Plater.cpp:5584 msgid "Slice now" -msgstr "Нарезать" +msgstr "НАРЕЗАТЬ" #: src/slic3r/GUI/Plater.cpp:926 msgid "Hold Shift to Slice & Export G-code" -msgstr "Зажмите Shift что нарезать и экспортировать G-код" +msgstr "Удерживайте клавишу Shift, чтобы нарезать и экспортировать в G-код" #: src/slic3r/GUI/Plater.cpp:1071 #, c-format @@ -5266,11 +5453,11 @@ msgstr "Исправлено ошибок: %d" #: src/slic3r/GUI/Plater.cpp:1079 #, c-format msgid "" -"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " -"facets reversed, %d backwards edges" +"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d facets " +"reversed, %d backwards edges" msgstr "" -"вырождено %d граней, починено %d рёбер, %d граней удалено, %d граней " -"добавлено, %d граней реверсировано, вывернуто %d рёбер" +"Вырожденных граней: %d. | Рёбер починено: %d. | Граней удалено: %d. | Граней " +"добавлено: %d. | Граней реверсировано: %d. | Вывернуто рёбер: %d." #: src/slic3r/GUI/Plater.cpp:1089 msgid "Yes" @@ -5282,38 +5469,38 @@ msgstr "Использовано материала (мл)" #: src/slic3r/GUI/Plater.cpp:1113 msgid "object(s)" -msgstr "объект(ы)" +msgstr "модель(и)" #: src/slic3r/GUI/Plater.cpp:1113 msgid "supports and pad" -msgstr "" +msgstr "поддержка и подложка" #: src/slic3r/GUI/Plater.cpp:1151 msgid "Used Filament (in)" -msgstr "" +msgstr "Использовано прутка (дюймы)" #: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206 msgid "objects" -msgstr "объекты" +msgstr "модели" #: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206 msgid "wipe tower" -msgstr "башня очистки" +msgstr "черновой башни" #: src/slic3r/GUI/Plater.cpp:1163 msgid "Used Filament (in³)" -msgstr "" +msgstr "Использовано прутка (дюймы³)" #: src/slic3r/GUI/Plater.cpp:1189 msgid "Filament at extruder %1%" -msgstr "" +msgstr "Прутка в экструдере %1%" #: src/slic3r/GUI/Plater.cpp:1195 -msgid "(weight with spool)" -msgstr "" +msgid "(including spool)" +msgstr "(включая катушку)" -#: src/slic3r/GUI/Plater.cpp:1204 src/libslic3r/PrintConfig.cpp:805 -#: src/libslic3r/PrintConfig.cpp:2706 src/libslic3r/PrintConfig.cpp:2707 +#: src/slic3r/GUI/Plater.cpp:1204 src/libslic3r/PrintConfig.cpp:822 +#: src/libslic3r/PrintConfig.cpp:2738 src/libslic3r/PrintConfig.cpp:2739 msgid "Cost" msgstr "Стоимость" @@ -5323,1095 +5510,1115 @@ msgstr "нормальный режим" #: src/slic3r/GUI/Plater.cpp:1232 msgid "stealth mode" -msgstr "" +msgstr "тихий режим" -#: src/slic3r/GUI/Plater.cpp:1400 src/slic3r/GUI/Plater.cpp:4841 +#: src/slic3r/GUI/Plater.cpp:1403 src/slic3r/GUI/Plater.cpp:4923 #, c-format msgid "%s - Drop project file" -msgstr "" +msgstr "%s - Перетаскивание файла-проекта" -#: src/slic3r/GUI/Plater.cpp:1407 src/slic3r/GUI/Plater.cpp:4848 +#: src/slic3r/GUI/Plater.cpp:1410 src/slic3r/GUI/Plater.cpp:4930 msgid "Open as project" -msgstr "" +msgstr "Открыть как проект" -#: src/slic3r/GUI/Plater.cpp:1408 src/slic3r/GUI/Plater.cpp:4849 +#: src/slic3r/GUI/Plater.cpp:1411 src/slic3r/GUI/Plater.cpp:4931 msgid "Import geometry only" -msgstr "" +msgstr "Импортировать только геометрию" -#: src/slic3r/GUI/Plater.cpp:1409 src/slic3r/GUI/Plater.cpp:4850 +#: src/slic3r/GUI/Plater.cpp:1412 src/slic3r/GUI/Plater.cpp:4932 msgid "Import config only" -msgstr "" +msgstr "Импортировать только конфигурацию" -#: src/slic3r/GUI/Plater.cpp:1412 src/slic3r/GUI/Plater.cpp:4853 +#: src/slic3r/GUI/Plater.cpp:1415 src/slic3r/GUI/Plater.cpp:4935 msgid "Select an action to apply to the file" -msgstr "" +msgstr "Выберите действие для применения к файлу" -#: src/slic3r/GUI/Plater.cpp:1413 src/slic3r/GUI/Plater.cpp:4854 +#: src/slic3r/GUI/Plater.cpp:1416 src/slic3r/GUI/Plater.cpp:4936 msgid "Action" -msgstr "" +msgstr "Действие" -#: src/slic3r/GUI/Plater.cpp:1421 src/slic3r/GUI/Plater.cpp:4862 +#: src/slic3r/GUI/Plater.cpp:1424 src/slic3r/GUI/Plater.cpp:4944 msgid "Don't show again" -msgstr "" +msgstr "Больше не показывать" -#: src/slic3r/GUI/Plater.cpp:1466 src/slic3r/GUI/Plater.cpp:4899 +#: src/slic3r/GUI/Plater.cpp:1469 src/slic3r/GUI/Plater.cpp:4981 msgid "You can open only one .gcode file at a time." -msgstr "" +msgstr "За раз вы можете открыть только один .gcode файл." -#: src/slic3r/GUI/Plater.cpp:1467 src/slic3r/GUI/Plater.cpp:4900 +#: src/slic3r/GUI/Plater.cpp:1470 src/slic3r/GUI/Plater.cpp:4982 msgid "Drag and drop G-code file" -msgstr "" +msgstr "Перетащите G-код файл" -#: src/slic3r/GUI/Plater.cpp:1521 src/slic3r/GUI/Plater.cpp:4720 -#: src/slic3r/GUI/Plater.cpp:4954 +#: src/slic3r/GUI/Plater.cpp:1524 src/slic3r/GUI/Plater.cpp:4796 +#: src/slic3r/GUI/Plater.cpp:5036 msgid "Import Object" -msgstr "Импортировать объект" +msgstr "Импорт модели" -#: src/slic3r/GUI/Plater.cpp:1543 src/slic3r/GUI/Plater.cpp:4976 +#: src/slic3r/GUI/Plater.cpp:1546 src/slic3r/GUI/Plater.cpp:5058 msgid "Load File" msgstr "Загрузить файл" -#: src/slic3r/GUI/Plater.cpp:1548 src/slic3r/GUI/Plater.cpp:4981 +#: src/slic3r/GUI/Plater.cpp:1551 src/slic3r/GUI/Plater.cpp:5063 msgid "Load Files" msgstr "Загрузить файлы" -#: src/slic3r/GUI/Plater.cpp:1651 +#: src/slic3r/GUI/Plater.cpp:1654 msgid "Fill bed" -msgstr "" +msgstr "Заполнение всего стола копиями" -#: src/slic3r/GUI/Plater.cpp:1657 +#: src/slic3r/GUI/Plater.cpp:1660 msgid "Optimize Rotation" -msgstr "Оптимизировать поворот" +msgstr "Оптимизация положения" -#: src/slic3r/GUI/Plater.cpp:1663 +#: src/slic3r/GUI/Plater.cpp:1666 msgid "Import SLA archive" -msgstr "Импорт архива SLA" +msgstr "Импорт SLA архива" -#: src/slic3r/GUI/Plater.cpp:2109 +#: src/slic3r/GUI/Plater.cpp:2129 #, c-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " "computer." msgstr "" +"Размонтирование прошло успешно. Теперь устройство %s(%s) может быть безопасно " +"извлечено из компьютера." -#: src/slic3r/GUI/Plater.cpp:2112 +#: src/slic3r/GUI/Plater.cpp:2134 #, c-format msgid "Ejecting of device %s(%s) has failed." msgstr "Не удалось извлечь устройство %s(%s)." -#: src/slic3r/GUI/Plater.cpp:2131 +#: src/slic3r/GUI/Plater.cpp:2153 msgid "New Project" msgstr "Новый проект" -#: src/slic3r/GUI/Plater.cpp:2224 +#: src/slic3r/GUI/Plater.cpp:2246 msgid "Expand sidebar" -msgstr "" +msgstr "Развернуть боковую панель" -#: src/slic3r/GUI/Plater.cpp:2297 +#: src/slic3r/GUI/Plater.cpp:2319 msgid "Loading" -msgstr "Загружается" +msgstr "Загрузка" -#: src/slic3r/GUI/Plater.cpp:2307 +#: src/slic3r/GUI/Plater.cpp:2329 msgid "Loading file" -msgstr "" +msgstr "Загрузка файла" -#: src/slic3r/GUI/Plater.cpp:2390 +#: src/slic3r/GUI/Plater.cpp:2415 #, c-format msgid "" "Some object(s) in file %s looks like saved in inches.\n" "Should I consider them as a saved in inches and convert them?" msgstr "" +"Похоже какая-то модель(-и) в файле %s сохранена в дюймах.\n" +"Считать что она сохранена в дюймах и конвертировать?" -#: src/slic3r/GUI/Plater.cpp:2392 +#: src/slic3r/GUI/Plater.cpp:2417 msgid "The object appears to be saved in inches" -msgstr "" +msgstr "Похоже какая-то модель(-и) в файле %s сохранена в дюймах" -#: src/slic3r/GUI/Plater.cpp:2400 +#: src/slic3r/GUI/Plater.cpp:2425 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 "" -"Этот файл содержит несколько объектов, расположенных на разных высотах.\n" -"Вместо того, чтобы рассматривать их как несколько объектов, следует ли\n" -"рассматривать этот файл как один объект, состоящий из нескольких частей?" +"Этот файл содержит несколько моделей, расположенных на разных высотах.\n" +"Вместо того, чтобы рассматривать их как несколько моделей, следует ли рассматривать " +"этот файл как одну модель состоящую из несколько частей?" -#: src/slic3r/GUI/Plater.cpp:2403 src/slic3r/GUI/Plater.cpp:2456 +#: src/slic3r/GUI/Plater.cpp:2428 src/slic3r/GUI/Plater.cpp:2481 msgid "Multi-part object detected" -msgstr "Обнаружен объект, состоящий из нескольких частей" +msgstr "Обнаружена модель, состоящая из нескольких частей" -#: src/slic3r/GUI/Plater.cpp:2410 +#: src/slic3r/GUI/Plater.cpp:2435 msgid "" -"This file cannot be loaded in a simple mode. Do you want to switch to an " -"advanced mode?" +"This file cannot be loaded in a simple mode. Do you want to switch to an advanced " +"mode?" msgstr "" +"Этот файл не может быть загружен в простом режиме. Хотите перейти в расширенный " +"режим?" -#: src/slic3r/GUI/Plater.cpp:2411 +#: src/slic3r/GUI/Plater.cpp:2436 msgid "Detected advanced data" msgstr "Обнаружены расширенные данные" -#: src/slic3r/GUI/Plater.cpp:2433 +#: src/slic3r/GUI/Plater.cpp:2458 #, c-format msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" +"You can't to add the object(s) from %s because of one or some of them is(are) multi-" +"part" msgstr "" +"Вы не можете добавить модель(и) из %s, потому что одна или несколько из них " +"являются составными (состоят из нескольких частей)" -#: src/slic3r/GUI/Plater.cpp:2453 +#: src/slic3r/GUI/Plater.cpp:2478 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 "" -"Для мультиматериального принтера было загружено несколько объектов. \n" -"Вместо того, чтобы рассматривать их как несколько моделей, следует ли " -"рассматривать их как одну модель,\n" -"состоящую из несколько частей?" +"Для мультиматериального принтера было загружено несколько моделей.\n" +"Вместо того, чтобы рассматривать их как несколько моделей, следует ли рассматривать " +"их как одну модель, состоящую из несколько частей?" -#: src/slic3r/GUI/Plater.cpp:2469 +#: src/slic3r/GUI/Plater.cpp:2494 msgid "Loaded" msgstr "Загружено" -#: src/slic3r/GUI/Plater.cpp:2571 +#: src/slic3r/GUI/Plater.cpp:2596 msgid "" -"Your object appears to be too large, so it was automatically scaled down to " -"fit your print bed." +"Your object appears to be too large, so it was automatically scaled down to fit " +"your print bed." msgstr "" -"Ваш объект слишком большой, поэтому он был автоматически уменьшен до размера " -"платформы печати." +"Ваша модель слишком большая, поэтому она была автоматически уменьшена до размера " +"вашего печатного стола." -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2597 msgid "Object too large?" msgstr "Модель слишком большая?" -#: src/slic3r/GUI/Plater.cpp:2634 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "Export STL file:" -msgstr "Экспорт STL-файла:" +msgstr "Экспорт в STL файл:" -#: src/slic3r/GUI/Plater.cpp:2641 +#: src/slic3r/GUI/Plater.cpp:2666 msgid "Export AMF file:" -msgstr "Экспорт AMF-файла:" +msgstr "Экспорт в AMF файл:" -#: src/slic3r/GUI/Plater.cpp:2647 +#: src/slic3r/GUI/Plater.cpp:2672 msgid "Save file as:" msgstr "Сохранить файл как:" -#: src/slic3r/GUI/Plater.cpp:2653 +#: src/slic3r/GUI/Plater.cpp:2678 msgid "Export OBJ file:" -msgstr "Экспорт OBJ-файла:" +msgstr "Экспорт в OBJ файл:" -#: src/slic3r/GUI/Plater.cpp:2749 +#: src/slic3r/GUI/Plater.cpp:2774 msgid "Delete Object" -msgstr "Удалить объект" +msgstr "Удаление модели" -#: src/slic3r/GUI/Plater.cpp:2760 +#: src/slic3r/GUI/Plater.cpp:2785 msgid "Reset Project" -msgstr "Сбросить проект" +msgstr "Обнуление проекта" -#: src/slic3r/GUI/Plater.cpp:2832 +#: src/slic3r/GUI/Plater.cpp:2857 msgid "" "The selected object can't be split because it contains more than one volume/" "material." msgstr "" -"Выбранный объект не может быть разделен, так как он содержит более одного " -"объёма/материала." +"Выбранная модель не может быть разделена, так как она содержит более одного объёма/" +"материала." -#: src/slic3r/GUI/Plater.cpp:2843 +#: src/slic3r/GUI/Plater.cpp:2868 msgid "Split to Objects" -msgstr "Разделить на объекты" +msgstr "Разделить на модели" -#: src/slic3r/GUI/Plater.cpp:2968 src/slic3r/GUI/Plater.cpp:3651 +#: src/slic3r/GUI/Plater.cpp:2993 src/slic3r/GUI/Plater.cpp:3723 msgid "Invalid data" -msgstr "" +msgstr "Неверные данные" -#: src/slic3r/GUI/Plater.cpp:2978 +#: src/slic3r/GUI/Plater.cpp:3003 msgid "Ready to slice" -msgstr "" +msgstr "Готов к нарезке на слои" -#: src/slic3r/GUI/Plater.cpp:3016 src/slic3r/GUI/PrintHostDialogs.cpp:260 +#: src/slic3r/GUI/Plater.cpp:3041 src/slic3r/GUI/PrintHostDialogs.cpp:264 msgid "Cancelling" msgstr "Отмена" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3060 msgid "Another export job is currently running." msgstr "Уже идёт другой процесс экспорта." -#: src/slic3r/GUI/Plater.cpp:3152 +#: src/slic3r/GUI/Plater.cpp:3177 msgid "Please select the file to reload" msgstr "Пожалуйста, выберите файл для перезагрузки" -#: src/slic3r/GUI/Plater.cpp:3187 +#: src/slic3r/GUI/Plater.cpp:3212 msgid "It is not allowed to change the file to reload" -msgstr "" +msgstr "Не разрешается заменять перезагружаемый файл" -#: src/slic3r/GUI/Plater.cpp:3187 +#: src/slic3r/GUI/Plater.cpp:3212 msgid "Do you want to retry" -msgstr "Хотите продолжить" +msgstr "Повторить снова" -#: src/slic3r/GUI/Plater.cpp:3205 +#: src/slic3r/GUI/Plater.cpp:3230 msgid "Reload from:" -msgstr "Перезагрузить с:" +msgstr "Перезагрузка из:" -#: src/slic3r/GUI/Plater.cpp:3296 +#: src/slic3r/GUI/Plater.cpp:3323 msgid "Unable to reload:" -msgstr "Не удаётся перезагрузить:" +msgstr "Не удалось перезагрузить:" -#: src/slic3r/GUI/Plater.cpp:3301 +#: src/slic3r/GUI/Plater.cpp:3328 msgid "Error during reload" -msgstr "Ошибка при перезагрузке" +msgstr "Ошибка во время перезагрузки" -#: src/slic3r/GUI/Plater.cpp:3320 +#: src/slic3r/GUI/Plater.cpp:3347 msgid "Reload all from disk" msgstr "Перезагрузить всё с диска" -#: src/slic3r/GUI/Plater.cpp:3341 -msgid "Fix Throught NetFabb" -msgstr "Починить с помощью Netfabb" +#: src/slic3r/GUI/Plater.cpp:3374 +msgid "" +"ERROR: Please close all manipulators available from the left toolbar before fixing " +"the mesh." +msgstr "" +"ОШИБКА: Пожалуйста, перед починкой сетки, завершите все манипуляции на панели " +"инструментов." + +#: src/slic3r/GUI/Plater.cpp:3380 +msgid "Fix through NetFabb" +msgstr "Ремонт модели службой Netfabb" + +#: src/slic3r/GUI/Plater.cpp:3397 +msgid "Custom supports and seams were removed after repairing the mesh." +msgstr "Пользовательские поддержки и швы были удалены после почитки сетки." -#: src/slic3r/GUI/Plater.cpp:3609 +#: src/slic3r/GUI/Plater.cpp:3680 msgid "There are active warnings concerning sliced models:" -msgstr "" +msgstr "Имеются активные предупреждения о нарезанных моделях:" -#: src/slic3r/GUI/Plater.cpp:3620 +#: src/slic3r/GUI/Plater.cpp:3691 msgid "generated warnings" -msgstr "" +msgstr "вызвала предупреждения" -#: src/slic3r/GUI/Plater.cpp:3659 src/slic3r/GUI/PrintHostDialogs.cpp:261 +#: src/slic3r/GUI/Plater.cpp:3731 src/slic3r/GUI/PrintHostDialogs.cpp:265 msgid "Cancelled" msgstr "Отменено" -#: src/slic3r/GUI/Plater.cpp:3921 src/slic3r/GUI/Plater.cpp:3945 +#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022 msgid "Remove the selected object" -msgstr "Удалить выбранный объект" +msgstr "Удалить выбранную модель" -#: src/slic3r/GUI/Plater.cpp:3930 +#: src/slic3r/GUI/Plater.cpp:4007 msgid "Add one more instance of the selected object" -msgstr "Добавить ещё один экземпляр выбранного объекта" +msgstr "Добавить ещё одну копию выбранной модели" -#: src/slic3r/GUI/Plater.cpp:3932 +#: src/slic3r/GUI/Plater.cpp:4009 msgid "Remove one instance of the selected object" -msgstr "Удалить один экземпляр выбранного объекта" +msgstr "Удалить одну копию выбранной модели" -#: src/slic3r/GUI/Plater.cpp:3934 +#: src/slic3r/GUI/Plater.cpp:4011 msgid "Set number of instances" -msgstr "Задать количество экземпляров" +msgstr "Задать количество копий" -#: src/slic3r/GUI/Plater.cpp:3934 +#: src/slic3r/GUI/Plater.cpp:4011 msgid "Change the number of instances of the selected object" -msgstr "Изменить количество экземпляров выбранного объекта" +msgstr "Изменить количества копий выбранной модели" -#: src/slic3r/GUI/Plater.cpp:3936 +#: src/slic3r/GUI/Plater.cpp:4013 msgid "Fill bed with instances" -msgstr "" +msgstr "Заполнить весь стол копиями" -#: src/slic3r/GUI/Plater.cpp:3936 +#: src/slic3r/GUI/Plater.cpp:4013 msgid "Fill the remaining area of bed with instances of the selected object" -msgstr "" +msgstr "Заполнить оставшуюся область печатного стола копиями выбранной модели" -#: src/slic3r/GUI/Plater.cpp:3955 +#: src/slic3r/GUI/Plater.cpp:4032 msgid "Reload the selected object from disk" -msgstr "Перезагрузить выбранный объект с диска" +msgstr "Перезагрузить выбранную модель файл с диска" -#: src/slic3r/GUI/Plater.cpp:3958 +#: src/slic3r/GUI/Plater.cpp:4035 msgid "Export the selected object as STL file" -msgstr "Экспортировать выбранный объект в STL файл" +msgstr "Экспортировать выбранную модель в STL файл" -#: src/slic3r/GUI/Plater.cpp:3989 +#: src/slic3r/GUI/Plater.cpp:4065 msgid "Along X axis" msgstr "Вдоль оси X" -#: src/slic3r/GUI/Plater.cpp:3989 +#: src/slic3r/GUI/Plater.cpp:4065 msgid "Mirror the selected object along the X axis" -msgstr "Отразить выбранный объект вдоль оси X" +msgstr "Отразить выбранную модель вдоль оси X" -#: src/slic3r/GUI/Plater.cpp:3991 +#: src/slic3r/GUI/Plater.cpp:4067 msgid "Along Y axis" msgstr "Вдоль оси Y" -#: src/slic3r/GUI/Plater.cpp:3991 +#: src/slic3r/GUI/Plater.cpp:4067 msgid "Mirror the selected object along the Y axis" -msgstr "Отразить выбранный объект вдоль оси Y" +msgstr "Отразить выбранную модель вдоль оси Y" -#: src/slic3r/GUI/Plater.cpp:3993 +#: src/slic3r/GUI/Plater.cpp:4069 msgid "Along Z axis" msgstr "Вдоль оси Z" -#: src/slic3r/GUI/Plater.cpp:3993 +#: src/slic3r/GUI/Plater.cpp:4069 msgid "Mirror the selected object along the Z axis" -msgstr "Отразить выбранный объект вдоль оси Z" +msgstr "Отразить выбранную модель вдоль оси Z" -#: src/slic3r/GUI/Plater.cpp:3996 +#: src/slic3r/GUI/Plater.cpp:4072 msgid "Mirror" msgstr "Отразить" -#: src/slic3r/GUI/Plater.cpp:3996 +#: src/slic3r/GUI/Plater.cpp:4072 msgid "Mirror the selected object" -msgstr "Отразить выбранный объект" +msgstr "Отразить выбранную модель" -#: src/slic3r/GUI/Plater.cpp:4008 +#: src/slic3r/GUI/Plater.cpp:4084 msgid "To objects" -msgstr "В объекты" +msgstr "На модели" -#: src/slic3r/GUI/Plater.cpp:4008 src/slic3r/GUI/Plater.cpp:4028 +#: src/slic3r/GUI/Plater.cpp:4084 src/slic3r/GUI/Plater.cpp:4104 msgid "Split the selected object into individual objects" -msgstr "Разделить выбранный объект на отдельные объекты" +msgstr "Разделить выбранную модель на отдельные модели" -#: src/slic3r/GUI/Plater.cpp:4010 +#: src/slic3r/GUI/Plater.cpp:4086 msgid "To parts" -msgstr "" +msgstr "На части" -#: src/slic3r/GUI/Plater.cpp:4010 src/slic3r/GUI/Plater.cpp:4046 +#: src/slic3r/GUI/Plater.cpp:4086 src/slic3r/GUI/Plater.cpp:4122 msgid "Split the selected object into individual sub-parts" -msgstr "Разделить выбранный объект на отдельные части" +msgstr "Разделить выбранную модель на отдельные части" -#: src/slic3r/GUI/Plater.cpp:4013 src/slic3r/GUI/Plater.cpp:4028 -#: src/slic3r/GUI/Plater.cpp:4046 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Plater.cpp:4089 src/slic3r/GUI/Plater.cpp:4104 +#: src/slic3r/GUI/Plater.cpp:4122 src/libslic3r/PrintConfig.cpp:3759 msgid "Split" -msgstr "Разделить на части" +msgstr "Разделить" -#: src/slic3r/GUI/Plater.cpp:4013 +#: src/slic3r/GUI/Plater.cpp:4089 msgid "Split the selected object" -msgstr "Разделить выбранный объект" +msgstr "Разделить выбранную модель" -#: src/slic3r/GUI/Plater.cpp:4035 +#: src/slic3r/GUI/Plater.cpp:4111 msgid "Optimize orientation" -msgstr "Оптимизировать ориентацию" +msgstr "Оптимизация положения модели" -#: src/slic3r/GUI/Plater.cpp:4036 +#: src/slic3r/GUI/Plater.cpp:4112 msgid "Optimize the rotation of the object for better print results." -msgstr "" +msgstr "Оптимизация положения модели для лучшего результата печати." -#: src/slic3r/GUI/Plater.cpp:4116 +#: src/slic3r/GUI/Plater.cpp:4192 msgid "3D editor view" -msgstr "" +msgstr "3D-вид" -#: src/slic3r/GUI/Plater.cpp:4488 +#: src/slic3r/GUI/Plater.cpp:4564 msgid "" -"%1% printer was active at the time the target Undo / Redo snapshot was " -"taken. Switching to %1% printer requires reloading of %1% presets." +"%1% printer was active at the time the target Undo / Redo snapshot was taken. " +"Switching to %1% printer requires reloading of %1% presets." msgstr "" +"Принтер %1% был активен в момент создания целевого снапшота Отмены / Повтора. " +"Переключение на принтер %1% потребует перезагрузки профиля %1%." -#: src/slic3r/GUI/Plater.cpp:4692 +#: src/slic3r/GUI/Plater.cpp:4768 msgid "Load Project" -msgstr "Загрузить проект" +msgstr "Загрузка проекта" -#: src/slic3r/GUI/Plater.cpp:4724 +#: src/slic3r/GUI/Plater.cpp:4800 msgid "Import Objects" -msgstr "Импортировать объекты" +msgstr "Импорт моделей" -#: src/slic3r/GUI/Plater.cpp:4793 +#: src/slic3r/GUI/Plater.cpp:4868 msgid "The selected file" -msgstr "" +msgstr "В выбранном файле" -#: src/slic3r/GUI/Plater.cpp:4793 +#: src/slic3r/GUI/Plater.cpp:4868 msgid "does not contain valid gcode." -msgstr "" +msgstr "G-кода содержатся недопустимые данные." -#: src/slic3r/GUI/Plater.cpp:4794 +#: src/slic3r/GUI/Plater.cpp:4869 msgid "Error while loading .gcode file" -msgstr "" +msgstr "Ошибка при загрузке .gcode файла" -#: src/slic3r/GUI/Plater.cpp:5025 +#: src/slic3r/GUI/Plater.cpp:5107 msgid "All objects will be removed, continue?" -msgstr "Будут удалены все объекты, продолжить?" +msgstr "Все модели будут удалены, продолжить?" -#: src/slic3r/GUI/Plater.cpp:5033 +#: src/slic3r/GUI/Plater.cpp:5115 msgid "Delete Selected Objects" -msgstr "Удалить выделенные объекты" +msgstr "Удаление выбранных моделей" -#: src/slic3r/GUI/Plater.cpp:5041 +#: src/slic3r/GUI/Plater.cpp:5123 msgid "Increase Instances" -msgstr "Добавить экземпляр" +msgstr "Добавление копии" -#: src/slic3r/GUI/Plater.cpp:5075 +#: src/slic3r/GUI/Plater.cpp:5157 msgid "Decrease Instances" -msgstr "Удалить экземпляр" +msgstr "Удаление копии" -#: src/slic3r/GUI/Plater.cpp:5106 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "Enter the number of copies:" msgstr "Введите количество копий:" -#: src/slic3r/GUI/Plater.cpp:5107 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "Copies of the selected object" -msgstr "Копии выделенного объекта" +msgstr "Количество копий выбранной модели" -#: src/slic3r/GUI/Plater.cpp:5111 +#: src/slic3r/GUI/Plater.cpp:5193 #, c-format msgid "Set numbers of copies to %d" -msgstr "Задать количество копий равным %d" +msgstr "Задать количество копий: %d" -#: src/slic3r/GUI/Plater.cpp:5177 +#: src/slic3r/GUI/Plater.cpp:5259 msgid "Cut by Plane" -msgstr "" +msgstr "Разрез по плоскости" -#: src/slic3r/GUI/Plater.cpp:5231 +#: src/slic3r/GUI/Plater.cpp:5316 msgid "Save G-code file as:" msgstr "Сохранить файл G-кода как:" -#: src/slic3r/GUI/Plater.cpp:5231 +#: src/slic3r/GUI/Plater.cpp:5316 msgid "Save SL1 file as:" -msgstr "Сохранить файл SL1 как:" +msgstr "Сохранить SL1 файл как:" -#: src/slic3r/GUI/Plater.cpp:5378 +#: src/slic3r/GUI/Plater.cpp:5463 #, c-format msgid "STL file exported to %s" -msgstr "STL-файл экспортирован в %s" +msgstr "STL файл экспортирован в %s" -#: src/slic3r/GUI/Plater.cpp:5395 +#: src/slic3r/GUI/Plater.cpp:5480 #, c-format msgid "AMF file exported to %s" -msgstr "AMF-файл экспортирован в %s" +msgstr "AMF файл экспортирован в %s" -#: src/slic3r/GUI/Plater.cpp:5398 +#: src/slic3r/GUI/Plater.cpp:5483 #, c-format msgid "Error exporting AMF file %s" -msgstr "Ошибка экспортирования AMF-файла %s" +msgstr "AMF файл экспортирован в %s" -#: src/slic3r/GUI/Plater.cpp:5427 +#: src/slic3r/GUI/Plater.cpp:5512 #, c-format msgid "3MF file exported to %s" -msgstr "3MF-файл экспортирован в %s" +msgstr "3MF файл экспортирован в %s" -#: src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5517 #, c-format msgid "Error exporting 3MF file %s" -msgstr "Ошибка экспортирования 3MF-файла %s" +msgstr "3MF файл экспортирован в %s" -#: src/slic3r/GUI/Plater.cpp:5961 +#: src/slic3r/GUI/Plater.cpp:6054 msgid "Export" msgstr "Экспорт" -#: src/slic3r/GUI/Plater.cpp:6056 +#: src/slic3r/GUI/Plater.cpp:6149 msgid "Paste From Clipboard" -msgstr "Вставить из буфера обмена" +msgstr "Вставка из буфера обмена" -#: src/slic3r/GUI/Preferences.cpp:24 src/slic3r/GUI/Tab.cpp:2098 -#: src/slic3r/GUI/Tab.cpp:2280 src/slic3r/GUI/Tab.cpp:2388 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1072 +#: src/slic3r/GUI/Preferences.cpp:56 src/slic3r/GUI/Tab.cpp:2098 +#: src/slic3r/GUI/Tab.cpp:2285 src/slic3r/GUI/Tab.cpp:2393 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1080 msgid "General" msgstr "Общие" -#: src/slic3r/GUI/Preferences.cpp:48 +#: src/slic3r/GUI/Preferences.cpp:69 msgid "Remember output directory" -msgstr "Запоминать каталог результата" +msgstr "Запоминать папку сохранения" -#: src/slic3r/GUI/Preferences.cpp:50 +#: src/slic3r/GUI/Preferences.cpp:71 msgid "" -"If this is enabled, Slic3r will prompt the last output directory instead of " -"the one containing the input files." +"If this is enabled, Slic3r will prompt the last output directory instead of the one " +"containing the input files." msgstr "" -"Если включено, при сохранении G-кода Slic3r откроет последний использованный " +"Если включено, при сохранении G-кода PrusaSlicer откроет последний использованный " "выходной каталог вместо того, где лежит исходный файл." -#: src/slic3r/GUI/Preferences.cpp:56 +#: src/slic3r/GUI/Preferences.cpp:77 msgid "Auto-center parts" -msgstr "Автоматическое центрирование частей" +msgstr "Автоцентровка моделей" -#: src/slic3r/GUI/Preferences.cpp:58 +#: src/slic3r/GUI/Preferences.cpp:79 msgid "" -"If this is enabled, Slic3r will auto-center objects around the print bed " -"center." -msgstr "" -"Если включено, Slic3r будет автоматически центрировать объекты вокруг центра " -"платформы печати." +"If this is enabled, Slic3r will auto-center objects around the print bed center." +msgstr "Если включено, PrusaSlicer будет автоматически центрировать модели на столе." -#: src/slic3r/GUI/Preferences.cpp:64 +#: src/slic3r/GUI/Preferences.cpp:85 msgid "Background processing" msgstr "Фоновая обработка" -#: src/slic3r/GUI/Preferences.cpp:66 +#: src/slic3r/GUI/Preferences.cpp:87 msgid "" -"If this is enabled, Slic3r will pre-process objects as soon as they're " -"loaded in order to save time when exporting G-code." +"If this is enabled, Slic3r will pre-process objects as soon as they're loaded in " +"order to save time when exporting G-code." msgstr "" -"Если включено, Slic3r будет предварительно просчитывать объекты при " -"загрузке, чтобы сэкономить время при экспорте G-кода." +"Если включено, PrusaSlicer будет предварительно просчитывать модели при загрузке, " +"чтобы сэкономить время при экспорте G-кода." -#: src/slic3r/GUI/Preferences.cpp:75 +#: src/slic3r/GUI/Preferences.cpp:96 msgid "" -"If enabled, PrusaSlicer will check for the new versions of itself 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." +"If enabled, PrusaSlicer will check for the new versions of itself 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 "" -"Если включено, то PrusaSlicer проверяет наличие своих новых версий в сети. " -"Если доступна новая версия, то при следующем запуске отображается " -"уведомление (не отображается во время работы программы). Автоматическая " -"установка не производится. Вы увидите только уведомление." +"Если включено, то PrusaSlicer проверяет наличие новых версий в сети. Если доступна " +"новая версия при следующем запуске отображается уведомление (не во время работы " +"программы). Автоматическая установка не производится. Вы увидите только уведомление." -#: src/slic3r/GUI/Preferences.cpp:81 +#: src/slic3r/GUI/Preferences.cpp:102 msgid "Export sources full pathnames to 3mf and amf" -msgstr "Экспорт полных имён источников в 3mf и amf" +msgstr "При экспорте в 3mf, amf, сохранять полные пути к исходным файлам" -#: src/slic3r/GUI/Preferences.cpp:83 +#: src/slic3r/GUI/Preferences.cpp:104 msgid "" -"If enabled, allows the Reload from disk command to automatically find and " -"load the files when invoked." +"If enabled, allows the Reload from disk command to automatically find and load the " +"files when invoked." msgstr "" -"Если включено, позволяет команде перезагрузки с диска автоматически находить " -"и загружать файлы при вызове." +"Если включено, при выполнении команды \"Перезагрузить с диска\" программа будут " +"автоматически находить и загружать файлы проекта." -#: src/slic3r/GUI/Preferences.cpp:93 +#: src/slic3r/GUI/Preferences.cpp:114 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" +"Если включено, назначает PrusaSlicer в качестве приложения по умолчанию для " +"открытия .3mf файлов." -#: src/slic3r/GUI/Preferences.cpp:100 +#: src/slic3r/GUI/Preferences.cpp:121 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" +"Если включено, назначает PrusaSlicer в качестве приложения по умолчанию для " +"открытия .stl файлов." -#: src/slic3r/GUI/Preferences.cpp:110 +#: src/slic3r/GUI/Preferences.cpp:131 msgid "" -"If enabled, Slic3r 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." +"If enabled, Slic3r 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 "" -"Если включено, то Slic3r будет загружать обновления встроенных системных " -"профилей в фоновом режиме. Эти обновления загружаются в отдельную временную " -"папку. Когда новые профили становятся доступны, они предлагаются при запуске " -"приложения." +"Если включено, то PrusaSlicer будет загружать обновления встроенных системных " +"профилей в фоновом режиме. Эти обновления загружаются в отдельную временную папку. " +"Когда новые профили становятся доступны, они предлагаются при запуске приложения." -#: src/slic3r/GUI/Preferences.cpp:115 +#: src/slic3r/GUI/Preferences.cpp:136 msgid "Suppress \" - default - \" presets" msgstr "Подавить профили по умолчанию" -#: src/slic3r/GUI/Preferences.cpp:117 +#: src/slic3r/GUI/Preferences.cpp:138 msgid "" -"Suppress \" - default - \" presets in the Print / Filament / Printer " -"selections once there are any other valid presets available." +"Suppress \" - default - \" presets in the Print / Filament / Printer selections " +"once there are any other valid presets available." msgstr "" -"Подавлять профили по умолчанию во вкладках Настройки печати/Настройки прутка/" -"Настройки принтера, при наличии других допустимых профилей." +"Подавлять профили по умолчанию во вкладках Настройки печати/Настройки прутка/Настройки принтера, " +"при наличии других допустимых профилей." -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:144 msgid "Show incompatible print and filament presets" msgstr "Показывать несовместимые профили печати и прутка" -#: src/slic3r/GUI/Preferences.cpp:125 +#: src/slic3r/GUI/Preferences.cpp:146 msgid "" -"When checked, the print and filament presets are shown in the preset editor " -"even if they are marked as incompatible with the active printer" +"When checked, the print and filament presets are shown in the preset editor even if " +"they are marked as incompatible with the active printer" msgstr "" -"Если отмечено, то профили печати и прутка отображаются в редакторе профилей, " -"даже если они помечены как несовместимые с активным принтером" +"Если включено, то профили печати и прутка отображаются в редакторе профилей, даже " +"если они помечены как несовместимые с активным принтером." -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:152 msgid "Show drop project dialog" -msgstr "" +msgstr "Диалоговое окно при перетаскивании файла-проекта" -#: src/slic3r/GUI/Preferences.cpp:133 +#: src/slic3r/GUI/Preferences.cpp:154 msgid "" -"When checked, whenever dragging and dropping a project file on the " -"application, shows a dialog asking to select the action to take on the file " -"to load." +"When checked, whenever dragging and dropping a project file on the application, " +"shows a dialog asking to select the action to take on the file to load." msgstr "" +"Если включено, то при каждом перетаскивании в приложение файла-проекта будет " +"отображается диалоговое окно с просьбой выбрать действие, которое необходимо " +"выполнить с файлом." -#: src/slic3r/GUI/Preferences.cpp:138 src/libslic3r/PrintConfig.cpp:3751 -msgid "Single instance mode" -msgstr "" +#: src/slic3r/GUI/Preferences.cpp:161 src/slic3r/GUI/Preferences.cpp:165 +msgid "Allow just a single PrusaSlicer instance" +msgstr "Только одни экземпляр программы" -#: src/slic3r/GUI/Preferences.cpp:141 +#: src/slic3r/GUI/Preferences.cpp:163 msgid "" -"On OSX there is always only one instance of app running by default. However " -"it is allowed to run multiple instances of same app from the command line. " -"In such case this settings will allow only one instance." +"On OSX there is always only one instance of app running by default. However it is " +"allowed to run multiple instances of same app from the command line. In such case " +"this settings will allow only one instance." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:143 +#: src/slic3r/GUI/Preferences.cpp:167 msgid "" -"If this is enabled, when starting PrusaSlicer and another instance of the " -"same PrusaSlicer is already running, that instance will be reactivated " -"instead." +"If this is enabled, when starting PrusaSlicer and another instance of the same " +"PrusaSlicer is already running, that instance will be reactivated instead." msgstr "" +"Если включено, разрешена работа только одного экземпляра той же самой версии " +"программы." -#: src/slic3r/GUI/Preferences.cpp:160 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:665 +#: src/slic3r/GUI/Preferences.cpp:173 src/slic3r/GUI/UnsavedChangesDialog.cpp:671 msgid "Ask for unsaved changes when closing application" -msgstr "" +msgstr "Запрос о несохраненных изменениях при закрытии приложения" -#: src/slic3r/GUI/Preferences.cpp:162 +#: src/slic3r/GUI/Preferences.cpp:175 msgid "When closing the application, always ask for unsaved changes" -msgstr "" +msgstr "Всегда спрашивать о несохраненных изменениях при закрытии приложения." -#: src/slic3r/GUI/Preferences.cpp:167 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:666 +#: src/slic3r/GUI/Preferences.cpp:180 src/slic3r/GUI/UnsavedChangesDialog.cpp:672 msgid "Ask for unsaved changes when selecting new preset" -msgstr "" +msgstr "Запрос о несохраненных изменениях при выборе нового профиля" -#: src/slic3r/GUI/Preferences.cpp:169 +#: src/slic3r/GUI/Preferences.cpp:182 msgid "Always ask for unsaved changes when selecting new preset" -msgstr "" +msgstr "Всегда спрашивать о несохраненных изменениях при выборе нового профиля." -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:190 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" -msgstr "" +msgstr "Ассоциировать файлы .gcode с PrusaSlicer G-code Viewer" -#: src/slic3r/GUI/Preferences.cpp:179 +#: src/slic3r/GUI/Preferences.cpp:192 msgid "" -"If enabled, sets PrusaSlicer G-code Viewer as default application to open ." -"gcode files." +"If enabled, sets PrusaSlicer G-code Viewer as default application to open .gcode " +"files." msgstr "" +"Если включено, назначает PrusaSlicer G-code Viewer в качестве приложения по " +"умолчанию для открытия .gcode файлов." -#: src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:201 msgid "Use Retina resolution for the 3D scene" -msgstr "" +msgstr "Использовать разрешение дисплея Retina для окна 3D-вида" -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:203 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." msgstr "" +"Если включено, окно 3D-вида будет отображаться с разрешением дисплея Retina. Если у " +"вас возникают проблемы с производительностью 3D, отключение этой опции может помочь." -#: src/slic3r/GUI/Preferences.cpp:198 src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:211 src/slic3r/GUI/Preferences.cpp:213 msgid "Show splash screen" -msgstr "" +msgstr "Показывать заставку при запуске программы" -#: src/slic3r/GUI/Preferences.cpp:207 +#: src/slic3r/GUI/Preferences.cpp:220 msgid "Enable support for legacy 3DConnexion devices" -msgstr "" +msgstr "Включить поддержку устаревших устройств 3DConnexion" -#: src/slic3r/GUI/Preferences.cpp:209 +#: src/slic3r/GUI/Preferences.cpp:222 msgid "" -"If enabled, the legacy 3DConnexion devices settings dialog is available by " -"pressing CTRL+M" +"If enabled, the legacy 3DConnexion devices settings dialog is available by pressing " +"CTRL+M" msgstr "" +"Если включено, диалоговое окно настроек устаревших устройств 3DConnexion будет " +"доступно при нажатии CTRL+M." -#: src/slic3r/GUI/Preferences.cpp:218 +#: src/slic3r/GUI/Preferences.cpp:232 msgid "Camera" msgstr "Камера" -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:237 msgid "Use perspective camera" -msgstr "Использовать перспективную камера" +msgstr "Использовать вид в перспективе" -#: src/slic3r/GUI/Preferences.cpp:226 -msgid "" -"If enabled, use perspective camera. If not enabled, use orthographic camera." -msgstr "" -"Если включено, то используется перспективная камера. Если нет, то " -"ортогональная камера." +#: src/slic3r/GUI/Preferences.cpp:239 +msgid "If enabled, use perspective camera. If not enabled, use orthographic camera." +msgstr "Если включено, используется вид в перспективе, иначе - ортогональный." -#: src/slic3r/GUI/Preferences.cpp:231 +#: src/slic3r/GUI/Preferences.cpp:244 msgid "Use free camera" msgstr "Использовать свободную камеру" -#: src/slic3r/GUI/Preferences.cpp:233 +#: src/slic3r/GUI/Preferences.cpp:246 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" -"Если включено, то используется свободная камера. Если нет, то закреплённая " -"камера." +"Если включено, используется свободное вращение камеры. Если выключено, используется " +"вращение камера с ограничениями." -#: src/slic3r/GUI/Preferences.cpp:238 +#: src/slic3r/GUI/Preferences.cpp:251 msgid "Reverse direction of zoom with mouse wheel" -msgstr "" +msgstr "Обратное направление масштабирования колесиком мыши" -#: src/slic3r/GUI/Preferences.cpp:240 +#: src/slic3r/GUI/Preferences.cpp:253 msgid "If enabled, reverses the direction of zoom with mouse wheel" -msgstr "" +msgstr "Если включено, меняется направление масштабирования с помощью колеса мыши." -#: src/slic3r/GUI/Preferences.cpp:247 +#: src/slic3r/GUI/Preferences.cpp:261 msgid "GUI" -msgstr "Графический интерфейс" +msgstr "Интерфейс программы" -#: src/slic3r/GUI/Preferences.cpp:262 -msgid "Show sidebar collapse/expand button" -msgstr "" +#: src/slic3r/GUI/Preferences.cpp:276 +msgid "Sequential slider applied only to top layer" +msgstr "Ползунок положения инструмента применяется только к верхнему слою" -#: src/slic3r/GUI/Preferences.cpp:264 +#: src/slic3r/GUI/Preferences.cpp:278 msgid "" -"If enabled, the button for the collapse sidebar will be appeared in top " -"right corner of the 3D Scene" +"If enabled, changes made using the sequential slider, in preview, apply only to " +"gcode top layer. If disabled, changes made using the sequential slider, in preview, " +"apply to the whole gcode." msgstr "" -"Если включено, то в верхнем правом углу 3D-сцены появится кнопка скрытия " -"боковой панели" +"Если включено, изменения, сделанные с помощью ползунка положения инструмента, в " +"окне предпросмотра нарезки, применяются только к верхнему слою G-коду. Если " +"отключено, изменения, сделанные с помощью ползунка положения инструмента, в окне " +"предпросмотра нарезки, применяются ко всему G-коду." -#: src/slic3r/GUI/Preferences.cpp:269 -msgid "Use custom size for toolbar icons" -msgstr "Использовать задаваемый размер значков панели инструментов" +#: src/slic3r/GUI/Preferences.cpp:285 +msgid "Show sidebar collapse/expand button" +msgstr "Показать кнопку свертывания/раскрытия боковой панели" -#: src/slic3r/GUI/Preferences.cpp:271 -msgid "If enabled, you can change size of toolbar icons manually." -msgstr "Если включено, то вы можете задать размер значков панели инструментов." +#: src/slic3r/GUI/Preferences.cpp:287 +msgid "" +"If enabled, the button for the collapse sidebar will be appeared in top right " +"corner of the 3D Scene" +msgstr "" +"Если включено, в правом верхнем углу 3D-сцены появится кнопка свертывания боковой " +"панели." -#: src/slic3r/GUI/Preferences.cpp:276 +#: src/slic3r/GUI/Preferences.cpp:292 msgid "Suppress to open hyperlink in browser" -msgstr "" +msgstr "Запретить открытие гиперссылок в браузере" -#: src/slic3r/GUI/Preferences.cpp:278 +#: src/slic3r/GUI/Preferences.cpp:294 msgid "" -"If enabled, the descriptions of configuration parameters in settings tabs " -"wouldn't work as hyperlinks. If disabled, the descriptions of configuration " -"parameters in settings tabs will work as hyperlinks." +"If enabled, the descriptions of configuration parameters in settings tabs wouldn't " +"work as hyperlinks. If disabled, the descriptions of configuration parameters in " +"settings tabs will work as hyperlinks." msgstr "" +"Если включено, то работа гиперссылок описаний параметров во вкладках настроек будет " +"отключена." -#: src/slic3r/GUI/Preferences.cpp:285 -msgid "Sequential slider applied only to top layer" -msgstr "" +#: src/slic3r/GUI/Preferences.cpp:300 +msgid "Use custom size for toolbar icons" +msgstr "Использовать нестандартный размер значков панели инструментов" -#: src/slic3r/GUI/Preferences.cpp:287 -msgid "" -"If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." -msgstr "" +#: src/slic3r/GUI/Preferences.cpp:302 +msgid "If enabled, you can change size of toolbar icons manually." +msgstr "Если включено, вы можете изменить размер значков панели инструментов вручную." -#: src/slic3r/GUI/Preferences.cpp:304 +#: src/slic3r/GUI/Preferences.cpp:320 msgid "Render" -msgstr "Отрисовка" +msgstr "Визуализация" -#: src/slic3r/GUI/Preferences.cpp:310 +#: src/slic3r/GUI/Preferences.cpp:325 msgid "Use environment map" -msgstr "Использовать карту окружения" +msgstr "Использовать карты окружения" -#: src/slic3r/GUI/Preferences.cpp:312 +#: src/slic3r/GUI/Preferences.cpp:327 msgid "If enabled, renders object using the environment map." -msgstr "" -"Если включено, то объекты отрисовываются с использованием карты окружения." +msgstr "Если включено, визуализация моделей выполняется с помощью карты окружения." -#: src/slic3r/GUI/Preferences.cpp:345 +#: src/slic3r/GUI/Preferences.cpp:352 #, c-format msgid "You need to restart %s to make the changes effective." msgstr "Необходимо перезапустить %s, чтобы изменения вступили в силу." -#: src/slic3r/GUI/Preferences.cpp:420 +#: src/slic3r/GUI/Preferences.cpp:427 msgid "Icon size in a respect to the default size" -msgstr "Размер значка по отношению к размеру по умолчанию" +msgstr "Размер значка относительно размера по умолчанию" -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:442 msgid "Select toolbar icon size in respect to the default one." -msgstr "Выберите размер значка по отношению к размеру по умолчанию." +msgstr "" +"Выбор размера значка панели инструментов по отношению к значению по умолчанию." -#: src/slic3r/GUI/Preferences.cpp:466 +#: src/slic3r/GUI/Preferences.cpp:473 msgid "Old regular layout with the tab bar" -msgstr "" +msgstr "Старая обычная компоновка с вкладками на столе" -#: src/slic3r/GUI/Preferences.cpp:467 +#: src/slic3r/GUI/Preferences.cpp:474 msgid "New layout, access via settings button in the top menu" -msgstr "" +msgstr "Новая компоновка с кнопкой настроек в верхнем меню" -#: src/slic3r/GUI/Preferences.cpp:468 +#: src/slic3r/GUI/Preferences.cpp:475 msgid "Settings in non-modal window" -msgstr "" +msgstr "Настройки будут отображаться в отдельном окне" -#: src/slic3r/GUI/Preferences.cpp:477 +#: src/slic3r/GUI/Preferences.cpp:484 msgid "Layout Options" -msgstr "" +msgstr "Настройка внешнего вида" -#: src/slic3r/GUI/PresetComboBoxes.cpp:197 -#: src/slic3r/GUI/PresetComboBoxes.cpp:235 -#: src/slic3r/GUI/PresetComboBoxes.cpp:761 -#: src/slic3r/GUI/PresetComboBoxes.cpp:811 -#: src/slic3r/GUI/PresetComboBoxes.cpp:925 -#: src/slic3r/GUI/PresetComboBoxes.cpp:969 +#: src/slic3r/GUI/PresetComboBoxes.cpp:197 src/slic3r/GUI/PresetComboBoxes.cpp:235 +#: src/slic3r/GUI/PresetComboBoxes.cpp:761 src/slic3r/GUI/PresetComboBoxes.cpp:811 +#: src/slic3r/GUI/PresetComboBoxes.cpp:925 src/slic3r/GUI/PresetComboBoxes.cpp:969 msgid "System presets" msgstr "Системные профили" -#: src/slic3r/GUI/PresetComboBoxes.cpp:239 -#: src/slic3r/GUI/PresetComboBoxes.cpp:815 +#: src/slic3r/GUI/PresetComboBoxes.cpp:239 src/slic3r/GUI/PresetComboBoxes.cpp:815 #: src/slic3r/GUI/PresetComboBoxes.cpp:973 msgid "User presets" msgstr "Пользовательские профили" #: src/slic3r/GUI/PresetComboBoxes.cpp:250 msgid "Incompatible presets" -msgstr "" +msgstr "Несовместимые профили" #: src/slic3r/GUI/PresetComboBoxes.cpp:285 msgid "Are you sure you want to delete \"%1%\" printer?" -msgstr "" +msgstr "Вы уверены, что хотите удалить принтер \"%1%\"?" #: src/slic3r/GUI/PresetComboBoxes.cpp:287 msgid "Delete Physical Printer" -msgstr "" +msgstr "Удалить физический принтер" #: src/slic3r/GUI/PresetComboBoxes.cpp:624 msgid "Click to edit preset" -msgstr "Щёлкните для редактирования" +msgstr "Нажмите, чтобы изменить профиль" -#: src/slic3r/GUI/PresetComboBoxes.cpp:680 -#: src/slic3r/GUI/PresetComboBoxes.cpp:710 +#: src/slic3r/GUI/PresetComboBoxes.cpp:680 src/slic3r/GUI/PresetComboBoxes.cpp:710 msgid "Add/Remove presets" -msgstr "" +msgstr "Добавить/удалить профиль" -#: src/slic3r/GUI/PresetComboBoxes.cpp:685 -#: src/slic3r/GUI/PresetComboBoxes.cpp:715 src/slic3r/GUI/Tab.cpp:2985 +#: src/slic3r/GUI/PresetComboBoxes.cpp:685 src/slic3r/GUI/PresetComboBoxes.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2990 msgid "Add physical printer" -msgstr "" +msgstr "Добавить физический профиль" #: src/slic3r/GUI/PresetComboBoxes.cpp:699 msgid "Edit preset" -msgstr "" +msgstr "Изменить профиль" -#: src/slic3r/GUI/PresetComboBoxes.cpp:703 src/slic3r/GUI/Tab.cpp:2985 +#: src/slic3r/GUI/PresetComboBoxes.cpp:703 src/slic3r/GUI/Tab.cpp:2990 msgid "Edit physical printer" -msgstr "" +msgstr "Изменить физический профиль" #: src/slic3r/GUI/PresetComboBoxes.cpp:706 msgid "Delete physical printer" -msgstr "" +msgstr "Удалить физический принтер" -#: src/slic3r/GUI/PresetComboBoxes.cpp:826 -#: src/slic3r/GUI/PresetComboBoxes.cpp:987 +#: src/slic3r/GUI/PresetComboBoxes.cpp:826 src/slic3r/GUI/PresetComboBoxes.cpp:987 msgid "Physical printers" -msgstr "" +msgstr "Физические принтеры" #: src/slic3r/GUI/PresetComboBoxes.cpp:850 msgid "Add/Remove filaments" -msgstr "Добавление/Удаление прутков" +msgstr "Добавить/удалить пруток" #: src/slic3r/GUI/PresetComboBoxes.cpp:852 msgid "Add/Remove materials" -msgstr "Добавление/Удаление материалов" +msgstr "Добавить/удалить материал" -#: src/slic3r/GUI/PresetComboBoxes.cpp:854 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1011 +#: src/slic3r/GUI/PresetComboBoxes.cpp:854 src/slic3r/GUI/PresetComboBoxes.cpp:1011 msgid "Add/Remove printers" -msgstr "Добавление/Удаление принтеров" +msgstr "Добавить/удалить принтер" -#: src/slic3r/GUI/PresetHints.cpp:28 +#: src/slic3r/GUI/PresetHints.cpp:32 msgid "" -"If estimated layer time is below ~%1%s, fan will run at %2%%% and print " -"speed will be reduced so that no less than %3%s are spent on that layer " -"(however, speed will never be reduced below %4%mm/s)." +"If estimated layer time is below ~%1%s, fan will run at %2%%% and print speed will " +"be reduced so that no less than %3%s are spent on that layer (however, speed will " +"never be reduced below %4%mm/s)." msgstr "" -"Если расчётное время печати слоя меньше ~%1%с, вентилятор будет работать на " -"%2%%%, а скорость печати будет уменьшена так, что на этот слой будет " -"затрачено не менее %3%с (однако, скорость никогда не будет уменьшена ниже " -"%4%мм/с)." +"Если расчётное время печати слоя меньше ~%1% сек., вентилятор будет работать на %2%%" +"%, а скорость печати будет уменьшена, так что на этот слой будет затрачено не менее " +"%3% сек. (однако скорость никогда не будет уменьшена ниже %4%мм/с)." -#: src/slic3r/GUI/PresetHints.cpp:35 +#: src/slic3r/GUI/PresetHints.cpp:39 msgid "" "If estimated layer time is greater, but still below ~%1%s, fan will run at a " "proportionally decreasing speed between %2%%% and %3%%%." msgstr "" -"Если расчётное время слоя большое, но всё ещё ниже ~%1%с, вентилятор будет " -"работать с плавно падающей скоростью между %2%%% и %3%%%." +"Если расчётное время печати слоя большое, но всё ещё ниже ~%1% сек., вентилятор " +"будет работать с плавно падающей скоростью между %2%%%-%3%%%." -#: src/slic3r/GUI/PresetHints.cpp:39 -msgid "During the other layers, fan" -msgstr "Во время печати других слоёв, вентилятор" +#: src/slic3r/GUI/PresetHints.cpp:49 +msgid "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%." +msgstr "Скорость вентилятора будет увеличена с нуля на %1% слое до %2%%% на %3% слое." -#: src/slic3r/GUI/PresetHints.cpp:41 -msgid "Fan" -msgstr "Вентилятор" +#: src/slic3r/GUI/PresetHints.cpp:51 +msgid "During the other layers, fan will always run at %1%%%" +msgstr "Во время печати других слоёв, вентилятор всегда будет работать на %1%%%\"" -#: src/slic3r/GUI/PresetHints.cpp:47 -msgid "will always run at %1%%%" -msgstr "всегда будет работать на %1%%%" +#: src/slic3r/GUI/PresetHints.cpp:51 +msgid "Fan will always run at %1%%%" +msgstr "Вентилятор всегда будет работать на %1%%%" -#: src/slic3r/GUI/PresetHints.cpp:50 +#: src/slic3r/GUI/PresetHints.cpp:53 msgid "except for the first %1% layers." msgstr ", за исключением первых %1% слоёв." -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:55 msgid "except for the first layer." msgstr ", за исключением первого слоя." -#: src/slic3r/GUI/PresetHints.cpp:54 -msgid "will be turned off." -msgstr "отключён." +#: src/slic3r/GUI/PresetHints.cpp:58 +msgid "During the other layers, fan will be turned off." +msgstr "Во время печати других слоёв, вентилятор будет выключен." -#: src/slic3r/GUI/PresetHints.cpp:155 +#: src/slic3r/GUI/PresetHints.cpp:58 +msgid "Fan will be turned off." +msgstr "Вентилятор будет выключен." + +#: src/slic3r/GUI/PresetHints.cpp:159 msgid "external perimeters" msgstr "внешних периметров" -#: src/slic3r/GUI/PresetHints.cpp:164 +#: src/slic3r/GUI/PresetHints.cpp:168 msgid "perimeters" msgstr "периметры" -#: src/slic3r/GUI/PresetHints.cpp:173 +#: src/slic3r/GUI/PresetHints.cpp:177 msgid "infill" -msgstr "заполнение" +msgstr "заполнения" -#: src/slic3r/GUI/PresetHints.cpp:183 +#: src/slic3r/GUI/PresetHints.cpp:187 msgid "solid infill" msgstr "сплошные слои заполнения" -#: src/slic3r/GUI/PresetHints.cpp:191 +#: src/slic3r/GUI/PresetHints.cpp:195 msgid "top solid infill" msgstr "верхние сплошные слои заполнения" -#: src/slic3r/GUI/PresetHints.cpp:202 +#: src/slic3r/GUI/PresetHints.cpp:206 msgid "support" msgstr "поддержки" -#: src/slic3r/GUI/PresetHints.cpp:212 +#: src/slic3r/GUI/PresetHints.cpp:216 msgid "support interface" msgstr "связующая слой поддержки" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:222 msgid "First layer volumetric" msgstr "Объёмный расход первого слоя" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:222 msgid "Bridging volumetric" msgstr "Объёмный расход мостов" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:222 msgid "Volumetric" msgstr "Объёмный расход" -#: src/slic3r/GUI/PresetHints.cpp:219 +#: src/slic3r/GUI/PresetHints.cpp:223 msgid "flow rate is maximized" -msgstr "скорость потока максимальна" +msgstr "увеличивается" -#: src/slic3r/GUI/PresetHints.cpp:222 +#: src/slic3r/GUI/PresetHints.cpp:226 msgid "by the print profile maximum" msgstr "по максимальному значению для профилю печати" -#: src/slic3r/GUI/PresetHints.cpp:223 +#: src/slic3r/GUI/PresetHints.cpp:227 msgid "when printing" msgstr "при печати" -#: src/slic3r/GUI/PresetHints.cpp:224 +#: src/slic3r/GUI/PresetHints.cpp:228 msgid "with a volumetric rate" msgstr "с объёмной скоростью" -#: src/slic3r/GUI/PresetHints.cpp:228 +#: src/slic3r/GUI/PresetHints.cpp:232 #, c-format msgid "%3.2f mm³/s at filament speed %3.2f mm/s." -msgstr "%3.2f мм³/с при скорости пластиковой нити %3.2f мм/с." +msgstr "%3.2f мм³/с при скорости прутка %3.2f мм/с." -#: src/slic3r/GUI/PresetHints.cpp:246 +#: src/slic3r/GUI/PresetHints.cpp:250 msgid "" -"Recommended object thin wall thickness: Not available due to invalid layer " -"height." +"Recommended object thin wall thickness: Not available due to invalid layer height." msgstr "" -"Рекомендуемая толщина тонких стенок объекта: недоступно из-за недопустимой " -"высоты слоя." +"Рекомендуемая толщина тонких стенок модели: недоступно из-за недопустимой высоты " +"слоя." -#: src/slic3r/GUI/PresetHints.cpp:262 +#: src/slic3r/GUI/PresetHints.cpp:266 #, c-format msgid "Recommended object thin wall thickness for layer height %.2f and" -msgstr "" -"Рекомендуемая толщина тонких стенок объекта для слоя с высотой %.2f мм и" +msgstr "Рекомендуемая толщина тонких стенок модели при высоте слоя %.2f мм и" -#: src/slic3r/GUI/PresetHints.cpp:269 +#: src/slic3r/GUI/PresetHints.cpp:273 #, c-format msgid "%d lines: %.2f mm" -msgstr "%d линий: %.2f мм" +msgstr "%d линий периметра - %.2f мм" -#: src/slic3r/GUI/PresetHints.cpp:273 +#: src/slic3r/GUI/PresetHints.cpp:277 msgid "" -"Recommended object thin wall thickness: Not available due to excessively " -"small extrusion width." +"Recommended object thin wall thickness: Not available due to excessively small " +"extrusion width." msgstr "" -"Рекомендуемая толщина тонких стенок объекта: недоступно из-за недопустимо " -"малой ширины экструзии." +"Рекомендуемая толщина тонких стенок модели: недоступно из-за чрезмерно малой ширины " +"экструзии." -#: src/slic3r/GUI/PresetHints.cpp:302 -msgid "" -"Top / bottom shell thickness hint: Not available due to invalid layer height." +#: src/slic3r/GUI/PresetHints.cpp:306 +msgid "Top / bottom shell thickness hint: Not available due to invalid layer height." msgstr "" -"Рекомендуемая толщина верхней/нижней оболочки: недоступно из-за недопустимой " -"высоты слоя." +"Подсказка о толщине верхней/нижней оболочки недоступна из-за неправильной высоты " +"слоя." -#: src/slic3r/GUI/PresetHints.cpp:315 +#: src/slic3r/GUI/PresetHints.cpp:319 msgid "Top shell is %1% mm thick for layer height %2% mm." -msgstr "Толщина верхней оболочки равна %1% мм для высоты слоя в %2% мм." +msgstr "Верхняя оболочка будет имеет толщину %1% мм при высоте слоя %2% мм." -#: src/slic3r/GUI/PresetHints.cpp:318 +#: src/slic3r/GUI/PresetHints.cpp:322 msgid "Minimum top shell thickness is %1% mm." -msgstr "Минимальная толщина верхней оболочки равна %1% мм." +msgstr "Минимальная толщина оболочки сверху составляет %1% мм." -#: src/slic3r/GUI/PresetHints.cpp:321 +#: src/slic3r/GUI/PresetHints.cpp:325 msgid "Top is open." -msgstr "Нет верхней оболочки." +msgstr "Оболочки сверху (крыша) отсутствуют." -#: src/slic3r/GUI/PresetHints.cpp:334 +#: src/slic3r/GUI/PresetHints.cpp:338 msgid "Bottom shell is %1% mm thick for layer height %2% mm." -msgstr "Толщина нижней оболочки равна %1% мм для высоты слоя в %2% мм." +msgstr "Нижняя оболочка будет имеет толщину %1% мм при высоте слоя %2% мм." -#: src/slic3r/GUI/PresetHints.cpp:337 +#: src/slic3r/GUI/PresetHints.cpp:341 msgid "Minimum bottom shell thickness is %1% mm." -msgstr "Минимальная толщина нижней оболочки равна %1% мм." +msgstr "Минимальная толщина оболочки снизу составляет %1% мм." -#: src/slic3r/GUI/PresetHints.cpp:340 +#: src/slic3r/GUI/PresetHints.cpp:344 msgid "Bottom is open." -msgstr "Нет нижней оболочки." +msgstr "Оболочки снизу (дно) отсутствуют." -#: src/slic3r/GUI/PrintHostDialogs.cpp:34 +#: src/slic3r/GUI/PrintHostDialogs.cpp:35 msgid "Send G-Code to printer host" -msgstr "Послать G-код на узел печати" +msgstr "Отправить G-кода на хост принтера" -#: src/slic3r/GUI/PrintHostDialogs.cpp:34 +#: src/slic3r/GUI/PrintHostDialogs.cpp:35 msgid "Upload to Printer Host with the following filename:" -msgstr "Загрузить на узел печати со следующим именем файла:" +msgstr "Загрузить на хост принтера со следующим именем:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:36 +#: src/slic3r/GUI/PrintHostDialogs.cpp:37 msgid "Start printing after upload" msgstr "Начать печать после загрузки" -#: src/slic3r/GUI/PrintHostDialogs.cpp:44 +#: src/slic3r/GUI/PrintHostDialogs.cpp:45 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "" -"При необходимости используйте косую черту ( / ) в качестве разделителя " -"каталогов." +"При необходимости используйте косую черту ( / ) в качестве разделителя каталогов." -#: src/slic3r/GUI/PrintHostDialogs.cpp:57 +#: src/slic3r/GUI/PrintHostDialogs.cpp:58 msgid "Group" -msgstr "" +msgstr "Группа" -#: src/slic3r/GUI/PrintHostDialogs.cpp:174 +#: src/slic3r/GUI/PrintHostDialogs.cpp:176 msgid "ID" msgstr "ID" -#: src/slic3r/GUI/PrintHostDialogs.cpp:175 +#: src/slic3r/GUI/PrintHostDialogs.cpp:177 msgid "Progress" -msgstr "Ход выполнения" +msgstr "Прогресс" -#: src/slic3r/GUI/PrintHostDialogs.cpp:176 +#: src/slic3r/GUI/PrintHostDialogs.cpp:178 msgid "Status" -msgstr "Состояние" +msgstr "Статус" -#: src/slic3r/GUI/PrintHostDialogs.cpp:177 +#: src/slic3r/GUI/PrintHostDialogs.cpp:179 msgid "Host" -msgstr "Узел" +msgstr "Хост" -#: src/slic3r/GUI/PrintHostDialogs.cpp:178 +#: src/slic3r/GUI/PrintHostDialogs.cpp:180 msgid "Filename" -msgstr "Файл" +msgstr "Имя файла" -#: src/slic3r/GUI/PrintHostDialogs.cpp:179 +#: src/slic3r/GUI/PrintHostDialogs.cpp:181 msgid "Error Message" msgstr "Сообщение об ошибке" -#: src/slic3r/GUI/PrintHostDialogs.cpp:182 +#: src/slic3r/GUI/PrintHostDialogs.cpp:184 msgid "Cancel selected" msgstr "Отменить выбранное" -#: src/slic3r/GUI/PrintHostDialogs.cpp:184 +#: src/slic3r/GUI/PrintHostDialogs.cpp:186 msgid "Show error message" msgstr "Показать сообщение об ошибке" -#: src/slic3r/GUI/PrintHostDialogs.cpp:226 -#: src/slic3r/GUI/PrintHostDialogs.cpp:257 +#: src/slic3r/GUI/PrintHostDialogs.cpp:228 src/slic3r/GUI/PrintHostDialogs.cpp:261 msgid "Enqueued" -msgstr "В очереди" +msgstr "Поставлено в очередь" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:262 msgid "Uploading" -msgstr "Загружается" +msgstr "Отправка" -#: src/slic3r/GUI/PrintHostDialogs.cpp:262 +#: src/slic3r/GUI/PrintHostDialogs.cpp:266 msgid "Completed" msgstr "Завершено" -#: src/slic3r/GUI/PrintHostDialogs.cpp:300 +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 msgid "Error uploading to print host:" -msgstr "Ошибка при загрузке на узел печати:" +msgstr "Ошибка при отправке на хост печати:" #: src/slic3r/GUI/RammingChart.cpp:23 msgid "NO RAMMING AT ALL" msgstr "НЕ ДОПУСКАТЬ РЭММИНГ" #: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 -#: src/libslic3r/PrintConfig.cpp:689 src/libslic3r/PrintConfig.cpp:733 -#: src/libslic3r/PrintConfig.cpp:748 src/libslic3r/PrintConfig.cpp:2604 -#: src/libslic3r/PrintConfig.cpp:2613 src/libslic3r/PrintConfig.cpp:2723 -#: src/libslic3r/PrintConfig.cpp:2731 src/libslic3r/PrintConfig.cpp:2739 -#: src/libslic3r/PrintConfig.cpp:2746 src/libslic3r/PrintConfig.cpp:2754 -#: src/libslic3r/PrintConfig.cpp:2762 +#: src/libslic3r/PrintConfig.cpp:706 src/libslic3r/PrintConfig.cpp:750 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:2636 +#: src/libslic3r/PrintConfig.cpp:2645 src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2763 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 +#: src/libslic3r/PrintConfig.cpp:2794 msgid "s" msgstr "с" @@ -6419,8 +6626,8 @@ msgstr "с" msgid "Volumetric speed" msgstr "Объёмная скорость подачи" -#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:646 -#: src/libslic3r/PrintConfig.cpp:1430 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:663 +#: src/libslic3r/PrintConfig.cpp:1458 msgid "mm³/s" msgstr "мм³/с" @@ -6431,7 +6638,7 @@ msgstr "Сохранить %s как:" #: src/slic3r/GUI/SavePresetDialog.cpp:110 msgid "the following suffix is not allowed:" -msgstr "следующий суффикс не допускается:" +msgstr "следующий суффикс не разрешается:" #: src/slic3r/GUI/SavePresetDialog.cpp:116 msgid "The supplied name is not available." @@ -6447,394 +6654,403 @@ msgstr "Невозможно перезаписать внешний профи #: src/slic3r/GUI/SavePresetDialog.cpp:134 msgid "Preset with name \"%1%\" already exists." -msgstr "Профиль с именем «%1%» уже существует." +msgstr "Профиль с именем \"%1%\" уже существует." #: src/slic3r/GUI/SavePresetDialog.cpp:136 msgid "" -"Preset with name \"%1%\" already exists and is imcopatible with selected " -"printer." -msgstr "" +"Preset with name \"%1%\" already exists and is incompatible with selected printer." +msgstr "Профиль с именем \"%1%\" уже существует и несовместим с выбранным принтером." #: src/slic3r/GUI/SavePresetDialog.cpp:137 msgid "Note: This preset will be replaced after saving" -msgstr "" +msgstr "Примечание: этот профиль будет заменён после сохранения" #: src/slic3r/GUI/SavePresetDialog.cpp:142 msgid "The name cannot be empty." -msgstr "" +msgstr "Данное имя не может быть пустым." -#: src/slic3r/GUI/SavePresetDialog.cpp:176 -#: src/slic3r/GUI/SavePresetDialog.cpp:182 +#: src/slic3r/GUI/SavePresetDialog.cpp:147 +msgid "The name cannot start with space character." +msgstr "Имя не должно начитаться с пробела." + +#: src/slic3r/GUI/SavePresetDialog.cpp:152 +msgid "The name cannot end with space character." +msgstr "Имя не должно заканчиваться пробелом." + +#: src/slic3r/GUI/SavePresetDialog.cpp:186 src/slic3r/GUI/SavePresetDialog.cpp:192 msgid "Save preset" -msgstr "Сохранить профиль" +msgstr "Сохранение профиля" -#: src/slic3r/GUI/SavePresetDialog.cpp:205 +#: src/slic3r/GUI/SavePresetDialog.cpp:215 msgctxt "PresetName" msgid "Copy" msgstr "Копия" -#: src/slic3r/GUI/SavePresetDialog.cpp:263 +#: src/slic3r/GUI/SavePresetDialog.cpp:273 msgid "" "You have selected physical printer \"%1%\" \n" "with related printer preset \"%2%\"" msgstr "" +"Выбран физический принтер \"%1%\" со \n" +"связанным профилем принтера \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:296 +#: src/slic3r/GUI/SavePresetDialog.cpp:306 msgid "What would you like to do with \"%1%\" preset after saving?" -msgstr "" +msgstr "Что вы хотите сделать с профилем \"%1%\" после сохранения?" -#: src/slic3r/GUI/SavePresetDialog.cpp:299 +#: src/slic3r/GUI/SavePresetDialog.cpp:309 msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" -msgstr "" +msgstr "Сменить \"%1%\" на \"%2%\" для этого физического принтера \"%3%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:300 +#: src/slic3r/GUI/SavePresetDialog.cpp:310 msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "" +"Добавить \"%1%\" в качестве следующего профиля для физического принтера \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:301 +#: src/slic3r/GUI/SavePresetDialog.cpp:311 msgid "Just switch to \"%1%\" preset" -msgstr "" +msgstr "Просто переключиться на профиль \"%1%\"" -#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2416 +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2421 msgid "Stealth" -msgstr "Тихий" +msgstr "Тихий режим" -#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2415 msgid "Normal" -msgstr "Нормальный" +msgstr "Нормальный режим" #: src/slic3r/GUI/Selection.cpp:172 msgid "Selection-Add" -msgstr "Выбор-добавление" +msgstr "Выбор\\Добавление" #: src/slic3r/GUI/Selection.cpp:213 msgid "Selection-Remove" -msgstr "Выбор-удаление" +msgstr "Выбор\\Удаление" #: src/slic3r/GUI/Selection.cpp:245 msgid "Selection-Add Object" -msgstr "Выбор-добавление объекта" +msgstr "Выбор\\Добавление модели" #: src/slic3r/GUI/Selection.cpp:264 msgid "Selection-Remove Object" -msgstr "Выбор-удаление объекта" +msgstr "Выбор\\Удаление модели" #: src/slic3r/GUI/Selection.cpp:282 msgid "Selection-Add Instance" -msgstr "Выбор-добавление экземпляра" +msgstr "Выбор\\Добавление копии" #: src/slic3r/GUI/Selection.cpp:301 msgid "Selection-Remove Instance" -msgstr "Выбор-удаление экземпляра" +msgstr "Выбор\\Удаление копии" #: src/slic3r/GUI/Selection.cpp:402 msgid "Selection-Add All" -msgstr "Выбор-добавление всего" +msgstr "Выбор\\Добавление всего" #: src/slic3r/GUI/Selection.cpp:428 msgid "Selection-Remove All" -msgstr "Выбор-удаление всего" +msgstr "Выбор\\Удаление всего" -#: src/slic3r/GUI/Selection.cpp:987 +#: src/slic3r/GUI/Selection.cpp:960 msgid "Scale To Fit" -msgstr "Масштабировать по размеру" +msgstr "Отмасштабировать под область печати" -#: src/slic3r/GUI/Selection.cpp:1514 +#: src/slic3r/GUI/Selection.cpp:1487 msgid "Set Printable Instance" -msgstr "" +msgstr "Копия для печати" -#: src/slic3r/GUI/Selection.cpp:1514 +#: src/slic3r/GUI/Selection.cpp:1487 msgid "Set Unprintable Instance" -msgstr "" +msgstr "Копия не для печати" #: src/slic3r/GUI/SysInfoDialog.cpp:82 msgid "System Information" -msgstr "Информация о системе" +msgstr "Системная информация" #: src/slic3r/GUI/SysInfoDialog.cpp:158 msgid "Copy to Clipboard" -msgstr "Копировать в буфер обмена" +msgstr "Скопировать в буфер обмена" -#: src/slic3r/GUI/Tab.cpp:112 src/libslic3r/PrintConfig.cpp:306 +#: src/slic3r/GUI/Tab.cpp:109 src/libslic3r/PrintConfig.cpp:321 msgid "Compatible printers" msgstr "Совместимые принтеры" -#: src/slic3r/GUI/Tab.cpp:113 +#: src/slic3r/GUI/Tab.cpp:110 msgid "Select the printers this profile is compatible with." msgstr "Выберите принтеры, совместимые с данным профилем." -#: src/slic3r/GUI/Tab.cpp:118 src/libslic3r/PrintConfig.cpp:321 +#: src/slic3r/GUI/Tab.cpp:115 src/libslic3r/PrintConfig.cpp:336 msgid "Compatible print profiles" msgstr "Совместимые профили печати" -#: src/slic3r/GUI/Tab.cpp:119 +#: src/slic3r/GUI/Tab.cpp:116 msgid "Select the print profiles this profile is compatible with." -msgstr "Выберите профили печати, совместимые с данным профилем." +msgstr "Выберите профили печати, с которыми этот профиль совместим." #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:214 +#: src/slic3r/GUI/Tab.cpp:211 #, c-format msgid "Save current %s" -msgstr "Сохранить %s" +msgstr "Сохранить текущие %s" -#: src/slic3r/GUI/Tab.cpp:215 +#: src/slic3r/GUI/Tab.cpp:212 msgid "Delete this preset" msgstr "Удалить этот профиль" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:216 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." msgstr "" -"Наведите курсор на кнопки для получения дополнительной информации или " -"нажмите эту кнопку." +"Наведите курсор на кнопки для получения дополнительной информации или нажмите эту " +"кнопку." -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:220 msgid "Search in settings [%1%]" -msgstr "" +msgstr "Поиск в настройках [%1%]" -#: src/slic3r/GUI/Tab.cpp:1239 +#: src/slic3r/GUI/Tab.cpp:1237 msgid "Detach from system preset" msgstr "Отсоединить от системного профиля" -#: src/slic3r/GUI/Tab.cpp:1252 +#: src/slic3r/GUI/Tab.cpp:1250 msgid "" -"A copy of the current system preset will be created, which will be detached " -"from the system preset." +"A copy of the current system preset will be created, which will be detached from " +"the system preset." msgstr "" +"Будет создана копия текущего системного профиля, который будет отсоединён от " +"системного профиля." -#: src/slic3r/GUI/Tab.cpp:1253 -msgid "" -"The current custom preset will be detached from the parent system preset." +#: src/slic3r/GUI/Tab.cpp:1251 +msgid "The current custom preset will be detached from the parent system preset." msgstr "" +"Текущий пользовательский профиль будет отсоединён от родительского системного " +"профиля." -#: src/slic3r/GUI/Tab.cpp:1256 +#: src/slic3r/GUI/Tab.cpp:1254 msgid "Modifications to the current profile will be saved." -msgstr "" +msgstr "Изменения будут сохранены в текущем профиле." -#: src/slic3r/GUI/Tab.cpp:1259 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "This action is not revertable.\n" "Do you want to proceed?" msgstr "" +"Эта операция необратима.\n" +"Хотите продолжить?" -#: src/slic3r/GUI/Tab.cpp:1261 +#: src/slic3r/GUI/Tab.cpp:1259 msgid "Detach preset" msgstr "Отсоединить профиль" -#: src/slic3r/GUI/Tab.cpp:1287 +#: src/slic3r/GUI/Tab.cpp:1285 msgid "This is a default preset." msgstr "Это профиль по умолчанию." -#: src/slic3r/GUI/Tab.cpp:1289 +#: src/slic3r/GUI/Tab.cpp:1287 msgid "This is a system preset." msgstr "Это системный профиль." -#: src/slic3r/GUI/Tab.cpp:1291 +#: src/slic3r/GUI/Tab.cpp:1289 msgid "Current preset is inherited from the default preset." -msgstr "Текущий профиль унаследован от профиля по умолчанию." +msgstr "Текущий профиль наследуется от профиля по умолчанию." -#: src/slic3r/GUI/Tab.cpp:1295 +#: src/slic3r/GUI/Tab.cpp:1293 msgid "Current preset is inherited from" -msgstr "Текущий профиль унаследован от" +msgstr "Текущий профиль наследуется от" -#: src/slic3r/GUI/Tab.cpp:1299 +#: src/slic3r/GUI/Tab.cpp:1297 msgid "It can't be deleted or modified." -msgstr "Его нельзя будет удалить или изменить." +msgstr "Его нельзя удалить или изменить." -#: src/slic3r/GUI/Tab.cpp:1300 -msgid "" -"Any modifications should be saved as a new preset inherited from this one." +#: src/slic3r/GUI/Tab.cpp:1298 +msgid "Any modifications should be saved as a new preset inherited from this one." msgstr "" -"Любые изменения должны быть сохранены как новый профиль, унаследованный от " -"текущего." +"Любые изменения должны быть сохранены как новый профиль, унаследованный от текущего." -#: src/slic3r/GUI/Tab.cpp:1301 +#: src/slic3r/GUI/Tab.cpp:1299 msgid "To do that please specify a new name for the preset." msgstr "Для этого укажите новое имя для профиля." -#: src/slic3r/GUI/Tab.cpp:1305 +#: src/slic3r/GUI/Tab.cpp:1303 msgid "Additional information:" msgstr "Дополнительная информация:" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1309 msgid "printer model" msgstr "модель принтера" -#: src/slic3r/GUI/Tab.cpp:1319 +#: src/slic3r/GUI/Tab.cpp:1317 msgid "default print profile" msgstr "профиль печати по умолчанию" -#: src/slic3r/GUI/Tab.cpp:1322 +#: src/slic3r/GUI/Tab.cpp:1320 msgid "default filament profile" msgstr "профиль прутка по умолчанию" -#: src/slic3r/GUI/Tab.cpp:1336 +#: src/slic3r/GUI/Tab.cpp:1334 msgid "default SLA material profile" -msgstr "профиль по умолчанию материала SLA" +msgstr "профиль SLA материала по умолчанию" -#: src/slic3r/GUI/Tab.cpp:1340 +#: src/slic3r/GUI/Tab.cpp:1338 msgid "default SLA print profile" -msgstr "профиль по умолчанию для печати SLA" +msgstr "профиль SLA печати по умолчанию" -#: src/slic3r/GUI/Tab.cpp:1348 +#: src/slic3r/GUI/Tab.cpp:1346 msgid "full profile name" -msgstr "полное название профиля" +msgstr "полное имя профиля" -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1347 msgid "symbolic profile name" -msgstr "сокращённое название профиля" +msgstr "символическое имя профиля" -#: src/slic3r/GUI/Tab.cpp:1387 src/slic3r/GUI/Tab.cpp:4032 +#: src/slic3r/GUI/Tab.cpp:1385 src/slic3r/GUI/Tab.cpp:4042 msgid "Layers and perimeters" msgstr "Слои и периметры" -#: src/slic3r/GUI/Tab.cpp:1393 +#: src/slic3r/GUI/Tab.cpp:1391 msgid "Vertical shells" msgstr "Вертикальные оболочки" -#: src/slic3r/GUI/Tab.cpp:1405 +#: src/slic3r/GUI/Tab.cpp:1403 msgid "Horizontal shells" -msgstr "Горизонтальные оболочки (слои сверху и снизу)" +msgstr "Горизонтальные оболочки (слои сверху и снизу модели)" -#: src/slic3r/GUI/Tab.cpp:1406 src/libslic3r/PrintConfig.cpp:1948 +#: src/slic3r/GUI/Tab.cpp:1404 src/libslic3r/PrintConfig.cpp:1980 msgid "Solid layers" msgstr "Сплошных слоёв" -#: src/slic3r/GUI/Tab.cpp:1411 +#: src/slic3r/GUI/Tab.cpp:1409 msgid "Minimum shell thickness" msgstr "Минимальная толщина оболочки" -#: src/slic3r/GUI/Tab.cpp:1422 +#: src/slic3r/GUI/Tab.cpp:1420 msgid "Quality (slower slicing)" msgstr "Качество (замедляет нарезку)" -#: src/slic3r/GUI/Tab.cpp:1449 +#: src/slic3r/GUI/Tab.cpp:1448 msgid "Reducing printing time" msgstr "Сокращение времени печати" -#: src/slic3r/GUI/Tab.cpp:1461 +#: src/slic3r/GUI/Tab.cpp:1460 msgid "Skirt and brim" msgstr "Юбка и кайма" -#: src/slic3r/GUI/Tab.cpp:1481 +#: src/slic3r/GUI/Tab.cpp:1480 msgid "Raft" msgstr "Подложка" -#: src/slic3r/GUI/Tab.cpp:1485 +#: src/slic3r/GUI/Tab.cpp:1484 msgid "Options for support material and raft" -msgstr "Параметры поддержек и подложки" +msgstr "Опции для поддержки и подложки" -#: src/slic3r/GUI/Tab.cpp:1500 +#: src/slic3r/GUI/Tab.cpp:1499 msgid "Speed for print moves" -msgstr "Скорость передвижения при печати" +msgstr "Скорость перемещения при печати" -#: src/slic3r/GUI/Tab.cpp:1513 +#: src/slic3r/GUI/Tab.cpp:1512 msgid "Speed for non-print moves" -msgstr "Скорость передвижения без печати" +msgstr "Скорость перемещения без печати" -#: src/slic3r/GUI/Tab.cpp:1516 +#: src/slic3r/GUI/Tab.cpp:1515 msgid "Modifiers" msgstr "Модификаторы" -#: src/slic3r/GUI/Tab.cpp:1519 +#: src/slic3r/GUI/Tab.cpp:1518 msgid "Acceleration control (advanced)" msgstr "Управление ускорением (дополнительно)" -#: src/slic3r/GUI/Tab.cpp:1526 +#: src/slic3r/GUI/Tab.cpp:1525 msgid "Autospeed (advanced)" msgstr "Автоматическое управление скоростью (дополнительно)" -#: src/slic3r/GUI/Tab.cpp:1534 +#: src/slic3r/GUI/Tab.cpp:1533 msgid "Multiple Extruders" msgstr "Несколько экструдеров" -#: src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Tab.cpp:1541 msgid "Ooze prevention" -msgstr "Предотвращение утечек" +msgstr "Предотвращение течи материала" -#: src/slic3r/GUI/Tab.cpp:1560 +#: src/slic3r/GUI/Tab.cpp:1559 msgid "Extrusion width" msgstr "Ширина экструзии" -#: src/slic3r/GUI/Tab.cpp:1570 +#: src/slic3r/GUI/Tab.cpp:1569 msgid "Overlap" msgstr "Перекрытие" -#: src/slic3r/GUI/Tab.cpp:1573 +#: src/slic3r/GUI/Tab.cpp:1572 msgid "Flow" msgstr "Поток" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1581 msgid "Other" msgstr "Прочее" -#: src/slic3r/GUI/Tab.cpp:1585 src/slic3r/GUI/Tab.cpp:4108 +#: src/slic3r/GUI/Tab.cpp:1584 src/slic3r/GUI/Tab.cpp:4118 msgid "Output options" msgstr "Выходные параметры" -#: src/slic3r/GUI/Tab.cpp:1586 +#: src/slic3r/GUI/Tab.cpp:1585 msgid "Sequential printing" -msgstr "Последовательность печати" +msgstr "Последовательная печать" -#: src/slic3r/GUI/Tab.cpp:1588 -msgid "Extruder clearance (mm)" -msgstr "Радиус безопасной зоны экструдера (мм)" +#: src/slic3r/GUI/Tab.cpp:1587 +msgid "Extruder clearance" +msgstr "Радиус безопасной зоны экструдера" -#: src/slic3r/GUI/Tab.cpp:1593 src/slic3r/GUI/Tab.cpp:4109 +#: src/slic3r/GUI/Tab.cpp:1592 src/slic3r/GUI/Tab.cpp:4119 msgid "Output file" msgstr "Выходной файл" -#: src/slic3r/GUI/Tab.cpp:1600 src/libslic3r/PrintConfig.cpp:1634 +#: src/slic3r/GUI/Tab.cpp:1599 src/libslic3r/PrintConfig.cpp:1662 msgid "Post-processing scripts" msgstr "Скрипты постобработки" -#: src/slic3r/GUI/Tab.cpp:1606 src/slic3r/GUI/Tab.cpp:1607 -#: src/slic3r/GUI/Tab.cpp:1927 src/slic3r/GUI/Tab.cpp:1928 -#: src/slic3r/GUI/Tab.cpp:2261 src/slic3r/GUI/Tab.cpp:2262 -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2338 -#: src/slic3r/GUI/Tab.cpp:3975 src/slic3r/GUI/Tab.cpp:3976 +#: src/slic3r/GUI/Tab.cpp:1605 src/slic3r/GUI/Tab.cpp:1606 src/slic3r/GUI/Tab.cpp:1927 +#: src/slic3r/GUI/Tab.cpp:1928 src/slic3r/GUI/Tab.cpp:2266 src/slic3r/GUI/Tab.cpp:2267 +#: src/slic3r/GUI/Tab.cpp:2342 src/slic3r/GUI/Tab.cpp:2343 src/slic3r/GUI/Tab.cpp:3985 +#: src/slic3r/GUI/Tab.cpp:3986 msgid "Notes" msgstr "Заметки" -#: src/slic3r/GUI/Tab.cpp:1613 src/slic3r/GUI/Tab.cpp:1935 -#: src/slic3r/GUI/Tab.cpp:2268 src/slic3r/GUI/Tab.cpp:2344 -#: src/slic3r/GUI/Tab.cpp:3983 src/slic3r/GUI/Tab.cpp:4114 +#: src/slic3r/GUI/Tab.cpp:1612 src/slic3r/GUI/Tab.cpp:1935 src/slic3r/GUI/Tab.cpp:2273 +#: src/slic3r/GUI/Tab.cpp:2349 src/slic3r/GUI/Tab.cpp:3993 src/slic3r/GUI/Tab.cpp:4124 msgid "Dependencies" msgstr "Зависимости" -#: src/slic3r/GUI/Tab.cpp:1614 src/slic3r/GUI/Tab.cpp:1936 -#: src/slic3r/GUI/Tab.cpp:2269 src/slic3r/GUI/Tab.cpp:2345 -#: src/slic3r/GUI/Tab.cpp:3984 src/slic3r/GUI/Tab.cpp:4115 +#: src/slic3r/GUI/Tab.cpp:1613 src/slic3r/GUI/Tab.cpp:1936 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2350 src/slic3r/GUI/Tab.cpp:3994 src/slic3r/GUI/Tab.cpp:4125 msgid "Profile dependencies" msgstr "Зависимости профиля" -#: src/slic3r/GUI/Tab.cpp:1694 +#: src/slic3r/GUI/Tab.cpp:1693 msgid "Filament Overrides" -msgstr "Переопределения прутка" +msgstr "Переопределение парам. прутка" -#: src/slic3r/GUI/Tab.cpp:1816 +#: src/slic3r/GUI/Tab.cpp:1815 msgid "Temperature" msgstr "Температура" -#: src/slic3r/GUI/Tab.cpp:1817 +#: src/slic3r/GUI/Tab.cpp:1816 msgid "Nozzle" msgstr "Сопло" -#: src/slic3r/GUI/Tab.cpp:1822 +#: src/slic3r/GUI/Tab.cpp:1821 msgid "Bed" -msgstr "Платформа" +msgstr "Стол" -#: src/slic3r/GUI/Tab.cpp:1827 +#: src/slic3r/GUI/Tab.cpp:1826 msgid "Cooling" msgstr "Охлаждение" -#: src/slic3r/GUI/Tab.cpp:1829 src/libslic3r/PrintConfig.cpp:1537 -#: src/libslic3r/PrintConfig.cpp:2396 +#: src/slic3r/GUI/Tab.cpp:1828 src/libslic3r/PrintConfig.cpp:1565 +#: src/libslic3r/PrintConfig.cpp:2428 msgid "Enable" -msgstr "Включить" +msgstr "Вкл." -#: src/slic3r/GUI/Tab.cpp:1840 +#: src/slic3r/GUI/Tab.cpp:1839 msgid "Fan settings" msgstr "Настройки вентилятора" @@ -6844,7 +7060,7 @@ msgstr "Пороги включения обдува" #: src/slic3r/GUI/Tab.cpp:1856 msgid "Filament properties" -msgstr "Свойства прутка" +msgstr "Настройки прутка" #: src/slic3r/GUI/Tab.cpp:1863 msgid "Print speed override" @@ -6852,53 +7068,60 @@ msgstr "Ограничение скорости печати" #: src/slic3r/GUI/Tab.cpp:1873 msgid "Wipe tower parameters" -msgstr "Параметры башни очистки" +msgstr "Параметры черновой башни" #: src/slic3r/GUI/Tab.cpp:1876 msgid "Toolchange parameters with single extruder MM printers" -msgstr "Параметры смены сопла в одноэкструдерных мультиматериальных принтерах" +msgstr "Параметры смены инструмента в одноэкструдерных мультиматериальных принтерах" #: src/slic3r/GUI/Tab.cpp:1889 msgid "Ramming settings" msgstr "Настройки рэмминга" -#: src/slic3r/GUI/Tab.cpp:1912 src/slic3r/GUI/Tab.cpp:2200 -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:1912 src/slic3r/GUI/Tab.cpp:2205 +#: src/libslic3r/PrintConfig.cpp:2063 msgid "Custom G-code" msgstr "Пользовательский G-код" -#: src/slic3r/GUI/Tab.cpp:1913 src/slic3r/GUI/Tab.cpp:2201 -#: src/libslic3r/PrintConfig.cpp:1981 src/libslic3r/PrintConfig.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1913 src/slic3r/GUI/Tab.cpp:2206 +#: src/libslic3r/PrintConfig.cpp:2013 src/libslic3r/PrintConfig.cpp:2028 msgid "Start G-code" msgstr "Стартовый G-код" -#: src/slic3r/GUI/Tab.cpp:1920 src/slic3r/GUI/Tab.cpp:2208 -#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:436 +#: src/slic3r/GUI/Tab.cpp:1920 src/slic3r/GUI/Tab.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:441 src/libslic3r/PrintConfig.cpp:451 msgid "End G-code" msgstr "Завершающий G-код" #: src/slic3r/GUI/Tab.cpp:1970 msgid "Volumetric flow hints not available" -msgstr "Подсказки по объемному расходу недоступны" +msgstr "Подсказки об объёмном расходе недоступны." #: src/slic3r/GUI/Tab.cpp:2066 msgid "" -"Note: All parameters from this group are moved to the Physical Printer " -"settings (see changelog).\n" +"Note: All parameters from this group are moved to the Physical Printer settings " +"(see changelog).\n" "\n" -"A new Physical Printer profile is created by clicking on the \"cog\" icon " -"right of the Printer profiles combo box, by selecting the \"Add physical " -"printer\" item in the Printer combo box. The Physical Printer profile editor " -"opens also when clicking on the \"cog\" icon in the Printer settings tab. " -"The Physical Printer profiles are being stored into PrusaSlicer/" -"physical_printer directory." -msgstr "" +"A new Physical Printer profile is created by clicking on the \"cog\" icon right of " +"the Printer profiles combo box, by selecting the \"Add physical printer\" item in " +"the Printer combo box. The Physical Printer profile editor opens also when clicking " +"on the \"cog\" icon in the Printer settings tab. The Physical Printer profiles are " +"being stored into PrusaSlicer/physical_printer directory." +msgstr "" +"Примечание: все параметры из этой группы перенесены в настройки физического " +"принтера (см. список изменений).\n" +"\n" +"Новый профиль физического принтера создаётся нажатием по значку \"шестеренка\" " +"справа от поля со списком профилей принтеров, выбрав \"Добавить физический принтер" +"\". Редактор профиля физического принтера открывается также при нажатии на значок " +"\"шестеренка\" на вкладке настройки принтера. Профили физического принтера " +"сохраняются в папке PrusaSlicer/physical_printer." -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2281 +#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2286 msgid "Size and coordinates" msgstr "Размер и координаты" -#: src/slic3r/GUI/Tab.cpp:2108 src/slic3r/GUI/UnsavedChangesDialog.cpp:1072 +#: src/slic3r/GUI/Tab.cpp:2108 src/slic3r/GUI/UnsavedChangesDialog.cpp:1080 msgid "Capabilities" msgstr "Характеристики принтера" @@ -6910,135 +7133,141 @@ msgstr "Количество экструдеров у принтера." 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?" +"Do you want to change the diameter for all extruders to first extruder nozzle " +"diameter value?" msgstr "" +"Выбран мультиматериальный одиночный экструдер, \n" +"поэтому все экструдеры должны иметь одинаковый диаметр.\n" +"Изменить диаметр всех экструдеров на значение диаметра сопла первого экструдера?" -#: src/slic3r/GUI/Tab.cpp:2144 src/slic3r/GUI/Tab.cpp:2547 -#: src/libslic3r/PrintConfig.cpp:1506 +#: src/slic3r/GUI/Tab.cpp:2144 src/slic3r/GUI/Tab.cpp:2552 +#: src/libslic3r/PrintConfig.cpp:1534 msgid "Nozzle diameter" msgstr "Диаметр сопла" -#: src/slic3r/GUI/Tab.cpp:2215 src/libslic3r/PrintConfig.cpp:194 +#: src/slic3r/GUI/Tab.cpp:2220 src/libslic3r/PrintConfig.cpp:209 msgid "Before layer change G-code" msgstr "G-код, выполняемый перед сменой слоя" -#: src/slic3r/GUI/Tab.cpp:2222 src/libslic3r/PrintConfig.cpp:1245 +#: src/slic3r/GUI/Tab.cpp:2227 src/libslic3r/PrintConfig.cpp:1273 msgid "After layer change G-code" -msgstr "G-код, выполняемый после смены слоя" +msgstr "G-код выполняемый после смены слоя" -#: src/slic3r/GUI/Tab.cpp:2229 src/libslic3r/PrintConfig.cpp:2289 +#: src/slic3r/GUI/Tab.cpp:2234 src/libslic3r/PrintConfig.cpp:2321 msgid "Tool change G-code" -msgstr "G-код, выполняемый для смены инструмента" +msgstr "G-код выполняемый при смене инструмента" -#: src/slic3r/GUI/Tab.cpp:2236 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "Between objects G-code (for sequential printing)" -msgstr "G-код, выполняемый между объектами (для последовательной печати)" +msgstr "G-код выполняемый между моделями (для последовательной печати)" -#: src/slic3r/GUI/Tab.cpp:2243 +#: src/slic3r/GUI/Tab.cpp:2248 msgid "Color Change G-code" -msgstr "G-код, выполняемый для смены цвета" +msgstr "G-код смены цвета" -#: src/slic3r/GUI/Tab.cpp:2249 src/libslic3r/PrintConfig.cpp:2022 +#: src/slic3r/GUI/Tab.cpp:2254 src/libslic3r/PrintConfig.cpp:2054 msgid "Pause Print G-code" -msgstr "G-код, выполняемый для паузы печати" +msgstr "G-код паузы печати" -#: src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/Tab.cpp:2260 msgid "Template Custom G-code" -msgstr "Шаблон пользовательского G-кода" +msgstr "Пользовательский шаблон G-кода" -#: src/slic3r/GUI/Tab.cpp:2288 +#: src/slic3r/GUI/Tab.cpp:2293 msgid "Display" -msgstr "" +msgstr "Дисплей" -#: src/slic3r/GUI/Tab.cpp:2303 +#: src/slic3r/GUI/Tab.cpp:2308 msgid "Tilt" -msgstr "" +msgstr "Наклон ванночки" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2309 msgid "Tilt time" -msgstr "" +msgstr "Время наклона ванночки" -#: src/slic3r/GUI/Tab.cpp:2310 src/slic3r/GUI/Tab.cpp:3959 +#: src/slic3r/GUI/Tab.cpp:2315 src/slic3r/GUI/Tab.cpp:3969 msgid "Corrections" -msgstr "Исправления" +msgstr "Корректировка" -#: src/slic3r/GUI/Tab.cpp:2327 src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:2332 src/slic3r/GUI/Tab.cpp:3965 msgid "Exposure" -msgstr "" +msgstr "Экспозиция" -#: src/slic3r/GUI/Tab.cpp:2386 src/slic3r/GUI/Tab.cpp:2480 -#: src/libslic3r/PrintConfig.cpp:1274 src/libslic3r/PrintConfig.cpp:1309 -#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:1343 -#: src/libslic3r/PrintConfig.cpp:1359 src/libslic3r/PrintConfig.cpp:1369 -#: src/libslic3r/PrintConfig.cpp:1379 src/libslic3r/PrintConfig.cpp:1389 +#: src/slic3r/GUI/Tab.cpp:2391 src/slic3r/GUI/Tab.cpp:2485 +#: src/libslic3r/PrintConfig.cpp:1302 src/libslic3r/PrintConfig.cpp:1337 +#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1387 src/libslic3r/PrintConfig.cpp:1397 +#: src/libslic3r/PrintConfig.cpp:1407 src/libslic3r/PrintConfig.cpp:1417 msgid "Machine limits" msgstr "Ограничения принтера" -#: src/slic3r/GUI/Tab.cpp:2409 +#: src/slic3r/GUI/Tab.cpp:2414 msgid "Values in this column are for Normal mode" -msgstr "Значения в этом столбце относятся к нормальному режиму" +msgstr "Значения в этой колонке для нормального режима" -#: src/slic3r/GUI/Tab.cpp:2415 +#: src/slic3r/GUI/Tab.cpp:2420 msgid "Values in this column are for Stealth mode" -msgstr "Значения в этом столбце относятся к тихому режиму" +msgstr "Значения в этой колонке для тихого режима" -#: src/slic3r/GUI/Tab.cpp:2424 +#: src/slic3r/GUI/Tab.cpp:2429 msgid "Maximum feedrates" -msgstr "Максимальные скорости подачи" +msgstr "Максимальная скорость (#define DEFAULT_MAX_FEEDRATE {X, Y, Z, E})" -#: src/slic3r/GUI/Tab.cpp:2429 +#: src/slic3r/GUI/Tab.cpp:2434 msgid "Maximum accelerations" -msgstr "Максимальные ускорения" +msgstr "" +"Максимальное ускорение (#define DEFAULT_MAX_ACCELERATION {X,Y,Z,E}, #define " +"DEFAULT_RETRACT_ACCELERATION, )" -#: src/slic3r/GUI/Tab.cpp:2436 +#: src/slic3r/GUI/Tab.cpp:2441 msgid "Jerk limits" -msgstr "Ограничение рывка" +msgstr "Ограничение рывка (#define DEFAULT_{X,Y,Z,E}JERK)" -#: src/slic3r/GUI/Tab.cpp:2441 +#: src/slic3r/GUI/Tab.cpp:2446 msgid "Minimum feedrates" -msgstr "Минимальные скорости подачи" +msgstr "" +"Минимальная скорость (#define DEFAULT_MINIMUMFEEDRATE и #define " +"DEFAULT_MINTRAVELFEEDRATE)" -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2513 +#: src/slic3r/GUI/Tab.cpp:2510 src/slic3r/GUI/Tab.cpp:2518 msgid "Single extruder MM setup" msgstr "Экструдер в ММ принтере" -#: src/slic3r/GUI/Tab.cpp:2514 +#: src/slic3r/GUI/Tab.cpp:2519 msgid "Single extruder multimaterial parameters" -msgstr "" -"Параметры экструдера в одноэкструдерном мультиматериальном (ММ) принтере" +msgstr "Параметры экструдера в одноэкструдерном мультиматериальном (ММ) принтере" -#: src/slic3r/GUI/Tab.cpp:2545 +#: src/slic3r/GUI/Tab.cpp:2550 msgid "" -"This is a single extruder multimaterial printer, diameters of all extruders " -"will be set to the new value. Do you want to proceed?" +"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:2569 +#: src/slic3r/GUI/Tab.cpp:2574 msgid "Layer height limits" msgstr "Ограничение высоты слоя" -#: src/slic3r/GUI/Tab.cpp:2574 +#: src/slic3r/GUI/Tab.cpp:2579 msgid "Position (for multi-extruder printers)" msgstr "Позиция экструдера (для многоэкструдерных принтеров)" -#: src/slic3r/GUI/Tab.cpp:2580 +#: src/slic3r/GUI/Tab.cpp:2585 msgid "Only lift Z" -msgstr "Только подъём Z" +msgstr "Приподнимать сопло только" -#: src/slic3r/GUI/Tab.cpp:2593 -msgid "" -"Retraction when tool is disabled (advanced settings for multi-extruder " -"setups)" +#: src/slic3r/GUI/Tab.cpp:2598 +msgid "Retraction when tool is disabled (advanced settings for multi-extruder setups)" msgstr "" -"Ретракт, при отключении сопла (дополнительные настройки для " -"многоэкструдерных принтеров)" +"Ретракт, при отключении сопла (дополнительные настройки для многоэкструдерных " +"принтеров)" -#: src/slic3r/GUI/Tab.cpp:2600 +#: src/slic3r/GUI/Tab.cpp:2605 msgid "Reset to Filament Color" -msgstr "Сбросить в цвет прутка" +msgstr "Сброс в цвет прутка" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2783 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -7048,392 +7277,407 @@ msgstr "" "\n" "Отключить его для включения ретракта из прошивки?" -#: src/slic3r/GUI/Tab.cpp:2780 +#: src/slic3r/GUI/Tab.cpp:2785 msgid "Firmware Retraction" msgstr "Ретракт из прошивки" -#: src/slic3r/GUI/Tab.cpp:3366 +#: src/slic3r/GUI/Tab.cpp:3376 msgid "Detached" msgstr "Отсоединён" -#: src/slic3r/GUI/Tab.cpp:3429 +#: src/slic3r/GUI/Tab.cpp:3439 msgid "remove" msgstr "убрать" -#: src/slic3r/GUI/Tab.cpp:3429 +#: src/slic3r/GUI/Tab.cpp:3439 msgid "delete" msgstr "удалить" -#: src/slic3r/GUI/Tab.cpp:3438 +#: src/slic3r/GUI/Tab.cpp:3448 msgid "It's a last preset for this physical printer." -msgstr "" +msgstr "Это последний профиль для этого физического принтера." -#: src/slic3r/GUI/Tab.cpp:3443 +#: src/slic3r/GUI/Tab.cpp:3453 msgid "" -"Are you sure you want to delete \"%1%\" preset from the physical printer " -"\"%2%\"?" +"Are you sure you want to delete \"%1%\" preset from the physical printer \"%2%\"?" msgstr "" +"Вы действительно хотите удалить профиль \"%1%\" из физического принтера \"%2%\"?" -#: src/slic3r/GUI/Tab.cpp:3455 -msgid "" -"The physical printer(s) below is based on the preset, you are going to " -"delete." +#: src/slic3r/GUI/Tab.cpp:3465 +msgid "The physical printer(s) below is based on the preset, you are going to delete." msgstr "" +"Физические принтеры, указанные ниже, основаны на профиле, которые вы собираетесь " +"удалить." -#: src/slic3r/GUI/Tab.cpp:3459 -msgid "" -"Note, that selected preset will be deleted from this/those printer(s) too." -msgstr "" +#: src/slic3r/GUI/Tab.cpp:3469 +msgid "Note, that selected preset will be deleted from this/those printer(s) too." +msgstr "Обратите внимание, выбранный профиль будет удалён из этого принтера тоже." -#: src/slic3r/GUI/Tab.cpp:3463 +#: src/slic3r/GUI/Tab.cpp:3473 msgid "" -"The physical printer(s) below is based only on the preset, you are going to " -"delete." +"The physical printer(s) below is based only on the preset, you are going to delete." msgstr "" +"Физические принтеры, указанные ниже, основаны только на профиле, которые вы " +"собираетесь удалить." -#: src/slic3r/GUI/Tab.cpp:3467 +#: src/slic3r/GUI/Tab.cpp:3477 msgid "" -"Note, that this/those printer(s) will be deleted after deleting of the " -"selected preset." +"Note, that this/those printer(s) will be deleted after deleting of the selected " +"preset." msgstr "" +"Обратите внимание, этот принтер(-ы) будет удалён после удаления выбранного профиля." -#: src/slic3r/GUI/Tab.cpp:3471 +#: src/slic3r/GUI/Tab.cpp:3481 msgid "Are you sure you want to %1% the selected preset?" -msgstr "Удалить выбранный профиль %1%?" +msgstr "Вы уверены, что хотите %1% выбранный профиль?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3476 +#: src/slic3r/GUI/Tab.cpp:3486 msgid "%1% Preset" msgstr "Профиль %1%" -#: src/slic3r/GUI/Tab.cpp:3557 src/slic3r/GUI/Tab.cpp:3629 +#: src/slic3r/GUI/Tab.cpp:3567 src/slic3r/GUI/Tab.cpp:3639 msgid "Set" msgstr "Выбор" -#: src/slic3r/GUI/Tab.cpp:3693 -msgid "" -"Machine limits will be emitted to G-code and used to estimate print time." +#: src/slic3r/GUI/Tab.cpp:3703 +msgid "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" +"Ограничения принтера будут передаваться в G-код и использоваться для оценки времени " +"печати." -#: src/slic3r/GUI/Tab.cpp:3696 +#: src/slic3r/GUI/Tab.cpp:3706 msgid "" -"Machine limits will NOT be emitted to G-code, however they will be used to " -"estimate print time, which may therefore not be accurate as the printer may " -"apply a different set of machine limits." +"Machine limits will NOT be emitted to G-code, however they will be used to estimate " +"print time, which may therefore not be accurate as the printer may apply a " +"different set of machine limits." msgstr "" +"Ограничения принтера не будут передаваться в G-код, тем не менее они будут " +"используются для оценки времени печати, которое может быть неточным, поскольку " +"принтер может применять другой набор ограничений для принтера." -#: src/slic3r/GUI/Tab.cpp:3700 +#: src/slic3r/GUI/Tab.cpp:3710 msgid "" -"Machine limits are not set, therefore the print time estimate may not be " -"accurate." +"Machine limits are not set, therefore the print time estimate may not be accurate." msgstr "" +"Ограничения принтера не заданы, поэтому оценка времени печати может быть неточной." -#: src/slic3r/GUI/Tab.cpp:3722 +#: src/slic3r/GUI/Tab.cpp:3732 msgid "LOCKED LOCK" -msgstr "ЗАКРЫТЫЙ ЗАМОК" +msgstr "ЗАКРЫТЫЙ ЗАМОЧЕК" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:3734 msgid "" -"indicates that the settings are the same as the system (or default) values " -"for the current option group" +"indicates that the settings are the same as the system (or default) values for the " +"current option group" msgstr "" -"указывает, что настройки совпадают с системными (умолчательным) значениями " -"текущей группы параметров" +"указывает, что настройки совпадают с системными значениями (или значениями по " +"умолчанию) для текущей группы." -#: src/slic3r/GUI/Tab.cpp:3726 +#: src/slic3r/GUI/Tab.cpp:3736 msgid "UNLOCKED LOCK" -msgstr "ОТКРЫТЫЙ ЗАМОК" +msgstr "ОТКРЫТЫЙ ЗАМОЧЕК" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3738 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." +"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 "" -"указывает, что некоторые настройки были изменены и не равны системным " -"(умолчательным) значениям текущей группы параметров.\n" -"Нажмите на ОТКРЫТЫЙ ЗАМОК, чтобы сбросить все настройки текущей группы " -"параметров в системные значения." +"указывает, что некоторые настройки были изменены и не равны системным значениям " +"(или значениям по умолчанию) для текущей группы.\n" +"Нажмите, чтобы сбросить все настройки текущей группы до системных значений (или " +"значений по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3743 msgid "WHITE BULLET" msgstr "БЕЛЫЙ МАРКЕР" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3735 +#: src/slic3r/GUI/Tab.cpp:3745 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" -"а правый, что параметры не были изменены." +"слева: указывает на не системный профиль (или профиль не по умолчанию),\n" +"справа: указывает, что параметры не были изменены." -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "BACK ARROW" -msgstr "СТРЕЛКА РАЗВОРОТА" +msgstr "ЗНАЧОК СО СТРЕЛКОЙ" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3740 +#: src/slic3r/GUI/Tab.cpp:3750 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." +"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 "" -"указывает, что настройки были изменены и не совпадают с настройками в " -"последнем сохранённом профиле для текущей группы параметров.\n" -"Нажмите на значок СТРЕЛКИ РАЗВОРОТА, чтобы сбросить все настройки для " -"текущей группы в последние сохранённые значения профиля." +"указывает, что настройки были изменены и не совпадают с настройками в последнем " +"сохранённом профиле\n" +"для текущей группы. Нажмите на значок со стрелкой, чтобы сбросить все настройки для " +"текущей группы до последнего\n" +"сохранённого значения профиля." -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3760 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:3752 +#: src/slic3r/GUI/Tab.cpp:3762 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." +"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 "" -"Открытый замочек указывает, что некоторые настройки были изменены и не равны " +"ОТКРЫТЫЙ ЗАМОЧЕК указывает, что некоторые настройки были изменены и не равны " "системным значениям (или значениям по умолчанию) для текущей группы.\n" -"Нажмите, чтобы сбросить все настройки текущей группы до системных значений." +"Нажмите, чтобы сбросить все настройки текущей группы до системных значений (или " +"значений по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:3755 +#: src/slic3r/GUI/Tab.cpp:3765 msgid "WHITE BULLET icon indicates a non system (or non default) preset." -msgstr "" -"Белый маркер указывает на несистемный профиль (либо профиль не по умолчанию)." +msgstr "БЕЛЫЙ МАРКЕР указывает на не системный профиль (или профиль не по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:3758 +#: src/slic3r/GUI/Tab.cpp:3768 msgid "" -"WHITE BULLET icon indicates that the settings are the same as in the last " -"saved preset for the current option group." +"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:3760 +#: src/slic3r/GUI/Tab.cpp:3770 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." +"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 "" -"Значок со стрелкой указывает, что настройки были изменены и не совпадают с " +"ЗНАЧОК СО СТРЕЛКОЙ указывает, что настройки были изменены и не совпадают с " "настройками в последнем сохранённом профиле для текущей группы.\n" -"Нажмите, чтобы сбросить все настройки для текущей группы до последнего " -"сохранённого значения профиля." +"Нажмите, чтобы сбросить все настройки для текущей группы до последнего сохранённого " +"значения профиля." -#: src/slic3r/GUI/Tab.cpp:3766 +#: src/slic3r/GUI/Tab.cpp:3776 msgid "" -"LOCKED LOCK icon indicates that the value is the same as the system (or " -"default) value." +"LOCKED LOCK icon indicates that the value is the same as the system (or default) " +"value." msgstr "" -"Закрытый замочек указывает, что значение совпадает с системным значением " -"(либо значием по умолчанию)." +"ЗАКРЫТЫЙ ЗАМОЧЕК указывает, что значение совпадает с системным значением (или " +"значение по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:3767 +#: src/slic3r/GUI/Tab.cpp:3777 msgid "" -"UNLOCKED LOCK icon indicates that the value was changed and is not equal to " -"the system (or default) value.\n" +"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 "" -"Открытый замочек указывает, что значение было изменено и не равно системному " -"значению(или значениям по умолчанию).\n" -"Нажмите, чтобы сбросить текущее значение к системному значению." +"ОТКРЫТЫЙ ЗАМОЧЕК указывает, что значение было изменено и не равно системному " +"значению (или значению по умолчанию).\n" +"Нажмите, чтобы сбросить текущее значение к системному значению (или значению по " +"умолчанию)." -#: src/slic3r/GUI/Tab.cpp:3773 +#: src/slic3r/GUI/Tab.cpp:3783 msgid "" -"WHITE BULLET icon indicates that the value is the same as in the last saved " -"preset." +"WHITE BULLET icon indicates that the value is the same as in the last saved preset." msgstr "" -"Белый маркер указывает, что значение совпадает со значением в последнем " -"сохранённом профиле." +"БЕЛЫЙ МАРКЕР указывает, что значение совпадает со значением в последнем сохранённом " +"профиле." -#: src/slic3r/GUI/Tab.cpp:3774 +#: src/slic3r/GUI/Tab.cpp:3784 msgid "" -"BACK ARROW icon indicates that the value was changed and is not equal to the " -"last saved preset.\n" +"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 "" -"Значок со стрелкой указывает, что значение было изменено и не совпадает со " +"ЗНАЧОК СО СТРЕЛКОЙ указывает, что значение было изменено и не совпадает со " "значением в последнем сохранённом профиле для текущей группы.\n" "Нажмите, чтобы сбросить значение до последнего сохранённого значения профиля." -#: src/slic3r/GUI/Tab.cpp:3918 src/slic3r/GUI/Tab.cpp:3920 +#: src/slic3r/GUI/Tab.cpp:3928 src/slic3r/GUI/Tab.cpp:3930 msgid "Material" msgstr "Материал" -#: src/slic3r/GUI/Tab.cpp:4042 +#: src/slic3r/GUI/Tab.cpp:4052 msgid "Support head" -msgstr "" +msgstr "Носик поддержки" -#: src/slic3r/GUI/Tab.cpp:4047 +#: src/slic3r/GUI/Tab.cpp:4057 msgid "Support pillar" -msgstr "Опорная стойка" +msgstr "Тело поддержки" -#: src/slic3r/GUI/Tab.cpp:4070 +#: src/slic3r/GUI/Tab.cpp:4080 msgid "Connection of the support sticks and junctions" -msgstr "" +msgstr "Соединения опор поддержки со связующим узлом" -#: src/slic3r/GUI/Tab.cpp:4075 +#: src/slic3r/GUI/Tab.cpp:4085 msgid "Automatic generation" msgstr "Автоматическая генерация" -#: src/slic3r/GUI/Tab.cpp:4149 +#: src/slic3r/GUI/Tab.cpp:4159 msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" "To enable \"%1%\", please switch off \"%2%\"" msgstr "" +"\"%1%\" отключена, так как \"%2%\" находится в категории \"%3%\".\n" +"Чтобы включить \"%1%\", отключите \"%2%\"" -#: src/slic3r/GUI/Tab.cpp:4151 src/libslic3r/PrintConfig.cpp:2970 +#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3002 msgid "Object elevation" -msgstr "" +msgstr "Высота подъёма модели" -#: src/slic3r/GUI/Tab.cpp:4151 src/libslic3r/PrintConfig.cpp:3072 +#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3104 msgid "Pad around object" -msgstr "" +msgstr "Подложка вокруг модели" -#: src/slic3r/GUI/Tab.hpp:374 src/slic3r/GUI/Tab.hpp:496 +#: src/slic3r/GUI/Tab.hpp:370 src/slic3r/GUI/Tab.hpp:492 msgid "Print Settings" msgstr "Настройки печати" -#: src/slic3r/GUI/Tab.hpp:405 +#: src/slic3r/GUI/Tab.hpp:401 msgid "Filament Settings" msgstr "Настройки прутка" -#: src/slic3r/GUI/Tab.hpp:446 +#: src/slic3r/GUI/Tab.hpp:442 msgid "Printer Settings" msgstr "Настройки принтера" -#: src/slic3r/GUI/Tab.hpp:480 +#: src/slic3r/GUI/Tab.hpp:476 msgid "Material Settings" -msgstr "Настройки материала" +msgstr "Настройка материала" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:143 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:152 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:851 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:149 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:158 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:857 msgid "Undef" -msgstr "" +msgstr "Не задано" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:531 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:537 msgid "PrusaSlicer is closing: Unsaved Changes" -msgstr "" +msgstr "Закрытие PrusaSlicer: несохраненные изменения" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:548 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:554 msgid "Switching Presets: Unsaved Changes" -msgstr "" +msgstr "Смена профилей: несохраненные изменения" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:614 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:620 msgid "Old Value" msgstr "Старое значение" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:615 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:621 msgid "New Value" msgstr "Новое значение" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:646 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:652 msgid "Transfer" msgstr "Перенести" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:647 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:653 msgid "Discard" -msgstr "Сбросить" +msgstr "Не сохранять" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:648 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:654 msgid "Save" msgstr "Сохранить" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:668 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:674 msgid "PrusaSlicer will remember your action." -msgstr "" +msgstr "PrusaSlicer запомнит ваш выбор." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:676 msgid "" -"You will not be asked about the unsaved changes the next time you close " -"PrusaSlicer." +"You will not be asked about the unsaved changes the next time you close PrusaSlicer." msgstr "" +"Запрос о несохраненных изменениях не будет появляться при закрытии PrusaSlicer." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:671 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:677 msgid "" -"You will not be asked about the unsaved changes the next time you switch a " -"preset." +"You will not be asked about the unsaved changes the next time you switch a preset." msgstr "" +"Запрос о несохраненных изменениях не будет появляться при следующем переключении " +"профиля." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:672 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:678 msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to be asked about unsaved changes again." msgstr "" +"Зайдите в \"Настройки приложения\" и установите флажок \"%1%\",\n" +"чтобы вернуть запрос о несохраненных изменениях." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:680 msgid "PrusaSlicer: Don't ask me again" -msgstr "" +msgstr "PrusaSlicer: Не спрашивать снова" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:741 -msgid "" -"Some fields are too long to fit. Right mouse click reveals the full text." +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:747 +msgid "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" +"Некоторые поля слишком длинные. Щёлкните правой кнопкой мыши, чтобы показать полный " +"текст." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:743 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:749 msgid "All settings changes will be discarded." -msgstr "" +msgstr "Все изменённые параметры будут потеряны." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:746 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752 msgid "Save the selected options." -msgstr "" +msgstr "Сохранить выбранные параметры." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:746 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752 msgid "Transfer the selected settings to the newly selected preset." -msgstr "" +msgstr "Перенести выбранные параметры во вновь выбранный профиль." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:750 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:756 msgid "Save the selected options to preset \"%1%\"." -msgstr "" +msgstr "Сохранить выбранные параметры в профиле \"%1%\"." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:751 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:757 msgid "Transfer the selected options to the newly selected preset \"%1%\"." -msgstr "" +msgstr "Перенести выбранные параметры во вновь выбранный профиль \"%1%\"." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1010 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1019 msgid "The following presets were modified:" -msgstr "" +msgstr "Следующие профили были изменены:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1015 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1024 msgid "Preset \"%1%\" has the following unsaved changes:" -msgstr "" +msgstr "Профиль \"%1%\" имеет следующие несохранённые изменения:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1019 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1028 msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " "following unsaved changes:" msgstr "" +"Профиль \"%1%\" несовместим с новым профилем принтера, и в нём есть следующие " +"несохраненные изменения:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1020 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1029 msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " "following unsaved changes:" msgstr "" +"Профиль \"%1%\" несовместим с новым профилем печати, и имеет следующие " +"несохраненные изменения:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1075 msgid "Extruders count" -msgstr "" +msgstr "Количество экструдеров" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1183 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Old value" -msgstr "" +msgstr "Старое значение" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1184 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1198 msgid "New value" -msgstr "" +msgstr "Новое значение" #: src/slic3r/GUI/UpdateDialogs.cpp:38 msgid "Update available" @@ -7454,20 +7698,20 @@ msgstr "Новая версия:" #: src/slic3r/GUI/UpdateDialogs.cpp:53 msgid "Changelog && Download" -msgstr "Журнал изменение && Скачивание" +msgstr "История изменений && Скачать" #: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 #: src/slic3r/GUI/UpdateDialogs.cpp:183 msgid "Open changelog page" -msgstr "Открыть страницу изменений" +msgstr "Открыть страницу истории изменений" #: src/slic3r/GUI/UpdateDialogs.cpp:65 msgid "Open download page" -msgstr "Открыть страницу закачки" +msgstr "Открыть страницу загрузки" #: src/slic3r/GUI/UpdateDialogs.cpp:71 msgid "Don't notify about new releases any more" -msgstr "Больше не уведомлять о новых выпусках" +msgstr "Больше не уведомлять о новых релизах" #: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 msgid "Configuration update" @@ -7481,15 +7725,15 @@ msgstr "Доступно обновление конфигурации" 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" +"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 "" "Вы хотите установить его?\n" "\n" -"Обратите внимание, что сначала будет создан снапшот. Он может быть " -"восстановлен в любое время, если возникнет проблема с новой версией.\n" +"Обратите внимание, что сначала будет создан снапшот. Он может быть восстановлен в " +"любое время, если возникнет проблема с новой версией.\n" "\n" "Обновлённые пакеты конфигурации:" @@ -7500,64 +7744,62 @@ msgstr "Комментарий:" #: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210 #, c-format msgid "%s incompatibility" -msgstr "Несовместимость %s" +msgstr "Несовместимость с %s" #: src/slic3r/GUI/UpdateDialogs.cpp:148 msgid "You must install a configuration update." -msgstr "Вы должны установить обновление настроек." +msgstr "Необходимо установить обновление конфигурации." #: 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" +"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 начнет обновления. В противном случае он не запустится.\n" +"Теперь %s запустит обновление. Иначе он не сможет начать работу.\n" "\n" -"Обратите внимание, что сначала будет создан снапшот полной конфигурации. Он " -"может быть восстановлен в любое время, если возникнет проблема с новой " -"версией.\n" +"Обратите внимание, что сначала будет создан снапшот. Он может быть восстановлен в " +"любое время, если возникнет проблема с новой версией.\n" "\n" "Обновлённые пакеты конфигурации:" #: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 #, c-format msgid "Exit %s" -msgstr "Выход из %s" +msgstr "Выйти из %s" #: src/slic3r/GUI/UpdateDialogs.cpp:211 #, c-format msgid "%s configuration is incompatible" -msgstr "Настройки %s несовместимы" +msgstr "Несовместимая конфигурация %s" #: 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" +"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." +"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 "" -"Эта версия %s не совместима с установленными пакетами настроек.\n" +"Эта версия %s не совместима с установленными пакетами конфигурации.\n" "Вероятно, это произошло в результате запуска более старой версии %s после " "использования более новой.\n" "\n" -"Вы можете выйти из %s и повторить попытку с новой версией, либо повторно " -"запустить начальную настройку. Это создаст резервную копию существующих " -"настроек перед установкой файлов, совместимых с этой версией %s." +"Вы можете выйти из %s и повторить попытку с новой версией, либо повторно запустить " +"начальную конфигурацию. Это создаст резервную копию существующей конфигурации перед " +"установкой файлов, совместимых с этой версией %s." #: src/slic3r/GUI/UpdateDialogs.cpp:225 #, c-format msgid "This %s version: %s" -msgstr "%s, версия %s" +msgstr "Версия %s: %s" #: src/slic3r/GUI/UpdateDialogs.cpp:230 msgid "Incompatible bundles:" @@ -7572,22 +7814,22 @@ msgstr "Перенастроить" 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" +"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." +"Please proceed with the %s that follows to set up the new presets and to choose " +"whether to enable automatic preset updates." msgstr "" -"В %s изменилась структура настроек.\n" +"Теперь %s использует обновлённую структуру конфигурации.\n" "\n" "Были введены так называемые 'системные профили', которые содержат встроенные " -"настройки по умолчанию для разных принтеров. Эти системные профили не могут " -"быть изменены. Вместо этого пользователи теперь могут создавать собственные " -"профили, наследующие настройки от одного из системных профилей.\n" +"настройки по умолчанию для разных принтеров. Эти системные профили не могут быть " +"изменены. Вместо этого пользователи теперь могут создавать собственные профили, " +"наследующие настройки от одного из системных профилей.\n" "Наследующий профиль может либо наследовать определённое значение от своего " "родителя, либо переопределить его с помощью настроенного значения.\n" "\n" @@ -7596,21 +7838,20 @@ msgstr "" #: src/slic3r/GUI/UpdateDialogs.cpp:287 msgid "For more information please visit our wiki page:" -msgstr "" -"Для получения дополнительной информации, посетите нашу страницу в Википедии:" +msgstr "Для получения дополнительной информации, посетите нашу вики-страницу:" #: src/slic3r/GUI/UpdateDialogs.cpp:304 msgid "Configuration updates" -msgstr "Обновления конфигурации" +msgstr "Обновление конфигурации" #: src/slic3r/GUI/UpdateDialogs.cpp:304 msgid "No updates available" -msgstr "Нет доступных обновлений" +msgstr "Обновления отсутствуют" #: src/slic3r/GUI/UpdateDialogs.cpp:309 #, c-format msgid "%s has no configuration updates available." -msgstr "%s не имеет доступных обновлений конфигурации." +msgstr "Обновления конфигурации для %s отсутствуют." #: src/slic3r/GUI/WipeTowerDialog.cpp:15 msgid "Ramming customization" @@ -7618,26 +7859,26 @@ msgstr "Настройки рэмминга" #: 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" +"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." +"This is an expert-level setting, incorrect adjustment will likely lead to jams, " +"extruder wheel grinding into filament etc." msgstr "" "Рэмминг (ramming) означает быстрое экструдирование непосредственно перед " -"сменой сопла в одноэкструдерном мультиматериальном принтере. Его цель " -"состоит в том, чтобы правильно сформировать конец не загруженного прутка, " -"чтобы он не препятствовал вставке нового прутка или позднее повторно " -"вставляемого этого же. Эта фаза важна, и разные материалы могут потребовать " -"разных скоростей экструзии, чтобы получить хорошую форму. По этой причине " -"скорость экструзии во время рэмминга регулируется.\n" +"сменой инструмента в одноэкструдерном мультиматериальном принтере. Его цель состоит в том, " +"чтобы правильно сформировать конец незагруженного прутка, чтобы он не препятствовал " +"вставке нового прутка или этого же прутка, вставленного позже. Эта фаза важна " +"и разные материалы могут потребовать разных скоростей экструзии, чтобы " +"получить хорошую форму. По этой причине скорость экструзии во время рэмминга " +"регулируется.\n" "\n" -"Этот параметр для опытных пользователей, неправильная настройка, может " -"привести к замятию, протирание прутка приводом экструдера и т.д." +"Эта опция для опытных пользователей, неправильная настройка может привести к " +"замятию, протиранию прутка приводом экструдера и т.д." #: src/slic3r/GUI/WipeTowerDialog.cpp:83 msgid "Total ramming time" @@ -7657,27 +7898,25 @@ msgstr "Расстояние между линиями при рэмминге" #: src/slic3r/GUI/WipeTowerDialog.cpp:142 msgid "Wipe tower - Purging volume adjustment" -msgstr "Башня очистки - регулировка объёма сброса пластика" +msgstr "Черновая башня - регулировка объёма сброса пластика" #: src/slic3r/GUI/WipeTowerDialog.cpp:254 -msgid "" -"Here you can adjust required purging volume (mm³) for any given pair of " -"tools." +msgid "Here you can adjust required purging volume (mm³) for any given pair of tools." msgstr "" "Здесь вы можете отрегулировать требуемый объём очистки (мм³) для любой пары " -"сопел." +"инструментов." #: src/slic3r/GUI/WipeTowerDialog.cpp:255 msgid "Extruder changed to" -msgstr "Экструдер изменен на" +msgstr "Экструдер перешёл на - " #: src/slic3r/GUI/WipeTowerDialog.cpp:263 msgid "unloaded" -msgstr "выгрузку" +msgstr "выгрузка" #: src/slic3r/GUI/WipeTowerDialog.cpp:264 msgid "loaded" -msgstr "загрузку" +msgstr "загрузка" #: src/slic3r/GUI/WipeTowerDialog.cpp:276 msgid "Tool #" @@ -7685,11 +7924,11 @@ msgstr "Инструмент #" #: src/slic3r/GUI/WipeTowerDialog.cpp:285 msgid "" -"Total purging volume is calculated by summing two values below, depending on " -"which tools are loaded/unloaded." +"Total purging volume is calculated by summing two values below, depending on which " +"tools are loaded/unloaded." msgstr "" -"Общий объём прочистки вычисляется путём суммирования двух нижеуказанных " -"значений, в зависимости от того, какие сопла предзагружены/выгружены." +"Общий объём прочистки вычисляется путём суммирования двух нижеуказанных значений, в " +"зависимости от того, какие инструменты предзагружены/выгружены." #: src/slic3r/GUI/WipeTowerDialog.cpp:286 msgid "Volume to purge (mm³) when the filament is being" @@ -7701,13 +7940,12 @@ msgstr "Из" #: src/slic3r/GUI/WipeTowerDialog.cpp:365 msgid "" -"Switching to simple settings will discard changes done in the advanced " -"mode!\n" +"Switching to simple settings will discard changes done in the advanced mode!\n" "\n" "Do you want to proceed?" msgstr "" -"Переключение на упрощённые настройки отменит изменения, сделанные в " -"расширенном режиме!\n" +"Переключение на упрощённые настройки отменит изменения, сделанные в расширенном " +"режиме!\n" "\n" "Хотите продолжить?" @@ -7719,24 +7957,24 @@ msgstr "Показать упрощённые настройки" msgid "Show advanced settings" msgstr "Показать расширенные настройки" -#: src/slic3r/GUI/wxExtensions.cpp:623 +#: src/slic3r/GUI/wxExtensions.cpp:627 #, c-format msgid "Switch to the %s mode" -msgstr "Переключиться в %s режим" +msgstr "Переключиться в режим %s" -#: src/slic3r/GUI/wxExtensions.cpp:624 +#: src/slic3r/GUI/wxExtensions.cpp:628 #, c-format msgid "Current mode is %s" -msgstr "Текущий режим: %s" +msgstr "Текущий режим %s" #: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68 #, c-format msgid "Mismatched type of print host: %s" -msgstr "" +msgstr "Несоответствующий тип хоста печати: %s" #: src/slic3r/Utils/AstroBox.cpp:84 msgid "Connection to AstroBox works correctly." -msgstr "Подключение к AstroBox установлено." +msgstr "Соединение с AstroBox успешно установлено." #: src/slic3r/Utils/AstroBox.cpp:90 msgid "Could not connect to AstroBox" @@ -7748,7 +7986,7 @@ msgstr "Примечание: требуется версия AstroBox не ни #: src/slic3r/Utils/Duet.cpp:47 msgid "Connection to Duet works correctly." -msgstr "Подключение к Duet установлено." +msgstr "Соединение с Duet успешно установлено." #: src/slic3r/Utils/Duet.cpp:53 msgid "Could not connect to Duet" @@ -7758,7 +7996,7 @@ msgstr "Не удалось подключиться к Duet" #: src/slic3r/Utils/FlashAir.cpp:122 src/slic3r/Utils/FlashAir.cpp:143 #: src/slic3r/Utils/FlashAir.cpp:159 msgid "Unknown error occured" -msgstr "Возникла неизвестная ошибка" +msgstr "Произошла неизвестная ошибка" #: src/slic3r/Utils/Duet.cpp:145 msgid "Wrong password" @@ -7766,108 +8004,104 @@ msgstr "Неправильный пароль" #: src/slic3r/Utils/Duet.cpp:148 msgid "Could not get resources to create a new connection" -msgstr "" +msgstr "Не удалось получить ресурсы для создания нового подключения" -#: src/slic3r/Utils/FixModelByWin10.cpp:219 -#: src/slic3r/Utils/FixModelByWin10.cpp:359 +#: src/slic3r/Utils/FixModelByWin10.cpp:219 src/slic3r/Utils/FixModelByWin10.cpp:359 msgid "Exporting source model" -msgstr "Экспортируется исходная модель" +msgstr "Экспорт исходной модели" #: src/slic3r/Utils/FixModelByWin10.cpp:235 msgid "Failed loading the input model." -msgstr "" +msgstr "Ошибка загрузки входной модели." #: src/slic3r/Utils/FixModelByWin10.cpp:242 msgid "Repairing model by the Netfabb service" -msgstr "" +msgstr "Ремонт модели с помощью сервиса Netfabb" #: src/slic3r/Utils/FixModelByWin10.cpp:248 msgid "Mesh repair failed." -msgstr "" +msgstr "Ошибка восстановления сетки." -#: src/slic3r/Utils/FixModelByWin10.cpp:251 -#: src/slic3r/Utils/FixModelByWin10.cpp:378 +#: src/slic3r/Utils/FixModelByWin10.cpp:251 src/slic3r/Utils/FixModelByWin10.cpp:378 msgid "Loading repaired model" -msgstr "Загружается исправленная модель" +msgstr "Загрузка отремонтированной модели" -#: src/slic3r/Utils/FixModelByWin10.cpp:263 -#: src/slic3r/Utils/FixModelByWin10.cpp:270 +#: src/slic3r/Utils/FixModelByWin10.cpp:263 src/slic3r/Utils/FixModelByWin10.cpp:270 #: src/slic3r/Utils/FixModelByWin10.cpp:302 msgid "Saving mesh into the 3MF container failed." -msgstr "" +msgstr "Не удалось сохранить сетку в 3MF контейнер." #: src/slic3r/Utils/FixModelByWin10.cpp:340 msgid "Model fixing" -msgstr "" +msgstr "Починка модели" #: src/slic3r/Utils/FixModelByWin10.cpp:341 msgid "Exporting model" -msgstr "" +msgstr "Экспорт модели" #: src/slic3r/Utils/FixModelByWin10.cpp:368 msgid "Export of a temporary 3mf file failed" -msgstr "" +msgstr "Ошибка экспорта временного 3mf файла" #: src/slic3r/Utils/FixModelByWin10.cpp:383 msgid "Import of the repaired 3mf file failed" -msgstr "" +msgstr "Сбой импорта восстановленного 3mf файла" #: src/slic3r/Utils/FixModelByWin10.cpp:385 msgid "Repaired 3MF file does not contain any object" -msgstr "" +msgstr "Отремонтированный 3MF файл не содержит никаких моделей" #: src/slic3r/Utils/FixModelByWin10.cpp:387 msgid "Repaired 3MF file contains more than one object" -msgstr "" +msgstr "Отремонтированный 3MF файл содержит более одной модели" #: src/slic3r/Utils/FixModelByWin10.cpp:389 msgid "Repaired 3MF file does not contain any volume" -msgstr "" +msgstr "Отремонтированный 3MF файл не содержит объёма" #: src/slic3r/Utils/FixModelByWin10.cpp:391 msgid "Repaired 3MF file contains more than one volume" -msgstr "" +msgstr "Отремонтированный 3MF файл содержит более одного объёма" #: src/slic3r/Utils/FixModelByWin10.cpp:400 msgid "Model repair finished" -msgstr "Исправление модели закончено" +msgstr "Ремонт модели закончен" #: src/slic3r/Utils/FixModelByWin10.cpp:406 msgid "Model repair canceled" -msgstr "Исправление модели отменено" +msgstr "Ремонт модели отменён" #: src/slic3r/Utils/FixModelByWin10.cpp:423 msgid "Model repaired successfully" -msgstr "Исправление модели выполнено успешно" +msgstr "Модель успешно отремонтирована" -#: src/slic3r/Utils/FixModelByWin10.cpp:423 -#: src/slic3r/Utils/FixModelByWin10.cpp:426 +#: src/slic3r/Utils/FixModelByWin10.cpp:423 src/slic3r/Utils/FixModelByWin10.cpp:426 msgid "Model Repair by the Netfabb service" -msgstr "Исправление модели через службу Netfabb" +msgstr "Ремонт модели службой Netfabb" #: src/slic3r/Utils/FixModelByWin10.cpp:426 msgid "Model repair failed:" -msgstr "Ошибка при исправлении модели:" +msgstr "Ошибка починки модели:" #: src/slic3r/Utils/FlashAir.cpp:58 msgid "Upload not enabled on FlashAir card." -msgstr "" +msgstr "Загрузка на карту FlashAir не была включена." #: src/slic3r/Utils/FlashAir.cpp:68 msgid "Connection to FlashAir works correctly and upload is enabled." -msgstr "Подключение к FlashAir установлено и загрузка включена." +msgstr "Подключение к FlashAir работает корректно. Загрузка на карту включена." #: src/slic3r/Utils/FlashAir.cpp:74 msgid "Could not connect to FlashAir" -msgstr "Не удалось подключиться к FlashAir" +msgstr "Не удаётся подключиться к FlashAir" #: src/slic3r/Utils/FlashAir.cpp:76 msgid "" -"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " -"is required." +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function is " +"required." msgstr "" -"Замечание: требуется FlashAir с прошивкой 2.00.02 или новее, а также " -"включение функции заливки." +"Примечание: для активации функцией загрузки, требуется FlashAir с прошивкой 2.00.02 " +"и выше." #: src/slic3r/Utils/OctoPrint.cpp:83 msgid "Connection to OctoPrint works correctly." @@ -7909,69 +8143,87 @@ msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " "establish secure network connections." msgstr "" +"Не удалось обнаружить системное хранилище SSL-сертификатов. PrusaSlicer не сможет " +"устанавливать безопасные сетевые соединения." #: src/slic3r/Utils/Http.cpp:78 msgid "PrusaSlicer detected system SSL certificate store in: %1%" -msgstr "" +msgstr "PrusaSlicer обнаружил хранилище системных SSL-сертификатов в: %1%" #: src/slic3r/Utils/Http.cpp:82 msgid "" -"To specify the system certificate store manually, please set the %1% " -"environment variable to the correct CA bundle and restart the application." +"To specify the system certificate store manually, please set the %1% environment " +"variable to the correct CA bundle and restart the application." msgstr "" +"Чтобы вручную указать хранилище системных сертификатов, задайте для переменной " +"среды %1% правильный пакет CA и перезапустите приложение." #: src/slic3r/Utils/Http.cpp:91 msgid "" -"CURL init has failed. PrusaSlicer will be unable to establish network " -"connections. See logs for additional details." +"CURL init has failed. PrusaSlicer will be unable to establish network connections. " +"See logs for additional details." msgstr "" +"Ошибка инициализации URL-адреса клиента. PrusaSlicer не сможет установить сетевые " +"подключения. Смотрите журнал для дополнительные информации." #: src/slic3r/Utils/Process.cpp:151 msgid "Open G-code file:" -msgstr "" +msgstr "Выберите G-код файл:" -#: src/libslic3r/GCode.cpp:610 +#: src/libslic3r/GCode.cpp:518 msgid "There is an object with no extrusions on the first layer." -msgstr "" +msgstr "На первом слое у модели отсутствует слой для экструзии." -#: src/libslic3r/GCode.cpp:628 +#: src/libslic3r/GCode.cpp:536 msgid "Empty layers detected, the output would not be printable." -msgstr "" +msgstr "Обнаружены пустые слои, печать невозможна." -#: src/libslic3r/GCode.cpp:629 +#: src/libslic3r/GCode.cpp:537 msgid "Print z" +msgstr "Печать на высоте" + +#: src/libslic3r/GCode.cpp:538 +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 "" +"Обычно это происходит из-за ничтожно малой экструзии или из-за повреждённой " +"модели. \n" +"Попробуйте отремонтировать модель или изменить её ориентацию на столе." -#: src/libslic3r/GCode.cpp:630 +#: src/libslic3r/GCode.cpp:1261 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." +"Your print is very close to the priming regions. Make sure there is no collision." msgstr "" +"Модель(-и) находится очень близко к области предзарядки (область подготовки " +"экструдера). Убедитесь, что не произойдёт столкновения." #: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:360 msgid "Mixed" msgstr "Смешанный" #: src/libslic3r/Flow.cpp:61 -msgid "" -"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." +msgid "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" +"Не удаётся рассчитать ширину экструзии для %1%: Переменная \"%2%\" недоступна." -#: src/libslic3r/Format/3mf.cpp:1667 +#: src/libslic3r/Format/3mf.cpp:1668 msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" +"Выбранный 3mf файл не совместим, так как был сохранён в более новой версии %1%." -#: src/libslic3r/Format/AMF.cpp:955 +#: src/libslic3r/Format/AMF.cpp:958 msgid "" "The selected amf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" +"Выбранный amf файл не совместим, так как был сохранён в более новой версии %1%." #: src/libslic3r/miniz_extension.cpp:91 msgid "undefined error" -msgstr "неопределённая ошибка" +msgstr "неопределенная ошибка" #: src/libslic3r/miniz_extension.cpp:93 msgid "too many files" @@ -7979,7 +8231,7 @@ msgstr "слишком много файлов" #: src/libslic3r/miniz_extension.cpp:95 msgid "file too large" -msgstr "слишком большой файл" +msgstr "файл слишком большой" #: src/libslic3r/miniz_extension.cpp:97 msgid "unsupported method" @@ -7991,87 +8243,87 @@ msgstr "неподдерживаемое шифрование" #: src/libslic3r/miniz_extension.cpp:101 msgid "unsupported feature" -msgstr "неподдерживаемое свойство" +msgstr "неподдерживаемая функция" #: src/libslic3r/miniz_extension.cpp:103 msgid "failed finding central directory" -msgstr "" +msgstr "не удалось найти центральный каталог" #: src/libslic3r/miniz_extension.cpp:105 msgid "not a ZIP archive" -msgstr "" +msgstr "это не ZIP архив" #: src/libslic3r/miniz_extension.cpp:107 msgid "invalid header or archive is corrupted" -msgstr "" +msgstr "неверный заголовок или архив поврежден" #: src/libslic3r/miniz_extension.cpp:109 msgid "unsupported multidisk archive" -msgstr "" +msgstr "неподдерживаемый многофайловый архив" #: src/libslic3r/miniz_extension.cpp:111 msgid "decompression failed or archive is corrupted" -msgstr "" +msgstr "сбой распаковки или повреждённый архив" #: src/libslic3r/miniz_extension.cpp:113 msgid "compression failed" -msgstr "сбой сжатия" +msgstr "сжатие не удалось" #: src/libslic3r/miniz_extension.cpp:115 msgid "unexpected decompressed size" -msgstr "" +msgstr "непредвиденный распакованный размер" #: src/libslic3r/miniz_extension.cpp:117 msgid "CRC-32 check failed" -msgstr "" +msgstr "Ошибка проверки CRC-32" #: src/libslic3r/miniz_extension.cpp:119 msgid "unsupported central directory size" -msgstr "" +msgstr "неподдерживаемый размер заголовка файла центрального каталога" #: src/libslic3r/miniz_extension.cpp:121 msgid "allocation failed" -msgstr "распределение не удалось" +msgstr "ошибка выделения" #: src/libslic3r/miniz_extension.cpp:123 msgid "file open failed" -msgstr "" +msgstr "ошибка открытия файла" #: src/libslic3r/miniz_extension.cpp:125 msgid "file create failed" -msgstr "" +msgstr "ошибка создания файла" #: src/libslic3r/miniz_extension.cpp:127 msgid "file write failed" -msgstr "не удалось записать файл" +msgstr "ошибка записи файла" #: src/libslic3r/miniz_extension.cpp:129 msgid "file read failed" -msgstr "" +msgstr "ошибка чтения файла" #: src/libslic3r/miniz_extension.cpp:131 msgid "file close failed" -msgstr "" +msgstr "ошибка закрытия файла" #: src/libslic3r/miniz_extension.cpp:133 msgid "file seek failed" -msgstr "" +msgstr "файл не найден" #: src/libslic3r/miniz_extension.cpp:135 msgid "file stat failed" -msgstr "" +msgstr "ошибка файла статистики" #: src/libslic3r/miniz_extension.cpp:137 msgid "invalid parameter" -msgstr "некорректный параметр" +msgstr "неверный параметр" #: src/libslic3r/miniz_extension.cpp:139 msgid "invalid filename" -msgstr "" +msgstr "неверное имя" #: src/libslic3r/miniz_extension.cpp:141 msgid "buffer too small" -msgstr "" +msgstr "буфер слишком мал" #: src/libslic3r/miniz_extension.cpp:143 msgid "internal error" @@ -8083,249 +8335,256 @@ msgstr "файл не найден" #: src/libslic3r/miniz_extension.cpp:147 msgid "archive is too large" -msgstr "" +msgstr "архив слишком большой" #: src/libslic3r/miniz_extension.cpp:149 msgid "validation failed" -msgstr "проверка не удалась" +msgstr "ошибка проверки" #: src/libslic3r/miniz_extension.cpp:151 msgid "write calledback failed" -msgstr "" +msgstr "ошибка записи обратного вызова" -#: src/libslic3r/Preset.cpp:1258 +#: src/libslic3r/Preset.cpp:1299 msgid "filament" msgstr "пруток" -#: src/libslic3r/Print.cpp:1247 +#: src/libslic3r/Print.cpp:1251 msgid "All objects are outside of the print volume." -msgstr "Все объекты находятся за пределами объёма печати." +msgstr "Все модели находятся за пределами области печати." -#: src/libslic3r/Print.cpp:1250 +#: src/libslic3r/Print.cpp:1254 msgid "The supplied settings will cause an empty print." msgstr "Заданные настройки приведут к пустой печати." -#: src/libslic3r/Print.cpp:1254 +#: src/libslic3r/Print.cpp:1258 msgid "Some objects are too close; your extruder will collide with them." msgstr "" -"Некоторые объекты находятся слишком близко друг к другу. Экструдер при " -"печати столкнётся с ними." +"Некоторые модели находятся слишком близко друг к другу. Экструдер при печати " +"столкнётся с ними." -#: src/libslic3r/Print.cpp:1256 -msgid "" -"Some objects are too tall and cannot be printed without extruder collisions." -msgstr "" -"Некоторые объекты слишком высокие и при печати экструдер столкнётся с ними." +#: src/libslic3r/Print.cpp:1260 +msgid "Some objects are too tall and cannot be printed without extruder collisions." +msgstr "Некоторые модели слишком высокие и при печати экструдер столкнётся с ними." -#: src/libslic3r/Print.cpp:1265 -msgid "The Spiral Vase option can only be used when printing a single object." +#: src/libslic3r/Print.cpp:1269 +msgid "" +"Only a single object may be printed at a time in Spiral Vase mode. Either remove " +"all but the last object, or enable sequential mode by \"complete_objects\"." msgstr "" -"Режим «Cпиральная ваза» может использоваться только при печати одиночного " -"объекта." +"Режим \"Спиральная ваза\" может использоваться для печати только одной модели. Либо " +"оставьте на столе одну модель или включите последовательную печать с помощью " +"\"complete_objects\"." -#: src/libslic3r/Print.cpp:1272 -msgid "" -"The Spiral Vase option can only be used when printing single material " -"objects." -msgstr "В режиме \"Cпиральная ваза\" можно печатать только одним материалом." +#: src/libslic3r/Print.cpp:1277 +msgid "The Spiral Vase option can only be used when printing single material objects." +msgstr "В режиме \"Спиральная ваза\" можно печатать только одним материалом." -#: src/libslic3r/Print.cpp:1285 +#: src/libslic3r/Print.cpp:1290 msgid "" -"The wipe tower is only supported if all extruders have the same nozzle " -"diameter and use filaments of the same diameter." +"The wipe tower is only supported if all extruders have the same nozzle diameter and " +"use filaments of the same diameter." msgstr "" -"Черновая башня поддерживается только, если у всех экструдеров одинаковый " -"диаметр сопла и используется пруток одинакового диаметра." +"Режим черновой башни применим только в том случае, если все экструдеры имеют " +"одинаковый диаметр сопла и используется пруток одного диаметра." -#: src/libslic3r/Print.cpp:1291 +#: src/libslic3r/Print.cpp:1296 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." msgstr "" +"В настоящее время режим черновой башни поддерживается только следующими типами G-" +"кода: Marlin, RepRap/Sprinter, RepRapFirmware, Repetier." -#: src/libslic3r/Print.cpp:1293 +#: src/libslic3r/Print.cpp:1298 msgid "" -"The Wipe Tower is currently only supported with the relative extruder " -"addressing (use_relative_e_distances=1)." +"The Wipe Tower is currently only supported with the relative extruder addressing " +"(use_relative_e_distances=1)." msgstr "" -"В настоящее время для режима башни очистки поддерживается только " -"относительная адресация экструдера (use_relative_e_distances=1)." +"В настоящее время для режима черновой башни поддерживается только относительная " +"адресация экструдера (use_relative_e_distances=1)." -#: src/libslic3r/Print.cpp:1295 +#: src/libslic3r/Print.cpp:1300 msgid "Ooze prevention is currently not supported with the wipe tower enabled." msgstr "" +"\"Предотвращение течи материала\" в настоящее время не поддерживается при " +"включённой черновой башне." -#: src/libslic3r/Print.cpp:1297 -msgid "" -"The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." +#: src/libslic3r/Print.cpp:1302 +msgid "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" +"Черновая башня в настоящее время не поддерживает объёмные значения E " +"(use_volumetric_e=0)." -#: src/libslic3r/Print.cpp:1299 -msgid "" -"The Wipe Tower is currently not supported for multimaterial sequential " -"prints." +#: src/libslic3r/Print.cpp:1304 +msgid "The Wipe Tower is currently not supported for multimaterial sequential prints." msgstr "" -"Режим башни очистки применим для нескольких объектов только в том случае, " -"если они имеют одинаковую высоту слоя." +"В настоящее время режим черновой башни не поддерживает последовательную печать для " +"мультиматериальных принтеров." -#: src/libslic3r/Print.cpp:1320 +#: src/libslic3r/Print.cpp:1325 msgid "" -"The Wipe Tower is only supported for multiple objects if they have equal " -"layer heights" +"The Wipe Tower is only supported for multiple objects if they have equal layer " +"heights" msgstr "" -"Режим башни очистки применим для нескольких объектов только в том случае, " -"если они имеют одинаковую высоту слоя" +"Режим черновой башни применим для нескольких моделей только в том случае, если они " +"имеют одинаковую высоту слоя." -#: src/libslic3r/Print.cpp:1322 +#: src/libslic3r/Print.cpp:1327 msgid "" -"The Wipe Tower is only supported for multiple objects if they are printed " -"over an equal number of raft layers" +"The Wipe Tower is only supported for multiple objects if they are printed over an " +"equal number of raft layers" msgstr "" -"Режим башни очистки применим для нескольких объектов только в том случае, " -"если они имеют одинаковое число слоёв подложки" +"Режим черновой башни применим для нескольких моделей только в том случае, если они " +"имеют одинаковое число слоёв подложки." -#: src/libslic3r/Print.cpp:1324 +#: src/libslic3r/Print.cpp:1329 msgid "" -"The Wipe Tower is only supported for multiple objects if they are printed " -"with the same support_material_contact_distance" +"The Wipe Tower is only supported for multiple objects if they are printed with the " +"same support_material_contact_distance" msgstr "" -"Башня очистки поддерживается для нескольких объектов только в том случае, " -"если они печатаются с одинаковым значением support_material_contact_distance" +"Режим черновой башни применим для нескольких моделей только в том случае, если они " +"печатаются с одинаковым support_material_contact_distance (расстояние от поддержки " +"до модели по вертикали)." -#: src/libslic3r/Print.cpp:1326 +#: src/libslic3r/Print.cpp:1331 msgid "" -"The Wipe Tower is only supported for multiple objects if they are sliced " -"equally." +"The Wipe Tower is only supported for multiple objects if they are sliced equally." msgstr "" -"Режим башни очистки применим для нескольких объектов только в том случае, " -"если они нарезаны одинаково." +"Режим черновой башни применим для нескольких моделей только в том случае, если они " +"нарезаны одинаково." -#: src/libslic3r/Print.cpp:1368 +#: src/libslic3r/Print.cpp:1373 msgid "" -"The Wipe tower is only supported if all objects have the same variable layer " -"height" +"The Wipe tower is only supported if all objects have the same variable layer height" msgstr "" -"Черновая башня поддерживается только, если все объекты имеют одинаковую " -"значение настройки переменной высоты слоя" +"Режим черновой башни применим только в том случае, если все модели имеют одну и " +"туже переменную высоту слоя." -#: src/libslic3r/Print.cpp:1394 -msgid "" -"One or more object were assigned an extruder that the printer does not have." +#: src/libslic3r/Print.cpp:1399 +msgid "One or more object were assigned an extruder that the printer does not have." msgstr "" -"Для одного или нескольких объектов был назначен экструдер, который у " -"принтера отсутствует." +"Для одного или нескольких моделей был назначен экструдер, который у принтера " +"отсутствует." -#: src/libslic3r/Print.cpp:1403 +#: src/libslic3r/Print.cpp:1408 msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" -msgstr "" +msgstr "Значение параметра %1%=%2% мм слишком мало для печати при высоте слоя %3% мм" -#: src/libslic3r/Print.cpp:1406 +#: src/libslic3r/Print.cpp:1411 msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" -msgstr "" +msgstr "Чрезмерное значение параметра %1%=%2% мм для печати при диаметре сопла %3% мм" -#: src/libslic3r/Print.cpp:1417 +#: src/libslic3r/Print.cpp:1422 msgid "" -"Printing with multiple extruders of differing nozzle diameters. If support " -"is to be printed with the current extruder (support_material_extruder == 0 " -"or support_material_interface_extruder == 0), all nozzles have to be of the " -"same diameter." +"Printing with multiple extruders of differing nozzle diameters. If support is to be " +"printed with the current extruder (support_material_extruder == 0 or " +"support_material_interface_extruder == 0), all nozzles have to be of the same " +"diameter." msgstr "" -"Печать несколькими экструдерами с соплами различного диаметра. Если " -"поддержка должна быть напечатана текущим экструдером " -"(support_material_extruder == 0 или support_material_interface_extruder == " -"0), все сопла должны иметь одинаковый диаметр." +"Печать несколькими экструдерами с соплами различного диаметра. Если поддержка " +"должна быть напечатана текущим экструдером (support_material_extruder == 0 или " +"support_material_interface_extruder == 0), все сопла должны иметь одинаковый " +"диаметр." -#: src/libslic3r/Print.cpp:1425 +#: src/libslic3r/Print.cpp:1430 msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers " -"need to be synchronized with the object layers." +"For the Wipe Tower to work with the soluble supports, the support layers need to be " +"synchronized with the object layers." msgstr "" -"Для того, чтобы башня очистки работала с растворимыми поддержками, слои " -"поддержек должны быть синхронизированы со слоями объекта." +"Для того, чтобы режим черновой башни работал с растворимой поддержкой, слои " +"поддержки должны быть синхронизированы со слоями модели." -#: src/libslic3r/Print.cpp:1429 +#: src/libslic3r/Print.cpp:1434 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)." +"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)." msgstr "" -"В настоящее время башня очистки поддерживает нерастворимые поддержки только " +"В настоящее время режим черновой башни поддерживает нерастворимую поддержку только " "в том случае, если они печатаются текущим экструдером, без запуска смены " -"сопла. (Значения \"Экструдер, печатающий поддержки/подложки/юбки\" и " -"\"Экструдер, печатающий связующий слой поддержки/подложки\" должны быть " -"установлены в 0)." +"инструмента. (Значения \"Экструдер, печатающий поддержки/подложки/юбки\" и " +"\"Экструдер, печатающий связующий слой поддержки/подложки\" должны быть установлены " +"в 0)." -#: src/libslic3r/Print.cpp:1451 +#: src/libslic3r/Print.cpp:1456 msgid "First layer height can't be greater than nozzle diameter" -msgstr "Высота первого слоя не может быть больше диаметра сопла" +msgstr "Высота первого слоя не может быть больше диаметра сопла." -#: src/libslic3r/Print.cpp:1456 +#: src/libslic3r/Print.cpp:1461 msgid "Layer height can't be greater than nozzle diameter" msgstr "Высота слоя не может быть больше диаметра сопла" -#: src/libslic3r/Print.cpp:1615 +#: src/libslic3r/Print.cpp:1620 msgid "Infilling layers" -msgstr "Слоёв заполнения" +msgstr "Заполнение слоёв" -#: src/libslic3r/Print.cpp:1641 +#: src/libslic3r/Print.cpp:1646 msgid "Generating skirt" -msgstr "Генерируется юбка" +msgstr "Генерация юбки" -#: src/libslic3r/Print.cpp:1650 +#: src/libslic3r/Print.cpp:1655 msgid "Generating brim" -msgstr "Генерируется кайма" +msgstr "Генерация каймы" -#: src/libslic3r/Print.cpp:1673 +#: src/libslic3r/Print.cpp:1678 msgid "Exporting G-code" -msgstr "Экспортируется G-код" +msgstr "Экспорт в G-код" -#: src/libslic3r/Print.cpp:1677 +#: src/libslic3r/Print.cpp:1682 msgid "Generating G-code" -msgstr "Генерируется G-код" +msgstr "Генерация G-кода" #: src/libslic3r/SLA/Pad.cpp:532 msgid "Pad brim size is too small for the current configuration." -msgstr "" +msgstr "Размер каймы подложки слишком мал для текущих настроек." -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:630 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." msgstr "" +"Невозможно продолжить без точек поддержки! Добавьте точки поддержки или отключите " +"генерацию поддержки." -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:642 msgid "" -"Elevation is too low for object. Use the \"Pad around object\" feature to " -"print the object without elevation." +"Elevation is too low for object. Use the \"Pad around object\" feature to print the " +"object without elevation." msgstr "" +"Высота подъёма слишком низкая для модели. Используйте \"Подложка вокруг модели\", " +"чтобы напечатать модель без подъёма." -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:648 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." +"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:661 +#: src/libslic3r/SLAPrint.cpp:663 msgid "Exposition time is out of printer profile bounds." -msgstr "" +msgstr "Время засветки основных слоёв выходит за пределы профиля принтера." -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:670 msgid "Initial exposition time is out of printer profile bounds." -msgstr "" +msgstr "Время засветки начальных слоёв выходит за пределы профиля принтера." -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:786 msgid "Slicing done" msgstr "Нарезка завершена" #: src/libslic3r/SLAPrintSteps.cpp:44 msgid "Hollowing model" -msgstr "" +msgstr "Создание полости в модели" #: src/libslic3r/SLAPrintSteps.cpp:45 msgid "Drilling holes into model." -msgstr "" +msgstr "Создание отверстий в модели." #: src/libslic3r/SLAPrintSteps.cpp:46 msgid "Slicing model" @@ -8333,57 +8592,61 @@ msgstr "Нарезка модели" #: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359 msgid "Generating support points" -msgstr "Генерируются вспомогательные структуры" +msgstr "Генерация точек поддержки" #: src/libslic3r/SLAPrintSteps.cpp:48 msgid "Generating support tree" -msgstr "Генерируется вспомогательное дерево" +msgstr "Генерация древовидной поддержки" #: src/libslic3r/SLAPrintSteps.cpp:49 msgid "Generating pad" -msgstr "" +msgstr "Генерация подложки" #: src/libslic3r/SLAPrintSteps.cpp:50 msgid "Slicing supports" -msgstr "Нарезаются поддержки" +msgstr "Нарезка поддержки" #: src/libslic3r/SLAPrintSteps.cpp:65 msgid "Merging slices and calculating statistics" -msgstr "" +msgstr "Объединение срезов и подсчёт статистики" #: src/libslic3r/SLAPrintSteps.cpp:66 msgid "Rasterizing layers" -msgstr "" +msgstr "Растрирование слоёв" #: src/libslic3r/SLAPrintSteps.cpp:192 msgid "Too many overlapping holes." -msgstr "" +msgstr "Слишком много пересекающихся отверстий." #: src/libslic3r/SLAPrintSteps.cpp:201 msgid "" -"Drilling holes into the mesh failed. This is usually caused by broken model. " -"Try to fix it first." +"Drilling holes into the mesh failed. This is usually caused by broken model. Try to " +"fix it first." msgstr "" +"Не удалось проделать отверстия в сетке модели. Обычно это связано с проблемой в " +"самой модели. Попробуйте сначала починить её." #: src/libslic3r/SLAPrintSteps.cpp:247 -msgid "" -"Slicing had to be stopped due to an internal error: Inconsistent slice index." +msgid "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" +"Нарезку пришлось остановить из-за внутренней ошибки: несоответствие индекса среза." #: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420 #: src/libslic3r/SLAPrintSteps.cpp:459 msgid "Visualizing supports" -msgstr "" +msgstr "Визуализация поддержек" #: src/libslic3r/SLAPrintSteps.cpp:451 msgid "No pad can be generated for this model with the current configuration" -msgstr "" +msgstr "Для этой модели с текущими настройками нельзя создать подложку." #: src/libslic3r/SLAPrintSteps.cpp:619 msgid "" -"There are unprintable objects. Try to adjust support settings to make the " -"objects printable." +"There are unprintable objects. Try to adjust support settings to make the objects " +"printable." msgstr "" +"Имеются непечатаемые модели. Попробуйте настроить параметры поддержки так, чтобы " +"сделать их доступными для печати." #: src/libslic3r/PrintBase.cpp:72 msgid "Failed processing of the output_filename_format template." @@ -8395,4453 +8658,4002 @@ msgstr "Технология принтера" #: src/libslic3r/PrintConfig.cpp:51 msgid "Bed shape" -msgstr "Форма платформы" +msgstr "Форма и размеры стола" #: src/libslic3r/PrintConfig.cpp:56 msgid "Bed custom texture" -msgstr "Пользовательская текстура платформы" +msgstr "Пользовательская текстура стола" #: src/libslic3r/PrintConfig.cpp:61 msgid "Bed custom model" -msgstr "Пользовательская модель подложки" +msgstr "Пользовательская модель стола" #: src/libslic3r/PrintConfig.cpp:66 -msgid "Picture sizes to be stored into a .gcode and .sl1 files" +msgid "G-code thumbnails" +msgstr "Эскизы G-код" + +#: src/libslic3r/PrintConfig.cpp:67 +msgid "" +"Picture sizes to be stored into a .gcode and .sl1 files, in the following format: " +"\"XxY, XxY, ...\"" msgstr "" +"Размеры изображений, сохраняемых в .gcode и .sl1 файлах (формат: \"XxY, XxY, ...\")" -#: src/libslic3r/PrintConfig.cpp:73 +#: src/libslic3r/PrintConfig.cpp:75 msgid "" -"This setting controls the height (and thus the total number) of the slices/" -"layers. Thinner layers give better accuracy but take more time to print." +"This setting controls the height (and thus the total number) of the slices/layers. " +"Thinner layers give better accuracy but take more time to print." msgstr "" -"Этот параметр определяет высоту слоя. Чем выше значение, тем быстрее печать, " -"но более низкое разрешение, и наоборот. Этот параметр не может превышать " -"диаметр используемого сопла (желательно ставить не больше ¾ от этого " -"диаметра)." +"Этот параметр определяет высоту слоя. Чем выше значение, тем быстрее печать, но " +"более низкое разрешение, и наоборот. Этот параметр не может превышать диаметр " +"используемого сопла (желательно ставить не больше ¾ от этого диаметра)." -#: src/libslic3r/PrintConfig.cpp:80 +#: src/libslic3r/PrintConfig.cpp:82 msgid "Max print height" msgstr "Максимальная высота печати" -#: src/libslic3r/PrintConfig.cpp:81 +#: src/libslic3r/PrintConfig.cpp:83 msgid "" -"Set this to the maximum height that can be reached by your extruder while " -"printing." +"Set this to the maximum height that can be reached by your extruder while printing." msgstr "" -"Задаётся максимальная высота, которую может достичь ваш экструдером во время " -"печати." +"Задаётся максимальная высота, которую может достичь ваш экструдер во время печати." -#: src/libslic3r/PrintConfig.cpp:89 +#: src/libslic3r/PrintConfig.cpp:91 msgid "Slice gap closing radius" -msgstr "" +msgstr "Радиус закрытия пробелов при нарезке" -#: src/libslic3r/PrintConfig.cpp:91 +#: src/libslic3r/PrintConfig.cpp:93 msgid "" -"Cracks smaller than 2x gap closing radius are being filled during the " -"triangle mesh slicing. The gap closing operation may reduce the final print " -"resolution, therefore it is advisable to keep the value reasonably low." +"Cracks smaller than 2x gap closing radius are being filled during the triangle mesh " +"slicing. The gap closing operation may reduce the final print resolution, therefore " +"it is advisable to keep the value reasonably low." msgstr "" +"Трещины, меньше чем 2-кратный радиус закрытия пробелов, будут заполняться во время " +"нарезки треугольной сетки. Операция закрытия пробелов может уменьшить окончательное " +"разрешение печати, поэтому рекомендуется выставлять это значение достаточно низким." -#: src/libslic3r/PrintConfig.cpp:99 +#: src/libslic3r/PrintConfig.cpp:101 msgid "Hostname, IP or URL" -msgstr "Имя узла, IP или URL" +msgstr "Имя хоста, IP или URL" -#: src/libslic3r/PrintConfig.cpp:100 +#: src/libslic3r/PrintConfig.cpp:102 msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain " -"the hostname, IP address or URL of the printer host instance." +"Slic3r can upload G-code files to a printer host. This field should contain the " +"hostname, IP address or URL of the printer host instance. Print host behind HAProxy " +"with basic auth enabled can be accessed by putting the user name and password into " +"the URL in the following format: https://username:password@your-octopi-address/" msgstr "" -"Slic3r может загрузить файлы G-кода на узел печати. В этом поле нужно " -"указать имя узла, IP-адрес или URL экземпляра узла печати." +"PrusaSlicer может загружать G-код файлы на хост принтера. В этом поле нужно указать " +"имя хоста, IP-адрес или URL-адрес хост-экземпляра печати. Доступ к узлу печати на " +"основе HAProxy с включенной базовой аутентификацией можно получить, указав имя " +"пользователя и пароль в поле URL-адрес в следующем формате: https://username:" +"password@your-octopi-address" -#: src/libslic3r/PrintConfig.cpp:106 +#: src/libslic3r/PrintConfig.cpp:110 msgid "API Key / Password" -msgstr "Ключ API / Пароль" +msgstr "API-ключ / Пароль" -#: src/libslic3r/PrintConfig.cpp:107 +#: src/libslic3r/PrintConfig.cpp:111 msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain " -"the API Key or the password required for authentication." +"Slic3r can upload G-code files to a printer host. This field should contain the API " +"Key or the password required for authentication." msgstr "" -"Slic3r может загрузить файлы G-кода на узел печати. В этом поле нужно " -"указать ключ API или пароль, требуемые для аутентификации." +"PrusaSlicer может загружать G-код файлы на хост принтера. Это поле должно содержать " +"API ключ или пароль, необходимые для проверки подлинности." -#: src/libslic3r/PrintConfig.cpp:114 +#: src/libslic3r/PrintConfig.cpp:118 msgid "Name of the printer" -msgstr "" +msgstr "Название принтера" -#: src/libslic3r/PrintConfig.cpp:121 +#: src/libslic3r/PrintConfig.cpp:125 msgid "" -"Custom CA certificate file can be specified for HTTPS OctoPrint connections, " -"in crt/pem format. If left blank, the default OS CA certificate repository " -"is used." +"Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/" +"pem format. If left blank, the default OS CA certificate repository is used." msgstr "" +"Пользовательский файл сертификата CA может быть указан для соединения по HTTPS к " +"OctoPrint в формате crt/pem. Если оставить поле пустым, будет использоваться " +"хранилище сертификатов ОС по умолчанию." -#: src/libslic3r/PrintConfig.cpp:127 +#: src/libslic3r/PrintConfig.cpp:131 msgid "Elephant foot compensation" msgstr "Компенсация расширения первого слоя" -#: src/libslic3r/PrintConfig.cpp:129 +#: src/libslic3r/PrintConfig.cpp:133 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." msgstr "" "Первый слой будет уменьшен в плоскости XY на заданное значение, чтобы " -"компенсировать эффект \"хлюпанье\" первого слоя, известное как \"слоновья " -"нога\"." +"компенсировать эффект \"хлюпанье\" первого слоя, известное как \"слоновья нога\"." -#: src/libslic3r/PrintConfig.cpp:145 +#: src/libslic3r/PrintConfig.cpp:149 msgid "Password" -msgstr "" +msgstr "Пароль" -#: src/libslic3r/PrintConfig.cpp:151 +#: src/libslic3r/PrintConfig.cpp:155 msgid "Printer preset name" -msgstr "" +msgstr "Имя профиля принтера" -#: src/libslic3r/PrintConfig.cpp:152 +#: src/libslic3r/PrintConfig.cpp:156 msgid "Related printer preset name" -msgstr "" +msgstr "Имя связанного профиля принтера" -#: src/libslic3r/PrintConfig.cpp:157 +#: src/libslic3r/PrintConfig.cpp:161 msgid "Authorization Type" -msgstr "" +msgstr "Тип авторизации" -#: src/libslic3r/PrintConfig.cpp:162 +#: src/libslic3r/PrintConfig.cpp:166 msgid "API key" -msgstr "" +msgstr "API-ключ" -#: src/libslic3r/PrintConfig.cpp:163 +#: src/libslic3r/PrintConfig.cpp:167 msgid "HTTP digest" -msgstr "" +msgstr "HTTP digest-авторизация" -#: src/libslic3r/PrintConfig.cpp:176 +#: src/libslic3r/PrintConfig.cpp:180 msgid "Avoid crossing perimeters" msgstr "Избегать пересечения периметров" -#: src/libslic3r/PrintConfig.cpp:177 +#: src/libslic3r/PrintConfig.cpp:181 msgid "" -"Optimize travel moves in order to minimize the crossing of perimeters. This " -"is mostly useful with Bowden extruders which suffer from oozing. This " -"feature slows down both the print and the G-code generation." +"Optimize travel moves in order to minimize the crossing of perimeters. This is " +"mostly useful with Bowden extruders which suffer from oozing. This feature slows " +"down both the print and the G-code generation." msgstr "" -"Этот параметр призван оптимизировать маршрут движения печатающей головки, " -"чтобы свести к минимуму пересечение стенок при движении. Полезно " -"использовать с экструдерами Боудена, которые страдают от просачивание " -"расплавленного материала. Эта функция замедляет как печать, так и генерацию " -"G-кода." +"Этот параметр призван оптимизировать маршрут движения печатающей головки, чтобы " +"свести к минимуму пересечение стенок при движении. Полезно использовать с " +"экструдерами Боудена, которые страдают от просачивание расплавленного материала. " +"Эта функция замедляет как печать, так и генерацию G-кода." -#: src/libslic3r/PrintConfig.cpp:184 src/libslic3r/PrintConfig.cpp:2259 -msgid "Other layers" -msgstr "Последующие слои" +#: src/libslic3r/PrintConfig.cpp:188 +msgid "Avoid crossing perimeters - Max detour length" +msgstr "Избегать пересечения периметров - Макс. длина обхода" -#: src/libslic3r/PrintConfig.cpp:185 +#: src/libslic3r/PrintConfig.cpp:190 msgid "" -"Bed temperature for layers after the first one. Set this to zero to disable " -"bed temperature control commands in the output." +"The maximum detour length for avoid crossing perimeters. If the detour is longer " +"than this value, avoid crossing perimeters is not applied for this travel path. " +"Detour length could be specified either as an absolute value or as percentage (for " +"example 50%) of a direct travel path." msgstr "" -"Температура платформы для слоёв после первого. Установите 0, " -"чтобы отключить команды управления температурой платформы в результате." +"Максимальное расстояние обхода сопла от модели во избежание пересечения периметров " +"при движении. Если расстояние обхода превышает это значение, то для данного " +"маршрута эта опция не применяется. Длина обхода может быть указана как абсолютном " +"значении, так и в процентах (например, 50%) от траектории перемещения. ???" -#: src/libslic3r/PrintConfig.cpp:188 -msgid "Bed temperature" -msgstr "Температура платформы" +#: src/libslic3r/PrintConfig.cpp:193 +msgid "mm or % (zero to disable)" +msgstr "мм или % (0 - отключено)" + +#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:2291 +msgid "Other layers" +msgstr "Последующие слои" -#: src/libslic3r/PrintConfig.cpp:195 +#: src/libslic3r/PrintConfig.cpp:200 msgid "" -"This custom code is inserted at every layer change, right before the Z move. " -"Note that you can use placeholder variables for all Slic3r settings as well " -"as [layer_num] and [layer_z]." +"Bed temperature for layers after the first one. Set this to zero to disable bed " +"temperature control commands in the output." msgstr "" -"Этот пользовательский код вставляется при каждой смене слоя, непосредственно " -"перед перемещения оси Z. Обратите внимание, что вы можете использовать " -"шаблонные переменные для всех параметров Slic3r, в том числе [layer_num] и " -"[layer_z]." +"Температура подогреваемого стола для слоёв после первого. Установите 0, чтобы " +"отключить команды управления температурой стола на выходе." -#: src/libslic3r/PrintConfig.cpp:205 -msgid "Between objects G-code" -msgstr "G-код между объектами" +#: src/libslic3r/PrintConfig.cpp:203 +msgid "Bed temperature" +msgstr "Температура стола" -#: src/libslic3r/PrintConfig.cpp:206 +#: src/libslic3r/PrintConfig.cpp:210 msgid "" -"This code is inserted between objects when using sequential printing. By " -"default extruder and bed temperature are reset using non-wait command; " -"however if M104, M109, M140 or M190 are detected in this custom code, Slic3r " -"will not add temperature commands. Note that you can use placeholder " -"variables for all Slic3r settings, so you can put a \"M109 " -"S[first_layer_temperature]\" command wherever you want." +"This custom code is inserted at every layer change, right before the Z move. Note " +"that you can use placeholder variables for all Slic3r settings as well as " +"[layer_num] and [layer_z]." msgstr "" -"Этот код вставляется между объектами при включении последовательной печати. " -"По умолчанию температура экструдера и платформы сбрасываются с помощью " -"команды без ожидания; однако, если в этом пользовательском коде " -"обнаруживаются команды M104, M109, M140 или M190, то Slic3r не добавит " -"команды температуры. Обратите внимание, что вы можете использовать шаблонные " -"переменные для всех параметров Slic3r, поэтому вы можете вставить команду " -"\"M109 S[first_layer_temperature]\" где угодно." +"Этот пользовательский код вставляется при каждой смене слоя, непосредственно перед " +"перемещения оси Z. Обратите внимание, что вы можете использовать шаблонные " +"переменные для всех параметров PrusaSlicer, в том числе [layer_num] и [layer_z]." -#: src/libslic3r/PrintConfig.cpp:217 +#: src/libslic3r/PrintConfig.cpp:220 +msgid "Between objects G-code" +msgstr "G-код между моделями" + +#: src/libslic3r/PrintConfig.cpp:221 +msgid "" +"This code is inserted between objects when using sequential printing. By default " +"extruder and bed temperature are reset using non-wait command; however if M104, " +"M109, M140 or M190 are detected in this custom code, Slic3r will not add " +"temperature commands. Note that you can use placeholder variables for all Slic3r " +"settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you " +"want." +msgstr "" +"Этот код вставляется между моделями при включении последовательной печати. По " +"умолчанию экструдер и температура стола сбрасываются с помощью команды без " +"ожидания; однако, если в этом пользовательском коде обнаруживаются команды M104, " +"M109, M140 или M190, то PrusaSlicer не добавит команды температуры. Обратите " +"внимание, что вы можете использовать шаблонные переменные для всех параметров " +"PrusaSlicer, поэтому вы можете вставить команду \"M109 S[first_layer_temperature]\" " +"где угодно." + +#: src/libslic3r/PrintConfig.cpp:232 msgid "Number of solid layers to generate on bottom surfaces." -msgstr "Количество сплошных слоёв для генерации нижних поверхностей." +msgstr "Количество сплошных слоёв при печати нижней поверхности модели." -#: src/libslic3r/PrintConfig.cpp:218 +#: src/libslic3r/PrintConfig.cpp:233 msgid "Bottom solid layers" msgstr "Нижних сплошных слоёв" -#: src/libslic3r/PrintConfig.cpp:226 +#: src/libslic3r/PrintConfig.cpp:241 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." msgstr "" +"При необходимости количество нижних сплошных слоёв увеличивается выше значения " +"bottom_solid_layers (\"Сплошных слоёв снизу\") для удовлетворения минимальной " +"толщины оболочки снизу." -#: src/libslic3r/PrintConfig.cpp:228 +#: src/libslic3r/PrintConfig.cpp:243 msgid "Minimum bottom shell thickness" -msgstr "" +msgstr "Минимальная толщина оболочки снизу" -#: src/libslic3r/PrintConfig.cpp:234 +#: src/libslic3r/PrintConfig.cpp:249 msgid "Bridge" -msgstr "Мост" +msgstr "Мосты" -#: src/libslic3r/PrintConfig.cpp:235 +#: src/libslic3r/PrintConfig.cpp:250 msgid "" -"This is the acceleration your printer will use for bridges. Set zero to " -"disable acceleration control for bridges." +"This is the acceleration your printer will use for bridges. Set zero to disable " +"acceleration control for bridges." msgstr "" -"Ускорение, которое принтер будет использовать для печати мостов. Установить " -"0, чтобы отключить управление ускорением для мостов." +"Ускорение, которое принтер будет использовать для печати мостов. Установить 0, " +"чтобы отключить управление ускорением для мостов." -#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:380 -#: src/libslic3r/PrintConfig.cpp:923 src/libslic3r/PrintConfig.cpp:1051 -#: src/libslic3r/PrintConfig.cpp:1332 src/libslic3r/PrintConfig.cpp:1381 -#: src/libslic3r/PrintConfig.cpp:1391 src/libslic3r/PrintConfig.cpp:1584 +#: src/libslic3r/PrintConfig.cpp:252 src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:940 src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1409 +#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1612 msgid "mm/s²" msgstr "мм/с²" -#: src/libslic3r/PrintConfig.cpp:243 +#: src/libslic3r/PrintConfig.cpp:258 msgid "Bridging angle" msgstr "Угол (направление) печати мостов" -#: src/libslic3r/PrintConfig.cpp:245 +#: src/libslic3r/PrintConfig.cpp:260 msgid "" -"Bridging angle override. If left to zero, the bridging angle will be " -"calculated automatically. Otherwise the provided angle will be used for all " -"bridges. Use 180° for zero angle." +"Bridging angle override. If left to zero, the bridging angle will be calculated " +"automatically. Otherwise the provided angle will be used for all bridges. Use 180° " +"for zero angle." msgstr "" -"Принудительная печать мостов в одном, заданном направлении. Если задано 0, " -"угол печати мостов рассчитывается автоматически. В противном случае заданный " -"угол будет использоваться для всех мостов. Для нулевого угла установите 180°." +"Принудительная печать мостов в одном, заданном направлении. Если задано 0, угол " +"печати мостов рассчитывается автоматически. В противном случае заданный угол будет " +"использоваться для всех мостов. Для нулевого угла установите 180°." -#: src/libslic3r/PrintConfig.cpp:248 src/libslic3r/PrintConfig.cpp:835 -#: src/libslic3r/PrintConfig.cpp:1821 src/libslic3r/PrintConfig.cpp:1831 -#: src/libslic3r/PrintConfig.cpp:2089 src/libslic3r/PrintConfig.cpp:2244 -#: src/libslic3r/PrintConfig.cpp:2443 src/libslic3r/PrintConfig.cpp:2944 -#: src/libslic3r/PrintConfig.cpp:3065 +#: src/libslic3r/PrintConfig.cpp:263 src/libslic3r/PrintConfig.cpp:852 +#: src/libslic3r/PrintConfig.cpp:1853 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:2121 src/libslic3r/PrintConfig.cpp:2276 +#: src/libslic3r/PrintConfig.cpp:2475 src/libslic3r/PrintConfig.cpp:2976 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "°" msgstr "°" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:269 msgid "Bridges fan speed" msgstr "Скорость вентилятора при печати мостов" -#: src/libslic3r/PrintConfig.cpp:255 +#: src/libslic3r/PrintConfig.cpp:270 msgid "This fan speed is enforced during all bridges and overhangs." -msgstr "" -"Скорость вращения вентилятора при печати мостов и нависающих частей модели." +msgstr "Скорость вращения вентилятора при печати мостов и нависающих частей модели." -#: src/libslic3r/PrintConfig.cpp:256 src/libslic3r/PrintConfig.cpp:847 -#: src/libslic3r/PrintConfig.cpp:1220 src/libslic3r/PrintConfig.cpp:1399 -#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2858 -#: src/libslic3r/PrintConfig.cpp:2984 +#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:864 +#: src/libslic3r/PrintConfig.cpp:1248 src/libslic3r/PrintConfig.cpp:1427 +#: src/libslic3r/PrintConfig.cpp:1490 src/libslic3r/PrintConfig.cpp:1745 +#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2890 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:263 +#: src/libslic3r/PrintConfig.cpp:278 msgid "Bridge flow ratio" -msgstr "Соотношение потока при печати мостов" +msgstr "Коэффициент подачи пластика при печати мостов" -#: src/libslic3r/PrintConfig.cpp:265 +#: src/libslic3r/PrintConfig.cpp:280 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " -"slightly to pull the extrudates and prevent sagging, although default " -"settings are usually good and you should experiment with cooling (use a fan) " -"before tweaking this." -msgstr "" -"Этот параметр задаёт количество пластика, затрачивающегося на построение " -"мостов. В большинстве случаев настроек по умолчанию (1) достаточно, тем не " -"менее, при печати некоторых объектов уменьшение параметра может сократить " -"провисание пластика при печати мостов. Если при печати мостов протягиваемый " -"пруток рвётся, параметр нужно увеличить (например, до 1.1). Перед " -"редактированием этого параметра не забывайте, что регулировать качество " -"натяжки мостов можно и при помощи обдува модели." - -#: src/libslic3r/PrintConfig.cpp:275 +"slightly to pull the extrudates and prevent sagging, although default settings are " +"usually good and you should experiment with cooling (use a fan) before tweaking " +"this." +msgstr "" +"Этот параметр задаёт количество пластика, затрачивающегося на построение мостов. В " +"большинстве случаев настроек по умолчанию (1) достаточно, тем не менее, при печати " +"некоторых моделей уменьшение параметра может сократить провисание пластика при " +"печати мостов. Если при печати мостов протягиваемый пруток рвётся, параметр нужно " +"увеличить (например, до 1.1). Перед редактированием этого параметра не забывайте, " +"что регулировать качество натяжки мостов можно и при помощи обдува модели." + +#: src/libslic3r/PrintConfig.cpp:290 msgid "Bridges" msgstr "Мосты" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Speed for printing bridges." msgstr "Скорость печати мостов." -#: src/libslic3r/PrintConfig.cpp:278 src/libslic3r/PrintConfig.cpp:654 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:671 -#: src/libslic3r/PrintConfig.cpp:679 src/libslic3r/PrintConfig.cpp:706 -#: src/libslic3r/PrintConfig.cpp:725 src/libslic3r/PrintConfig.cpp:987 -#: src/libslic3r/PrintConfig.cpp:1166 src/libslic3r/PrintConfig.cpp:1239 -#: src/libslic3r/PrintConfig.cpp:1315 src/libslic3r/PrintConfig.cpp:1349 -#: src/libslic3r/PrintConfig.cpp:1361 src/libslic3r/PrintConfig.cpp:1371 -#: src/libslic3r/PrintConfig.cpp:1421 src/libslic3r/PrintConfig.cpp:1480 -#: src/libslic3r/PrintConfig.cpp:1614 src/libslic3r/PrintConfig.cpp:1788 -#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:2223 -#: src/libslic3r/PrintConfig.cpp:2350 +#: src/libslic3r/PrintConfig.cpp:293 src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:679 src/libslic3r/PrintConfig.cpp:688 +#: src/libslic3r/PrintConfig.cpp:696 src/libslic3r/PrintConfig.cpp:723 +#: src/libslic3r/PrintConfig.cpp:742 src/libslic3r/PrintConfig.cpp:1015 +#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1267 +#: src/libslic3r/PrintConfig.cpp:1343 src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1449 src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1642 src/libslic3r/PrintConfig.cpp:1820 +#: src/libslic3r/PrintConfig.cpp:1829 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "mm/s" msgstr "мм/с" -#: src/libslic3r/PrintConfig.cpp:285 +#: src/libslic3r/PrintConfig.cpp:300 msgid "Brim width" msgstr "Ширина каймы" -#: src/libslic3r/PrintConfig.cpp:286 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" -"Horizontal width of the brim that will be printed around each object on the " -"first layer." +"Horizontal width of the brim that will be printed around each object on the first " +"layer." msgstr "" -"Горизонтальная ширина каймы, которая будет печататься на первом слое вокруг " -"каждого объекта." +"Расстояние от модели до самой дальней линии каймы. Широкая кайма повышает адгезию к " +"столу, но уменьшает полезную площадь печати. Увеличение этого параметра очень важно " +"для моделей с маленькой площадью контакта со столом и особенно важно при печати ABS " +"пластиком." -#: src/libslic3r/PrintConfig.cpp:293 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Clip multi-part objects" -msgstr "Обрезать составные объекты (состоящие из нескольких частей)" +msgstr "Обрезать составные модели (состоящие из нескольких частей)" -#: src/libslic3r/PrintConfig.cpp:294 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." +"When printing multi-material objects, this settings will make Slic3r to clip the " +"overlapping object parts one by the other (2nd part will be clipped by the 1st, 3rd " +"part will be clipped by the 1st and 2nd etc)." msgstr "" -"При печати объектов несколькими материалами эта настройка заставляет slic3r " -"обрезать части, которые перекрываются друг другом (вторая часть будет " -"обрезана первой, третья - первой и второй и т.д.)." +"При печати моделей несколькими материалами эта настройка заставляет PrusaSlicer " +"обрезать части, которые перекрываются друг другом (вторая часть будет обрезана " +"первой, третья - первой и второй и т.д.)." -#: src/libslic3r/PrintConfig.cpp:301 +#: src/libslic3r/PrintConfig.cpp:316 msgid "Colorprint height" -msgstr "Высота цветной печати" +msgstr "Высота смены цвета" -#: src/libslic3r/PrintConfig.cpp:302 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Heights at which a filament change is to occur." -msgstr "" +msgstr "Высота, на которой должна происходить смена прутка." -#: src/libslic3r/PrintConfig.cpp:312 +#: src/libslic3r/PrintConfig.cpp:327 msgid "Compatible printers condition" msgstr "Условия совместимости с принтером" -#: src/libslic3r/PrintConfig.cpp:313 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" -"A boolean expression using the configuration values of an active printer " -"profile. If this expression evaluates to true, this profile is considered " -"compatible with the active printer profile." +"A boolean expression using the configuration values of an active printer profile. " +"If this expression evaluates to true, this profile is considered compatible with " +"the active printer profile." msgstr "" "Логическое выражение, использующее значения конфигурации активного профиля " "принтера. Если это выражение имеет значение true, этот профиль считается " "совместимым с активным профилем принтера." -#: src/libslic3r/PrintConfig.cpp:327 +#: src/libslic3r/PrintConfig.cpp:342 msgid "Compatible print profiles condition" -msgstr "Условия совместимости с профилем печати" +msgstr "Условия совместимости профилей печати" -#: src/libslic3r/PrintConfig.cpp:328 +#: src/libslic3r/PrintConfig.cpp:343 msgid "" -"A boolean expression using the configuration values of an active print " -"profile. If this expression evaluates to true, this profile is considered " -"compatible with the active print profile." +"A boolean expression using the configuration values of an active print profile. If " +"this expression evaluates to true, this profile is considered compatible with the " +"active print profile." msgstr "" -"Логическое выражение, использующее значения конфигурации активного профиля " -"принтера. Если это выражение имеет значение true, этот профиль считается " -"совместимым с активным профилем принтера." +"Логическое выражение, использующее значения конфигурации активного профиля печати. " +"Если это выражение имеет значение true, этот профиль считается совместимым с " +"активным профилем принтера." -#: src/libslic3r/PrintConfig.cpp:345 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Complete individual objects" -msgstr "Печатать объекты последовательно" +msgstr "Печатать модели по очереди" -#: src/libslic3r/PrintConfig.cpp:346 +#: src/libslic3r/PrintConfig.cpp:361 msgid "" -"When printing multiple objects or copies, this feature will complete each " -"object before moving onto next one (and starting it from its bottom layer). " -"This feature is useful to avoid the risk of ruined prints. Slic3r should " -"warn and prevent you from extruder collisions, but beware." +"When printing multiple objects or copies, this feature will complete each object " +"before moving onto next one (and starting it from its bottom layer). This feature " +"is useful to avoid the risk of ruined prints. Slic3r should warn and prevent you " +"from extruder collisions, but beware." msgstr "" -"Когда печатается несколько объектов или копий, эта функция позволяет " -"печатать их по очереди — сначала будет напечатана один, потом второй (и " -"печать начинается с его нижнего слоя). Позволяет избежать риска испортить " -"всю печать целиком. Slic3r должен предупреждать и предотвращать столкновения " -"экструдера, но используйте аккуратно." +"Когда на печатающем столе размещено несколько моделей, эта функция позволяет " +"печатать их по очереди - сначала будет напечатана одна модель, потом вторая. Этот " +"режим может быть использован только в том случае, когда все модели разнесены таким " +"образом, что вся печатающая головка может перемещаться между ними." -#: src/libslic3r/PrintConfig.cpp:354 +#: src/libslic3r/PrintConfig.cpp:369 msgid "Enable auto cooling" msgstr "Автоматическое управление охлаждением" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:370 msgid "" -"This flag enables the automatic cooling logic that adjusts print speed and " -"fan speed according to layer printing time." +"This flag enables the automatic cooling logic that adjusts print speed and fan " +"speed according to layer printing time." msgstr "" "Программа задействует алгоритм автоматического охлаждения и сама регулирует " "скорость печати и скорость вентилятора в зависимости от времени печати слоя." -#: src/libslic3r/PrintConfig.cpp:360 +#: src/libslic3r/PrintConfig.cpp:375 msgid "Cooling tube position" msgstr "Позиция охлаждающей трубки" -#: src/libslic3r/PrintConfig.cpp:361 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Distance of the center-point of the cooling tube from the extruder tip." -msgstr "" -"Расстояние между центральной точкой охлаждающей трубки и кончиком экструдера." +msgstr "Расстояние между центральной точкой охлаждающей трубки и кончиком экструдера." -#: src/libslic3r/PrintConfig.cpp:368 +#: src/libslic3r/PrintConfig.cpp:383 msgid "Cooling tube length" msgstr "Длина охлаждающей трубки" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:384 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" -"Длина трубки охлаждения для ограничения перемещения при охлаждающих " -"движениях." +"Длина трубки охлаждения для ограничения перемещения при охлаждающих движениях." -#: src/libslic3r/PrintConfig.cpp:377 +#: src/libslic3r/PrintConfig.cpp:392 msgid "" -"This is the acceleration your printer will be reset to after the role-" -"specific acceleration values are used (perimeter/infill). Set zero to " -"prevent resetting acceleration at all." +"This is the acceleration your printer will be reset to after the role-specific " +"acceleration values are used (perimeter/infill). Set zero to prevent resetting " +"acceleration at all." msgstr "" -"Это ускорение, на которое переключится принтер после использования " -"определённых настроек ускорения, например установленных для печати периметра/" -"заполнения. Установите 0, чтобы предотвратить сброс ускорения вообще." +"Это ускорение, на которое переключится принтер после использования определённых " +"настроек ускорения, например установленных для печати периметра/заполнения. " +"Установите 0, чтобы предотвратить сброс ускорения вообще." -#: src/libslic3r/PrintConfig.cpp:386 +#: src/libslic3r/PrintConfig.cpp:401 msgid "Default filament profile" msgstr "Профиль прутка по умолчанию" -#: src/libslic3r/PrintConfig.cpp:387 +#: src/libslic3r/PrintConfig.cpp:402 msgid "" -"Default filament profile associated with the current printer profile. On " -"selection of the current printer profile, this filament profile will be " -"activated." +"Default filament profile associated with the current printer profile. On selection " +"of the current printer profile, this filament profile will be activated." msgstr "" -"Профиль прутка по умолчанию, связанный с текущим профилем принтера. При " -"выборе текущего профиля принтера, будет активирован этот профиль прутка." +"Профиль прутка по умолчанию, связанный с текущим профилем принтера. При выборе " +"текущего профиля принтера, будет активирован этот профиль прутка." -#: src/libslic3r/PrintConfig.cpp:393 +#: src/libslic3r/PrintConfig.cpp:408 msgid "Default print profile" msgstr "Профиль печати по умолчанию" -#: src/libslic3r/PrintConfig.cpp:394 src/libslic3r/PrintConfig.cpp:2788 -#: src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:2820 +#: src/libslic3r/PrintConfig.cpp:2831 msgid "" -"Default print profile associated with the current printer profile. On " -"selection of the current printer profile, this print profile will be " -"activated." +"Default print profile associated with the current printer profile. On selection of " +"the current printer profile, this print profile will be activated." msgstr "" -"Профиль печати по умолчанию, связанный с текущим профилем принтера. При " -"выборе текущего профиля принтера, будет активирован этот профиль печати." +"Профиль печати по умолчанию, связанный с текущим профилем принтера. При выборе " +"текущего профиля принтера, будет активирован этот профиль печати." -#: src/libslic3r/PrintConfig.cpp:400 +#: src/libslic3r/PrintConfig.cpp:415 msgid "Disable fan for the first" -msgstr "Не включать вентилятор на первых слоях" +msgstr "Не включать вентилятор на первых" -#: src/libslic3r/PrintConfig.cpp:401 +#: src/libslic3r/PrintConfig.cpp:416 msgid "" -"You can set this to a positive value to disable fan at all during the first " -"layers, so that it does not make adhesion worse." +"You can set this to a positive value to disable fan at all during the first layers, " +"so that it does not make adhesion worse." msgstr "" -"Вы можете задать положительное значение, чтобы отключить вентилятор при " -"печати первых слоёв, чтобы не ухудшить прилипание." +"Вы можете задать положительное значение, чтобы отключить вентилятор при печати " +"первых слоёв, чтобы не ухудшить адгезию к столу." -#: src/libslic3r/PrintConfig.cpp:410 +#: src/libslic3r/PrintConfig.cpp:425 msgid "Don't support bridges" -msgstr "Не печатать поддержки под мостами" +msgstr "Не печатать поддержку под мостами" -#: src/libslic3r/PrintConfig.cpp:412 +#: src/libslic3r/PrintConfig.cpp:427 msgid "" -"Experimental option for preventing support material from being generated " -"under bridged areas." +"Experimental option for preventing support material from being generated under " +"bridged areas." msgstr "Экспериментальная опция препятствующая печати поддержки под мостами." -#: src/libslic3r/PrintConfig.cpp:418 +#: src/libslic3r/PrintConfig.cpp:433 msgid "Distance between copies" msgstr "Расстояние между копиями" -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:434 msgid "Distance used for the auto-arrange feature of the plater." -msgstr "" -"Расстояние между объектами, используемое авторасстановкой при компоновке." +msgstr "Расстояние, между моделям при авторасстановке их на столе." -#: src/libslic3r/PrintConfig.cpp:427 +#: src/libslic3r/PrintConfig.cpp:442 msgid "" -"This end procedure is inserted at the end of the output file. Note that you " -"can use placeholder variables for all PrusaSlicer settings." +"This end procedure is inserted at the end of the output file. Note that you can use " +"placeholder variables for all PrusaSlicer settings." msgstr "" -"Это последняя процедура, вставляется в конец файла. Обратите внимание, что " -"вы можете использовать шаблонные переменные для всех параметров PrusaSlicer." +"Команды в G-коде, которые будут вставляться в конец выходного файла. Обратите " +"внимание, что вы можете использовать шаблонные переменные для всех параметров " +"PrusaSlicer." -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:452 msgid "" -"This end procedure is inserted at the end of the output file, before the " -"printer end gcode (and before any toolchange from this filament in case of " -"multimaterial printers). Note that you can use placeholder variables for all " -"PrusaSlicer settings. If you have multiple extruders, the gcode is processed " -"in extruder order." +"This end procedure is inserted at the end of the output file, before the printer " +"end gcode (and before any toolchange from this filament in case of multimaterial " +"printers). Note that you can use placeholder variables for all PrusaSlicer " +"settings. If you have multiple extruders, the gcode is processed in extruder order." msgstr "" -"Это последняя процедура, вставляется в конец файла перед конечным G-кодом " -"принтера (и перед сменой инструмента для этого прутка в случае " -"многоматериальных принтеров). Обратите внимание, что вы можете использовать " -"шаблонные переменные для всех параметров PrusaSlicer. Если имеется несколько " -"экструдеров, G-код обрабатывается в соответствии с порядковым номером " +"Команды в G-коде, которые будут вставляться в конец выходного файла перед конечным " +"G-кодом принтера (и перед каждым переключением инструмента с текущим прутком " +"в случае мультиматериальных принтеров). Обратите внимание, что вы можете " +"использовать шаблонные переменные для всех параметров PrusaSlicer. Если у вас " +"несколько экструдеров, G-код обрабатывается в соответствии с порядковым номером " "экструдера." -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:463 msgid "Ensure vertical shell thickness" msgstr "Обеспечивать вертикальную толщину оболочки" -#: src/libslic3r/PrintConfig.cpp:450 +#: src/libslic3r/PrintConfig.cpp:465 msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." +"Add solid infill near sloping surfaces to guarantee the vertical shell thickness " +"(top+bottom solid layers)." msgstr "" -"Добавляет сплошные опоры у наклонных поверхностей для того, чтобы " -"гарантировать вертикальную толщину оболочки (верхние+нижние сплошные слои). " -"Это помогает избежать дыр на наклонной поверхности." +"Добавляет сплошные опоры у наклонных поверхностей для того, чтобы гарантировать " +"вертикальную толщину оболочки (верхние+нижние сплошные слои). Это помогает избежать " +"дыр на наклонной поверхности." -#: src/libslic3r/PrintConfig.cpp:456 +#: src/libslic3r/PrintConfig.cpp:471 msgid "Top fill pattern" -msgstr "Шаблон заполнения верха" +msgstr "Шаблон заполнения верхней поверхности" -#: src/libslic3r/PrintConfig.cpp:458 +#: src/libslic3r/PrintConfig.cpp:473 msgid "" -"Fill pattern for top infill. This only affects the top visible layer, and " -"not its adjacent solid shells." +"Fill pattern for top infill. This only affects the top visible layer, and not its " +"adjacent solid shells." msgstr "" -"Шаблон заполнения, которым закрывается верхняя поверхность. Это влияет " -"только на внешний видимый слой, а не на прилегающие к нему сплошные оболочки." +"Тип сетки, которой закрывается верхняя поверхность. Это влияет только на внешний " +"видимый слой, а не на прилегающие к нему твёрдые оболочки." -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:901 -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:2236 msgid "Rectilinear" msgstr "Прямолинейный" -#: src/libslic3r/PrintConfig.cpp:469 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Monotonic" -msgstr "" +msgstr "Монотонный" -#: src/libslic3r/PrintConfig.cpp:470 src/libslic3r/PrintConfig.cpp:902 +#: src/libslic3r/PrintConfig.cpp:485 src/libslic3r/PrintConfig.cpp:919 msgid "Aligned Rectilinear" -msgstr "" +msgstr "Выровн. прямолинейн." -#: src/libslic3r/PrintConfig.cpp:471 src/libslic3r/PrintConfig.cpp:908 +#: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:925 msgid "Concentric" msgstr "Концентрический" -#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:912 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:929 msgid "Hilbert Curve" msgstr "Кривая Гильберта" -#: src/libslic3r/PrintConfig.cpp:473 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:930 msgid "Archimedean Chords" msgstr "Хорды Архимеда" -#: src/libslic3r/PrintConfig.cpp:474 src/libslic3r/PrintConfig.cpp:914 +#: src/libslic3r/PrintConfig.cpp:489 src/libslic3r/PrintConfig.cpp:931 msgid "Octagram Spiral" msgstr "Спиральная октаграмма" -#: src/libslic3r/PrintConfig.cpp:480 +#: src/libslic3r/PrintConfig.cpp:495 msgid "Bottom fill pattern" -msgstr "Шаблон заполнения низа" +msgstr "Шаблон заполнения нижней поверхности" -#: src/libslic3r/PrintConfig.cpp:482 +#: src/libslic3r/PrintConfig.cpp:497 msgid "" -"Fill pattern for bottom infill. This only affects the bottom external " -"visible layer, and not its adjacent solid shells." +"Fill pattern for bottom infill. This only affects the bottom external visible " +"layer, and not its adjacent solid shells." msgstr "" -"Шаблон заполнения, которым закрывается нижняя поверхность. Это влияет только " -"на внешний видимый слой, а не на прилегающие к нему сплошные оболочки." +"Тип сетки, которой закрывается нижняя поверхность. Это влияет только на нижний " +"внешний видимый слой, а не на прилегающие к нему твёрдые оболочки." -#: src/libslic3r/PrintConfig.cpp:491 src/libslic3r/PrintConfig.cpp:502 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:517 msgid "External perimeters" msgstr "Внешние периметры" -#: src/libslic3r/PrintConfig.cpp:493 +#: src/libslic3r/PrintConfig.cpp:508 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " -"perimeters. If left zero, default extrusion width will be used if set, " -"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " -"(for example 200%), it will be computed over layer height." +"perimeters. If left zero, default extrusion width will be used if set, otherwise " +"1.125 x nozzle diameter will be used. If expressed as percentage (for example " +"200%), it will be computed over layer height." msgstr "" "Установите значение отличное от 0, чтобы вручную задать ширину экструзии для " -"внешних периметров. Если оставить 0, будет использоваться \"Ширина экструзии " -"по умолчанию\" - если она задана, в противном случае будет использоваться " -"1,125 x диаметра сопла. Если задано в процентах, параметр вычисляется " -"относительно высоты слоя." - -#: src/libslic3r/PrintConfig.cpp:496 src/libslic3r/PrintConfig.cpp:605 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:958 -#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1131 -#: src/libslic3r/PrintConfig.cpp:1157 src/libslic3r/PrintConfig.cpp:1604 -#: src/libslic3r/PrintConfig.cpp:1929 src/libslic3r/PrintConfig.cpp:2078 -#: src/libslic3r/PrintConfig.cpp:2146 src/libslic3r/PrintConfig.cpp:2307 +"внешних периметров. Если оставить 0, будет использоваться \"Ширина экструзии по " +"умолчанию\" - если она задана, в противном случае будет использоваться 1,125 x " +"диаметра сопла. Если задано в процентах, параметр вычисляется относительно высоты " +"слоя." + +#: src/libslic3r/PrintConfig.cpp:511 src/libslic3r/PrintConfig.cpp:621 +#: src/libslic3r/PrintConfig.cpp:962 src/libslic3r/PrintConfig.cpp:975 +#: src/libslic3r/PrintConfig.cpp:1104 src/libslic3r/PrintConfig.cpp:1159 +#: src/libslic3r/PrintConfig.cpp:1185 src/libslic3r/PrintConfig.cpp:1632 +#: src/libslic3r/PrintConfig.cpp:1961 src/libslic3r/PrintConfig.cpp:2110 +#: src/libslic3r/PrintConfig.cpp:2178 src/libslic3r/PrintConfig.cpp:2339 msgid "mm or %" msgstr "мм или %" -#: src/libslic3r/PrintConfig.cpp:504 +#: src/libslic3r/PrintConfig.cpp:519 msgid "" -"This separate setting will affect the speed of external perimeters (the " -"visible ones). If expressed as percentage (for example: 80%) it will be " -"calculated on the perimeters speed setting above. Set to zero for auto." +"This separate setting will affect the speed of external perimeters (the visible " +"ones). If expressed as percentage (for example: 80%) it will be calculated on the " +"perimeters speed setting above. Set to zero for auto." msgstr "" -"Этот параметр влияет на скорость печати внешних периметров (видимых). Если " -"задано в процентах, параметр вычисляется относительно скорости печати " -"внутренних периметров. Установите 0 для автонастройки." +"Этот параметр влияет на скорость печати внешних периметров (видимых). Если задано в " +"процентах, параметр вычисляется относительно скорости печати внутренних периметров. " +"Установите 0 для автонастройки." -#: src/libslic3r/PrintConfig.cpp:507 src/libslic3r/PrintConfig.cpp:967 -#: src/libslic3r/PrintConfig.cpp:1888 src/libslic3r/PrintConfig.cpp:1940 -#: src/libslic3r/PrintConfig.cpp:2190 src/libslic3r/PrintConfig.cpp:2320 +#: src/libslic3r/PrintConfig.cpp:522 src/libslic3r/PrintConfig.cpp:984 +#: src/libslic3r/PrintConfig.cpp:1920 src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2222 src/libslic3r/PrintConfig.cpp:2352 msgid "mm/s or %" msgstr "мм/с или %" -#: src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:529 msgid "External perimeters first" msgstr "Внешние периметры печатать первыми" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:531 msgid "" -"Print contour perimeters from the outermost one to the innermost one instead " -"of the default inverse order." +"Print contour perimeters from the outermost one to the innermost one instead of the " +"default inverse order." msgstr "" -"При включении, сначала будет печататься внешний слой периметра, потом " -"внутренний. Например, если периметр состоит из трёх слоёв, то, включив этот " -"параметр, печать будет идти в следующем порядке: сначала внешний, потом " -"средний, потом внутренний слой." +"При включении, сначала будет печататься внешний слой периметра, потом внутренний. " +"Например, если периметр состоит из трёх слоёв, то, включив этот параметр, печать " +"будет идти в следующем порядке: сначала внешний, потом средний, потом внутренний " +"слой." -#: src/libslic3r/PrintConfig.cpp:522 +#: src/libslic3r/PrintConfig.cpp:537 msgid "Extra perimeters if needed" -msgstr "Дополнительные стенки при необходимости" +msgstr "Дополнительные периметры при необходимости" -#: src/libslic3r/PrintConfig.cpp:524 +#: src/libslic3r/PrintConfig.cpp:539 #, 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 " -"is supported." +"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r keeps " +"adding perimeters, until more than 70% of the loop immediately above is supported." msgstr "" -"Добавляет дополнительные стенки, когда это необходимо, чтобы избежать " -"пробелов в наклонных стенках. Slic3r добавляет стенки до тех пор, пока не " -"будет поддержано более 70% верхнего контура." +"Добавляет дополнительные периметры, когда это необходимо, чтобы избежать пробелов в " +"наклонных стенках. PrusaSlicer продолжит добавлять периметры пока в следующем слое " +"не будет поддерживаться более 70% периметра." -#: src/libslic3r/PrintConfig.cpp:534 +#: src/libslic3r/PrintConfig.cpp:549 msgid "" -"The extruder to use (unless more specific extruder settings are specified). " -"This value overrides perimeter and infill extruders, but not the support " -"extruders." +"The extruder to use (unless more specific extruder settings are specified). This " +"value overrides perimeter and infill extruders, but not the support extruders." msgstr "" -"Используемый экструдер (если не заданы более конкретные параметры " -"экструдера). Это значение переопределяет экструдеры периметра и заполнения, " -"но не экструдеры поддержки." +"Используемый экструдер (если не заданы более конкретные параметры экструдера). Это " +"значение переопределяет экструдеры периметра и заполнения, но не экструдеры " +"поддержки." -#: src/libslic3r/PrintConfig.cpp:546 +#: src/libslic3r/PrintConfig.cpp:561 msgid "" -"Set this to the vertical distance between your nozzle tip and (usually) the " -"X carriage rods. In other words, this is the height of the clearance " -"cylinder around your extruder, and it represents the maximum depth the " -"extruder can peek before colliding with other printed objects." +"Set this to the vertical distance between your nozzle tip and (usually) the X " +"carriage rods. In other words, this is the height of the clearance cylinder around " +"your extruder, and it represents the maximum depth the extruder can peek before " +"colliding with other printed objects." msgstr "" -"Задаёт вертикальное расстояние между кончиком сопла и (обычно) осью валов X " -"на которых ездит каретка. Другими словами, это высота воображаемого цилиндра " -"вокруг экструдера, которая определяет максимальную глубину, до которой " -"экструдер может опуститься, чтобы не столкнуться объектами печати." +"Задаёт вертикальное расстояние между кончиком сопла и (обычно) осью валов на " +"которых ездит каретка. Другими словами, это высота воображаемого цилиндра вокруг " +"экструдера, которая определяет максимальную глубину, до которой экструдер может " +"опуститься, чтобы не столкнуться с моделью." -#: src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:572 msgid "" -"Set this to the clearance radius around your extruder. If the extruder is " -"not centered, choose the largest value for safety. This setting is used to " -"check for collisions and to display the graphical preview in the plater." +"Set this to the clearance radius around your extruder. If the extruder is not " +"centered, choose the largest value for safety. This setting is used to check for " +"collisions and to display the graphical preview in the plater." msgstr "" -"Безопасное расстояние (зазор) вокруг экструдера. Если экструдер установлен " -"не по центру, то берётся наибольшее безопасное значение. Этот параметр " -"используется для предотвращения столкновения экструдера с моделью и в " -"предварительном просмотре компоновки." +"Безопасное расстояние (зазор) вокруг экструдера. Если экструдер установлен не по " +"центру - взять наибольшее безопасное значение. Этот параметр используется для " +"предотвращения столкновения экструдера с моделью и графического отображения на " +"столе." -#: src/libslic3r/PrintConfig.cpp:567 +#: src/libslic3r/PrintConfig.cpp:582 msgid "Extruder Color" msgstr "Цвет экструдера" -#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:583 src/libslic3r/PrintConfig.cpp:645 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" -"Этот параметр используется только в интерфейсе Slic3r в качестве визуальной " +"Этот параметр используется только в интерфейсе PrusaSlicer в качестве визуальной " "помощи." -#: src/libslic3r/PrintConfig.cpp:574 +#: src/libslic3r/PrintConfig.cpp:589 msgid "Extruder offset" msgstr "Смещение экструдера по осям X/Y" -#: src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:590 msgid "" -"If your firmware doesn't handle the extruder displacement you need the G-" -"code to take it into account. This option lets you specify the displacement " -"of each extruder with respect to the first one. It expects positive " -"coordinates (they will be subtracted from the XY coordinate)." +"If your firmware doesn't handle the extruder displacement you need the G-code to " +"take it into account. This option lets you specify the displacement of each " +"extruder with respect to the first one. It expects positive coordinates (they will " +"be subtracted from the XY coordinate)." msgstr "" -"Если прошивка принтера правильно не обрабатывает расположение/смещение " -"экструдера, следует учесть это в G-коде. Этот параметр позволяет задать " -"смещение каждого экструдера относительно первого. Вводятся положительные " -"координаты (они будут вычтены из XY координат)." +"Актуально только для принтеров с несколькими экструдерами. Если прошивка вашего " +"принтера правильно не обрабатывает расположение/смещение экструдера, следует учесть " +"это в G-коде. Этот параметр позволяет задать смещение каждого экструдера " +"относительно первого. Вводятся положительные координаты (они будут вычтены из XY " +"координат)." -#: src/libslic3r/PrintConfig.cpp:584 +#: src/libslic3r/PrintConfig.cpp:599 msgid "Extrusion axis" msgstr "Экструзионные оси" -#: src/libslic3r/PrintConfig.cpp:585 +#: src/libslic3r/PrintConfig.cpp:600 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." msgstr "" -"Используйте эту опцию, чтобы задать букву оси, связанную с экструдером " -"вашего принтера (обычно это E, но на некоторых принтерах A)." +"Используйте эту опцию, чтобы задать букву оси, связанную с экструдером вашего " +"принтера (обычно это E, но на некоторых принтерах A)." -#: src/libslic3r/PrintConfig.cpp:590 +#: src/libslic3r/PrintConfig.cpp:605 msgid "Extrusion multiplier" msgstr "Экструзионный множитель" -#: src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:606 msgid "" -"This factor changes the amount of flow proportionally. You may need to tweak " -"this setting to get nice surface finish and correct single wall widths. " -"Usual values are between 0.9 and 1.1. If you think you need to change this " -"more, check filament diameter and your firmware E steps." +"This factor changes the amount of flow proportionally. You may need to tweak this " +"setting to get nice surface finish and correct single wall widths. Usual values are " +"between 0.9 and 1.1. If you think you need to change this more, check filament " +"diameter and your firmware E steps." msgstr "" -"Коэффициент количества подаваемого пластика по сравнению с основным " -"значением. В других слайсерах называется Текучесть (Flow). Вам может " -"понадобиться настроить этот параметр, чтобы получить красивую поверхность и " -"правильную ширину одиночной стенки. Обычные значения составляют от 0.9 до " -"1.1. Если вы считаете, что вам требуется большее значение, проверьте диаметр " -"прутка и шаги экструдера в вашей прошивке." +"Коэффициент количества подаваемого пластика по сравнению с основным значением. В " +"других слайсерах называется Текучесть (Flow). Вам может понадобиться настроить этот " +"параметр, чтобы получить красивую поверхность и правильную ширину одиночной стенки. " +"Обычные значения составляют от 0.9 до 1.1. Если вы считаете, что вам требуется " +"большее значение, проверьте диаметр прутка и шаги экструдера в вашей прошивке." -#: src/libslic3r/PrintConfig.cpp:599 +#: src/libslic3r/PrintConfig.cpp:615 msgid "Default extrusion width" msgstr "Ширина экструзии по умолчанию" -#: src/libslic3r/PrintConfig.cpp:601 +#: src/libslic3r/PrintConfig.cpp:617 msgid "" -"Set this to a non-zero value to allow a manual extrusion width. If left to " -"zero, Slic3r derives extrusion widths from the nozzle diameter (see the " -"tooltips for perimeter extrusion width, infill extrusion width etc). If " -"expressed as percentage (for example: 230%), it will be computed over layer " -"height." +"Set this to a non-zero value to allow a manual extrusion width. If left to zero, " +"Slic3r derives extrusion widths from the nozzle diameter (see the tooltips for " +"perimeter extrusion width, infill extrusion width etc). If expressed as percentage " +"(for example: 230%), it will be computed over layer height." msgstr "" -"Установите значение отличное от 0, чтобы вручную задать ширину экструзии. " -"Если оставить 0, будет использоваться заданный диаметр сопла. Если задано в " -"процентах, параметр вычисляется относительно высоты слоя." +"Установите значение отличное от 0, чтобы вручную задать ширину экструзии " +"заполнения. Если оставить 0, будет использоваться заданный диаметр сопла. Если " +"задано в процентах, параметр вычисляется относительно высоты слоя." -#: src/libslic3r/PrintConfig.cpp:611 +#: src/libslic3r/PrintConfig.cpp:628 msgid "Keep fan always on" msgstr "Вентилятор включён всегда" -#: src/libslic3r/PrintConfig.cpp:612 +#: src/libslic3r/PrintConfig.cpp:629 msgid "" -"If this is enabled, fan will never be disabled and will be kept running at " -"least at its minimum speed. Useful for PLA, harmful for ABS." +"If this is enabled, fan will never be disabled and will be kept running at least at " +"its minimum speed. Useful for PLA, harmful for ABS." msgstr "" -"Если эта опция включена, вентилятор никогда не будет отключаться и будет " -"работает хотя бы на минимальной скорости. Полезно для PLA, вредно для ABS." +"Если эта опция включена, вентилятор никогда не будет отключаться и будет работать " +"хотя бы на минимальной скорости. Полезно для PLA, вредно для ABS." -#: src/libslic3r/PrintConfig.cpp:617 +#: src/libslic3r/PrintConfig.cpp:634 msgid "Enable fan if layer print time is below" msgstr "Включить обдув, если время печати слоя менее" -#: src/libslic3r/PrintConfig.cpp:618 +#: src/libslic3r/PrintConfig.cpp:635 msgid "" -"If layer print time is estimated below this number of seconds, fan will be " -"enabled and its speed will be calculated by interpolating the minimum and " -"maximum speeds." +"If layer print time is estimated below this number of seconds, fan will be enabled " +"and its speed will be calculated by interpolating the minimum and maximum speeds." msgstr "" -"Если время печати слоя оценивается ниже этого количества секунд, будет " -"включён вентилятор, и его скорость будет рассчитываться путём интерполяции " -"минимальных и максимальных скоростей." +"Если время печати слоя оценивается ниже этого количества секунд, будет включён " +"вентилятор, и его скорость будет рассчитываться путём интерполяции минимальных и " +"максимальных скоростей." -#: src/libslic3r/PrintConfig.cpp:620 src/libslic3r/PrintConfig.cpp:1876 +#: src/libslic3r/PrintConfig.cpp:637 src/libslic3r/PrintConfig.cpp:1908 msgid "approximate seconds" msgstr "приблизительно секунд" -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:644 msgid "Color" msgstr "Цвет" -#: src/libslic3r/PrintConfig.cpp:633 +#: src/libslic3r/PrintConfig.cpp:650 msgid "Filament notes" msgstr "Примечание о прутке" -#: src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:651 msgid "You can put your notes regarding the filament here." -msgstr "Здесь вы можете написать свои примечания для прутка." +msgstr "Здесь вы можете написать свои примечания относительно прутка." -#: src/libslic3r/PrintConfig.cpp:642 src/libslic3r/PrintConfig.cpp:1427 +#: src/libslic3r/PrintConfig.cpp:659 src/libslic3r/PrintConfig.cpp:1455 msgid "Max volumetric speed" -msgstr "Макс. объёмная скорость" +msgstr "Максимальная объёмная скорость" -#: src/libslic3r/PrintConfig.cpp:643 +#: src/libslic3r/PrintConfig.cpp:660 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." +"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 "" -"Максимальная объёмная скорость подачи, разрешённая для этого прутка. " -"Ограничивает максимальную объёмную скорость печати до минимальной для этого " -"принтера и прутка. Установите 0, чтобы убрать ограничения." +"Максимальная объёмная скорость подачи (объёмный расход), разрешённая для этого " +"прутка. Ограничивает максимальную объёмную скорость печати до минимальной " +"для этого принтера и прутка. Установите 0, чтобы убрать ограничения." -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:669 msgid "Loading speed" msgstr "Скорость загрузки" -#: src/libslic3r/PrintConfig.cpp:653 +#: src/libslic3r/PrintConfig.cpp:670 msgid "Speed used for loading the filament on the wipe tower." -msgstr "Скорость загрузки прутка на башню очистки." +msgstr "Скорость загрузки прутка при печати черновой башни." -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:677 msgid "Loading speed at the start" msgstr "Начальная скорость загрузки" -#: src/libslic3r/PrintConfig.cpp:661 +#: src/libslic3r/PrintConfig.cpp:678 msgid "Speed used at the very beginning of loading phase." -msgstr "Скорость, используемая на очень ранней стадии загрузки." +msgstr "Скорость в начальной фазе загрузки прутка." -#: src/libslic3r/PrintConfig.cpp:668 +#: src/libslic3r/PrintConfig.cpp:685 msgid "Unloading speed" msgstr "Скорость выгрузки" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:686 msgid "" -"Speed used for unloading the filament on the wipe tower (does not affect " -"initial part of unloading just after ramming)." +"Speed used for unloading the filament on the wipe tower (does not affect initial " +"part of unloading just after ramming)." msgstr "" -"Скорость выгрузки прутка на башню очистки (не влияет на начальную фазу " -"выгрузки сразу после рэмминга)." +"Скорость выгрузки прутка на черновую башню. (не влияет на начальную фазу выгрузки " +"сразу после рэмминга)." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:694 msgid "Unloading speed at the start" msgstr "Начальная скорость выгрузки" -#: src/libslic3r/PrintConfig.cpp:678 -msgid "" -"Speed used for unloading the tip of the filament immediately after ramming." +#: src/libslic3r/PrintConfig.cpp:695 +msgid "Speed used for unloading the tip of the filament immediately after ramming." msgstr "Скорость выгрузки кончика прутка сразу после рэмминга." -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:702 msgid "Delay after unloading" msgstr "Задержка после выгрузки" -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:703 msgid "" -"Time to wait after the filament is unloaded. May help to get reliable " -"toolchanges with flexible materials that may need more time to shrink to " -"original dimensions." +"Time to wait after the filament is unloaded. May help to get reliable toolchanges " +"with flexible materials that may need more time to shrink to original dimensions." msgstr "" -"Время ожидания после выгрузки прутка. Это может помочь вам легко сменить " -"сопло при печати гибкими материалами, которым требуется больше времени, " -"чтобы вернуться к своим первоначальным размерам." +"Время ожидания после выгрузки прутка. Это может помочь вам легко сменить сопло при " +"печати гибкими материалами, которым требуется больше времени, чтобы вернуться к " +"своим первоначальным размерам." -#: src/libslic3r/PrintConfig.cpp:695 +#: src/libslic3r/PrintConfig.cpp:712 msgid "Number of cooling moves" msgstr "Количество охлаждающих движений" -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:713 msgid "" -"Filament is cooled by being moved back and forth in the cooling tubes. " -"Specify desired number of these moves." +"Filament is cooled by being moved back and forth in the cooling tubes. Specify " +"desired number of these moves." msgstr "" "Пруток охлаждается в охлаждающих трубках путём перемещения назад и вперёд. " "Укажите желаемое количество таких движений." -#: src/libslic3r/PrintConfig.cpp:704 +#: src/libslic3r/PrintConfig.cpp:721 msgid "Speed of the first cooling move" msgstr "Скорость первого охлаждающего движения" -#: src/libslic3r/PrintConfig.cpp:705 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "Охлаждающие движения постепенно ускоряются, начиная с этой скорости." -#: src/libslic3r/PrintConfig.cpp:712 +#: src/libslic3r/PrintConfig.cpp:729 msgid "Minimal purge on wipe tower" -msgstr "Минимальная длина очистки на башне" +msgstr "Мин. объём сброса на черновой башне" -#: src/libslic3r/PrintConfig.cpp:713 +#: src/libslic3r/PrintConfig.cpp:730 msgid "" -"After a tool change, the exact position of the newly loaded filament inside " -"the nozzle may not be known, and the filament pressure is likely not yet " -"stable. Before purging the print head into an infill or a sacrificial " -"object, Slic3r will always prime this amount of material into the wipe tower " -"to produce successive infill or sacrificial object extrusions reliably." +"After a tool change, the exact position of the newly loaded filament inside the " +"nozzle may not be known, and the filament pressure is likely not yet stable. Before " +"purging the print head into an infill or a sacrificial object, Slic3r will always " +"prime this amount of material into the wipe tower to produce successive infill or " +"sacrificial object extrusions reliably." msgstr "" +"После смены инструмента, точное положение вновь загруженного прутка внутри него может " +"быть неизвестно, и давление прутка, вероятно, ещё не стабильно. Перед тем, как " +"очистить печатающую головку в заполнение или в \"жертвенную\" модель, PrusaSlicer " +"всегда будет выдавливать это количество материала на черновую башню, чтобы " +"обеспечить надёжную печать заполнения или \"жертвенной\" модели." -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:734 msgid "mm³" msgstr "мм³" -#: src/libslic3r/PrintConfig.cpp:723 +#: src/libslic3r/PrintConfig.cpp:740 msgid "Speed of the last cooling move" msgstr "Скорость последнего охлаждающего движения" -#: src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:741 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "Охлаждающие движения постепенно ускоряют до этой скорости." -#: src/libslic3r/PrintConfig.cpp:731 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Filament load time" -msgstr "Время загрузки прутка" +msgstr "Время загрузки пластика" -#: src/libslic3r/PrintConfig.cpp:732 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " -"filament during a tool change (when executing the T code). This time is " -"added to the total print time by the G-code time estimator." +"filament during a tool change (when executing the T code). This time is added to " +"the total print time by the G-code time estimator." msgstr "" +"Время за которое прошивка принтера (или Multi Material Unit 2.0) выгружает " +"пруток во время смены инструмента (при выполнении кода Т). Это время добавляется " +"к общему времени печати с помощью алгоритма оценки времени выполнения G-" +"кода." -#: src/libslic3r/PrintConfig.cpp:739 +#: src/libslic3r/PrintConfig.cpp:756 msgid "Ramming parameters" msgstr "Параметры рэмминга" -#: src/libslic3r/PrintConfig.cpp:740 +#: src/libslic3r/PrintConfig.cpp:757 msgid "" -"This string is edited by RammingDialog and contains ramming specific " -"parameters." +"This string is edited by RammingDialog and contains ramming specific parameters." msgstr "" "Эта строка редактируется диалоговым окном рэмминга и содержит его конкретные " "параметры." -#: src/libslic3r/PrintConfig.cpp:746 +#: src/libslic3r/PrintConfig.cpp:763 msgid "Filament unload time" -msgstr "Время выгрузки прутка" +msgstr "Время выгрузки пластика" -#: src/libslic3r/PrintConfig.cpp:747 +#: src/libslic3r/PrintConfig.cpp:764 msgid "" -"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " -"filament during a tool change (when executing the T code). This time is " -"added to the total print time by the G-code time estimator." +"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament " +"during a tool change (when executing the T code). This time is added to the total " +"print time by the G-code time estimator." msgstr "" +"Время за которое прошивка принтера (или Multi Material Unit 2.0) выгружает " +"пруток во время смены инструмента (при выполнении кода Т). Это время " +"добавляется к общему времени печати с помощью алгоритма оценки времени выполнения G-" +"кода." -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:772 msgid "" -"Enter your filament diameter here. Good precision is required, so use a " -"caliper and do multiple measurements along the filament, then compute the " -"average." +"Enter your filament diameter here. Good precision is required, so use a caliper and " +"do multiple measurements along the filament, then compute the average." msgstr "" -"Здесь задаётся диаметр используемого прутка. Требуется хорошая точность, " -"поэтому используйте штангенциркуль, чтобы сделать несколько измерений вдоль " -"прутка и вычислить среднее значение." +"Здесь задаётся диаметр прутка. Требуется хорошая точность, поэтому " +"используйте штангенциркуль, чтобы сделать несколько измерений вдоль прутка и " +"вычислить среднее значение." -#: src/libslic3r/PrintConfig.cpp:762 src/libslic3r/PrintConfig.cpp:2699 -#: src/libslic3r/PrintConfig.cpp:2700 +#: src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:2731 +#: src/libslic3r/PrintConfig.cpp:2732 msgid "Density" msgstr "Плотность" -#: src/libslic3r/PrintConfig.cpp:763 +#: src/libslic3r/PrintConfig.cpp:780 msgid "" -"Enter your filament density here. This is only for statistical information. " -"A decent way is to weigh a known length of filament and compute the ratio of " -"the length to volume. Better is to calculate the volume directly through " -"displacement." +"Enter your filament density here. This is only for statistical information. A " +"decent way is to weigh a known length of filament and compute the ratio of the " +"length to volume. Better is to calculate the volume directly through displacement." msgstr "" -"Введите здесь плотность используемого прутка. Это необходимо только для " -"статистической информации. Хорошим методом является взвешивание куска прутка " -"известной длины и вычисление отношения длины к его объёму. Объём же лучше " +"Введите здесь плотность (г/см3) используемого марериала прутка. Это необходимо " +"только для статистической информации. Хорошим методом является взвешивание кусочка " +"прутка известной длины и вычисление отношения длины к его объёму. Объём же лучше " "вычислять непосредственно путём вытеснения жидкости." -#: src/libslic3r/PrintConfig.cpp:766 +#: src/libslic3r/PrintConfig.cpp:783 msgid "g/cm³" msgstr "г/см³" -#: src/libslic3r/PrintConfig.cpp:771 +#: src/libslic3r/PrintConfig.cpp:788 msgid "Filament type" msgstr "Тип прутка" -#: src/libslic3r/PrintConfig.cpp:772 +#: src/libslic3r/PrintConfig.cpp:789 msgid "The filament material type for use in custom G-codes." -msgstr "" +msgstr "Тип прутка для использования в пользовательских G-кодах." -#: src/libslic3r/PrintConfig.cpp:799 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Soluble material" msgstr "Растворимый материал" -#: src/libslic3r/PrintConfig.cpp:800 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Soluble material is most likely used for a soluble support." msgstr "Растворимый материал, чаше всего используют для растворимой поддержки." -#: src/libslic3r/PrintConfig.cpp:806 +#: src/libslic3r/PrintConfig.cpp:823 msgid "" -"Enter your filament cost per kg here. This is only for statistical " -"information." +"Enter your filament cost per kg here. This is only for statistical information." msgstr "" "Введите стоимость прутка за 1 кг. Это необходимо только для статистической " "информации." -#: src/libslic3r/PrintConfig.cpp:807 +#: src/libslic3r/PrintConfig.cpp:824 msgid "money/kg" -msgstr "денег/кг" +msgstr "цена/кг" -#: src/libslic3r/PrintConfig.cpp:812 +#: src/libslic3r/PrintConfig.cpp:829 msgid "Spool weight" -msgstr "Вес катушки" +msgstr "Вес пустой катушки" -#: src/libslic3r/PrintConfig.cpp:813 +#: src/libslic3r/PrintConfig.cpp:830 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " -"filament spool before printing and one may compare the measured weight with " -"the calculated weight of the filament with the spool to find out whether the " -"amount of filament on the spool is sufficient to finish the print." +"filament spool before printing and one may compare the measured weight with the " +"calculated weight of the filament with the spool to find out whether the amount of " +"filament on the spool is sufficient to finish the print." msgstr "" +"Введите вес пустой катушки. Чтобы выяснить, хватит ли прутка на катушке для завершения печати, " +"можно перед началом печати взвесить частично израсходованную катушку с прутком и сравнить этот " +"вес с весом прутка (с катушкой), рассчитанным в процессе нарезки модели." -#: src/libslic3r/PrintConfig.cpp:817 +#: src/libslic3r/PrintConfig.cpp:834 msgid "g" msgstr "г" -#: src/libslic3r/PrintConfig.cpp:826 src/libslic3r/PrintConfig.cpp:2783 +#: src/libslic3r/PrintConfig.cpp:843 src/libslic3r/PrintConfig.cpp:2815 msgid "(Unknown)" msgstr "(Неизвестно)" -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:847 msgid "Fill angle" msgstr "Угол печати заполнения" -#: src/libslic3r/PrintConfig.cpp:832 +#: src/libslic3r/PrintConfig.cpp:849 msgid "" -"Default base angle for infill orientation. Cross-hatching will be applied to " -"this. Bridges will be infilled using the best direction Slic3r can detect, " -"so this setting does not affect them." +"Default base angle for infill orientation. Cross-hatching will be applied to this. " +"Bridges will be infilled using the best direction Slic3r can detect, so this " +"setting does not affect them." msgstr "" "Базовый угол для ориентации шаблона заполнения. Для этого будет применяться " -"штриховка крест-накрест. Для мостов будет использоваться лучший тип " -"заполнения, так что этот параметр не влияет на них." +"штриховка крест-накрест. Для мостов будет использоваться лучший тип заполнения, так " +"что этот параметр не влияет на них." -#: src/libslic3r/PrintConfig.cpp:844 +#: src/libslic3r/PrintConfig.cpp:861 msgid "Fill density" msgstr "Плотность заполнения" -#: src/libslic3r/PrintConfig.cpp:846 +#: src/libslic3r/PrintConfig.cpp:863 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" "Плотность внутреннего заполнения, выраженная в диапазоне 0% - 100%. Чем выше " -"процент заполнения, тем крепче получается объект, но печатается она при этом " +"процент заполнения, тем крепче получается модель, но печатается она при этом " "гораздо дольше." -#: src/libslic3r/PrintConfig.cpp:881 +#: src/libslic3r/PrintConfig.cpp:898 msgid "Fill pattern" msgstr "Шаблон заполнения" -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:900 msgid "Fill pattern for general low-density infill." -msgstr "Задаёт рисунок, используемый для уменьшения плотности заполнения." +msgstr "Задаёт то каким рисунком будет напечатано заполнение." -#: src/libslic3r/PrintConfig.cpp:903 +#: src/libslic3r/PrintConfig.cpp:920 msgid "Grid" msgstr "Сетка" -#: src/libslic3r/PrintConfig.cpp:904 +#: src/libslic3r/PrintConfig.cpp:921 msgid "Triangles" msgstr "Треугольники" -#: src/libslic3r/PrintConfig.cpp:905 +#: src/libslic3r/PrintConfig.cpp:922 msgid "Stars" msgstr "Звезды" -#: src/libslic3r/PrintConfig.cpp:906 +#: src/libslic3r/PrintConfig.cpp:923 msgid "Cubic" -msgstr "Куб" +msgstr "Кубический" -#: src/libslic3r/PrintConfig.cpp:907 +#: src/libslic3r/PrintConfig.cpp:924 msgid "Line" msgstr "Линии" -#: src/libslic3r/PrintConfig.cpp:909 src/libslic3r/PrintConfig.cpp:2206 +#: src/libslic3r/PrintConfig.cpp:926 src/libslic3r/PrintConfig.cpp:2238 msgid "Honeycomb" msgstr "Медовые соты" -#: src/libslic3r/PrintConfig.cpp:910 +#: src/libslic3r/PrintConfig.cpp:927 msgid "3D Honeycomb" msgstr "3D соты" -#: src/libslic3r/PrintConfig.cpp:911 +#: src/libslic3r/PrintConfig.cpp:928 msgid "Gyroid" -msgstr "Гироидное" +msgstr "Гироидный" -#: src/libslic3r/PrintConfig.cpp:915 +#: src/libslic3r/PrintConfig.cpp:932 msgid "Adaptive Cubic" -msgstr "" +msgstr "Динамический куб" -#: src/libslic3r/PrintConfig.cpp:916 +#: src/libslic3r/PrintConfig.cpp:933 msgid "Support Cubic" -msgstr "" +msgstr "Динам. куб. поддержка" -#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:929 -#: src/libslic3r/PrintConfig.cpp:939 src/libslic3r/PrintConfig.cpp:973 +#: src/libslic3r/PrintConfig.cpp:937 src/libslic3r/PrintConfig.cpp:946 +#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:990 msgid "First layer" msgstr "Первый слой" -#: src/libslic3r/PrintConfig.cpp:921 +#: src/libslic3r/PrintConfig.cpp:938 msgid "" -"This is the acceleration your printer will use for first layer. Set zero to " -"disable acceleration control for first layer." +"This is the acceleration your printer will use for first layer. Set zero to disable " +"acceleration control for first layer." msgstr "" -"Ускорение, которое принтер будет использовать для печати первого слоя. " -"Установить 0, чтобы отключить управление ускорением для первого слоя." +"Ускорение, которое принтер будет использовать для печати первого слоя. Установить " +"0, чтобы отключить управление ускорением для первого слоя." -#: src/libslic3r/PrintConfig.cpp:930 +#: src/libslic3r/PrintConfig.cpp:947 msgid "First layer bed temperature" -msgstr "Температура платформы на первом слое" +msgstr "Температура стола на первом слое" -#: src/libslic3r/PrintConfig.cpp:931 +#: src/libslic3r/PrintConfig.cpp:948 msgid "" -"Heated build plate temperature for the first layer. Set this to zero to " -"disable bed temperature control commands in the output." +"Heated build plate temperature for the first layer. Set this to zero to disable bed " +"temperature control commands in the output." msgstr "" -"Температура платформы для первого слоя. Установите 0, чтобы " -"отключить команды управления температурой платформы в результате." +"Температура подогреваемого стола для первого слоя. Установите 0, чтобы отключить " +"команды управления температурой стола на выходе." -#: src/libslic3r/PrintConfig.cpp:941 +#: src/libslic3r/PrintConfig.cpp:958 msgid "" -"Set this to a non-zero value to set a manual extrusion width for first " -"layer. You can use this to force fatter extrudates for better adhesion. If " -"expressed as percentage (for example 120%) it will be computed over first " -"layer height. If set to zero, it will use the default extrusion width." +"Set this to a non-zero value to set a manual extrusion width for first layer. You " +"can use this to force fatter extrudates for better adhesion. If expressed as " +"percentage (for example 120%) it will be computed over first layer height. If set " +"to zero, it will use the default extrusion width." msgstr "" "Установите значение отличное от 0, чтобы вручную задать ширину экструзии для " -"первого слоя. Вы можете поставить большее значение, чем по умолчанию, для " -"лучшей адгезии. Если задано в процентах, параметр вычисляется относительно " -"высоты слоя. При 0, будет использоваться \"Ширина экструзии по умолчанию\"." +"первого слоя. Вы можете поставить большее значение, чем по умолчанию, для лучшей " +"адгезии. Если задано в процентах, параметр вычисляется относительно высоты слоя. " +"При 0, будет использоваться \"Ширина экструзии по умолчанию\"." -#: src/libslic3r/PrintConfig.cpp:954 +#: src/libslic3r/PrintConfig.cpp:971 msgid "" -"When printing with very low layer heights, you might still want to print a " -"thicker bottom layer to improve adhesion and tolerance for non perfect build " -"plates. This can be expressed as an absolute value or as a percentage (for " -"example: 150%) over the default layer height." +"When printing with very low layer heights, you might still want to print a thicker " +"bottom layer to improve adhesion and tolerance for non perfect build plates. This " +"can be expressed as an absolute value or as a percentage (for example: 150%) over " +"the default layer height." msgstr "" -"При печати очень тонкими слоями на неидеально ровных платформах " -"для лучшего прилипания и удерживаемости может потребоваться печать нижнего" -" слоя шире обычного. " -"Эта величина задаётся абсолютным значением или в процентах (например, 150%) " -"от высоты слоя по умолчанию." +"Высота первого (самого нижнего) слоя. Как правило, задаётся немного больше \"Высота " +"слоя\" для лучшего закрепления (адгезии) модели на столе. Эта величина так же не " +"может быть больше диаметра сопла." -#: src/libslic3r/PrintConfig.cpp:963 +#: src/libslic3r/PrintConfig.cpp:980 msgid "First layer speed" msgstr "Скорость печати первого слоя" -#: src/libslic3r/PrintConfig.cpp:964 +#: src/libslic3r/PrintConfig.cpp:981 msgid "" -"If expressed as absolute value in mm/s, this speed will be applied to all " -"the print moves of the first layer, regardless of their type. If expressed " -"as a percentage (for example: 40%) it will scale the default speeds." +"If expressed as absolute value in mm/s, this speed will be applied to all the print " +"moves of the first layer, regardless of their type. If expressed as a percentage " +"(for example: 40%) it will scale the default speeds." msgstr "" -"Если задано абсолютным значением в мм/с, эта скорость будет применена ко " -"всем перемещениям при печати первого слоя, независимо от их типа. Если " -"задано в процентах (например, 40%), то параметр вычисляется относительно " -"скоростей по умолчанию." +"Если задано в абсолютном значении (мм/с), эта скорость будет применена ко всем " +"перемещениям при печати первого слоя, независимо от их типа. Если задано в " +"процентах, параметр вычисляется относительно выставленных скоростей по умолчанию. " +"Как правило, для лучшего прилипания модели к столу задаётся меньше остальных на " +"30-50%." -#: src/libslic3r/PrintConfig.cpp:974 +#: src/libslic3r/PrintConfig.cpp:991 msgid "First layer nozzle temperature" +msgstr "Температура сопла на первом слое" + +#: src/libslic3r/PrintConfig.cpp:992 +msgid "" +"Nozzle temperature for the first layer. If you want to control temperature manually " +"during print, set this to zero to disable temperature control commands in the " +"output G-code." msgstr "" +"Температура сопла при печати первого слоя. Если хотите контролировать температуру " +"во время печати вручную, установите 0 для отключения команд управления температурой " +"в выходном G-коде." + +#: src/libslic3r/PrintConfig.cpp:1000 +msgid "Full fan speed at layer" +msgstr "Полная скорость вентилятора на слое" -#: src/libslic3r/PrintConfig.cpp:975 +#: src/libslic3r/PrintConfig.cpp:1001 msgid "" -"Nozzle temperature for the first layer. If you want to control temperature " -"manually during print, set this to zero to disable temperature control " -"commands in the output G-code." +"Fan speed will be ramped up linearly from zero at layer \"disable_fan_first_layers" +"\" to maximum at layer \"full_fan_speed_layer\". \"full_fan_speed_layer\" will be " +"ignored if lower than \"disable_fan_first_layers\", in which case the fan will be " +"running at maximum allowed speed at layer \"disable_fan_first_layers\" + 1." msgstr "" +"Скорость вентилятора будет линейно увеличиваться от нуля на слое " +"«disable_fan_first_layers» до максимальной на слое «full_fan_speed_layer». " +"\"full_fan_speed_layer\" будет игнорироваться, если она ниже, чем " +"\"disable_fan_first_layers\", и в этом случае вентилятор будет работать с " +"максимально допустимой скоростью на слое \"disable_fan_first_layers\" +1." -#: src/libslic3r/PrintConfig.cpp:985 +#: src/libslic3r/PrintConfig.cpp:1013 msgid "" -"Speed for filling small gaps using short zigzag moves. Keep this reasonably " -"low to avoid too much shaking and resonance issues. Set zero to disable gaps " -"filling." +"Speed for filling small gaps using short zigzag moves. Keep this reasonably low to " +"avoid too much shaking and resonance issues. Set zero to disable gaps filling." msgstr "" -"Скорость заполнения небольших поверхностей (пробелов). Печать происходит " -"быстрыми зигзагообразными движениями, в результате, весь принтер может " -"прилично трясти. Задавайте низкие значения, чтобы избежать этого. Установите " -"0, чтобы отключить заполнение пробелов." +"Скорость заполнения небольших поверхностей (пробелов). Печать происходит быстрыми " +"зигзагообразными движениями, в результате, весь принтер может прилично трясти. " +"Задавайте низкие значения, чтобы избежать этого. Установите 0, чтобы отключить " +"заполнение пробелов." -#: src/libslic3r/PrintConfig.cpp:993 +#: src/libslic3r/PrintConfig.cpp:1021 msgid "Verbose G-code" msgstr "Подробный G-код" -#: src/libslic3r/PrintConfig.cpp:994 +#: src/libslic3r/PrintConfig.cpp:1022 msgid "" "Enable this to get a commented G-code file, with each line explained by a " -"descriptive text. If you print from SD card, the additional weight of the " -"file could make your firmware slow down." +"descriptive text. If you print from SD card, the additional weight of the file " +"could make your firmware slow down." msgstr "" -"Включите эту опцию, чтобы в каждой строке файла G-кода, присутствовал " -"комментарий с поясняющим текстом. При печати с SD-карты, скорость чтение " -"данных вашей прошивкой может снизится за счёт увеличения размера файла." +"Включите эту опцию, чтобы в каждой строке G-код файла, присутствовал комментарий с " +"поясняющим текстом. При печати с SD-карты, скорость чтение данных вашей прошивкой " +"может снизится за счёт увеличения размера файла." -#: src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1029 msgid "G-code flavor" -msgstr "Вариант G-кода" +msgstr "Тип G-кода" -#: src/libslic3r/PrintConfig.cpp:1002 +#: src/libslic3r/PrintConfig.cpp:1030 msgid "" "Some G/M-code commands, including temperature control and others, are not " -"universal. Set this option to your printer's firmware to get a compatible " -"output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any " -"extrusion value at all." +"universal. Set this option to your printer's firmware to get a compatible output. " +"The \"No extrusion\" flavor prevents PrusaSlicer from exporting any extrusion value " +"at all." msgstr "" -"Некоторые команды G/M-кода, такие как контроль температуры и другие, не " -"являются универсальными. Выберите тип прошивки вашего принтера, чтобы " -"получить совместимый результат. Вариант «Без экструзии» не позволяет " -"PrusaSlicer экспортировать какие-либо значения экструзии." +"Некоторые команды G/M-кода, такие как контроль температуры и другие, не являются " +"универсальными. Выберите тип прошивки вашего принтера, чтобы получить " +"совместимость. Параметр \"Без экструзии\" не позволяет PrusaSlicer экспортировать " +"какие-либо значения экструзии." -#: src/libslic3r/PrintConfig.cpp:1027 +#: src/libslic3r/PrintConfig.cpp:1055 msgid "No extrusion" msgstr "Без экструзии" -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Label objects" -msgstr "Помечать объекты" +msgstr "Название моделей" -#: src/libslic3r/PrintConfig.cpp:1033 +#: src/libslic3r/PrintConfig.cpp:1061 msgid "" -"Enable this to add comments into the G-Code labeling print moves with what " -"object they belong to, which is useful for the Octoprint CancelObject " -"plugin. This settings is NOT compatible with Single Extruder Multi Material " -"setup and Wipe into Object / Wipe into Infill." +"Enable this to add comments into the G-Code labeling print moves with what object " +"they belong to, which is useful for the Octoprint CancelObject plugin. This " +"settings is NOT compatible with Single Extruder Multi Material setup and Wipe into " +"Object / Wipe into Infill." msgstr "" -"Если включено, то в строки G-кода перемещения добавляются комментарии об " -"объекте, которому они принадлежат, что полезно для модуля Octoprint " -"CancelObject. Эта настройка НЕ совместима с Single Extruder Multi Material " -"setup и Wipe into Object / Wipe into Infill." +"Включите эту опцию, чтобы добавить комментарии в G-код с указанием того, к какой " +"модели он принадлежит, что полезно для плагина Octoprint CancelObject. Эта " +"настройка не совместима с настройкой \"Мультиматериальный одиночный экструдер\" и " +"\"Очистка в модель\" / \"Очистка в заполнение модели\"." -#: src/libslic3r/PrintConfig.cpp:1040 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "High extruder current on filament swap" -msgstr "" +msgstr "Повышение тока экструдера при замене прутка" -#: src/libslic3r/PrintConfig.cpp:1041 +#: src/libslic3r/PrintConfig.cpp:1069 msgid "" -"It may be beneficial to increase the extruder motor current during the " -"filament exchange sequence to allow for rapid ramming feed rates and to " -"overcome resistance when loading a filament with an ugly shaped tip." +"It may be beneficial to increase the extruder motor current during the filament " +"exchange sequence to allow for rapid ramming feed rates and to overcome resistance " +"when loading a filament with an ugly shaped tip." msgstr "" +"Это может быть полезно для увеличения тока двигателя экструдера во время замены " +"прутка, чтобы быстро увеличить скорость подачи и преодолеть сопротивление " +"при загрузке прутка с плохой формой кончика." -#: src/libslic3r/PrintConfig.cpp:1049 +#: src/libslic3r/PrintConfig.cpp:1077 msgid "" -"This is the acceleration your printer will use for infill. Set zero to " -"disable acceleration control for infill." +"This is the acceleration your printer will use for infill. Set zero to disable " +"acceleration control for infill." msgstr "" -"Ускорение, которое принтер будет использовать для заполнения. Установить 0, " -"чтобы отключить управление ускорением для заполнения." +"Ускорение, которое принтер будет использовать для заполнения. Установить 0, чтобы " +"отключить управление ускорением для заполнения." -#: src/libslic3r/PrintConfig.cpp:1057 +#: src/libslic3r/PrintConfig.cpp:1085 msgid "Combine infill every" msgstr "Объединять заполнение каждые" -#: src/libslic3r/PrintConfig.cpp:1059 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" -"This feature allows to combine infill and speed up your print by extruding " -"thicker infill layers while preserving thin perimeters, thus accuracy." +"This feature allows to combine infill and speed up your print by extruding thicker " +"infill layers while preserving thin perimeters, thus accuracy." msgstr "" -"Для экономии времени печати есть возможность печатать заполнение не на " -"каждом слое, а скажем, на двух или трёх слоях сразу. По умолчанию стоит 1, " -"то есть печатать заполнение в каждом слое. Если, например, поставить 2, " -"тогда на два слоя периметра будет печататься один слой заполнения удвоенной " -"толщины. При этом сохраняются тонкие периметры, и тем самым точность." +"Для экономии времени печати есть возможность печатать заполнение не на каждом слое, " +"а скажем, на двух или трёх слоях сразу. По умолчанию стоит 1, то есть печатать " +"заполнение в каждом слое. Если, например, поставить 2, тогда на два слоя периметра " +"будет печататься один слой заполнения удвоенной толщины. При этом сохраняются " +"тонкие периметры, и тем самым точность." -#: src/libslic3r/PrintConfig.cpp:1062 +#: src/libslic3r/PrintConfig.cpp:1090 msgid "Combine infill every n layers" -msgstr "Объединять заполнение каждые" +msgstr "" +"Объединять заполнение каждые" -#: src/libslic3r/PrintConfig.cpp:1068 +#: src/libslic3r/PrintConfig.cpp:1096 msgid "Length of the infill anchor" -msgstr "" +msgstr "Длина привязок разреженного заполнения" -#: src/libslic3r/PrintConfig.cpp:1070 +#: src/libslic3r/PrintConfig.cpp:1098 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " -"additional perimeter. If expressed as percentage (example: 15%) it is " -"calculated over infill extrusion width. PrusaSlicer tries to connect two " -"close infill lines to a short perimeter segment. If no such perimeter " -"segment shorter than infill_anchor_max is found, the infill line is " -"connected to a perimeter segment at just one side and the length of the " -"perimeter segment taken is limited to this parameter, but no longer than " -"anchor_length_max. Set this parameter to zero to disable anchoring " -"perimeters connected to a single infill line." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:1085 +"additional perimeter. If expressed as percentage (example: 15%) it is calculated " +"over infill extrusion width. PrusaSlicer tries to connect two close infill lines to " +"a short perimeter segment. If no such perimeter segment shorter than " +"infill_anchor_max is found, the infill line is connected to a perimeter segment at " +"just one side and the length of the perimeter segment taken is limited to this " +"parameter, but no longer than anchor_length_max. Set this parameter to zero to " +"disable anchoring perimeters connected to a single infill line." +msgstr "" +"Соединять линию заполнения с внутренним периметром с помощью короткого отрезка " +"дополнительного периметра (привязок). Если выражено в процентах (например 15%), то " +"она вычисляется по ширине экструзии заполнения. PrusaSlicer пытается соединить две " +"ближайшие линии заполнения с коротким отрезком периметра. Если не найдено такого " +"отрезка периметра короче \"Максимальной длины привязок разреженного заполнения" +"\" (anchor_length_max), то линия заполнения соединяется с отрезком периметра только " +"с одной стороны, а длина отрезка периметра ограничена этим параметром, но не больше " +"\"Максимальной длины привязок разреженного заполнения\" (anchor_length_max). " +"Установите этот параметр равным нулю для отключения привязок периметров, " +"соединённых к одной линии заполнения." + +#: src/libslic3r/PrintConfig.cpp:1113 msgid "0 (no open anchors)" -msgstr "" +msgstr "0 (нет открытых привязок)" -#: src/libslic3r/PrintConfig.cpp:1090 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1118 src/libslic3r/PrintConfig.cpp:1140 msgid "1000 (unlimited)" -msgstr "" +msgstr "1000 (неограниченно)" -#: src/libslic3r/PrintConfig.cpp:1095 +#: src/libslic3r/PrintConfig.cpp:1123 msgid "Maximum length of the infill anchor" -msgstr "" +msgstr "Максимальная длина привязок разреженного заполнения" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1125 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " -"additional perimeter. If expressed as percentage (example: 15%) it is " -"calculated over infill extrusion width. PrusaSlicer tries to connect two " -"close infill lines to a short perimeter segment. If no such perimeter " -"segment shorter than this parameter is found, the infill line is connected " -"to a perimeter segment at just one side and the length of the perimeter " -"segment taken is limited to infill_anchor, but no longer than this " -"parameter. Set this parameter to zero to disable anchoring." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:1107 +"additional perimeter. If expressed as percentage (example: 15%) it is calculated " +"over infill extrusion width. PrusaSlicer tries to connect two close infill lines to " +"a short perimeter segment. If no such perimeter segment shorter than this parameter " +"is found, the infill line is connected to a perimeter segment at just one side and " +"the length of the perimeter segment taken is limited to infill_anchor, but no " +"longer than this parameter. Set this parameter to zero to disable anchoring." +msgstr "" +"Соединять линию заполнения с внутренним периметром с помощью короткого отрезка " +"дополнительного периметра (привязок). Если выражено в процентах (например 15%), то " +"она вычисляется по ширине экструзии заполнения. PrusaSlicer пытается соединить две " +"ближайшие линии заполнения с коротким отрезком периметра. Если не найдено такого " +"отрезка периметра короче этого параметра, линия заполнения соединяется с отрезком " +"периметра только с одной стороны, а длина отрезка периметра ограничена \"Длиной " +"привязок разреженного заполнения\" (infill_anchor), но не больше этого параметра. " +"Установите этот параметр равным нулю для отключения привязок." + +#: src/libslic3r/PrintConfig.cpp:1135 msgid "0 (not anchored)" -msgstr "" +msgstr "0 (без привязок)" -#: src/libslic3r/PrintConfig.cpp:1117 +#: src/libslic3r/PrintConfig.cpp:1145 msgid "Infill extruder" msgstr "Экструдер заполнения" -#: src/libslic3r/PrintConfig.cpp:1119 +#: src/libslic3r/PrintConfig.cpp:1147 msgid "The extruder to use when printing infill." msgstr "Номер экструдера, которым печатается заполнение." -#: src/libslic3r/PrintConfig.cpp:1127 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill. If " -"left zero, default extrusion width will be used if set, otherwise 1.125 x " -"nozzle diameter will be used. You may want to use fatter extrudates to speed " -"up the infill and make your parts stronger. If expressed as percentage (for " -"example 90%) it will be computed over layer height." +"Set this to a non-zero value to set a manual extrusion width for infill. If left " +"zero, default extrusion width will be used if set, otherwise 1.125 x nozzle " +"diameter will be used. You may want to use fatter extrudates to speed up the infill " +"and make your parts stronger. If expressed as percentage (for example 90%) it will " +"be computed over layer height." msgstr "" "Установите значение отличное от 0, чтобы вручную задать ширину экструзии для " -"заполнения. Если оставить 0, будет использоваться \"Ширина экструзии по " -"умолчанию\" - если она задана, в противном случае будет использоваться 1,125 " -"x диаметра сопла. Вы можете использовать сопла большего диаметра, чтобы " -"ускорить заполнение и сделать ваши детали прочнее. Если задано в процентах, " -"параметр вычисляется относительно высоты слоя." +"заполнения. Если оставить 0, будет использоваться \"Ширина экструзии по умолчанию\" " +"- если она задана, в противном случае будет использоваться 1,125 x диаметра сопла. " +"Вы можете использовать сопла большего диаметра, чтобы ускорить заполнение и сделать " +"ваши детали прочнее. Если задано в процентах, параметр вычисляется относительно " +"высоты слоя." -#: src/libslic3r/PrintConfig.cpp:1137 +#: src/libslic3r/PrintConfig.cpp:1165 msgid "Infill before perimeters" msgstr "Сначала печатать заполнение" -#: src/libslic3r/PrintConfig.cpp:1138 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "" -"This option will switch the print order of perimeters and infill, making the " -"latter first." +"This option will switch the print order of perimeters and infill, making the latter " +"first." msgstr "" "Изменяет порядок печати слоёв. Обычно сначала печатается периметр, а потом " -"заполнение. Включив этот параметр, будет сначала печатаете заполнение, а " -"потом периметр. Имеет смысл, если периметр печатается в один слой." +"заполнение. Включив этот параметр, сначала будет печататься заполнение, а потом " +"периметр. Имеет смысл, если периметр печатается в один слой." -#: src/libslic3r/PrintConfig.cpp:1143 +#: src/libslic3r/PrintConfig.cpp:1171 msgid "Only infill where needed" msgstr "Заполнение только там, где нужно" -#: src/libslic3r/PrintConfig.cpp:1145 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "" -"This option will limit infill to the areas actually needed for supporting " -"ceilings (it will act as internal support material). If enabled, slows down " -"the G-code generation due to the multiple checks involved." +"This option will limit infill to the areas actually needed for supporting ceilings " +"(it will act as internal support material). If enabled, slows down the G-code " +"generation due to the multiple checks involved." msgstr "" -"Slic3r проанализирует модель и выберет где именно необходимо заполнение для " -"того, чтобы поддержать внутренние потолки и свесы. Полезно для уменьшения " -"времени и материалов, но параметр очень влияет на прочность модели, поэтому " -"пользоваться надо с осторожностью. Если включено, замедляет генерацию G-кода " -"из-за многочисленных расчётов." +"PrusaSlicer проанализирует модель и выберет где именно необходимо заполнение для " +"того, чтобы поддержать внутренние потолки и свесы. Полезно для уменьшения времени и " +"материалов, но параметр очень влияет на прочность модели, поэтому пользоваться надо " +"с осторожностью. Если включено, замедляет генерацию G-кода из-за многочисленных " +"расчётов." -#: src/libslic3r/PrintConfig.cpp:1152 +#: src/libslic3r/PrintConfig.cpp:1180 msgid "Infill/perimeters overlap" -msgstr "Перекрытие заполнения с линиями периметра" +msgstr "Перекрытие линий заполнения с линиями периметра" -#: src/libslic3r/PrintConfig.cpp:1154 +#: src/libslic3r/PrintConfig.cpp:1182 msgid "" -"This setting applies an additional overlap between infill and perimeters for " -"better bonding. Theoretically this shouldn't be needed, but backlash might " -"cause gaps. If expressed as percentage (example: 15%) it is calculated over " -"perimeter extrusion width." +"This setting applies an additional overlap between infill and perimeters for better " +"bonding. Theoretically this shouldn't be needed, but backlash might cause gaps. If " +"expressed as percentage (example: 15%) it is calculated over perimeter extrusion " +"width." msgstr "" -"Параметр указывает на сколько миллиметров или процентов печать заполнения " -"будет перекрывать периметры для лучшего соединения. Теоретически надобности " -"в этом нет, но люфты при движении могут вызывать пробелы при печати. Если " -"задано в процентах, параметр вычисляется относительно ширины экструзии " -"периметра." +"Параметр указывает на сколько миллиметров или процентов печать заполнения будет " +"перекрывать периметры для лучшего соединения. Теоретически надобности в этом нет, " +"но люфты при движении могут вызывать пробелы при печати. Если задано в процентах, " +"параметр вычисляется относительно ширины экструзии периметра." -#: src/libslic3r/PrintConfig.cpp:1165 +#: src/libslic3r/PrintConfig.cpp:1193 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" "Скорость печати внутреннего заполнения. Если установлено 0, то слайсер " "автоматически настраивает этот параметр." -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Inherits profile" msgstr "Наследует профиль" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1202 msgid "Name of the profile, from which this profile inherits." msgstr "Имя профиля, от которого наследуется данный профиль." -#: src/libslic3r/PrintConfig.cpp:1187 +#: src/libslic3r/PrintConfig.cpp:1215 msgid "Interface shells" msgstr "Связующие оболочки" -#: src/libslic3r/PrintConfig.cpp:1188 +#: src/libslic3r/PrintConfig.cpp:1216 msgid "" -"Force the generation of solid shells between adjacent materials/volumes. " -"Useful for multi-extruder prints with translucent materials or manual " -"soluble support material." +"Force the generation of solid shells between adjacent materials/volumes. Useful for " +"multi-extruder prints with translucent materials or manual soluble support material." msgstr "" -"Принудительное создание замкнутых (сплошных) оболочек между смежными " -"материалами/объёмами. Полезно для многоэкструдерных принтеров при печати " -"полупрозрачными материалами или растворимыми поддержками. Помогает избежать " -"диффузию материалов." +"Принудительное создание замкнутых (сплошных) оболочек между смежными материалами/" +"объёмами. Полезно для многоэкструдерных принтеров при печати полупрозрачными " +"материалами или растворимой поддержкой. Помогает избежать диффузию материалов." -#: src/libslic3r/PrintConfig.cpp:1196 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Enable ironing" -msgstr "Включить разглаживание" +msgstr "Вкл. разглаживание" -#: src/libslic3r/PrintConfig.cpp:1197 -msgid "" -"Enable ironing of the top layers with the hot print head for smooth surface" +#: src/libslic3r/PrintConfig.cpp:1225 +msgid "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" +"Включение разглаживания верхних слоёв с помощью горячего сопла для получения " +"гладкой поверхности." -#: src/libslic3r/PrintConfig.cpp:1203 src/libslic3r/PrintConfig.cpp:1205 +#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1233 msgid "Ironing Type" msgstr "Тип разглаживания" -#: src/libslic3r/PrintConfig.cpp:1210 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "All top surfaces" -msgstr "" +msgstr "Все верхние поверх." -#: src/libslic3r/PrintConfig.cpp:1211 +#: src/libslic3r/PrintConfig.cpp:1239 msgid "Topmost surface only" -msgstr "" +msgstr "Самые верхние поверх." -#: src/libslic3r/PrintConfig.cpp:1212 +#: src/libslic3r/PrintConfig.cpp:1240 msgid "All solid surfaces" -msgstr "" +msgstr "Все сплошные поверх." -#: src/libslic3r/PrintConfig.cpp:1217 +#: src/libslic3r/PrintConfig.cpp:1245 msgid "Flow rate" -msgstr "Скорость потока" +msgstr "Поток" -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1247 msgid "Percent of a flow rate relative to object's normal layer height." -msgstr "" +msgstr "Процент потока разглаживания относительно нормальной высоты слоя модели." -#: src/libslic3r/PrintConfig.cpp:1227 +#: src/libslic3r/PrintConfig.cpp:1255 msgid "Spacing between ironing passes" -msgstr "Расстояние между линиями поддержки" +msgstr "Расстояние между линиями разглаживания" -#: src/libslic3r/PrintConfig.cpp:1229 +#: src/libslic3r/PrintConfig.cpp:1257 msgid "Distance between ironing lines" -msgstr "" +msgstr "Расстояние между линиями разглаживания." -#: src/libslic3r/PrintConfig.cpp:1246 +#: src/libslic3r/PrintConfig.cpp:1274 msgid "" -"This custom code is inserted at every layer change, right after the Z move " -"and before the extruder moves to the first layer point. Note that you can " -"use placeholder variables for all Slic3r settings as well as [layer_num] and " -"[layer_z]." +"This custom code is inserted at every layer change, right after the Z move and " +"before the extruder moves to the first layer point. Note that you can use " +"placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]." msgstr "" -"Этот пользовательский код вставляется при каждой смене слоя, сразу после " -"движения оси Z и до того, как экструдер переместиться в точку первого слоя. " -"Обратите внимание, что вы можете использовать шаблонные переменные для всех " -"параметров Slic3r, в том числе [layer_num] и [layer_z]." +"Этот пользовательский код вставляется при каждой смене слоя, сразу после движения " +"оси Z и до того, как экструдер переместиться в точку первого слоя. Обратите " +"внимание, что вы можете использовать шаблонные переменные для всех параметров " +"PrusaSlicer в том числе [layer_num] и [layer_z]." -#: src/libslic3r/PrintConfig.cpp:1257 +#: src/libslic3r/PrintConfig.cpp:1285 msgid "Supports remaining times" -msgstr "" +msgstr "Поддержка точного времени печати" -#: src/libslic3r/PrintConfig.cpp:1258 +#: src/libslic3r/PrintConfig.cpp:1286 msgid "" -"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " -"intervals into the G-code to let the firmware show accurate remaining time. " -"As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 " -"firmware supports M73 Qxx Sxx for the silent mode." +"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute intervals into " +"the G-code to let the firmware show accurate remaining time. As of now only the " +"Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 firmware supports M73 Qxx Sxx " +"for the silent mode." msgstr "" +"Добавляет команду М73 P[процентов напечатано в нормальном режиме] R[оставшееся " +"время в секундах в нормальном режиме] с интервалом в 1 минуту в G-код, чтобы " +"прошивка отображала оставшееся время печати. На данный момент только прошивка Prusa " +"i3 MK3 распознает команду M73. Также прошивка i3 MK3 поддерживает команду M73 Qxx " +"Sxx для тихого режима печати." -#: src/libslic3r/PrintConfig.cpp:1266 +#: src/libslic3r/PrintConfig.cpp:1294 msgid "Supports stealth mode" msgstr "Поддержка тихого режима" -#: src/libslic3r/PrintConfig.cpp:1267 +#: src/libslic3r/PrintConfig.cpp:1295 msgid "The firmware supports stealth mode" -msgstr "" +msgstr "Прошивка должна поддерживать тихий режим" -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1300 msgid "How to apply limits" -msgstr "Как применять ограничения" +msgstr "Как применять ограничения принтера" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "Purpose of Machine Limits" -msgstr "" +msgstr "Назначение ограничений принтера" -#: src/libslic3r/PrintConfig.cpp:1275 +#: src/libslic3r/PrintConfig.cpp:1303 msgid "How to apply the Machine Limits" -msgstr "" +msgstr "Как применять ограничения принтера" -#: src/libslic3r/PrintConfig.cpp:1280 +#: src/libslic3r/PrintConfig.cpp:1308 msgid "Emit to G-code" -msgstr "" +msgstr "Отправлять в G-код" -#: src/libslic3r/PrintConfig.cpp:1281 +#: src/libslic3r/PrintConfig.cpp:1309 msgid "Use for time estimate" -msgstr "" +msgstr "Использовать для оценки времени" -#: src/libslic3r/PrintConfig.cpp:1282 +#: src/libslic3r/PrintConfig.cpp:1310 msgid "Ignore" -msgstr "" +msgstr "Игнорировать" -#: src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "Maximum feedrate X" -msgstr "Макс. скорость подачи X" +msgstr "Максимальная скорость перемещения по X" -#: src/libslic3r/PrintConfig.cpp:1306 +#: src/libslic3r/PrintConfig.cpp:1334 msgid "Maximum feedrate Y" -msgstr "Макс. скорость подачи Y" +msgstr "Максимальная скорость перемещения по Y" -#: src/libslic3r/PrintConfig.cpp:1307 +#: src/libslic3r/PrintConfig.cpp:1335 msgid "Maximum feedrate Z" -msgstr "Макс. скорость подачи Z" +msgstr "Максимальная скорость перемещения по Z" -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1336 msgid "Maximum feedrate E" -msgstr "Макс. скорость подачи E" +msgstr "Максимальная скорость подачи у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1311 +#: src/libslic3r/PrintConfig.cpp:1339 msgid "Maximum feedrate of the X axis" -msgstr "Максимальная скорость подачи по оси X" +msgstr "Максимальная скорость перемещения по оси X" -#: src/libslic3r/PrintConfig.cpp:1312 +#: src/libslic3r/PrintConfig.cpp:1340 msgid "Maximum feedrate of the Y axis" -msgstr "Максимальная скорость подачи по оси Y" +msgstr "Максимальная скорость перемещения по оси Y" -#: src/libslic3r/PrintConfig.cpp:1313 +#: src/libslic3r/PrintConfig.cpp:1341 msgid "Maximum feedrate of the Z axis" -msgstr "Максимальная скорость подачи по оси Z" +msgstr "Максимальная скорость перемещения по оси Z" -#: src/libslic3r/PrintConfig.cpp:1314 +#: src/libslic3r/PrintConfig.cpp:1342 msgid "Maximum feedrate of the E axis" -msgstr "Максимальная скорость подачи по оси E" +msgstr "Максимальная скорость подачи у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1322 +#: src/libslic3r/PrintConfig.cpp:1350 msgid "Maximum acceleration X" -msgstr "Макс. ускорение X" +msgstr "Максимальное ускорение по X" -#: src/libslic3r/PrintConfig.cpp:1323 +#: src/libslic3r/PrintConfig.cpp:1351 msgid "Maximum acceleration Y" -msgstr "Макс. ускорение Y" +msgstr "Максимальное ускорение по Y" -#: src/libslic3r/PrintConfig.cpp:1324 +#: src/libslic3r/PrintConfig.cpp:1352 msgid "Maximum acceleration Z" -msgstr "Макс. ускорение Z" +msgstr "Максимальное ускорение по Z" -#: src/libslic3r/PrintConfig.cpp:1325 +#: src/libslic3r/PrintConfig.cpp:1353 msgid "Maximum acceleration E" -msgstr "Макс. ускорение E" +msgstr "Максимальное ускорение подачи у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1328 +#: src/libslic3r/PrintConfig.cpp:1356 msgid "Maximum acceleration of the X axis" -msgstr "Максимальное ускорение по оси X" +msgstr "Максимальное ускорение при перемещении по оси X" -#: src/libslic3r/PrintConfig.cpp:1329 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "Maximum acceleration of the Y axis" -msgstr "Максимальное ускорение по оси Y" +msgstr "Максимальное ускорение при перемещении по оси Y" -#: src/libslic3r/PrintConfig.cpp:1330 +#: src/libslic3r/PrintConfig.cpp:1358 msgid "Maximum acceleration of the Z axis" -msgstr "Максимальное ускорение по оси Z" +msgstr "Максимальное ускорение при перемещении по оси Z" -#: src/libslic3r/PrintConfig.cpp:1331 +#: src/libslic3r/PrintConfig.cpp:1359 msgid "Maximum acceleration of the E axis" -msgstr "Максимальное ускорение по оси E" +msgstr "Максимальное ускорение подачи у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1339 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "Maximum jerk X" -msgstr "Максимальный рывок X" +msgstr "Максимальный рывок по X" -#: src/libslic3r/PrintConfig.cpp:1340 +#: src/libslic3r/PrintConfig.cpp:1368 msgid "Maximum jerk Y" -msgstr "Максимальный рывок Y" +msgstr "Максимальный рывок по Y" -#: src/libslic3r/PrintConfig.cpp:1341 +#: src/libslic3r/PrintConfig.cpp:1369 msgid "Maximum jerk Z" -msgstr "Максимальный рывок Z" +msgstr "Максимальный рывок по Z" -#: src/libslic3r/PrintConfig.cpp:1342 +#: src/libslic3r/PrintConfig.cpp:1370 msgid "Maximum jerk E" -msgstr "Максимальный рывок E" +msgstr "Максимальный рывок у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1345 +#: src/libslic3r/PrintConfig.cpp:1373 msgid "Maximum jerk of the X axis" msgstr "Максимальный рывок по оси X" -#: src/libslic3r/PrintConfig.cpp:1346 +#: src/libslic3r/PrintConfig.cpp:1374 msgid "Maximum jerk of the Y axis" msgstr "Максимальный рывок по оси Y" -#: src/libslic3r/PrintConfig.cpp:1347 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Maximum jerk of the Z axis" msgstr "Максимальный рывок по оси Z" -#: src/libslic3r/PrintConfig.cpp:1348 +#: src/libslic3r/PrintConfig.cpp:1376 msgid "Maximum jerk of the E axis" -msgstr "Максимальный рывок по оси E" +msgstr "Максимальный рывок у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1358 +#: src/libslic3r/PrintConfig.cpp:1386 msgid "Minimum feedrate when extruding" -msgstr "Минимальная скорость подачи при экструзии" +msgstr "Минимальная скорость перемещения при печати" -#: src/libslic3r/PrintConfig.cpp:1360 +#: src/libslic3r/PrintConfig.cpp:1388 msgid "Minimum feedrate when extruding (M205 S)" -msgstr "Минимальная скорость подачи при экструзии (M205 S)" +msgstr "Минимальная скорость перемещения при печати (M205 S)" -#: src/libslic3r/PrintConfig.cpp:1368 +#: src/libslic3r/PrintConfig.cpp:1396 msgid "Minimum travel feedrate" -msgstr "Скорость подачи при минимальных перемещениях" +msgstr "Минимальная скорость перемещения без печати" -#: src/libslic3r/PrintConfig.cpp:1370 +#: src/libslic3r/PrintConfig.cpp:1398 msgid "Minimum travel feedrate (M205 T)" -msgstr "Скорость подачи при минимальных перемещениях (M205 T)" +msgstr "Минимальная скорость перемещения без печати (M205 T)" -#: src/libslic3r/PrintConfig.cpp:1378 +#: src/libslic3r/PrintConfig.cpp:1406 msgid "Maximum acceleration when extruding" -msgstr "Макс. ускорение при выдавливании" +msgstr "Максимальное ускорение при печати" -#: src/libslic3r/PrintConfig.cpp:1380 +#: src/libslic3r/PrintConfig.cpp:1408 msgid "Maximum acceleration when extruding (M204 S)" -msgstr "Максимальное ускорение при выдавливании (M204 S)" +msgstr "Максимальное ускорение при печати (M204 S)" -#: src/libslic3r/PrintConfig.cpp:1388 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "Maximum acceleration when retracting" -msgstr "Макс. ускорение при ретракте" +msgstr "Максимальное ускорение ретракта" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1418 msgid "Maximum acceleration when retracting (M204 T)" -msgstr "Максимальное ускорение при ретракте (M204 T)" +msgstr "Максимальное ускорение экструдера при ретракте (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1397 src/libslic3r/PrintConfig.cpp:1406 +#: src/libslic3r/PrintConfig.cpp:1425 src/libslic3r/PrintConfig.cpp:1434 msgid "Max" -msgstr "Максимум" +msgstr "Макс." -#: src/libslic3r/PrintConfig.cpp:1398 +#: src/libslic3r/PrintConfig.cpp:1426 msgid "This setting represents the maximum speed of your fan." msgstr "Этот параметр регулирует максимальную скорость вращения вентилятора." -#: src/libslic3r/PrintConfig.cpp:1407 +#: src/libslic3r/PrintConfig.cpp:1435 +#, 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 " -"layer height is 75% of the extrusion width to achieve reasonable inter-layer " -"adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." +"This is the highest printable layer height for this extruder, used to cap the " +"variable layer height and support layer height. Maximum recommended layer height is " +"75% of the extrusion width to achieve reasonable inter-layer adhesion. If set to 0, " +"layer height is limited to 75% of the nozzle diameter." msgstr "" -"Это наибольшая высота печатного слоя для этого экструдера, которая " -"используется для ограничения функции \"Переменная высота слоёв\" и высоты " -"поддерживающего слоя. Для достижения хорошей межслойной адгезии, " -"максимальная рекомендуемая высота слоя составляет 75% ширины экструзии. Если " -"установлено 0, высота слоя ограничивается 75% диаметра сопла." +"Это наибольшая высота печатного слоя для этого экструдера, которая также " +"используется для ограничения функции \"Переменная высота слоёв\" и высоты слоя " +"поддержки. Для достижения хорошей межслойной адгезии, максимальная рекомендуемая " +"высота слоя составляет 75% ширины экструзии. Если установлено 0, высота слоя " +"ограничивается 75% диаметра сопла." -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "Max print speed" msgstr "Максимальная скорость печати" -#: src/libslic3r/PrintConfig.cpp:1418 +#: src/libslic3r/PrintConfig.cpp:1446 msgid "" -"When setting other speed settings to 0 Slic3r will autocalculate the optimal " -"speed in order to keep constant extruder pressure. This experimental setting " -"is used to set the highest print speed you want to allow." +"When setting other speed settings to 0 Slic3r will autocalculate the optimal speed " +"in order to keep constant extruder pressure. This experimental setting is used to " +"set the highest print speed you want to allow." msgstr "" -"При установке других параметров скорости в 0, Slic3r автоматически " -"рассчитает оптимальную скорость для поддержания постоянного давления в " -"экструдере. Этот экспериментальный параметр используется для задания " -"желаемой вами максимальной скорости печати." +"При установке других параметров скорости в 0, PrusaSlicer автоматически рассчитает " +"оптимальную скорость для поддержания постоянного давления в экструдере. Этот " +"экспериментальный параметр используется для задания желаемой вами максимальной " +"скорости печати." -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1456 msgid "" -"This experimental setting is used to set the maximum volumetric speed your " -"extruder supports." +"This experimental setting is used to set the maximum volumetric speed your extruder " +"supports." msgstr "" -"Экспериментальная опция используется для установки максимальной объёмной " -"скорости подачи (выдавливания) материала, которую поддерживает ваш " -"экструдер. 0 - без ограничений." +"Экспериментальная опция используется для установки максимальной объёмной скорости " +"подачи (выдавливания) материала, которую поддерживает ваш экструдер. 0 - без " +"ограничений." -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1465 msgid "Max volumetric slope positive" msgstr "Макс. положительное объёмное нависание" -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1449 +#: src/libslic3r/PrintConfig.cpp:1466 src/libslic3r/PrintConfig.cpp:1477 msgid "" -"This experimental setting is used to limit the speed of change in extrusion " -"rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " -"of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/" -"s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." +"This experimental setting is used to limit the speed of change in extrusion rate. A " +"value of 1.8 mm³/s² ensures, that a change from the extrusion rate of 1.8 mm³/s " +"(0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/s) to 5.4 mm³/s " +"(feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -"Этот экспериментальный параметр используется для ограничения скорости " -"изменения экструзии. Значение 1.8 мм³/с² гарантирует, что изменение скорости " -"экструзии с 1.8 мм³/с (ширина экструзии 0.45 мм, высота экструзии 0.2 мм, " -"скорость подачи 20 мм/с) до 5.4 мм³/с (скорость подачи 60 мм/с) займёт не " -"менее 2-х секунд." +"Этот экспериментальный параметр используется для ограничения скорости изменения " +"экструзии. Значение 1.8 мм³/с² гарантирует, что изменение скорости экструзии с 1.8 " +"мм³/с (ширина экструзии 0.45 мм, высота экструзии 0.2 мм, скорость подачи 20 мм/с) " +"до 5.4 мм³/с (скорость подачи 60 мм/с) займёт не менее 2-х секунд." -#: src/libslic3r/PrintConfig.cpp:1442 src/libslic3r/PrintConfig.cpp:1453 +#: src/libslic3r/PrintConfig.cpp:1470 src/libslic3r/PrintConfig.cpp:1481 msgid "mm³/s²" msgstr "мм³/с²" -#: src/libslic3r/PrintConfig.cpp:1448 +#: src/libslic3r/PrintConfig.cpp:1476 msgid "Max volumetric slope negative" msgstr "Макс. отрицательное объёмное нависание" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1469 +#: src/libslic3r/PrintConfig.cpp:1488 src/libslic3r/PrintConfig.cpp:1497 msgid "Min" -msgstr "Минимум" +msgstr "Мин." -#: src/libslic3r/PrintConfig.cpp:1461 +#: src/libslic3r/PrintConfig.cpp:1489 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "Этот параметр регулирует минимальную скорость вращения вентилятора." -#: src/libslic3r/PrintConfig.cpp:1470 +#: src/libslic3r/PrintConfig.cpp:1498 msgid "" "This is the lowest printable layer height for this extruder and limits the " -"resolution for variable layer height. Typical values are between 0.05 mm and " -"0.1 mm." +"resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm." msgstr "" -"Это наименьшая высота печатаемого слоя для данного экструдера и в то же " -"время нижний предел для функции \"Переменная высота слоёв\". Обычно это 0.05 " -"или 0.1 мм." +"Это наименьшая высота печатаемого слоя для данного экструдера и в то же время " +"нижний предел для функции \"Переменная высота слоёв\". Обычно это 0.05 или 0.1 мм." -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Min print speed" msgstr "Минимальная скорость печати" -#: src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1507 msgid "Slic3r will not scale speed down below this speed." msgstr "" -"Нижний предел того, как медленно слой может быть напечатан. Slic3 не будет " -"снижать скорость ниже этой." +"Нижний предел того, как медленно слой может быть напечатан. Slic3 не будет снижать " +"скорость ниже этой." -#: src/libslic3r/PrintConfig.cpp:1486 +#: src/libslic3r/PrintConfig.cpp:1514 msgid "Minimal filament extrusion length" msgstr "Минимальная длина экструзии" -#: src/libslic3r/PrintConfig.cpp:1487 +#: src/libslic3r/PrintConfig.cpp:1515 msgid "" -"Generate no less than the number of skirt loops required to consume the " -"specified amount of filament on the bottom layer. For multi-extruder " -"machines, this minimum applies to each extruder." +"Generate no less than the number of skirt loops required to consume the specified " +"amount of filament on the bottom layer. For multi-extruder machines, this minimum " +"applies to each extruder." msgstr "" -"Минимальное количество пластика, которое должен протолкнуть экструдер при " -"печати юбки в миллиметрах. Для принтеров с несколькими экструдерами этот " -"минимум относится к каждому экструдеру." +"Минимальное количество пластика, которое должен протолкнуть экструдер при печати " +"юбки в миллиметрах. Для принтеров с несколькими экструдерами этот минимум относится " +"к каждому экструдеру." -#: src/libslic3r/PrintConfig.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:1524 msgid "Configuration notes" msgstr "Примечание конфигурации" -#: src/libslic3r/PrintConfig.cpp:1497 +#: src/libslic3r/PrintConfig.cpp:1525 msgid "" -"You can put here your personal notes. This text will be added to the G-code " -"header comments." +"You can put here your personal notes. This text will be added to the G-code header " +"comments." msgstr "" -"Здесь вы можете оставить свои замечания для текущего профиля. Этот текст " -"будет добавлен к комментариям в заголовок G-кода." +"Здесь вы можете оставить свои замечания для текущего профиля. Этот текст будет " +"добавлен к комментариям в заголовок G-кода." -#: src/libslic3r/PrintConfig.cpp:1507 -msgid "" -"This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" +#: src/libslic3r/PrintConfig.cpp:1535 +msgid "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "Диаметр используемого сопла (например: 0.5, 0.35 и др.)" -#: src/libslic3r/PrintConfig.cpp:1512 +#: src/libslic3r/PrintConfig.cpp:1540 msgid "Host Type" -msgstr "Тип узла" +msgstr "Тип хоста" -#: src/libslic3r/PrintConfig.cpp:1513 +#: src/libslic3r/PrintConfig.cpp:1541 msgid "" -"Slic3r can upload G-code files to a printer host. This field must contain " -"the kind of the host." +"Slic3r can upload G-code files to a printer host. This field must contain the kind " +"of the host." msgstr "" -"Slic3r может загрузить файлы G-кода на узел печати. Это поле должно " -"содержать тип этого узла." +"PrusaSlicer может загружать G-код файлы на хост принтера. Это поле должно содержать " +"тип хоста." -#: src/libslic3r/PrintConfig.cpp:1530 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "Only retract when crossing perimeters" msgstr "Ретракт только при пересечении периметров" -#: src/libslic3r/PrintConfig.cpp:1531 +#: src/libslic3r/PrintConfig.cpp:1559 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." msgstr "" -"При включённом параметре процесс ретракта включается только тогда, когда " -"сопло выходит за внешний контур." +"При включённом параметре процесс ретракта включается только тогда, когда сопло " +"выходит за внешний контур." -#: src/libslic3r/PrintConfig.cpp:1538 +#: src/libslic3r/PrintConfig.cpp:1566 msgid "" -"This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"This option will drop the temperature of the inactive extruders to prevent oozing. " +"It will enable a tall skirt automatically and move extruders outside such skirt " +"when changing temperatures." msgstr "" "Этот параметр снижает температуру неактивных экструдеров для предотвращения " "просачивания расплавленного материала из сопла. Это автоматически активирует " "генерацию юбки и перемещает экструдеры на эту юбки при изменении температуры." -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1573 msgid "Output filename format" msgstr "Формат выходного файла" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1574 msgid "" "You can use all configuration options as variables inside this template. For " -"example: [layer_height], [fill_density] etc. You can also use [timestamp], " -"[year], [month], [day], [hour], [minute], [second], [version], " -"[input_filename], [input_filename_base]." -msgstr "" -"Вы можете использовать все параметры в качестве переменных внутри этого " -"шаблона. Они будят добавлены к имени файла. Например: [layer_height], " -"[fill_density]. Так же вы можете использовать [timestamp], [year], [month], " -"[day], [hour], [minute], [second], [version], [input_filename], " +"example: [layer_height], [fill_density] etc. You can also use [timestamp], [year], " +"[month], [day], [hour], [minute], [second], [version], [input_filename], " "[input_filename_base]." +msgstr "" +"Вы можете использовать все параметры в качестве переменных внутри этого шаблона. " +"Они будят добавлены к имени файла. Например: [layer_height], [fill_density]. Так же " +"вы можете использовать [timestamp], [year], [month], [day], [hour], [minute], " +"[second], [version], [input_filename], [input_filename_base]." -#: src/libslic3r/PrintConfig.cpp:1555 +#: src/libslic3r/PrintConfig.cpp:1583 msgid "Detect bridging perimeters" msgstr "Определять нависающие периметры" -#: src/libslic3r/PrintConfig.cpp:1557 +#: src/libslic3r/PrintConfig.cpp:1585 msgid "" -"Experimental option to adjust flow for overhangs (bridge flow will be used), " -"to apply bridge speed to them and enable fan." +"Experimental option to adjust flow for overhangs (bridge flow will be used), to " +"apply bridge speed to them and enable fan." msgstr "" -"Экспериментальная опция. Если у объекта есть части имеющие свесы, программа " -"рассчитает возможность их печати без поддержки, при этом увеличит обдув " -"модели и выставит скорость печати, как при печати мостов." +"Экспериментальная опция. Если у модели есть части имеющие свесы, программа " +"рассчитает возможность их печати без поддержки, при этом увеличит обдув модели и " +"выставит скорость печати, как при печати мостов." -#: src/libslic3r/PrintConfig.cpp:1563 +#: src/libslic3r/PrintConfig.cpp:1591 msgid "Filament parking position" msgstr "Положение парковки прутка" -#: src/libslic3r/PrintConfig.cpp:1564 +#: src/libslic3r/PrintConfig.cpp:1592 msgid "" -"Distance of the extruder tip from the position where the filament is parked " -"when unloaded. This should match the value in printer firmware." +"Distance of the extruder tip from the position where the filament is parked when " +"unloaded. This should match the value in printer firmware." msgstr "" -"Расстояние от кончика экструдера до точки, где размещается пруток при " -"выгрузке. Расстояние должно совпадать со значением в прошивке принтера." +"Расстояние от кончика экструдера до точки, где размещается пруток при выгрузке. " +"Расстояние должно соответствовать значению в прошивке принтера." -#: src/libslic3r/PrintConfig.cpp:1572 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Extra loading distance" msgstr "Дополнительная длина загрузки" -#: src/libslic3r/PrintConfig.cpp:1573 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" -"When set to zero, the distance the filament is moved from parking position " -"during load is exactly the same as it was moved back during unload. When " -"positive, it is loaded further, if negative, the loading move is shorter " -"than unloading." +"When set to zero, the distance the filament is moved from parking position during " +"load is exactly the same as it was moved back during unload. When positive, it is " +"loaded further, if negative, the loading move is shorter than unloading." msgstr "" -"Если установлено 0, то расстояние, которое проходит пруток при перемещении " -"из положения парковки во время загрузки, точно такое же, как и при выгрузке. " -"При положительном значении, она загружается дальше; при отрицательном, ход " -"загрузки короче (по сравнению с выгрузкой)." +"Если установлено 0, то расстояние, которое проходит пруток при перемещении из " +"положения парковки во время загрузки, точно такое же, как и при выгрузке. При " +"положительном значении, она загружается дальше; при отрицательном, ход загрузки " +"короче (по сравнению с выгрузкой)." -#: src/libslic3r/PrintConfig.cpp:1581 src/libslic3r/PrintConfig.cpp:1598 -#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:1621 +#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1639 src/libslic3r/PrintConfig.cpp:1649 msgid "Perimeters" msgstr "Периметры" -#: src/libslic3r/PrintConfig.cpp:1582 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "" -"This is the acceleration your printer will use for perimeters. Set zero to " -"disable acceleration control for perimeters." +"This is the acceleration your printer will use for perimeters. Set zero to disable " +"acceleration control for perimeters." msgstr "" +"Это ускорение, которое ваш принтер будет использовать для печати периметров. " +"Установите ноль, чтобы отключить управление ускорением по периметру." -#: src/libslic3r/PrintConfig.cpp:1589 +#: src/libslic3r/PrintConfig.cpp:1617 msgid "Perimeter extruder" msgstr "Экструдер, печатающий внешние периметры" -#: src/libslic3r/PrintConfig.cpp:1591 -msgid "" -"The extruder to use when printing perimeters and brim. First extruder is 1." +#: src/libslic3r/PrintConfig.cpp:1619 +msgid "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" -"Номер экструдера, которым печатаются периметры и кайма. Первый экструдер — 1." +"Номер экструдера, которым печатаются внешние периметры модели и кайма. Первый " +"экструдер - 1." -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1628 msgid "" -"Set this to a non-zero value to set a manual extrusion width for perimeters. " -"You may want to use thinner extrudates to get more accurate surfaces. If " -"left zero, default extrusion width will be used if set, otherwise 1.125 x " -"nozzle diameter will be used. If expressed as percentage (for example 200%) " -"it will be computed over layer height." +"Set this to a non-zero value to set a manual extrusion width for perimeters. You " +"may want to use thinner extrudates to get more accurate surfaces. If left zero, " +"default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will " +"be used. If expressed as percentage (for example 200%) it will be computed over " +"layer height." msgstr "" "Установите значение отличное от 0, чтобы вручную задать ширину экструзии для " -"периметров. Вы можете использовать более тонкие сопла, чтобы получить более " -"точных поверхностей. Если оставить 0, будет использоваться \"Ширина " -"экструзии по умолчанию\" - если она задана, в противном случае будет " -"использоваться 1,125 x диаметра сопла. Если задано в процентах, параметр " -"вычисляется относительно высоты слоя." +"периметров. Вы можете использовать более тонкие сопла, чтобы получить более точных " +"поверхностей. Если оставить 0, будет использоваться \"Ширина экструзии по умолчанию" +"\" - если она задана, в противном случае будет использоваться 1,125 x диаметра " +"сопла. Если задано в процентах, параметр вычисляется относительно высоты слоя." -#: src/libslic3r/PrintConfig.cpp:1613 -msgid "" -"Speed for perimeters (contours, aka vertical shells). Set to zero for auto." +#: src/libslic3r/PrintConfig.cpp:1641 +msgid "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" -"Скорость печати периметров (контуров, иначе вертикальных стенок). Установите " -"0 для автонастройки." +"Скорость печати периметров (контуров, иначе вертикальных стенок). Установите 0 для " +"автонастройки." -#: src/libslic3r/PrintConfig.cpp:1623 +#: src/libslic3r/PrintConfig.cpp:1651 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." +"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." msgstr "" -"Количество слоёв контура объекта (или количество вертикальных слоёв стенки " -"объекта). Чем меньше число, тем меньше толщина стенки объекта, а значит, " -"объект будет более хрупкий. Обратите внимание, если включена опция " -"\"Дополнительные периметры при необходимости\", Slic3r может автоматически " -"увеличить это значение, если обнаружит наклонные поверхности." +"Количество слоёв контура модели (или количество вертикальных слоёв стенки модели). " +"Чем меньше число, тем меньше толщина стенки модели, а значит, модель будет более " +"хрупкая. Обратите внимание, если включена опция \"Дополнительные периметры при " +"необходимости\", PrusaSlicer может автоматически увеличить это значение, если " +"обнаружит наклонные поверхности." -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1655 msgid "(minimum)" msgstr "(минимум)" -#: src/libslic3r/PrintConfig.cpp:1635 +#: src/libslic3r/PrintConfig.cpp:1663 msgid "" -"If you want to process the output G-code through custom scripts, just list " -"their absolute paths here. Separate multiple scripts with a semicolon. " -"Scripts will be passed the absolute path to the G-code file as the first " -"argument, and they can access the Slic3r config settings by reading " -"environment variables." +"If you want to process the output G-code through custom scripts, just list their " +"absolute paths here. Separate multiple scripts with a semicolon. Scripts will be " +"passed the absolute path to the G-code file as the first argument, and they can " +"access the Slic3r config settings by reading environment variables." msgstr "" -"Если вы хотите обработать выходной G-код с помощью пользовательских " -"скриптов, просто перечислите здесь абсолютные пути к ним. Разделяйте скрипты " -"точкой с запятой. Скриптам будет передан абсолютный путь к файлу G-кода в " -"качестве первого аргумента, и они смогут получить доступ к настройкам " -"конфигурации Slic3r, читая переменные окружения." +"Если вы хотите обработать выходной G-код с помощью пользовательских скриптов, " +"просто перечислите здесь абсолютные пути к ним. Разделяйте скрипты точкой с " +"запятой. Скриптам будет передан абсолютный путь к файлу G-кода в качестве первого " +"аргумента, и они смогут получить доступ к настройкам конфигурации PrusaSlicer, " +"читая переменные окружения." -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1675 msgid "Printer type" msgstr "Тип принтера" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1676 msgid "Type of the printer." msgstr "Тип принтера." -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1681 msgid "Printer notes" msgstr "Примечания к принтеру" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1682 msgid "You can put your notes regarding the printer here." msgstr "Здесь вы можете разместить свои заметки о принтере." -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1690 msgid "Printer vendor" msgstr "Производитель принтера" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1691 msgid "Name of the printer vendor." msgstr "Название производителя принтера." -#: src/libslic3r/PrintConfig.cpp:1668 +#: src/libslic3r/PrintConfig.cpp:1696 msgid "Printer variant" msgstr "Модификация принтера" -#: src/libslic3r/PrintConfig.cpp:1669 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "" -"Название модификации принтера. Например, это можно различать по диаметру " -"сопла." +"Название модификации принтера. Например, это можно различать по диаметру сопла." -#: src/libslic3r/PrintConfig.cpp:1682 +#: src/libslic3r/PrintConfig.cpp:1714 msgid "Raft layers" msgstr "Слоёв в подложке" -#: src/libslic3r/PrintConfig.cpp:1684 +#: src/libslic3r/PrintConfig.cpp:1716 msgid "" -"The object will be raised by this number of layers, and support material " -"will be generated under it." +"The object will be raised by this number of layers, and support material will be " +"generated under it." msgstr "" -"Параметр устанавливает высоту подложки в слоях. Ноль - отключает создание " -"подложки." +"Параметр устанавливает высоту подложки в слоях. Ноль - отключает создание подложки." -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Resolution" msgstr "Разрешение" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "" -"Minimum detail resolution, used to simplify the input file for speeding up " -"the slicing job and reducing memory usage. High-resolution models often " -"carry more detail than printers can render. Set to zero to disable any " -"simplification and use full resolution from input." +"Minimum detail resolution, used to simplify the input file for speeding up the " +"slicing job and reducing memory usage. High-resolution models often carry more " +"detail than printers can render. Set to zero to disable any simplification and use " +"full resolution from input." msgstr "" -"Минимальное разрешение детализации. Используется, чтобы упростить входной " -"файл для ускорения нарезки и уменьшения потребления оперативной памяти. " -"Модели с высоким разрешением часто больше детализированы, чем могут " -"отрисовать принтеры. Установите 0, чтобы отключить любое упрощение и " -"использовать полное разрешение из входного файла." +"Минимальное разрешение деталей модели. Используется, чтобы упростить входной файл " +"для ускорения нарезки и уменьшения потребления оперативной памяти. Модели с высоким " +"разрешением часто содержат больше деталей, чем принтеры могут выдать. Установите 0, " +"чтобы отключить любое упрощение и использовать полное разрешение для входного файла." -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1735 msgid "Minimum travel after retraction" -msgstr "Мин. перемещение после ретракта" +msgstr "Минимальное расстояние перемещения для ретракта" -#: src/libslic3r/PrintConfig.cpp:1704 -msgid "" -"Retraction is not triggered when travel moves are shorter than this length." +#: src/libslic3r/PrintConfig.cpp:1736 +msgid "Retraction is not triggered when travel moves are shorter than this length." msgstr "" -"Ретракт не будет срабатывать, если расстояние между точками печати меньше " -"заданного в этом параметре." +"Ретракт не будет срабатывать, если расстояние между точками печати меньше заданного " +"значения." -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Retract amount before wipe" msgstr "Величина ретракта перед очисткой" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "" -"With bowden extruders, it may be wise to do some amount of quick retract " -"before doing the wipe movement." +"With bowden extruders, it may be wise to do some amount of quick retract before " +"doing the wipe movement." msgstr "" -"При использовании боуден-экструдеров, будет разумно сделать несколько " -"быстрых ретрактов перед тем, как совершить движение очистки." +"При использовании боуден-экструдеров, будет разумно сделать небольшое втягивание " +"прутка перед тем, как совершить движение очистки." -#: src/libslic3r/PrintConfig.cpp:1718 +#: src/libslic3r/PrintConfig.cpp:1750 msgid "Retract on layer change" msgstr "Ретракт при смене слоя" -#: src/libslic3r/PrintConfig.cpp:1719 +#: src/libslic3r/PrintConfig.cpp:1751 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "Эта опция включает ретракт при переходе со слоя на слой." -#: src/libslic3r/PrintConfig.cpp:1724 src/libslic3r/PrintConfig.cpp:1732 +#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1764 msgid "Length" msgstr "Длина" -#: src/libslic3r/PrintConfig.cpp:1725 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Retraction Length" msgstr "Длина ретракта" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "" -"When retraction is triggered, filament is pulled back by the specified " -"amount (the length is measured on raw filament, before it enters the " -"extruder)." +"When retraction is triggered, filament is pulled back by the specified amount (the " +"length is measured on raw filament, before it enters the extruder)." msgstr "" -"Когда срабатывает ретракт пруток втягивается назад на указанную величину " -"(длина измеряется по ненагретому прутку , то есть до попадания его в " -"экструдер)." +"Когда срабатывает ретракт, пруток втягивается назад на указанную величину " +"(длина измеряется по \"сырому\" прутку, то есть до попадания её в экструдер)." -#: src/libslic3r/PrintConfig.cpp:1728 src/libslic3r/PrintConfig.cpp:1737 +#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1769 msgid "mm (zero to disable)" msgstr "мм (0 - отключено)" -#: src/libslic3r/PrintConfig.cpp:1733 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Retraction Length (Toolchange)" -msgstr "Длина ретракта (при смене сопла)" +msgstr "Длина ретракта (при смене инструмента)" -#: src/libslic3r/PrintConfig.cpp:1734 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "" -"When retraction is triggered before changing tool, filament is pulled back " -"by the specified amount (the length is measured on raw filament, before it " -"enters the extruder)." +"When retraction is triggered before changing tool, filament is pulled back by the " +"specified amount (the length is measured on raw filament, before it enters the " +"extruder)." msgstr "" -"Когда срабатывает ретракт перед сменой инструмента, пруток втягивается назад " -"на указанную величину (длина измеряется по сырому прутку, то есть до " +"Когда срабатывает ретракт, перед сменой сопла, пруток втягивается назад " +"на указанную величину (длина измеряется по \"сырому\" прутку, то есть до " "попадания его в экструдер)." -#: src/libslic3r/PrintConfig.cpp:1742 +#: src/libslic3r/PrintConfig.cpp:1774 msgid "Lift Z" msgstr "Приподнимать сопло на" -#: src/libslic3r/PrintConfig.cpp:1743 +#: src/libslic3r/PrintConfig.cpp:1775 msgid "" -"If you set this to a positive value, Z is quickly raised every time a " -"retraction is triggered. When using multiple extruders, only the setting for " -"the first extruder will be considered." +"If you set this to a positive value, Z is quickly raised every time a retraction is " +"triggered. When using multiple extruders, only the setting for the first extruder " +"will be considered." msgstr "" -"Задаёт на сколько миллиметров вверх будет каждый раз приподниматься сопло, " -"когда срабатывает ретракт. При использовании нескольких экструдеров будет " -"учитывается настройки только первого экструдера." +"Задаёт на сколько миллиметров вверх будет каждый раз приподниматься сопло, когда " +"срабатывает ретракт. При использовании нескольких экструдеров будут учитываться " +"настройки только первого экструдера." -#: src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1782 msgid "Above Z" -msgstr "Выше Z" +msgstr "Выше" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1783 msgid "Only lift Z above" -msgstr "Приподнимать сопло только выше (после)" +msgstr "Приподнимать сопло только выше" -#: src/libslic3r/PrintConfig.cpp:1752 +#: src/libslic3r/PrintConfig.cpp:1784 msgid "" "If you set this to a positive value, Z lift will only take place above the " -"specified absolute Z. You can tune this setting for skipping lift on the " -"first layers." +"specified absolute Z. You can tune this setting for skipping lift on the first " +"layers." msgstr "" -"Если указать положительное значение, то подъём Z будет " -"выполнен только после превышения заданной здесь абсолютной высоты Z. " -"Таким образом можно отключить подъём сопла при печати на первых слоях." +"Если указать положительное значение, экструдер будет подыматься только выше (после) " +"заданной здесь высоты (высота считается от стола). Таким образом вы можете " +"отключить подъём сопла при печати на первых слоях (в начале печати)." -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1791 msgid "Below Z" -msgstr "Ниже Z" +msgstr "Ниже" -#: src/libslic3r/PrintConfig.cpp:1760 +#: src/libslic3r/PrintConfig.cpp:1792 msgid "Only lift Z below" -msgstr "Приподнимать сопло только ниже (до)" +msgstr "Приподнимать сопло только ниже" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1793 msgid "" "If you set this to a positive value, Z lift will only take place below the " -"specified absolute Z. You can tune this setting for limiting lift to the " -"first layers." +"specified absolute Z. You can tune this setting for limiting lift to the first " +"layers." msgstr "" -"Если указать положительное значение, экструдер при перемещении будет " -"подыматься только до заданной здесь абсолютной высоты. " -"Таким образом можно ограничить подъём сопла при печати до первых слоёв." +"Если указать положительное значение, экструдер будет подыматься только ниже (до) " +"заданной здесь высоты (высота считается от стола). Таким образом вы можете " +"запретить подъём сопла выше установленной высоты." -#: src/libslic3r/PrintConfig.cpp:1769 src/libslic3r/PrintConfig.cpp:1777 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1809 msgid "Extra length on restart" msgstr "Дополнительная длина подачи перед возобновлением печати" -#: src/libslic3r/PrintConfig.cpp:1770 +#: src/libslic3r/PrintConfig.cpp:1802 msgid "" -"When the retraction is compensated after the travel move, the extruder will " -"push this additional amount of filament. This setting is rarely needed." +"When the retraction is compensated after the travel move, the extruder will push " +"this additional amount of filament. This setting is rarely needed." msgstr "" -"Компенсация длины выдавливаемого пластика после перемещения экструдера, " -"после работы ретракта. После того как экструдер втянул пруток и переместился " -"в другое место печати, происходит обратная подача того же количества прутка " -"+ заданное тут значение. Для увеличения ставим положительное значение " -"(например 0.5 мм), для уменьшения - отрицательное. Этот параметр редко " -"необходим." +"Компенсация длины выдавливаемого пластика после перемещения экструдера, после " +"работы ретракта. После того как экструдер втянул пруток и переместился в другое место " +"печати, происходит обратная подача того же количества прутка + заданное тут значение. " +"Для увеличения ставим положительное значение (например 0.5 мм), для уменьшения - " +"отрицательное. Этот параметр редко необходим." -#: src/libslic3r/PrintConfig.cpp:1778 +#: src/libslic3r/PrintConfig.cpp:1810 msgid "" -"When the retraction is compensated after changing tool, the extruder will " -"push this additional amount of filament." +"When the retraction is compensated after changing tool, the extruder will push this " +"additional amount of filament." msgstr "" -"Компенсация длины выдавливаемого пластика перед возобновлением печати после " -"смены сопла." +"Компенсация длины выдавливаемого пластика перед возобновлением печати после смены " +"сопла." -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1786 +#: src/libslic3r/PrintConfig.cpp:1817 src/libslic3r/PrintConfig.cpp:1818 msgid "Retraction Speed" msgstr "Скорость ретракта" -#: src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" -"Скорость с которой происходит ретракт - втягивание прутка (относится только " -"к двигателю экструдера)." +"Скорость с которой происходит ретракт - втягивание прутка (относится только к " +"двигателю экструдера)." -#: src/libslic3r/PrintConfig.cpp:1793 src/libslic3r/PrintConfig.cpp:1794 +#: src/libslic3r/PrintConfig.cpp:1825 src/libslic3r/PrintConfig.cpp:1826 msgid "Deretraction Speed" msgstr "Скорость компенсирующего ретракта" -#: src/libslic3r/PrintConfig.cpp:1795 +#: src/libslic3r/PrintConfig.cpp:1827 msgid "" -"The speed for loading of a filament into extruder after retraction (it only " -"applies to the extruder motor). If left to zero, the retraction speed is " -"used." +"The speed for loading of a filament into extruder after retraction (it only applies " +"to the extruder motor). If left to zero, the retraction speed is used." msgstr "" -"Скорость загрузки прутка в экструдер после ретракта (применима только к " -"двигателю экструдера). Если оставить ноль, будет использоваться скорость " -"ретракта." +"Скорость загрузки прутка в экструдер после ретракта (применима только к двигателю " +"экструдера). Если оставить ноль, будет использоваться скорость ретракта." -#: src/libslic3r/PrintConfig.cpp:1802 +#: src/libslic3r/PrintConfig.cpp:1834 msgid "Seam position" msgstr "Позиция шва" -#: src/libslic3r/PrintConfig.cpp:1804 +#: src/libslic3r/PrintConfig.cpp:1836 msgid "Position of perimeters starting points." msgstr "" -"Этот параметр позволяет выбрать начальную точку каждого слоя в направлении " -"Z, и таким образом определяет, где будет шов объекта. Изменяя этот параметр " -"можно уменьшить видимость шва." +"Этот параметр позволяет выбрать начальную точку каждого слоя в направлении Z, и " +"таким образом определяет, где будет шов модели. Изменяя этот параметр можно " +"уменьшить видимость шва." -#: src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1842 msgid "Random" msgstr "Случайно" -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1843 msgid "Nearest" msgstr "Ближайшая" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1844 msgid "Aligned" -msgstr "Выровнять" +msgstr "По краю" -#: src/libslic3r/PrintConfig.cpp:1820 +#: src/libslic3r/PrintConfig.cpp:1852 msgid "Direction" msgstr "Направление" -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1854 msgid "Preferred direction of the seam" msgstr "Предпочтительное направление шва" -#: src/libslic3r/PrintConfig.cpp:1823 +#: src/libslic3r/PrintConfig.cpp:1855 msgid "Seam preferred direction" msgstr "Предпочтительное направление шва" -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1862 msgid "Jitter" msgstr "Разброс шва" -#: src/libslic3r/PrintConfig.cpp:1832 +#: src/libslic3r/PrintConfig.cpp:1864 msgid "Seam preferred direction jitter" -msgstr "Предпочтительное направление разброса шва" +msgstr "Предпочтительное направление разброса шва (в градусах) " -#: src/libslic3r/PrintConfig.cpp:1833 +#: src/libslic3r/PrintConfig.cpp:1865 msgid "Preferred direction of the seam - jitter" msgstr "Предпочтительное направление разброса шва (в градусах) " -#: src/libslic3r/PrintConfig.cpp:1840 +#: src/libslic3r/PrintConfig.cpp:1872 msgid "Distance from object" -msgstr "Расстояние от объекта" +msgstr "Расстояние от юбки до модели" -#: src/libslic3r/PrintConfig.cpp:1841 +#: src/libslic3r/PrintConfig.cpp:1873 msgid "" -"Distance between skirt and object(s). Set this to zero to attach the skirt " -"to the object(s) and get a brim for better adhesion." +"Distance between skirt and object(s). Set this to zero to attach the skirt to the " +"object(s) and get a brim for better adhesion." msgstr "" -"Расстояние между юбкой и объектом. Укажите 0, чтобы прикрепить юбку к " -"объекту и получить кайму для лучшего прилипания." +"Задаёт на каком расстоянии от модели будет располагаться юбка. Установите 0, чтобы " +"прикрепить юбку к модели и получить кайму для лучшего прилипания." -#: src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "Skirt height" msgstr "Слоёв юбки" -#: src/libslic3r/PrintConfig.cpp:1849 +#: src/libslic3r/PrintConfig.cpp:1881 msgid "" -"Height of skirt expressed in layers. Set this to a tall value to use skirt " -"as a shield against drafts." +"Height of skirt expressed in layers. Set this to a tall value to use skirt as a " +"shield against drafts." msgstr "" "Высота юбки выраженная количеством слоёв. Установите высокое значение, чтобы " -"использовать юбку в качестве защиты от сквозняка." +"использовать юбку в качестве защиты от внешнего воздушного потока." -#: src/libslic3r/PrintConfig.cpp:1856 +#: src/libslic3r/PrintConfig.cpp:1888 msgid "Draft shield" -msgstr "Защита от сквозняка" +msgstr "Защитный кожух" -#: src/libslic3r/PrintConfig.cpp:1857 +#: src/libslic3r/PrintConfig.cpp:1889 msgid "" -"If enabled, the skirt will be as tall as a highest printed object. This is " -"useful to protect an ABS or ASA print from warping and detaching from print " -"bed due to wind draft." +"If enabled, the skirt will be as tall as a highest printed object. This is useful " +"to protect an ABS or ASA print from warping and detaching from print bed due to " +"wind draft." msgstr "" -"Если включено, то высота юбки будет равна самому высокому печатаемому" -" объекту. Это " -"полезно при печати ABS или ASA для защиты от скручивания и отрыва от" -" платформы, " -"возникающих от сквозняка." +"Если включено, юбка будет печататься высотой с самую высокую печатаемую модель. Это " +"полезно для защиты материалов типа ABS или ASA от деформации и отрыва от стола из-" +"за внешнего воздушного потока." -#: src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1895 msgid "Loops (minimum)" -msgstr "Петель (минимум)" +msgstr "Юбок вокруг модели (минимум)" -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1896 msgid "Skirt Loops" -msgstr "Кругов юбки" +msgstr "Петель юбки" -#: src/libslic3r/PrintConfig.cpp:1865 +#: src/libslic3r/PrintConfig.cpp:1897 msgid "" -"Number of loops for the skirt. If the Minimum Extrusion Length option is " -"set, the number of loops might be greater than the one configured here. Set " -"this to zero to disable skirt completely." +"Number of loops for the skirt. If the Minimum Extrusion Length option is set, the " +"number of loops might be greater than the one configured here. Set this to zero to " +"disable skirt completely." msgstr "" -"Количество юбок вокруг модели. Если задан параметр \"Минимальная длина " -"экструзии\", количество юбок может быть больше, чем задано здесь. Чтобы " -"полностью отключить юбку, установите 0." +"Количество юбок вокруг модели. Если задан параметр \"Минимальная длина экструзии\", " +"количество юбок может быть больше, чем задано здесь. Чтобы полностью отключить " +"юбку, установите 0." -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1905 msgid "Slow down if layer print time is below" msgstr "Замедление при печати слоя менее" -#: src/libslic3r/PrintConfig.cpp:1874 +#: src/libslic3r/PrintConfig.cpp:1906 msgid "" -"If layer print time is estimated below this number of seconds, print moves " -"speed will be scaled down to extend duration to this value." +"If layer print time is estimated below this number of seconds, print moves speed " +"will be scaled down to extend duration to this value." msgstr "" -"Если время печати слоя оценивается ниже этого количества секунд, скорость " -"печати будет пропорционально уменьшена, чтобы увеличить продолжительность до " -"этого значения." +"Если время печати слоя оценивается ниже этого количества секунд, скорость печати " +"будет пропорционально уменьшена, чтобы увеличить продолжительность до этого " +"значения." -#: src/libslic3r/PrintConfig.cpp:1883 +#: src/libslic3r/PrintConfig.cpp:1915 msgid "Small perimeters" msgstr "Маленькие периметры" -#: src/libslic3r/PrintConfig.cpp:1885 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "" -"This separate setting will affect the speed of perimeters having radius <= " -"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " -"be calculated on the perimeters speed setting above. Set to zero for auto." +"This separate setting will affect the speed of perimeters having radius <= 6.5mm " +"(usually holes). If expressed as percentage (for example: 80%) it will be " +"calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" "Этот параметр влияет на скорость печати периметров с радиусом \n" -"<= 6,5 мм (обычно это отверстия). Если задано в процентах, параметр " -"вычисляется относительно скорости печати внутренних периметров. Установите 0 " -"для автонастройки." +"<= 6,5 мм (обычно это отверстия). Если задано в процентах, параметр вычисляется " +"относительно скорости печати периметров указанной выше. Установите 0 для " +"автонастройки." -#: src/libslic3r/PrintConfig.cpp:1895 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Solid infill threshold area" msgstr "Заполнение площади, меньше указанной" -#: src/libslic3r/PrintConfig.cpp:1897 +#: src/libslic3r/PrintConfig.cpp:1929 msgid "" -"Force solid infill for regions having a smaller area than the specified " -"threshold." +"Force solid infill for regions having a smaller area than the specified threshold." msgstr "" "Заполнение площади меньше указанной будет производиться \n" "100% (сплошным) заполнением." -#: src/libslic3r/PrintConfig.cpp:1898 +#: src/libslic3r/PrintConfig.cpp:1930 msgid "mm²" msgstr "мм²" -#: src/libslic3r/PrintConfig.cpp:1904 +#: src/libslic3r/PrintConfig.cpp:1936 msgid "Solid infill extruder" -msgstr "Экструдер, печатающий сплошные слои заполнения" +msgstr "" +"Экструдер, печатающий сплошные слои заполнения" -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "The extruder to use when printing solid infill." msgstr "Номер экструдера, которым печатаются сплошные слои заполнения." -#: src/libslic3r/PrintConfig.cpp:1912 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "Solid infill every" msgstr "Сплошное заполнение каждые" -#: src/libslic3r/PrintConfig.cpp:1914 +#: src/libslic3r/PrintConfig.cpp:1946 msgid "" -"This feature allows to force a solid layer every given number of layers. " -"Zero to disable. You can set this to any value (for example 9999); Slic3r " -"will automatically choose the maximum possible number of layers to combine " -"according to nozzle diameter and layer height." +"This feature allows to force a solid layer every given number of layers. Zero to " +"disable. You can set this to any value (for example 9999); Slic3r will " +"automatically choose the maximum possible number of layers to combine according to " +"nozzle diameter and layer height." msgstr "" -"Эта функция позволяет принудительно делать сплошное заполнение через " -"указанное количество слоёв. Чтобы отключить, установите 0. Вы можете задать " -"любое значение, Slic3r автоматически выберет максимально возможное " -"количество слоёв в зависимости от диаметра сопла и высоты слоя." +"Эта функция позволяет принудительно делать сплошное заполнение через указанное " +"количество слоёв. Чтобы отключить, установите 0. Вы можете задать любое значение, " +"PrusaSlicer автоматически выберет максимально возможное количество слоёв в " +"зависимости от диаметра сопла и высоты слоя." -#: src/libslic3r/PrintConfig.cpp:1926 +#: src/libslic3r/PrintConfig.cpp:1958 msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill for " -"solid surfaces. If left zero, default extrusion width will be used if set, " -"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " -"(for example 90%) it will be computed over layer height." +"Set this to a non-zero value to set a manual extrusion width for infill for solid " +"surfaces. If left zero, default extrusion width will be used if set, otherwise " +"1.125 x nozzle diameter will be used. If expressed as percentage (for example 90%) " +"it will be computed over layer height." msgstr "" "Установите значение отличное от 0, чтобы вручную задать ширину экструзии для " -"заполнения сплошных поверхностей. Если оставить 0, будет использоваться " -"\"Ширина экструзии по умолчанию\" - если она задана, в противном случае " -"будет использоваться 1,125 x диаметра сопла. Если задано в процентах, " -"параметр вычисляется относительно высоты слоя." +"заполнения сплошных поверхностей. Если оставить 0, будет использоваться \"Ширина " +"экструзии по умолчанию\" - если она задана, в противном случае будет использоваться " +"1,125 x диаметра сопла. Если задано в процентах, параметр вычисляется относительно " +"высоты слоя." -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" -"Speed for printing solid regions (top/bottom/internal horizontal shells). " -"This can be expressed as a percentage (for example: 80%) over the default " -"infill speed above. Set to zero for auto." +"Speed for printing solid regions (top/bottom/internal horizontal shells). This can " +"be expressed as a percentage (for example: 80%) over the default infill speed " +"above. Set to zero for auto." msgstr "" -"Скорость печати сплошных областей (верха/низа/внутренних горизонтальных " -"оболочек). Если задано в процентах, параметр вычисляется относительно " -"скорости заполнения указанной выше. Установите 0 для автонастройки." +"Скорость печати сплошных областей (верха/низа/внутренних горизонтальных оболочек). " +"Если задано в процентах, параметр вычисляется относительно скорости заполнения " +"указанной выше. Установите 0 для автонастройки." -#: src/libslic3r/PrintConfig.cpp:1949 +#: src/libslic3r/PrintConfig.cpp:1981 msgid "Number of solid layers to generate on top and bottom surfaces." -msgstr "Количество сплошных слоёв для генерации верхних и нижних поверхностей." +msgstr "Количество сплошных слоёв при печати верхней и нижней поверхности модели." -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1987 src/libslic3r/PrintConfig.cpp:1988 msgid "Minimum thickness of a top / bottom shell" -msgstr "" +msgstr "Минимальная толщина оболочки сверху/снизу" -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1994 msgid "Spiral vase" msgstr "Спиральная ваза" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1995 msgid "" -"This feature will raise Z gradually while printing a single-walled object in " -"order to remove any visible seam. This option requires a single perimeter, " -"no infill, no top solid layers and no support material. You can still set " -"any number of bottom solid layers as well as skirt/brim loops. It won't work " -"when printing more than an object." +"This feature will raise Z gradually while printing a single-walled object in order " +"to remove any visible seam. This option requires a single perimeter, no infill, no " +"top solid layers and no support material. You can still set any number of bottom " +"solid layers as well as skirt/brim loops. It won't work when printing more than one " +"single object." msgstr "" "Данная настройка применяется при печати спиральных и пустотелых, а также " -"тонкостенных объектов. Модель печатается в одну стенку без верней " -"поверхности, заполнения и поддержки. При этом сопло движется вдоль периметра " -"непрерывно постепенно поднимаясь, так получаются ровные красивые вазы без " -"видимых швов. Вы можете задать любое количество нижних сплошных слоёв, а " -"также печать юбки/каймы. При включении этого параметра невозможно напечатать " -"горизонтальную плоскость - горизонтальные слои без поддержки будут провисать." - -#: src/libslic3r/PrintConfig.cpp:1971 +"тонкостенных моделей. Модель печатается в одну стенку без верней поверхности, " +"заполнения и поддержки. При этом сопло движется вдоль периметра непрерывно " +"постепенно поднимаясь, так получаются ровные красивые вазы без видимых швов. Вы " +"можете задать любое количество нижних сплошных слоёв, а также печать юбки/каймы. " +"При включении этого параметра невозможно напечатать горизонтальную плоскость - " +"горизонтальные слои без поддержки будут провисать." + +#: src/libslic3r/PrintConfig.cpp:2003 msgid "Temperature variation" msgstr "Колебания температуры" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2004 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. Enables a full-" +"height \"sacrificial\" skirt on which the nozzles are periodically wiped." msgstr "" -"Разность температур, которая применяется, когда экструдер не используется. " -"Включает печать \"жертвенной\" юбки с высотой, равной высоте модели, об " -"которую сопла будут время от времени очищаться." +"Разность температур, которая применяется, когда экструдер не используется. Включает " +"печать \"жертвенной\" юбки с высотой, равной высоте модели, об которую сопла будут " +"время от времени очищаться." -#: src/libslic3r/PrintConfig.cpp:1982 +#: src/libslic3r/PrintConfig.cpp:2014 msgid "" -"This start procedure is inserted at the beginning, after bed has reached the " -"target temperature and extruder just started heating, and before extruder " -"has finished heating. If PrusaSlicer detects M104 or M190 in your custom " -"codes, such commands will not be prepended automatically so you're free to " -"customize the order of heating commands and other custom actions. Note that " -"you can use placeholder variables for all PrusaSlicer settings, so you can " -"put a \"M109 S[first_layer_temperature]\" command wherever you want." +"This start procedure is inserted at the beginning, after bed has reached the target " +"temperature and extruder just started heating, and before extruder has finished " +"heating. If PrusaSlicer detects M104 or M190 in your custom codes, such commands " +"will not be prepended automatically so you're free to customize the order of " +"heating commands and other custom actions. Note that you can use placeholder " +"variables for all PrusaSlicer settings, so you can put a \"M109 " +"S[first_layer_temperature]\" command wherever you want." msgstr "" -"Этот код вставляется в начало, после того как платформа уже достигла заданной " -"температуры, а экструдер только начал нагреваться, и до того, как экструдер " -"закончил нагрев. Если PrusaSlicer обнаруживает M104 или M190 в вашем " -"пользовательском коде, то такие команды (нагрева) не будут добавляться" -" автоматически, " -"поэтому вы можете настроить порядок команд подогрева и другие действия. " +"Этот код выполняется в начале, после того как стол уже достиг заданной температуры, " +"а экструдер только начал нагреваться, и до того, как экструдер закончил нагрев. " +"Если PrusaSlicer обнаруживает M104 или M190 в ваших пользовательских кодах, такие " +"команды не будут добавляться автоматически, поэтому вы можете настроить порядок " +"команд нагрева и другие действия. Обратите внимание, что вы можете использовать " +"шаблонные переменные для всех параметров PrusaSlicer, поэтому вы можете вставить " +"команду \"M109 S[first_layer_temperature]\" где угодно." + +#: src/libslic3r/PrintConfig.cpp:2029 +msgid "" +"This start procedure is inserted at the beginning, after any printer start gcode " +"(and after any toolchange to this filament in case of multi-material printers). " +"This is used to override settings for a specific filament. If PrusaSlicer detects " +"M104, M109, M140 or M190 in your custom codes, such commands will not be prepended " +"automatically so you're free to customize the order of heating commands and other " +"custom actions. Note that you can use placeholder variables for all PrusaSlicer " +"settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you " +"want. If you have multiple extruders, the gcode is processed in extruder order." +msgstr "" +"Этот код выполняется в начале, после каждого запуска принтером G-кода (и после " +"каждого переключения инструмента на нужный пруток в случае мультиматериальных" +"принтеров). Это используется для переопределения параметров для " +"конкретного прутка. Если PrusaSlicer обнаруживает M104, M109, M140 или " +"M190 в ваших пользовательских кодах, такие команды не будут добавляться " +"автоматически, поэтому вы можете вставить порядок команд нагрева и другие действия. " "Обратите внимание, что вы можете использовать шаблонные переменные для всех " -"параметров PrusaSlicer, поэтому можете вставить команду \"M109" -" S[first_layer_temperature]\" где угодно." - -#: src/libslic3r/PrintConfig.cpp:1997 -msgid "" -"This start procedure is inserted at the beginning, after any printer start " -"gcode (and after any toolchange to this filament in case of multi-material " -"printers). This is used to override settings for a specific filament. If " -"PrusaSlicer detects M104, M109, M140 or M190 in your custom codes, such " -"commands will not be prepended automatically so you're free to customize the " -"order of heating commands and other custom actions. Note that you can use " -"placeholder variables for all PrusaSlicer settings, so you can put a \"M109 " -"S[first_layer_temperature]\" command wherever you want. If you have multiple " -"extruders, the gcode is processed in extruder order." -msgstr "" -"Этот код выполняется в начале, после выполнения стартового G-кода принтера. " -"Он используется для переопределения настроек для определённого прутка. Если " -"Slic3r обнаруживает M104, M109, M140 или M190 в вашем пользовательском коде, " -"такие команды не будут автоматически добавляться, поэтому вы можете " -"настроить порядок команд подогрева и другие действия. Обратите внимание, что " -"вы можете использовать шаблонные переменные для всех параметров Slic3r, " -"поэтому вы можете вставить команду \"M109 S[first_layer_temperature]\" где " -"угодно. Если у вас есть несколько экструдеров, G-код обрабатывается в " -"соответствии с порядковым номером экструдера." - -#: src/libslic3r/PrintConfig.cpp:2013 +"параметров PrusaSlicer, поэтому вы можете вставить команду \"M109 " +"S[first_layer_temperature]\" где угодно. Если у вас несколько экструдеров, G-код " +"обрабатывается в соответствии с порядковым номером экструдера." + +#: src/libslic3r/PrintConfig.cpp:2045 msgid "Color change G-code" -msgstr "G-код, выполняемый при смене цвета" +msgstr "G-код смены цвета" -#: src/libslic3r/PrintConfig.cpp:2014 +#: src/libslic3r/PrintConfig.cpp:2046 msgid "This G-code will be used as a code for the color change" -msgstr "" +msgstr "Этот G-код будет использоваться для изменения цвета." -#: src/libslic3r/PrintConfig.cpp:2023 +#: src/libslic3r/PrintConfig.cpp:2055 msgid "This G-code will be used as a code for the pause print" -msgstr "" +msgstr "Этот G-код будет использоваться для паузы печати." -#: src/libslic3r/PrintConfig.cpp:2032 +#: src/libslic3r/PrintConfig.cpp:2064 msgid "This G-code will be used as a custom code" -msgstr "" +msgstr "Этот G-код будет использоваться для пользовательского кода." -#: src/libslic3r/PrintConfig.cpp:2040 +#: src/libslic3r/PrintConfig.cpp:2072 msgid "Single Extruder Multi Material" msgstr "Мультиматериальный одиночный экструдер" -#: src/libslic3r/PrintConfig.cpp:2041 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "The printer multiplexes filaments into a single hot end." msgstr "" -"Принтер способный печатать несколькими видами/цветами пластика (соединяя их " -"в одну нить) с одной экструзионной головкой." +"Принтер способный печатать несколькими видами/цветами пластика (соединяя их в однин " +"пруток) с одной экструзионной головкой." -#: src/libslic3r/PrintConfig.cpp:2046 +#: src/libslic3r/PrintConfig.cpp:2078 msgid "Prime all printing extruders" -msgstr "Заправка всех печатающих экструдеров" +msgstr "Подготовка всех печатающих экструдеров" -#: src/libslic3r/PrintConfig.cpp:2047 +#: src/libslic3r/PrintConfig.cpp:2079 msgid "" -"If enabled, all printing extruders will be primed at the front edge of the " -"print bed at the start of the print." +"If enabled, all printing extruders will be primed at the front edge of the print " +"bed at the start of the print." msgstr "" +"Если этот параметр включён, все печатающие экструдеры в начале печати будут " +"подготавливаться на переднем крае стола." -#: src/libslic3r/PrintConfig.cpp:2052 +#: src/libslic3r/PrintConfig.cpp:2084 msgid "No sparse layers (EXPERIMENTAL)" -msgstr "" +msgstr "Отсутствие разреженных слоёв (ЭКСПЕРИМЕНТАЛЬНО)" -#: src/libslic3r/PrintConfig.cpp:2053 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "" -"If enabled, the wipe tower will not be printed on layers with no " -"toolchanges. On layers with a toolchange, extruder will travel downward to " -"print the wipe tower. User is responsible for ensuring there is no collision " -"with the print." +"If enabled, the wipe tower will not be printed on layers with no toolchanges. On " +"layers with a toolchange, extruder will travel downward to print the wipe tower. " +"User is responsible for ensuring there is no collision with the print." msgstr "" +"Если этот параметр включён, черновая башня не будет печататься на слоях где не " +"происходит смена инструмента. На слоях, где происходит смена инструмента, экструдер " +"будет опускаться вниз до верхней части черновой башни, чтобы напечатать её. Так как " +"PrusaSlicer в настоящее время не проверяет столкновения экструдера с напечатанным " +"объектом при опускании его вниз до верхней части черновой башни, эта функция " +"помечена как экспериментальная. Пользователь несёт ответственность за то, чтобы " +"избежать столкновения с напечатанным." -#: src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "Generate support material" msgstr "Генерация вспомогательных структур" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2094 msgid "Enable support material generation." msgstr "" -"Включение печати вспомогательных структур, поддерживающих выступающие и " -"свисающие элементы печатаемой модели." +"Включение печати вспомогательных структур, поддерживающих выступающие и свисающие " +"элементы печатаемой модели." -#: src/libslic3r/PrintConfig.cpp:2066 +#: src/libslic3r/PrintConfig.cpp:2098 msgid "Auto generated supports" -msgstr "Автоматическая генерация поддержек" +msgstr "Автоматически созданные поддержки" -#: src/libslic3r/PrintConfig.cpp:2068 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "" "If checked, supports will be generated automatically based on the overhang " -"threshold value. If unchecked, supports will be generated inside the " -"\"Support Enforcer\" volumes only." +"threshold value. If unchecked, supports will be generated inside the \"Support " +"Enforcer\" volumes only." msgstr "" -"Если включено, то поддержки будут генерироваться автоматически, исходя из " -"значения порога нависания. Если выключено, то поддержки будут генерироваться " -"только внутри пространств «Support Enforcer»." +"Если флажок установлен, поддержка будет генерироваться автоматически в зависимости " +"от нижестоящего значения \"Угол нависания поддержки\". Если флажок не установлен, " +"поддержка будет генерироваться только внутри значения принудительной поддержки " +"заданной ниже." -#: src/libslic3r/PrintConfig.cpp:2074 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "XY separation between an object and its support" -msgstr "Зазор между объектом и поддержкой по осям XY" +msgstr "Зазор между моделью и поддержкой по осям XY" -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2108 msgid "" -"XY separation between an object and its support. If expressed as percentage " -"(for example 50%), it will be calculated over external perimeter width." +"XY separation between an object and its support. If expressed as percentage (for " +"example 50%), it will be calculated over external perimeter width." msgstr "" -"Расстояние между поддержкой и печатаемым объектом по осям XY. Если задано в " -"процентах, то расстояние будет рассчитано исходя от ширины внешнего " -"периметра." +"Расстояние между поддержкой и печатаемой моделью по осям XY. Если задано в " +"процентах, то расстояние будет рассчитано исходя от ширины внешнего периметра." -#: src/libslic3r/PrintConfig.cpp:2086 +#: src/libslic3r/PrintConfig.cpp:2118 msgid "Pattern angle" msgstr "Угол печати поддержки и подложки" -#: src/libslic3r/PrintConfig.cpp:2088 +#: src/libslic3r/PrintConfig.cpp:2120 msgid "" -"Use this setting to rotate the support material pattern on the horizontal " -"plane." +"Use this setting to rotate the support material pattern on the horizontal plane." msgstr "" -"Используйте этот параметр для поворота рисунка поддержки в горизонтальной " -"плоскости." +"Используйте этот параметр для поворота рисунка поддержки в горизонтальной плоскости." -#: src/libslic3r/PrintConfig.cpp:2098 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2130 src/libslic3r/PrintConfig.cpp:2925 msgid "" -"Only create support if it lies on a build plate. Don't create support on a " -"print." -msgstr "" -"Создавать поддержки только от платформы. Поддержки от объектов построены не " -"будут." +"Only create support if it lies on a build plate. Don't create support on a print." +msgstr "Создавать поддержки только от стола. Поддержки от модели построены не будут." -#: src/libslic3r/PrintConfig.cpp:2104 +#: src/libslic3r/PrintConfig.cpp:2136 msgid "Contact Z distance" -msgstr "Расстояние от поддержки до объекта по вертикали" +msgstr "Расстояние от поддержки до модели по вертикали" -#: src/libslic3r/PrintConfig.cpp:2106 +#: src/libslic3r/PrintConfig.cpp:2138 msgid "" -"The vertical distance between object and support material interface. Setting " -"this to 0 will also prevent Slic3r from using bridge flow and speed for the " -"first object layer." +"The vertical distance between object and support material interface. Setting this " +"to 0 will also prevent Slic3r from using bridge flow and speed for the first object " +"layer." msgstr "" -"Вертикальное расстояние между объектом и связующим слоем поддержки. Если " -"установить 0, то Slic3r не будет использовать функцию \"Соотношение потока " -"при печати мостов\" и \"Скорость печати первого слоя\" объекта." +"Вертикальное расстояние между моделью и связующим слоем поддержки. Если установить " +"0, то PrusaSlicer не будет использовать функцию \"Соотношение потока при печати " +"мостов\" и \"Скорость печати первого слоя\" модели." -#: src/libslic3r/PrintConfig.cpp:2113 +#: src/libslic3r/PrintConfig.cpp:2145 msgid "0 (soluble)" msgstr "0 (растворимые)" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2146 msgid "0.2 (detachable)" msgstr "0.2 (нерастворимые)" -#: src/libslic3r/PrintConfig.cpp:2119 +#: src/libslic3r/PrintConfig.cpp:2151 msgid "Enforce support for the first" msgstr "Принудительная поддержка для первых" -#: src/libslic3r/PrintConfig.cpp:2121 +#: src/libslic3r/PrintConfig.cpp:2153 msgid "" -"Generate support material for the specified number of layers counting from " -"bottom, regardless of whether normal support material is enabled or not and " -"regardless of any angle threshold. This is useful for getting more adhesion " -"of objects having a very thin or poor footprint on the build plate." +"Generate support material for the specified number of layers counting from bottom, " +"regardless of whether normal support material is enabled or not and regardless of " +"any angle threshold. This is useful for getting more adhesion of objects having a " +"very thin or poor footprint on the build plate." msgstr "" -"Генерация поддержек для указанного количества слоёв начиная со дна, вне " -"зависимости от порога свеса и установленного параметра создания поддержек. " -"Это полезно для лучшего прилипания тонких объектов или при малой площади " -"контакта с платформой." +"Генерация поддержки для указанного количества слоёв начиная со дна модели, вне " +"зависимости от порога свеса и включения опции \"Создавать поддержки\". Это полезно " +"для получения лучшего прилипания моделей, имеющих очень тонкий или плохой контакт " +"со столом." -#: src/libslic3r/PrintConfig.cpp:2126 +#: src/libslic3r/PrintConfig.cpp:2158 msgid "Enforce support for the first n layers" -msgstr "Принудительная поддержка для первых N слоёв" +msgstr "Принудительная поддержка для первых n слоёв" -#: src/libslic3r/PrintConfig.cpp:2132 +#: src/libslic3r/PrintConfig.cpp:2164 msgid "Support material/raft/skirt extruder" msgstr "Экструдер, печатающий поддержки/подложки/юбки" -#: src/libslic3r/PrintConfig.cpp:2134 +#: src/libslic3r/PrintConfig.cpp:2166 msgid "" -"The extruder to use when printing support material, raft and skirt (1+, 0 to " -"use the current extruder to minimize tool changes)." +"The extruder to use when printing support material, raft and skirt (1+, 0 to use " +"the current extruder to minimize tool changes)." msgstr "" "Номер экструдера, которым печатаются поддержка, подложка и юбка (1+, 0 для " "использования текущего экструдера для минимизации смены инструмента)." -#: src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2175 msgid "" -"Set this to a non-zero value to set a manual extrusion width for support " -"material. If left zero, default extrusion width will be used if set, " -"otherwise nozzle diameter will be used. If expressed as percentage (for " -"example 90%) it will be computed over layer height." +"Set this to a non-zero value to set a manual extrusion width for support material. " +"If left zero, default extrusion width will be used if set, otherwise nozzle " +"diameter will be used. If expressed as percentage (for example 90%) it will be " +"computed over layer height." msgstr "" "Установите значение отличное от 0, чтобы вручную задать ширину экструзии для " -"поддержки. Если оставить 0, будет использоваться \"Ширина экструзии по " -"умолчанию\" - если она задана, в противном случае будет использоваться " -"диаметр сопла. Если задано в процентах, параметр вычисляется относительно " -"высоты слоя." +"поддержки. Если оставить 0, будет использоваться \"Ширина экструзии по умолчанию\" " +"- если она задана, в противном случае будет использоваться диаметр сопла. Если " +"задано в процентах, параметр вычисляется относительно высоты слоя." -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2184 msgid "Interface loops" msgstr "Связующий слой петлями" -#: src/libslic3r/PrintConfig.cpp:2154 -msgid "" -"Cover the top contact layer of the supports with loops. Disabled by default." +#: src/libslic3r/PrintConfig.cpp:2186 +msgid "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "Печатать верхний связующий слой петлями. По умолчанию отключено." -#: src/libslic3r/PrintConfig.cpp:2159 +#: src/libslic3r/PrintConfig.cpp:2191 msgid "Support material/raft interface extruder" -msgstr "Экструдер, печатающий связующий слой поддержки/подложки" +msgstr "" +"Экструдер, печатающий связующий слой поддержки/подложки" -#: src/libslic3r/PrintConfig.cpp:2161 +#: src/libslic3r/PrintConfig.cpp:2193 msgid "" -"The extruder to use when printing support material interface (1+, 0 to use " -"the current extruder to minimize tool changes). This affects raft too." +"The extruder to use when printing support material interface (1+, 0 to use the " +"current extruder to minimize tool changes). This affects raft too." msgstr "" "Номер экструдера, которым печатаются связующие слой поддержки (1+, 0 для " -"использования текущего экструдера для минимизации смены инструмента). Это " -"также влияет на печать подложки." +"использования текущего экструдера для минимизации смены инструмента). Это также " +"влияет на печать подложки." -#: src/libslic3r/PrintConfig.cpp:2168 +#: src/libslic3r/PrintConfig.cpp:2200 msgid "Interface layers" msgstr "Связующих слоёв" -#: src/libslic3r/PrintConfig.cpp:2170 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" -"Number of interface layers to insert between the object(s) and support " -"material." +"Number of interface layers to insert between the object(s) and support material." msgstr "Количество связующих слоёв между моделью и материалом поддержки." -#: src/libslic3r/PrintConfig.cpp:2177 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Interface pattern spacing" msgstr "Расстояние между связующими линиями" -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2211 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" -"Расстояние между связующими линиями. Установите 0, чтобы получить сплошной " -"слой." +"Расстояние между связующими линиями. Установите 0, чтобы получить сплошной слой." -#: src/libslic3r/PrintConfig.cpp:2188 +#: src/libslic3r/PrintConfig.cpp:2220 msgid "" -"Speed for printing support material interface layers. If expressed as " -"percentage (for example 50%) it will be calculated over support material " -"speed." +"Speed for printing support material interface layers. If expressed as percentage " +"(for example 50%) it will be calculated over support material speed." msgstr "" -"Скорость печати связующих слоёв поддержки. Если она выражена в процентах, то " -"будет рассчитана относительно скорости печати поддержки указанной выше." +"Скорость печати связующих слоёв поддержки. Если она выражена в процентах, то будет " +"рассчитана относительно скорости печати поддержки указанной выше." -#: src/libslic3r/PrintConfig.cpp:2197 +#: src/libslic3r/PrintConfig.cpp:2229 msgid "Pattern" msgstr "Шаблон поддержки и подложки" -#: src/libslic3r/PrintConfig.cpp:2199 +#: src/libslic3r/PrintConfig.cpp:2231 msgid "Pattern used to generate support material." msgstr "Шаблон, по которому будет происходить печать поддержки." -#: src/libslic3r/PrintConfig.cpp:2205 +#: src/libslic3r/PrintConfig.cpp:2237 msgid "Rectilinear grid" msgstr "Прямолинейная сетка" -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "Pattern spacing" msgstr "Плотность поддержки" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2245 msgid "Spacing between support material lines." msgstr "Расстояние между линиями поддержки." -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2254 msgid "Speed for printing support material." -msgstr "Скорость печати поддержек." +msgstr "Скорость печати поддержки." -#: src/libslic3r/PrintConfig.cpp:2229 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "Synchronize with object layers" -msgstr "Синхронизация со слоями объекта" +msgstr "Синхронизация со слоями модели" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2263 msgid "" -"Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"Synchronize support layers with the object print layers. This is useful with multi-" +"material printers, where the extruder switch is expensive." msgstr "" -"Синхронизирует слои поддержки со слоями печатаемого объекта. Это полезно для " +"Синхронизирует слои поддержки со слоями печатаемой модели. Это полезно для " "мультиматериальных принтеров, которые требуют больших затрат на смену одного " "экструдера на другой." -#: src/libslic3r/PrintConfig.cpp:2237 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "Overhang threshold" msgstr "Угол нависания поддержки" -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2271 msgid "" -"Support material will not be generated for overhangs whose slope angle (90° " -"= vertical) is above the given threshold. In other words, this value " -"represent the most horizontal slope (measured from the horizontal plane) " -"that you can print without support material. Set to zero for automatic " -"detection (recommended)." +"Support material will not be generated for overhangs whose slope angle (90° = " +"vertical) is above the given threshold. In other words, this value represent the " +"most horizontal slope (measured from the horizontal plane) that you can print " +"without support material. Set to zero for automatic detection (recommended)." msgstr "" -"Задаётся угол нависания, при превышении которого будут использоваться " -"поддержки (угол задаётся относительно вертикальной оси). Установите 0 для " -"формирования поддержки в автоматическом режиме." +"Задаётся угол нависания, при превышении которого будут использоваться поддержки " +"(угол задаётся относительно вертикальной оси). Установите 0 для формирования " +"поддержки в автоматическом режиме." -#: src/libslic3r/PrintConfig.cpp:2251 +#: src/libslic3r/PrintConfig.cpp:2283 msgid "With sheath around the support" msgstr "Оболочка вокруг поддержки" -#: src/libslic3r/PrintConfig.cpp:2253 +#: src/libslic3r/PrintConfig.cpp:2285 msgid "" -"Add a sheath (a single perimeter line) around the base support. This makes " -"the support more reliable, but also more difficult to remove." +"Add a sheath (a single perimeter line) around the base support. This makes the " +"support more reliable, but also more difficult to remove." msgstr "" -"Добавить оболочку (одну линию периметра) вокруг базовой поддержки. Это " -"делает поддержку более надёжной, но её труднее удалить." +"Добавить оболочку (одну линию периметра) вокруг базовой поддержки. Это делает " +"поддержку более надёжной, но её труднее удалить." -#: src/libslic3r/PrintConfig.cpp:2260 +#: src/libslic3r/PrintConfig.cpp:2292 msgid "" -"Nozzle temperature for layers after the first one. Set this to zero to " -"disable temperature control commands in the output G-code." +"Nozzle temperature for layers after the first one. Set this to zero to disable " +"temperature control commands in the output G-code." msgstr "" +"Температура сопла при печати для слоёв после первого. Установите 0 для отключения " +"команд управления температурой в выходом G-коде." -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Nozzle temperature" -msgstr "" +msgstr "Температура сопла" -#: src/libslic3r/PrintConfig.cpp:2269 +#: src/libslic3r/PrintConfig.cpp:2301 msgid "Detect thin walls" msgstr "Обнаружение тонких стенок" -#: src/libslic3r/PrintConfig.cpp:2271 +#: src/libslic3r/PrintConfig.cpp:2303 msgid "" -"Detect single-width walls (parts where two extrusions don't fit and we need " -"to collapse them into a single trace)." +"Detect single-width walls (parts where two extrusions don't fit and we need to " +"collapse them into a single trace)." msgstr "" "Данный параметр ищет тонкие стенки (стенки одинарной ширины), которые можно " "напечатать только в один проход экструдера, и производит нарезку правильно." -#: src/libslic3r/PrintConfig.cpp:2277 +#: src/libslic3r/PrintConfig.cpp:2309 msgid "Threads" msgstr "Потоков" -#: src/libslic3r/PrintConfig.cpp:2278 +#: src/libslic3r/PrintConfig.cpp:2310 msgid "" -"Threads are used to parallelize long-running tasks. Optimal threads number " -"is slightly above the number of available cores/processors." +"Threads are used to parallelize long-running tasks. Optimal threads number is " +"slightly above the number of available cores/processors." msgstr "" -"Количество потоков для распараллеливания длительных задач. Оптимальное " -"количество потоков немного превышает количество доступных ядер/процессоров." +"Количество потоков для распараллеливания длительных задач. Оптимальное количество " +"потоков несколько превышает количество доступных ядер/процессоров." -#: src/libslic3r/PrintConfig.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:2322 msgid "" -"This custom code is inserted before every toolchange. Placeholder variables " -"for all PrusaSlicer settings as well as {previous_extruder} and " -"{next_extruder} can be used. When a tool-changing command which changes to " -"the correct extruder is included (such as T{next_extruder}), PrusaSlicer " -"will emit no other such command. It is therefore possible to script custom " -"behaviour both before and after the toolchange." +"This custom code is inserted before every toolchange. Placeholder variables for all " +"PrusaSlicer settings as well as {previous_extruder} and {next_extruder} can be " +"used. When a tool-changing command which changes to the correct extruder is " +"included (such as T{next_extruder}), PrusaSlicer will emit no other such command. " +"It is therefore possible to script custom behaviour both before and after the " +"toolchange." msgstr "" +"Этот пользовательский код вставляется перед каждой сменой инструмента. Вы можете " +"использовать шаблонные переменные для всех параметров PrusaSlicer в том числе " +"{previous_extruder} и {next_extruder}. При включении команды смены инструмента, " +"которая заменяет правильный экструдер (например T{next_extruder}), PrusaSlicer не " +"будет запускать никакие другие подобные команды. Таким образом, можно создавать " +"собственные сценарии поведения до и после смены инструмента.???" -#: src/libslic3r/PrintConfig.cpp:2303 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill for " -"top surfaces. You may want to use thinner extrudates to fill all narrow " -"regions and get a smoother finish. If left zero, default extrusion width " -"will be used if set, otherwise nozzle diameter will be used. If expressed as " -"percentage (for example 90%) it will be computed over layer height." +"Set this to a non-zero value to set a manual extrusion width for infill for top " +"surfaces. You may want to use thinner extrudates to fill all narrow regions and get " +"a smoother finish. If left zero, default extrusion width will be used if set, " +"otherwise nozzle diameter will be used. If expressed as percentage (for example " +"90%) it will be computed over layer height." msgstr "" "Установите значение отличное от 0, чтобы вручную задать ширину экструзии для " -"заполнения верхней поверхности. Вы можете использовать более тонкие сопла, " -"чтобы заполнить все узкие области и получить более гладкую поверхность. Если " -"оставить 0, будет использоваться \"Ширина экструзии по умолчанию\" - если " -"она задана, в противном случае будет использоваться диаметр сопла. Если " -"задано в процентах, параметр вычисляется относительно высоты слоя." +"заполнения верхней поверхности. Вы можете использовать более тонкие сопла, чтобы " +"заполнить все узкие области и получить более гладкую поверхность. Если оставить 0, " +"будет использоваться \"Ширина экструзии по умолчанию\" - если она задана, в " +"противном случае будет использоваться диаметр сопла. Если задано в процентах, " +"параметр вычисляется относительно высоты слоя." -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2347 msgid "" -"Speed for printing top solid layers (it only applies to the uppermost " -"external layers and not to their internal solid layers). You may want to " -"slow down this to get a nicer surface finish. This can be expressed as a " -"percentage (for example: 80%) over the solid infill speed above. Set to zero " -"for auto." +"Speed for printing top solid layers (it only applies to the uppermost external " +"layers and not to their internal solid layers). You may want to slow down this to " +"get a nicer surface finish. This can be expressed as a percentage (for example: " +"80%) over the solid infill speed above. Set to zero for auto." msgstr "" -"Скорость печати верхних сплошных слоёв. Вы можете снизить скорость, чтобы " -"получить более качественную поверхность. Если задано в процентах, параметр " -"вычисляется относительно скорости сплошного заполнения указанной выше. " -"Установите 0 для автонастройки." +"Скорость печати верхних сплошных слоёв. Вы можете снизить скорость, чтобы получить " +"более качественную поверхность. Если задано в процентах, параметр вычисляется " +"относительно скорости сплошного заполнения указанной выше. Установите 0 для " +"автонастройки." -#: src/libslic3r/PrintConfig.cpp:2330 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Number of solid layers to generate on top surfaces." msgstr "Количество сплошных слоёв при печати верхней поверхности модели." -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Top solid layers" msgstr "Верхних сплошных слоёв" -#: src/libslic3r/PrintConfig.cpp:2339 +#: src/libslic3r/PrintConfig.cpp:2371 msgid "" -"The number of top solid layers is increased above top_solid_layers if " -"necessary to satisfy minimum thickness of top shell. This is useful to " -"prevent pillowing effect when printing with variable layer height." +"The number of top solid layers is increased above top_solid_layers if necessary to " +"satisfy minimum thickness of top shell. This is useful to prevent pillowing effect " +"when printing with variable layer height." msgstr "" -"На сколько количество верхних сплошных слоёв может быть больше " -"top_solid_layers, если это необходимо для получения минимальной толщины " -"верхней оболочки. Это полезно для убирания эффекта подушки при печати с " -"переменной высотой слоя." +"При необходимости количество верхних сплошных слоёв увеличивается выше значения " +"top_solid_layers (\"Сплошных слоёв сверху\") для удовлетворения минимальной толщины " +"оболочки сверху. Полезно для предотвращения эффекта \"дырявой подушки\" (верхняя " +"поверхность не полностью закрыта или имеет неровности) при печати с переменной " +"высотой слоя." -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2374 msgid "Minimum top shell thickness" -msgstr "Минимальная толщина верхней оболочки" +msgstr "Минимальная толщина оболочки сверху" -#: src/libslic3r/PrintConfig.cpp:2349 +#: src/libslic3r/PrintConfig.cpp:2381 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "Скорость перемещения экструдера при позиционировании без печати." -#: src/libslic3r/PrintConfig.cpp:2357 +#: src/libslic3r/PrintConfig.cpp:2389 msgid "Use firmware retraction" msgstr "Использовать ретракт из прошивки" -#: src/libslic3r/PrintConfig.cpp:2358 +#: src/libslic3r/PrintConfig.cpp:2390 msgid "" -"This experimental setting uses G10 and G11 commands to have the firmware " -"handle the retraction. This is only supported in recent Marlin." +"This experimental setting uses G10 and G11 commands to have the firmware handle the " +"retraction. This is only supported in recent Marlin." msgstr "" -"Эта экспериментальная настройка использует команды G10 и G11, чтобы прошивка " -"обрабатывала ретракт. Поддерживается только в последних версиях Marlin." +"Эта экспериментальная опция использует команды G10 и G11, чтобы прошивка " +"обрабатывала ретракт. Поддерживается только в последних версиях Marlin. " -#: src/libslic3r/PrintConfig.cpp:2364 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "Use relative E distances" -msgstr "Использовать относительные расстояния E" +msgstr "Использовать относительные координаты для экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." msgstr "" "Движение экструдера (E) по отношению к предыдущей позиции не в абсолютном " -"выражении, а в относительном. Большинство прошивок используют абсолютные " -"значения при позиционировании. Если вы не знаете - использует ли ваша " -"прошивка эту функцию, то не отмечайте это значение." +"выражении, а в относительном. Большинство прошивок используют абсолютные значения " +"при позиционировании. Если вы не знаете - использует ли ваша прошивка эту функцию, " +"то не отмечайте это значение." -#: src/libslic3r/PrintConfig.cpp:2371 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Use volumetric E" -msgstr "Использовать объёмные значения E" +msgstr "Использовать объёмные значения для экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2404 msgid "" -"This experimental setting uses outputs the E values in cubic millimeters " -"instead of linear millimeters. If your firmware doesn't already know " -"filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] " -"T0' in your start G-code in order to turn volumetric mode on and use the " -"filament diameter associated to the filament selected in Slic3r. This is " -"only supported in recent Marlin." +"This experimental setting uses outputs the E values in cubic millimeters instead of " +"linear millimeters. If your firmware doesn't already know filament diameter(s), you " +"can put commands like 'M200 D[filament_diameter_0] T0' in your start G-code in " +"order to turn volumetric mode on and use the filament diameter associated to the " +"filament selected in Slic3r. This is only supported in recent Marlin." msgstr "" -"Это экспериментальный параметр использует выходные значения экструдера в " -"кубических миллиметрах вместо линейных миллиметров. Если ваша прошивка ещё " -"не знает диаметр прутка, вы можете поместить в свой стартовый G-код команду " -"«M200 D [диаметр_прутка_0] T0», чтобы включить объёмный режим и использовать " -"диаметр прутка, указанный в Slic3r. Поддерживается только в последних " -"версиях Marlin." +"Эта экспериментальная опция использует выходные значения экструдера в кубических " +"миллиметрах вместо линейных миллиметров. Если в вашей прошивке ещё не задан диаметр " +"прутка, вы можете прописать в свой стартовый G-код команды, например такую как 'M200 " +"D [filament_diameter_0] T0', чтобы включить объёмный режим и использовать диаметр " +"прутка указанный в PrusaSlicer. Это функция поддерживается только в последних версиях " +"Marlin." -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2414 msgid "Enable variable layer height feature" msgstr "Включить функцию переменной высоты слоёв" -#: src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2415 msgid "" -"Some printers or printer setups may have difficulties printing with a " -"variable layer height. Enabled by default." +"Some printers or printer setups may have difficulties printing with a variable " +"layer height. Enabled by default." msgstr "" -"Некоторые принтеры (или из-за настроек принтера) могут испытывать трудности " -"при печати с функцией переменной высотой слоёв. По умолчанию включено." +"Некоторые принтеры (или из-за настроек принтера) могут испытывать трудности при " +"печати с функцией переменной высотой слоёв. По умолчанию включено." -#: src/libslic3r/PrintConfig.cpp:2389 +#: src/libslic3r/PrintConfig.cpp:2421 msgid "Wipe while retracting" -msgstr "Ретракт во время перемещения" +msgstr "Очистка сопла при ретракте" -#: src/libslic3r/PrintConfig.cpp:2390 +#: src/libslic3r/PrintConfig.cpp:2422 msgid "" -"This flag will move the nozzle while retracting to minimize the possible " -"blob on leaky extruders." +"This flag will move the nozzle while retracting to minimize the possible blob on " +"leaky extruders." msgstr "" -"Позволяет соплу перемещаться во время ретракта (втягивания прутка), чтобы " -"свести к минимуму возможное образование капли на не герметичных экструдерах." +"Позволяет соплу совершать разглаживавшее движение во время ретракта, чтобы свести к " +"минимуму возможное образование пупырышек в начале/конце слоя на экструдерах, " +"которые имеют тенденцию к течи." -#: src/libslic3r/PrintConfig.cpp:2397 +#: src/libslic3r/PrintConfig.cpp:2429 msgid "" -"Multi material printers may need to prime or purge extruders on tool " -"changes. Extrude the excess material into the wipe tower." +"Multi material printers may need to prime or purge extruders on tool changes. " +"Extrude the excess material into the wipe tower." msgstr "" -"Для мультиматериальных принтеров может потребоваться предзарядка и прочистка " -"сопел при их смене. Избыточный материал будет выдавливаться на башню очистки." +"Для мультиматериальных принтеров может потребоваться предзарядка и смена " +"инструмента. Избыточный материал будет выдавливаться на черновую башню." -#: src/libslic3r/PrintConfig.cpp:2403 +#: src/libslic3r/PrintConfig.cpp:2435 msgid "Purging volumes - load/unload volumes" msgstr "Очищающие объёмы - загрузка/выгрузка объёмов" -#: src/libslic3r/PrintConfig.cpp:2404 +#: src/libslic3r/PrintConfig.cpp:2436 msgid "" -"This vector saves required volumes to change from/to each tool used on the " -"wipe tower. These values are used to simplify creation of the full purging " -"volumes below." +"This vector saves required volumes to change from/to each tool used on the wipe " +"tower. These values are used to simplify creation of the full purging volumes below." msgstr "" -"Этот вектор задаёт объём материала, который будет выдавлен на башню очистки " -"для прочистки сопла при смене экструдеров/инструментов. Эти значения " -"используются для упрощения создания полноты объёмов очистки, указанной ниже." +"Этот параметр задаёт объём материала, который будет выдавлен на черновую башню для " +"прочистки сопла при смене экструдеров/инструментов. Эти значения используются для " +"упрощения создания полноты объёмов очистки указанной ниже." -#: src/libslic3r/PrintConfig.cpp:2410 +#: src/libslic3r/PrintConfig.cpp:2442 msgid "Purging volumes - matrix" msgstr "Таблица очищающих объёмов" -#: src/libslic3r/PrintConfig.cpp:2411 +#: src/libslic3r/PrintConfig.cpp:2443 msgid "" -"This matrix describes volumes (in cubic milimetres) required to purge the " -"new filament on the wipe tower for any given pair of tools." +"This matrix describes volumes (in cubic milimetres) required to purge the new " +"filament on the wipe tower for any given pair of tools." msgstr "" -"Эта таблица описывает объёмы (в кубических миллиметрах), необходимые для " -"прочистки нового прутка на башне очистки для заданной пары сопел/экструдеров." +"Эта таблица описывает объёмы (в кубических миллиметрах), необходимые для прочистки " +"нового прутка на черновой башне для любой пары сопел\\экструдеров." -#: src/libslic3r/PrintConfig.cpp:2420 +#: src/libslic3r/PrintConfig.cpp:2452 msgid "Position X" -msgstr "Х позиция" +msgstr "Х позиция башни" -#: src/libslic3r/PrintConfig.cpp:2421 +#: src/libslic3r/PrintConfig.cpp:2453 msgid "X coordinate of the left front corner of a wipe tower" -msgstr "X координата левого переднего угла башни очистки" +msgstr "X координата левого переднего угла черновой башни" -#: src/libslic3r/PrintConfig.cpp:2427 +#: src/libslic3r/PrintConfig.cpp:2459 msgid "Position Y" -msgstr "Y позиция" +msgstr "Y позиция башни" -#: src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2460 msgid "Y coordinate of the left front corner of a wipe tower" -msgstr "Y координата левого переднего угла башни очистки" +msgstr "Y координата левого переднего угла черновой башне" -#: src/libslic3r/PrintConfig.cpp:2435 +#: src/libslic3r/PrintConfig.cpp:2467 msgid "Width of a wipe tower" -msgstr "Ширина башни очистки" +msgstr "Ширина черновой башни" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2473 msgid "Wipe tower rotation angle" -msgstr "Угол поворота башни очистки" +msgstr "Угол поворота черновой башни" -#: src/libslic3r/PrintConfig.cpp:2442 +#: src/libslic3r/PrintConfig.cpp:2474 msgid "Wipe tower rotation angle with respect to x-axis." -msgstr "Угол поворота башни очистки относительно оси X." +msgstr "Угол поворота черновой башни относительно оси X." -#: src/libslic3r/PrintConfig.cpp:2449 +#: src/libslic3r/PrintConfig.cpp:2481 msgid "Wipe into this object's infill" -msgstr "" +msgstr "Очистка в заполнение модели" -#: src/libslic3r/PrintConfig.cpp:2450 +#: src/libslic3r/PrintConfig.cpp:2482 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." +"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." msgstr "" -"Прочистка сопла после смены будет выполняться внутри заполнения. Это " -"уменьшает количество отходов, но может привести к увеличению времени печати " -"из-за дополнительных перемещений." +"Очистка после замены инструмента будет выполняться внутри заполнения модели. Опция " +"уменьшает количество отходов, но может привести к увеличению времени печати из-за " +"дополнительных перемещений." -#: src/libslic3r/PrintConfig.cpp:2457 +#: src/libslic3r/PrintConfig.cpp:2489 msgid "Wipe into this object" -msgstr "Прочистка в объект" +msgstr "Очистка в модель" -#: src/libslic3r/PrintConfig.cpp:2458 +#: src/libslic3r/PrintConfig.cpp:2490 msgid "" -"Object will be used to purge the nozzle after a toolchange to save material " -"that would otherwise end up in the wipe tower and decrease print time. " -"Colours of the objects will be mixed as a result." +"Object will be used to purge the nozzle after a toolchange to save material that " +"would otherwise end up in the wipe tower and decrease print time. Colours of the " +"objects will be mixed as a result." msgstr "" -"Прочистка сопла после смены будет выполняться в объекте, чтобы сохранить " -"материал (который иначе попал бы на башню очистки) и сократить время печати. " -"В результате цвета объектов будут смешаны." +"Очистка сопла после смены инструмента будет выполняться в модель, чтобы сохранить " +"материал (который иначе попал бы на черновую башню) и сократить время печати. В " +"результате цвета моделей будут смешаны." -#: src/libslic3r/PrintConfig.cpp:2464 +#: src/libslic3r/PrintConfig.cpp:2496 msgid "Maximal bridging distance" msgstr "Максимальное длина моста" -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Maximal distance between supports on sparse infill sections." -msgstr "" -"Максимальное расстояние между опорами на разряженных участках заполнения." +msgstr "Максимальное расстояние между опорами на разряженных участках заполнения." -#: src/libslic3r/PrintConfig.cpp:2471 +#: src/libslic3r/PrintConfig.cpp:2503 msgid "XY Size Compensation" msgstr "Коррекция горизонтальных размеров модели" -#: src/libslic3r/PrintConfig.cpp:2473 +#: src/libslic3r/PrintConfig.cpp:2505 msgid "" -"The object will be grown/shrunk in the XY plane by the configured value " -"(negative = inwards, positive = outwards). This might be useful for fine-" -"tuning hole sizes." +"The object will be grown/shrunk in the XY plane by the configured value (negative = " +"inwards, positive = outwards). This might be useful for fine-tuning hole sizes." msgstr "" -"Параметр, отвечает за смещение границы контура печатаемого объекта в " -"плоскости XY на заданное значение. Отрицательное значение - во внутрь, " -"положительный - наружу. Может быть полезно для точной настройки размеров " -"отверстий, при печати шевронных подшипников." +"Параметр отвечает за смещение границы контура печатаемой модели в плоскости XY на " +"заданное значение. Отрицательное значение - во внутрь, положительный - наружу. " +"Может быть полезно для точной настройки размеров отверстий при печати шевронных " +"подшипников." -#: src/libslic3r/PrintConfig.cpp:2481 +#: src/libslic3r/PrintConfig.cpp:2513 msgid "Z offset" -msgstr "Смещение платформы по оси Z" +msgstr "Смещение стола по оси Z" -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "" -"This value will be added (or subtracted) from all the Z coordinates in the " -"output G-code. It is used to compensate for bad Z endstop position: for " -"example, if your endstop zero actually leaves the nozzle 0.3mm far from the " -"print bed, set this to -0.3 (or fix your endstop)." +"This value will be added (or subtracted) from all the Z coordinates in the output G-" +"code. It is used to compensate for bad Z endstop position: for example, if your " +"endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to " +"-0.3 (or fix your endstop)." msgstr "" -"Это значение будет добавлено (или вычтено) из всех координат Z в конечном" -" G-коде. " -"Используется для исправления ошибок работы концевого датчика Z: например, " -"если при нулевом значении по датчику сопло в действительности выше платформы" -" на " -"0.3 мм, то укажите здесь -0.3 (или исправьте датчик)." +"Смещение стола по вертикальной оси Z при ошибках работы концевого датчика. Это " +"значение будет прибавлено (или вычтено) из всех Z координат в выходном G-коде." -#: src/libslic3r/PrintConfig.cpp:2549 +#: src/libslic3r/PrintConfig.cpp:2581 msgid "Display width" msgstr "Ширина дисплея" -#: src/libslic3r/PrintConfig.cpp:2550 +#: src/libslic3r/PrintConfig.cpp:2582 msgid "Width of the display" -msgstr "" +msgstr "Высота дисплея." -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2587 msgid "Display height" msgstr "Высота дисплея" -#: src/libslic3r/PrintConfig.cpp:2556 +#: src/libslic3r/PrintConfig.cpp:2588 msgid "Height of the display" -msgstr "" +msgstr "Высота дисплея." -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2593 msgid "Number of pixels in" -msgstr "Количество пикселей в" +msgstr "Количество пикселей" -#: src/libslic3r/PrintConfig.cpp:2563 +#: src/libslic3r/PrintConfig.cpp:2595 msgid "Number of pixels in X" -msgstr "Количество пикселей в X" +msgstr "Количество пикселей по X." -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2601 msgid "Number of pixels in Y" -msgstr "Количество пикселей в Y" +msgstr "Количество пикселей по Y." -#: src/libslic3r/PrintConfig.cpp:2574 +#: src/libslic3r/PrintConfig.cpp:2606 msgid "Display horizontal mirroring" -msgstr "" +msgstr "Горизонтальное зеркалирование дисплея" -#: src/libslic3r/PrintConfig.cpp:2575 +#: src/libslic3r/PrintConfig.cpp:2607 msgid "Mirror horizontally" -msgstr "" +msgstr "Зеркалировать по горизонтали" -#: src/libslic3r/PrintConfig.cpp:2576 +#: src/libslic3r/PrintConfig.cpp:2608 msgid "Enable horizontal mirroring of output images" -msgstr "" +msgstr "Включение горизонтального зеркалирования выходных изображений." -#: src/libslic3r/PrintConfig.cpp:2581 +#: src/libslic3r/PrintConfig.cpp:2613 msgid "Display vertical mirroring" -msgstr "" +msgstr "Вертикальное зеркалирование дисплея" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2614 msgid "Mirror vertically" -msgstr "" +msgstr "Зеркалировать по вертикали" -#: src/libslic3r/PrintConfig.cpp:2583 +#: src/libslic3r/PrintConfig.cpp:2615 msgid "Enable vertical mirroring of output images" -msgstr "" +msgstr "Включение вертикального зеркалирования выходных изображений." -#: src/libslic3r/PrintConfig.cpp:2588 +#: src/libslic3r/PrintConfig.cpp:2620 msgid "Display orientation" -msgstr "" +msgstr "Ориентация дисплея" -#: src/libslic3r/PrintConfig.cpp:2589 +#: src/libslic3r/PrintConfig.cpp:2621 msgid "" -"Set the actual LCD display orientation inside the SLA printer. Portrait mode " -"will flip the meaning of display width and height parameters and the output " -"images will be rotated by 90 degrees." +"Set the actual LCD display orientation inside the SLA printer. Portrait mode will " +"flip the meaning of display width and height parameters and the output images will " +"be rotated by 90 degrees." msgstr "" +"Установите фактическую ориентацию ЖК-дисплея внутри SLA принтера. Портретный режим " +"перевернёт значения параметров ширины и высоты дисплея, а выходные изображения " +"будут повёрнуты на 90 градусов." -#: src/libslic3r/PrintConfig.cpp:2595 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Landscape" -msgstr "" +msgstr "Альбомная" -#: src/libslic3r/PrintConfig.cpp:2596 +#: src/libslic3r/PrintConfig.cpp:2628 msgid "Portrait" -msgstr "" +msgstr "Портретная" -#: src/libslic3r/PrintConfig.cpp:2601 +#: src/libslic3r/PrintConfig.cpp:2633 msgid "Fast" -msgstr "" +msgstr "Быстро" -#: src/libslic3r/PrintConfig.cpp:2602 +#: src/libslic3r/PrintConfig.cpp:2634 msgid "Fast tilt" -msgstr "" +msgstr "Быстрый наклон" -#: src/libslic3r/PrintConfig.cpp:2603 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "Time of the fast tilt" -msgstr "" +msgstr "Время быстрого наклона." -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2642 msgid "Slow" -msgstr "" +msgstr "Медленно" -#: src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Slow tilt" -msgstr "" +msgstr "Медленный наклон" -#: src/libslic3r/PrintConfig.cpp:2612 +#: src/libslic3r/PrintConfig.cpp:2644 msgid "Time of the slow tilt" -msgstr "" +msgstr "Время медленного наклона." -#: src/libslic3r/PrintConfig.cpp:2619 +#: src/libslic3r/PrintConfig.cpp:2651 msgid "Area fill" -msgstr "" +msgstr "Площадь заполнения" -#: src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:2652 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 "" +"Процент от площади стола. Если область печати превышает указанное значение, то " +"будет использоваться медленный наклон, в противном случае - быстрый наклон." -#: src/libslic3r/PrintConfig.cpp:2627 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2629 +#: src/libslic3r/PrintConfig.cpp:2659 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "Printer scaling correction" -msgstr "" +msgstr "Корректировка масштабирования" -#: src/libslic3r/PrintConfig.cpp:2635 src/libslic3r/PrintConfig.cpp:2636 +#: src/libslic3r/PrintConfig.cpp:2667 src/libslic3r/PrintConfig.cpp:2668 msgid "Printer absolute correction" -msgstr "" +msgstr "Абсолютная корректировка принтера" -#: src/libslic3r/PrintConfig.cpp:2637 +#: src/libslic3r/PrintConfig.cpp:2669 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "" +"Будет надувать или сдувать нарезанные 2D-полигоны в соответствии со знаком " +"коррекции." -#: src/libslic3r/PrintConfig.cpp:2643 +#: src/libslic3r/PrintConfig.cpp:2675 msgid "Elephant foot minimum width" -msgstr "" +msgstr "Минимальная ширина \"слоновьей ноги\"" -#: src/libslic3r/PrintConfig.cpp:2645 -msgid "" -"Minimum width of features to maintain when doing elephant foot compensation." +#: src/libslic3r/PrintConfig.cpp:2677 +msgid "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" +"Минимальная ширина, которую нужно поддерживать для компенсации \"слоновьей ноги\"." -#: src/libslic3r/PrintConfig.cpp:2652 src/libslic3r/PrintConfig.cpp:2653 +#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685 msgid "Printer gamma correction" -msgstr "Гамма модификация принтера" +msgstr "Корректировка гаммы-коррекции" -#: src/libslic3r/PrintConfig.cpp:2654 +#: src/libslic3r/PrintConfig.cpp:2686 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." +"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." msgstr "" +"Будет применена гамма-коррекция к растрированным 2D-полигонам. Нулевое значение " +"гаммы означает пороговое значение с порогом посередине. Такое поведение убирает " +"сглаживание без потери отверстий в полигонах." -#: src/libslic3r/PrintConfig.cpp:2666 src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2698 src/libslic3r/PrintConfig.cpp:2699 msgid "SLA material type" -msgstr "Тип материала SLA" +msgstr "Тип SLA материала" -#: src/libslic3r/PrintConfig.cpp:2678 src/libslic3r/PrintConfig.cpp:2679 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2711 msgid "Initial layer height" -msgstr "Высота исходного слоя" +msgstr "Начальная высота слоя" -#: src/libslic3r/PrintConfig.cpp:2685 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2718 msgid "Bottle volume" -msgstr "Объем бутылки" +msgstr "Объём бутылки" -#: src/libslic3r/PrintConfig.cpp:2687 +#: src/libslic3r/PrintConfig.cpp:2719 msgid "ml" msgstr "мл" -#: src/libslic3r/PrintConfig.cpp:2692 src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2724 src/libslic3r/PrintConfig.cpp:2725 msgid "Bottle weight" -msgstr "" +msgstr "Вес бутылки" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "kg" msgstr "кг" -#: src/libslic3r/PrintConfig.cpp:2701 +#: src/libslic3r/PrintConfig.cpp:2733 msgid "g/ml" msgstr "г/мл" -#: src/libslic3r/PrintConfig.cpp:2708 +#: src/libslic3r/PrintConfig.cpp:2740 msgid "money/bottle" -msgstr "денег/бутылка" +msgstr "цена/бутылка" -#: src/libslic3r/PrintConfig.cpp:2713 +#: src/libslic3r/PrintConfig.cpp:2745 msgid "Faded layers" -msgstr "" +msgstr "Начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:2746 msgid "" -"Number of the layers needed for the exposure time fade from initial exposure " -"time to the exposure time" +"Number of the layers needed for the exposure time fade from initial exposure time " +"to the exposure time" msgstr "" +"Количество начальных слоёв, необходимых для изменения времени засветки от \"Время " +"засветки начальных слоёв\" до \"Время засветки основных слоёв\"." -#: src/libslic3r/PrintConfig.cpp:2721 src/libslic3r/PrintConfig.cpp:2722 +#: src/libslic3r/PrintConfig.cpp:2753 src/libslic3r/PrintConfig.cpp:2754 msgid "Minimum exposure time" -msgstr "Минимальное время контакта" +msgstr "Мин. время засветки основных слоёв" -#: src/libslic3r/PrintConfig.cpp:2729 src/libslic3r/PrintConfig.cpp:2730 +#: src/libslic3r/PrintConfig.cpp:2761 src/libslic3r/PrintConfig.cpp:2762 msgid "Maximum exposure time" -msgstr "Максимальное время контакта" +msgstr "Макс. время засветки основных слоёв" -#: src/libslic3r/PrintConfig.cpp:2737 src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2769 src/libslic3r/PrintConfig.cpp:2770 msgid "Exposure time" -msgstr "Время контакта" +msgstr "Время засветки обычных слоёв" -#: src/libslic3r/PrintConfig.cpp:2744 src/libslic3r/PrintConfig.cpp:2745 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2777 msgid "Minimum initial exposure time" -msgstr "Минимальное начальное время контакта" +msgstr "Мин. время засветки начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:2752 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2784 src/libslic3r/PrintConfig.cpp:2785 msgid "Maximum initial exposure time" -msgstr "" +msgstr "Макс. время засветки начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:2760 src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2792 src/libslic3r/PrintConfig.cpp:2793 msgid "Initial exposure time" -msgstr "" +msgstr "Время засветки начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:2767 src/libslic3r/PrintConfig.cpp:2768 +#: src/libslic3r/PrintConfig.cpp:2799 src/libslic3r/PrintConfig.cpp:2800 msgid "Correction for expansion" -msgstr "" +msgstr "Коррекция расширения" -#: src/libslic3r/PrintConfig.cpp:2774 +#: src/libslic3r/PrintConfig.cpp:2806 msgid "SLA print material notes" -msgstr "Примечания к материалу для SLA-печати" +msgstr "Примечание к SLA материалу" -#: src/libslic3r/PrintConfig.cpp:2775 +#: src/libslic3r/PrintConfig.cpp:2807 msgid "You can put your notes regarding the SLA print material here." -msgstr "Здесь вы можете разместить свои заметки о материале для SLA печати." +msgstr "" +"Здесь вы можете разместить свои заметки относительно SLA материала для печати." -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2798 +#: src/libslic3r/PrintConfig.cpp:2819 src/libslic3r/PrintConfig.cpp:2830 msgid "Default SLA material profile" -msgstr "Профиль материала SLA-печати по умолчанию" +msgstr "Профиль SLA материала по умолчанию" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "Generate supports" -msgstr "" +msgstr "Генерировать поддержку" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2843 msgid "Generate supports for the models" -msgstr "" +msgstr "Генерация поддержки для моделей." -#: src/libslic3r/PrintConfig.cpp:2816 +#: src/libslic3r/PrintConfig.cpp:2848 msgid "Pinhead front diameter" -msgstr "" +msgstr "Диаметр носика поддержки" -#: src/libslic3r/PrintConfig.cpp:2818 +#: src/libslic3r/PrintConfig.cpp:2850 msgid "Diameter of the pointing side of the head" -msgstr "" +msgstr "Диаметр носика поддержки." -#: src/libslic3r/PrintConfig.cpp:2825 +#: src/libslic3r/PrintConfig.cpp:2857 msgid "Head penetration" -msgstr "" +msgstr "Глубина проникновения носика поддержки" -#: src/libslic3r/PrintConfig.cpp:2827 +#: src/libslic3r/PrintConfig.cpp:2859 msgid "How much the pinhead has to penetrate the model surface" -msgstr "" +msgstr "Задаёт, как глубоко носик поддержки будет проникать в модель." -#: src/libslic3r/PrintConfig.cpp:2834 +#: src/libslic3r/PrintConfig.cpp:2866 msgid "Pinhead width" -msgstr "" +msgstr "Длина носика поддержки" -#: src/libslic3r/PrintConfig.cpp:2836 +#: src/libslic3r/PrintConfig.cpp:2868 msgid "Width from the back sphere center to the front sphere center" msgstr "" +"Длина носика поддержки (ширина от центра задней сферы до центра передней сферы)." -#: src/libslic3r/PrintConfig.cpp:2844 +#: src/libslic3r/PrintConfig.cpp:2876 msgid "Pillar diameter" -msgstr "" +msgstr "Диаметр тела поддержки" -#: src/libslic3r/PrintConfig.cpp:2846 +#: src/libslic3r/PrintConfig.cpp:2878 msgid "Diameter in mm of the support pillars" -msgstr "" +msgstr "Диаметр тела поддержки в мм." -#: src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2886 msgid "Small pillar diameter percent" -msgstr "" +msgstr "Диаметр маленьких тел поддержки в процентах" -#: src/libslic3r/PrintConfig.cpp:2856 +#: src/libslic3r/PrintConfig.cpp:2888 msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." +"The percentage of smaller pillars compared to the normal pillar diameter which are " +"used in problematic areas where a normal pilla cannot fit." msgstr "" +"Размер тел поддержки меньшего размера в процентах по сравнению с обычным диаметром " +"тел поддержки, которые используются в проблемных областях, где нормальный столбик " +"поддержки не может поместиться." -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2897 msgid "Max bridges on a pillar" -msgstr "" +msgstr "Макс. количество мостов на теле поддержки" -#: src/libslic3r/PrintConfig.cpp:2867 +#: src/libslic3r/PrintConfig.cpp:2899 msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." +"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:2875 +#: src/libslic3r/PrintConfig.cpp:2907 msgid "Pillar connection mode" -msgstr "" +msgstr "Тип соединения тела поддержки" -#: src/libslic3r/PrintConfig.cpp:2876 +#: src/libslic3r/PrintConfig.cpp:2908 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." +"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:2884 +#: src/libslic3r/PrintConfig.cpp:2916 msgid "Zig-Zag" -msgstr "" +msgstr "Зигзагообразный" -#: src/libslic3r/PrintConfig.cpp:2885 +#: src/libslic3r/PrintConfig.cpp:2917 msgid "Cross" -msgstr "" +msgstr "Перекрёстный" -#: src/libslic3r/PrintConfig.cpp:2886 +#: src/libslic3r/PrintConfig.cpp:2918 msgid "Dynamic" -msgstr "" +msgstr "Динамический" -#: src/libslic3r/PrintConfig.cpp:2898 +#: src/libslic3r/PrintConfig.cpp:2930 msgid "Pillar widening factor" -msgstr "" +msgstr "Коэффициент расширения тела поддержки" -#: src/libslic3r/PrintConfig.cpp:2900 +#: src/libslic3r/PrintConfig.cpp:2932 msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." +"Merging bridges or pillars into another pillars can increase the radius. Zero means " +"no increase, one means full increase." msgstr "" +"Слияние мостов или тел поддержки в другие тела поддержки может увеличить их радиус. " +"0 - отсутствие увеличения, 1 - полное увеличение." -#: src/libslic3r/PrintConfig.cpp:2909 +#: src/libslic3r/PrintConfig.cpp:2941 msgid "Support base diameter" -msgstr "" +msgstr "Диаметр основания поддержки" -#: src/libslic3r/PrintConfig.cpp:2911 +#: src/libslic3r/PrintConfig.cpp:2943 msgid "Diameter in mm of the pillar base" -msgstr "" +msgstr "Диаметр основания поддержки в мм." -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:2951 msgid "Support base height" -msgstr "" +msgstr "Высота основания поддержки" -#: src/libslic3r/PrintConfig.cpp:2921 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "The height of the pillar base cone" -msgstr "" +msgstr "Высота конусообразного основания поддержки." -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:2960 msgid "Support base safety distance" -msgstr "" +msgstr "Безопасное расстояние основания поддержки" -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:2963 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." +"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:2941 +#: src/libslic3r/PrintConfig.cpp:2973 msgid "Critical angle" msgstr "Критический угол" -#: src/libslic3r/PrintConfig.cpp:2943 +#: src/libslic3r/PrintConfig.cpp:2975 msgid "The default angle for connecting support sticks and junctions." -msgstr "" +msgstr "Угол соединения опор поддержки со связующим узлом." -#: src/libslic3r/PrintConfig.cpp:2951 +#: src/libslic3r/PrintConfig.cpp:2983 msgid "Max bridge length" -msgstr "" +msgstr "Максимальная длина моста" -#: src/libslic3r/PrintConfig.cpp:2953 +#: src/libslic3r/PrintConfig.cpp:2985 msgid "The max length of a bridge" -msgstr "" +msgstr "Максимальная длина моста." -#: src/libslic3r/PrintConfig.cpp:2960 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "Max pillar linking distance" -msgstr "" +msgstr "Максимальное расстояние между телом поддержки" -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:2994 msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." +"The max distance of two pillars to get linked with each other. A zero value will " +"prohibit pillar cascading." msgstr "" +"Максимальное расстояние между двумя телами поддержки для связи друг с другом. " +"Нулевое значение - запрет на соединение тел поддержки каскадом." -#: src/libslic3r/PrintConfig.cpp:2972 +#: src/libslic3r/PrintConfig.cpp:3004 msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." +"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:2983 +#: src/libslic3r/PrintConfig.cpp:3015 msgid "This is a relative measure of support points density." -msgstr "" +msgstr "Относительный показатель плотности точек поддержки." -#: src/libslic3r/PrintConfig.cpp:2989 +#: src/libslic3r/PrintConfig.cpp:3021 msgid "Minimal distance of the support points" -msgstr "Минимальное расстояние опорных точек" +msgstr "Минимальное расстояние между точками поддержки" -#: src/libslic3r/PrintConfig.cpp:2991 +#: src/libslic3r/PrintConfig.cpp:3023 msgid "No support points will be placed closer than this threshold." -msgstr "" +msgstr "Точки поддержки не будут размещены ближе этого порогового значения." -#: src/libslic3r/PrintConfig.cpp:2997 +#: src/libslic3r/PrintConfig.cpp:3029 msgid "Use pad" -msgstr "" +msgstr "Использовать подложку" -#: src/libslic3r/PrintConfig.cpp:2999 +#: src/libslic3r/PrintConfig.cpp:3031 msgid "Add a pad underneath the supported model" -msgstr "" +msgstr "Добавляет подложку под поддерживаемую модель." -#: src/libslic3r/PrintConfig.cpp:3004 +#: src/libslic3r/PrintConfig.cpp:3036 msgid "Pad wall thickness" -msgstr "" +msgstr "Толщина стенки подложки" -#: src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3038 msgid "The thickness of the pad and its optional cavity walls." -msgstr "" +msgstr "Толщина подложки и её дополнительных стенок полости." -#: src/libslic3r/PrintConfig.cpp:3014 +#: src/libslic3r/PrintConfig.cpp:3046 msgid "Pad wall height" -msgstr "" +msgstr "Высота стенки подложки" -#: src/libslic3r/PrintConfig.cpp:3015 +#: src/libslic3r/PrintConfig.cpp:3047 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 " -"effect inside the cavity, which makes peeling the print off the vat foil " -"difficult." +"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 effect inside " +"the cavity, which makes peeling the print off the vat foil difficult." msgstr "" +"Определяет глубину полости в подложке. Установите нулевое значение, чтобы не делать " +"полость. Будьте осторожны при включении этой функции, так как некоторые смолы могут " +"создавать чрезмерный эффект всасывания внутри полости, что затрудняет снятие модели." -#: src/libslic3r/PrintConfig.cpp:3028 +#: src/libslic3r/PrintConfig.cpp:3060 msgid "Pad brim size" -msgstr "" +msgstr "Размер каймы подложки" -#: src/libslic3r/PrintConfig.cpp:3029 +#: src/libslic3r/PrintConfig.cpp:3061 msgid "How far should the pad extend around the contained geometry" -msgstr "" +msgstr "Как далеко должна простираться подложка вокруг существующей геометрии." -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3071 msgid "Max merge distance" -msgstr "" +msgstr "Максимальное расстояние слияния" -#: src/libslic3r/PrintConfig.cpp:3041 +#: src/libslic3r/PrintConfig.cpp:3073 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." +"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:3061 +#: src/libslic3r/PrintConfig.cpp:3093 msgid "Pad wall slope" -msgstr "" +msgstr "Наклон стенки подложки" -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3095 msgid "" -"The slope of the pad wall relative to the bed plane. 90 degrees means " -"straight walls." +"The slope of the pad wall relative to the bed plane. 90 degrees means straight " +"walls." msgstr "" +"Наклон стенки подложки относительно плоскости стола. 90 градусов означает прямые " +"стены." -#: src/libslic3r/PrintConfig.cpp:3074 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Create pad around object and ignore the support elevation" -msgstr "" +msgstr "Создаёт подложку вокруг модели, игнорируя высоту подъёма поддержкой." -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3111 msgid "Pad around object everywhere" -msgstr "" +msgstr "Подложка вокруг модели везде" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Force pad around object everywhere" -msgstr "" +msgstr "Принудительное создание подложки вокруг модели везде." -#: src/libslic3r/PrintConfig.cpp:3086 +#: src/libslic3r/PrintConfig.cpp:3118 msgid "Pad object gap" -msgstr "" +msgstr "Зазор между дном модели и подложкой" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3120 msgid "" -"The gap between the object bottom and the generated pad in zero elevation " -"mode." +"The gap between the object bottom and the generated pad in zero elevation mode." msgstr "" +"Зазор между дном модели и сгенерированной подложкой в режиме нулевой высоты подъёма." -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3129 msgid "Pad object connector stride" -msgstr "" +msgstr "Шаг соединительного элемента подложки модели" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3131 msgid "" -"Distance between two connector sticks which connect the object and the " -"generated pad." +"Distance between two connector sticks which connect the object and the generated " +"pad." msgstr "" +"Расстояние между двумя соединительными опорами, которые соединяют модель и " +"сгенерированную подложку." -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3138 msgid "Pad object connector width" -msgstr "" +msgstr "Ширина соединительного элемента подложки модели" -#: src/libslic3r/PrintConfig.cpp:3108 -msgid "" -"Width of the connector sticks which connect the object and the generated pad." +#: src/libslic3r/PrintConfig.cpp:3140 +msgid "Width of the connector sticks which connect the object and the generated pad." msgstr "" +"Ширина соединительных опор, которые соединяют модель со сгенерированной подложкой." -#: src/libslic3r/PrintConfig.cpp:3115 +#: src/libslic3r/PrintConfig.cpp:3147 msgid "Pad object connector penetration" -msgstr "" +msgstr "Глубина проникновения соединительного элемента в модель" -#: src/libslic3r/PrintConfig.cpp:3118 +#: src/libslic3r/PrintConfig.cpp:3150 msgid "How much should the tiny connectors penetrate into the model body." -msgstr "" +msgstr "Задаёт как глубоко соединительные элементы должны проникают в тело модели." -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3157 msgid "Enable hollowing" -msgstr "" +msgstr "Создавать полость" -#: src/libslic3r/PrintConfig.cpp:3127 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Hollow out a model to have an empty interior" -msgstr "" +msgstr "Создание пустотелой модели." -#: src/libslic3r/PrintConfig.cpp:3132 +#: src/libslic3r/PrintConfig.cpp:3164 msgid "Wall thickness" -msgstr "" +msgstr "Толщина стенки" -#: src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3166 msgid "Minimum wall thickness of a hollowed model." -msgstr "" +msgstr "Минимальная толщина стенки полой модели." -#: src/libslic3r/PrintConfig.cpp:3142 +#: src/libslic3r/PrintConfig.cpp:3174 msgid "Accuracy" -msgstr "" +msgstr "Точность" -#: src/libslic3r/PrintConfig.cpp:3144 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" -"Performance vs accuracy of calculation. Lower values may produce unwanted " -"artifacts." +"Performance vs accuracy of calculation. Lower values may produce unwanted artifacts." msgstr "" +"Быстродействие расчёта против точности расчёта. \n" +"Низкие значения этого параметра могут привести к нежелательным артефактам." -#: src/libslic3r/PrintConfig.cpp:3154 +#: src/libslic3r/PrintConfig.cpp:3186 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 " -"inflated back to the specified offset. A greater closing distance makes the " -"interior more rounded. At zero, the interior will resemble the exterior the " -"most." +"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 inflated back to the " +"specified offset. A greater closing distance makes the interior more rounded. At " +"zero, the interior will resemble the exterior the most." msgstr "" +"Полость в модели формуется в два этапа: сначала воображаемое внутреннее " +"пространство просчитывает глубину в объекте (смещение, плюс расстояние смыкания), а " +"затем раздувается обратно до указанного смещения. Большое значение расстояния " +"сшивки делает внутреннее пространство более округлым. При нулевом значении " +"внутреннее пространство будет больше всего напоминать наружную сторону модели." -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3602 msgid "Export OBJ" msgstr "Экспорт в OBJ" -#: src/libslic3r/PrintConfig.cpp:3568 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Export the model(s) as OBJ." -msgstr "" +msgstr "Экспортировать модель(и) в формат OBJ." -#: src/libslic3r/PrintConfig.cpp:3579 +#: src/libslic3r/PrintConfig.cpp:3614 msgid "Export SLA" -msgstr "" +msgstr "Экспорт для SLA печати" -#: src/libslic3r/PrintConfig.cpp:3580 +#: src/libslic3r/PrintConfig.cpp:3615 msgid "Slice the model and export SLA printing layers as PNG." -msgstr "" +msgstr "Нарезать модель и экспортировать слои печати для SLA в формат PNG." -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Export 3MF" msgstr "Экспорт в 3MF" -#: src/libslic3r/PrintConfig.cpp:3586 +#: src/libslic3r/PrintConfig.cpp:3621 msgid "Export the model(s) as 3MF." -msgstr "Экспортировать модель(и) в 3MF." +msgstr "Экспортировать модель(и) в формат 3MF." -#: src/libslic3r/PrintConfig.cpp:3590 +#: src/libslic3r/PrintConfig.cpp:3625 msgid "Export AMF" msgstr "Экспорт в AMF" -#: src/libslic3r/PrintConfig.cpp:3591 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Export the model(s) as AMF." -msgstr "Экспортировать модель(и) в AMF." +msgstr "Экспортировать модель(и) в формат AMF." -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3630 msgid "Export STL" msgstr "Экспорт в STL" -#: src/libslic3r/PrintConfig.cpp:3596 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Export the model(s) as STL." -msgstr "Экспортировать модель(и) в STL." +msgstr "Экспортировать модель(и) в формат STL." -#: src/libslic3r/PrintConfig.cpp:3601 +#: src/libslic3r/PrintConfig.cpp:3636 msgid "Slice the model and export toolpaths as G-code." -msgstr "Нарезать модель и экспортировать траектории в G-код." +msgstr "" +"Нарезать модель и экспортировать траекторию движения инструмента в G-код файл." -#: src/libslic3r/PrintConfig.cpp:3606 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "G-code viewer" -msgstr "" +msgstr "Просмотрщик G-кода" -#: src/libslic3r/PrintConfig.cpp:3607 +#: src/libslic3r/PrintConfig.cpp:3642 msgid "Visualize an already sliced and saved G-code" -msgstr "" +msgstr "Визуализация уже нарезанного и сохраненного G-кода" -#: src/libslic3r/PrintConfig.cpp:3612 +#: src/libslic3r/PrintConfig.cpp:3647 msgid "Slice" msgstr "Нарезать" -#: src/libslic3r/PrintConfig.cpp:3613 +#: src/libslic3r/PrintConfig.cpp:3648 msgid "" -"Slice the model as FFF or SLA based on the printer_technology configuration " -"value." +"Slice the model as FFF or SLA based on the printer_technology configuration value." msgstr "" +"Нарезает модель в зависимости от типа печати (FFF или SLA) на основе значения " +"конфигурации printer_technology." -#: src/libslic3r/PrintConfig.cpp:3618 +#: src/libslic3r/PrintConfig.cpp:3653 msgid "Help" -msgstr "Справка" +msgstr "Помощь" -#: src/libslic3r/PrintConfig.cpp:3619 +#: src/libslic3r/PrintConfig.cpp:3654 msgid "Show this help." -msgstr "Показать эту справку." +msgstr "Показать помощь." -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3659 msgid "Help (FFF options)" -msgstr "Справка (параметры для FFF)" +msgstr "Помощь (FFF настройки)" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3660 msgid "Show the full list of print/G-code configuration options." -msgstr "Показать полный список параметров настройки печати/G-кода." +msgstr "Показать полный список параметров конфигурации печати/G-кода." -#: src/libslic3r/PrintConfig.cpp:3629 +#: src/libslic3r/PrintConfig.cpp:3664 msgid "Help (SLA options)" -msgstr "Справка (параметры для SLA)" +msgstr "Помощь (SLA настройки)" -#: src/libslic3r/PrintConfig.cpp:3630 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "Show the full list of SLA print configuration options." -msgstr "Показать полный список параметров настройки печати по технологии SLA." +msgstr "Показать полный список параметров конфигурации SLA печати." -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3669 msgid "Output Model Info" -msgstr "Вывести информацию о модели" +msgstr "Информация о выходной модели" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3670 msgid "Write information about the model to the console." msgstr "Записать информацию о модели в консоль." -#: src/libslic3r/PrintConfig.cpp:3639 +#: src/libslic3r/PrintConfig.cpp:3674 msgid "Save config file" -msgstr "Сохранить файл настроек" +msgstr "Сохранить конфигурацию" -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "Save configuration to the specified file." -msgstr "Сохранить настройки в указанный файл." +msgstr "Сохраните конфигурацию в указанный файл." -#: src/libslic3r/PrintConfig.cpp:3650 +#: src/libslic3r/PrintConfig.cpp:3685 msgid "Align XY" -msgstr "Выровнять XY" +msgstr "Выровнять по XY" -#: src/libslic3r/PrintConfig.cpp:3651 +#: src/libslic3r/PrintConfig.cpp:3686 msgid "Align the model to the given point." -msgstr "Выровнять модель в указанной точке." +msgstr "Выровнять модель по заданной точке." -#: src/libslic3r/PrintConfig.cpp:3656 +#: src/libslic3r/PrintConfig.cpp:3691 msgid "Cut model at the given Z." -msgstr "Разрезать модель на указанном Z." +msgstr "Разрезать модель по Z." -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Center" -msgstr "Центр" +msgstr "По центру" -#: src/libslic3r/PrintConfig.cpp:3678 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "Center the print around the given center." -msgstr "Расположить печать вокруг указанного центра." +msgstr "Центрировать печать вокруг данного центра." -#: src/libslic3r/PrintConfig.cpp:3682 +#: src/libslic3r/PrintConfig.cpp:3717 msgid "Don't arrange" msgstr "Не расставлять" -#: src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" +"Не переставлять данные модели перед объединением и сохранять их исходные XY " +"координаты." -#: src/libslic3r/PrintConfig.cpp:3686 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Duplicate" -msgstr "" +msgstr "Дубликат" -#: src/libslic3r/PrintConfig.cpp:3687 +#: src/libslic3r/PrintConfig.cpp:3722 msgid "Multiply copies by this factor." -msgstr "" +msgstr "Увеличить количество копий на этот коэффициент." -#: src/libslic3r/PrintConfig.cpp:3691 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Duplicate by grid" -msgstr "" +msgstr "Дублировать по сетке" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3727 msgid "Multiply copies by creating a grid." -msgstr "" +msgstr "Увеличить количество копий путём создания сетки." -#: src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3731 msgid "" -"Arrange the supplied models in a plate and merge them in a single model in " -"order to perform actions once." +"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:3701 +#: src/libslic3r/PrintConfig.cpp:3736 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)." +"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:3705 +#: src/libslic3r/PrintConfig.cpp:3740 msgid "Rotation angle around the Z axis in degrees." -msgstr "" +msgstr "Угол поворота вокруг оси Z в градусах." -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3744 msgid "Rotate around X" -msgstr "Повернуть вокруг X" +msgstr "Поворот вокруг оси X" -#: src/libslic3r/PrintConfig.cpp:3710 +#: src/libslic3r/PrintConfig.cpp:3745 msgid "Rotation angle around the X axis in degrees." -msgstr "Поворот вокруг оси X в градусах." +msgstr "Угол поворота вокруг оси X в градусах." -#: src/libslic3r/PrintConfig.cpp:3714 +#: src/libslic3r/PrintConfig.cpp:3749 msgid "Rotate around Y" -msgstr "Повернуть вокруг Y" +msgstr "Поворот вокруг оси Y" -#: src/libslic3r/PrintConfig.cpp:3715 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Rotation angle around the Y axis in degrees." -msgstr "Поворот вокруг оси Y в градусах." +msgstr "Угол поворота вокруг оси Y в градусах." -#: src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3755 msgid "Scaling factor or percentage." -msgstr "" +msgstr "Коэффициент масштабирования или процент." -#: src/libslic3r/PrintConfig.cpp:3725 +#: src/libslic3r/PrintConfig.cpp:3760 msgid "" -"Detect unconnected parts in the given model(s) and split them into separate " -"objects." +"Detect unconnected parts in the given model(s) and split them into separate objects." msgstr "" +"Обнаружение несвязанных частей в выбранных моделях и разделение их на отдельные " +"объекты." -#: src/libslic3r/PrintConfig.cpp:3728 +#: src/libslic3r/PrintConfig.cpp:3763 msgid "Scale to Fit" -msgstr "Масштабировать по размеру" +msgstr "Отмасштабировать под область печати" -#: src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3764 msgid "Scale to fit the given volume." -msgstr "" +msgstr "Масштабировать в соответствии с заданным объёмом." -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3773 msgid "Ignore non-existent config files" -msgstr "" +msgstr "Игнорировать несуществующие конфигурационные файлы" -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/libslic3r/PrintConfig.cpp:3774 msgid "Do not fail if a file supplied to --load does not exist." -msgstr "" +msgstr "Не терпеть неудачу, если файла, предоставленного для --load, не существует." -#: src/libslic3r/PrintConfig.cpp:3742 +#: src/libslic3r/PrintConfig.cpp:3777 msgid "Load config file" -msgstr "Загрузить конфигурационный файл" +msgstr "Загрузить конфигурацию" -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3778 msgid "" -"Load configuration from the specified file. It can be used more than once to " -"load options from multiple files." +"Load configuration from the specified file. It can be used more than once to load " +"options from multiple files." msgstr "" +"Загрузить конфигурацию из указанного файла. Его можно использовать более одного " +"раза для загрузки параметров из нескольких файлов." -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3781 msgid "Output File" msgstr "Выходной файл" -#: src/libslic3r/PrintConfig.cpp:3747 +#: src/libslic3r/PrintConfig.cpp:3782 msgid "" -"The file where the output will be written (if not specified, it will be " -"based on the input file)." +"The file where the output will be written (if not specified, it will be based on " +"the input file)." msgstr "" -"Файл, в который будет записан результат (если не указан, то имя будет " -"основано на имени входного файла)." +"Файл, в который будут записываться выходные данные (если он не указан, то будет " +"основан на входном файле)." -#: src/libslic3r/PrintConfig.cpp:3752 +#: src/libslic3r/PrintConfig.cpp:3786 +msgid "Single instance mode" +msgstr "Одни экземпляр программы" + +#: src/libslic3r/PrintConfig.cpp:3787 msgid "" -"If enabled, the command line arguments are sent to an existing instance of " -"GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " -"the \"single_instance\" configuration value from application preferences." +"If enabled, the command line arguments are sent to an existing instance of GUI " +"PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides the " +"\"single_instance\" configuration value from application preferences." msgstr "" +"Если включено, аргументы командной строки посылаются в существующий экземпляр GUI " +"PrusaSlicer, либо активируется существующее окно PrusaSlicer. Переопределяет " +"значение конфигурации \"single_instance\" из настроек приложения." -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3798 msgid "Data directory" -msgstr "Каталог данных" +msgstr "Папка конфигурации пользователя" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3799 msgid "" -"Load and store settings at the given directory. This is useful for " -"maintaining different profiles or including configurations from a network " -"storage." +"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:3767 +#: src/libslic3r/PrintConfig.cpp:3802 msgid "Logging level" -msgstr "Уровень протоколирования" +msgstr "Уровень ведения журнала" -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "" -"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" -"trace\n" +"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 "" +"Задаёт параметр чувствительности записи событий в журнал. \n" +"0: Неустранимая ошибка, 1: Ошибка, 2: Предупреждение, 3: Информация, 4: Отладка, 5: " +"Трассировка\n" +"Например, loglevel=2 регистрирует неустранимые ошибки, ошибки и предупреждения." -#: src/libslic3r/PrintConfig.cpp:3774 +#: src/libslic3r/PrintConfig.cpp:3809 msgid "Render with a software renderer" -msgstr "" +msgstr "Визуализация с помощью программного рендеринга" -#: src/libslic3r/PrintConfig.cpp:3775 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" -"Render with a software renderer. The bundled MESA software renderer is " -"loaded instead of the default OpenGL driver." +"Render with a software renderer. The bundled MESA software renderer is loaded " +"instead of the default OpenGL driver." msgstr "" +"Вместо стандартного драйвера OpenGL будет использоваться программный рендеринг MESA." #: src/libslic3r/Zipper.cpp:27 msgid "Error with zip archive" -msgstr "" +msgstr "Ошибка с zip-архивом" -#: src/libslic3r/PrintObject.cpp:113 +#: src/libslic3r/PrintObject.cpp:112 msgid "Processing triangulated mesh" -msgstr "Обрабатывает треугольная сетка" +msgstr "Обработка триангулированной сетки" #: src/libslic3r/PrintObject.cpp:157 msgid "Generating perimeters" -msgstr "Генерируются периметры" +msgstr "Генерация периметров" #: src/libslic3r/PrintObject.cpp:260 msgid "Preparing infill" -msgstr "Подготовка заполнения" +msgstr "Подготовка к заполнению" #: src/libslic3r/PrintObject.cpp:421 msgid "Generating support material" -msgstr "Генерируется материал поддержки" - -#~ msgid "Jump to height %s or Set extruder sequence for the entire print" -#~ msgstr "" -#~ "Перейти к высоте %s или установить последовательность экструдеров для " -#~ "всей печати" - -#~ msgid "Default print color" -#~ msgstr "Цвет печати по умолчанию" - -#~ msgid "Pause print or custom G-code" -#~ msgstr "Пауза печати или пользовательский G-код" - -#~ msgid "%.2f - %.2f mm" -#~ msgstr "%.2f - %.2f мм" - -#~ msgid "Legend" -#~ msgstr "Обозначения" - -#~ msgid "" -#~ "This is the acceleration your printer will use for perimeters. A high " -#~ "value like 9000 usually gives good results if your hardware is up to the " -#~ "job. Set zero to disable acceleration control for perimeters." -#~ msgstr "" -#~ "Ускорение, которое принтер будет использовать для печати внутренних " -#~ "периметров. Высокое значение, такое как 9000, обычно даёт хороший " -#~ "результат, если ваше оборудование справляется с таким значением. " -#~ "Установите 0, чтобы отключить управление ускорением для внутренних " -#~ "периметров." - -#~ msgid "" -#~ "Copying of the temporary G-code to the output G-code failed. Maybe the SD " -#~ "card is write locked?" -#~ msgstr "" -#~ "Не удалось скопировать временный G-код в конечный G-код. Возможно SD-" -#~ "карта защищена от записи?" - -#~ msgid "Extruder and Bed Temperatures" -#~ msgstr "Температуры экструдера и стола" - -#~ msgid "An object outside the print area was detected" -#~ msgstr "Обнаружен объект, выходящий за пределы области печати" - -#~ msgid "A toolpath outside the print area was detected" -#~ msgstr "Обнаружена траектория, выходящая за пределы области печати" - -#~ msgid "Some objects are not visible" -#~ msgstr "Некоторые объекты невидимы" - -#~ msgid "FDM Support Editing" -#~ msgstr "Правка поддержек FDM" - -#~ msgid "The presets on the following tabs were modified" -#~ msgstr "Изменены настройки на следующих вкладках" - -#~ msgid "Discard changes and continue anyway?" -#~ msgstr "Отбросить изменения и продолжить?" - -#~ msgid "Unsaved Presets" -#~ msgstr "Несохранённые настройки" - -#~ msgid "Unretractions" -#~ msgstr "Подача (выдавливание)" - -#~ msgid "" -#~ "Scale selection to fit print volume\n" -#~ "in Gizmo scale" -#~ msgstr "Масштабировать выбранную модель по осям XYZ" - -#~ msgid "Show/Hide Legend" -#~ msgstr "Показать/скрыть подсказку" - -#~ msgid "" -#~ " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" -#~ "releases" -#~ msgstr "" -#~ " - Не забывайте проверять обновления на https://github.com/prusa3d/" -#~ "PrusaSlicer/" - -#~ msgid "Find option" -#~ msgstr "Параметры поиска" - -#~ msgid "Show &slope" -#~ msgstr "Показать метки" - -#~ msgid "&Options" -#~ msgstr "Параметры" - -#~ msgid " was successfully sliced." -#~ msgstr " успешно нарезан." - -#~ msgid "Expand right panel" -#~ msgstr "Раскрыть правую панель" - -#~ msgid "Collapse right panel" -#~ msgstr "Скрыть правую панель" - -#~ msgid "Single Instance" -#~ msgstr "Один экземпляр" - -#~ msgid "" -#~ "If this is enabled, when staring PrusaSlicer and another instance of same " -#~ "PrusaSlicer is running, that instance will be reactivated instead." -#~ msgstr "" -#~ "Если включено, то при запуске проверяется нет ли уже работающего " -#~ "PrusaSlicer, и при наличии открывается уже запущенный." - -#~ msgid "Show the button for the collapse sidebar" -#~ msgstr "Показывать кнопку скрытия боковой панели." - -#~ msgid "Add a new printer" -#~ msgstr "Добавить новый принтер" - -#~ msgid "USB/Serial connection" -#~ msgstr "USB/Последовательный порт" - -#~ msgid "Serial port" -#~ msgstr "Последовательный порт" - -#~ msgid "Rescan serial ports" -#~ msgstr "Пересканировать последовательные порты" - -#~ msgid "Connection to printer works correctly." -#~ msgstr "Подключение к принтеру установлено." - -#~ msgid "Connection failed." -#~ msgstr "Сбой подключения." - -#~ msgid "Default preset (%s)" -#~ msgstr "Профиль по умолчанию (%s)" - -#~ msgid "Preset (%s)" -#~ msgstr "Профиль (%s)" - -#~ msgid "has the following unsaved changes:" -#~ msgstr "имеет следующие несохранённые изменения:" - -#~ msgid "is not compatible with printer" -#~ msgstr "не совместим с принтером" - -#~ msgid "is not compatible with print profile" -#~ msgstr "не совместим с профилем принтера" - -#~ msgid "and it has the following unsaved changes:" -#~ msgstr "и имеет следующие несохранённые изменения:" - -#~ msgid "Unsaved Changes" -#~ msgstr "Несохранённые изменения" - -#~ msgid "Exporting model..." -#~ msgstr "Экспортируется модель…" - -#~ msgid "" -#~ "The Wipe Tower is currently only supported for the Marlin, RepRap/" -#~ "Sprinter and Repetier G-code flavors." -#~ msgstr "" -#~ "В настоящее время режим черновой башни поддерживается только для Marlin и " -#~ "RepRap/Sprinter типов G-кода." - -#~ msgid "First layer extruder temperature" -#~ msgstr "Объёмный расход первого слоя" - -#~ msgid "" -#~ "Extruder temperature for first layer. If you want to control temperature " -#~ "manually during print, set this to zero to disable temperature control " -#~ "commands in the output file." -#~ msgstr "" -#~ "Температура экструдера при печати первого слоя. Если во время печати " -#~ "хотите контролировать температуру вручную, установите 0 для отключить " -#~ "команд управления температурой в выходном файле." - -#~ msgid "Distance between ironing lins" -#~ msgstr "Расстояние между копиями" - -#~ msgid "Ironing speed" -#~ msgstr "Скорость разглаживания" - -#~ msgid "USB/serial port for printer connection." -#~ msgstr "Подключение к принтеру через USB/Последовательный порт." - -#~ msgid "Serial port speed" -#~ msgstr "Скорость последовательного порта" - -#~ msgid "Speed (baud) of USB/serial port for printer connection." -#~ msgstr "" -#~ "Скорость в бодах при подключении к принтеру через USB/Последовательный " -#~ "порт." - -#~ msgid "" -#~ "Extruder temperature for layers after the first one. Set this to zero to " -#~ "disable temperature control commands in the output." -#~ msgstr "" -#~ "Температура экструдера для слоёв после первого. Установите 0 для " -#~ "отключения команд контроля температуры на выходе." - -#~ msgid "Extruder temperature" -#~ msgstr "Температуры экструдера и стола" - -#~ msgid "Support head front diameter" -#~ msgstr "Поддержка тихого режима" - -#~ msgid "Support head penetration" -#~ msgstr "Генератор поддержек" - -#~ msgid "Support head width" -#~ msgstr "Генератор поддержек" - -#~ msgid "Support pillar diameter" -#~ msgstr "Поддержка тихого режима" - -#~ msgid "Support pillar connection mode" -#~ msgstr "Поддержка тихого режима" - -#~ msgid "Layer height:" -#~ msgstr "Высота слоя:" - -#~ msgid "Remove device" -#~ msgstr "Удалить устройство" - -#~ msgid "" -#~ "Unmounting successful. The device %s(%s) can now be safely removed from " -#~ "the computer." -#~ msgstr "" -#~ "Размонтирование выполнено. Теперь устройство %s(%s) можно отключить от " -#~ "компьютера." - -#~ msgid "Processing input file %s" -#~ msgstr "Обрабатывается входной файл %s" - -#~ msgid "Export failed" -#~ msgstr "Не удалось выполнить экспорт" - -#~ msgid "Indexing hollowed object" -#~ msgstr "Ниже объекта" - -#~ msgid "Hollowing cancelled." -#~ msgstr "Прошивка отменена." - -#~ msgid "Hollowing done." -#~ msgstr "Нарезка завершена" - -#~ msgid "Hollowing failed." -#~ msgstr "Сбой подключения." - -#~ msgid "" -#~ "To except of redundant tool manipulation, \n" -#~ "Color change(s) for unused extruder(s) was(were) deleted" -#~ msgstr "" -#~ "Для исключения ненужной работы с инструментом\n" -#~ "была удалена смена цвета в неиспользуемых экструдерах" - -#~ msgid "Position (mm)" -#~ msgstr "Х позиция башни" - -#~ msgid "Displacement (mm)" -#~ msgstr "Использовано прутка в мм³" - -#~ msgid "Rotation (deg)" -#~ msgstr "Длина ретракта" - -#~ msgid "Scale (%)" -#~ msgstr "Масштаб" - -#~ msgid "Change Application &Language" -#~ msgstr "Изменить язык приложения" - -#~ msgid "Select extruder number for selected objects and/or parts" -#~ msgstr "Разделить выбранную модель на отдельные части" - -#~ msgid "Main Shortcuts" -#~ msgstr "Основные команды" - -#~ msgid "Select All objects" -#~ msgstr "Выбрать все объекты" - -#~ msgid "Delete All" -#~ msgstr "Удалить всё" - - -#~ msgid "Zoom to selected object" -#~ msgstr "Удалить выбранную модель" - -#~ msgid "Plater Shortcuts" -#~ msgstr "Команды работы на вкладке плиты" - -#~ msgid "The selected project is no more available" -#~ msgstr "Выбранный проект больше недоступен" +msgstr "Генерация поддержек" -#~ msgid "(default)" -#~ msgstr "(по умолчанию)" +msgid "1 mm" +msgstr "1 мм" -#~ msgid "Welcome to the Slic3r %s" -#~ msgstr "Приветствуем в Slic3r %s" +msgid "2 mm" +msgstr "2 мм" -#~ msgid "Other vendors" -#~ msgstr "Другие производители" +msgid "5 mm" +msgstr "5 мм" -#~ msgid "Detected object outside print volume" -#~ msgstr "Модель не помещается в печатную область принтера" +msgid "10 mm" +msgstr "10 мм" -#~ msgid "Array of language names and identifiers should have the same size." -#~ msgstr "Список языков и идентификаторов должен быть одного размера." +msgid "Enable rotations" +msgstr "Разрешить вращение" -#~ msgid "Application will be restarted" -#~ msgstr "Приложение будет перезапущено." - -#~ msgid "You have unsaved changes " -#~ msgstr "У вас есть несохраненные изменения в профиле: " - -#~ msgid "Attempt to free unreferenced scalar" -#~ msgstr "Попытка освободить неопределённый скаляр" - -#~ msgid "The " -#~ msgstr "Шаблон заполнения " - -#~ msgid "Temperature " -#~ msgstr "Температура " - -#~ msgid "Values in this column are for Full Power mode" -#~ msgstr "Значения в этом столбце относятся к режиму полной мощности" - -#~ msgid "Full Power" -#~ msgstr "Полная мощность" - -#~ msgid "Silent" -#~ msgstr "Тихий режим" - -#~ msgid "Default " -#~ msgstr "По умолчанию " - -#~ msgid " preset\n" -#~ msgstr " шаблон\n" - -#~ msgid "" -#~ "\n" -#~ "\n" -#~ "Discard changes and continue anyway?" -#~ msgstr "" -#~ "\n" -#~ "\n" -#~ "Отменить изменения и продолжить в любом случае?" - -#~ msgid " the selected preset?" -#~ msgstr " выбранный профиль?" - -#~ msgid " as:" -#~ msgstr " как:" - -#~ msgid "%3.2f mm³/s" -#~ msgstr "%3.2f мм³/с" - -#~ msgid "Disable USB/serial connection" -#~ msgstr "Отключить последовательный порт/USB" - -#~ msgid "" -#~ "Disable communication with the printer over a serial / USB cable. This " -#~ "simplifies the user interface in case the printer is never attached to " -#~ "the computer." -#~ msgstr "" -#~ "Отключить связь с принтером через последовательный порт / USB кабель. " -#~ "Опция упрощает пользовательский интерфейс в случае, если принтер не будет " -#~ "подключаться к компьютеру." - -#~ msgid "Use legacy OpenGL 1.1 rendering" -#~ msgstr "Использовать устаревшую версию OpenGL 1.1" - -#~ msgid "" -#~ "If you have rendering issues caused by a buggy OpenGL 2.0 driver, you may " -#~ "try to check this checkbox. This will disable the layer height editing " -#~ "and anti aliasing, so it is likely better to upgrade your graphics driver." -#~ msgstr "" -#~ "Если у вас возникли проблемы с отрисовкой в программе, вызванные " -#~ "неисправным драйвером OpenGL 2.0, вы можете попробовать установить этот " -#~ "флажок. Это отключит функцию \"Переменная высота слоёв\" и сглаживание, " -#~ "поэтому вам всё же лучше обновить графический драйвер." - -#~ msgid "To download, follow the link below." -#~ msgstr "Чтобы скачать, перейдите по ссылке ниже." - -#~ msgid "Exit Slic3r" -#~ msgstr "Выйти из Slic3r" - -#~ msgid "Sending G-code file to the OctoPrint server..." -#~ msgstr "Отправка файла G-кода на сервер OctoPrint..." - -#~ msgid "" -#~ "All extruders must have the same diameter for single extruder " -#~ "multimaterial printer." -#~ msgstr "" -#~ "Все экструдеры в одноэкструдерном мультиматериальном принтере должны " -#~ "иметь сопло одинакового диаметра." - -#~ msgid "first_layer_height" -#~ msgstr "first_layer_height" - -#~ msgid "mm or % (leave 0 for default)" -#~ msgstr "мм или % (по умолчанию 0)" - -#~ msgid "mm or % (leave 0 for auto)" -#~ msgstr "мм или % (0 для автонастройки)" - -#~ msgid "Set silent mode for the G-code flavor" -#~ msgstr "Тихий режим для выбранного G-кода." - -#~ msgid "Maximum feedrate %1%" -#~ msgstr "Максимальная скорость подачи %1%" - -#~ msgid "Maximum acceleration %1%" -#~ msgstr "Максимальное ускорение %1%" - -#~ msgid "API Key" -#~ msgstr "API ключ" - -#~ msgid "" -#~ "This custom code is inserted right before every extruder change. Note " -#~ "that you can use placeholder variables for all Slic3r settings as well as " -#~ "[previous_extruder] and [next_extruder]." -#~ msgstr "" -#~ "Этот пользовательский код вставляется перед каждой сменой экструдера. " -#~ "Обратите внимание, что вы можете использовать шаблонные переменные для " -#~ "всех параметров Slic3r, в том числе [previous_extruder] и [next_extruder] " -#~ "(предыдущий_экструдер и следующий_экструдер)" - -#~ msgid "degrees" -#~ msgstr "градусы" - -#~ msgid "Purging into infill" -#~ msgstr "Прочистка в заполнение" - -#~ msgid "Version " -#~ msgstr "Версия " - -#~ msgid "Controller" -#~ msgstr "Управления принтером" - -#~ msgid "&Load Config…\tCtrl+L" -#~ msgstr "&Загрузить конфигурацию…\tCtrl+L" - -#~ msgid "&Export Config…\tCtrl+E" -#~ msgstr "&Сохранить текущую конфигурацию…\tCtrl+E" - -#~ msgid "Q&uick Slice…\tCtrl+U" -#~ msgstr "Быстрая &нарезка…\tCtrl+U" - -#~ msgid "&Repeat Last Quick Slice\tCtrl+Shift+U" -#~ msgstr "&Повтор последней быстрой нарезки\tCtrl+Shift+U" - -#~ msgid "Slice to SV&G…\tCtrl+G" -#~ msgstr "Нарезать в SV&G…\tCtrl+G" - -#~ msgid "Slice file to a multi-layer SVG" -#~ msgstr "Нарезать в SVG" - -#~ msgid "Export current plate as 3MF" -#~ msgstr "Экспортировать текущие модели со стола в 3MF" - -#~ msgid "Select &Controller Tab\tCtrl+T" -#~ msgstr "Вкладка управления принтером\tCtrl+T" - -#~ msgid "Show the printer controller" -#~ msgstr "Показать управление принтером" - -#~ msgid "Prusa Edition Releases" -#~ msgstr "Сайт Prusa Edition" - -#~ msgid "Slic3r &Manual" -#~ msgstr "Онлайн руководство по Slic3r" - -#~ msgid "Open the Slic3r manual in your browser" -#~ msgstr "Открыть руководство по Slic3r" - -#~ msgid "Report an issue on the Slic3r Prusa Edition" -#~ msgstr "Сообщить о проблеме в Slic3r Prusa Edition" - -#~ msgid "2D" -#~ msgstr "2D" - -#~ msgid "Add…" -#~ msgstr "Добавить…" - -#~ msgid "Fewer" -#~ msgstr "Меньше" - -#~ msgid "45° ccw" -#~ msgstr "45° влево" - -#~ msgid "45° cw" -#~ msgstr "45° вправо" - -#~ msgid "Scale…" -#~ msgstr "Масштабирование..." - -#~ msgid "Cut…" -#~ msgstr "Разрезать…" - -#~ msgid "Settings…" -#~ msgstr "Настройки…" - -#~ msgid "Copies" -#~ msgstr "Копий" - -#~ msgid "Export G-code…" -#~ msgstr "Экспорт G-кода…" - -#~ msgid "Print…" -#~ msgstr "Печать…" - -#~ msgid "Enter the number of copies of the selected object:" -#~ msgstr "Введите нужное количество копий выбранной модели:" - -#~ msgid "" -#~ "\n" -#~ "Non-positive value." -#~ msgstr "" -#~ "\n" -#~ "Не положительное значение." - -#~ msgid "" -#~ "\n" -#~ "Not a numeric value." -#~ msgstr "" -#~ "\n" -#~ "Не числовое значение." - -#~ msgid "Slic3r Error" -#~ msgstr "Ошибка Slic3r" - -#~ msgid "Enter the rotation angle:" -#~ msgstr "Введите угол поворота:" - -#~ msgid "Enter the new size for the selected object (print bed: %smm):" -#~ msgstr "Введите новый размер для выбранной модели (стол: %s мм):" - -#~ msgid "Scale along " -#~ msgstr "Масштаб по оси " - -#~ msgid "Enter the scale % for the selected object:" -#~ msgstr "Введите нужный масштаб в % для выбранной модели:" - -#~ msgid "Enter the new max size for the selected object:" -#~ msgstr "Введите новый максимальный размер для выбранной модели:" - -#~ msgid "Slicing cancelled" -#~ msgstr "Нарезка отменена" - -#~ msgid "File added to print queue" -#~ msgstr "Файл добавлен в очередь печати" - -#~ msgid "OctoPrint upload finished." -#~ msgstr "Отправка на сервер OctoPrint выполнена." - -#~ msgid "Estimated printing time (silent mode)" -#~ msgstr "Расчётное время печати (тихий режим)" - -#~ msgid "Rotate 45° clockwise" -#~ msgstr "Поворот на 45° по часовой стрелке" - -#~ msgid "Rotate the selected object by 45° clockwise" -#~ msgstr "Поворот выбранной модели на 45° по часовой стрелке" - -#~ msgid "Rotate 45° counter-clockwise" -#~ msgstr "Поворот на 45° против часовой стрелки" - -#~ msgid "Rotate the selected object by 45° counter-clockwise" -#~ msgstr "Поворот выбранной модели на 45° против часовой стрелки" - -#~ msgid "Rotate the selected object by an arbitrary angle" -#~ msgstr "Поворот выбранной модели на произвольный угол" - -#~ msgid "Around X axis…" -#~ msgstr "Вокруг оси X..." - -#~ msgid "Rotate the selected object by an arbitrary angle around X axis" -#~ msgstr "Поворот выбранной модели на произвольный угол вокруг оси X" - -#~ msgid "Around Y axis…" -#~ msgstr "Вокруг оси Y..." - -#~ msgid "Rotate the selected object by an arbitrary angle around Y axis" -#~ msgstr "Поворот выбранной модели на произвольный угол вокруг оси Y" - -#~ msgid "Around Z axis…" -#~ msgstr "Вокруг оси Z..." - -#~ msgid "Rotate the selected object by an arbitrary angle around Z axis" -#~ msgstr "Поворот выбранной модели на произвольный угол вокруг оси Z" +msgid "Gap size" +msgstr "Зазор между моделями" -#~ msgid "Scale the selected object along a single axis" -#~ msgstr "Масштабирование выбранной модели вдоль одной оси" +msgid "Jump to height %s or Set ruler mode" +msgstr "Перейти к заданной высоте %s или задать режимы линейки" -#~ msgid "Uniformly…" -#~ msgstr "Одинаково..." +msgid "You will not be asked about it again on label hovering." +msgstr "Вас больше не будут спрашивать об этом при нажатии на параметры." -#~ msgid "Scale the selected object along the X axis" -#~ msgstr "Масштабировать выбранную модель вдоль оси Х" +msgid "Should we suppress to use hyperlinks in PrusaSlicer?" +msgstr "Хотите запретить использование гиперссылок в PrusaSlicer?" -#~ msgid "Scale the selected object along the Y axis" -#~ msgstr "Масштабировать выбранную модель вдоль оси Y" +msgid "time" +msgstr "Время" -#~ msgid "Scale the selected object along the Z axis" -#~ msgstr "Масштабировать выбранную модель вдоль оси Z" +msgid "PrusaSlicer: Open hyperlink" +msgstr "PrusaSlicer: открытие гиперссылки" -#~ msgid "Open the 3D cutting tool" -#~ msgstr "Открыть режущий инструмент" +msgid "Should we open this hyperlink in your default browser?" +msgstr "Открыть эту гиперссылку в браузере по умолчанию?" -#~ msgid "Open the object editor dialog" -#~ msgstr "Открыть диалоговое окно редактора модели" +msgid "During the other layers, fan" +msgstr "Во время печати других слоёв, вентилятор" -#~ msgid "Export object as STL…" -#~ msgstr "Экспорт модели в STL..." +msgid "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%" +msgstr "Скорость вентилятора будет увеличена с нуля на %1% слое до %2%%% на %3% слое." -#~ msgid "" -#~ "Fix the model by sending it to a Netfabb cloud service through Windows 10 " -#~ "API" -#~ msgstr "" -#~ "Исправить модель, отправив её в облачную службу Netfabb через API Windows " -#~ "10" +msgid "Select a file" +msgstr "Выберите файл" From bcd920e639a522f26d84642fba9b7c7b9b0dd94c Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 14 Jan 2021 10:27:19 +0100 Subject: [PATCH 020/143] Updated MO-file for RU dictionary --- resources/localization/ru/PrusaSlicer.mo | Bin 402899 -> 402508 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/localization/ru/PrusaSlicer.mo b/resources/localization/ru/PrusaSlicer.mo index e292895138b5453b59033de08526c88198585361..ea216536487311e15242b6e2a3120a03b091ce8e 100644 GIT binary patch delta 22871 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 WQb&bK^l}rN)Tyb{LNg0R*7|=c>ic2< delta 23398 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 From 8bdfb6bbce6fce6c08d180fb2ec25b57576b0d93 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 14 Jan 2021 11:38:03 +0100 Subject: [PATCH 021/143] ENABLE_SPLITTED_VERTEX_BUFFER - fixed bugs in export of toolpaths to obj files and in index buffer splitting --- src/slic3r/GUI/GCodeViewer.cpp | 43 ++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 882ac97eacd..b3794175e71 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -793,13 +793,13 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const } fprintf(fp, "# G-Code Toolpaths Materials\n"); - fprintf(fp, "# Generated by %s based on Slic3r\n", SLIC3R_BUILD_ID); + fprintf(fp, "# Generated by %s-%s based on Slic3r\n", SLIC3R_APP_NAME, SLIC3R_VERSION); unsigned int colors_count = 1; for (const Color& color : colors) { fprintf(fp, "\nnewmtl material_%d\n", colors_count++); fprintf(fp, "Ka 1 1 1\n"); - fprintf(fp, "Kd %f %f %f\n", color[0], color[1], color[2]); + fprintf(fp, "Kd %g %g %g\n", color[0], color[1], color[2]); fprintf(fp, "Ks 0 0 0\n"); } @@ -813,7 +813,7 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const } fprintf(fp, "# G-Code Toolpaths\n"); - fprintf(fp, "# Generated by %s based on Slic3r\n", SLIC3R_BUILD_ID); + fprintf(fp, "# Generated by %s-%s based on Slic3r\n", SLIC3R_APP_NAME, SLIC3R_VERSION); fprintf(fp, "\nmtllib ./%s\n", mat_filename.filename().string().c_str()); #if ENABLE_SPLITTED_VERTEX_BUFFER @@ -821,8 +821,14 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const std::vector out_vertices; std::vector out_normals; - std::vector vertices_offsets; - vertices_offsets.push_back(0); + + struct VerticesOffset + { + unsigned int vbo; + size_t offset; + }; + std::vector vertices_offsets; + vertices_offsets.push_back({ t_buffer.vertices.vbos.front(), 0 }); // get vertices/normals data from vertex buffers on gpu for (size_t i = 0; i < t_buffer.vertices.vbos.size(); ++i) { @@ -837,7 +843,9 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const out_vertices.push_back({ vertices[base + 0], vertices[base + 1], vertices[base + 2] }); out_normals.push_back({ vertices[base + 3], vertices[base + 4], vertices[base + 5] }); } - vertices_offsets.push_back(vertices_offsets.back() + vertices_count); + + if (i < t_buffer.vertices.vbos.size() - 1) + vertices_offsets.push_back({ t_buffer.vertices.vbos[i + 1], vertices_offsets.back().offset + vertices_count }); } // save vertices to file @@ -863,16 +871,23 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const continue; const IBuffer& ibuffer = t_buffer.indices[render_path.index_buffer_id]; - const size_t vertices_offset = vertices_offsets[render_path.index_buffer_id]; + size_t vertices_offset = 0; + for (size_t j = 0; j < vertices_offsets.size(); ++j) { + const VerticesOffset& offset = vertices_offsets[j]; + if (offset.vbo == ibuffer.vbo) { + vertices_offset = offset.offset; + break; + } + } // get indices data from index buffer on gpu glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer.ibo)); for (size_t j = 0; j < render_path.sizes.size(); ++j) { - const size_t triangles_count = render_path.sizes[j] / 3; IndexBuffer indices(render_path.sizes[j]); glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(render_path.offsets[j]), static_cast(render_path.sizes[j] * sizeof(unsigned int)), static_cast(indices.data()))); + const size_t triangles_count = render_path.sizes[j] / 3; for (size_t k = 0; k < triangles_count; ++k) { const size_t base = k * 3; const size_t v1 = 1 + static_cast(indices[base + 0]) + vertices_offset; @@ -1676,6 +1691,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) if (i_multibuffer.back().size() * sizeof(unsigned int) >= IBUFFER_THRESHOLD_BYTES - t_buffer.indices_per_segment_size_bytes()) { i_multibuffer.push_back(IndexBuffer()); vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); + if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) { + Path& last_path = t_buffer.paths.back(); + --last_path.sub_paths.back().last.s_id; + last_path.add_sub_path(prev, static_cast(i_multibuffer.size()) - 1, 0, i - 1); + } } // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer @@ -1689,6 +1709,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) { Path& last_path = t_buffer.paths.back(); + --last_path.sub_paths.back().last.s_id; last_path.add_sub_path(prev, static_cast(i_multibuffer.size()) - 1, 0, i - 1); } } @@ -1728,10 +1749,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) size_t size_elements = i_buffer.size(); size_t size_bytes = size_elements * sizeof(unsigned int); - if (size_elements == 0) { - continue; - } - // stores index buffer informations into TBuffer t_buffer.indices.push_back(IBuffer()); IBuffer& ibuf = t_buffer.indices.back(); @@ -2777,6 +2794,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool RenderPath key{ color, static_cast(ibuffer_id), path_id }; if (render_path == nullptr || !RenderPathPropertyEqual()(*render_path, key)) render_path = const_cast(&(*buffer->render_paths.emplace(key).first)); + unsigned int size_in_indices = 0; switch (buffer->render_primitive_type) { @@ -2791,7 +2809,6 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool break; } } - render_path->sizes.push_back(size_in_indices); unsigned int delta_1st = 0; From 48877614e2138001eda6ff598bbd2b390022d4bf Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Thu, 14 Jan 2021 12:51:28 +0100 Subject: [PATCH 022/143] Fix of --scale-to-fit not accepting any input as valid (#5772) Fixed parsing of Point3, fortunately Point3 was used at just a single command line parameter, thus this was not a big deal. --- src/libslic3r/Config.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index 8cdacd59f33..12c19eaefec 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -1163,8 +1163,8 @@ class ConfigOptionPoint3 : public ConfigOptionSingle { UNUSED(append); char dummy; - return sscanf(str.data(), " %lf , %lf , %lf %c", &this->value(0), &this->value(1), &this->value(2), &dummy) == 2 || - sscanf(str.data(), " %lf x %lf x %lf %c", &this->value(0), &this->value(1), &this->value(2), &dummy) == 2; + return sscanf(str.data(), " %lf , %lf , %lf %c", &this->value(0), &this->value(1), &this->value(2), &dummy) == 3 || + sscanf(str.data(), " %lf x %lf x %lf %c", &this->value(0), &this->value(1), &this->value(2), &dummy) == 3; } private: From 21d01291fb4c3a79be537e694ce02ca2c537263d Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 15 Jan 2021 09:34:03 +0100 Subject: [PATCH 023/143] Updated windows building guide to build dependencies out of the PrusaSlicer source tree. --- doc/How to build - Windows.md | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/doc/How to build - Windows.md b/doc/How to build - Windows.md index 7207a20e5ad..5c54d098e2a 100644 --- a/doc/How to build - Windows.md +++ b/doc/How to build - Windows.md @@ -1,29 +1,35 @@ # Step by Step Visual Studio 2019 Instructions -Install Visual Studio Community 2019 from [visualstudio.microsoft.com/vs/](https://visualstudio.microsoft.com/vs/) +Install Visual Studio Community 2019 from [visualstudio.microsoft.com/vs/](https://visualstudio.microsoft.com/vs/). Older versions are not supported as PrusaSlicer requires support for C++17. Select all workload options for C++ Install git for Windows from [gitforwindows.org](https://gitforwindows.org/) Download and run the exe accepting all defaults -Clone the respository. To place it in C:\PrusaSlicer, run: -c:\>git clone https://github.com/prusa3d/PrusaSlicer.git +Clone the respository. To place it in C:\src\PrusaSlicer, run: +``` +c:> mkdir src +c:> cd src +c:\src> git clone https://github.com/prusa3d/PrusaSlicer.git +``` Go to the Windows Start Menu and Click on "Visual Studio 2019" folder, then select the ->"x64 Native Tools Command Prompt" to open a command window and run the following: -cd c:\PrusaSlicer\deps +``` +cd c:\src\PrusaSlicer\deps mkdir build cd build -cmake .. -G "Visual Studio 16 2019" -DDESTDIR="c:\PrusaSlicer" +cmake .. -G "Visual Studio 16 2019" -DDESTDIR="c:\src\PrusaSlicer-deps" msbuild /m ALL_BUILD.vcxproj // This took 13.5 minutes on my machine: core I7-7700K @ 4.2Ghz with 32GB main memory and 20min on a average laptop -cd c:\PrusaSlicer\ +cd c:\src\PrusaSlicer\ mkdir build cd build -cmake .. -G "Visual Studio 16 2019" -DCMAKE_PREFIX_PATH="c:\PrusaSlicer\usr\local" +cmake .. -G "Visual Studio 16 2019" -DCMAKE_PREFIX_PATH="c:\src\PrusaSlicer-deps\usr\local" +``` -Double-click c:\PrusaSlicer\build\PrusaSlicer.sln to open in Visual Studio 2019. +Double-click c:\src\PrusaSlicer\build\PrusaSlicer.sln to open in Visual Studio 2019. OR Open Visual Studio for C++ development (VS asks this the first time you start it). From 59911e7c35c61725834dc30c46bf964eb4774fbc Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 15 Jan 2021 09:34:50 +0100 Subject: [PATCH 024/143] Slight improvement in Hilbert infill by using constexpr --- src/libslic3r/Fill/FillPlanePath.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/Fill/FillPlanePath.cpp b/src/libslic3r/Fill/FillPlanePath.cpp index a7a33b13d79..7beaf2f08e9 100644 --- a/src/libslic3r/Fill/FillPlanePath.cpp +++ b/src/libslic3r/Fill/FillPlanePath.cpp @@ -101,9 +101,9 @@ Pointfs FillArchimedeanChords::_generate(coord_t min_x, coord_t min_y, coord_t m // static inline Point hilbert_n_to_xy(const size_t n) { - static const int next_state[16] = { 4,0,0,12, 0,4,4,8, 12,8,8,4, 8,12,12,0 }; - static const int digit_to_x[16] = { 0,1,1,0, 0,0,1,1, 1,0,0,1, 1,1,0,0 }; - static const int digit_to_y[16] = { 0,0,1,1, 0,1,1,0, 1,1,0,0, 1,0,0,1 }; + static constexpr const int next_state[16] { 4,0,0,12, 0,4,4,8, 12,8,8,4, 8,12,12,0 }; + static constexpr const int digit_to_x[16] { 0,1,1,0, 0,0,1,1, 1,0,0,1, 1,1,0,0 }; + static constexpr const int digit_to_y[16] { 0,0,1,1, 0,1,1,0, 1,1,0,0, 1,0,0,1 }; // Number of 2 bit digits. size_t ndigits = 0; From d63e681bf30d73d8536245f192ba456f372c90d3 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 15 Jan 2021 09:40:13 +0100 Subject: [PATCH 025/143] Further improvement of how to build on windows guide --- doc/How to build - Windows.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/How to build - Windows.md b/doc/How to build - Windows.md index 5c54d098e2a..3df17b88f95 100644 --- a/doc/How to build - Windows.md +++ b/doc/How to build - Windows.md @@ -1,11 +1,15 @@ # Step by Step Visual Studio 2019 Instructions +### Install the tools + Install Visual Studio Community 2019 from [visualstudio.microsoft.com/vs/](https://visualstudio.microsoft.com/vs/). Older versions are not supported as PrusaSlicer requires support for C++17. Select all workload options for C++ Install git for Windows from [gitforwindows.org](https://gitforwindows.org/) Download and run the exe accepting all defaults +### Download sources + Clone the respository. To place it in C:\src\PrusaSlicer, run: ``` c:> mkdir src @@ -13,8 +17,9 @@ c:> cd src c:\src> git clone https://github.com/prusa3d/PrusaSlicer.git ``` +### Compile the dependencies. +Dependencies are updated seldomly, thus they are compiled out of the PrusaSlicer source tree. Go to the Windows Start Menu and Click on "Visual Studio 2019" folder, then select the ->"x64 Native Tools Command Prompt" to open a command window and run the following: - ``` cd c:\src\PrusaSlicer\deps mkdir build @@ -22,13 +27,19 @@ cd build cmake .. -G "Visual Studio 16 2019" -DDESTDIR="c:\src\PrusaSlicer-deps" msbuild /m ALL_BUILD.vcxproj // This took 13.5 minutes on my machine: core I7-7700K @ 4.2Ghz with 32GB main memory and 20min on a average laptop +``` +### Generate Visual Studio project file for PrusaSlicer, referencing the precompiled dependencies. +Go to the Windows Start Menu and Click on "Visual Studio 2019" folder, then select the ->"x64 Native Tools Command Prompt" to open a command window and run the following: +``` cd c:\src\PrusaSlicer\ mkdir build cd build cmake .. -G "Visual Studio 16 2019" -DCMAKE_PREFIX_PATH="c:\src\PrusaSlicer-deps\usr\local" ``` +### Compile PrusaSlicer. + Double-click c:\src\PrusaSlicer\build\PrusaSlicer.sln to open in Visual Studio 2019. OR Open Visual Studio for C++ development (VS asks this the first time you start it). From aa19870c5410e4cff3caa567524b211d8250a5ad Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 15 Jan 2021 10:56:02 +0100 Subject: [PATCH 026/143] Updated doc/Localization_guide.md --- doc/Localization_guide.md | 35 +++++++++++++++++++++++++---- doc/images/long_text_on_button.png | Bin 0 -> 11913 bytes 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 doc/images/long_text_on_button.png diff --git a/doc/Localization_guide.md b/doc/Localization_guide.md index 8e34deef55e..8dfbc54904d 100644 --- a/doc/Localization_guide.md +++ b/doc/Localization_guide.md @@ -16,7 +16,7 @@ Full manual for GNUgettext can be seen here: http://www.gnu.org/software/gettext https://github.com/prusa3d/PrusaSlicer/tree/master/resources/localization 2. Open this file in PoEdit as "Edit a translation" 3. Apply your corrections to the translation -4. Push changed PrusaSlicer.po and PrusaSlicer.mo (will create automatically after saving of PrusaSlicer.po in PoEdit) back to to the enter folder. +4. Push changed PrusaSlicer.po and PrusaSlicer.mo (will create automatically after saving of PrusaSlicer.po in PoEdit) into the original folder. ### Scenario 2. How do I add a new language support 1. Get file PrusaSlicer.pot here : @@ -71,6 +71,33 @@ https://github.com/prusa3d/PrusaSlicer/tree/master/resources/localization/list.t ``` Notice, in this Catalog it will be totally same strings for initial text and translated. -When you have Catalog to translation open POT or PO file in PoEdit and start to translation, -it's very important to keep attention to every gaps and punctuation. Especially with -formatted strings. (using %d, %s, etc.) \ No newline at end of file +When you have Catalog to translation open POT or PO file in PoEdit and start translating. + + +## General guidelines for PrusaSlicer translators + + +- We recommend using *PoEdit* application for translation (as described above). It will help you eliminate most punctuation errors and will show you strings with "random" translations (if the fuzzy parameter was used). + +- To check how the translated text looks on the UI elements, test it :) If you use *PoEdit*, all you need to do is save the file. At this point, a MO file will be created. Rename it PrusaSlicer.mo, and you can run PrusaSlicer (see above). + +- If you see an encoding error (garbage characters instead of Unicode) somewhere in PrusaSlicer, report it. It is likely not a problem of your translation, but a bug in the software. + +- See on which UI elements the translated phrase will be used. Especially if it's a button, it is very important to decide on the translation and not write alternative translations in parentheses, as this will significantly increase the width of the button, which is sometimes highly undesirable: + +![Long text on button](images/long_text_on_button.png) + +- If you decide to use autocorrect or any batch processing tool, the output requires very careful proofreading. It is very easy to make it do changes that break things big time. + +- **Any formatting parts of the phrases must remain unchanged.** For example, you should not change `%1%` to `%1 %`, you should not change `%%` to `%` (for percent sign) and similar. This will lead to application crashes. + +- Please pay attention to spaces, line breaks (\n) and punctuation marks. **Don't add extra line breaks.** This is especially important for parameter names. + +- Description of the parameters should not contain units of measurement. For example, "Enable fan if layer print time is less than ~~n seconds~~" + +- For units of measurement, use the international system of units. Use "s" instead of "sec". + +- If the phrase doesn't have a dot at the end, don't add it. And if it does, then don't forget to :) + +- It is useful to stick to the same terminology in the application (especially with basic terms such as "filament" and similar). Stay consistent. Otherwise it will confuse users. + diff --git a/doc/images/long_text_on_button.png b/doc/images/long_text_on_button.png new file mode 100644 index 0000000000000000000000000000000000000000..5f4ca87be247275a178d3c28e9a45b7af420504c GIT binary patch literal 11913 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 Date: Fri, 15 Jan 2021 13:46:14 +0100 Subject: [PATCH 027/143] Bumped up boost version from 1.70.0 to 1.75.0 mainly due to an issue with an updated Xcode / clang incorrectly reporting that it supports __cpp_lib_uncaught_exceptions while it does not if targeting older platforms. This issue has been fixed in boost 1.74.0 and 1.75.0 --- deps/deps-linux.cmake | 4 ++-- deps/deps-macos.cmake | 4 ++-- deps/deps-mingw.cmake | 4 ++-- deps/deps-windows.cmake | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/deps/deps-linux.cmake b/deps/deps-linux.cmake index 420638d2f0b..ff40c27fdfd 100644 --- a/deps/deps-linux.cmake +++ b/deps/deps-linux.cmake @@ -13,8 +13,8 @@ include("deps-unix-common.cmake") ExternalProject_Add(dep_boost EXCLUDE_FROM_ALL 1 - URL "https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.gz" - URL_HASH SHA256=882b48708d211a5f48e60b0124cf5863c1534cd544ecd0664bb534a4b5d506e9 + URL "https://dl.bintray.com/boostorg/release/1.75.0/source/boost_1_75_0.tar.gz" + URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a BUILD_IN_SOURCE 1 CONFIGURE_COMMAND ./bootstrap.sh --with-libraries=system,iostreams,filesystem,thread,log,locale,regex diff --git a/deps/deps-macos.cmake b/deps/deps-macos.cmake index f985cc56104..8dd7953bb51 100644 --- a/deps/deps-macos.cmake +++ b/deps/deps-macos.cmake @@ -18,8 +18,8 @@ include("deps-unix-common.cmake") ExternalProject_Add(dep_boost EXCLUDE_FROM_ALL 1 - URL "https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.gz" - URL_HASH SHA256=882b48708d211a5f48e60b0124cf5863c1534cd544ecd0664bb534a4b5d506e9 + URL "https://dl.bintray.com/boostorg/release/1.75.0/source/boost_1_75_0.tar.gz" + URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a BUILD_IN_SOURCE 1 CONFIGURE_COMMAND ./bootstrap.sh --with-toolset=clang diff --git a/deps/deps-mingw.cmake b/deps/deps-mingw.cmake index 89b7e2b4378..2ab13c4129b 100644 --- a/deps/deps-mingw.cmake +++ b/deps/deps-mingw.cmake @@ -9,8 +9,8 @@ include("deps-unix-common.cmake") ExternalProject_Add(dep_boost EXCLUDE_FROM_ALL 1 - URL "https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.gz" - URL_HASH SHA256=882b48708d211a5f48e60b0124cf5863c1534cd544ecd0664bb534a4b5d506e9 + URL "https://dl.bintray.com/boostorg/release/1.75.0/source/boost_1_75_0.tar.gz" + URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a BUILD_IN_SOURCE 1 CONFIGURE_COMMAND bootstrap.bat BUILD_COMMAND b2.exe diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake index ac93b493203..5d343c403ca 100644 --- a/deps/deps-windows.cmake +++ b/deps/deps-windows.cmake @@ -55,8 +55,8 @@ endmacro() ExternalProject_Add(dep_boost EXCLUDE_FROM_ALL 1 - URL "https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.gz" - URL_HASH SHA256=882b48708d211a5f48e60b0124cf5863c1534cd544ecd0664bb534a4b5d506e9 + URL "https://dl.bintray.com/boostorg/release/1.75.0/source/boost_1_75_0.tar.gz" + URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a BUILD_IN_SOURCE 1 CONFIGURE_COMMAND bootstrap.bat BUILD_COMMAND b2.exe From d28d8dda75cf339f14ca4c5038fbce6a65f57b7d Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 15 Jan 2021 18:07:14 +0100 Subject: [PATCH 028/143] Updated boost requies date_time library to be compiled. --- deps/deps-linux.cmake | 2 +- deps/deps-macos.cmake | 2 +- deps/deps-mingw.cmake | 1 + deps/deps-windows.cmake | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/deps/deps-linux.cmake b/deps/deps-linux.cmake index ff40c27fdfd..2da28909762 100644 --- a/deps/deps-linux.cmake +++ b/deps/deps-linux.cmake @@ -17,7 +17,7 @@ ExternalProject_Add(dep_boost URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a BUILD_IN_SOURCE 1 CONFIGURE_COMMAND ./bootstrap.sh - --with-libraries=system,iostreams,filesystem,thread,log,locale,regex + --with-libraries=system,iostreams,filesystem,thread,log,locale,regex,date_time "--prefix=${DESTDIR}/usr/local" BUILD_COMMAND ./b2 -j ${NPROC} diff --git a/deps/deps-macos.cmake b/deps/deps-macos.cmake index 8dd7953bb51..bf9501ca028 100644 --- a/deps/deps-macos.cmake +++ b/deps/deps-macos.cmake @@ -23,7 +23,7 @@ ExternalProject_Add(dep_boost BUILD_IN_SOURCE 1 CONFIGURE_COMMAND ./bootstrap.sh --with-toolset=clang - --with-libraries=system,iostreams,filesystem,thread,log,locale,regex + --with-libraries=system,iostreams,filesystem,thread,log,locale,regex,date_time "--prefix=${DESTDIR}/usr/local" BUILD_COMMAND ./b2 -j ${NPROC} diff --git a/deps/deps-mingw.cmake b/deps/deps-mingw.cmake index 2ab13c4129b..c97346bb039 100644 --- a/deps/deps-mingw.cmake +++ b/deps/deps-mingw.cmake @@ -21,6 +21,7 @@ ExternalProject_Add(dep_boost --with-log --with-locale --with-regex + --with-date_time "--prefix=${DESTDIR}/usr/local" "address-model=${DEPS_BITS}" "toolset=${DEP_BOOST_TOOLSET}" diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake index 5d343c403ca..81d52b84246 100644 --- a/deps/deps-windows.cmake +++ b/deps/deps-windows.cmake @@ -68,6 +68,7 @@ ExternalProject_Add(dep_boost --with-log --with-locale --with-regex + --with-date_time "--prefix=${DESTDIR}/usr/local" "address-model=${DEPS_BITS}" "toolset=${DEP_BOOST_TOOLSET}" From d06aa60691025dfa261bca8b247c1e7255296829 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 15 Jan 2021 19:47:51 +0100 Subject: [PATCH 029/143] Fixing Perl bindings after update of Boost. --- xs/src/xsinit.h | 1 + 1 file changed, 1 insertion(+) diff --git a/xs/src/xsinit.h b/xs/src/xsinit.h index 2082dfb8839..cbb55077bab 100644 --- a/xs/src/xsinit.h +++ b/xs/src/xsinit.h @@ -75,6 +75,7 @@ #undef times #undef accept #undef wait + #undef abort // Breaks compilation with Eigen matrices embedded into Slic3r::Point. #undef malloc From 9a2310ae98d78763b92c8f25c893e2e721b7de91 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Mon, 18 Jan 2021 09:33:19 +0100 Subject: [PATCH 030/143] Fix of [prusa3d/PrusaSlicer] Remove unnecessary null pointer checks (#5813) Don't use if (ptr) delete ptr; call delete ptr; directly, it contains the test for null ptr. --- src/slic3r/GUI/ExtraRenderers.cpp | 3 +-- src/slic3r/GUI/GUI_Preview.cpp | 7 ++----- src/slic3r/GUI/Plater.cpp | 15 ++++----------- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/slic3r/GUI/ExtraRenderers.cpp b/src/slic3r/GUI/ExtraRenderers.cpp index 27e2c122457..584896dd592 100644 --- a/src/slic3r/GUI/ExtraRenderers.cpp +++ b/src/slic3r/GUI/ExtraRenderers.cpp @@ -49,8 +49,7 @@ BitmapTextRenderer::~BitmapTextRenderer() { #ifdef SUPPORTS_MARKUP #ifdef wxHAS_GENERIC_DATAVIEWCTRL - if (m_markupText) - delete m_markupText; + delete m_markupText; #endif //wxHAS_GENERIC_DATAVIEWCTRL #endif // SUPPORTS_MARKUP } diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index bca27fa21c5..36c1960d3f9 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -36,11 +36,8 @@ View3D::View3D(wxWindow* parent, Model* model, DynamicPrintConfig* config, Backg View3D::~View3D() { - if (m_canvas != nullptr) - delete m_canvas; - - if (m_canvas_widget != nullptr) - delete m_canvas_widget; + delete m_canvas; + delete m_canvas_widget; } bool View3D::init(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 80826eab91a..4d6b1178f9b 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -595,17 +595,10 @@ struct Sidebar::priv Sidebar::priv::~priv() { - if (object_manipulation != nullptr) - delete object_manipulation; - - if (object_settings != nullptr) - delete object_settings; - - if (frequently_changed_parameters != nullptr) - delete frequently_changed_parameters; - - if (object_layers != nullptr) - delete object_layers; + delete object_manipulation; + delete object_settings; + delete frequently_changed_parameters; + delete object_layers; } void Sidebar::priv::show_preset_comboboxes() From 8f1bc02287a2cd4e9f7046e372da952fdffb8985 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 18 Jan 2021 09:59:05 +0100 Subject: [PATCH 031/143] ENABLE_SPLITTED_VERTEX_BUFFER - fixed cracks in toolpaths when splitting vertex and index buffers --- src/libslic3r/Technologies.hpp | 1 + src/slic3r/GUI/GCodeViewer.cpp | 221 ++++++++++++++++++++++++++++++++- 2 files changed, 219 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 010f109729f..ad6de77edfc 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -114,6 +114,7 @@ #define ENABLE_2_3_1 1 #define ENABLE_SPLITTED_VERTEX_BUFFER (1 && ENABLE_2_3_1) +#define ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING (1 && ENABLE_SPLITTED_VERTEX_BUFFER) #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index b3794175e71..510aa25299f 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1219,6 +1219,65 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) }; // format data into the buffers to be rendered as solid +#if ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING + auto add_vertices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, unsigned int vbuffer_id, VertexBuffer& vertices, size_t move_id) { + auto store_vertex = [](VertexBuffer& vertices, const Vec3f& position, const Vec3f& normal) { + // append position + vertices.push_back(position[0]); + vertices.push_back(position[1]); + vertices.push_back(position[2]); + // append normal + vertices.push_back(normal[0]); + vertices.push_back(normal[1]); + vertices.push_back(normal[2]); + }; + + if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { + buffer.add_path(curr, vbuffer_id, vertices.size(), move_id - 1); + buffer.paths.back().sub_paths.back().first.position = prev.position; + } + + Path& last_path = buffer.paths.back(); + + Vec3f dir = (curr.position - prev.position).normalized(); + Vec3f right = Vec3f(dir[1], -dir[0], 0.0f).normalized(); + Vec3f left = -right; + Vec3f up = right.cross(dir); + Vec3f down = -up; + float half_width = 0.5f * last_path.width; + float half_height = 0.5f * last_path.height; + Vec3f prev_pos = prev.position - half_height * up; + Vec3f curr_pos = curr.position - half_height * up; + Vec3f d_up = half_height * up; + Vec3f d_down = -half_height * up; + Vec3f d_right = half_width * right; + Vec3f d_left = -half_width * right; + + // vertices 1st endpoint + if (last_path.vertices_count() == 1 || vertices.empty()) { + // 1st segment or restart into a new vertex buffer + // =============================================== + store_vertex(vertices, prev_pos + d_up, up); + store_vertex(vertices, prev_pos + d_right, right); + store_vertex(vertices, prev_pos + d_down, down); + store_vertex(vertices, prev_pos + d_left, left); + } + else { + // any other segment + // ================= + store_vertex(vertices, prev_pos + d_right, right); + store_vertex(vertices, prev_pos + d_left, left); + } + + // vertices 2nd endpoint + store_vertex(vertices, curr_pos + d_up, up); + store_vertex(vertices, curr_pos + d_right, right); + store_vertex(vertices, curr_pos + d_down, down); + store_vertex(vertices, curr_pos + d_left, left); + + last_path.sub_paths.back().last = { vbuffer_id, vertices.size(), move_id, curr.position }; + }; +#else auto add_vertices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, VertexBuffer& vertices, size_t move_id) { static Vec3f prev_dir; static Vec3f prev_up; @@ -1293,7 +1352,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) } Vec3f displacement_vec = displacement * prev_dir; - bool can_displace = displacement > 0.0f && displacement < prev_length&& displacement < length; + bool can_displace = displacement > 0.0f && displacement < prev_length && displacement < length; size_t prev_right_id = (starting_vertices_size - 3) * buffer.vertices.vertex_size_floats(); size_t prev_left_id = (starting_vertices_size - 1) * buffer.vertices.vertex_size_floats(); @@ -1366,6 +1425,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) prev_up = up; prev_length = length; }; +#endif // ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING auto add_indices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, size_t& vbuffer_size, unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { static Vec3f prev_dir; @@ -1573,8 +1633,19 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer // add another vertex buffer +#if ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING + if (v_multibuffer.back().size() * sizeof(float) > VBUFFER_THRESHOLD_BYTES - t_buffer.max_vertices_per_segment_size_bytes()) { + v_multibuffer.push_back(VertexBuffer()); + if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { + Path& last_path = t_buffer.paths.back(); + if (prev.type == curr.type && last_path.matches(curr)) + last_path.add_sub_path(prev, static_cast(v_multibuffer.size()) - 1, 0, i - 1); + } + } +#else if (v_multibuffer.back().size() * sizeof(float) > VBUFFER_THRESHOLD_BYTES - t_buffer.max_vertices_per_segment_size_bytes()) v_multibuffer.push_back(VertexBuffer()); +#endif // ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING VertexBuffer& v_buffer = v_multibuffer.back(); @@ -1582,7 +1653,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) { case TBuffer::ERenderPrimitiveType::Point: { add_vertices_as_point(curr, v_buffer); break; } case TBuffer::ERenderPrimitiveType::Line: { add_vertices_as_line(prev, curr, v_buffer); break; } +#if ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING + case TBuffer::ERenderPrimitiveType::Triangle: { add_vertices_as_solid(prev, curr, t_buffer, static_cast(v_multibuffer.size()) - 1, v_buffer, i); break; } +#else case TBuffer::ERenderPrimitiveType::Triangle: { add_vertices_as_solid(prev, curr, t_buffer, v_buffer, i); break; } +#endif // ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING } // collect options zs for later use @@ -1593,6 +1668,138 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) } } +#if ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING + // smooth toolpaths corners for the given TBuffer using triangles + auto smooth_triangle_toolpaths_corners = [&gcode_result](const TBuffer& t_buffer, MultiVertexBuffer& v_multibuffer) { + auto extract_position_at = [](const VertexBuffer& vertices, size_t offset) { + return Vec3f(vertices[offset + 0], vertices[offset + 1], vertices[offset + 2]); + }; + auto update_position_at = [](VertexBuffer& vertices, size_t offset, const Vec3f& position) { + vertices[offset + 0] = position[0]; + vertices[offset + 1] = position[1]; + vertices[offset + 2] = position[2]; + }; + + size_t vertex_size_floats = t_buffer.vertices.vertex_size_floats(); + for (const Path& path : t_buffer.paths) { + // the two segments of the path sharing the current vertex may belong + // to two different vertex buffers + size_t prev_sub_path_id = 0; + size_t next_sub_path_id = 0; + size_t path_vertices_count = path.vertices_count(); + float half_width = 0.5f * path.width; + for (size_t j = 1; j < path_vertices_count - 1; ++j) { + size_t curr_s_id = path.sub_paths.front().first.s_id + j; + const Vec3f& prev = gcode_result.moves[curr_s_id - 1].position; + const Vec3f& curr = gcode_result.moves[curr_s_id].position; + const Vec3f& next = gcode_result.moves[curr_s_id + 1].position; + + // select the subpaths which contains the previous/next segments + if (!path.sub_paths[prev_sub_path_id].contains(curr_s_id)) + ++prev_sub_path_id; + if (!path.sub_paths[next_sub_path_id].contains(curr_s_id + 1)) + ++next_sub_path_id; + const Path::Sub_Path& prev_sub_path = path.sub_paths[prev_sub_path_id]; + const Path::Sub_Path& next_sub_path = path.sub_paths[next_sub_path_id]; + + Vec3f prev_dir = (curr - prev).normalized(); + Vec3f prev_right = Vec3f(prev_dir[1], -prev_dir[0], 0.0f).normalized(); + Vec3f prev_up = prev_right.cross(prev_dir); + + Vec3f next_dir = (next - curr).normalized(); + Vec3f next_right = Vec3f(next_dir[1], -next_dir[0], 0.0f).normalized(); + Vec3f next_up = next_right.cross(next_dir); + + bool is_right_turn = prev_up.dot(prev_dir.cross(next_dir)) <= 0.0f; + float cos_dir = prev_dir.dot(next_dir); + // whether the angle between adjacent segments is greater than 45 degrees + bool is_sharp = cos_dir < 0.7071068f; + + float displacement = 0.0f; + if (cos_dir > -0.9998477f) { + // if the angle between adjacent segments is smaller than 179 degrees + Vec3f med_dir = (prev_dir + next_dir).normalized(); + displacement = half_width * ::tan(::acos(std::clamp(next_dir.dot(med_dir), -1.0f, 1.0f))); + } + + float sq_prev_length = (curr - prev).squaredNorm(); + float sq_next_length = (next - curr).squaredNorm(); + float sq_displacement = sqr(displacement); + bool can_displace = displacement > 0.0f && sq_displacement < sq_prev_length&& sq_displacement < sq_next_length; + + if (can_displace) { + Vec3f displacement_vec = displacement * prev_dir; + // matches inner corner vertices + if (is_right_turn) { + // offset into the vertex buffer of the right vertex of the previous segment + size_t prev_right_offset = prev_sub_path.last.i_id - ((prev_sub_path.last.s_id - curr_s_id) * 6 + 3) * vertex_size_floats; + // new position of the right vertices + Vec3f shared_right = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset) - displacement_vec; + // update previous segment + update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset, shared_right); + // offset into the vertex buffer of the right vertex of the next segment + size_t r_offset = (curr_s_id == next_sub_path.first.i_id) ? 1 : 0; + size_t next_right_offset = next_sub_path.last.i_id - ((next_sub_path.last.s_id - curr_s_id) * 6 - r_offset) * vertex_size_floats; + // update next segment + update_position_at(v_multibuffer[next_sub_path.first.b_id], next_right_offset, shared_right); + } + else { + // offset into the vertex buffer of the left vertex of the previous segment + size_t prev_left_offset = prev_sub_path.last.i_id - ((prev_sub_path.last.s_id - curr_s_id) * 6 + 1) * vertex_size_floats; + // new position of the left vertices + Vec3f shared_left = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset) - displacement_vec; + // update previous segment + update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset, shared_left); + // offset into the vertex buffer of the left vertex of the next segment + size_t l_offset = (curr_s_id == next_sub_path.first.i_id) ? 3 : 1; + size_t next_left_offset = next_sub_path.last.i_id - ((next_sub_path.last.s_id - curr_s_id) * 6 - l_offset) * vertex_size_floats; + // update next segment + update_position_at(v_multibuffer[next_sub_path.first.b_id], next_left_offset, shared_left); + } + + if (!is_sharp) { + // matches outer corner vertices + if (is_right_turn) { + // offset into the vertex buffer of the left vertex of the previous segment + size_t prev_left_offset = prev_sub_path.last.i_id - ((prev_sub_path.last.s_id - curr_s_id) * 6 + 1) * vertex_size_floats; + // new position of the left vertices + Vec3f shared_left = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset) + displacement_vec; + // update previous segment + update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset, shared_left); + // offset into the vertex buffer of the left vertex of the next segment + size_t l_offset = (curr_s_id == next_sub_path.first.i_id) ? 3 : 1; + size_t next_left_offset = next_sub_path.last.i_id - ((next_sub_path.last.s_id - curr_s_id) * 6 - l_offset) * vertex_size_floats; + // update next segment + update_position_at(v_multibuffer[next_sub_path.first.b_id], next_left_offset, shared_left); + } + else { + // offset into the vertex buffer of the right vertex of the previous segment + size_t prev_right_offset = prev_sub_path.last.i_id - ((prev_sub_path.last.s_id - curr_s_id) * 6 + 3) * vertex_size_floats; + // new position of the right vertices + Vec3f shared_right = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset) + displacement_vec; + // update previous segment + update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset, shared_right); + // offset into the vertex buffer of the right vertex of the next segment + size_t r_offset = (curr_s_id == next_sub_path.first.i_id) ? 1 : 0; + size_t next_right_offset = next_sub_path.last.i_id - ((next_sub_path.last.s_id - curr_s_id) * 6 - r_offset) * vertex_size_floats; + // update next segment + update_position_at(v_multibuffer[next_sub_path.first.b_id], next_right_offset, shared_right); + } + } + } + } + } + }; + + // smooth toolpaths corners for TBuffers using triangles + for (size_t i = 0; i < m_buffers.size(); ++i) { + const TBuffer& t_buffer = m_buffers[i]; + if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { + smooth_triangle_toolpaths_corners(t_buffer, vertices[i]); + } + } +#endif // ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING + for (MultiVertexBuffer& v_multibuffer : vertices) { for (VertexBuffer& v_buffer : v_multibuffer) { v_buffer.shrink_to_fit(); @@ -1693,7 +1900,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) { Path& last_path = t_buffer.paths.back(); - --last_path.sub_paths.back().last.s_id; last_path.add_sub_path(prev, static_cast(i_multibuffer.size()) - 1, 0, i - 1); } } @@ -1709,7 +1915,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) { Path& last_path = t_buffer.paths.back(); - --last_path.sub_paths.back().last.s_id; last_path.add_sub_path(prev, static_cast(i_multibuffer.size()) - 1, 0, i - 1); } } @@ -2819,6 +3024,16 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool delta_1st *= buffer->indices_per_segment(); render_path->offsets.push_back(static_cast((sub_path.first.i_id + delta_1st) * sizeof(unsigned int))); + +#if 0 + // check sizes and offsets against index buffer size on gpu + GLint buffer_size; + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer->indices[render_path->index_buffer_id].ibo)); + glsafe(::glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &buffer_size)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + if (render_path->offsets.back() + render_path->sizes.back() * sizeof(unsigned int) > buffer_size) + BOOST_LOG_TRIVIAL(error) << "GCodeViewer::refresh_render_paths: Invalid render path data"; +#endif } // set sequential data to their final value From 3a0aabb92455152b6f206106f7ffb9c5d38336bb Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 18 Jan 2021 11:37:23 +0100 Subject: [PATCH 032/143] ENABLE_SPLITTED_VERTEX_BUFFER - small refactoring in GCodeViewer::load_toolpaths() --- src/slic3r/GUI/GCodeViewer.cpp | 104 +++++++++++++++------------------ src/slic3r/GUI/GCodeViewer.hpp | 7 ++- 2 files changed, 51 insertions(+), 60 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 510aa25299f..006572235a6 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1151,6 +1151,11 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const #if ENABLE_SPLITTED_VERTEX_BUFFER void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) { + // max vertex buffer size, in bytes + static const size_t VBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024; + // max index buffer size, in bytes + static const size_t IBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024; + auto log_memory_usage = [this](const std::string& label, const std::vector& vertices, const std::vector& indices) { int64_t vertices_size = 0; for (const MultiVertexBuffer& buffers : vertices) { @@ -1601,9 +1606,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) std::vector indices(m_buffers.size()); std::vector options_zs; - // max vertex buffer size, in bytes - const size_t VBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024; - // toolpaths data -> extract vertices from result for (size_t i = 0; i < m_moves_count; ++i) { const GCodeProcessor::MoveVertex& curr = gcode_result.moves[i]; @@ -1679,6 +1681,38 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) vertices[offset + 1] = position[1]; vertices[offset + 2] = position[2]; }; + auto match_right_vertices = [&](const Path::Sub_Path& prev_sub_path, const Path::Sub_Path& next_sub_path, + size_t curr_s_id, size_t vertex_size_floats, const Vec3f& displacement_vec) { + // offset into the vertex buffer of the next segment 1st vertex + size_t next_offset = (prev_sub_path.last.s_id - curr_s_id) * 6 * vertex_size_floats; + // offset into the vertex buffer of the right vertex of the previous segment + size_t prev_right_offset = prev_sub_path.last.i_id - next_offset - 3 * vertex_size_floats; + // new position of the right vertices + Vec3f shared_vertex = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset) + displacement_vec; + // update previous segment + update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset, shared_vertex); + // offset into the vertex buffer of the right vertex of the next segment + size_t r_offset = (curr_s_id == next_sub_path.first.i_id) ? 1 : 0; + size_t next_right_offset = next_sub_path.last.i_id - next_offset + r_offset * vertex_size_floats; + // update next segment + update_position_at(v_multibuffer[next_sub_path.first.b_id], next_right_offset, shared_vertex); + }; + auto match_left_vertices = [&](const Path::Sub_Path& prev_sub_path, const Path::Sub_Path& next_sub_path, + size_t curr_s_id, size_t vertex_size_floats, const Vec3f& displacement_vec) { + // offset into the vertex buffer of the next segment 1st vertex + size_t next_offset = (prev_sub_path.last.s_id - curr_s_id) * 6 * vertex_size_floats; + // offset into the vertex buffer of the left vertex of the previous segment + size_t prev_left_offset = prev_sub_path.last.i_id - next_offset - 1 * vertex_size_floats; + // new position of the left vertices + Vec3f shared_vertex = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset) + displacement_vec; + // update previous segment + update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset, shared_vertex); + // offset into the vertex buffer of the left vertex of the next segment + size_t l_offset = (curr_s_id == next_sub_path.first.i_id) ? 3 : 1; + size_t next_left_offset = next_sub_path.last.i_id - next_offset + l_offset * vertex_size_floats; + // update next segment + update_position_at(v_multibuffer[next_sub_path.first.b_id], next_left_offset, shared_vertex); + }; size_t vertex_size_floats = t_buffer.vertices.vertex_size_floats(); for (const Path& path : t_buffer.paths) { @@ -1728,63 +1762,20 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) bool can_displace = displacement > 0.0f && sq_displacement < sq_prev_length&& sq_displacement < sq_next_length; if (can_displace) { + // displacement to apply to the vertices to match Vec3f displacement_vec = displacement * prev_dir; // matches inner corner vertices - if (is_right_turn) { - // offset into the vertex buffer of the right vertex of the previous segment - size_t prev_right_offset = prev_sub_path.last.i_id - ((prev_sub_path.last.s_id - curr_s_id) * 6 + 3) * vertex_size_floats; - // new position of the right vertices - Vec3f shared_right = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset) - displacement_vec; - // update previous segment - update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset, shared_right); - // offset into the vertex buffer of the right vertex of the next segment - size_t r_offset = (curr_s_id == next_sub_path.first.i_id) ? 1 : 0; - size_t next_right_offset = next_sub_path.last.i_id - ((next_sub_path.last.s_id - curr_s_id) * 6 - r_offset) * vertex_size_floats; - // update next segment - update_position_at(v_multibuffer[next_sub_path.first.b_id], next_right_offset, shared_right); - } - else { - // offset into the vertex buffer of the left vertex of the previous segment - size_t prev_left_offset = prev_sub_path.last.i_id - ((prev_sub_path.last.s_id - curr_s_id) * 6 + 1) * vertex_size_floats; - // new position of the left vertices - Vec3f shared_left = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset) - displacement_vec; - // update previous segment - update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset, shared_left); - // offset into the vertex buffer of the left vertex of the next segment - size_t l_offset = (curr_s_id == next_sub_path.first.i_id) ? 3 : 1; - size_t next_left_offset = next_sub_path.last.i_id - ((next_sub_path.last.s_id - curr_s_id) * 6 - l_offset) * vertex_size_floats; - // update next segment - update_position_at(v_multibuffer[next_sub_path.first.b_id], next_left_offset, shared_left); - } + if (is_right_turn) + match_right_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, -displacement_vec); + else + match_left_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, -displacement_vec); if (!is_sharp) { // matches outer corner vertices - if (is_right_turn) { - // offset into the vertex buffer of the left vertex of the previous segment - size_t prev_left_offset = prev_sub_path.last.i_id - ((prev_sub_path.last.s_id - curr_s_id) * 6 + 1) * vertex_size_floats; - // new position of the left vertices - Vec3f shared_left = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset) + displacement_vec; - // update previous segment - update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset, shared_left); - // offset into the vertex buffer of the left vertex of the next segment - size_t l_offset = (curr_s_id == next_sub_path.first.i_id) ? 3 : 1; - size_t next_left_offset = next_sub_path.last.i_id - ((next_sub_path.last.s_id - curr_s_id) * 6 - l_offset) * vertex_size_floats; - // update next segment - update_position_at(v_multibuffer[next_sub_path.first.b_id], next_left_offset, shared_left); - } - else { - // offset into the vertex buffer of the right vertex of the previous segment - size_t prev_right_offset = prev_sub_path.last.i_id - ((prev_sub_path.last.s_id - curr_s_id) * 6 + 3) * vertex_size_floats; - // new position of the right vertices - Vec3f shared_right = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset) + displacement_vec; - // update previous segment - update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset, shared_right); - // offset into the vertex buffer of the right vertex of the next segment - size_t r_offset = (curr_s_id == next_sub_path.first.i_id) ? 1 : 0; - size_t next_right_offset = next_sub_path.last.i_id - ((next_sub_path.last.s_id - curr_s_id) * 6 - r_offset) * vertex_size_floats; - // update next segment - update_position_at(v_multibuffer[next_sub_path.first.b_id], next_right_offset, shared_right); - } + if (is_right_turn) + match_left_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, displacement_vec); + else + match_right_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, displacement_vec); } } } @@ -1853,9 +1844,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) buffer.paths.clear(); } - // max index buffer size, in bytes - const size_t IBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024; - // variable used to keep track of the current vertex buffers index and size using CurrVertexBuffer = std::pair; std::vector curr_vertex_buffers(m_buffers.size(), { 0, 0 }); diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 6602bbcf818..f33a718dd97 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -134,9 +134,12 @@ class GCodeViewer { struct Endpoint { - // index of the index buffer + // index of the buffer in the multibuffer vector + // the buffer type may change: + // it is the vertex buffer while extracting vertices data, + // the index buffer while extracting indices data unsigned int b_id{ 0 }; - // index into the index buffer + // index into the buffer size_t i_id{ 0 }; // move id size_t s_id{ 0 }; From 56d26ad491d93d6637deea1665c048ccb9bf1e20 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 18 Jan 2021 13:55:45 +0100 Subject: [PATCH 033/143] ENABLE_SPLITTED_VERTEX_BUFFER - slightly faster indices buffers generation in GCodeViewer::load_toolpaths() --- src/slic3r/GUI/GCodeViewer.cpp | 124 ++++++++++++++++++++++++++++++++- 1 file changed, 123 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 006572235a6..61c34d25cdd 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1282,6 +1282,128 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) last_path.sub_paths.back().last = { vbuffer_id, vertices.size(), move_id, curr.position }; }; + auto add_indices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, + size_t& vbuffer_size, unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { + static Vec3f prev_dir; + static Vec3f prev_up; + static float sq_prev_length; + auto store_triangle = [](IndexBuffer& indices, unsigned int i1, unsigned int i2, unsigned int i3) { + indices.push_back(i1); + indices.push_back(i2); + indices.push_back(i3); + }; + auto append_dummy_cap = [store_triangle](IndexBuffer& indices, unsigned int id) { + store_triangle(indices, id, id, id); + store_triangle(indices, id, id, id); + }; + auto store_main_triangles = [&](IndexBuffer& indices, size_t vbuffer_size, const std::array& v_offsets) { + std::array v_ids; + for (size_t i = 0; i < v_ids.size(); ++i) { + v_ids[i] = static_cast(static_cast(vbuffer_size) + v_offsets[i]); + } + + // triangles starting cap + store_triangle(indices, v_ids[0], v_ids[2], v_ids[1]); + store_triangle(indices, v_ids[0], v_ids[3], v_ids[2]); + + // triangles sides + store_triangle(indices, v_ids[0], v_ids[1], v_ids[4]); + store_triangle(indices, v_ids[1], v_ids[5], v_ids[4]); + store_triangle(indices, v_ids[1], v_ids[2], v_ids[5]); + store_triangle(indices, v_ids[2], v_ids[6], v_ids[5]); + store_triangle(indices, v_ids[2], v_ids[3], v_ids[6]); + store_triangle(indices, v_ids[3], v_ids[7], v_ids[6]); + store_triangle(indices, v_ids[3], v_ids[0], v_ids[7]); + store_triangle(indices, v_ids[0], v_ids[4], v_ids[7]); + + // triangles ending cap + store_triangle(indices, v_ids[4], v_ids[6], v_ids[7]); + store_triangle(indices, v_ids[4], v_ids[5], v_ids[6]); + }; + + if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { + buffer.add_path(curr, ibuffer_id, indices.size(), move_id - 1); + buffer.paths.back().sub_paths.back().first.position = prev.position; + } + + Path& last_path = buffer.paths.back(); + + Vec3f dir = (curr.position - prev.position).normalized(); + Vec3f right = Vec3f(dir[1], -dir[0], 0.0f).normalized(); + Vec3f up = right.cross(dir); + float sq_length = (curr.position - prev.position).squaredNorm(); + + if (last_path.vertices_count() == 1 || vbuffer_size == 0) { + // 1st segment or restart into a new vertex buffer + // =============================================== + // dummy triangles outer corner cap + append_dummy_cap(indices, vbuffer_size); + + // stem triangles + store_main_triangles(indices, vbuffer_size, { 0, 1, 2, 3, 4, 5, 6, 7 }); + + vbuffer_size += 8; + } + else { + // any other segment + // ================= + float displacement = 0.0f; + float cos_dir = prev_dir.dot(dir); + if (cos_dir > -0.9998477f) { + // if the angle between adjacent segments is smaller than 179 degrees + Vec3f med_dir = (prev_dir + dir).normalized(); + float half_width = 0.5f * last_path.width; + displacement = half_width * ::tan(::acos(std::clamp(dir.dot(med_dir), -1.0f, 1.0f))); + } + + float sq_displacement = sqr(displacement); + bool can_displace = displacement > 0.0f && sq_displacement < sq_prev_length && sq_displacement < sq_length; + + bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f; + // whether the angle between adjacent segments is greater than 45 degrees + bool is_sharp = cos_dir < 0.7071068f; + + bool right_displaced = false; + bool left_displaced = false; + + if (!is_sharp && can_displace) { + if (is_right_turn) + left_displaced = true; + else + right_displaced = true; + } + + // triangles outer corner cap + if (is_right_turn) { + if (left_displaced) + // dummy triangles + append_dummy_cap(indices, vbuffer_size); + else { + store_triangle(indices, vbuffer_size - 4, vbuffer_size + 1, vbuffer_size - 1); + store_triangle(indices, vbuffer_size + 1, vbuffer_size - 2, vbuffer_size - 1); + } + } + else { + if (right_displaced) + // dummy triangles + append_dummy_cap(indices, vbuffer_size); + else { + store_triangle(indices, vbuffer_size - 4, vbuffer_size - 3, vbuffer_size + 0); + store_triangle(indices, vbuffer_size - 3, vbuffer_size - 2, vbuffer_size + 0); + } + } + + // stem triangles + store_main_triangles(indices, vbuffer_size, { -4, 0, -2, 1, 2, 3, 4, 5 }); + + vbuffer_size += 6; + } + + last_path.sub_paths.back().last = { ibuffer_id, indices.size() - 1, move_id, curr.position }; + prev_dir = dir; + prev_up = up; + sq_prev_length = sq_length; + }; #else auto add_vertices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, VertexBuffer& vertices, size_t move_id) { static Vec3f prev_dir; @@ -1430,7 +1552,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) prev_up = up; prev_length = length; }; -#endif // ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING auto add_indices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, size_t& vbuffer_size, unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { static Vec3f prev_dir; @@ -1568,6 +1689,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) prev_up = up; prev_length = length; }; +#endif // ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING #if ENABLE_GCODE_VIEWER_STATISTICS auto start_time = std::chrono::high_resolution_clock::now(); From 1efa129b673ff3fb17dae7884fa4ac27b66ac41b Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 18 Jan 2021 15:19:02 +0100 Subject: [PATCH 034/143] Fix of #5619 - Copying Item with Printable Property --- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- src/slic3r/GUI/GLCanvas3D.hpp | 2 +- src/slic3r/GUI/Plater.cpp | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 03d6b94ce56..49a1e37f3b4 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1377,7 +1377,7 @@ void GLCanvas3D::update_instance_printable_state_for_object(const size_t obj_idx } } -void GLCanvas3D::update_instance_printable_state_for_objects(std::vector& object_idxs) +void GLCanvas3D::update_instance_printable_state_for_objects(const std::vector& object_idxs) { for (size_t obj_idx : object_idxs) update_instance_printable_state_for_object(obj_idx); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index fee13608700..8e31addaabd 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -565,7 +565,7 @@ class GLCanvas3D void toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1); void toggle_model_objects_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1); void update_instance_printable_state_for_object(size_t obj_idx); - void update_instance_printable_state_for_objects(std::vector& object_idxs); + void update_instance_printable_state_for_objects(const std::vector& object_idxs); void set_config(const DynamicPrintConfig* config); void set_process(BackgroundSlicingProcess* process); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 4d6b1178f9b..41e9c8ff5c1 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6111,8 +6111,10 @@ void Plater::changed_objects(const std::vector& object_idxs) // pulls the correct data, update the 3D scene. this->p->update_restart_background_process(true, false); } - else + else { p->view3D->reload_scene(false); + p->view3D->get_canvas3d()->update_instance_printable_state_for_objects(object_idxs); + } // update print this->p->schedule_background_process(); From 5294a48ee8bdbf808ed4b9570778657b3c2e15ab Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 19 Jan 2021 09:58:06 +0100 Subject: [PATCH 035/143] Fix of prusa 2.3.0 crash with 0.25 nozzle #5825 Importing a config bundle as a config file was broken for multi material FDM printers, where a different filament was active for each extruder. --- src/libslic3r/PresetBundle.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index b31ee666445..b57ff0e14ee 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -928,7 +928,11 @@ void PresetBundle::load_config_file_config_bundle(const std::string &path, const if (opt_compatible->type() == coStrings) static_cast(opt_compatible)->values.clear(); } - collection_dst.load_preset(path, preset_name_dst, std::move(preset_src->config), activate).is_external = true; + (collection_dst.type() == Preset::TYPE_FILAMENT ? + collection_dst.load_preset(path, preset_name_dst, preset_src->config, activate) : + // Only move the source config for non filament profiles, as single filament profile may be referenced multiple times. + collection_dst.load_preset(path, preset_name_dst, std::move(preset_src->config), activate)) + .is_external = true; return preset_name_dst; }; load_one(this->prints, tmp_bundle.prints, tmp_bundle.prints .get_selected_preset_name(), true); From a5dc3c4b66c4f0b642780460928d31c64075704a Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 15 Jan 2021 18:29:19 +0100 Subject: [PATCH 036/143] Bugfix: CLI slicer should slice in FDM mode when no printer_technology is provided. This was broken between 2.2.0 and 2.3.0 (1bffc2b) and changed the CLI behaviour. Also related to 5029. --- src/PrusaSlicer.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index 277bf125038..a990620f582 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -197,6 +197,9 @@ int CLI::run(int argc, char **argv) // Normalizing after importing the 3MFs / AMFs m_print_config.normalize_fdm(); + if (printer_technology == ptUnknown) + printer_technology = std::find(m_actions.begin(), m_actions.end(), "export_sla") == m_actions.end() ? ptFFF : ptSLA; + // Initialize full print configs for both the FFF and SLA technologies. FullPrintConfig fff_print_config; SLAFullPrintConfig sla_print_config; @@ -205,7 +208,8 @@ int CLI::run(int argc, char **argv) if (printer_technology == ptFFF) { fff_print_config.apply(m_print_config, true); m_print_config.apply(fff_print_config, true); - } else if (printer_technology == ptSLA) { + } else { + assert(printer_technology == ptSLA); // The default value has to be different from the one in fff mode. sla_print_config.printer_technology.value = ptSLA; sla_print_config.output_filename_format.value = "[input_filename_base].sl1"; @@ -481,12 +485,6 @@ int CLI::run(int argc, char **argv) if (printer_technology == ptFFF) { for (auto* mo : model.objects) fff_print.auto_assign_extruders(mo); - } else { - // The default for "output_filename_format" is good for FDM: "[input_filename_base].gcode" - // Replace it with a reasonable SLA default. - std::string &format = m_print_config.opt_string("output_filename_format", true); - if (format == static_cast(m_print_config.def()->get("output_filename_format")->default_value.get())->value) - format = "[input_filename_base].SL1"; } print->apply(model, m_print_config); std::string err = print->validate(); From 264ce71e94bdd8e59691139dd612ee6ee1a59f99 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 19 Jan 2021 14:26:37 +0100 Subject: [PATCH 037/143] Bumped up wxWidgets version on OSX for X86. --- deps/wxWidgets/wxWidgets.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/wxWidgets/wxWidgets.cmake b/deps/wxWidgets/wxWidgets.cmake index ee38309a687..bf23698cf4d 100644 --- a/deps/wxWidgets/wxWidgets.cmake +++ b/deps/wxWidgets/wxWidgets.cmake @@ -1,4 +1,4 @@ -if (APPLE AND ${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") +if (APPLE) # The new OSX 11 (Big Sur) is not compatible with wxWidgets 3.1.3. # Let's use patched wxWidgets 3.1.4, even though it is not quite tested. set(_wx_git_tag v3.1.4-patched) From 56e7d8351325ddbb26f54b8fac37d5d3892aedc5 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 19 Jan 2021 15:00:44 +0100 Subject: [PATCH 038/143] Implement exception rethrow for ui jobs --- src/slic3r/CMakeLists.txt | 2 ++ src/slic3r/GUI/Jobs/ArrangeJob.cpp | 46 +++++++++++++++----------- src/slic3r/GUI/Jobs/ArrangeJob.hpp | 12 +++---- src/slic3r/GUI/Jobs/FillBedJob.hpp | 5 ++- src/slic3r/GUI/Jobs/Job.cpp | 34 +++++++++++++------ src/slic3r/GUI/Jobs/Job.hpp | 6 +++- src/slic3r/GUI/Jobs/PlaterJob.cpp | 17 ++++++++++ src/slic3r/GUI/Jobs/PlaterJob.hpp | 24 ++++++++++++++ src/slic3r/GUI/Jobs/RotoptimizeJob.hpp | 9 ++--- src/slic3r/GUI/Jobs/SLAImportJob.cpp | 2 +- src/slic3r/GUI/Jobs/SLAImportJob.hpp | 6 ++-- 11 files changed, 112 insertions(+), 51 deletions(-) create mode 100644 src/slic3r/GUI/Jobs/PlaterJob.cpp create mode 100644 src/slic3r/GUI/Jobs/PlaterJob.hpp diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index e040de727ac..505c8f0f21d 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -158,6 +158,8 @@ set(SLIC3R_GUI_SOURCES GUI/PrintHostDialogs.hpp GUI/Jobs/Job.hpp GUI/Jobs/Job.cpp + GUI/Jobs/PlaterJob.hpp + GUI/Jobs/PlaterJob.cpp GUI/Jobs/ArrangeJob.hpp GUI/Jobs/ArrangeJob.cpp GUI/Jobs/RotoptimizeJob.hpp diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp index 0f17e6e9f0f..276e20c1a94 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.cpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp @@ -7,6 +7,8 @@ #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI.hpp" +#include "libnest2d/common.hpp" + namespace Slic3r { namespace GUI { // Cache the wti info @@ -140,6 +142,19 @@ void ArrangeJob::prepare() wxGetKeyState(WXK_SHIFT) ? prepare_selected() : prepare_all(); } +void ArrangeJob::on_exception(const std::exception_ptr &eptr) +{ + try { + if (eptr) + std::rethrow_exception(eptr); + } catch (libnest2d::GeometryException &) { + show_error(m_plater, _(L("Could not arrange model objects! " + "Some geometries may be invalid."))); + } catch (std::exception &e) { + PlaterJob::on_exception(eptr); + } +} + void ArrangeJob::process() { static const auto arrangestr = _(L("Arranging")); @@ -151,30 +166,23 @@ void ArrangeJob::process() params.allow_rotations = settings.enable_rotation; params.min_obj_distance = scaled(settings.distance); - auto count = unsigned(m_selected.size() + m_unprintable.size()); Points bedpts = get_bed_shape(*m_plater->config()); params.stopcondition = [this]() { return was_canceled(); }; - try { - params.progressind = [this, count](unsigned st) { - st += m_unprintable.size(); - if (st > 0) update_status(int(count - st), arrangestr); - }; - - arrangement::arrange(m_selected, m_unselected, bedpts, params); - - params.progressind = [this, count](unsigned st) { - if (st > 0) update_status(int(count - st), arrangestr); - }; - - arrangement::arrange(m_unprintable, {}, bedpts, params); - } catch (std::exception & /*e*/) { - GUI::show_error(m_plater, - _(L("Could not arrange model objects! " - "Some geometries may be invalid."))); - } + params.progressind = [this, count](unsigned st) { + st += m_unprintable.size(); + if (st > 0) update_status(int(count - st), arrangestr); + }; + + arrangement::arrange(m_selected, m_unselected, bedpts, params); + + params.progressind = [this, count](unsigned st) { + if (st > 0) update_status(int(count - st), arrangestr); + }; + + arrangement::arrange(m_unprintable, {}, bedpts, params); // finalize just here. update_status(int(count), diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.hpp b/src/slic3r/GUI/Jobs/ArrangeJob.hpp index 73540c230f9..38aafb52c18 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.hpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.hpp @@ -1,17 +1,13 @@ #ifndef ARRANGEJOB_HPP #define ARRANGEJOB_HPP -#include "Job.hpp" +#include "PlaterJob.hpp" #include "libslic3r/Arrange.hpp" namespace Slic3r { namespace GUI { -class Plater; - -class ArrangeJob : public Job +class ArrangeJob : public PlaterJob { - Plater *m_plater; - using ArrangePolygon = arrangement::ArrangePolygon; using ArrangePolygons = arrangement::ArrangePolygons; @@ -30,10 +26,12 @@ class ArrangeJob : public Job protected: void prepare() override; + + void on_exception(const std::exception_ptr &) override; public: ArrangeJob(std::shared_ptr pri, Plater *plater) - : Job{std::move(pri)}, m_plater{plater} + : PlaterJob{std::move(pri), plater} {} int status_range() const override diff --git a/src/slic3r/GUI/Jobs/FillBedJob.hpp b/src/slic3r/GUI/Jobs/FillBedJob.hpp index 448ae53d48f..07290d2f235 100644 --- a/src/slic3r/GUI/Jobs/FillBedJob.hpp +++ b/src/slic3r/GUI/Jobs/FillBedJob.hpp @@ -7,9 +7,8 @@ namespace Slic3r { namespace GUI { class Plater; -class FillBedJob : public Job +class FillBedJob : public PlaterJob { - Plater *m_plater; int m_object_idx = -1; using ArrangePolygon = arrangement::ArrangePolygon; @@ -28,7 +27,7 @@ class FillBedJob : public Job public: FillBedJob(std::shared_ptr pri, Plater *plater) - : Job{std::move(pri)}, m_plater{plater} + : PlaterJob{std::move(pri), plater} {} int status_range() const override diff --git a/src/slic3r/GUI/Jobs/Job.cpp b/src/slic3r/GUI/Jobs/Job.cpp index fedb6f4acaa..1f7f58875b8 100644 --- a/src/slic3r/GUI/Jobs/Job.cpp +++ b/src/slic3r/GUI/Jobs/Job.cpp @@ -1,4 +1,5 @@ #include +#include #include "Job.hpp" #include @@ -6,10 +7,15 @@ namespace Slic3r { -void GUI::Job::run() +void GUI::Job::run(std::exception_ptr &eptr) { m_running.store(true); - process(); + try { + process(); + } catch (...) { + eptr = std::current_exception(); + } + m_running.store(false); // ensure to call the last status to finalize the job @@ -27,22 +33,29 @@ void GUI::Job::update_status(int st, const wxString &msg) GUI::Job::Job(std::shared_ptr pri) : m_progress(std::move(pri)) { - Bind(wxEVT_THREAD, [this](const wxThreadEvent &evt) { + Bind(wxEVT_THREAD, [this](const wxThreadEvent &evt) { auto msg = evt.GetString(); - if (!msg.empty()) + if (!msg.empty() && !m_worker_error) m_progress->set_status_text(msg.ToUTF8().data()); - + if (m_finalized) return; - + m_progress->set_progress(evt.GetInt()); - if (evt.GetInt() == status_range()) { + if (evt.GetInt() == status_range() || m_worker_error) { // set back the original range and cancel callback m_progress->set_range(m_range); m_progress->set_cancel_callback(); wxEndBusyCursor(); - finalize(); - + if (m_worker_error) { + m_finalized = true; + m_progress->set_status_text(""); + m_progress->set_progress(m_range); + on_exception(m_worker_error); + } + else + finalize(); + // dont do finalization again for the same process m_finalized = true; } @@ -69,7 +82,8 @@ void GUI::Job::start() wxBeginBusyCursor(); try { // Execute the job - m_thread = create_thread([this] { this->run(); }); + m_worker_error = nullptr; + m_thread = create_thread([this] { this->run(m_worker_error); }); } catch (std::exception &) { update_status(status_range(), _(L("ERROR: not enough resources to " diff --git a/src/slic3r/GUI/Jobs/Job.hpp b/src/slic3r/GUI/Jobs/Job.hpp index aea7692e7f1..cb73fe74d40 100644 --- a/src/slic3r/GUI/Jobs/Job.hpp +++ b/src/slic3r/GUI/Jobs/Job.hpp @@ -2,6 +2,7 @@ #define JOB_HPP #include +#include #include "libslic3r/libslic3r.h" @@ -32,8 +33,9 @@ class Job : public wxEvtHandler std::atomic m_running{false}, m_canceled{false}; bool m_finalized = false; std::shared_ptr m_progress; + std::exception_ptr m_worker_error = nullptr; - void run(); + void run(std::exception_ptr &); protected: // status range for a particular job @@ -49,6 +51,8 @@ class Job : public wxEvtHandler // Launched when the job is finished. It refreshes the 3Dscene by def. virtual void finalize() { m_finalized = true; } + + virtual void on_exception(const std::exception_ptr &) {} public: Job(std::shared_ptr pri); diff --git a/src/slic3r/GUI/Jobs/PlaterJob.cpp b/src/slic3r/GUI/Jobs/PlaterJob.cpp new file mode 100644 index 00000000000..cbf76406868 --- /dev/null +++ b/src/slic3r/GUI/Jobs/PlaterJob.cpp @@ -0,0 +1,17 @@ +#include "PlaterJob.hpp" +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/Plater.hpp" + +namespace Slic3r { namespace GUI { + +void PlaterJob::on_exception(const std::exception_ptr &eptr) +{ + try { + if (eptr) + std::rethrow_exception(eptr); + } catch (std::exception &e) { + show_error(m_plater, _(L("An unexpected error occured: ")) + e.what()); + } +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/PlaterJob.hpp b/src/slic3r/GUI/Jobs/PlaterJob.hpp new file mode 100644 index 00000000000..fcf0a54b809 --- /dev/null +++ b/src/slic3r/GUI/Jobs/PlaterJob.hpp @@ -0,0 +1,24 @@ +#ifndef PLATERJOB_HPP +#define PLATERJOB_HPP + +#include "Job.hpp" + +namespace Slic3r { namespace GUI { + +class Plater; + +class PlaterJob : public Job { +protected: + Plater *m_plater; + + void on_exception(const std::exception_ptr &) override; + +public: + + PlaterJob(std::shared_ptr pri, Plater *plater): + Job{std::move(pri)}, m_plater{plater} {} +}; + +}} // namespace Slic3r::GUI + +#endif // PLATERJOB_HPP diff --git a/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp b/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp index 983c43c684a..06688b52d90 100644 --- a/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp +++ b/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp @@ -1,18 +1,15 @@ #ifndef ROTOPTIMIZEJOB_HPP #define ROTOPTIMIZEJOB_HPP -#include "Job.hpp" +#include "PlaterJob.hpp" namespace Slic3r { namespace GUI { -class Plater; - -class RotoptimizeJob : public Job +class RotoptimizeJob : public PlaterJob { - Plater *m_plater; public: RotoptimizeJob(std::shared_ptr pri, Plater *plater) - : Job{std::move(pri)}, m_plater{plater} + : PlaterJob{std::move(pri), plater} {} void process() override; diff --git a/src/slic3r/GUI/Jobs/SLAImportJob.cpp b/src/slic3r/GUI/Jobs/SLAImportJob.cpp index ec289ae344a..f9fbef8a8f7 100644 --- a/src/slic3r/GUI/Jobs/SLAImportJob.cpp +++ b/src/slic3r/GUI/Jobs/SLAImportJob.cpp @@ -124,7 +124,7 @@ class SLAImportJob::priv { }; SLAImportJob::SLAImportJob(std::shared_ptr pri, Plater *plater) - : Job{std::move(pri)}, p{std::make_unique(plater)} + : PlaterJob{std::move(pri), plater}, p{std::make_unique(plater)} {} SLAImportJob::~SLAImportJob() = default; diff --git a/src/slic3r/GUI/Jobs/SLAImportJob.hpp b/src/slic3r/GUI/Jobs/SLAImportJob.hpp index cff6cc899b3..543f4200644 100644 --- a/src/slic3r/GUI/Jobs/SLAImportJob.hpp +++ b/src/slic3r/GUI/Jobs/SLAImportJob.hpp @@ -1,13 +1,11 @@ #ifndef SLAIMPORTJOB_HPP #define SLAIMPORTJOB_HPP -#include "Job.hpp" +#include "PlaterJob.hpp" namespace Slic3r { namespace GUI { -class Plater; - -class SLAImportJob : public Job { +class SLAImportJob : public PlaterJob { class priv; std::unique_ptr p; From 2bc6679a6214d7fd24aafb3f456f309ff93247ae Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 19 Jan 2021 15:17:47 +0100 Subject: [PATCH 039/143] Partial revert of 1bffc2b99bedb0d0d76baeec52523dc1fef737e1 (deriving the printer technology from the merged configs). --- src/PrusaSlicer.cpp | 24 +++++++++++++++++------- src/libslic3r/PrintConfig.cpp | 26 ++++++++------------------ src/libslic3r/PrintConfig.hpp | 2 +- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index a990620f582..fbcf531b56e 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -57,6 +57,12 @@ using namespace Slic3r; +static PrinterTechnology get_printer_technology(const DynamicConfig &config) +{ + const ConfigOptionEnum *opt = config.option>("printer_technology"); + return (opt == nullptr) ? ptUnknown : opt->value; +} + int CLI::run(int argc, char **argv) { // Mark the main thread for the debugger and for runtime checks. @@ -95,7 +101,7 @@ int CLI::run(int argc, char **argv) m_extra_config.apply(m_config, true); m_extra_config.normalize_fdm(); - PrinterTechnology printer_technology = Slic3r::printer_technology(m_config); + PrinterTechnology printer_technology = get_printer_technology(m_config); bool start_gui = m_actions.empty() && // cutting transformations are setting an "export" action. @@ -130,7 +136,7 @@ int CLI::run(int argc, char **argv) return 1; } config.normalize_fdm(); - PrinterTechnology other_printer_technology = Slic3r::printer_technology(config); + PrinterTechnology other_printer_technology = get_printer_technology(config); if (printer_technology == ptUnknown) { printer_technology = other_printer_technology; } else if (printer_technology != other_printer_technology && other_printer_technology != ptUnknown) { @@ -167,7 +173,7 @@ int CLI::run(int argc, char **argv) // When loading an AMF or 3MF, config is imported as well, including the printer technology. DynamicPrintConfig config; model = Model::read_from_file(file, &config, true); - PrinterTechnology other_printer_technology = Slic3r::printer_technology(config); + PrinterTechnology other_printer_technology = get_printer_technology(config); if (printer_technology == ptUnknown) { printer_technology = other_printer_technology; } @@ -224,10 +230,12 @@ int CLI::run(int argc, char **argv) m_print_config.apply(sla_print_config, true); } - std::string validity = m_print_config.validate(); - if (!validity.empty()) { - boost::nowide::cerr << "error: " << validity << std::endl; - return 1; + { + std::string validity = m_print_config.validate(); + if (! validity.empty()) { + boost::nowide::cerr << "Error: The composite configation is not valid: " << validity << std::endl; + return 1; + } } // Loop through transform options. @@ -645,6 +653,7 @@ bool CLI::setup(int argc, char **argv) set_logging_level(opt_loglevel->value); } + //FIXME Validating at this stage most likely does not make sense, as the config is not fully initialized yet. std::string validity = m_config.validate(); // Initialize with defaults. @@ -654,6 +663,7 @@ bool CLI::setup(int argc, char **argv) set_data_dir(m_config.opt_string("datadir")); + //FIXME Validating at this stage most likely does not make sense, as the config is not fully initialized yet. if (!validity.empty()) { boost::nowide::cerr << "error: " << validity << std::endl; return false; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index b3084f55012..da2b655689e 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3299,15 +3299,20 @@ DynamicPrintConfig* DynamicPrintConfig::new_from_defaults_keys(const std::vector double min_object_distance(const ConfigBase &cfg) { + const ConfigOptionEnum *opt_printer_technology = cfg.option>("printer_technology"); + auto printer_technology = opt_printer_technology ? opt_printer_technology->value : ptUnknown; + double ret = 0.; - - if (printer_technology(cfg) == ptSLA) ret = 6.; + + if (printer_technology == ptSLA) + ret = 6.; else { auto ecr_opt = cfg.option("extruder_clearance_radius"); auto dd_opt = cfg.option("duplicate_distance"); auto co_opt = cfg.option("complete_objects"); - if (!ecr_opt || !dd_opt || !co_opt) ret = 0.; + if (!ecr_opt || !dd_opt || !co_opt) + ret = 0.; else { // min object distance is max(duplicate_distance, clearance_radius) ret = (co_opt->value && ecr_opt->value > dd_opt->value) ? @@ -3318,21 +3323,6 @@ double min_object_distance(const ConfigBase &cfg) return ret; } -PrinterTechnology printer_technology(const ConfigBase &cfg) -{ - const ConfigOptionEnum *opt = cfg.option>("printer_technology"); - - if (opt) return opt->value; - - const ConfigOptionBool *export_opt = cfg.option("export_sla"); - if (export_opt && export_opt->getBool()) return ptSLA; - - export_opt = cfg.option("export_gcode"); - if (export_opt && export_opt->getBool()) return ptFFF; - - return ptUnknown; -} - void DynamicPrintConfig::normalize_fdm() { if (this->has("extruder")) { diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index b5896891ef9..fa09cfb172b 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -246,7 +246,7 @@ extern const PrintConfigDef print_config_def; class StaticPrintConfig; -PrinterTechnology printer_technology(const ConfigBase &cfg); +// Minimum object distance for arrangement, based on printer technology. double min_object_distance(const ConfigBase &cfg); // Slic3r dynamic configuration, used to override the configuration From 6d49bc1978833d52902ebc944e5126f20b2cd349 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 19 Jan 2021 15:35:27 +0100 Subject: [PATCH 040/143] Follow-up to 2bc6679a6214d7fd24aafb3f456f309ff93247ae Set the printer_technology field. --- src/PrusaSlicer.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index fbcf531b56e..35450782b08 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -205,6 +205,7 @@ int CLI::run(int argc, char **argv) if (printer_technology == ptUnknown) printer_technology = std::find(m_actions.begin(), m_actions.end(), "export_sla") == m_actions.end() ? ptFFF : ptSLA; + m_print_config.option>("printer_technology", true)->value = printer_technology; // Initialize full print configs for both the FFF and SLA technologies. FullPrintConfig fff_print_config; @@ -216,8 +217,6 @@ int CLI::run(int argc, char **argv) m_print_config.apply(fff_print_config, true); } else { assert(printer_technology == ptSLA); - // The default value has to be different from the one in fff mode. - sla_print_config.printer_technology.value = ptSLA; sla_print_config.output_filename_format.value = "[input_filename_base].sl1"; // The default bed shape should reflect the default display parameters From b7c8d6db9f8efa8c1a18ce70b5a3c971c5c81100 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 19 Jan 2021 15:59:29 +0100 Subject: [PATCH 041/143] Bumped up minimum required OSX version from 10.9 to 10.10 due to an update of wxWidgets, which do not compile cleanly on 10.9 without further patching. --- src/platform/osx/Info.plist.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/osx/Info.plist.in b/src/platform/osx/Info.plist.in index e922b23f564..e3a6906622e 100644 --- a/src/platform/osx/Info.plist.in +++ b/src/platform/osx/Info.plist.in @@ -111,7 +111,7 @@ LSMinimumSystemVersion - 10.9 + 10.10 NSPrincipalClass NSApplication NSHighResolutionCapable From c506c15ed43c8327e863cad2f27b640d9544be28 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 19 Jan 2021 16:50:24 +0100 Subject: [PATCH 042/143] Manual merge of 4e586b8edabde1146c4013ca2437469a448315e2 from upsteam Slic3r, fixing "percent first layer speed was not applied over autospeed." GH upstream Slic3r #2945 our GH issue First Layer Speed Percentage not applying (#5829) --- src/libslic3r/GCode.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index cc9dfce30f9..87bfe30654d 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2591,10 +2591,10 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, throw Slic3r::InvalidArgument("Invalid speed"); } } - if (this->on_first_layer()) - speed = m_config.get_abs_value("first_layer_speed", speed); if (m_volumetric_speed != 0. && speed == 0) speed = m_volumetric_speed / path.mm3_per_mm; + if (this->on_first_layer()) + speed = m_config.get_abs_value("first_layer_speed", speed); if (m_config.max_volumetric_speed.value > 0) { // cap speed with max_volumetric_speed anyway (even if user is not using autospeed) speed = std::min( From 979dfe50b87f8a906a068e0370f9edcb8e83ce31 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Wed, 20 Jan 2021 09:21:16 +0100 Subject: [PATCH 043/143] OSX specific, needed after update of Xcode to 12.2 with OSX SDK 11.1, where we have issues with false positives of address sanitizer https://github.com/google/sanitizers/wiki/AddressSanitizerContainerOverflow#false-positives Setting ASAN_OPTIONS=detect_container_overflow=0 inside Info.plist --- src/platform/osx/Info.plist.in | 183 +++++++++++++++++---------------- 1 file changed, 94 insertions(+), 89 deletions(-) diff --git a/src/platform/osx/Info.plist.in b/src/platform/osx/Info.plist.in index e3a6906622e..46858bb2933 100644 --- a/src/platform/osx/Info.plist.in +++ b/src/platform/osx/Info.plist.in @@ -23,98 +23,103 @@ CFBundleVersion @SLIC3R_BUILD_ID@ CFBundleDocumentTypes - - - CFBundleTypeExtensions - - stl - STL - - CFBundleTypeIconFile - stl.icns - CFBundleTypeName + + + CFBundleTypeExtensions + + stl STL - CFBundleTypeRole - Viewer - LISsAppleDefaultForType - - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - obj - OBJ - - CFBundleTypeIconFile - PrusaSlicer.icns - CFBundleTypeName - STL - CFBundleTypeRole - Viewer - LISsAppleDefaultForType - - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - amf - AMF - - CFBundleTypeIconFile - PrusaSlicer.icns - CFBundleTypeName + + CFBundleTypeIconFile + stl.icns + CFBundleTypeName + STL + CFBundleTypeRole + Viewer + LISsAppleDefaultForType + + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + obj + OBJ + + CFBundleTypeIconFile + PrusaSlicer.icns + CFBundleTypeName + STL + CFBundleTypeRole + Viewer + LISsAppleDefaultForType + + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + amf AMF - CFBundleTypeRole - Viewer - LISsAppleDefaultForType - - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - 3mf - 3MF - - CFBundleTypeIconFile - PrusaSlicer.icns - CFBundleTypeName + + CFBundleTypeIconFile + PrusaSlicer.icns + CFBundleTypeName + AMF + CFBundleTypeRole + Viewer + LISsAppleDefaultForType + + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + 3mf 3MF - CFBundleTypeRole - Viewer - LISsAppleDefaultForType - - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - gcode - GCODE - - CFBundleTypeIconFile - gcode.icns - CFBundleTypeName + + CFBundleTypeIconFile + PrusaSlicer.icns + CFBundleTypeName + 3MF + CFBundleTypeRole + Viewer + LISsAppleDefaultForType + + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + gcode GCODE - CFBundleTypeRole - Viewer - LISsAppleDefaultForType - - LSHandlerRank - Alternate - - - LSMinimumSystemVersion - 10.10 - NSPrincipalClass - NSApplication - NSHighResolutionCapable - + + CFBundleTypeIconFile + gcode.icns + CFBundleTypeName + GCODE + CFBundleTypeRole + Viewer + LISsAppleDefaultForType + + LSHandlerRank + Alternate + + + LSMinimumSystemVersion + 10.10 + NSPrincipalClass + NSApplication + NSHighResolutionCapable + + LSEnvironment + + ASAN_OPTIONS + detect_container_overflow=0 + From 6d7d482ca1388f7f95ecad7122248a4c431fa9b6 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Wed, 20 Jan 2021 11:03:52 +0100 Subject: [PATCH 044/143] Fix of Extrusion Width Percentge #4631 Fixed extrusion width validation logic in case the extrusion width was specified wrt. layer height. --- src/libslic3r/Print.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 693c4e5beee..d50ff19e8a5 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1400,8 +1400,12 @@ std::string Print::validate() const #endif auto validate_extrusion_width = [min_nozzle_diameter, max_nozzle_diameter](const ConfigBase &config, const char *opt_key, double layer_height, std::string &err_msg) -> bool { - double extrusion_width_min = config.get_abs_value(opt_key, min_nozzle_diameter); - double extrusion_width_max = config.get_abs_value(opt_key, max_nozzle_diameter); + // This may change in the future, if we switch to "extrusion width wrt. nozzle diameter" + // instead of currently used logic "extrusion width wrt. layer height", see GH issues #1923 #2829. +// double extrusion_width_min = config.get_abs_value(opt_key, min_nozzle_diameter); +// double extrusion_width_max = config.get_abs_value(opt_key, max_nozzle_diameter); + double extrusion_width_min = config.get_abs_value(opt_key, layer_height); + double extrusion_width_max = config.get_abs_value(opt_key, layer_height); if (extrusion_width_min == 0) { // Default "auto-generated" extrusion width is always valid. } else if (extrusion_width_min <= layer_height) { From ee40ab421a3270b42dfadd08f47259a071177b93 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 20 Jan 2021 13:47:48 +0100 Subject: [PATCH 045/143] ENABLE_SPLITTED_VERTEX_BUFFER - Use unsigned short indices buffers to render toolpaths and temporary disable tech ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING which is causing artifacts --- src/libslic3r/Technologies.hpp | 3 +- src/slic3r/GUI/GCodeViewer.cpp | 107 +++++++++++++++++++++++++++++---- src/slic3r/GUI/GCodeViewer.hpp | 16 +++++ 3 files changed, 113 insertions(+), 13 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index ad6de77edfc..8552484c15e 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -114,7 +114,8 @@ #define ENABLE_2_3_1 1 #define ENABLE_SPLITTED_VERTEX_BUFFER (1 && ENABLE_2_3_1) -#define ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING (1 && ENABLE_SPLITTED_VERTEX_BUFFER) +#define ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING (0 && ENABLE_SPLITTED_VERTEX_BUFFER) +#define ENABLE_UNSIGNED_SHORT_INDEX_BUFFER (1 && ENABLE_SPLITTED_VERTEX_BUFFER) #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 61c34d25cdd..a0cdbcf05d3 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -884,8 +884,13 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer.ibo)); for (size_t j = 0; j < render_path.sizes.size(); ++j) { IndexBuffer indices(render_path.sizes[j]); +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(render_path.offsets[j]), + static_cast(render_path.sizes[j] * sizeof(IBufferType)), static_cast(indices.data()))); +#else glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(render_path.offsets[j]), static_cast(render_path.sizes[j] * sizeof(unsigned int)), static_cast(indices.data()))); +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER const size_t triangles_count = render_path.sizes[j] / 3; for (size_t k = 0; k < triangles_count; ++k) { @@ -904,17 +909,17 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const } #else // get vertices data from vertex buffer on gpu - size_t floats_per_vertex = buffer.vertices.vertex_size_floats(); - VertexBuffer vertices = VertexBuffer(buffer.vertices.count * floats_per_vertex); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, buffer.vertices.id)); - glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, 0, buffer.vertices.data_size_bytes(), vertices.data())); + size_t floats_per_vertex = t_buffer.vertices.vertex_size_floats(); + VertexBuffer vertices = VertexBuffer(t_buffer.vertices.count * floats_per_vertex); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, t_buffer.vertices.id)); + glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, 0, t_buffer.vertices.data_size_bytes(), vertices.data())); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); // get indices data from index buffer on gpu MultiIndexBuffer indices; - for (size_t i = 0; i < buffer.indices.size(); ++i) { - indices.push_back(IndexBuffer(buffer.indices[i].count)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer.indices[i].id)); + for (size_t i = 0; i < t_buffer.indices.size(); ++i) { + indices.push_back(IndexBuffer(t_buffer.indices[i].count)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, t_buffer.indices[i].id)); glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, static_cast(indices.back().size() * sizeof(unsigned int)), indices.back().data())); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } @@ -968,15 +973,15 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const }; size_t out_vertices_count = 0; - unsigned int indices_per_segment = buffer.indices_per_segment(); - unsigned int start_vertex_offset = buffer.start_segment_vertex_offset(); - unsigned int end_vertex_offset = buffer.end_segment_vertex_offset(); + unsigned int indices_per_segment = t_buffer.indices_per_segment(); + unsigned int start_vertex_offset = t_buffer.start_segment_vertex_offset(); + unsigned int end_vertex_offset = t_buffer.end_segment_vertex_offset(); size_t i = 0; - for (const RenderPath& render_path : buffer.render_paths) { + for (const RenderPath& render_path : t_buffer.render_paths) { // get paths segments from buffer paths const IndexBuffer& ibuffer = indices[render_path.index_buffer_id]; - const Path& path = buffer.paths[render_path.path_id]; + const Path& path = t_buffer.paths[render_path.path_id]; float half_width = 0.5f * path.width; // clamp height to avoid artifacts due to z-fighting when importing the obj file into blender and similar @@ -1151,8 +1156,10 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const #if ENABLE_SPLITTED_VERTEX_BUFFER void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) { +#if !ENABLE_UNSIGNED_SHORT_INDEX_BUFFER // max vertex buffer size, in bytes static const size_t VBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024; +#endif // !ENABLE_UNSIGNED_SHORT_INDEX_BUFFER // max index buffer size, in bytes static const size_t IBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024; @@ -1166,7 +1173,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) int64_t indices_size = 0; for (const MultiIndexBuffer& buffers : indices) { for (const IndexBuffer& buffer : buffers) { +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + indices_size += SLIC3R_STDVEC_MEMSIZE(buffer, IBufferType); +#else indices_size += SLIC3R_STDVEC_MEMSIZE(buffer, unsigned int); +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER } } log_memory_used(label, vertices_size + indices_size); @@ -1181,7 +1192,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) auto add_indices_as_point = [](const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { buffer.add_path(curr, ibuffer_id, indices.size(), move_id); +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + indices.push_back(static_cast(indices.size())); +#else indices.push_back(static_cast(indices.size())); +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER }; // format data into the buffers to be rendered as lines @@ -1287,20 +1302,35 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) static Vec3f prev_dir; static Vec3f prev_up; static float sq_prev_length; +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + auto store_triangle = [](IndexBuffer& indices, IBufferType i1, IBufferType i2, IBufferType i3) { +#else auto store_triangle = [](IndexBuffer& indices, unsigned int i1, unsigned int i2, unsigned int i3) { +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER indices.push_back(i1); indices.push_back(i2); indices.push_back(i3); }; +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + auto append_dummy_cap = [store_triangle](IndexBuffer& indices, IBufferType id) { +#else auto append_dummy_cap = [store_triangle](IndexBuffer& indices, unsigned int id) { +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER store_triangle(indices, id, id, id); store_triangle(indices, id, id, id); }; auto store_main_triangles = [&](IndexBuffer& indices, size_t vbuffer_size, const std::array& v_offsets) { +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + std::array v_ids; + for (size_t i = 0; i < v_ids.size(); ++i) { + v_ids[i] = static_cast(static_cast(vbuffer_size) + v_offsets[i]); + } +#else std::array v_ids; for (size_t i = 0; i < v_ids.size(); ++i) { v_ids[i] = static_cast(static_cast(vbuffer_size) + v_offsets[i]); } +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER // triangles starting cap store_triangle(indices, v_ids[0], v_ids[2], v_ids[1]); @@ -1557,7 +1587,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) static Vec3f prev_dir; static Vec3f prev_up; static float prev_length; +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + auto store_triangle = [](IndexBuffer& indices, IBufferType i1, IBufferType i2, IBufferType i3) { +#else auto store_triangle = [](IndexBuffer& indices, unsigned int i1, unsigned int i2, unsigned int i3) { +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER indices.push_back(i1); indices.push_back(i2); indices.push_back(i3); @@ -1758,7 +1792,12 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer // add another vertex buffer #if ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + if (v_multibuffer.back().size() * sizeof(float) > t_buffer.vertices.max_size_bytes() - t_buffer.max_vertices_per_segment_size_bytes()) { + std::cout << "Splitted v buffer at " << i << "\n"; +#else if (v_multibuffer.back().size() * sizeof(float) > VBUFFER_THRESHOLD_BYTES - t_buffer.max_vertices_per_segment_size_bytes()) { +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER v_multibuffer.push_back(VertexBuffer()); if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { Path& last_path = t_buffer.paths.back(); @@ -1766,9 +1805,16 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) last_path.add_sub_path(prev, static_cast(v_multibuffer.size()) - 1, 0, i - 1); } } +#else +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + if (v_multibuffer.back().size() * sizeof(float) > t_buffer.vertices.max_size_bytes() - t_buffer.max_vertices_per_segment_size_bytes()) { +// std::cout << "Splitted v buffer at " << i << "\n"; + v_multibuffer.push_back(VertexBuffer()); + } #else if (v_multibuffer.back().size() * sizeof(float) > VBUFFER_THRESHOLD_BYTES - t_buffer.max_vertices_per_segment_size_bytes()) v_multibuffer.push_back(VertexBuffer()); +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER #endif // ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING VertexBuffer& v_buffer = v_multibuffer.back(); @@ -2005,7 +2051,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) // if adding the indices for the current segment exceeds the threshold size of the current index buffer // create another index buffer +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + if (i_multibuffer.back().size() * sizeof(IBufferType) >= IBUFFER_THRESHOLD_BYTES - t_buffer.indices_per_segment_size_bytes()) { +#else if (i_multibuffer.back().size() * sizeof(unsigned int) >= IBUFFER_THRESHOLD_BYTES - t_buffer.indices_per_segment_size_bytes()) { +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER i_multibuffer.push_back(IndexBuffer()); vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) { @@ -2016,7 +2066,12 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer // create another index buffer +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + if (curr_vertex_buffer.second * t_buffer.vertices.vertex_size_bytes() > t_buffer.vertices.max_size_bytes() - t_buffer.max_vertices_per_segment_size_bytes()) { +// std::cout << "Splitted i buffer at " << i << "\n"; +#else if (curr_vertex_buffer.second * t_buffer.vertices.vertex_size_bytes() > VBUFFER_THRESHOLD_BYTES - t_buffer.max_vertices_per_segment_size_bytes()) { +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER i_multibuffer.push_back(IndexBuffer()); ++curr_vertex_buffer.first; @@ -2062,7 +2117,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) const MultiIndexBuffer& i_multibuffer = indices[i]; for (const IndexBuffer& i_buffer : i_multibuffer) { size_t size_elements = i_buffer.size(); +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + size_t size_bytes = size_elements * sizeof(IBufferType); +#else size_t size_bytes = size_elements * sizeof(unsigned int); +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER // stores index buffer informations into TBuffer t_buffer.indices.push_back(IBuffer()); @@ -3055,7 +3114,11 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool const IBuffer& i_buffer = buffer.indices[sub_path.first.b_id]; unsigned int index = 0; glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(offset * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&index))); +#else glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(offset * sizeof(unsigned int)), static_cast(sizeof(unsigned int)), static_cast(&index))); +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); // gets the position from the vertices buffer on gpu @@ -3133,7 +3196,11 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool if (buffer->render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) delta_1st *= buffer->indices_per_segment(); +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + render_path->offsets.push_back(static_cast((sub_path.first.i_id + delta_1st) * sizeof(IBufferType))); +#else render_path->offsets.push_back(static_cast((sub_path.first.i_id + delta_1st) * sizeof(unsigned int))); +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER #if 0 // check sizes and offsets against index buffer size on gpu @@ -3141,7 +3208,11 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer->indices[render_path->index_buffer_id].ibo)); glsafe(::glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &buffer_size)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + if (render_path->offsets.back() + render_path->sizes.back() * sizeof(IBufferType) > buffer_size) +#else if (render_path->offsets.back() + render_path->sizes.back() * sizeof(unsigned int) > buffer_size) +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER BOOST_LOG_TRIVIAL(error) << "GCodeViewer::refresh_render_paths: Invalid render path data"; #endif } @@ -3452,7 +3523,11 @@ void GCodeViewer::render_toolpaths() const for (const RenderPath& path : buffer.render_paths) { if (path.index_buffer_id == i_buffer_id) { +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + glsafe(::glMultiDrawElements(GL_POINTS, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#else glsafe(::glMultiDrawElements(GL_POINTS, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER #if ENABLE_GCODE_VIEWER_STATISTICS ++m_statistics.gl_multi_points_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS @@ -3468,7 +3543,11 @@ void GCodeViewer::render_toolpaths() const for (const RenderPath& path : buffer.render_paths) { if (path.index_buffer_id == index_buffer_id) { set_uniform_color(path.color, shader); +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + glsafe(::glMultiDrawElements(GL_LINES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#else glsafe(::glMultiDrawElements(GL_LINES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER #if ENABLE_GCODE_VIEWER_STATISTICS ++m_statistics.gl_multi_lines_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS @@ -3480,7 +3559,11 @@ void GCodeViewer::render_toolpaths() const for (const RenderPath& path : buffer.render_paths) { if (path.index_buffer_id == index_buffer_id) { set_uniform_color(path.color, shader); +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + glsafe(::glMultiDrawElements(GL_TRIANGLES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#else glsafe(::glMultiDrawElements(GL_TRIANGLES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER #if ENABLE_GCODE_VIEWER_STATISTICS ++m_statistics.gl_multi_triangles_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index f33a718dd97..d80cc9dfcaf 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -19,12 +19,19 @@ namespace GUI { class GCodeViewer { +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + using IBufferType = unsigned short; +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER using Color = std::array; using VertexBuffer = std::vector; #if ENABLE_SPLITTED_VERTEX_BUFFER using MultiVertexBuffer = std::vector; #endif // ENABLE_SPLITTED_VERTEX_BUFFER +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + using IndexBuffer = std::vector; +#else using IndexBuffer = std::vector; +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER using MultiIndexBuffer = std::vector; static const std::vector Extrusion_Role_Colors; @@ -70,6 +77,11 @@ class GCodeViewer size_t count{ 0 }; size_t data_size_bytes() const { return count * vertex_size_bytes(); } +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + // We set 65536 as max count of vertices inside a vertex buffer to allow + // to use unsigned short in place of unsigned int for indices in the index buffer, to save memory + size_t max_size_bytes() const { return 65536 * vertex_size_bytes(); } +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER size_t vertex_size_floats() const { return position_size_floats() + normal_size_floats(); } size_t vertex_size_bytes() const { return vertex_size_floats() * sizeof(float); } @@ -291,7 +303,11 @@ class GCodeViewer } } #if ENABLE_SPLITTED_VERTEX_BUFFER +#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER + size_t indices_per_segment_size_bytes() const { return static_cast(indices_per_segment() * sizeof(IBufferType)); } +#else size_t indices_per_segment_size_bytes() const { return static_cast(indices_per_segment() * sizeof(unsigned int)); } +#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER #endif // ENABLE_SPLITTED_VERTEX_BUFFER unsigned int start_segment_vertex_offset() const { return 0; } unsigned int end_segment_vertex_offset() const { From 59017a7dae25087046c5b0185cd1c27e7f176b85 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 20 Jan 2021 17:34:25 +0100 Subject: [PATCH 046/143] wxBitmapComboBox under OSX and wxComboBox under other platforms is used on Manipulation panel for coordinate space choice now. + Fix of warning on wxBitmap.SetWidth(): deleted meaningless from wxWidgets 3.0 code --- src/slic3r/GUI/Field.cpp | 21 +----------------- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 27 ++++------------------- src/slic3r/GUI/GUI_ObjectManipulation.hpp | 13 ++++++++++- 3 files changed, 17 insertions(+), 44 deletions(-) diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index 88c8331874a..360a5e5326f 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -888,6 +888,7 @@ void SpinCtrl::msw_rescale() } #ifdef __WXOSX__ +static_assert(wxMAJOR_VERSION >= 3, "Use of wxBitmapComboBox on Settings Tabs requires wxWidgets 3.0 and newer"); using choice_ctrl = wxBitmapComboBox; #else using choice_ctrl = wxComboBox; @@ -942,22 +943,6 @@ void Choice::BUILD() { set_selection(); } -#ifdef __WXOSX__ -//#ifndef __WXGTK__ - /* Workaround for a correct rendering of the control without Bitmap (under MSW and OSX): - * - * 1. We should create small Bitmap to fill Bitmaps RefData, - * ! in this case wxBitmap.IsOK() return true. - * 2. But then set width to 0 value for no using of bitmap left and right spacing - * 3. Set this empty bitmap to the at list one item and BitmapCombobox will be recreated correct - * - * Note: Set bitmap height to the Font size because of OSX rendering. - */ - wxBitmap empty_bmp(1, temp->GetFont().GetPixelSize().y + 2); - empty_bmp.SetWidth(0); - temp->SetItemBitmap(0, empty_bmp); -#endif - temp->Bind(wxEVT_MOUSEWHEEL, [this](wxMouseEvent& e) { if (m_suppress_scroll && !m_is_dropped) e.StopPropagation(); @@ -1289,10 +1274,6 @@ void Choice::msw_rescale() } } - wxBitmap empty_bmp(1, field->GetFont().GetPixelSize().y + 2); - empty_bmp.SetWidth(0); - field->SetItemBitmap(0, empty_bmp); - idx == m_opt.enum_values.size() ? field->SetValue(selection) : field->SetSelection(idx); diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index 8a4c280961b..b3cef47c55d 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -45,11 +45,11 @@ static double get_volume_min_z(const GLVolume* volume) -static wxBitmapComboBox* create_word_local_combo(wxWindow *parent) +static choice_ctrl* create_word_local_combo(wxWindow *parent) { wxSize size(15 * wxGetApp().em_unit(), -1); - wxBitmapComboBox *temp = nullptr; + choice_ctrl* temp = nullptr; #ifdef __WXOSX__ /* wxBitmapComboBox with wxCB_READONLY style return NULL for GetTextCtrl(), * so ToolTip doesn't shown. @@ -59,7 +59,7 @@ static wxBitmapComboBox* create_word_local_combo(wxWindow *parent) temp->SetTextCtrlStyle(wxTE_READONLY); temp->Create(parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr); #else - temp = new wxBitmapComboBox(parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr, wxCB_READONLY); + temp = new choice_ctrl(parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr, wxCB_READONLY); #endif //__WXOSX__ temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); @@ -70,26 +70,11 @@ static wxBitmapComboBox* create_word_local_combo(wxWindow *parent) temp->SetSelection(0); temp->SetValue(temp->GetString(0)); -#ifndef __WXGTK__ - /* Workaround for a correct rendering of the control without Bitmap (under MSW and OSX): - * - * 1. We should create small Bitmap to fill Bitmaps RefData, - * ! in this case wxBitmap.IsOK() return true. - * 2. But then set width to 0 value for no using of bitmap left and right spacing - * 3. Set this empty bitmap to the at list one item and BitmapCombobox will be recreated correct - * - * Note: Set bitmap height to the Font size because of OSX rendering. - */ - wxBitmap empty_bmp(1, temp->GetFont().GetPixelSize().y + 2); - empty_bmp.SetWidth(0); - temp->SetItemBitmap(0, empty_bmp); -#endif - temp->SetToolTip(_L("Select coordinate space, in which the transformation will be performed.")); return temp; } -void msw_rescale_word_local_combo(wxBitmapComboBox* combo) +void msw_rescale_word_local_combo(choice_ctrl* combo) { const wxString selection = combo->GetString(combo->GetSelection()); @@ -111,10 +96,6 @@ void msw_rescale_word_local_combo(wxBitmapComboBox* combo) combo->Append(_L("World coordinates")); combo->Append(_L("Local coordinates")); - wxBitmap empty_bmp(1, combo->GetFont().GetPixelSize().y + 2); - empty_bmp.SetWidth(0); - combo->SetItemBitmap(0, empty_bmp); - combo->SetValue(selection); } diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index 560fbb400d0..6b275799feb 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -7,7 +7,11 @@ #include "libslic3r/Point.hpp" #include +#ifdef __WXOSX__ class wxBitmapComboBox; +#else +class wxComboBox; +#endif // __WXOSX__ class wxStaticText; class LockButton; class wxStaticBitmap; @@ -16,6 +20,13 @@ class wxCheckBox; namespace Slic3r { namespace GUI { +#ifdef __WXOSX__ + static_assert(wxMAJOR_VERSION >= 3, "Use of wxBitmapComboBox on Manipulation panel requires wxWidgets 3.0 and newer"); + using choice_ctrl = wxBitmapComboBox; +#else + using choice_ctrl = wxComboBox; +#endif // __WXOSX__ + class Selection; class ObjectManipulation; @@ -125,7 +136,7 @@ class ObjectManipulation : public OG_Settings // Does the object manipulation panel work in World or Local coordinates? bool m_world_coordinates = true; LockButton* m_lock_bnt{ nullptr }; - wxBitmapComboBox* m_word_local_combo = nullptr; + choice_ctrl* m_word_local_combo { nullptr }; ScalableBitmap m_manifold_warning_bmp; wxStaticBitmap* m_fix_throught_netfab_bitmap; From 56b378d766a1c05b6ac5439a4490f4accf4e9d45 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 21 Jan 2021 09:44:02 +0100 Subject: [PATCH 047/143] Fixed visualization of point toolpaths, broken with daa0bbdb0cfad984565bbd4a17940a65ef28650e --- src/slic3r/GUI/GCodeViewer.cpp | 34 +++++++++++++++------------------- src/slic3r/GUI/GCodeViewer.hpp | 1 + 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index a0cdbcf05d3..150f65acf79 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -3147,6 +3147,12 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool Color color; switch (path.type) { + case EMoveType::Tool_change: { color = Options_Colors[static_cast(EOptionsColors::ToolChanges)]; break; } + case EMoveType::Color_change: { color = Options_Colors[static_cast(EOptionsColors::ColorChanges)]; break; } + case EMoveType::Pause_Print: { color = Options_Colors[static_cast(EOptionsColors::PausePrints)]; break; } + case EMoveType::Custom_GCode: { color = Options_Colors[static_cast(EOptionsColors::CustomGCodes)]; break; } + case EMoveType::Retract: { color = Options_Colors[static_cast(EOptionsColors::Retractions)]; break; } + case EMoveType::Unretract: { color = Options_Colors[static_cast(EOptionsColors::Unretractions)]; break; } case EMoveType::Extrude: { if (!top_layer_only || m_sequential_view.current.last == global_endpoints.last || @@ -3166,7 +3172,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool break; } case EMoveType::Wipe: { color = Wipe_Color; break; } - default: { color = { 0.0f, 0.0f, 0.0f }; break; } + default: { color = { 0.0f, 0.0f, 0.0f }; break; } } RenderPath key{ color, static_cast(ibuffer_id), path_id }; @@ -3505,8 +3511,7 @@ void GCodeViewer::render_toolpaths() const }; auto render_as_points = [this, zoom, point_size, near_plane_height, set_uniform_color] - (const TBuffer& buffer, unsigned int i_buffer_id, EOptionsColors color_id, GLShaderProgram& shader) { - set_uniform_color(Options_Colors[static_cast(color_id)], shader); + (const TBuffer& buffer, unsigned int ibuffer_id, GLShaderProgram& shader) { #if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS shader.set_uniform("use_fixed_screen_size", 1); #else @@ -3522,7 +3527,8 @@ void GCodeViewer::render_toolpaths() const glsafe(::glEnable(GL_POINT_SPRITE)); for (const RenderPath& path : buffer.render_paths) { - if (path.index_buffer_id == i_buffer_id) { + if (path.index_buffer_id == ibuffer_id) { + set_uniform_color(path.color, shader); #if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER glsafe(::glMultiDrawElements(GL_POINTS, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); #else @@ -3538,10 +3544,10 @@ void GCodeViewer::render_toolpaths() const glsafe(::glDisable(GL_VERTEX_PROGRAM_POINT_SIZE)); }; - auto render_as_lines = [this, light_intensity, set_uniform_color](const TBuffer& buffer, unsigned int index_buffer_id, GLShaderProgram& shader) { + auto render_as_lines = [this, light_intensity, set_uniform_color](const TBuffer& buffer, unsigned int ibuffer_id, GLShaderProgram& shader) { shader.set_uniform("light_intensity", light_intensity); for (const RenderPath& path : buffer.render_paths) { - if (path.index_buffer_id == index_buffer_id) { + if (path.index_buffer_id == ibuffer_id) { set_uniform_color(path.color, shader); #if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER glsafe(::glMultiDrawElements(GL_LINES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); @@ -3555,9 +3561,9 @@ void GCodeViewer::render_toolpaths() const } }; - auto render_as_triangles = [this, set_uniform_color](const TBuffer& buffer, unsigned int index_buffer_id, GLShaderProgram& shader) { + auto render_as_triangles = [this, set_uniform_color](const TBuffer& buffer, unsigned int ibuffer_id, GLShaderProgram& shader) { for (const RenderPath& path : buffer.render_paths) { - if (path.index_buffer_id == index_buffer_id) { + if (path.index_buffer_id == ibuffer_id) { set_uniform_color(path.color, shader); #if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER glsafe(::glMultiDrawElements(GL_TRIANGLES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); @@ -3606,17 +3612,7 @@ void GCodeViewer::render_toolpaths() const switch (buffer.render_primitive_type) { case TBuffer::ERenderPrimitiveType::Point: { - EOptionsColors color; - switch (buffer_type(i)) - { - case EMoveType::Tool_change: { color = EOptionsColors::ToolChanges; break; } - case EMoveType::Color_change: { color = EOptionsColors::ColorChanges; break; } - case EMoveType::Pause_Print: { color = EOptionsColors::PausePrints; break; } - case EMoveType::Custom_GCode: { color = EOptionsColors::CustomGCodes; break; } - case EMoveType::Retract: { color = EOptionsColors::Retractions; break; } - case EMoveType::Unretract: { color = EOptionsColors::Unretractions; break; } - } - render_as_points(buffer, static_cast(j), color, *shader); + render_as_points(buffer, static_cast(j), *shader); break; } case TBuffer::ERenderPrimitiveType::Line: { diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index d80cc9dfcaf..c0bc16f6728 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -222,6 +222,7 @@ class GCodeViewer { // Render path property Color color; + // Index of the buffer in TBuffer::indices unsigned int index_buffer_id; // Render path content unsigned int path_id; From 97c31b2a34161ce2e337a9ac5140d0353c07676a Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 21 Jan 2021 16:33:35 +0100 Subject: [PATCH 048/143] ENABLE_SPLITTED_VERTEX_BUFFER - Re-enable tech ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING after fixing it --- src/libslic3r/Technologies.hpp | 2 +- src/slic3r/GUI/GCodeViewer.cpp | 92 ++++++++++++++++++++++------------ 2 files changed, 61 insertions(+), 33 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 8552484c15e..97c153e5021 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -114,7 +114,7 @@ #define ENABLE_2_3_1 1 #define ENABLE_SPLITTED_VERTEX_BUFFER (1 && ENABLE_2_3_1) -#define ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING (0 && ENABLE_SPLITTED_VERTEX_BUFFER) +#define ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING (1 && ENABLE_SPLITTED_VERTEX_BUFFER) #define ENABLE_UNSIGNED_SHORT_INDEX_BUFFER (1 && ENABLE_SPLITTED_VERTEX_BUFFER) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 150f65acf79..43bf0345a6a 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1794,7 +1794,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) #if ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING #if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER if (v_multibuffer.back().size() * sizeof(float) > t_buffer.vertices.max_size_bytes() - t_buffer.max_vertices_per_segment_size_bytes()) { - std::cout << "Splitted v buffer at " << i << "\n"; #else if (v_multibuffer.back().size() * sizeof(float) > VBUFFER_THRESHOLD_BYTES - t_buffer.max_vertices_per_segment_size_bytes()) { #endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER @@ -1807,10 +1806,8 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) } #else #if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER - if (v_multibuffer.back().size() * sizeof(float) > t_buffer.vertices.max_size_bytes() - t_buffer.max_vertices_per_segment_size_bytes()) { -// std::cout << "Splitted v buffer at " << i << "\n"; + if (v_multibuffer.back().size() * sizeof(float) > t_buffer.vertices.max_size_bytes() - t_buffer.max_vertices_per_segment_size_bytes()) v_multibuffer.push_back(VertexBuffer()); - } #else if (v_multibuffer.back().size() * sizeof(float) > VBUFFER_THRESHOLD_BYTES - t_buffer.max_vertices_per_segment_size_bytes()) v_multibuffer.push_back(VertexBuffer()); @@ -1851,35 +1848,67 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) }; auto match_right_vertices = [&](const Path::Sub_Path& prev_sub_path, const Path::Sub_Path& next_sub_path, size_t curr_s_id, size_t vertex_size_floats, const Vec3f& displacement_vec) { - // offset into the vertex buffer of the next segment 1st vertex - size_t next_offset = (prev_sub_path.last.s_id - curr_s_id) * 6 * vertex_size_floats; - // offset into the vertex buffer of the right vertex of the previous segment - size_t prev_right_offset = prev_sub_path.last.i_id - next_offset - 3 * vertex_size_floats; - // new position of the right vertices - Vec3f shared_vertex = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset) + displacement_vec; - // update previous segment - update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset, shared_vertex); - // offset into the vertex buffer of the right vertex of the next segment - size_t r_offset = (curr_s_id == next_sub_path.first.i_id) ? 1 : 0; - size_t next_right_offset = next_sub_path.last.i_id - next_offset + r_offset * vertex_size_floats; - // update next segment - update_position_at(v_multibuffer[next_sub_path.first.b_id], next_right_offset, shared_vertex); + if (&prev_sub_path == &next_sub_path) { // previous and next segment are both contained into to the same vertex buffer + VertexBuffer& vbuffer = v_multibuffer[prev_sub_path.first.b_id]; + // offset into the vertex buffer of the next segment 1st vertex + size_t next_1st_offset = (prev_sub_path.last.s_id - curr_s_id) * 6 * vertex_size_floats; + // offset into the vertex buffer of the right vertex of the previous segment + size_t prev_right_offset = prev_sub_path.last.i_id - next_1st_offset - 3 * vertex_size_floats; + // new position of the right vertices + Vec3f shared_vertex = extract_position_at(vbuffer, prev_right_offset) + displacement_vec; + // update previous segment + update_position_at(vbuffer, prev_right_offset, shared_vertex); + // offset into the vertex buffer of the right vertex of the next segment + size_t next_right_offset = next_sub_path.last.i_id - next_1st_offset; + // update next segment + update_position_at(vbuffer, next_right_offset, shared_vertex); + } + else { // previous and next segment are contained into different vertex buffers + VertexBuffer& prev_vbuffer = v_multibuffer[prev_sub_path.first.b_id]; + VertexBuffer& next_vbuffer = v_multibuffer[next_sub_path.first.b_id]; + // offset into the previous vertex buffer of the right vertex of the previous segment + size_t prev_right_offset = prev_sub_path.last.i_id - 3 * vertex_size_floats; + // new position of the right vertices + Vec3f shared_vertex = extract_position_at(prev_vbuffer, prev_right_offset) + displacement_vec; + // update previous segment + update_position_at(prev_vbuffer, prev_right_offset, shared_vertex); + // offset into the next vertex buffer of the right vertex of the next segment + size_t next_right_offset = next_sub_path.first.i_id + 1 * vertex_size_floats; + // update next segment + update_position_at(next_vbuffer, next_right_offset, shared_vertex); + } }; auto match_left_vertices = [&](const Path::Sub_Path& prev_sub_path, const Path::Sub_Path& next_sub_path, size_t curr_s_id, size_t vertex_size_floats, const Vec3f& displacement_vec) { - // offset into the vertex buffer of the next segment 1st vertex - size_t next_offset = (prev_sub_path.last.s_id - curr_s_id) * 6 * vertex_size_floats; - // offset into the vertex buffer of the left vertex of the previous segment - size_t prev_left_offset = prev_sub_path.last.i_id - next_offset - 1 * vertex_size_floats; - // new position of the left vertices - Vec3f shared_vertex = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset) + displacement_vec; - // update previous segment - update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset, shared_vertex); - // offset into the vertex buffer of the left vertex of the next segment - size_t l_offset = (curr_s_id == next_sub_path.first.i_id) ? 3 : 1; - size_t next_left_offset = next_sub_path.last.i_id - next_offset + l_offset * vertex_size_floats; - // update next segment - update_position_at(v_multibuffer[next_sub_path.first.b_id], next_left_offset, shared_vertex); + if (&prev_sub_path == &next_sub_path) { // previous and next segment are both contained into to the same vertex buffer + VertexBuffer& vbuffer = v_multibuffer[prev_sub_path.first.b_id]; + // offset into the vertex buffer of the next segment 1st vertex + size_t next_1st_offset = (prev_sub_path.last.s_id - curr_s_id) * 6 * vertex_size_floats; + // offset into the vertex buffer of the left vertex of the previous segment + size_t prev_left_offset = prev_sub_path.last.i_id - next_1st_offset - 1 * vertex_size_floats; + // new position of the left vertices + Vec3f shared_vertex = extract_position_at(vbuffer, prev_left_offset) + displacement_vec; + // update previous segment + update_position_at(vbuffer, prev_left_offset, shared_vertex); + // offset into the vertex buffer of the left vertex of the next segment + size_t next_left_offset = next_sub_path.last.i_id - next_1st_offset + 1 * vertex_size_floats; + // update next segment + update_position_at(vbuffer, next_left_offset, shared_vertex); + } + else { // previous and next segment are contained into different vertex buffers + VertexBuffer& prev_vbuffer = v_multibuffer[prev_sub_path.first.b_id]; + VertexBuffer& next_vbuffer = v_multibuffer[next_sub_path.first.b_id]; + // offset into the previous vertex buffer of the left vertex of the previous segment + size_t prev_left_offset = prev_sub_path.last.i_id - 1 * vertex_size_floats; + // new position of the left vertices + Vec3f shared_vertex = extract_position_at(prev_vbuffer, prev_left_offset) + displacement_vec; + // update previous segment + update_position_at(prev_vbuffer, prev_left_offset, shared_vertex); + // offset into the next vertex buffer of the left vertex of the next segment + size_t next_left_offset = next_sub_path.first.i_id + 3 * vertex_size_floats; + // update next segment + update_position_at(next_vbuffer, next_left_offset, shared_vertex); + } }; size_t vertex_size_floats = t_buffer.vertices.vertex_size_floats(); @@ -1927,7 +1956,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) float sq_prev_length = (curr - prev).squaredNorm(); float sq_next_length = (next - curr).squaredNorm(); float sq_displacement = sqr(displacement); - bool can_displace = displacement > 0.0f && sq_displacement < sq_prev_length&& sq_displacement < sq_next_length; + bool can_displace = displacement > 0.0f && sq_displacement < sq_prev_length && sq_displacement < sq_next_length; if (can_displace) { // displacement to apply to the vertices to match @@ -2068,7 +2097,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) // create another index buffer #if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER if (curr_vertex_buffer.second * t_buffer.vertices.vertex_size_bytes() > t_buffer.vertices.max_size_bytes() - t_buffer.max_vertices_per_segment_size_bytes()) { -// std::cout << "Splitted i buffer at " << i << "\n"; #else if (curr_vertex_buffer.second * t_buffer.vertices.vertex_size_bytes() > VBUFFER_THRESHOLD_BYTES - t_buffer.max_vertices_per_segment_size_bytes()) { #endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER From 30f43974fbcc35536a939ecea682ecf5ba73a3f6 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 22 Jan 2021 12:32:40 +0100 Subject: [PATCH 049/143] ENABLE_GCODE_VIEWER_STATISTICS - GCodeViewer statistic dialog modified to not require extra frames render --- src/slic3r/GUI/GCodeViewer.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 43bf0345a6a..864dcdcc112 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -4576,16 +4576,12 @@ void GCodeViewer::render_statistics() const add_time(std::string("Load:"), m_statistics.load_time); add_time(std::string("Refresh:"), m_statistics.refresh_time); add_time(std::string("Refresh paths:"), m_statistics.refresh_paths_time); - wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); - wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); } if (ImGui::CollapsingHeader("OpenGL calls")) { add_counter(std::string("Multi GL_POINTS:"), m_statistics.gl_multi_points_calls_count); add_counter(std::string("Multi GL_LINES:"), m_statistics.gl_multi_lines_calls_count); add_counter(std::string("Multi GL_TRIANGLES:"), m_statistics.gl_multi_triangles_calls_count); - wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); - wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); } if (ImGui::CollapsingHeader("CPU memory")) { @@ -4594,8 +4590,6 @@ void GCodeViewer::render_statistics() const ImGui::Separator(); add_memory(std::string("Paths:"), m_statistics.paths_size); add_memory(std::string("Render paths:"), m_statistics.render_paths_size); - wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); - wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); } if (ImGui::CollapsingHeader("GPU memory")) { @@ -4604,8 +4598,6 @@ void GCodeViewer::render_statistics() const ImGui::Separator(); add_memory(std::string("Max VBuffer:"), m_statistics.max_vbuffer_gpu_size); add_memory(std::string("Max IBuffer:"), m_statistics.max_ibuffer_gpu_size); - wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); - wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); } if (ImGui::CollapsingHeader("Other")) { @@ -4615,8 +4607,6 @@ void GCodeViewer::render_statistics() const ImGui::Separator(); add_counter(std::string("VBuffers count:"), m_statistics.vbuffers_count); add_counter(std::string("IBuffers count:"), m_statistics.ibuffers_count); - wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); - wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); } imgui.end(); From eef800b5c4215abc9226cebae5733227190d9fd8 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 22 Jan 2021 15:32:36 +0100 Subject: [PATCH 050/143] FIXME on ExPolygon::overlaps(), which should be commutative. --- src/libslic3r/ExPolygon.cpp | 4 ++-- src/libslic3r/SLA/SupportPointGenerator.hpp | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/ExPolygon.cpp b/src/libslic3r/ExPolygon.cpp index 02cc126a38b..f698a355898 100644 --- a/src/libslic3r/ExPolygon.cpp +++ b/src/libslic3r/ExPolygon.cpp @@ -132,8 +132,7 @@ ExPolygon::has_boundary_point(const Point &point) const return false; } -bool -ExPolygon::overlaps(const ExPolygon &other) const +bool ExPolygon::overlaps(const ExPolygon &other) const { #if 0 BoundingBox bbox = get_extents(other); @@ -150,6 +149,7 @@ ExPolygon::overlaps(const ExPolygon &other) const #endif if (! pl_out.empty()) return true; + //FIXME ExPolygon::overlaps() shall be commutative, it is not! return ! other.contour.points.empty() && this->contains_b(other.contour.points.front()); } diff --git a/src/libslic3r/SLA/SupportPointGenerator.hpp b/src/libslic3r/SLA/SupportPointGenerator.hpp index ebb8cc373f8..d7588e3ba3c 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.hpp +++ b/src/libslic3r/SLA/SupportPointGenerator.hpp @@ -84,6 +84,7 @@ class SupportPointGenerator { float overhangs_area = 0.f; bool overlaps(const Structure &rhs) const { + //FIXME ExPolygon::overlaps() shall be commutative, it is not! return this->bbox.overlap(rhs.bbox) && (this->polygon->overlaps(*rhs.polygon) || rhs.polygon->overlaps(*this->polygon)); } float overlap_area(const Structure &rhs) const { From 79b7ccbb798049c943073c67bb21fe467d409c9c Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 22 Jan 2021 21:44:15 +0100 Subject: [PATCH 051/143] OSX specific, related to the wxWidgets 3.1.4: Fixed wrong UI-scaling (wxWidgets 3.1.4 can binding of wxEVT_DPI_CHANGED now, so it was called msw_rescale() for most of the controls redundantly) + Fixed update of the DoubleSlider after changing of the system color --- src/slic3r/GUI/DoubleSlider.cpp | 20 ++++++++++++++++++++ src/slic3r/GUI/DoubleSlider.hpp | 1 + src/slic3r/GUI/GUI_Preview.cpp | 6 ++++++ src/slic3r/GUI/GUI_Preview.hpp | 1 + src/slic3r/GUI/GUI_Utils.hpp | 2 ++ src/slic3r/GUI/OG_CustomCtrl.cpp | 4 +++- src/slic3r/GUI/Plater.cpp | 1 + 7 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 8a2257274ed..7ee5579e7c1 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -160,6 +160,26 @@ void Control::msw_rescale() GetParent()->Layout(); } +void Control::sys_color_changed() +{ + m_bmp_add_tick_on .msw_rescale(); + m_bmp_add_tick_off.msw_rescale(); + m_bmp_del_tick_on .msw_rescale(); + m_bmp_del_tick_off.msw_rescale(); + m_tick_icon_dim = m_bmp_add_tick_on.GetBmpWidth(); + + m_bmp_one_layer_lock_on .msw_rescale(); + m_bmp_one_layer_lock_off .msw_rescale(); + m_bmp_one_layer_unlock_on .msw_rescale(); + m_bmp_one_layer_unlock_off.msw_rescale(); + m_lock_icon_dim = m_bmp_one_layer_lock_on.GetBmpWidth(); + + m_bmp_revert.msw_rescale(); + m_revert_icon_dim = m_bmp_revert.GetBmpWidth(); + m_bmp_cog.msw_rescale(); + m_cog_icon_dim = m_bmp_cog.GetBmpWidth(); +} + int Control::GetActiveValue() const { return m_selection == ssLower ? diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp index 56baef6cf20..0d90367c0aa 100644 --- a/src/slic3r/GUI/DoubleSlider.hpp +++ b/src/slic3r/GUI/DoubleSlider.hpp @@ -192,6 +192,7 @@ class Control : public wxControl ~Control() {} void msw_rescale(); + void sys_color_changed(); int GetMinValue() const { return m_min_value; } int GetMaxValue() const { return m_max_value; } diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 36c1960d3f9..71b1aa9ba26 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -410,6 +410,12 @@ void Preview::msw_rescale() refresh_print(); } +void Preview::sys_color_changed() +{ + if (m_layers_slider != nullptr) + m_layers_slider->sys_color_changed(); +} + void Preview::jump_layers_slider(wxKeyEvent& evt) { if (m_layers_slider) m_layers_slider->OnChar(evt); diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 0060bfcffbb..372d44fa312 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -150,6 +150,7 @@ class Preview : public wxPanel void refresh_print(); void msw_rescale(); + void sys_color_changed(); void jump_layers_slider(wxKeyEvent& evt); void move_layers_slider(wxKeyEvent& evt); void edit_layers_slider(wxKeyEvent& evt); diff --git a/src/slic3r/GUI/GUI_Utils.hpp b/src/slic3r/GUI/GUI_Utils.hpp index 3235d6e9eaa..dbb200f83bc 100644 --- a/src/slic3r/GUI/GUI_Utils.hpp +++ b/src/slic3r/GUI/GUI_Utils.hpp @@ -108,6 +108,7 @@ template class DPIAware : public P // recalc_font(); +#ifndef __WXOSX__ #if wxVERSION_EQUAL_OR_GREATER_THAN(3,1,3) this->Bind(wxEVT_DPI_CHANGED, [this](wxDPIChangedEvent& evt) { m_scale_factor = (float)evt.GetNewDPI().x / (float)DPI_DEFAULT; @@ -128,6 +129,7 @@ template class DPIAware : public P rescale(evt.rect); }); #endif // wxVERSION_EQUAL_OR_GREATER_THAN +#endif // no __WXOSX__ this->Bind(wxEVT_MOVE_START, [this](wxMoveEvent& event) { diff --git a/src/slic3r/GUI/OG_CustomCtrl.cpp b/src/slic3r/GUI/OG_CustomCtrl.cpp index 07b96755da6..1e581e70ba7 100644 --- a/src/slic3r/GUI/OG_CustomCtrl.cpp +++ b/src/slic3r/GUI/OG_CustomCtrl.cpp @@ -360,6 +360,9 @@ void OG_CustomCtrl::correct_widgets_position(wxSizer* widget, const Line& line, void OG_CustomCtrl::msw_rescale() { +#ifdef __WXOSX__ + return; +#endif m_font = wxGetApp().normal_font(); m_em_unit = em_unit(m_parent); m_v_gap = lround(1.0 * m_em_unit); @@ -381,7 +384,6 @@ void OG_CustomCtrl::msw_rescale() void OG_CustomCtrl::sys_color_changed() { - msw_rescale(); } OG_CustomCtrl::CtrlLine::CtrlLine( wxCoord height, diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 41e9c8ff5c1..f7f56f5701f 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6209,6 +6209,7 @@ void Plater::msw_rescale() void Plater::sys_color_changed() { + p->preview->sys_color_changed(); p->sidebar->sys_color_changed(); // msw_rescale_menu updates just icons, so use it From ab3468a42057f75079f71345deb669c6ac22277d Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 22 Jan 2021 21:48:10 +0100 Subject: [PATCH 052/143] Added missed icons for the DarkMode --- resources/icons/white/edit_gcode.svg | 15 +++++++++++++++ resources/icons/white/error_tick.svg | 12 ++++++++++++ resources/icons/white/pause_print.svg | 18 ++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 resources/icons/white/edit_gcode.svg create mode 100644 resources/icons/white/error_tick.svg create mode 100644 resources/icons/white/pause_print.svg diff --git a/resources/icons/white/edit_gcode.svg b/resources/icons/white/edit_gcode.svg new file mode 100644 index 00000000000..85836c0b499 --- /dev/null +++ b/resources/icons/white/edit_gcode.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/resources/icons/white/error_tick.svg b/resources/icons/white/error_tick.svg new file mode 100644 index 00000000000..f3de981f031 --- /dev/null +++ b/resources/icons/white/error_tick.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/resources/icons/white/pause_print.svg b/resources/icons/white/pause_print.svg new file mode 100644 index 00000000000..73f747fffd6 --- /dev/null +++ b/resources/icons/white/pause_print.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + From 231cd758c159c0316ec29266dd67e02714ce91a4 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Sat, 23 Jan 2021 19:09:29 +0100 Subject: [PATCH 053/143] creality.ini: improve nonabl start_gcode --- resources/profiles/Creality.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index c983e7b88df..b7f987c7252 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -695,7 +695,7 @@ retract_length = 5 retract_speed = 60 deretract_speed = 40 retract_before_wipe = 70% -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y10 F3000\nG1 Z0.28 F240\nG92 E0\nG1 Y190 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y190 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0 end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y170 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600{endif} ; Move print head further up\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors [printer:Creality Ender-3V2] From 6955e8ec0819abeebfd29f01b6e91743f247ad19 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Sat, 23 Jan 2021 19:12:01 +0100 Subject: [PATCH 054/143] creality.ini: raise Das Filament PLA bed temp At 50C prints with sharper corners can be prone te warping if the first layer height isn't quite optimal, and given that most Creality printers don't have ABL, it often isn't. So to optimize chances of getting good non-warped prints, we keep all PLA bed temps at 60C for Creality printers. --- resources/profiles/Creality.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index b7f987c7252..c8c942211dd 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -589,9 +589,9 @@ filament_colour = #FFE200 inherits = *PLA* filament_vendor = Das Filament temperature = 215 -bed_temperature = 50 +bed_temperature = 60 first_layer_temperature = 215 -first_layer_bed_temperature = 50 +first_layer_bed_temperature = 60 filament_cost = 20.56 filament_density = 1.24 From 4ede5c3959a462c0e87dfafc5a58f2d8723bfd91 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Sat, 23 Jan 2021 19:31:23 +0100 Subject: [PATCH 055/143] creality.ini: Ender3 V2 naming consistency --- resources/profiles/Creality.ini | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index c8c942211dd..f9f5ed63360 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -24,7 +24,7 @@ bed_texture = ender3.svg default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY [printer_model:ENDER3V2] -name = Creality Ender-3V2 +name = Creality Ender-3 V2 variants = 0.4 technology = FFF family = ENDER @@ -698,8 +698,9 @@ retract_before_wipe = 70% start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y190 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0 end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y170 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600{endif} ; Move print head further up\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors -[printer:Creality Ender-3V2] +[printer:Creality Ender-3 V2] inherits = Creality Ender-3 +renamed_from = "Creality Ender-3V2" printer_model = ENDER3V2 printer_variant = 0.4 bed_shape = 0x0,220x0,220x220,0x220 From 6bcdf0999c1d8bc3cfe2e660b9b28c4140766831 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Sun, 24 Jan 2021 12:40:52 +0100 Subject: [PATCH 056/143] creality.ini: universal end_gcode improvement Replace hardcoded print presentation coordinate with print_bed_max[1], where we move the print bed ~3/4 of the bed size across the y axis at the end of the print. --- resources/profiles/Creality.ini | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index f9f5ed63360..f09a6f1b8e6 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -696,7 +696,7 @@ retract_speed = 60 deretract_speed = 40 retract_before_wipe = 70% start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y190 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0 -end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y170 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600{endif} ; Move print head further up\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors +end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y{print_bed_max[1]*0.75} F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600{endif} ; Move print head further up\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors [printer:Creality Ender-3 V2] inherits = Creality Ender-3 @@ -749,7 +749,6 @@ printer_model = ENDER2 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER2\nPRINTER_HAS_BOWDEN max_print_height = 200 start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y10 F3000\nG1 Z0.28 F240\nG92 E0\nG1 X15 Y135 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0 -end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y140 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+30, max_print_height-10)} F600{endif} ; Move print head further up\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors [printer:Creality CR-10 Mini] inherits = Creality Ender-3 From 78354ee99177c59cf2b132290d282932aa9bafa8 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Sun, 24 Jan 2021 13:09:22 +0100 Subject: [PATCH 057/143] creality.ini: reduce prime line in start_gcode reduce the prime line sufficiently so the Ender-2 no longer requires a seperate start_gcode the extrusion pressure is scaled proportionately, and reduced slightly, as previously some nozzle ooze could happen between the prime line and the skirt loops due to excessive pressure buildup --- resources/profiles/Creality.ini | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index f09a6f1b8e6..e2aa0382d5a 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -695,7 +695,7 @@ retract_length = 5 retract_speed = 60 deretract_speed = 40 retract_before_wipe = 70% -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y190 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0\n end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y{print_bed_max[1]*0.75} F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600{endif} ; Move print head further up\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors [printer:Creality Ender-3 V2] @@ -706,10 +706,10 @@ printer_variant = 0.4 bed_shape = 0x0,220x0,220x220,0x220 [printer:*fastabl*] -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y190 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 [printer:*slowabl*] -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y190 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 [printer:*invertedz*] end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print bed down\nG1 X50 Y50 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+max_print_height-10} F600{endif} ; Move print bed down further down\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors @@ -748,7 +748,6 @@ bed_shape = 0x0,150x0,150x150,0x150 printer_model = ENDER2 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER2\nPRINTER_HAS_BOWDEN max_print_height = 200 -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y10 F3000\nG1 Z0.28 F240\nG92 E0\nG1 X15 Y135 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0 [printer:Creality CR-10 Mini] inherits = Creality Ender-3 From d9448c9f2ad1e3ed869906ae5aac91596790308f Mon Sep 17 00:00:00 2001 From: YuSanka Date: Sun, 24 Jan 2021 14:54:44 +0100 Subject: [PATCH 058/143] Follow-up to https://github.com/prusa3d/PrusaSlicer/commit/ab3468a42057f75079f71345deb669c6ac22277d : Added missed icon for the DarkMode --- resources/icons/white/colorchange_add_m.svg | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 resources/icons/white/colorchange_add_m.svg diff --git a/resources/icons/white/colorchange_add_m.svg b/resources/icons/white/colorchange_add_m.svg new file mode 100644 index 00000000000..2266560daac --- /dev/null +++ b/resources/icons/white/colorchange_add_m.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + From 5f9cf7cfaec9814618f1507f0a9e67dfadb69c67 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Mon, 25 Jan 2021 17:22:13 +0100 Subject: [PATCH 059/143] creality.ini: Move print head further up for low prints With low prints, moving the print head up 70mm can still be too low to be able to remove a print conveniently, so make sure the print head is at least 60% up at the end of a print. --- resources/profiles/Creality.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index e2aa0382d5a..3dc63d12d42 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -696,7 +696,7 @@ retract_speed = 60 deretract_speed = 40 retract_before_wipe = 70% start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0\n -end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y{print_bed_max[1]*0.75} F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600{endif} ; Move print head further up\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors +end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{max_print_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors [printer:Creality Ender-3 V2] inherits = Creality Ender-3 From c27ab57c18effc2328f59f3e4fc4a5d55e6a37d7 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Mon, 25 Jan 2021 20:32:22 +0100 Subject: [PATCH 060/143] creality.ini: use 120C nozzle temp for bed leveling for CR-6 SE it seems the CR-6 SE uses 120C for it's strain gauge based bed leveling, so we'll make this our general default, so we can limit the number of start_gcode variants we'll need to maintain. this also introduces a 10 second dwell before any homing happens, to allow the nozzle to warm up, so that any filament stuck on the nozzle becomes somewhat pliable. --- resources/profiles/Creality.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 3dc63d12d42..378ab9acd2b 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -695,7 +695,7 @@ retract_length = 5 retract_speed = 60 deretract_speed = 40 retract_before_wipe = 70% -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0\n +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG4 S10 ; wait for partial warmup\nG28 ; home all\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{max_print_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors [printer:Creality Ender-3 V2] @@ -706,7 +706,7 @@ printer_variant = 0.4 bed_shape = 0x0,220x0,220x220,0x220 [printer:*fastabl*] -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG4 S10 ; wait for partial warmup\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 [printer:*slowabl*] start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 From 93da13b0a3784f82ba4945a2ae070de867966273 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Mon, 25 Jan 2021 21:06:50 +0100 Subject: [PATCH 061/143] creality.ini: set slowabl to 120C to match fastabl --- resources/profiles/Creality.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 378ab9acd2b..04f7d36a935 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -709,7 +709,7 @@ bed_shape = 0x0,220x0,220x220,0x220 start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG4 S10 ; wait for partial warmup\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 [printer:*slowabl*] -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 [printer:*invertedz*] end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print bed down\nG1 X50 Y50 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+max_print_height-10} F600{endif} ; Move print bed down further down\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors From 4620402ab44af3547ddc2f9ebbeb579261df0cef Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 22 Jan 2021 17:51:26 +0100 Subject: [PATCH 062/143] WIP: Initial Fuzzy Skin implementaiton #2010 Based on pull request Experimental fuzzy skin mode #4611 by @etet100 and on CuraEngine implementation of perimeter fuzzyfication void FffPolygonGenerator::processFuzzyWalls(SliceMeshStorage& mesh) --- src/libslic3r/PerimeterGenerator.cpp | 175 ++++++++++++++++++++++++++- src/libslic3r/Preset.cpp | 1 + src/libslic3r/PrintConfig.cpp | 62 ++++++++++ src/libslic3r/PrintConfig.hpp | 54 +++++++++ src/libslic3r/PrintObject.cpp | 4 + src/slic3r/GUI/Field.cpp | 4 + src/slic3r/GUI/GUI.cpp | 4 + src/slic3r/GUI/OptionsGroup.cpp | 6 + src/slic3r/GUI/Tab.cpp | 14 ++- 9 files changed, 320 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index ba12a1edbbf..ff9e439ba8b 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -5,6 +5,7 @@ #include #include +#include namespace Slic3r { @@ -230,8 +231,128 @@ static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perime return out; } +enum class FuzzyShape { + Triangle, + Sawtooth, + Random +}; + +static void fuzzy_polygon(Polygon &poly, FuzzyShape shape, double fuzzy_skin_thickness, double fuzzy_skin_point_dist) +{ +#if 0 + Point last = poly.points.at(poly.points.size() - 1); + Point last_processed = last; + + double max_length = scale_(2); + double min_length = scale_(1); + + if (poly.length() < scale_(5)) + return; + + deepness *= 3; + + bool triangle_or_sawtooth = shape == FuzzyShape::Sawtooth; + double length_sum = 0; + Points::iterator it = poly.points.begin(); + while (it != poly.points.end()) { + Point &pt = *it; + + Line line(last, pt); + double length = line.length(); + + // split long line + if (length > max_length) { + auto parts = int(ceil(length / max_length)); + if (parts == 2) { + Point point_to_insert(line.midpoint()); + it = poly.points.insert(it, point_to_insert); + } + else { + Vector part_vector = line.vector() / parts; + + Points points_to_insert; + Point point_to_insert(last); + while (--parts) { + point_to_insert += part_vector; + Point point_to_insert_2(point_to_insert); + points_to_insert.push_back(point_to_insert_2); + } + + it = poly.points.insert(it, points_to_insert.begin(), points_to_insert.end()); + } + continue; + } + + length_sum += length; + + // join short lines + if (length_sum < min_length) { + last = pt; + it = poly.points.erase(it); + continue; + } + + line = Line(last_processed, pt); + last = pt; + last_processed = pt; + + if (shape == FuzzyShape::Random) { + triangle_or_sawtooth = !(rand() % 2); + } + + Point point_to_insert(triangle_or_sawtooth ? pt : line.midpoint()); + + int scale = (rand() % deepness) + 1; + + Vec2d normal = line.normal().cast(); + normal /= line.length() / scale_(1.) / ((double)scale / 20.); + + it = poly.points.insert(it, point_to_insert + normal.cast()) + 2; + + length_sum = 0; + } + +#else + const double min_dist_between_points = fuzzy_skin_point_dist * 3. / 4.; // hardcoded: the point distance may vary between 3/4 and 5/4 the supplied value + const double range_random_point_dist = fuzzy_skin_point_dist / 2.; + double dist_left_over = double(rand()) * (min_dist_between_points / 2) / double(RAND_MAX); // the distance to be traversed on the line before making the first new point + Point* p0 = &poly.points.back(); + Points out; + out.reserve(poly.points.size()); + for (Point &p1 : poly.points) + { // 'a' is the (next) new point between p0 and p1 + Vec2d p0p1 = (p1 - *p0).cast(); + double p0p1_size = p0p1.norm(); + // so that p0p1_size - dist_last_point evaulates to dist_left_over - p0p1_size + double dist_last_point = dist_left_over + p0p1_size * 2.; + for (double p0pa_dist = dist_left_over; p0pa_dist < p0p1_size; + p0pa_dist += min_dist_between_points + double(rand()) * range_random_point_dist / double(RAND_MAX)) + { + double r = double(rand()) * (fuzzy_skin_thickness * 2.) / double(RAND_MAX) - fuzzy_skin_thickness; + out.emplace_back(*p0 + (p0p1 * (p0pa_dist / p0p1_size) + perp(p0p1).cast().normalized() * r).cast()); + dist_last_point = p0pa_dist; + } + dist_left_over = p0p1_size - dist_last_point; + p0 = &p1; + } + while (out.size() < 3) { + size_t point_idx = poly.size() - 2; + out.emplace_back(poly[point_idx]); + if (point_idx == 0) + break; + -- point_idx; + } + if (out.size() >= 3) + poly.points = std::move(out); +#endif +} + void PerimeterGenerator::process() { + // nasty hack! initialize random generator + auto time_us = std::chrono::duration_cast(std::chrono::time_point_cast(std::chrono::high_resolution_clock::now()).time_since_epoch()).count(); + srand(this->layer_id * time_us); + // other perimeters m_mm3_per_mm = this->perimeter_flow.mm3_per_mm(); coord_t perimeter_width = this->perimeter_flow.scaled_width(); @@ -272,6 +393,32 @@ void PerimeterGenerator::process() m_lower_slices_polygons = offset(*this->lower_slices, float(scale_(+nozzle_diameter/2))); } + // fuzzy skin configuration + double fuzzy_skin_thickness; + double fuzzy_skin_point_dist; + FuzzyShape fuzzy_skin_shape; + if (this->object_config->fuzzy_skin_perimeter_mode != FuzzySkinPerimeterMode::None) { + switch (this->object_config->fuzzy_skin_shape) { + case FuzzySkinShape::Triangle1: + case FuzzySkinShape::Triangle2: + case FuzzySkinShape::Triangle3: + fuzzy_skin_shape = FuzzyShape::Triangle; + break; + case FuzzySkinShape::Sawtooth1: + case FuzzySkinShape::Sawtooth2: + case FuzzySkinShape::Sawtooth3: + fuzzy_skin_shape = FuzzyShape::Sawtooth; + break; + case FuzzySkinShape::Random1: + case FuzzySkinShape::Random2: + case FuzzySkinShape::Random3: + fuzzy_skin_shape = FuzzyShape::Random; + break; + } + fuzzy_skin_thickness = scale_(this->object_config->fuzzy_skin_thickness); + fuzzy_skin_point_dist = scale_(this->object_config->fuzzy_skin_point_dist); + } + // we need to process each island separately because we might have different // extra perimeters for each one for (const Surface &surface : this->slices->surfaces) { @@ -352,13 +499,35 @@ void PerimeterGenerator::process() // If i > loop_number, we were looking just for gaps. break; } - for (const ExPolygon &expolygon : offsets) { + for (ExPolygon &expolygon : offsets) { // Outer contour may overlap with an inner contour, // inner contour may overlap with another inner contour, // outer contour may overlap with itself. //FIXME evaluate the overlaps, annotate each point with an overlap depth, - // compensate for the depth of intersection. - contours[i].emplace_back(PerimeterGeneratorLoop(expolygon.contour, i, true)); + + bool skip_polygon = false; + + if (this->object_config->fuzzy_skin_perimeter_mode != FuzzySkinPerimeterMode::None) { + if (i == 0 && (this->object_config->fuzzy_skin_perimeter_mode != FuzzySkinPerimeterMode::ExternalSkipFirst || this->layer_id > 0)) { + if ( + this->object_config->fuzzy_skin_perimeter_mode == FuzzySkinPerimeterMode::External || + this->object_config->fuzzy_skin_perimeter_mode == FuzzySkinPerimeterMode::ExternalSkipFirst + ) { + ExPolygon expolygon_fuzzy(expolygon); + fuzzy_polygon(expolygon_fuzzy.contour, fuzzy_skin_shape, fuzzy_skin_thickness, fuzzy_skin_point_dist); + // compensate for the depth of intersection. + contours[i].emplace_back(PerimeterGeneratorLoop(expolygon_fuzzy.contour, i, true)); + skip_polygon = true; + } else + fuzzy_polygon(expolygon.contour, fuzzy_skin_shape, fuzzy_skin_thickness, fuzzy_skin_point_dist); + } + } + + if (!skip_polygon) { + // compensate for the depth of intersection. + contours[i].emplace_back(PerimeterGeneratorLoop(expolygon.contour, i, true)); + } + if (! expolygon.holes.empty()) { holes[i].reserve(holes[i].size() + expolygon.holes.size()); for (const Polygon &hole : expolygon.holes) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index c24033df203..f75f653ef31 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -411,6 +411,7 @@ const std::vector& Preset::print_options() "solid_infill_below_area", "only_retract_when_crossing_perimeters", "infill_first", "ironing", "ironing_type", "ironing_flowrate", "ironing_speed", "ironing_spacing", "max_print_speed", "max_volumetric_speed", "avoid_crossing_perimeters_max_detour", + "fuzzy_skin_perimeter_mode", "fuzzy_skin_shape", "fuzzy_skin_thickness", "fuzzy_skin_point_dist", #ifdef HAS_PRESSURE_EQUALIZER "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative", #endif /* HAS_PRESSURE_EQUALIZER */ diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index da2b655689e..9247e69da31 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1007,6 +1007,68 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert; def->set_default_value(new ConfigOptionInts { 0 }); + def = this->add("fuzzy_skin_perimeter_mode", coEnum); + def->label = L("Fuzzy skin perimeter mode"); + def->category = L("Fuzzy Skin"); + def->tooltip = L("Fuzzy skin perimeter mode."); + + def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); + def->enum_values.push_back("none"); + def->enum_values.push_back("external_only"); + def->enum_values.push_back("external_only_skip_first_layer"); + def->enum_values.push_back("all"); + def->enum_labels.push_back(L("None")); + def->enum_labels.push_back(L("External")); + def->enum_labels.push_back(L("External (skip first layer)")); + def->enum_labels.push_back(L("All perimeters")); + def->mode = comSimple; + def->set_default_value(new ConfigOptionEnum(FuzzySkinPerimeterMode::None)); + + def = this->add("fuzzy_skin_shape", coEnum); + def->label = L("Fuzzy skin shape"); + def->category = L("Fuzzy Skin"); + def->tooltip = L("Fuzzy skin shape."); + + def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); + def->enum_values.push_back("triangle1"); + def->enum_values.push_back("triangle2"); + def->enum_values.push_back("triangle3"); + def->enum_values.push_back("sawtooth1"); + def->enum_values.push_back("sawtooth2"); + def->enum_values.push_back("sawtooth3"); + def->enum_values.push_back("random1"); + def->enum_values.push_back("random2"); + def->enum_values.push_back("random3"); + def->enum_labels.push_back(L("Triangle (1)")); + def->enum_labels.push_back(L("Triangle (2)")); + def->enum_labels.push_back(L("Triangle (3)")); + def->enum_labels.push_back(L("Sawtooth (1)")); + def->enum_labels.push_back(L("Sawtooth (2)")); + def->enum_labels.push_back(L("Sawtooth (3)")); + def->enum_labels.push_back(L("Random (1)")); + def->enum_labels.push_back(L("Random (2)")); + def->enum_labels.push_back(L("Random (3)")); + def->mode = comSimple; + def->set_default_value(new ConfigOptionEnum(FuzzySkinShape::Triangle1)); + + def = this->add("fuzzy_skin_thickness", coFloat); + def->label = L("Fuzzy skin thickness"); + def->category = L("Fuzzy Skin"); + def->tooltip = L(""); + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(0.3)); + + def = this->add("fuzzy_skin_point_dist", coFloat); + def->label = L("Fuzzy skin point distance"); + def->category = L("Fuzzy Skin"); + def->tooltip = L(""); + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(0.8)); + def = this->add("gap_fill_speed", coFloat); def->label = L("Gap fill"); def->category = L("Speed"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index fa09cfb172b..40929c34b0f 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -43,6 +43,25 @@ enum AuthorizationType { atKeyPassword, atUserPassword }; +enum class FuzzySkinPerimeterMode { + None, + External, + ExternalSkipFirst, + All +}; + +enum class FuzzySkinShape { + Triangle1, + Triangle2, + Triangle3, + Sawtooth1, + Sawtooth2, + Sawtooth3, + Random1, + Random2, + Random3 +}; + enum InfillPattern : int { ipRectilinear, ipMonotonic, ipAlignedRectilinear, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb, ipGyroid, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipAdaptiveCubic, ipSupportCubic, ipCount, @@ -140,6 +159,33 @@ template<> inline const t_config_enum_values& ConfigOptionEnum inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { + static t_config_enum_values keys_map; + if (keys_map.empty()) { + keys_map["none"] = int(FuzzySkinPerimeterMode::None); + keys_map["external_only"] = int(FuzzySkinPerimeterMode::External); + keys_map["external_only_skip_first_layer"] = int(FuzzySkinPerimeterMode::ExternalSkipFirst); + keys_map["all"] = int(FuzzySkinPerimeterMode::All); + } + return keys_map; +} + +template<> inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { + static t_config_enum_values keys_map; + if (keys_map.empty()) { + keys_map["triangle1"] = int(FuzzySkinShape::Triangle1); + keys_map["triangle2"] = int(FuzzySkinShape::Triangle2); + keys_map["triangle3"] = int(FuzzySkinShape::Triangle3); + keys_map["sawtooth1"] = int(FuzzySkinShape::Sawtooth1); + keys_map["sawtooth2"] = int(FuzzySkinShape::Sawtooth2); + keys_map["sawtooth3"] = int(FuzzySkinShape::Sawtooth3); + keys_map["random1"] = int(FuzzySkinShape::Random1); + keys_map["random2"] = int(FuzzySkinShape::Random2); + keys_map["random3"] = int(FuzzySkinShape::Random3); + } + return keys_map; +} + template<> inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { static t_config_enum_values keys_map; if (keys_map.empty()) { @@ -432,6 +478,10 @@ class PrintObjectConfig : public StaticPrintConfig ConfigOptionFloat elefant_foot_compensation; ConfigOptionFloatOrPercent extrusion_width; ConfigOptionFloatOrPercent first_layer_height; + ConfigOptionEnum fuzzy_skin_perimeter_mode; + ConfigOptionEnum fuzzy_skin_shape; + ConfigOptionFloat fuzzy_skin_thickness; + ConfigOptionFloat fuzzy_skin_point_dist; ConfigOptionBool infill_only_where_needed; // Force the generation of solid shells between adjacent materials/volumes. ConfigOptionBool interface_shells; @@ -477,6 +527,10 @@ class PrintObjectConfig : public StaticPrintConfig OPT_PTR(elefant_foot_compensation); OPT_PTR(extrusion_width); OPT_PTR(first_layer_height); + OPT_PTR(fuzzy_skin_perimeter_mode); + OPT_PTR(fuzzy_skin_shape); + OPT_PTR(fuzzy_skin_thickness); + OPT_PTR(fuzzy_skin_point_dist); OPT_PTR(infill_only_where_needed); OPT_PTR(interface_shells); OPT_PTR(layer_height); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 99b4130f4ca..dcf94fe9abe 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -521,6 +521,10 @@ bool PrintObject::invalidate_state_by_config_options(const std::vector(ret_enum); + else if (m_opt_id.compare("fuzzy_skin_perimeter_mode") == 0) + m_value = static_cast(ret_enum); + else if (m_opt_id.compare("fuzzy_skin_shape") == 0) + m_value = static_cast(ret_enum); else if (m_opt_id.compare("gcode_flavor") == 0) m_value = static_cast(ret_enum); else if (m_opt_id.compare("machine_limits_usage") == 0) diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index dea22601224..6b664c0edb8 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -182,6 +182,10 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if (opt_key.compare("ironing_type") == 0) config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); + else if (opt_key.compare("fuzzy_skin_perimeter_mode") == 0) + config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); + else if (opt_key.compare("fuzzy_skin_shape") == 0) + config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if (opt_key.compare("gcode_flavor") == 0) config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if (opt_key.compare("machine_limits_usage") == 0) diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 10774abe3a9..ced780adb60 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -870,6 +870,12 @@ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config else if (opt_key == "ironing_type") { ret = static_cast(config.option>(opt_key)->value); } + else if (opt_key == "fuzzy_skin_perimeter_mode") { + ret = static_cast(config.option>(opt_key)->value); + } + else if (opt_key == "fuzzy_skin_shape") { + ret = static_cast(config.option>(opt_key)->value); + } else if (opt_key == "gcode_flavor") { ret = static_cast(config.option>(opt_key)->value); } diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index aec2f87542b..974b709f7c2 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1434,6 +1434,18 @@ void TabPrint::build() optgroup->append_single_option_line("seam_position", category_path + "seam-position"); optgroup->append_single_option_line("external_perimeters_first", category_path + "external-perimeters-first"); + optgroup = page->new_optgroup(L("Fuzzy skin (experimental)")); + Option option = optgroup->get_option("fuzzy_skin_perimeter_mode"); + option.opt.width = 30; + optgroup->append_single_option_line(option); +#if 0 + option = optgroup->get_option("fuzzy_skin_shape"); + option.opt.width = 30; + optgroup->append_single_option_line(option); +#endif + optgroup->append_single_option_line(optgroup->get_option("fuzzy_skin_thickness")); + optgroup->append_single_option_line(optgroup->get_option("fuzzy_skin_point_dist")); + page = add_options_page(L("Infill"), "infill"); category_path = "infill_42#"; optgroup = page->new_optgroup(L("Infill")); @@ -1597,7 +1609,7 @@ void TabPrint::build() optgroup = page->new_optgroup(L("Output file")); optgroup->append_single_option_line("gcode_comments"); optgroup->append_single_option_line("gcode_label_objects"); - Option option = optgroup->get_option("output_filename_format"); + option = optgroup->get_option("output_filename_format"); option.opt.full_width = true; optgroup->append_single_option_line(option); From 500c667d7abadab88aa6c127d6cae934c7ddfb1b Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 26 Jan 2021 09:29:24 +0100 Subject: [PATCH 063/143] Extended miniz with https://github.com/richgel999/miniz/pull/147 to support writing a file from a callback without knowing the file size up front. See comments in src/miniz/README-Prusa.txt for potential pitfalls. --- src/miniz/README-Prusa.txt | 27 ++++++++++++++++++++ src/miniz/miniz.c | 52 +++++++++++++++++++++++--------------- src/miniz/miniz.h | 2 +- 3 files changed, 59 insertions(+), 22 deletions(-) create mode 100644 src/miniz/README-Prusa.txt diff --git a/src/miniz/README-Prusa.txt b/src/miniz/README-Prusa.txt new file mode 100644 index 00000000000..7ed99c53470 --- /dev/null +++ b/src/miniz/README-Prusa.txt @@ -0,0 +1,27 @@ +This library is based on miniz 2.1.0 - amalgamated version. + +---------------------------------------------------------------- + +Merged with https://github.com/richgel999/miniz/pull/147 +to support writing a zipped file using a callback without +knowing the size of the file up front. + +Vojtech made the following comments to the pull request above: + +The pull request looks good to me in general. We need such a functionality at https://github.com/prusa3d/PrusaSlicer so we are going to merge it into our project. Namely, we are exporting potentially huge model files, which are XML encoded, thus the compression ration is quite high and keeping the XML encoded model file in memory is not really practical. + +I am a bit uneasy about two things though: + +mz_zip_writer_create_zip64_extra_data() call at the start of the file block stores uncompressed and compressed size. Naturally the uncompressed size will be over estimated, while the compressed size will be zero (as it was before). I suppose it does not make any difference, as usually the decompressors do not read this block, but they rely on the copy of this block in the central directory at the end of the ZIP file. I used https://en.wikipedia.org/wiki/ZIP_(file_format) as a source and there is no definition of the ZIP64 extra data block, though the "Data descriptor" section says: +If the bit at offset 3 (0x08) of the general-purpose flags field is set, then the CRC-32 and file sizes are not known when the header is written. The fields in the local header are filled with zero, and the CRC-32 and size are appended in a 12-byte structure (optionally preceded by a 4-byte signature) immediately after the compressed data: + +Thus I suppose it is all right if the file size at the start of the file block is not correct. + +There are weird conditions in the original code as if (uncomp_size <= 3), if (uncomp_size == 0). I am not quite sure what will happen if one called your modified mz_zip_writer_add_read_buf_callback() with maximum size >= 4, but the callback provided less than 4 bytes. This is not a problem in our application, but in general it could be an issue. + +Is it an issue if the maximum size mandates a 64bit format, while the callback provides less than 4GB of data? I suppose there will only be a tiny bit of performance and file size penalty, but the code will work and the exported ZIP file will be valid. + +Are you using your modification in a production code? How well is your modification tested? + +---------------------------------------------------------------- + diff --git a/src/miniz/miniz.c b/src/miniz/miniz.c index 9ded4c75ab7..66afb94c21b 100644 --- a/src/miniz/miniz.c +++ b/src/miniz/miniz.c @@ -6370,13 +6370,13 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n return MZ_TRUE; } -mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pArchive_name, mz_file_read_func read_callback, void* callback_opaque, mz_uint64 size_to_add, const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, +mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pArchive_name, mz_file_read_func read_callback, void* callback_opaque, mz_uint64 max_size, const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, const char *user_extra_data, mz_uint user_extra_data_len, const char *user_extra_data_central, mz_uint user_extra_data_central_len) { mz_uint16 gen_flags = MZ_ZIP_LDH_BIT_FLAG_HAS_LOCATOR; mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes; mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0; - mz_uint64 local_dir_header_ofs, cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = size_to_add, comp_size = 0; + mz_uint64 local_dir_header_ofs, cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = 0, comp_size = 0; size_t archive_name_size; mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; mz_uint8 *pExtra_data = NULL; @@ -6398,7 +6398,7 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA pState = pZip->m_pState; - if ((!pState->m_zip64) && (uncomp_size > MZ_UINT32_MAX)) + if ((!pState->m_zip64) && (max_size > MZ_UINT32_MAX)) { /* Source file is too large for non-zip64 */ /*return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); */ @@ -6455,7 +6455,7 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA } #endif - if (uncomp_size <= 3) + if (max_size <= 3) level = 0; if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes)) @@ -6471,7 +6471,7 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA MZ_ASSERT((cur_archive_file_ofs & (pZip->m_file_offset_alignment - 1)) == 0); } - if (uncomp_size && level) + if (max_size && level) { method = MZ_DEFLATED; } @@ -6479,11 +6479,11 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA MZ_CLEAR_OBJ(local_dir_header); if (pState->m_zip64) { - if (uncomp_size >= MZ_UINT32_MAX || local_dir_header_ofs >= MZ_UINT32_MAX) + if (max_size >= MZ_UINT32_MAX || local_dir_header_ofs >= MZ_UINT32_MAX) { pExtra_data = extra_data; - extra_size = mz_zip_writer_create_zip64_extra_data(extra_data, (uncomp_size >= MZ_UINT32_MAX) ? &uncomp_size : NULL, - (uncomp_size >= MZ_UINT32_MAX) ? &comp_size : NULL, (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); + extra_size = mz_zip_writer_create_zip64_extra_data(extra_data, (max_size >= MZ_UINT32_MAX) ? &uncomp_size : NULL, + (max_size >= MZ_UINT32_MAX) ? &comp_size : NULL, (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); } if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, (mz_uint16)(extra_size + user_extra_data_len), 0, 0, 0, method, gen_flags, dos_time, dos_date)) @@ -6534,9 +6534,8 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA cur_archive_file_ofs += user_extra_data_len; } - if (uncomp_size) + if (max_size) { - mz_uint64 uncomp_remaining = uncomp_size; void *pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, MZ_ZIP_MAX_IO_BUF_SIZE); if (!pRead_buf) { @@ -6545,19 +6544,27 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA if (!level) { - while (uncomp_remaining) + while (1) { - mz_uint n = (mz_uint)MZ_MIN((mz_uint64)MZ_ZIP_MAX_IO_BUF_SIZE, uncomp_remaining); - if ((read_callback(callback_opaque, file_ofs, pRead_buf, n) != n) || (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf, n) != n)) + size_t n = read_callback(callback_opaque, file_ofs, pRead_buf, MZ_ZIP_MAX_IO_BUF_SIZE); + if (n == 0) + break; + + if ((n > MZ_ZIP_MAX_IO_BUF_SIZE) || (file_ofs + n > max_size)) { pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); } - file_ofs += n; + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf, n) != n) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + } + file_ofs += n; uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n); - uncomp_remaining -= n; cur_archive_file_ofs += n; } + uncomp_size = file_ofs; comp_size = uncomp_size; } else @@ -6584,24 +6591,26 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA for (;;) { - size_t in_buf_size = (mz_uint32)MZ_MIN(uncomp_remaining, (mz_uint64)MZ_ZIP_MAX_IO_BUF_SIZE); tdefl_status status; tdefl_flush flush = TDEFL_NO_FLUSH; - if (read_callback(callback_opaque, file_ofs, pRead_buf, in_buf_size)!= in_buf_size) + size_t n = read_callback(callback_opaque, file_ofs, pRead_buf, MZ_ZIP_MAX_IO_BUF_SIZE); + if ((n > MZ_ZIP_MAX_IO_BUF_SIZE) || (file_ofs + n > max_size)) { mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); break; } - file_ofs += in_buf_size; - uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, in_buf_size); - uncomp_remaining -= in_buf_size; + file_ofs += n; + uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n); if (pZip->m_pNeeds_keepalive != NULL && pZip->m_pNeeds_keepalive(pZip->m_pIO_opaque)) flush = TDEFL_FULL_FLUSH; - status = tdefl_compress_buffer(pComp, pRead_buf, in_buf_size, uncomp_remaining ? flush : TDEFL_FINISH); + if (n == 0) + flush = TDEFL_FINISH; + + status = tdefl_compress_buffer(pComp, pRead_buf, n, flush); if (status == TDEFL_STATUS_DONE) { result = MZ_TRUE; @@ -6622,6 +6631,7 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA return MZ_FALSE; } + uncomp_size = file_ofs; comp_size = state.m_comp_size; cur_archive_file_ofs = state.m_cur_archive_file_ofs; } diff --git a/src/miniz/miniz.h b/src/miniz/miniz.h index 7db62811e51..63e5267872c 100644 --- a/src/miniz/miniz.h +++ b/src/miniz/miniz.h @@ -1282,7 +1282,7 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n /* Adds the contents of a file to an archive. This function also records the disk file's modified time into the archive. */ /* File data is supplied via a read callback function. User mz_zip_writer_add_(c)file to add a file directly.*/ -mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pArchive_name, mz_file_read_func read_callback, void* callback_opaque, mz_uint64 size_to_add, +mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pArchive_name, mz_file_read_func read_callback, void* callback_opaque, mz_uint64 max_size, const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, const char *user_extra_data_local, mz_uint user_extra_data_local_len, const char *user_extra_data_central, mz_uint user_extra_data_central_len); From 85a7a3d5c55d73adac23713ef1ee3cd9b5c37f6e Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 26 Jan 2021 10:07:03 +0100 Subject: [PATCH 064/143] Use prusaslicer_add_cmake_project on each cmake deps project replace avrdude conf generation from C to CMake code --- cmake/modules/bin2h.cmake | 89 ++++++++++++++++++++++++++++++++++++++ src/avrdude/CMakeLists.txt | 18 +++----- src/avrdude/config.c | 2 +- 3 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 cmake/modules/bin2h.cmake diff --git a/cmake/modules/bin2h.cmake b/cmake/modules/bin2h.cmake new file mode 100644 index 00000000000..b838650f322 --- /dev/null +++ b/cmake/modules/bin2h.cmake @@ -0,0 +1,89 @@ +# Source: https://gist.github.com/sivachandran/3a0de157dccef822a230#file-bin2h-cmake +# Added modifications to suit prusaslicer +include(CMakeParseArguments) + +# Function to wrap a given string into multiple lines at the given column position. +# Parameters: +# VARIABLE - The name of the CMake variable holding the string. +# AT_COLUMN - The column position at which string will be wrapped. +function(WRAP_STRING) + set(oneValueArgs VARIABLE AT_COLUMN) + cmake_parse_arguments(WRAP_STRING "${options}" "${oneValueArgs}" "" ${ARGN}) + + string(LENGTH ${${WRAP_STRING_VARIABLE}} stringLength) + math(EXPR offset "0") + + while(stringLength GREATER 0) + + if(stringLength GREATER ${WRAP_STRING_AT_COLUMN}) + math(EXPR length "${WRAP_STRING_AT_COLUMN}") + else() + math(EXPR length "${stringLength}") + endif() + + string(SUBSTRING ${${WRAP_STRING_VARIABLE}} ${offset} ${length} line) + set(lines "${lines}\n${line}") + + math(EXPR stringLength "${stringLength} - ${length}") + math(EXPR offset "${offset} + ${length}") + endwhile() + + set(${WRAP_STRING_VARIABLE} "${lines}" PARENT_SCOPE) +endfunction() + +# Function to embed contents of a file as byte array in C/C++ header file(.h). The header file +# will contain a byte array and integer variable holding the size of the array. +# Parameters +# SOURCE_FILE - The path of source file whose contents will be embedded in the header file. +# VARIABLE_NAME - The name of the variable for the byte array. The string "_SIZE" will be append +# to this name and will be used a variable name for size variable. +# HEADER_FILE - The path of header file. +# APPEND - If specified appends to the header file instead of overwriting it +# NULL_TERMINATE - If specified a null byte(zero) will be append to the byte array. This will be +# useful if the source file is a text file and we want to use the file contents +# as string. But the size variable holds size of the byte array without this +# null byte. +# Usage: +# bin2h(SOURCE_FILE "Logo.png" HEADER_FILE "Logo.h" VARIABLE_NAME "LOGO_PNG") +function(BIN2H) + set(options APPEND NULL_TERMINATE ADD_WARNING_TEXT) + set(oneValueArgs SOURCE_FILE VARIABLE_NAME HEADER_FILE) + cmake_parse_arguments(BIN2H "${options}" "${oneValueArgs}" "" ${ARGN}) + + # reads source file contents as hex string + file(READ ${BIN2H_SOURCE_FILE} hexString HEX) + string(LENGTH ${hexString} hexStringLength) + + # appends null byte if asked + if(BIN2H_NULL_TERMINATE) + set(hexString "${hexString}00") + endif() + + # wraps the hex string into multiple lines at column 32(i.e. 16 bytes per line) + wrap_string(VARIABLE hexString AT_COLUMN 32) + math(EXPR arraySize "${hexStringLength} / 2") + + # adds '0x' prefix and comma suffix before and after every byte respectively + string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1, " arrayValues ${hexString}) + # removes trailing comma + string(REGEX REPLACE ", $" "" arrayValues ${arrayValues}) + + # converts the variable name into proper C identifier + string(MAKE_C_IDENTIFIER "${BIN2H_VARIABLE_NAME}" BIN2H_VARIABLE_NAME) + # string(TOUPPER "${BIN2H_VARIABLE_NAME}" BIN2H_VARIABLE_NAME) + + # declares byte array and the length variables + set(arrayDefinition "const unsigned char ${BIN2H_VARIABLE_NAME}[] = { ${arrayValues} };") + set(arraySizeDefinition "const size_t ${BIN2H_VARIABLE_NAME}_SIZE = ${arraySize};") + set(warnTxt "") + if (BIN2H_ADD_WARNING_TEXT) + set(warnTxt "/* WARN: This file is auto-generated from ${BIN2H_SOURCE_FILE} */\n") + endif () + + set(declarations "${warnTxt}${arrayDefinition}\n\n${arraySizeDefinition}\n\n") + if(BIN2H_APPEND) + file(APPEND ${BIN2H_HEADER_FILE} "${declarations}") + else() + file(WRITE ${BIN2H_HEADER_FILE} "${declarations}") + endif() +endfunction() \ No newline at end of file diff --git a/src/avrdude/CMakeLists.txt b/src/avrdude/CMakeLists.txt index fc01b7d8dd1..091afc6f98c 100644 --- a/src/avrdude/CMakeLists.txt +++ b/src/avrdude/CMakeLists.txt @@ -77,22 +77,16 @@ elseif (MINGW) ) endif() -add_executable(avrdude-conf-gen conf-generate.cpp) +include(bin2h) -# Config file embedding -add_custom_command( - DEPENDS avrdude-conf-gen ${CMAKE_CURRENT_SOURCE_DIR}/avrdude-slic3r.conf - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/avrdude-slic3r.conf.h - COMMAND $ avrdude-slic3r.conf avrdude_slic3r_conf ${CMAKE_CURRENT_BINARY_DIR}/avrdude-slic3r.conf.h - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -) - -add_custom_target(gen_conf_h - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/avrdude-slic3r.conf.h +bin2h( + SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/avrdude-slic3r.conf + VARIABLE_NAME avrdude_slic3r_conf + HEADER_FILE ${CMAKE_CURRENT_BINARY_DIR}/avrdude-slic3r.conf.h + ADD_WARNING_TEXT ) add_library(avrdude STATIC ${AVRDUDE_SOURCES}) -add_dependencies(avrdude gen_conf_h) add_executable(avrdude-slic3r main-standalone.cpp) target_link_libraries(avrdude-slic3r avrdude) diff --git a/src/avrdude/config.c b/src/avrdude/config.c index b82fb29cb7b..c0ee9c25b9d 100644 --- a/src/avrdude/config.c +++ b/src/avrdude/config.c @@ -363,7 +363,7 @@ int read_config_builtin() // Note: Can't use yy_scan_buffer, it's buggy (?), leads to fread from a null FILE* // and so unfortunatelly we have to use the copying variant here - YY_BUFFER_STATE buffer = yy_scan_bytes((const char *)avrdude_slic3r_conf, avrdude_slic3r_conf_size); + YY_BUFFER_STATE buffer = yy_scan_bytes((const char *)avrdude_slic3r_conf, avrdude_slic3r_conf_SIZE); if (buffer == NULL) { avrdude_message(MSG_INFO, "%s: read_config_builtin: Failed to initialize parsing buffer\n", progname); return -1; From 3533473256470a959116cd9c583c72913fec5ed1 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 26 Jan 2021 12:21:50 +0100 Subject: [PATCH 065/143] Tech ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING merge into tech ENABLE_SPLITTED_VERTEX_BUFFER --- src/libslic3r/Technologies.hpp | 11 +- src/slic3r/GUI/GCodeViewer.cpp | 307 --------------------------------- 2 files changed, 5 insertions(+), 313 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 97c153e5021..67d98044aea 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -108,13 +108,12 @@ #define ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING (1 && ENABLE_2_3_0_RC1) -//======= -// 2.3.1 -//======= -#define ENABLE_2_3_1 1 +//============== +// 2.3.1.alpha1 +//============== +#define ENABLE_2_3_1_ALPHA1 1 -#define ENABLE_SPLITTED_VERTEX_BUFFER (1 && ENABLE_2_3_1) -#define ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING (1 && ENABLE_SPLITTED_VERTEX_BUFFER) +#define ENABLE_SPLITTED_VERTEX_BUFFER (1 && ENABLE_2_3_1_ALPHA1) #define ENABLE_UNSIGNED_SHORT_INDEX_BUFFER (1 && ENABLE_SPLITTED_VERTEX_BUFFER) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 864dcdcc112..42284c6b4ec 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1239,7 +1239,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) }; // format data into the buffers to be rendered as solid -#if ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING auto add_vertices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, unsigned int vbuffer_id, VertexBuffer& vertices, size_t move_id) { auto store_vertex = [](VertexBuffer& vertices, const Vec3f& position, const Vec3f& normal) { // append position @@ -1434,296 +1433,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) prev_up = up; sq_prev_length = sq_length; }; -#else - auto add_vertices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, VertexBuffer& vertices, size_t move_id) { - static Vec3f prev_dir; - static Vec3f prev_up; - static float prev_length; - auto store_vertex = [](VertexBuffer& vertices, const Vec3f& position, const Vec3f& normal) { - // append position - vertices.push_back(position[0]); - vertices.push_back(position[1]); - vertices.push_back(position[2]); - // append normal - vertices.push_back(normal[0]); - vertices.push_back(normal[1]); - vertices.push_back(normal[2]); - }; - auto extract_position_at = [](const VertexBuffer& vertices, size_t id) { - return Vec3f(vertices[id + 0], vertices[id + 1], vertices[id + 2]); - }; - auto update_position_at = [](VertexBuffer& vertices, size_t id, const Vec3f& position) { - vertices[id + 0] = position[0]; - vertices[id + 1] = position[1]; - vertices[id + 2] = position[2]; - }; - - if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { - buffer.add_path(curr, 0, 0, move_id - 1); - buffer.paths.back().sub_paths.back().first.position = prev.position; - } - - unsigned int starting_vertices_size = static_cast(vertices.size() / buffer.vertices.vertex_size_floats()); - - Vec3f dir = (curr.position - prev.position).normalized(); - Vec3f right = (std::abs(std::abs(dir.dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) ? -Vec3f::UnitY() : Vec3f(dir[1], -dir[0], 0.0f).normalized(); - Vec3f left = -right; - Vec3f up = right.cross(dir); - Vec3f down = -up; - - Path& last_path = buffer.paths.back(); - - float half_width = 0.5f * last_path.width; - float half_height = 0.5f * last_path.height; - - Vec3f prev_pos = prev.position - half_height * up; - Vec3f curr_pos = curr.position - half_height * up; - - float length = (curr_pos - prev_pos).norm(); - if (last_path.vertices_count() == 1 || vertices.empty()) { - // 1st segment or restart into a new vertex buffer - // =============================================== - - // vertices 1st endpoint - store_vertex(vertices, prev_pos + half_height * up, up); - store_vertex(vertices, prev_pos + half_width * right, right); - store_vertex(vertices, prev_pos + half_height * down, down); - store_vertex(vertices, prev_pos + half_width * left, left); - - // vertices 2nd endpoint - store_vertex(vertices, curr_pos + half_height * up, up); - store_vertex(vertices, curr_pos + half_width * right, right); - store_vertex(vertices, curr_pos + half_height * down, down); - store_vertex(vertices, curr_pos + half_width * left, left); - } - else { - // any other segment - // ================= - - float displacement = 0.0f; - float cos_dir = prev_dir.dot(dir); - if (cos_dir > -0.9998477f) { - // if the angle between adjacent segments is smaller than 179 degrees - Vec3f med_dir = (prev_dir + dir).normalized(); - displacement = half_width * ::tan(::acos(std::clamp(dir.dot(med_dir), -1.0f, 1.0f))); - } - - Vec3f displacement_vec = displacement * prev_dir; - bool can_displace = displacement > 0.0f && displacement < prev_length && displacement < length; - - size_t prev_right_id = (starting_vertices_size - 3) * buffer.vertices.vertex_size_floats(); - size_t prev_left_id = (starting_vertices_size - 1) * buffer.vertices.vertex_size_floats(); - Vec3f prev_right_pos = extract_position_at(vertices, prev_right_id); - Vec3f prev_left_pos = extract_position_at(vertices, prev_left_id); - - bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f; - // whether the angle between adjacent segments is greater than 45 degrees - bool is_sharp = cos_dir < 0.7071068f; - - bool right_displaced = false; - bool left_displaced = false; - - // displace the vertex (inner with respect to the corner) of the previous segment 2nd endpoint, if possible - if (can_displace) { - if (is_right_turn) { - prev_right_pos -= displacement_vec; - update_position_at(vertices, prev_right_id, prev_right_pos); - right_displaced = true; - } - else { - prev_left_pos -= displacement_vec; - update_position_at(vertices, prev_left_id, prev_left_pos); - left_displaced = true; - } - } - - if (!is_sharp) { - // displace the vertex (outer with respect to the corner) of the previous segment 2nd endpoint, if possible - if (can_displace) { - if (is_right_turn) { - prev_left_pos += displacement_vec; - update_position_at(vertices, prev_left_id, prev_left_pos); - left_displaced = true; - } - else { - prev_right_pos += displacement_vec; - update_position_at(vertices, prev_right_id, prev_right_pos); - right_displaced = true; - } - } - - // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint) - // vertices position matches that of the previous segment 2nd endpoint, if displaced - store_vertex(vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right); - store_vertex(vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); - } - else { - // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint) - // the inner corner vertex position matches that of the previous segment 2nd endpoint, if displaced - if (is_right_turn) { - store_vertex(vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right); - store_vertex(vertices, prev_pos + half_width * left, left); - } - else { - store_vertex(vertices, prev_pos + half_width * right, right); - store_vertex(vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); - } - } - - // vertices 2nd endpoint - store_vertex(vertices, curr_pos + half_height * up, up); - store_vertex(vertices, curr_pos + half_width * right, right); - store_vertex(vertices, curr_pos + half_height * down, down); - store_vertex(vertices, curr_pos + half_width * left, left); - } - - last_path.sub_paths.back().last = { 0, 0, move_id, curr.position }; - prev_dir = dir; - prev_up = up; - prev_length = length; - }; - auto add_indices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, - size_t& vbuffer_size, unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { - static Vec3f prev_dir; - static Vec3f prev_up; - static float prev_length; -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER - auto store_triangle = [](IndexBuffer& indices, IBufferType i1, IBufferType i2, IBufferType i3) { -#else - auto store_triangle = [](IndexBuffer& indices, unsigned int i1, unsigned int i2, unsigned int i3) { -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER - indices.push_back(i1); - indices.push_back(i2); - indices.push_back(i3); - }; - auto append_dummy_cap = [store_triangle](IndexBuffer& indices, unsigned int id) { - store_triangle(indices, id, id, id); - store_triangle(indices, id, id, id); - }; - - if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { - buffer.add_path(curr, ibuffer_id, indices.size(), move_id - 1); - buffer.paths.back().sub_paths.back().first.position = prev.position; - } - - Vec3f dir = (curr.position - prev.position).normalized(); - Vec3f right = (std::abs(std::abs(dir.dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) ? -Vec3f::UnitY() : Vec3f(dir[1], -dir[0], 0.0f).normalized(); - Vec3f up = right.cross(dir); - - Path& last_path = buffer.paths.back(); - - float half_width = 0.5f * last_path.width; - float half_height = 0.5f * last_path.height; - - Vec3f prev_pos = prev.position - half_height * up; - Vec3f curr_pos = curr.position - half_height * up; - - float length = (curr_pos - prev_pos).norm(); - if (last_path.vertices_count() == 1 || vbuffer_size == 0) { - // 1st segment or restart into a new vertex buffer - // =============================================== - - // triangles starting cap - store_triangle(indices, vbuffer_size + 0, vbuffer_size + 2, vbuffer_size + 1); - store_triangle(indices, vbuffer_size + 0, vbuffer_size + 3, vbuffer_size + 2); - - // dummy triangles outer corner cap - append_dummy_cap(indices, vbuffer_size); - - // triangles sides - store_triangle(indices, vbuffer_size + 0, vbuffer_size + 1, vbuffer_size + 4); - store_triangle(indices, vbuffer_size + 1, vbuffer_size + 5, vbuffer_size + 4); - store_triangle(indices, vbuffer_size + 1, vbuffer_size + 2, vbuffer_size + 5); - store_triangle(indices, vbuffer_size + 2, vbuffer_size + 6, vbuffer_size + 5); - store_triangle(indices, vbuffer_size + 2, vbuffer_size + 3, vbuffer_size + 6); - store_triangle(indices, vbuffer_size + 3, vbuffer_size + 7, vbuffer_size + 6); - store_triangle(indices, vbuffer_size + 3, vbuffer_size + 0, vbuffer_size + 7); - store_triangle(indices, vbuffer_size + 0, vbuffer_size + 4, vbuffer_size + 7); - - // triangles ending cap - store_triangle(indices, vbuffer_size + 4, vbuffer_size + 6, vbuffer_size + 7); - store_triangle(indices, vbuffer_size + 4, vbuffer_size + 5, vbuffer_size + 6); - - vbuffer_size += 8; - } - else { - // any other segment - // ================= - - float displacement = 0.0f; - float cos_dir = prev_dir.dot(dir); - if (cos_dir > -0.9998477f) { - // if the angle between adjacent segments is smaller than 179 degrees - Vec3f med_dir = (prev_dir + dir).normalized(); - displacement = half_width * ::tan(::acos(std::clamp(dir.dot(med_dir), -1.0f, 1.0f))); - } - - Vec3f displacement_vec = displacement * prev_dir; - bool can_displace = displacement > 0.0f && displacement < prev_length&& displacement < length; - - bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f; - // whether the angle between adjacent segments is greater than 45 degrees - bool is_sharp = cos_dir < 0.7071068f; - - bool right_displaced = false; - bool left_displaced = false; - - if (!is_sharp) { - if (can_displace) { - if (is_right_turn) - left_displaced = true; - else - right_displaced = true; - } - } - - // triangles starting cap - store_triangle(indices, vbuffer_size - 4, vbuffer_size - 2, vbuffer_size + 0); - store_triangle(indices, vbuffer_size - 4, vbuffer_size + 1, vbuffer_size - 2); - - // triangles outer corner cap - if (is_right_turn) { - if (left_displaced) - // dummy triangles - append_dummy_cap(indices, vbuffer_size); - else { - store_triangle(indices, vbuffer_size - 4, vbuffer_size + 1, vbuffer_size - 1); - store_triangle(indices, vbuffer_size + 1, vbuffer_size - 2, vbuffer_size - 1); - } - } - else { - if (right_displaced) - // dummy triangles - append_dummy_cap(indices, vbuffer_size); - else { - store_triangle(indices, vbuffer_size - 4, vbuffer_size - 3, vbuffer_size + 0); - store_triangle(indices, vbuffer_size - 3, vbuffer_size - 2, vbuffer_size + 0); - } - } - - // triangles sides - store_triangle(indices, vbuffer_size - 4, vbuffer_size + 0, vbuffer_size + 2); - store_triangle(indices, vbuffer_size + 0, vbuffer_size + 3, vbuffer_size + 2); - store_triangle(indices, vbuffer_size + 0, vbuffer_size - 2, vbuffer_size + 3); - store_triangle(indices, vbuffer_size - 2, vbuffer_size + 4, vbuffer_size + 3); - store_triangle(indices, vbuffer_size - 2, vbuffer_size + 1, vbuffer_size + 4); - store_triangle(indices, vbuffer_size + 1, vbuffer_size + 5, vbuffer_size + 4); - store_triangle(indices, vbuffer_size + 1, vbuffer_size - 4, vbuffer_size + 5); - store_triangle(indices, vbuffer_size - 4, vbuffer_size + 2, vbuffer_size + 5); - - // triangles ending cap - store_triangle(indices, vbuffer_size + 2, vbuffer_size + 4, vbuffer_size + 5); - store_triangle(indices, vbuffer_size + 2, vbuffer_size + 3, vbuffer_size + 4); - - vbuffer_size += 6; - } - - last_path.sub_paths.back().last = { ibuffer_id, indices.size() - 1, move_id, curr.position }; - prev_dir = dir; - prev_up = up; - prev_length = length; - }; -#endif // ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING #if ENABLE_GCODE_VIEWER_STATISTICS auto start_time = std::chrono::high_resolution_clock::now(); @@ -1791,7 +1500,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer // add another vertex buffer -#if ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING #if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER if (v_multibuffer.back().size() * sizeof(float) > t_buffer.vertices.max_size_bytes() - t_buffer.max_vertices_per_segment_size_bytes()) { #else @@ -1804,15 +1512,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) last_path.add_sub_path(prev, static_cast(v_multibuffer.size()) - 1, 0, i - 1); } } -#else -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER - if (v_multibuffer.back().size() * sizeof(float) > t_buffer.vertices.max_size_bytes() - t_buffer.max_vertices_per_segment_size_bytes()) - v_multibuffer.push_back(VertexBuffer()); -#else - if (v_multibuffer.back().size() * sizeof(float) > VBUFFER_THRESHOLD_BYTES - t_buffer.max_vertices_per_segment_size_bytes()) - v_multibuffer.push_back(VertexBuffer()); -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER -#endif // ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING VertexBuffer& v_buffer = v_multibuffer.back(); @@ -1820,11 +1519,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) { case TBuffer::ERenderPrimitiveType::Point: { add_vertices_as_point(curr, v_buffer); break; } case TBuffer::ERenderPrimitiveType::Line: { add_vertices_as_line(prev, curr, v_buffer); break; } -#if ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING case TBuffer::ERenderPrimitiveType::Triangle: { add_vertices_as_solid(prev, curr, t_buffer, static_cast(v_multibuffer.size()) - 1, v_buffer, i); break; } -#else - case TBuffer::ERenderPrimitiveType::Triangle: { add_vertices_as_solid(prev, curr, t_buffer, v_buffer, i); break; } -#endif // ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING } // collect options zs for later use @@ -1835,7 +1530,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) } } -#if ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING // smooth toolpaths corners for the given TBuffer using triangles auto smooth_triangle_toolpaths_corners = [&gcode_result](const TBuffer& t_buffer, MultiVertexBuffer& v_multibuffer) { auto extract_position_at = [](const VertexBuffer& vertices, size_t offset) { @@ -1986,7 +1680,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) smooth_triangle_toolpaths_corners(t_buffer, vertices[i]); } } -#endif // ENABLE_TOOLPATHS_ALTERNATE_SMOOTHING for (MultiVertexBuffer& v_multibuffer : vertices) { for (VertexBuffer& v_buffer : v_multibuffer) { From 9304defe7cf8a439f68b8d4ddf61247281b9c364 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 26 Jan 2021 13:32:27 +0100 Subject: [PATCH 066/143] Tech ENABLE_UNSIGNED_SHORT_INDEX_BUFFER merged into tech ENABLE_SPLITTED_VERTEX_BUFFER --- src/libslic3r/Technologies.hpp | 7 ++-- src/slic3r/GUI/GCodeViewer.cpp | 72 ---------------------------------- src/slic3r/GUI/GCodeViewer.hpp | 16 +++----- 3 files changed, 8 insertions(+), 87 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 67d98044aea..41cfbdda8a8 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -108,13 +108,12 @@ #define ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING (1 && ENABLE_2_3_0_RC1) -//============== -// 2.3.1.alpha1 -//============== +//==================== +// 2.3.1.alpha1 techs +//==================== #define ENABLE_2_3_1_ALPHA1 1 #define ENABLE_SPLITTED_VERTEX_BUFFER (1 && ENABLE_2_3_1_ALPHA1) -#define ENABLE_UNSIGNED_SHORT_INDEX_BUFFER (1 && ENABLE_SPLITTED_VERTEX_BUFFER) #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 42284c6b4ec..a9e9d6a0354 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -884,13 +884,8 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer.ibo)); for (size_t j = 0; j < render_path.sizes.size(); ++j) { IndexBuffer indices(render_path.sizes[j]); -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(render_path.offsets[j]), static_cast(render_path.sizes[j] * sizeof(IBufferType)), static_cast(indices.data()))); -#else - glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(render_path.offsets[j]), - static_cast(render_path.sizes[j] * sizeof(unsigned int)), static_cast(indices.data()))); -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER const size_t triangles_count = render_path.sizes[j] / 3; for (size_t k = 0; k < triangles_count; ++k) { @@ -1156,10 +1151,6 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const #if ENABLE_SPLITTED_VERTEX_BUFFER void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) { -#if !ENABLE_UNSIGNED_SHORT_INDEX_BUFFER - // max vertex buffer size, in bytes - static const size_t VBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024; -#endif // !ENABLE_UNSIGNED_SHORT_INDEX_BUFFER // max index buffer size, in bytes static const size_t IBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024; @@ -1173,11 +1164,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) int64_t indices_size = 0; for (const MultiIndexBuffer& buffers : indices) { for (const IndexBuffer& buffer : buffers) { -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER indices_size += SLIC3R_STDVEC_MEMSIZE(buffer, IBufferType); -#else - indices_size += SLIC3R_STDVEC_MEMSIZE(buffer, unsigned int); -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER } } log_memory_used(label, vertices_size + indices_size); @@ -1192,11 +1179,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) auto add_indices_as_point = [](const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { buffer.add_path(curr, ibuffer_id, indices.size(), move_id); -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER indices.push_back(static_cast(indices.size())); -#else - indices.push_back(static_cast(indices.size())); -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER }; // format data into the buffers to be rendered as lines @@ -1301,35 +1284,20 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) static Vec3f prev_dir; static Vec3f prev_up; static float sq_prev_length; -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER auto store_triangle = [](IndexBuffer& indices, IBufferType i1, IBufferType i2, IBufferType i3) { -#else - auto store_triangle = [](IndexBuffer& indices, unsigned int i1, unsigned int i2, unsigned int i3) { -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER indices.push_back(i1); indices.push_back(i2); indices.push_back(i3); }; -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER auto append_dummy_cap = [store_triangle](IndexBuffer& indices, IBufferType id) { -#else - auto append_dummy_cap = [store_triangle](IndexBuffer& indices, unsigned int id) { -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER store_triangle(indices, id, id, id); store_triangle(indices, id, id, id); }; auto store_main_triangles = [&](IndexBuffer& indices, size_t vbuffer_size, const std::array& v_offsets) { -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER std::array v_ids; for (size_t i = 0; i < v_ids.size(); ++i) { v_ids[i] = static_cast(static_cast(vbuffer_size) + v_offsets[i]); } -#else - std::array v_ids; - for (size_t i = 0; i < v_ids.size(); ++i) { - v_ids[i] = static_cast(static_cast(vbuffer_size) + v_offsets[i]); - } -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER // triangles starting cap store_triangle(indices, v_ids[0], v_ids[2], v_ids[1]); @@ -1500,11 +1468,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer // add another vertex buffer -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER if (v_multibuffer.back().size() * sizeof(float) > t_buffer.vertices.max_size_bytes() - t_buffer.max_vertices_per_segment_size_bytes()) { -#else - if (v_multibuffer.back().size() * sizeof(float) > VBUFFER_THRESHOLD_BYTES - t_buffer.max_vertices_per_segment_size_bytes()) { -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER v_multibuffer.push_back(VertexBuffer()); if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { Path& last_path = t_buffer.paths.back(); @@ -1773,11 +1737,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) // if adding the indices for the current segment exceeds the threshold size of the current index buffer // create another index buffer -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER if (i_multibuffer.back().size() * sizeof(IBufferType) >= IBUFFER_THRESHOLD_BYTES - t_buffer.indices_per_segment_size_bytes()) { -#else - if (i_multibuffer.back().size() * sizeof(unsigned int) >= IBUFFER_THRESHOLD_BYTES - t_buffer.indices_per_segment_size_bytes()) { -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER i_multibuffer.push_back(IndexBuffer()); vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) { @@ -1788,11 +1748,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer // create another index buffer -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER if (curr_vertex_buffer.second * t_buffer.vertices.vertex_size_bytes() > t_buffer.vertices.max_size_bytes() - t_buffer.max_vertices_per_segment_size_bytes()) { -#else - if (curr_vertex_buffer.second * t_buffer.vertices.vertex_size_bytes() > VBUFFER_THRESHOLD_BYTES - t_buffer.max_vertices_per_segment_size_bytes()) { -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER i_multibuffer.push_back(IndexBuffer()); ++curr_vertex_buffer.first; @@ -1838,11 +1794,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) const MultiIndexBuffer& i_multibuffer = indices[i]; for (const IndexBuffer& i_buffer : i_multibuffer) { size_t size_elements = i_buffer.size(); -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER size_t size_bytes = size_elements * sizeof(IBufferType); -#else - size_t size_bytes = size_elements * sizeof(unsigned int); -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER // stores index buffer informations into TBuffer t_buffer.indices.push_back(IBuffer()); @@ -2835,11 +2787,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool const IBuffer& i_buffer = buffer.indices[sub_path.first.b_id]; unsigned int index = 0; glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(offset * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&index))); -#else - glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(offset * sizeof(unsigned int)), static_cast(sizeof(unsigned int)), static_cast(&index))); -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); // gets the position from the vertices buffer on gpu @@ -2923,11 +2871,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool if (buffer->render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) delta_1st *= buffer->indices_per_segment(); -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER render_path->offsets.push_back(static_cast((sub_path.first.i_id + delta_1st) * sizeof(IBufferType))); -#else - render_path->offsets.push_back(static_cast((sub_path.first.i_id + delta_1st) * sizeof(unsigned int))); -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER #if 0 // check sizes and offsets against index buffer size on gpu @@ -2935,11 +2879,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer->indices[render_path->index_buffer_id].ibo)); glsafe(::glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &buffer_size)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER if (render_path->offsets.back() + render_path->sizes.back() * sizeof(IBufferType) > buffer_size) -#else - if (render_path->offsets.back() + render_path->sizes.back() * sizeof(unsigned int) > buffer_size) -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER BOOST_LOG_TRIVIAL(error) << "GCodeViewer::refresh_render_paths: Invalid render path data"; #endif } @@ -3250,11 +3190,7 @@ void GCodeViewer::render_toolpaths() const for (const RenderPath& path : buffer.render_paths) { if (path.index_buffer_id == ibuffer_id) { set_uniform_color(path.color, shader); -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER glsafe(::glMultiDrawElements(GL_POINTS, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); -#else - glsafe(::glMultiDrawElements(GL_POINTS, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER #if ENABLE_GCODE_VIEWER_STATISTICS ++m_statistics.gl_multi_points_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS @@ -3270,11 +3206,7 @@ void GCodeViewer::render_toolpaths() const for (const RenderPath& path : buffer.render_paths) { if (path.index_buffer_id == ibuffer_id) { set_uniform_color(path.color, shader); -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER glsafe(::glMultiDrawElements(GL_LINES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); -#else - glsafe(::glMultiDrawElements(GL_LINES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER #if ENABLE_GCODE_VIEWER_STATISTICS ++m_statistics.gl_multi_lines_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS @@ -3286,11 +3218,7 @@ void GCodeViewer::render_toolpaths() const for (const RenderPath& path : buffer.render_paths) { if (path.index_buffer_id == ibuffer_id) { set_uniform_color(path.color, shader); -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER glsafe(::glMultiDrawElements(GL_TRIANGLES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); -#else - glsafe(::glMultiDrawElements(GL_TRIANGLES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER #if ENABLE_GCODE_VIEWER_STATISTICS ++m_statistics.gl_multi_triangles_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index c0bc16f6728..836014ad35b 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -19,19 +19,17 @@ namespace GUI { class GCodeViewer { -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER +#if ENABLE_SPLITTED_VERTEX_BUFFER using IBufferType = unsigned short; -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER +#endif // ENABLE_SPLITTED_VERTEX_BUFFER using Color = std::array; using VertexBuffer = std::vector; #if ENABLE_SPLITTED_VERTEX_BUFFER using MultiVertexBuffer = std::vector; -#endif // ENABLE_SPLITTED_VERTEX_BUFFER -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER using IndexBuffer = std::vector; #else using IndexBuffer = std::vector; -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER +#endif // ENABLE_SPLITTED_VERTEX_BUFFER using MultiIndexBuffer = std::vector; static const std::vector Extrusion_Role_Colors; @@ -77,11 +75,11 @@ class GCodeViewer size_t count{ 0 }; size_t data_size_bytes() const { return count * vertex_size_bytes(); } -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER +#if ENABLE_SPLITTED_VERTEX_BUFFER // We set 65536 as max count of vertices inside a vertex buffer to allow // to use unsigned short in place of unsigned int for indices in the index buffer, to save memory size_t max_size_bytes() const { return 65536 * vertex_size_bytes(); } -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER +#endif // ENABLE_SPLITTED_VERTEX_BUFFER size_t vertex_size_floats() const { return position_size_floats() + normal_size_floats(); } size_t vertex_size_bytes() const { return vertex_size_floats() * sizeof(float); } @@ -304,11 +302,7 @@ class GCodeViewer } } #if ENABLE_SPLITTED_VERTEX_BUFFER -#if ENABLE_UNSIGNED_SHORT_INDEX_BUFFER size_t indices_per_segment_size_bytes() const { return static_cast(indices_per_segment() * sizeof(IBufferType)); } -#else - size_t indices_per_segment_size_bytes() const { return static_cast(indices_per_segment() * sizeof(unsigned int)); } -#endif // ENABLE_UNSIGNED_SHORT_INDEX_BUFFER #endif // ENABLE_SPLITTED_VERTEX_BUFFER unsigned int start_segment_vertex_offset() const { return 0; } unsigned int end_segment_vertex_offset() const { From a897dd05047c07d8a0621f6555d3689b4f881f4c Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 26 Jan 2021 13:56:32 +0100 Subject: [PATCH 067/143] Disabled tech ENABLE_GCODE_VIEWER_STATISTICS --- src/libslic3r/Technologies.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 41cfbdda8a8..d04496bbd71 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -24,7 +24,7 @@ // Use wxDataViewRender instead of wxDataViewCustomRenderer #define ENABLE_NONCUSTOM_DATA_VIEW_RENDERING 0 // Enable G-Code viewer statistics imgui dialog -#define ENABLE_GCODE_VIEWER_STATISTICS 1 +#define ENABLE_GCODE_VIEWER_STATISTICS 0 // Enable G-Code viewer comparison between toolpaths height and width detected from gcode and calculated at gcode generation #define ENABLE_GCODE_VIEWER_DATA_CHECKING 0 From 67500f13b14284a3061ce69b7773c4dfbc82d383 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 26 Jan 2021 21:32:44 +0100 Subject: [PATCH 068/143] Fix of #5202 - Fuzzy Search engine is too fuzzy * changed evaluation coefficients inside fuzzy_match_recursive * don't add markers to the labels before it's used in fuzzy_match_recursive + follow-up https://github.com/prusa3d/PrusaSlicer/commit/78a3d8b63eb024f66a21274b828e5891b68f779c - added missed fix for one more line (use std::towlower instead of std::tolower for wchar_t) Problem was appearance on Cyrillic languages --- src/slic3r/GUI/Search.cpp | 23 +++++++++++++---------- src/slic3r/GUI/fts_fuzzy_match.h | 6 +++--- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/slic3r/GUI/Search.cpp b/src/slic3r/GUI/Search.cpp index d61fc05e02f..738d5e435a4 100644 --- a/src/slic3r/GUI/Search.cpp +++ b/src/slic3r/GUI/Search.cpp @@ -124,11 +124,12 @@ static wxString wrap_string(const wxString& str) } // Mark a string using ColorMarkerStart and ColorMarkerEnd symbols -static std::wstring mark_string(const std::wstring &str, const std::vector &matches) +static std::wstring mark_string(const std::wstring &str, const std::vector &matches, Preset::Type type, PrinterTechnology pt) { std::wstring out; + out += marker_by_type(type, pt); if (matches.empty()) - out = str; + out += str; else { out.reserve(str.size() * 2); if (matches.front() > 0) @@ -181,10 +182,11 @@ bool OptionsSearcher::search(const std::string& search, bool force/* = false*/) bool full_list = search.empty(); std::wstring sep = L" : "; - auto get_label = [this, &sep](const Option& opt) + auto get_label = [this, &sep](const Option& opt, bool marked = true) { std::wstring out; - out += marker_by_type(opt.type, printer_technology); + if (marked) + out += marker_by_type(opt.type, printer_technology); const std::wstring *prev = nullptr; for (const std::wstring * const s : { view_params.category ? &opt.category_local : nullptr, @@ -198,10 +200,11 @@ bool OptionsSearcher::search(const std::string& search, bool force/* = false*/) return out; }; - auto get_label_english = [this, &sep](const Option& opt) + auto get_label_english = [this, &sep](const Option& opt, bool marked = true) { std::wstring out; - out += marker_by_type(opt.type, printer_technology); + if (marked) + out += marker_by_type(opt.type, printer_technology); const std::wstring*prev = nullptr; for (const std::wstring * const s : { view_params.category ? &opt.category : nullptr, @@ -234,8 +237,8 @@ bool OptionsSearcher::search(const std::string& search, bool force/* = false*/) std::wstring wsearch = boost::nowide::widen(search); boost::trim_left(wsearch); - std::wstring label = get_label(opt); - std::wstring label_english = get_label_english(opt); + std::wstring label = get_label(opt, false); + std::wstring label_english = get_label_english(opt, false); int score = std::numeric_limits::min(); int score2; matches.clear(); @@ -252,8 +255,8 @@ bool OptionsSearcher::search(const std::string& search, bool force/* = false*/) matches = std::move(matches2); score = score2; } - if (score > std::numeric_limits::min()) { - label = mark_string(label, matches); + if (score > 90/*std::numeric_limits::min()*/) { + label = mark_string(label, matches, opt.type, printer_technology); label += L" [" + std::to_wstring(score) + L"]";// add score value std::string label_u8 = into_u8(label); std::string label_plain = label_u8; diff --git a/src/slic3r/GUI/fts_fuzzy_match.h b/src/slic3r/GUI/fts_fuzzy_match.h index 4dd206aac1c..4b474451c4f 100644 --- a/src/slic3r/GUI/fts_fuzzy_match.h +++ b/src/slic3r/GUI/fts_fuzzy_match.h @@ -113,7 +113,7 @@ namespace fts { bool first_match = true; while (*pattern != '\0' && *str != '\0') { - int num_matched = std::tolower(*pattern) == std::tolower(*str) ? 1 : 0; + int num_matched = std::towlower(*pattern) == std::towlower(*str) ? 1 : 0; bool folded_match = false; if (! num_matched) { wchar_t tmp[4]; @@ -168,11 +168,11 @@ namespace fts { // Calculate score if (matched) { static constexpr int sequential_bonus = 15; // bonus for adjacent matches - static constexpr int separator_bonus = 30; // bonus if match occurs after a separator + static constexpr int separator_bonus = 10/*30*/; // bonus if match occurs after a separator static constexpr int camel_bonus = 30; // bonus if match is uppercase and prev is lower static constexpr int first_letter_bonus = 15; // bonus if the first letter is matched - static constexpr int leading_letter_penalty = -5; // penalty applied for every letter in str before the first match + static constexpr int leading_letter_penalty = -1/*-5*/; // penalty applied for every letter in str before the first match static constexpr int max_leading_letter_penalty = -15; // maximum penalty for leading letters static constexpr int unmatched_letter_penalty = -1; // penalty for every letter that doesn't matter From 708d14f5dcc9aedc7f2131aeab538caec00e3577 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 27 Jan 2021 08:19:42 +0100 Subject: [PATCH 069/143] #5541 - Fixed reload from disk after loading from 3mf --- src/slic3r/GUI/Plater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index f7f56f5701f..ae9e58a9576 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3305,7 +3305,7 @@ void Plater::priv::reload_from_disk() new_volume->config.apply(old_volume->config); new_volume->set_type(old_volume->type()); new_volume->set_material_id(old_volume->material_id()); - new_volume->set_transformation(old_volume->get_transformation() * old_volume->source.transform); + new_volume->set_transformation(old_volume->get_transformation()); new_volume->translate(new_volume->get_transformation().get_matrix(true) * (new_volume->source.mesh_offset - old_volume->source.mesh_offset)); if (old_volume->source.is_converted_from_inches) new_volume->convert_from_imperial_units(); From 729298c40854e97dbaf051316f789dbd2f873a31 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 26 Jan 2021 12:19:08 +0100 Subject: [PATCH 070/143] PrusaResearch (Vojtech) homebrewed the following: mz_zip_writer_add_staged_open(), mz_zip_writer_add_staged_data() and mz_zip_writer_add_staged_finish() were derived from mz_zip_writer_add_read_buf_callback() by splitting it and passing a new mz_zip_writer_staged_context between them. --- src/miniz/README-Prusa.txt | 6 + src/miniz/miniz.c | 287 +++++++++++++++++++++++++++++++++++-- src/miniz/miniz.h | 52 +++++++ 3 files changed, 337 insertions(+), 8 deletions(-) diff --git a/src/miniz/README-Prusa.txt b/src/miniz/README-Prusa.txt index 7ed99c53470..494227c6ba5 100644 --- a/src/miniz/README-Prusa.txt +++ b/src/miniz/README-Prusa.txt @@ -2,6 +2,12 @@ This library is based on miniz 2.1.0 - amalgamated version. ---------------------------------------------------------------- +mz_zip_writer_add_staged_open(), mz_zip_writer_add_staged_data() and mz_zip_writer_add_staged_finish() +were derived from mz_zip_writer_add_read_buf_callback() by splitting it and passing a new +mz_zip_writer_staged_context between them. + +---------------------------------------------------------------- + Merged with https://github.com/richgel999/miniz/pull/147 to support writing a zipped file using a callback without knowing the size of the file up front. diff --git a/src/miniz/miniz.c b/src/miniz/miniz.c index 66afb94c21b..36be26b2802 100644 --- a/src/miniz/miniz.c +++ b/src/miniz/miniz.c @@ -5904,13 +5904,6 @@ mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, c return mz_zip_writer_add_mem_ex(pZip, pArchive_name, pBuf, buf_size, NULL, 0, level_and_flags, 0, 0); } -typedef struct -{ - mz_zip_archive *m_pZip; - mz_uint64 m_cur_archive_file_ofs; - mz_uint64 m_comp_size; -} mz_zip_writer_add_state; - static mz_bool mz_zip_writer_add_put_buf_callback(const void *pBuf, int len, void *pUser) { mz_zip_writer_add_state *pState = (mz_zip_writer_add_state *)pUser; @@ -5923,7 +5916,6 @@ static mz_bool mz_zip_writer_add_put_buf_callback(const void *pBuf, int len, voi } #define MZ_ZIP64_MAX_LOCAL_EXTRA_FIELD_SIZE (sizeof(mz_uint16) * 2 + sizeof(mz_uint64) * 2) -#define MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE (sizeof(mz_uint16) * 2 + sizeof(mz_uint64) * 3) static mz_uint32 mz_zip_writer_create_zip64_extra_data(mz_uint8 *pBuf, mz_uint64 *pUncomp_size, mz_uint64 *pComp_size, mz_uint64 *pLocal_header_ofs) { mz_uint8 *pDst = pBuf; @@ -6683,6 +6675,285 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA return MZ_TRUE; } +mz_bool mz_zip_writer_add_staged_open(mz_zip_archive* pZip, mz_zip_writer_staged_context* pContext, const char* pArchive_name, mz_uint64 max_size, const MZ_TIME_T* pFile_time, const void* pComment, mz_uint16 comment_size, mz_uint level_and_flags, + const char* user_extra_data, mz_uint user_extra_data_len, const char* user_extra_data_central, mz_uint user_extra_data_central_len) +{ + mz_uint level, num_alignment_padding_bytes; + mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; + mz_zip_internal_state* pState; + + memset(pContext, 0, sizeof(mz_zip_writer_staged_context)); + pContext->gen_flags = MZ_ZIP_LDH_BIT_FLAG_HAS_LOCATOR; + pContext->uncomp_crc32 = MZ_CRC32_INIT; + pContext->method = MZ_DEFLATED; + pContext->cur_archive_file_ofs = pZip->m_archive_size; + pContext->max_size = max_size; + pContext->pArchive_name = pArchive_name; + pContext->pComment = pComment; + pContext->comment_size = comment_size; + pContext->user_extra_data_central = user_extra_data_central; + pContext->user_extra_data_central_len = user_extra_data_central_len; + + if (!(level_and_flags & MZ_ZIP_FLAG_ASCII_FILENAME)) + pContext->gen_flags |= MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_UTF8; + + if ((int)level_and_flags < 0) + level_and_flags = MZ_DEFAULT_LEVEL; + level = level_and_flags & 0xF; + + /* Sanity checks */ + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || (!pArchive_name) || ((comment_size) && (!pComment)) || (level == 0) || (level > MZ_UBER_COMPRESSION) || (max_size < 4)) + return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); + + pState = pZip->m_pState; + + if ((!pState->m_zip64) && (max_size > MZ_UINT32_MAX)) + { + /* Source file is too large for non-zip64 */ + /*return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); */ + pState->m_zip64 = MZ_TRUE; + } + + /* We could support this, but why? */ + if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA) + return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); + + if (!mz_zip_writer_validate_archive_name(pArchive_name)) + return mz_zip_set_error(pZip, MZ_ZIP_INVALID_FILENAME); + + if (pState->m_zip64) + { + if (pZip->m_total_files == MZ_UINT32_MAX) + return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); + } + else + { + if (pZip->m_total_files == MZ_UINT16_MAX) + { + pState->m_zip64 = MZ_TRUE; + /*return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); */ + } + } + + pContext->archive_name_size = strlen(pArchive_name); + if (pContext->archive_name_size > MZ_UINT16_MAX) + return mz_zip_set_error(pZip, MZ_ZIP_INVALID_FILENAME); + + num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); + + /* miniz doesn't support central dirs >= MZ_UINT32_MAX bytes yet */ + if (((mz_uint64)pState->m_central_dir.m_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + pContext->archive_name_size + MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE + comment_size) >= MZ_UINT32_MAX) + return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_CDIR_SIZE); + + if (!pState->m_zip64) + { + /* Bail early if the archive would obviously become too large */ + if ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + pContext->archive_name_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + + pContext->archive_name_size + comment_size + user_extra_data_len + pState->m_central_dir.m_size + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE + 1024 + + MZ_ZIP_DATA_DESCRIPTER_SIZE32 + user_extra_data_central_len) > 0xFFFFFFFF) + { + pState->m_zip64 = MZ_TRUE; + /*return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); */ + } + } + +#ifndef MINIZ_NO_TIME + if (pFile_time) + { + mz_zip_time_t_to_dos_time(*pFile_time, &pContext->dos_time, &pContext->dos_date); + } +#endif + + if (!mz_zip_writer_write_zeros(pZip, pContext->cur_archive_file_ofs, num_alignment_padding_bytes)) + { + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + } + + pContext->cur_archive_file_ofs += num_alignment_padding_bytes; + pContext->local_dir_header_ofs = pContext->cur_archive_file_ofs; + + if (pZip->m_file_offset_alignment) + { + MZ_ASSERT((cur_archive_file_ofs & (pZip->m_file_offset_alignment - 1)) == 0); + } + + MZ_CLEAR_OBJ(local_dir_header); + if (pState->m_zip64) + { + if (max_size >= MZ_UINT32_MAX || pContext->local_dir_header_ofs >= MZ_UINT32_MAX) + { + pContext->pExtra_data = pContext->extra_data; + pContext->extra_size = mz_zip_writer_create_zip64_extra_data(pContext->extra_data, (max_size >= MZ_UINT32_MAX) ? &pContext->uncomp_size : NULL, + (max_size >= MZ_UINT32_MAX) ? &pContext->comp_size : NULL, (pContext->local_dir_header_ofs >= MZ_UINT32_MAX) ? &pContext->local_dir_header_ofs : NULL); + } + + if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)pContext->archive_name_size, (mz_uint16)(pContext->extra_size + user_extra_data_len), 0, 0, 0, pContext->method, pContext->gen_flags, pContext->dos_time, pContext->dos_date)) + return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); + + if (pZip->m_pWrite(pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + + pContext->cur_archive_file_ofs += sizeof(local_dir_header); + + if (pZip->m_pWrite(pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, pArchive_name, pContext->archive_name_size) != pContext->archive_name_size) + { + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + } + + pContext->cur_archive_file_ofs += pContext->archive_name_size; + + if (pZip->m_pWrite(pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, pContext->extra_data, pContext->extra_size) != pContext->extra_size) + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + + pContext->cur_archive_file_ofs += pContext->extra_size; + } + else + { + if ((pContext->comp_size > MZ_UINT32_MAX) || (pContext->cur_archive_file_ofs > MZ_UINT32_MAX)) + return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); + if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)pContext->archive_name_size, (mz_uint16)user_extra_data_len, 0, 0, 0, pContext->method, pContext->gen_flags, pContext->dos_time, pContext->dos_date)) + return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); + + if (pZip->m_pWrite(pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + + pContext->cur_archive_file_ofs += sizeof(local_dir_header); + + if (pZip->m_pWrite(pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, pArchive_name, pContext->archive_name_size) != pContext->archive_name_size) + { + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + } + + pContext->cur_archive_file_ofs += pContext->archive_name_size; + } + + if (user_extra_data_len > 0) + { + if (pZip->m_pWrite(pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, user_extra_data, user_extra_data_len) != user_extra_data_len) + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + + pContext->cur_archive_file_ofs += user_extra_data_len; + } + + assert(max_size); + assert(level); + + pContext->pCompressor = (tdefl_compressor*)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor)); + if (!pContext->pCompressor) + { + return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); + } + + pContext->add_state.m_pZip = pZip; + pContext->add_state.m_cur_archive_file_ofs = pContext->cur_archive_file_ofs; + pContext->add_state.m_comp_size = 0; + + if (tdefl_init(pContext->pCompressor, mz_zip_writer_add_put_buf_callback, &pContext->add_state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pContext->pCompressor); + return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); + } + + return MZ_TRUE; +} + +mz_bool mz_zip_writer_add_staged_data(mz_zip_archive *pZip, mz_zip_writer_staged_context *pContext, const char *pRead_buf, size_t read_buf_size) +{ + if (pContext->file_ofs + read_buf_size > pContext->max_size) + { + mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); + pZip->m_pFree(pZip->m_pAlloc_opaque, pContext->pCompressor); + return MZ_FALSE; + } + + for (;;) { + tdefl_status status; + tdefl_flush flush = TDEFL_NO_FLUSH; + size_t n = read_buf_size; + if (n > MZ_ZIP_MAX_IO_BUF_SIZE) + n = MZ_ZIP_MAX_IO_BUF_SIZE; + + pContext->file_ofs += n; + pContext->uncomp_crc32 = (mz_uint32)mz_crc32(pContext->uncomp_crc32, (const mz_uint8 *)pRead_buf, n); + + if (pZip->m_pNeeds_keepalive != NULL && pZip->m_pNeeds_keepalive(pZip->m_pIO_opaque)) + flush = TDEFL_FULL_FLUSH; + + if (n == 0) + flush = TDEFL_FINISH; + + status = tdefl_compress_buffer(pContext->pCompressor, pRead_buf, n, flush); + if (status == TDEFL_STATUS_DONE || n < MZ_ZIP_MAX_IO_BUF_SIZE) + { + return MZ_TRUE; + } + else if (status != TDEFL_STATUS_OKAY) + { + mz_zip_set_error(pZip, MZ_ZIP_COMPRESSION_FAILED); + pZip->m_pFree(pZip->m_pAlloc_opaque, pContext->pCompressor); + return MZ_FALSE; + } + pRead_buf += n; + read_buf_size -= n; + } + return MZ_TRUE; +} + +mz_bool mz_zip_writer_add_staged_finish(mz_zip_archive *pZip, mz_zip_writer_staged_context *pContext) +{ + if (! mz_zip_writer_add_staged_data(pZip, pContext, NULL, 0)) + return MZ_FALSE; + + pZip->m_pFree(pZip->m_pAlloc_opaque, pContext->pCompressor); + + pContext->uncomp_size = pContext->file_ofs; + pContext->comp_size = pContext->add_state.m_comp_size; + pContext->cur_archive_file_ofs = pContext->add_state.m_cur_archive_file_ofs; + + { + mz_uint8 local_dir_footer[MZ_ZIP_DATA_DESCRIPTER_SIZE64]; + mz_uint32 local_dir_footer_size = MZ_ZIP_DATA_DESCRIPTER_SIZE32; + + MZ_WRITE_LE32(local_dir_footer + 0, MZ_ZIP_DATA_DESCRIPTOR_ID); + MZ_WRITE_LE32(local_dir_footer + 4, pContext->uncomp_crc32); + if (pContext->pExtra_data == NULL) + { + if (pContext->comp_size > MZ_UINT32_MAX) + return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); + + MZ_WRITE_LE32(local_dir_footer + 8, pContext->comp_size); + MZ_WRITE_LE32(local_dir_footer + 12, pContext->uncomp_size); + } + else + { + MZ_WRITE_LE64(local_dir_footer + 8, pContext->comp_size); + MZ_WRITE_LE64(local_dir_footer + 16, pContext->uncomp_size); + local_dir_footer_size = MZ_ZIP_DATA_DESCRIPTER_SIZE64; + } + + if (pZip->m_pWrite(pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, local_dir_footer, local_dir_footer_size) != local_dir_footer_size) + return MZ_FALSE; + + pContext->cur_archive_file_ofs += local_dir_footer_size; + } + + if (pContext->pExtra_data != NULL) + { + pContext->extra_size = mz_zip_writer_create_zip64_extra_data(pContext->extra_data, (pContext->uncomp_size >= MZ_UINT32_MAX) ? &pContext->uncomp_size : NULL, + (pContext->uncomp_size >= MZ_UINT32_MAX) ? &pContext->comp_size : NULL, (pContext->local_dir_header_ofs >= MZ_UINT32_MAX) ? &pContext->local_dir_header_ofs : NULL); + } + + if (!mz_zip_writer_add_to_central_dir(pZip, pContext->pArchive_name, (mz_uint16)pContext->archive_name_size, pContext->pExtra_data, (mz_uint16)pContext->extra_size, pContext->pComment, pContext->comment_size, + pContext->uncomp_size, pContext->comp_size, pContext->uncomp_crc32, pContext->method, pContext->gen_flags, pContext->dos_time, pContext->dos_date, pContext->local_dir_header_ofs, pContext->ext_attributes, + pContext->user_extra_data_central, pContext->user_extra_data_central_len)) + return MZ_FALSE; + + pZip->m_total_files++; + pZip->m_archive_size = pContext->cur_archive_file_ofs; + + return MZ_TRUE; +} + #ifndef MINIZ_NO_STDIO static size_t mz_file_read_func_stdio(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n) diff --git a/src/miniz/miniz.h b/src/miniz/miniz.h index 63e5267872c..cd647b9fabe 100644 --- a/src/miniz/miniz.h +++ b/src/miniz/miniz.h @@ -1297,6 +1297,58 @@ mz_bool mz_zip_writer_add_cfile(mz_zip_archive *pZip, const char *pArchive_name, const char *user_extra_data_central, mz_uint user_extra_data_central_len); #endif +#define MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE (sizeof(mz_uint16) * 2 + sizeof(mz_uint64) * 3) + +typedef struct +{ + mz_zip_archive* m_pZip; + mz_uint64 m_cur_archive_file_ofs; + mz_uint64 m_comp_size; +} mz_zip_writer_add_state; + +typedef struct mz_zip_writer_staged_context +{ + mz_uint16 gen_flags; + mz_uint uncomp_crc32; + mz_uint16 method; + mz_uint16 dos_time; + mz_uint16 dos_date; + mz_uint16 ext_attributes; + mz_uint64 local_dir_header_ofs; + mz_uint64 cur_archive_file_ofs; + size_t archive_name_size; + mz_uint64 uncomp_size; + mz_uint64 comp_size; + mz_uint64 max_size; + mz_uint8 *pExtra_data; + mz_uint32 extra_size; + mz_uint8 extra_data[MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE]; + + /* + * Compressor context + */ + mz_zip_writer_add_state add_state; + tdefl_compressor *pCompressor; + mz_uint64 file_ofs; + + /* + * The following data is passed to the "finish" stage, the referenced pointers must still be valid! + */ + const char* pArchive_name; + const void* pComment; + mz_uint16 comment_size; + const char* user_extra_data_central; + mz_uint user_extra_data_central_len; +} mz_zip_writer_staged_context; + +/* Adds a file to an archive piecewise. Minimum size of the raw data is 4 bytes. */ +/* Don't call mz_zip_writer_add_staged_finish() if mz_zip_writer_add_staged_open() or mz_zip_writer_add_staged_data() fails. */ +mz_bool mz_zip_writer_add_staged_open(mz_zip_archive* pZip, mz_zip_writer_staged_context* pContext, const char* pArchive_name, + mz_uint64 max_size, const MZ_TIME_T* pFile_time, const void* pComment, mz_uint16 comment_size, mz_uint level_and_flags, + const char* user_extra_data, mz_uint user_extra_data_len, const char* user_extra_data_central, mz_uint user_extra_data_central_len); +mz_bool mz_zip_writer_add_staged_data(mz_zip_archive* pZip, mz_zip_writer_staged_context* pContext, const char* pRead_buf, size_t n); +mz_bool mz_zip_writer_add_staged_finish(mz_zip_archive* pZip, mz_zip_writer_staged_context* pContext); + /* Adds a file to an archive by fully cloning the data from another archive. */ /* This function fully clones the source file's compressed data (no recompression), along with its full filename, extra data (it may add or modify the zip64 local header extra data field), and the optional descriptor following the compressed data. */ mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint src_file_index); From 55c698feeff9b204b01f698aac413679f4b913c2 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 26 Jan 2021 12:19:35 +0100 Subject: [PATCH 071/143] WIP: Exporting 3MFs through a streaming interface. --- src/libslic3r/Format/3mf.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index d021f0f6d2e..16fb18c17bc 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -2301,10 +2301,13 @@ namespace Slic3r { } stream << "\n"; + + mz_zip_writer_staged_context context; + std::string buf = stream.str(); - std::string out = stream.str(); - - if (!mz_zip_writer_add_mem(&archive, MODEL_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) + if (!mz_zip_writer_add_staged_open(&archive, &context, MODEL_FILE.c_str(), buf.size(), nullptr, nullptr, 0, MZ_DEFAULT_COMPRESSION, nullptr, 0, nullptr, 0) || + !mz_zip_writer_add_staged_data(&archive, &context, buf.data(), buf.size()) || + !mz_zip_writer_add_staged_finish(&archive, &context)) { add_error("Unable to add model file to archive"); return false; From e82c502a471f3dba85977d3343321dab27608b69 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 26 Jan 2021 14:17:48 +0100 Subject: [PATCH 072/143] miniz: Improved the streaming write interface. --- src/miniz/miniz.c | 36 +++++++++++++++++++++--------------- src/miniz/miniz.h | 6 ++++-- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/miniz/miniz.c b/src/miniz/miniz.c index 36be26b2802..03456d75925 100644 --- a/src/miniz/miniz.c +++ b/src/miniz/miniz.c @@ -6683,6 +6683,7 @@ mz_bool mz_zip_writer_add_staged_open(mz_zip_archive* pZip, mz_zip_writer_staged mz_zip_internal_state* pState; memset(pContext, 0, sizeof(mz_zip_writer_staged_context)); + pContext->pZip = pZip; pContext->gen_flags = MZ_ZIP_LDH_BIT_FLAG_HAS_LOCATOR; pContext->uncomp_crc32 = MZ_CRC32_INIT; pContext->method = MZ_DEFLATED; @@ -6774,7 +6775,7 @@ mz_bool mz_zip_writer_add_staged_open(mz_zip_archive* pZip, mz_zip_writer_staged if (pZip->m_file_offset_alignment) { - MZ_ASSERT((cur_archive_file_ofs & (pZip->m_file_offset_alignment - 1)) == 0); + MZ_ASSERT((pContext->cur_archive_file_ofs & (pZip->m_file_offset_alignment - 1)) == 0); } MZ_CLEAR_OBJ(local_dir_header); @@ -6857,12 +6858,13 @@ mz_bool mz_zip_writer_add_staged_open(mz_zip_archive* pZip, mz_zip_writer_staged return MZ_TRUE; } -mz_bool mz_zip_writer_add_staged_data(mz_zip_archive *pZip, mz_zip_writer_staged_context *pContext, const char *pRead_buf, size_t read_buf_size) +mz_bool mz_zip_writer_add_staged_data(mz_zip_writer_staged_context *pContext, const char *pRead_buf, size_t read_buf_size) { if (pContext->file_ofs + read_buf_size > pContext->max_size) { - mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); - pZip->m_pFree(pZip->m_pAlloc_opaque, pContext->pCompressor); + mz_zip_set_error(pContext->pZip, MZ_ZIP_FILE_READ_FAILED); + pContext->pZip->m_pFree(pContext->pZip->m_pAlloc_opaque, pContext->pCompressor); + pContext->pCompressor = NULL; return MZ_FALSE; } @@ -6876,7 +6878,7 @@ mz_bool mz_zip_writer_add_staged_data(mz_zip_archive *pZip, mz_zip_writer_staged pContext->file_ofs += n; pContext->uncomp_crc32 = (mz_uint32)mz_crc32(pContext->uncomp_crc32, (const mz_uint8 *)pRead_buf, n); - if (pZip->m_pNeeds_keepalive != NULL && pZip->m_pNeeds_keepalive(pZip->m_pIO_opaque)) + if (pContext->pZip->m_pNeeds_keepalive != NULL && pContext->pZip->m_pNeeds_keepalive(pContext->pZip->m_pIO_opaque)) flush = TDEFL_FULL_FLUSH; if (n == 0) @@ -6889,8 +6891,9 @@ mz_bool mz_zip_writer_add_staged_data(mz_zip_archive *pZip, mz_zip_writer_staged } else if (status != TDEFL_STATUS_OKAY) { - mz_zip_set_error(pZip, MZ_ZIP_COMPRESSION_FAILED); - pZip->m_pFree(pZip->m_pAlloc_opaque, pContext->pCompressor); + mz_zip_set_error(pContext->pZip, MZ_ZIP_COMPRESSION_FAILED); + pContext->pZip->m_pFree(pContext->pZip->m_pAlloc_opaque, pContext->pCompressor); + pContext->pCompressor = NULL; return MZ_FALSE; } pRead_buf += n; @@ -6899,12 +6902,15 @@ mz_bool mz_zip_writer_add_staged_data(mz_zip_archive *pZip, mz_zip_writer_staged return MZ_TRUE; } -mz_bool mz_zip_writer_add_staged_finish(mz_zip_archive *pZip, mz_zip_writer_staged_context *pContext) +mz_bool mz_zip_writer_add_staged_finish(mz_zip_writer_staged_context *pContext) { - if (! mz_zip_writer_add_staged_data(pZip, pContext, NULL, 0)) + if (! mz_zip_writer_add_staged_data(pContext, NULL, 0) || + // Either never opened, or already finished. + ! pContext->pCompressor) return MZ_FALSE; - pZip->m_pFree(pZip->m_pAlloc_opaque, pContext->pCompressor); + pContext->pZip->m_pFree(pContext->pZip->m_pAlloc_opaque, pContext->pCompressor); + pContext->pCompressor = NULL; pContext->uncomp_size = pContext->file_ofs; pContext->comp_size = pContext->add_state.m_comp_size; @@ -6919,7 +6925,7 @@ mz_bool mz_zip_writer_add_staged_finish(mz_zip_archive *pZip, mz_zip_writer_stag if (pContext->pExtra_data == NULL) { if (pContext->comp_size > MZ_UINT32_MAX) - return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); + return mz_zip_set_error(pContext->pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); MZ_WRITE_LE32(local_dir_footer + 8, pContext->comp_size); MZ_WRITE_LE32(local_dir_footer + 12, pContext->uncomp_size); @@ -6931,7 +6937,7 @@ mz_bool mz_zip_writer_add_staged_finish(mz_zip_archive *pZip, mz_zip_writer_stag local_dir_footer_size = MZ_ZIP_DATA_DESCRIPTER_SIZE64; } - if (pZip->m_pWrite(pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, local_dir_footer, local_dir_footer_size) != local_dir_footer_size) + if (pContext->pZip->m_pWrite(pContext->pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, local_dir_footer, local_dir_footer_size) != local_dir_footer_size) return MZ_FALSE; pContext->cur_archive_file_ofs += local_dir_footer_size; @@ -6943,13 +6949,13 @@ mz_bool mz_zip_writer_add_staged_finish(mz_zip_archive *pZip, mz_zip_writer_stag (pContext->uncomp_size >= MZ_UINT32_MAX) ? &pContext->comp_size : NULL, (pContext->local_dir_header_ofs >= MZ_UINT32_MAX) ? &pContext->local_dir_header_ofs : NULL); } - if (!mz_zip_writer_add_to_central_dir(pZip, pContext->pArchive_name, (mz_uint16)pContext->archive_name_size, pContext->pExtra_data, (mz_uint16)pContext->extra_size, pContext->pComment, pContext->comment_size, + if (!mz_zip_writer_add_to_central_dir(pContext->pZip, pContext->pArchive_name, (mz_uint16)pContext->archive_name_size, pContext->pExtra_data, (mz_uint16)pContext->extra_size, pContext->pComment, pContext->comment_size, pContext->uncomp_size, pContext->comp_size, pContext->uncomp_crc32, pContext->method, pContext->gen_flags, pContext->dos_time, pContext->dos_date, pContext->local_dir_header_ofs, pContext->ext_attributes, pContext->user_extra_data_central, pContext->user_extra_data_central_len)) return MZ_FALSE; - pZip->m_total_files++; - pZip->m_archive_size = pContext->cur_archive_file_ofs; + pContext->pZip->m_total_files++; + pContext->pZip->m_archive_size = pContext->cur_archive_file_ofs; return MZ_TRUE; } diff --git a/src/miniz/miniz.h b/src/miniz/miniz.h index cd647b9fabe..8fe0461adba 100644 --- a/src/miniz/miniz.h +++ b/src/miniz/miniz.h @@ -1308,6 +1308,8 @@ typedef struct typedef struct mz_zip_writer_staged_context { + mz_zip_archive *pZip; + mz_uint16 gen_flags; mz_uint uncomp_crc32; mz_uint16 method; @@ -1346,8 +1348,8 @@ typedef struct mz_zip_writer_staged_context mz_bool mz_zip_writer_add_staged_open(mz_zip_archive* pZip, mz_zip_writer_staged_context* pContext, const char* pArchive_name, mz_uint64 max_size, const MZ_TIME_T* pFile_time, const void* pComment, mz_uint16 comment_size, mz_uint level_and_flags, const char* user_extra_data, mz_uint user_extra_data_len, const char* user_extra_data_central, mz_uint user_extra_data_central_len); -mz_bool mz_zip_writer_add_staged_data(mz_zip_archive* pZip, mz_zip_writer_staged_context* pContext, const char* pRead_buf, size_t n); -mz_bool mz_zip_writer_add_staged_finish(mz_zip_archive* pZip, mz_zip_writer_staged_context* pContext); +mz_bool mz_zip_writer_add_staged_data(mz_zip_writer_staged_context* pContext, const char* pRead_buf, size_t n); +mz_bool mz_zip_writer_add_staged_finish(mz_zip_writer_staged_context* pContext); /* Adds a file to an archive by fully cloning the data from another archive. */ /* This function fully clones the source file's compressed data (no recompression), along with its full filename, extra data (it may add or modify the zip64 local header extra data field), and the optional descriptor following the compressed data. */ From ef424ad10125a85a07bf239b36153fbcac7d6221 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 26 Jan 2021 14:54:39 +0100 Subject: [PATCH 073/143] miniz: mz_zip_writer_add_staged_data() writes in a single shot --- src/miniz/miniz.c | 46 ++++++++++++++++------------------------------ 1 file changed, 16 insertions(+), 30 deletions(-) diff --git a/src/miniz/miniz.c b/src/miniz/miniz.c index 03456d75925..08126f441a5 100644 --- a/src/miniz/miniz.c +++ b/src/miniz/miniz.c @@ -6858,9 +6858,11 @@ mz_bool mz_zip_writer_add_staged_open(mz_zip_archive* pZip, mz_zip_writer_staged return MZ_TRUE; } -mz_bool mz_zip_writer_add_staged_data(mz_zip_writer_staged_context *pContext, const char *pRead_buf, size_t read_buf_size) +mz_bool mz_zip_writer_add_staged_data(mz_zip_writer_staged_context *pContext, const char *pRead_buf, size_t n) { - if (pContext->file_ofs + read_buf_size > pContext->max_size) + tdefl_flush flush = TDEFL_NO_FLUSH; + + if (pContext->file_ofs + n > pContext->max_size) { mz_zip_set_error(pContext->pZip, MZ_ZIP_FILE_READ_FAILED); pContext->pZip->m_pFree(pContext->pZip->m_pAlloc_opaque, pContext->pCompressor); @@ -6868,38 +6870,22 @@ mz_bool mz_zip_writer_add_staged_data(mz_zip_writer_staged_context *pContext, co return MZ_FALSE; } - for (;;) { - tdefl_status status; - tdefl_flush flush = TDEFL_NO_FLUSH; - size_t n = read_buf_size; - if (n > MZ_ZIP_MAX_IO_BUF_SIZE) - n = MZ_ZIP_MAX_IO_BUF_SIZE; - - pContext->file_ofs += n; - pContext->uncomp_crc32 = (mz_uint32)mz_crc32(pContext->uncomp_crc32, (const mz_uint8 *)pRead_buf, n); + pContext->file_ofs += n; + pContext->uncomp_crc32 = (mz_uint32)mz_crc32(pContext->uncomp_crc32, (const mz_uint8 *)pRead_buf, n); - if (pContext->pZip->m_pNeeds_keepalive != NULL && pContext->pZip->m_pNeeds_keepalive(pContext->pZip->m_pIO_opaque)) - flush = TDEFL_FULL_FLUSH; + if (pContext->pZip->m_pNeeds_keepalive != NULL && pContext->pZip->m_pNeeds_keepalive(pContext->pZip->m_pIO_opaque)) + flush = TDEFL_FULL_FLUSH; - if (n == 0) - flush = TDEFL_FINISH; - - status = tdefl_compress_buffer(pContext->pCompressor, pRead_buf, n, flush); - if (status == TDEFL_STATUS_DONE || n < MZ_ZIP_MAX_IO_BUF_SIZE) - { + { + tdefl_status status = tdefl_compress_buffer(pContext->pCompressor, pRead_buf, n, (n == 0) ? TDEFL_FINISH : flush); + if (status == TDEFL_STATUS_DONE || status == TDEFL_STATUS_OKAY) return MZ_TRUE; - } - else if (status != TDEFL_STATUS_OKAY) - { - mz_zip_set_error(pContext->pZip, MZ_ZIP_COMPRESSION_FAILED); - pContext->pZip->m_pFree(pContext->pZip->m_pAlloc_opaque, pContext->pCompressor); - pContext->pCompressor = NULL; - return MZ_FALSE; - } - pRead_buf += n; - read_buf_size -= n; } - return MZ_TRUE; + + mz_zip_set_error(pContext->pZip, MZ_ZIP_COMPRESSION_FAILED); + pContext->pZip->m_pFree(pContext->pZip->m_pAlloc_opaque, pContext->pCompressor); + pContext->pCompressor = NULL; + return MZ_FALSE; } mz_bool mz_zip_writer_add_staged_finish(mz_zip_writer_staged_context *pContext) From 7a6c0384802b8f368048b36bba3e09b72ab9055f Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 26 Jan 2021 14:55:58 +0100 Subject: [PATCH 074/143] Refactoring of 3MF file export to use the new homebrewed miniz streaming interface. This shall fix high memory consumption and crashes when exporting extremely large 3MF files. --- src/libslic3r/Format/3mf.cpp | 145 ++++++++++++++++++++++++----------- src/miniz/README-Prusa.txt | 2 + 2 files changed, 102 insertions(+), 45 deletions(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 16fb18c17bc..70b9d5e1be6 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -2029,8 +2029,8 @@ namespace Slic3r { bool _add_thumbnail_file_to_archive(mz_zip_archive& archive, const ThumbnailData& thumbnail_data); bool _add_relationships_file_to_archive(mz_zip_archive& archive); bool _add_model_file_to_archive(const std::string& filename, mz_zip_archive& archive, const Model& model, IdToObjectDataMap& objects_data); - bool _add_object_to_model_stream(std::stringstream& stream, unsigned int& object_id, ModelObject& object, BuildItemsList& build_items, VolumeToOffsetsMap& volumes_offsets); - bool _add_mesh_to_object_stream(std::stringstream& stream, ModelObject& object, VolumeToOffsetsMap& volumes_offsets); + bool _add_object_to_model_stream(mz_zip_writer_staged_context &context, unsigned int& object_id, ModelObject& object, BuildItemsList& build_items, VolumeToOffsetsMap& volumes_offsets); + bool _add_mesh_to_object_stream(mz_zip_writer_staged_context &context, std::stringstream& stream, ModelObject& object, VolumeToOffsetsMap& volumes_offsets); bool _add_build_to_model_stream(std::stringstream& stream, const BuildItemsList& build_items); bool _add_layer_height_profile_file_to_archive(mz_zip_archive& archive, Model& model); bool _add_layer_config_ranges_file_to_archive(mz_zip_archive& archive, Model& model); @@ -2240,31 +2240,55 @@ namespace Slic3r { return true; } - bool _3MF_Exporter::_add_model_file_to_archive(const std::string& filename, mz_zip_archive& archive, const Model& model, IdToObjectDataMap& objects_data) + static void reset_stream(std::stringstream &stream) { - std::stringstream stream; + stream.str(""); + stream.clear(); // https://en.cppreference.com/w/cpp/types/numeric_limits/max_digits10 // Conversion of a floating-point value to text and back is exact as long as at least max_digits10 were used (9 for float, 17 for double). // It is guaranteed to produce the same floating-point value, even though the intermediate text representation is not exact. // The default value of std::stream precision is 6 digits only! - stream << std::setprecision(std::numeric_limits::max_digits10); - stream << "\n"; - stream << "<" << MODEL_TAG << " unit=\"millimeter\" xml:lang=\"en-US\" xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\" xmlns:slic3rpe=\"http://schemas.slic3r.org/3mf/2017/06\">\n"; - stream << " <" << METADATA_TAG << " name=\"" << SLIC3RPE_3MF_VERSION << "\">" << VERSION_3MF << "\n"; - std::string name = xml_escape(boost::filesystem::path(filename).stem().string()); - stream << " <" << METADATA_TAG << " name=\"Title\">" << name << "\n"; - stream << " <" << METADATA_TAG << " name=\"Designer\">" << "\n"; - stream << " <" << METADATA_TAG << " name=\"Description\">" << name << "\n"; - stream << " <" << METADATA_TAG << " name=\"Copyright\">" << "\n"; - stream << " <" << METADATA_TAG << " name=\"LicenseTerms\">" << "\n"; - stream << " <" << METADATA_TAG << " name=\"Rating\">" << "\n"; - std::string date = Slic3r::Utils::utc_timestamp(Slic3r::Utils::get_current_time_utc()); - // keep only the date part of the string - date = date.substr(0, 10); - stream << " <" << METADATA_TAG << " name=\"CreationDate\">" << date << "\n"; - stream << " <" << METADATA_TAG << " name=\"ModificationDate\">" << date << "\n"; - stream << " <" << METADATA_TAG << " name=\"Application\">" << SLIC3R_APP_KEY << "-" << SLIC3R_VERSION << "\n"; - stream << " <" << RESOURCES_TAG << ">\n"; + stream << std::setprecision(std::numeric_limits::max_digits10); + } + + bool _3MF_Exporter::_add_model_file_to_archive(const std::string& filename, mz_zip_archive& archive, const Model& model, IdToObjectDataMap& objects_data) + { + mz_zip_writer_staged_context context; + if (!mz_zip_writer_add_staged_open(&archive, &context, MODEL_FILE.c_str(), + // Maximum expected and allowed 3MF file size is 16GiB. + // This switches the ZIP file to a 64bit mode, which adds a tiny bit of overhead to file records. + (uint64_t(1) << 30) * 16, + nullptr, nullptr, 0, MZ_DEFAULT_COMPRESSION, nullptr, 0, nullptr, 0)) { + add_error("Unable to add model file to archive"); + return false; + } + + { + std::stringstream stream; + reset_stream(stream); + stream << "\n"; + stream << "<" << MODEL_TAG << " unit=\"millimeter\" xml:lang=\"en-US\" xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\" xmlns:slic3rpe=\"http://schemas.slic3r.org/3mf/2017/06\">\n"; + stream << " <" << METADATA_TAG << " name=\"" << SLIC3RPE_3MF_VERSION << "\">" << VERSION_3MF << "\n"; + std::string name = xml_escape(boost::filesystem::path(filename).stem().string()); + stream << " <" << METADATA_TAG << " name=\"Title\">" << name << "\n"; + stream << " <" << METADATA_TAG << " name=\"Designer\">" << "\n"; + stream << " <" << METADATA_TAG << " name=\"Description\">" << name << "\n"; + stream << " <" << METADATA_TAG << " name=\"Copyright\">" << "\n"; + stream << " <" << METADATA_TAG << " name=\"LicenseTerms\">" << "\n"; + stream << " <" << METADATA_TAG << " name=\"Rating\">" << "\n"; + std::string date = Slic3r::Utils::utc_timestamp(Slic3r::Utils::get_current_time_utc()); + // keep only the date part of the string + date = date.substr(0, 10); + stream << " <" << METADATA_TAG << " name=\"CreationDate\">" << date << "\n"; + stream << " <" << METADATA_TAG << " name=\"ModificationDate\">" << date << "\n"; + stream << " <" << METADATA_TAG << " name=\"Application\">" << SLIC3R_APP_KEY << "-" << SLIC3R_VERSION << "\n"; + stream << " <" << RESOURCES_TAG << ">\n"; + std::string buf = stream.str(); + if (! buf.empty() && ! mz_zip_writer_add_staged_data(&context, buf.data(), buf.size())) { + add_error("Unable to add model file to archive"); + return false; + } + } // Instance transformations, indexed by the 3MF object ID (which is a linear serialization of all instances of all ModelObjects). BuildItemsList build_items; @@ -2284,40 +2308,46 @@ namespace Slic3r { // Store geometry of all ModelVolumes contained in a single ModelObject into a single 3MF indexed triangle set object. // object_it->second.volumes_offsets will contain the offsets of the ModelVolumes in that single indexed triangle set. // object_id will be increased to point to the 1st instance of the next ModelObject. - if (!_add_object_to_model_stream(stream, object_id, *obj, build_items, object_it->second.volumes_offsets)) + if (!_add_object_to_model_stream(context, object_id, *obj, build_items, object_it->second.volumes_offsets)) { add_error("Unable to add object to archive"); + mz_zip_writer_add_staged_finish(&context); return false; } } - stream << " \n"; - - // Store the transformations of all the ModelInstances of all ModelObjects, indexed in a linear fashion. - if (!_add_build_to_model_stream(stream, build_items)) { - add_error("Unable to add build to archive"); - return false; - } + std::stringstream stream; + reset_stream(stream); + stream << " \n"; - stream << "\n"; - - mz_zip_writer_staged_context context; - std::string buf = stream.str(); + // Store the transformations of all the ModelInstances of all ModelObjects, indexed in a linear fashion. + if (!_add_build_to_model_stream(stream, build_items)) + { + add_error("Unable to add build to archive"); + mz_zip_writer_add_staged_finish(&context); + return false; + } - if (!mz_zip_writer_add_staged_open(&archive, &context, MODEL_FILE.c_str(), buf.size(), nullptr, nullptr, 0, MZ_DEFAULT_COMPRESSION, nullptr, 0, nullptr, 0) || - !mz_zip_writer_add_staged_data(&archive, &context, buf.data(), buf.size()) || - !mz_zip_writer_add_staged_finish(&archive, &context)) - { - add_error("Unable to add model file to archive"); - return false; + stream << "\n"; + + std::string buf = stream.str(); + + if ((! buf.empty() && ! mz_zip_writer_add_staged_data(&context, buf.data(), buf.size())) || + ! mz_zip_writer_add_staged_finish(&context)) + { + add_error("Unable to add model file to archive"); + return false; + } } return true; } - bool _3MF_Exporter::_add_object_to_model_stream(std::stringstream& stream, unsigned int& object_id, ModelObject& object, BuildItemsList& build_items, VolumeToOffsetsMap& volumes_offsets) + bool _3MF_Exporter::_add_object_to_model_stream(mz_zip_writer_staged_context &context, unsigned int& object_id, ModelObject& object, BuildItemsList& build_items, VolumeToOffsetsMap& volumes_offsets) { + std::stringstream stream; + reset_stream(stream); unsigned int id = 0; for (const ModelInstance* instance : object.instances) { @@ -2330,7 +2360,7 @@ namespace Slic3r { if (id == 0) { - if (!_add_mesh_to_object_stream(stream, object, volumes_offsets)) + if (!_add_mesh_to_object_stream(context, stream, object, volumes_offsets)) { add_error("Unable to add mesh to archive"); return false; @@ -2354,14 +2384,32 @@ namespace Slic3r { } object_id += id; - return true; + std::string buf = stream.str(); + return buf.empty() || mz_zip_writer_add_staged_data(&context, buf.data(), buf.size()); } - bool _3MF_Exporter::_add_mesh_to_object_stream(std::stringstream& stream, ModelObject& object, VolumeToOffsetsMap& volumes_offsets) + bool _3MF_Exporter::_add_mesh_to_object_stream(mz_zip_writer_staged_context &context, std::stringstream& stream, ModelObject& object, VolumeToOffsetsMap& volumes_offsets) { stream << " <" << MESH_TAG << ">\n"; stream << " <" << VERTICES_TAG << ">\n"; + // Flush at the rate of 6400 lines per miniz invocation, + // that corresponds to roughly 5x 64kB blocks. + size_t lines = 6400; + auto flush = [this, &lines, &context, &stream]() { + if (lines == 0) { + lines = 6400; + std::string buf = stream.str(); + reset_stream(stream); + if (! buf.empty() && ! mz_zip_writer_add_staged_data(&context, buf.data(), buf.size())) { + add_error("Error during writing or compression"); + return false; + } + } else + -- lines; + return true; + }; + unsigned int vertices_count = 0; for (ModelVolume* volume : object.volumes) { @@ -2393,6 +2441,8 @@ namespace Slic3r { stream << "x=\"" << v(0) << "\" "; stream << "y=\"" << v(1) << "\" "; stream << "z=\"" << v(2) << "\" />\n"; + if (! flush()) + return false; } } @@ -2432,13 +2482,18 @@ namespace Slic3r { stream << CUSTOM_SEAM_ATTR << "=\"" << custom_seam_data_string << "\" "; stream << "/>\n"; + + if (! flush()) + return false; } } stream << " \n"; stream << " \n"; - return true; + // Force flush. + lines = 0; + return flush(); } bool _3MF_Exporter::_add_build_to_model_stream(std::stringstream& stream, const BuildItemsList& build_items) diff --git a/src/miniz/README-Prusa.txt b/src/miniz/README-Prusa.txt index 494227c6ba5..83b72cda3a4 100644 --- a/src/miniz/README-Prusa.txt +++ b/src/miniz/README-Prusa.txt @@ -2,6 +2,8 @@ This library is based on miniz 2.1.0 - amalgamated version. ---------------------------------------------------------------- +PrusaResearch (Vojtech) homebrewed the following: + mz_zip_writer_add_staged_open(), mz_zip_writer_add_staged_data() and mz_zip_writer_add_staged_finish() were derived from mz_zip_writer_add_read_buf_callback() by splitting it and passing a new mz_zip_writer_staged_context between them. From 05f9910c8fb94fd64ec4fb0b3bd8f9296891ac5c Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Wed, 27 Jan 2021 09:35:39 +0100 Subject: [PATCH 075/143] Fixes after merge. --- src/libslic3r/Format/3mf.cpp | 155 +++++++++++++++++++++++++++-------- 1 file changed, 120 insertions(+), 35 deletions(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 70b9d5e1be6..200e6a4904f 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -31,6 +32,12 @@ namespace pt = boost::property_tree; #include #include "miniz_extension.hpp" +// Slightly faster than sprintf("%.9g"), but there is an issue with the karma floating point formatter, +// https://github.com/boostorg/spirit/pull/586 +// where the exported string is one digit shorter than it should be to guarantee lossless round trip. +// The code is left here for the ocasion boost guys improve. +#define EXPORT_3MF_USE_SPIRIT_KARMA_FP 0 + // VERSION NUMBERS // 0 : .3mf, files saved by older slic3r or other applications. No version definition in them. // 1 : Introduction of 3mf versioning. No other change in data saved into 3mf files. @@ -2030,7 +2037,7 @@ namespace Slic3r { bool _add_relationships_file_to_archive(mz_zip_archive& archive); bool _add_model_file_to_archive(const std::string& filename, mz_zip_archive& archive, const Model& model, IdToObjectDataMap& objects_data); bool _add_object_to_model_stream(mz_zip_writer_staged_context &context, unsigned int& object_id, ModelObject& object, BuildItemsList& build_items, VolumeToOffsetsMap& volumes_offsets); - bool _add_mesh_to_object_stream(mz_zip_writer_staged_context &context, std::stringstream& stream, ModelObject& object, VolumeToOffsetsMap& volumes_offsets); + bool _add_mesh_to_object_stream(mz_zip_writer_staged_context &context, ModelObject& object, VolumeToOffsetsMap& volumes_offsets); bool _add_build_to_model_stream(std::stringstream& stream, const BuildItemsList& build_items); bool _add_layer_height_profile_file_to_archive(mz_zip_archive& archive, Model& model); bool _add_layer_config_ranges_file_to_archive(mz_zip_archive& archive, Model& model); @@ -2360,7 +2367,10 @@ namespace Slic3r { if (id == 0) { - if (!_add_mesh_to_object_stream(context, stream, object, volumes_offsets)) + std::string buf = stream.str(); + reset_stream(stream); + if ((! buf.empty() && ! mz_zip_writer_add_staged_data(&context, buf.data(), buf.size())) || + ! _add_mesh_to_object_stream(context, object, volumes_offsets)) { add_error("Unable to add mesh to archive"); return false; @@ -2388,28 +2398,76 @@ namespace Slic3r { return buf.empty() || mz_zip_writer_add_staged_data(&context, buf.data(), buf.size()); } - bool _3MF_Exporter::_add_mesh_to_object_stream(mz_zip_writer_staged_context &context, std::stringstream& stream, ModelObject& object, VolumeToOffsetsMap& volumes_offsets) +#if EXPORT_3MF_USE_SPIRIT_KARMA_FP + template + struct coordinate_policy_fixed : boost::spirit::karma::real_policies { - stream << " <" << MESH_TAG << ">\n"; - stream << " <" << VERTICES_TAG << ">\n"; - - // Flush at the rate of 6400 lines per miniz invocation, - // that corresponds to roughly 5x 64kB blocks. - size_t lines = 6400; - auto flush = [this, &lines, &context, &stream]() { - if (lines == 0) { - lines = 6400; - std::string buf = stream.str(); - reset_stream(stream); - if (! buf.empty() && ! mz_zip_writer_add_staged_data(&context, buf.data(), buf.size())) { + static int floatfield(Num n) { return fmtflags::fixed; } + // Number of decimal digits to maintain float accuracy when storing into a text file and parsing back. + static unsigned precision(Num /* n */) { return std::numeric_limits::max_digits10 + 1; } + // No trailing zeros, thus for fmtflags::fixed usually much less than max_digits10 decimal numbers will be produced. + static bool trailing_zeros(Num /* n */) { return false; } + }; + template + struct coordinate_policy_scientific : coordinate_policy_fixed + { + static int floatfield(Num n) { return fmtflags::scientific; } + }; + // Define a new generator type based on the new coordinate policy. + using coordinate_type_fixed = boost::spirit::karma::real_generator>; + using coordinate_type_scientific = boost::spirit::karma::real_generator>; +#endif // EXPORT_3MF_USE_SPIRIT_KARMA_FP + + bool _3MF_Exporter::_add_mesh_to_object_stream(mz_zip_writer_staged_context &context, ModelObject& object, VolumeToOffsetsMap& volumes_offsets) + { + std::string output_buffer; + output_buffer += " <"; + output_buffer += MESH_TAG; + output_buffer += ">\n <"; + output_buffer += VERTICES_TAG; + output_buffer += ">\n"; + + auto flush = [this, &output_buffer, &context](bool force = false) { + if ((force && ! output_buffer.empty()) || output_buffer.size() >= 65536 * 16) { + if (! mz_zip_writer_add_staged_data(&context, output_buffer.data(), output_buffer.size())) { add_error("Error during writing or compression"); return false; } - } else - -- lines; + output_buffer.clear(); + } return true; }; + auto format_coordinate = [](float f, char *buf) -> char* { +#if EXPORT_3MF_USE_SPIRIT_KARMA_FP + // Slightly faster than sprintf("%.9g"), but there is an issue with the karma floating point formatter, + // https://github.com/boostorg/spirit/pull/586 + // where the exported string is one digit shorter than it should be to guarantee lossless round trip. + // The code is left here for the ocasion boost guys improve. + coordinate_type_fixed const coordinate_fixed = coordinate_type_fixed(); + coordinate_type_scientific const coordinate_scientific = coordinate_type_scientific(); + // Format "f" in a fixed format. + char *ptr = buf; + boost::spirit::karma::generate(ptr, coordinate_fixed, f); + // Format "f" in a scientific format. + char *ptr2 = ptr; + boost::spirit::karma::generate(ptr2, coordinate_scientific, f); + // Return end of the shorter string. + auto len2 = ptr2 - ptr; + if (ptr - buf > len2) { + // Move the shorter scientific form to the front. + memcpy(buf, ptr, len2); + ptr = buf + len2; + } + // Return pointer to the end. + return ptr; +#else + // Round-trippable float, shortest possible. + return buf + sprintf(buf, "%.9g", f); +#endif + }; + + char buf[256]; unsigned int vertices_count = 0; for (ModelVolume* volume : object.volumes) { @@ -2436,18 +2494,27 @@ namespace Slic3r { for (size_t i = 0; i < its.vertices.size(); ++i) { - stream << " <" << VERTEX_TAG << " "; Vec3f v = (matrix * its.vertices[i].cast()).cast(); - stream << "x=\"" << v(0) << "\" "; - stream << "y=\"" << v(1) << "\" "; - stream << "z=\"" << v(2) << "\" />\n"; + char *ptr = buf; + boost::spirit::karma::generate(ptr, boost::spirit::lit(" <") << VERTEX_TAG << " x=\""); + ptr = format_coordinate(v.x(), ptr); + boost::spirit::karma::generate(ptr, "\" y=\""); + ptr = format_coordinate(v.y(), ptr); + boost::spirit::karma::generate(ptr, "\" z=\""); + ptr = format_coordinate(v.z(), ptr); + boost::spirit::karma::generate(ptr, "\" />\n"); + *ptr = '\0'; + output_buffer += buf; if (! flush()) return false; } } - stream << " \n"; - stream << " <" << TRIANGLES_TAG << ">\n"; + output_buffer += " \n <"; + output_buffer += TRIANGLES_TAG; + output_buffer += ">\n"; unsigned int triangles_count = 0; for (ModelVolume* volume : object.volumes) @@ -2467,33 +2534,51 @@ namespace Slic3r { for (int i = 0; i < int(its.indices.size()); ++ i) { - stream << " <" << TRIANGLE_TAG << " "; - for (int j = 0; j < 3; ++j) { - stream << "v" << j + 1 << "=\"" << its.indices[i][j] + volume_it->second.first_vertex_id << "\" "; + const Vec3i &idx = its.indices[i]; + char *ptr = buf; + boost::spirit::karma::generate(ptr, boost::spirit::lit(" <") << TRIANGLE_TAG << + " v1=\"" << boost::spirit::int_ << + "\" v2=\"" << boost::spirit::int_ << + "\" v3=\"" << boost::spirit::int_ << "\" ", + idx[0] + volume_it->second.first_vertex_id, + idx[1] + volume_it->second.first_vertex_id, + idx[2] + volume_it->second.first_vertex_id); + *ptr = '\0'; + output_buffer += buf; } std::string custom_supports_data_string = volume->supported_facets.get_triangle_as_string(i); - if (! custom_supports_data_string.empty()) - stream << CUSTOM_SUPPORTS_ATTR << "=\"" << custom_supports_data_string << "\" "; + if (! custom_supports_data_string.empty()) { + output_buffer += CUSTOM_SUPPORTS_ATTR; + output_buffer += "=\""; + output_buffer += custom_supports_data_string; + output_buffer += "\" "; + } std::string custom_seam_data_string = volume->seam_facets.get_triangle_as_string(i); - if (! custom_seam_data_string.empty()) - stream << CUSTOM_SEAM_ATTR << "=\"" << custom_seam_data_string << "\" "; + if (! custom_seam_data_string.empty()) { + output_buffer += CUSTOM_SEAM_ATTR; + output_buffer += "=\""; + output_buffer += custom_seam_data_string; + output_buffer += "\" "; + } - stream << "/>\n"; + output_buffer += "/>\n"; if (! flush()) return false; } } - stream << " \n"; - stream << " \n"; + output_buffer += " \n \n"; // Force flush. - lines = 0; - return flush(); + return flush(true); } bool _3MF_Exporter::_add_build_to_model_stream(std::stringstream& stream, const BuildItemsList& build_items) From dcec1fa74969341230cf11c38ed2b5e356678790 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Wed, 27 Jan 2021 09:36:39 +0100 Subject: [PATCH 076/143] Commented out fuzzy_skin_shape for now, the parameter may be used in the future, but for now we don't want the parameter to be stored into configuration files. --- src/libslic3r/PerimeterGenerator.cpp | 12 ++++++++---- src/libslic3r/PrintConfig.cpp | 2 ++ src/libslic3r/PrintConfig.hpp | 8 ++++++-- src/slic3r/GUI/Field.cpp | 4 ++-- src/slic3r/GUI/GUI.cpp | 4 ++-- src/slic3r/GUI/OptionsGroup.cpp | 6 +++--- 6 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index ff9e439ba8b..a29f293ce5e 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -231,13 +231,15 @@ static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perime return out; } +/* enum class FuzzyShape { Triangle, Sawtooth, Random }; +*/ -static void fuzzy_polygon(Polygon &poly, FuzzyShape shape, double fuzzy_skin_thickness, double fuzzy_skin_point_dist) +static void fuzzy_polygon(Polygon &poly, /* FuzzyShape shape, */ double fuzzy_skin_thickness, double fuzzy_skin_point_dist) { #if 0 Point last = poly.points.at(poly.points.size() - 1); @@ -396,8 +398,9 @@ void PerimeterGenerator::process() // fuzzy skin configuration double fuzzy_skin_thickness; double fuzzy_skin_point_dist; - FuzzyShape fuzzy_skin_shape; + //FuzzyShape fuzzy_skin_shape; if (this->object_config->fuzzy_skin_perimeter_mode != FuzzySkinPerimeterMode::None) { + /* switch (this->object_config->fuzzy_skin_shape) { case FuzzySkinShape::Triangle1: case FuzzySkinShape::Triangle2: @@ -415,6 +418,7 @@ void PerimeterGenerator::process() fuzzy_skin_shape = FuzzyShape::Random; break; } + */ fuzzy_skin_thickness = scale_(this->object_config->fuzzy_skin_thickness); fuzzy_skin_point_dist = scale_(this->object_config->fuzzy_skin_point_dist); } @@ -514,12 +518,12 @@ void PerimeterGenerator::process() this->object_config->fuzzy_skin_perimeter_mode == FuzzySkinPerimeterMode::ExternalSkipFirst ) { ExPolygon expolygon_fuzzy(expolygon); - fuzzy_polygon(expolygon_fuzzy.contour, fuzzy_skin_shape, fuzzy_skin_thickness, fuzzy_skin_point_dist); + fuzzy_polygon(expolygon_fuzzy.contour, /* fuzzy_skin_shape, */ fuzzy_skin_thickness, fuzzy_skin_point_dist); // compensate for the depth of intersection. contours[i].emplace_back(PerimeterGeneratorLoop(expolygon_fuzzy.contour, i, true)); skip_polygon = true; } else - fuzzy_polygon(expolygon.contour, fuzzy_skin_shape, fuzzy_skin_thickness, fuzzy_skin_point_dist); + fuzzy_polygon(expolygon.contour, /* fuzzy_skin_shape, */ fuzzy_skin_thickness, fuzzy_skin_point_dist); } } diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 9247e69da31..064b00b4c96 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1029,6 +1029,7 @@ void PrintConfigDef::init_fff_params() def->category = L("Fuzzy Skin"); def->tooltip = L("Fuzzy skin shape."); +/* def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("triangle1"); def->enum_values.push_back("triangle2"); @@ -1050,6 +1051,7 @@ void PrintConfigDef::init_fff_params() def->enum_labels.push_back(L("Random (3)")); def->mode = comSimple; def->set_default_value(new ConfigOptionEnum(FuzzySkinShape::Triangle1)); +*/ def = this->add("fuzzy_skin_thickness", coFloat); def->label = L("Fuzzy skin thickness"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 40929c34b0f..e2f71a9415a 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -50,6 +50,7 @@ enum class FuzzySkinPerimeterMode { All }; +/* enum class FuzzySkinShape { Triangle1, Triangle2, @@ -61,6 +62,7 @@ enum class FuzzySkinShape { Random2, Random3 }; +*/ enum InfillPattern : int { ipRectilinear, ipMonotonic, ipAlignedRectilinear, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb, @@ -170,6 +172,7 @@ template<> inline const t_config_enum_values& ConfigOptionEnum inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { static t_config_enum_values keys_map; if (keys_map.empty()) { @@ -185,6 +188,7 @@ template<> inline const t_config_enum_values& ConfigOptionEnum:: } return keys_map; } +*/ template<> inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { static t_config_enum_values keys_map; @@ -479,7 +483,7 @@ class PrintObjectConfig : public StaticPrintConfig ConfigOptionFloatOrPercent extrusion_width; ConfigOptionFloatOrPercent first_layer_height; ConfigOptionEnum fuzzy_skin_perimeter_mode; - ConfigOptionEnum fuzzy_skin_shape; +// ConfigOptionEnum fuzzy_skin_shape; ConfigOptionFloat fuzzy_skin_thickness; ConfigOptionFloat fuzzy_skin_point_dist; ConfigOptionBool infill_only_where_needed; @@ -528,7 +532,7 @@ class PrintObjectConfig : public StaticPrintConfig OPT_PTR(extrusion_width); OPT_PTR(first_layer_height); OPT_PTR(fuzzy_skin_perimeter_mode); - OPT_PTR(fuzzy_skin_shape); +// OPT_PTR(fuzzy_skin_shape); OPT_PTR(fuzzy_skin_thickness); OPT_PTR(fuzzy_skin_point_dist); OPT_PTR(infill_only_where_needed); diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index 93e259e6a2f..dfe95e71e6a 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -1202,8 +1202,8 @@ boost::any& Choice::get_value() m_value = static_cast(ret_enum); else if (m_opt_id.compare("fuzzy_skin_perimeter_mode") == 0) m_value = static_cast(ret_enum); - else if (m_opt_id.compare("fuzzy_skin_shape") == 0) - m_value = static_cast(ret_enum); +// else if (m_opt_id.compare("fuzzy_skin_shape") == 0) +// m_value = static_cast(ret_enum); else if (m_opt_id.compare("gcode_flavor") == 0) m_value = static_cast(ret_enum); else if (m_opt_id.compare("machine_limits_usage") == 0) diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index 6b664c0edb8..b0322a82130 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -184,8 +184,8 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if (opt_key.compare("fuzzy_skin_perimeter_mode") == 0) config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); - else if (opt_key.compare("fuzzy_skin_shape") == 0) - config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); +// else if (opt_key.compare("fuzzy_skin_shape") == 0) +// config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if (opt_key.compare("gcode_flavor") == 0) config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if (opt_key.compare("machine_limits_usage") == 0) diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index ced780adb60..5f93916455c 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -873,9 +873,9 @@ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config else if (opt_key == "fuzzy_skin_perimeter_mode") { ret = static_cast(config.option>(opt_key)->value); } - else if (opt_key == "fuzzy_skin_shape") { - ret = static_cast(config.option>(opt_key)->value); - } +// else if (opt_key == "fuzzy_skin_shape") { +// ret = static_cast(config.option>(opt_key)->value); +// } else if (opt_key == "gcode_flavor") { ret = static_cast(config.option>(opt_key)->value); } From 4f161607c703a1863f79e783f6dc329d824583a0 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Wed, 27 Jan 2021 09:58:42 +0100 Subject: [PATCH 077/143] Follow-up on dcec1fa74: Commented out fuzzy_skin_shape for now, the parameter may be used in the future, but for now we don't want the parameter to be stored into configuration files. --- src/libslic3r/Preset.cpp | 2 +- src/libslic3r/PrintConfig.cpp | 2 +- src/libslic3r/PrintObject.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index f75f653ef31..751b2a2a6d3 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -411,7 +411,7 @@ const std::vector& Preset::print_options() "solid_infill_below_area", "only_retract_when_crossing_perimeters", "infill_first", "ironing", "ironing_type", "ironing_flowrate", "ironing_speed", "ironing_spacing", "max_print_speed", "max_volumetric_speed", "avoid_crossing_perimeters_max_detour", - "fuzzy_skin_perimeter_mode", "fuzzy_skin_shape", "fuzzy_skin_thickness", "fuzzy_skin_point_dist", + "fuzzy_skin_perimeter_mode", /* "fuzzy_skin_shape", */ "fuzzy_skin_thickness", "fuzzy_skin_point_dist", #ifdef HAS_PRESSURE_EQUALIZER "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative", #endif /* HAS_PRESSURE_EQUALIZER */ diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 064b00b4c96..587c22cc6e4 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1024,12 +1024,12 @@ void PrintConfigDef::init_fff_params() def->mode = comSimple; def->set_default_value(new ConfigOptionEnum(FuzzySkinPerimeterMode::None)); +/* def = this->add("fuzzy_skin_shape", coEnum); def->label = L("Fuzzy skin shape"); def->category = L("Fuzzy Skin"); def->tooltip = L("Fuzzy skin shape."); -/* def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("triangle1"); def->enum_values.push_back("triangle2"); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index dcf94fe9abe..be0711123ad 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -522,7 +522,7 @@ bool PrintObject::invalidate_state_by_config_options(const std::vector Date: Wed, 27 Jan 2021 10:39:39 +0100 Subject: [PATCH 078/143] Check loading of blacklisted dlls and show warning dialog at startup. Also show these dlls in sysinfo dialog. --- src/CMakeLists.txt | 5 ++ src/PrusaSlicer.cpp | 14 +++++ src/PrusaSlicer_app_msvc.cpp | 1 - src/hidapi/win/hid.c | 3 +- src/libslic3r/CMakeLists.txt | 2 + src/libslic3r/LibraryCheck.cpp | 100 +++++++++++++++++++++++++++++++ src/libslic3r/LibraryCheck.hpp | 45 ++++++++++++++ src/slic3r/GUI/GUI_App.cpp | 1 + src/slic3r/GUI/GUI_Utils.cpp | 1 - src/slic3r/GUI/SysInfoDialog.cpp | 4 +- src/slic3r/GUI/SysInfoDialog.hpp | 1 - 11 files changed, 172 insertions(+), 5 deletions(-) create mode 100644 src/libslic3r/LibraryCheck.cpp create mode 100644 src/libslic3r/LibraryCheck.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index acd8d465c50..293cbcd79a4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -140,6 +140,11 @@ target_link_libraries(PrusaSlicer libslic3r_gui) else () target_link_libraries(PrusaSlicer -ldl) endif () + if (WIN32) + include_directories(detours) + find_library(PSAPI_LIB NAMES Psapi) + target_link_libraries(PrusaSlicer ${PSAPI_LIB}) + endif () endif () # On Windows, a shim application is required to produce a console / non console version of the Slic3r application. diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index 35450782b08..a68c5cd0f17 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -48,6 +48,7 @@ #include "libslic3r/Format/SL1.hpp" #include "libslic3r/Utils.hpp" #include "libslic3r/Thread.hpp" +#include "libslic3r/LibraryCheck.hpp" #include "PrusaSlicer.hpp" @@ -566,6 +567,7 @@ int CLI::run(int argc, char **argv) } } + if (start_gui) { #ifdef SLIC3R_GUI Slic3r::GUI::GUI_InitParams params; @@ -600,6 +602,18 @@ bool CLI::setup(int argc, char **argv) } } +#ifdef WIN32 + // Notify user if blacklisted library is already loaded (Nahimic) + // If there are cases of no reports with blacklisted lib - this check should be performed later. + // Some libraries are loaded when we load libraries during startup. + if (LibraryCheck::get_instance().perform_check()) { + std::wstring text = L"Following libraries has been detected inside of the PrusaSlicer process." + L" We suggest stopping or uninstalling these services if you experience crashes or unexpected behaviour while using PrusaSlicer.\n\n"; + text += LibraryCheck::get_instance().get_blacklisted_string(); + MessageBoxW(NULL, text.c_str(), L"Warning"/*L"Incopatible library found"*/, MB_OK); + } +#endif + // See Invoking prusa-slicer from $PATH environment variable crashes #5542 // boost::filesystem::path path_to_binary = boost::filesystem::system_complete(argv[0]); boost::filesystem::path path_to_binary = boost::dll::program_location(); diff --git a/src/PrusaSlicer_app_msvc.cpp b/src/PrusaSlicer_app_msvc.cpp index 5f12c91479e..7710d9eb7e9 100644 --- a/src/PrusaSlicer_app_msvc.cpp +++ b/src/PrusaSlicer_app_msvc.cpp @@ -208,7 +208,6 @@ extern "C" { } extern "C" { - #ifdef SLIC3R_WRAPPER_NOCONSOLE int APIENTRY wWinMain(HINSTANCE /* hInstance */, HINSTANCE /* hPrevInstance */, PWSTR /* lpCmdLine */, int /* nCmdShow */) { diff --git a/src/hidapi/win/hid.c b/src/hidapi/win/hid.c index 4a71e255200..881aedf5b8e 100644 --- a/src/hidapi/win/hid.c +++ b/src/hidapi/win/hid.c @@ -130,7 +130,7 @@ extern "C" { static HMODULE lib_handle = NULL; static BOOLEAN initialized = FALSE; #endif /* HIDAPI_USE_DDK */ - + struct hid_device_ { HANDLE device_handle; BOOL blocking; @@ -200,6 +200,7 @@ static void register_error(hid_device *dev, const char *op) } #ifndef HIDAPI_USE_DDK + static int lookup_functions() { lib_handle = LoadLibraryA("hid.dll"); diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 11e37afc6b7..7b7067d9f2b 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -120,6 +120,8 @@ add_library(libslic3r STATIC "${CMAKE_CURRENT_BINARY_DIR}/libslic3r_version.h" Line.cpp Line.hpp + LibraryCheck.cpp + LibraryCheck.hpp Model.cpp Model.hpp ModelArrange.hpp diff --git a/src/libslic3r/LibraryCheck.cpp b/src/libslic3r/LibraryCheck.cpp new file mode 100644 index 00000000000..7cd507a8ef8 --- /dev/null +++ b/src/libslic3r/LibraryCheck.cpp @@ -0,0 +1,100 @@ +#include "LibraryCheck.hpp" + +#include +#include +#include + +namespace Slic3r { + +#ifdef WIN32 + +//only dll name with .dll suffix - currently case sensitive +const std::vector LibraryCheck::blacklist({ L"NahimicOSD.dll" }); + +bool LibraryCheck::get_blacklisted(std::vector& names) +{ + if (m_found.empty()) + return false; + for (const auto& lib : m_found) + names.emplace_back(lib); + return true; + +} + +std::wstring LibraryCheck::get_blacklisted_string() +{ + std::wstring ret; + if (m_found.empty()) + return ret; + //ret = L"These libraries has been detected inside of the PrusaSlicer process.\n" + // L"We suggest stopping or uninstalling these services if you experience crashes while using PrusaSlicer.\n\n"; + for (const auto& lib : m_found) + { + ret += lib; + ret += L"\n"; + } + return ret; +} + +bool LibraryCheck::perform_check() +{ + + DWORD processID = GetCurrentProcessId(); + HMODULE hMods[1024]; + HANDLE hProcess; + DWORD cbNeeded; + unsigned int i; + + // Get a handle to the process. + hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | + PROCESS_VM_READ, + FALSE, processID); + if (NULL == hProcess) + return false; + // Get a list of all the modules in this process. + if (EnumProcessModulesEx(hProcess, hMods, sizeof(hMods), &cbNeeded, LIST_MODULES_ALL)) + { + //printf("Total Dlls: %d\n", cbNeeded / sizeof(HMODULE)); + for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) + { + TCHAR szModName[MAX_PATH]; + // Get the full path to the module's file. + if (GetModuleFileNameEx(hProcess, hMods[i], szModName, + sizeof(szModName) / sizeof(TCHAR))) + { + // Add to list if blacklisted + if(LibraryCheck::is_blacklisted(szModName)) { + //wprintf(L"Contains library: %s\n", szModName); + if (std::find(m_found.begin(), m_found.end(), szModName) == m_found.end()) + m_found.emplace_back(szModName); + } + //wprintf(L"%s\n", szModName); + } + } + } + + CloseHandle(hProcess); + //printf("\n"); + return !m_found.empty(); + +} + +bool LibraryCheck::is_blacklisted(std::wstring dllpath) +{ + std::wstring dllname = boost::filesystem::path(dllpath).filename().wstring(); + //std::transform(dllname.begin(), dllname.end(), dllname.begin(), std::tolower); + if (std::find(LibraryCheck::blacklist.begin(), LibraryCheck::blacklist.end(), dllname) != LibraryCheck::blacklist.end()) { + //std::wprintf(L"%s is blacklisted\n", dllname.c_str()); + return true; + } + //std::wprintf(L"%s is NOT blacklisted\n", dllname.c_str()); + return false; +} +bool LibraryCheck::is_blacklisted(std::string dllpath) +{ + return LibraryCheck::is_blacklisted(boost::nowide::widen(dllpath)); +} + +#endif //WIN32 + +} // namespace Slic3r diff --git a/src/libslic3r/LibraryCheck.hpp b/src/libslic3r/LibraryCheck.hpp new file mode 100644 index 00000000000..663bf019e2f --- /dev/null +++ b/src/libslic3r/LibraryCheck.hpp @@ -0,0 +1,45 @@ +#ifndef slic3r_LibraryCheck_hpp_ +#define slic3r_LibraryCheck_hpp_ + +#ifdef WIN32 +#include +#include +#include +#endif //WIN32 + +namespace Slic3r { + +#ifdef WIN32 +class LibraryCheck +{ +public: + static LibraryCheck& get_instance() + { + static LibraryCheck instance; + + return instance; + } +private: + LibraryCheck() {} + + std::vector m_found; +public: + LibraryCheck(LibraryCheck const&) = delete; + void operator=(LibraryCheck const&) = delete; + // returns all found blacklisted dlls + bool get_blacklisted(std::vector& names); + std::wstring get_blacklisted_string(); + // returns true if enumerating found blacklisted dll + bool perform_check(); + + static bool is_blacklisted(std::string dllpath); + static bool is_blacklisted(std::wstring dllpath); +private: + static const std::vector blacklist; +}; + +#endif //WIN32 + +} // namespace Slic3r + +#endif //slic3r_LibraryCheck_hpp_ \ No newline at end of file diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 4c4b4b4c26d..e144df6d036 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -775,6 +775,7 @@ bool GUI_App::on_init_inner() // Slic3r::debugf "wxWidgets version %s, Wx version %s\n", wxVERSION_STRING, wxVERSION; + if (is_editor()) { std::string msg = Http::tls_global_init(); std::string ssl_cert_store = app_config->get("tls_accepted_cert_store_location"); diff --git a/src/slic3r/GUI/GUI_Utils.cpp b/src/slic3r/GUI/GUI_Utils.cpp index e2a6ccb885d..adb9633eab2 100644 --- a/src/slic3r/GUI/GUI_Utils.cpp +++ b/src/slic3r/GUI/GUI_Utils.cpp @@ -17,7 +17,6 @@ #include "libslic3r/Config.hpp" - namespace Slic3r { namespace GUI { diff --git a/src/slic3r/GUI/SysInfoDialog.cpp b/src/slic3r/GUI/SysInfoDialog.cpp index 8d9572b47e2..508d7a93086 100644 --- a/src/slic3r/GUI/SysInfoDialog.cpp +++ b/src/slic3r/GUI/SysInfoDialog.cpp @@ -14,6 +14,7 @@ #include "GUI_App.hpp" #include "MainFrame.hpp" #include "wxExtensions.hpp" +#include "../libslic3r/LibraryCheck.hpp" #ifdef _WIN32 // The standard Windows includes. @@ -149,7 +150,8 @@ SysInfoDialog::SysInfoDialog() "" "" "", bgr_clr_str, text_clr_str, text_clr_str, - get_mem_info(true) + "
" + wxGetApp().get_gl_info(true, true) + "
Eigen vectorization supported: " + Eigen::SimdInstructionSetsInUse()); + get_mem_info(true) + "
" + wxGetApp().get_gl_info(true, true) + "
Eigen vectorization supported: " + Eigen::SimdInstructionSetsInUse() + + "

Blacklisted loaded libraries:
" + LibraryCheck::get_instance().get_blacklisted_string().c_str()); m_opengl_info_html->SetPage(text); main_sizer->Add(m_opengl_info_html, 1, wxEXPAND | wxBOTTOM, 15); } diff --git a/src/slic3r/GUI/SysInfoDialog.hpp b/src/slic3r/GUI/SysInfoDialog.hpp index 3b145964842..070db61b2d7 100644 --- a/src/slic3r/GUI/SysInfoDialog.hpp +++ b/src/slic3r/GUI/SysInfoDialog.hpp @@ -29,7 +29,6 @@ class SysInfoDialog : public DPIDialog void onCopyToClipboard(wxEvent &); void onCloseDialog(wxEvent &); }; - } // namespace GUI } // namespace Slic3r From c02385b115e868ad2d8e867140aa515345892049 Mon Sep 17 00:00:00 2001 From: David Kocik Date: Wed, 27 Jan 2021 10:58:52 +0100 Subject: [PATCH 079/143] missing ifdef --- src/libslic3r/LibraryCheck.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/libslic3r/LibraryCheck.cpp b/src/libslic3r/LibraryCheck.cpp index 7cd507a8ef8..1c7cbe54a4b 100644 --- a/src/libslic3r/LibraryCheck.cpp +++ b/src/libslic3r/LibraryCheck.cpp @@ -2,7 +2,10 @@ #include #include + +#ifdef WIN32 #include +# endif //WIN32 namespace Slic3r { From 2e6138561aed1aa414342edaaefdc85aed9eed28 Mon Sep 17 00:00:00 2001 From: David Kocik Date: Wed, 27 Jan 2021 11:43:34 +0100 Subject: [PATCH 080/143] missing ifdef --- src/slic3r/GUI/SysInfoDialog.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/SysInfoDialog.cpp b/src/slic3r/GUI/SysInfoDialog.cpp index 508d7a93086..606bb9f88df 100644 --- a/src/slic3r/GUI/SysInfoDialog.cpp +++ b/src/slic3r/GUI/SysInfoDialog.cpp @@ -151,7 +151,11 @@ SysInfoDialog::SysInfoDialog() "" "", bgr_clr_str, text_clr_str, text_clr_str, get_mem_info(true) + "
" + wxGetApp().get_gl_info(true, true) + "
Eigen vectorization supported: " + Eigen::SimdInstructionSetsInUse() - + "

Blacklisted loaded libraries:
" + LibraryCheck::get_instance().get_blacklisted_string().c_str()); +#ifdef WIN32 + + "

Blacklisted loaded libraries:
" + LibraryCheck::get_instance().get_blacklisted_string().c_str() +#endif + ); + m_opengl_info_html->SetPage(text); main_sizer->Add(m_opengl_info_html, 1, wxEXPAND | wxBOTTOM, 15); } From d68489c7d7389fc000960b92a8b193b6880c7322 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 26 Jan 2021 15:15:22 +0100 Subject: [PATCH 081/143] 3mf export - Removed export of duplicated line into model config file --- src/libslic3r/Format/3mf.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 200e6a4904f..c85e4bcd3ec 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -2905,7 +2905,6 @@ namespace Slic3r { stream << prefix << SOURCE_OFFSET_X_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(0) << "\"/>\n"; stream << prefix << SOURCE_OFFSET_Y_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(1) << "\"/>\n"; stream << prefix << SOURCE_OFFSET_Z_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(2) << "\"/>\n"; - stream << prefix << SOURCE_OFFSET_Z_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(2) << "\"/>\n"; } if (volume->source.is_converted_from_inches) stream << prefix << SOURCE_IN_INCHES << "\" " << VALUE_ATTR << "=\"1\"/>\n"; From b178a1b04f7d5d2f8f46dfb3d53c7bce298d720e Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 27 Jan 2021 15:53:44 +0100 Subject: [PATCH 082/143] 3mf export - Do not export unneeded space --- src/libslic3r/Format/3mf.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index c85e4bcd3ec..fada01ea240 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -2193,9 +2193,9 @@ namespace Slic3r { std::stringstream stream; stream << "\n"; stream << "\n"; - stream << " \n"; - stream << " \n"; - stream << " \n"; + stream << " \n"; + stream << " \n"; + stream << " \n"; stream << ""; std::string out = stream.str(); @@ -2232,8 +2232,8 @@ namespace Slic3r { std::stringstream stream; stream << "\n"; stream << "\n"; - stream << " \n"; - stream << " \n"; + stream << " \n"; + stream << " \n"; stream << ""; std::string out = stream.str(); @@ -2379,7 +2379,7 @@ namespace Slic3r { else { stream << " <" << COMPONENTS_TAG << ">\n"; - stream << " <" << COMPONENT_TAG << " objectid=\"" << object_id << "\" />\n"; + stream << " <" << COMPONENT_TAG << " objectid=\"" << object_id << "\"/>\n"; stream << " \n"; } @@ -2502,7 +2502,7 @@ namespace Slic3r { ptr = format_coordinate(v.y(), ptr); boost::spirit::karma::generate(ptr, "\" z=\""); ptr = format_coordinate(v.z(), ptr); - boost::spirit::karma::generate(ptr, "\" />\n"); + boost::spirit::karma::generate(ptr, "\"/>\n"); *ptr = '\0'; output_buffer += buf; if (! flush()) @@ -2540,7 +2540,7 @@ namespace Slic3r { boost::spirit::karma::generate(ptr, boost::spirit::lit(" <") << TRIANGLE_TAG << " v1=\"" << boost::spirit::int_ << "\" v2=\"" << boost::spirit::int_ << - "\" v3=\"" << boost::spirit::int_ << "\" ", + "\" v3=\"" << boost::spirit::int_ << "\"", idx[0] + volume_it->second.first_vertex_id, idx[1] + volume_it->second.first_vertex_id, idx[2] + volume_it->second.first_vertex_id); @@ -2550,18 +2550,20 @@ namespace Slic3r { std::string custom_supports_data_string = volume->supported_facets.get_triangle_as_string(i); if (! custom_supports_data_string.empty()) { + output_buffer += " "; output_buffer += CUSTOM_SUPPORTS_ATTR; output_buffer += "=\""; output_buffer += custom_supports_data_string; - output_buffer += "\" "; + output_buffer += "\""; } std::string custom_seam_data_string = volume->seam_facets.get_triangle_as_string(i); if (! custom_seam_data_string.empty()) { + output_buffer += " "; output_buffer += CUSTOM_SEAM_ATTR; output_buffer += "=\""; output_buffer += custom_seam_data_string; - output_buffer += "\" "; + output_buffer += "\""; } output_buffer += "/>\n"; @@ -2603,7 +2605,7 @@ namespace Slic3r { stream << " "; } } - stream << "\" " << PRINTABLE_ATTR << "=\"" << item.printable << "\" />\n"; + stream << "\" " << PRINTABLE_ATTR << "=\"" << item.printable << "\"/>\n"; } stream << " \n"; From ed04eb1f20956d0f203e27310a3b11df525a3b22 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Wed, 27 Jan 2021 17:04:13 +0100 Subject: [PATCH 083/143] creality.ini: remove superfluous printer_variant from ENDER3V2 --- resources/profiles/Creality.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 04f7d36a935..34c9cbb9b98 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -702,7 +702,6 @@ end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, inherits = Creality Ender-3 renamed_from = "Creality Ender-3V2" printer_model = ENDER3V2 -printer_variant = 0.4 bed_shape = 0x0,220x0,220x220,0x220 [printer:*fastabl*] From 5fa4880eac717da2860e2db289a7c636409c8d16 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Wed, 27 Jan 2021 17:15:43 +0100 Subject: [PATCH 084/143] creality.ini: add comments --- resources/profiles/Creality.ini | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 34c9cbb9b98..291fd224716 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -349,7 +349,14 @@ compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diamete inherits = *0.28mm* compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diameter[0]==0.4 -# Common filament preset +# When submitting new filaments please print the following temperature tower at 0.1mm layer height: +# https://www.thingiverse.com/thing:2615842 +# Pay particular attention to bridging, overhangs and retractions. +# Also print the following bed adhesion test at 0.1 layer height as well: +# https://www.prusaprinters.org/prints/4634-bed-adhesion-warp-test +# At least for PLA, please keep bed temp at 60, as many Creality printers do not have any ABL +# So having some leeway to get good bed adhesion is not a luxury for many users + [filament:*common*] cooling = 0 compatible_printers = @@ -704,12 +711,15 @@ renamed_from = "Creality Ender-3V2" printer_model = ENDER3V2 bed_shape = 0x0,220x0,220x220,0x220 +# Intended for printers with a smaller bed, like the Ender-3 [printer:*fastabl*] start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG4 S10 ; wait for partial warmup\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 +# Intended for printers with a larger bed, like the CR-10 [printer:*slowabl*] start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 +# Intended for printers where the Z-axis lowers the print bed during printing [printer:*invertedz*] end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print bed down\nG1 X50 Y50 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+max_print_height-10} F600{endif} ; Move print bed down further down\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors From f2a624007bb436ca8111c7addd7a3ee889299538 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Wed, 27 Jan 2021 17:34:38 +0100 Subject: [PATCH 085/143] creality.ini: enable more filaments by default --- resources/profiles/Creality.ini | 34 ++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 291fd224716..4ec15a38d15 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -21,7 +21,7 @@ technology = FFF family = ENDER bed_model = ender3_bed.stl bed_texture = ender3.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:ENDER3V2] name = Creality Ender-3 V2 @@ -30,7 +30,7 @@ technology = FFF family = ENDER bed_model = ender3_bed.stl bed_texture = ender3.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:ENDER3BLTOUCH] name = Creality Ender-3 BLTouch @@ -39,7 +39,7 @@ technology = FFF family = ENDER bed_model = ender3_bed.stl bed_texture = ender3.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:ENDER5] name = Creality Ender-5 @@ -48,7 +48,7 @@ technology = FFF family = ENDER bed_model = ender3_bed.stl bed_texture = ender3.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:ENDER5PLUS] name = Creality Ender-5 Plus @@ -57,7 +57,7 @@ technology = FFF family = ENDER bed_model = ender5plus_bed.stl bed_texture = ender5plus.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:ENDER2] name = Creality Ender-2 @@ -66,7 +66,7 @@ technology = FFF family = ENDER bed_model = ender2_bed.stl bed_texture = ender2.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10MINI] name = Creality CR-10 Mini @@ -75,7 +75,7 @@ technology = FFF family = CR bed_model = cr10mini_bed.stl bed_texture = cr10mini.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10] name = Creality CR-10 @@ -84,7 +84,7 @@ technology = FFF family = CR bed_model = cr10_bed.stl bed_texture = cr10.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10V2] name = Creality CR-10 V2 @@ -93,7 +93,7 @@ technology = FFF family = CR bed_model = cr10v2_bed.stl bed_texture = cr10.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10V3] name = Creality CR-10 V3 @@ -102,7 +102,7 @@ technology = FFF family = CR bed_model = cr10v2_bed.stl bed_texture = cr10.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10S] name = Creality CR-10 S @@ -111,7 +111,7 @@ technology = FFF family = CR bed_model = cr10_bed.stl bed_texture = cr10.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10SPRO] name = Creality CR-10 S Pro @@ -120,7 +120,7 @@ technology = FFF family = CR bed_model = cr10v2_bed.stl bed_texture = cr10.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10SPROV2] name = Creality CR-10 S Pro V2 @@ -129,7 +129,7 @@ technology = FFF family = CR bed_model = cr10v2_bed.stl bed_texture = cr10.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10S4] name = Creality CR-10 S4 @@ -138,7 +138,7 @@ technology = FFF family = CR bed_model = cr10s4_bed.stl bed_texture = cr10s4.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10S5] name = Creality CR-10 S5 @@ -147,7 +147,7 @@ technology = FFF family = CR bed_model = cr10s5_bed.stl bed_texture = cr10s5.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR20] name = Creality CR-20 @@ -156,7 +156,7 @@ technology = FFF family = CR bed_model = ender3_bed.stl bed_texture = cr20.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR20PRO] name = Creality CR-20 Pro @@ -165,7 +165,7 @@ technology = FFF family = CR bed_model = ender3_bed.stl bed_texture = cr20.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. From ba6a40bccee7c3b64bd813c0ee4f7487663a0af9 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Wed, 27 Jan 2021 17:42:32 +0100 Subject: [PATCH 086/143] creality.ini: add CR-6 SE --- resources/profiles/Creality.ini | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 4ec15a38d15..ec5b330ad3e 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -68,6 +68,15 @@ bed_model = ender2_bed.stl bed_texture = ender2.svg default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY +[printer_model:CR6SE] +name = Creality CR-6 SE +variants = 0.4 +technology = FFF +family = CR +bed_model = ender3_bed.stl +bed_texture = cr20.svg +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY + [printer_model:CR10MINI] name = Creality CR-10 Mini variants = 0.4 @@ -758,6 +767,11 @@ printer_model = ENDER2 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER2\nPRINTER_HAS_BOWDEN max_print_height = 200 +[printer:Creality CR-6 SE] +inherits = Creality Ender-3; *fastabl* +printer_model = CR6SE +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR6SE\nPRINTER_HAS_BOWDEN + [printer:Creality CR-10 Mini] inherits = Creality Ender-3 retract_length = 6 From c54ce89883294661c4d050cbfa85f1a17e4c3077 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 28 Jan 2021 08:28:23 +0100 Subject: [PATCH 087/143] SLA preview - Do not show full object when slider is at 1st layer --- src/slic3r/GUI/GUI_Preview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 71b1aa9ba26..b460ac736c4 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -974,6 +974,7 @@ void Preview::load_print_as_sla() sort_remove_duplicates(zs); m_canvas->reset_clipping_planes_cache(); + m_canvas->set_use_clipping_planes(true); n_layers = (unsigned int)zs.size(); if (n_layers == 0) { @@ -1007,7 +1008,6 @@ void Preview::on_layers_slider_scroll_changed(wxCommandEvent& event) else if (tech == ptSLA) { m_canvas->set_clipping_plane(0, ClippingPlane(Vec3d::UnitZ(), -m_layers_slider->GetLowerValueD())); m_canvas->set_clipping_plane(1, ClippingPlane(-Vec3d::UnitZ(), m_layers_slider->GetHigherValueD())); - m_canvas->set_use_clipping_planes(m_layers_slider->GetHigherValue() != 0); m_canvas->render(); } } From ba9025491b0f338798f90cdf1ffe4cac770f0d42 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 28 Jan 2021 12:44:38 +0100 Subject: [PATCH 088/143] Refresh object manipulator fields in sidebar after arrange --- src/slic3r/GUI/Jobs/ArrangeJob.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp index 276e20c1a94..32375f8291b 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.cpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp @@ -6,6 +6,8 @@ #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI_ObjectManipulation.hpp" #include "libnest2d/common.hpp" @@ -214,7 +216,8 @@ void ArrangeJob::finalize() { } m_plater->update(); - + wxGetApp().obj_manipul()->set_dirty(); + Job::finalize(); } From ba8761345457575f8f3e8bd8783ae68e7884bd36 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Thu, 28 Jan 2021 18:13:45 +0100 Subject: [PATCH 089/143] creality.ini: update start_gcode/end_gcode comments --- resources/profiles/Creality.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index ec5b330ad3e..443fa918403 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -720,15 +720,15 @@ renamed_from = "Creality Ender-3V2" printer_model = ENDER3V2 bed_shape = 0x0,220x0,220x220,0x220 -# Intended for printers with a smaller bed, like the Ender-3 +# Intended for printers with a smaller bed, like the Ender-3 series [printer:*fastabl*] start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG4 S10 ; wait for partial warmup\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 -# Intended for printers with a larger bed, like the CR-10 +# Intended for printers with a larger bed, like the CR-10 series [printer:*slowabl*] start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 -# Intended for printers where the Z-axis lowers the print bed during printing +# Intended for printers where the Z-axis lowers the print bed during printing, like the Ender-5 series [printer:*invertedz*] end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print bed down\nG1 X50 Y50 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+max_print_height-10} F600{endif} ; Move print bed down further down\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors From 1f9fe927207934c3ade0841b73fbadb20b69d14b Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Thu, 28 Jan 2021 18:14:19 +0100 Subject: [PATCH 090/143] creality.ini: hide CR-6 SE until next release --- resources/profiles/Creality.ini | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 443fa918403..7d584a622ef 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -68,14 +68,14 @@ bed_model = ender2_bed.stl bed_texture = ender2.svg default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY -[printer_model:CR6SE] -name = Creality CR-6 SE -variants = 0.4 -technology = FFF -family = CR -bed_model = ender3_bed.stl -bed_texture = cr20.svg -default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY +#[printer_model:CR6SE] +#name = Creality CR-6 SE +#variants = 0.4 +#technology = FFF +#family = CR +#bed_model = ender3_bed.stl +#bed_texture = cr20.svg +#default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10MINI] name = Creality CR-10 Mini @@ -767,10 +767,10 @@ printer_model = ENDER2 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER2\nPRINTER_HAS_BOWDEN max_print_height = 200 -[printer:Creality CR-6 SE] -inherits = Creality Ender-3; *fastabl* -printer_model = CR6SE -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR6SE\nPRINTER_HAS_BOWDEN +#[printer:Creality CR-6 SE] +#inherits = Creality Ender-3; *fastabl* +#printer_model = CR6SE +#printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR6SE\nPRINTER_HAS_BOWDEN [printer:Creality CR-10 Mini] inherits = Creality Ender-3 From 9c5dd358ab23e9351dce0b9c71eaa5ddf92d6f17 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Thu, 28 Jan 2021 18:59:53 +0100 Subject: [PATCH 091/143] Fix of #4654 #5122 #5668 #5811 #5895 Fixing model import of models with nearly degenerate triangles, which degenerate after transformation (translation or rotation). There was certainly a bug in PrusaSlicer, however this bug was triggered mostly by the ASCII STL files generated by OpenSCAD, likely due to insufficient number of decimal digits when saving an ASCII STL, see [openscad/openscad] STL export should contain single precision floats (#2651) --- src/libslic3r/PrintObject.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index be0711123ad..543a45846bd 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -2143,6 +2143,16 @@ std::vector PrintObject::slice_support_volumes(const ModelVolumeType return this->slice_volumes(zs, SlicingMode::Regular, volumes); } +//FIXME The admesh repair function may break the face connectivity, rather refresh it here as the slicing code relies on it. +static void fix_mesh_connectivity(TriangleMesh &mesh) +{ + auto nr_degenerated = mesh.stl.stats.degenerate_facets; + stl_check_facets_exact(&mesh.stl); + if (nr_degenerated != mesh.stl.stats.degenerate_facets) + // stl_check_facets_exact() removed some newly degenerated faces. Some faces could become degenerate after some mesh transformation. + stl_generate_shared_vertices(&mesh.stl, mesh.its); +} + std::vector PrintObject::slice_volumes( const std::vector &z, SlicingMode mode, size_t slicing_mode_normal_below_layer, SlicingMode mode_below, @@ -2155,10 +2165,8 @@ std::vector PrintObject::slice_volumes( TriangleMesh mesh(volumes.front()->mesh()); mesh.transform(volumes.front()->get_matrix(), true); assert(mesh.repaired); - if (volumes.size() == 1 && mesh.repaired) { - //FIXME The admesh repair function may break the face connectivity, rather refresh it here as the slicing code relies on it. - stl_check_facets_exact(&mesh.stl); - } + if (volumes.size() == 1 && mesh.repaired) + fix_mesh_connectivity(mesh); for (size_t idx_volume = 1; idx_volume < volumes.size(); ++ idx_volume) { const ModelVolume &model_volume = *volumes[idx_volume]; TriangleMesh vol_mesh(model_volume.mesh()); @@ -2191,10 +2199,8 @@ std::vector PrintObject::slice_volume(const std::vector &z, S //FIXME better to split the mesh into separate shells, perform slicing over each shell separately and then to use a Boolean operation to merge them. TriangleMesh mesh(volume.mesh()); mesh.transform(volume.get_matrix(), true); - if (mesh.repaired) { - //FIXME The admesh repair function may break the face connectivity, rather refresh it here as the slicing code relies on it. - stl_check_facets_exact(&mesh.stl); - } + if (mesh.repaired) + fix_mesh_connectivity(mesh); if (mesh.stl.stats.number_of_facets > 0) { mesh.transform(m_trafo, true); // apply XY shift From c9ebc18a10943ed151020e09a8b028551fb72be5 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Thu, 28 Jan 2021 23:34:43 +0100 Subject: [PATCH 092/143] Added Anycubic Kossel texture from https://github.com/prusa3d/PrusaSlicer/pull/5747 --- resources/profiles/Anycubic/AK.svg | 344 +++++++++++++++++++++++++++++ 1 file changed, 344 insertions(+) create mode 100644 resources/profiles/Anycubic/AK.svg diff --git a/resources/profiles/Anycubic/AK.svg b/resources/profiles/Anycubic/AK.svg new file mode 100644 index 00000000000..485e8592b5a --- /dev/null +++ b/resources/profiles/Anycubic/AK.svg @@ -0,0 +1,344 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7b3a06fd05d24117e2f7819c42e420f2d92d15bb Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Thu, 28 Jan 2021 23:35:38 +0100 Subject: [PATCH 093/143] Updated Anycubic Kossel bed models. --- resources/profiles/Anycubic/AKLP_Bed.stl | Bin 6303694 -> 386484 bytes resources/profiles/Anycubic/AK_Bed.stl | Bin 706984 -> 373684 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/profiles/Anycubic/AKLP_Bed.stl b/resources/profiles/Anycubic/AKLP_Bed.stl index 07abce367f787eb1d8024c714903791b0c6c5a2c..67734ab33533a40637d27ee9cf7c32a3785d6097 100644 GIT binary patch literal 386484 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 z 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 Rx->tK=H({@to|v=Z~6tA+{^ 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 literal 6303694 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

!cm#s5bX#aT2)C~plXi%{CABdXGN-s%y$=R3! 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 z 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�%$qUh~g0I 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

Qfa|bF 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 b|Mh=<{mWnf@gM)=fB)-W|Ms8%{BQpcNX>CC diff --git a/resources/profiles/Anycubic/AK_Bed.stl b/resources/profiles/Anycubic/AK_Bed.stl index 31daa1150ebed0c1bf67001c711a3628074fa229..7f8d018787b35509384f05ed6b26f1594d623c63 100644 GIT binary patch literal 373684 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

F9`@LMtRr@JcguSZE}psO_j&(&KIgi=&&BMi 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 z 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:w=_s3p(_v9erXLea;uFk7Mex`m9#PV@&j< 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 wwk~ZQwC1@wqkes}b Date: Thu, 28 Jan 2021 23:38:45 +0100 Subject: [PATCH 094/143] Updated bed_texture for Anycubic Kossel --- resources/profiles/Anycubic.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/profiles/Anycubic.ini b/resources/profiles/Anycubic.ini index c36f50ec8e7..399495d2302 100644 --- a/resources/profiles/Anycubic.ini +++ b/resources/profiles/Anycubic.ini @@ -20,7 +20,7 @@ variants = 0.4 technology = FFF family = KOSSEL bed_model = AKLP_Bed.stl -bed_texture = AK.png +bed_texture = AK.svg default_materials = Generic PLA @AKOSSEL; Generic PETG @AKOSSEL; Generic ABS @AKOSSEL [printer_model:AK] @@ -29,7 +29,7 @@ variants = 0.4 technology = FFF family = KOSSEL bed_model = AK_Bed.stl -bed_texture = AK.png +bed_texture = AK.svg default_materials = Generic PLA @AKOSSEL; Generic PETG @AKOSSEL; Generic ABS @AKOSSEL [printer_model:MEGA0] From 31e7a60494d55cad733f4006db38b57ebdc42e47 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Fri, 29 Jan 2021 10:43:34 +0100 Subject: [PATCH 095/143] Creality - bumped up version to 0.0.13 --- resources/profiles/Creality.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 7d584a622ef..5f46ea40171 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -5,7 +5,7 @@ name = Creality # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 0.0.12 +config_version = 0.0.13 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Creality/ # changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% From a2a0a86138e0eb6f094fda7cd91d6b24335e6339 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Fri, 29 Jan 2021 10:44:35 +0100 Subject: [PATCH 096/143] Creality 0.0.13 --- resources/profiles/Creality.idx | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx index a96a348d985..78d67e4ede0 100644 --- a/resources/profiles/Creality.idx +++ b/resources/profiles/Creality.idx @@ -1,4 +1,5 @@ min_slic3r_version = 2.3.0-rc2 +0.0.13 Optimized start and end g-code. General improvements. 0.0.12 Added Ender-3V2 and filament profiles. min_slic3r_version = 2.3.0-beta2 0.0.11 Updated machine limits for Ender 5 and Ender 5 Plus. From b5280fbed97404fd2ef75692102ff1f3963c58b3 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 11 Jan 2021 10:23:56 +0100 Subject: [PATCH 097/143] Fixing GCC warnings 1 --- src/libslic3r/EdgeGrid.cpp | 4 +- src/libslic3r/EdgeGrid.hpp | 16 ++- src/libslic3r/Fill/FillAdaptive.cpp | 153 +++++++++++++------------ src/libslic3r/Fill/FillAdaptive.hpp | 4 +- src/libslic3r/Fill/FillBase.cpp | 21 ++-- src/libslic3r/Fill/FillRectilinear.cpp | 32 ++---- src/libslic3r/GCode/GCodeProcessor.cpp | 7 +- src/libslic3r/LayerRegion.cpp | 2 +- src/libslic3r/PresetBundle.cpp | 7 -- 9 files changed, 112 insertions(+), 134 deletions(-) diff --git a/src/libslic3r/EdgeGrid.cpp b/src/libslic3r/EdgeGrid.cpp index e7307fda470..7bab590f7ff 100644 --- a/src/libslic3r/EdgeGrid.cpp +++ b/src/libslic3r/EdgeGrid.cpp @@ -1483,8 +1483,8 @@ bool EdgeGrid::Grid::has_intersecting_edges() const void EdgeGrid::save_png(const EdgeGrid::Grid &grid, const BoundingBox &bbox, coord_t resolution, const char *path, size_t scale) { - unsigned int w = (bbox.max(0) - bbox.min(0) + resolution - 1) / resolution; - unsigned int h = (bbox.max(1) - bbox.min(1) + resolution - 1) / resolution; + coord_t w = (bbox.max(0) - bbox.min(0) + resolution - 1) / resolution; + coord_t h = (bbox.max(1) - bbox.min(1) + resolution - 1) / resolution; std::vector pixels(w * h * 3, 0); diff --git a/src/libslic3r/EdgeGrid.hpp b/src/libslic3r/EdgeGrid.hpp index c3bc869d4ae..7b5e3905cec 100644 --- a/src/libslic3r/EdgeGrid.hpp +++ b/src/libslic3r/EdgeGrid.hpp @@ -88,10 +88,10 @@ class Grid assert(m_bbox.contains(p2)); p1 -= m_bbox.min; p2 -= m_bbox.min; - assert(p1.x() >= 0 && p1.x() < m_cols * m_resolution); - assert(p1.y() >= 0 && p1.y() < m_rows * m_resolution); - assert(p2.x() >= 0 && p2.x() < m_cols * m_resolution); - assert(p2.y() >= 0 && p2.y() < m_rows * m_resolution); + assert(p1.x() >= 0 && size_t(p1.x()) < m_cols * m_resolution); + assert(p1.y() >= 0 && size_t(p1.y()) < m_rows * m_resolution); + assert(p2.x() >= 0 && size_t(p2.x()) < m_cols * m_resolution); + assert(p2.y() >= 0 && size_t(p2.y()) < m_rows * m_resolution); // Get the cells of the end points. coord_t ix = p1(0) / m_resolution; coord_t iy = p1(1) / m_resolution; @@ -245,12 +245,10 @@ class Grid return; } - std::pair>::const_iterator, std::vector>::const_iterator> cell_data_range(coord_t row, coord_t col) const + std::pair>::const_iterator, std::vector>::const_iterator> cell_data_range(coord_t row, coord_t col) const { - assert(row >= 0); - assert(row < m_rows); - assert(col >= 0); - assert(col < m_cols); + assert(row >= 0 && size_t(row) < m_rows); + assert(col >= 0 && size_t(col) < m_cols); const EdgeGrid::Grid::Cell &cell = m_cells[row * m_cols + col]; return std::make_pair(m_cell_data.begin() + cell.begin, m_cell_data.begin() + cell.end); } diff --git a/src/libslic3r/Fill/FillAdaptive.cpp b/src/libslic3r/Fill/FillAdaptive.cpp index 520124533d5..d8c05887ece 100644 --- a/src/libslic3r/Fill/FillAdaptive.cpp +++ b/src/libslic3r/Fill/FillAdaptive.cpp @@ -160,66 +160,66 @@ bool triangle_AABB_intersects(const Vector &a, const Vector &b, const Vector &c, return true; } -static double dist2_to_triangle(const Vec3d &a, const Vec3d &b, const Vec3d &c, const Vec3d &p) -{ - double out = std::numeric_limits::max(); - const Vec3d v1 = b - a; - auto l1 = v1.squaredNorm(); - const Vec3d v2 = c - b; - auto l2 = v2.squaredNorm(); - const Vec3d v3 = a - c; - auto l3 = v3.squaredNorm(); - - // Is the triangle valid? - if (l1 > 0. && l2 > 0. && l3 > 0.) - { - // 1) Project point into the plane of the triangle. - const Vec3d n = v1.cross(v2); - double d = (p - a).dot(n); - const Vec3d foot_pt = p - n * d / n.squaredNorm(); - - // 2) Maximum projection of n. - int proj_axis; - n.array().cwiseAbs().maxCoeff(&proj_axis); - - // 3) Test whether the foot_pt is inside the triangle. - { - auto inside_triangle = [](const Vec2d& v1, const Vec2d& v2, const Vec2d& v3, const Vec2d& pt) { - const double d1 = cross2(v1, pt); - const double d2 = cross2(v2, pt); - const double d3 = cross2(v3, pt); - // Testing both CCW and CW orientations. - return (d1 >= 0. && d2 >= 0. && d3 >= 0.) || (d1 <= 0. && d2 <= 0. && d3 <= 0.); - }; - bool inside; - switch (proj_axis) { - case 0: - inside = inside_triangle({v1.y(), v1.z()}, {v2.y(), v2.z()}, {v3.y(), v3.z()}, {foot_pt.y(), foot_pt.z()}); break; - case 1: - inside = inside_triangle({v1.z(), v1.x()}, {v2.z(), v2.x()}, {v3.z(), v3.x()}, {foot_pt.z(), foot_pt.x()}); break; - default: - assert(proj_axis == 2); - inside = inside_triangle({v1.x(), v1.y()}, {v2.x(), v2.y()}, {v3.x(), v3.y()}, {foot_pt.x(), foot_pt.y()}); break; - } - if (inside) - return (p - foot_pt).squaredNorm(); - } - - // 4) Find minimum distance to triangle vertices and edges. - out = std::min((p - a).squaredNorm(), std::min((p - b).squaredNorm(), (p - c).squaredNorm())); - auto t = (p - a).dot(v1); - if (t > 0. && t < l1) - out = std::min(out, (a + v1 * (t / l1) - p).squaredNorm()); - t = (p - b).dot(v2); - if (t > 0. && t < l2) - out = std::min(out, (b + v2 * (t / l2) - p).squaredNorm()); - t = (p - c).dot(v3); - if (t > 0. && t < l3) - out = std::min(out, (c + v3 * (t / l3) - p).squaredNorm()); - } - - return out; -} +// static double dist2_to_triangle(const Vec3d &a, const Vec3d &b, const Vec3d &c, const Vec3d &p) +// { +// double out = std::numeric_limits::max(); +// const Vec3d v1 = b - a; +// auto l1 = v1.squaredNorm(); +// const Vec3d v2 = c - b; +// auto l2 = v2.squaredNorm(); +// const Vec3d v3 = a - c; +// auto l3 = v3.squaredNorm(); + +// // Is the triangle valid? +// if (l1 > 0. && l2 > 0. && l3 > 0.) +// { +// // 1) Project point into the plane of the triangle. +// const Vec3d n = v1.cross(v2); +// double d = (p - a).dot(n); +// const Vec3d foot_pt = p - n * d / n.squaredNorm(); + +// // 2) Maximum projection of n. +// int proj_axis; +// n.array().cwiseAbs().maxCoeff(&proj_axis); + +// // 3) Test whether the foot_pt is inside the triangle. +// { +// auto inside_triangle = [](const Vec2d& v1, const Vec2d& v2, const Vec2d& v3, const Vec2d& pt) { +// const double d1 = cross2(v1, pt); +// const double d2 = cross2(v2, pt); +// const double d3 = cross2(v3, pt); +// // Testing both CCW and CW orientations. +// return (d1 >= 0. && d2 >= 0. && d3 >= 0.) || (d1 <= 0. && d2 <= 0. && d3 <= 0.); +// }; +// bool inside; +// switch (proj_axis) { +// case 0: +// inside = inside_triangle({v1.y(), v1.z()}, {v2.y(), v2.z()}, {v3.y(), v3.z()}, {foot_pt.y(), foot_pt.z()}); break; +// case 1: +// inside = inside_triangle({v1.z(), v1.x()}, {v2.z(), v2.x()}, {v3.z(), v3.x()}, {foot_pt.z(), foot_pt.x()}); break; +// default: +// assert(proj_axis == 2); +// inside = inside_triangle({v1.x(), v1.y()}, {v2.x(), v2.y()}, {v3.x(), v3.y()}, {foot_pt.x(), foot_pt.y()}); break; +// } +// if (inside) +// return (p - foot_pt).squaredNorm(); +// } + +// // 4) Find minimum distance to triangle vertices and edges. +// out = std::min((p - a).squaredNorm(), std::min((p - b).squaredNorm(), (p - c).squaredNorm())); +// auto t = (p - a).dot(v1); +// if (t > 0. && t < l1) +// out = std::min(out, (a + v1 * (t / l1) - p).squaredNorm()); +// t = (p - b).dot(v2); +// if (t > 0. && t < l2) +// out = std::min(out, (b + v2 * (t / l2) - p).squaredNorm()); +// t = (p - c).dot(v3); +// if (t > 0. && t < l3) +// out = std::min(out, (c + v3 * (t / l3) - p).squaredNorm()); +// } + +// return out; +// } // Ordering of children cubes. static const std::array child_centers { @@ -690,7 +690,8 @@ static void add_hook( // Trim the hook start by the infill line it will connect to. Point hook_start; - bool intersection_found = intersection.intersect_line->intersection( + + [[maybe_unused]] bool intersection_found = intersection.intersect_line->intersection( create_offset_line(*intersection.closest_line, intersection, scaled_offset), &hook_start); assert(intersection_found); @@ -703,7 +704,7 @@ static void add_hook( Vector hook_vector = ((hook_length + 1.16 * scaled_trim_distance) * hook_vector_norm).cast(); Line hook_forward(hook_start, hook_start + hook_vector); - auto filter_itself = [&intersection, &lines_src](const auto &item) { return item.second != intersection.intersect_line - lines_src.data(); }; + auto filter_itself = [&intersection, &lines_src](const auto &item) { return item.second != (long unsigned int)(intersection.intersect_line - lines_src.data()); }; std::vector> hook_intersections; rtree.query(bgi::intersects(mk_rtree_seg(hook_forward)) && bgi::satisfies(filter_itself), std::back_inserter(hook_intersections)); @@ -1178,7 +1179,8 @@ static Polylines connect_lines_using_hooks(Polylines &&lines, const ExPolygon &b rtree.query( bgi::intersects(mk_rtree_seg(first_i_point, nearest_i_point)) && bgi::satisfies([&first_i, &nearest_i, &lines_src](const auto &item) - { return item.second != first_i.intersect_line - lines_src.data() && item.second != nearest_i.intersect_line - lines_src.data(); }), + { return item.second != (long unsigned int)(first_i.intersect_line - lines_src.data()) + && item.second != (long unsigned int)(nearest_i.intersect_line - lines_src.data()); }), std::back_inserter(closest)); could_connect = closest.empty(); #if 0 @@ -1252,7 +1254,7 @@ static Polylines connect_lines_using_hooks(Polylines &&lines, const ExPolygon &b } #ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT ++ iStep; -#endif ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT +#endif // ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT first_i.used = true; } } @@ -1410,15 +1412,15 @@ void Filler::_fill_surface_single( #endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */ } -static double bbox_max_radius(const BoundingBoxf3 &bbox, const Vec3d ¢er) -{ - const auto p = (bbox.min - center); - const auto s = bbox.size(); - double r2max = 0.; - for (int i = 0; i < 8; ++ i) - r2max = std::max(r2max, (p + Vec3d(s.x() * double(i & 1), s.y() * double(i & 2), s.z() * double(i & 4))).squaredNorm()); - return sqrt(r2max); -} +//static double bbox_max_radius(const BoundingBoxf3 &bbox, const Vec3d ¢er) +//{ +// const auto p = (bbox.min - center); +// const auto s = bbox.size(); +// double r2max = 0.; +// for (int i = 0; i < 8; ++ i) +// r2max = std::max(r2max, (p + Vec3d(s.x() * double(i & 1), s.y() * double(i & 2), s.z() * double(i & 4))).squaredNorm()); +// return sqrt(r2max); +//} static std::vector make_cubes_properties(double max_cube_edge_length, double line_spacing) { @@ -1513,8 +1515,10 @@ void Octree::insert_triangle(const Vec3d &a, const Vec3d &b, const Vec3d &c, Cub assert(current_cube); assert(depth > 0); + --depth; + // Squared radius of a sphere around the child cube. - const double r2_cube = Slic3r::sqr(0.5 * this->cubes_properties[-- depth].height + EPSILON); + // const double r2_cube = Slic3r::sqr(0.5 * this->cubes_properties[depth].height + EPSILON); for (size_t i = 0; i < 8; ++ i) { const Vec3d &child_center_dir = child_centers[i]; @@ -1532,6 +1536,7 @@ void Octree::insert_triangle(const Vec3d &a, const Vec3d &b, const Vec3d &c, Cub } Vec3d child_center = current_cube->center + (child_center_dir * (this->cubes_properties[depth].edge_length / 2.)); //if (dist2_to_triangle(a, b, c, child_center) < r2_cube) { + // dist2_to_triangle and r2_cube are commented out too. if (triangle_AABB_intersects(a, b, c, bbox)) { if (! current_cube->children[i]) current_cube->children[i] = this->pool.construct(child_center); diff --git a/src/libslic3r/Fill/FillAdaptive.hpp b/src/libslic3r/Fill/FillAdaptive.hpp index 330cb8a46ae..0578cc3e1b8 100644 --- a/src/libslic3r/Fill/FillAdaptive.hpp +++ b/src/libslic3r/Fill/FillAdaptive.hpp @@ -59,7 +59,7 @@ class Filler : public Slic3r::Fill ~Filler() override {} protected: - Fill* clone() const override { return new Filler(*this); }; + Fill* clone() const override { return new Filler(*this); } void _fill_surface_single( const FillParams ¶ms, unsigned int thickness_layers, @@ -73,7 +73,7 @@ class Filler : public Slic3r::Fill bool no_sort() const override { return false; } }; -}; // namespace FillAdaptive +} // namespace FillAdaptive } // namespace Slic3r #endif // slic3r_FillAdaptive_hpp_ diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 20d32f3e28c..af53907c798 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -1170,15 +1170,15 @@ void Fill::connect_infill(Polylines &&infill_ordered, const std::vectorsecond / 2]; const Point &pt = (it->second & 1) ? infill_line.points.back() : infill_line.points.front(); -#ifndef NDEBUG - { - const Vec2d pt1 = ipt.cast(); - const Vec2d pt2 = (idx_point + 1 == contour_src.size() ? contour_src.points.front() : contour_src.points[idx_point + 1]).cast(); - const Vec2d ptx = lerp(pt1, pt2, it->first.t); - assert(std::abs(pt.x() - pt.x()) < SCALED_EPSILON); - assert(std::abs(pt.y() - pt.y()) < SCALED_EPSILON); - } -#endif // NDEBUG +//#ifndef NDEBUG +// { +// const Vec2d pt1 = ipt.cast(); +// const Vec2d pt2 = (idx_point + 1 == contour_src.size() ? contour_src.points.front() : contour_src.points[idx_point + 1]).cast(); +// const Vec2d ptx = lerp(pt1, pt2, it->first.t); +// assert(std::abs(ptx.x() - pt.x()) < SCALED_EPSILON); +// assert(std::abs(ptx.y() - pt.y()) < SCALED_EPSILON); +// } +//#endif // NDEBUG size_t idx_tjoint_pt = 0; if (idx_point + 1 < contour_src.size() || pt != contour_dst.front()) { if (pt != contour_dst.back()) @@ -1261,8 +1261,6 @@ void Fill::connect_infill(Polylines &&infill_ordered, const std::vector connections_sorted; connections_sorted.reserve(infill_ordered.size() * 2 - 2); for (size_t idx_chain = 1; idx_chain < infill_ordered.size(); ++ idx_chain) { - const Polyline &pl1 = infill_ordered[idx_chain - 1]; - const Polyline &pl2 = infill_ordered[idx_chain]; const ContourIntersectionPoint *cp1 = &map_infill_end_point_to_boundary[(idx_chain - 1) * 2 + 1]; const ContourIntersectionPoint *cp2 = &map_infill_end_point_to_boundary[idx_chain * 2]; if (cp1->contour_idx != boundary_idx_unconnected && cp1->contour_idx == cp2->contour_idx) { @@ -1396,7 +1394,6 @@ void Fill::connect_infill(Polylines &&infill_ordered, const std::vector &contour_params = boundary_params[contour_point.contour_idx]; - const size_t contour_pt_idx = contour_point.point_idx; double lprev = contour_point.could_connect_prev() ? path_length_along_contour_ccw(contour_point.prev_on_contour, &contour_point, contour_params.back()) : diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp index f8393cf36e6..99d25b52a7f 100644 --- a/src/libslic3r/Fill/FillRectilinear.cpp +++ b/src/libslic3r/Fill/FillRectilinear.cpp @@ -515,8 +515,7 @@ static inline bool intersection_on_prev_next_vertical_line_valid( const SegmentedIntersectionLine &vline_other = segs[side == SegmentIntersection::Side::Right ? (iVerticalLine + 1) : (iVerticalLine - 1)]; const SegmentIntersection &it_other = vline_other.intersections[iIntersectionOther]; assert(it_other.is_inner()); - assert(iIntersectionOther > 0); - assert(iIntersectionOther + 1 < vline_other.intersections.size()); + assert(iIntersectionOther > 0 && size_t(iIntersectionOther + 1) < vline_other.intersections.size()); // Is iIntersectionOther at the boundary of a vertical segment? const SegmentIntersection &it_other2 = vline_other.intersections[it_other.is_low() ? iIntersectionOther - 1 : iIntersectionOther + 1]; if (it_other2.is_inner()) @@ -1176,8 +1175,7 @@ static void pinch_contours_insert_phony_outer_intersections(std::vectortype == SegmentIntersection::OUTER_LOW); ++ it; } else { - auto lo = it; - assert(lo->type == SegmentIntersection::INNER_LOW); + assert(it->type == SegmentIntersection::INNER_LOW); auto hi = ++ it; assert(hi->type == SegmentIntersection::INNER_HIGH); auto lo2 = ++ it; @@ -1186,11 +1184,11 @@ static void pinch_contours_insert_phony_outer_intersections(std::vectorvertical_up(); int dn = lo2->vertical_down(); -#ifndef _NDEBUG + assert(up == -1 || up > 0); assert(dn == -1 || dn >= 0); assert((up == -1 && dn == -1) || (dn + 1 == up)); -#endif // _NDEBUG + bool pinched = dn + 1 != up; if (pinched) { // hi is not connected with its inner contour to lo2. @@ -1267,10 +1265,6 @@ static const SegmentIntersection& end_of_vertical_run_raw(const SegmentIntersect } return *it; } -static SegmentIntersection& end_of_vertical_run_raw(SegmentIntersection &start) -{ - return const_cast(end_of_vertical_run_raw(std::as_const(start))); -} // Find the last INNER_HIGH intersection starting with INNER_LOW, that is followed by OUTER_HIGH intersection, traversing vertical up contours if enabled. // Such intersection shall always exist. @@ -1383,7 +1377,7 @@ static void traverse_graph_generate_polylines( bool try_connect = false; if (going_up) { assert(! it->consumed_vertical_up); - assert(i_intersection + 1 < vline.intersections.size()); + assert(size_t(i_intersection + 1) < vline.intersections.size()); // Step back to the beginning of the vertical segment to mark it as consumed. if (it->is_inner()) { assert(i_intersection > 0); @@ -1395,7 +1389,7 @@ static void traverse_graph_generate_polylines( it->consumed_vertical_up = true; ++ it; ++ i_intersection; - assert(i_intersection < vline.intersections.size()); + assert(size_t(i_intersection) < vline.intersections.size()); } while (it->type != SegmentIntersection::OUTER_HIGH); if ((it - 1)->is_inner()) { // Step back. @@ -1815,7 +1809,7 @@ static std::vector generate_montonous_regions(std::vector ®ions, con map_intersection_to_region_end.emplace_back(&segs[region.right.vline].intersections[region.right.low], ®ion); } auto intersections_lower = [](const MapType &l, const MapType &r){ return l.first < r.first ; }; - auto intersections_equal = [](const MapType &l, const MapType &r){ return l.first == r.first ; }; - std::sort(map_intersection_to_region_start.begin(), map_intersection_to_region_start.end(), intersections_lower); + std::sort(map_intersection_to_region_start.begin(), map_intersection_to_region_start.end(), intersections_lower); std::sort(map_intersection_to_region_end.begin(), map_intersection_to_region_end.end(), intersections_lower); // Scatter links to neighboring regions. @@ -2193,7 +2186,7 @@ static std::vector chain_monotonic_regions( }; std::vector next_candidates; - auto validate_unprocessed = + [[maybe_unused]]auto validate_unprocessed = #ifdef NDEBUG []() { return true; }; #else @@ -2222,7 +2215,7 @@ static std::vector chain_monotonic_regions( } else { // Some left neihgbor should not be processed yet. assert(left_neighbors_unprocessed[i] > 1); - size_t num_predecessors_unprocessed = 0; + int32_t num_predecessors_unprocessed = 0; bool has_left_last_on_path = false; for (const MonotonicRegion* left : region.left_neighbors) { size_t iprev = left - regions.data(); @@ -2290,8 +2283,7 @@ static std::vector chain_monotonic_regions( NextCandidate next_candidate; next_candidate.probability = 0; for (MonotonicRegion *next : region.right_neighbors) { - int &unprocessed = left_neighbors_unprocessed[next - regions.data()]; - assert(unprocessed > 1); + assert(left_neighbors_unprocessed[next - regions.data()] > 1); if (left_neighbors_unprocessed[next - regions.data()] == 2) { // Dependencies of the successive blocks are satisfied. AntPath &path1 = path_matrix(region, dir, *next, false); @@ -2844,8 +2836,6 @@ bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillPar coord_t line_spacing = coord_t(scale_(this->spacing) / params.density); std::pair rotate_vector = this->_infill_direction(surface); for (const SweepParams &sweep : sweep_params) { - size_t n_fill_lines_initial = fill_lines.size(); - // Rotate polygons so that we can work with vertical lines here double angle = rotate_vector.first + sweep.angle_base; ExPolygonWithOffset poly_with_offset(poly_with_offset_base, - angle); diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index d553d727a36..52861afba0a 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -50,11 +50,6 @@ const std::string GCodeProcessor::Width_Tag = "WIDTH:"; const std::string GCodeProcessor::Mm3_Per_Mm_Tag = "MM3_PER_MM:"; #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING -static bool is_valid_extrusion_role(int value) -{ - return (static_cast(erNone) <= value) && (value <= static_cast(erMixed)); -} - static void set_option_value(ConfigOptionFloats& option, size_t id, float value) { if (id < option.values.size()) @@ -2343,7 +2338,7 @@ void GCodeProcessor::process_T(const GCodeReader::GCodeLine& line) void GCodeProcessor::process_T(const std::string_view command) { if (command.length() > 1) { - int eid; + int eid = 0; if (! parse_number(command.substr(1), eid) || eid < 0 || eid > 255) { // T-1 is a valid gcode line for RepRap Firmwares (used to deselects all tools) see https://github.com/prusa3d/PrusaSlicer/issues/5677 if ((m_flavor != gcfRepRapFirmware && m_flavor != gcfRepRapSprinter) || eid != -1) diff --git a/src/libslic3r/LayerRegion.cpp b/src/libslic3r/LayerRegion.cpp index 5ce56896d86..b3383fcc5a1 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -59,7 +59,7 @@ void LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollec const PrintRegionConfig ®ion_config = this->region()->config(); // This needs to be in sync with PrintObject::_slice() slicing_mode_normal_below_layer! bool spiral_vase = print_config.spiral_vase && - (this->layer()->id() >= region_config.bottom_solid_layers.value && + (this->layer()->id() >= size_t(region_config.bottom_solid_layers.value) && this->layer()->print_z >= region_config.bottom_solid_min_thickness - EPSILON); PerimeterGenerator g( diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index b57ff0e14ee..c0f193f0551 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -1145,33 +1145,26 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla for (const auto §ion : tree) { PresetCollection *presets = nullptr; - std::vector *loaded = nullptr; std::string preset_name; PhysicalPrinterCollection *ph_printers = nullptr; std::string ph_printer_name; if (boost::starts_with(section.first, "print:")) { presets = &this->prints; - loaded = &loaded_prints; preset_name = section.first.substr(6); } else if (boost::starts_with(section.first, "filament:")) { presets = &this->filaments; - loaded = &loaded_filaments; preset_name = section.first.substr(9); } else if (boost::starts_with(section.first, "sla_print:")) { presets = &this->sla_prints; - loaded = &loaded_sla_prints; preset_name = section.first.substr(10); } else if (boost::starts_with(section.first, "sla_material:")) { presets = &this->sla_materials; - loaded = &loaded_sla_materials; preset_name = section.first.substr(13); } else if (boost::starts_with(section.first, "printer:")) { presets = &this->printers; - loaded = &loaded_printers; preset_name = section.first.substr(8); } else if (boost::starts_with(section.first, "physical_printer:")) { ph_printers = &this->physical_printers; - loaded = &loaded_physical_printers; ph_printer_name = section.first.substr(17); } else if (section.first == "presets") { // Load the names of the active presets. From 2d32c80b75437d4aa94fa7a47e4e13cc826ccc79 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 14 Jan 2021 13:00:03 +0100 Subject: [PATCH 098/143] Fixing GCC warnings 2 --- src/libslic3r/Fill/Fill.cpp | 1 - src/libslic3r/PerimeterGenerator.cpp | 8 ++-- src/libslic3r/SLA/SupportPointGenerator.cpp | 2 - src/libslic3r/ShortestPath.cpp | 22 ++++------- src/libslic3r/VoronoiOffset.cpp | 2 + src/slic3r/GUI/ConfigWizard.cpp | 16 ++++---- src/slic3r/GUI/Field.cpp | 6 +-- src/slic3r/GUI/NotificationManager.cpp | 42 +++++++++------------ src/slic3r/GUI/NotificationManager.hpp | 15 +++++--- src/slic3r/GUI/OG_CustomCtrl.cpp | 2 +- src/slic3r/GUI/OptionsGroup.cpp | 15 ++++---- src/slic3r/GUI/PrintHostDialogs.cpp | 2 +- src/slic3r/GUI/Tab.cpp | 9 +---- 13 files changed, 61 insertions(+), 81 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 6dbfa18fae3..18e03e0058c 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -512,7 +512,6 @@ void Layer::make_ironing() }; std::vector by_extruder; - bool extruder_dont_care = this->object()->config().wipe_into_objects; double default_layer_height = this->object()->config().layer_height; for (LayerRegion *layerm : m_regions) diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index a29f293ce5e..7a4bbe27ae9 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -166,7 +166,7 @@ static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perime (float)perimeter_generator.layer_height); // get overhang paths by checking what parts of this loop fall - // outside the grown lower slices (thus where the distance between + // outside the grown lower slices (thus where the distance between // the loop centerline and original lower slices is >= half nozzle diameter extrusion_paths_append( paths, @@ -396,8 +396,8 @@ void PerimeterGenerator::process() } // fuzzy skin configuration - double fuzzy_skin_thickness; - double fuzzy_skin_point_dist; + double fuzzy_skin_thickness = scale_(this->object_config->fuzzy_skin_thickness); + double fuzzy_skin_point_dist = scale_(this->object_config->fuzzy_skin_point_dist); //FuzzyShape fuzzy_skin_shape; if (this->object_config->fuzzy_skin_perimeter_mode != FuzzySkinPerimeterMode::None) { /* @@ -419,8 +419,6 @@ void PerimeterGenerator::process() break; } */ - fuzzy_skin_thickness = scale_(this->object_config->fuzzy_skin_thickness); - fuzzy_skin_point_dist = scale_(this->object_config->fuzzy_skin_point_dist); } // we need to process each island separately because we might have different diff --git a/src/libslic3r/SLA/SupportPointGenerator.cpp b/src/libslic3r/SLA/SupportPointGenerator.cpp index 8f720339abc..7a4c2906850 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.cpp +++ b/src/libslic3r/SLA/SupportPointGenerator.cpp @@ -304,8 +304,6 @@ void SupportPointGenerator::add_support_points(SupportPointGenerator::Structure float tp = m_config.tear_pressure(); float current = s.supports_force_total(); - static constexpr float DANGL_DAMPING = .5f; - static constexpr float SLOPE_DAMPING = .1f; if (s.islands_below.empty()) { // completely new island - needs support no doubt diff --git a/src/libslic3r/ShortestPath.cpp b/src/libslic3r/ShortestPath.cpp index 3d5903df130..daffcd5f281 100644 --- a/src/libslic3r/ShortestPath.cpp +++ b/src/libslic3r/ShortestPath.cpp @@ -21,7 +21,7 @@ template std::vector> chain_segments_closest_point(std::vector &end_points, KDTreeType &kdtree, CouldReverseFunc &could_reverse_func, EndPointType &first_point) { assert((end_points.size() & 1) == 0); - size_t num_segments = end_points.size() / 2; + size_t num_segments = end_points.size() / 2; assert(num_segments >= 2); for (EndPointType &ep : end_points) ep.chain_id = 0; @@ -1553,9 +1553,7 @@ static inline void reorder_by_two_exchanges_with_segment_flipping(std::vector::max(); size_t crossover2_pos_final = std::numeric_limits::max(); size_t crossover_flip_final = 0; - for (const std::pair &first_crossover_candidate : connection_lengths) { - double longest_connection_length = first_crossover_candidate.first; - size_t longest_connection_idx = first_crossover_candidate.second; + for (const auto& [longest_connection_length, longest_connection_idx] : connection_lengths) { connection_tried[longest_connection_idx] = true; // Find the second crossover connection with the lowest total chain cost. size_t crossover_pos_min = std::numeric_limits::max(); @@ -1630,12 +1628,9 @@ static inline void reorder_by_three_exchanges_with_segment_flipping(std::vector< size_t crossover2_pos_final = std::numeric_limits::max(); size_t crossover3_pos_final = std::numeric_limits::max(); size_t crossover_flip_final = 0; - for (const std::pair &first_crossover_candidate : connection_lengths) { - double longest_connection_length = first_crossover_candidate.first; - size_t longest_connection_idx = first_crossover_candidate.second; - connection_tried[longest_connection_idx] = true; + for (const auto& [longest_connection_length, longest_connection_idx] : connection_lengths) { + connection_tried[longest_connection_idx] = true; // Find the second crossover connection with the lowest total chain cost. - size_t crossover_pos_min = std::numeric_limits::max(); double crossover_cost_min = connections.back().cost; for (size_t j = 1; j < connections.size(); ++ j) if (! connection_tried[j]) { @@ -1789,12 +1784,9 @@ static inline void reorder_by_three_exchanges_with_segment_flipping2(std::vector #else /* NDEBUG */ Matrixd segment_end_point_distance_matrix = Matrixd::Constant(4 * 4, 4 * 4, std::numeric_limits::max()); #endif /* NDEBUG */ - for (const std::pair &first_crossover_candidate : connection_lengths) { - double longest_connection_length = first_crossover_candidate.first; - size_t longest_connection_idx = first_crossover_candidate.second; - connection_tried[longest_connection_idx] = true; - // Find the second crossover connection with the lowest total chain cost. - size_t crossover_pos_min = std::numeric_limits::max(); + for (const auto& [longest_connection_length, longest_connection_idx] : connection_lengths) { + connection_tried[longest_connection_idx] = true; + // Find the second crossover connection with the lowest total chain cost. double crossover_cost_min = connections.back().cost; for (size_t j = 1; j < connections.size(); ++ j) if (! connection_tried[j]) { diff --git a/src/libslic3r/VoronoiOffset.cpp b/src/libslic3r/VoronoiOffset.cpp index c0541bd9f96..f328a8ab230 100644 --- a/src/libslic3r/VoronoiOffset.cpp +++ b/src/libslic3r/VoronoiOffset.cpp @@ -561,9 +561,11 @@ Polygons voronoi_offset( const Point &pt = cell->contains_point() ? ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b) : ((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b); + #ifndef NDEBUG const Line &line = cell->contains_segment() ? line0 : line1; assert(pt == line.a || pt == line.b); assert((pt.cast() - Vec2d(v0->x(), v0->y())).norm() < SCALED_EPSILON); + #endif // NDEBUG Vec2d dir(v1->x() - v0->x(), v1->y() - v0->y()); double l2 = dir.squaredNorm(); if (offset_distance2 <= l2) { diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index 5af48ee368b..568c15a1654 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -734,7 +734,7 @@ void PageMaterials::set_compatible_printers_html_window(const std::vector%s", boost::nowide::widen(printer_names[i])); if (i % 3 == 2) { @@ -830,7 +830,7 @@ void PageMaterials::update_lists(int sel_printer, int sel_type, int sel_vendor) } } if (sel_printers[0] != 0) { - for (size_t i = 0; i < sel_printers_count; i++) { + for (int i = 0; i < sel_printers_count; i++) { const std::string& printer_name = list_printer->get_data(sel_printers[i]); const Preset* printer = nullptr; for (const Preset* it : materials->printers) { @@ -881,7 +881,7 @@ void PageMaterials::update_lists(int sel_printer, int sel_type, int sel_vendor) if (sel_printers_count != 0 && sel_type != wxNOT_FOUND) { const std::string& type = list_type->get_data(sel_type); // find printer preset - for (size_t i = 0; i < sel_printers_count; i++) { + for (int i = 0; i < sel_printers_count; i++) { const std::string& printer_name = list_printer->get_data(sel_printers[i]); const Preset* printer = nullptr; for (const Preset* it : materials->printers) { @@ -917,7 +917,7 @@ void PageMaterials::update_lists(int sel_printer, int sel_type, int sel_vendor) const std::string& vendor = list_vendor->get_data(sel_vendor); // finst printer preset std::vector to_list; - for (size_t i = 0; i < sel_printers_count; i++) { + for (int i = 0; i < sel_printers_count; i++) { const std::string& printer_name = list_printer->get_data(sel_printers[i]); const Preset* printer = nullptr; for (const Preset* it : materials->printers) { @@ -986,7 +986,7 @@ void PageMaterials::sort_list_data(StringList* list, bool add_All_item, bool mat const ConfigOptionDef* def = print_config_def.get("filament_type"); std::vectorenum_values = def->enum_values; - int end_of_sorted = 0; + size_t end_of_sorted = 0; for (size_t vals = 0; vals < enum_values.size(); vals++) { for (size_t profs = end_of_sorted; profs < other_profiles.size(); profs++) { @@ -1044,13 +1044,11 @@ void PageMaterials::sort_list_data(PresetList* list, const std::vectorClear(); - //for (const auto& item : prusa_profiles) - for (int i = 0; i < prusa_profiles.size(); ++i) { + for (size_t i = 0; i < prusa_profiles.size(); ++i) { list->append(std::string(prusa_profiles[i].name) + (prusa_profiles[i].omnipresent ? "" : " *"), &const_cast(prusa_profiles[i].name.get())); list->Check(i, prusa_profiles[i].checked); } - //for (const auto& item : other_profiles) - for (int i = 0; i < other_profiles.size(); ++i) { + for (size_t i = 0; i < other_profiles.size(); ++i) { list->append(std::string(other_profiles[i].name) + (other_profiles[i].omnipresent ? "" : " *"), &const_cast(other_profiles[i].name.get())); list->Check(i + prusa_profiles.size(), other_profiles[i].checked); } diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index dfe95e71e6a..fc8b25efad3 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -1028,7 +1028,7 @@ void Choice::set_selection() } if (!text_value.IsEmpty()) { - int idx = 0; + size_t idx = 0; for (auto el : m_opt.enum_values) { if (el == text_value) break; @@ -1375,7 +1375,7 @@ void ColourPicker::msw_rescale() size.SetHeight(m_opt.height * m_em_unit); else if (parent_is_custom_ctrl && opt_height > 0) size.SetHeight(lround(opt_height * m_em_unit)); - if (m_opt.width >= 0) size.SetWidth(m_opt.width * m_em_unit); + if (m_opt.width >= 0) size.SetWidth(m_opt.width * m_em_unit); if (parent_is_custom_ctrl) field->SetSize(size); else @@ -1402,7 +1402,7 @@ void PointCtrl::BUILD() if (parent_is_custom_ctrl && m_opt.height < 0) opt_height = (double)x_textctrl->GetSize().GetHeight() / m_em_unit; - x_textctrl->SetFont(Slic3r::GUI::wxGetApp().normal_font()); + x_textctrl->SetFont(Slic3r::GUI::wxGetApp().normal_font()); x_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT); y_textctrl->SetFont(Slic3r::GUI::wxGetApp().normal_font()); y_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT); diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 98cbf1e550f..b0d0a556c6c 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -392,18 +392,18 @@ void NotificationManager::PopNotification::count_spaces() } void NotificationManager::PopNotification::init() { - std::string text = m_text1 + " " + m_hypertext; - int last_end = 0; - m_lines_count = 0; + std::string text = m_text1 + " " + m_hypertext; + size_t last_end = 0; + m_lines_count = 0; count_spaces(); - + // count lines m_endlines.clear(); while (last_end < text.length() - 1) { - int next_hard_end = text.find_first_of('\n', last_end); - if (next_hard_end > 0 && ImGui::CalcTextSize(text.substr(last_end, next_hard_end - last_end).c_str()).x < m_window_width - m_window_width_offset) { + size_t next_hard_end = text.find_first_of('\n', last_end); + if (next_hard_end != std::string::npos && ImGui::CalcTextSize(text.substr(last_end, next_hard_end - last_end).c_str()).x < m_window_width - m_window_width_offset) { //next line is ended by '/n' m_endlines.push_back(next_hard_end); last_end = next_hard_end + 1; @@ -411,9 +411,9 @@ void NotificationManager::PopNotification::init() // find next suitable endline if (ImGui::CalcTextSize(text.substr(last_end).c_str()).x >= m_window_width - m_window_width_offset) { // more than one line till end - int next_space = text.find_first_of(' ', last_end); + size_t next_space = text.find_first_of(' ', last_end); if (next_space > 0) { - int next_space_candidate = text.find_first_of(' ', next_space + 1); + size_t next_space_candidate = text.find_first_of(' ', next_space + 1); while (next_space_candidate > 0 && ImGui::CalcTextSize(text.substr(last_end, next_space_candidate - last_end).c_str()).x < m_window_width - m_window_width_offset) { next_space = next_space_candidate; next_space_candidate = text.find_first_of(' ', next_space + 1); @@ -456,7 +456,6 @@ void NotificationManager::PopNotification::set_next_window_size(ImGuiWrapper& im void NotificationManager::PopNotification::render_text(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { ImVec2 win_size(win_size_x, win_size_y); - ImVec2 win_pos(win_pos_x, win_pos_y); float x_offset = m_left_indentation; std::string fulltext = m_text1 + m_hypertext; //+ m_text2; ImVec2 text_size = ImGui::CalcTextSize(fulltext.c_str()); @@ -594,8 +593,6 @@ void NotificationManager::PopNotification::render_close_button(ImGuiWrapper& img { ImVec2 win_size(win_size_x, win_size_y); ImVec2 win_pos(win_pos_x, win_pos_y); - ImVec4 orange_color = ImGui::GetStyleColorVec4(ImGuiCol_Button); - orange_color.w = 0.8f; ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); Notifications_Internal::push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_fading_out, m_current_fade_opacity); @@ -831,9 +828,7 @@ void NotificationManager::SlicingCompleteLargeNotification::render_text(ImGuiWra if (!m_is_large) PopNotification::render_text(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); else { - ImVec2 win_size(win_size_x, win_size_y); - ImVec2 win_pos(win_pos_x, win_pos_y); - + ImVec2 win_size(win_size_x, win_size_y); ImVec2 text1_size = ImGui::CalcTextSize(m_text1.c_str()); float x_offset = m_left_indentation; std::string fulltext = m_text1 + m_hypertext + m_text2; @@ -889,15 +884,12 @@ void NotificationManager::ExportFinishedNotification::count_spaces() void NotificationManager::ExportFinishedNotification::render_text(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { - ImVec2 win_size(win_size_x, win_size_y); - ImVec2 win_pos(win_pos_x, win_pos_y); float x_offset = m_left_indentation; std::string fulltext = m_text1 + m_hypertext; //+ m_text2; - ImVec2 text_size = ImGui::CalcTextSize(fulltext.c_str()); // Lines are always at least two and m_multiline is always true for ExportFinishedNotification. // First line has "Export Finished" text and than hyper text open folder. // Following lines are path to gcode. - int last_end = 0; + size_t last_end = 0; float starting_y = m_line_height / 2;//10; float shift_y = m_line_height;// -m_line_height / 20; for (size_t i = 0; i < m_lines_count; i++) { @@ -926,8 +918,6 @@ void NotificationManager::ExportFinishedNotification::render_eject_button(ImGuiW { ImVec2 win_size(win_size_x, win_size_y); ImVec2 win_pos(win_pos_x, win_pos_y); - ImVec4 orange_color = ImGui::GetStyleColorVec4(ImGuiCol_Button); - orange_color.w = 0.8f; ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); Notifications_Internal::push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_fading_out, m_current_fade_opacity); @@ -1003,7 +993,6 @@ void NotificationManager::ProgressBarNotification::render_text(ImGuiWrapper& img } void NotificationManager::ProgressBarNotification::render_bar(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { - float bar_y = win_size_y / 2 - win_size_y / 6 + m_line_height; ImVec4 orange_color = ImVec4(.99f, .313f, .0f, 1.0f); float invisible_length = 0;//((float)(m_data.duration - m_remaining_time) / (float)m_data.duration * win_size_x); //invisible_length -= win_size_x / ((float)m_data.duration * 60.f) * (60 - m_countdown_frame); @@ -1141,12 +1130,17 @@ void NotificationManager::push_slicing_complete_notification(int timestamp, bool int time = 10; if (has_slicing_error_notification()) return; - if (large) { + if (large) { hypertext = _u8L("Export G-Code."); time = 0; } - NotificationData data{ NotificationType::SlicingComplete, NotificationLevel::RegularNotification, time, _u8L("Slicing finished."), hypertext, [](wxEvtHandler* evnthndlr){ - if (evnthndlr != nullptr) wxPostEvent(evnthndlr, ExportGcodeNotificationClickedEvent(EVT_EXPORT_GCODE_NOTIFICAION_CLICKED)); return true; } }; + NotificationData data{ NotificationType::SlicingComplete, NotificationLevel::RegularNotification, time, _u8L("Slicing finished."), hypertext, + [](wxEvtHandler* evnthndlr){ + if (evnthndlr != nullptr) + wxPostEvent(evnthndlr, ExportGcodeNotificationClickedEvent(EVT_EXPORT_GCODE_NOTIFICAION_CLICKED)); + return true; + } + }; push_notification_data(std::make_unique(data, m_id_provider, m_evt_handler, large), timestamp); } void NotificationManager::set_slicing_complete_print_time(const std::string &info) diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 9252190efca..e3e50a3e377 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -339,14 +339,14 @@ class NotificationManager // Height of text // Used as basic scaling unit! float m_line_height; - std::vector m_endlines; + std::vector m_endlines; // Gray are f.e. eorrors when its uknown if they are still valid bool m_is_gray { false }; //if multiline = true, notification is showing all lines(>2) bool m_multiline { false }; // True if minimized button is rendered, helps to decide where is area for invisible close button bool m_minimize_b_visible { false }; - int m_lines_count{ 1 }; + size_t m_lines_count{ 1 }; // Target for wxWidgets events sent by clicking on the hyperlink available at some notifications. wxEvtHandler* m_evt_handler; }; @@ -366,7 +366,7 @@ class NotificationManager override; bool m_is_large; bool m_has_print_info { false }; - std::string m_print_info { std::string() }; + std::string m_print_info; }; class SlicingWarningNotification : public PopNotification @@ -471,8 +471,13 @@ class NotificationManager {NotificationType::Mouse3dDisconnected, NotificationLevel::RegularNotification, 10, _u8L("3D Mouse disconnected.") }, // {NotificationType::Mouse3dConnected, NotificationLevel::RegularNotification, 5, _u8L("3D Mouse connected.") }, // {NotificationType::NewPresetsAviable, NotificationLevel::ImportantNotification, 20, _u8L("New Presets are available."), _u8L("See here.") }, - {NotificationType::PresetUpdateAvailable, NotificationLevel::ImportantNotification, 20, _u8L("Configuration update is available."), _u8L("See more."), [](wxEvtHandler* evnthndlr){ - if (evnthndlr != nullptr) wxPostEvent(evnthndlr, PresetUpdateAvailableClickedEvent(EVT_PRESET_UPDATE_AVAILABLE_CLICKED)); return true; }}, + {NotificationType::PresetUpdateAvailable, NotificationLevel::ImportantNotification, 20, _u8L("Configuration update is available."), _u8L("See more."), + [](wxEvtHandler* evnthndlr) { + if (evnthndlr != nullptr) + wxPostEvent(evnthndlr, PresetUpdateAvailableClickedEvent(EVT_PRESET_UPDATE_AVAILABLE_CLICKED)); + return true; + } + }, {NotificationType::NewAppAvailable, NotificationLevel::ImportantNotification, 20, _u8L("New version is available."), _u8L("See Releases page."), [](wxEvtHandler* evnthndlr){ wxLaunchDefaultBrowser("https://github.com/prusa3d/PrusaSlicer/releases"); return true; }}, {NotificationType::EmptyColorChangeCode, NotificationLevel::RegularNotification, 10, diff --git a/src/slic3r/GUI/OG_CustomCtrl.cpp b/src/slic3r/GUI/OG_CustomCtrl.cpp index 1e581e70ba7..6433bf2d136 100644 --- a/src/slic3r/GUI/OG_CustomCtrl.cpp +++ b/src/slic3r/GUI/OG_CustomCtrl.cpp @@ -98,7 +98,7 @@ void OG_CustomCtrl::init_ctrl_lines() ctrl_lines.emplace_back(CtrlLine(height, this, line, false, opt_group->staticbox)); } else - int i = 0; + assert(false); } } diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 5f93916455c..8f5e2024146 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -250,9 +250,8 @@ void OptionsGroup::activate_line(Line& line) if (custom_ctrl) m_use_custom_ctrl_as_parent = true; - // if we have an extra column, build it - if (extra_column) - { + // if we have an extra column, build it + if (extra_column) { m_extra_column_item_ptrs.push_back(extra_column(this->ctrl_parent(), line)); grid_sizer->Add(m_extra_column_item_ptrs.back(), 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 3); } @@ -309,8 +308,8 @@ void OptionsGroup::activate_line(Line& line) auto sizer = new wxBoxSizer(wxHORIZONTAL); if (!custom_ctrl) grid_sizer->Add(sizer, 0, wxEXPAND | (staticbox ? wxALL : wxBOTTOM | wxTOP | wxLEFT), staticbox ? 0 : 1); - // If we have a single option with no sidetext just add it directly to the grid sizer - if (option_set.size() == 1 && option_set.front().opt.sidetext.size() == 0 && + // If we have a single option with no sidetext just add it directly to the grid sizer + if (option_set.size() == 1 && option_set.front().opt.sidetext.size() == 0 && option_set.front().opt.label.empty() && option_set.front().side_widget == nullptr && line.get_extra_widgets().size() == 0) { const auto& option = option_set.front(); @@ -319,16 +318,16 @@ void OptionsGroup::activate_line(Line& line) if (!custom_ctrl) { if (is_window_field(field)) sizer->Add(field->getWindow(), option.opt.full_width ? 1 : 0, - wxBOTTOM | wxTOP | (option.opt.full_width ? wxEXPAND : wxALIGN_CENTER_VERTICAL), (wxOSX || !staticbox) ? 0 : 2); + wxBOTTOM | wxTOP | (option.opt.full_width ? int(wxEXPAND) : int(wxALIGN_CENTER_VERTICAL)), (wxOSX || !staticbox) ? 0 : 2); if (is_sizer_field(field)) - sizer->Add(field->getSizer(), 1, option.opt.full_width ? wxEXPAND : wxALIGN_CENTER_VERTICAL, 0); + sizer->Add(field->getSizer(), 1, (option.opt.full_width ? int(wxEXPAND) : int(wxALIGN_CENTER_VERTICAL)), 0); } return; } for (auto opt : option_set) { ConfigOptionDef option = opt.opt; - wxSizer* sizer_tmp = sizer; + wxSizer* sizer_tmp = sizer; // add label if any if (!option.label.empty() && !custom_ctrl) { //! To correct translation by context have to use wxGETTEXT_IN_CONTEXT macro from wxWidget 3.1.1 diff --git a/src/slic3r/GUI/PrintHostDialogs.cpp b/src/slic3r/GUI/PrintHostDialogs.cpp index 75f6d265d84..cb4c2229926 100644 --- a/src/slic3r/GUI/PrintHostDialogs.cpp +++ b/src/slic3r/GUI/PrintHostDialogs.cpp @@ -333,7 +333,7 @@ void PrintHostQueueDialog::on_cancel(Event &evt) void PrintHostQueueDialog::get_active_jobs(std::vector>& ret) { int ic = job_list->GetItemCount(); - for (size_t i = 0; i < ic; i++) + for (int i = 0; i < ic; i++) { auto item = job_list->RowToItem(i); auto data = job_list->GetItemData(item); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 974b709f7c2..eb9659c8ab0 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -411,11 +411,6 @@ Slic3r::GUI::PageShp Tab::add_options_page(const wxString& title, const std::str } } // Initialize the page. -#ifdef __WXOSX__ - auto panel = m_tmp_panel; -#else - auto panel = this; -#endif PageShp page(new Page(m_page_view, title, icon_idx)); // page->SetBackgroundStyle(wxBG_STYLE_SYSTEM); #ifdef __WINDOWS__ @@ -2999,8 +2994,8 @@ void Tab::update_btns_enabling() // we can delete any preset from the physical printer // and any user preset const Preset& preset = m_presets->get_edited_preset(); - m_btn_delete_preset->Show(m_type == Preset::TYPE_PRINTER && m_preset_bundle->physical_printers.has_selection() || - !preset.is_default && !preset.is_system); + m_btn_delete_preset->Show((m_type == Preset::TYPE_PRINTER && m_preset_bundle->physical_printers.has_selection()) + || (!preset.is_default && !preset.is_system)); if (m_btn_edit_ph_printer) m_btn_edit_ph_printer->SetToolTip( m_preset_bundle->physical_printers.has_selection() ? From d9c9de8eeec623d2c56e7c499d35f84ef7b88090 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 29 Jan 2021 07:39:27 +0100 Subject: [PATCH 099/143] Fixing GCC warnings 3 --- src/slic3r/GUI/BonjourDialog.cpp | 24 ++++++++++++++++-------- src/slic3r/GUI/BonjourDialog.hpp | 1 + src/slic3r/GUI/DoubleSlider.cpp | 22 +++++++++++----------- src/slic3r/GUI/GCodeViewer.cpp | 21 +++++++++++---------- src/slic3r/GUI/GCodeViewer.hpp | 2 +- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- src/slic3r/GUI/GUI_App.cpp | 2 +- src/slic3r/GUI/GUI_Preview.cpp | 14 +++++++------- src/slic3r/GUI/InstanceCheck.cpp | 4 ++-- src/slic3r/GUI/Plater.cpp | 12 +++++++----- src/slic3r/GUI/PresetComboBoxes.cpp | 2 +- src/slic3r/GUI/Search.cpp | 6 ------ src/slic3r/GUI/Selection.cpp | 2 +- src/slic3r/GUI/UnsavedChangesDialog.cpp | 2 +- src/slic3r/GUI/fts_fuzzy_match.h | 13 +++++++------ 15 files changed, 68 insertions(+), 61 deletions(-) diff --git a/src/slic3r/GUI/BonjourDialog.cpp b/src/slic3r/GUI/BonjourDialog.cpp index 8ee01c94931..51f18dce720 100644 --- a/src/slic3r/GUI/BonjourDialog.cpp +++ b/src/slic3r/GUI/BonjourDialog.cpp @@ -108,8 +108,7 @@ bool BonjourDialog::show_and_lookup() timer->SetOwner(this); timer_state = 1; timer->Start(1000); - wxTimerEvent evt_dummy; - on_timer(evt_dummy); + on_timer_process(); // The background thread needs to queue messages for this dialog // and for that it needs a valid pointer to it (mandated by the wxWidgets API). @@ -214,18 +213,27 @@ void BonjourDialog::on_reply(BonjourReplyEvent &e) } void BonjourDialog::on_timer(wxTimerEvent &) +{ + on_timer_process(); +} + +// This is here so the function can be bound to wxEVT_TIMER and also called +// explicitly (wxTimerEvent should not be created by user code). +void BonjourDialog::on_timer_process() { const auto search_str = _utf8(L("Searching for devices")); - if (timer_state > 0) { - const std::string dots(timer_state, '.'); + if (timer_state > 0) { + const std::string dots(timer_state, '.'); label->SetLabel(GUI::from_u8((boost::format("%1% %2%") % search_str % dots).str())); - timer_state = (timer_state) % 3 + 1; - } else { + timer_state = (timer_state) % 3 + 1; + } else { label->SetLabel(GUI::from_u8((boost::format("%1%: %2%") % search_str % (_utf8(L("Finished"))+".")).str())); - timer->Stop(); - } + timer->Stop(); + } } + + } diff --git a/src/slic3r/GUI/BonjourDialog.hpp b/src/slic3r/GUI/BonjourDialog.hpp index a9a33d5229b..def0838d7e0 100644 --- a/src/slic3r/GUI/BonjourDialog.hpp +++ b/src/slic3r/GUI/BonjourDialog.hpp @@ -43,6 +43,7 @@ class BonjourDialog: public wxDialog void on_reply(BonjourReplyEvent &); void on_timer(wxTimerEvent &); + void on_timer_process(); }; diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 7ee5579e7c1..1e4eed1e8c6 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -317,7 +317,7 @@ double Control::get_double_value(const SelectedSlider& selection) { if (m_values.empty() || m_lower_value<0) return 0.0; - if (m_values.size() <= m_higher_value) { + if (m_values.size() <= size_t(m_higher_value)) { correct_higher_value(); return m_values.back(); } @@ -621,7 +621,7 @@ static std::string short_and_splitted_time(const std::string& time) ::sprintf(buffer, "%dh%dm%ds", hours, minutes, seconds); else if (hours > 10 && minutes > 10 && seconds > 10) ::sprintf(buffer, "%dh\n%dm\n%ds", hours, minutes, seconds); - else if (minutes < 10 && seconds > 10 || minutes > 10 && seconds < 10) + else if ((minutes < 10 && seconds > 10) || (minutes > 10 && seconds < 10)) ::sprintf(buffer, "%dh\n%dm%ds", hours, minutes, seconds); else ::sprintf(buffer, "%dh%dm\n%ds", hours, minutes, seconds); @@ -639,15 +639,15 @@ static std::string short_and_splitted_time(const std::string& time) wxString Control::get_label(int tick, LabelType label_type/* = ltHeightWithLayer*/) const { - const int value = tick; + const size_t value = tick; if (m_label_koef == 1.0 && m_values.empty()) - return wxString::Format("%d", value); + return wxString::Format("%lu", static_cast(value)); if (value >= m_values.size()) return "ErrVal"; if (m_draw_mode == dmSequentialGCodeView) - return wxString::Format("%d", static_cast(m_values[value])); + return wxString::Format("%lu", static_cast(m_values[value])); else { if (label_type == ltEstimatedTime) { return (value < m_layers_times.size()) ? short_and_splitted_time(get_time_dhms(m_layers_times[value])) : ""; @@ -762,7 +762,7 @@ void Control::draw_ticks_pair(wxDC& dc, wxCoord pos, wxCoord mid, int tick_len) dc.DrawLine(mid - (mid_space + tick_len), pos, mid - mid_space, pos); is_horizontal() ? dc.DrawLine(pos, mid + (mid_space + tick_len), pos, mid + mid_space) : dc.DrawLine(mid + (mid_space + tick_len), pos, mid + mid_space, pos); -}; +} void Control::draw_ticks(wxDC& dc) { @@ -773,8 +773,8 @@ void Control::draw_ticks(wxDC& dc) int height, width; get_size(&width, &height); const wxCoord mid = is_horizontal() ? 0.5*height : 0.5*width; - for (auto tick : m_ticks.ticks) { - if (tick.tick >= m_values.size()) { + for (const TickCode& tick : m_ticks.ticks) { + if (size_t(tick.tick) >= m_values.size()) { // The case when OnPaint is called before m_ticks.ticks data are updated (specific for the vase mode) break; } @@ -927,7 +927,6 @@ void Control::Ruler::update(wxWindow* win, const std::vector& values, do auto end_it = count == 1 ? values.end() : values.begin() + lround(values.size() / count); while (pow < 3) { - int tick = 0; for (int istep : {1, 2, 5}) { double val = (double)istep * std::pow(10,pow); auto val_it = std::lower_bound(values.begin(), end_it, val - epsilon()); @@ -970,7 +969,7 @@ void Control::draw_ruler(wxDC& dc) dc.SetTextForeground(GREY_PEN.GetColour()); if (m_ruler.long_step < 0) - for (int tick = 1; tick < m_values.size(); tick++) { + for (size_t tick = 1; tick < m_values.size(); tick++) { wxCoord pos = get_position_from_value(tick); draw_ticks_pair(dc, pos, mid, 5); draw_tick_text(dc, wxPoint(mid, pos), tick); @@ -986,7 +985,7 @@ void Control::draw_ruler(wxDC& dc) } }; - double short_tick; + double short_tick = std::nan(""); int tick = 0; double value = 0.0; int sequence = 0; @@ -1003,6 +1002,7 @@ void Control::draw_ruler(wxDC& dc) if (m_values[tick] < value) break; // short ticks from the last tick to the end of current sequence + assert(! std::isnan(short_tick)); draw_short_ticks(dc, short_tick, tick); sequence++; } diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index a9e9d6a0354..8fac1373331 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1596,8 +1596,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) Vec3f prev_up = prev_right.cross(prev_dir); Vec3f next_dir = (next - curr).normalized(); - Vec3f next_right = Vec3f(next_dir[1], -next_dir[0], 0.0f).normalized(); - Vec3f next_up = next_right.cross(next_dir); bool is_right_turn = prev_up.dot(prev_dir.cross(next_dir)) <= 0.0f; float cos_dir = prev_dir.dot(next_dir); @@ -2671,13 +2669,13 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool }; auto is_travel_in_layers_range = [this](size_t path_id, size_t min_id, size_t max_id) { - auto is_in_z_range = [](const Path& path, double min_z, double max_z) { - auto in_z_range = [min_z, max_z](double z) { - return min_z - EPSILON < z && z < max_z + EPSILON; - }; - - return in_z_range(path.sub_paths.front().first.position[2]) || in_z_range(path.sub_paths.back().last.position[2]); - }; + // auto is_in_z_range = [](const Path& path, double min_z, double max_z) { + // auto in_z_range = [min_z, max_z](double z) { + // return min_z - EPSILON < z && z < max_z + EPSILON; + // }; + // + // return in_z_range(path.sub_paths.front().first.position[2]) || in_z_range(path.sub_paths.back().last.position[2]); + // }; const TBuffer& buffer = m_buffers[buffer_id(EMoveType::Travel)]; if (path_id >= buffer.paths.size()) @@ -3396,7 +3394,7 @@ void GCodeViewer::render_toolpaths() const { case TBuffer::ERenderPrimitiveType::Point: { - EOptionsColors color; + EOptionsColors color = EOptionsColors(0); switch (buffer_type(i)) { case EMoveType::Tool_change: { color = EOptionsColors::ToolChanges; break; } @@ -3405,6 +3403,7 @@ void GCodeViewer::render_toolpaths() const case EMoveType::Custom_GCode: { color = EOptionsColors::CustomGCodes; break; } case EMoveType::Retract: { color = EOptionsColors::Retractions; break; } case EMoveType::Unretract: { color = EOptionsColors::Unretractions; break; } + default: { assert(false); break; } } render_as_points(buffer, static_cast(j), color, *shader); break; @@ -4101,6 +4100,7 @@ void GCodeViewer::render_legend() const imgui.text(_u8L("Estimated printing time") + " [" + _u8L("Stealth mode") + "]:"); break; } + default : { assert(false); break; } } ImGui::SameLine(); imgui.text(short_time(get_time_dhms(time_mode.time))); @@ -4132,6 +4132,7 @@ void GCodeViewer::render_legend() const show_mode_button(_L("Show normal mode"), PrintEstimatedTimeStatistics::ETimeMode::Normal); break; } + default : { assert(false); break; } } } diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 836014ad35b..a4663dc04c9 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -610,7 +610,7 @@ class GCodeViewer const BoundingBoxf3& get_paths_bounding_box() const { return m_paths_bounding_box; } const BoundingBoxf3& get_max_bounding_box() const { return m_max_bounding_box; } - const std::vector& get_layers_zs() const { return m_layers.get_zs(); }; + const std::vector& get_layers_zs() const { return m_layers.get_zs(); } const SequentialView& get_sequential_view() const { return m_sequential_view; } void update_sequential_view_current(unsigned int first, unsigned int last); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 0ff2fef80fb..6332a7837e5 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5822,7 +5822,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c int get_color_idx_for_tool_change(std::vector::const_iterator it, const int extruder) const { const int current_extruder = it->extruder == 0 ? extruder : it->extruder; - if (number_tools() == extruders_cnt + 1) // there is no one "M600" + if (number_tools() == size_t(extruders_cnt + 1)) // there is no one "M600" return std::min(extruders_cnt - 1, std::max(current_extruder - 1, 0)); auto it_n = it; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index e144df6d036..085bdb865ab 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -325,7 +325,7 @@ class SplashScreen : public wxSplashScreen size_t cur_len = 0; wxString longest_sub_string; - auto get_longest_sub_string = [longest_sub_string, input](wxString &longest_sub_str, int cur_len, size_t i) { + auto get_longest_sub_string = [input](wxString &longest_sub_str, size_t cur_len, size_t i) { if (cur_len > longest_sub_str.Len()) longest_sub_str = input.SubString(i - cur_len + 1, i); }; diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index b460ac736c4..3a1ec46f2e0 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -496,13 +496,6 @@ void Preview::on_combochecklist_features(wxCommandEvent& evt) void Preview::on_combochecklist_options(wxCommandEvent& evt) { - auto xored = [](unsigned int flags1, unsigned int flags2, unsigned int flag) { - auto is_flag_set = [](unsigned int flags, unsigned int flag) { - return (flags & (1 << flag)) != 0; - }; - return !is_flag_set(flags1, flag) != !is_flag_set(flags2, flag); - }; - unsigned int curr_flags = m_canvas->get_gcode_options_visibility_flags(); unsigned int new_flags = Slic3r::GUI::combochecklist_get_flags(m_combochecklist_options); if (curr_flags == new_flags) @@ -513,6 +506,13 @@ void Preview::on_combochecklist_options(wxCommandEvent& evt) #if ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE m_canvas->refresh_gcode_preview_render_paths(); #else + auto xored = [](unsigned int flags1, unsigned int flags2, unsigned int flag) { + auto is_flag_set = [](unsigned int flags, unsigned int flag) { + return (flags & (1 << flag)) != 0; + }; + return !is_flag_set(flags1, flag) != !is_flag_set(flags2, flag); + }; + bool skip_refresh = xored(curr_flags, new_flags, static_cast(OptionType::Shells)) || xored(curr_flags, new_flags, static_cast(OptionType::ToolMarker)); diff --git a/src/slic3r/GUI/InstanceCheck.cpp b/src/slic3r/GUI/InstanceCheck.cpp index 6cfa879c830..73bbeda353e 100644 --- a/src/slic3r/GUI/InstanceCheck.cpp +++ b/src/slic3r/GUI/InstanceCheck.cpp @@ -41,7 +41,7 @@ namespace instance_check_internal //if (argc < 2) // return ret; std::vector arguments { argv[0] }; - for (size_t i = 1; i < argc; ++i) { + for (int i = 1; i < argc; ++i) { const std::string token = argv[i]; // Processing of boolean command line arguments shall match DynamicConfig::read_cli(). if (token == "--single-instance") @@ -180,7 +180,7 @@ namespace instance_check_internal if ( !checker->IsAnotherRunning() ) */ { DBusMessage* msg; - DBusMessageIter args; + // DBusMessageIter args; DBusConnection* conn; DBusError err; dbus_uint32_t serial = 0; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index ae9e58a9576..8b427457900 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2524,7 +2524,7 @@ std::vector Plater::priv::load_model_objects(const ModelObjectPtrs &mode const Vec3d bed_size = Slic3r::to_3d(bed_shape.size().cast(), 1.0) - 2.0 * Vec3d::Ones(); #ifndef AUTOPLACEMENT_ON_LOAD - bool need_arrange = false; + // bool need_arrange = false; #endif /* AUTOPLACEMENT_ON_LOAD */ bool scaled_down = false; std::vector obj_idxs; @@ -2544,7 +2544,7 @@ std::vector Plater::priv::load_model_objects(const ModelObjectPtrs &mode new_instances.emplace_back(object->add_instance()); #else /* AUTOPLACEMENT_ON_LOAD */ // if object has no defined position(s) we need to rearrange everything after loading - need_arrange = true; + // need_arrange = true; // add a default instance and center object around origin object->center_around_origin(); // also aligns object to Z = 0 ModelInstance* instance = object->add_instance(); @@ -3687,9 +3687,8 @@ bool Plater::priv::warnings_dialog() if (current_warnings.empty()) return true; std::string text = _u8L("There are active warnings concerning sliced models:") + "\n"; - bool empt = true; for (auto const& it : current_warnings) { - int next_n = it.first.message.find_first_of('\n', 0); + size_t next_n = it.first.message.find_first_of('\n', 0); text += "\n"; if (next_n != std::string::npos) text += it.first.message.substr(0, next_n); @@ -5052,6 +5051,10 @@ bool Plater::load_files(const wxArrayString& filenames) load_files(in_paths, false, true); break; } + case LoadType::Unknown : { + assert(false); + break; + } } return true; @@ -5925,7 +5928,6 @@ void Plater::force_print_bed_update() void Plater::on_activate() { #if defined(__linux__) || defined(_WIN32) - wxWindow *focus_window = wxWindow::FindFocus(); // Activating the main frame, and no window has keyboard focus. // Set the keyboard focus to the visible Canvas3D. if (this->p->view3D->IsShown() && wxWindow::FindFocus() != this->p->view3D->get_wxglcanvas()) diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index a13924ccb75..ed8824a67d1 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -759,7 +759,7 @@ void PlaterPresetComboBox::update() this->Clear(); invalidate_selection(); - const Preset* selected_filament_preset; + const Preset* selected_filament_preset = nullptr; std::string extruder_color; if (m_type == Preset::TYPE_FILAMENT) { diff --git a/src/slic3r/GUI/Search.cpp b/src/slic3r/GUI/Search.cpp index 738d5e435a4..2b7b3f3d9d5 100644 --- a/src/slic3r/GUI/Search.cpp +++ b/src/slic3r/GUI/Search.cpp @@ -117,12 +117,6 @@ void OptionsSearcher::append_options(DynamicPrintConfig* config, Preset::Type ty } } -// Wrap a string with ColorMarkerStart and ColorMarkerEnd symbols -static wxString wrap_string(const wxString& str) -{ - return wxString::Format("%c%s%c", ImGui::ColorMarkerStart, str, ImGui::ColorMarkerEnd); -} - // Mark a string using ColorMarkerStart and ColorMarkerEnd symbols static std::wstring mark_string(const std::wstring &str, const std::vector &matches, Preset::Type type, PrinterTechnology pt) { diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index cdd3ebe855c..1cb599fc808 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -2092,7 +2092,7 @@ static bool is_rotation_xy_synchronized(const Vec3d &rot_xyz_from, const Vec3d & static void verify_instances_rotation_synchronized(const Model &model, const GLVolumePtrs &volumes) { - for (size_t idx_object = 0; idx_object < model.objects.size(); ++idx_object) { + for (int idx_object = 0; idx_object < int(model.objects.size()); ++idx_object) { int idx_volume_first = -1; for (int i = 0; i < (int)volumes.size(); ++i) { if (volumes[i]->object_idx() == idx_object) { diff --git a/src/slic3r/GUI/UnsavedChangesDialog.cpp b/src/slic3r/GUI/UnsavedChangesDialog.cpp index b4b38b4bd2a..cd5183cb312 100644 --- a/src/slic3r/GUI/UnsavedChangesDialog.cpp +++ b/src/slic3r/GUI/UnsavedChangesDialog.cpp @@ -989,7 +989,7 @@ wxString UnsavedChangesDialog::get_short_string(wxString full_string) { int max_len = 30; if (full_string.IsEmpty() || full_string.StartsWith("#") || - (full_string.Find("\n") == wxNOT_FOUND && full_string.Length() < max_len)) + (full_string.Find("\n") == wxNOT_FOUND && full_string.Length() < size_t(max_len))) return full_string; m_has_long_strings = true; diff --git a/src/slic3r/GUI/fts_fuzzy_match.h b/src/slic3r/GUI/fts_fuzzy_match.h index 4b474451c4f..379fd9c74ea 100644 --- a/src/slic3r/GUI/fts_fuzzy_match.h +++ b/src/slic3r/GUI/fts_fuzzy_match.h @@ -62,13 +62,13 @@ namespace fts { } // Public interface - static bool fuzzy_match(char_type const * pattern, char_type const * str, int & outScore) { + [[maybe_unused]] static bool fuzzy_match(char_type const * pattern, char_type const * str, int & outScore) { pos_type matches[max_matches + 1]; // with the room for the stopper matches[0] = stopper; return fuzzy_match(pattern, str, outScore, matches); } - static bool fuzzy_match(char_type const * pattern, char_type const * str, int & outScore, pos_type * matches) { + [[maybe_unused]] static bool fuzzy_match(char_type const * pattern, char_type const * str, int & outScore, pos_type * matches) { int recursionCount = 0; static constexpr int recursionLimit = 10; return fuzzy_internal::fuzzy_match_recursive(pattern, str, outScore, str, nullptr, matches, 0, recursionCount, recursionLimit); @@ -114,14 +114,15 @@ namespace fts { while (*pattern != '\0' && *str != '\0') { int num_matched = std::towlower(*pattern) == std::towlower(*str) ? 1 : 0; - bool folded_match = false; - if (! num_matched) { + // bool folded_match = false; + + if (! num_matched) { wchar_t tmp[4]; wchar_t *end = Slic3r::fold_to_ascii(*str, tmp); wchar_t *c = tmp; for (const wchar_t* d = pattern; c != end && *d != 0 && std::towlower(*c) == std::towlower(*d); ++c, ++d); if (c == end) { - folded_match = true; + // folded_match = true; num_matched = end - tmp; } } @@ -169,7 +170,7 @@ namespace fts { if (matched) { static constexpr int sequential_bonus = 15; // bonus for adjacent matches static constexpr int separator_bonus = 10/*30*/; // bonus if match occurs after a separator - static constexpr int camel_bonus = 30; // bonus if match is uppercase and prev is lower + // static constexpr int camel_bonus = 30; // bonus if match is uppercase and prev is lower static constexpr int first_letter_bonus = 15; // bonus if the first letter is matched static constexpr int leading_letter_penalty = -1/*-5*/; // penalty applied for every letter in str before the first match From dc4bdad84a3b342e105f247afb8edfc3a9304eff Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 29 Jan 2021 14:47:41 +0100 Subject: [PATCH 100/143] Fixed some more GCC warnings --- src/libslic3r/Fill/FillRectilinear.cpp | 5 +++-- src/libslic3r/PresetBundle.cpp | 7 +++---- src/libslic3r/ShortestPath.cpp | 9 ++++++--- src/slic3r/GUI/PresetComboBoxes.cpp | 2 +- tests/libslic3r/test_elephant_foot_compensation.cpp | 3 +++ tests/libslic3r/test_marchingsquares.cpp | 2 ++ 6 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp index 99d25b52a7f..d6e400837e4 100644 --- a/src/libslic3r/Fill/FillRectilinear.cpp +++ b/src/libslic3r/Fill/FillRectilinear.cpp @@ -2178,11 +2178,11 @@ static std::vector chain_monotonic_regions( float best_path_length = std::numeric_limits::max(); struct NextCandidate { - MonotonicRegion *region; + MonotonicRegion *region = nullptr; AntPath *link; AntPath *link_flipped; float probability; - bool dir; + bool dir = false; }; std::vector next_candidates; @@ -2317,6 +2317,7 @@ static std::vector chain_monotonic_regions( queue.pop_back(); } // Extend the path. + assert(next_candidate.region); MonotonicRegion *next_region = next_candidate.region; bool next_dir = next_candidate.dir; total_length += next_region->length(next_dir) + path_matrix(*path_end.region, path_end.flipped, *next_region, next_dir).length; diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index c0f193f0551..d9b1ed76ef8 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -800,10 +800,9 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool compatible_printers_condition = compatible_printers_condition_values[1]; compatible_prints_condition = compatible_prints_condition_values.front(); Preset *loaded = nullptr; - if (is_external) { - auto [aloaded, modified] = this->filaments.load_external_preset(name_or_path, name, old_filament_profile_names->values.front(), config); - loaded = aloaded; - } else { + if (is_external) + loaded = this->filaments.load_external_preset(name_or_path, name, old_filament_profile_names->values.front(), config).first; + else { // called from Config Wizard. loaded= &this->filaments.load_preset(this->filaments.path_from_name(name), name, config); loaded->save(); diff --git a/src/libslic3r/ShortestPath.cpp b/src/libslic3r/ShortestPath.cpp index daffcd5f281..facedec3fb6 100644 --- a/src/libslic3r/ShortestPath.cpp +++ b/src/libslic3r/ShortestPath.cpp @@ -1553,7 +1553,8 @@ static inline void reorder_by_two_exchanges_with_segment_flipping(std::vector::max(); size_t crossover2_pos_final = std::numeric_limits::max(); size_t crossover_flip_final = 0; - for (const auto& [longest_connection_length, longest_connection_idx] : connection_lengths) { + for (const std::pair& first_crossover_candidate : connection_lengths) { + size_t longest_connection_idx = first_crossover_candidate.second; connection_tried[longest_connection_idx] = true; // Find the second crossover connection with the lowest total chain cost. size_t crossover_pos_min = std::numeric_limits::max(); @@ -1628,7 +1629,8 @@ static inline void reorder_by_three_exchanges_with_segment_flipping(std::vector< size_t crossover2_pos_final = std::numeric_limits::max(); size_t crossover3_pos_final = std::numeric_limits::max(); size_t crossover_flip_final = 0; - for (const auto& [longest_connection_length, longest_connection_idx] : connection_lengths) { + for (const std::pair &first_crossover_candidate : connection_lengths) { + size_t longest_connection_idx = first_crossover_candidate.second; connection_tried[longest_connection_idx] = true; // Find the second crossover connection with the lowest total chain cost. double crossover_cost_min = connections.back().cost; @@ -1784,7 +1786,8 @@ static inline void reorder_by_three_exchanges_with_segment_flipping2(std::vector #else /* NDEBUG */ Matrixd segment_end_point_distance_matrix = Matrixd::Constant(4 * 4, 4 * 4, std::numeric_limits::max()); #endif /* NDEBUG */ - for (const auto& [longest_connection_length, longest_connection_idx] : connection_lengths) { + for (const std::pair &first_crossover_candidate : connection_lengths) { + size_t longest_connection_idx = first_crossover_candidate.second; connection_tried[longest_connection_idx] = true; // Find the second crossover connection with the lowest total chain cost. double crossover_cost_min = connections.back().cost; diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index ed8824a67d1..60bb9a5aeb6 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -201,7 +201,7 @@ void PresetComboBox::update_selection() if (!cell) return; - g_object_set(G_OBJECT(cell), "ellipsize", PANGO_ELLIPSIZE_END, NULL); + g_object_set(G_OBJECT(cell), "ellipsize", PANGO_ELLIPSIZE_END, (char*)NULL); // Only the list of cells must be freed, the renderer isn't ours to free g_list_free(cells); diff --git a/tests/libslic3r/test_elephant_foot_compensation.cpp b/tests/libslic3r/test_elephant_foot_compensation.cpp index a571e8d0350..180f678c562 100644 --- a/tests/libslic3r/test_elephant_foot_compensation.cpp +++ b/tests/libslic3r/test_elephant_foot_compensation.cpp @@ -16,6 +16,7 @@ using namespace Slic3r; namespace Slic3r { ClipperLib::Path mittered_offset_path_scaled(const Points& contour, const std::vector& deltas, double miter_limit); +#if 0 static Points mittered_offset_path_scaled_points(const Points& contour, const std::vector& deltas, double miter_limit) { Points out; @@ -29,6 +30,7 @@ namespace Slic3r { } return out; } +#endif } static ExPolygon spirograph_gear_1mm() @@ -494,6 +496,7 @@ SCENARIO("Elephant foot compensation", "[ElephantFoot]") { ExPolygon input = spirograph_gear_1mm().simplify(SCALED_EPSILON).front(); ExPolygon output; std::vector deltas(input.contour.points.size(), scale_(1.)); + // mittered_offset_path_scaled_points is commented out somewhere above output.contour.points = Slic3r::mittered_offset_path_scaled_points(input.contour.points, deltas, 2.); #ifdef TESTS_EXPORT_SVGS { diff --git a/tests/libslic3r/test_marchingsquares.cpp b/tests/libslic3r/test_marchingsquares.cpp index e9e016157ec..1a4b1fb72f4 100644 --- a/tests/libslic3r/test_marchingsquares.cpp +++ b/tests/libslic3r/test_marchingsquares.cpp @@ -326,7 +326,9 @@ static void recreate_object_from_rasters(const std::string &objname, float lh) { double disp_w = 120.96; double disp_h = 68.04; +#ifndef NDEBUG size_t cntr = 0; +#endif for (ExPolygons &layer : layers) { auto rst = create_raster(res, disp_w, disp_h); From a116914fceb56bc6b8c8962db3589d021e31af52 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 29 Jan 2021 16:34:22 +0100 Subject: [PATCH 101/143] WIP VoronoiOffset: Squash merge of vb_voronoi_offset Working contour offsetting, skeleton_edges_rough() to detect "important" skeleton edges. Radius of an inscribed circle along the "important" skeleton edges changes slowly, therefore these "important" skeleton edges signify oblong regions possibly needing a gap fill. --- src/libslic3r/Point.hpp | 2 +- src/libslic3r/VoronoiOffset.cpp | 1699 +++++++++++++++++++------- src/libslic3r/VoronoiOffset.hpp | 130 +- src/libslic3r/VoronoiVisualUtils.hpp | 118 +- src/libslic3r/libslic3r.h | 10 + tests/libslic3r/test_voronoi.cpp | 601 ++++++++- 6 files changed, 2015 insertions(+), 545 deletions(-) diff --git a/src/libslic3r/Point.hpp b/src/libslic3r/Point.hpp index a6525af4ea9..d11af8b58cb 100644 --- a/src/libslic3r/Point.hpp +++ b/src/libslic3r/Point.hpp @@ -417,7 +417,7 @@ namespace boost { namespace polygon { typedef coord_t coordinate_type; static inline coordinate_type get(const Slic3r::Point& point, orientation_2d orient) { - return (coordinate_type)point((orient == HORIZONTAL) ? 0 : 1); + return static_cast(point((orient == HORIZONTAL) ? 0 : 1)); } }; diff --git a/src/libslic3r/VoronoiOffset.cpp b/src/libslic3r/VoronoiOffset.cpp index f328a8ab230..7ad0f7af4b3 100644 --- a/src/libslic3r/VoronoiOffset.cpp +++ b/src/libslic3r/VoronoiOffset.cpp @@ -1,18 +1,20 @@ // Polygon offsetting using Voronoi diagram prodiced by boost::polygon. #include "VoronoiOffset.hpp" +#include "libslic3r.h" #include // #define VORONOI_DEBUG_OUT +#include + #ifdef VORONOI_DEBUG_OUT #include #endif namespace Slic3r { - -using VD = Geometry::VoronoiDiagram; +namespace Voronoi { namespace detail { // Intersect a circle with a ray, return the two parameters. @@ -22,9 +24,11 @@ namespace detail { { const Vec2d d = pt - center; #ifndef NDEBUG + // Start point should be inside, end point should be outside the circle. double d0 = (pt - center).norm(); double d1 = (pt + v - center).norm(); - assert(r < std::max(d0, d1) + EPSILON); + assert(d0 < r + SCALED_EPSILON); + assert(d1 > r - SCALED_EPSILON); #endif /* NDEBUG */ const double a = v.squaredNorm(); const double b = 2. * d.dot(v); @@ -194,242 +198,1135 @@ namespace detail { return out; } + // Double vertex equal to a coord_t point after conversion to double. + template + inline bool vertex_equal_to_point(const VertexType &vertex, const Point &ipt) + { + // Convert ipt to doubles, force the 80bit FPU temporary to 64bit and then compare. + // This should work with any settings of math compiler switches and the C++ compiler + // shall understand the memcpies as type punning and it shall optimize them out. +#if 1 + using ulp_cmp_type = boost::polygon::detail::ulp_comparison; + ulp_cmp_type ulp_cmp; + static constexpr int ULPS = boost::polygon::voronoi_diagram_traits::vertex_equality_predicate_type::ULPS; + return ulp_cmp(vertex.x(), double(ipt.x()), ULPS) == ulp_cmp_type::EQUAL && + ulp_cmp(vertex.y(), double(ipt.y()), ULPS) == ulp_cmp_type::EQUAL; +#else + volatile double u = static_cast(ipt.x()); + volatile double v = vertex.x(); + if (u != v) + return false; + u = static_cast(ipt.y()); + v = vertex.y(); + return u == v; +#endif + }; + bool vertex_equal_to_point(const VD::vertex_type *vertex, const Point &ipt) + { return vertex_equal_to_point(*vertex, ipt); } + + double dist_to_site(const Lines &lines, const VD::cell_type &cell, const Vec2d &point) + { + const Line &line = lines[cell.source_index()]; + return cell.contains_point() ? + (((cell.source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line.a : line.b).cast() - point).norm() : + (Geometry::foot_pt(line.a.cast(), (line.b - line.a).cast(), point) - point).norm(); + }; + + bool on_site(const Lines &lines, const VD::cell_type &cell, const Vec2d &pt) + { + const Line &line = lines[cell.source_index()]; + auto on_contour = [&pt](const Point &ipt) { return detail::vertex_equal_to_point(pt, ipt); }; + if (cell.contains_point()) { + return on_contour(contour_point(cell, line)); + } else { + assert(! (on_contour(line.a) && on_contour(line.b))); + return on_contour(line.a) || on_contour(line.b); + } + }; + + // For a Voronoi segment starting with voronoi_point1 and ending with voronoi_point2, + // defined by a bisector of Voronoi sites pt1_site and pt2_site (line) + // find two points on the Voronoi bisector, that delimit regions with dr/dl measure + // lower / higher than threshold_dr_dl. + // + // Linear segment from voronoi_point1 to return.first and + // linear segment from return.second to voronoi_point2 have dr/dl measure + // higher than threshold_dr_dl. + // If such respective segment does not exist, then return.first resp. return.second is nan. + std::pair point_point_dr_dl_thresholds( + // Two Voronoi sites + const Point &pt1_site, const Point &pt2_site, + // End points of a Voronoi segment + const Vec2d &voronoi_point1, const Vec2d &voronoi_point2, + // Threshold of the skeleton function, where alpha is an angle of a sharp convex corner with the same dr/dl. + const double threshold_tan_alpha_half) + { + // sympy code to calculate +-x + // of a linear bisector of pt1_site, pt2_site parametrized with pt + x * v, |v| = 1 + // where dr/dl = threshold_dr_dl + // equals d|pt1_site - pt + x * v| / dx = threshold_dr_dl + // + // y = sqrt(x^2 + d^2) + // dy = diff(y, x) + // solve(dy - c, x) + // + // Project voronoi_point1/2 to line_site. + Vec2d dir_y = (pt2_site - pt1_site).cast(); + Vec2d dir_x = Vec2d(- dir_y.y(), dir_y.x()).normalized(); + Vec2d cntr = 0.5 * (pt1_site.cast() + pt2_site.cast()); + double t1 = (voronoi_point1 - cntr).dot(dir_x); + double t2 = (voronoi_point2 - cntr).dot(dir_x); + if (t1 > t2) { + t1 = -t1; + t2 = -t2; + dir_x = - dir_x; + } + auto x = 0.5 * dir_y.norm() * threshold_tan_alpha_half; + static constexpr double nan = std::numeric_limits::quiet_NaN(); + auto out = std::make_pair(Vec2d(nan, nan), Vec2d(nan, nan)); + if (t2 > -x && t1 < x) { + // Intervals overlap. + dir_x *= x; + out.first = (t1 < -x) ? cntr - dir_x : voronoi_point1; + out.second = (t2 > +x) ? cntr + dir_x : voronoi_point2; + } + return out; + } + + // For a Voronoi segment starting with voronoi_point1 and ending with voronoi_point2, + // defined by a bisector of Voronoi sites pt_site and line site (parabolic arc) + // find two points on the Voronoi parabolic arc, that delimit regions with dr/dl measure + // lower / higher than threshold_dr_dl. + // + // Parabolic arc from voronoi_point1 to return.first and + // parabolic arc from return.second to voronoi_point2 have dr/dl measure + // higher than threshold_dr_dl. + // If such respective segment does not exist, then return.first resp. return.second is nan. + std::pair point_segment_dr_dl_thresholds( + // Two Voronoi sites + const Point &pt_site, const Line &line_site, + // End points of a Voronoi segment + const Vec2d &voronoi_point1, const Vec2d &voronoi_point2, + // Threshold of the skeleton function, where alpha is an angle of a sharp convex corner with the same dr/dl. + const double threshold_tan_alpha_half) + { + // sympy code to calculate +-x + // of a parabola y = ax^2 + b + // where dr/dl = threshold_dr_dl + // + // a = 1 / (4 * b) + // y = a*x**2 + b + // dy = diff(y, x) + // solve(dy / sqrt(1 + dy**2) - c, x) + // + // Foot point of the point site on the line site. + Vec2d ft = Geometry::foot_pt(line_site, pt_site); + // Minimum distance of the bisector (parabolic arc) from the two sites, squared. + Vec2d dir_pt_ft = pt_site.cast() - ft; + double b = 0.5 * dir_pt_ft.norm(); + static constexpr double nan = std::numeric_limits::quiet_NaN(); + auto out = std::make_pair(Vec2d(nan, nan), Vec2d(nan, nan)); + { + // +x, -x are the two parameters along the line_site, where threshold_tan_alpha_half is met. + double x = 2. * b * threshold_tan_alpha_half; + // Project voronoi_point1/2 to line_site. + Vec2d dir_x = (line_site.b - line_site.a).cast().normalized(); + double t1 = (voronoi_point1 - ft).dot(dir_x); + double t2 = (voronoi_point2 - ft).dot(dir_x); + if (t1 > t2) { + t1 = -t1; + t2 = -t2; + dir_x = - dir_x; + } + if (t2 > -x && t1 < x) { + // Intervals overlap. + bool t1_valid = t1 < -x; + bool t2_valid = t2 > +x; + // Direction of the Y axis of the parabola. + Vec2d dir_y(- dir_x.y(), dir_x.x()); + // Orient the Y axis towards the point site. + if (dir_y.dot(dir_pt_ft) < 0.) + dir_y = - dir_y; + // Equation of the parabola: y = b + a * x^2 + double a = 0.25 / b; + dir_x *= x; + dir_y *= b + a * x * x; + out.first = t1_valid ? ft - dir_x + dir_y : voronoi_point1; + out.second = t2_valid ? ft + dir_x + dir_y : voronoi_point2; + } + } + return out; + } + + std::pair point_point_skeleton_thresholds( + // Two Voronoi sites + const Point &pt1_site, const Point &pt2_site, + // End points of a Voronoi segment + const Vec2d &voronoi_point1, const Vec2d &voronoi_point2, + // Threshold of the skeleton function. + const double tan_alpha_half) + { + // Project voronoi_point1/2 to line_site. + Vec2d dir_y = (pt2_site - pt1_site).cast(); + Vec2d dir_x = Vec2d(- dir_y.y(), dir_y.x()).normalized(); + Vec2d cntr = 0.5 * (pt1_site.cast() + pt2_site.cast()); + double t1 = (voronoi_point1 - cntr).dot(dir_x); + double t2 = (voronoi_point2 - cntr).dot(dir_x); + if (t1 > t2) { + t1 = -t1; + t2 = -t2; + dir_x = - dir_x; + } + auto x = 0.5 * dir_y.norm() * tan_alpha_half; + static constexpr double nan = std::numeric_limits::quiet_NaN(); + auto out = std::make_pair(Vec2d(nan, nan), Vec2d(nan, nan)); + if (t2 > -x && t1 < x) { + // Intervals overlap. + dir_x *= x; + out.first = (t1 < -x) ? cntr - dir_x : voronoi_point1; + out.second = (t2 > +x) ? cntr + dir_x : voronoi_point2; + } + return out; + } + + std::pair point_segment_skeleton_thresholds( + // Two Voronoi sites + const Point &pt_site, const Line &line_site, + // End points of a Voronoi segment + const Vec2d &voronoi_point1, const Vec2d &voronoi_point2, + // Threshold of the skeleton function. + const double threshold_cos_alpha) + { + // Foot point of the point site on the line site. + Vec2d ft = Geometry::foot_pt(line_site, pt_site); + // Minimum distance of the bisector (parabolic arc) from the two sites, squared. + Vec2d dir_pt_ft = pt_site.cast() - ft; + // Distance of Voronoi point site from the Voronoi line site. + double l = dir_pt_ft.norm(); + static constexpr double nan = std::numeric_limits::quiet_NaN(); + auto out = std::make_pair(Vec2d(nan, nan), Vec2d(nan, nan)); + // +x, -x are the two parameters along the line_site, where threshold is met. + double r = l / (1. + threshold_cos_alpha); + double x2 = r * r - Slic3r::sqr(l - r); + double x = sqrt(x2); + // Project voronoi_point1/2 to line_site. + Vec2d dir_x = (line_site.b - line_site.a).cast().normalized(); + double t1 = (voronoi_point1 - ft).dot(dir_x); + double t2 = (voronoi_point2 - ft).dot(dir_x); + if (t1 > t2) { + t1 = -t1; + t2 = -t2; + dir_x = - dir_x; + } + if (t2 > -x && t1 < x) { + // Intervals overlap. + bool t1_valid = t1 < -x; + bool t2_valid = t2 > +x; + // Direction of the Y axis of the parabola. + Vec2d dir_y(- dir_x.y(), dir_x.x()); + // Orient the Y axis towards the point site. + if (dir_y.dot(dir_pt_ft) < 0.) + dir_y = - dir_y; + // Equation of the parabola: y = b + a * x^2 + double a = 0.5 / l; + dir_x *= x; + dir_y *= 0.5 * l + a * x2; + out.first = t1_valid ? ft - dir_x + dir_y : voronoi_point1; + out.second = t2_valid ? ft + dir_x + dir_y : voronoi_point2; + } + return out; + } + } // namespace detail -Polygons voronoi_offset( - const Geometry::VoronoiDiagram &vd, - const Lines &lines, - double offset_distance, - double discretization_error) -{ #ifndef NDEBUG +namespace debug +{ // Verify that twin halfedges are stored next to the other in vd. - for (size_t i = 0; i < vd.num_edges(); i += 2) { - const VD::edge_type &e = vd.edges()[i]; - const VD::edge_type &e2 = vd.edges()[i + 1]; - assert(e.twin() == &e2); - assert(e2.twin() == &e); - assert(e.is_secondary() == e2.is_secondary()); - if (e.is_secondary()) { - assert(e.cell()->contains_point() != e2.cell()->contains_point()); - const VD::edge_type &ex = (e.cell()->contains_point() ? e : e2); - // Verify that the Point defining the cell left of ex is an end point of a segment - // defining the cell right of ex. - const Line &line0 = lines[ex.cell()->source_index()]; - const Line &line1 = lines[ex.twin()->cell()->source_index()]; - const Point &pt = (ex.cell()->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b; - assert(pt == line1.a || pt == line1.b); + bool verify_twin_halfedges_successive(const VD &vd, const Lines &lines) + { + for (size_t i = 0; i < vd.num_edges(); i += 2) { + const VD::edge_type &e = vd.edges()[i]; + const VD::edge_type &e2 = vd.edges()[i + 1]; + assert(e.twin() == &e2); + assert(e2.twin() == &e); + assert(e.is_secondary() == e2.is_secondary()); + if (e.is_secondary()) { + assert(e.cell()->contains_point() != e2.cell()->contains_point()); + const VD::edge_type &ex = (e.cell()->contains_point() ? e : e2); + // Verify that the Point defining the cell left of ex is an end point of a segment + // defining the cell right of ex. + const Line &line0 = lines[ex.cell()->source_index()]; + const Line &line1 = lines[ex.twin()->cell()->source_index()]; + const Point &pt = (ex.cell()->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b; + assert(pt == line1.a || pt == line1.b); + } + } + return true; + } + + bool verify_inside_outside_annotations(const VD &vd) + { + // Verify that "Colors" are set at all Voronoi entities. + for (const VD::vertex_type &v : vd.vertices()) { + assert(! v.is_degenerate()); + assert(vertex_category(v) != VertexCategory::Unknown); + } + for (const VD::edge_type &e : vd.edges()) + assert(edge_category(e) != EdgeCategory::Unknown); + for (const VD::cell_type &c : vd.cells()) { + // Unfortunately denegerate cells could be created, which reference a null edge. + // https://github.com/boostorg/polygon/issues/47 + assert(c.is_degenerate() || cell_category(c) != CellCategory::Unknown); + } + + // Verify consistency between markings of Voronoi cells, edges and verticies. + for (const VD::cell_type &cell : vd.cells()) { + if (cell.is_degenerate()) { + // Unfortunately denegerate cells could be created, which reference a null edge. + // https://github.com/boostorg/polygon/issues/47 + continue; + } + const VD::edge_type *first_edge = cell.incident_edge(); + const VD::edge_type *edge = first_edge; + CellCategory cc = cell_category(cell); + size_t num_vertices_on_contour = 0; + size_t num_vertices_inside = 0; + size_t num_vertices_outside = 0; + size_t num_edges_point_to_contour = 0; + size_t num_edges_point_inside = 0; + size_t num_edges_point_outside = 0; + do { + { + EdgeCategory ec = edge_category(edge); + switch (ec) { + case EdgeCategory::PointsInside: + assert(edge->vertex0() != nullptr && edge->vertex1() != nullptr); + ++ num_edges_point_inside; break; + case EdgeCategory::PointsOutside: +// assert(edge->vertex0() != nullptr); + ++ num_edges_point_outside; break; + case EdgeCategory::PointsToContour: + assert(edge->vertex1() != nullptr); + ++ num_edges_point_to_contour; break; + default: + assert(false); + } + } + { + VertexCategory vc = (edge->vertex1() == nullptr) ? VertexCategory::Outside : vertex_category(edge->vertex1()); + switch (vc) { + case VertexCategory::Inside: + ++ num_vertices_inside; break; + case VertexCategory::Outside: + ++ num_vertices_outside; break; + case VertexCategory::OnContour: + ++ num_vertices_on_contour; break; + default: + assert(false); + } + } + { + const VD::cell_type *cell_other = edge->twin()->cell(); + const CellCategory cc_other = cell_category(cell_other); + assert(cc_other != CellCategory::Unknown); + switch (cc) { + case CellCategory::Boundary: + assert(cc_other != CellCategory::Boundary || cell_other->contains_segment()); + break; + case CellCategory::Inside: + assert(cc_other == CellCategory::Inside || cc_other ==CellCategory::Boundary); + break; + case CellCategory::Outside: + assert(cc_other == CellCategory::Outside || cc_other == CellCategory::Boundary); + break; + default: + assert(false); + break; + } + } + edge = edge->next(); + } while (edge != first_edge); + + switch (cc) { + case CellCategory::Boundary: + assert(cell.contains_segment()); + assert(num_edges_point_to_contour == 2); + assert(num_vertices_on_contour == 2); + assert(num_vertices_inside > 0); + assert(num_vertices_outside > 0); + assert(num_edges_point_inside > 0); + assert(num_edges_point_outside > 0); + break; + case CellCategory::Inside: + assert(num_vertices_on_contour <= 1); + assert(num_edges_point_to_contour <= 1); + assert(num_vertices_inside > 0); + assert(num_vertices_outside == 0); + assert(num_edges_point_inside > 0); + assert(num_edges_point_outside == 0); + break; + case CellCategory::Outside: + assert(num_vertices_on_contour <= 1); + assert(num_edges_point_to_contour <= 1); + assert(num_vertices_inside == 0); + assert(num_vertices_outside > 0); + assert(num_edges_point_inside == 0); + assert(num_edges_point_outside > 0); + break; + default: + assert(false); + break; + } + } + + return true; + } + + bool verify_vertices_on_contour(const VD &vd, const Lines &lines) + { + for (const VD::edge_type &edge : vd.edges()) { + const VD::vertex_type *v = edge.vertex0(); + if (v != nullptr) { + bool on_contour = vertex_category(v) == VertexCategory::OnContour; + assert(detail::on_site(lines, *edge.cell(), vertex_point(v)) == on_contour); + assert(detail::on_site(lines, *edge.twin()->cell(), vertex_point(v)) == on_contour); + } + } + return true; + } + + bool verify_signed_distances(const VD &vd, const Lines &lines, const std::vector &signed_distances) + { + for (const VD::edge_type &edge : vd.edges()) { + const VD::vertex_type *v = edge.vertex0(); + double d = (v == nullptr) ? std::numeric_limits::max() : signed_distances[v - &vd.vertices().front()]; + if (v == nullptr || vertex_category(v) == VertexCategory::Outside) + assert(d > 0.); + else if (vertex_category(v) == VertexCategory::OnContour) + assert(d == 0.); + else + assert(d < 0.); + if (v != nullptr) { + double err = std::abs(detail::dist_to_site(lines, *edge.cell(), vertex_point(v)) - std::abs(d)); + double err2 = std::abs(detail::dist_to_site(lines, *edge.twin()->cell(), vertex_point(v)) - std::abs(d)); + assert(err < SCALED_EPSILON); + assert(err2 < SCALED_EPSILON); + } } + return true; } + + bool verify_offset_intersection_points(const VD &vd, const Lines &lines, const double offset_distance, const std::vector &offset_intersection_points) + { + const VD::edge_type *front_edge = &vd.edges().front(); + const double d = std::abs(offset_distance); + for (const VD::edge_type &edge : vd.edges()) { + const Vec2d &p = offset_intersection_points[&edge - front_edge]; + if (edge_offset_has_intersection(p)) { + double err = std::abs(detail::dist_to_site(lines, *edge.cell(), p) - d); + double err2 = std::abs(detail::dist_to_site(lines, *edge.twin()->cell(), p) - d); + assert(err < SCALED_EPSILON); + assert(err2 < SCALED_EPSILON); + } + } + return true; + } + +} #endif // NDEBUG - enum class EdgeState : unsigned char { - // Initial state, don't know. - Unknown, - // This edge will certainly not be intersected by the offset curve. - Inactive, - // This edge will certainly be intersected by the offset curve. - Active, - // This edge will possibly be intersected by the offset curve. - Possible - }; +void reset_inside_outside_annotations(VD &vd) +{ + for (const VD::vertex_type &v : vd.vertices()) + set_vertex_category(const_cast(v), VertexCategory::Unknown); + for (const VD::edge_type &e : vd.edges()) + set_edge_category(const_cast(e), EdgeCategory::Unknown); + for (const VD::cell_type &c : vd.cells()) + set_cell_category(const_cast(c), CellCategory::Unknown); +} - enum class CellState : unsigned char { - // Initial state, don't know. - Unknown, - // Inactive cell is inside for outside curves and outside for inside curves. - Inactive, - // Active cell is outside for outside curves and inside for inside curves. - Active, - // Boundary cell is intersected by the input segment, part of it is active. - Boundary - }; +void annotate_inside_outside(VD &vd, const Lines &lines) +{ + assert(debug::verify_twin_halfedges_successive(vd, lines)); + + reset_inside_outside_annotations(vd); + +#ifdef VORONOI_DEBUG_OUT + BoundingBox bbox; + { + bbox.merge(get_extents(lines)); + bbox.min -= (0.01 * bbox.size().cast()).cast(); + bbox.max += (0.01 * bbox.size().cast()).cast(); + } + static int irun = 0; + ++ irun; + dump_voronoi_to_svg(debug_out_path("voronoi-offset-initial-%d.svg", irun).c_str(), vd, Points(), lines); +#endif // VORONOI_DEBUG_OUT - // Mark edges with outward vertex pointing outside the polygons, thus there is a chance - // that such an edge will have an intersection with our desired offset curve. - bool outside = offset_distance > 0.; - std::vector edge_state(vd.num_edges(), EdgeState::Unknown); - std::vector cell_state(vd.num_cells(), CellState::Unknown); - const VD::edge_type *front_edge = &vd.edges().front(); - const VD::cell_type *front_cell = &vd.cells().front(); - auto set_edge_state_initial = [&edge_state, front_edge](const VD::edge_type *edge, EdgeState new_edge_type) { - EdgeState &edge_type = edge_state[edge - front_edge]; - assert(edge_type == EdgeState::Unknown || edge_type == new_edge_type); - assert(new_edge_type == EdgeState::Possible || new_edge_type == EdgeState::Inactive); - edge_type = new_edge_type; + // Set a VertexCategory, verify validity of the operation. + auto annotate_vertex = [](const VD::vertex_type *vertex, VertexCategory new_vertex_category) { + VertexCategory vc = vertex_category(vertex); + assert(vc == VertexCategory::Unknown || vc == new_vertex_category); + assert(new_vertex_category == VertexCategory::Inside || + new_vertex_category == VertexCategory::Outside || + new_vertex_category == VertexCategory::OnContour); + set_vertex_category(const_cast(vertex), new_vertex_category); }; - auto set_edge_state_final = [&edge_state, front_edge](const size_t edge_id, EdgeState new_edge_type) { - EdgeState &edge_type = edge_state[edge_id]; - assert(edge_type == EdgeState::Possible || edge_type == new_edge_type); - assert(new_edge_type == EdgeState::Active || new_edge_type == EdgeState::Inactive); - edge_type = new_edge_type; + + // Set an EdgeCategory, verify validity of the operation. + auto annotate_edge = [](const VD::edge_type *edge, EdgeCategory new_edge_category) { + EdgeCategory ec = edge_category(edge); + assert(ec == EdgeCategory::Unknown || ec == new_edge_category); +#ifndef NDEBUG + switch (new_edge_category) { + case EdgeCategory::PointsInside: + assert(edge->vertex0() != nullptr); + assert(edge->vertex1() != nullptr); + break; + case EdgeCategory::PointsOutside: + // assert(edge->vertex0() != nullptr); + break; + case EdgeCategory::PointsToContour: + assert(edge->vertex1() != nullptr); + break; + default: + assert(false); + } + +#endif // NDEBUG + set_edge_category(const_cast(edge), new_edge_category); }; - auto set_cell_state = [&cell_state, front_cell](const VD::cell_type *cell, CellState new_cell_type) -> bool { - CellState &cell_type = cell_state[cell - front_cell]; - assert(cell_type == CellState::Active || cell_type == CellState::Inactive || cell_type == CellState::Boundary || cell_type == CellState::Unknown); - assert(new_cell_type == CellState::Active || new_cell_type == CellState::Inactive || new_cell_type == CellState::Boundary); - switch (cell_type) { - case CellState::Unknown: + + // Set a CellCategory, verify validity of the operation. + // Handle marking of boundary cells (first time the cell is marked as outside, the other time as inside). + // Returns true if the current cell category was modified. + auto annotate_cell = [](const VD::cell_type *cell, CellCategory new_cell_category) -> bool { + CellCategory cc = cell_category(cell); + assert(cc == CellCategory::Inside || cc == CellCategory::Outside || cc == CellCategory::Boundary || cc == CellCategory::Unknown); + assert(new_cell_category == CellCategory::Inside || new_cell_category == CellCategory::Outside || new_cell_category == CellCategory::Boundary); + switch (cc) { + case CellCategory::Unknown: + // Old category unknown, just write the new category. break; - case CellState::Active: - if (new_cell_type == CellState::Inactive) - new_cell_type = CellState::Boundary; + case CellCategory::Outside: + if (new_cell_category == CellCategory::Inside) + new_cell_category = CellCategory::Boundary; break; - case CellState::Inactive: - if (new_cell_type == CellState::Active) - new_cell_type = CellState::Boundary; + case CellCategory::Inside: + if (new_cell_category == CellCategory::Outside) + new_cell_category = CellCategory::Boundary; break; - case CellState::Boundary: + case CellCategory::Boundary: return false; } - if (cell_type != new_cell_type) { - cell_type = new_cell_type; + if (cc != new_cell_category) { + set_cell_category(const_cast(cell), new_cell_category); return true; } return false; }; + // The next loop is supposed to annotate the "on input contour" vertices, but due to + // merging very close Voronoi vertices together by boost::polygon Voronoi generator + // the condition may not always be met. It should be safe to mark all Voronoi very close + // to the input contour as on contour. + for (const VD::edge_type &edge : vd.edges()) { + const VD::vertex_type *v = edge.vertex0(); + if (v != nullptr) { + bool on_contour = detail::on_site(lines, *edge.cell(), vertex_point(v)); +#ifndef NDEBUG + bool on_contour2 = detail::on_site(lines, *edge.twin()->cell(), vertex_point(v)); + assert(on_contour == on_contour2); +#endif // NDEBUG + if (on_contour) + annotate_vertex(v, VertexCategory::OnContour); + } + } + + // One side of a secondary edge is always on the source contour. Mark these vertices as OnContour. + // See the comment at the loop before, the condition may not always be met. + for (const VD::edge_type &edge : vd.edges()) { + if (edge.is_secondary() && edge.vertex0() != nullptr) { + assert(edge.is_linear()); + assert(edge.cell()->contains_point() != edge.twin()->cell()->contains_point()); + // The point associated with the point site shall be equal with one vertex of this Voronoi edge. + const Point &pt_on_contour = edge.cell()->contains_point() ? contour_point(*edge.cell(), lines) : contour_point(*edge.twin()->cell(), lines); + auto on_contour = [&pt_on_contour](const VD::vertex_type *v) { return detail::vertex_equal_to_point(v, pt_on_contour); }; + if (edge.vertex1() == nullptr) { + assert(on_contour(edge.vertex0())); + annotate_vertex(edge.vertex0(), VertexCategory::OnContour); + } else { + // Only one of the two vertices may lie on input contour. + const VD::vertex_type *v0 = edge.vertex0(); + const VD::vertex_type *v1 = edge.vertex1(); + VertexCategory v0_category = vertex_category(v0); + VertexCategory v1_category = vertex_category(v1); + assert(v0_category != VertexCategory::OnContour || v1_category != VertexCategory::OnContour); + assert(! (on_contour(v0) && on_contour(v1))); + if (on_contour(v0)) + annotate_vertex(v0, VertexCategory::OnContour); + else { + assert(on_contour(v1)); + annotate_vertex(v1, VertexCategory::OnContour); + } + } + } + } + + assert(debug::verify_vertices_on_contour(vd, lines)); + for (const VD::edge_type &edge : vd.edges()) if (edge.vertex1() == nullptr) { // Infinite Voronoi edge separating two Point sites or a Point site and a Segment site. - // Infinite edge is always outside and it has at least one valid vertex. + // Infinite edge is always outside and it references at least one valid vertex. + assert(edge.is_infinite()); + assert(edge.is_linear()); assert(edge.vertex0() != nullptr); - set_edge_state_initial(&edge, outside ? EdgeState::Possible : EdgeState::Inactive); + const VD::cell_type *cell = edge.cell(); + const VD::cell_type *cell2 = edge.twin()->cell(); + // A Point-Segment secondary Voronoi edge touches the input contour, a Point-Point Voronoi + // edge does not. + assert(edge.is_secondary() ? (cell->contains_segment() != cell2->contains_segment()) : + (cell->contains_point() == cell2->contains_point())); + annotate_edge(&edge, EdgeCategory::PointsOutside); // Opposite edge of an infinite edge is certainly not active. - set_edge_state_initial(edge.twin(), EdgeState::Inactive); - if (edge.is_secondary()) { - // edge.vertex0() must lie on source contour. - const VD::cell_type *cell = edge.cell(); - const VD::cell_type *cell2 = edge.twin()->cell(); - if (cell->contains_segment()) - std::swap(cell, cell2); - // State of a cell containing a boundary point is known. - assert(cell->contains_point()); - set_cell_state(cell, outside ? CellState::Active : CellState::Inactive); - // State of a cell containing a boundary edge is Boundary. - assert(cell2->contains_segment()); - set_cell_state(cell2, CellState::Boundary); - } + annotate_edge(edge.twin(), edge.is_secondary() ? EdgeCategory::PointsToContour : EdgeCategory::PointsOutside); + annotate_vertex(edge.vertex0(), edge.is_secondary() ? VertexCategory::OnContour : VertexCategory::Outside); + // edge.vertex1() is null, it is implicitely outside. + if (cell->contains_segment()) + std::swap(cell, cell2); + // State of a cell containing a boundary point is certainly outside. + assert(cell->contains_point()); + annotate_cell(cell, CellCategory::Outside); + assert(edge.is_secondary() == cell2->contains_segment()); + annotate_cell(cell2, cell2->contains_point() ? CellCategory::Outside : CellCategory::Boundary); } else if (edge.vertex0() != nullptr) { - // Finite edge. + assert(edge.is_finite()); const VD::cell_type *cell = edge.cell(); const Line *line = cell->contains_segment() ? &lines[cell->source_index()] : nullptr; if (line == nullptr) { cell = edge.twin()->cell(); line = cell->contains_segment() ? &lines[cell->source_index()] : nullptr; } + // Only one of the two vertices may lie on input contour. + assert(! edge.is_linear() || vertex_category(edge.vertex0()) != VertexCategory::OnContour || vertex_category(edge.vertex1()) != VertexCategory::OnContour); + // Now classify the Voronoi vertices and edges as inside outside, if at least one Voronoi + // site is a Segment site. + // Inside / outside classification of Point - Point Voronoi edges will be done later + // by a propagation (seed fill). if (line) { const VD::vertex_type *v1 = edge.vertex1(); const VD::cell_type *cell2 = (cell == edge.cell()) ? edge.twin()->cell() : edge.cell(); - assert(v1); - const Point *pt_on_contour = nullptr; - if (cell == edge.cell() && edge.twin()->cell()->contains_segment()) { - // Constrained bisector of two segments. + assert(v1 != nullptr); + VertexCategory v0_category = vertex_category(edge.vertex0()); + VertexCategory v1_category = vertex_category(edge.vertex1()); + bool on_contour = v0_category == VertexCategory::OnContour || v1_category == VertexCategory::OnContour; +#ifndef NDEBUG + if (! on_contour && cell == edge.cell() && edge.twin()->cell()->contains_segment()) { + // Constrained bisector of two segments. Vojtech is not quite sure whether the Voronoi generator is robust enough + // to always connect at least one secondary edge to an input contour point. Catch it here. + assert(edge.is_linear()); + // OnContour state of this edge is not known yet. + const Point *pt_on_contour = nullptr; // If the two segments share a point, then one end of the current Voronoi edge shares this point as well. - // Find pt_on_contour if it exists. + // A bisector may not necessarily connect to the source contour. Find pt_on_contour if it exists. const Line &line2 = lines[cell2->source_index()]; if (line->a == line2.b) pt_on_contour = &line->a; else if (line->b == line2.a) pt_on_contour = &line->b; - } else if (edge.is_secondary()) { - assert(edge.is_linear()); - // One end of the current Voronoi edge shares a point of a contour. - assert(edge.cell()->contains_point() != edge.twin()->cell()->contains_point()); - const Line &line2 = lines[cell2->source_index()]; - pt_on_contour = &((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line2.a : line2.b); - } - if (pt_on_contour) { - // One end of the current Voronoi edge shares a point of a contour. - // Find out which one it is. - const VD::vertex_type *v0 = edge.vertex0(); - Vec2d vec0(v0->x() - pt_on_contour->x(), v0->y() - pt_on_contour->y()); - Vec2d vec1(v1->x() - pt_on_contour->x(), v1->y() - pt_on_contour->y()); - double d0 = vec0.squaredNorm(); - double d1 = vec1.squaredNorm(); - assert(std::min(d0, d1) < SCALED_EPSILON * SCALED_EPSILON); - if (d0 < d1) { - // v0 is equal to pt. - } else { - // Skip secondary edge pointing to a contour point. - set_edge_state_initial(&edge, EdgeState::Inactive); - continue; + if (pt_on_contour) { + const VD::vertex_type *v0 = edge.vertex0(); + auto on_contour = [&pt_on_contour](const VD::vertex_type *v) { + return std::abs(v->x() - pt_on_contour->x()) < 0.5001 && + std::abs(v->y() - pt_on_contour->y()) < 0.5001; + }; + assert(! on_contour(v0) && ! on_contour(v1)); } } - Vec2d l0(line->a.cast()); - Vec2d lv((line->b - line->a).cast()); - double side = cross2(lv, Vec2d(v1->x(), v1->y()) - l0); - bool edge_active = outside ? (side < 0.) : (side > 0.); - set_edge_state_initial(&edge, edge_active ? EdgeState::Possible : EdgeState::Inactive); - assert(cell->contains_segment()); - set_cell_state(cell, - pt_on_contour ? CellState::Boundary : - edge_active ? CellState::Active : CellState::Inactive); - set_cell_state(cell2, - (pt_on_contour && cell2->contains_segment()) ? - CellState::Boundary : - edge_active ? CellState::Active : CellState::Inactive); +#endif // NDEBUG + if (on_contour && v1_category == VertexCategory::OnContour) { + // Skip secondary edge pointing to a contour point. + annotate_edge(&edge, EdgeCategory::PointsToContour); + } else { + // v0 is certainly not on the input polygons. + // Is v1 inside or outside the input polygons? + // The Voronoi vertex coordinate is in doubles, calculate orientation in doubles. + Vec2d l0(line->a.cast()); + Vec2d lv((line->b - line->a).cast()); + double side = cross2(Vec2d(v1->x(), v1->y()) - l0, lv); + // No Voronoi edge could connect two vertices of input polygons. + assert(side != 0.); + auto vc = side > 0. ? VertexCategory::Outside : VertexCategory::Inside; + annotate_vertex(v1, vc); + auto ec = vc == VertexCategory::Outside ? EdgeCategory::PointsOutside : EdgeCategory::PointsInside; + annotate_edge(&edge, ec); + // Annotate the twin edge and its vertex. As the Voronoi edge may never cross the input + // contour, the twin edge and its vertex will share the property of edge. + annotate_vertex(edge.vertex0(), on_contour ? VertexCategory::OnContour : vc); + annotate_edge(edge.twin(), on_contour ? EdgeCategory::PointsToContour : ec); + assert(cell->contains_segment()); + annotate_cell(cell, on_contour ? CellCategory::Boundary : + (vc == VertexCategory::Outside ? CellCategory::Outside : CellCategory::Inside)); + annotate_cell(cell2, (on_contour && cell2->contains_segment()) ? CellCategory::Boundary : + (vc == VertexCategory::Outside ? CellCategory::Outside : CellCategory::Inside)); + } } } - { - // Perform one round of expansion marking Voronoi edges and cells next to boundary cells as active / inactive. - std::vector cell_queue; - for (const VD::edge_type &edge : vd.edges()) - if (edge_state[&edge - front_edge] == EdgeState::Unknown) { - assert(edge.cell()->contains_point() && edge.twin()->cell()->contains_point()); - // Edge separating two point sources, not yet classified as inside / outside. - CellState cs = cell_state[edge.cell() - front_cell]; - CellState cs2 = cell_state[edge.twin()->cell() - front_cell]; - if (cs != CellState::Unknown || cs2 != CellState::Unknown) { - if (cs == CellState::Unknown) { - cs = cs2; - if (set_cell_state(edge.cell(), cs)) - cell_queue.emplace_back(edge.cell()); - } else if (set_cell_state(edge.twin()->cell(), cs)) - cell_queue.emplace_back(edge.twin()->cell()); - EdgeState es = (cs == CellState::Active) ? EdgeState::Possible : EdgeState::Inactive; - set_edge_state_initial(&edge, es); - set_edge_state_initial(edge.twin(), es); - } else { - const VD::edge_type *e = edge.twin()->rot_prev(); - do { - EdgeState es = edge_state[e->twin() - front_edge]; - if (es != EdgeState::Unknown) { - assert(es == EdgeState::Possible || es == EdgeState::Inactive); - set_edge_state_initial(&edge, es); - CellState cs = (es == EdgeState::Possible) ? CellState::Active : CellState::Inactive; - if (set_cell_state(edge.cell(), cs)) - cell_queue.emplace_back(edge.cell()); - if (set_cell_state(edge.twin()->cell(), cs)) - cell_queue.emplace_back(edge.twin()->cell()); - break; - } - e = e->rot_prev(); - } while (e != edge.twin()); + + assert(debug::verify_vertices_on_contour(vd, lines)); + + // Now most Voronoi vertices, edges and cells are annotated, with the exception of some + // edges separating two Point sites, their cells and vertices. + // Perform one round of expansion marking Voronoi edges and cells next to boundary cells. + std::vector cell_queue; + for (const VD::edge_type &edge : vd.edges()) { + assert((edge_category(edge) == EdgeCategory::Unknown) == (edge_category(edge.twin()) == EdgeCategory::Unknown)); + if (edge_category(edge) == EdgeCategory::Unknown) { + assert(edge.is_finite()); + const VD::cell_type &cell = *edge.cell(); + const VD::cell_type &cell2 = *edge.twin()->cell(); + assert(cell.contains_point() && cell2.contains_point()); + CellCategory cc = cell_category(cell); + CellCategory cc2 = cell_category(cell2); + assert(cc != CellCategory::Boundary && cc2 != CellCategory::Boundary); + CellCategory cc_new = cc; + if (cc_new == CellCategory::Unknown) + cc_new = cc2; + else + assert(cc2 == CellCategory::Unknown || cc == cc2); + if (cc_new == CellCategory::Unknown) { + VertexCategory vc = vertex_category(edge.vertex0()); + assert(vc != VertexCategory::OnContour); + if (vc != VertexCategory::Unknown) + cc_new = (vc == VertexCategory::Outside) ? CellCategory::Outside : CellCategory::Inside; + } + if (cc_new != CellCategory::Unknown) { + VertexCategory vc = (cc_new == CellCategory::Outside) ? VertexCategory::Outside : VertexCategory::Inside; + annotate_vertex(edge.vertex0(), vc); + annotate_vertex(edge.vertex1(), vc); + auto ec_new = (cc_new == CellCategory::Outside) ? EdgeCategory::PointsOutside : EdgeCategory::PointsInside; + annotate_edge(&edge, ec_new); + annotate_edge(edge.twin(), ec_new); + if (cc != cc_new) { + annotate_cell(&cell, cc_new); + cell_queue.emplace_back(&cell); + } + if (cc2 != cc_new) { + annotate_cell(&cell2, cc_new); + cell_queue.emplace_back(&cell2); + } + } + } + } + + assert(debug::verify_vertices_on_contour(vd, lines)); + + // Do a final seed fill over Voronoi cells and unmarked Voronoi edges. + while (! cell_queue.empty()) { + const VD::cell_type *cell = cell_queue.back(); + const CellCategory cc = cell_category(cell); + assert(cc == CellCategory::Outside || cc == CellCategory::Inside); + cell_queue.pop_back(); + const VD::edge_type *first_edge = cell->incident_edge(); + const VD::edge_type *edge = first_edge; + const auto ec_new = (cc == CellCategory::Outside) ? EdgeCategory::PointsOutside : EdgeCategory::PointsInside; + do { + EdgeCategory ec = edge_category(edge); + if (ec == EdgeCategory::Unknown) { + assert(edge->cell()->contains_point() && edge->twin()->cell()->contains_point()); + annotate_edge(edge, ec_new); + annotate_edge(edge->twin(), ec_new); + const VD::cell_type *cell2 = edge->twin()->cell(); + CellCategory cc2 = cell_category(cell2); + assert(cc2 == CellCategory::Unknown || cc2 == cc); + if (cc2 != cc) { + annotate_cell(cell2, cc); + cell_queue.emplace_back(cell2); } + } else { + assert(edge->vertex0() == nullptr || vertex_category(edge->vertex0()) != VertexCategory::Unknown); + assert(edge->vertex1() == nullptr || vertex_category(edge->vertex1()) != VertexCategory::Unknown); + assert(edge_category(edge->twin()) != EdgeCategory::Unknown); + assert(cell_category(edge->cell()) != CellCategory::Unknown); + assert(cell_category(edge->twin()->cell()) != CellCategory::Unknown); } - // Do a final seed fill over Voronoi cells and unmarked Voronoi edges. - while (! cell_queue.empty()) { - const VD::cell_type *cell = cell_queue.back(); - const CellState cs = cell_state[cell - front_cell]; - cell_queue.pop_back(); - const VD::edge_type *first_edge = cell->incident_edge(); - const VD::edge_type *edge = cell->incident_edge(); - EdgeState es = (cs == CellState::Active) ? EdgeState::Possible : EdgeState::Inactive; + edge = edge->next(); + } while (edge != first_edge); + } + + assert(debug::verify_vertices_on_contour(vd, lines)); + assert(debug::verify_inside_outside_annotations(vd)); +} + +std::vector signed_vertex_distances(const VD &vd, const Lines &lines) +{ + // vd shall be annotated. + assert(debug::verify_inside_outside_annotations(vd)); + + std::vector out(vd.vertices().size(), 0.); + const VD::vertex_type *first_vertex = &vd.vertices().front(); + for (const VD::vertex_type &vertex : vd.vertices()) { + const VertexCategory vc = vertex_category(vertex); + double dist; + if (vc == VertexCategory::OnContour) { + dist = 0.; + } else { + const VD::edge_type *first_edge = vertex.incident_edge(); + const VD::edge_type *edge = first_edge; + const VD::cell_type *point_cell = nullptr; do { - if (set_cell_state(edge->twin()->cell(), cs)) { - set_edge_state_initial(edge, es); - set_edge_state_initial(edge->twin(), es); - cell_queue.emplace_back(edge->twin()->cell()); + if (edge->cell()->contains_point()) { + point_cell = edge->cell(); + break; } - edge = edge->next(); + edge = edge->rot_next(); } while (edge != first_edge); + if (point_cell == 0) { + // Project vertex onto a contour segment. + const Line &line = lines[edge->cell()->source_index()]; + dist = Geometry::ray_point_distance( + line.a.cast(), (line.b - line.a).cast(), vertex_point(vertex)); + } else { + // Distance to a contour point. + dist = (contour_point(*point_cell, lines).cast() - vertex_point(vertex)).norm(); + } + if (vc == VertexCategory::Inside) + dist = - dist; } + out[&vertex - first_vertex] = dist; } + assert(debug::verify_signed_distances(vd, lines, out)); + + return out; +} + +std::vector edge_offset_contour_intersections( + const VD &vd, + const Lines &lines, + const std::vector &vertex_distances, + double offset_distance) +{ + // vd shall be annotated. + assert(debug::verify_inside_outside_annotations(vd)); + + bool outside = offset_distance > 0; if (! outside) offset_distance = - offset_distance; + assert(offset_distance > 0.); + + const VD::vertex_type *first_vertex = &vd.vertices().front(); + const VD::edge_type *first_edge = &vd.edges().front(); + static constexpr double nan = std::numeric_limits::quiet_NaN(); + // By default none edge has an intersection with the offset curve. + std::vector out(vd.num_edges(), Vec2d(nan, 0.)); + + for (const VD::edge_type &edge : vd.edges()) { + size_t edge_idx = &edge - first_edge; + if (edge_offset_has_intersection(out[edge_idx]) || out[edge_idx].y() != 0.) + // This edge was already classified. + continue; + + const VD::vertex_type *v0 = edge.vertex0(); + const VD::vertex_type *v1 = edge.vertex1(); + if (v0 == nullptr) { + assert(vertex_category(v1) == VertexCategory::OnContour || vertex_category(v1) == VertexCategory::Outside); + continue; + } + + double d0 = (v0 == nullptr) ? std::numeric_limits::max() : vertex_distances[v0 - first_vertex]; + double d1 = (v1 == nullptr) ? std::numeric_limits::max() : vertex_distances[v1 - first_vertex]; + assert(d0 * d1 >= 0.); + if (! outside) { + d0 = - d0; + d1 = - d1; + } +#ifndef NDEBUG + { + double err = std::abs(detail::dist_to_site(lines, *edge.cell(), vertex_point(v0)) - std::abs(d0)); + double err2 = std::abs(detail::dist_to_site(lines, *edge.twin()->cell(), vertex_point(v0)) - std::abs(d0)); + assert(err < SCALED_EPSILON); + assert(err2 < SCALED_EPSILON); + if (v1 != nullptr) { + double err3 = std::abs(detail::dist_to_site(lines, *edge.cell(), vertex_point(v1)) - std::abs(d1)); + double err4 = std::abs(detail::dist_to_site(lines, *edge.twin()->cell(), vertex_point(v1)) - std::abs(d1)); + assert(err3 < SCALED_EPSILON); + assert(err4 < SCALED_EPSILON); + } + } +#endif // NDEBUG + double dmin, dmax; + if (d0 < d1) + dmin = d0, dmax = d1; + else + dmax = d0, dmin = d1; + // Offset distance may be lower than dmin, but never higher than dmax. + // Don't intersect an edge at dmax + // 1) To avoid zero edge length, zero area offset contours. + // 2) To ensure that the offset contours that cross a Voronoi vertex are traced consistently + // at one side of the offset curve only. + if (offset_distance >= dmax) + continue; + // Edge candidate, intersection points were not calculated yet. + assert(v0 != nullptr); + const VD::cell_type *cell = edge.cell(); + const VD::cell_type *cell2 = edge.twin()->cell(); + const Line &line0 = lines[cell->source_index()]; + const Line &line1 = lines[cell2->source_index()]; + size_t edge_idx2 = edge.twin() - first_edge; + if (v1 == nullptr) { + assert(edge.is_infinite()); + assert(edge.is_linear()); + // Unconstrained edges have always montonous distance. + assert(d0 != d1); + if (offset_distance > dmin) { + // There is certainly an intersection with the offset curve. + if (cell->contains_point() && cell2->contains_point()) { + assert(! edge.is_secondary()); + const Point &pt0 = contour_point(*cell, line0); + const Point &pt1 = contour_point(*cell2, line1); + // pt is inside the circle (pt0, offset_distance), (pt + dir) is certainly outside the same circle. + Vec2d dir = Vec2d(double(pt0.y() - pt1.y()), double(pt1.x() - pt0.x())) * (2. * offset_distance); + Vec2d pt(v0->x(), v0->y()); + double t = detail::first_circle_segment_intersection_parameter(Vec2d(pt0.x(), pt0.y()), offset_distance, pt, dir); + assert(t > 0.); + out[edge_idx] = pt + t * dir; + } else { + // Infinite edges could not be created by two segment sites. + assert(cell->contains_point() != cell2->contains_point()); + // Linear edge goes through the endpoint of a segment. + assert(edge.is_secondary()); + const Point &ipt = cell->contains_segment() ? contour_point(*cell2, line1) : contour_point(*cell, line0); + #ifndef NDEBUG + if (cell->contains_segment()) { + const Point &pt1 = contour_point(*cell2, line1); + assert(pt1 == line0.a || pt1 == line0.b); + } else { + const Point &pt0 = contour_point(*cell, line0); + assert(pt0 == line1.a || pt0 == line1.b); + } + assert((vertex_point(v0) - ipt.cast()).norm() < SCALED_EPSILON); + #endif /* NDEBUG */ + // Infinite edge starts at an input contour, therefore there is always an intersection with an offset curve. + const Line &line = cell->contains_segment() ? line0 : line1; + assert(line.a == ipt || line.b == ipt); + out[edge_idx] = ipt.cast() + offset_distance * Vec2d(line.b.y() - line.a.y(), line.a.x() - line.b.x()).normalized(); + } + } else if (offset_distance == dmin) + out[edge_idx] = vertex_point(v0); + // The other edge of an unconstrained edge starting with null vertex shall never be intersected. Mark it as visited. + out[edge_idx2].y() = 1.; + } else { + assert(edge.is_finite()); + bool done = false; + // Bisector of two line segments, distance along the bisector is linear. + bool bisector = cell->contains_segment() && cell2->contains_segment(); + assert(edge.is_finite()); + // or a secondary line, again the distance along the secondary line is linear and starts at the contour (zero distance). + if (bisector || edge.is_secondary()) { + assert(edge.is_linear()); +#ifndef NDEBUG + if (edge.is_secondary()) { + assert(cell->contains_point() != cell2->contains_point()); + // One of the vertices is on the input contour. + assert((vertex_category(edge.vertex0()) == VertexCategory::OnContour) != + (vertex_category(edge.vertex1()) == VertexCategory::OnContour)); + assert(dmin == 0.); + } +#endif // NDEBUG + if (! bisector || (dmin != dmax && offset_distance >= dmin)) { + double t = (offset_distance - dmin) / (dmax - dmin); + t = clamp(0., 1., t); + if (d1 < d0) { + out[edge_idx2] = Slic3r::lerp(vertex_point(v1), vertex_point(v0), t); + // mark visited + out[edge_idx].y() = 1.; + } else { + out[edge_idx] = Slic3r::lerp(vertex_point(v0), vertex_point(v1), t); + // mark visited + out[edge_idx2].y() = 1.; + } + done = true; + } + } else { + // Point - Segment or Point - Point edge, distance along this Voronoi edge may not be monotonous: + // The distance function along the Voronoi edge may either have one maximum at one vertex and one minimum at the other vertex, + // or it may have two maxima at the vertices and a minimum somewhere along the Voronoi edge, and this Voronoi edge + // may be intersected twice by an offset curve. + // + // Tracing an offset curve accross Voronoi regions with linear edges of montonously increasing or decrasing distance + // to a Voronoi region is stable in a sense, that if the distance of Voronoi vertices is calculated correctly, there will + // be maximum one intersection of an offset curve found at each Voronoi edge and tracing these intersections shall + // produce a set of closed curves. + // + // Having a non-monotonous distance function between the Voronoi edge end points may lead to splitting of offset curves + // at these Voronoi edges. If a Voronoi edge is classified as having no intersection at all while it has some, + // the extracted offset curve will contain self intersections at this Voronoi edge. + // + // If on the other side the two intersection points are found by a numerical error even though none should be found, then + // it may happen that it would not be possible to connect these two points into a closed loop, which is likely worse + // than the issue above. + // + // While it is likely not possible to avoid all the numerical issues, one shall strive for the highest numerical robustness. + assert(cell->contains_point() || cell2->contains_point()); + size_t num_intersections = 0; + bool point_vs_segment = cell->contains_point() != cell2->contains_point(); + const Point &pt0 = cell->contains_point() ? contour_point(*cell, line0) : contour_point(*cell2, line1); + // Project p0 to line segment . + Vec2d p0(v0->x(), v0->y()); + Vec2d p1(v1->x(), v1->y()); + Vec2d px(pt0.x(), pt0.y()); + const Point *pt1 = nullptr; + Vec2d dir; + if (point_vs_segment) { + const Line &line = cell->contains_segment() ? line0 : line1; + dir = (line.b - line.a).cast(); + } else { + pt1 = &contour_point(*cell2, line1); + // Perpendicular to the (pt1 - pt0) direction. + dir = Vec2d(double(pt0.y() - pt1->y()), double(pt1->x() - pt0.x())); + } + double s0 = (p0 - px).dot(dir); + double s1 = (p1 - px).dot(dir); + if (offset_distance >= dmin) { + // This Voronoi edge is intersected by the offset curve just once. + // There may be numerical issues if dmin is close to the minimum of the non-monotonous distance function. + num_intersections = 1; + } else { + // This Voronoi edge may not be intersected by the offset curve, or it may split the offset curve + // into two loops. First classify this edge robustly with regard to the Point-Segment bisector or Point-Point bisector. + double dmin_new; + bool found = false; + if (point_vs_segment) { + if (s0 * s1 <= 0.) { + // One end of the Voronoi edge is on one side of the Point-Segment bisector, the other end of the Voronoi + // edge is on the other side of the bisector, therefore with a high probability we should find a minimum + // of the distance to a nearest site somewhere inside this Voronoi edge (at the intersection of the bisector + // and the Voronoi edge. + const Line &line = cell->contains_segment() ? line0 : line1; + dmin_new = 0.5 * (Geometry::foot_pt(line.a.cast(), dir, px) - px).norm(); + found = true; + } + } else { + // Point-Point Voronoi sites. + if (s0 * s1 <= 0.) { + // This Voronoi edge intersects connection line of the two Point sites. + dmin_new = 0.5 * (pt1->cast() - px).norm(); + found = true; + } + } + if (found) { + assert(dmin_new < dmax + SCALED_EPSILON); + assert(dmin_new < dmin + SCALED_EPSILON); + if (dmin_new <= offset_distance) { + // 1) offset_distance > dmin_new -> two new distinct intersection points are found. + // 2) offset_distance == dmin_new -> one duplicate point is found. + // If 2) is ignored, then two tangentially touching offset curves are created. + // If not ignored, then the two offset curves merge at this double point. + // We should merge the contours while pushing the the two copies of the tangent point away a bit. + dmin = dmin_new; + num_intersections = (offset_distance > dmin) + 1; + } + } + } + if (num_intersections > 0) { + detail::Intersections intersections; + if (point_vs_segment) { + assert(cell->contains_point() || cell2->contains_point()); + intersections = detail::line_point_equal_distance_points(cell->contains_segment() ? line0 : line1, pt0, offset_distance); + } else { + intersections = detail::point_point_equal_distance_points(pt0, *pt1, offset_distance); + } + // The functions above perform complex calculations in doubles, therefore the results may not be quite accurate and + // the number of intersections found may not be in accord to the number of intersections expected from evaluating simpler expressions. + // Adjust the result to the number of intersection points expected. + if (num_intersections == 2) { + switch (intersections.count) { + case 0: + // No intersection found even though one or two were expected to be found. + // Not trying to find the intersection means that we may produce offset curves, that intersect at this Voronoi edge. + //FIXME We are fine with that for now, but we may try to create artificial split points in further revisions. + break; + case 1: + // Tangential point found. + //FIXME We are fine with that for now, but we may try to create artificial split points in further revisions. + break; + default: + { + // Two intersection points found. Sort them. + assert(intersections.count == 2); + double q0 = (intersections.pts[0] - px).dot(dir); + double q1 = (intersections.pts[1] - px).dot(dir); + // Both Voronoi edge end points and offset contour intersection points should be separated by the bisector. + assert(q0 * q1 <= 0.); + assert(s0 * s1 <= 0.); + // Sort the intersection points by dir. + if ((q0 < q1) != (s0 < s1)) + std::swap(intersections.pts[0], intersections.pts[1]); + } + } + } else { + assert(num_intersections == 1); + switch (intersections.count) { + case 0: + // No intersection found. This should not happen. + // Create one artificial intersection point by repeating the dmin point, which is supposed to be + // close to the minimum. + intersections.pts[0] = (dmin == d0) ? p0 : p1; + intersections.count = 1; + break; + case 1: + // One intersection found. This is a tangential point. Use it. + break; + default: + // Two intersections found. + // Now decide which of the point fall on this Voronoi edge. + assert(intersections.count == 2); + double q0 = (intersections.pts[0] - px).dot(dir); + double q1 = (intersections.pts[1] - px).dot(dir); + // Offset contour intersection points should be separated by the bisector. + assert(q0 * q1 <= 0); + double s = (dmax == d0) ? s0 : s1; + bool take_2nd = (s > 0.) ? q1 > q0 : q1 < q0; + if (take_2nd) + intersections.pts[0] = intersections.pts[1]; + -- intersections.count; + } + } + assert(intersections.count > 0); + if (intersections.count == 2) { + out[edge_idx] = intersections.pts[1]; + out[edge_idx2] = intersections.pts[0]; + done = true; + } else if (intersections.count == 1) { + if (d1 < d0) + std::swap(edge_idx, edge_idx2); + out[edge_idx] = intersections.pts[0]; + out[edge_idx2].y() = 1.; + done = true; + } + } + } + if (! done) + out[edge_idx].y() = out[edge_idx2].y() = 1.; + } + } + + assert(debug::verify_offset_intersection_points(vd, lines, offset_distance, out)); + + return out; +} + +Polygons offset( + const Geometry::VoronoiDiagram &vd, + const Lines &lines, + const std::vector &signed_vertex_distances, + double offset_distance, + double discretization_error) +{ #ifdef VORONOI_DEBUG_OUT BoundingBox bbox; { @@ -442,10 +1339,10 @@ Polygons voronoi_offset( { Lines helper_lines; for (const VD::edge_type &edge : vd.edges()) - if (edge_state[&edge - front_edge] == EdgeState::Possible) { + if (edge_category(edge) == (offset_distance > 0 ? EdgeCategory::PointsOutside : EdgeCategory::PointsInside) && + edge.vertex0() != nullptr) { const VD::vertex_type *v0 = edge.vertex0(); const VD::vertex_type *v1 = edge.vertex1(); - assert(v0 != nullptr); Vec2d pt1(v0->x(), v0->y()); Vec2d pt2; if (v1 == nullptr) { @@ -490,294 +1387,39 @@ Polygons voronoi_offset( } #endif // VORONOI_DEBUG_OUT - std::vector edge_offset_point(vd.num_edges(), Vec2d()); - const double offset_distance2 = offset_distance * offset_distance; - for (const VD::edge_type &edge : vd.edges()) { - assert(edge_state[&edge - front_edge] != EdgeState::Unknown); - size_t edge_idx = &edge - front_edge; - if (edge_state[edge_idx] == EdgeState::Possible) { - // Edge candidate, intersection points were not calculated yet. - const VD::vertex_type *v0 = edge.vertex0(); - const VD::vertex_type *v1 = edge.vertex1(); - assert(v0 != nullptr); - const VD::cell_type *cell = edge.cell(); - const VD::cell_type *cell2 = edge.twin()->cell(); - const Line &line0 = lines[cell->source_index()]; - const Line &line1 = lines[cell2->source_index()]; - size_t edge_idx2 = edge.twin() - front_edge; - if (v1 == nullptr) { - assert(edge.is_infinite()); - assert(edge.is_linear()); - assert(edge_state[edge_idx2] == EdgeState::Inactive); - if (cell->contains_point() && cell2->contains_point()) { - assert(! edge.is_secondary()); - const Point &pt0 = (cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b; - const Point &pt1 = (cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b; - double dmin2 = (Vec2d(v0->x(), v0->y()) - pt0.cast()).squaredNorm(); - assert(dmin2 >= SCALED_EPSILON * SCALED_EPSILON); - if (dmin2 <= offset_distance2) { - // There shall be an intersection of this unconstrained edge with the offset curve. - // Direction vector of this unconstrained Voronoi edge. - Vec2d dir(double(pt0.y() - pt1.y()), double(pt1.x() - pt0.x())); - Vec2d pt(v0->x(), v0->y()); - double t = detail::first_circle_segment_intersection_parameter(Vec2d(pt0.x(), pt0.y()), offset_distance, pt, dir); - edge_offset_point[edge_idx] = pt + t * dir; - set_edge_state_final(edge_idx, EdgeState::Active); - } else - set_edge_state_final(edge_idx, EdgeState::Inactive); - } else { - // Infinite edges could not be created by two segment sites. - assert(cell->contains_point() != cell2->contains_point()); - // Linear edge goes through the endpoint of a segment. - assert(edge.is_secondary()); - const Point &ipt = cell->contains_segment() ? - ((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b) : - ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b); - #ifndef NDEBUG - if (cell->contains_segment()) { - const Point &pt1 = (cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b; - assert((pt1.x() == line0.a.x() && pt1.y() == line0.a.y()) || - (pt1.x() == line0.b.x() && pt1.y() == line0.b.y())); - } else { - const Point &pt0 = (cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b; - assert((pt0.x() == line1.a.x() && pt0.y() == line1.a.y()) || - (pt0.x() == line1.b.x() && pt0.y() == line1.b.y())); - } - assert((Vec2d(v0->x(), v0->y()) - ipt.cast()).norm() < SCALED_EPSILON); - #endif /* NDEBUG */ - // Infinite edge starts at an input contour, therefore there is always an intersection with an offset curve. - const Line &line = cell->contains_segment() ? line0 : line1; - assert(line.a == ipt || line.b == ipt); - edge_offset_point[edge_idx] = ipt.cast() + offset_distance * Vec2d(line.b.y() - line.a.y(), line.a.x() - line.b.x()).normalized(); - set_edge_state_final(edge_idx, EdgeState::Active); - } - // The other edge of an unconstrained edge starting with null vertex shall never be intersected. - set_edge_state_final(edge_idx2, EdgeState::Inactive); - } else if (edge.is_secondary()) { - assert(edge.is_linear()); - assert(cell->contains_point() != cell2->contains_point()); - const Line &line0 = lines[edge.cell()->source_index()]; - const Line &line1 = lines[edge.twin()->cell()->source_index()]; - const Point &pt = cell->contains_point() ? - ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b) : - ((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b); - #ifndef NDEBUG - const Line &line = cell->contains_segment() ? line0 : line1; - assert(pt == line.a || pt == line.b); - assert((pt.cast() - Vec2d(v0->x(), v0->y())).norm() < SCALED_EPSILON); - #endif // NDEBUG - Vec2d dir(v1->x() - v0->x(), v1->y() - v0->y()); - double l2 = dir.squaredNorm(); - if (offset_distance2 <= l2) { - edge_offset_point[edge_idx] = pt.cast() + (offset_distance / sqrt(l2)) * dir; - set_edge_state_final(edge_idx, EdgeState::Active); - } else { - set_edge_state_final(edge_idx, EdgeState::Inactive); - } - set_edge_state_final(edge_idx2, EdgeState::Inactive); - } else { - // Finite edge has valid points at both sides. - bool done = false; - if (cell->contains_segment() && cell2->contains_segment()) { - // This edge is a bisector of two line segments. Project v0, v1 onto one of the line segments. - Vec2d pt(line0.a.cast()); - Vec2d dir(line0.b.cast() - pt); - Vec2d vec0 = Vec2d(v0->x(), v0->y()) - pt; - Vec2d vec1 = Vec2d(v1->x(), v1->y()) - pt; - double l2 = dir.squaredNorm(); - assert(l2 > 0.); - double dmin = (dir * (vec0.dot(dir) / l2) - vec0).squaredNorm(); - double dmax = (dir * (vec1.dot(dir) / l2) - vec1).squaredNorm(); - bool flip = dmin > dmax; - if (flip) - std::swap(dmin, dmax); - if (offset_distance2 >= dmin && offset_distance2 <= dmax) { - // Intersect. Maximum one intersection will be found. - // This edge is a bisector of two line segments. Distance to the input polygon increases/decreases monotonically. - dmin = sqrt(dmin); - dmax = sqrt(dmax); - assert(offset_distance > dmin - EPSILON && offset_distance < dmax + EPSILON); - double ddif = dmax - dmin; - if (ddif == 0.) { - // line, line2 are exactly parallel. This is a singular case, the offset curve should miss it. - } else { - if (flip) { - std::swap(edge_idx, edge_idx2); - std::swap(v0, v1); - } - double t = clamp(0., 1., (offset_distance - dmin) / ddif); - edge_offset_point[edge_idx] = Vec2d(lerp(v0->x(), v1->x(), t), lerp(v0->y(), v1->y(), t)); - set_edge_state_final(edge_idx, EdgeState::Active); - set_edge_state_final(edge_idx2, EdgeState::Inactive); - done = true; - } - } - } else { - assert(cell->contains_point() || cell2->contains_point()); - bool point_vs_segment = cell->contains_point() != cell2->contains_point(); - const Point &pt0 = cell->contains_point() ? - ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b) : - ((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b); - // Project p0 to line segment . - Vec2d p0(v0->x(), v0->y()); - Vec2d p1(v1->x(), v1->y()); - Vec2d px(pt0.x(), pt0.y()); - double d0 = (p0 - px).squaredNorm(); - double d1 = (p1 - px).squaredNorm(); - double dmin = std::min(d0, d1); - double dmax = std::max(d0, d1); - bool has_intersection = false; - bool possibly_two_points = false; - if (offset_distance2 <= dmax) { - if (offset_distance2 >= dmin) { - has_intersection = true; - } else { - double dmin_new = dmin; - if (point_vs_segment) { - // Project on the source segment. - const Line &line = cell->contains_segment() ? line0 : line1; - const Vec2d pt_line = line.a.cast(); - const Vec2d v_line = (line.b - line.a).cast(); - double t0 = (p0 - pt_line).dot(v_line); - double t1 = (p1 - pt_line).dot(v_line); - double tx = (px - pt_line).dot(v_line); - if ((tx >= t0 && tx <= t1) || (tx >= t1 && tx <= t0)) { - // Projection of the Point site falls between the projections of the Voronoi edge end points - // onto the Line site. - Vec2d ft = pt_line + (tx / v_line.squaredNorm()) * v_line; - dmin_new = (ft - px).squaredNorm() * 0.25; - } - } else { - // Point-Point Voronoi sites. Project point site onto the current Voronoi edge. - Vec2d v = p1 - p0; - auto l2 = v.squaredNorm(); - assert(l2 > 0); - auto t = v.dot(px - p0); - if (t >= 0. && t <= l2) { - // Projection falls onto the Voronoi edge. Calculate foot point and distance. - Vec2d ft = p0 + (t / l2) * v; - dmin_new = (ft - px).squaredNorm(); - } - } - assert(dmin_new < dmax + SCALED_EPSILON); - assert(dmin_new < dmin + SCALED_EPSILON); - if (dmin_new < dmin) { - dmin = dmin_new; - has_intersection = possibly_two_points = offset_distance2 >= dmin; - } - } - } - if (has_intersection) { - detail::Intersections intersections; - if (point_vs_segment) { - assert(cell->contains_point() || cell2->contains_point()); - intersections = detail::line_point_equal_distance_points(cell->contains_segment() ? line0 : line1, pt0, offset_distance); - } else { - const Point &pt1 = (cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b; - intersections = detail::point_point_equal_distance_points(pt0, pt1, offset_distance); - } - // If the span of distances of start / end point / foot point to the point site indicate an intersection, - // we should find one. - assert(intersections.count > 0); - if (intersections.count == 2) { - // Now decide which points fall on this Voronoi edge. - // Tangential points (single intersection) are ignored. - if (possibly_two_points) { - Vec2d v = p1 - p0; - double l2 = v.squaredNorm(); - double t0 = v.dot(intersections.pts[0] - p0); - double t1 = v.dot(intersections.pts[1] - p0); - if (t0 > t1) { - std::swap(t0, t1); - std::swap(intersections.pts[0], intersections.pts[1]); - } - // Remove points outside of the line range. - if (t0 < 0. || t0 > l2) { - if (t1 < 0. || t1 > l2) - intersections.count = 0; - else { - -- intersections.count; - t0 = t1; - intersections.pts[0] = intersections.pts[1]; - } - } else if (t1 < 0. || t1 > l2) - -- intersections.count; - } else { - // Take the point furthest from the end points of the Voronoi edge or a Voronoi parabolic arc. - double d0 = std::max((intersections.pts[0] - p0).squaredNorm(), (intersections.pts[0] - p1).squaredNorm()); - double d1 = std::max((intersections.pts[1] - p0).squaredNorm(), (intersections.pts[1] - p1).squaredNorm()); - if (d0 > d1) - intersections.pts[0] = intersections.pts[1]; - -- intersections.count; - } - assert(intersections.count > 0); - if (intersections.count == 2) { - set_edge_state_final(edge_idx, EdgeState::Active); - set_edge_state_final(edge_idx2, EdgeState::Active); - edge_offset_point[edge_idx] = intersections.pts[1]; - edge_offset_point[edge_idx2] = intersections.pts[0]; - done = true; - } else if (intersections.count == 1) { - if (d1 < d0) - std::swap(edge_idx, edge_idx2); - set_edge_state_final(edge_idx, EdgeState::Active); - set_edge_state_final(edge_idx2, EdgeState::Inactive); - edge_offset_point[edge_idx] = intersections.pts[0]; - done = true; - } - } - } - } - if (! done) { - set_edge_state_final(edge_idx, EdgeState::Inactive); - set_edge_state_final(edge_idx2, EdgeState::Inactive); - } - } - } - } - -#ifndef NDEBUG - for (const VD::edge_type &edge : vd.edges()) { - assert(edge_state[&edge - front_edge] == EdgeState::Inactive || edge_state[&edge - front_edge] == EdgeState::Active); - // None of a new edge candidate may start with null vertex. - assert(edge_state[&edge - front_edge] == EdgeState::Inactive || edge.vertex0() != nullptr); - assert(edge_state[edge.twin() - front_edge] == EdgeState::Inactive || edge.twin()->vertex0() != nullptr); - } -#endif // NDEBUG + std::vector edge_points = edge_offset_contour_intersections(vd, lines, signed_vertex_distances, offset_distance); + const VD::edge_type *front_edge = &vd.edges().front(); #ifdef VORONOI_DEBUG_OUT + Lines helper_lines; { - Lines helper_lines; for (const VD::edge_type &edge : vd.edges()) - if (edge_state[&edge - front_edge] == EdgeState::Active) - helper_lines.emplace_back(Line(Point(edge.vertex0()->x(), edge.vertex0()->y()), Point(edge_offset_point[&edge - front_edge].cast()))); + if (edge_offset_has_intersection(edge_points[&edge - front_edge])) + helper_lines.emplace_back(Line(Point(edge.vertex0()->x(), edge.vertex0()->y()), Point(edge_points[&edge - front_edge].cast()))); dump_voronoi_to_svg(debug_out_path("voronoi-offset-candidates2-%d.svg", irun).c_str(), vd, Points(), lines, Polygons(), helper_lines); } #endif // VORONOI_DEBUG_OUT - auto next_offset_edge = [&edge_state, front_edge](const VD::edge_type *start_edge) -> const VD::edge_type* { + auto next_offset_edge = [&edge_points, front_edge](const VD::edge_type *start_edge) -> const VD::edge_type* { for (const VD::edge_type *edge = start_edge->next(); edge != start_edge; edge = edge->next()) - if (edge_state[edge->twin() - front_edge] == EdgeState::Active) + if (edge_offset_has_intersection(edge_points[edge->twin() - front_edge])) return edge->twin(); // assert(false); return nullptr; }; -#ifndef NDEBUG - auto dist_to_site = [&lines](const VD::cell_type &cell, const Vec2d &point) { - const Line &line = lines[cell.source_index()]; - return cell.contains_point() ? - (((cell.source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line.a : line.b).cast() - point).norm() : - (Geometry::foot_pt(line.a.cast(), (line.b - line.a).cast(), point) - point).norm(); - }; -#endif /* NDEBUG */ + const bool inside_offset = offset_distance < 0.; + if (inside_offset) + offset_distance = - offset_distance; - // Track the offset curves. - Polygons out; + // Track the offset curves. + Polygons out; double angle_step = 2. * acos((offset_distance - discretization_error) / offset_distance); double cos_threshold = cos(angle_step); - for (size_t seed_edge_idx = 0; seed_edge_idx < vd.num_edges(); ++ seed_edge_idx) - if (edge_state[seed_edge_idx] == EdgeState::Active) { + static constexpr double nan = std::numeric_limits::quiet_NaN(); + for (size_t seed_edge_idx = 0; seed_edge_idx < vd.num_edges(); ++ seed_edge_idx) { + Vec2d last_pt = edge_points[seed_edge_idx]; + if (edge_offset_has_intersection(last_pt)) { const VD::edge_type *start_edge = &vd.edges()[seed_edge_idx]; const VD::edge_type *edge = start_edge; Polygon poly; @@ -786,21 +1428,23 @@ Polygons voronoi_offset( const VD::edge_type *next_edge = next_offset_edge(edge); #ifdef VORONOI_DEBUG_OUT if (next_edge == nullptr) { - Lines helper_lines; - dump_voronoi_to_svg(debug_out_path("voronoi-offset-open-loop-%d.svg", irun).c_str(), vd, Points(), lines, Polygons(), to_lines(poly)); + Lines hl = helper_lines; + append(hl, to_lines(Polyline(poly.points))); + dump_voronoi_to_svg(debug_out_path("voronoi-offset-open-loop-%d.svg", irun).c_str(), vd, Points(), lines, Polygons(), hl); } #endif // VORONOI_DEBUG_OUT assert(next_edge); //std::cout << "offset-output: "; print_edge(edge); std::cout << " to "; print_edge(next_edge); std::cout << "\n"; // Interpolate a circular segment or insert a linear segment between edge and next_edge. const VD::cell_type *cell = edge->cell(); - edge_state[next_edge - front_edge] = EdgeState::Inactive; - Vec2d p1 = edge_offset_point[edge - front_edge]; - Vec2d p2 = edge_offset_point[next_edge - front_edge]; + // Mark the edge / offset curve intersection point as consumed. + Vec2d p1 = last_pt; + Vec2d p2 = edge_points[next_edge - front_edge]; + edge_points[next_edge - front_edge].x() = nan; #ifndef NDEBUG { - double err = dist_to_site(*cell, p1) - offset_distance; - double err2 = dist_to_site(*cell, p2) - offset_distance; + double err = detail::dist_to_site(lines, *cell, p1) - offset_distance; + double err2 = detail::dist_to_site(lines, *cell, p2) - offset_distance; #ifdef VORONOI_DEBUG_OUT if (std::max(err, err2) >= SCALED_EPSILON) { Lines helper_lines; @@ -847,11 +1491,142 @@ Polygons voronoi_offset( poly.points.emplace_back(pt_last); } edge = next_edge; + last_pt = p2; } while (edge != start_edge); - out.emplace_back(std::move(poly)); + + while (! poly.empty() && poly.points.front() == poly.points.back()) + poly.points.pop_back(); + if (poly.size() >= 3) + out.emplace_back(std::move(poly)); } + } return out; } +Polygons offset( + const VD &vd, + const Lines &lines, + double offset_distance, + double discretization_error) +{ + annotate_inside_outside(const_cast(vd), lines); + std::vector dist = signed_vertex_distances(vd, lines); + return offset(vd, lines, dist, offset_distance, discretization_error); +} + +// Produce a list of start positions of a skeleton segment at a halfedge. +// If the whole Voronoi edge is part of the skeleton, then zero start positions are assigned +// to both ends of the edge. Position "1" shall never be assigned to a halfedge. +// +// Skeleton edges must be inside a closed polygon, therefore these edges are finite. +// A Voronoi Edge-Edge bisector is either completely part of a skeleton, or not at all. +// An infinite Voronoi Edge-Point (parabola) or Point-Point (line) bisector is split into +// a center part close to the Voronoi sites (not skeleton) and the ends (skeleton), +// though either part could be clipped by the Voronoi segment. +// +// Further filtering of the skeleton may be necessary. +std::vector skeleton_edges_rough( + const VD &vd, + const Lines &lines, + // Angle threshold at a sharp convex corner, which is marked for a gap fill. + const double threshold_alpha) +{ + // vd shall be annotated. + assert(debug::verify_inside_outside_annotations(vd)); + + const VD::edge_type *first_edge = &vd.edges().front(); + static constexpr double nan = std::numeric_limits::quiet_NaN(); + // By default no edge is annotated as being part of the skeleton. + std::vector out(vd.num_edges(), Vec2d(nan, nan)); + // Threshold at a sharp corner, derived from a dot product of the sharp corner edges. + const double threshold_cos_alpha = cos(threshold_alpha); + // For sharp corners, dr/dl = sin(alpha/2). Substituting the dr/dl threshold with tan(alpha/2) threshold + // in Voronoi point - point and Voronoi point - line site functions. + const double threshold_tan_alpha_half = tan(0.5 * threshold_alpha); + + for (const VD::edge_type &edge : vd.edges()) { + size_t edge_idx = &edge - first_edge; + if ( + // Ignore secondary and unbounded edges, they shall never be part of the skeleton. + edge.is_secondary() || edge.is_infinite() || + // Skip the twin edge of an edge, that has already been processed. + &edge > edge.twin() || + // Ignore outer edges. + (edge_category(edge) != EdgeCategory::PointsInside && edge_category(edge.twin()) != EdgeCategory::PointsInside)) + continue; + const VD::vertex_type *v0 = edge.vertex0(); + const VD::vertex_type *v1 = edge.vertex1(); + const VD::cell_type *cell = edge.cell(); + const VD::cell_type *cell2 = edge.twin()->cell(); + const Line &line0 = lines[cell->source_index()]; + const Line &line1 = lines[cell2->source_index()]; + size_t edge_idx2 = edge.twin() - first_edge; + if (cell->contains_segment() && cell2->contains_segment()) { + // Bisector of two line segments, distance along the bisector is linear, + // dr/dl is constant. + // using trigonometric identity sin^2(a) = (1-cos(2a))/2 + Vec2d lv0 = (line0.b - line0.a).cast(); + Vec2d lv1 = (line1.b - line1.a).cast(); + double d = lv0.dot(lv1); + if (d < 0.) { + double cos_alpha = - d / (lv0.norm() * lv1.norm()); + if (cos_alpha > threshold_cos_alpha) { + // The whole bisector is a skeleton segment. + out[edge_idx] = vertex_point(v0); + out[edge_idx2] = vertex_point(v1); + } + } + } else { + // An infinite Voronoi Edge-Point (parabola) or Point-Point (line) bisector, clipped to a finite Voronoi segment. + // The infinite bisector has a distance (skeleton radius) minimum, which is also a minimum + // of the skeleton function dr / dt. + assert(cell->contains_point() || cell2->contains_point()); + if (cell->contains_point() != cell2->contains_point()) { + // Point - Segment + const Point &pt0 = cell->contains_point() ? contour_point(*cell, line0) : contour_point(*cell2, line1); + const Line &line = cell->contains_segment() ? line0 : line1; + std::tie(out[edge_idx], out[edge_idx2]) = detail::point_segment_dr_dl_thresholds( + pt0, line, vertex_point(v0), vertex_point(v1), threshold_tan_alpha_half); + } else { + // Point - Point + const Point &pt0 = contour_point(*cell, line0); + const Point &pt1 = contour_point(*cell2, line1); + std::tie(out[edge_idx], out[edge_idx2]) = detail::point_point_dr_dl_thresholds( + pt0, pt1, vertex_point(v0), vertex_point(v1), threshold_tan_alpha_half); + } + } + } + +#ifdef VORONOI_DEBUG_OUT + { + static int irun = 0; + ++ irun; + Lines helper_lines; + for (const VD::edge_type &edge : vd.edges()) + if (&edge < edge.twin() && edge.is_finite()) { + const Vec2d &skeleton_pt = out[&edge - first_edge]; + const Vec2d &skeleton_pt2 = out[edge.twin() - first_edge]; + bool has_skeleton_pt = ! std::isnan(skeleton_pt.x()); + bool has_skeleton_pt2 = ! std::isnan(skeleton_pt2.x()); + const Vec2d &vertex_pt = vertex_point(edge.vertex0()); + const Vec2d &vertex_pt2 = vertex_point(edge.vertex1()); + if (has_skeleton_pt && has_skeleton_pt2) { + // Complete edge is part of the skeleton. + helper_lines.emplace_back(Line(Point(vertex_pt.x(), vertex_pt.y()), Point(vertex_pt2.x(), vertex_pt2.y()))); + } else { + if (has_skeleton_pt) + helper_lines.emplace_back(Line(Point(vertex_pt2.x(), vertex_pt2.y()), Point(skeleton_pt.x(), skeleton_pt.y()))); + if (has_skeleton_pt2) + helper_lines.emplace_back(Line(Point(vertex_pt.x(), vertex_pt.y()), Point(skeleton_pt2.x(), skeleton_pt2.y()))); + } + } + dump_voronoi_to_svg(debug_out_path("voronoi-skeleton-edges-%d.svg", irun).c_str(), vd, Points(), lines, Polygons(), helper_lines); + } +#endif // VORONOI_DEBUG_OUT + + return out; +} + +} // namespace Voronoi } // namespace Slic3r diff --git a/src/libslic3r/VoronoiOffset.hpp b/src/libslic3r/VoronoiOffset.hpp index a21b44f93e5..17b590ed71a 100644 --- a/src/libslic3r/VoronoiOffset.hpp +++ b/src/libslic3r/VoronoiOffset.hpp @@ -9,16 +9,136 @@ namespace Slic3r { +namespace Voronoi { + +using VD = Slic3r::Geometry::VoronoiDiagram; + +inline const Point& contour_point(const VD::cell_type &cell, const Line &line) + { return ((cell.source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line.a : line.b); } +inline Point& contour_point(const VD::cell_type &cell, Line &line) + { return ((cell.source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line.a : line.b); } + +inline const Point& contour_point(const VD::cell_type &cell, const Lines &lines) + { return contour_point(cell, lines[cell.source_index()]); } +inline Point& contour_point(const VD::cell_type &cell, Lines &lines) + { return contour_point(cell, lines[cell.source_index()]); } + +inline Vec2d vertex_point(const VD::vertex_type &v) { return Vec2d(v.x(), v.y()); } +inline Vec2d vertex_point(const VD::vertex_type *v) { return Vec2d(v->x(), v->y()); } + +// "Color" stored inside the boost::polygon Voronoi vertex. +enum class VertexCategory : unsigned char +{ + // Voronoi vertex is on the input contour. + // VD::vertex_type stores coordinates in double, though the coordinates shall match exactly + // with the coordinates of the input contour when converted to int32_t. + OnContour, + // Vertex is inside the CCW input contour, holes are respected. + Inside, + // Vertex is outside the CCW input contour, holes are respected. + Outside, + // Not known yet. + Unknown, +}; + +// "Color" stored inside the boost::polygon Voronoi edge. +// The Voronoi edge as represented by boost::polygon Voronoi module is really a half-edge, +// the half-edges are classified based on the target vertex (VD::vertex_type::vertex1()) +enum class EdgeCategory : unsigned char +{ + // This half-edge points onto the contour, this VD::edge_type::vertex1().color() is OnContour. + PointsToContour, + // This half-edge points inside, this VD::edge_type::vertex1().color() is Inside. + PointsInside, + // This half-edge points outside, this VD::edge_type::vertex1().color() is Outside. + PointsOutside, + // Not known yet. + Unknown +}; + +// "Color" stored inside the boost::polygon Voronoi cell. +enum class CellCategory : unsigned char +{ + // This Voronoi cell is split by an input segment to two halves, one is inside, the other is outside. + Boundary, + // This Voronoi cell is completely inside. + Inside, + // This Voronoi cell is completely outside. + Outside, + // Not known yet. + Unknown +}; + +inline VertexCategory vertex_category(const VD::vertex_type &v) + { return static_cast(v.color()); } +inline VertexCategory vertex_category(const VD::vertex_type *v) + { return static_cast(v->color()); } +inline void set_vertex_category(VD::vertex_type &v, VertexCategory c) + { v.color(static_cast(c)); } +inline void set_vertex_category(VD::vertex_type *v, VertexCategory c) + { v->color(static_cast(c)); } + +inline EdgeCategory edge_category(const VD::edge_type &e) + { return static_cast(e.color()); } +inline EdgeCategory edge_category(const VD::edge_type *e) + { return static_cast(e->color()); } +inline void set_edge_category(VD::edge_type &e, EdgeCategory c) + { e.color(static_cast(c)); } +inline void set_edge_category(VD::edge_type *e, EdgeCategory c) + { e->color(static_cast(c)); } + +inline CellCategory cell_category(const VD::cell_type &v) + { return static_cast(v.color()); } +inline CellCategory cell_category(const VD::cell_type *v) + { return static_cast(v->color()); } +inline void set_cell_category(const VD::cell_type &v, CellCategory c) + { v.color(static_cast(c)); } +inline void set_cell_category(const VD::cell_type *v, CellCategory c) + { v->color(static_cast(c)); } + +// Mark the "Color" of VD vertices, edges and cells as Unknown. +void reset_inside_outside_annotations(VD &vd); + +// Assign "Color" to VD vertices, edges and cells signifying whether the entity is inside or outside +// the input polygons defined by Lines. +void annotate_inside_outside(VD &vd, const Lines &lines); + +// Returns a signed distance to Voronoi vertices from the input polygons. +// (negative distances inside, positive distances outside). +std::vector signed_vertex_distances(const VD &vd, const Lines &lines); + +static inline bool edge_offset_no_intersection(const Vec2d &intersection_point) + { return std::isnan(intersection_point.x()); } +static inline bool edge_offset_has_intersection(const Vec2d &intersection_point) + { return ! edge_offset_no_intersection(intersection_point); } +std::vector edge_offset_contour_intersections( + const VD &vd, const Lines &lines, const std::vector &distances, + double offset_distance); + +std::vector skeleton_edges_rough( + const VD &vd, + const Lines &lines, + const double threshold_alpha); + +Polygons offset( + const Geometry::VoronoiDiagram &vd, + const Lines &lines, + const std::vector &signed_vertex_distances, + double offset_distance, + double discretization_error); + // Offset a polygon or a set of polygons possibly with holes by traversing a Voronoi diagram. // The input polygons are stored in lines and lines are referenced by vd. // Outer curve will be extracted for a positive offset_distance, // inner curve will be extracted for a negative offset_distance. // Circular arches will be discretized to achieve discretization_error. -Polygons voronoi_offset( - const Geometry::VoronoiDiagram &vd, - const Lines &lines, - double offset_distance, - double discretization_error); +Polygons offset( + const VD &vd, + const Lines &lines, + double offset_distance, + double discretization_error); + +} // namespace Voronoi } // namespace Slic3r diff --git a/src/libslic3r/VoronoiVisualUtils.hpp b/src/libslic3r/VoronoiVisualUtils.hpp index fa6a3424181..177f27293a2 100644 --- a/src/libslic3r/VoronoiVisualUtils.hpp +++ b/src/libslic3r/VoronoiVisualUtils.hpp @@ -5,6 +5,8 @@ #include #include +#include "VoronoiOffset.hpp" + namespace boost { namespace polygon { // The following code for the visualization of the boost Voronoi diagram is based on: @@ -70,6 +72,7 @@ class voronoi_visual_utils { get_point_projection((*discretization)[0], segment); CT projection_end = sqr_segment_length * get_point_projection((*discretization)[1], segment); + assert(projection_start != projection_end); // Compute parabola parameters in the transformed space. // Parabola has next representation: @@ -99,13 +102,16 @@ class voronoi_visual_utils { // furthest from the current line segment. CT mid_x = (new_y - cur_y) / (new_x - cur_x) * rot_y + rot_x; CT mid_y = parabola_y(mid_x, rot_x, rot_y); + assert(mid_x != cur_x || mid_y != cur_y); + assert(mid_x != new_x || mid_y != new_y); // Compute maximum distance between the given parabolic arc // and line segment that discretize it. CT dist = (new_y - cur_y) * (mid_x - cur_x) - (new_x - cur_x) * (mid_y - cur_y); - dist = dist * dist / ((new_y - cur_y) * (new_y - cur_y) + - (new_x - cur_x) * (new_x - cur_x)); + CT div = (new_y - cur_y) * (new_y - cur_y) + (new_x - cur_x) * (new_x - cur_x); + assert(div != 0); + dist = dist * dist / div; if (dist <= max_dist_transformed) { // Distance between parabola and line segment is less than max_dist. point_stack.pop(); @@ -236,50 +242,39 @@ namespace Voronoi { namespace Internal { inline void clip_infinite_edge(const Points &points, const std::vector &segments, const edge_type& edge, coordinate_type bbox_max_size, std::vector* clipped_edge) { + assert(edge.is_infinite()); + assert((edge.vertex0() == nullptr) != (edge.vertex1() == nullptr)); + const cell_type& cell1 = *edge.cell(); const cell_type& cell2 = *edge.twin()->cell(); - point_type origin, direction; // Infinite edges could not be created by two segment sites. + assert(cell1.contains_point() || cell2.contains_point()); if (! cell1.contains_point() && ! cell2.contains_point()) { printf("Error! clip_infinite_edge - infinite edge separates two segment cells\n"); return; } + point_type direction; if (cell1.contains_point() && cell2.contains_point()) { + assert(! edge.is_secondary()); point_type p1 = retrieve_point(points, segments, cell1); point_type p2 = retrieve_point(points, segments, cell2); - origin.x((p1.x() + p2.x()) * 0.5); - origin.y((p1.y() + p2.y()) * 0.5); + if (edge.vertex0() == nullptr) + std::swap(p1, p2); direction.x(p1.y() - p2.y()); direction.y(p2.x() - p1.x()); } else { - origin = cell1.contains_segment() ? retrieve_point(points, segments, cell2) : retrieve_point(points, segments, cell1); + assert(edge.is_secondary()); segment_type segment = cell1.contains_segment() ? segments[cell1.source_index()] : segments[cell2.source_index()]; - coordinate_type dx = high(segment).x() - low(segment).x(); - coordinate_type dy = high(segment).y() - low(segment).y(); - if ((low(segment) == origin) ^ cell1.contains_point()) { - direction.x(dy); - direction.y(-dx); - } else { - direction.x(-dy); - direction.y(dx); - } + direction.x(high(segment).y() - low(segment).y()); + direction.y(low(segment).x() - high(segment).x()); } coordinate_type koef = bbox_max_size / (std::max)(fabs(direction.x()), fabs(direction.y())); - if (edge.vertex0() == NULL) { - clipped_edge->push_back(point_type( - origin.x() - direction.x() * koef, - origin.y() - direction.y() * koef)); - } else { - clipped_edge->push_back( - point_type(edge.vertex0()->x(), edge.vertex0()->y())); - } - if (edge.vertex1() == NULL) { - clipped_edge->push_back(point_type( - origin.x() + direction.x() * koef, - origin.y() + direction.y() * koef)); + if (edge.vertex0() == nullptr) { + clipped_edge->push_back(point_type(edge.vertex1()->x() + direction.x() * koef, edge.vertex1()->y() + direction.y() * koef)); + clipped_edge->push_back(point_type(edge.vertex1()->x(), edge.vertex1()->y())); } else { - clipped_edge->push_back( - point_type(edge.vertex1()->x(), edge.vertex1()->y())); + clipped_edge->push_back(point_type(edge.vertex0()->x(), edge.vertex0()->y())); + clipped_edge->push_back(point_type(edge.vertex0()->x() + direction.x() * koef, edge.vertex0()->y() + direction.y() * koef)); } } @@ -307,11 +302,16 @@ static inline void dump_voronoi_to_svg( const Lines &helper_lines = Lines(), double scale = 0) { + const bool internalEdgesOnly = false; + BoundingBox bbox; bbox.merge(get_extents(points)); bbox.merge(get_extents(lines)); bbox.merge(get_extents(offset_curves)); bbox.merge(get_extents(helper_lines)); + for (boost::polygon::voronoi_diagram::const_vertex_iterator it = vd.vertices().begin(); it != vd.vertices().end(); ++it) + if (! internalEdgesOnly || it->color() != Voronoi::Internal::EXTERNAL_COLOR) + bbox.merge(Point(it->x(), it->y())); bbox.min -= (0.01 * bbox.size().cast()).cast(); bbox.max += (0.01 * bbox.size().cast()).cast(); @@ -321,15 +321,17 @@ static inline void dump_voronoi_to_svg( 0.01 * std::min(bbox.size().x(), bbox.size().y()); else - scale /= SCALING_FACTOR; + scale *= SCALING_FACTOR; const std::string inputSegmentPointColor = "lightseagreen"; - const coord_t inputSegmentPointRadius = coord_t(0.09 * scale); + const coord_t inputSegmentPointRadius = std::max(1, coord_t(0.09 * scale)); const std::string inputSegmentColor = "lightseagreen"; const coord_t inputSegmentLineWidth = coord_t(0.03 * scale); const std::string voronoiPointColor = "black"; - const coord_t voronoiPointRadius = coord_t(0.06 * scale); + const std::string voronoiPointColorOutside = "red"; + const std::string voronoiPointColorInside = "blue"; + const coord_t voronoiPointRadius = std::max(1, coord_t(0.06 * scale)); const std::string voronoiLineColorPrimary = "black"; const std::string voronoiLineColorSecondary = "green"; const std::string voronoiArcColor = "red"; @@ -341,7 +343,6 @@ static inline void dump_voronoi_to_svg( const std::string helperLineColor = "orange"; const coord_t helperLineWidth = coord_t(0.04 * scale); - const bool internalEdgesOnly = false; const bool primaryEdgesOnly = false; ::Slic3r::SVG svg(path, bbox); @@ -360,9 +361,11 @@ static inline void dump_voronoi_to_svg( Voronoi::Internal::point_type(double(it->b(0)), double(it->b(1))))); // Color exterior edges. - for (boost::polygon::voronoi_diagram::const_edge_iterator it = vd.edges().begin(); it != vd.edges().end(); ++it) - if (!it->is_finite()) - Voronoi::Internal::color_exterior(&(*it)); + if (internalEdgesOnly) { + for (boost::polygon::voronoi_diagram::const_edge_iterator it = vd.edges().begin(); it != vd.edges().end(); ++it) + if (!it->is_finite()) + Voronoi::Internal::color_exterior(&(*it)); + } // Draw the end points of the input polygon. for (Lines::const_iterator it = lines.begin(); it != lines.end(); ++it) { @@ -376,8 +379,19 @@ static inline void dump_voronoi_to_svg( #if 1 // Draw voronoi vertices. for (boost::polygon::voronoi_diagram::const_vertex_iterator it = vd.vertices().begin(); it != vd.vertices().end(); ++it) - if (! internalEdgesOnly || it->color() != Voronoi::Internal::EXTERNAL_COLOR) - svg.draw(Point(coord_t(it->x()), coord_t(it->y())), voronoiPointColor, voronoiPointRadius); + if (! internalEdgesOnly || it->color() != Voronoi::Internal::EXTERNAL_COLOR) { + const std::string *color = nullptr; + switch (Voronoi::vertex_category(*it)) { + case Voronoi::VertexCategory::OnContour: color = &voronoiPointColor; break; + case Voronoi::VertexCategory::Outside: color = &voronoiPointColorOutside; break; + case Voronoi::VertexCategory::Inside: color = &voronoiPointColorInside; break; + default: color = &voronoiPointColor; // assert(false); + } + Point pt(coord_t(it->x()), coord_t(it->y())); + if (it->x() * pt.x() >= 0. && it->y() * pt.y() >= 0.) + // Conversion to coord_t is valid. + svg.draw(Point(coord_t(it->x()), coord_t(it->y())), *color, voronoiPointRadius); + } for (boost::polygon::voronoi_diagram::const_edge_iterator it = vd.edges().begin(); it != vd.edges().end(); ++it) { if (primaryEdgesOnly && !it->is_primary()) @@ -401,8 +415,32 @@ static inline void dump_voronoi_to_svg( } else if (! it->is_primary()) color = voronoiLineColorSecondary; } - for (std::size_t i = 0; i + 1 < samples.size(); ++i) - svg.draw(Line(Point(coord_t(samples[i].x()), coord_t(samples[i].y())), Point(coord_t(samples[i+1].x()), coord_t(samples[i+1].y()))), color, voronoiLineWidth); + for (std::size_t i = 0; i + 1 < samples.size(); ++ i) { + Vec2d a(samples[i].x(), samples[i].y()); + Vec2d b(samples[i+1].x(), samples[i+1].y()); + // Convert to coord_t. + Point ia = a.cast(); + Point ib = b.cast(); + // Is the conversion possible? Do the resulting points fit into int32_t? + auto in_range = [](const Point &ip, const Vec2d &p) { return p.x() * ip.x() >= 0. && p.y() * ip.y() >= 0.; }; + bool a_in_range = in_range(ia, a); + bool b_in_range = in_range(ib, b); + if (! a_in_range || ! b_in_range) { + if (! a_in_range && ! b_in_range) + // None fits, ignore. + continue; + // One fit, the other does not. Try to clip. + Vec2d v = b - a; + v.normalize(); + v *= bbox.size().cast().norm(); + auto p = a_in_range ? Vec2d(a + v) : Vec2d(b - v); + Point ip = p.cast(); + if (! in_range(ip, p)) + continue; + (a_in_range ? ib : ia) = ip; + } + svg.draw(Line(ia, ib), color, voronoiLineWidth); + } } #endif diff --git a/src/libslic3r/libslic3r.h b/src/libslic3r/libslic3r.h index 2ef258a4cc8..efdecbac8fc 100644 --- a/src/libslic3r/libslic3r.h +++ b/src/libslic3r/libslic3r.h @@ -228,6 +228,16 @@ ForwardIt binary_find_by_predicate(ForwardIt first, ForwardIt last, LowerThanKey return first != last && equal_to_key(*first) ? first : last; } +template inline bool contains(const ContainerType &c, const ValueType &v) + { return std::find(c.begin(), c.end(), v) != c.end(); } +template inline bool contains(const std::initializer_list &il, const T &v) + { return std::find(il.begin(), il.end(), v) != il.end(); } + +template inline bool one_of(const ValueType &v, const ContainerType &c) + { return contains(c, v); } +template inline bool one_of(const T& v, const std::initializer_list& il) + { return contains(il, v); } + template static inline T sqr(T x) { diff --git a/tests/libslic3r/test_voronoi.cpp b/tests/libslic3r/test_voronoi.cpp index b847a890b46..189dde7ceec 100644 --- a/tests/libslic3r/test_voronoi.cpp +++ b/tests/libslic3r/test_voronoi.cpp @@ -38,6 +38,26 @@ TEST_CASE("Voronoi missing edges - points 12067", "[Voronoi]") { -5, 0 } }; +#if 0 + for (Point &p : pts) { + Vec2d q = p.cast(); + p.x() = scale_(p.x()); + p.y() = scale_(p.y()); + } +#endif + +#if 0 + // Try to rotate, maybe the issue is caused by incorrect handling of vertical or horizontal edges? + double a = 0.18764587962597876897475f; + double c = cos(a); + double s = sin(a); + for (Point &p : poly.points) { + Vec2d q = p.cast(); + p.x() = coord_t(q.x() * c + q.y() * s + 0.5); + p.y() = coord_t(- q.x() * s + q.y() * c + 0.5); + } +#endif + // Construction of the Voronoi Diagram. VD vd; construct_voronoi(pts.begin(), pts.end(), &vd); @@ -133,33 +153,40 @@ TEST_CASE("Voronoi missing edges - Alessandro gapfill 12707", "[Voronoi]") { { 41427551, 0}, { 42127548, 699996 } } }; - Lines lines = to_lines(Polygon { - { 0, 10000000}, - { 700000, 1}, // it has to be 1, higher number, zero or -1 work. - { 700000, 9000000}, - { 9100000, 9000000}, - { 9100000, 0}, - {10000000, 10000000} - }); + Polygon poly { + { 0, 10000000}, + { 700000, 1}, // it has to be 1, higher number, zero or -1 work. + { 700000, 9000000}, + { 9100000, 9000000}, + { 9100000, 0}, + {10000000, 10000000} + }; + +#if 1 + // Try to rotate, maybe the issue is caused by incorrect handling of vertical or horizontal edges? + double a = 0.18764587962597876897475f; + double c = cos(a); + double s = sin(a); + for (Point &p : poly.points) { + Vec2d q = p.cast(); + p.x() = coord_t(q.x() * c + q.y() * s + 0.5); + p.y() = coord_t(- q.x() * s + q.y() * c + 0.5); + } +#endif - Polygon poly; std::mt19937 gen; std::uniform_int_distribution dist(-100, 100); - for (size_t i = 0; i < lines.size(); ++ i) { - Line &l1 = lines[i]; - Line &l2 = lines[(i + 1) % lines.size()]; - REQUIRE(l1.b.x() == l2.a.x()); - REQUIRE(l1.b.y() == l2.a.y()); + for (Point &p : poly.points) { #if 0 // Wiggle the points a bit to find out whether this fixes the voronoi diagram for this particular polygon. - l1.b.x() = (l2.a.x() += dist(gen)); - l1.b.y() = (l2.a.y() += dist(gen)); + p.x() = (p.x() += dist(gen)); + p.y() = (p.y() += dist(gen)); #endif - poly.points.emplace_back(l1.a); } REQUIRE(intersecting_edges({ poly }).empty()); + Lines lines = to_lines(poly); VD vd; construct_voronoi(lines.begin(), lines.end(), &vd); @@ -169,6 +196,114 @@ TEST_CASE("Voronoi missing edges - Alessandro gapfill 12707", "[Voronoi]") #endif } +TEST_CASE("Voronoi weirdness", "[Voronoi]") +{ + Polygon poly2 { + { 0, 0 }, + { 70000000, 0 }, + { 70000000, 1300000 }, +// { 70000001, 14000000 } + { 70700000, 14000000 } + }; + + Polygon poly5 { + { 35058884, -25732145 }, + { 35058884, -19586070 }, + { 32753739, -20246796 }, + { 28756244, -21010725 }, + { 24657532, -21657939 }, + { 20836260, -21960233 }, + { 16115145, -22070742 }, + { 11850152, -21839761 }, + { 7646240, -21470177 }, + { 3607605, -20786940 }, + { 1280947, -20329742 }, + { -292823, -19963790 }, + { -3844469, -18809741 }, + { -7237277, -17593723 }, + { -10225900, -16143761 }, + { -13030266, -14643721 }, + { -15404294, -12977561 }, + { -17601713, -11280712 }, + { -19241930, -9435607 }, + { -20714420, -7583739 }, + { -21726144, -5664355 }, + { -22579294, -3741947 }, + { -22966684, -1786321 }, + { -23200322, 170140 }, + { -22966684, 2126602 }, + { -22579296, 4082227 }, + { -21726148, 6004637 }, + { -20714424, 7924020 }, + { -19241932, 9775888 }, + { -17601717, 11620994 }, + { -15404423, 13317749 }, + { -13030276, 14984003 }, + { -10225910, 16484042 }, + { -7237288, 17934005 }, + { -3844482, 19150025 }, + { -292841, 20304074 }, + { 1280949, 20670031 }, + { 3607587, 21127226 }, + { 7646218, 21810465 }, + { 11850128, 22180055 }, + { 16115122, 22411036 }, + { 20836263, 22300531 }, + { 24657513, 21998239 }, + { 28756227, 21351025 }, + { 32753725, 20587092 }, + { 35058893, 19926309 }, + { 35058893, 35000000 }, + { -31657232, 35000000 }, + { -31657202, -35000000 }, + { 35058881, -35000000 } + }; + + Polygon poly7 { + { 35058884, -25732145 }, + { 35058884, -19586070 }, + { -31657202, -35000000 }, + { 35058881, -35000000 } + }; + +// coord_t shift = 35058881; + coord_t shift_ok = 17000000; + coord_t shift = 35058881; + Polygon poly { + // <-4, 0>: bug + // -5: ok + // 1 - ok + { 0 + shift, -35000000 }, + { 0 + shift, -25732145 }, + { 0 + shift, -19586070 }, + { -66716086 + shift, -35000000 } + }; + + REQUIRE(intersecting_edges({ poly }).empty()); + REQUIRE(poly.area() > 0.); + +#if 0 + // Try to rotate, maybe the issue is caused by incorrect handling of vertical or horizontal edges? + double a = 0.18764587962597876897475f; + double c = cos(a); + double s = sin(a); + for (Point &p : poly.points) { + Vec2d q = p.cast(); + p.x() = coord_t(q.x() * c + q.y() * s + 0.5); + p.y() = coord_t(- q.x() * s + q.y() * c + 0.5); + } +#endif + + VD vd; + Lines lines = to_lines(poly); + construct_voronoi(lines.begin(), lines.end(), &vd); + +#ifdef VORONOI_DEBUG_OUT + dump_voronoi_to_svg(debug_out_path("voronoi-weirdness.svg").c_str(), + vd, Points(), lines); +#endif +} + // https://svn.boost.org/trac10/ticket/12903 // division by zero reported, but this issue is most likely a non-issue, as it produces an infinity for the interval of validity // of the floating point calculation, therefore forcing a recalculation with extended accuracy. @@ -1228,7 +1363,7 @@ TEST_CASE("Voronoi offset", "[VoronoiOffset]") for (const OffsetTest &ot : { OffsetTest { scale_(0.2), 1, 1 }, OffsetTest { scale_(0.4), 1, 1 }, - OffsetTest { scale_(0.5), 1, 1 }, + OffsetTest { scale_(0.5), 1, 2 }, OffsetTest { scale_(0.505), 1, 2 }, OffsetTest { scale_(0.51), 1, 2 }, OffsetTest { scale_(0.52), 1, 1 }, @@ -1237,21 +1372,21 @@ TEST_CASE("Voronoi offset", "[VoronoiOffset]") OffsetTest { scale_(0.55), 1, 0 } }) { - Polygons offsetted_polygons_out = voronoi_offset(vd, lines, ot.distance, scale_(0.005)); - REQUIRE(offsetted_polygons_out.size() == ot.num_outer); - +#if 0 + Polygons offsetted_polygons_out = Slic3r::Voronoi::offset(vd, lines, ot.distance, scale_(0.005)); #ifdef VORONOI_DEBUG_OUT dump_voronoi_to_svg(debug_out_path("voronoi-offset-out-%lf.svg", ot.distance).c_str(), vd, Points(), lines, offsetted_polygons_out); #endif + REQUIRE(offsetted_polygons_out.size() == ot.num_outer); +#endif - Polygons offsetted_polygons_in = voronoi_offset(vd, lines, - ot.distance, scale_(0.005)); - REQUIRE(offsetted_polygons_in.size() == ot.num_inner); - + Polygons offsetted_polygons_in = Slic3r::Voronoi::offset(vd, lines, - ot.distance, scale_(0.005)); #ifdef VORONOI_DEBUG_OUT dump_voronoi_to_svg(debug_out_path("voronoi-offset-in-%lf.svg", ot.distance).c_str(), vd, Points(), lines, offsetted_polygons_in); #endif + REQUIRE(offsetted_polygons_in.size() == ot.num_inner); } } @@ -1296,21 +1431,20 @@ TEST_CASE("Voronoi offset 2", "[VoronoiOffset]") OffsetTest { scale_(0.4), 2, 2 }, OffsetTest { scale_(0.45), 2, 2 }, OffsetTest { scale_(0.48), 2, 2 }, -//FIXME Exact intersections of an Offset curve with any Voronoi vertex are not handled correctly yet. -// OffsetTest { scale_(0.5), 2, 2 }, + OffsetTest { scale_(0.5), 2, 4 }, OffsetTest { scale_(0.505), 2, 4 }, OffsetTest { scale_(0.7), 2, 0 }, OffsetTest { scale_(0.8), 1, 0 } }) { - Polygons offsetted_polygons_out = voronoi_offset(vd, lines, ot.distance, scale_(0.005)); + Polygons offsetted_polygons_out = Slic3r::Voronoi::offset(vd, lines, ot.distance, scale_(0.005)); #ifdef VORONOI_DEBUG_OUT dump_voronoi_to_svg(debug_out_path("voronoi-offset2-out-%lf.svg", ot.distance).c_str(), vd, Points(), lines, offsetted_polygons_out); #endif REQUIRE(offsetted_polygons_out.size() == ot.num_outer); - Polygons offsetted_polygons_in = voronoi_offset(vd, lines, - ot.distance, scale_(0.005)); + Polygons offsetted_polygons_in = Slic3r::Voronoi::offset(vd, lines, - ot.distance, scale_(0.005)); #ifdef VORONOI_DEBUG_OUT dump_voronoi_to_svg(debug_out_path("voronoi-offset2-in-%lf.svg", ot.distance).c_str(), vd, Points(), lines, offsetted_polygons_in); @@ -1360,14 +1494,13 @@ TEST_CASE("Voronoi offset 3", "[VoronoiOffset]") VD vd; Lines lines = to_lines(poly); - construct_voronoi(lines.begin(), lines.end(), &vd); + construct_voronoi(lines.begin(), lines.end(), &vd); for (const OffsetTest &ot : { OffsetTest { scale_(0.2), 2, 2 }, OffsetTest { scale_(0.4), 2, 2 }, OffsetTest { scale_(0.49), 2, 2 }, -//FIXME this fails -// OffsetTest { scale_(0.5), 2, 2 }, + OffsetTest { scale_(0.5), 2, 2 }, OffsetTest { scale_(0.51), 2, 2 }, OffsetTest { scale_(0.56), 2, 2 }, OffsetTest { scale_(0.6), 2, 2 }, @@ -1375,23 +1508,417 @@ TEST_CASE("Voronoi offset 3", "[VoronoiOffset]") OffsetTest { scale_(0.8), 1, 6 }, OffsetTest { scale_(0.9), 1, 6 }, OffsetTest { scale_(0.99), 1, 6 }, -//FIXME this fails -// OffsetTest { scale_(1.0), 1, 6 }, + OffsetTest { scale_(1.0), 1, 0 }, OffsetTest { scale_(1.01), 1, 0 }, }) { - Polygons offsetted_polygons_out = voronoi_offset(vd, lines, ot.distance, scale_(0.005)); + Polygons offsetted_polygons_out = Slic3r::Voronoi::offset(vd, lines, ot.distance, scale_(0.005)); #ifdef VORONOI_DEBUG_OUT - dump_voronoi_to_svg(debug_out_path("voronoi-offset2-out-%lf.svg", ot.distance).c_str(), + dump_voronoi_to_svg(debug_out_path("voronoi-offset3-out-%lf.svg", ot.distance).c_str(), vd, Points(), lines, offsetted_polygons_out); #endif REQUIRE(offsetted_polygons_out.size() == ot.num_outer); - Polygons offsetted_polygons_in = voronoi_offset(vd, lines, - ot.distance, scale_(0.005)); + Polygons offsetted_polygons_in = Slic3r::Voronoi::offset(vd, lines, - ot.distance, scale_(0.005)); #ifdef VORONOI_DEBUG_OUT - dump_voronoi_to_svg(debug_out_path("voronoi-offset2-in-%lf.svg", ot.distance).c_str(), + dump_voronoi_to_svg(debug_out_path("voronoi-offset3-in-%lf.svg", ot.distance).c_str(), vd, Points(), lines, offsetted_polygons_in); #endif REQUIRE(offsetted_polygons_in.size() == ot.num_inner); } } + +TEST_CASE("Voronoi offset with edge collapse", "[VoronoiOffset4]") +{ + Polygons poly + { + // Outer contour + { + { 434890, -64754575 }, + { 541060, -64669076 }, + { 585647, -64583538 }, + { 576999, -64484233 }, + { 485666, -64191173 }, + { 1029323, -63646261 }, + { 1416925, -63666243 }, + { 1541532, -63643075 }, + { 1541535, -63643075 }, + { 1541535, -63643074 }, + { 1552612, -63641015 }, + { 1631609, -63568270 }, + { 1678393, -63443639 }, + { 1725519, -63219942 }, + { 1770552, -62903321 }, + { 1742544, -62755934 }, + { 1758152, -62588378 }, + { 1702289, -62474826 }, + { 1638627, -62242058 }, + { 1671281, -61938568 }, + { 1792676, -61478332 }, + { 1934894, -60760597 }, + { 2160333, -60064089 }, + { 2638183, -58972890 }, + { 2933095, -58478536 }, + { 3173586, -58159527 }, + { 3557779, -57556727 }, + { 3707088, -57158174 }, + { 3758053, -56907139 }, + { 3935932, -56278649 }, + { 4077331, -56033426 }, + { 4151386, -55768739 }, + { 4293796, -55561683 }, + { 4383089, -55387391 }, + { 4614128, -55201443 }, + { 5268755, -54333831 }, + { 5547634, -53797296 }, + { 5573864, -53639250 }, + { 5736812, -53304157 }, + { 6090973, -52066302 }, + { 6148630, -51666664 }, + { 6189511, -50974991 }, + { 6244112, -50774489 }, + { 6302489, -50761556 }, + { 6511179, -50579861 }, + { 6778128, -50398667 }, + { 6896879, -50350264 }, + { 7388259, -49913262 }, + { 7630584, -49602449 }, + { 7886846, -48987881 }, + { 7871333, -48318666 }, + { 7770349, -47841179 }, + { 7570223, -47234733 }, + { 7283115, -46705503 }, + { 6842948, -46056539 }, + { 6612732, -45760004 }, + { 6150430, -44991494 }, + { 5564326, -44168114 }, + { 5193032, -43807544 }, + { 4932097, -43489047 }, + { 3857385, -42548846 }, + { 3764745, -42081468 }, + { 3539887, -41422273 }, + { 3283048, -40803856 }, + { 3005925, -40367981 }, + { 3136185, -39834533 }, + { 3333757, -38499972 }, + { 3360660, -38183895 }, + { 3353375, -38036005 }, + { 3398808, -37582504 }, + { 3604229, -37221781 }, + { 3698079, -36962934 }, + { 4000449, -36007804 }, + { 4256811, -35016707 }, + { 4405951, -34581428 }, + { 4364534, -34178439 }, + { 4124603, -33432250 }, + { 3806159, -32765167 }, + { 3359088, -32109020 }, + { 2880790, -31317192 }, + { 1548334, -30402139 }, + { -7, -30131023 }, + { -1548347, -30402139 }, + { -2880803, -31317189 }, + { -3359100, -32109018 }, + { -3806173, -32765166 }, + { -4124617, -33432248 }, + { -4364548, -34178436 }, + { -4405966, -34581423 }, + { -4256825, -35016707 }, + { -4000461, -36007800 }, + { -3698093, -36962933 }, + { -3604243, -37221781 }, + { -3398823, -37582501 }, + { -3353390, -38036003 }, + { -3360675, -38183892 }, + { -3333772, -38499972 }, + { -3136200, -39834530 }, + { -3005940, -40367980 }, + { -3283062, -40803852 }, + { -3539902, -41422273 }, + { -3764761, -42081468 }, + { -3857402, -42548846 }, + { -4932112, -43489047 }, + { -5193047, -43807544 }, + { -5564341, -44168114 }, + { -6150446, -44991494 }, + { -6612748, -45760000 }, + { -6842965, -46056536 }, + { -7283130, -46705503 }, + { -7570238, -47234733 }, + { -7770365, -47841179 }, + { -7871349, -48318666 }, + { -7886860, -48987873 }, + { -7630599, -49602451 }, + { -7388277, -49913260 }, + { -6896896, -50350264 }, + { -6778145, -50398667 }, + { -6511196, -50579862 }, + { -6302504, -50761557 }, + { -6244127, -50774488 }, + { -6189527, -50974989 }, + { -6148648, -51666664 }, + { -6090990, -52066302 }, + { -5736829, -53304157 }, + { -5573882, -53639250 }, + { -5547651, -53797296 }, + { -5268772, -54333831 }, + { -4614145, -55201443 }, + { -4383106, -55387389 }, + { -4293814, -55561683 }, + { -4151404, -55768739 }, + { -4077350, -56033423 }, + { -3935952, -56278647 }, + { -3758072, -56907137 }, + { -3707107, -57158170 }, + { -3557796, -57556727 }, + { -3173605, -58159527 }, + { -2933113, -58478536 }, + { -2638201, -58972890 }, + { -2295003, -59738435 }, + { -2160353, -60064089 }, + { -1978487, -60596626 }, + { -1792695, -61478332 }, + { -1671298, -61938574 }, + { -1638646, -62242058 }, + { -1702306, -62474826 }, + { -1758168, -62588380 }, + { -1742563, -62755934 }, + { -1770570, -62903317 }, + { -1725537, -63219946 }, + { -1678412, -63443639 }, + { -1631627, -63568270 }, + { -1553479, -63640201 }, + { -1416944, -63666243 }, + { -998854, -63645714 }, + { -485685, -64191173 }, + { -577019, -64484225 }, + { -585667, -64583538 }, + { -541079, -64669076 }, + { -434910, -64754575 }, + { -294192, -64810609 }, + { 294172, -64810609 }, + }, + // Hole 1 + { + { -842246, -45167428 }, + { -1473641, -45154392 }, + { -2181728, -45100161 }, + { -2804308, -44985842 }, + { -3100514, -44879269 }, + { -3836807, -44802155 }, + { -4035816, -44718913 }, + { -4167175, -44583299 }, + { -4496705, -44467674 }, + { -4486674, -44382045 }, + { -4343949, -44070577 }, + { -3740991, -43494686 }, + { -2701372, -43313358 }, + { -1493599, -43312838 }, + { -8, -43352868 }, + { 1414575, -43313336 }, + { 2701358, -43313358 }, + { 3095462, -43374735 }, + { 3740975, -43494686 }, + { 4343934, -44070583 }, + { 4486657, -44382044 }, + { 4496688, -44467670 }, + { 4167159, -44583300 }, + { 4035800, -44718913 }, + { 3836792, -44802155 }, + { 3100498, -44879269 }, + { 2804292, -44985842 }, + { 2181712, -45100161 }, + { 1473625, -45154389 }, + { 842231, -45167428 }, + { -8, -45232686 }, + }, + // Hole 2 + { + { 1657455, -63016679 }, + { 1723196, -63056286 }, + { 1541535, -63643074 }, + { 1541532, -63643075 }, + { 1030020, -63645562 }, + } + }; + + + VD vd; + Lines lines = to_lines(poly); + construct_voronoi(lines.begin(), lines.end(), &vd); + + for (const OffsetTest &ot : { + OffsetTest { scale_(0.2), 2, 2 }, + OffsetTest { scale_(0.4), 2, 2 }, + OffsetTest { scale_(0.49), 2, 3 }, + OffsetTest { scale_(0.51), 2, 2 }, + OffsetTest { scale_(0.56), 2, 2 }, + OffsetTest { scale_(0.6), 2, 2 }, + OffsetTest { scale_(0.7), 2, 2 }, + OffsetTest { scale_(0.8), 2, 2 }, + OffsetTest { scale_(0.9), 2, 2 }, + OffsetTest { scale_(0.99), 1, 2 }, + OffsetTest { scale_(1.0), 1, 2 }, + OffsetTest { scale_(1.01), 1, 2 }, + }) { + + Polygons offsetted_polygons_out = Slic3r::Voronoi::offset(vd, lines, ot.distance, scale_(0.005)); +#ifdef VORONOI_DEBUG_OUT + dump_voronoi_to_svg(debug_out_path("voronoi-offset3-out-%lf.svg", ot.distance).c_str(), + vd, Points(), lines, offsetted_polygons_out); +#endif + REQUIRE(offsetted_polygons_out.size() == ot.num_outer); + + Polygons offsetted_polygons_in = Slic3r::Voronoi::offset(vd, lines, - ot.distance, scale_(0.005)); +#ifdef VORONOI_DEBUG_OUT + dump_voronoi_to_svg(debug_out_path("voronoi-offset3-in-%lf.svg", ot.distance).c_str(), + vd, Points(), lines, offsetted_polygons_in); +#endif + REQUIRE(offsetted_polygons_in.size() == ot.num_inner); + } +} + +// A sample extracted from file medallion_printable_fixed-teeth.stl from https://www.thingiverse.com/thing:1347129 +// This test for offset scale_(2.9) and bigger +// triggers assert(r < std::max(d0, d1) + EPSILON) in function first_circle_segment_intersection_parameter. +TEST_CASE("Voronoi offset 5", "[VoronoiOffset5]") +{ + Polygons poly = { + Polygon { + { 0 , -16077501 }, + { 3015222 , -16142836 }, + { 3072642 , -16138163 }, + { 3094279 , -16105662 }, + { 3110660 , -15140728 }, + { 3157438 , -14105326 }, + { 3338367 , -11081394 }, + { 3443412 , -8381621 }, + { 3472489 , -6084497 }, + { 3445790 , -5962924 }, + { 3061725 , -6003484 }, + { 3030326 , -6030622 }, + { 2989343 , -6270378 }, + { 2903752 , -7368176 }, + { 2856704 , -7740619 }, + { 2795743 , -7978809 }, + { 2729231 , -8098866 }, + { 2666509 , -8131138 }, + { 2614169 , -8112308 }, + { 2561157 , -8032014 }, + { 2488290 , -7479351 }, + { 2453360 , -6911556 }, + { 2456148 , -6463146 }, + { 2546029 , -4580396 }, + { 2688181 , -2593262 }, + { 2717617 , -1700519 }, + { 2682232 , -1128411 }, + { 2631029 , -832886 }, + { 2535941 , -504483 }, + { 2399115 , -199303 }, + { 2290997 , -171213 }, + { 611824 , -132865 }, + { 6419 , -375849 }, + { -611825 , -132865 }, + { -2377355 , -185241 }, + { -2420740 , -231171 }, + { -2535942 , -504484 }, + { -2631030 , -832887 }, + { -2684831 , -1150821 }, + { -2714840 , -1586454 }, + { -2688181 , -2593262 }, + { -2546030 , -4580396 }, + { -2456149 , -6463145 }, + { -2453361 , -6911557 }, + { -2488291 , -7479352 }, + { -2561159 , -8032018 }, + { -2614171 , -8112309 }, + { -2666509 , -8131138 }, + { -2729233 , -8098868 }, + { -2795744 , -7978809 }, + { -2856706 , -7740619 }, + { -2903752 , -7368176 }, + { -2989345 , -6270378 }, + { -3030327 , -6030622 }, + { -3061726 , -6003484 }, + { -3445790 , -5962924 }, + { -3472490 , -6084498 }, + { -3468804 , -7244095 }, + { -3399287 , -9714025 }, + { -3338368 , -11081395 }, + { -3141015 , -14446051 }, + { -3094280 , -16105662 }, + { -3072643 , -16138163 }, + { -3008836 , -16143225 } + } + }; + double area = std::accumulate(poly.begin(), poly.end(), 0., [](double a, auto &poly){ return a + poly.area(); }); + REQUIRE(area > 0.); + + VD vd; + Lines lines = to_lines(poly); + construct_voronoi(lines.begin(), lines.end(), &vd); + + for (const OffsetTest &ot : { + OffsetTest { scale_(2.8), 1, 1 }, + OffsetTest { scale_(2.9), 1, 1 }, + OffsetTest { scale_(3.0), 1, 1 }, + }) { + + Polygons offsetted_polygons_out = Slic3r::Voronoi::offset(vd, lines, ot.distance, scale_(0.005)); +#ifdef VORONOI_DEBUG_OUT + dump_voronoi_to_svg(debug_out_path("voronoi-offset5-out-%lf.svg", ot.distance).c_str(), + vd, Points(), lines, offsetted_polygons_out); +#endif + REQUIRE(offsetted_polygons_out.size() == ot.num_outer); + + Polygons offsetted_polygons_in = Slic3r::Voronoi::offset(vd, lines, - ot.distance, scale_(0.005)); +#ifdef VORONOI_DEBUG_OUT + dump_voronoi_to_svg(debug_out_path("voronoi-offset5-in-%lf.svg", ot.distance).c_str(), + vd, Points(), lines, offsetted_polygons_in); +#endif + REQUIRE(offsetted_polygons_in.size() == ot.num_inner); + } +} + +TEST_CASE("Voronoi skeleton", "[VoronoiSkeleton]") +{ + coord_t mm = coord_t(scale_(1.)); + Polygons poly = { + Polygon { + { 0, 0 }, + { 1, 0 }, + { 1, 1 }, + { 2, 1 }, + { 2, 0 }, + { 3, 0 }, + { 3, 2 }, + { 0, 2 } + }, + Polygon { + { 0, - 1 - 2 }, + { 3, - 1 - 2 }, + { 3, - 1 - 0 }, + { 2, - 1 - 0 }, + { 2, - 1 - 1 }, + { 1, - 1 - 1 }, + { 1, - 1 - 0 }, + { 0, - 1 - 0 } + }, + }; + for (Polygon &p : poly) + for (Point &pt : p.points) + pt *= mm; + + double area = std::accumulate(poly.begin(), poly.end(), 0., [](double a, auto &poly){ return a + poly.area(); }); + REQUIRE(area > 0.); + + VD vd; + Lines lines = to_lines(poly); + construct_voronoi(lines.begin(), lines.end(), &vd); + Slic3r::Voronoi::annotate_inside_outside(vd, lines); + Slic3r::Voronoi::annotate_inside_outside(vd, lines); + static constexpr double threshold_alpha = M_PI / 12.; // 30 degrees + std::vector skeleton_edges = Slic3r::Voronoi::skeleton_edges_rough(vd, lines, threshold_alpha); + + REQUIRE(! skeleton_edges.empty()); +} From f939cac841ade7de0177e40ad768003f489459a1 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 1 Feb 2021 14:33:07 +0100 Subject: [PATCH 102/143] #5071 - Reload from disk for 3mf files --- src/libslic3r/Format/3mf.cpp | 705 ++++++++++++++------------------- src/libslic3r/Technologies.hpp | 1 + 2 files changed, 298 insertions(+), 408 deletions(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index fada01ea240..7a066f25594 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -144,8 +144,7 @@ const char* get_attribute_value_charptr(const char** attributes, unsigned int at if ((attributes == nullptr) || (attributes_size == 0) || (attributes_size % 2 != 0) || (attribute_key == nullptr)) return nullptr; - for (unsigned int a = 0; a < attributes_size; a += 2) - { + for (unsigned int a = 0; a < attributes_size; a += 2) { if (::strcmp(attributes[a], attribute_key) == 0) return attributes[a + 1]; } @@ -198,10 +197,8 @@ Slic3r::Transform3d get_transform_from_3mf_specs_string(const std::string& mat_s unsigned int i = 0; // matrices are stored into 3mf files as 4x3 // we need to transpose them - for (unsigned int c = 0; c < 4; ++c) - { - for (unsigned int r = 0; r < 3; ++r) - { + for (unsigned int c = 0; c < 4; ++c) { + for (unsigned int r = 0; r < 3; ++r) { ret(r, c) = ::atof(mat_elements_str[i++].c_str()); } } @@ -233,8 +230,7 @@ bool is_valid_object_type(const std::string& type) if (type.empty()) return true; - for (unsigned int i = 0; i < VALID_OBJECT_TYPES_COUNT; ++i) - { + for (unsigned int i = 0; i < VALID_OBJECT_TYPES_COUNT; ++i) { if (::strcmp(type.c_str(), VALID_OBJECT_TYPES[i]) == 0) return true; } @@ -261,8 +257,7 @@ namespace Slic3r { public: void log_errors() { - for (const std::string& error : m_errors) - { + for (const std::string& error : m_errors) { printf("%s\n", error.c_str()); } } @@ -297,13 +292,9 @@ namespace Slic3r { std::vector custom_supports; std::vector custom_seam; - bool empty() - { - return vertices.empty() || triangles.empty(); - } + bool empty() { return vertices.empty() || triangles.empty(); } - void reset() - { + void reset() { vertices.clear(); triangles.clear(); custom_supports.clear(); @@ -321,13 +312,9 @@ namespace Slic3r { ModelObject* object; ComponentsList components; - CurrentObject() - { - reset(); - } + CurrentObject() { reset(); } - void reset() - { + void reset() { id = -1; model_object_idx = -1; geometry.reset(); @@ -563,8 +550,7 @@ namespace Slic3r { void _3MF_Importer::_destroy_xml_parser() { - if (m_xml_parser != nullptr) - { + if (m_xml_parser != nullptr) { XML_ParserFree(m_xml_parser); m_xml_parser = nullptr; } @@ -593,20 +579,16 @@ namespace Slic3r { m_name = boost::filesystem::path(filename).filename().stem().string(); // we first loop the entries to read from the archive the .model file only, in order to extract the version from it - for (mz_uint i = 0; i < num_entries; ++i) - { - if (mz_zip_reader_file_stat(&archive, i, &stat)) - { + for (mz_uint i = 0; i < num_entries; ++i) { + if (mz_zip_reader_file_stat(&archive, i, &stat)) { std::string name(stat.m_filename); std::replace(name.begin(), name.end(), '\\', '/'); - if (boost::algorithm::istarts_with(name, MODEL_FOLDER) && boost::algorithm::iends_with(name, MODEL_EXTENSION)) - { + if (boost::algorithm::istarts_with(name, MODEL_FOLDER) && boost::algorithm::iends_with(name, MODEL_EXTENSION)) { try { // valid model name -> extract model - if (!_extract_model_from_archive(archive, stat)) - { + if (!_extract_model_from_archive(archive, stat)) { close_zip_reader(&archive); add_error("Archive does not contain a valid model"); return false; @@ -623,48 +605,38 @@ namespace Slic3r { } // we then loop again the entries to read other files stored in the archive - for (mz_uint i = 0; i < num_entries; ++i) - { - if (mz_zip_reader_file_stat(&archive, i, &stat)) - { + for (mz_uint i = 0; i < num_entries; ++i) { + if (mz_zip_reader_file_stat(&archive, i, &stat)) { std::string name(stat.m_filename); std::replace(name.begin(), name.end(), '\\', '/'); - if (boost::algorithm::iequals(name, LAYER_HEIGHTS_PROFILE_FILE)) - { + if (boost::algorithm::iequals(name, LAYER_HEIGHTS_PROFILE_FILE)) { // extract slic3r layer heights profile file _extract_layer_heights_profile_config_from_archive(archive, stat); } - if (boost::algorithm::iequals(name, LAYER_CONFIG_RANGES_FILE)) - { + else if (boost::algorithm::iequals(name, LAYER_CONFIG_RANGES_FILE)) { // extract slic3r layer config ranges file _extract_layer_config_ranges_from_archive(archive, stat); } - else if (boost::algorithm::iequals(name, SLA_SUPPORT_POINTS_FILE)) - { + else if (boost::algorithm::iequals(name, SLA_SUPPORT_POINTS_FILE)) { // extract sla support points file _extract_sla_support_points_from_archive(archive, stat); } - else if (boost::algorithm::iequals(name, SLA_DRAIN_HOLES_FILE)) - { + else if (boost::algorithm::iequals(name, SLA_DRAIN_HOLES_FILE)) { // extract sla support points file _extract_sla_drain_holes_from_archive(archive, stat); } - else if (boost::algorithm::iequals(name, PRINT_CONFIG_FILE)) - { + else if (boost::algorithm::iequals(name, PRINT_CONFIG_FILE)) { // extract slic3r print config file _extract_print_config_from_archive(archive, stat, config, filename); } - if (boost::algorithm::iequals(name, CUSTOM_GCODE_PER_PRINT_Z_FILE)) - { + else if (boost::algorithm::iequals(name, CUSTOM_GCODE_PER_PRINT_Z_FILE)) { // extract slic3r layer config ranges file _extract_custom_gcode_per_print_z_from_archive(archive, stat); } - else if (boost::algorithm::iequals(name, MODEL_CONFIG_FILE)) - { + else if (boost::algorithm::iequals(name, MODEL_CONFIG_FILE)) { // extract slic3r model config file - if (!_extract_model_config_from_archive(archive, stat, model)) - { + if (!_extract_model_config_from_archive(archive, stat, model)) { close_zip_reader(&archive); add_error("Archive does not contain a valid model config"); return false; @@ -675,15 +647,57 @@ namespace Slic3r { close_zip_reader(&archive); - for (const IdToModelObjectMap::value_type& object : m_objects) - { - ModelObject *model_object = m_model->objects[object.second]; - ObjectMetadata::VolumeMetadataList volumes; - ObjectMetadata::VolumeMetadataList* volumes_ptr = nullptr; +#if ENABLE_RELOAD_FROM_DISK_FOR_3MF + if (m_version == 0) { + // if the 3mf was not produced by PrusaSlicer and there is more than one instance, + // split the object in as many objects as instances + size_t curr_models_count = m_model->objects.size(); + size_t i = 0; + while (i < curr_models_count) { + ModelObject* model_object = m_model->objects[i]; + if (model_object->instances.size() > 1) { + // select the geometry associated with the original model object + const Geometry* geometry = nullptr; + for (const IdToModelObjectMap::value_type& object : m_objects) { + if (static_cast(object.second) == i) { + IdToGeometryMap::const_iterator obj_geometry = m_geometries.find(object.first); + if (obj_geometry == m_geometries.end()) { + add_error("Unable to find object geometry"); + return false; + } + geometry = &obj_geometry->second; + break; + } + } + + if (geometry == nullptr) { + add_error("Unable to find object geometry"); + return false; + } + // use the geometry to create the volumes in the new model objects + ObjectMetadata::VolumeMetadataList volumes(1, { 0, (unsigned int)geometry->triangles.size() / 3 - 1 }); + + // for each instance after the 1st, create a new model object containing only that instance + // and copy into it the geometry + while (model_object->instances.size() > 1) { + ModelObject* new_model_object = m_model->add_object(*model_object); + new_model_object->clear_instances(); + new_model_object->add_instance(*model_object->instances.back()); + model_object->delete_last_instance(); + if (!_generate_volumes(*new_model_object, *geometry, volumes)) + return false; + } + } + ++i; + } + } +#endif // ENABLE_RELOAD_FROM_DISK_FOR_3MF + + for (const IdToModelObjectMap::value_type& object : m_objects) { + ModelObject* model_object = m_model->objects[object.second]; IdToGeometryMap::const_iterator obj_geometry = m_geometries.find(object.first); - if (obj_geometry == m_geometries.end()) - { + if (obj_geometry == m_geometries.end()) { add_error("Unable to find object geometry"); return false; } @@ -704,20 +718,21 @@ namespace Slic3r { model_object->sla_support_points = std::move(obj_sla_support_points->second); model_object->sla_points_status = sla::PointsStatus::UserModified; } - + IdToSlaDrainHolesMap::iterator obj_drain_holes = m_sla_drain_holes.find(object.second + 1); if (obj_drain_holes != m_sla_drain_holes.end() && !obj_drain_holes->second.empty()) { model_object->sla_drain_holes = std::move(obj_drain_holes->second); } + ObjectMetadata::VolumeMetadataList volumes; + ObjectMetadata::VolumeMetadataList* volumes_ptr = nullptr; + IdToMetadataMap::iterator obj_metadata = m_objects_metadata.find(object.first); - if (obj_metadata != m_objects_metadata.end()) - { + if (obj_metadata != m_objects_metadata.end()) { // config data has been found, this model was saved using slic3r pe // apply object's name and config data - for (const Metadata& metadata : obj_metadata->second.metadata) - { + for (const Metadata& metadata : obj_metadata->second.metadata) { if (metadata.key == "name") model_object->name = metadata.value; else @@ -727,8 +742,7 @@ namespace Slic3r { // select object's detected volumes volumes_ptr = &obj_metadata->second.volumes; } - else - { + else { // config data not found, this model was not saved using slic3r pe // add the entire geometry as the single volume to generate @@ -742,6 +756,24 @@ namespace Slic3r { return false; } +#if ENABLE_RELOAD_FROM_DISK_FOR_3MF + int object_idx = 0; + for (ModelObject* o : model.objects) { + int volume_idx = 0; + for (ModelVolume* v : o->volumes) { + if (v->source.input_file.empty() && v->type() == ModelVolumeType::MODEL_PART) { + v->source.input_file = filename; + if (v->source.volume_idx == -1) + v->source.volume_idx = volume_idx; + if (v->source.object_idx == -1) + v->source.object_idx = object_idx; + } + ++volume_idx; + } + ++object_idx; + } +#endif // ENABLE_RELOAD_FROM_DISK_FOR_3MF + // // fixes the min z of the model if negative // model.adjust_min_z(); @@ -750,8 +782,7 @@ namespace Slic3r { bool _3MF_Importer::_extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat) { - if (stat.m_uncomp_size == 0) - { + if (stat.m_uncomp_size == 0) { add_error("Found invalid size"); return false; } @@ -759,8 +790,7 @@ namespace Slic3r { _destroy_xml_parser(); m_xml_parser = XML_ParserCreate(nullptr); - if (m_xml_parser == nullptr) - { + if (m_xml_parser == nullptr) { add_error("Unable to create parser"); return false; } @@ -785,8 +815,7 @@ namespace Slic3r { { res = mz_zip_reader_extract_file_to_callback(&archive, stat.m_filename, [](void* pOpaque, mz_uint64 file_ofs, const void* pBuf, size_t n)->size_t { CallbackData* data = (CallbackData*)pOpaque; - if (!XML_Parse(data->parser, (const char*)pBuf, (int)n, (file_ofs + n == data->stat.m_uncomp_size) ? 1 : 0)) - { + if (!XML_Parse(data->parser, (const char*)pBuf, (int)n, (file_ofs + n == data->stat.m_uncomp_size) ? 1 : 0)) { char error_buf[1024]; ::sprintf(error_buf, "Error (%s) while parsing '%s' at line %d", XML_ErrorString(XML_GetErrorCode(data->parser)), data->stat.m_filename, (int)XML_GetCurrentLineNumber(data->parser)); throw Slic3r::FileIOError(error_buf); @@ -806,8 +835,7 @@ namespace Slic3r { return false; } - if (res == 0) - { + if (res == 0) { add_error("Error while extracting model data from zip archive"); return false; } @@ -817,12 +845,10 @@ namespace Slic3r { void _3MF_Importer::_extract_print_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, DynamicPrintConfig& config, const std::string& archive_filename) { - if (stat.m_uncomp_size > 0) - { + if (stat.m_uncomp_size > 0) { std::string buffer((size_t)stat.m_uncomp_size, 0); mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); - if (res == 0) - { + if (res == 0) { add_error("Error while reading config data to buffer"); return; } @@ -832,12 +858,10 @@ namespace Slic3r { void _3MF_Importer::_extract_layer_heights_profile_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat) { - if (stat.m_uncomp_size > 0) - { + if (stat.m_uncomp_size > 0) { std::string buffer((size_t)stat.m_uncomp_size, 0); mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); - if (res == 0) - { + if (res == 0) { add_error("Error while reading layer heights profile data to buffer"); return; } @@ -848,42 +872,36 @@ namespace Slic3r { std::vector objects; boost::split(objects, buffer, boost::is_any_of("\n"), boost::token_compress_off); - for (const std::string& object : objects) - { + for (const std::string& object : objects) { std::vector object_data; boost::split(object_data, object, boost::is_any_of("|"), boost::token_compress_off); - if (object_data.size() != 2) - { + if (object_data.size() != 2) { add_error("Error while reading object data"); continue; } std::vector object_data_id; boost::split(object_data_id, object_data[0], boost::is_any_of("="), boost::token_compress_off); - if (object_data_id.size() != 2) - { + if (object_data_id.size() != 2) { add_error("Error while reading object id"); continue; } int object_id = std::atoi(object_data_id[1].c_str()); - if (object_id == 0) - { + if (object_id == 0) { add_error("Found invalid object id"); continue; } IdToLayerHeightsProfileMap::iterator object_item = m_layer_heights_profiles.find(object_id); - if (object_item != m_layer_heights_profiles.end()) - { + if (object_item != m_layer_heights_profiles.end()) { add_error("Found duplicated layer heights profile"); continue; } std::vector object_data_profile; boost::split(object_data_profile, object_data[1], boost::is_any_of(";"), boost::token_compress_off); - if ((object_data_profile.size() <= 4) || (object_data_profile.size() % 2 != 0)) - { + if (object_data_profile.size() <= 4 || object_data_profile.size() % 2 != 0) { add_error("Found invalid layer heights profile"); continue; } @@ -891,20 +909,18 @@ namespace Slic3r { std::vector profile; profile.reserve(object_data_profile.size()); - for (const std::string& value : object_data_profile) - { + for (const std::string& value : object_data_profile) { profile.push_back((coordf_t)std::atof(value.c_str())); } - m_layer_heights_profiles.insert(IdToLayerHeightsProfileMap::value_type(object_id, profile)); + m_layer_heights_profiles.insert({ object_id, profile }); } } } void _3MF_Importer::_extract_layer_config_ranges_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat) { - if (stat.m_uncomp_size > 0) - { + if (stat.m_uncomp_size > 0) { std::string buffer((size_t)stat.m_uncomp_size, 0); mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); if (res == 0) { @@ -916,8 +932,7 @@ namespace Slic3r { pt::ptree objects_tree; pt::read_xml(iss, objects_tree); - for (const auto& object : objects_tree.get_child("objects")) - { + for (const auto& object : objects_tree.get_child("objects")) { pt::ptree object_tree = object.second; int obj_idx = object_tree.get(".id", -1); if (obj_idx <= 0) { @@ -933,8 +948,7 @@ namespace Slic3r { t_layer_config_ranges config_ranges; - for (const auto& range : object_tree) - { + for (const auto& range : object_tree) { if (range.first != "range") continue; pt::ptree range_tree = range.second; @@ -944,8 +958,7 @@ namespace Slic3r { // get Z range information DynamicPrintConfig config; - for (const auto& option : range_tree) - { + for (const auto& option : range_tree) { if (option.first != "option") continue; std::string opt_key = option.second.get(".opt_key"); @@ -958,19 +971,17 @@ namespace Slic3r { } if (!config_ranges.empty()) - m_layer_config_ranges.insert(IdToLayerConfigRangesMap::value_type(obj_idx, std::move(config_ranges))); + m_layer_config_ranges.insert({ obj_idx, std::move(config_ranges) }); } } } void _3MF_Importer::_extract_sla_support_points_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat) { - if (stat.m_uncomp_size > 0) - { + if (stat.m_uncomp_size > 0) { std::string buffer((size_t)stat.m_uncomp_size, 0); mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); - if (res == 0) - { + if (res == 0) { add_error("Error while reading sla support points data to buffer"); return; } @@ -990,35 +1001,30 @@ namespace Slic3r { objects.erase(objects.begin()); // pop the header } - for (const std::string& object : objects) - { + for (const std::string& object : objects) { std::vector object_data; boost::split(object_data, object, boost::is_any_of("|"), boost::token_compress_off); - if (object_data.size() != 2) - { + if (object_data.size() != 2) { add_error("Error while reading object data"); continue; } std::vector object_data_id; boost::split(object_data_id, object_data[0], boost::is_any_of("="), boost::token_compress_off); - if (object_data_id.size() != 2) - { + if (object_data_id.size() != 2) { add_error("Error while reading object id"); continue; } int object_id = std::atoi(object_data_id[1].c_str()); - if (object_id == 0) - { + if (object_id == 0) { add_error("Found invalid object id"); continue; } IdToSlaSupportPointsMap::iterator object_item = m_sla_support_points.find(object_id); - if (object_item != m_sla_support_points.end()) - { + if (object_item != m_sla_support_points.end()) { add_error("Found duplicated SLA support points"); continue; } @@ -1047,19 +1053,17 @@ namespace Slic3r { } if (!sla_support_points.empty()) - m_sla_support_points.insert(IdToSlaSupportPointsMap::value_type(object_id, sla_support_points)); + m_sla_support_points.insert({ object_id, sla_support_points }); } } } void _3MF_Importer::_extract_sla_drain_holes_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat) { - if (stat.m_uncomp_size > 0) - { + if (stat.m_uncomp_size > 0) { std::string buffer(size_t(stat.m_uncomp_size), 0); mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); - if (res == 0) - { + if (res == 0) { add_error("Error while reading sla support points data to buffer"); return; } @@ -1079,35 +1083,30 @@ namespace Slic3r { objects.erase(objects.begin()); // pop the header } - for (const std::string& object : objects) - { + for (const std::string& object : objects) { std::vector object_data; boost::split(object_data, object, boost::is_any_of("|"), boost::token_compress_off); - if (object_data.size() != 2) - { + if (object_data.size() != 2) { add_error("Error while reading object data"); continue; } std::vector object_data_id; boost::split(object_data_id, object_data[0], boost::is_any_of("="), boost::token_compress_off); - if (object_data_id.size() != 2) - { + if (object_data_id.size() != 2) { add_error("Error while reading object id"); continue; } int object_id = std::atoi(object_data_id[1].c_str()); - if (object_id == 0) - { + if (object_id == 0) { add_error("Found invalid object id"); continue; } IdToSlaDrainHolesMap::iterator object_item = m_sla_drain_holes.find(object_id); - if (object_item != m_sla_drain_holes.end()) - { + if (object_item != m_sla_drain_holes.end()) { add_error("Found duplicated SLA drain holes"); continue; } @@ -1139,17 +1138,14 @@ namespace Slic3r { } if (!sla_drain_holes.empty()) - m_sla_drain_holes.insert(IdToSlaDrainHolesMap::value_type(object_id, sla_drain_holes)); + m_sla_drain_holes.insert({ object_id, sla_drain_holes }); } } } - - bool _3MF_Importer::_extract_model_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, Model& model) { - if (stat.m_uncomp_size == 0) - { + if (stat.m_uncomp_size == 0) { add_error("Found invalid size"); return false; } @@ -1157,8 +1153,7 @@ namespace Slic3r { _destroy_xml_parser(); m_xml_parser = XML_ParserCreate(nullptr); - if (m_xml_parser == nullptr) - { + if (m_xml_parser == nullptr) { add_error("Unable to create parser"); return false; } @@ -1167,21 +1162,18 @@ namespace Slic3r { XML_SetElementHandler(m_xml_parser, _3MF_Importer::_handle_start_config_xml_element, _3MF_Importer::_handle_end_config_xml_element); void* parser_buffer = XML_GetBuffer(m_xml_parser, (int)stat.m_uncomp_size); - if (parser_buffer == nullptr) - { + if (parser_buffer == nullptr) { add_error("Unable to create buffer"); return false; } mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, parser_buffer, (size_t)stat.m_uncomp_size, 0); - if (res == 0) - { + if (res == 0) { add_error("Error while reading config data to buffer"); return false; } - if (!XML_ParseBuffer(m_xml_parser, (int)stat.m_uncomp_size, 1)) - { + if (!XML_ParseBuffer(m_xml_parser, (int)stat.m_uncomp_size, 1)) { char error_buf[1024]; ::sprintf(error_buf, "Error (%s) while parsing xml file at line %d", XML_ErrorString(XML_GetErrorCode(m_xml_parser)), (int)XML_GetCurrentLineNumber(m_xml_parser)); add_error(error_buf); @@ -1193,8 +1185,7 @@ namespace Slic3r { void _3MF_Importer::_extract_custom_gcode_per_print_z_from_archive(::mz_zip_archive &archive, const mz_zip_archive_file_stat &stat) { - if (stat.m_uncomp_size > 0) - { + if (stat.m_uncomp_size > 0) { std::string buffer((size_t)stat.m_uncomp_size, 0); mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); if (res == 0) { @@ -1212,10 +1203,8 @@ namespace Slic3r { m_model->custom_gcode_per_print_z.gcodes.clear(); - for (const auto& code : code_tree) - { - if (code.first == "mode") - { + for (const auto& code : code_tree) { + if (code.first == "mode") { pt::ptree tree = code.second; std::string mode = tree.get(".value"); m_model->custom_gcode_per_print_z.mode = mode == CustomGCode::SingleExtruderMode ? CustomGCode::Mode::SingleExtruder : @@ -1232,8 +1221,7 @@ namespace Slic3r { CustomGCode::Type type; std::string extra; - if (tree.find("type") == tree.not_found()) - { + if (tree.find("type") == tree.not_found()) { // It means that data was saved in old version (2.2.0 and older) of PrusaSlicer // read old data ... std::string gcode = tree.get (".gcode"); @@ -1244,8 +1232,7 @@ namespace Slic3r { extra = type == CustomGCode::PausePrint ? color : type == CustomGCode::Custom ? gcode : ""; } - else - { + else { type = static_cast(tree.get(".type")); extra = tree.get(".extra"); } @@ -1386,25 +1373,17 @@ namespace Slic3r { bool _3MF_Importer::_handle_end_model() { // deletes all non-built or non-instanced objects - for (const IdToModelObjectMap::value_type& object : m_objects) - { + for (const IdToModelObjectMap::value_type& object : m_objects) { ModelObject *model_object = m_model->objects[object.second]; - if ((model_object != nullptr) && (model_object->instances.size() == 0)) + if (model_object != nullptr && model_object->instances.size() == 0) m_model->delete_object(model_object); } // applies instances' matrices - for (Instance& instance : m_instances) - { - if (instance.instance != nullptr) - { - ModelObject* object = instance.instance->get_object(); - if (object != nullptr) - { - // apply the transform to the instance - _apply_transform(*instance.instance, instance.transform); - } - } + for (Instance& instance : m_instances) { + if (instance.instance != nullptr && instance.instance->get_object() != nullptr) + // apply the transform to the instance + _apply_transform(*instance.instance, instance.transform); } return true; @@ -1427,13 +1406,11 @@ namespace Slic3r { // reset current data m_curr_object.reset(); - if (is_valid_object_type(get_attribute_value_string(attributes, num_attributes, TYPE_ATTR))) - { + if (is_valid_object_type(get_attribute_value_string(attributes, num_attributes, TYPE_ATTR))) { // create new object (it may be removed later if no instances are generated from it) m_curr_object.model_object_idx = (int)m_model->objects.size(); m_curr_object.object = m_model->add_object(); - if (m_curr_object.object == nullptr) - { + if (m_curr_object.object == nullptr) { add_error("Unable to create object"); return false; } @@ -1451,16 +1428,13 @@ namespace Slic3r { bool _3MF_Importer::_handle_end_object() { - if (m_curr_object.object != nullptr) - { - if (m_curr_object.geometry.empty()) - { + if (m_curr_object.object != nullptr) { + if (m_curr_object.geometry.empty()) { // no geometry defined // remove the object from the model m_model->delete_object(m_curr_object.object); - if (m_curr_object.components.empty()) - { + if (m_curr_object.components.empty()) { // no components defined -> invalid object, delete it IdToModelObjectMap::iterator object_item = m_objects.find(m_curr_object.id); if (object_item != m_objects.end()) @@ -1472,21 +1446,18 @@ namespace Slic3r { } else // adds components to aliases - m_objects_aliases.insert(IdToAliasesMap::value_type(m_curr_object.id, m_curr_object.components)); + m_objects_aliases.insert({ m_curr_object.id, m_curr_object.components }); } - else - { + else { // geometry defined, store it for later use - m_geometries.insert(IdToGeometryMap::value_type(m_curr_object.id, std::move(m_curr_object.geometry))); + m_geometries.insert({ m_curr_object.id, std::move(m_curr_object.geometry) }); // stores the object for later use - if (m_objects.find(m_curr_object.id) == m_objects.end()) - { - m_objects.insert(IdToModelObjectMap::value_type(m_curr_object.id, m_curr_object.model_object_idx)); - m_objects_aliases.insert(IdToAliasesMap::value_type(m_curr_object.id, ComponentsList(1, Component(m_curr_object.id)))); // aliases itself + if (m_objects.find(m_curr_object.id) == m_objects.end()) { + m_objects.insert({ m_curr_object.id, m_curr_object.model_object_idx }); + m_objects_aliases.insert({ m_curr_object.id, { 1, Component(m_curr_object.id) } }); // aliases itself } - else - { + else { add_error("Found object with duplicate id"); return false; } @@ -1596,11 +1567,9 @@ namespace Slic3r { Transform3d transform = get_transform_from_3mf_specs_string(get_attribute_value_string(attributes, num_attributes, TRANSFORM_ATTR)); IdToModelObjectMap::iterator object_item = m_objects.find(object_id); - if (object_item == m_objects.end()) - { + if (object_item == m_objects.end()) { IdToAliasesMap::iterator alias_item = m_objects_aliases.find(object_id); - if (alias_item == m_objects_aliases.end()) - { + if (alias_item == m_objects_aliases.end()) { add_error("Found component with invalid object id"); return false; } @@ -1664,12 +1633,9 @@ namespace Slic3r { bool _3MF_Importer::_handle_end_metadata() { - if (m_curr_metadata_name == SLIC3RPE_3MF_VERSION) - { + if (m_curr_metadata_name == SLIC3RPE_3MF_VERSION) { m_version = (unsigned int)atoi(m_curr_characters.c_str()); - - if (m_check_version && (m_version > VERSION_3MF_COMPATIBLE)) - { + if (m_check_version && (m_version > VERSION_3MF_COMPATIBLE)) { // std::string msg = _(L("The selected 3mf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatible.")); // throw version_error(msg.c_str()); const std::string msg = (boost::format(_(L("The selected 3mf file has been saved with a newer version of %1% and is not compatible."))) % std::string(SLIC3R_APP_NAME)).str(); @@ -1685,34 +1651,28 @@ namespace Slic3r { static const unsigned int MAX_RECURSIONS = 10; // escape from circular aliasing - if (recur_counter > MAX_RECURSIONS) - { + if (recur_counter > MAX_RECURSIONS) { add_error("Too many recursions"); return false; } IdToAliasesMap::iterator it = m_objects_aliases.find(object_id); - if (it == m_objects_aliases.end()) - { + if (it == m_objects_aliases.end()) { add_error("Found item with invalid object id"); return false; } - if ((it->second.size() == 1) && (it->second[0].object_id == object_id)) - { + if (it->second.size() == 1 && it->second[0].object_id == object_id) { // aliasing to itself IdToModelObjectMap::iterator object_item = m_objects.find(object_id); - if ((object_item == m_objects.end()) || (object_item->second == -1)) - { + if (object_item == m_objects.end() || object_item->second == -1) { add_error("Found invalid object"); return false; } - else - { + else { ModelInstance* instance = m_model->objects[object_item->second]->add_instance(); - if (instance == nullptr) - { + if (instance == nullptr) { add_error("Unable to add object instance"); return false; } @@ -1721,11 +1681,9 @@ namespace Slic3r { m_instances.emplace_back(instance, transform); } } - else - { + else { // recursively process nested components - for (const Component& component : it->second) - { + for (const Component& component : it->second) { if (!_create_object_instance(component.object_id, transform * component.transform, printable, recur_counter + 1)) return false; } @@ -1760,8 +1718,7 @@ namespace Slic3r { { int object_id = get_attribute_value_int(attributes, num_attributes, ID_ATTR); IdToMetadataMap::iterator object_item = m_objects_metadata.find(object_id); - if (object_item != m_objects_metadata.end()) - { + if (object_item != m_objects_metadata.end()) { add_error("Found duplicated object id"); return false; } @@ -1769,7 +1726,7 @@ namespace Slic3r { // Added because of github #3435, currently not used by PrusaSlicer // int instances_count_id = get_attribute_value_int(attributes, num_attributes, INSTANCESCOUNT_ATTR); - m_objects_metadata.insert(IdToMetadataMap::value_type(object_id, ObjectMetadata())); + m_objects_metadata.insert({ object_id, ObjectMetadata() }); m_curr_config.object_id = object_id; return true; } @@ -1783,8 +1740,7 @@ namespace Slic3r { bool _3MF_Importer::_handle_start_config_volume(const char** attributes, unsigned int num_attributes) { IdToMetadataMap::iterator object = m_objects_metadata.find(m_curr_config.object_id); - if (object == m_objects_metadata.end()) - { + if (object == m_objects_metadata.end()) { add_error("Cannot assign volume to a valid object"); return false; } @@ -1807,8 +1763,7 @@ namespace Slic3r { bool _3MF_Importer::_handle_start_config_metadata(const char** attributes, unsigned int num_attributes) { IdToMetadataMap::iterator object = m_objects_metadata.find(m_curr_config.object_id); - if (object == m_objects_metadata.end()) - { + if (object == m_objects_metadata.end()) { add_error("Cannot assign metadata to valid object id"); return false; } @@ -1819,13 +1774,11 @@ namespace Slic3r { if (type == OBJECT_TYPE) object->second.metadata.emplace_back(key, value); - else if (type == VOLUME_TYPE) - { + else if (type == VOLUME_TYPE) { if (size_t(m_curr_config.volume_id) < object->second.volumes.size()) object->second.volumes[m_curr_config.volume_id].metadata.emplace_back(key, value); } - else - { + else { add_error("Found invalid metadata type"); return false; } @@ -1841,18 +1794,15 @@ namespace Slic3r { bool _3MF_Importer::_generate_volumes(ModelObject& object, const Geometry& geometry, const ObjectMetadata::VolumeMetadataList& volumes) { - if (!object.volumes.empty()) - { + if (!object.volumes.empty()) { add_error("Found invalid volumes count"); return false; } unsigned int geo_tri_count = (unsigned int)geometry.triangles.size() / 3; - for (const ObjectMetadata::VolumeMetadata& volume_data : volumes) - { - if ((geo_tri_count <= volume_data.first_triangle_id) || (geo_tri_count <= volume_data.last_triangle_id) || (volume_data.last_triangle_id < volume_data.first_triangle_id)) - { + for (const ObjectMetadata::VolumeMetadata& volume_data : volumes) { + if (geo_tri_count <= volume_data.first_triangle_id || geo_tri_count <= volume_data.last_triangle_id || volume_data.last_triangle_id < volume_data.first_triangle_id) { add_error("Found invalid triangle id"); return false; } @@ -1860,10 +1810,8 @@ namespace Slic3r { Transform3d volume_matrix_to_object = Transform3d::Identity(); bool has_transform = false; // extract the volume transformation from the volume's metadata, if present - for (const Metadata& metadata : volume_data.metadata) - { - if (metadata.key == MATRIX_KEY) - { + for (const Metadata& metadata : volume_data.metadata) { + if (metadata.key == MATRIX_KEY) { volume_matrix_to_object = Slic3r::Geometry::transform3d_from_string(metadata.value); has_transform = ! volume_matrix_to_object.isApprox(Transform3d::Identity(), 1e-10); break; @@ -1881,12 +1829,10 @@ namespace Slic3r { unsigned int src_start_id = volume_data.first_triangle_id * 3; - for (unsigned int i = 0; i < triangles_count; ++i) - { + for (unsigned int i = 0; i < triangles_count; ++i) { unsigned int ii = i * 3; stl_facet& facet = stl.facet_start[i]; - for (unsigned int v = 0; v < 3; ++v) - { + for (unsigned int v = 0; v < 3; ++v) { unsigned int tri_id = geometry.triangles[src_start_id + ii + v] * 3; facet.vertex[v] = Vec3f(geometry.vertices[tri_id + 0], geometry.vertices[tri_id + 1], geometry.vertices[tri_id + 2]); } @@ -1895,6 +1841,22 @@ namespace Slic3r { stl_get_size(&stl); triangle_mesh.repair(); +#if ENABLE_RELOAD_FROM_DISK_FOR_3MF + if (m_version == 0) { + // if the 3mf was not produced by PrusaSlicer and there is only one instance, + // bake the transformation into the geometry to allow the reload from disk command + // to work properly + if (object.instances.size() == 1) { + triangle_mesh.transform(object.instances.front()->get_transformation().get_matrix()); + object.instances.front()->set_transformation(Slic3r::Geometry::Transformation()); + } + else { + std::cout << "non-single instance !!!\n"; + int a = 0; + } + } +#endif // ENABLE_RELOAD_FROM_DISK_FOR_3MF + ModelVolume* volume = object.add_volume(std::move(triangle_mesh)); // stores the volume matrix taken from the metadata, if present if (has_transform) @@ -1914,8 +1876,7 @@ namespace Slic3r { // apply the remaining volume's metadata - for (const Metadata& metadata : volume_data.metadata) - { + for (const Metadata& metadata : volume_data.metadata) { if (metadata.key == NAME_KEY) volume->name = metadata.value; else if ((metadata.key == MODIFIER_KEY) && (metadata.value == "1")) @@ -2067,18 +2028,15 @@ namespace Slic3r { // Adds content types file ("[Content_Types].xml";). // The content of this file is the same for each PrusaSlicer 3mf. - if (!_add_content_types_file_to_archive(archive)) - { + if (!_add_content_types_file_to_archive(archive)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; } - if ((thumbnail_data != nullptr) && thumbnail_data->is_valid()) - { + if (thumbnail_data != nullptr && thumbnail_data->is_valid()) { // Adds the file Metadata/thumbnail.png. - if (!_add_thumbnail_file_to_archive(archive, *thumbnail_data)) - { + if (!_add_thumbnail_file_to_archive(archive, *thumbnail_data)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2088,8 +2046,7 @@ namespace Slic3r { // Adds relationships file ("_rels/.rels"). // The content of this file is the same for each PrusaSlicer 3mf. // The relationshis file contains a reference to the geometry file "3D/3dmodel.model", the name was chosen to be compatible with CURA. - if (!_add_relationships_file_to_archive(archive)) - { + if (!_add_relationships_file_to_archive(archive)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2098,8 +2055,7 @@ namespace Slic3r { // Adds model file ("3D/3dmodel.model"). // This is the one and only file that contains all the geometry (vertices and triangles) of all ModelVolumes. IdToObjectDataMap objects_data; - if (!_add_model_file_to_archive(filename, archive, model, objects_data)) - { + if (!_add_model_file_to_archive(filename, archive, model, objects_data)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2108,8 +2064,7 @@ namespace Slic3r { // Adds layer height profile file ("Metadata/Slic3r_PE_layer_heights_profile.txt"). // All layer height profiles of all ModelObjects are stored here, indexed by 1 based index of the ModelObject in Model. // The index differes from the index of an object ID of an object instance of a 3MF file! - if (!_add_layer_height_profile_file_to_archive(archive, model)) - { + if (!_add_layer_height_profile_file_to_archive(archive, model)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2118,8 +2073,7 @@ namespace Slic3r { // Adds layer config ranges file ("Metadata/Slic3r_PE_layer_config_ranges.txt"). // All layer height profiles of all ModelObjects are stored here, indexed by 1 based index of the ModelObject in Model. // The index differes from the index of an object ID of an object instance of a 3MF file! - if (!_add_layer_config_ranges_file_to_archive(archive, model)) - { + if (!_add_layer_config_ranges_file_to_archive(archive, model)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2128,15 +2082,13 @@ namespace Slic3r { // Adds sla support points file ("Metadata/Slic3r_PE_sla_support_points.txt"). // All sla support points of all ModelObjects are stored here, indexed by 1 based index of the ModelObject in Model. // The index differes from the index of an object ID of an object instance of a 3MF file! - if (!_add_sla_support_points_file_to_archive(archive, model)) - { + if (!_add_sla_support_points_file_to_archive(archive, model)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; } - if (!_add_sla_drain_holes_file_to_archive(archive, model)) - { + if (!_add_sla_drain_holes_file_to_archive(archive, model)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2145,8 +2097,7 @@ namespace Slic3r { // Adds custom gcode per height file ("Metadata/Prusa_Slicer_custom_gcode_per_print_z.xml"). // All custom gcode per height of whole Model are stored here - if (!_add_custom_gcode_per_print_z_file_to_archive(archive, model, config)) - { + if (!_add_custom_gcode_per_print_z_file_to_archive(archive, model, config)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2154,10 +2105,8 @@ namespace Slic3r { // Adds slic3r print config file ("Metadata/Slic3r_PE.config"). // This file contains the content of FullPrintConfing / SLAFullPrintConfig. - if (config != nullptr) - { - if (!_add_print_config_file_to_archive(archive, *config)) - { + if (config != nullptr) { + if (!_add_print_config_file_to_archive(archive, *config)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2168,15 +2117,13 @@ namespace Slic3r { // This file contains all the attributes of all ModelObjects and their ModelVolumes (names, parameter overrides). // As there is just a single Indexed Triangle Set data stored per ModelObject, offsets of volumes into their respective Indexed Triangle Set data // is stored here as well. - if (!_add_model_config_file_to_archive(archive, model, objects_data)) - { + if (!_add_model_config_file_to_archive(archive, model, objects_data)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; } - if (!mz_zip_writer_finalize_archive(&archive)) - { + if (!mz_zip_writer_finalize_archive(&archive)) { close_zip_writer(&archive); boost::filesystem::remove(filename); add_error("Unable to finalize the archive"); @@ -2200,8 +2147,7 @@ namespace Slic3r { std::string out = stream.str(); - if (!mz_zip_writer_add_mem(&archive, CONTENT_TYPES_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!mz_zip_writer_add_mem(&archive, CONTENT_TYPES_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add content types file to archive"); return false; } @@ -2215,8 +2161,7 @@ namespace Slic3r { size_t png_size = 0; void* png_data = tdefl_write_image_to_png_file_in_memory_ex((const void*)thumbnail_data.pixels.data(), thumbnail_data.width, thumbnail_data.height, 4, &png_size, MZ_DEFAULT_LEVEL, 1); - if (png_data != nullptr) - { + if (png_data != nullptr) { res = mz_zip_writer_add_mem(&archive, THUMBNAIL_FILE.c_str(), (const void*)png_data, png_size, MZ_DEFAULT_COMPRESSION); mz_free(png_data); } @@ -2238,8 +2183,7 @@ namespace Slic3r { std::string out = stream.str(); - if (!mz_zip_writer_add_mem(&archive, RELATIONSHIPS_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!mz_zip_writer_add_mem(&archive, RELATIONSHIPS_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add relationships file to archive"); return false; } @@ -2304,19 +2248,17 @@ namespace Slic3r { // all the object instances of all ModelObjects are stored and indexed in a 1 based linear fashion. // Therefore the list of object_ids here may not be continuous. unsigned int object_id = 1; - for (ModelObject* obj : model.objects) - { + for (ModelObject* obj : model.objects) { if (obj == nullptr) continue; // Index of an object in the 3MF file corresponding to the 1st instance of a ModelObject. unsigned int curr_id = object_id; - IdToObjectDataMap::iterator object_it = objects_data.insert(IdToObjectDataMap::value_type(curr_id, ObjectData(obj))).first; + IdToObjectDataMap::iterator object_it = objects_data.insert({ curr_id, ObjectData(obj) }).first; // Store geometry of all ModelVolumes contained in a single ModelObject into a single 3MF indexed triangle set object. // object_it->second.volumes_offsets will contain the offsets of the ModelVolumes in that single indexed triangle set. // object_id will be increased to point to the 1st instance of the next ModelObject. - if (!_add_object_to_model_stream(context, object_id, *obj, build_items, object_it->second.volumes_offsets)) - { + if (!_add_object_to_model_stream(context, object_id, *obj, build_items, object_it->second.volumes_offsets)) { add_error("Unable to add object to archive"); mz_zip_writer_add_staged_finish(&context); return false; @@ -2329,8 +2271,7 @@ namespace Slic3r { stream << " \n"; // Store the transformations of all the ModelInstances of all ModelObjects, indexed in a linear fashion. - if (!_add_build_to_model_stream(stream, build_items)) - { + if (!_add_build_to_model_stream(stream, build_items)) { add_error("Unable to add build to archive"); mz_zip_writer_add_staged_finish(&context); return false; @@ -2341,8 +2282,7 @@ namespace Slic3r { std::string buf = stream.str(); if ((! buf.empty() && ! mz_zip_writer_add_staged_data(&context, buf.data(), buf.size())) || - ! mz_zip_writer_add_staged_finish(&context)) - { + ! mz_zip_writer_add_staged_finish(&context)) { add_error("Unable to add model file to archive"); return false; } @@ -2356,8 +2296,7 @@ namespace Slic3r { std::stringstream stream; reset_stream(stream); unsigned int id = 0; - for (const ModelInstance* instance : object.instances) - { + for (const ModelInstance* instance : object.instances) { assert(instance != nullptr); if (instance == nullptr) continue; @@ -2365,19 +2304,16 @@ namespace Slic3r { unsigned int instance_id = object_id + id; stream << " <" << OBJECT_TAG << " id=\"" << instance_id << "\" type=\"model\">\n"; - if (id == 0) - { + if (id == 0) { std::string buf = stream.str(); reset_stream(stream); if ((! buf.empty() && ! mz_zip_writer_add_staged_data(&context, buf.data(), buf.size())) || - ! _add_mesh_to_object_stream(context, object, volumes_offsets)) - { + ! _add_mesh_to_object_stream(context, object, volumes_offsets)) { add_error("Unable to add mesh to archive"); return false; } } - else - { + else { stream << " <" << COMPONENTS_TAG << ">\n"; stream << " <" << COMPONENT_TAG << " objectid=\"" << object_id << "\"/>\n"; stream << " \n"; @@ -2469,8 +2405,7 @@ namespace Slic3r { char buf[256]; unsigned int vertices_count = 0; - for (ModelVolume* volume : object.volumes) - { + for (ModelVolume* volume : object.volumes) { if (volume == nullptr) continue; @@ -2479,11 +2414,10 @@ namespace Slic3r { if (!volume->mesh().has_shared_vertices()) throw Slic3r::FileIOError("store_3mf() requires shared vertices"); - volumes_offsets.insert(VolumeToOffsetsMap::value_type(volume, Offsets(vertices_count))).first; + volumes_offsets.insert({ volume, Offsets(vertices_count) }).first; const indexed_triangle_set &its = volume->mesh().its; - if (its.vertices.empty()) - { + if (its.vertices.empty()) { add_error("Found invalid mesh"); return false; } @@ -2492,8 +2426,7 @@ namespace Slic3r { const Transform3d& matrix = volume->get_matrix(); - for (size_t i = 0; i < its.vertices.size(); ++i) - { + for (size_t i = 0; i < its.vertices.size(); ++i) { Vec3f v = (matrix * its.vertices[i].cast()).cast(); char *ptr = buf; boost::spirit::karma::generate(ptr, boost::spirit::lit(" <") << VERTEX_TAG << " x=\""); @@ -2517,8 +2450,7 @@ namespace Slic3r { output_buffer += ">\n"; unsigned int triangles_count = 0; - for (ModelVolume* volume : object.volumes) - { + for (ModelVolume* volume : object.volumes) { if (volume == nullptr) continue; @@ -2532,8 +2464,7 @@ namespace Slic3r { triangles_count += (int)its.indices.size(); volume_it->second.last_triangle_id = triangles_count - 1; - for (int i = 0; i < int(its.indices.size()); ++ i) - { + for (int i = 0; i < int(its.indices.size()); ++ i) { { const Vec3i &idx = its.indices[i]; char *ptr = buf; @@ -2585,23 +2516,19 @@ namespace Slic3r { bool _3MF_Exporter::_add_build_to_model_stream(std::stringstream& stream, const BuildItemsList& build_items) { - if (build_items.size() == 0) - { + if (build_items.size() == 0) { add_error("No build item found"); return false; } stream << " <" << BUILD_TAG << ">\n"; - for (const BuildItem& item : build_items) - { + for (const BuildItem& item : build_items) { stream << " <" << ITEM_TAG << " " << OBJECTID_ATTR << "=\"" << item.id << "\" " << TRANSFORM_ATTR << "=\""; - for (unsigned c = 0; c < 4; ++c) - { - for (unsigned r = 0; r < 3; ++r) - { + for (unsigned c = 0; c < 4; ++c) { + for (unsigned r = 0; r < 3; ++r) { stream << item.transform(r, c); - if ((r != 2) || (c != 3)) + if (r != 2 || c != 3) stream << " "; } } @@ -2619,18 +2546,15 @@ namespace Slic3r { char buffer[1024]; unsigned int count = 0; - for (const ModelObject* object : model.objects) - { + for (const ModelObject* object : model.objects) { ++count; const std::vector& layer_height_profile = object->layer_height_profile.get(); - if ((layer_height_profile.size() >= 4) && ((layer_height_profile.size() % 2) == 0)) - { + if (layer_height_profile.size() >= 4 && layer_height_profile.size() % 2 == 0) { sprintf(buffer, "object_id=%d|", count); out += buffer; // Store the layer height profile as a single semicolon separated list. - for (size_t i = 0; i < layer_height_profile.size(); ++i) - { + for (size_t i = 0; i < layer_height_profile.size(); ++i) { sprintf(buffer, (i == 0) ? "%f" : ";%f", layer_height_profile[i]); out += buffer; } @@ -2639,10 +2563,8 @@ namespace Slic3r { } } - if (!out.empty()) - { - if (!mz_zip_writer_add_mem(&archive, LAYER_HEIGHTS_PROFILE_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!out.empty()) { + if (!mz_zip_writer_add_mem(&archive, LAYER_HEIGHTS_PROFILE_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add layer heights profile file to archive"); return false; } @@ -2657,8 +2579,7 @@ namespace Slic3r { pt::ptree tree; unsigned int object_cnt = 0; - for (const ModelObject* object : model.objects) - { + for (const ModelObject* object : model.objects) { object_cnt++; const t_layer_config_ranges& ranges = object->layer_config_ranges; if (!ranges.empty()) @@ -2668,8 +2589,7 @@ namespace Slic3r { obj_tree.put(".id", object_cnt); // Store the layer config ranges. - for (const auto& range : ranges) - { + for (const auto& range : ranges) { pt::ptree& range_tree = obj_tree.add("range", ""); // store minX and maxZ @@ -2678,8 +2598,7 @@ namespace Slic3r { // store range configuration const ModelConfig& config = range.second; - for (const std::string& opt_key : config.keys()) - { + for (const std::string& opt_key : config.keys()) { pt::ptree& opt_tree = range_tree.add("option", config.opt_serialize(opt_key)); opt_tree.put(".opt_key", opt_key); } @@ -2687,8 +2606,7 @@ namespace Slic3r { } } - if (!tree.empty()) - { + if (!tree.empty()) { std::ostringstream oss; pt::write_xml(oss, tree); out = oss.str(); @@ -2703,10 +2621,8 @@ namespace Slic3r { boost::replace_all(out, "><", ">\n<"); } - if (!out.empty()) - { - if (!mz_zip_writer_add_mem(&archive, LAYER_CONFIG_RANGES_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!out.empty()) { + if (!mz_zip_writer_add_mem(&archive, LAYER_CONFIG_RANGES_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add layer heights profile file to archive"); return false; } @@ -2721,18 +2637,15 @@ namespace Slic3r { char buffer[1024]; unsigned int count = 0; - for (const ModelObject* object : model.objects) - { + for (const ModelObject* object : model.objects) { ++count; const std::vector& sla_support_points = object->sla_support_points; - if (!sla_support_points.empty()) - { + if (!sla_support_points.empty()) { sprintf(buffer, "object_id=%d|", count); out += buffer; // Store the layer height profile as a single space separated list. - for (size_t i = 0; i < sla_support_points.size(); ++i) - { + for (size_t i = 0; i < sla_support_points.size(); ++i) { sprintf(buffer, (i==0 ? "%f %f %f %f %f" : " %f %f %f %f %f"), sla_support_points[i].pos(0), sla_support_points[i].pos(1), sla_support_points[i].pos(2), sla_support_points[i].head_front_radius, (float)sla_support_points[i].is_new_island); out += buffer; } @@ -2740,13 +2653,11 @@ namespace Slic3r { } } - if (!out.empty()) - { + if (!out.empty()) { // Adds version header at the beginning: out = std::string("support_points_format_version=") + std::to_string(support_points_format_version) + std::string("\n") + out; - if (!mz_zip_writer_add_mem(&archive, SLA_SUPPORT_POINTS_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!mz_zip_writer_add_mem(&archive, SLA_SUPPORT_POINTS_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add sla support points file to archive"); return false; } @@ -2760,8 +2671,7 @@ namespace Slic3r { std::string out; unsigned int count = 0; - for (const ModelObject* object : model.objects) - { + for (const ModelObject* object : model.objects) { ++count; sla::DrainHoles drain_holes = object->sla_drain_holes; @@ -2774,9 +2684,7 @@ namespace Slic3r { hole.height += 1.f; } - - if (!drain_holes.empty()) - { + if (!drain_holes.empty()) { out += string_printf(fmt, count); // Store the layer height profile as a single space separated list. @@ -2795,13 +2703,11 @@ namespace Slic3r { } } - if (!out.empty()) - { + if (!out.empty()) { // Adds version header at the beginning: out = std::string("drain_holes_format_version=") + std::to_string(drain_holes_format_version) + std::string("\n") + out; - if (!mz_zip_writer_add_mem(&archive, SLA_DRAIN_HOLES_FILE.c_str(), static_cast(out.data()), out.length(), mz_uint(MZ_DEFAULT_COMPRESSION))) - { + if (!mz_zip_writer_add_mem(&archive, SLA_DRAIN_HOLES_FILE.c_str(), static_cast(out.data()), out.length(), mz_uint(MZ_DEFAULT_COMPRESSION))) { add_error("Unable to add sla support points file to archive"); return false; } @@ -2819,10 +2725,8 @@ namespace Slic3r { if (key != "compatible_printers") out += "; " + key + " = " + config.opt_serialize(key) + "\n"; - if (!out.empty()) - { - if (!mz_zip_writer_add_mem(&archive, PRINT_CONFIG_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!out.empty()) { + if (!mz_zip_writer_add_mem(&archive, PRINT_CONFIG_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add print config file to archive"); return false; } @@ -2840,11 +2744,9 @@ namespace Slic3r { stream << "\n"; stream << "<" << CONFIG_TAG << ">\n"; - for (const IdToObjectDataMap::value_type& obj_metadata : objects_data) - { + for (const IdToObjectDataMap::value_type& obj_metadata : objects_data) { const ModelObject* obj = obj_metadata.second.object; - if (obj != nullptr) - { + if (obj != nullptr) { // Output of instances count added because of github #3435, currently not used by PrusaSlicer stream << " <" << OBJECT_TAG << " " << ID_ATTR << "=\"" << obj_metadata.first << "\" " << INSTANCESCOUNT_ATTR << "=\"" << obj->instances.size() << "\">\n"; @@ -2853,19 +2755,15 @@ namespace Slic3r { stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << OBJECT_TYPE << "\" " << KEY_ATTR << "=\"name\" " << VALUE_ATTR << "=\"" << xml_escape(obj->name) << "\"/>\n"; // stores object's config data - for (const std::string& key : obj->config.keys()) - { + for (const std::string& key : obj->config.keys()) { stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << OBJECT_TYPE << "\" " << KEY_ATTR << "=\"" << key << "\" " << VALUE_ATTR << "=\"" << obj->config.opt_serialize(key) << "\"/>\n"; } - for (const ModelVolume* volume : obj_metadata.second.object->volumes) - { - if (volume != nullptr) - { + for (const ModelVolume* volume : obj_metadata.second.object->volumes) { + if (volume != nullptr) { const VolumeToOffsetsMap& offsets = obj_metadata.second.volumes_offsets; VolumeToOffsetsMap::const_iterator it = offsets.find(volume); - if (it != offsets.end()) - { + if (it != offsets.end()) { // stores volume's offsets stream << " <" << VOLUME_TAG << " "; stream << FIRST_TRIANGLE_ID_ATTR << "=\"" << it->second.first_triangle_id << "\" "; @@ -2885,12 +2783,10 @@ namespace Slic3r { // stores volume's local matrix stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << MATRIX_KEY << "\" " << VALUE_ATTR << "=\""; Transform3d matrix = volume->get_matrix() * volume->source.transform.get_matrix(); - for (int r = 0; r < 4; ++r) - { - for (int c = 0; c < 4; ++c) - { + for (int r = 0; r < 4; ++r) { + for (int c = 0; c < 4; ++c) { stream << matrix(r, c); - if ((r != 3) || (c != 3)) + if (r != 3 || c != 3) stream << " "; } } @@ -2913,8 +2809,7 @@ namespace Slic3r { } // stores volume's config data - for (const std::string& key : volume->config.keys()) - { + for (const std::string& key : volume->config.keys()) { stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << key << "\" " << VALUE_ATTR << "=\"" << volume->config.opt_serialize(key) << "\"/>\n"; } @@ -2931,8 +2826,7 @@ namespace Slic3r { std::string out = stream.str(); - if (!mz_zip_writer_add_mem(&archive, MODEL_CONFIG_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!mz_zip_writer_add_mem(&archive, MODEL_CONFIG_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add model config file to archive"); return false; } @@ -2944,13 +2838,11 @@ bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archiv { std::string out = ""; - if (!model.custom_gcode_per_print_z.gcodes.empty()) - { + if (!model.custom_gcode_per_print_z.gcodes.empty()) { pt::ptree tree; pt::ptree& main_tree = tree.add("custom_gcodes_per_print_z", ""); - for (const CustomGCode::Item& code : model.custom_gcode_per_print_z.gcodes) - { + for (const CustomGCode::Item& code : model.custom_gcode_per_print_z.gcodes) { pt::ptree& code_tree = main_tree.add("code", ""); // store data of custom_gcode_per_print_z @@ -2974,8 +2866,7 @@ bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archiv model.custom_gcode_per_print_z.mode == CustomGCode::Mode::MultiAsSingle ? CustomGCode::MultiAsSingleMode : CustomGCode::MultiExtruderMode); - if (!tree.empty()) - { + if (!tree.empty()) { std::ostringstream oss; boost::property_tree::write_xml(oss, tree); out = oss.str(); @@ -2985,10 +2876,8 @@ bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archiv } } - if (!out.empty()) - { - if (!mz_zip_writer_add_mem(&archive, CUSTOM_GCODE_PER_PRINT_Z_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!out.empty()) { + if (!mz_zip_writer_add_mem(&archive, CUSTOM_GCODE_PER_PRINT_Z_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add custom Gcodes per print_z file to archive"); return false; } @@ -2998,26 +2887,26 @@ bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archiv } bool load_3mf(const char* path, DynamicPrintConfig* config, Model* model, bool check_version) - { - if ((path == nullptr) || (config == nullptr) || (model == nullptr)) - return false; +{ + if (path == nullptr || config == nullptr || model == nullptr) + return false; - _3MF_Importer importer; - bool res = importer.load_model_from_file(path, *model, *config, check_version); - importer.log_errors(); - return res; - } + _3MF_Importer importer; + bool res = importer.load_model_from_file(path, *model, *config, check_version); + importer.log_errors(); + return res; +} bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources, const ThumbnailData* thumbnail_data) - { - if ((path == nullptr) || (model == nullptr)) - return false; +{ + if (path == nullptr || model == nullptr) + return false; - _3MF_Exporter exporter; - bool res = exporter.save_model_to_file(path, *model, config, fullpath_sources, thumbnail_data); - if (!res) - exporter.log_errors(); + _3MF_Exporter exporter; + bool res = exporter.save_model_to_file(path, *model, config, fullpath_sources, thumbnail_data); + if (!res) + exporter.log_errors(); - return res; - } + return res; +} } // namespace Slic3r diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index d04496bbd71..27f6719affd 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -114,6 +114,7 @@ #define ENABLE_2_3_1_ALPHA1 1 #define ENABLE_SPLITTED_VERTEX_BUFFER (1 && ENABLE_2_3_1_ALPHA1) +#define ENABLE_RELOAD_FROM_DISK_FOR_3MF (1 && ENABLE_2_3_1_ALPHA1) #endif // _prusaslicer_technologies_h_ From c8e5277f0ceb77b6e3eb9c6476aae846e6dbcd0f Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Mon, 1 Feb 2021 21:22:30 +0100 Subject: [PATCH 103/143] Updated print temperature for Das Filament PLA https://github.com/prusa3d/PrusaSlicer/issues/5693 --- resources/profiles/Creality.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 5f46ea40171..68a1015046a 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -604,7 +604,7 @@ filament_colour = #FFE200 [filament:Das Filament PLA @CREALITY] inherits = *PLA* filament_vendor = Das Filament -temperature = 215 +temperature = 210 bed_temperature = 60 first_layer_temperature = 215 first_layer_bed_temperature = 60 From e52efe48b08c6f1fd8dd39829f967ca5a6a57d3d Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Tue, 2 Feb 2021 11:40:58 +0100 Subject: [PATCH 104/143] Creality CR-6 SE thumbnail --- resources/profiles/Creality/CR6SE_thumbnail.png | Bin 0 -> 34008 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/profiles/Creality/CR6SE_thumbnail.png diff --git a/resources/profiles/Creality/CR6SE_thumbnail.png b/resources/profiles/Creality/CR6SE_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd9d3324ff1317c744d819d21975f16cfc5a1a1 GIT binary patch literal 34008 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 literal 0 HcmV?d00001 From 73c9f939e07916350bb0a70eeb4fee28da7dad9d Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Wed, 3 Feb 2021 15:12:53 +0100 Subject: [PATCH 105/143] Squash merge of lh_brim_rework, brim separated to Brim.cpp,hpp Refactored accessors to PrintObjectPtrs, PrintRegionPtrs, LayerPtrs, SupportLayerPtrs for const correctness. --- src/libslic3r/Brim.cpp | 490 ++++++++++++++++++++++ src/libslic3r/Brim.hpp | 14 + src/libslic3r/CMakeLists.txt | 2 + src/libslic3r/Config.hpp | 3 +- src/libslic3r/ExPolygon.cpp | 7 + src/libslic3r/ExPolygon.hpp | 19 + src/libslic3r/ExtrusionEntity.hpp | 19 + src/libslic3r/GCode.cpp | 2 +- src/libslic3r/GCode.hpp | 2 +- src/libslic3r/GCode/ToolOrdering.cpp | 2 +- src/libslic3r/PerimeterGenerator.cpp | 2 +- src/libslic3r/Polygon.cpp | 8 + src/libslic3r/Polygon.hpp | 1 + src/libslic3r/Polyline.hpp | 1 + src/libslic3r/Preset.cpp | 2 +- src/libslic3r/Print.cpp | 189 +-------- src/libslic3r/Print.hpp | 84 +++- src/libslic3r/PrintBase.cpp | 5 + src/libslic3r/PrintBase.hpp | 18 + src/libslic3r/PrintConfig.cpp | 25 ++ src/libslic3r/PrintConfig.hpp | 26 +- src/libslic3r/PrintObject.cpp | 6 +- src/libslic3r/PrintRegion.cpp | 6 +- src/libslic3r/SupportMaterial.cpp | 70 ++-- src/libslic3r/SupportMaterial.hpp | 2 +- src/slic3r/GUI/ConfigManipulation.cpp | 4 +- src/slic3r/GUI/Field.cpp | 2 + src/slic3r/GUI/GLCanvas3D.cpp | 4 +- src/slic3r/GUI/GUI.cpp | 2 + src/slic3r/GUI/GUI_ObjectList.cpp | 4 +- src/slic3r/GUI/OptionsGroup.cpp | 3 + src/slic3r/GUI/Plater.cpp | 2 +- src/slic3r/GUI/Tab.cpp | 2 + src/slic3r/GUI/UnsavedChangesDialog.cpp | 2 + tests/fff_print/test_printobject.cpp | 6 +- tests/fff_print/test_support_material.cpp | 2 +- xs/xsp/Print.xsp | 8 +- 37 files changed, 803 insertions(+), 243 deletions(-) create mode 100644 src/libslic3r/Brim.cpp create mode 100644 src/libslic3r/Brim.hpp diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp new file mode 100644 index 00000000000..0e677e8b7a9 --- /dev/null +++ b/src/libslic3r/Brim.cpp @@ -0,0 +1,490 @@ +#include "clipper/clipper_z.hpp" + +#include "ClipperUtils.hpp" +#include "EdgeGrid.hpp" +#include "Layer.hpp" +#include "Print.hpp" +#include "ShortestPath.hpp" +#include "libslic3r.h" + +#include +#include +#include + +namespace Slic3r { + +static void append_and_translate(ExPolygons &dst, const ExPolygons &src, const PrintInstance &instance) { + size_t dst_idx = dst.size(); + expolygons_append(dst, src); + for (; dst_idx < dst.size(); ++dst_idx) + dst[dst_idx].translate(instance.shift.x(), instance.shift.y()); +} + +static void append_and_translate(Polygons &dst, const Polygons &src, const PrintInstance &instance) { + size_t dst_idx = dst.size(); + polygons_append(dst, src); + for (; dst_idx < dst.size(); ++dst_idx) + dst[dst_idx].translate(instance.shift.x(), instance.shift.y()); +} + +static float max_brim_width(const ConstPrintObjectPtrsAdaptor &objects) +{ + assert(!objects.empty()); + return float(std::accumulate(objects.begin() + 1, objects.end(), objects.front()->config().brim_width.value, + [](double partial_result, const PrintObject *object) { + return std::max(partial_result, object->config().brim_width.value); + })); +} + +static ConstPrintObjectPtrs get_top_level_objects_with_brim(const Print &print) +{ + Polygons islands; + ConstPrintObjectPtrs island_to_object; + for (const PrintObject *object : print.objects()) { + Polygons islands_object; + for (const ExPolygon &ex_poly : object->layers().front()->lslices) + islands_object.emplace_back(ex_poly.contour); + + islands.reserve(islands.size() + object->instances().size() * islands_object.size()); + for (const PrintInstance &instance : object->instances()) + for (Polygon &poly : islands_object) { + islands.emplace_back(poly); + islands.back().translate(instance.shift); + island_to_object.emplace_back(object); + } + } + assert(islands.size() == island_to_object.size()); + + ClipperLib_Z::Paths islands_clip; + islands_clip.reserve(islands.size()); + for (const Polygon &poly : islands) { + islands_clip.emplace_back(); + ClipperLib_Z::Path &island_clip = islands_clip.back(); + island_clip.reserve(poly.points.size()); + int island_idx = int(&poly - &islands.front()); + // The Z coordinate carries index of the island used to get the pointer to the object. + for (const Point &pt : poly.points) + island_clip.emplace_back(pt.x(), pt.y(), island_idx + 1); + } + + // Init Clipper + ClipperLib_Z::Clipper clipper; + // Assign the maximum Z from four points. This values is valid index of the island + clipper.ZFillFunction([](const ClipperLib_Z::IntPoint &e1bot, const ClipperLib_Z::IntPoint &e1top, const ClipperLib_Z::IntPoint &e2bot, + const ClipperLib_Z::IntPoint &e2top, ClipperLib_Z::IntPoint &pt) { + pt.Z = std::max(std::max(e1bot.Z, e1top.Z), std::max(e2bot.Z, e2top.Z)); + }); + // Add islands + clipper.AddPaths(islands_clip, ClipperLib_Z::ptSubject, true); + // Execute union operation to construct polytree + ClipperLib_Z::PolyTree islands_polytree; + clipper.Execute(ClipperLib_Z::ctUnion, islands_polytree, ClipperLib_Z::pftEvenOdd, ClipperLib_Z::pftEvenOdd); + + std::unordered_set processed_objects_idx; + ConstPrintObjectPtrs top_level_objects_with_brim; + for (int i = 0; i < islands_polytree.ChildCount(); ++i) { + for (const ClipperLib_Z::IntPoint &point : islands_polytree.Childs[i]->Contour) { + if (point.Z != 0 && processed_objects_idx.find(island_to_object[point.Z - 1]->id().id) == processed_objects_idx.end()) { + top_level_objects_with_brim.emplace_back(island_to_object[point.Z - 1]); + processed_objects_idx.insert(island_to_object[point.Z - 1]->id().id); + } + } + } + return top_level_objects_with_brim; +} + +static Polygons top_level_outer_brim_islands(const ConstPrintObjectPtrs &top_level_objects_with_brim) +{ + Polygons islands; + for (const PrintObject *object : top_level_objects_with_brim) { + float brim_offset = float(scale_(object->config().brim_offset.value)); + Polygons islands_object; + for (const ExPolygon &ex_poly : object->layers().front()->lslices) { + Polygons contour_offset = offset(ex_poly.contour, brim_offset); + for (Polygon &poly : contour_offset) + poly.douglas_peucker(SCALED_RESOLUTION); + + polygons_append(islands_object, std::move(contour_offset)); + } + + for (const PrintInstance &instance : object->instances()) + append_and_translate(islands, islands_object, instance); + } + return islands; +} + +static ExPolygons top_level_outer_brim_area(const Print &print, const ConstPrintObjectPtrs &top_level_objects_with_brim, const float no_brim_offset) +{ + std::unordered_set top_level_objects_idx; + top_level_objects_idx.reserve(top_level_objects_with_brim.size()); + for (const PrintObject *object : top_level_objects_with_brim) + top_level_objects_idx.insert(object->id().id); + + ExPolygons brim_area; + Polygons no_brim_area; + for (const PrintObject *object : print.objects()) { + const BrimType brim_type = object->config().brim_type.value; + const float brim_offset = scale_(object->config().brim_offset.value); + const float brim_width = scale_(object->config().brim_width.value); + const bool is_top_outer_brim = top_level_objects_idx.find(object->id().id) != top_level_objects_idx.end(); + + ExPolygons brim_area_object; + Polygons no_brim_area_object; + for (const ExPolygon &ex_poly : object->layers().front()->lslices) { + if ((brim_type == BrimType::btOuterOnly || brim_type == BrimType::btOuterAndInner) && is_top_outer_brim) + append(brim_area_object, diff_ex(offset_ex(ex_poly.contour, brim_width + brim_offset), offset_ex(ex_poly.contour, brim_offset))); + + if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btNoBrim) + append(no_brim_area_object, offset(ex_poly.holes, -no_brim_offset)); + + if (brim_type != BrimType::btNoBrim) + append(no_brim_area_object, offset(ex_poly.contour, brim_offset)); + + no_brim_area_object.emplace_back(ex_poly.contour); + } + + for (const PrintInstance &instance : object->instances()) { + append_and_translate(brim_area, brim_area_object, instance); + append_and_translate(no_brim_area, no_brim_area_object, instance); + } + } + + return diff_ex(to_polygons(std::move(brim_area)), no_brim_area); +} + +static ExPolygons inner_brim_area(const Print &print, const ConstPrintObjectPtrs &top_level_objects_with_brim, const float no_brim_offset) +{ + std::unordered_set top_level_objects_idx; + top_level_objects_idx.reserve(top_level_objects_with_brim.size()); + for (const PrintObject *object : top_level_objects_with_brim) + top_level_objects_idx.insert(object->id().id); + + ExPolygons brim_area; + ExPolygons no_brim_area; + Polygons holes; + for (const PrintObject *object : print.objects()) { + const BrimType brim_type = object->config().brim_type.value; + const float brim_offset = scale_(object->config().brim_offset.value); + const float brim_width = scale_(object->config().brim_width.value); + const bool top_outer_brim = top_level_objects_idx.find(object->id().id) != top_level_objects_idx.end(); + + ExPolygons brim_area_object; + ExPolygons no_brim_area_object; + Polygons holes_object; + for (const ExPolygon &ex_poly : object->layers().front()->lslices) { + if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btOuterAndInner) { + if (top_outer_brim) + no_brim_area_object.emplace_back(ex_poly); + else + append(brim_area_object, diff_ex(offset_ex(ex_poly.contour, brim_width + brim_offset), offset_ex(ex_poly.contour, brim_offset))); + } + + if (brim_type == BrimType::btInnerOnly || brim_type == BrimType::btOuterAndInner) + append(brim_area_object, diff_ex(offset_ex(ex_poly.holes, -brim_offset), offset_ex(ex_poly.holes, -brim_width - brim_offset))); + + if (brim_type == BrimType::btInnerOnly || brim_type == BrimType::btNoBrim) + append(no_brim_area_object, offset_ex(ex_poly.contour, no_brim_offset)); + + if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btNoBrim) + append(no_brim_area_object, offset_ex(ex_poly.holes, -no_brim_offset)); + + append(holes_object, ex_poly.holes); + } + append(no_brim_area_object, offset_ex(object->layers().front()->lslices, brim_offset)); + + for (const PrintInstance &instance : object->instances()) { + append_and_translate(brim_area, brim_area_object, instance); + append_and_translate(no_brim_area, no_brim_area_object, instance); + append_and_translate(holes, holes_object, instance); + } + } + + return diff_ex(intersection_ex(to_polygons(std::move(brim_area)), holes), no_brim_area); +} + +static void optimize_polylines_by_reversing(Polylines *polylines) +{ + for (size_t poly_idx = 1; poly_idx < polylines->size(); ++poly_idx) { + const Polyline &prev = (*polylines)[poly_idx - 1]; + Polyline & next = (*polylines)[poly_idx]; + + if (!next.is_closed()) { + double dist_to_start = (next.first_point() - prev.last_point()).cast().norm(); + double dist_to_end = (next.last_point() - prev.last_point()).cast().norm(); + + if (dist_to_end < dist_to_start) next.reverse(); + } + } +} + +static Polylines connect_brim_lines(Polylines &&polylines, const Polygons &brim_area, float max_connection_length) +{ + EdgeGrid::Grid grid; + BoundingBox bbox(get_extents(polylines)); + bbox.offset(SCALED_EPSILON); + grid.set_bbox(bbox); + + std::vector polylines_points(polylines.size() + brim_area.size()); + for (const Polyline &poly : polylines) + polylines_points[&poly - &polylines.front()] = poly.points; + for (const Polygon &poly : brim_area) + polylines_points.emplace_back(poly.points); + grid.create(polylines_points, coord_t(scale_(10.))); + + struct Visitor + { + explicit Visitor(const EdgeGrid::Grid &grid) : grid(grid) {} + + bool operator()(coord_t iy, coord_t ix) + { + // Called with a row and colum of the grid cell, which is intersected by a line. + auto cell_data_range = grid.cell_data_range(iy, ix); + this->intersect = false; + for (auto it_contour_and_segment = cell_data_range.first; it_contour_and_segment != cell_data_range.second; ++it_contour_and_segment) { + // End points of the line segment and their vector. + auto segment = grid.segment(*it_contour_and_segment); + if (Geometry::segments_intersect(segment.first, segment.second, brim_line.a, brim_line.b)) { + this->intersect = true; + return false; + } + } + // Continue traversing the grid along the edge. + return true; + } + + const EdgeGrid::Grid &grid; + Line brim_line; + bool intersect; + + } visitor(grid); + + Polyline *prev = &polylines.front(); + for (size_t poly_idx = 1; poly_idx < polylines.size(); ++poly_idx) { + Polyline &next = polylines[poly_idx]; + + double dist = Line(prev->last_point(), next.first_point()).length(); + if (dist <= max_connection_length) { + visitor.brim_line.a = prev->last_point(); + visitor.brim_line.b = next.first_point(); + visitor.brim_line.extend(-SCALED_EPSILON); + grid.visit_cells_intersecting_line(visitor.brim_line.a, visitor.brim_line.b, visitor); + if (!visitor.intersect) + append(prev->points, std::move(next.points)); + else + prev = &next; + } + } + + Polylines polylines_out; + polylines_out.reserve(std::count_if(polylines.begin(), polylines.end(), [](const Polyline &pl) { return !pl.empty(); })); + for (Polyline &pl : polylines) + if (!pl.empty()) + polylines_out.emplace_back(std::move(pl)); + + return polylines_out; +} + +static void make_inner_brim(const Print &print, const ConstPrintObjectPtrs &top_level_objects_with_brim, ExtrusionEntityCollection &brim) +{ + Flow flow = print.brim_flow(); + ExPolygons islands_ex = inner_brim_area(print, top_level_objects_with_brim, flow.scaled_spacing()); + ExPolygons loops_ex; + islands_ex = offset_ex(islands_ex, -0.5f * float(flow.scaled_spacing()), jtSquare); + for (size_t i = 0; !islands_ex.empty(); ++i) { + for (ExPolygon &poly_ex : islands_ex) + poly_ex.douglas_peucker(SCALED_RESOLUTION); + expolygons_append(loops_ex, islands_ex); + islands_ex = offset_ex(islands_ex, -float(flow.scaled_spacing()), jtSquare); + } + + Polygons loops = union_pt_chained_outside_in(loops, false); + std::reverse(loops.begin(), loops.end()); + extrusion_entities_append_loops(brim.entities, std::move(loops), erSkirt, float(flow.mm3_per_mm()), + float(flow.width), float(print.skirt_first_layer_height())); +} + +// Produce brim lines around those objects, that have the brim enabled. +// Collect islands_area to be merged into the final 1st layer convex hull. +ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cancel, Polygons &islands_area) +{ + Flow flow = print.brim_flow(); + ConstPrintObjectPtrs top_level_objects_with_brim = get_top_level_objects_with_brim(print); + Polygons islands = top_level_outer_brim_islands(top_level_objects_with_brim); + ExPolygons islands_area_ex = top_level_outer_brim_area(print, top_level_objects_with_brim, flow.scaled_spacing()); + islands_area = to_polygons(islands_area_ex); + + Polygons loops; + size_t num_loops = size_t(floor(max_brim_width(print.objects()) / flow.spacing())); + for (size_t i = 0; i < num_loops; ++i) { + try_cancel(); + islands = offset(islands, float(flow.scaled_spacing()), jtSquare); + for (Polygon &poly : islands) + poly.douglas_peucker(SCALED_RESOLUTION); + polygons_append(loops, offset(islands, -0.5f * float(flow.scaled_spacing()))); + } + loops = union_pt_chained_outside_in(loops, false); + + std::vector loops_pl_by_levels; + { + Polylines loops_pl = to_polylines(loops); + loops_pl_by_levels.assign(loops_pl.size(), Polylines()); + tbb::parallel_for(tbb::blocked_range(0, loops_pl.size()), + [&loops_pl_by_levels, &loops_pl, &islands_area](const tbb::blocked_range &range) { + for (size_t i = range.begin(); i < range.end(); ++i) { + loops_pl_by_levels[i] = chain_polylines(intersection_pl({ std::move(loops_pl[i]) }, islands_area)); + } + }); + } + + // output + ExtrusionEntityCollection brim; + + // Reduce down to the ordered list of polylines. + Polylines all_loops; + for (Polylines &polylines : loops_pl_by_levels) + append(all_loops, std::move(polylines)); + loops_pl_by_levels.clear(); + + optimize_polylines_by_reversing(&all_loops); + all_loops = connect_brim_lines(std::move(all_loops), offset(islands_area_ex,SCALED_EPSILON), flow.scaled_spacing() * 2); + + const bool could_brim_intersects_skirt = std::any_of(print.objects().begin(), print.objects().end(), [&print](PrintObject *object) { + const BrimType &bt = object->config().brim_type; + return (bt == btOuterOnly || bt == btOuterAndInner) && print.config().skirt_distance.value < object->config().brim_width; + }); + // If there is a possibility that brim intersects skirt, go through loops and split those extrusions + // The result is either the original Polygon or a list of Polylines + if (! print.skirt().empty() && could_brim_intersects_skirt) + { + // Find the bounding polygons of the skirt + const Polygons skirt_inners = offset(dynamic_cast(print.skirt().entities.back())->polygon(), + -float(scale_(print.skirt_flow().spacing()))/2.f, + ClipperLib::jtRound, + float(scale_(0.1))); + const Polygons skirt_outers = offset(dynamic_cast(print.skirt().entities.front())->polygon(), + float(scale_(print.skirt_flow().spacing()))/2.f, + ClipperLib::jtRound, + float(scale_(0.1))); + + // First calculate the trimming region. + ClipperLib_Z::Paths trimming; + { + ClipperLib_Z::Paths input_subject; + ClipperLib_Z::Paths input_clip; + for (const Polygon &poly : skirt_outers) { + input_subject.emplace_back(); + ClipperLib_Z::Path &out = input_subject.back(); + out.reserve(poly.points.size()); + for (const Point &pt : poly.points) + out.emplace_back(pt.x(), pt.y(), 0); + } + for (const Polygon &poly : skirt_inners) { + input_clip.emplace_back(); + ClipperLib_Z::Path &out = input_clip.back(); + out.reserve(poly.points.size()); + for (const Point &pt : poly.points) + out.emplace_back(pt.x(), pt.y(), 0); + } + // init Clipper + ClipperLib_Z::Clipper clipper; + // add polygons + clipper.AddPaths(input_subject, ClipperLib_Z::ptSubject, true); + clipper.AddPaths(input_clip, ClipperLib_Z::ptClip, true); + // perform operation + clipper.Execute(ClipperLib_Z::ctDifference, trimming, ClipperLib_Z::pftEvenOdd, ClipperLib_Z::pftEvenOdd); + } + + // Second, trim the extrusion loops with the trimming regions. + ClipperLib_Z::Paths loops_trimmed; + { + // Produce ClipperLib_Z::Paths from polylines (not necessarily closed). + ClipperLib_Z::Paths input_clip; + for (const Polyline &loop_pl : all_loops) { + input_clip.emplace_back(); + ClipperLib_Z::Path& out = input_clip.back(); + out.reserve(loop_pl.points.size()); + int64_t loop_idx = &loop_pl - &all_loops.front(); + for (const Point& pt : loop_pl.points) + // The Z coordinate carries index of the source loop. + out.emplace_back(pt.x(), pt.y(), loop_idx + 1); + } + // init Clipper + ClipperLib_Z::Clipper clipper; + clipper.ZFillFunction([](const ClipperLib_Z::IntPoint& e1bot, const ClipperLib_Z::IntPoint& e1top, const ClipperLib_Z::IntPoint& e2bot, const ClipperLib_Z::IntPoint& e2top, ClipperLib_Z::IntPoint& pt) { + // Assign a valid input loop identifier. Such an identifier is strictly positive, the next line is safe even in case one side of a segment + // hat the Z coordinate not set to the contour coordinate. + pt.Z = std::max(std::max(e1bot.Z, e1top.Z), std::max(e2bot.Z, e2top.Z)); + }); + // add polygons + clipper.AddPaths(input_clip, ClipperLib_Z::ptSubject, false); + clipper.AddPaths(trimming, ClipperLib_Z::ptClip, true); + // perform operation + ClipperLib_Z::PolyTree loops_trimmed_tree; + clipper.Execute(ClipperLib_Z::ctDifference, loops_trimmed_tree, ClipperLib_Z::pftEvenOdd, ClipperLib_Z::pftEvenOdd); + ClipperLib_Z::PolyTreeToPaths(loops_trimmed_tree, loops_trimmed); + } + + // Third, produce the extrusions, sorted by the source loop indices. + { + std::vector> loops_trimmed_order; + loops_trimmed_order.reserve(loops_trimmed.size()); + for (const ClipperLib_Z::Path &path : loops_trimmed) { + size_t input_idx = 0; + for (const ClipperLib_Z::IntPoint &pt : path) + if (pt.Z > 0) { + input_idx = (size_t)pt.Z; + break; + } + assert(input_idx != 0); + loops_trimmed_order.emplace_back(&path, input_idx); + } + std::stable_sort(loops_trimmed_order.begin(), loops_trimmed_order.end(), + [](const std::pair &l, const std::pair &r) { + return l.second < r.second; + }); + + Point last_pt(0, 0); + for (size_t i = 0; i < loops_trimmed_order.size();) { + // Find all pieces that the initial loop was split into. + size_t j = i + 1; + for (; j < loops_trimmed_order.size() && loops_trimmed_order[i].second == loops_trimmed_order[j].second; ++ j) ; + const ClipperLib_Z::Path &first_path = *loops_trimmed_order[i].first; + if (i + 1 == j && first_path.size() > 3 && first_path.front().X == first_path.back().X && first_path.front().Y == first_path.back().Y) { + auto *loop = new ExtrusionLoop(); + brim.entities.emplace_back(loop); + loop->paths.emplace_back(erSkirt, float(flow.mm3_per_mm()), float(flow.width), float(print.skirt_first_layer_height())); + Points &points = loop->paths.front().polyline.points; + points.reserve(first_path.size()); + for (const ClipperLib_Z::IntPoint &pt : first_path) + points.emplace_back(coord_t(pt.X), coord_t(pt.Y)); + i = j; + } else { + //FIXME The path chaining here may not be optimal. + ExtrusionEntityCollection this_loop_trimmed; + this_loop_trimmed.entities.reserve(j - i); + for (; i < j; ++ i) { + this_loop_trimmed.entities.emplace_back(new ExtrusionPath(erSkirt, float(flow.mm3_per_mm()), float(flow.width), float(print.skirt_first_layer_height()))); + const ClipperLib_Z::Path &path = *loops_trimmed_order[i].first; + Points &points = static_cast(this_loop_trimmed.entities.back())->polyline.points; + points.reserve(path.size()); + for (const ClipperLib_Z::IntPoint &pt : path) + points.emplace_back(coord_t(pt.X), coord_t(pt.Y)); + } + chain_and_reorder_extrusion_entities(this_loop_trimmed.entities, &last_pt); + brim.entities.reserve(brim.entities.size() + this_loop_trimmed.entities.size()); + append(brim.entities, std::move(this_loop_trimmed.entities)); + this_loop_trimmed.entities.clear(); + } + last_pt = brim.last_point(); + } + } + } else { + extrusion_entities_append_loops_and_paths(brim.entities, std::move(all_loops), erSkirt, float(flow.mm3_per_mm()), float(flow.width), float(print.skirt_first_layer_height())); + } + + make_inner_brim(print, top_level_objects_with_brim, brim); + + return brim; +} + +} // namespace Slic3r diff --git a/src/libslic3r/Brim.hpp b/src/libslic3r/Brim.hpp new file mode 100644 index 00000000000..18bff2960cf --- /dev/null +++ b/src/libslic3r/Brim.hpp @@ -0,0 +1,14 @@ +#ifndef slic3r_Brim_hpp_ +#define slic3r_Brim_hpp_ + +namespace Slic3r { + +class Print; + +// Produce brim lines around those objects, that have the brim enabled. +// Collect islands_area to be merged into the final 1st layer convex hull. +ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cancel, Polygons &islands_area); + +} // Slic3r + +#endif // slic3r_Brim_hpp_ diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 7b7067d9f2b..b9f87058cc0 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -21,6 +21,8 @@ add_library(libslic3r STATIC BoundingBox.hpp BridgeDetector.cpp BridgeDetector.hpp + Brim.cpp + Brim.hpp ClipperUtils.cpp ClipperUtils.hpp Config.cpp diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index 12c19eaefec..0b91648da29 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -1946,8 +1946,9 @@ class DynamicConfig : public virtual ConfigBase int& opt_int(const t_config_option_key &opt_key, unsigned int idx) { return this->option(opt_key)->get_at(idx); } int opt_int(const t_config_option_key &opt_key, unsigned int idx) const { return dynamic_cast(this->option(opt_key))->get_at(idx); } + // In ConfigManipulation::toggle_print_fff_options, it is called on option with type ConfigOptionEnumGeneric* and also ConfigOptionEnum*. template - ENUM opt_enum(const t_config_option_key &opt_key) const { return (ENUM)dynamic_cast(this->option(opt_key))->value; } + ENUM opt_enum(const t_config_option_key &opt_key) const { return this->option>(opt_key)->value; } bool opt_bool(const t_config_option_key &opt_key) const { return this->option(opt_key)->value != 0; } bool opt_bool(const t_config_option_key &opt_key, unsigned int idx) const { return this->option(opt_key)->get_at(idx) != 0; } diff --git a/src/libslic3r/ExPolygon.cpp b/src/libslic3r/ExPolygon.cpp index f698a355898..12bfa3b3535 100644 --- a/src/libslic3r/ExPolygon.cpp +++ b/src/libslic3r/ExPolygon.cpp @@ -80,6 +80,13 @@ bool ExPolygon::is_valid() const return true; } +void ExPolygon::douglas_peucker(double tolerance) +{ + this->contour.douglas_peucker(tolerance); + for (Polygon &poly : this->holes) + poly.douglas_peucker(tolerance); +} + bool ExPolygon::contains(const Line &line) const { return this->contains(Polyline(line.a, line.b)); diff --git a/src/libslic3r/ExPolygon.hpp b/src/libslic3r/ExPolygon.hpp index b4651abc231..20d0ffa7dad 100644 --- a/src/libslic3r/ExPolygon.hpp +++ b/src/libslic3r/ExPolygon.hpp @@ -49,6 +49,7 @@ class ExPolygon double area() const; bool empty() const { return contour.points.empty(); } bool is_valid() const; + void douglas_peucker(double tolerance); // Contains the line / polyline / polylines etc COMPLETELY. bool contains(const Line &line) const; @@ -249,6 +250,24 @@ inline Polygons to_polygons(ExPolygons &&src) return polygons; } +inline ExPolygons to_expolygons(const Polygons &polys) +{ + ExPolygons ex_polys; + ex_polys.assign(polys.size(), ExPolygon()); + for (size_t idx = 0; idx < polys.size(); ++idx) + ex_polys[idx].contour = polys[idx]; + return ex_polys; +} + +inline ExPolygons to_expolygons(Polygons &&polys) +{ + ExPolygons ex_polys; + ex_polys.assign(polys.size(), ExPolygon()); + for (size_t idx = 0; idx < polys.size(); ++idx) + ex_polys[idx].contour = std::move(polys[idx]); + return ex_polys; +} + inline void polygons_append(Polygons &dst, const ExPolygon &src) { dst.reserve(dst.size() + src.holes.size() + 1); diff --git a/src/libslic3r/ExtrusionEntity.hpp b/src/libslic3r/ExtrusionEntity.hpp index 6b0153b2ead..9b972f211e5 100644 --- a/src/libslic3r/ExtrusionEntity.hpp +++ b/src/libslic3r/ExtrusionEntity.hpp @@ -343,6 +343,25 @@ inline void extrusion_entities_append_loops(ExtrusionEntitiesPtr &dst, Polygons loops.clear(); } +inline void extrusion_entities_append_loops_and_paths(ExtrusionEntitiesPtr &dst, Polylines &&polylines, ExtrusionRole role, double mm3_per_mm, float width, float height) +{ + dst.reserve(dst.size() + polylines.size()); + for (Polyline &polyline : polylines) { + if (polyline.is_valid()) { + if (polyline.is_closed()) { + ExtrusionPath extrusion_path(role, mm3_per_mm, width, height); + extrusion_path.polyline = std::move(polyline); + dst.emplace_back(new ExtrusionLoop(std::move(extrusion_path))); + } else { + ExtrusionPath *extrusion_path = new ExtrusionPath(role, mm3_per_mm, width, height); + extrusion_path->polyline = std::move(polyline); + dst.emplace_back(extrusion_path); + } + } + } + polylines.clear(); +} + } #endif diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 87bfe30654d..261487cc163 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1790,7 +1790,7 @@ void GCode::process_layer( // Just a reminder: A spiral vase mode is allowed for a single object, single material print only. m_enable_loop_clipping = true; if (m_spiral_vase && layers.size() == 1 && support_layer == nullptr) { - bool enable = (layer.id() > 0 || print.config().brim_width.value == 0.) && (layer.id() >= (size_t)print.config().skirt_height.value && ! print.has_infinite_skirt()); + bool enable = (layer.id() > 0 || !print.has_brim()) && (layer.id() >= (size_t)print.config().skirt_height.value && ! print.has_infinite_skirt()); if (enable) { for (const LayerRegion *layer_region : layer.regions()) if (size_t(layer_region->region()->config().bottom_solid_layers.value) > layer.id() || diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 458eae80a91..1dbb153dda4 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -33,7 +33,7 @@ class GCode; namespace { struct Item; } struct PrintInstance; -using PrintObjectPtrs = std::vector; +class ConstPrintObjectPtrsAdaptor; class OozePrevention { public: diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index 74f061e4eaf..fae4028deb6 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -600,7 +600,7 @@ float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int return std::max(0.f, volume_to_wipe); // Soluble filament cannot be wiped in a random infill, neither the filament after it // we will sort objects so that dedicated for wiping are at the beginning: - PrintObjectPtrs object_list = print.objects(); + ConstPrintObjectPtrs object_list = print.objects().vector(); std::sort(object_list.begin(), object_list.end(), [](const PrintObject* a, const PrintObject* b) { return a->config().wipe_into_objects; }); // We will now iterate through diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 7a4bbe27ae9..b6929b839f3 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -604,7 +604,7 @@ void PerimeterGenerator::process() // we continue inwards after having finished the brim // TODO: add test for perimeter order if (this->config->external_perimeters_first || - (this->layer_id == 0 && this->print_config->brim_width.value > 0)) + (this->layer_id == 0 && this->object_config->brim_width.value > 0)) entities.reverse(); // append perimeters for this slice as a collection if (! entities.empty()) diff --git a/src/libslic3r/Polygon.cpp b/src/libslic3r/Polygon.cpp index f74df1c9a2a..7c588c67cc2 100644 --- a/src/libslic3r/Polygon.cpp +++ b/src/libslic3r/Polygon.cpp @@ -96,6 +96,14 @@ bool Polygon::make_clockwise() return false; } +void Polygon::douglas_peucker(double tolerance) +{ + this->points.push_back(this->points.front()); + Points p = MultiPoint::_douglas_peucker(this->points, tolerance); + p.pop_back(); + this->points = std::move(p); +} + // Does an unoriented polygon contain a point? // Tested by counting intersections along a horizontal line. bool Polygon::contains(const Point &point) const diff --git a/src/libslic3r/Polygon.hpp b/src/libslic3r/Polygon.hpp index b550ae7d7ad..aa72b4244d8 100644 --- a/src/libslic3r/Polygon.hpp +++ b/src/libslic3r/Polygon.hpp @@ -55,6 +55,7 @@ class Polygon : public MultiPoint bool make_counter_clockwise(); bool make_clockwise(); bool is_valid() const { return this->points.size() >= 3; } + void douglas_peucker(double tolerance); // Does an unoriented polygon contain a point? // Tested by counting intersections along a horizontal line. diff --git a/src/libslic3r/Polyline.hpp b/src/libslic3r/Polyline.hpp index ef1da9afb92..9c70522bfbf 100644 --- a/src/libslic3r/Polyline.hpp +++ b/src/libslic3r/Polyline.hpp @@ -75,6 +75,7 @@ class Polyline : public MultiPoint { template void simplify_by_visibility(const T &area); void split_at(const Point &point, Polyline* p1, Polyline* p2) const; bool is_straight() const; + bool is_closed() const { return this->points.front() == this->points.back(); } }; // Don't use this class in production code, it is used exclusively by the Perl binding for unit tests! diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 751b2a2a6d3..f535555d00c 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -419,7 +419,7 @@ const std::vector& Preset::print_options() "top_solid_infill_speed", "support_material_speed", "support_material_xy_spacing", "support_material_interface_speed", "bridge_speed", "gap_fill_speed", "travel_speed", "first_layer_speed", "perimeter_acceleration", "infill_acceleration", "bridge_acceleration", "first_layer_acceleration", "default_acceleration", "skirts", "skirt_distance", "skirt_height", "draft_shield", - "min_skirt_length", "brim_width", "support_material", "support_material_auto", "support_material_threshold", "support_material_enforce_layers", + "min_skirt_length", "brim_width", "brim_offset", "brim_type", "support_material", "support_material_auto", "support_material_threshold", "support_material_enforce_layers", "raft_layers", "support_material_pattern", "support_material_with_sheath", "support_material_spacing", "support_material_synchronize_layers", "support_material_angle", "support_material_interface_layers", "support_material_interface_spacing", "support_material_interface_contact_loops", "support_material_contact_distance", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index d50ff19e8a5..61a5ae99c3b 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1,8 +1,7 @@ -#include "clipper/clipper_z.hpp" - #include "Exception.hpp" #include "Print.hpp" #include "BoundingBox.hpp" +#include "Brim.hpp" #include "ClipperUtils.hpp" #include "Extruder.hpp" #include "Flow.hpp" @@ -15,8 +14,6 @@ #include "GCode/WipeTower.hpp" #include "Utils.hpp" -//#include "PrintExport.hpp" - #include #include @@ -174,7 +171,10 @@ bool Print::invalidate_state_by_config_options(const std::vector print_objects_old = std::move(m_objects); + PrintObjectPtrs print_objects_old = std::move(m_objects); m_objects.clear(); m_objects.reserve(print_objects_old.size()); for (PrintObject *print_object : print_objects_old) { @@ -945,7 +945,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ // 4) Generate PrintObjects from ModelObjects and their instances. { - std::vector print_objects_new; + PrintObjectPtrs print_objects_new; print_objects_new.reserve(std::max(m_objects.size(), m_model.objects.size())); bool new_objects = false; // Walk over all new model objects and check, whether there are matching PrintObjects. @@ -1188,6 +1188,12 @@ bool Print::has_skirt() const return (m_config.skirt_height > 0 && m_config.skirts > 0) || this->has_infinite_skirt(); } +bool Print::has_brim() const +{ + return std::any_of(m_objects.begin(), m_objects.end(), + [](PrintObject *object) { return object->config().brim_type != btNoBrim && object->config().brim_width.value > 0.; }); +} + static inline bool sequential_print_horizontal_clearance_valid(const Print &print) { Polygons convex_hulls_other; @@ -1655,9 +1661,12 @@ void Print::process() if (this->set_started(psBrim)) { m_brim.clear(); m_first_layer_convex_hull.points.clear(); - if (m_config.brim_width > 0) { + if (this->has_brim()) { this->set_status(88, L("Generating brim")); - this->_make_brim(); + Polygons islands_area; + m_brim = make_brim(*this, this->make_try_cancel(), islands_area); + for (Polygon &poly : union_(this->first_layer_islands(), islands_area)) + append(m_first_layer_convex_hull.points, std::move(poly.points)); } // Brim depends on skirt (brim lines are trimmed by the skirt lines), therefore if // the skirt gets invalidated, brim gets invalidated as well and the following line is called. @@ -1831,164 +1840,6 @@ void Print::_make_skirt() append(m_skirt_convex_hull, std::move(poly.points)); } -void Print::_make_brim() -{ - // Brim is only printed on first layer and uses perimeter extruder. - Polygons islands = this->first_layer_islands(); - Polygons loops; - Flow flow = this->brim_flow(); - size_t num_loops = size_t(floor(m_config.brim_width.value / flow.spacing())); - for (size_t i = 0; i < num_loops; ++ i) { - this->throw_if_canceled(); - islands = offset(islands, float(flow.scaled_spacing()), jtSquare); - for (Polygon &poly : islands) { - // poly.simplify(SCALED_RESOLUTION); - poly.points.push_back(poly.points.front()); - Points p = MultiPoint::_douglas_peucker(poly.points, SCALED_RESOLUTION); - p.pop_back(); - poly.points = std::move(p); - } - if (i + 1 == num_loops) { - // Remember the outer edge of the last brim line extruded as m_first_layer_convex_hull. - for (Polygon &poly : islands) - append(m_first_layer_convex_hull.points, poly.points); - } - polygons_append(loops, offset(islands, -0.5f * float(flow.scaled_spacing()))); - } - loops = union_pt_chained_outside_in(loops, false); - - // If there is a possibility that brim intersects skirt, go through loops and split those extrusions - // The result is either the original Polygon or a list of Polylines - if (! m_skirt.empty() && m_config.skirt_distance.value < m_config.brim_width) - { - // Find the bounding polygons of the skirt - const Polygons skirt_inners = offset(dynamic_cast(m_skirt.entities.back())->polygon(), - -float(scale_(this->skirt_flow().spacing()))/2.f, - ClipperLib::jtRound, - float(scale_(0.1))); - const Polygons skirt_outers = offset(dynamic_cast(m_skirt.entities.front())->polygon(), - float(scale_(this->skirt_flow().spacing()))/2.f, - ClipperLib::jtRound, - float(scale_(0.1))); - - // First calculate the trimming region. - ClipperLib_Z::Paths trimming; - { - ClipperLib_Z::Paths input_subject; - ClipperLib_Z::Paths input_clip; - for (const Polygon &poly : skirt_outers) { - input_subject.emplace_back(); - ClipperLib_Z::Path &out = input_subject.back(); - out.reserve(poly.points.size()); - for (const Point &pt : poly.points) - out.emplace_back(pt.x(), pt.y(), 0); - } - for (const Polygon &poly : skirt_inners) { - input_clip.emplace_back(); - ClipperLib_Z::Path &out = input_clip.back(); - out.reserve(poly.points.size()); - for (const Point &pt : poly.points) - out.emplace_back(pt.x(), pt.y(), 0); - } - // init Clipper - ClipperLib_Z::Clipper clipper; - // add polygons - clipper.AddPaths(input_subject, ClipperLib_Z::ptSubject, true); - clipper.AddPaths(input_clip, ClipperLib_Z::ptClip, true); - // perform operation - clipper.Execute(ClipperLib_Z::ctDifference, trimming, ClipperLib_Z::pftEvenOdd, ClipperLib_Z::pftEvenOdd); - } - - // Second, trim the extrusion loops with the trimming regions. - ClipperLib_Z::Paths loops_trimmed; - { - // Produce a closed polyline (repeat the first point at the end). - ClipperLib_Z::Paths input_clip; - for (const Polygon &loop : loops) { - input_clip.emplace_back(); - ClipperLib_Z::Path& out = input_clip.back(); - out.reserve(loop.points.size()); - int64_t loop_idx = &loop - &loops.front(); - for (const Point& pt : loop.points) - // The Z coordinate carries index of the source loop. - out.emplace_back(pt.x(), pt.y(), loop_idx + 1); - out.emplace_back(out.front()); - } - // init Clipper - ClipperLib_Z::Clipper clipper; - clipper.ZFillFunction([](const ClipperLib_Z::IntPoint& e1bot, const ClipperLib_Z::IntPoint& e1top, const ClipperLib_Z::IntPoint& e2bot, const ClipperLib_Z::IntPoint& e2top, ClipperLib_Z::IntPoint& pt) { - // Assign a valid input loop identifier. Such an identifier is strictly positive, the next line is safe even in case one side of a segment - // hat the Z coordinate not set to the contour coordinate. - pt.Z = std::max(std::max(e1bot.Z, e1top.Z), std::max(e2bot.Z, e2top.Z)); - }); - // add polygons - clipper.AddPaths(input_clip, ClipperLib_Z::ptSubject, false); - clipper.AddPaths(trimming, ClipperLib_Z::ptClip, true); - // perform operation - ClipperLib_Z::PolyTree loops_trimmed_tree; - clipper.Execute(ClipperLib_Z::ctDifference, loops_trimmed_tree, ClipperLib_Z::pftEvenOdd, ClipperLib_Z::pftEvenOdd); - ClipperLib_Z::PolyTreeToPaths(loops_trimmed_tree, loops_trimmed); - } - - // Third, produce the extrusions, sorted by the source loop indices. - { - std::vector> loops_trimmed_order; - loops_trimmed_order.reserve(loops_trimmed.size()); - for (const ClipperLib_Z::Path &path : loops_trimmed) { - size_t input_idx = 0; - for (const ClipperLib_Z::IntPoint &pt : path) - if (pt.Z > 0) { - input_idx = (size_t)pt.Z; - break; - } - assert(input_idx != 0); - loops_trimmed_order.emplace_back(&path, input_idx); - } - std::stable_sort(loops_trimmed_order.begin(), loops_trimmed_order.end(), - [](const std::pair &l, const std::pair &r) { - return l.second < r.second; - }); - - Point last_pt(0, 0); - for (size_t i = 0; i < loops_trimmed_order.size();) { - // Find all pieces that the initial loop was split into. - size_t j = i + 1; - for (; j < loops_trimmed_order.size() && loops_trimmed_order[i].second == loops_trimmed_order[j].second; ++ j) ; - const ClipperLib_Z::Path &first_path = *loops_trimmed_order[i].first; - if (i + 1 == j && first_path.size() > 3 && first_path.front().X == first_path.back().X && first_path.front().Y == first_path.back().Y) { - auto *loop = new ExtrusionLoop(); - m_brim.entities.emplace_back(loop); - loop->paths.emplace_back(erSkirt, float(flow.mm3_per_mm()), float(flow.width), float(this->skirt_first_layer_height())); - Points &points = loop->paths.front().polyline.points; - points.reserve(first_path.size()); - for (const ClipperLib_Z::IntPoint &pt : first_path) - points.emplace_back(coord_t(pt.X), coord_t(pt.Y)); - i = j; - } else { - //FIXME The path chaining here may not be optimal. - ExtrusionEntityCollection this_loop_trimmed; - this_loop_trimmed.entities.reserve(j - i); - for (; i < j; ++ i) { - this_loop_trimmed.entities.emplace_back(new ExtrusionPath(erSkirt, float(flow.mm3_per_mm()), float(flow.width), float(this->skirt_first_layer_height()))); - const ClipperLib_Z::Path &path = *loops_trimmed_order[i].first; - Points &points = static_cast(this_loop_trimmed.entities.back())->polyline.points; - points.reserve(path.size()); - for (const ClipperLib_Z::IntPoint &pt : path) - points.emplace_back(coord_t(pt.X), coord_t(pt.Y)); - } - chain_and_reorder_extrusion_entities(this_loop_trimmed.entities, &last_pt); - m_brim.entities.reserve(m_brim.entities.size() + this_loop_trimmed.entities.size()); - append(m_brim.entities, std::move(this_loop_trimmed.entities)); - this_loop_trimmed.entities.clear(); - } - last_pt = m_brim.last_point(); - } - } - } else { - extrusion_entities_append_loops(m_brim.entities, std::move(loops), erSkirt, float(flow.mm3_per_mm()), float(flow.width), float(this->skirt_first_layer_height())); - } -} - Polygons Print::first_layer_islands() const { Polygons islands; @@ -2104,8 +1955,8 @@ void Print::_make_wipe_tower() if (idx_begin != size_t(-1)) { // Find the position in m_objects.first()->support_layers to insert these new support layers. double wipe_tower_new_layer_print_z_first = m_wipe_tower_data.tool_ordering.layer_tools()[idx_begin].print_z; - SupportLayerPtrs::const_iterator it_layer = m_objects.front()->support_layers().begin(); - SupportLayerPtrs::const_iterator it_end = m_objects.front()->support_layers().end(); + auto it_layer = m_objects.front()->support_layers().begin(); + auto it_end = m_objects.front()->support_layers().end(); for (; it_layer != it_end && (*it_layer)->print_z - EPSILON < wipe_tower_new_layer_print_z_first; ++ it_layer); // Find the stopper of the sequence of wipe tower layers, which do not have a counterpart in an object or a support layer. for (size_t i = idx_begin; i < idx_end; ++ i) { diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 281ce35bc05..819cbab8ca8 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -73,7 +73,7 @@ class PrintRegion // Collect 0-based extruder indices used to print this region's object. void collect_object_printing_extruders(std::vector &object_extruders) const; - static void collect_object_printing_extruders(const PrintConfig &print_config, const PrintRegionConfig ®ion_config, std::vector &object_extruders); + static void collect_object_printing_extruders(const PrintConfig &print_config, const PrintRegionConfig ®ion_config, const bool has_brim, std::vector &object_extruders); // Methods modifying the PrintRegion's state: public: @@ -95,9 +95,39 @@ class PrintRegion ~PrintRegion() = default; }; +template +class ConstVectorOfPtrsAdaptor { +public: + // Returning a non-const pointer to const pointers to T. + T * const * begin() const { return m_data->data(); } + T * const * end() const { return m_data->data() + m_data->size(); } + const T* front() const { return m_data->front(); } + const T* back() const { return m_data->front(); } + size_t size() const { return m_data->size(); } + bool empty() const { return m_data->empty(); } + const T* operator[](size_t i) const { return (*m_data)[i]; } + const T* at(size_t i) const { return m_data->at(i); } + std::vector vector() const { return std::vector(this->begin(), this->end()); } +protected: + ConstVectorOfPtrsAdaptor(const std::vector *data) : m_data(data) {} +private: + const std::vector *m_data; +}; + +typedef std::vector LayerPtrs; +typedef std::vector ConstLayerPtrs; +class ConstLayerPtrsAdaptor : public ConstVectorOfPtrsAdaptor { + friend PrintObject; + ConstLayerPtrsAdaptor(const LayerPtrs *data) : ConstVectorOfPtrsAdaptor(data) {} +}; + +typedef std::vector SupportLayerPtrs; +typedef std::vector ConstSupportLayerPtrs; +class ConstSupportLayerPtrsAdaptor : public ConstVectorOfPtrsAdaptor { + friend PrintObject; + ConstSupportLayerPtrsAdaptor(const SupportLayerPtrs *data) : ConstVectorOfPtrsAdaptor(data) {} +}; -typedef std::vector LayerPtrs; -typedef std::vector SupportLayerPtrs; class BoundingBoxf3; // TODO: for temporary constructor parameter // Single instance of a PrintObject. @@ -125,12 +155,16 @@ class PrintObject : public PrintObjectBaseWithState>> region_volumes; // Size of an object: XYZ in scaled coordinates. The size might not be quite snug in XY plane. - const Vec3crd& size() const { return m_size; } - const PrintObjectConfig& config() const { return m_config; } - const LayerPtrs& layers() const { return m_layers; } - const SupportLayerPtrs& support_layers() const { return m_support_layers; } - const Transform3d& trafo() const { return m_trafo; } - const PrintInstances& instances() const { return m_instances; } + const Vec3crd& size() const { return m_size; } + const PrintObjectConfig& config() const { return m_config; } + ConstLayerPtrsAdaptor layers() const { return ConstLayerPtrsAdaptor(&m_layers); } + ConstSupportLayerPtrsAdaptor support_layers() const { return ConstSupportLayerPtrsAdaptor(&m_support_layers); } + const Transform3d& trafo() const { return m_trafo; } + const PrintInstances& instances() const { return m_instances; } + + // Whoever will get a non-const pointer to PrintObject will be able to modify its layers. + LayerPtrs& layers() { return m_layers; } + SupportLayerPtrs& support_layers() { return m_support_layers; } // Bounding box is used to align the object infill patterns, and to calculate attractor for the rear seam. // The bounding box may not be quite snug. @@ -171,7 +205,7 @@ class PrintObject : public PrintObjectBaseWithState PrintObjectPtrs; -typedef std::vector PrintRegionPtrs; +typedef std::vector PrintObjectPtrs; +typedef std::vector ConstPrintObjectPtrs; +class ConstPrintObjectPtrsAdaptor : public ConstVectorOfPtrsAdaptor { + friend Print; + ConstPrintObjectPtrsAdaptor(const PrintObjectPtrs *data) : ConstVectorOfPtrsAdaptor(data) {} +}; + +typedef std::vector PrintRegionPtrs; +typedef std::vector ConstPrintRegionPtrs; +class ConstPrintRegionPtrsAdaptor : public ConstVectorOfPtrsAdaptor { + friend Print; + ConstPrintRegionPtrsAdaptor(const PrintRegionPtrs *data) : ConstVectorOfPtrsAdaptor(data) {} +}; // The complete print tray with possibly multiple objects. class Print : public PrintBaseWithState { private: // Prevents erroneous use by other classes. typedef PrintBaseWithState Inherited; + // Bool indicates if supports of PrintObject are top-level contour. + typedef std::pair PrintObjectInfo; public: Print() = default; @@ -385,6 +432,7 @@ class Print : public PrintBaseWithState bool has_infinite_skirt() const; bool has_skirt() const; + bool has_brim() const; // Returns an empty string if valid, otherwise returns an error message. std::string validate() const override; @@ -403,9 +451,8 @@ class Print : public PrintBaseWithState const PrintConfig& config() const { return m_config; } const PrintObjectConfig& default_object_config() const { return m_default_object_config; } const PrintRegionConfig& default_region_config() const { return m_default_region_config; } - //FIXME returning const vector to non-const PrintObject*, caller could modify PrintObjects! - const PrintObjectPtrs& objects() const { return m_objects; } - PrintObject* get_object(size_t idx) { return m_objects[idx]; } + ConstPrintObjectPtrsAdaptor objects() const { return ConstPrintObjectPtrsAdaptor(&m_objects); } + PrintObject* get_object(size_t idx) { return const_cast(m_objects[idx]); } const PrintObject* get_object(size_t idx) const { return m_objects[idx]; } // PrintObject by its ObjectID, to be used to uniquely bind slicing warnings to their source PrintObjects // in the notification center. @@ -414,11 +461,15 @@ class Print : public PrintBaseWithState [object_id](const PrintObject *obj) { return obj->id() == object_id; }); return (it == m_objects.end()) ? nullptr : *it; } - const PrintRegionPtrs& regions() const { return m_regions; } + ConstPrintRegionPtrsAdaptor regions() const { return ConstPrintRegionPtrsAdaptor(&m_regions); } // How many of PrintObject::copies() over all print objects are there? // If zero, then the print is empty and the print shall not be executed. unsigned int num_object_instances() const; + // For Perl bindings. + PrintObjectPtrs& objects_mutable() { return m_objects; } + PrintRegionPtrs& regions_mutable() { return m_regions; } + const ExtrusionEntityCollection& skirt() const { return m_skirt; } const ExtrusionEntityCollection& brim() const { return m_brim; } // Convex hull of the 1st layer extrusions, for bed leveling and placing the initial purge line. @@ -461,7 +512,6 @@ class Print : public PrintBaseWithState bool invalidate_state_by_config_options(const std::vector &opt_keys); void _make_skirt(); - void _make_brim(); void _make_wipe_tower(); void finalize_first_layer_convex_hull(); diff --git a/src/libslic3r/PrintBase.cpp b/src/libslic3r/PrintBase.cpp index fb5e102c1ad..721741d4a89 100644 --- a/src/libslic3r/PrintBase.cpp +++ b/src/libslic3r/PrintBase.cpp @@ -13,6 +13,11 @@ namespace Slic3r { +void PrintTryCancel::operator()() +{ + m_print->throw_if_canceled(); +} + size_t PrintStateBase::g_last_timestamp = 0; // Update "scale", "input_filename", "input_filename_base" placeholders from the current m_objects. diff --git a/src/libslic3r/PrintBase.hpp b/src/libslic3r/PrintBase.hpp index bfbabd06b56..8fca43319a0 100644 --- a/src/libslic3r/PrintBase.hpp +++ b/src/libslic3r/PrintBase.hpp @@ -324,6 +324,20 @@ class PrintObjectBase : public ObjectBase ModelObject *m_model_object; }; +// Wrapper around the private PrintBase.throw_if_canceled(), so that a cancellation object could be passed +// to a non-friend of PrintBase by a PrintBase derived object. +class PrintTryCancel +{ +public: + // calls print.throw_if_canceled(). + void operator()(); +private: + friend PrintBase; + PrintTryCancel() = delete; + PrintTryCancel(const PrintBase *print) : m_print(print) {} + const PrintBase *m_print; +}; + /** * @brief Printing involves slicing and export of device dependent instructions. * @@ -472,6 +486,8 @@ class PrintBase : public ObjectBase // If the background processing stop was requested, throw CanceledException. // To be called by the worker thread and its sub-threads (mostly launched on the TBB thread pool) regularly. void throw_if_canceled() const { if (m_cancel_status) throw CanceledException(); } + // Wrapper around this->throw_if_canceled(), so that throw_if_canceled() may be passed to a function without making throw_if_canceled() public. + PrintTryCancel make_try_cancel() const { return PrintTryCancel(this); } // To be called by this->output_filename() with the format string pulled from the configuration layer. std::string output_filename(const std::string &format, const std::string &default_ext, const std::string &filename_base, const DynamicConfig *config_override = nullptr) const; @@ -495,6 +511,8 @@ class PrintBase : public ObjectBase // The mutex will be used to guard the worker thread against entering a stage // while the data influencing the stage is modified. mutable tbb::mutex m_state_mutex; + + friend PrintTryCancel; }; template diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 587c22cc6e4..20f3991c9f2 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -298,12 +298,37 @@ void PrintConfigDef::init_fff_params() def = this->add("brim_width", coFloat); def->label = L("Brim width"); + def->category = L("Skirt and brim"); def->tooltip = L("Horizontal width of the brim that will be printed around each object on the first layer."); def->sidetext = L("mm"); def->min = 0; def->mode = comSimple; def->set_default_value(new ConfigOptionFloat(0)); + def = this->add("brim_type", coEnum); + def->label = L("Brim type"); + def->category = L("Skirt and brim"); + def->tooltip = L("The places where the brim will be printed around each object on the first layer."); + def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); + def->enum_values.emplace_back("no_brim"); + def->enum_values.emplace_back("outer_only"); + def->enum_values.emplace_back("inner_only"); + def->enum_values.emplace_back("outer_and_inner"); + def->enum_labels.emplace_back(L("No brim")); + def->enum_labels.emplace_back(L("Outer brim only")); + def->enum_labels.emplace_back(L("Inner brim only")); + def->enum_labels.emplace_back(L("Outer and inner brim")); + def->mode = comSimple; + def->set_default_value(new ConfigOptionEnum(btOuterOnly)); + + def = this->add("brim_offset", coFloat); + def->label = L("Brim offset"); + def->category = L("Skirt and brim"); + def->tooltip = L("The offset of the brim from the printed object."); + def->sidetext = L("mm"); + def->mode = comSimple; + def->set_default_value(new ConfigOptionFloat(0)); + def = this->add("clip_multipart_objects", coBool); def->label = L("Clip multi-part objects"); def->tooltip = L("When printing multi-material objects, this settings will make Slic3r " diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index e2f71a9415a..5189baab2da 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -103,6 +103,13 @@ enum SLAPillarConnectionMode { slapcmDynamic }; +enum BrimType { + btNoBrim, + btOuterOnly, + btInnerOnly, + btOuterAndInner, +}; + template<> inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { static t_config_enum_values keys_map; if (keys_map.empty()) { @@ -264,6 +271,17 @@ template<> inline const t_config_enum_values& ConfigOptionEnum inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { + static const t_config_enum_values keys_map = { + {"no_brim", btNoBrim}, + {"outer_only", btOuterOnly}, + {"inner_only", btInnerOnly}, + {"outer_and_inner", btOuterAndInner} + }; + + return keys_map; +} + // Defines each and every confiuration option of Slic3r, including the properties of the GUI dialogs. // Does not store the actual values, but defines default values. class PrintConfigDef : public ConfigDef @@ -477,6 +495,9 @@ class PrintObjectConfig : public StaticPrintConfig { STATIC_PRINT_CONFIG_CACHE(PrintObjectConfig) public: + ConfigOptionFloat brim_offset; + ConfigOptionEnum brim_type; + ConfigOptionFloat brim_width; ConfigOptionBool clip_multipart_objects; ConfigOptionBool dont_support_bridges; ConfigOptionFloat elefant_foot_compensation; @@ -526,6 +547,9 @@ class PrintObjectConfig : public StaticPrintConfig protected: void initialize(StaticCacheBase &cache, const char *base_ptr) { + OPT_PTR(brim_offset); + OPT_PTR(brim_type); + OPT_PTR(brim_width); OPT_PTR(clip_multipart_objects); OPT_PTR(dont_support_bridges); OPT_PTR(elefant_foot_compensation); @@ -891,7 +915,6 @@ class PrintConfig : public MachineEnvelopeConfig, public GCodeConfig ConfigOptionInts bed_temperature; ConfigOptionFloat bridge_acceleration; ConfigOptionInts bridge_fan_speed; - ConfigOptionFloat brim_width; ConfigOptionBool complete_objects; ConfigOptionFloats colorprint_heights; ConfigOptionBools cooling; @@ -966,7 +989,6 @@ class PrintConfig : public MachineEnvelopeConfig, public GCodeConfig OPT_PTR(bed_temperature); OPT_PTR(bridge_acceleration); OPT_PTR(bridge_fan_speed); - OPT_PTR(brim_width); OPT_PTR(complete_objects); OPT_PTR(colorprint_heights); OPT_PTR(cooling); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 543a45846bd..d639d03c8f2 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -501,7 +501,7 @@ SupportLayer* PrintObject::add_support_layer(int id, coordf_t height, coordf_t p return m_support_layers.back(); } -SupportLayerPtrs::const_iterator PrintObject::insert_support_layer(SupportLayerPtrs::const_iterator pos, size_t id, coordf_t height, coordf_t print_z, coordf_t slice_z) +SupportLayerPtrs::iterator PrintObject::insert_support_layer(SupportLayerPtrs::iterator pos, size_t id, coordf_t height, coordf_t print_z, coordf_t slice_z) { return m_support_layers.insert(pos, new SupportLayer(id, this, height, print_z, slice_z)); } @@ -1628,6 +1628,7 @@ SlicingParameters PrintObject::slicing_parameters(const DynamicPrintConfig& full PrintRegion::collect_object_printing_extruders( print_config, region_config_from_model_volume(default_region_config, nullptr, *model_volume, num_extruders), + object_config.brim_type != btNoBrim && object_config.brim_width > 0., object_extruders); for (const std::pair &range_and_config : model_object.layer_config_ranges) if (range_and_config.second.has("perimeter_extruder") || @@ -1636,6 +1637,7 @@ SlicingParameters PrintObject::slicing_parameters(const DynamicPrintConfig& full PrintRegion::collect_object_printing_extruders( print_config, region_config_from_model_volume(default_region_config, &range_and_config.second.get(), *model_volume, num_extruders), + object_config.brim_type != btNoBrim && object_config.brim_width > 0., object_extruders); } sort_remove_duplicates(object_extruders); @@ -1721,7 +1723,7 @@ void PrintObject::_slice(const std::vector &layer_height_profile) } // Make sure all layers contain layer region objects for all regions. for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) - layer->add_region(this->print()->regions()[region_id]); + layer->add_region(this->print()->get_region(region_id)); prev = layer; } } diff --git a/src/libslic3r/PrintRegion.cpp b/src/libslic3r/PrintRegion.cpp index 2a75cd621d9..79eb647f665 100644 --- a/src/libslic3r/PrintRegion.cpp +++ b/src/libslic3r/PrintRegion.cpp @@ -66,7 +66,7 @@ coordf_t PrintRegion::bridging_height_avg(const PrintConfig &print_config) const return this->nozzle_dmr_avg(print_config) * sqrt(m_config.bridge_flow_ratio.value); } -void PrintRegion::collect_object_printing_extruders(const PrintConfig &print_config, const PrintRegionConfig ®ion_config, std::vector &object_extruders) +void PrintRegion::collect_object_printing_extruders(const PrintConfig &print_config, const PrintRegionConfig ®ion_config, const bool has_brim, std::vector &object_extruders) { // These checks reflect the same logic used in the GUI for enabling/disabling extruder selection fields. auto num_extruders = (int)print_config.nozzle_diameter.size(); @@ -74,7 +74,7 @@ void PrintRegion::collect_object_printing_extruders(const PrintConfig &print_con int i = std::max(0, extruder_id - 1); object_extruders.emplace_back((i >= num_extruders) ? 0 : i); }; - if (region_config.perimeters.value > 0 || print_config.brim_width.value > 0) + if (region_config.perimeters.value > 0 || has_brim) emplace_extruder(region_config.perimeter_extruder); if (region_config.fill_density.value > 0) emplace_extruder(region_config.infill_extruder); @@ -92,7 +92,7 @@ void PrintRegion::collect_object_printing_extruders(std::vector &o assert(this->config().infill_extruder <= num_extruders); assert(this->config().solid_infill_extruder <= num_extruders); #endif - collect_object_printing_extruders(print()->config(), this->config(), object_extruders); + collect_object_printing_extruders(print()->config(), this->config(), print()->has_brim(), object_extruders); } } diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp index 95c4297542b..1695075c88f 100644 --- a/src/libslic3r/SupportMaterial.cpp +++ b/src/libslic3r/SupportMaterial.cpp @@ -388,7 +388,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) BOOST_LOG_TRIVIAL(info) << "Support generator - Generating tool paths"; // Generate the actual toolpaths and save them into each layer. - this->generate_toolpaths(object, raft_layers, bottom_contacts, top_contacts, intermediate_layers, interface_layers); + this->generate_toolpaths(object.support_layers(), raft_layers, bottom_contacts, top_contacts, intermediate_layers, interface_layers); #ifdef SLIC3R_DEBUG { @@ -1662,62 +1662,74 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_conta // If no vec item with Z value >= of an internal threshold of fn_higher_equal is found, return vec.size() // If the initial idx is size_t(-1), then use binary search. // Otherwise search linearly upwards. -template -size_t idx_higher_or_equal(const std::vector &vec, size_t idx, FN_HIGHER_EQUAL fn_higher_equal) +template +size_t idx_higher_or_equal(IT begin, IT end, size_t idx, FN_HIGHER_EQUAL fn_higher_equal) { - if (vec.empty()) { + auto size = int(end - begin); + if (size == 0) { idx = 0; } else if (idx == size_t(-1)) { // First of the batch of layers per thread pool invocation. Use binary search. int idx_low = 0; - int idx_high = std::max(0, int(vec.size()) - 1); + int idx_high = std::max(0, size - 1); while (idx_low + 1 < idx_high) { int idx_mid = (idx_low + idx_high) / 2; - if (fn_higher_equal(vec[idx_mid])) + if (fn_higher_equal(begin[idx_mid])) idx_high = idx_mid; else idx_low = idx_mid; } - idx = fn_higher_equal(vec[idx_low]) ? idx_low : - (fn_higher_equal(vec[idx_high]) ? idx_high : vec.size()); + idx = fn_higher_equal(begin[idx_low]) ? idx_low : + (fn_higher_equal(begin[idx_high]) ? idx_high : size); } else { // For the other layers of this batch of layers, search incrementally, which is cheaper than the binary search. - while (idx < vec.size() && ! fn_higher_equal(vec[idx])) + while (idx < size && ! fn_higher_equal(begin[idx])) ++ idx; } return idx; } +template +size_t idx_higher_or_equal(const std::vector& vec, size_t idx, FN_HIGHER_EQUAL fn_higher_equal) +{ + return idx_higher_or_equal(vec.begin(), vec.end(), idx, fn_higher_equal); +} // FN_LOWER_EQUAL: the provided object pointer has a Z value <= of an internal threshold. // Find the first item with Z value <= of an internal threshold of fn_lower_equal. // If no vec item with Z value <= of an internal threshold of fn_lower_equal is found, return -1. // If the initial idx is < -1, then use binary search. // Otherwise search linearly downwards. -template -int idx_lower_or_equal(const std::vector &vec, int idx, FN_LOWER_EQUAL fn_lower_equal) +template +int idx_lower_or_equal(IT begin, IT end, int idx, FN_LOWER_EQUAL fn_lower_equal) { - if (vec.empty()) { + auto size = int(end - begin); + if (size == 0) { idx = -1; } else if (idx < -1) { // First of the batch of layers per thread pool invocation. Use binary search. int idx_low = 0; - int idx_high = std::max(0, int(vec.size()) - 1); + int idx_high = std::max(0, size - 1); while (idx_low + 1 < idx_high) { int idx_mid = (idx_low + idx_high) / 2; - if (fn_lower_equal(vec[idx_mid])) + if (fn_lower_equal(begin[idx_mid])) idx_low = idx_mid; else idx_high = idx_mid; } - idx = fn_lower_equal(vec[idx_high]) ? idx_high : - (fn_lower_equal(vec[idx_low ]) ? idx_low : -1); + idx = fn_lower_equal(begin[idx_high]) ? idx_high : + (fn_lower_equal(begin[idx_low ]) ? idx_low : -1); } else { // For the other layers of this batch of layers, search incrementally, which is cheaper than the binary search. - while (idx >= 0 && ! fn_lower_equal(vec[idx])) + while (idx >= 0 && ! fn_lower_equal(begin[idx])) -- idx; } return idx; } +template +int idx_lower_or_equal(const std::vector &vec, int idx, FN_LOWER_EQUAL fn_lower_equal) +{ + return idx_lower_or_equal(vec.begin(), vec.end(), idx, fn_lower_equal); +} // Trim the top_contacts layers with the bottom_contacts layers if they overlap, so there would not be enough vertical space for both of them. void PrintObjectSupportMaterial::trim_top_contacts_by_bottom_contacts( @@ -1972,7 +1984,7 @@ void PrintObjectSupportMaterial::generate_base_layers( Polygons polygons_new; // Use the precomputed layer_support_areas. - idx_object_layer_above = std::max(0, idx_lower_or_equal(object.layers(), idx_object_layer_above, + idx_object_layer_above = std::max(0, idx_lower_or_equal(object.layers().begin(), object.layers().end(), idx_object_layer_above, [&layer_intermediate](const Layer *layer){ return layer->print_z <= layer_intermediate.print_z + EPSILON; })); polygons_new = layer_support_areas[idx_object_layer_above]; @@ -2108,7 +2120,7 @@ void PrintObjectSupportMaterial::trim_support_layers_by_object( // Find the overlapping object layers including the extra above / below gap. coordf_t z_threshold = support_layer.print_z - support_layer.height - gap_extra_below + EPSILON; idx_object_layer_overlapping = idx_higher_or_equal( - object.layers(), idx_object_layer_overlapping, + object.layers().begin(), object.layers().end(), idx_object_layer_overlapping, [z_threshold](const Layer *layer){ return layer->print_z >= z_threshold; }); // Collect all the object layers intersecting with this layer. Polygons polygons_trimming; @@ -2931,7 +2943,7 @@ void modulate_extrusion_by_overlapping_layers( } void PrintObjectSupportMaterial::generate_toolpaths( - const PrintObject &object, + SupportLayerPtrs &support_layers, const MyLayersPtr &raft_layers, const MyLayersPtr &bottom_contacts, const MyLayersPtr &top_contacts, @@ -3000,13 +3012,13 @@ void PrintObjectSupportMaterial::generate_toolpaths( // Insert the raft base layers. size_t n_raft_layers = size_t(std::max(0, int(m_slicing_params.raft_layers()) - 1)); tbb::parallel_for(tbb::blocked_range(0, n_raft_layers), - [this, &object, &raft_layers, + [this, &support_layers, &raft_layers, infill_pattern, &bbox_object, support_density, interface_density, raft_angle_1st_layer, raft_angle_base, raft_angle_interface, link_max_length_factor, with_sheath] (const tbb::blocked_range& range) { for (size_t support_layer_id = range.begin(); support_layer_id < range.end(); ++ support_layer_id) { assert(support_layer_id < raft_layers.size()); - SupportLayer &support_layer = *object.support_layers()[support_layer_id]; + SupportLayer &support_layer = *support_layers[support_layer_id]; assert(support_layer.support_fills.entities.empty()); MyLayer &raft_layer = *raft_layers[support_layer_id]; @@ -3102,10 +3114,10 @@ void PrintObjectSupportMaterial::generate_toolpaths( MyLayerExtruded interface_layer; std::vector overlaps; }; - std::vector layer_caches(object.support_layers().size(), LayerCache()); + std::vector layer_caches(support_layers.size(), LayerCache()); - tbb::parallel_for(tbb::blocked_range(n_raft_layers, object.support_layers().size()), - [this, &object, &bottom_contacts, &top_contacts, &intermediate_layers, &interface_layers, &layer_caches, &loop_interface_processor, + tbb::parallel_for(tbb::blocked_range(n_raft_layers, support_layers.size()), + [this, &support_layers, &bottom_contacts, &top_contacts, &intermediate_layers, &interface_layers, &layer_caches, &loop_interface_processor, infill_pattern, &bbox_object, support_density, interface_density, interface_angle, &angles, link_max_length_factor, with_sheath] (const tbb::blocked_range& range) { // Indices of the 1st layer in their respective container at the support layer height. @@ -3119,7 +3131,7 @@ void PrintObjectSupportMaterial::generate_toolpaths( filler_support->set_bounding_box(bbox_object); for (size_t support_layer_id = range.begin(); support_layer_id < range.end(); ++ support_layer_id) { - SupportLayer &support_layer = *object.support_layers()[support_layer_id]; + SupportLayer &support_layer = *support_layers[support_layer_id]; LayerCache &layer_cache = layer_caches[support_layer_id]; // Find polygons with the same print_z. @@ -3317,11 +3329,11 @@ void PrintObjectSupportMaterial::generate_toolpaths( }); // Now modulate the support layer height in parallel. - tbb::parallel_for(tbb::blocked_range(n_raft_layers, object.support_layers().size()), - [this, &object, &layer_caches] + tbb::parallel_for(tbb::blocked_range(n_raft_layers, support_layers.size()), + [this, &support_layers, &layer_caches] (const tbb::blocked_range& range) { for (size_t support_layer_id = range.begin(); support_layer_id < range.end(); ++ support_layer_id) { - SupportLayer &support_layer = *object.support_layers()[support_layer_id]; + SupportLayer &support_layer = *support_layers[support_layer_id]; LayerCache &layer_cache = layer_caches[support_layer_id]; for (LayerCacheItem &layer_cache_item : layer_cache.overlaps) { modulate_extrusion_by_overlapping_layers(layer_cache_item.layer_extruded->extrusions, *layer_cache_item.layer_extruded->layer, layer_cache_item.overlapping); diff --git a/src/libslic3r/SupportMaterial.hpp b/src/libslic3r/SupportMaterial.hpp index 2e1a05946f9..72d487949f4 100644 --- a/src/libslic3r/SupportMaterial.hpp +++ b/src/libslic3r/SupportMaterial.hpp @@ -224,7 +224,7 @@ class PrintObjectSupportMaterial // Produce the actual G-code. void generate_toolpaths( - const PrintObject &object, + SupportLayerPtrs &support_layers, const MyLayersPtr &raft_layers, const MyLayersPtr &bottom_contacts, const MyLayersPtr &top_contacts, diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index aba26b20317..1f67f87929b 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -267,7 +267,9 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) for (auto el : { "skirt_distance", "draft_shield", "min_skirt_length" }) toggle_field(el, have_skirt); - bool have_brim = config->opt_float("brim_width") > 0; + bool have_brim = config->opt_enum("brim_type") != btNoBrim; + for (auto el : { "brim_width", "brim_offset" }) + toggle_field(el, have_brim); // perimeter_extruder uses the same logic as in Print::extruders() toggle_field("perimeter_extruder", have_perimeters || have_brim); diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index fc8b25efad3..be7d7c1c767 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -1220,6 +1220,8 @@ boost::any& Choice::get_value() m_value = static_cast(ret_enum); else if (m_opt_id == "printhost_authorization_type") m_value = static_cast(ret_enum); + else if (m_opt_id == "brim_type") + m_value = static_cast(ret_enum); } else if (m_opt.gui_type == "f_enum_open") { const int ret_enum = field->GetSelection(); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 6332a7837e5..fbe6681f4ec 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5680,7 +5680,7 @@ void GLCanvas3D::_load_print_toolpaths() if (!print->is_step_done(psSkirt) || !print->is_step_done(psBrim)) return; - if (!print->has_skirt() && (print->config().brim_width.value == 0)) + if (!print->has_skirt() && !print->has_brim()) return; const float color[] = { 0.5f, 1.0f, 0.5f, 1.0f }; // greenish @@ -5692,7 +5692,7 @@ void GLCanvas3D::_load_print_toolpaths() total_layer_count = std::max(total_layer_count, print_object->total_layer_count()); } size_t skirt_height = print->has_infinite_skirt() ? total_layer_count : std::min(print->config().skirt_height.value, total_layer_count); - if ((skirt_height == 0) && (print->config().brim_width.value > 0)) + if ((skirt_height == 0) && print->has_brim()) skirt_height = 1; // Get first skirt_height layers. diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index b0322a82130..58149181d9e 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -202,6 +202,8 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if(opt_key == "printhost_authorization_type") config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); + else if(opt_key == "brim_type") + config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); } break; case coPoints:{ diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index a1249c696f3..cf21782808a 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -97,7 +97,7 @@ ObjectList::ObjectList(wxWindow* parent) : CATEGORY_ICON[L("Extruders")] = create_scaled_bitmap("funnel"); CATEGORY_ICON[L("Extrusion Width")] = create_scaled_bitmap("funnel"); CATEGORY_ICON[L("Wipe options")] = create_scaled_bitmap("funnel"); -// CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap("skirt+brim"); + CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap("skirt+brim"); // CATEGORY_ICON[L("Speed > Acceleration")] = create_scaled_bitmap("time"); CATEGORY_ICON[L("Advanced")] = create_scaled_bitmap("wrench"); // ptSLA @@ -686,7 +686,7 @@ void ObjectList::msw_rescale_icons() CATEGORY_ICON[L("Extruders")] = create_scaled_bitmap("funnel"); CATEGORY_ICON[L("Extrusion Width")] = create_scaled_bitmap("funnel"); CATEGORY_ICON[L("Wipe options")] = create_scaled_bitmap("funnel"); -// CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap("skirt+brim"); + CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap("skirt+brim"); // CATEGORY_ICON[L("Speed > Acceleration")] = create_scaled_bitmap("time"); CATEGORY_ICON[L("Advanced")] = create_scaled_bitmap("wrench"); // ptSLA diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 8f5e2024146..dafce5efc65 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -899,6 +899,9 @@ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config else if (opt_key == "printhost_authorization_type") { ret = static_cast(config.option>(opt_key)->value); } + else if (opt_key == "brim_type") { + ret = static_cast(config.option>(opt_key)->value); + } } break; case coPoints: diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 8b427457900..398502b53c4 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1924,7 +1924,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) , main_frame(main_frame) , config(Slic3r::DynamicPrintConfig::new_from_defaults_keys({ "bed_shape", "bed_custom_texture", "bed_custom_model", "complete_objects", "duplicate_distance", "extruder_clearance_radius", "skirts", "skirt_distance", - "brim_width", "variable_layer_height", "nozzle_diameter", "single_extruder_multi_material", + "brim_width", "brim_offset", "brim_type", "variable_layer_height", "nozzle_diameter", "single_extruder_multi_material", "wipe_tower", "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle", "extruder_colour", "filament_colour", "max_print_height", "printer_model", "printer_technology", // These values are necessary to construct SlicingParameters by the Canvas3D variable layer height editor. diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index eb9659c8ab0..843ec565218 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1479,7 +1479,9 @@ void TabPrint::build() optgroup->append_single_option_line("min_skirt_length", category_path + "skirt"); optgroup = page->new_optgroup(L("Brim")); + optgroup->append_single_option_line("brim_type", category_path + "brim"); optgroup->append_single_option_line("brim_width", category_path + "brim"); + optgroup->append_single_option_line("brim_offset", category_path + "brim"); page = add_options_page(L("Support material"), "support"); category_path = "support-material_1698#"; diff --git a/src/slic3r/GUI/UnsavedChangesDialog.cpp b/src/slic3r/GUI/UnsavedChangesDialog.cpp index cd5183cb312..68487921d58 100644 --- a/src/slic3r/GUI/UnsavedChangesDialog.cpp +++ b/src/slic3r/GUI/UnsavedChangesDialog.cpp @@ -966,6 +966,8 @@ static wxString get_string_value(std::string opt_key, const DynamicPrintConfig& return get_string_from_enum(opt_key, config); if (opt_key == "support_pillar_connection_mode") return get_string_from_enum(opt_key, config); + if (opt_key == "brim_type") + return get_string_from_enum(opt_key, config); break; } case coPoints: { diff --git a/tests/fff_print/test_printobject.cpp b/tests/fff_print/test_printobject.cpp index 84df95201ab..8d322f58fe2 100644 --- a/tests/fff_print/test_printobject.cpp +++ b/tests/fff_print/test_printobject.cpp @@ -18,7 +18,7 @@ SCENARIO("PrintObject: object layer heights", "[PrintObject]") { { "layer_height", 2 }, { "nozzle_diameter", 3 } }); - const std::vector &layers = print.objects().front()->layers(); + ConstLayerPtrsAdaptor layers = print.objects().front()->layers(); THEN("The output vector has 10 entries") { REQUIRE(layers.size() == 10); } @@ -37,7 +37,7 @@ SCENARIO("PrintObject: object layer heights", "[PrintObject]") { { "layer_height", 10 }, { "nozzle_diameter", 11 } }); - const std::vector &layers = print.objects().front()->layers(); + ConstLayerPtrsAdaptor layers = print.objects().front()->layers(); THEN("The output vector has 3 entries") { REQUIRE(layers.size() == 3); } @@ -55,7 +55,7 @@ SCENARIO("PrintObject: object layer heights", "[PrintObject]") { { "layer_height", 15 }, { "nozzle_diameter", 16 } }); - const std::vector &layers = print.objects().front()->layers(); + ConstLayerPtrsAdaptor layers = print.objects().front()->layers(); THEN("The output vector has 2 entries") { REQUIRE(layers.size() == 2); } diff --git a/tests/fff_print/test_support_material.cpp b/tests/fff_print/test_support_material.cpp index 01d85813236..1b85532d315 100644 --- a/tests/fff_print/test_support_material.cpp +++ b/tests/fff_print/test_support_material.cpp @@ -27,7 +27,7 @@ SCENARIO("SupportMaterial: support_layers_z and contact_distance", "[SupportMate auto check = [](Slic3r::Print &print, bool &first_support_layer_height_ok, bool &layer_height_minimum_ok, bool &layer_height_maximum_ok, bool &top_spacing_ok) { - const std::vector &support_layers = print.objects().front()->support_layers(); + ConstSupportLayerPtrsAdaptor support_layers = print.objects().front()->support_layers(); first_support_layer_height_ok = support_layers.front()->print_z == print.default_object_config().first_layer_height.value; diff --git a/xs/xsp/Print.xsp b/xs/xsp/Print.xsp index d9872aa7e32..cc3dac22478 100644 --- a/xs/xsp/Print.xsp +++ b/xs/xsp/Print.xsp @@ -95,16 +95,16 @@ _constant() int wipe_tower_number_of_toolchanges() %code%{ RETVAL = THIS->wipe_tower_data().number_of_toolchanges; %}; PrintObjectPtrs* objects() - %code%{ RETVAL = const_cast(&THIS->objects()); %}; + %code%{ RETVAL = const_cast(&THIS->objects_mutable()); %}; Ref get_object(int idx) - %code%{ RETVAL = THIS->objects()[idx]; %}; + %code%{ RETVAL = THIS->objects_mutable()[idx]; %}; size_t object_count() %code%{ RETVAL = THIS->objects().size(); %}; PrintRegionPtrs* regions() - %code%{ RETVAL = const_cast(&THIS->regions()); %}; + %code%{ RETVAL = const_cast(&THIS->regions_mutable()); %}; Ref get_region(int idx) - %code%{ RETVAL = THIS->regions()[idx]; %}; + %code%{ RETVAL = THIS->regions_mutable()[idx]; %}; size_t region_count() %code%{ RETVAL = THIS->regions().size(); %}; From f0451439ae4880bcda0089038a644a465f7d0489 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 29 Jan 2021 12:51:21 +0100 Subject: [PATCH 106/143] Fix openvdb configure process with unusable vdb_print --- cmake/modules/OpenVDBUtils.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/modules/OpenVDBUtils.cmake b/cmake/modules/OpenVDBUtils.cmake index f64eda6f2c9..f79862b83ab 100644 --- a/cmake/modules/OpenVDBUtils.cmake +++ b/cmake/modules/OpenVDBUtils.cmake @@ -157,7 +157,9 @@ function(OPENVDB_ABI_VERSION_FROM_PRINT OPENVDB_PRINT) endif() set(_OpenVDB_ABI) - string(REGEX REPLACE ".*abi([0-9]*).*" "\\1" _OpenVDB_ABI ${_VDB_PRINT_VERSION_STRING}) + if (_VDB_PRINT_VERSION_STRING) + string(REGEX REPLACE ".*abi([0-9]*).*" "\\1" _OpenVDB_ABI ${_VDB_PRINT_VERSION_STRING}) + endif () if(${_OpenVDB_ABI} STREQUAL ${_VDB_PRINT_VERSION_STRING}) set(_OpenVDB_ABI "") endif() From 62f8e75b34adf82f552c72559a2b061376af8986 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 2 Feb 2021 18:08:30 +0100 Subject: [PATCH 107/143] Disable tests and encoding check when cross compiling --- CMakeLists.txt | 12 ++++++++++++ src/build-utils/CMakeLists.txt | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index c15371c9ac7..c32fc6b7b0e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,15 +35,27 @@ option(SLIC3R_ASAN "Enable ASan on Clang and GCC" 0) set(SLIC3R_GTK "2" CACHE STRING "GTK version to use with wxWidgets on Linux") +set(IS_CROSS_COMPILE FALSE) + if (APPLE) set(CMAKE_FIND_FRAMEWORK LAST) set(CMAKE_FIND_APPBUNDLE LAST) + list(FIND CMAKE_OSX_ARCHITECTURES ${CMAKE_SYSTEM_PROCESSOR} _arch_idx) + if (CMAKE_OSX_ARCHITECTURES AND _arch_idx LESS 0) + set(IS_CROSS_COMPILE TRUE) + endif () endif () # Proposal for C++ unit tests and sandboxes option(SLIC3R_BUILD_SANDBOXES "Build development sandboxes" OFF) option(SLIC3R_BUILD_TESTS "Build unit tests" ON) +if (IS_CROSS_COMPILE) + message("Detected cross compilation setup. Tests and encoding checks will be forcedly disabled!") + set(SLIC3R_PERL_XS OFF CACHE BOOL "" FORCE) + set(SLIC3R_BUILD_TESTS OFF CACHE BOOL "" FORCE) +endif () + # Print out the SLIC3R_* cache options get_cmake_property(_cache_vars CACHE_VARIABLES) list (SORT _cache_vars) diff --git a/src/build-utils/CMakeLists.txt b/src/build-utils/CMakeLists.txt index d47e5b97ffd..464fd9c8f4f 100644 --- a/src/build-utils/CMakeLists.txt +++ b/src/build-utils/CMakeLists.txt @@ -1,6 +1,11 @@ option(SLIC3R_ENC_CHECK "Verify encoding of source files" 1) +if (IS_CROSS_COMPILE) + # Force disable due to cross compilation. This fact is already printed on cli for users + set(SLIC3R_ENC_CHECK OFF CACHE BOOL "" FORCE) +endif () + if (SLIC3R_ENC_CHECK) add_executable(encoding-check encoding-check.cpp) From 65766c24f638ffe935aa7bd2fb67a58ee1481969 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 3 Feb 2021 15:57:22 +0100 Subject: [PATCH 108/143] Localization: Updated UK dictionary + small fixes for RU dictionary --- resources/localization/ru/PrusaSlicer.mo | Bin 402508 -> 402533 bytes resources/localization/ru/PrusaSlicer_ru.po | 39 +- resources/localization/uk/PrusaSlicer.mo | Bin 128537 -> 389683 bytes resources/localization/uk/PrusaSlicer_uk.po | 12750 +++++++++++++----- 4 files changed, 9215 insertions(+), 3574 deletions(-) diff --git a/resources/localization/ru/PrusaSlicer.mo b/resources/localization/ru/PrusaSlicer.mo index ea216536487311e15242b6e2a3120a03b091ce8e..967c50ca69197a1be50d16e2fa131395b77e4cbd 100644 GIT binary patch delta 20490 zcmZA9b+}bU+sE-ad+&8DG3!2kS!%GA#g}R5h)d+L+l(?YH;Hpcuo6I0+8ERMUe z3f`F(inIFdU|HzVZcA53Q&CSqU3evyz%7^ze@C6* zHtK@m1-Ac-f#op=?R8NX?jE#{#CYnHgY9cEE%hIw6tYn`jp~U9sIJPn&`w+kb5XB= zao7$s;qYMl`VhXxPjoS8k69dY$*CtrJwSTYg>s{AtOn{q8li^bHROCzH=lyKd?~&h zyzjNa0a+eCZM4{eMyFAKRP)cfFQj4ZbkjYZw?dQ6E2(8E)xp16SZ@ha+xi+^O+ z@Qpgxf`UI*!G@8j9+`%Eg5@|KccD&H_v4VOrtMe>_oMa;uL!wUF)ud8sn`mSqh|Yy zpV)D|upae~F(=n|*C@2b*p(r76+2;Ptov!mb-<6Y3_iwMSYlPkwZkF!824ct{NL)3 zYl2zVgj{v(jfLm8ZP|(*2eEJFM40lBb=uY>PBX*w`kgi$^$pn6aTtk)(v*zTBz_Ej=G^~ zSQ5WN9dJD`%a?Yd23T7A<6>NknuPT?+T?ACU8oO0&He+Z2ly2?g`CT>iTKx@AKYRG zq}Xa*TmUsGUqfZEVaRNCOK>T!z=2pRG2~vs^{9-O;w$U17O3NvU{3rF)gza%3P!%R z2dxa-ZM~)Fdpu-BR#iRCG*5^=QEzb_2~(=X(p4 zDQ9CMUPcX7bm7jBn?T_lzJ%Ss3Aq}$9(BjJQ8_;Sw-yz}P-9seH5musUi<>p#c%Gi z8=r=Ssc%MQ*o&z1{DZoow7dO!)D@$kF=>GDOqO?W0QF_xh1?)axyQn6G&Z8XHK@D) zSqiO;>f)wY6Z@fVa9vP8jv9(gd(Enti+T^NNd9qSDJY?AL*@Dk-`mTl4_2nW5H%FX zuo*tZ?%4E)kgJMcU^l#pdDOlylp z-+hGmS2!g9CFEAnRrOJm=EhMwLB?Y?dE!tftcbd?Izju(Sf1mCNZMB)54i~Si>N2R zaw6pZ!(=C|>m#Rv$%lGZ6gw5QSzeh2y&Sp(8wOz->Z5TYPRFF2INfO`CuTnra{Y1g z*^q0&_6O%et|`_#A9CN~94v;dE?BC57t>KciF)tfK!xLzC!32?0Mt8SA?k_m1?`0{TRgYJI@*r9vGb_#EB>p!L+Yb4=15djL_epXxIcrJ1C5xq3%@+x1Fd-`7bIQcZ1eaXt?< zXEq1^h?--Uu$tmO#f@NPg4*#lR2+{%^~gtor%)G8bJMys7pg1Eqn@}g>c+ps8h9GD zh|PM-#=Z&ahPt2<)H@i*_1!888smMa6WvA4fl7Z`7rz`h3H7qtg1W$ipuOy0_VVh1 z^*v6EgCnd5?uT4!_AB?Vop%aqZXCgpnDG(uukf2iK_0{@nDjrJwR12Hv-~>Fq5aY0 zko$%D^d}+Lo_g13mQWH=4{{JSwoRYgkZi-^)UTp?Dw7NQH{J-9h^Dx(#s7yiXlZo@ z)n)N9VSfl(qdt)g!+&TW9tyjeI4ErG&v6giofq~Ong5Fo`$O_!tQM7fZA~z#^Fh9#|8dHO`7H}P{+4X z^~0zr`482Dh11&khTtgb>rhcrFrD>4Csbw}gqp0;xfC?3cVGcLfQsjPs5>u_KJ15G zL(ELQ7i!@#8vAf#+c1uLo{V8v0qdX^tD`VE+t&y6ZJDh87wR4ID05hIDe7uu3H$Mz zE}Pv*4a~$2%~0Xj8+E}YsQ5pFdfz`p-EfBNVSjQ}L1nbpQESGzLHk~er~WVM_-r}C zewdfXQW~_T6k4%i3~Evw!MvC}r(K{pYWB88ooF&D;j9g|pTtJgpP@2f!(4X5AEWZf zrJx?pZ9`BCOVBfIFq6V&LR{EixhzJF$vIS4N8;^?a-c3y8+F3zSOeDw+i#;LRmMCv zbcHb!7wCiPi7|P@{+e+;>H*v2vmTg%QH}iy3hLsGsIj|)npFAnhy8re1~nuXP;=vN z+=HbH*o{6!eV|BP(0Z;T>bzr6T|NW#4p|dyzlYjC(~HD^T?##3v>jKW62=~EjQ3Cp zs9K@0+d=)M!Zw?e7YVyH)N9~uypEb|ql$)If9mfQ3%l`n50~Sx;$fGP?U_r2{kLqs zlGc+GN)rE?Osi<0y!~S|BAxc3fT#XvrL+C#_YHn03N0{MGR5<1@Pmf@AOoh#GHFmO`1PZ@m-*D z*k3JoK~2)LsL6OA)k9^fg#AV7a6C@^YwRB4JD{qTC+=1c`>W`5HNq~5-v8YxXma#L z-M~hS$4E^}u?0{)^C51<-Iy0g)Uqd9g6*lF#GkQ5?XY{mSU&b!naUQun_&F6DkUdH?$$@g1W(psQ5pLiuXt(d$KO5p@`y4e6exZ z6~V7isrm}G!_-Y|uJy(eT;J`d&>bJ)CGPl@reXIX^{UOdF}m(7)}Z})3!8K`T3JFG zgBqeQQ91n^RQUde1 z6Q9NxFjf1ozl6$#it|RO<#`9xWb27~?OsPEpeHyMi*;Z~x!!tIJ}KCd`0qlYdPi$m ziaOzD)MVR(3aiIh8#BLRnX6;qVANQ?hw9=_QFGxi>bMs>**c&uHlW@WwZvP6I&NpD zsEzIUU_+#{ZODfG*r75iQ>{cDco!8$NxIk^sg2F4e}HZ9Hyno*yIT8p)B~pIX5rZn zYf(Ro@t8B(-3m2OQP3S<$F-;@&f3H56u2z#S5%nh?`bJ{DC$PmqgFo8F%Gl!vYx1d znzZe46iz_BGor4yO_q$PE@^_gv;L?%oq>Jv5GoH;dex#}C~A!Vhw7P=sM-A|DkIkI zV?)vdYfzt#8q$NP3rAk_qa*6FQqYO&VPWimx{>jy8(D$HaBt9lABR&<-`8gUG}Hwb zpoV5E*2lZ3<0|&EFnkp?N9Lg3vO93B;{S?YaPHOq+*ybZ6sVziI?xuQ^5w^y?m>#nZGK-=1tA$$1bw)k;NPH1Dq8{)p7U%lzF$LXO;lZ{;8$3t-9n_e0 z9Afc32^CJCp-ylfb>XL|{n8G#_^yshL<3QCA=4XS|3hafRFBp{^>lBHYPCCyg5vu} zRM$L1?O5PVmenz=Xs{>sR&RyfGu(>famz3px=O<>FEm9ZqRyBZ$Dv+Yi!cvvLd}&E zsCC4x;o+!%K%o)#mTQLEuocVU{lG$R+mm+<`B#-oV;Yiwvs!&t07+J<5m{!RS`KEO-wgk3K@J|^rIVP%ffcRa^2LVeCy zTZkl}5?G;e_M{b2VcZOp;%q#Ri%<_ZB0Ap2<_pxM+J)+(E2ts(4>h(qCfHiAQQ#od zx?vtF_3pq|xS=0V7tH%!*d3<+D(WRvVY2mXPgJxl4~%|8L6hnn>IPCxu{lr*HH%-y z{P-4Xzs0B_IvAL2s@-6H)L6fPrEofG0rE|-{Zvr*rrCq#M)F0})uNyaExVlcyxAQa#?2YP~v8XlV^q{_EriJq=ETs6~OhF0g z0%}s-Ma5}`Sz)&Yt6_1xkBuh7zdXn~GUoaOqVfGDn14TAQ zt*~{YjdiU}VYiY4{s~;VnegGjI$Of-W7-F84Z9K4(~!(rDATOJL&8?+i>Rej?$Z{}eNdBeEGm&K4cv}(sGr6>nDdOS z8){-r>T6Lc_$F4y1mM13p1rFYN^-I^wTB1x>EkQ3vcp?RYKlDaKPzcQNeV!Lq2g z=0;SWxP{d)*n968|rYwj+={`TPILG zlH?}wuO}^e(|Vu{>dB&kOHo6z9k1e9+=hE@S^Jnj?TJ3bq_lsDdV6le)_6E*&-a(L z7emdRI;d2<_^+sa8?}!HognpX8>7sql$-}O=}H7PLmfB}YvUr+WIc}>+YEOs1Lnp! z>ZJl(p@!fMY=!es`(KMv_<+KF)XQbkT{0OSL3Pp0d$!|OsIl9FUGW4e49nlQ9&3fV zz+hC5%?aEXZ2tvE(S8S?;(!OXE{OK~+g_{l@g5s4qdxH*duVYR_m9o)?x?O^hPsh0 z_yX=jh23e?4Tb-;G0q*>0&CJf7IlN)p~CM9X4d;Z>m!TLQmC#SiF#YDLUqyEz(24c z^}DzLv;G%$GhzrsTur^^6N{4Ts2g%m?WI;2b-|9P8=i?;&@A`cqt1O#L1Fe7li>@` z?0ugNn^JFtTJg+BRxIu)md3)*ZR|T^L+Wz_&!aM20ak`uH+09TI1Afg_Lzu&{9wuT z`OB9zoIvf6EEMr)X_vsQfvLk0KPA74y5Og%8@r9&v1laX-o^K^7N+qc{$y*3%B-IR z-U=)m8*$NAY#2?U86FDEmBi`;u`TU8P`N!_QoDh6SeW|!z}*#kFtTL+p0V-kb!jCR~=RQ%sS^#4!0C*6#?vCNt6JVR0E*^7#@_-K}hn@eFJYIcUQ zM*R3qk2-M~RLbm!b#ZavrNI2zZ0_{KdTd{c3eVqAdEg;t!c5sCenKmTI$vc}xJLU^ zP@&vZvo zL-8CdV3tA_4J}X~z23vOa5<_6G8K;a3!NtT4)v87)rs;JiMUv7j+!*>0*9f-cz)nI zoJ4&WDg`$z$}A4^&Omi(v62!0cZ6fH4fX7$BL0`xgK-h{Q z+3;i32a%nqC-@W9l}XA(++SD-^@U}YvNkscl(RTqgCp2}0~@lvXZeVq<3Fnq@mD&( z1iFe5H;ny?<78Y}F=_`Euf$k#;40M8=<~`Ee~ot*6&)F?*icl*^wbBU)&*lxJ-9sZ zAZj`OFKVdzRkKMq7Zu*?FemQ7c6cTlG?c0yam#3Ej=Hnk7>6TjMEnmV3sFN;qh`ca z(<6%^fWo~MjuL2gN zUKiCq0JAFor&B0L!>4`&U4u$E4^f#b{w14C^{_bg{-~%}gqp1DQDb`%)f0D6$7gP4 z=dF#JLnH82{0RGE(&j`7*LOoHbi^M}U6-eYouF6XOw`I~8z#f6sJGl*)JoA21jF(_Lku$ zpt^PkD(7EC^@BR0OHn;`4mE^zy4ZCFV|VH+qZC$C zNYXXpHsc1=S0uf=*<84R>guB1Bd#}AK;7_Ctc`!-`&hDv<&SSsH_)}Gt)M2MCf{*v zgwHS~Htc0#8Es2J8EG~uldVUM*;&+Ve~jPrq=kFidf@J>_OdG4$E=I$kxp0^N1!s} z=cqY!5S20AYj)lYsHiH7rS<;rK%piL(@>e|AnK02zBYEnQE}ZCH8*CW-j-WXPx=$; z#{b4z7~hZAIrhZy-1r-)g~>nt?K-Ij*m;^^8qJ} zU?4_y;7AG@vuUUkuEjSZe7%PCsn>qTo?r@U``3ZzQOC!OG1H-jC@(518ligf4b%nS zM}_BN)TI7?4Dp|q!VwxY>3+kJ7$z*&;}~3y#ox8p=pobz{|Jm3YZuIcdg9vn8g@gS zZ$FmA>llyO#@Vc|iY2Iz7{>)P*;dn_9yo#;n>&Gd#@pDo!G^Sdiuv$%V1@}c6qRr$ z?XROU-!s%uq?%~wZ-8;s2cvpmHmZkqL@6|(@CRz_OTTA3G)2YtaMY7*Lv25UnhOt5 z;Z|yrC6-rFL-PSDY!mTy`~%fvZ716W2csTv5o)qW4^q%C8?U2g>%A$qx=k@P;^tBB zg&Mp6uqP&&W{Idjs(u7pVY%sc!;`TN^#fQ9)69tYL;MnIZgfTUz(l0SqizEQO@>3L zF*<`vC{Ivhm*stHZ-i>^A2O}z6aGKS1|+Tm}xgq3f0wvP&cp;b)IjrzT*EZ z1zkALtcd#@>*7khhZ@TTv+W(Q3I|Y6KF4}wI4ZMEz`5EFCt|S=Z1QfxJk)#6HQz(s z=o-{{f5LoR-9Wiu`Z^bZ?+CxfSMcU(a&_KOqwde#<)J} z$$MfWoPss+C`R?<85UTkE03Byn^En*p}N>xXeY>z3bQ7t_P(h7r=XtfD{PMEQ0t1K ziy|(J9Z?CW3+nhGSO8}(BK~!Ptu&0l-%&Ze%VP6A)Q(@Ea{O_ufiX)gYHFc+ZU!pc zHeyY@g}R|)OU;(3sCf(36B`3hEhYY2((sH1ouI{s7OzvWDfLaLv2x37R;NMLTVrSJ z5w!2ZPShjIZNKiQ<5%JgyoVa1cR#WrT7=c9Z-`RR0^v5Mz;+*7H1t5l=|I#ZT82tg z-=VtjCTew@Y=!Mt6Ezu!qI&c_)CIQ$^+U+();&Xgf-3ciZI4b|XQYcEp zWz?OgUTc%98Y)qA4xEhIZxgC#E@3T9x6b0Z4Qj3o4opDx*f*%jcop?P89%cJZH-kG z|HCLKA#6g8*&$R{=J?!trX=bFZEzHhL*3Xj)P9A&upz64ikgO~=;((Us;Q`+U5$Fj z90<1GK>zpu$=BP3N~1oiBt zv`pF`8&h9`>Zz+3?ZIS7y~z^Fkj;z@^{rSh#FK30iSYfe_~rsPY~w%zI_=Jg<2S^v z;;x9}m-?>M9(n}5?;~z6$Cun^-w!<8&j%ISXZ~nCn{d#)f(zNN)K9_s|G>}ogcq0FdTGYT0`+MV`7Wx!de9lk={*xjI>{gjPm8|+8>L>z*5P&d%yv`xzBPvyVW@lj{B7@{%Qrj+luJgHd5M2{pEhaXEg9 z53#{zqJl|P{nv>9=lOT8*w~l(-7;ETEYE&jurAI+y*dv2|7L_mj z9dVaAt_W74p6Z{7+lY-&^(Uw~QSo0sL9t&iOpn(eSqgvpAMyV)JCt}F@&94LGklx+ zk*9XyCeJL)=AokGckGH~pGVv`I2V-(TRYERWPXjBGY3$q_e9_W)B+@3jOX`gepHWk zh>3cB!r4GWJ{n>}W|6=asJZY~-~!Yn-Hw{ozo6#8Mbz<+QIj_=?D_ekY+ygsP%TFt zw-2=+zaR4aHQV*T=cu`mF=BUG4AW5WhF{}gR6Z!|dH$qrgC(esLd}_VsCYkunme(v zo}Z{Hp?YKrswY-qag1)G&{JcAuhH;QQtOees1FD!lX-q3DujB{9#|5`pfcoo)Cq5( z63|mDidB+(ZXLdc6)-~z&;RXMQ`As4N$Ke=8g+{(DCh4*rONE7JpXOi1@)vWQJL^i zP*0lLbM>f~Moq2}*cd;-$#@%oPWH8qQ6&3walXEmG0iDCum_DP&pY-^whnn2qXZHNh z3pKNNu5OeK$5p^=**$lZ9lGZ9+%H%rm*>u6Y;Mp0M<~ByO>XGBIM4qzd^nHiN6#+2 z$bK{PdTuWc%ICQiST4WkR`Xmc&~xunKaZ8MOCiriJF;P6Vb86?2lyr~DdM>X z?2xvo=l|H`!IA>VJ5gUe@z}@puvEv*V6()T5#hhs;2c4IZq{~9kUpHc6Jn*Es@d;Zt- zdvGT87EL_Yg6mvDP1;h?mpr$e!f4FNhMdhj_Z9Uj%`F-ppq{)!3$qWlqMm@=@dhfq znzr=#S5kZ!#V|f@<@qb7=dC?=jP1SJc>XV;Dzzn_uswe}k1WZYDA(R|y(z?Wu#D6P zHH$~#%Xk*GelPbjcaAHtB5S}0c#{(q>r7W-)~+Nj+BbFc9REnt9q37X)4uXmqKf+A zKI8}L_xgG+221v*NA=IfN)KQxIdSGeJOL*djK6Wf)uGmP2j24B9O@m0dG09(-W=ii zKe4(#()0f*_R2Ayn@D>dhEl%=*#EBeWczVM1@*Vad;TY^wiD?Q>N`-GFMg7Gkoa#w z;SmiRQE~p+WY7O=)d|!IhfML@E!v+?^<0Sht!bYBN9fzrJ^!tFafZ$QKi~J<8{BB4 znV!qSemiHASMbCfUQYP;2iAj0=6PF68A)w*Cg`S&A{nlbqG8Y`a)bqb! zJc}RE-gFsb&3=C^_uR+S3#{g&0JdRruSo&*A#rw9| zBz=Ir*`9B^=dT~8?y%SMF-*hpf1rB&;SS<|ErmNf?d`Sr8w-own1S|`-&)Fz$A;7^ zVmyw;yto22WIy06yo)Ju+%C_Ls+p+QY{}guG^~rYaXKo|9oilB{0|Iuzq2PCh^n3nyHqu%FN@ip`gc>d@8*HJw;8TArcic0av zFdj=BwDmzte2IGWy`bS37NH^8Pc{_gP^;BfP$&ExPvdu}x80JTZDH{_HlqF%wWMlr z$hI#-&6N#-+fjMtd(`W^z+q2+oQ}G#6m+M@Q45HaM{EJn7^_epjvwGA)PW6tv9W&_ zHTIuiCHxuH6G@L+rW=AEQty1sdf*9a61P8YE2D8(R&le1fDU$Dw!_pW`|_e9<0Y^d(y}E-P5g;)cC^zPZVYiT1UB zdj3x~#@zNC|JNQa{~f!5Q}-{#MIQ2|7}l{ z6?0K9hh?x0#^dB*`&#s8HLAx7JhZvg7B%M6uoPawdzk4TTRkWH*KVwGl!E^D(+rj2 zwmh=%dxlz4<@?X#^xeRpQ7@Mqk8OLoC#;azZ#HU-=i^1Zf$!swPd)$tqT%Idp8o~J zLA*hGk>~Uj=ZR)wDrpk#kBN1^Vxv&3|L69i;aLBd%}a1BJGP0$`v2_agcs|l)@HG> zt~dMNMm=fUBzD{vs3^#lG}aI2{z#m=H8=%xCyVvhnrm>P;=g6`Sbv#(67@0s-4wBI zH?G1v*f(XYKPfw=iuHeVG66@@o-=iFh=d2EKy2&P>d!uK$XHp5PoRG2BGugVO0^{RGqul_95~-g>(*H(o*Q7s(LozqI18 zF7<|}@S7312z9|#frl|0^+y=hh71{F{ZFseP#bz+QG5qABx{51M}qAS@f_`GGsXIo z?=Q?l{XPq@M|Az`$Q7^Z=sGcl>NwGcZXZzhU$433nYRR)Q<~00*8pFBSWBo8& zgX-D?*bsjU+Kc9hb@iw>Lv{6BR1_SofXl&M_Cdoytk16s7V}*MCwnshTV9bQ?qq=Y<>WOz@di)91bC*#! z^c1x|$d}JsYW^>j zEwSbgp)qL^5?hDUB>sFNG_d>pO5qF%k%HlziGwSKJ6=h+oFkGck^f8{ozSCnBx7Q9 zVPuGxP?+++OB{>{-3y zi8Hf%-HRmNt?yOep0GY9Hd|uDP;BLx6z=fS!&?q-KQjGrV#4lX>>SrP5}UX#9D5}a L!$C=7cV_=Tv%VTP delta 20436 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 diff --git a/resources/localization/ru/PrusaSlicer_ru.po b/resources/localization/ru/PrusaSlicer_ru.po index 604dff5be56..2a929e55ef5 100644 --- a/resources/localization/ru/PrusaSlicer_ru.po +++ b/resources/localization/ru/PrusaSlicer_ru.po @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-09 15:30+0700\n" -"PO-Revision-Date: 2021-01-10 02:38+0700\n" +"PO-Revision-Date: 2021-02-03 14:06+0100\n" "Language-Team: Andylg \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && " -"(n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 1.8.7\n" -"Last-Translator: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n" +"%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 2.4.2\n" +"Last-Translator: Oleksandra Iushchenko \n" "Language: ru_RU\n" #: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:299 @@ -394,7 +394,6 @@ msgid "First layer height" msgstr "Высота первого слоя" #: src/slic3r/GUI/ConfigManipulation.cpp:81 -#, c-format msgid "" "The Spiral Vase mode requires:\n" "- one perimeter\n" @@ -410,7 +409,7 @@ msgstr "" "- отсутствие верхних сплошных слоёв\n" "- плотность заполнения 0%\n" "- отсутствие поддержки\n" -"- отключено \"Обеспечивать вертикальную толщину оболочки\"\n" +"- включено \"Обеспечивать вертикальную толщину оболочки\"\n" "- отключено \"Обнаружение тонких стенок\"" #: src/slic3r/GUI/ConfigManipulation.cpp:89 @@ -432,7 +431,7 @@ msgstr "" "только в том случае, если она печатается текущим экструдером, без запуска\n" "смены инструмента. (Значения \"Экструдер, печатающий поддержки/подложки/юбки\"\n" "и \"Экструдер, печатающий связующий слой поддержки/подложки\" должны быть\n" -"установлены в 0).\"" +"установлены в 0)." #: src/slic3r/GUI/ConfigManipulation.cpp:119 msgid "Shall I adjust those settings in order to enable the Wipe Tower?" @@ -546,7 +545,7 @@ msgstr "пруток" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1300 msgid "SLA print" -msgstr "Профиль SLA печати:" +msgstr "Профиль SLA печати" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 src/slic3r/GUI/Plater.cpp:696 #: src/libslic3r/Preset.cpp:1301 @@ -1070,7 +1069,7 @@ msgstr "" #: src/slic3r/GUI/DoubleSlider.cpp:1241 msgid "Edit current color - Right click the colored slider segment" -msgstr "Изменить текущий цвет - Правая кнопка мыши по цветному сегменту ползунка ???" +msgstr "Изменить текущий цвет - Правая кнопка мыши по цветному сегменту ползунка" #: src/slic3r/GUI/DoubleSlider.cpp:1251 msgid "Print mode" @@ -2238,7 +2237,7 @@ msgstr "Ctrl + Колесо мыши" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233 msgid "Autoset custom supports" -msgstr "Автоустановка пользовательских поддержек ???" +msgstr "Автоустановка пользовательских поддержек" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235 msgid "Threshold:" @@ -2344,7 +2343,7 @@ msgstr "Поворот" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 src/libslic3r/PrintConfig.cpp:3754 msgid "Scale" -msgstr "Масштаб " +msgstr "Масштаб" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30 #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381 @@ -2712,7 +2711,7 @@ msgid "" "Note: This name can be changed later from the physical printers settings" msgstr "" "При создании новых принтеров они будут именоваться как \"Принтер N\".\n" -"Примечание: это имя можно изменить позже в настройках физических принтеров." +"Примечание: это имя можно изменить позже в настройках физических принтеров" #: src/slic3r/GUI/GUI_App.cpp:1124 src/slic3r/GUI/PhysicalPrinterDialog.cpp:626 msgid "Information" @@ -2875,7 +2874,7 @@ msgstr "&Настройки" #: src/slic3r/GUI/GUI_App.cpp:1781 msgid "The preset(s) modifications are successfully saved" -msgstr "Изменения в профиле(-ях) успешно сохранены." +msgstr "Изменения в профиле(-ях) успешно сохранены" #: src/slic3r/GUI/GUI_App.cpp:1802 msgid "The uploads are still ongoing" @@ -3459,7 +3458,7 @@ msgstr "Неподдерживаемый выбор" #: src/slic3r/GUI/GUI_ObjectList.cpp:4012 #, c-format msgid "You started your selection with %s Item." -msgstr "Вы начали свой выбор с сущности %s" +msgstr "Вы начали свой выбор с сущности %s." #: src/slic3r/GUI/GUI_ObjectList.cpp:4013 #, c-format @@ -3477,7 +3476,7 @@ msgstr "Информация" #: src/slic3r/GUI/GUI_ObjectList.cpp:4137 msgid "You can't change a type of the last solid part of the object." -msgstr "Вы не можете изменить тип последнего твердотельного элемента модели" +msgstr "Вы не можете изменить тип последнего твердотельного элемента модели." #: src/slic3r/GUI/GUI_ObjectList.cpp:4142 msgid "Modifier" @@ -3794,7 +3793,7 @@ msgstr "ОШИБКА: недостаточно ресурсов для выпо #: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41 msgid "Searching for optimal orientation" -msgstr "Поиск оптимального положения." +msgstr "Поиск оптимального положения" #: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73 msgid "Orientation search canceled." @@ -3850,7 +3849,7 @@ msgstr "Импорт завершён." #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2357 msgid "You cannot load SLA project with a multi-part object on the bed" -msgstr "Вы не можете загрузить SLA проект с составной моделью на столе." +msgstr "Вы не можете загрузить SLA проект с составной моделью на столе" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2358 #: src/slic3r/GUI/Tab.cpp:3243 @@ -5114,7 +5113,7 @@ msgstr "" #: src/slic3r/GUI/NotificationManager.cpp:490 #: src/slic3r/GUI/NotificationManager.cpp:500 msgid "More" -msgstr "Подробнее." +msgstr "Подробнее" #: src/slic3r/GUI/NotificationManager.cpp:864 #: src/slic3r/GUI/NotificationManager.cpp:1141 @@ -9314,7 +9313,6 @@ msgid "Extra perimeters if needed" msgstr "Дополнительные периметры при необходимости" #: src/libslic3r/PrintConfig.cpp:539 -#, 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 is supported." @@ -10365,7 +10363,6 @@ msgid "This setting represents the maximum speed of your fan." msgstr "Этот параметр регулирует максимальную скорость вращения вентилятора." #: src/libslic3r/PrintConfig.cpp:1435 -#, 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 layer height is " diff --git a/resources/localization/uk/PrusaSlicer.mo b/resources/localization/uk/PrusaSlicer.mo index aae82889f3d1a312f36dfec22dd84af7dfedc2d8..66b5e0be3e9aec8d4722f98835462869c2ac718b 100644 GIT binary patch literal 389683 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 POzW8s-{SxOn=}7EVO-u* delta 26697 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 b8%gzRVmcMP3#0p!qNXZLG~>+|wrl?f#6%DH diff --git a/resources/localization/uk/PrusaSlicer_uk.po b/resources/localization/uk/PrusaSlicer_uk.po index 42b067361e2..fefe52eb52b 100644 --- a/resources/localization/uk/PrusaSlicer_uk.po +++ b/resources/localization/uk/PrusaSlicer_uk.po @@ -2,95 +2,234 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-04-09 14:34+0200\n" -"PO-Revision-Date: 2019-04-09 15:18+0200\n" +"POT-Creation-Date: 2020-12-18 13:59+0100\n" +"PO-Revision-Date: 2021-02-03 17:15+0100\n" "Last-Translator: Oleksandra Iushchenko \n" "Language-Team: \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.8\n" +"X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: src/slic3r/GUI/AboutDialog.cpp:35 -msgid "About Slic3r" -msgstr "Про Slic3r" +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:299 +msgid "Portions copyright" +msgstr "Використані розробки" -#: src/slic3r/GUI/AboutDialog.cpp:64 src/slic3r/GUI/MainFrame.cpp:52 +#: src/slic3r/GUI/AboutDialog.cpp:135 src/slic3r/GUI/AboutDialog.cpp:263 +msgid "Copyright" +msgstr "Копірайт" + +#. TRN "Slic3r _is licensed under the_ License" +#: src/slic3r/GUI/AboutDialog.cpp:137 +msgid "" +"License agreements of all following programs (libraries) are part of " +"application license agreement" +msgstr "" +"Ліцензійні угоди всіх наступних програм (бібліотек) є частиною ліцензійної " +"угоди програми" + +#: src/slic3r/GUI/AboutDialog.cpp:206 +#, c-format +msgid "About %s" +msgstr "О %s" + +#: src/slic3r/GUI/AboutDialog.cpp:238 src/slic3r/GUI/AboutDialog.cpp:361 +#: src/slic3r/GUI/GUI_App.cpp:235 src/slic3r/GUI/MainFrame.cpp:151 msgid "Version" msgstr "Версія" -#: src/slic3r/GUI/BedShapeDialog.cpp:43 -msgid "Shape" -msgstr "Вигляд (Форма)" +#. TRN "Slic3r _is licensed under the_ License" +#: src/slic3r/GUI/AboutDialog.cpp:265 src/slic3r/GUI/GUI_App.cpp:240 +msgid "is licensed under the" +msgstr "ліцензовано згідно" -#: src/slic3r/GUI/BedShapeDialog.cpp:51 -msgid "Rectangular" -msgstr "Прямокутний" +#: src/slic3r/GUI/AboutDialog.cpp:266 src/slic3r/GUI/GUI_App.cpp:240 +msgid "GNU Affero General Public License, version 3" +msgstr "Загальна публічна ліцензія GNU Affero, версія 3" + +#: src/slic3r/GUI/AboutDialog.cpp:267 +msgid "" +"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " +"community." +msgstr "" +"PrusaSlicer заснований на Slic3r від Alessandro Ranellucci та спільноти " +"RepRap." + +#: src/slic3r/GUI/AboutDialog.cpp:268 +msgid "" +"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " +"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " +"numerous others." +msgstr "" +"Розробки від Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr " +"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik та багатьох " +"інших." + +#: src/slic3r/GUI/AboutDialog.cpp:304 +msgid "Copy Version Info" +msgstr "Скопіювати інформацію про версію" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:78 +#, 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 виявив помилку. Ймовірно, це було пов’язано з закінченням пам’яті. Якщо " +"ви впевнені, що у вашій системі достатньо оперативної пам'яті, це також може " +"бути помилкою, і ми будемо раді, якщо ви нам про це повідомите." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 +msgid "Unknown error occured during exporting G-code." +msgstr "Під час експорту G-коду сталася невідома помилка." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:168 +msgid "" +"Copying of the temporary G-code to the output G-code failed. Maybe the SD " +"card is write locked?\n" +"Error message: %1%" +msgstr "" +"Не вдалося скопіювати тимчасовий G-код у вихідний G-код. Можливо, SD-карта " +"заблокована?\n" +"Повідомлення про помилку: %1%" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:171 +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 "" +"Не вдалося скопіювати тимчасовий G-код у вихідний G-код. Можливо, проблема з " +"цільовим пристроєм, спробуйте експортувати ще раз або використати інший " +"пристрій. Пошкоджений вихідний G-код - %1% .tmp." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:174 +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 "" +"Не вдалося перейменувати G-код після копіювання у вибрану папку призначення. " +"Поточний шлях - %1%.tmp. Спробуйте експортувати ще раз." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:177 +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 "" +"Копіювання тимчасового G-коду закінчено, але оригінальний код на рівні %1% " +"не вдалося відкрити під час перевірки копії. Вихідний G-код - %2% .tmp." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180 +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 "" +"Копіювання тимчасового G-коду завершено, але експортований код не вдалося " +"відкрити під час перевірки копії. Вихідний G-код - %1% .tmp." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:187 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:536 +msgid "Running post-processing scripts" +msgstr "Запуск скриптів пост-обробки" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:189 +msgid "G-code file exported to %1%" +msgstr "Файл G-коду експортується до %1%" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:194 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:243 +msgid "Slicing complete" +msgstr "Нарізання завершено" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:238 +msgid "Masked SLA file exported to %1%" +msgstr "Файл SLA експортовано до %1%" -#: src/slic3r/GUI/BedShapeDialog.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:118 src/slic3r/GUI/Plater.cpp:136 -#: src/slic3r/GUI/Tab.cpp:2185 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:539 +msgid "Copying of the temporary G-code to the output G-code failed" +msgstr "Не вдалося скопіювати тимчасовий G-код у вихідний G-код" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:562 +msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" +msgstr "" +"Планування завантаження до `%1%`. Див. Вікно -> Черга завантаження хоста " +"друку" + +#: src/slic3r/GUI/BedShapeDialog.cpp:93 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:162 +#: src/slic3r/GUI/Tab.cpp:2536 msgid "Size" msgstr "Розмір" -#: src/slic3r/GUI/BedShapeDialog.cpp:56 -msgid "Size in X and Y of the rectangular plate." -msgstr "Розмір прямокутної подложки за X та Y." - -#: src/slic3r/GUI/BedShapeDialog.cpp:62 +#: src/slic3r/GUI/BedShapeDialog.cpp:94 msgid "Origin" msgstr "Початок координат" -#: src/slic3r/GUI/BedShapeDialog.cpp:63 +#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:771 +msgid "Diameter" +msgstr "Діаметр" + +#: src/slic3r/GUI/BedShapeDialog.cpp:110 +msgid "Size in X and Y of the rectangular plate." +msgstr "Розмір прямокутної подложки за X та Y." + +#: src/slic3r/GUI/BedShapeDialog.cpp:121 msgid "" "Distance of the 0,0 G-code coordinate from the front left corner of the " "rectangle." msgstr "Відстань координат 0,0 G-коду від нижнього лівого кута прямокутника." -#: src/slic3r/GUI/BedShapeDialog.cpp:67 -msgid "Circular" -msgstr "Круговий" - -#: src/slic3r/GUI/BedShapeDialog.cpp:70 src/slic3r/GUI/ConfigWizard.cpp:111 -#: src/slic3r/GUI/ConfigWizard.cpp:544 src/slic3r/GUI/ConfigWizard.cpp:558 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:115 -#: src/slic3r/GUI/RammingChart.cpp:81 src/slic3r/GUI/WipeTowerDialog.cpp:84 -#: src/libslic3r/PrintConfig.cpp:59 src/libslic3r/PrintConfig.cpp:66 -#: src/libslic3r/PrintConfig.cpp:75 src/libslic3r/PrintConfig.cpp:209 -#: src/libslic3r/PrintConfig.cpp:284 src/libslic3r/PrintConfig.cpp:292 -#: src/libslic3r/PrintConfig.cpp:342 src/libslic3r/PrintConfig.cpp:352 -#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:483 -#: src/libslic3r/PrintConfig.cpp:501 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:1165 src/libslic3r/PrintConfig.cpp:1226 -#: src/libslic3r/PrintConfig.cpp:1244 src/libslic3r/PrintConfig.cpp:1262 -#: src/libslic3r/PrintConfig.cpp:1314 src/libslic3r/PrintConfig.cpp:1324 -#: src/libslic3r/PrintConfig.cpp:1445 src/libslic3r/PrintConfig.cpp:1453 -#: src/libslic3r/PrintConfig.cpp:1494 src/libslic3r/PrintConfig.cpp:1502 -#: src/libslic3r/PrintConfig.cpp:1512 src/libslic3r/PrintConfig.cpp:1520 -#: src/libslic3r/PrintConfig.cpp:1528 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1827 src/libslic3r/PrintConfig.cpp:1897 -#: src/libslic3r/PrintConfig.cpp:1931 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2130 src/libslic3r/PrintConfig.cpp:2137 -#: src/libslic3r/PrintConfig.cpp:2167 src/libslic3r/PrintConfig.cpp:2177 -#: src/libslic3r/PrintConfig.cpp:2187 src/libslic3r/PrintConfig.cpp:2293 -#: src/libslic3r/PrintConfig.cpp:2368 src/libslic3r/PrintConfig.cpp:2377 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2396 -#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2469 src/libslic3r/PrintConfig.cpp:2479 -#: src/libslic3r/PrintConfig.cpp:2488 src/libslic3r/PrintConfig.cpp:2506 -#: src/libslic3r/PrintConfig.cpp:2521 src/libslic3r/PrintConfig.cpp:2532 -#: src/libslic3r/PrintConfig.cpp:2545 src/libslic3r/PrintConfig.cpp:2555 +#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:242 +#: src/slic3r/GUI/ConfigWizard.cpp:1368 src/slic3r/GUI/ConfigWizard.cpp:1382 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:88 +#: src/slic3r/GUI/GCodeViewer.cpp:2337 src/slic3r/GUI/GCodeViewer.cpp:2343 +#: src/slic3r/GUI/GCodeViewer.cpp:2351 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:96 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:77 +#: src/libslic3r/PrintConfig.cpp:84 src/libslic3r/PrintConfig.cpp:95 +#: src/libslic3r/PrintConfig.cpp:135 src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:302 src/libslic3r/PrintConfig.cpp:377 +#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:435 +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:576 +#: src/libslic3r/PrintConfig.cpp:594 src/libslic3r/PrintConfig.cpp:774 +#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1518 +#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1594 +#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1737 src/libslic3r/PrintConfig.cpp:1778 +#: src/libslic3r/PrintConfig.cpp:1786 src/libslic3r/PrintConfig.cpp:1796 +#: src/libslic3r/PrintConfig.cpp:1804 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1875 src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2212 src/libslic3r/PrintConfig.cpp:2246 +#: src/libslic3r/PrintConfig.cpp:2375 src/libslic3r/PrintConfig.cpp:2454 +#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2468 +#: src/libslic3r/PrintConfig.cpp:2498 src/libslic3r/PrintConfig.cpp:2508 +#: src/libslic3r/PrintConfig.cpp:2518 src/libslic3r/PrintConfig.cpp:2678 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2860 src/libslic3r/PrintConfig.cpp:2869 +#: src/libslic3r/PrintConfig.cpp:2879 src/libslic3r/PrintConfig.cpp:2944 +#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2966 +#: src/libslic3r/PrintConfig.cpp:2986 src/libslic3r/PrintConfig.cpp:2996 +#: src/libslic3r/PrintConfig.cpp:3006 src/libslic3r/PrintConfig.cpp:3024 +#: src/libslic3r/PrintConfig.cpp:3039 src/libslic3r/PrintConfig.cpp:3053 +#: src/libslic3r/PrintConfig.cpp:3064 src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3122 src/libslic3r/PrintConfig.cpp:3132 +#: src/libslic3r/PrintConfig.cpp:3141 src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3167 src/libslic3r/PrintConfig.cpp:3191 msgid "mm" msgstr "мм" -#: src/slic3r/GUI/BedShapeDialog.cpp:71 src/libslic3r/PrintConfig.cpp:676 -msgid "Diameter" -msgstr "Діаметр" - -#: src/slic3r/GUI/BedShapeDialog.cpp:72 +#: src/slic3r/GUI/BedShapeDialog.cpp:131 msgid "" "Diameter of the print bed. It is assumed that origin (0,0) is located in the " "center." @@ -98,55 +237,106 @@ msgstr "" "Діаметр подложки. Передбачається, що початок координат (0,0) знаходиться в " "центрі." -#: src/slic3r/GUI/BedShapeDialog.cpp:76 src/slic3r/GUI/GUI_Preview.cpp:239 -#: src/libslic3r/GCode/PreviewData.cpp:175 +#: src/slic3r/GUI/BedShapeDialog.cpp:141 +msgid "Rectangular" +msgstr "Прямокутний" + +#: src/slic3r/GUI/BedShapeDialog.cpp:142 +msgid "Circular" +msgstr "Круговий" + +#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:243 +#: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:358 msgid "Custom" msgstr "Користувацький" -#: src/slic3r/GUI/BedShapeDialog.cpp:80 +#: src/slic3r/GUI/BedShapeDialog.cpp:145 +msgid "Invalid" +msgstr "Недійсний" + +#: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2288 +msgid "Shape" +msgstr "Форма" + +#: src/slic3r/GUI/BedShapeDialog.cpp:243 msgid "Load shape from STL..." msgstr "Завантажте форму з STL ..." -#: src/slic3r/GUI/BedShapeDialog.cpp:126 +#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1826 msgid "Settings" msgstr "Налаштування" -#: src/slic3r/GUI/BedShapeDialog.cpp:299 -msgid "Choose a file to import bed shape from (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "Виберіть файл, щоб імпортувати форму полотна з (STL/OBJ/AMF/PRUSA):" +#: src/slic3r/GUI/BedShapeDialog.cpp:315 +msgid "Texture" +msgstr "Текстура" + +#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405 +msgid "Load..." +msgstr "Завантажити..." + +#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413 +#: src/slic3r/GUI/Tab.cpp:3484 +msgid "Remove" +msgstr "Видалити" + +#: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446 +msgid "Not found:" +msgstr "Не знайдено:" -#: src/slic3r/GUI/BedShapeDialog.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:1252 -msgid "Error! " -msgstr "Помилка! " +#: src/slic3r/GUI/BedShapeDialog.cpp:395 +msgid "Model" +msgstr "Модель" -#: src/slic3r/GUI/BedShapeDialog.cpp:325 +#: src/slic3r/GUI/BedShapeDialog.cpp:563 +msgid "Choose an STL file to import bed shape from:" +msgstr "Виберіть STL-файл для імпорту форми столу з:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:570 src/slic3r/GUI/BedShapeDialog.cpp:619 +#: src/slic3r/GUI/BedShapeDialog.cpp:642 +msgid "Invalid file format." +msgstr "Недійсний формат файлу." + +#: src/slic3r/GUI/BedShapeDialog.cpp:581 +msgid "Error! Invalid model" +msgstr "Помилка! Недійсна модель" + +#: src/slic3r/GUI/BedShapeDialog.cpp:589 msgid "The selected file contains no geometry." msgstr "Обраний файл не містить геометрії." -#: src/slic3r/GUI/BedShapeDialog.cpp:329 +#: src/slic3r/GUI/BedShapeDialog.cpp:593 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "Обраний файл містить декілька непересічних областей. Не підтримується." -#: src/slic3r/GUI/BedShapeDialog.hpp:44 src/slic3r/GUI/ConfigWizard.cpp:507 +#: src/slic3r/GUI/BedShapeDialog.cpp:608 +msgid "Choose a file to import bed texture from (PNG/SVG):" +msgstr "Виберіть файл для імпорту текстури столу (PNG / SVG):" + +#: src/slic3r/GUI/BedShapeDialog.cpp:631 +msgid "Choose an STL file to import bed model from:" +msgstr "Виберіть STL-файл для імпорту моделі столу з:" + +#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1327 msgid "Bed Shape" -msgstr "Форма полотна" +msgstr "Форма столу" #: src/slic3r/GUI/BonjourDialog.cpp:55 msgid "Network lookup" -msgstr "" +msgstr "Пошук мережі" #: src/slic3r/GUI/BonjourDialog.cpp:72 msgid "Address" -msgstr "" +msgstr "Адреса" #: src/slic3r/GUI/BonjourDialog.cpp:73 msgid "Hostname" -msgstr "" +msgstr "Назва хоста" #: src/slic3r/GUI/BonjourDialog.cpp:74 msgid "Service name" -msgstr "" +msgstr "Назва сервісу" #: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "OctoPrint version" @@ -154,417 +344,1184 @@ msgstr "Версія OctoPrint" #: src/slic3r/GUI/BonjourDialog.cpp:218 msgid "Searching for devices" -msgstr "" +msgstr "Пошук пристроїв" #: src/slic3r/GUI/BonjourDialog.cpp:225 msgid "Finished" -msgstr "" +msgstr "Завершено" -#: src/slic3r/GUI/ButtonsDescription.cpp:15 +#: src/slic3r/GUI/ButtonsDescription.cpp:16 msgid "Buttons And Text Colors Description" -msgstr "" +msgstr "Опис кнопок та кольорів тексту" -#: src/slic3r/GUI/ButtonsDescription.cpp:40 +#: src/slic3r/GUI/ButtonsDescription.cpp:36 msgid "Value is the same as the system value" -msgstr "" +msgstr "Значення таке ж, як системне" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:53 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" msgstr "" +"Значення було змінено і не дорівнює системному значенню або останньому " +"збереженому пресету" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:17 -msgid "Upgrade" +#: 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 "" +"Нульового висота шару є недійсною.\n" +"\n" +"Висота шару буде скинута до 0,01." -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 -msgid "Downgrade" +#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1387 +#: src/libslic3r/PrintConfig.cpp:73 +msgid "Layer height" +msgstr "Висота шару" + +#: 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 "" +"Нульового висота першого шару є недійсною.\n" +"\n" +"Висота першого шару буде скинута до 0,01." -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 -msgid "Before roll back" +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:969 +msgid "First layer height" +msgstr "Висота першого шару" + +#: src/slic3r/GUI/ConfigManipulation.cpp:81 +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 "" +"Режим спіральної вази вимагає:\n" +"- один периметр\n" +"- немає верхніх щільних шарів\n" +"- щільність заповнення 0%\n" +"- немає підтримуючого матеріалу\n" +"- \"Забезпечення товщини вертикальної оболонки\" увімкнено\n" +"- \"Виявлення тонких стінок\" вимкнено" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 -msgid "User" +#: src/slic3r/GUI/ConfigManipulation.cpp:89 +msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "" +"Чи потрібно змінити ці налаштування, щоб увімкнути режим Спіральної вази?" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 -msgid "Unknown" +#: src/slic3r/GUI/ConfigManipulation.cpp:90 +msgid "Spiral Vase" +msgstr "Спіральна ваза" + +#: 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 "" +"Вежа витирання в даний момент підтримує лише нерозчинні підтримки,\n" +"якщо вони друкуються з поточним екструдером, не запускаючи зміну " +"інструменту.\n" +"(обидва значення support_material_extruder і " +"support_material_interface_extruder повинні бути встановлені на 0)." + +#: src/slic3r/GUI/ConfigManipulation.cpp:119 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "Чи потрібно коригувати ці налаштування, щоб увімкнути вежу витирання?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:120 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 +msgid "Wipe Tower" +msgstr "Вежа витирання" + +#: 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 "" +"Для того, щоб вежа витирання працювала з розчинними підтримками, шари " +"підтримки\n" +"повинні бути синхронізовані з шаром об'єкта." + +#: src/slic3r/GUI/ConfigManipulation.cpp:139 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "" +"Чи потрібно синхронізувати шари підтримки, щоб увімкнути вежу витирання?" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:38 -msgid "Active: " +#: src/slic3r/GUI/ConfigManipulation.cpp:159 +msgid "" +"Supports work better, if the following feature is enabled:\n" +"- Detect bridging perimeters" msgstr "" +"Підтримка працює краще, якщо ввімкнена така функція:\n" +"- Виявлення нависаючих периметрів(перемичок)" + +#: src/slic3r/GUI/ConfigManipulation.cpp:162 +msgid "Shall I adjust those settings for supports?" +msgstr "Чи потрібно змінити ці налаштування для підтримки?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:163 +msgid "Support Generator" +msgstr "Створення підтримки" + +#: src/slic3r/GUI/ConfigManipulation.cpp:198 +msgid "The %1% infill pattern is not supposed to work at 100%% density." +msgstr "Шаблон заповнення %1% не підтримується при щільності 100%%." + +#: src/slic3r/GUI/ConfigManipulation.cpp:201 +msgid "Shall I switch to rectilinear fill pattern?" +msgstr "Чи потрібно змінити його на прямолінійний шаблон заповнення?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:202 +#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93 +#: src/slic3r/GUI/GUI_ObjectList.cpp:668 src/slic3r/GUI/Plater.cpp:389 +#: src/slic3r/GUI/Tab.cpp:1432 src/slic3r/GUI/Tab.cpp:1434 +#: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:472 +#: src/libslic3r/PrintConfig.cpp:496 src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1086 +#: src/libslic3r/PrintConfig.cpp:1153 src/libslic3r/PrintConfig.cpp:1172 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1928 +#: src/libslic3r/PrintConfig.cpp:1945 +msgid "Infill" +msgstr "Заповнення" + +#: src/slic3r/GUI/ConfigManipulation.cpp:320 +msgid "Head penetration should not be greater than the head width." +msgstr "Проникнення головки не повинно бути більше її ширини." + +#: src/slic3r/GUI/ConfigManipulation.cpp:322 +msgid "Invalid Head penetration" +msgstr "Неприпустиме проникнення головки" + +#: src/slic3r/GUI/ConfigManipulation.cpp:333 +msgid "Pinhead diameter should be smaller than the pillar diameter." +msgstr "Діаметр головки стовпа повинен бути менше діаметра стовпа." + +#: src/slic3r/GUI/ConfigManipulation.cpp:335 +msgid "Invalid pinhead diameter" +msgstr "Неприпустимий діаметр головки" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +msgid "Upgrade" +msgstr "Оновити" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +msgid "Downgrade" +msgstr "Повернути до попередньої версії" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +msgid "Before roll back" +msgstr "Перед відкатом" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:143 +msgid "User" +msgstr "Користувацький" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 +#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/ExtrusionEntity.cpp:309 +msgid "Unknown" +msgstr "Невідомий" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:44 -msgid "slic3r version" -msgstr "версія slic3r" +msgid "Active" +msgstr "Активний" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 +msgid "PrusaSlicer version" +msgstr "Версія PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 src/slic3r/GUI/Preset.cpp:1250 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 src/libslic3r/Preset.cpp:1298 msgid "print" -msgstr "" +msgstr "друк" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:56 msgid "filaments" -msgstr "" +msgstr "філаменти" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1300 +msgid "SLA print" +msgstr "SLA-друк" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 src/slic3r/GUI/Plater.cpp:696 +#: src/libslic3r/Preset.cpp:1301 +msgid "SLA material" +msgstr "SLA-матеріал" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 src/slic3r/GUI/Preset.cpp:1254 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:62 src/libslic3r/Preset.cpp:1302 msgid "printer" -msgstr "" +msgstr "принтер" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Tab.cpp:872 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66 src/slic3r/GUI/Tab.cpp:1304 msgid "vendor" -msgstr "" +msgstr "виробник" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66 msgid "version" msgstr "версія" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 -msgid "min slic3r version" -msgstr "мінімальна версія slic3r" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 +msgid "min PrusaSlicer version" +msgstr "мінімальна версія PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:54 -msgid "max slic3r version" -msgstr "максимальна версія slic3r" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 +msgid "max PrusaSlicer version" +msgstr "максимальна версія PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72 msgid "model" -msgstr "" +msgstr "модель" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72 msgid "variants" -msgstr "" +msgstr "варіанти" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -msgid "Incompatible with this Slic3r" -msgstr "" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:84 +#, c-format +msgid "Incompatible with this %s" +msgstr "Є несумісним з цією версією %s" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:87 msgid "Activate" -msgstr "" +msgstr "Активувати" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:98 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:113 msgid "Configuration Snapshots" -msgstr "" +msgstr "Знімки конфігурації" -#: src/slic3r/GUI/ConfigWizard.cpp:111 +#: src/slic3r/GUI/ConfigWizard.cpp:242 msgid "nozzle" -msgstr "" +msgstr "сопло" -#: src/slic3r/GUI/ConfigWizard.cpp:115 +#: src/slic3r/GUI/ConfigWizard.cpp:246 msgid "Alternate nozzles:" -msgstr "" +msgstr "Альтернативні сопла:" -#: src/slic3r/GUI/ConfigWizard.cpp:181 +#: src/slic3r/GUI/ConfigWizard.cpp:310 msgid "All standard" -msgstr "" +msgstr "Всі стандартні" -#: src/slic3r/GUI/ConfigWizard.cpp:182 src/slic3r/GUI/Tab.cpp:2909 +#: src/slic3r/GUI/ConfigWizard.cpp:310 +msgid "Standard" +msgstr "Стандартний" + +#: src/slic3r/GUI/ConfigWizard.cpp:311 src/slic3r/GUI/ConfigWizard.cpp:605 +#: src/slic3r/GUI/Tab.cpp:3565 src/slic3r/GUI/UnsavedChangesDialog.cpp:933 msgid "All" msgstr "Всі" -#: src/slic3r/GUI/ConfigWizard.cpp:183 src/slic3r/GUI/Plater.cpp:414 -#: src/libslic3r/GCode/PreviewData.cpp:162 +#: src/slic3r/GUI/ConfigWizard.cpp:312 src/slic3r/GUI/ConfigWizard.cpp:606 +#: src/slic3r/GUI/DoubleSlider.cpp:1859 src/slic3r/GUI/Plater.cpp:361 +#: src/slic3r/GUI/Plater.cpp:504 msgid "None" msgstr "Жодне" -#: src/slic3r/GUI/ConfigWizard.cpp:284 +#: src/slic3r/GUI/ConfigWizard.cpp:452 +#, c-format +msgid "Welcome to the %s Configuration Assistant" +msgstr "Ласкаво просимо до Асистента конфігурації %s" + +#: src/slic3r/GUI/ConfigWizard.cpp:454 #, c-format -msgid "Welcome to the Slic3r %s" -msgstr "Ласкаво просимо до Slic3r %s" +msgid "Welcome to the %s Configuration Wizard" +msgstr "Ласкаво просимо до Майстру конфігурації %s" -#: src/slic3r/GUI/ConfigWizard.cpp:284 +#: src/slic3r/GUI/ConfigWizard.cpp:456 msgid "Welcome" msgstr "Ласкаво просимо" -#: src/slic3r/GUI/ConfigWizard.cpp:288 src/slic3r/GUI/GUI_App.cpp:600 -#, c-format -msgid "Run %s" -msgstr "" - -#: src/slic3r/GUI/ConfigWizard.cpp:290 +#: src/slic3r/GUI/ConfigWizard.cpp:458 #, c-format msgid "" -"Hello, welcome to Slic3r Prusa Edition! This %s helps you with the initial " -"configuration; just a few settings and you will be ready to print." +"Hello, welcome to %s! This %s helps you with the initial configuration; just " +"a few settings and you will be ready to print." msgstr "" +"Вітаємо, ласкаво просимо до %s! Цей %s допоможе вам в початковій " +"конфігурації; лише кілька налаштувань, і ви будете готові до друку." -#: src/slic3r/GUI/ConfigWizard.cpp:294 -msgid "" -"Remove user profiles - install from scratch (a snapshot will be taken " -"beforehand)" -msgstr "" +#: src/slic3r/GUI/ConfigWizard.cpp:463 +msgid "Remove user profiles (a snapshot will be taken beforehand)" +msgstr "Видалити профілі користувачів (знімок буде зроблено заздалегідь)" -#: src/slic3r/GUI/ConfigWizard.cpp:325 +#: src/slic3r/GUI/ConfigWizard.cpp:506 #, c-format msgid "%s Family" +msgstr "%s Родина" + +#: src/slic3r/GUI/ConfigWizard.cpp:594 +msgid "Printer:" +msgstr "Принтер:" + +#: src/slic3r/GUI/ConfigWizard.cpp:596 +msgid "Vendor:" +msgstr "Виробник:" + +#: src/slic3r/GUI/ConfigWizard.cpp:597 +msgid "Profile:" +msgstr "Профіль:" + +#: src/slic3r/GUI/ConfigWizard.cpp:669 src/slic3r/GUI/ConfigWizard.cpp:819 +#: src/slic3r/GUI/ConfigWizard.cpp:880 src/slic3r/GUI/ConfigWizard.cpp:1017 +msgid "(All)" +msgstr "(Всі)" + +#: src/slic3r/GUI/ConfigWizard.cpp:698 +msgid "" +"Filaments marked with * are not compatible with some installed " +"printers." msgstr "" +"Філаменти, позначені *, є несумісні з деякими встановленими " +"принтерами." + +#: src/slic3r/GUI/ConfigWizard.cpp:701 +msgid "All installed printers are compatible with the selected filament." +msgstr "Усі встановлені принтери сумісні з обраним філаментем." -#: src/slic3r/GUI/ConfigWizard.cpp:362 +#: src/slic3r/GUI/ConfigWizard.cpp:721 +msgid "" +"Only the following installed printers are compatible with the selected " +"filament:" +msgstr "Тільки наступні встановлені принтери сумісні з обраним філаментом:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1107 msgid "Custom Printer Setup" -msgstr "" +msgstr "Користувацьке налаштування принтера" -#: src/slic3r/GUI/ConfigWizard.cpp:362 +#: src/slic3r/GUI/ConfigWizard.cpp:1107 msgid "Custom Printer" -msgstr "" +msgstr "Користувацький принтер" -#: src/slic3r/GUI/ConfigWizard.cpp:364 +#: src/slic3r/GUI/ConfigWizard.cpp:1109 msgid "Define a custom printer profile" -msgstr "" +msgstr "Визначте власний профіль принтера" -#: src/slic3r/GUI/ConfigWizard.cpp:366 +#: src/slic3r/GUI/ConfigWizard.cpp:1111 msgid "Custom profile name:" -msgstr "" +msgstr "Користувацьке ім'я пресету:" -#: src/slic3r/GUI/ConfigWizard.cpp:390 +#: src/slic3r/GUI/ConfigWizard.cpp:1136 msgid "Automatic updates" -msgstr "" +msgstr "Автоматичні оновлення" -#: src/slic3r/GUI/ConfigWizard.cpp:390 +#: src/slic3r/GUI/ConfigWizard.cpp:1136 msgid "Updates" -msgstr "" +msgstr "Оновлення" -#: src/slic3r/GUI/ConfigWizard.cpp:398 src/slic3r/GUI/Preferences.cpp:59 +#: src/slic3r/GUI/ConfigWizard.cpp:1144 src/slic3r/GUI/Preferences.cpp:94 msgid "Check for application updates" -msgstr "" +msgstr "Перевірте наявність оновлень програми" -#: src/slic3r/GUI/ConfigWizard.cpp:401 src/slic3r/GUI/Preferences.cpp:61 +#: src/slic3r/GUI/ConfigWizard.cpp:1148 +#, c-format msgid "" -"If enabled, Slic3r checks for new versions of Slic3r PE online. When a new " -"version becomes available a notification is displayed at the next " +"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 "" +"Якщо цей параметр увімкнено, %s перевіряє наявність нової версії онлайн. " +"Коли нова версія стає доступною, сповіщення відображатиметься під час " +"наступного запуску застосування (ніколи не під час використання програми). " +"Це лише механізми сповіщення, автоматична інсталяція не виконується." -#: src/slic3r/GUI/ConfigWizard.cpp:405 src/slic3r/GUI/Preferences.cpp:67 +#: src/slic3r/GUI/ConfigWizard.cpp:1154 src/slic3r/GUI/Preferences.cpp:129 msgid "Update built-in Presets automatically" -msgstr "" +msgstr "Автоматично оновлювати вбудовані пресети" -#: src/slic3r/GUI/ConfigWizard.cpp:408 src/slic3r/GUI/Preferences.cpp:69 +#: src/slic3r/GUI/ConfigWizard.cpp:1158 +#, c-format msgid "" -"If enabled, Slic3r downloads updates of built-in system presets in the " -"background. These updates are downloaded into a separate temporary location. " +"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 "" +"Якщо увімкнено, %s завантажує оновлення вбудованих системних пресетів у " +"фоновому режимі. Ці оновлення завантажуються в окреме тимчасове місце. Коли " +"з’являється нова попередньо встановлена версія, вона пропонується під час " +"запуску програми." -#: src/slic3r/GUI/ConfigWizard.cpp:409 +#: src/slic3r/GUI/ConfigWizard.cpp:1161 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "" +"Оновлення ніколи не застосовуються без згоди користувача та ніколи не " +"перезаписують власні налаштування користувача." -#: src/slic3r/GUI/ConfigWizard.cpp:414 +#: src/slic3r/GUI/ConfigWizard.cpp:1166 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "" +"Крім того, перед застосуванням оновлення створюється резервний знімок всієї " +"конфігурації." -#: src/slic3r/GUI/ConfigWizard.cpp:421 -msgid "Other Vendors" +#: src/slic3r/GUI/ConfigWizard.cpp:1173 src/slic3r/GUI/GUI_ObjectList.cpp:1825 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4567 src/slic3r/GUI/Plater.cpp:3116 +#: src/slic3r/GUI/Plater.cpp:4001 src/slic3r/GUI/Plater.cpp:4032 +msgid "Reload from disk" +msgstr "Перезавантажити з диска" + +#: src/slic3r/GUI/ConfigWizard.cpp:1176 +msgid "" +"Export full pathnames of models and parts sources into 3mf and amf files" msgstr "" +"Експортуйте повні назви шляхів джерел моделей та частей у файли 3MF та AMF" -#: src/slic3r/GUI/ConfigWizard.cpp:423 -msgid "Pick another vendor supported by Slic3r PE:" +#: src/slic3r/GUI/ConfigWizard.cpp:1180 +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 "" +"Якщо ввімкнено, дозволяє команді «Перезавантажити з диска» автоматично " +"знаходити та завантажувати файли при виклику.\n" +"Якщо не ввімкнено, команда «Перезавантажити з диска» попросить вибрати кожен " +"файл за допомогою діалогового вікна відкритого файлу." -#: src/slic3r/GUI/ConfigWizard.cpp:469 -msgid "Firmware Type" +#: src/slic3r/GUI/ConfigWizard.cpp:1190 +msgid "Files association" +msgstr "Асоціація файлів" + +#: src/slic3r/GUI/ConfigWizard.cpp:1192 src/slic3r/GUI/Preferences.cpp:112 +msgid "Associate .3mf files to PrusaSlicer" +msgstr "Асоціювати 3MF-файли з PrusaSlicer" + +#: src/slic3r/GUI/ConfigWizard.cpp:1193 src/slic3r/GUI/Preferences.cpp:119 +msgid "Associate .stl files to PrusaSlicer" +msgstr "Асоціювати stl-файли з PrusaSlicer" + +#: src/slic3r/GUI/ConfigWizard.cpp:1204 +msgid "View mode" +msgstr "Режим перегляду" + +#: src/slic3r/GUI/ConfigWizard.cpp:1206 +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 "" +"Користувацький інтерфейс PrusaSlicer поставляються в трьох варіантах:\n" +"Простий, Розширений та Експертний.\n" +"У простому режимі відображаються лише найбільш часто використовувані " +"налаштування, що стосуються звичайного 3D-друку. Два інших пропонують " +"поступово більш досконалу точну настройку, вони підходять для більш " +"досвідчених користувачів." + +#: src/slic3r/GUI/ConfigWizard.cpp:1211 +msgid "Simple mode" +msgstr "Простий режим" + +#: src/slic3r/GUI/ConfigWizard.cpp:1212 +msgid "Advanced mode" +msgstr "Розширений режим" -#: src/slic3r/GUI/ConfigWizard.cpp:469 src/slic3r/GUI/Tab.cpp:1870 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "Expert mode" +msgstr "Експертний режим" + +#: src/slic3r/GUI/ConfigWizard.cpp:1219 +msgid "The size of the object can be specified in inches" +msgstr "Розмір предмета можна вказати в дюймах" + +#: src/slic3r/GUI/ConfigWizard.cpp:1220 +msgid "Use inches" +msgstr "Використовувати дюйми" + +#: src/slic3r/GUI/ConfigWizard.cpp:1254 +msgid "Other Vendors" +msgstr "Інші постачальники" + +#: src/slic3r/GUI/ConfigWizard.cpp:1258 +#, c-format +msgid "Pick another vendor supported by %s" +msgstr "Виберіть іншого постачальника, який підтримує %s" + +#: src/slic3r/GUI/ConfigWizard.cpp:1289 +msgid "Firmware Type" +msgstr "Тип прошивки" + +#: src/slic3r/GUI/ConfigWizard.cpp:1289 src/slic3r/GUI/Tab.cpp:2172 msgid "Firmware" msgstr "Прошивка" -#: src/slic3r/GUI/ConfigWizard.cpp:473 +#: src/slic3r/GUI/ConfigWizard.cpp:1293 msgid "Choose the type of firmware used by your printer." -msgstr "" +msgstr "Виберіть тип прошивки, що використовуються вашим принтером." -#: src/slic3r/GUI/ConfigWizard.cpp:507 +#: src/slic3r/GUI/ConfigWizard.cpp:1327 msgid "Bed Shape and Size" -msgstr "" +msgstr "Форма та розмір столу" -#: src/slic3r/GUI/ConfigWizard.cpp:510 +#: src/slic3r/GUI/ConfigWizard.cpp:1330 msgid "Set the shape of your printer's bed." -msgstr "" +msgstr "Встановіть форму столу свого принтеру." -#: src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/ConfigWizard.cpp:1350 msgid "Filament and Nozzle Diameters" -msgstr "" +msgstr "Діаметри філатенту та сопла" -#: src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/ConfigWizard.cpp:1350 msgid "Print Diameters" -msgstr "" +msgstr "Діаметри друку" -#: src/slic3r/GUI/ConfigWizard.cpp:540 +#: src/slic3r/GUI/ConfigWizard.cpp:1364 msgid "Enter the diameter of your printer's hot end nozzle." -msgstr "" +msgstr "Введіть діаметр кінчику екструдерного сопла." -#: src/slic3r/GUI/ConfigWizard.cpp:543 +#: src/slic3r/GUI/ConfigWizard.cpp:1367 msgid "Nozzle Diameter:" -msgstr "" +msgstr "Діаметр сопла:" -#: src/slic3r/GUI/ConfigWizard.cpp:553 +#: src/slic3r/GUI/ConfigWizard.cpp:1377 msgid "Enter the diameter of your filament." -msgstr "" +msgstr "Введіть діаметр вашого філаметну." -#: src/slic3r/GUI/ConfigWizard.cpp:554 +#: src/slic3r/GUI/ConfigWizard.cpp:1378 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." msgstr "" +"Необхідна висока точність, тому використовуйте калібрувальник і виконайте " +"декілька вимірювань вздовж філаменту, потім обчисліть середнє значення." -#: src/slic3r/GUI/ConfigWizard.cpp:557 +#: src/slic3r/GUI/ConfigWizard.cpp:1381 msgid "Filament Diameter:" -msgstr "" +msgstr "Діаметр філаменту:" -#: src/slic3r/GUI/ConfigWizard.cpp:575 -msgid "Extruder and Bed Temperatures" -msgstr "" +#: src/slic3r/GUI/ConfigWizard.cpp:1415 +msgid "Nozzle and Bed Temperatures" +msgstr "Температура сопла та столу" -#: src/slic3r/GUI/ConfigWizard.cpp:575 +#: src/slic3r/GUI/ConfigWizard.cpp:1415 msgid "Temperatures" -msgstr "" +msgstr "Температури" -#: src/slic3r/GUI/ConfigWizard.cpp:591 +#: src/slic3r/GUI/ConfigWizard.cpp:1431 msgid "Enter the temperature needed for extruding your filament." -msgstr "" +msgstr "Введіть температуру, необхідну для екструдування вашого філаменту." -#: src/slic3r/GUI/ConfigWizard.cpp:592 +#: src/slic3r/GUI/ConfigWizard.cpp:1432 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." -msgstr "" +msgstr "Зазвичай - 160-230°C для PLA та 215-250°C для ABS." -#: src/slic3r/GUI/ConfigWizard.cpp:595 +#: src/slic3r/GUI/ConfigWizard.cpp:1435 msgid "Extrusion Temperature:" -msgstr "" +msgstr "Температура екструзії:" -#: src/slic3r/GUI/ConfigWizard.cpp:596 src/slic3r/GUI/ConfigWizard.cpp:610 +#: src/slic3r/GUI/ConfigWizard.cpp:1436 src/slic3r/GUI/ConfigWizard.cpp:1450 +#: src/libslic3r/PrintConfig.cpp:202 src/libslic3r/PrintConfig.cpp:950 +#: src/libslic3r/PrintConfig.cpp:994 src/libslic3r/PrintConfig.cpp:2294 msgid "°C" -msgstr "" +msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:605 +#: src/slic3r/GUI/ConfigWizard.cpp:1445 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "" +"Введіть температуру столу, необхідну для того, щоб ваш філамент добре " +"кріпився до нагрітого столу." -#: src/slic3r/GUI/ConfigWizard.cpp:606 +#: src/slic3r/GUI/ConfigWizard.cpp:1446 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." msgstr "" +"Зазвичай - 60°C для PLA та 110°C для ABS. Залиште рівним нулю, якщо стіл " +"нерозігрітий." -#: src/slic3r/GUI/ConfigWizard.cpp:609 +#: src/slic3r/GUI/ConfigWizard.cpp:1449 msgid "Bed Temperature:" +msgstr "Температура столу:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2582 +msgid "Filaments" +msgstr "Філаменти" + +#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2584 +msgid "SLA Materials" +msgstr "SLA-матеріали" + +#: src/slic3r/GUI/ConfigWizard.cpp:1963 +msgid "FFF Technology Printers" +msgstr "Принтери технології FFF" + +#: src/slic3r/GUI/ConfigWizard.cpp:1968 +msgid "SLA Technology Printers" +msgstr "Принтери технології SLA" + +#: src/slic3r/GUI/ConfigWizard.cpp:2274 src/slic3r/GUI/DoubleSlider.cpp:2245 +#: src/slic3r/GUI/DoubleSlider.cpp:2265 src/slic3r/GUI/GUI.cpp:244 +msgid "Notice" +msgstr "Зауваження" + +#: src/slic3r/GUI/ConfigWizard.cpp:2295 +msgid "The following FFF printer models have no filament selected:" +msgstr "Наступні моделі FFF-принтерів не мають вибраного філаменту:" + +#: src/slic3r/GUI/ConfigWizard.cpp:2299 +msgid "Do you want to select default filaments for these FFF printer models?" msgstr "" +"Ви хочете вибрати філаменти за замовчуванням для цих моделей FFF-принтерів?" -#: src/slic3r/GUI/ConfigWizard.cpp:1001 -msgid "Select all standard printers" +#: src/slic3r/GUI/ConfigWizard.cpp:2313 +msgid "The following SLA printer models have no materials selected:" +msgstr "Наступні моделі SLA-принтерів не мають вибраного матеріалу:" + +#: src/slic3r/GUI/ConfigWizard.cpp:2317 +msgid "Do you want to select default SLA materials for these printer models?" msgstr "" +"Ви хочете вибрати матеріали за замовчуванням для цих моделей SLA-принтерів?" + +#: src/slic3r/GUI/ConfigWizard.cpp:2545 +msgid "Select all standard printers" +msgstr "Виберіть усі стандартні принтери" -#: src/slic3r/GUI/ConfigWizard.cpp:1004 +#: src/slic3r/GUI/ConfigWizard.cpp:2548 msgid "< &Back" -msgstr "" +msgstr "< Назад" -#: src/slic3r/GUI/ConfigWizard.cpp:1005 +#: src/slic3r/GUI/ConfigWizard.cpp:2549 msgid "&Next >" -msgstr "" +msgstr "Далі >" -#: src/slic3r/GUI/ConfigWizard.cpp:1006 +#: src/slic3r/GUI/ConfigWizard.cpp:2550 msgid "&Finish" -msgstr "" +msgstr "Завершити" -#: src/slic3r/GUI/ConfigWizard.cpp:1007 src/slic3r/GUI/FirmwareDialog.cpp:142 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:37 -#: src/slic3r/GUI/ProgressStatusBar.cpp:28 +#: src/slic3r/GUI/ConfigWizard.cpp:2551 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:248 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:656 msgid "Cancel" -msgstr "" +msgstr "Скасувати" -#: src/slic3r/GUI/ConfigWizard.cpp:1021 +#: src/slic3r/GUI/ConfigWizard.cpp:2564 msgid "Prusa FFF Technology Printers" -msgstr "" +msgstr "Принтери технології FFF" -#: src/slic3r/GUI/ConfigWizard.cpp:1024 +#: src/slic3r/GUI/ConfigWizard.cpp:2567 msgid "Prusa MSLA Technology Printers" -msgstr "" +msgstr "Принтери технології MSLA" -#: src/slic3r/GUI/ConfigWizard.cpp:1111 +#: src/slic3r/GUI/ConfigWizard.cpp:2582 +msgid "Filament Profiles Selection" +msgstr "Вибір профілів філаменту" + +#: src/slic3r/GUI/ConfigWizard.cpp:2582 src/slic3r/GUI/ConfigWizard.cpp:2584 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4144 +msgid "Type:" +msgstr "Тип:" + +#: src/slic3r/GUI/ConfigWizard.cpp:2584 +msgid "SLA Material Profiles Selection" +msgstr "Вибір профілів SLA-матеріалу" + +#: src/slic3r/GUI/ConfigWizard.cpp:2701 +msgid "Configuration Assistant" +msgstr "Асистент конфігурації" + +#: src/slic3r/GUI/ConfigWizard.cpp:2702 +msgid "Configuration &Assistant" +msgstr "Асистент конфігурації" + +#: src/slic3r/GUI/ConfigWizard.cpp:2704 msgid "Configuration Wizard" -msgstr "" +msgstr "Майстер конфігурації" -#: src/slic3r/GUI/ConfigWizard.cpp:1112 +#: src/slic3r/GUI/ConfigWizard.cpp:2705 msgid "Configuration &Wizard" +msgstr "Майстер конфігурації" + +#: src/slic3r/GUI/DoubleSlider.cpp:97 +msgid "Place bearings in slots and resume printing" +msgstr "Розмістіть необхідні деталі в гніздах і відновіть друк" + +#: src/slic3r/GUI/DoubleSlider.cpp:1224 +msgid "One layer mode" +msgstr "Одношаровий режим" + +#: src/slic3r/GUI/DoubleSlider.cpp:1226 +msgid "Discard all custom changes" +msgstr "Відхилити всі користувацькі зміни" + +#: src/slic3r/GUI/DoubleSlider.cpp:1230 src/slic3r/GUI/DoubleSlider.cpp:1995 +msgid "Jump to move" +msgstr "Перейти до руху" + +#: src/slic3r/GUI/DoubleSlider.cpp:1233 +#, c-format +msgid "" +"Jump to height %s\n" +"Set ruler mode\n" +"or Set extruder sequence for the entire print" msgstr "" +"Перейти на висоту %s\n" +"Налаштувати режим лінійки\n" +"або Налаштувати послідовність екструдерів для поточного тіску" -#: src/slic3r/GUI/ConfigWizard.cpp:1114 -msgid "Configuration Assistant" +#: src/slic3r/GUI/DoubleSlider.cpp:1236 +#, c-format +msgid "" +"Jump to height %s\n" +"or Set ruler mode" msgstr "" +"Перейти на висоту %s\n" +"або Налаштувати режим лінійки" -#: src/slic3r/GUI/ConfigWizard.cpp:1115 -msgid "Configuration &Assistant" +#: src/slic3r/GUI/DoubleSlider.cpp:1241 +msgid "Edit current color - Right click the colored slider segment" msgstr "" +"Редагувати поточний колір - Клацніть правою кнопкою миші на кольоровий " +"сегмент повзунка" -#: src/slic3r/GUI/Field.cpp:112 -msgid "default value" +#: src/slic3r/GUI/DoubleSlider.cpp:1251 +msgid "Print mode" +msgstr "Режим друку" + +#: src/slic3r/GUI/DoubleSlider.cpp:1265 +msgid "Add extruder change - Left click" +msgstr "Додати зміну екструдеру - ліва кнопка миші" + +#: src/slic3r/GUI/DoubleSlider.cpp:1267 +msgid "" +"Add color change - Left click for predefined color or Shift + Left click for " +"custom color selection" msgstr "" +"Додати зміну кольору - ліва кнопка миші для попередньо визначеного кольору " +"або Shift + ліва кнопка миші для властного вибору кольору" -#: src/slic3r/GUI/Field.cpp:115 -msgid "parameter name" +#: src/slic3r/GUI/DoubleSlider.cpp:1269 +msgid "Add color change - Left click" +msgstr "Додати зміну кольору - ліва кнопка миші" + +#: src/slic3r/GUI/DoubleSlider.cpp:1270 +msgid "or press \"+\" key" +msgstr "або натисніть клавішу \"+\"" + +#: src/slic3r/GUI/DoubleSlider.cpp:1272 +msgid "Add another code - Ctrl + Left click" +msgstr "Додайте інший код - Ctrl + ліва кнопка миші" + +#: src/slic3r/GUI/DoubleSlider.cpp:1273 +msgid "Add another code - Right click" +msgstr "Додайте інший код - права кнопка миші" + +#: src/slic3r/GUI/DoubleSlider.cpp:1279 +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 "" +"Послідовний друк увімкнено.\n" +"Неможливо застосувати будь-який власний G-код для послідовного друку " +"об'єктів.\n" +"Цей код не буде оброблятися під час створення G-коду." + +#: src/slic3r/GUI/DoubleSlider.cpp:1288 +msgid "Color change (\"%1%\")" +msgstr "Зміну кольору (\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:1289 +msgid "Color change (\"%1%\") for Extruder %2%" +msgstr "Зміну кольору (\"%1%\") для екструдеру %2%" + +#: src/slic3r/GUI/DoubleSlider.cpp:1291 +msgid "Pause print (\"%1%\")" +msgstr "Пауза друку (\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:1293 +msgid "Custom template (\"%1%\")" +msgstr "Користувацький шаблон (\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:1295 +msgid "Extruder (tool) is changed to Extruder \"%1%\"" +msgstr "Екструдер (інструмент) змінено на Екструдер \"%1%\"" + +#: src/slic3r/GUI/DoubleSlider.cpp:1302 +msgid "Note" +msgstr "Примітка" + +#: src/slic3r/GUI/DoubleSlider.cpp:1304 +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 "" +"G-код, пов'язаний з цим маркером, суперечить режиму друку.\n" +"Редагування призведе до змін даних повзунка." + +#: src/slic3r/GUI/DoubleSlider.cpp:1307 +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." +msgstr "" +"Змінено колір екструдера, який не використовуватиметься до кінця завдання " +"друку.\n" +"Цей код не буде оброблятися під час створення G-коду." + +#: src/slic3r/GUI/DoubleSlider.cpp:1310 +msgid "" +"There is an extruder change set to the same extruder.\n" +"This code won't be processed during G-code generation." msgstr "" +"Існує зміна екструдера, встановлена на той самий екструдер.\n" +"Цей код не буде оброблятися під час створення G-коду." -#: src/slic3r/GUI/Field.cpp:143 +#: src/slic3r/GUI/DoubleSlider.cpp:1313 +msgid "" +"There is a color change for extruder that has not been used before.\n" +"Check your settings to avoid redundant color changes." +msgstr "" +"Змінюється колір екструдера, який раніше не застосовувався.\n" +"Перевірте свої налаштування, щоб уникнути зайвих змін кольору." + +#: src/slic3r/GUI/DoubleSlider.cpp:1318 +msgid "Delete tick mark - Left click or press \"-\" key" +msgstr "" +"Видалити маркер - клацніть лівою кнопкою миші або натисніть клавішу \"-\"" + +#: src/slic3r/GUI/DoubleSlider.cpp:1320 +msgid "Edit tick mark - Ctrl + Left click" +msgstr "Змінити маркер - Ctrl+Ліва кнопка миші" + +#: src/slic3r/GUI/DoubleSlider.cpp:1321 +msgid "Edit tick mark - Right click" +msgstr "Змінити маркер - Права кнопка миші" + +#: src/slic3r/GUI/DoubleSlider.cpp:1417 src/slic3r/GUI/DoubleSlider.cpp:1451 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1864 #, c-format -msgid "%s doesn't support percentage" +msgid "Extruder %d" +msgstr "Екструдер %d" + +#: src/slic3r/GUI/DoubleSlider.cpp:1418 src/slic3r/GUI/GUI_ObjectList.cpp:1865 +msgid "active" +msgstr "активний" + +#: src/slic3r/GUI/DoubleSlider.cpp:1427 +msgid "Switch code to Change extruder" +msgstr "Переключити код на \"Змінити екструдер\"" + +#: src/slic3r/GUI/DoubleSlider.cpp:1427 src/slic3r/GUI/GUI_ObjectList.cpp:1832 +msgid "Change extruder" +msgstr "Змінити екструдер" + +#: src/slic3r/GUI/DoubleSlider.cpp:1428 +msgid "Change extruder (N/A)" +msgstr "Змінити екструдер (Недоступний)" + +#: src/slic3r/GUI/DoubleSlider.cpp:1430 +msgid "Use another extruder" +msgstr "Використати інший екструдер" + +#: src/slic3r/GUI/DoubleSlider.cpp:1452 +msgid "used" +msgstr "використовується" + +#: src/slic3r/GUI/DoubleSlider.cpp:1460 +msgid "Switch code to Color change (%1%) for:" +msgstr "Переключити код на \"Змінити колір\" (%1%) для:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1461 +msgid "Add color change (%1%) for:" +msgstr "Додати зміну кольору (%1%) для:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1797 +msgid "Add color change" +msgstr "Додати зміну кольору" + +#: src/slic3r/GUI/DoubleSlider.cpp:1808 +msgid "Add pause print" +msgstr "Додати паузу друку" + +#: src/slic3r/GUI/DoubleSlider.cpp:1812 +msgid "Add custom template" +msgstr "Додати власний шаблон" + +#: src/slic3r/GUI/DoubleSlider.cpp:1815 +msgid "Add custom G-code" +msgstr "Додати власний G-код" + +#: src/slic3r/GUI/DoubleSlider.cpp:1833 +msgid "Edit color" +msgstr "Редагувати колір" + +#: src/slic3r/GUI/DoubleSlider.cpp:1834 +msgid "Edit pause print message" +msgstr "Редагувати повідомлення під час паузи друку" + +#: src/slic3r/GUI/DoubleSlider.cpp:1835 +msgid "Edit custom G-code" +msgstr "Редагувати власний G-код" + +#: src/slic3r/GUI/DoubleSlider.cpp:1841 +msgid "Delete color change" +msgstr "Видалити зміну кольору" + +#: src/slic3r/GUI/DoubleSlider.cpp:1842 +msgid "Delete tool change" +msgstr "Видалити зміну інструменту" + +#: src/slic3r/GUI/DoubleSlider.cpp:1843 +msgid "Delete pause print" +msgstr "Видалити паузу друку" + +#: src/slic3r/GUI/DoubleSlider.cpp:1844 +msgid "Delete custom G-code" +msgstr "Видалити власний G-код" + +#: src/slic3r/GUI/DoubleSlider.cpp:1854 src/slic3r/GUI/DoubleSlider.cpp:1995 +msgid "Jump to height" +msgstr "Перейти на висоту" + +#: src/slic3r/GUI/DoubleSlider.cpp:1859 +msgid "Hide ruler" +msgstr "Сховати лінійку" + +#: src/slic3r/GUI/DoubleSlider.cpp:1863 +msgid "Show object height" +msgstr "Показувати висоту об’єкта" + +#: src/slic3r/GUI/DoubleSlider.cpp:1863 +msgid "Show object height on the ruler" +msgstr "Показувати висоту об’єкта на лінійці" + +#: src/slic3r/GUI/DoubleSlider.cpp:1867 +msgid "Show estimated print time" +msgstr "Показувати приблизний час друку" + +#: src/slic3r/GUI/DoubleSlider.cpp:1867 +msgid "Show estimated print time on the ruler" +msgstr "Показувати приблизний час друку на лінійці" + +#: src/slic3r/GUI/DoubleSlider.cpp:1871 +msgid "Ruler mode" +msgstr "Режим лінійки" + +#: src/slic3r/GUI/DoubleSlider.cpp:1871 +msgid "Set ruler mode" +msgstr "Встановити режим лінійки" + +#: src/slic3r/GUI/DoubleSlider.cpp:1876 +msgid "Set extruder sequence for the entire print" +msgstr "Встановити послідовність екструдерів для всього друку" + +#: src/slic3r/GUI/DoubleSlider.cpp:1962 +msgid "Enter custom G-code used on current layer" +msgstr "Введіть власний G-код, для використання на поточному шарі" + +#: src/slic3r/GUI/DoubleSlider.cpp:1963 +msgid "Custom G-code on current layer (%1% mm)." +msgstr "Користувацький G-код на поточному шарі (%1% мм)." + +#: src/slic3r/GUI/DoubleSlider.cpp:1978 +msgid "Enter short message shown on Printer display when a print is paused" msgstr "" +"Введіть коротке повідомлення, що відображатиметься на дисплеї принтера піж " +"час паузи друку" -#: src/slic3r/GUI/Field.cpp:157 src/slic3r/GUI/Field.cpp:180 -msgid "Invalid numeric input." +#: src/slic3r/GUI/DoubleSlider.cpp:1979 +msgid "Message for pause print on current layer (%1% mm)." +msgstr "Повідомлення для паузи друку на поточному шарі (%1% мм)." + +#: src/slic3r/GUI/DoubleSlider.cpp:1994 +msgid "Enter the move you want to jump to" +msgstr "Введіть рух, до якого ви хочете перейти" + +#: src/slic3r/GUI/DoubleSlider.cpp:1994 +msgid "Enter the height you want to jump to" +msgstr "Введіть висоту, на яку ви хочете перейти" + +#: src/slic3r/GUI/DoubleSlider.cpp:2239 +msgid "The last color change data was saved for a single extruder printing." msgstr "" +"Дані про останню зміну кольору були збережені для одно-екструдерного друку." -#: src/slic3r/GUI/Field.cpp:162 -msgid "Input value is out of range" +#: src/slic3r/GUI/DoubleSlider.cpp:2240 src/slic3r/GUI/DoubleSlider.cpp:2255 +msgid "The last color change data was saved for a multi extruder printing." +msgstr "" +"Дані про останню зміну кольору були збережені для багато-екструдерного друку." + +#: src/slic3r/GUI/DoubleSlider.cpp:2242 +msgid "Your current changes will delete all saved color changes." +msgstr "Ваші поточні зміни видалять усі збережені зміни кольору." + +#: src/slic3r/GUI/DoubleSlider.cpp:2243 src/slic3r/GUI/DoubleSlider.cpp:2263 +msgid "Are you sure you want to continue?" +msgstr "Ви впевнені, що хочете продовжити?" + +#: src/slic3r/GUI/DoubleSlider.cpp:2256 +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/DoubleSlider.cpp:2259 +msgid "Do you want to delete all saved tool changes?" +msgstr "Ви хочете видалити всі збережені зміни інструменту?" + +#: src/slic3r/GUI/DoubleSlider.cpp:2261 +msgid "" +"The last color change data was saved for a multi extruder printing with tool " +"changes for whole print." msgstr "" +"Дані про останню зміну кольору були збережені для багато-екструдерного друку " +"зі зміною інструменту для цілого друку." -#: src/slic3r/GUI/Field.cpp:188 +#: src/slic3r/GUI/DoubleSlider.cpp:2262 +msgid "Your current changes will delete all saved extruder (tool) changes." +msgstr "" +"Ваші поточні зміни видалять усі збережені зміни екструдера (інструменту)." + +#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:524 src/slic3r/GUI/GUI_ObjectList.cpp:1033 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4582 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4592 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4627 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:209 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:291 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:499 src/libslic3r/PrintConfig.cpp:552 +msgid "default" +msgstr "за замовчанням" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:24 +msgid "Set extruder sequence" +msgstr "Встановити послідовність екструдерів" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:40 +msgid "Set extruder change for every" +msgstr "Встановіть зміну екструдера для кожних" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:53 +#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1089 +#: src/libslic3r/PrintConfig.cpp:1718 src/libslic3r/PrintConfig.cpp:1883 +#: src/libslic3r/PrintConfig.cpp:1950 src/libslic3r/PrintConfig.cpp:2157 +#: src/libslic3r/PrintConfig.cpp:2203 +msgid "layers" +msgstr "шару(ів)" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:137 +msgid "Set extruder(tool) sequence" +msgstr "Встановити послідовність екструдерів (інструментів)" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:183 +msgid "Remove extruder from sequence" +msgstr "Видалити екструдер з послідовності" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:193 +msgid "Add extruder to sequence" +msgstr "Додати екструдер до послідовності" + +#: src/slic3r/GUI/Field.cpp:197 +msgid "default value" +msgstr "значення за замовчанням" + +#: src/slic3r/GUI/Field.cpp:200 +msgid "parameter name" +msgstr "назва параметра" + +#: src/slic3r/GUI/Field.cpp:211 src/slic3r/GUI/OptionsGroup.cpp:781 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:886 +msgid "N/A" +msgstr "Н/Д" + +#: src/slic3r/GUI/Field.cpp:233 +#, c-format +msgid "%s doesn't support percentage" +msgstr "%s не підтримує відсотки" + +#: src/slic3r/GUI/Field.cpp:253 src/slic3r/GUI/Field.cpp:307 +#: src/slic3r/GUI/Field.cpp:1520 src/slic3r/GUI/GUI_ObjectLayers.cpp:413 +msgid "Invalid numeric input." +msgstr "Недійсне числове значення." + +#: src/slic3r/GUI/Field.cpp:264 #, c-format msgid "" -"Do you mean %d%% instead of %d %s?\n" -"Select YES if you want to change this value to %d%%, \n" -"or NO if you are sure that %d %s is a correct value." +"Input value is out of range\n" +"Are you sure that %s is a correct value and that you want to continue?" msgstr "" +"Вхідне значення виходить за межі діапазону\n" +"Ви впевнені, що %s є правильним значенням і хочете продовжити?" -#: src/slic3r/GUI/Field.cpp:191 +#: src/slic3r/GUI/Field.cpp:266 src/slic3r/GUI/Field.cpp:326 msgid "Parameter validation" +msgstr "Перевірка параметрів" + +#: src/slic3r/GUI/Field.cpp:279 src/slic3r/GUI/Field.cpp:373 +#: src/slic3r/GUI/Field.cpp:1532 +msgid "Input value is out of range" +msgstr "Вхідне значення виходить за межі діапазону" + +#: src/slic3r/GUI/Field.cpp:323 +#, 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 "" +"Ви маєте на увазі %s%% замість %s %s?\n" +"Виберіть ТАК, якщо ви хочете змінити це значення на %s%%,\n" +"або НІ, якщо ви впевнені, що %s %s є правильним значенням." -#: src/slic3r/GUI/FirmwareDialog.cpp:141 -msgid "Flash!" +#: src/slic3r/GUI/Field.cpp:381 +msgid "" +"Invalid input format. Expected vector of dimensions in the following format: " +"\"%1%\"" msgstr "" +"Недійсний формат введення. Очікується вектор розмірів у наступному форматі: " +"\"%1%\"" -#: src/slic3r/GUI/FirmwareDialog.cpp:143 +#: src/slic3r/GUI/FirmwareDialog.cpp:150 +msgid "Flash!" +msgstr "Прошити!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flashing in progress. Please do not disconnect the printer!" -msgstr "" +msgstr "Триває прошивка. Будь ласка, не від'єднуй принтер!" -#: src/slic3r/GUI/FirmwareDialog.cpp:187 -msgid "Flashing failed: " -msgstr "" +#: src/slic3r/GUI/FirmwareDialog.cpp:199 +msgid "Flashing failed" +msgstr "Помилка прошивки" -#: src/slic3r/GUI/FirmwareDialog.cpp:268 +#: src/slic3r/GUI/FirmwareDialog.cpp:282 msgid "Flashing succeeded!" -msgstr "" +msgstr "Прошивка вдалася!" -#: src/slic3r/GUI/FirmwareDialog.cpp:269 +#: src/slic3r/GUI/FirmwareDialog.cpp:283 msgid "Flashing failed. Please see the avrdude log below." -msgstr "" +msgstr "Помилка прошивки. Будь ласка, переглянте журнал avrdude нижче." -#: src/slic3r/GUI/FirmwareDialog.cpp:270 +#: src/slic3r/GUI/FirmwareDialog.cpp:284 msgid "Flashing cancelled." -msgstr "" +msgstr "Прошивку скасовано." -#: src/slic3r/GUI/FirmwareDialog.cpp:308 +#: src/slic3r/GUI/FirmwareDialog.cpp:332 #, c-format msgid "" "This firmware hex file does not match the printer model.\n" @@ -574,1779 +1531,4036 @@ msgid "" "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 "" +"Цей hex-файл не відповідає моделі принтера.\n" +"Даний hex-файл призначений для: %s\n" +"Повідомлено для принтеру: %s\n" +"\n" +"Продовжити роботу та все одно прошити цей hex-файл?\n" +"Будь ласка, продовжуйте, тільки якщо ви впевнені, що це правильно робити." -#: src/slic3r/GUI/FirmwareDialog.cpp:395 src/slic3r/GUI/FirmwareDialog.cpp:431 +#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454 #, c-format msgid "" "Multiple %s devices found. Please only connect one at a time for flashing." msgstr "" +"Знайдено кілька пристроїв %s . Будь ласка, підключайте лише один пристрій " +"для прошивки." -#: src/slic3r/GUI/FirmwareDialog.cpp:412 +#: 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 "" +"Пристрій %s не знайдено.\n" +"Якщо пристрій підключений, натисніть кнопку Скинути поруч з USB-роз'ємом ..." -#: src/slic3r/GUI/FirmwareDialog.cpp:525 +#: src/slic3r/GUI/FirmwareDialog.cpp:548 #, c-format msgid "The %s device could not have been found" -msgstr "" +msgstr "Пристрою %s не знайдено" -#: src/slic3r/GUI/FirmwareDialog.cpp:603 +#: src/slic3r/GUI/FirmwareDialog.cpp:645 #, c-format msgid "Error accessing port at %s: %s" -msgstr "" +msgstr "Помилка доступу до порту на %s: %s" -#: src/slic3r/GUI/FirmwareDialog.cpp:605 +#: src/slic3r/GUI/FirmwareDialog.cpp:647 #, c-format msgid "Error: %s" -msgstr "" +msgstr "Помилка: %s" -#: src/slic3r/GUI/FirmwareDialog.cpp:735 +#: src/slic3r/GUI/FirmwareDialog.cpp:777 msgid "Firmware flasher" -msgstr "" +msgstr "Пепепрошивка" -#: src/slic3r/GUI/FirmwareDialog.cpp:762 +#: src/slic3r/GUI/FirmwareDialog.cpp:802 msgid "Firmware image:" -msgstr "" +msgstr "Імідж прошивки:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:805 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +msgid "Browse" +msgstr "Переглянути" -#: src/slic3r/GUI/FirmwareDialog.cpp:766 +#: src/slic3r/GUI/FirmwareDialog.cpp:807 msgid "Serial port:" -msgstr "" +msgstr "Послідовний порт:" -#: src/slic3r/GUI/FirmwareDialog.cpp:768 +#: src/slic3r/GUI/FirmwareDialog.cpp:809 msgid "Autodetected" -msgstr "" +msgstr "Автоматично виявлено" -#: src/slic3r/GUI/FirmwareDialog.cpp:769 +#: src/slic3r/GUI/FirmwareDialog.cpp:810 msgid "Rescan" -msgstr "" +msgstr "Пересканувати" -#: src/slic3r/GUI/FirmwareDialog.cpp:776 +#: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Progress:" -msgstr "" +msgstr "Прогрес:" -#: src/slic3r/GUI/FirmwareDialog.cpp:779 +#: src/slic3r/GUI/FirmwareDialog.cpp:820 msgid "Status:" -msgstr "" +msgstr "Статус:" -#: src/slic3r/GUI/FirmwareDialog.cpp:780 +#: src/slic3r/GUI/FirmwareDialog.cpp:821 msgid "Ready" -msgstr "" +msgstr "Готово" -#: src/slic3r/GUI/FirmwareDialog.cpp:800 +#: src/slic3r/GUI/FirmwareDialog.cpp:841 msgid "Advanced: Output log" -msgstr "" +msgstr "Розширений: журнал виводу" -#: src/slic3r/GUI/FirmwareDialog.cpp:811 -#: src/slic3r/GUI/PrintHostDialogs.cpp:161 +#: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/Mouse3DController.cpp:551 +#: src/slic3r/GUI/PrintHostDialogs.cpp:189 msgid "Close" -msgstr "" +msgstr "Закрити" -#: src/slic3r/GUI/FirmwareDialog.cpp:859 +#: 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 "" +"Ви впевнені, що хочете скасувати перепрошивку?\n" +"Це може привести ваш принтер у непридатний стан!" -#: src/slic3r/GUI/FirmwareDialog.cpp:860 +#: src/slic3r/GUI/FirmwareDialog.cpp:903 msgid "Confirmation" -msgstr "" +msgstr "Підтвердження" -#: src/slic3r/GUI/FirmwareDialog.cpp:863 +#: src/slic3r/GUI/FirmwareDialog.cpp:906 msgid "Cancelling..." -msgstr "" +msgstr "Скасування..." -#: src/slic3r/GUI/GLCanvas3D.cpp:709 -msgid "Detected object outside print volume" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:239 +msgid "Tool position" +msgstr "Позиція інструменту" -#: src/slic3r/GUI/GLCanvas3D.cpp:710 -msgid "Detected toolpath outside print volume" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:1016 +msgid "Generating toolpaths" +msgstr "Створення траєкторій" -#: src/slic3r/GUI/GLCanvas3D.cpp:711 -msgid "Some objects are not visible when editing supports" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:1405 +msgid "Generating vertex buffer" +msgstr "Створення буфера вершин" -#: src/slic3r/GUI/GLCanvas3D.cpp:713 -msgid "" -"Detected object outside print volume\n" -"Resolve a clash to continue slicing/export process correctly" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:1496 +msgid "Generating index buffers" +msgstr "Формування буферів індексів" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:35 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Rotate lower part upwards" -msgstr "Повернути нижню частину вгору" +#: src/slic3r/GUI/GCodeViewer.cpp:2225 +msgid "Click to hide" +msgstr "Клацніть, щоб сховати" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:198 -msgid "Perform cut" -msgstr "Виконати розріз" +#: src/slic3r/GUI/GCodeViewer.cpp:2225 +msgid "Click to show" +msgstr "Клацніть, щоб показати" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:43 -msgid "Cut object:" -msgstr "Розрізати об'єкт:" +#: src/slic3r/GUI/GCodeViewer.cpp:2337 +msgid "up to" +msgstr "аж до" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:88 -msgid "Cut [C]" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2343 +msgid "above" +msgstr "вище" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3006 -msgid "Cut" -msgstr "Розрізати" +#: src/slic3r/GUI/GCodeViewer.cpp:2351 +msgid "from" +msgstr "від" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:193 -msgid "Keep upper part" -msgstr "Залишити верхню частину" +#: src/slic3r/GUI/GCodeViewer.cpp:2351 +msgid "to" +msgstr "до" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep lower part" -msgstr "Залишити нижню частину" +#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387 +#: src/slic3r/GUI/GUI_Preview.cpp:214 src/slic3r/GUI/GUI_Preview.cpp:533 +#: src/slic3r/GUI/GUI_Preview.cpp:942 +msgid "Feature type" +msgstr "Тип ознаки" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:32 -msgid "Place on face [F]" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387 +#: src/slic3r/GUI/RammingChart.cpp:76 +msgid "Time" +msgstr "Час" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:51 -msgid "Move [M]" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2387 +msgid "Percentage" +msgstr "Процент" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:176 -msgid "Position (mm)" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2390 +msgid "Height (mm)" +msgstr "Висота (мм)" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:176 -msgid "Displacement (mm)" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2391 +msgid "Width (mm)" +msgstr "Ширина (мм)" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:458 -msgid "Rotate [R]" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2392 +msgid "Speed (mm/s)" +msgstr "Швидкість (мм/с)" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:491 -msgid "Rotation (deg)" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2393 +msgid "Fan Speed (%)" +msgstr "Швидкість вентилятора (%)" -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:51 -msgid "Scale [S]" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2394 +msgid "Volumetric flow rate (mm³/s)" +msgstr "Об'ємна швидкість потоку (мм³/с)" -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:276 -msgid "Scale (%)" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2395 src/slic3r/GUI/GUI_Preview.cpp:220 +#: src/slic3r/GUI/GUI_Preview.cpp:326 src/slic3r/GUI/GUI_Preview.cpp:471 +#: src/slic3r/GUI/GUI_Preview.cpp:532 src/slic3r/GUI/GUI_Preview.cpp:878 +#: src/slic3r/GUI/GUI_Preview.cpp:942 +msgid "Tool" +msgstr "Інструмент" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:597 -msgid "Left mouse click - add point" -msgstr "Ліва кнопка миші - додати точку" +#: src/slic3r/GUI/GCodeViewer.cpp:2396 src/slic3r/GUI/GUI_Preview.cpp:221 +#: src/slic3r/GUI/GUI_Preview.cpp:530 src/slic3r/GUI/GUI_Preview.cpp:941 +msgid "Color Print" +msgstr "Кольоровий друк" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:598 -msgid "Right mouse click - remove point" -msgstr "Права кнопка миші - видалити точку" +#: src/slic3r/GUI/GCodeViewer.cpp:2432 src/slic3r/GUI/GCodeViewer.cpp:2467 +#: src/slic3r/GUI/GCodeViewer.cpp:2472 src/slic3r/GUI/GUI_ObjectList.cpp:312 +#: src/slic3r/GUI/wxExtensions.cpp:519 src/libslic3r/PrintConfig.cpp:547 +msgid "Extruder" +msgstr "Екструдер" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:599 -msgid "Shift + Left (+ drag) - select point(s)" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2443 +msgid "Default color" +msgstr "Колір за замовчуванням" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:606 -msgid "Head diameter: " -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2467 +msgid "default color" +msgstr "колір за замовчуванням" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:618 -msgid "Lock supports under new islands" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2562 src/slic3r/GUI/GCodeViewer.cpp:2608 +msgid "Color change" +msgstr "Зміна кольору" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:622 -msgid "Remove selected points" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2581 src/slic3r/GUI/GCodeViewer.cpp:2606 +msgid "Print" +msgstr "Друк" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:679 -msgid "Remove all points" -msgstr "Видалити всі точки" +#: src/slic3r/GUI/GCodeViewer.cpp:2607 src/slic3r/GUI/GCodeViewer.cpp:2624 +msgid "Pause" +msgstr "Пауза" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631 -msgid "Apply changes" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615 +msgid "Event" +msgstr "Подія" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:636 -msgid "Discard changes" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615 +msgid "Remaining time" +msgstr "Час, що залишився" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:644 -msgid "Minimal points distance: " -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2615 +msgid "Duration" +msgstr "Тривалість" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:655 -msgid "Support points density: " -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2650 src/slic3r/GUI/GUI_Preview.cpp:1023 +#: src/libslic3r/PrintConfig.cpp:2380 +msgid "Travel" +msgstr "Пересування" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:669 -msgid "Auto-generate points [A]" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2653 +msgid "Movement" +msgstr "Переміщення" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:675 -msgid "Manual editing [M]" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2654 +msgid "Extrusion" +msgstr "Екструзія" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:738 -msgid "SLA Support Points [L]" -msgstr "Точки SLA підтримки [L]" +#: src/slic3r/GUI/GCodeViewer.cpp:2655 src/slic3r/GUI/Tab.cpp:1694 +#: src/slic3r/GUI/Tab.cpp:2582 +msgid "Retraction" +msgstr "Переривання" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:767 -msgid "Do you want to save your manually edited support points ?\n" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2672 src/slic3r/GUI/GCodeViewer.cpp:2675 +#: src/slic3r/GUI/GUI_Preview.cpp:1024 +msgid "Wipe" +msgstr "Витирання" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:768 -msgid "Save changes?" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2706 src/slic3r/GUI/GUI_Preview.cpp:248 +#: src/slic3r/GUI/GUI_Preview.cpp:262 +msgid "Options" +msgstr "Параметри" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 -msgid "" -"Autogeneration will erase all manually edited points.\n" -"\n" -"Are you sure you want to do it?\n" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2709 src/slic3r/GUI/GUI_Preview.cpp:1025 +msgid "Retractions" +msgstr "Переривання" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:899 src/slic3r/GUI/GUI.cpp:288 -#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 -msgid "Warning" -msgstr "Застереження" +#: src/slic3r/GUI/GCodeViewer.cpp:2710 src/slic3r/GUI/GUI_Preview.cpp:1026 +msgid "Deretractions" +msgstr "Зниження" -#: src/slic3r/GUI/GUI.cpp:147 src/slic3r/GUI/Tab.cpp:2720 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2711 src/slic3r/GUI/GUI_Preview.cpp:1027 +msgid "Tool changes" +msgstr "Зміна інструменту" -#: src/slic3r/GUI/GUI.cpp:148 -msgid "Please check and fix your object list." -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2712 src/slic3r/GUI/GUI_Preview.cpp:1028 +msgid "Color changes" +msgstr "Зміни кольору" -#: src/slic3r/GUI/GUI.cpp:149 src/slic3r/GUI/GUI_App.cpp:679 -#: src/slic3r/GUI/Tab.cpp:2722 -msgid "Attention!" -msgstr "Увага!" +#: src/slic3r/GUI/GCodeViewer.cpp:2713 src/slic3r/GUI/GUI_Preview.cpp:1029 +msgid "Print pauses" +msgstr "Паузи друку" -#: src/slic3r/GUI/GUI.cpp:282 -msgid "Notice" -msgstr "Зауваження" +#: src/slic3r/GUI/GCodeViewer.cpp:2714 src/slic3r/GUI/GUI_Preview.cpp:1030 +msgid "Custom G-codes" +msgstr "Користувацькі G-коди" -#: src/slic3r/GUI/GUI_App.cpp:318 -msgid "Changing of an application language" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2725 src/slic3r/GUI/GCodeViewer.cpp:2749 +#: src/slic3r/GUI/Plater.cpp:697 src/libslic3r/PrintConfig.cpp:117 +msgid "Printer" +msgstr "Принтер" -#: src/slic3r/GUI/GUI_App.cpp:326 src/slic3r/GUI/GUI_App.cpp:335 -msgid "Recreating" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2727 src/slic3r/GUI/GCodeViewer.cpp:2754 +#: src/slic3r/GUI/Plater.cpp:693 +msgid "Print settings" +msgstr "Параметри друку" -#: src/slic3r/GUI/GUI_App.cpp:339 -msgid "Loading of a current presets" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2730 src/slic3r/GUI/GCodeViewer.cpp:2760 +#: src/slic3r/GUI/Plater.cpp:694 src/slic3r/GUI/Tab.cpp:1794 +#: src/slic3r/GUI/Tab.cpp:1795 +msgid "Filament" +msgstr "Філамент" -#: src/slic3r/GUI/GUI_App.cpp:347 -msgid "Loading of a mode view" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2785 src/slic3r/GUI/GCodeViewer.cpp:2790 +#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1135 +#: src/slic3r/GUI/Plater.cpp:1220 +msgid "Estimated printing time" +msgstr "Приблизний час друку" -#: src/slic3r/GUI/GUI_App.cpp:429 -msgid "Choose one file (3MF):" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2785 +msgid "Normal mode" +msgstr "Нормальний режим" -#: src/slic3r/GUI/GUI_App.cpp:441 -msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "Виберіть один чи кілька файлів (STL/OBJ/AMF/PRUSA):" +#: src/slic3r/GUI/GCodeViewer.cpp:2790 +msgid "Stealth mode" +msgstr "Тихий режим" -#: src/slic3r/GUI/GUI_App.cpp:454 -msgid "Array of language names and identifiers should have the same size." -msgstr "Масив імен мов та їх ідентифікаторів має бути однакового розміру." +#: src/slic3r/GUI/GCodeViewer.cpp:2817 +msgid "Show stealth mode" +msgstr "Показати тихий режим" -#: src/slic3r/GUI/GUI_App.cpp:464 -msgid "Select the language" -msgstr "Оберіть мову" +#: src/slic3r/GUI/GCodeViewer.cpp:2821 +msgid "Show normal mode" +msgstr "Показати нормальний режим" -#: src/slic3r/GUI/GUI_App.cpp:464 -msgid "Language" -msgstr "Мова" +#: src/slic3r/GUI/GLCanvas3D.cpp:236 src/slic3r/GUI/GLCanvas3D.cpp:4610 +msgid "Variable layer height" +msgstr "Змінна висота шарів" -#: src/slic3r/GUI/GUI_App.cpp:534 src/slic3r/GUI/GUI_ObjectList.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:298 -msgid "Default" -msgstr "За замовчуванням" +#: src/slic3r/GUI/GLCanvas3D.cpp:238 +msgid "Left mouse button:" +msgstr "Ліва кнопка миші:" -#: src/slic3r/GUI/GUI_App.cpp:603 -msgid "&Configuration Snapshots" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:240 +msgid "Add detail" +msgstr "Додати деталь" -#: src/slic3r/GUI/GUI_App.cpp:603 -msgid "Inspect / activate configuration snapshots" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:242 +msgid "Right mouse button:" +msgstr "Права кнопка миші:" -#: src/slic3r/GUI/GUI_App.cpp:604 -msgid "Take Configuration &Snapshot" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:244 +msgid "Remove detail" +msgstr "Видалити деталь" -#: src/slic3r/GUI/GUI_App.cpp:604 -msgid "Capture a configuration snapshot" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:246 +msgid "Shift + Left mouse button:" +msgstr "Shift + Ліва кнопка миші:" -#: src/slic3r/GUI/GUI_App.cpp:607 -msgid "&Preferences" -msgstr "&Преференції" +#: src/slic3r/GUI/GLCanvas3D.cpp:248 +msgid "Reset to base" +msgstr "Скинути до базової висоти шару" -#: src/slic3r/GUI/GUI_App.cpp:613 -msgid "Application preferences" -msgstr "Преференції застосування" +#: src/slic3r/GUI/GLCanvas3D.cpp:250 +msgid "Shift + Right mouse button:" +msgstr "Shift + Права кнопка миші:" -#: src/slic3r/GUI/GUI_App.cpp:616 src/slic3r/GUI/wxExtensions.cpp:2446 -msgid "Simple" -msgstr "Простий" +#: src/slic3r/GUI/GLCanvas3D.cpp:252 +msgid "Smoothing" +msgstr "Згладжування" -#: src/slic3r/GUI/GUI_App.cpp:616 -msgid "Simple View Mode" -msgstr "Простий режим перегляду" +#: src/slic3r/GUI/GLCanvas3D.cpp:254 +msgid "Mouse wheel:" +msgstr "Колесо миші:" -#: src/slic3r/GUI/GUI_App.cpp:617 src/slic3r/GUI/GUI_ObjectList.cpp:73 -#: src/slic3r/GUI/Tab.cpp:977 src/slic3r/GUI/Tab.cpp:992 -#: src/slic3r/GUI/Tab.cpp:1090 src/slic3r/GUI/Tab.cpp:1093 -#: src/slic3r/GUI/Tab.cpp:1466 src/slic3r/GUI/Tab.cpp:1890 -#: src/slic3r/GUI/Tab.cpp:3347 src/slic3r/GUI/wxExtensions.cpp:2447 -#: src/libslic3r/PrintConfig.cpp:72 src/libslic3r/PrintConfig.cpp:186 -#: src/libslic3r/PrintConfig.cpp:349 src/libslic3r/PrintConfig.cpp:987 -#: src/libslic3r/PrintConfig.cpp:2173 -msgid "Advanced" -msgstr "Розширений" +#: src/slic3r/GUI/GLCanvas3D.cpp:256 +msgid "Increase/decrease edit area" +msgstr "Збільшити/зменшити області редагування" -#: src/slic3r/GUI/GUI_App.cpp:617 -msgid "Advanced View Mode" -msgstr "Розширений режим перегляду" +#: src/slic3r/GUI/GLCanvas3D.cpp:259 +msgid "Adaptive" +msgstr "Адаптивний" -#: src/slic3r/GUI/GUI_App.cpp:618 src/slic3r/GUI/wxExtensions.cpp:2448 -msgid "Expert" -msgstr "Експерт" +#: src/slic3r/GUI/GLCanvas3D.cpp:265 +msgid "Quality / Speed" +msgstr "Якість / Швидкість" -#: src/slic3r/GUI/GUI_App.cpp:618 -msgid "Expert View Mode" -msgstr "Режим перегляду Експерт" +#: src/slic3r/GUI/GLCanvas3D.cpp:268 +msgid "Higher print quality versus higher print speed." +msgstr "Вища якість друку порівняно з вищою швидкістю друку." -#: src/slic3r/GUI/GUI_App.cpp:623 -msgid "Mode" -msgstr "Режим" +#: src/slic3r/GUI/GLCanvas3D.cpp:279 +msgid "Smooth" +msgstr "Згладити" -#: src/slic3r/GUI/GUI_App.cpp:623 -msgid "Slic3r View Mode" -msgstr "Режим перегляду Slic3r'у" +#: src/slic3r/GUI/GLCanvas3D.cpp:285 src/libslic3r/PrintConfig.cpp:571 +msgid "Radius" +msgstr "Радіус" -#: src/slic3r/GUI/GUI_App.cpp:625 -msgid "Change Application &Language" -msgstr "Змінити &мову застосування" +#: src/slic3r/GUI/GLCanvas3D.cpp:295 +msgid "Keep min" +msgstr "Залишити мін" -#: src/slic3r/GUI/GUI_App.cpp:627 -msgid "Flash printer &firmware" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:304 src/slic3r/GUI/GLCanvas3D.cpp:4050 +msgid "Reset" +msgstr "Скинути" -#: src/slic3r/GUI/GUI_App.cpp:627 -msgid "Upload a firmware image into an Arduino based printer" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:566 +msgid "Variable layer height - Manual edit" +msgstr "Змінна висота шарів - Ручне редагування" -#: src/slic3r/GUI/GUI_App.cpp:639 -msgid "Taking configuration snapshot" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:634 +msgid "An object outside the print area was detected." +msgstr "Виявлено об'єкт за межами області друку." -#: src/slic3r/GUI/GUI_App.cpp:639 -msgid "Snapshot name" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:635 +msgid "A toolpath outside the print area was detected." +msgstr "Виявлено траєкторію за межами області друку." -#: src/slic3r/GUI/GUI_App.cpp:676 -msgid "Application will be restarted after language change." -msgstr "Застосування буде перезапущене після зміни мови." +#: src/slic3r/GUI/GLCanvas3D.cpp:636 +msgid "SLA supports outside the print area were detected." +msgstr "Виявлено SLA-підтримки за межами області друку." -#: src/slic3r/GUI/GUI_App.cpp:677 -msgid "3D-Scene will be cleaned." -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:637 +msgid "Some objects are not visible." +msgstr "Деякі об'єкти не видно." -#: src/slic3r/GUI/GUI_App.cpp:678 -msgid "Please, check your changes before." +#: src/slic3r/GUI/GLCanvas3D.cpp:639 +msgid "" +"An object outside the print area was detected.\n" +"Resolve the current problem to continue slicing." msgstr "" +"Виявлено об’єкт за межами області друку.\n" +"Вирішіть поточну проблему, щоб продовжувати нарізання." -#: src/slic3r/GUI/GUI_App.cpp:706 -msgid "&Configuration" -msgstr "&Конфігурація" +#: src/slic3r/GUI/GLCanvas3D.cpp:949 +msgid "Seq." +msgstr "Послід." -#: src/slic3r/GUI/GUI_App.cpp:726 -msgid "You have unsaved changes " -msgstr "У вас є незбережені зміни " - -#: src/slic3r/GUI/GUI_App.cpp:726 -msgid ". Discard changes and continue anyway?" -msgstr ". Відхилити зміни і продовжити в будь-якому випадку?" - -#: src/slic3r/GUI/GUI_App.cpp:727 -msgid "Unsaved Presets" -msgstr "Незбереженні налаштування" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:28 src/slic3r/GUI/GUI_ObjectList.cpp:65 -#: src/libslic3r/PrintConfig.cpp:56 src/libslic3r/PrintConfig.cpp:149 -#: src/libslic3r/PrintConfig.cpp:380 src/libslic3r/PrintConfig.cpp:437 -#: src/libslic3r/PrintConfig.cpp:445 src/libslic3r/PrintConfig.cpp:841 -#: src/libslic3r/PrintConfig.cpp:1025 src/libslic3r/PrintConfig.cpp:1304 -#: src/libslic3r/PrintConfig.cpp:1370 src/libslic3r/PrintConfig.cpp:1551 -#: src/libslic3r/PrintConfig.cpp:1986 src/libslic3r/PrintConfig.cpp:2042 -msgid "Layers and Perimeters" -msgstr "Шари та периметри" +#: src/slic3r/GUI/GLCanvas3D.cpp:1455 +msgid "Variable layer height - Reset" +msgstr "Змінна висота шарів - Скасувати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:29 src/slic3r/GUI/GUI_ObjectList.cpp:66 -#: src/slic3r/GUI/Plater.cpp:431 src/slic3r/GUI/Tab.cpp:981 -#: src/slic3r/GUI/Tab.cpp:982 src/slic3r/GUI/Tab.cpp:1311 -#: src/libslic3r/PrintConfig.cpp:166 src/libslic3r/PrintConfig.cpp:388 -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:742 -#: src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:932 -#: src/libslic3r/PrintConfig.cpp:942 src/libslic3r/PrintConfig.cpp:960 -#: src/libslic3r/PrintConfig.cpp:978 src/libslic3r/PrintConfig.cpp:997 -#: src/libslic3r/PrintConfig.cpp:1658 src/libslic3r/PrintConfig.cpp:1675 -msgid "Infill" -msgstr "Заповнення" +#: src/slic3r/GUI/GLCanvas3D.cpp:1463 +msgid "Variable layer height - Adaptive" +msgstr "Змінна висота шарів - Адаптивний" -#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:67 -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1010 -#: src/slic3r/GUI/Tab.cpp:1011 src/libslic3r/PrintConfig.cpp:333 -#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1779 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1815 -#: src/libslic3r/PrintConfig.cpp:1823 src/libslic3r/PrintConfig.cpp:1838 -#: src/libslic3r/PrintConfig.cpp:1859 src/libslic3r/PrintConfig.cpp:1870 -#: src/libslic3r/PrintConfig.cpp:1886 src/libslic3r/PrintConfig.cpp:1895 -#: src/libslic3r/PrintConfig.cpp:1904 src/libslic3r/PrintConfig.cpp:1915 -#: src/libslic3r/PrintConfig.cpp:1929 src/libslic3r/PrintConfig.cpp:1937 -#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1947 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:1969 -#: src/libslic3r/GCode/PreviewData.cpp:172 -msgid "Support material" -msgstr "Підтримка" +#: src/slic3r/GUI/GLCanvas3D.cpp:1471 +msgid "Variable layer height - Smooth all" +msgstr "Змінна висота шарів - Згладити все" -#: src/slic3r/GUI/GUI_ObjectList.cpp:33 src/slic3r/GUI/GUI_ObjectList.cpp:69 -#: src/slic3r/GUI/Tab.cpp:1070 src/slic3r/GUI/Tab.cpp:1794 -#: src/libslic3r/PrintConfig.cpp:455 src/libslic3r/PrintConfig.cpp:953 -#: src/libslic3r/PrintConfig.cpp:1339 src/libslic3r/PrintConfig.cpp:1667 -#: src/libslic3r/PrintConfig.cpp:1851 src/libslic3r/PrintConfig.cpp:1877 -#: src/libslic3r/PrintConfig.cpp:2149 src/libslic3r/PrintConfig.cpp:2157 -msgid "Extruders" -msgstr "Екструдери" +#: src/slic3r/GUI/GLCanvas3D.cpp:1876 +msgid "Mirror Object" +msgstr "Віддзеркалити об'єкт" -#: src/slic3r/GUI/GUI_ObjectList.cpp:39 -msgid "Pad and Support" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:2746 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520 +msgid "Gizmo-Move" +msgstr "Gizmo переміщення" -#: src/slic3r/GUI/GUI_ObjectList.cpp:68 src/slic3r/GUI/GUI_Preview.cpp:215 -#: src/slic3r/GUI/Tab.cpp:1035 src/libslic3r/PrintConfig.cpp:198 -#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:870 -#: src/libslic3r/PrintConfig.cpp:998 src/libslic3r/PrintConfig.cpp:1360 -#: src/libslic3r/PrintConfig.cpp:1597 src/libslic3r/PrintConfig.cpp:1646 -#: src/libslic3r/PrintConfig.cpp:1697 src/libslic3r/PrintConfig.cpp:2028 -msgid "Speed" -msgstr "Швидкість" +#: src/slic3r/GUI/GLCanvas3D.cpp:2832 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522 +msgid "Gizmo-Rotate" +msgstr "Gizmo обертання" -#: src/slic3r/GUI/GUI_ObjectList.cpp:70 src/libslic3r/PrintConfig.cpp:415 -#: src/libslic3r/PrintConfig.cpp:522 src/libslic3r/PrintConfig.cpp:829 -#: src/libslic3r/PrintConfig.cpp:961 src/libslic3r/PrintConfig.cpp:1348 -#: src/libslic3r/PrintConfig.cpp:1687 src/libslic3r/PrintConfig.cpp:1860 -#: src/libslic3r/PrintConfig.cpp:2017 -msgid "Extrusion Width" -msgstr "Ширина екструзії" +#: src/slic3r/GUI/GLCanvas3D.cpp:3388 +msgid "Move Object" +msgstr "Перемістити об'єкт" -#: src/slic3r/GUI/GUI_ObjectList.cpp:75 src/slic3r/GUI/Plater.cpp:410 -#: src/slic3r/GUI/Tab.cpp:3309 src/slic3r/GUI/Tab.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:2359 src/libslic3r/PrintConfig.cpp:2366 -#: src/libslic3r/PrintConfig.cpp:2375 src/libslic3r/PrintConfig.cpp:2384 -#: src/libslic3r/PrintConfig.cpp:2394 src/libslic3r/PrintConfig.cpp:2420 -#: src/libslic3r/PrintConfig.cpp:2427 src/libslic3r/PrintConfig.cpp:2438 -#: src/libslic3r/PrintConfig.cpp:2448 src/libslic3r/PrintConfig.cpp:2457 -#: src/libslic3r/PrintConfig.cpp:2467 src/libslic3r/PrintConfig.cpp:2476 -#: src/libslic3r/PrintConfig.cpp:2486 src/libslic3r/PrintConfig.cpp:2496 -#: src/libslic3r/PrintConfig.cpp:2504 -msgid "Supports" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3858 src/slic3r/GUI/GLCanvas3D.cpp:4571 +msgid "Switch to Settings" +msgstr "Перейдіть до налаштувань" -#: src/slic3r/GUI/GUI_ObjectList.cpp:76 src/slic3r/GUI/Tab.cpp:3337 -#: src/slic3r/GUI/Tab.cpp:3338 src/libslic3r/PrintConfig.cpp:2512 -#: src/libslic3r/PrintConfig.cpp:2519 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:2553 -#: src/libslic3r/PrintConfig.cpp:2562 -msgid "Pad" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3859 src/slic3r/GUI/GLCanvas3D.cpp:4571 +msgid "Print Settings Tab" +msgstr "Вкладка параметрів друку" -#: src/slic3r/GUI/GUI_ObjectList.cpp:173 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:45 -msgid "Name" -msgstr "Ім'я" +#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572 +msgid "Filament Settings Tab" +msgstr "Вкладка параметрів філаменту" -#: src/slic3r/GUI/GUI_ObjectList.cpp:201 -msgid "Right button click the icon to change the object settings" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572 +msgid "Material Settings Tab" +msgstr "Вкладка параметрів матеріалу" -#: src/slic3r/GUI/GUI_ObjectList.cpp:209 -#, c-format -msgid "Auto-repaired (%d errors):\n" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3861 src/slic3r/GUI/GLCanvas3D.cpp:4573 +msgid "Printer Settings Tab" +msgstr "Вкладка параметрів принтеру" -#: src/slic3r/GUI/GUI_ObjectList.cpp:212 -msgid "degenerate facets" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3909 +msgid "Undo History" +msgstr "Скасувати історію" -#: src/slic3r/GUI/GUI_ObjectList.cpp:213 -msgid "edges fixed" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3909 +msgid "Redo History" +msgstr "Повторити історію" -#: src/slic3r/GUI/GUI_ObjectList.cpp:214 -msgid "facets removed" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3930 +#, c-format +msgid "Undo %1$d Action" +msgid_plural "Undo %1$d Actions" +msgstr[0] "Скасувати %1$d дію" +msgstr[1] "Скасувати %1$d дії" +msgstr[2] "Скасувати %1$d дій" -#: src/slic3r/GUI/GUI_ObjectList.cpp:215 -msgid "facets added" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3930 +#, c-format +msgid "Redo %1$d Action" +msgid_plural "Redo %1$d Actions" +msgstr[0] "Повторити %1$d дію" +msgstr[1] "Повторити %1$d дії" +msgstr[2] "Повторити %1$d дій" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3950 src/slic3r/GUI/GLCanvas3D.cpp:4589 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 src/slic3r/GUI/Search.cpp:351 +msgid "Search" +msgstr "Пошук" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3964 src/slic3r/GUI/GLCanvas3D.cpp:3972 +#: src/slic3r/GUI/Search.cpp:358 +msgid "Enter a search term" +msgstr "Введіть пошуковий термін" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4003 +msgid "Arrange options" +msgstr "Параметри розташування" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4033 +msgid "Press %1%left mouse button to enter the exact value" +msgstr "Натисніть %1%ліву кнопку миші, щоб ввести точне значення" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4035 +msgid "Spacing" +msgstr "Відстань" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4042 +msgid "Enable rotations (slow)" +msgstr "Увімкнути обертання (повільно)" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4060 src/slic3r/GUI/GLCanvas3D.cpp:4481 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Plater.cpp:1648 +msgid "Arrange" +msgstr "Розташувати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:216 -msgid "facets reversed" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4455 +msgid "Add..." +msgstr "Додати..." -#: src/slic3r/GUI/GUI_ObjectList.cpp:217 -msgid "backwards edges" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4463 src/slic3r/GUI/GUI_ObjectList.cpp:1878 +#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022 +#: src/slic3r/GUI/Tab.cpp:3484 +msgid "Delete" +msgstr "Видалити" -#: src/slic3r/GUI/GUI_ObjectList.cpp:231 -msgid "Right button click the icon to fix STL through Netfabb" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4472 src/slic3r/GUI/KBShortcutsDialog.cpp:88 +#: src/slic3r/GUI/Plater.cpp:5107 +msgid "Delete all" +msgstr "Видалити все" -#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:454 -msgid "Extruder" -msgstr "Екструдер" +#: src/slic3r/GUI/GLCanvas3D.cpp:4481 src/slic3r/GUI/KBShortcutsDialog.cpp:121 +msgid "Arrange selection" +msgstr "Розташувати вибране" -#: src/slic3r/GUI/GUI_ObjectList.cpp:683 src/slic3r/GUI/GUI_ObjectList.cpp:963 -#: src/slic3r/GUI/GUI_ObjectList.cpp:969 src/slic3r/GUI/GUI_ObjectList.cpp:1199 -#, c-format -msgid "Quick Add Settings (%s)" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4481 +msgid "Click right mouse button to show arrangement options" +msgstr "Клацніть правою кнопкою миші, щоб показати параметри розташування" -#: src/slic3r/GUI/GUI_ObjectList.cpp:746 -msgid "Select showing settings" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4503 +msgid "Copy" +msgstr "Копіювати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:874 -msgid "Load" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4512 +msgid "Paste" +msgstr "Вставити" -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 src/slic3r/GUI/GUI_ObjectList.cpp:911 -#: src/slic3r/GUI/GUI_ObjectList.cpp:914 -msgid "Box" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4524 src/slic3r/GUI/Plater.cpp:3857 +#: src/slic3r/GUI/Plater.cpp:3869 src/slic3r/GUI/Plater.cpp:4007 +msgid "Add instance" +msgstr "Додати екземпляр" -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 -msgid "Cylinder" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4535 src/slic3r/GUI/Plater.cpp:4009 +msgid "Remove instance" +msgstr "Видалити екземпляр" -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 -msgid "Sphere" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4548 +msgid "Split to objects" +msgstr "Розділити на об'єкти" -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 -msgid "Slab" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4558 src/slic3r/GUI/GUI_ObjectList.cpp:1650 +msgid "Split to parts" +msgstr "Розділити на частини" -#: src/slic3r/GUI/GUI_ObjectList.cpp:890 src/slic3r/GUI/GUI_ObjectList.cpp:906 -msgid "Add part" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/MainFrame.cpp:1125 +msgid "Undo" +msgstr "Скасувати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:891 -msgid "Add modifier" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/GLCanvas3D.cpp:4699 +msgid "Click right mouse button to open/close History" +msgstr "Клацніть правою кнопкою миші, щоб відкрити/закрити історію" -#: src/slic3r/GUI/GUI_ObjectList.cpp:892 src/slic3r/GUI/GUI_ObjectList.cpp:910 -msgid "Add support enforcer" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4683 +msgid "Next Undo action: %1%" +msgstr "Скасувати дію: %1%" -#: src/slic3r/GUI/GUI_ObjectList.cpp:893 src/slic3r/GUI/GUI_ObjectList.cpp:913 -msgid "Add support blocker" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:90 +#: src/slic3r/GUI/MainFrame.cpp:1128 +msgid "Redo" +msgstr "Повторити" -#: src/slic3r/GUI/GUI_ObjectList.cpp:934 -msgid "Split to parts" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 +msgid "Next Redo action: %1%" +msgstr "Повторити дію: %1%" -#: src/slic3r/GUI/GUI_ObjectList.cpp:942 -msgid "Add settings" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:6345 +msgid "Selection-Add from rectangle" +msgstr "Виділення - Додано прямокутником" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1009 -msgid "Change type" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:6364 +msgid "Selection-Remove from rectangle" +msgstr "Виділення - Видалено прямокутником" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1016 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1153 -msgid "Set as a Separated Object" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 src/libslic3r/PrintConfig.cpp:3690 +msgid "Cut" +msgstr "Розрізати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1024 -msgid "Rename" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 +msgid "in" +msgstr "дюйм" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1034 -msgid "Fix through the Netfabb" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:185 +msgid "Keep upper part" +msgstr "Залишити верхню частину" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1041 src/slic3r/GUI/Plater.cpp:2861 -msgid "Export as STL" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:186 +msgid "Keep lower part" +msgstr "Залишити нижню частину" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1048 -msgid "Change extruder" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:187 +msgid "Rotate lower part upwards" +msgstr "Повернути нижню частину вгору" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1073 -msgid "Select new extruder for the object/part" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:192 +msgid "Perform cut" +msgstr "Виконати розріз" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1079 src/slic3r/GUI/Plater.cpp:2825 -#: src/slic3r/GUI/Plater.cpp:2843 src/slic3r/GUI/Tab.cpp:2860 -msgid "Delete" -msgstr "Видалити" +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 +msgid "Paint-on supports" +msgstr "Малювання підтримок" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 +msgid "Clipping of view" +msgstr "Відсікання площиною" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 +msgid "Reset direction" +msgstr "Скинути напрямок" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:27 +msgid "Brush size" +msgstr "Розмір пензля" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28 +msgid "Brush shape" +msgstr "Форма пензля" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:29 +msgid "Left mouse button" +msgstr "Ліва кнопка миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "Enforce supports" +msgstr "Забезпечити підтримки" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 +msgid "Right mouse button" +msgstr "Права кнопка миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:373 +msgid "Block supports" +msgstr "Блокувати підтрики" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 +msgid "Shift + Left mouse button" +msgstr "Shift + Ліва кнопка миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:368 +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:378 +msgid "Remove selection" +msgstr "Видалити виділене" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 +msgid "Remove all selection" +msgstr "Видалити все, що виділено" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 +msgid "Circle" +msgstr "Коло" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 +msgid "Sphere" +msgstr "Сфера" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:129 +msgid "Autoset by angle" +msgstr "Автоматичне встановлення під кутом" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118 +msgid "Reset selection" +msgstr "Скинути вибір" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:160 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 +msgid "Alt + Mouse wheel" +msgstr "Alt + Колесо миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:178 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:159 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "Малює всі грані всередині, незалежно від їх орієнтації." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:192 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:173 +msgid "Ignores facets facing away from the camera." +msgstr "Ігнорує грані, відвернуті від камери." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:203 +msgid "Ctrl + Mouse wheel" +msgstr "Ctrl + Колесо миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233 +msgid "Autoset custom supports" +msgstr "Автоматичне встановлення власних підтримок" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235 +msgid "Threshold:" +msgstr "Порог нависання:" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +msgid "Enforce" +msgstr "Забезпечити" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245 +msgid "Block" +msgstr "Блокувати" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:295 +msgid "Block supports by angle" +msgstr "Блокувати підтрики під кутом" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:296 +msgid "Add supports by angle" +msgstr "Додати підтримки під кутом" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Place on face" +msgstr "Поверхнею на стіл" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +msgid "Hollow this object" +msgstr "Випорожнити цей об'єкт" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 +msgid "Preview hollowed and drilled model" +msgstr "Попередній перегляд порожнистої та просвердленої моделі" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +msgid "Offset" +msgstr "Зміщення" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:56 +msgid "Quality" +msgstr "Якість" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +#: src/libslic3r/PrintConfig.cpp:3183 +msgid "Closing distance" +msgstr "Відстань закриття" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +msgid "Hole diameter" +msgstr "Діаметр отвору" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +msgid "Hole depth" +msgstr "Глибина отвору" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +msgid "Remove selected holes" +msgstr "Видалити вибрані отвори" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +msgid "Remove all holes" +msgstr "Видалити всі отвори" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 +msgid "Show supports" +msgstr "Показувати підтримки" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308 +msgid "Add drainage hole" +msgstr "Додати дренажний отвір" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424 +msgid "Delete drainage hole" +msgstr "Видалити дренажний отвір" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624 +msgid "Hollowing parameter change" +msgstr "Зміна параметру порожнистості" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693 +msgid "Change drainage hole diameter" +msgstr "Змініть діаметр дренажного отвору" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785 +msgid "Hollow and drill" +msgstr "Порожнистість та свердління" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835 +msgid "Move drainage hole" +msgstr "Перемістити дренажний отвір" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64 +msgid "Move" +msgstr "Пересунути" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:461 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 +#: src/libslic3r/PrintConfig.cpp:3739 +msgid "Rotate" +msgstr "Обертати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1153 -msgid "Set as a Separated Objects" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 +#: src/libslic3r/PrintConfig.cpp:3754 +msgid "Scale" +msgstr "Масштаб" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1374 -msgid "Generic" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30 +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381 +msgid "Enforce seam" +msgstr "Забезпечити шов" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1516 -msgid "You can't delete the last solid part from object." -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383 +msgid "Block seam" +msgstr "Блокувати шов" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1533 -msgid "You can't delete the last intance from object." -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46 +msgid "Seam painting" +msgstr "Малювання шва" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1560 src/slic3r/GUI/Plater.cpp:2219 -msgid "" -"The selected object couldn't be split because it contains only one part." -msgstr "" -"Вибраний об'єкт не можна розділити, оскільки він містить лише одну частину." +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 +msgid "Head diameter" +msgstr "Діаметр головки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1676 -msgid "Group manipulation" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +msgid "Lock supports under new islands" +msgstr "Зафіксувати підтримки під новими островами" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1688 -msgid "Object manipulation" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +msgid "Remove selected points" +msgstr "Видалити вибрані точки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1698 -msgid "Object Settings to modify" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +msgid "Remove all points" +msgstr "Видалити всі точки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1702 -msgid "Part Settings to modify" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +msgid "Apply changes" +msgstr "Застосувати зміни" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1711 -msgid "Part manipulation" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +msgid "Discard changes" +msgstr "Відхилити зміни" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1717 -msgid "Instance manipulation" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +msgid "Minimal points distance" +msgstr "Мінімальна відстань точок" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2240 -msgid "Object or Instance" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 +#: src/libslic3r/PrintConfig.cpp:3013 +msgid "Support points density" +msgstr "Щільність точок підтримки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2240 -msgid "Part" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +msgid "Auto-generate points" +msgstr "Генерувати точки автоматично" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2242 -msgid "Unsupported selection" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 +msgid "Manual editing" +msgstr "Ручне редагування" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2243 -#, c-format -msgid "You started your selection with %s Item." -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374 +msgid "Add support point" +msgstr "Додати точку підтримки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2244 -#, c-format -msgid "In this mode you can select only other %s Items%s" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514 +msgid "Delete support point" +msgstr "Видалити точку підтримки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2247 -msgid "of a current Object" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694 +msgid "Change point head diameter" +msgstr "Змінити діаметр головки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2252 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2325 src/slic3r/GUI/Plater.cpp:117 -msgid "Info" -msgstr "Інфо" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762 +msgid "Support parameter change" +msgstr "Зміна параметрів підтримки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2366 -msgid "You can't change a type of the last solid part of the object." -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 +msgid "SLA Support Points" +msgstr "Точки SLA-підтримки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2373 -msgid "Select type of part" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +msgid "SLA gizmo turned on" +msgstr "Ввімкнути SLA гізмо" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2538 -msgid "Enter new name" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911 +msgid "Do you want to save your manually edited support points?" +msgstr "Ви хочете зберегти відредаговані вручну точки підтримки?" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2538 -msgid "Renaming" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912 +msgid "Save changes?" +msgstr "Зберегти зміни?" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2554 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2632 src/slic3r/GUI/Tab.cpp:3191 -#: src/slic3r/GUI/Tab.cpp:3195 -msgid "The supplied name is not valid;" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924 +msgid "SLA gizmo turned off" +msgstr "Вимкнути SLA гізмо" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2555 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2633 src/slic3r/GUI/Tab.cpp:3192 -msgid "the following characters are not allowed:" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955 +msgid "Move support point" +msgstr "Перемістити точку підтримки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2653 -msgid "Set extruder for selected items" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048 +msgid "Support points edit" +msgstr "Редагування точок підтримки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2654 -msgid "Select extruder number for selected objects and/or parts" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127 +msgid "Autogeneration will erase all manually edited points." +msgstr "Автогенерація видалить всі відредаговані вручну точки." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2667 -msgid "Select extruder number:" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128 +msgid "Are you sure you want to do it?" +msgstr "Ви впевнені, що хочете це зробити?" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2668 -msgid "This extruder will be set for selected items" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:557 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:581 +#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366 +msgid "Warning" +msgstr "Застереження" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:25 -msgid "Object Manipulation" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134 +msgid "Autogenerate support points" +msgstr "Автогенерувати точки підтримки" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:47 -msgid "Object name" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181 +msgid "SLA gizmo keyboard shortcuts" +msgstr "Комбінації клавіш для SLA гізма" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:115 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:160 -msgid "Position" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192 +msgid "Note: some shortcuts work in (non)editing mode only." +msgstr "Примітка: деякі скорочення працюють лише в режимі (не)редагування." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:116 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161 -msgid "Rotation" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 +msgid "Left click" +msgstr "Ліва кнопка миші" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:117 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 -#: src/libslic3r/PrintConfig.cpp:3070 -msgid "Scale" -msgstr "Масштаб" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 +msgid "Add point" +msgstr "Додати точку" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:162 -msgid "Scale factors" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 +msgid "Right click" +msgstr "Клік на праву кнопку миші" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:200 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:220 -#: src/libslic3r/PrintConfig.cpp:3055 -msgid "Rotate" -msgstr "Повернути" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 +msgid "Remove point" +msgstr "Видалити точку" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:219 -msgid "Translate" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +msgid "Drag" +msgstr "Перетягування" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 -msgid "Additional Settings" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 +msgid "Move point" +msgstr "Перемістити точку" -#: src/slic3r/GUI/GUI_Preview.cpp:209 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 +msgid "Add point to selection" +msgstr "Додати точку до виділення" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 +msgid "Remove point from selection" +msgstr "Видалити точку з виділення" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +msgid "Select by rectangle" +msgstr "Виділення прямокутником" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +msgid "Deselect by rectangle" +msgstr "Скасування вибору прямокутником" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +msgid "Select all points" +msgstr "Виділити усі точки" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +msgid "Mouse wheel" +msgstr "Колесо миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +msgid "Move clipping plane" +msgstr "Перемістити площину відсікання" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +msgid "Reset clipping plane" +msgstr "Скинути площину відсікання" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +msgid "Switch to editing mode" +msgstr "Перейти в режим редагування" + +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521 +msgid "Gizmo-Scale" +msgstr "Gizmo масштабування" + +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:630 +msgid "Gizmo-Place on Face" +msgstr "Gizmo \"Поверхнею на стіл\"" + +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39 +msgid "Entering Paint-on supports" +msgstr "Увійти до режиму малювання підтримок" + +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40 +msgid "Entering Seam painting" +msgstr "Увійти до режиму малювання шву" + +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47 +msgid "Leaving Seam painting" +msgstr "Вийти з режиму малювання шву" + +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48 +msgid "Leaving Paint-on supports" +msgstr "Вийти з режиму малювання підтримок" + +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371 +msgid "Add supports" +msgstr "Додати підтримки" + +#: src/slic3r/GUI/GUI_App.cpp:239 +msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." +msgstr "заснований на Slic3r від Alessandro Ranellucci та спільноти RepRap." + +#: src/slic3r/GUI/GUI_App.cpp:241 +msgid "" +"Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " +"Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." +msgstr "" +"Розробки від Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr " +"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik та багатьох " +"інших." + +#: src/slic3r/GUI/GUI_App.cpp:242 +msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles" +msgstr "Модель ілюстрації виконано Nora Al-Badri та Jan Nikolai Nelles" + +#: src/slic3r/GUI/GUI_App.cpp:382 +msgid "" +"Starting with %1% 2.3, configuration directory on Linux has changed " +"(according to XDG Base Directory Specification) to \n" +"%2%.\n" +"\n" +"This directory did not exist yet (maybe you run the new version for the " +"first time).\n" +"However, an old %1% configuration directory was detected in \n" +"%3%.\n" +"\n" +"Consider moving the contents of the old directory to the new location in " +"order to access your profiles, etc.\n" +"Note that if you decide to downgrade %1% in future, it will use the old " +"location again.\n" +"\n" +"What do you want to do now?" +msgstr "" +"Починаючи з %1% 2.3, каталог конфігурації в Linux змінився (відповідно до " +"специфікації базового каталогу XDG) на\n" +"%2%.\n" +"\n" +"Цей каталог ще не існував (можливо, ви запускаєте нову версію вперше).\n" +"Однак у %3% був виявлений старий каталог конфігурації %1%.\n" +"\n" +"Подумайте про переміщення вмісту старого каталогу в нове місце, щоб отримати " +"доступ до ваших профілів тощо.\n" +"Зверніть увагу, що якщо ви вирішите знизити версію %1% у майбутньому, він " +"знову використовуватиме старе місце.\n" +"\n" +"Що ви хочете робити зараз?" + +#: src/slic3r/GUI/GUI_App.cpp:390 +#, c-format +msgid "%s - BREAKING CHANGE" +msgstr "%s - ЗЛАМАНА ЗМІНА" + +#: src/slic3r/GUI/GUI_App.cpp:392 +msgid "Quit, I will move my data now" +msgstr "Вийти, я зараз перенесу свої дані" + +#: src/slic3r/GUI/GUI_App.cpp:392 +msgid "Start the application" +msgstr "Запустити програму" + +#: src/slic3r/GUI/GUI_App.cpp:580 +#, 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 виявив помилку. Ймовірно, це було пов’язано з закінченням пам’яті. Якщо " +"ви впевнені, що у вашій системі достатньо оперативної пам'яті, це також може " +"бути помилкою, і ми будемо раді, якщо ви нам про це повідомите.\n" +"\n" +"Тепер застосування буде припинено." + +#: src/slic3r/GUI/GUI_App.cpp:583 +msgid "Fatal error" +msgstr "Критична помилка" + +#: src/slic3r/GUI/GUI_App.cpp:587 +msgid "" +"PrusaSlicer has encountered a localization error. Please report to " +"PrusaSlicer team, what language was active and in which scenario this issue " +"happened. Thank you.\n" +"\n" +"The application will now terminate." +msgstr "" +"Виникла помилка локалізації. Будь ласка, повідомте команді PrusaSlicer, яка " +"мова була активною та за якого сценарію сталася ця проблема. Дякую.\n" +"\n" +"Тепер застосування буде припинено." + +#: src/slic3r/GUI/GUI_App.cpp:590 +msgid "Critical error" +msgstr "Критична помилка" + +#: src/slic3r/GUI/GUI_App.cpp:711 +msgid "" +"Error parsing PrusaSlicer config file, it is probably corrupted. Try to " +"manually delete the file to recover from the error. Your user profiles will " +"not be affected." +msgstr "" +"Помилка під час розбору файлу конфігурації PrusaSlicer, можливо, він " +"пошкоджений. Спробуйте вручну видалити файл, щоб оговтатися від помилки. Це " +"не вплине на профілі користувачів." + +#: src/slic3r/GUI/GUI_App.cpp:717 +msgid "" +"Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " +"manually delete the file to recover from the error." +msgstr "" +"Помилка під час розбору файлу конфігурації PrusaGCodeViewer, можливо, він " +"пошкоджений. Спробуйте вручну видалити файл, щоб оговтатися від помилки." + +#: src/slic3r/GUI/GUI_App.cpp:771 +#, c-format +msgid "" +"%s\n" +"Do you want to continue?" +msgstr "" +"%s\n" +"Бажаєте продовжити?" + +#: src/slic3r/GUI/GUI_App.cpp:773 src/slic3r/GUI/UnsavedChangesDialog.cpp:665 +msgid "Remember my choice" +msgstr "Пам'ятати мій вибір" + +#: src/slic3r/GUI/GUI_App.cpp:808 +msgid "Loading configuration" +msgstr "Завантаження конфігурації" + +#: src/slic3r/GUI/GUI_App.cpp:876 +msgid "Preparing settings tabs" +msgstr "Підготовка вкладок параметрів" + +#: src/slic3r/GUI/GUI_App.cpp:1115 +msgid "" +"You have the following presets with saved options for \"Print Host upload\"" +msgstr "" +"У вас є наступні пресети із збереженими параметрами для \"Завантаження хоста " +"друку(\"Print Host upload\")\"" + +#: src/slic3r/GUI/GUI_App.cpp:1119 +msgid "" +"But since this version of PrusaSlicer we don't show this information in " +"Printer Settings anymore.\n" +"Settings will be available in physical printers settings." +msgstr "" +"Від поточної версії PrusaSlicer ми більше не відображаємо цю інформацію в " +"параметрах принтера.\n" +"Ці параметри будуть доступні у налаштуваннях фізичних принтерів." + +#: src/slic3r/GUI/GUI_App.cpp:1121 +msgid "" +"By default new Printer devices will be named as \"Printer N\" during its " +"creation.\n" +"Note: This name can be changed later from the physical printers settings" +msgstr "" +"За замовчуванням нові друкуючі пристрої будуть названі \"Printer N\" під час " +"їх створення.\n" +"Примітка: Цю назву можна змінити пізніше в налаштуваннях фізичних принтерів" + +#: src/slic3r/GUI/GUI_App.cpp:1124 src/slic3r/GUI/PhysicalPrinterDialog.cpp:626 +msgid "Information" +msgstr "Інформація" + +#: src/slic3r/GUI/GUI_App.cpp:1137 src/slic3r/GUI/GUI_App.cpp:1148 +msgid "Recreating" +msgstr "Пере-створення" + +#: src/slic3r/GUI/GUI_App.cpp:1153 +msgid "Loading of current presets" +msgstr "Завантаження поточних пресетів" + +#: src/slic3r/GUI/GUI_App.cpp:1158 +msgid "Loading of a mode view" +msgstr "Завантаження режиму перегляду" + +#: src/slic3r/GUI/GUI_App.cpp:1234 +msgid "Choose one file (3MF/AMF):" +msgstr "Виберіть один файл (3MF/AMF):" + +#: src/slic3r/GUI/GUI_App.cpp:1246 +msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" +msgstr "Виберіть один чи кілька файлів (STL/OBJ/AMF/PRUSA):" + +#: src/slic3r/GUI/GUI_App.cpp:1258 +msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" +msgstr "Виберіть один файл (GCODE/.GCO/.G/.ngc/NGC):" + +#: src/slic3r/GUI/GUI_App.cpp:1269 +msgid "Changing of an application language" +msgstr "Зміна мови застосування" + +#: src/slic3r/GUI/GUI_App.cpp:1392 +msgid "Select the language" +msgstr "Оберіть мову" + +#: src/slic3r/GUI/GUI_App.cpp:1392 +msgid "Language" +msgstr "Мова" + +#: src/slic3r/GUI/GUI_App.cpp:1541 +msgid "modified" +msgstr "модифікований" + +#: src/slic3r/GUI/GUI_App.cpp:1590 +#, c-format +msgid "Run %s" +msgstr "Запустити %s" + +#: src/slic3r/GUI/GUI_App.cpp:1594 +msgid "&Configuration Snapshots" +msgstr "Знімки конфігурації" + +#: src/slic3r/GUI/GUI_App.cpp:1594 +msgid "Inspect / activate configuration snapshots" +msgstr "Перегляньте / активізуйте знімки конфігурації" + +#: src/slic3r/GUI/GUI_App.cpp:1595 +msgid "Take Configuration &Snapshot" +msgstr "Зробіть знімок конфігурації" + +#: src/slic3r/GUI/GUI_App.cpp:1595 +msgid "Capture a configuration snapshot" +msgstr "Зробіть знімок конфігурації" + +#: src/slic3r/GUI/GUI_App.cpp:1596 +msgid "Check for updates" +msgstr "Перевірити наявність оновлень" + +#: src/slic3r/GUI/GUI_App.cpp:1596 +msgid "Check for configuration updates" +msgstr "Перевірити наявність оновлень конфігурації" + +#: src/slic3r/GUI/GUI_App.cpp:1599 +msgid "&Preferences" +msgstr "&Преференції" + +#: src/slic3r/GUI/GUI_App.cpp:1605 +msgid "Application preferences" +msgstr "Преференції застосування" + +#: src/slic3r/GUI/GUI_App.cpp:1610 src/slic3r/GUI/wxExtensions.cpp:685 +msgid "Simple" +msgstr "Простий" + +#: src/slic3r/GUI/GUI_App.cpp:1610 +msgid "Simple View Mode" +msgstr "Простий режим перегляду" + +#: src/slic3r/GUI/GUI_App.cpp:1612 src/slic3r/GUI/wxExtensions.cpp:687 +msgctxt "Mode" +msgid "Advanced" +msgstr "Розширений" + +#: src/slic3r/GUI/GUI_App.cpp:1612 +msgid "Advanced View Mode" +msgstr "Розширений режим перегляду" + +#: src/slic3r/GUI/GUI_App.cpp:1613 src/slic3r/GUI/wxExtensions.cpp:688 +msgid "Expert" +msgstr "Експерт" + +#: src/slic3r/GUI/GUI_App.cpp:1613 +msgid "Expert View Mode" +msgstr "Режим перегляду Експерт" + +#: src/slic3r/GUI/GUI_App.cpp:1618 +msgid "Mode" +msgstr "Режим" + +#: src/slic3r/GUI/GUI_App.cpp:1618 +#, c-format +msgid "%s View Mode" +msgstr "Режим перегляду %s" + +#: src/slic3r/GUI/GUI_App.cpp:1621 +msgid "&Language" +msgstr "Мова" + +#: src/slic3r/GUI/GUI_App.cpp:1624 +msgid "Flash printer &firmware" +msgstr "Прошити принтер" + +#: src/slic3r/GUI/GUI_App.cpp:1624 +msgid "Upload a firmware image into an Arduino based printer" +msgstr "Завантажте імідж прошивки на Arduino-принтер" + +#: src/slic3r/GUI/GUI_App.cpp:1640 +msgid "Taking configuration snapshot" +msgstr "Знімок конфігурації" + +#: src/slic3r/GUI/GUI_App.cpp:1640 +msgid "Snapshot name" +msgstr "Назва знімку" + +#: src/slic3r/GUI/GUI_App.cpp:1669 +msgid "Failed to activate configuration snapshot." +msgstr "Не вдалося активувати знімок конфігурації." + +#: src/slic3r/GUI/GUI_App.cpp:1719 +msgid "Language selection" +msgstr "Вибір мови" + +#: src/slic3r/GUI/GUI_App.cpp:1721 +msgid "" +"Switching the language will trigger application restart.\n" +"You will lose content of the plater." +msgstr "" +"Переключення мови спричинить перезапуск програми.\n" +"Ви втратите вміст платеру." + +#: src/slic3r/GUI/GUI_App.cpp:1723 +msgid "Do you want to proceed?" +msgstr "Ви хочете продовжити?" + +#: src/slic3r/GUI/GUI_App.cpp:1750 +msgid "&Configuration" +msgstr "&Конфігурація" + +#: src/slic3r/GUI/GUI_App.cpp:1781 +msgid "The preset(s) modifications are successfully saved" +msgstr "Модифікації пресетів успішно збережено" + +#: src/slic3r/GUI/GUI_App.cpp:1802 +msgid "The uploads are still ongoing" +msgstr "Завантаження все ще триває" + +#: src/slic3r/GUI/GUI_App.cpp:1802 +msgid "Stop them and continue anyway?" +msgstr "Зупинити їх і продовжувати в будь-якому випадку?" + +#: src/slic3r/GUI/GUI_App.cpp:1805 +msgid "Ongoing uploads" +msgstr "Триває завантаження" + +#: src/slic3r/GUI/GUI_App.cpp:2019 src/slic3r/GUI/Tab.cpp:3242 +msgid "It's impossible to print multi-part object(s) with SLA technology." +msgstr "" +"За технологією SLA неможливо надрукувати об'єкти, що складаються з декількох " +"частин." + +#: src/slic3r/GUI/GUI_App.cpp:2020 +msgid "Please check and fix your object list." +msgstr "Будь ласка, перевірте та виправте свій список об'єктів." + +#: src/slic3r/GUI/GUI_App.cpp:2021 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210 +#: src/slic3r/GUI/Plater.cpp:2359 src/slic3r/GUI/Tab.cpp:3244 +msgid "Attention!" +msgstr "Увага!" + +#: src/slic3r/GUI/GUI_App.cpp:2038 +msgid "Select a gcode file:" +msgstr "Виберіть файл G-коду:" + +#: src/slic3r/GUI/GUI_Init.cpp:73 src/slic3r/GUI/GUI_Init.cpp:76 +msgid "PrusaSlicer GUI initialization failed" +msgstr "Помилка ініціалізації графічного інтерфейсу PrusaSlicer" + +#: src/slic3r/GUI/GUI_Init.cpp:76 +msgid "Fatal error, exception catched: %1%" +msgstr "Фатальна помилка, вилучений виняток: %1%" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 +msgid "Start at height" +msgstr "Початкова висота" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 +msgid "Stop at height" +msgstr "Кінцева висота" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:161 +msgid "Remove layer range" +msgstr "Видалити діапазон шарів" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:165 +msgid "Add layer range" +msgstr "Додати діапазон шарів" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92 +#: src/slic3r/GUI/GUI_ObjectList.cpp:667 src/libslic3r/PrintConfig.cpp:74 +#: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:231 +#: src/libslic3r/PrintConfig.cpp:240 src/libslic3r/PrintConfig.cpp:464 +#: src/libslic3r/PrintConfig.cpp:530 src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:970 src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2361 src/libslic3r/PrintConfig.cpp:2370 +msgid "Layers and Perimeters" +msgstr "Шари та периметри" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95 +#: src/slic3r/GUI/GUI_ObjectList.cpp:670 src/slic3r/GUI/GUI_Preview.cpp:240 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1474 +#: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:352 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:1715 +#: src/libslic3r/PrintConfig.cpp:2093 src/libslic3r/PrintConfig.cpp:2099 +#: src/libslic3r/PrintConfig.cpp:2107 src/libslic3r/PrintConfig.cpp:2119 +#: src/libslic3r/PrintConfig.cpp:2129 src/libslic3r/PrintConfig.cpp:2137 +#: src/libslic3r/PrintConfig.cpp:2152 src/libslic3r/PrintConfig.cpp:2173 +#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2201 +#: src/libslic3r/PrintConfig.cpp:2210 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2244 +#: src/libslic3r/PrintConfig.cpp:2252 src/libslic3r/PrintConfig.cpp:2253 +#: src/libslic3r/PrintConfig.cpp:2262 src/libslic3r/PrintConfig.cpp:2270 +#: src/libslic3r/PrintConfig.cpp:2284 +msgid "Support material" +msgstr "Підтримка" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99 +#: src/slic3r/GUI/GUI_ObjectList.cpp:674 src/libslic3r/PrintConfig.cpp:2480 +#: src/libslic3r/PrintConfig.cpp:2488 +msgid "Wipe options" +msgstr "Параметри витирання" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:45 +msgid "Pad and Support" +msgstr "Подушка та підтримки" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:51 +msgid "Add part" +msgstr "Додати частину" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:52 +msgid "Add modifier" +msgstr "Додати модифікатор" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:53 +msgid "Add support enforcer" +msgstr "Додати примусову підтримку" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:54 +msgid "Add support blocker" +msgstr "Додати блокувальник підтримок" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:669 +#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1442 +#: src/libslic3r/ExtrusionEntity.cpp:316 src/libslic3r/ExtrusionEntity.cpp:344 +#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1232 +#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1256 +#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1266 +msgid "Ironing" +msgstr "Прасування" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:671 +#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/Tab.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:291 src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:1012 src/libslic3r/PrintConfig.cpp:1192 +#: src/libslic3r/PrintConfig.cpp:1265 src/libslic3r/PrintConfig.cpp:1640 +#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:2346 +msgid "Speed" +msgstr "Швидкість" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:672 +#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:1146 +#: src/libslic3r/PrintConfig.cpp:1618 src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2192 +msgid "Extruders" +msgstr "Екструдери" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:673 +#: src/libslic3r/PrintConfig.cpp:507 src/libslic3r/PrintConfig.cpp:616 +#: src/libslic3r/PrintConfig.cpp:957 src/libslic3r/PrintConfig.cpp:1154 +#: src/libslic3r/PrintConfig.cpp:1627 src/libslic3r/PrintConfig.cpp:1957 +#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:2334 +msgid "Extrusion Width" +msgstr "Ширина екструзії" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:677 +#: src/slic3r/GUI/Tab.cpp:1428 src/slic3r/GUI/Tab.cpp:1452 +#: src/slic3r/GUI/Tab.cpp:1555 src/slic3r/GUI/Tab.cpp:1558 +#: src/slic3r/GUI/Tab.cpp:1855 src/slic3r/GUI/Tab.cpp:2197 +#: src/slic3r/GUI/Tab.cpp:4114 src/libslic3r/PrintConfig.cpp:92 +#: src/libslic3r/PrintConfig.cpp:132 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:2504 src/libslic3r/PrintConfig.cpp:2676 +msgid "Advanced" +msgstr "Розширений" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:679 +#: src/slic3r/GUI/Plater.cpp:357 src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4049 src/libslic3r/PrintConfig.cpp:2842 +#: src/libslic3r/PrintConfig.cpp:2849 src/libslic3r/PrintConfig.cpp:2858 +#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2877 +#: src/libslic3r/PrintConfig.cpp:2887 src/libslic3r/PrintConfig.cpp:2924 +#: src/libslic3r/PrintConfig.cpp:2931 src/libslic3r/PrintConfig.cpp:2942 +#: src/libslic3r/PrintConfig.cpp:2952 src/libslic3r/PrintConfig.cpp:2961 +#: src/libslic3r/PrintConfig.cpp:2974 src/libslic3r/PrintConfig.cpp:2984 +#: src/libslic3r/PrintConfig.cpp:2993 src/libslic3r/PrintConfig.cpp:3003 +#: src/libslic3r/PrintConfig.cpp:3014 src/libslic3r/PrintConfig.cpp:3022 +msgid "Supports" +msgstr "Підтримки" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:680 +#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:4089 +#: src/slic3r/GUI/Tab.cpp:4090 src/slic3r/GUI/Tab.cpp:4161 +#: src/libslic3r/PrintConfig.cpp:3030 src/libslic3r/PrintConfig.cpp:3037 +#: src/libslic3r/PrintConfig.cpp:3051 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3072 src/libslic3r/PrintConfig.cpp:3094 +#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3119 src/libslic3r/PrintConfig.cpp:3130 +#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3148 +msgid "Pad" +msgstr "Подушка" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4107 +#: src/slic3r/GUI/Tab.cpp:4108 src/libslic3r/SLA/Hollowing.cpp:45 +#: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66 +#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3165 src/libslic3r/PrintConfig.cpp:3175 +#: src/libslic3r/PrintConfig.cpp:3184 +msgid "Hollowing" +msgstr "Випорожнення" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:300 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161 +msgid "Name" +msgstr "Ім'я" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:457 +msgid "Editing" +msgstr "Редагування" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:402 +#, c-format +msgid "Auto-repaired (%d errors):" +msgstr "Авто-відновлення (%d помилок):" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +msgid "degenerate facets" +msgstr "вироджені грані" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:410 +msgid "edges fixed" +msgstr "виправлено країв" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:411 +msgid "facets removed" +msgstr "вилучено граней" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:412 +msgid "facets added" +msgstr "додано граней" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:413 +msgid "facets reversed" +msgstr "змінено граней" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:414 +msgid "backwards edges" +msgstr "повернуто країв" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:422 +msgid "Right button click the icon to fix STL through Netfabb" +msgstr "Клацніть правою кнопкою миші, щоб виправити STL за допомогою Netfabb" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 +msgid "Right button click the icon to change the object settings" +msgstr "" +"Клацніть правою кнопкою миші на піктограмі, щоб змінити налаштування об'єкта" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 +msgid "Click the icon to change the object settings" +msgstr "Клацніть на піктограмі, щоб змінити налаштування об'єкта" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:465 +msgid "Right button click the icon to change the object printable property" +msgstr "" +"Клацніть правою кнопкою миші на піктограмі, щоб змінити властивість друку " +"для об'єкта" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:467 +msgid "Click the icon to change the object printable property" +msgstr "Клацніть на піктограмі, щоб змінити властивість друку для об'єкта" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:590 +msgid "Change Extruder" +msgstr "Змінити екструдер" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:605 +msgid "Rename Object" +msgstr "Перейменувати об'єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:605 +msgid "Rename Sub-object" +msgstr "Перейменувати підоб'єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1247 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4372 +msgid "Instances to Separated Objects" +msgstr "Змінити екземпляри на окремі об'єкти" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1262 +msgid "Volumes in Object reordered" +msgstr "Об’єкт впорядковано" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1262 +msgid "Object reordered" +msgstr "Об’єкт впорядковано" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1338 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1693 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1699 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2081 +#, c-format +msgid "Quick Add Settings (%s)" +msgstr "Швидке додання налаштувань (%s)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1428 +msgid "Select showing settings" +msgstr "Виберіть налаштування для показу" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1477 +msgid "Add Settings for Layers" +msgstr "Додати налаштування для шарів" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1478 +msgid "Add Settings for Sub-object" +msgstr "Додати налаштування для підоб'єкту" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1479 +msgid "Add Settings for Object" +msgstr "Додати налаштування для об'єкту" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1549 +msgid "Add Settings Bundle for Height range" +msgstr "Додати пакет налаштувань для діапазону висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1550 +msgid "Add Settings Bundle for Sub-object" +msgstr "Додати пакет налаштувань для підоб'єкту" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1551 +msgid "Add Settings Bundle for Object" +msgstr "Додати пакет налаштувань для об'єкту" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1590 +msgid "Load" +msgstr "Завантажити" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1627 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1631 +msgid "Box" +msgstr "Коробка" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 +msgid "Cylinder" +msgstr "Циліндр" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 +msgid "Slab" +msgstr "Плита" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +msgid "Height range Modifier" +msgstr "Модифікатор діапазону висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1672 +msgid "Add settings" +msgstr "Додати налаштування" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1750 +msgid "Change type" +msgstr "Змінити тип" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1760 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 +msgid "Set as a Separated Object" +msgstr "Встановити як окремий об’єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 +msgid "Set as a Separated Objects" +msgstr "Встановити як окремі об’єкти" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 +msgid "Printable" +msgstr "Для друку" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1797 +msgid "Rename" +msgstr "Перейменувати" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1808 +msgid "Fix through the Netfabb" +msgstr "Виправити за допомогою NetFabb" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1818 src/slic3r/GUI/Plater.cpp:4035 +msgid "Export as STL" +msgstr "Експортувати як STL" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1825 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4567 src/slic3r/GUI/Plater.cpp:4001 +msgid "Reload the selected volumes from disk" +msgstr "Перезавантажити вибрані часті з диска" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 +msgid "Set extruder for selected items" +msgstr "Встановити екструдер для вибраних елементів" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1864 src/libslic3r/PrintConfig.cpp:391 +msgid "Default" +msgstr "За замовчуванням" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1884 +msgid "Scale to print volume" +msgstr "Масштабувати під область друку" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1884 +msgid "Scale the selected object to fit the print volume" +msgstr "Масштабуйте вибраний об'єкт відповідно до об'єму столу" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1913 src/slic3r/GUI/Plater.cpp:5224 +msgid "Convert from imperial units" +msgstr "Конвертувати з імперських одиниць" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1915 src/slic3r/GUI/Plater.cpp:5224 +msgid "Revert conversion from imperial units" +msgstr "Повернути конвертацію з імперських одиниць" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1944 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2630 src/libslic3r/PrintConfig.cpp:3730 +msgid "Merge" +msgstr "Об’єднати" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1944 +msgid "Merge objects to the one multipart object" +msgstr "Об'єднати об'єкти в один багаточастковий об'єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 +msgid "Merge objects to the one single object" +msgstr "Об’єднайте об’єкти в один єдиний об’єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2026 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2283 +msgid "Add Shape" +msgstr "Додати форму" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2111 +msgid "Load Part" +msgstr "Завантажити частину" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2150 +msgid "Error!" +msgstr "Помилка!" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2225 +msgid "Add Generic Subobject" +msgstr "Додати загальний підоб'єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2254 +msgid "Generic" +msgstr "Загальний" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2380 +msgid "Delete Settings" +msgstr "Видалити налаштування" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2402 +msgid "Delete All Instances from Object" +msgstr "Видалити всі екземпляри з об’єкта" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2418 +msgid "Delete Height Range" +msgstr "Видалити діапазон висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2450 +msgid "From Object List You can't delete the last solid part from object." +msgstr "" +"Зі списку об’єктів Ви не можете видалити останню суцільну частину з об’єкта." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2454 +msgid "Delete Subobject" +msgstr "Видалити підоб'єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2469 +msgid "Last instance of an object cannot be deleted." +msgstr "Не можна видалити останній екземпляр з об'єкту." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2473 +msgid "Delete Instance" +msgstr "Видалити екземпляр" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:2865 +msgid "" +"The selected object couldn't be split because it contains only one part." +msgstr "" +"Вибраний об'єкт не можна розділити, оскільки він містить лише одну частину." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +msgid "Split to Parts" +msgstr "Розділити на частини" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2637 +msgid "Merged" +msgstr "Об’єднано" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2721 +msgid "Merge all parts to the one single object" +msgstr "Об’єднати всі частини в єдиний об’єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2753 +msgid "Add Layers" +msgstr "Додати шари" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2907 +msgid "Group manipulation" +msgstr "Маніпулювання групою" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2919 +msgid "Object manipulation" +msgstr "Маніпулювання об'єктом" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2932 +msgid "Object Settings to modify" +msgstr "Параметри об'єкту, які можна змінювати" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2936 +msgid "Part Settings to modify" +msgstr "Параметри частини, які можна змінювати" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2941 +msgid "Layer range Settings to modify" +msgstr "Пакет налаштувань для діапазону висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2947 +msgid "Part manipulation" +msgstr "Маніпулювання частиною" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2953 +msgid "Instance manipulation" +msgstr "Маніпулювання екземпляром" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2960 +msgid "Height ranges" +msgstr "Діапазони висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2960 +msgid "Settings for height range" +msgstr "Налаштування діапазону висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3144 +msgid "Delete Selected Item" +msgstr "Видалити вибраний елемент" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3332 +msgid "Delete Selected" +msgstr "Видалити вибране" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3408 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3456 +msgid "Add Height Range" +msgstr "Додати діапазон висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3502 +msgid "" +"Cannot insert a new layer range after the current layer range.\n" +"The next layer range is too thin to be split to two\n" +"without violating the minimum layer height." +msgstr "" +"Не вдається вставити новий діапазон шарів після поточного діапазону шарів.\n" +"Діапазон наступного шару занадто тонкий, щоб його можна було розділити на " +"два\n" +"без порушення мінімальної висоти шару." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3506 +msgid "" +"Cannot insert a new layer range between the current and the next layer " +"range.\n" +"The gap between the current layer range and the next layer range\n" +"is thinner than the minimum layer height allowed." +msgstr "" +"Не вдається вставити новий діапазон шарів між поточним та наступним " +"діапазоном шарів.\n" +"Розрив між діапазоном поточного шару та діапазоном наступного шару\n" +"тонше мінімально допустимої висоти шару." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3511 +msgid "" +"Cannot insert a new layer range after the current layer range.\n" +"Current layer range overlaps with the next layer range." +msgstr "" +"Не вдається вставити новий діапазон шарів після поточного діапазону шарів.\n" +"Діапазон поточного шару перекривається з діапазоном наступного шару." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3570 +msgid "Edit Height Range" +msgstr "Редагування діапазону висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3865 +msgid "Selection-Remove from list" +msgstr "Виділення - Видалено зі списку" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3873 +msgid "Selection-Add from list" +msgstr "Виділення - Додано зі списку" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4008 +msgid "Object or Instance" +msgstr "\"Об’єкт\" або \"Екземпляр\"" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +msgid "Part" +msgstr "\"Частина\"" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 +msgid "Layer" +msgstr "\"Шар\"" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4011 +msgid "Unsupported selection" +msgstr "Непідтримуваний вибір" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4012 +#, c-format +msgid "You started your selection with %s Item." +msgstr "Ви розпочали свій вибір з елемента %s." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4013 +#, c-format +msgid "In this mode you can select only other %s Items%s" +msgstr "В цьому режимі ви можете вибирати тільки інші %s %s" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 +msgid "of a current Object" +msgstr "поточного \"Об'єкта\"" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4021 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4096 src/slic3r/GUI/Plater.cpp:143 +msgid "Info" +msgstr "Інфо" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4137 +msgid "You can't change a type of the last solid part of the object." +msgstr "Ви не можете змінити тип останньої твердої частини об’єкта." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +msgid "Modifier" +msgstr "Модифікатор" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +msgid "Support Enforcer" +msgstr "Примусова підтримка" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +msgid "Support Blocker" +msgstr "Блокувальник підтримок" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4144 +msgid "Select type of part" +msgstr "Змінити тип частини" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4149 +msgid "Change Part Type" +msgstr "Змінити тип деталі" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4394 +msgid "Enter new name" +msgstr "Введіть нову назву" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4394 +msgid "Renaming" +msgstr "Перейменування" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4410 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4537 +#: src/slic3r/GUI/SavePresetDialog.cpp:101 +#: src/slic3r/GUI/SavePresetDialog.cpp:109 +msgid "The supplied name is not valid;" +msgstr "Надане ім'я недійсне;" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4411 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4538 +#: src/slic3r/GUI/SavePresetDialog.cpp:102 +msgid "the following characters are not allowed:" +msgstr "такі символи не допускаються:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4586 +msgid "Select extruder number:" +msgstr "Виберіть номер екструдера:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4587 +msgid "This extruder will be set for selected items" +msgstr "Цей екструдер буде встановлений для вибраних елементів" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4612 +msgid "Change Extruders" +msgstr "Змінити екструдери" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485 +msgid "Set Printable" +msgstr "Встановити \"Для друку\"" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485 +msgid "Set Unprintable" +msgstr "Встановити \"Не для друку\"" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111 +msgid "World coordinates" +msgstr "Світові координати" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112 +msgid "Local coordinates" +msgstr "Локальні координати" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88 +msgid "Select coordinate space, in which the transformation will be performed." +msgstr "Виберіть простір координат, в якому буде виконуватися перетворення." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:537 +msgid "Object name" +msgstr "Назва об'єкту" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505 +msgid "Position" +msgstr "Позиція" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506 +#: src/slic3r/GUI/Mouse3DController.cpp:486 +#: src/slic3r/GUI/Mouse3DController.cpp:507 +msgid "Rotation" +msgstr "Обертання" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271 +#, c-format +msgid "Toggle %c axis mirroring" +msgstr "Переключити дзеркальне відображення за осею %c" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305 +msgid "Set Mirror" +msgstr "Встановити віддзеркалення" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357 +msgid "Drop to bed" +msgstr "Поставити на стіл" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372 +msgid "Reset rotation" +msgstr "Скинути обертання" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394 +msgid "Reset Rotation" +msgstr "Скинути обертання" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 +msgid "Reset scale" +msgstr "Скинути масштаб" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:423 +msgid "Inches" +msgstr "Дюймів" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507 +msgid "Scale factors" +msgstr "Масштаб" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561 +msgid "Translate" +msgstr "Перемістити" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625 +msgid "" +"You cannot use non-uniform scaling mode for multiple objects/parts selection" +msgstr "" +"Не можна використовувати нерівномірний режим масштабування, коли вибрано " +"кілька об’єктів/частей" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797 +msgid "Set Position" +msgstr "Встановити позицію" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828 +msgid "Set Orientation" +msgstr "Встановити орієнтацію" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893 +msgid "Set Scale" +msgstr "Встановити масштаб" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925 +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." +msgstr "" +"В даний час маніпульований об'єкт нахилений (кути повороту не кратні 90 °).\n" +"Нерівномірне масштабування нахилених предметів можливе лише у світовій " +"системі координат,\n" +"як тільки обертання буде вбудовано в координати об’єкта." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928 +msgid "" +"This operation is irreversible.\n" +"Do you want to proceed?" +msgstr "" +"Ця операція незворотна.\n" +"Ви хочете продовжити?" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:62 +msgid "Additional Settings" +msgstr "Додаткові налаштування" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:98 +msgid "Remove parameter" +msgstr "Видалити параметр" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:104 +#, c-format +msgid "Delete Option %s" +msgstr "Видалити параметр %s" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157 +#, c-format +msgid "Change Option %s" +msgstr "Змінити параметр %s" + +#: src/slic3r/GUI/GUI_Preview.cpp:212 msgid "View" msgstr "Вид" -#: src/slic3r/GUI/GUI_Preview.cpp:212 src/slic3r/GUI/GUI_Preview.cpp:525 -#: src/libslic3r/GCode/PreviewData.cpp:394 -msgid "Feature type" -msgstr "Тип ознаки" - -#: src/slic3r/GUI/GUI_Preview.cpp:213 src/libslic3r/PrintConfig.cpp:467 +#: src/slic3r/GUI/GUI_Preview.cpp:215 src/libslic3r/PrintConfig.cpp:560 msgid "Height" msgstr "Висота" -#: src/slic3r/GUI/GUI_Preview.cpp:214 src/libslic3r/PrintConfig.cpp:2135 +#: src/slic3r/GUI/GUI_Preview.cpp:216 src/libslic3r/PrintConfig.cpp:2466 msgid "Width" msgstr "Ширина" -#: src/slic3r/GUI/GUI_Preview.cpp:216 -msgid "Volumetric flow rate" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:315 -#: src/slic3r/GUI/GUI_Preview.cpp:469 src/slic3r/GUI/GUI_Preview.cpp:525 -#: src/slic3r/GUI/GUI_Preview.cpp:701 src/libslic3r/GCode/PreviewData.cpp:404 -msgid "Tool" -msgstr "Інструмент" +#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/Tab.cpp:1840 +msgid "Fan speed" +msgstr "Швидкість вентилятора" -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/GUI_Preview.cpp:523 -#: src/libslic3r/GCode/PreviewData.cpp:406 -msgid "Color Print" -msgstr "" +#: src/slic3r/GUI/GUI_Preview.cpp:219 +msgid "Volumetric flow rate" +msgstr "Об'ємна швидкість потоку" -#: src/slic3r/GUI/GUI_Preview.cpp:221 +#: src/slic3r/GUI/GUI_Preview.cpp:224 msgid "Show" msgstr "Показати" -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:225 +#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:245 msgid "Feature types" msgstr "Типи ознак" -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/libslic3r/GCode/PreviewData.cpp:163 +#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/ExtrusionEntity.cpp:310 +#: src/libslic3r/ExtrusionEntity.cpp:332 msgid "Perimeter" msgstr "Периметр" -#: src/slic3r/GUI/GUI_Preview.cpp:228 src/libslic3r/GCode/PreviewData.cpp:164 +#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/ExtrusionEntity.cpp:311 +#: src/libslic3r/ExtrusionEntity.cpp:334 msgid "External perimeter" msgstr "Зовнішній периметр" -#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/GCode/PreviewData.cpp:165 +#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/ExtrusionEntity.cpp:312 +#: src/libslic3r/ExtrusionEntity.cpp:336 msgid "Overhang perimeter" msgstr "Нависаючий периметр" -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/GCode/PreviewData.cpp:166 +#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/ExtrusionEntity.cpp:313 +#: src/libslic3r/ExtrusionEntity.cpp:338 msgid "Internal infill" msgstr "Внутрішнє наповнення" -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/PrintConfig.cpp:1686 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/GCode/PreviewData.cpp:167 +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1967 msgid "Solid infill" msgstr "Суцільне наповнення" -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/PrintConfig.cpp:2016 -#: src/libslic3r/PrintConfig.cpp:2027 src/libslic3r/GCode/PreviewData.cpp:168 +#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2345 msgid "Top solid infill" msgstr "Верхнє суцільне наповнення" -#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/GCode/PreviewData.cpp:169 +#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/ExtrusionEntity.cpp:346 msgid "Bridge infill" msgstr "Мостове наповнення" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/GCode/PreviewData.cpp:170 +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:318 +#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:1011 msgid "Gap fill" msgstr "Заповнення розриву" -#: src/slic3r/GUI/GUI_Preview.cpp:235 src/slic3r/GUI/Tab.cpp:1001 -#: src/libslic3r/GCode/PreviewData.cpp:171 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/slic3r/GUI/Tab.cpp:1462 +#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/ExtrusionEntity.cpp:350 msgid "Skirt" msgstr "Плінтус" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/PrintConfig.cpp:1903 -#: src/libslic3r/GCode/PreviewData.cpp:173 +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:321 +#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2218 msgid "Support material interface" msgstr "Інтерфейс підтримуючого матеріалу" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/slic3r/GUI/Tab.cpp:1081 -#: src/libslic3r/GCode/PreviewData.cpp:174 +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/slic3r/GUI/Tab.cpp:1545 +#: src/libslic3r/ExtrusionEntity.cpp:322 src/libslic3r/ExtrusionEntity.cpp:356 msgid "Wipe tower" -msgstr "Вежа вичищування" +msgstr "Вежа витирання" -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/PrintConfig.cpp:2049 -msgid "Travel" -msgstr "Пересування" +#: src/slic3r/GUI/GUI_Preview.cpp:1031 +msgid "Shells" +msgstr "Оболонки" -#: src/slic3r/GUI/GUI_Preview.cpp:244 -msgid "Retractions" -msgstr "Переривання" +#: src/slic3r/GUI/GUI_Preview.cpp:1032 +msgid "Tool marker" +msgstr "Маркер інструменту" -#: src/slic3r/GUI/GUI_Preview.cpp:245 -msgid "Unretractions" -msgstr "Непереривання" +#: src/slic3r/GUI/GUI_Preview.cpp:1033 +msgid "Legend/Estimated printing time" +msgstr "Легенда / Приблизний час друку" -#: src/slic3r/GUI/GUI_Preview.cpp:246 -msgid "Shells" -msgstr "Оболонки" +#: src/slic3r/GUI/ImGuiWrapper.cpp:804 src/slic3r/GUI/Search.cpp:389 +msgid "Use for search" +msgstr "Використовуйте для пошуку" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 -msgid "Slic3r Prusa Edition - Keyboard Shortcuts" -msgstr "" +#: src/slic3r/GUI/ImGuiWrapper.cpp:805 src/slic3r/GUI/Search.cpp:383 +msgid "Category" +msgstr "Категорія" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 -msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" -msgstr "" +#: src/slic3r/GUI/ImGuiWrapper.cpp:807 src/slic3r/GUI/Search.cpp:385 +msgid "Search in English" +msgstr "Шукати англійською мовою" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:101 -msgid "Import STL/OBJ/AMF/3MF without config, keep bed" -msgstr "" +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:145 +msgid "Arranging" +msgstr "Розташування" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -msgid "Load Config from .ini/amf/3mf/gcode" +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:175 +msgid "Could not arrange model objects! Some geometries may be invalid." msgstr "" +"Не вдалося розташувати об’єкти моделі! Деякі геометрії можуть бути невірними." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 src/slic3r/GUI/Plater.cpp:725 -#: src/slic3r/GUI/Plater.cpp:3673 src/libslic3r/PrintConfig.cpp:2957 -msgid "Export G-code" -msgstr "" +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:181 +msgid "Arranging canceled." +msgstr "Розташування скасовано." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -msgid "Save project (3MF)" +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182 +msgid "Arranging done." +msgstr "Розташування виконано." + +#: src/slic3r/GUI/Jobs/Job.cpp:75 +msgid "ERROR: not enough resources to execute a new job." +msgstr "ПОМИЛКА: недостатньо ресурсів для виконання нового завдання." + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41 +msgid "Searching for optimal orientation" +msgstr "Пошук оптимальної орієнтації" + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73 +msgid "Orientation search canceled." +msgstr "Пошук орієнтації скасовано." + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:74 +msgid "Orientation found." +msgstr "Орієнтація знайдена." + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:35 +msgid "Choose SLA archive:" +msgstr "Виберіть SLA-архів:" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:39 +msgid "Import file" +msgstr "Імпорт файлу" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:46 +msgid "Import model and profile" +msgstr "Імпорт моделі та профілю" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 +msgid "Import profile only" +msgstr "Імпорт тільки профілю" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 +msgid "Import model only" +msgstr "Імпорт тільки моделі" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:59 +msgid "Accurate" +msgstr "Точний" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 +msgid "Balanced" +msgstr "Збалансований" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 +msgid "Quick" +msgstr "Швидко" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 +msgid "Importing SLA archive" +msgstr "Імпорт SLA-архіву" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:159 +msgid "Importing canceled." +msgstr "Імпорт скасовано." + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:160 +msgid "Importing done." +msgstr "Імпорт виконано." + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2357 +msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" +"Ви не можете завантажувати SLA-проект, що містить об'єкт, який складається з " +"кількох частин" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 -msgid "Load Config from .ini/amf/3mf/gcode and merge" +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2358 +#: src/slic3r/GUI/Tab.cpp:3243 +msgid "Please check your object list before preset changing." msgstr "" +"Будь ласка, перевірте свій список об'єктів перед тим, як змінити пресет." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:17 src/slic3r/GUI/MainFrame.cpp:894 +msgid "Keyboard Shortcuts" +msgstr "Гарячі клавіши" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:69 +msgid "New project, clear plater" +msgstr "Новий проект, очистити платер" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:70 +msgid "Open project STL/OBJ/AMF/3MF with config, clear plater" +msgstr "Відкрити проект STL / OBJ / AMF / 3MF з конфігурацією, очистити стіл" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:71 +msgid "Save project (3mf)" +msgstr "Зберегти проект (3mf)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:72 +msgid "Save project as (3mf)" +msgstr "Зберегти проект як (3mf)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:73 msgid "(Re)slice" -msgstr "" +msgstr "(Пере)Нарізати" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 -msgid "Quick slice" -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:75 +msgid "Import STL/OBJ/AMF/3MF without config, keep plater" +msgstr "Імпорт STL/OBJ/AMF/3MF без конфігурації зі збереженням платеру" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 src/slic3r/GUI/MainFrame.cpp:326 -msgid "Repeat last quick slice" -msgstr "Повторити останнє швидке нарізання" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:76 +msgid "Import Config from ini/amf/3mf/gcode" +msgstr "Імпорт конфігурації з INI/AMF/3MF/GCODE" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +msgid "Load Config from ini/amf/3mf/gcode and merge" +msgstr "Завантажити конфігурацію з INI/AMF/3MF/GCODE та об’єднати" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 src/slic3r/GUI/Plater.cpp:770 +#: src/slic3r/GUI/Plater.cpp:6054 src/libslic3r/PrintConfig.cpp:3635 +msgid "Export G-code" +msgstr "Експорт G-коду" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 src/slic3r/GUI/Plater.cpp:6055 +msgid "Send G-code" +msgstr "Надіслання G-коду" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +msgid "Export config" +msgstr "Експорт конфігурації" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:82 src/slic3r/GUI/Plater.cpp:758 +msgid "Export to SD card / Flash drive" +msgstr "Експорт на SD-карту/флешку" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +msgid "Eject SD card / Flash drive" +msgstr "Від'єднати SD-карту/флешку" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +msgid "Select all objects" +msgstr "Вибрати всі об'єкти" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 +msgid "Deselect all" +msgstr "Скасувати весь вибір" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 +msgid "Delete selected" +msgstr "Видалити вибране" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +msgid "Copy to clipboard" +msgstr "Скопіювати в буфер обміну" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 +msgid "Paste from clipboard" +msgstr "Вставити з буферу обміну" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +msgid "Reload plater from disk" +msgstr "Перезавантажити стіл з диска" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Select Plater Tab" msgstr "Вибрати вкладку Plater" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 -msgid "Quick slice and Save as" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:101 msgid "Select Print Settings Tab" msgstr "Вибрати вкладку параметрів друку" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select Filament Settings Tab" msgstr "Вибрати вкладку параметрів філаменту" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Select Printer Settings Tab" msgstr "Вибрати вкладку параметрів принтеру" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Switch to 3D" -msgstr "" +msgstr "Переключити на 3D" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 msgid "Switch to Preview" -msgstr "" +msgstr "Переключити на Перегляд" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/PrintHostDialogs.cpp:165 +msgid "Print host upload queue" +msgstr "Черга завантаження хоста друку" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/MainFrame.cpp:65 +#: src/slic3r/GUI/MainFrame.cpp:1191 +msgid "Open new instance" +msgstr "Відкрити новий екземпляр" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +msgid "Camera view" +msgstr "Вид камери" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +msgid "Show/Hide object/instance labels" +msgstr "Показати/сховати мітки об’єктів/екземплярів" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 src/slic3r/GUI/Preferences.cpp:10 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 src/slic3r/GUI/Preferences.cpp:13 msgid "Preferences" msgstr "Преференції" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +msgid "Show keyboard shortcuts list" +msgstr "Показати список гарячих клавіш" + #: src/slic3r/GUI/KBShortcutsDialog.cpp:117 -#: src/slic3r/GUI/PrintHostDialogs.cpp:134 -msgid "Print host upload queue" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 +msgid "Commands" +msgstr "Команди" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 +msgid "Add Instance of the selected object" +msgstr "Додати екземпляр вибраного об’єкта" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +msgid "Remove Instance of the selected object" +msgstr "Видалити екземпляр вибраного об’єкта" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +msgid "" +"Press to select multiple objects\n" +"or move multiple objects with mouse" +msgstr "" +"Натисніть, щоб вибрати кілька об'єктів\n" +"або переміщуйте кілька об’єктів за допомогою миші" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +msgid "Press to activate selection rectangle" +msgstr "Натисніть, щоб активувати прямокутник виділення" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Press to activate deselection rectangle" +msgstr "Натисніть, щоб активувати прямокутник скасування вибору" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +msgid "Arrow Up" +msgstr "Стрілка вгору" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +msgid "Move selection 10 mm in positive Y direction" +msgstr "Перемістити виділення на 10 мм у позитивному напрямку за Y" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 +msgid "Arrow Down" +msgstr "Стрілка вниз" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +msgid "Move selection 10 mm in negative Y direction" +msgstr "Перемістити виділення на 10 мм у негативному напрямку за Y" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +msgid "Arrow Left" +msgstr "Стрілка вліво" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 +msgid "Move selection 10 mm in negative X direction" +msgstr "Перемістити виділення на 10 мм у негативному напрямку за X" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +msgid "Arrow Right" +msgstr "Стрілка вправо" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +msgid "Move selection 10 mm in positive X direction" +msgstr "Перемістити виділення на 10 мм у позитивному напрямку за X" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 +msgid "Any arrow" +msgstr "Будь-яка стрілка" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 +msgid "Movement step set to 1 mm" +msgstr "Встановити крок переміщення на 1 мм" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 +msgid "Movement in camera space" +msgstr "Переміщення відносно камери" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 +msgid "Page Up" +msgstr "Попередня сторінка" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 +msgid "Rotate selection 45 degrees CCW" +msgstr "Повернути вибране на 45 градусів за годинниковою стрілкою" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +msgid "Page Down" +msgstr "Наступна сторінка" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +msgid "Rotate selection 45 degrees CW" +msgstr "Повернути вибране на 45 градусів проти годинникової стрілки" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +msgid "Gizmo move" +msgstr "Gizmo переміщення" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +msgid "Gizmo scale" +msgstr "Gizmo масштабування" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +msgid "Gizmo rotate" +msgstr "Gizmo обертання" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +msgid "Gizmo cut" +msgstr "Gizmo розрізання" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +msgid "Gizmo Place face on bed" +msgstr "Gizmo \"Поверхнею на стіл\"" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +msgid "Gizmo SLA hollow" +msgstr "Gizmo SLA-порожнистість" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +msgid "Gizmo SLA support points" +msgstr "Gizmo точки SLA-підтримок" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +msgid "Unselect gizmo or clear selection" +msgstr "Скасуйте вибір gizmo або очистіть виділення" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +msgid "Change camera type (perspective, orthographic)" +msgstr "Зміна типу камери (перспективна, орфографічна)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +msgid "Zoom to Bed" +msgstr "Приблизити до розміру столу" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +msgid "" +"Zoom to selected object\n" +"or all objects in scene, if none selected" +msgstr "" +"Приблизити до розміру об'єкту\n" +"або до всіх об'єктів сцени, якщо жоден не вибрано" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +msgid "Zoom in" +msgstr "Приблизити" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +msgid "Zoom out" +msgstr "Віддалити" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +msgid "Switch between Editor/Preview" +msgstr "Перемикання між Редактором та Попереднім переглядом" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +msgid "Collapse/Expand the sidebar" +msgstr "Згорнути/Розгорнути бічну панель" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" +msgstr "" +"Показати/сховати діалогове вікно налаштувань пристроїв 3Dconnexion, якщо " +"такі існують" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Показати/сховати діалогове вікно налаштувань пристроїв 3Dconnexion" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 src/slic3r/GUI/MainFrame.cpp:331 +#: src/slic3r/GUI/MainFrame.cpp:343 +msgid "Plater" +msgstr "Платер" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" +msgstr "" +"Всі gizmos: Обертати — ліва кнопка миші; Панорамування — права кнопка миші" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +msgid "Gizmo move: Press to snap by 1mm" +msgstr "Gizmo переміщення: Натисніть, щоб зафіксувати переміщення через 1 мм" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +msgid "Gizmo scale: Press to snap by 5%" +msgstr "Gizmo масштабування: Натисніть, щоб зафіксувати обертання на 5%" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +msgid "Gizmo scale: Scale selection to fit print volume" +msgstr "Gizmo масштабування: Масштабуйте вибране відповідно до об'єму столу" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 +msgid "Gizmo scale: Press to activate one direction scaling" +msgstr "" +"Gizmo масштабування: Натисніть, щоб активувати масштабування в одному " +"напрямку" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 +msgid "Gizmo scale: Press to scale selected objects around their own center" +msgstr "" +"Gizmo масштабування: Натисніть, щоб масштабувати вибрані об'єкти навколо їх " +"власного центру" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 +msgid "Gizmo rotate: Press to rotate selected objects around their own center" +msgstr "" +"Gizmo обертання: Натисніть, щоб обертати вибрані об'єкти навколо їх власного " +"центру" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "Gizmos" +msgstr "Всі gizmos" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "" +"The following shortcuts are applicable when the specified gizmo is active" +msgstr "Наступні гарячі клавіші застосовуються, коли активне вказане gizmo" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 src/slic3r/GUI/MainFrame.cpp:1244 +msgid "Open a G-code file" +msgstr "Відкрити файл G-кода" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 src/slic3r/GUI/MainFrame.cpp:1142 +#: src/slic3r/GUI/MainFrame.cpp:1146 src/slic3r/GUI/MainFrame.cpp:1249 +#: src/slic3r/GUI/MainFrame.cpp:1253 +msgid "Reload the plater from disk" +msgstr "Перезавантажити стіл з диска" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 +msgid "Vertical slider - Move active thumb Up" +msgstr "Вертикальний повзунок - Перемістити активний повзунок вгору" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +msgid "Vertical slider - Move active thumb Down" +msgstr "Вертикальний повзунок - Перемістити активний повзунок вниз" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 +msgid "Horizontal slider - Move active thumb Left" +msgstr "Горизонтальний повзунок - Перемістити активний повзунок вліво" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 +msgid "Horizontal slider - Move active thumb Right" +msgstr "Горизонтальний повзунок - Перемістити активний повзунок вправо" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +msgid "On/Off one layer mode of the vertical slider" +msgstr "Увімкнути/Вимкнути одношаровий режим вертикального повзунка" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +msgid "Show/Hide Legend and Estimated printing time" +msgstr "Показати / Сховати легенду та приблизний час друку" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 +msgid "Upper layer" +msgstr "Верхній шар" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 +msgid "Lower layer" +msgstr "Нижній шар" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +msgid "Upper Layer" +msgstr "Верхній шар" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:210 +msgid "Lower Layer" +msgstr "Нижній шар" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 +msgid "Show/Hide Legend & Estimated printing time" +msgstr "Показати / Сховати легенду та приблизний час друку" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 src/slic3r/GUI/Plater.cpp:4200 +#: src/slic3r/GUI/Tab.cpp:2602 +msgid "Preview" +msgstr "Попередній перегляд" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 +msgid "Move active thumb Up" +msgstr "Перемістити активний повзунок вгору" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 +msgid "Move active thumb Down" +msgstr "Перемістити активний повзунок вниз" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +msgid "Set upper thumb as active" +msgstr "Встановити активним верхній повзунок" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +msgid "Set lower thumb as active" +msgstr "Встановити активним нижній повзунок" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 +msgid "Add color change marker for current layer" +msgstr "Додати маркер зміни кольору для поточного шару" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 +msgid "Delete color change marker for current layer" +msgstr "Видалити маркер зміни кольору для поточного шару" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +msgid "Move current slider thumb Up" +msgstr "Перемістити активний повзунок вгору" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +msgid "Move current slider thumb Down" +msgstr "Перемістити активний повзунок вниз" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 +msgid "Set upper thumb to current slider thumb" +msgstr "Встановити верхній повзунок на поточну позицію" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 +msgid "Set lower thumb to current slider thumb" +msgstr "Встановити нижній повзунок на поточну позицію" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 +msgid "" +"Press to speed up 5 times while moving thumb\n" +"with arrow keys or mouse wheel" msgstr "" +"Натисніть, щоб мати 5-кратне прискорення під час руху повзунка\n" +"за допомогою клавіш зі стрілками або колеса миші" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +msgid "Vertical Slider" +msgstr "Вертикальний повзунок" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +msgid "" +"The following shortcuts are applicable in G-code preview when the vertical " +"slider is active" +msgstr "" +"Наведені нижче гарячі клавіші застосовуються у перегляді G-коду, коли " +"вертикальний повзунок активний" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +msgid "Move active thumb Left" +msgstr "Перемістити активний повзунок вліво" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +msgid "Move active thumb Right" +msgstr "Перемістити активний повзунок вправо" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +msgid "Set left thumb as active" +msgstr "Встановити активним лівий повзунок" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 +msgid "Set right thumb as active" +msgstr "Встановити активним правий повзунок" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 -msgid "Camera view " -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +msgid "Move active slider thumb Left" +msgstr "Перемістити активний повзунок вліво" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 -msgid "Add Instance to selected object " -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +msgid "Move active slider thumb Right" +msgstr "Перемістити активний повзунок вправо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 -msgid "Remove Instance from selected object" -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 +msgid "Horizontal Slider" +msgstr "Горизонтальний повзунок" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -msgid "Show keyboard shortcuts list" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 +msgid "" +"The following shortcuts are applicable in G-code preview when the horizontal " +"slider is active" msgstr "" +"Наведені нижче гарячі клавіші застосовуються у перегляді G-коду, коли " +"горизонтальний повзунок активний" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 -msgid "Select multiple object/Move multiple object" -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:276 +msgid "Keyboard shortcuts" +msgstr "Гарячі клавіши" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 -msgid "Main Shortcuts" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:65 src/slic3r/GUI/MainFrame.cpp:79 +#: src/slic3r/GUI/MainFrame.cpp:1191 +msgid "Open a new PrusaSlicer instance" +msgstr "Відкрити новий екземпляр PrusaSlicer" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 -msgid "Arrange" -msgstr "Організувати" +#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:81 +msgid "G-code preview" +msgstr "Перегляд G-коду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 -msgid "Select All objects" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:1091 +msgid "Open G-code viewer" +msgstr "Відкрити переглядач G-коду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 -msgid "Delete selected" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:79 src/slic3r/GUI/MainFrame.cpp:1260 +msgid "Open PrusaSlicer" +msgstr "Відкрити PrusaSlicer" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 -msgid "Delete All" -msgstr "Видалити все" +#: src/slic3r/GUI/MainFrame.cpp:81 +msgid "Open new G-code viewer" +msgstr "Відкрити новий переглядач G-коду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 -msgid "Gizmo move" +#: src/slic3r/GUI/MainFrame.cpp:153 +msgid "" +"Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/" +"releases" msgstr "" +"Не забудьте перевірити наявність оновлень на https://github.com/prusa3d/" +"PrusaSlicer/releases" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 -msgid "Gizmo scale" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:510 +msgid "based on Slic3r" +msgstr "на основі Slic3r" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 -msgid "Gizmo rotate" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:866 +msgid "Prusa 3D &Drivers" +msgstr "Драйвери Prusa3D" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 -msgid "Gizmo cut" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:866 +msgid "Open the Prusa3D drivers download page in your browser" +msgstr "Відкрити сторінку завантаження драйверів Prusa3D у своєму браузері" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 -msgid "Gizmo Place face on bed" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:868 +msgid "Software &Releases" +msgstr "Релізи ПЗ" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -msgid "Gizmo SLA support points" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:868 +msgid "Open the software releases page in your browser" +msgstr "Відкрити сторінку релізів PrusaEdition у своєму браузері" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#, no-c-format -msgid "" -"Press to snap by 5% in Gizmo scale\n" -"or by 1mm in Gizmo move" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:874 +#, c-format +msgid "%s &Website" +msgstr "Веб-сайт %s" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -msgid "" -"Press to scale or rotate selected objects\n" -"around their own center" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:875 +#, c-format +msgid "Open the %s website in your browser" +msgstr "Відкрити сторінку %s у своєму браузері" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -msgid "Zoom to Bed" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:881 +msgid "System &Info" +msgstr "Інформація про систему" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -msgid "Zoom to all objects in scene, if none selected" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:881 +msgid "Show system information" +msgstr "Показати інформацію про систему" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 -msgid "Zoom to selected object" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:883 +msgid "Show &Configuration Folder" +msgstr "Показати папку конфігурації" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 -msgid "Zoom in" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:883 +msgid "Show user configuration folder (datadir)" +msgstr "Показати папку користувацької конфігурації (datadir)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 -msgid "Zoom out" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:885 +msgid "Report an I&ssue" +msgstr "Повідомити про проблему" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Unselect gizmo, keep object selection" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:885 +#, c-format +msgid "Report an issue on %s" +msgstr "Повідомити про проблему на %s" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 -msgid "Plater Shortcuts" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891 +#, c-format +msgid "&About %s" +msgstr "О %s" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 -msgid "Arrow Up" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891 +msgid "Show about dialog" +msgstr "Показати діалог Про Slic3r" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 -msgid "Upper Layer" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:894 +msgid "Show the list of the keyboard shortcuts" +msgstr "Показати список гарячих клавіш" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -msgid "Arrow Down" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:908 +msgid "Iso" +msgstr "Iso" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 -msgid "Lower Layer" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:908 +msgid "Iso View" +msgstr "Вид Iso" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -msgid "Preview Shortcuts" -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:912 src/libslic3r/PrintConfig.cpp:2360 +#: src/libslic3r/PrintConfig.cpp:2369 +msgid "Top" +msgstr "Зверху" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 -msgid "Move current slider thump Up" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:912 +msgid "Top View" +msgstr "Вид зверху" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -msgid "Move current slider thump Down" -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:915 src/libslic3r/PrintConfig.cpp:230 +#: src/libslic3r/PrintConfig.cpp:239 +msgid "Bottom" +msgstr "Знизу" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -msgid "Arrow Left" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:915 +msgid "Bottom View" +msgstr "Вид знизу" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -msgid "Set upper thumb to current slider thumb" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:917 +msgid "Front" +msgstr "Спереду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 -msgid "Arrow Right" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:917 +msgid "Front View" +msgstr "Вид спереду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 -msgid "Set lower thumb to current slider thumb" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:919 src/libslic3r/PrintConfig.cpp:1845 +msgid "Rear" +msgstr "Ззаду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 -msgid "Add color change marker for current layer" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:919 +msgid "Rear View" +msgstr "Вид ззаду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 -msgid "Delete color change marker for current layer" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:921 +msgid "Left" +msgstr "З лівого боку" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 -msgid "Layers Slider Shortcuts" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:921 +msgid "Left View" +msgstr "Вид з лівого боку" -#: src/slic3r/GUI/MainFrame.cpp:54 -msgid "" -" - Remember to check for updates at http://github.com/prusa3d/slic3r/releases" -msgstr " - Пам'ятайте оновлювати з http://github.com/prusa3d/slic3r/releases" +#: src/slic3r/GUI/MainFrame.cpp:923 +msgid "Right" +msgstr "З правого боку" -#: src/slic3r/GUI/MainFrame.cpp:160 -msgid "Plater" -msgstr "Платер" +#: src/slic3r/GUI/MainFrame.cpp:923 +msgid "Right View" +msgstr "Вид з правого боку" + +#: src/slic3r/GUI/MainFrame.cpp:936 +msgid "&New Project" +msgstr "Новий проект" -#: src/slic3r/GUI/MainFrame.cpp:273 +#: src/slic3r/GUI/MainFrame.cpp:936 +msgid "Start a new project" +msgstr "Почати новий проект" + +#: src/slic3r/GUI/MainFrame.cpp:939 msgid "&Open Project" -msgstr "" +msgstr "Відкрити проект" -#: src/slic3r/GUI/MainFrame.cpp:273 +#: src/slic3r/GUI/MainFrame.cpp:939 msgid "Open a project file" +msgstr "Відкрити файл проекту" + +#: src/slic3r/GUI/MainFrame.cpp:944 +msgid "Recent projects" +msgstr "Останні проекти" + +#: src/slic3r/GUI/MainFrame.cpp:953 +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:953 src/slic3r/GUI/MainFrame.cpp:1343 +#: src/slic3r/GUI/PrintHostDialogs.cpp:263 +msgid "Error" +msgstr "Помилка" -#: src/slic3r/GUI/MainFrame.cpp:275 +#: src/slic3r/GUI/MainFrame.cpp:978 msgid "&Save Project" -msgstr "" +msgstr "Зберегти проект" -#: src/slic3r/GUI/MainFrame.cpp:275 +#: src/slic3r/GUI/MainFrame.cpp:978 msgid "Save current project file" -msgstr "" +msgstr "Зберегти файл поточного проекту" -#: src/slic3r/GUI/MainFrame.cpp:277 +#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984 msgid "Save Project &as" -msgstr "" +msgstr "Зберегти проект як" -#: src/slic3r/GUI/MainFrame.cpp:277 +#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984 msgid "Save current project file as" -msgstr "" +msgstr "Зберегти файл поточного проекту як" -#: src/slic3r/GUI/MainFrame.cpp:283 +#: src/slic3r/GUI/MainFrame.cpp:992 msgid "Import STL/OBJ/AM&F/3MF" -msgstr "" +msgstr "Імпорт STL/OBJ/AMF/3MF" -#: src/slic3r/GUI/MainFrame.cpp:283 +#: src/slic3r/GUI/MainFrame.cpp:992 msgid "Load a model" -msgstr "" +msgstr "Завантажити модель" + +#: src/slic3r/GUI/MainFrame.cpp:996 +msgid "Import STL (imperial units)" +msgstr "Імпорт SТL (в імперських одиницях)" + +#: src/slic3r/GUI/MainFrame.cpp:996 +msgid "Load an model saved with imperial units" +msgstr "Завантажити модель, збережену в імперських одиницях" -#: src/slic3r/GUI/MainFrame.cpp:286 +#: src/slic3r/GUI/MainFrame.cpp:1000 +msgid "Import SL1 archive" +msgstr "Імпорт SL1-архіву" + +#: src/slic3r/GUI/MainFrame.cpp:1000 +msgid "Load an SL1 archive" +msgstr "Завантажити SL1-архів" + +#: src/slic3r/GUI/MainFrame.cpp:1005 msgid "Import &Config" -msgstr "" +msgstr "Імпорт конфігурації" -#: src/slic3r/GUI/MainFrame.cpp:286 +#: src/slic3r/GUI/MainFrame.cpp:1005 msgid "Load exported configuration file" msgstr "Завантажити експортований файл конфігурації" -#: src/slic3r/GUI/MainFrame.cpp:288 +#: src/slic3r/GUI/MainFrame.cpp:1008 msgid "Import Config from &project" -msgstr "" +msgstr "Імпорт конфігурації з проекту" -#: src/slic3r/GUI/MainFrame.cpp:288 +#: src/slic3r/GUI/MainFrame.cpp:1008 msgid "Load configuration from project file" -msgstr "" +msgstr "Завантажити конфігурацію з файлу проекту" -#: src/slic3r/GUI/MainFrame.cpp:291 +#: src/slic3r/GUI/MainFrame.cpp:1012 msgid "Import Config &Bundle" -msgstr "" +msgstr "Імпорт пакету конфігурацій" -#: src/slic3r/GUI/MainFrame.cpp:291 +#: src/slic3r/GUI/MainFrame.cpp:1012 msgid "Load presets from a bundle" msgstr "Завантажити налаштування з пакету" -#: src/slic3r/GUI/MainFrame.cpp:293 +#: src/slic3r/GUI/MainFrame.cpp:1015 msgid "&Import" -msgstr "" +msgstr "Імпорт" -#: src/slic3r/GUI/MainFrame.cpp:296 +#: src/slic3r/GUI/MainFrame.cpp:1018 src/slic3r/GUI/MainFrame.cpp:1305 msgid "Export &G-code" -msgstr "" +msgstr "Експортувати G-код" -#: src/slic3r/GUI/MainFrame.cpp:296 +#: src/slic3r/GUI/MainFrame.cpp:1018 msgid "Export current plate as G-code" msgstr "Експорт поточної пластини як G-код" -#: src/slic3r/GUI/MainFrame.cpp:299 +#: src/slic3r/GUI/MainFrame.cpp:1022 src/slic3r/GUI/MainFrame.cpp:1306 +msgid "S&end G-code" +msgstr "Надіслати G-код" + +#: src/slic3r/GUI/MainFrame.cpp:1022 +msgid "Send to print current plate as G-code" +msgstr "Надіслати на принтер поточний стіл як G-код" + +#: src/slic3r/GUI/MainFrame.cpp:1026 +msgid "Export G-code to SD card / Flash drive" +msgstr "Експорт G-коду на SD-карту / Флешку" + +#: src/slic3r/GUI/MainFrame.cpp:1026 +msgid "Export current plate as G-code to SD card / Flash drive" +msgstr "Експорт поточного столу як G-код на SD-карту / Флешку" + +#: src/slic3r/GUI/MainFrame.cpp:1030 msgid "Export plate as &STL" -msgstr "" +msgstr "Експорт столу як STL" -#: src/slic3r/GUI/MainFrame.cpp:299 +#: src/slic3r/GUI/MainFrame.cpp:1030 msgid "Export current plate as STL" msgstr "Експорт поточної пластини як STL" -#: src/slic3r/GUI/MainFrame.cpp:301 +#: src/slic3r/GUI/MainFrame.cpp:1033 +msgid "Export plate as STL &including supports" +msgstr "Експорт столу як STL, включаючи підтримку" + +#: src/slic3r/GUI/MainFrame.cpp:1033 +msgid "Export current plate as STL including supports" +msgstr "Експорт поточного столу як STL, включаючи підтримку" + +#: src/slic3r/GUI/MainFrame.cpp:1036 msgid "Export plate as &AMF" -msgstr "" +msgstr "Експорт столу як AMF" -#: src/slic3r/GUI/MainFrame.cpp:301 +#: src/slic3r/GUI/MainFrame.cpp:1036 msgid "Export current plate as AMF" msgstr "Експорт поточної пластини як AMF" -#: src/slic3r/GUI/MainFrame.cpp:304 +#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257 +msgid "Export &toolpaths as OBJ" +msgstr "Експорт шляхів інструментів як OBJ" + +#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257 +msgid "Export toolpaths as OBJ" +msgstr "Експорт шляхів інструментів як OBJ" + +#: src/slic3r/GUI/MainFrame.cpp:1044 msgid "Export &Config" -msgstr "" +msgstr "Експортувати конфігурацію" -#: src/slic3r/GUI/MainFrame.cpp:304 +#: src/slic3r/GUI/MainFrame.cpp:1044 msgid "Export current configuration to file" msgstr "Експортувати поточну конфігурацію в файл" -#: src/slic3r/GUI/MainFrame.cpp:306 +#: src/slic3r/GUI/MainFrame.cpp:1047 msgid "Export Config &Bundle" -msgstr "" +msgstr "Експортувати пакет конфігурації" -#: src/slic3r/GUI/MainFrame.cpp:306 +#: src/slic3r/GUI/MainFrame.cpp:1047 msgid "Export all presets to file" msgstr "Експортувати всі налаштування у файл" -#: src/slic3r/GUI/MainFrame.cpp:308 +#: src/slic3r/GUI/MainFrame.cpp:1050 +msgid "Export Config Bundle With Physical Printers" +msgstr "Експортувати пакет конфігурації, включаючи фізичні принтери" + +#: src/slic3r/GUI/MainFrame.cpp:1050 +msgid "Export all presets including physical printers to file" +msgstr "Експортуйте всі пресети, включаючи фізичні принтери, у файл" + +#: src/slic3r/GUI/MainFrame.cpp:1053 msgid "&Export" +msgstr "Експорт" + +#: src/slic3r/GUI/MainFrame.cpp:1055 +msgid "Ejec&t SD card / Flash drive" +msgstr "Від'єднати SD-карту/флешку" + +#: src/slic3r/GUI/MainFrame.cpp:1055 +msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" +"Від'єднати SD-карту / Флешку після того, як на неї був експортований G-код." -#: src/slic3r/GUI/MainFrame.cpp:314 +#: src/slic3r/GUI/MainFrame.cpp:1063 msgid "Quick Slice" -msgstr "" +msgstr "Швидке нарізання" -#: src/slic3r/GUI/MainFrame.cpp:314 +#: src/slic3r/GUI/MainFrame.cpp:1063 msgid "Slice a file into a G-code" msgstr "Нарізати файл у G-код" -#: src/slic3r/GUI/MainFrame.cpp:320 +#: src/slic3r/GUI/MainFrame.cpp:1069 msgid "Quick Slice and Save As" -msgstr "" +msgstr "Швидко нарізати та зберегти як" -#: src/slic3r/GUI/MainFrame.cpp:320 +#: src/slic3r/GUI/MainFrame.cpp:1069 msgid "Slice a file into a G-code, save as" msgstr "Нарізати файл у G-код, зберегти як" -#: src/slic3r/GUI/MainFrame.cpp:326 +#: src/slic3r/GUI/MainFrame.cpp:1075 msgid "Repeat Last Quick Slice" -msgstr "" +msgstr "Повторити останнє швидке нарізання" -#: src/slic3r/GUI/MainFrame.cpp:334 -msgid "(Re)Slice &Now" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1075 +msgid "Repeat last quick slice" +msgstr "Повторити останнє швидке нарізання" + +#: src/slic3r/GUI/MainFrame.cpp:1083 +msgid "(Re)Slice No&w" +msgstr "(Пере)Нарізати зараз" -#: src/slic3r/GUI/MainFrame.cpp:334 +#: src/slic3r/GUI/MainFrame.cpp:1083 msgid "Start new slicing process" msgstr "Почати новий процес нарізання" -#: src/slic3r/GUI/MainFrame.cpp:337 +#: src/slic3r/GUI/MainFrame.cpp:1087 msgid "&Repair STL file" -msgstr "" +msgstr "Відновити STL-файл" -#: src/slic3r/GUI/MainFrame.cpp:337 +#: src/slic3r/GUI/MainFrame.cpp:1087 msgid "Automatically repair an STL file" msgstr "Автоматично відновити як STL-файл" -#: src/slic3r/GUI/MainFrame.cpp:340 +#: src/slic3r/GUI/MainFrame.cpp:1091 +msgid "&G-code preview" +msgstr "Перегляд G-коду" + +#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264 msgid "&Quit" msgstr "Вихід" -#: src/slic3r/GUI/MainFrame.cpp:340 -msgid "Quit Slic3r" -msgstr "Вийти зі Slic3r" +#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264 +#, c-format +msgid "Quit %s" +msgstr "Вийти з %s" -#: src/slic3r/GUI/MainFrame.cpp:374 +#: src/slic3r/GUI/MainFrame.cpp:1109 msgid "&Select all" msgstr "Вибрати все" -#: src/slic3r/GUI/MainFrame.cpp:374 +#: src/slic3r/GUI/MainFrame.cpp:1110 msgid "Selects all objects" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:377 -msgid "&Delete selected" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:377 -msgid "Deletes the current selection" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:379 -msgid "Delete &all" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:379 -msgid "Deletes all objects" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:392 -msgid "&Plater Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:392 -msgid "Show the plater" -msgstr "Показати plater" - -#: src/slic3r/GUI/MainFrame.cpp:399 -msgid "P&rint Settings Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:399 -msgid "Show the print settings" -msgstr "Показати параметри друку" - -#: src/slic3r/GUI/MainFrame.cpp:401 -msgid "&Filament Settings Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:401 -msgid "Show the filament settings" -msgstr "Показати параметри філаменту" - -#: src/slic3r/GUI/MainFrame.cpp:403 -msgid "Print&er Settings Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:403 -msgid "Show the printer settings" -msgstr "Показати параметри принтеру" +msgstr "Видалити всі об'єкти" -#: src/slic3r/GUI/MainFrame.cpp:407 -msgid "3&D" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:407 -msgid "Show the 3D editing view" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:409 -msgid "Pre&view" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:409 -msgid "Show the 3D slices preview" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:430 -msgid "Print &Host Upload Queue" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:430 -msgid "Display the Print Host Upload Queue window" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:439 -msgid "Iso" -msgstr "Iso" +#: src/slic3r/GUI/MainFrame.cpp:1112 +msgid "D&eselect all" +msgstr "Скасувати вибір усіх" -#: src/slic3r/GUI/MainFrame.cpp:439 -msgid "Iso View" -msgstr "Вид Iso" - -#: src/slic3r/GUI/MainFrame.cpp:441 -msgid "Top" -msgstr "Зверху" +#: src/slic3r/GUI/MainFrame.cpp:1113 +msgid "Deselects all objects" +msgstr "Скасовує вибір усіх об’єктів" -#: src/libslic3r/PrintConfig.cpp:2041 -msgctxt "Layers" -msgid "Top" -msgstr "Верхні" +#: src/slic3r/GUI/MainFrame.cpp:1116 +msgid "&Delete selected" +msgstr "Видалити вибране" -#: src/slic3r/GUI/MainFrame.cpp:441 -msgid "Top View" -msgstr "Вид зверху" +#: src/slic3r/GUI/MainFrame.cpp:1117 +msgid "Deletes the current selection" +msgstr "Видаляє поточний вибір" -#: src/slic3r/GUI/MainFrame.cpp:442 -msgid "Bottom" -msgstr "Знизу" +#: src/slic3r/GUI/MainFrame.cpp:1119 +msgid "Delete &all" +msgstr "Видалити все" -#: src/libslic3r/PrintConfig.cpp:148 -msgctxt "Layers" -msgid "Bottom" -msgstr "Нижні" +#: src/slic3r/GUI/MainFrame.cpp:1120 +msgid "Deletes all objects" +msgstr "Видалити всі об'єкти" -#: src/slic3r/GUI/MainFrame.cpp:442 -msgid "Bottom View" -msgstr "Вид знизу" +#: src/slic3r/GUI/MainFrame.cpp:1124 +msgid "&Undo" +msgstr "Відмінити" -#: src/slic3r/GUI/MainFrame.cpp:443 -msgid "Front" -msgstr "Спереду" +#: src/slic3r/GUI/MainFrame.cpp:1127 +msgid "&Redo" +msgstr "Повторити" -#: src/slic3r/GUI/MainFrame.cpp:443 -msgid "Front View" -msgstr "Вид спереду" +#: src/slic3r/GUI/MainFrame.cpp:1132 +msgid "&Copy" +msgstr "Копіювати" -#: src/slic3r/GUI/MainFrame.cpp:444 src/libslic3r/PrintConfig.cpp:1561 -msgid "Rear" -msgstr "Ззаду" +#: src/slic3r/GUI/MainFrame.cpp:1133 +msgid "Copy selection to clipboard" +msgstr "Скопіювати вибране в буфер обміну" -#: src/slic3r/GUI/MainFrame.cpp:444 -msgid "Rear View" -msgstr "Вид ззаду" +#: src/slic3r/GUI/MainFrame.cpp:1135 +msgid "&Paste" +msgstr "Вставити" -#: src/slic3r/GUI/MainFrame.cpp:445 -msgid "Left" -msgstr "З лівого боку" +#: src/slic3r/GUI/MainFrame.cpp:1136 +msgid "Paste clipboard" +msgstr "Вставити буфер обміну" -#: src/slic3r/GUI/MainFrame.cpp:445 -msgid "Left View" -msgstr "Вид з лівого боку" +#: src/slic3r/GUI/MainFrame.cpp:1141 src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1248 src/slic3r/GUI/MainFrame.cpp:1252 +msgid "Re&load from disk" +msgstr "Перезавантажити з диска" -#: src/slic3r/GUI/MainFrame.cpp:446 -msgid "Right" -msgstr "З правого боку" +#: src/slic3r/GUI/MainFrame.cpp:1151 +msgid "Searc&h" +msgstr "Пошук" -#: src/slic3r/GUI/MainFrame.cpp:446 -msgid "Right View" -msgstr "Вид з правого боку" +#: src/slic3r/GUI/MainFrame.cpp:1152 +msgid "Search in settings" +msgstr "Шукайте в налаштуваннях" -#: src/slic3r/GUI/MainFrame.cpp:460 -msgid "Prusa 3D &Drivers" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1160 +msgid "&Plater Tab" +msgstr "Вкладка Платер" -#: src/slic3r/GUI/MainFrame.cpp:460 -msgid "Open the Prusa3D drivers download page in your browser" -msgstr "Відкрити сторінку завантаження драйверів Prusa3D у своєму браузері" +#: src/slic3r/GUI/MainFrame.cpp:1160 +msgid "Show the plater" +msgstr "Показати plater" -#: src/slic3r/GUI/MainFrame.cpp:462 -msgid "Prusa Edition &Releases" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1165 +msgid "P&rint Settings Tab" +msgstr "Вкладка параметрів друку" -#: src/slic3r/GUI/MainFrame.cpp:462 -msgid "Open the Prusa Edition releases page in your browser" -msgstr "Відкрити сторінку релізів Prusa Edition у своєму браузері" +#: src/slic3r/GUI/MainFrame.cpp:1165 +msgid "Show the print settings" +msgstr "Показати параметри друку" -#: src/slic3r/GUI/MainFrame.cpp:468 -msgid "Slic3r &Website" -msgstr "Веб-сайт Slic3r" +#: src/slic3r/GUI/MainFrame.cpp:1168 src/slic3r/GUI/MainFrame.cpp:1308 +msgid "&Filament Settings Tab" +msgstr "Вкладка параметрів філаменту" -#: src/slic3r/GUI/MainFrame.cpp:468 -msgid "Open the Slic3r website in your browser" -msgstr "Відкрити сторінку Slic3r у своєму браузері" +#: src/slic3r/GUI/MainFrame.cpp:1168 +msgid "Show the filament settings" +msgstr "Показати параметри філаменту" -#: src/slic3r/GUI/MainFrame.cpp:470 -msgid "Slic3r &Manual" -msgstr "Посібник до Slic3r" +#: src/slic3r/GUI/MainFrame.cpp:1172 +msgid "Print&er Settings Tab" +msgstr "Вкладка параметрів принтеру" -#: src/slic3r/GUI/MainFrame.cpp:470 -msgid "Open the Slic3r manual in your browser" -msgstr "Відкрити сторінку посібнику до Slic3r у своєму браузері" +#: src/slic3r/GUI/MainFrame.cpp:1172 +msgid "Show the printer settings" +msgstr "Показати параметри принтеру" -#: src/slic3r/GUI/MainFrame.cpp:473 -msgid "System &Info" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1178 +msgid "3&D" +msgstr "3&D" -#: src/slic3r/GUI/MainFrame.cpp:473 -msgid "Show system information" -msgstr "Показати інформацію про систему" +#: src/slic3r/GUI/MainFrame.cpp:1178 +msgid "Show the 3D editing view" +msgstr "Показати режим 3D-редагування" -#: src/slic3r/GUI/MainFrame.cpp:475 -msgid "Show &Configuration Folder" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1181 +msgid "Pre&view" +msgstr "Попередній перегляд" -#: src/slic3r/GUI/MainFrame.cpp:475 -msgid "Show user configuration folder (datadir)" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1181 +msgid "Show the 3D slices preview" +msgstr "Показати попередній перегляд 3D нарізки" -#: src/slic3r/GUI/MainFrame.cpp:477 -msgid "Report an I&ssue" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1187 +msgid "Print &Host Upload Queue" +msgstr "Черга завантаження хоста друку" -#: src/slic3r/GUI/MainFrame.cpp:477 -msgid "Report an issue on the Slic3r Prusa Edition" -msgstr "Повідомити про проблему на Slic3r Prusa Edition" +#: src/slic3r/GUI/MainFrame.cpp:1187 +msgid "Display the Print Host Upload Queue window" +msgstr "Показати вікна черги завантаження хоста друку" -#: src/slic3r/GUI/MainFrame.cpp:479 -msgid "&About Slic3r" -msgstr "&Про Slic3r" +#: src/slic3r/GUI/MainFrame.cpp:1201 +msgid "Show &labels" +msgstr "Показувати мітки" -#: src/slic3r/GUI/MainFrame.cpp:479 -msgid "Show about dialog" -msgstr "Показати діалог Про Slic3r" +#: src/slic3r/GUI/MainFrame.cpp:1201 +msgid "Show object/instance labels in 3D scene" +msgstr "Показувати мітки об’єктів/екземплярів у 3D-сцені" -#: src/slic3r/GUI/MainFrame.cpp:482 -msgid "Keyboard Shortcuts" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1204 +msgid "&Collapse sidebar" +msgstr "Згорнути бічну панель" -#: src/slic3r/GUI/MainFrame.cpp:482 -msgid "Show the list of the keyboard shortcuts" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1204 src/slic3r/GUI/Plater.cpp:2247 +msgid "Collapse sidebar" +msgstr "Згорнути бічну панель" -#: src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:1216 src/slic3r/GUI/MainFrame.cpp:1279 msgid "&File" msgstr "Файл" -#: src/slic3r/GUI/MainFrame.cpp:491 +#: src/slic3r/GUI/MainFrame.cpp:1217 msgid "&Edit" -msgstr "" +msgstr "&Редагування" -#: src/slic3r/GUI/MainFrame.cpp:492 +#: src/slic3r/GUI/MainFrame.cpp:1218 msgid "&Window" msgstr "Вікно" -#: src/slic3r/GUI/MainFrame.cpp:493 +#: src/slic3r/GUI/MainFrame.cpp:1219 src/slic3r/GUI/MainFrame.cpp:1280 msgid "&View" msgstr "Вид" -#: src/slic3r/GUI/MainFrame.cpp:496 +#: src/slic3r/GUI/MainFrame.cpp:1222 src/slic3r/GUI/MainFrame.cpp:1283 msgid "&Help" msgstr "Допомога" -#: src/slic3r/GUI/MainFrame.cpp:524 +#: src/slic3r/GUI/MainFrame.cpp:1244 +msgid "&Open G-code" +msgstr "Відкрити G-код" + +#: src/slic3r/GUI/MainFrame.cpp:1260 +msgid "Open &PrusaSlicer" +msgstr "Відкрити PrusaSlicer" + +#: src/slic3r/GUI/MainFrame.cpp:1305 +msgid "E&xport" +msgstr "Експорт" + +#: src/slic3r/GUI/MainFrame.cpp:1306 +msgid "S&end to print" +msgstr "Надіслати на принтер" + +#: src/slic3r/GUI/MainFrame.cpp:1308 +msgid "Mate&rial Settings Tab" +msgstr "Вкладка параметрів матеріалу" + +#: src/slic3r/GUI/MainFrame.cpp:1331 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Вибрати файл для нарізання (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:538 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "No previously sliced file." msgstr "Немає попередньо нарізаного файлу." -#: src/slic3r/GUI/MainFrame.cpp:539 src/slic3r/GUI/PrintHostDialogs.cpp:219 -msgid "Error" -msgstr "Помилка" - -#: src/slic3r/GUI/MainFrame.cpp:544 +#: src/slic3r/GUI/MainFrame.cpp:1348 msgid "Previously sliced file (" msgstr "Попередньо нарізаний файл (" -#: src/slic3r/GUI/MainFrame.cpp:544 +#: src/slic3r/GUI/MainFrame.cpp:1348 msgid ") not found." msgstr ") не знайдено." -#: src/slic3r/GUI/MainFrame.cpp:545 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "File Not Found" msgstr "Файл не знайдено" -#: src/slic3r/GUI/MainFrame.cpp:580 src/slic3r/GUI/Tab.cpp:3152 -msgid "Save " -msgstr "Зберегти " +#: src/slic3r/GUI/MainFrame.cpp:1384 +#, c-format +msgid "Save %s file as:" +msgstr "Зберегти файл %s як:" -#: src/slic3r/GUI/MainFrame.cpp:580 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "SVG" -msgstr "" +msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:580 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "G-code" msgstr "G-код" -#: src/slic3r/GUI/MainFrame.cpp:580 -msgid " file as:" -msgstr " файл як:" - -#: src/slic3r/GUI/MainFrame.cpp:595 +#: src/slic3r/GUI/MainFrame.cpp:1396 msgid "Save zip file as:" -msgstr "" +msgstr "Зберегти zip-файл як:" -#: src/slic3r/GUI/MainFrame.cpp:607 src/slic3r/GUI/Plater.cpp:2352 -#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Tab.cpp:1110 -#: src/slic3r/GUI/Tab.cpp:3348 +#: src/slic3r/GUI/MainFrame.cpp:1405 src/slic3r/GUI/Plater.cpp:3009 +#: src/slic3r/GUI/Plater.cpp:5581 src/slic3r/GUI/Tab.cpp:1575 +#: src/slic3r/GUI/Tab.cpp:4115 msgid "Slicing" -msgstr "" +msgstr "Нарізання" -#: src/slic3r/GUI/MainFrame.cpp:607 -msgid "Processing " -msgstr "Обробка " +#. TRN "Processing input_file_basename" +#: src/slic3r/GUI/MainFrame.cpp:1407 +#, c-format +msgid "Processing %s" +msgstr "Обробка %s" -#: src/slic3r/GUI/MainFrame.cpp:630 -msgid " was successfully sliced." -msgstr " був успішно нарізаний." +#: src/slic3r/GUI/MainFrame.cpp:1430 +msgid "%1% was successfully sliced." +msgstr "%1% був успішно нарізаний." -#: src/slic3r/GUI/MainFrame.cpp:632 +#: src/slic3r/GUI/MainFrame.cpp:1432 msgid "Slicing Done!" msgstr "Нарізання завершено!" -#: src/slic3r/GUI/MainFrame.cpp:647 +#: src/slic3r/GUI/MainFrame.cpp:1447 msgid "Select the STL file to repair:" msgstr "Вибрати STL-файл для відновлення:" -#: src/slic3r/GUI/MainFrame.cpp:661 +#: src/slic3r/GUI/MainFrame.cpp:1457 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "Зберегти OBJ-файл (менш схильний координувати помилки, ніж STL) як:" -#: src/slic3r/GUI/MainFrame.cpp:676 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Your file was repaired." msgstr "Ваш файл було відновлено." -#: src/slic3r/GUI/MainFrame.cpp:676 src/libslic3r/PrintConfig.cpp:3051 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/libslic3r/PrintConfig.cpp:3735 msgid "Repair" msgstr "Відновити" -#: src/slic3r/GUI/MainFrame.cpp:690 +#: src/slic3r/GUI/MainFrame.cpp:1483 msgid "Save configuration as:" msgstr "Зберегти конфігурацію як:" -#: src/slic3r/GUI/MainFrame.cpp:710 src/slic3r/GUI/MainFrame.cpp:774 +#: src/slic3r/GUI/MainFrame.cpp:1502 src/slic3r/GUI/MainFrame.cpp:1564 msgid "Select configuration to load:" msgstr "Вибрати конфігурацію для завантаження:" -#: src/slic3r/GUI/MainFrame.cpp:747 +#: src/slic3r/GUI/MainFrame.cpp:1538 msgid "Save presets bundle as:" msgstr "Зберегти набір налаштувань як:" -#: src/slic3r/GUI/MainFrame.cpp:798 +#: src/slic3r/GUI/MainFrame.cpp:1585 #, c-format msgid "%d presets successfully imported." msgstr "%d налаштувань успішно імпортовано." +#: src/slic3r/GUI/Mouse3DController.cpp:461 +msgid "3Dconnexion settings" +msgstr "Параметри 3Dconnexion" + +#: src/slic3r/GUI/Mouse3DController.cpp:472 +msgid "Device:" +msgstr "Пристрій:" + +#: src/slic3r/GUI/Mouse3DController.cpp:477 +msgid "Speed:" +msgstr "Швидкість:" + +#: src/slic3r/GUI/Mouse3DController.cpp:480 +#: src/slic3r/GUI/Mouse3DController.cpp:501 +msgid "Translation" +msgstr "Переміщення" + +#: src/slic3r/GUI/Mouse3DController.cpp:492 +#: src/slic3r/GUI/Mouse3DController.cpp:501 +msgid "Zoom" +msgstr "Масштабування" + +#: src/slic3r/GUI/Mouse3DController.cpp:498 +msgid "Deadzone:" +msgstr "Мертва зона:" + +#: src/slic3r/GUI/Mouse3DController.cpp:513 +msgid "Options:" +msgstr "Параметри:" + +#: src/slic3r/GUI/Mouse3DController.cpp:516 +msgid "Swap Y/Z axes" +msgstr "Поміняти місцями осі Y/Z" + +#: src/slic3r/GUI/MsgDialog.cpp:70 +#, c-format +msgid "%s error" +msgstr "помилка %s" + #: src/slic3r/GUI/MsgDialog.cpp:71 -msgid "Slic3r error" +#, c-format +msgid "%s has encountered an error" +msgstr "%s виявив помилку" + +#: src/slic3r/GUI/NotificationManager.hpp:471 +msgid "3D Mouse disconnected." +msgstr "3D миша відключена." + +#: src/slic3r/GUI/NotificationManager.hpp:474 +msgid "Configuration update is available." +msgstr "Доступне оновлення конфігурації." + +#: src/slic3r/GUI/NotificationManager.hpp:474 +msgid "See more." +msgstr "Див. докладніше." + +#: src/slic3r/GUI/NotificationManager.hpp:476 +msgid "New version is available." +msgstr "Доступна нова версія." + +#: src/slic3r/GUI/NotificationManager.hpp:476 +msgid "See Releases page." +msgstr "Див. Сторінку випусків." + +#: src/slic3r/GUI/NotificationManager.hpp:479 +msgid "" +"You have just added a G-code for color change, but its value is empty.\n" +"To export the G-code correctly, check the \"Color Change G-code\" in " +"\"Printer Settings > Custom G-code\"" +msgstr "" +"Ви щойно додали G-код для зміни кольору, але його значення порожнє.\n" +"Щоб правильно експортувати G-код, перевірте значення параметру «G-коду зміни " +"кольору» в «Параметри принтера > Користувацький G-код»" + +#: src/slic3r/GUI/NotificationManager.cpp:490 +#: src/slic3r/GUI/NotificationManager.cpp:500 +msgid "More" +msgstr "Більше" + +#: src/slic3r/GUI/NotificationManager.cpp:864 +#: src/slic3r/GUI/NotificationManager.cpp:1141 +msgid "Export G-Code." +msgstr "Експортувати G-код." + +#: src/slic3r/GUI/NotificationManager.cpp:908 +msgid "Open Folder." +msgstr "Відкрити папку." + +#: src/slic3r/GUI/NotificationManager.cpp:946 +msgid "Eject drive" +msgstr "Від'єднати диск" + +#: src/slic3r/GUI/NotificationManager.cpp:1060 +#: src/slic3r/GUI/NotificationManager.cpp:1076 +#: src/slic3r/GUI/NotificationManager.cpp:1087 +msgid "ERROR:" +msgstr "ПОМИЛКА:" + +#: src/slic3r/GUI/NotificationManager.cpp:1065 +#: src/slic3r/GUI/NotificationManager.cpp:1080 +#: src/slic3r/GUI/NotificationManager.cpp:1095 +msgid "WARNING:" +msgstr "ЗАСТЕРЕЖЕННЯ:" + +#: src/slic3r/GUI/NotificationManager.cpp:1144 +msgid "Slicing finished." +msgstr "Нарізання завершено." + +#: src/slic3r/GUI/NotificationManager.cpp:1186 +msgid "Exporting finished." +msgstr "Експорт завершено." + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:58 +msgid "Instances" +msgstr "Екземпляри" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:62 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:225 +#, c-format +msgid "Instance %d" +msgstr "Екземпляр %d" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3962 +#: src/slic3r/GUI/Tab.cpp:4044 +msgid "Layers" +msgstr "Шари" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:96 +msgid "Range" +msgstr "Діапазон" + +#: src/slic3r/GUI/OpenGLManager.cpp:259 +#, 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 вимагає, щоб графічний драйвер, що підтримує OpenGL 2.0, " +"працював правильно,\n" +"але було виявлено OpenGL версії %s, відтворення %s, постачальника %s." -#: src/slic3r/GUI/MsgDialog.cpp:71 -msgid "Slic3r has encountered an error" +#: src/slic3r/GUI/OpenGLManager.cpp:262 +msgid "You may need to update your graphics card driver." +msgstr "Можливо, вам доведеться оновити драйвер відеокарти." + +#: src/slic3r/GUI/OpenGLManager.cpp:265 +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 "" +"Як спосіб вирішення, ви можете запустити PrusaSlicer з програмним " +"забезпеченням, що рендерить 3D-графіку, за допомогою старту prusa-slicer.exe " +"з параметром --sw_renderer." + +#: src/slic3r/GUI/OpenGLManager.cpp:267 +msgid "Unsupported OpenGL version" +msgstr "Непідтримувана версія OpenGL" + +#: src/slic3r/GUI/OpenGLManager.cpp:275 +#, c-format +msgid "" +"Unable to load the following shaders:\n" +"%s" +msgstr "" +"Не вдається завантажити такі шейдери:\n" +"%s" + +#: src/slic3r/GUI/OpenGLManager.cpp:276 +msgid "Error loading shaders" +msgstr "Помилка завантаження шейдерів" + +#: src/slic3r/GUI/OptionsGroup.cpp:335 +msgctxt "Layers" +msgid "Top" +msgstr "Верхні" + +#: src/slic3r/GUI/OptionsGroup.cpp:335 +msgctxt "Layers" +msgid "Bottom" +msgstr "Нижні" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:51 +msgid "Delete this preset from this printer device" +msgstr "Видаліть цей пресет з цього принтера" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:81 +msgid "This printer will be shown in the presets list as" +msgstr "Цей принтер буде відображатися у списку пресетів як" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:155 +msgid "Physical Printer" +msgstr "Фізичний принтер" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:161 +msgid "Type here the name of your printer device" +msgstr "Введіть тут назву вашого принтера" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:172 +msgid "Descriptive name for the printer" +msgstr "Описова назва принтера" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:176 +msgid "Add preset for this printer device" +msgstr "Додати пресет для цього пристрою принтера" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:205 src/slic3r/GUI/Tab.cpp:2064 +msgid "Print Host upload" +msgstr "Завантаження хоста друку" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:260 +msgid "Connection to printers connected via the print host failed." +msgstr "Помилка підключення до принтерів, підключених через хост друку." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:302 +msgid "Test" +msgstr "Перевірити" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:307 +msgid "Could not get a valid Printer Host reference" +msgstr "Не вдалося отримати дійсне посилання на хост принтера" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319 +msgid "Success!" +msgstr "Успіх!" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329 +msgid "Refresh Printers" +msgstr "Оновити принтери" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:356 +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"Файл HTTPS CA не є обов'язковим. Це потрібно, лише якщо ви використовуєте " +"HTTPS із самопідписаним сертифікатом." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:366 +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "Файли сертифікатів (*.crt, *.pem)|*.crt;*.pem|Усі файли|*.*" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 +msgid "Open CA certificate file" +msgstr "Відкрити файл CA сертифікату" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:395 +#: src/libslic3r/PrintConfig.cpp:124 +msgid "HTTPS CA File" +msgstr "Файл CA сертифікату" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:396 +#, c-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" +"На цій системі, %s використовує HTTPS-сертифікати з системного сховища " +"сертифікатів або Keychain." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:397 +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" +"Щоб використовувати власний CA файл, будь-ласка, імпортуйте його у сховища " +"сертифікатів / Keychain." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:543 +msgid "The supplied name is empty. It can't be saved." +msgstr "Надане ім'я порожнє. Не вдається зберегти." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:547 +msgid "You should to change a name of your printer device. It can't be saved." +msgstr "Вам слід змінити назву принтера. Задану назву неможливо зберегти." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555 +msgid "Printer with name \"%1%\" already exists." +msgstr "Принтер з ім'ям \"%1%\" вже існує." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:556 +msgid "Replace?" +msgstr "Замінити?" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:579 +msgid "" +"Following printer preset(s) is duplicated:%1%The above preset for printer " +"\"%2%\" will be used just once." msgstr "" +"Наступні пресети принтера повторюються:%1%Вищезазначений пресет принтера " +"\"%2%\" буде використано лише один раз." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:625 +msgid "It's not possible to delete the last related preset for the printer." +msgstr "Неможливо видалити останній пресет для принтера." -#: src/slic3r/GUI/Plater.cpp:137 +#: src/slic3r/GUI/Plater.cpp:163 msgid "Volume" msgstr "Обсяг" -#: src/slic3r/GUI/Plater.cpp:138 +#: src/slic3r/GUI/Plater.cpp:164 msgid "Facets" msgstr "Грані" -#: src/slic3r/GUI/Plater.cpp:139 +#: src/slic3r/GUI/Plater.cpp:165 msgid "Materials" msgstr "Матеріали" -#: src/slic3r/GUI/Plater.cpp:142 +#: src/slic3r/GUI/Plater.cpp:168 msgid "Manifold" msgstr "Різноманіття" -#: src/slic3r/GUI/Plater.cpp:188 +#: src/slic3r/GUI/Plater.cpp:218 msgid "Sliced Info" msgstr "Інформація з нарізання" -#: src/slic3r/GUI/Plater.cpp:207 src/slic3r/GUI/Plater.cpp:998 +#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1151 msgid "Used Filament (m)" msgstr "Використано філаметну (м)" -#: src/slic3r/GUI/Plater.cpp:208 +#: src/slic3r/GUI/Plater.cpp:238 src/slic3r/GUI/Plater.cpp:1163 msgid "Used Filament (mm³)" msgstr "Використано філаметну (мм³)" -#: src/slic3r/GUI/Plater.cpp:209 +#: src/slic3r/GUI/Plater.cpp:239 src/slic3r/GUI/Plater.cpp:1170 msgid "Used Filament (g)" msgstr "Використано філаметну (г)" -#: src/slic3r/GUI/Plater.cpp:210 +#: src/slic3r/GUI/Plater.cpp:240 msgid "Used Material (unit)" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:211 src/slic3r/GUI/Plater.cpp:1013 -#: src/libslic3r/PrintConfig.cpp:716 -msgid "Cost" -msgstr "Вартість" +msgstr "Використано матеріалу (одиниць)" -#: src/slic3r/GUI/Plater.cpp:212 src/slic3r/GUI/Plater.cpp:985 -#: src/slic3r/GUI/Plater.cpp:1027 -msgid "Estimated printing time" -msgstr "Приблизний час друку" +#: src/slic3r/GUI/Plater.cpp:241 +msgid "Cost (money)" +msgstr "Вартість (г.о.)" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:243 msgid "Number of tool changes" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:290 -msgid "Click to edit preset" -msgstr "" +msgstr "Кількість змін інструменту" -#: src/slic3r/GUI/Plater.cpp:413 +#: src/slic3r/GUI/Plater.cpp:360 msgid "Select what kind of support do you need" -msgstr "" +msgstr "Виберіть необхідну вам підтримку" -#: src/slic3r/GUI/Plater.cpp:415 src/libslic3r/PrintConfig.cpp:1814 -#: src/libslic3r/PrintConfig.cpp:2419 +#: src/slic3r/GUI/Plater.cpp:362 src/libslic3r/PrintConfig.cpp:2128 +#: src/libslic3r/PrintConfig.cpp:2923 msgid "Support on build plate only" -msgstr "Підтримка тільки на збірній пластині" +msgstr "Підтримки тільки на столі" + +#: src/slic3r/GUI/Plater.cpp:363 src/slic3r/GUI/Plater.cpp:489 +msgid "For support enforcers only" +msgstr "Тільки примусові підтримки" -#: src/slic3r/GUI/Plater.cpp:416 +#: src/slic3r/GUI/Plater.cpp:364 msgid "Everywhere" -msgstr "" +msgstr "Всюди" -#: src/slic3r/GUI/Plater.cpp:438 src/slic3r/GUI/Tab.cpp:1007 +#: src/slic3r/GUI/Plater.cpp:396 src/slic3r/GUI/Tab.cpp:1469 msgid "Brim" msgstr "Край" -#: src/slic3r/GUI/Plater.cpp:440 +#: src/slic3r/GUI/Plater.cpp:398 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "" +"Цей прапорець дозволяє позначити край, який буде надруковано навколо кожного " +"об'єкта на першому шарі." -#: src/slic3r/GUI/Plater.cpp:448 +#: src/slic3r/GUI/Plater.cpp:406 msgid "Purging volumes" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:673 -msgid "Print settings" -msgstr "Параметри друку" +msgstr "Обсяги очищення" -#: src/slic3r/GUI/Plater.cpp:674 src/slic3r/GUI/Tab.cpp:1421 -#: src/slic3r/GUI/Tab.cpp:1422 -msgid "Filament" -msgstr "Філамент" +#: src/slic3r/GUI/Plater.cpp:503 +msgid "Select what kind of pad do you need" +msgstr "Виберіть необхідну вам подушку" -#: src/slic3r/GUI/Plater.cpp:675 src/slic3r/GUI/Preset.cpp:1252 -msgid "SLA print" -msgstr "" +#: src/slic3r/GUI/Plater.cpp:505 +msgid "Below object" +msgstr "Під об’єктем" -#: src/slic3r/GUI/Plater.cpp:676 src/slic3r/GUI/Preset.cpp:1253 -msgid "SLA material" -msgstr "" +#: src/slic3r/GUI/Plater.cpp:506 +msgid "Around object" +msgstr "Навколо об'єкта" -#: src/slic3r/GUI/Plater.cpp:677 -msgid "Printer" -msgstr "Принтер" +#: src/slic3r/GUI/Plater.cpp:695 +msgid "SLA print settings" +msgstr "Параметри SLA-друку" -#: src/slic3r/GUI/Plater.cpp:707 src/slic3r/GUI/Plater.cpp:3674 +#: src/slic3r/GUI/Plater.cpp:756 src/slic3r/GUI/Plater.cpp:6055 msgid "Send to printer" msgstr "Надіслати на принтер" -#: src/slic3r/GUI/Plater.cpp:727 src/slic3r/GUI/Plater.cpp:2352 -#: src/slic3r/GUI/Plater.cpp:3470 +#: src/slic3r/GUI/Plater.cpp:771 src/slic3r/GUI/Plater.cpp:3009 +#: src/slic3r/GUI/Plater.cpp:5584 msgid "Slice now" msgstr "Нарізати зараз" -#: src/slic3r/GUI/Plater.cpp:860 +#: src/slic3r/GUI/Plater.cpp:926 msgid "Hold Shift to Slice & Export G-code" -msgstr "" +msgstr "Утримуйте Shift, щоб нарізати та експортувати G-код" -#: src/slic3r/GUI/Plater.cpp:931 +#: src/slic3r/GUI/Plater.cpp:1071 #, c-format msgid "%d (%d shells)" msgstr "%d (%d оболонок)" -#: src/slic3r/GUI/Plater.cpp:936 +#: src/slic3r/GUI/Plater.cpp:1076 #, c-format msgid "Auto-repaired (%d errors)" -msgstr "Автоматичне відновлення (%d помилок)" +msgstr "Авто-відновлення (%d помилок)" -#: src/slic3r/GUI/Plater.cpp:939 +#: src/slic3r/GUI/Plater.cpp:1079 #, c-format msgid "" "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " @@ -2355,93 +5569,214 @@ msgstr "" "вироджено %d грані, виправлено %d країв, вилучено %d грані, додано %d грані, " "змінено %d грані, повернуто %d країв" -#: src/slic3r/GUI/Plater.cpp:949 +#: src/slic3r/GUI/Plater.cpp:1089 msgid "Yes" msgstr "Так" -#: src/slic3r/GUI/Plater.cpp:972 +#: src/slic3r/GUI/Plater.cpp:1110 msgid "Used Material (ml)" -msgstr "" +msgstr "Використано матеріалу (мл)" -#: src/slic3r/GUI/Plater.cpp:975 +#: src/slic3r/GUI/Plater.cpp:1113 msgid "object(s)" -msgstr "" +msgstr "об'єкт(и)" -#: src/slic3r/GUI/Plater.cpp:975 +#: src/slic3r/GUI/Plater.cpp:1113 msgid "supports and pad" -msgstr "" +msgstr "підтримки та подушка" + +#: src/slic3r/GUI/Plater.cpp:1151 +msgid "Used Filament (in)" +msgstr "Використано філаметну (дюйми)" -#: src/slic3r/GUI/Plater.cpp:1000 src/slic3r/GUI/Plater.cpp:1015 +#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206 msgid "objects" -msgstr "" +msgstr "об'єкти" -#: src/slic3r/GUI/Plater.cpp:1000 src/slic3r/GUI/Plater.cpp:1015 +#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206 msgid "wipe tower" -msgstr "" +msgstr "вежа витирання" + +#: src/slic3r/GUI/Plater.cpp:1163 +msgid "Used Filament (in³)" +msgstr "Використано філаметну (дюйми³)" + +#: src/slic3r/GUI/Plater.cpp:1189 +msgid "Filament at extruder %1%" +msgstr "Філамент екструдеру %1%" + +#: src/slic3r/GUI/Plater.cpp:1195 +msgid "(including spool)" +msgstr "(включаючи котушку)" + +#: src/slic3r/GUI/Plater.cpp:1204 src/libslic3r/PrintConfig.cpp:822 +#: src/libslic3r/PrintConfig.cpp:2738 src/libslic3r/PrintConfig.cpp:2739 +msgid "Cost" +msgstr "Вартість" -#: src/slic3r/GUI/Plater.cpp:1030 +#: src/slic3r/GUI/Plater.cpp:1222 msgid "normal mode" -msgstr "" +msgstr "нормальний режим" + +#: src/slic3r/GUI/Plater.cpp:1232 +msgid "stealth mode" +msgstr "тихий режим" + +#: src/slic3r/GUI/Plater.cpp:1403 src/slic3r/GUI/Plater.cpp:4923 +#, c-format +msgid "%s - Drop project file" +msgstr "%s - Перетягнути файл проекту" + +#: src/slic3r/GUI/Plater.cpp:1410 src/slic3r/GUI/Plater.cpp:4930 +msgid "Open as project" +msgstr "Відкрити як проект" + +#: src/slic3r/GUI/Plater.cpp:1411 src/slic3r/GUI/Plater.cpp:4931 +msgid "Import geometry only" +msgstr "Імпорт тільки геометрії" -#: src/slic3r/GUI/Plater.cpp:1034 -msgid "silent mode" +#: src/slic3r/GUI/Plater.cpp:1412 src/slic3r/GUI/Plater.cpp:4932 +msgid "Import config only" +msgstr "Імпорт тільки конфігурації" + +#: src/slic3r/GUI/Plater.cpp:1415 src/slic3r/GUI/Plater.cpp:4935 +msgid "Select an action to apply to the file" +msgstr "Виберіть дію, яку потрібно застосувати до файлу" + +#: src/slic3r/GUI/Plater.cpp:1416 src/slic3r/GUI/Plater.cpp:4936 +msgid "Action" +msgstr "Дія" + +#: src/slic3r/GUI/Plater.cpp:1424 src/slic3r/GUI/Plater.cpp:4944 +msgid "Don't show again" +msgstr "Не показувати знову" + +#: src/slic3r/GUI/Plater.cpp:1469 src/slic3r/GUI/Plater.cpp:4981 +msgid "You can open only one .gcode file at a time." +msgstr "Одночасно можна відкрити лише один файл .gcode." + +#: src/slic3r/GUI/Plater.cpp:1470 src/slic3r/GUI/Plater.cpp:4982 +msgid "Drag and drop G-code file" +msgstr "Перетягування файлу G-коду" + +#: src/slic3r/GUI/Plater.cpp:1524 src/slic3r/GUI/Plater.cpp:4796 +#: src/slic3r/GUI/Plater.cpp:5036 +msgid "Import Object" +msgstr "Імпорт об'єкту" + +#: src/slic3r/GUI/Plater.cpp:1546 src/slic3r/GUI/Plater.cpp:5058 +msgid "Load File" +msgstr "Завантажити файл" + +#: src/slic3r/GUI/Plater.cpp:1551 src/slic3r/GUI/Plater.cpp:5063 +msgid "Load Files" +msgstr "Завантажити файли" + +#: src/slic3r/GUI/Plater.cpp:1654 +msgid "Fill bed" +msgstr "Заповнити стіл" + +#: src/slic3r/GUI/Plater.cpp:1660 +msgid "Optimize Rotation" +msgstr "Оптимізувати обертання" + +#: src/slic3r/GUI/Plater.cpp:1666 +msgid "Import SLA archive" +msgstr "Імпорт SLА-архіву" + +#: src/slic3r/GUI/Plater.cpp:2129 +#, c-format +msgid "" +"Successfully unmounted. The device %s(%s) can now be safely removed from the " +"computer." msgstr "" +"Успішно від'єднано. Пристрій %s(%s) тепер можна безпечно вилучити з " +"комп’ютера." + +#: src/slic3r/GUI/Plater.cpp:2134 +#, c-format +msgid "Ejecting of device %s(%s) has failed." +msgstr "Не вдалося від'єднати пристрій %s (%s)." + +#: src/slic3r/GUI/Plater.cpp:2153 +msgid "New Project" +msgstr "Новий проект" -#: src/slic3r/GUI/Plater.cpp:1544 +#: src/slic3r/GUI/Plater.cpp:2246 +msgid "Expand sidebar" +msgstr "Розгорнути бічну панель" + +#: src/slic3r/GUI/Plater.cpp:2319 msgid "Loading" -msgstr "" +msgstr "Завантаження" -#: src/slic3r/GUI/Plater.cpp:1554 +#: src/slic3r/GUI/Plater.cpp:2329 +msgid "Loading file" +msgstr "Завантаження файлу" + +#: src/slic3r/GUI/Plater.cpp:2415 #, c-format -msgid "Processing input file %s\n" +msgid "" +"Some object(s) in file %s looks like saved in inches.\n" +"Should I consider them as a saved in inches and convert them?" msgstr "" +"Схоже на те, що деякі об’єкти у файлі %s збережені в дюймах.\n" +"Чи слід розглядати їх як збережені в дюймах і конвертувати?" -#: src/slic3r/GUI/Plater.cpp:1612 +#: src/slic3r/GUI/Plater.cpp:2417 +msgid "The object appears to be saved in inches" +msgstr "Здається, об’єкт був збережений у дюймах" + +#: src/slic3r/GUI/Plater.cpp:2425 msgid "" -"This file contains several objects positioned at multiple heights. Instead " -"of considering them as multiple objects, should I consider\n" -"this file as a single object having multiple parts?\n" +"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 "" -"Цей файл містить кілька об'єктів, розташованих на декількох висотах. Замість " -"того, щоб розглядати їх як кілька об'єктів, чи потрібно розглянути\n" -"цей файл як єдиний об'єкт, що має декілька частин?\n" +"Цей файл містить кілька об'єктів, розташованих на декількох висотах. \n" +"Замість того, щоб розглядати їх як кілька об'єктів, чи потрібно розглянути\n" +"цей файл як єдиний об'єкт, що має декілька частин?" -#: src/slic3r/GUI/Plater.cpp:1615 src/slic3r/GUI/Plater.cpp:1707 +#: src/slic3r/GUI/Plater.cpp:2428 src/slic3r/GUI/Plater.cpp:2481 msgid "Multi-part object detected" msgstr "Виявлено об'єкт, що складається з кількох частин" -#: src/slic3r/GUI/Plater.cpp:1650 +#: src/slic3r/GUI/Plater.cpp:2435 msgid "" -"This file cannot be loaded in simple mode. Do you want to switch to expert " -"mode?\n" +"This file cannot be loaded in a simple mode. Do you want to switch to an " +"advanced mode?" msgstr "" +"Цей файл не можна завантажити у простому режимі. Ви хочете перейти в " +"розширений режим?" -#: src/slic3r/GUI/Plater.cpp:1651 +#: src/slic3r/GUI/Plater.cpp:2436 msgid "Detected advanced data" -msgstr "" +msgstr "Виявлено розширені дані" -#: src/slic3r/GUI/Plater.cpp:1684 +#: src/slic3r/GUI/Plater.cpp:2458 #, 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 "" +"Ви не можете додати об’єкт(и) із %s через те, що один або деякі з них " +"складається з декількох частин" -#: src/slic3r/GUI/Plater.cpp:1704 +#: src/slic3r/GUI/Plater.cpp:2478 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?\n" +"these files to represent a single object having multiple parts?" msgstr "" "До мульти-матеріального принтеру завантажено кілька об'єктів.\n" "Замість того, щоб розглядати їх як кілька об'єктів, чи потрібно розглянути\n" -"ці файл як єдиний об'єкт, що має декілька частин?\n" +"ці файл як єдиний об'єкт, що має декілька частин?" -#: src/slic3r/GUI/Plater.cpp:1720 +#: src/slic3r/GUI/Plater.cpp:2494 msgid "Loaded" -msgstr "" +msgstr "Завантажено" -#: src/slic3r/GUI/Plater.cpp:1812 +#: src/slic3r/GUI/Plater.cpp:2596 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." @@ -2449,51 +5784,35 @@ msgstr "" "Ваш об'єкт видався занадто великим, тому він автоматично зменшився " "відповідно до вашої полотна друку." -#: src/slic3r/GUI/Plater.cpp:1813 +#: src/slic3r/GUI/Plater.cpp:2597 msgid "Object too large?" msgstr "Об'єкт занадто великий?" -#: src/slic3r/GUI/Plater.cpp:1863 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "Export STL file:" -msgstr "" +msgstr "Експорт STL-файлу:" -#: src/slic3r/GUI/Plater.cpp:1870 +#: src/slic3r/GUI/Plater.cpp:2666 msgid "Export AMF file:" -msgstr "" +msgstr "Експортувати AMF-файл:" -#: src/slic3r/GUI/Plater.cpp:1876 +#: src/slic3r/GUI/Plater.cpp:2672 msgid "Save file as:" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2042 -msgid "Arranging canceled" -msgstr "" +msgstr "Зберегти файл як:" -#: src/slic3r/GUI/Plater.cpp:2045 -msgid "Arranging" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2079 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2083 -msgid "Arranging done." -msgstr "" +#: src/slic3r/GUI/Plater.cpp:2678 +msgid "Export OBJ file:" +msgstr "Експорт OBJ-файлу:" -#: src/slic3r/GUI/Plater.cpp:2124 -msgid "Orientation search canceled" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2129 -msgid "Searching for optimal orientation" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2190 -msgid "Orientation found." -msgstr "" +#: src/slic3r/GUI/Plater.cpp:2774 +msgid "Delete Object" +msgstr "Видалити об'єкт" -#: src/slic3r/GUI/Plater.cpp:2211 +#: src/slic3r/GUI/Plater.cpp:2785 +msgid "Reset Project" +msgstr "Скинути проект" + +#: src/slic3r/GUI/Plater.cpp:2857 msgid "" "The selected object can't be split because it contains more than one volume/" "material." @@ -2501,187 +5820,300 @@ msgstr "" "Вибраний об'єкт не можна розділити, оскільки містить більше одного об'єму/" "матеріалу." -#: src/slic3r/GUI/Plater.cpp:2337 +#: src/slic3r/GUI/Plater.cpp:2868 +msgid "Split to Objects" +msgstr "Розділити на об'єкти" + +#: src/slic3r/GUI/Plater.cpp:2993 src/slic3r/GUI/Plater.cpp:3723 msgid "Invalid data" -msgstr "" +msgstr "Некоректні дані" -#: src/slic3r/GUI/Plater.cpp:2346 +#: src/slic3r/GUI/Plater.cpp:3003 msgid "Ready to slice" -msgstr "" +msgstr "Готово до нарізки" -#: src/slic3r/GUI/Plater.cpp:2379 src/slic3r/GUI/PrintHostDialogs.cpp:220 +#: src/slic3r/GUI/Plater.cpp:3041 src/slic3r/GUI/PrintHostDialogs.cpp:264 msgid "Cancelling" -msgstr "" +msgstr "Скасування" -#: src/slic3r/GUI/Plater.cpp:2396 +#: src/slic3r/GUI/Plater.cpp:3060 msgid "Another export job is currently running." msgstr "На даний час виконується інший експорт." -#: src/slic3r/GUI/Plater.cpp:2656 -msgid "Export failed" -msgstr "Експортувати не вдалося" +#: src/slic3r/GUI/Plater.cpp:3177 +msgid "Please select the file to reload" +msgstr "Будь ласка, виберіть файл для перезавантаження" -#: src/slic3r/GUI/Plater.cpp:2661 src/slic3r/GUI/PrintHostDialogs.cpp:221 -msgid "Cancelled" +#: src/slic3r/GUI/Plater.cpp:3212 +msgid "It is not allowed to change the file to reload" +msgstr "Не дозволяється змінювати файл для перезавантаження" + +#: src/slic3r/GUI/Plater.cpp:3212 +msgid "Do you want to retry" +msgstr "Повторити спробу" + +#: src/slic3r/GUI/Plater.cpp:3230 +msgid "Reload from:" +msgstr "Перезавантажити з:" + +#: src/slic3r/GUI/Plater.cpp:3323 +msgid "Unable to reload:" +msgstr "Не вдається перезавантажити:" + +#: src/slic3r/GUI/Plater.cpp:3328 +msgid "Error during reload" +msgstr "Помилка під час перезавантаження" + +#: src/slic3r/GUI/Plater.cpp:3347 +msgid "Reload all from disk" +msgstr "Перезавантажити все з диска" + +#: src/slic3r/GUI/Plater.cpp:3374 +msgid "" +"ERROR: Please close all manipulators available from the left toolbar before " +"fixing the mesh." msgstr "" +"ПОМИЛКА: Будь ласка, закрийте всі маніпулятори, доступні на лівій панелі " +"інструментів, перш ніж фіксувати сітку." + +#: src/slic3r/GUI/Plater.cpp:3380 +msgid "Fix through NetFabb" +msgstr "Виправити за допомогою NetFabb" + +#: src/slic3r/GUI/Plater.cpp:3397 +msgid "Custom supports and seams were removed after repairing the mesh." +msgstr "Користувацькі підтримки та шви були видалені після ремонту сітки." -#: src/slic3r/GUI/Plater.cpp:2747 src/slic3r/GUI/Plater.cpp:2759 -#: src/slic3r/GUI/Plater.cpp:2831 -msgid "Increase copies" -msgstr "Збільшити копії" +#: src/slic3r/GUI/Plater.cpp:3680 +msgid "There are active warnings concerning sliced models:" +msgstr "Існують активні попередження щодо нарізаних моделей:" -#: src/slic3r/GUI/Plater.cpp:2825 src/slic3r/GUI/Plater.cpp:2843 +#: src/slic3r/GUI/Plater.cpp:3691 +msgid "generated warnings" +msgstr "згенеровані попередження" + +#: src/slic3r/GUI/Plater.cpp:3731 src/slic3r/GUI/PrintHostDialogs.cpp:265 +msgid "Cancelled" +msgstr "Скасовано" + +#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022 msgid "Remove the selected object" msgstr "Видалити вибраний об'єкт" -#: src/slic3r/GUI/Plater.cpp:2831 -msgid "Place one more copy of the selected object" -msgstr "Розташувати ще одну копію обраного об'єкта" +#: src/slic3r/GUI/Plater.cpp:4007 +msgid "Add one more instance of the selected object" +msgstr "Додати ще один екземпляр вибраного об’єкта" -#: src/slic3r/GUI/Plater.cpp:2833 -msgid "Decrease copies" -msgstr "Зменшити копії" +#: src/slic3r/GUI/Plater.cpp:4009 +msgid "Remove one instance of the selected object" +msgstr "Видалити один екземпляр вибраного об’єкта" -#: src/slic3r/GUI/Plater.cpp:2833 -msgid "Remove one copy of the selected object" -msgstr "Вилучіть одну копію обраного об'єкта" +#: src/slic3r/GUI/Plater.cpp:4011 +msgid "Set number of instances" +msgstr "Встановити кількість екземплярів" -#: src/slic3r/GUI/Plater.cpp:2835 -msgid "Set number of copies" -msgstr "" +#: src/slic3r/GUI/Plater.cpp:4011 +msgid "Change the number of instances of the selected object" +msgstr "Змінити кількість екземплярів виділеного об'єкта" -#: src/slic3r/GUI/Plater.cpp:2835 -msgid "Change the number of copies of the selected object" -msgstr "Змінити кількість копій обраного об'єкта" +#: src/slic3r/GUI/Plater.cpp:4013 +msgid "Fill bed with instances" +msgstr "Заповнити стіл екземплярами" -#: src/slic3r/GUI/Plater.cpp:2858 -msgid "Reload from Disk" -msgstr "Перезавантажити з диска" +#: src/slic3r/GUI/Plater.cpp:4013 +msgid "Fill the remaining area of bed with instances of the selected object" +msgstr "Заповнити залишок столу екземплярами обраного об'єкта" -#: src/slic3r/GUI/Plater.cpp:2858 -msgid "Reload the selected file from Disk" -msgstr "Перезавантажити вибраний файл із диска" +#: src/slic3r/GUI/Plater.cpp:4032 +msgid "Reload the selected object from disk" +msgstr "Перезавантажити вибраний об'єкт із диска" -#: src/slic3r/GUI/Plater.cpp:2861 +#: src/slic3r/GUI/Plater.cpp:4035 msgid "Export the selected object as STL file" -msgstr "" +msgstr "Експорт вибраного об'єкту як STL-файл" -#: src/slic3r/GUI/Plater.cpp:2873 +#: src/slic3r/GUI/Plater.cpp:4065 msgid "Along X axis" -msgstr "" +msgstr "Уздовж осі X" -#: src/slic3r/GUI/Plater.cpp:2873 +#: src/slic3r/GUI/Plater.cpp:4065 msgid "Mirror the selected object along the X axis" msgstr "Віддзеркалити виділений об'єкт уздовж осі Х" -#: src/slic3r/GUI/Plater.cpp:2875 +#: src/slic3r/GUI/Plater.cpp:4067 msgid "Along Y axis" -msgstr "" +msgstr "Уздовж осі Y" -#: src/slic3r/GUI/Plater.cpp:2875 +#: src/slic3r/GUI/Plater.cpp:4067 msgid "Mirror the selected object along the Y axis" msgstr "Віддзеркалити виділений об'єкт уздовж осі Y" -#: src/slic3r/GUI/Plater.cpp:2877 +#: src/slic3r/GUI/Plater.cpp:4069 msgid "Along Z axis" -msgstr "" +msgstr "Уздовж осі Z" -#: src/slic3r/GUI/Plater.cpp:2877 +#: src/slic3r/GUI/Plater.cpp:4069 msgid "Mirror the selected object along the Z axis" msgstr "Віддзеркалити виділений об'єкт уздовж осі Z" -#: src/slic3r/GUI/Plater.cpp:2880 +#: src/slic3r/GUI/Plater.cpp:4072 msgid "Mirror" msgstr "Віддзеркалити" -#: src/slic3r/GUI/Plater.cpp:2880 +#: src/slic3r/GUI/Plater.cpp:4072 msgid "Mirror the selected object" msgstr "Віддзеркалити виділений об'єкт" -#: src/slic3r/GUI/Plater.cpp:2898 +#: src/slic3r/GUI/Plater.cpp:4084 msgid "To objects" -msgstr "" +msgstr "На об'єкти" -#: src/slic3r/GUI/Plater.cpp:2898 src/slic3r/GUI/Plater.cpp:2920 +#: src/slic3r/GUI/Plater.cpp:4084 src/slic3r/GUI/Plater.cpp:4104 msgid "Split the selected object into individual objects" -msgstr "" +msgstr "Розділити вибраний об'єкт на окремі об'єкти" -#: src/slic3r/GUI/Plater.cpp:2900 +#: src/slic3r/GUI/Plater.cpp:4086 msgid "To parts" -msgstr "" +msgstr "На частини" -#: src/slic3r/GUI/Plater.cpp:2900 src/slic3r/GUI/Plater.cpp:2940 +#: src/slic3r/GUI/Plater.cpp:4086 src/slic3r/GUI/Plater.cpp:4122 msgid "Split the selected object into individual sub-parts" -msgstr "" +msgstr "Розділити вибраний об'єкт на окремі частини" -#: src/slic3r/GUI/Plater.cpp:2903 src/slic3r/GUI/Plater.cpp:2920 -#: src/slic3r/GUI/Plater.cpp:2940 src/libslic3r/PrintConfig.cpp:3075 +#: src/slic3r/GUI/Plater.cpp:4089 src/slic3r/GUI/Plater.cpp:4104 +#: src/slic3r/GUI/Plater.cpp:4122 src/libslic3r/PrintConfig.cpp:3759 msgid "Split" msgstr "Розділити" -#: src/slic3r/GUI/Plater.cpp:2903 +#: src/slic3r/GUI/Plater.cpp:4089 msgid "Split the selected object" -msgstr "" +msgstr "Розділити вибраний об'єкт" -#: src/slic3r/GUI/Plater.cpp:2926 +#: src/slic3r/GUI/Plater.cpp:4111 msgid "Optimize orientation" -msgstr "" +msgstr "Оптимізувати орієнтацію" -#: src/slic3r/GUI/Plater.cpp:2926 +#: src/slic3r/GUI/Plater.cpp:4112 msgid "Optimize the rotation of the object for better print results." +msgstr "Оптимізуйте обертання об’єкта для кращих результатів друку." + +#: src/slic3r/GUI/Plater.cpp:4192 +msgid "3D editor view" +msgstr "Перегляд у 3D-редакторі" + +#: src/slic3r/GUI/Plater.cpp:4564 +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 "" +"На момент створення Undo/Redo знімка був активний принтер %1%. Для " +"переключення на принтер %1% потрібно перезавантажити пресет %1%." + +#: src/slic3r/GUI/Plater.cpp:4768 +msgid "Load Project" +msgstr "Завантажити проект" + +#: src/slic3r/GUI/Plater.cpp:4800 +msgid "Import Objects" +msgstr "Імпорт об'єктів" + +#: src/slic3r/GUI/Plater.cpp:4868 +msgid "The selected file" +msgstr "Вибраний файл" + +#: src/slic3r/GUI/Plater.cpp:4868 +msgid "does not contain valid gcode." +msgstr "не містить дійсного G-коду." + +#: src/slic3r/GUI/Plater.cpp:4869 +msgid "Error while loading .gcode file" +msgstr "Помилка під час завантаження GCODE-файлу" + +#: src/slic3r/GUI/Plater.cpp:5107 +msgid "All objects will be removed, continue?" +msgstr "Усі об’єкти буде видалено, продовжити?" + +#: src/slic3r/GUI/Plater.cpp:5115 +msgid "Delete Selected Objects" +msgstr "Видалити вибрані об'єкти" + +#: src/slic3r/GUI/Plater.cpp:5123 +msgid "Increase Instances" +msgstr "Збільшити кількість копій" + +#: src/slic3r/GUI/Plater.cpp:5157 +msgid "Decrease Instances" +msgstr "Зменшити кількість копій" + +#: src/slic3r/GUI/Plater.cpp:5188 +msgid "Enter the number of copies:" +msgstr "Введіть кількість копій об'єкта:" + +#: src/slic3r/GUI/Plater.cpp:5189 +msgid "Copies of the selected object" +msgstr "Кількість копій обраного об'єкта" + +#: src/slic3r/GUI/Plater.cpp:5193 +#, c-format +msgid "Set numbers of copies to %d" +msgstr "Встановити кількість копій на %d" + +#: src/slic3r/GUI/Plater.cpp:5259 +msgid "Cut by Plane" +msgstr "Вирізати площиною" -#: src/slic3r/GUI/Plater.cpp:3342 +#: src/slic3r/GUI/Plater.cpp:5316 msgid "Save G-code file as:" -msgstr "" +msgstr "Зберегти G-код файл як:" -#: src/slic3r/GUI/Plater.cpp:3342 +#: src/slic3r/GUI/Plater.cpp:5316 msgid "Save SL1 file as:" -msgstr "" +msgstr "Зберегти SL1-файл як:" -#: src/slic3r/GUI/Plater.cpp:3397 +#: src/slic3r/GUI/Plater.cpp:5463 #, c-format msgid "STL file exported to %s" -msgstr "" +msgstr "STL-файл експортовано в %s" -#: src/slic3r/GUI/Plater.cpp:3413 +#: src/slic3r/GUI/Plater.cpp:5480 #, c-format msgid "AMF file exported to %s" -msgstr "" +msgstr "AMF-файл експортовано в %s" -#: src/slic3r/GUI/Plater.cpp:3416 +#: src/slic3r/GUI/Plater.cpp:5483 #, c-format msgid "Error exporting AMF file %s" -msgstr "" +msgstr "Помилка експортування AMF-файлу %s" -#: src/slic3r/GUI/Plater.cpp:3442 +#: src/slic3r/GUI/Plater.cpp:5512 #, c-format msgid "3MF file exported to %s" -msgstr "" +msgstr "3MF-файл експортовано в %s" -#: src/slic3r/GUI/Plater.cpp:3445 +#: src/slic3r/GUI/Plater.cpp:5517 #, c-format msgid "Error exporting 3MF file %s" -msgstr "" +msgstr "Помилка експортування 3MF-файлу %s" -#: src/slic3r/GUI/Plater.cpp:3673 +#: src/slic3r/GUI/Plater.cpp:6054 msgid "Export" -msgstr "" +msgstr "Експорт" -#: src/slic3r/GUI/Plater.cpp:3674 -msgid "Send G-code" -msgstr "" +#: src/slic3r/GUI/Plater.cpp:6149 +msgid "Paste From Clipboard" +msgstr "Вставити з буферу обміну" -#: src/slic3r/GUI/Preferences.cpp:17 src/slic3r/GUI/Tab.cpp:1762 -#: src/slic3r/GUI/Tab.cpp:1963 +#: src/slic3r/GUI/Preferences.cpp:56 src/slic3r/GUI/Tab.cpp:2098 +#: src/slic3r/GUI/Tab.cpp:2285 src/slic3r/GUI/Tab.cpp:2393 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1080 msgid "General" msgstr "Загальне" -#: src/slic3r/GUI/Preferences.cpp:34 +#: src/slic3r/GUI/Preferences.cpp:69 msgid "Remember output directory" msgstr "Пам'ятати вихідний каталог" -#: src/slic3r/GUI/Preferences.cpp:36 +#: src/slic3r/GUI/Preferences.cpp:71 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." @@ -2689,22 +6121,22 @@ msgstr "" "Якщо вибрано, Slic3r запропонує останню вихідну директорію замість тої, що " "вказана у вхідному файлі." -#: src/slic3r/GUI/Preferences.cpp:42 +#: src/slic3r/GUI/Preferences.cpp:77 msgid "Auto-center parts" msgstr "Автоцентрувати частини" -#: src/slic3r/GUI/Preferences.cpp:44 +#: src/slic3r/GUI/Preferences.cpp:79 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "" "Якщо вибрано, Slic3r автоматично орієнтує об'єкти навколо центру друку." -#: src/slic3r/GUI/Preferences.cpp:50 +#: src/slic3r/GUI/Preferences.cpp:85 msgid "Background processing" msgstr "Фонова обробка" -#: src/slic3r/GUI/Preferences.cpp:52 +#: src/slic3r/GUI/Preferences.cpp:87 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." @@ -2712,11 +6144,58 @@ msgstr "" "Якщо вибрано, Slic3r буде попередньо обробляти об'єкти, як тільки вони " "будуть завантажені, щоб заощадити час при експорті G-коду." -#: src/slic3r/GUI/Preferences.cpp:74 +#: src/slic3r/GUI/Preferences.cpp:96 +msgid "" +"If enabled, PrusaSlicer will check for the new versions of itself 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 "" +"Якщо увімкнено, PrusaSlicer перевірить наявність нових версій в Інтернеті. " +"Коли нова версія стає доступною, під час наступного запуску програми " +"з'явиться сповіщення (ніколи під час використання програми). Це лише " +"механізми сповіщення, автоматична установка не виконується." + +#: src/slic3r/GUI/Preferences.cpp:102 +msgid "Export sources full pathnames to 3mf and amf" +msgstr "Експортувати повні назви шляхів до 3MF та amf" + +#: src/slic3r/GUI/Preferences.cpp:104 +msgid "" +"If enabled, allows the Reload from disk command to automatically find and " +"load the files when invoked." +msgstr "" +"Якщо увімкнено, дозволяє команді Перезавантажити з диска автоматично " +"знаходити і завантажувати файли під час виклику." + +#: src/slic3r/GUI/Preferences.cpp:114 +msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." +msgstr "" +"Якщо увімкнено, встановлює PrusaSlicer як типову програму для відкриття 3MF-" +"файлів." + +#: src/slic3r/GUI/Preferences.cpp:121 +msgid "If enabled, sets PrusaSlicer as default application to open .stl files." +msgstr "" +"Якщо ввімкнено, програма PrusaSlicer за промовчанням відкриває STL-файли." + +#: src/slic3r/GUI/Preferences.cpp:131 +msgid "" +"If enabled, Slic3r 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 "" +"Якщо цей параметр увімкнено, Slic3r завантажує оновлення вбудованих пресетів " +"системи у фоновому режимі. Ці оновлення завантажуються в окреме тимчасове " +"місце розташування. Коли нова версія пресетів стає доступною, вона " +"пропонується під час запуску додатка." + +#: src/slic3r/GUI/Preferences.cpp:136 msgid "Suppress \" - default - \" presets" msgstr "Заборонити налаштування \"- за замовчуванням -\"" -#: src/slic3r/GUI/Preferences.cpp:76 +#: src/slic3r/GUI/Preferences.cpp:138 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." @@ -2724,806 +6203,1205 @@ msgstr "" "Заборонити налаштування \"- за замовчуванням -\" у параметрах Друк / " "Філамент / Принтер, якщо доступні інші діючі налаштування." -#: src/slic3r/GUI/Preferences.cpp:82 +#: src/slic3r/GUI/Preferences.cpp:144 msgid "Show incompatible print and filament presets" msgstr "Показувати несумісні налаштування друку та філаменту" -#: src/slic3r/GUI/Preferences.cpp:84 +#: src/slic3r/GUI/Preferences.cpp:146 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" msgstr "" -"Якщо вибрано, налаштування друку та філаменту відображаються у списку " -"налаштувань, навіть якщо вони позначені як несумісні з активним принтером" +"Якщо вибрано, пресети для друку та філаменту відображаються у списку " +"пресетів, навіть якщо вони позначені як несумісні з активним принтером" -#: src/slic3r/GUI/Preferences.cpp:91 -msgid "Use legacy OpenGL 1.1 rendering" -msgstr "Використовувати застарілий OpenGL 1.1 рендеринг" +#: src/slic3r/GUI/Preferences.cpp:152 +msgid "Show drop project dialog" +msgstr "Показати діалогове вікно при перетягуванні проекту" -#: src/slic3r/GUI/Preferences.cpp:93 +#: src/slic3r/GUI/Preferences.cpp:154 msgid "" -"If you have rendering issues caused by a buggy OpenGL 2.0 driver, you may " -"try to check this checkbox. This will disable the layer height editing and " -"anti aliasing, so it is likely better to upgrade your graphics driver." +"When checked, whenever dragging and dropping a project file on the " +"application, shows a dialog asking to select the action to take on the file " +"to load." msgstr "" -"Якщо у вас виникають проблеми з візуалізацією, спричинені помилковим " -"драйвером OpenGL 2.0, спробуйте вибрати цю опцію. Це призведе до вимкнення " -"редагування висоти шару та згладжування, тому краще оновити графічний " -"драйвер." +"Якщо вибрано, при перетягуванні файлу проекту у програмі відображається " +"діалогове вікно із запитом вибрати дію щодо файлу, який потрібно завантажити." -#: src/slic3r/GUI/Preferences.cpp:101 -msgid "Use Retina resolution for the 3D scene" +#: src/slic3r/GUI/Preferences.cpp:161 src/slic3r/GUI/Preferences.cpp:165 +msgid "Allow just a single PrusaSlicer instance" +msgstr "Дозволити лише один екземпляр PrusaSlicer" + +#: src/slic3r/GUI/Preferences.cpp:163 +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" +"На OSX завжди є лише один екземпляр програми, який працює за замовчуванням. " +"Однак дозволяється запускати кілька екземплярів одного додатка з командного " +"рядка. У такому випадку ці налаштування дозволять лише один екземпляр." + +#: src/slic3r/GUI/Preferences.cpp:167 +msgid "" +"If this is enabled, when starting PrusaSlicer and another instance of the " +"same PrusaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" +"Якщо увімкнено, то під час запуску нового екземпляра PrusaSlicer при " +"наявності вже запущеного того самого PrusaSlicer, буде тільки повторно " +"активовано старий екземпляр." + +#: src/slic3r/GUI/Preferences.cpp:173 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:671 +msgid "Ask for unsaved changes when closing application" +msgstr "Питати про незбережені зміни при закритті програми" + +#: src/slic3r/GUI/Preferences.cpp:175 +msgid "When closing the application, always ask for unsaved changes" +msgstr "Завжди питати про незбережені зміни при закритті програми" + +#: src/slic3r/GUI/Preferences.cpp:180 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:672 +msgid "Ask for unsaved changes when selecting new preset" +msgstr "Питати про незбережені зміни при виборі нового пресету" + +#: src/slic3r/GUI/Preferences.cpp:182 +msgid "Always ask for unsaved changes when selecting new preset" +msgstr "Завжди запитуйте про незбережені зміни при виборі нового пресету" + +#: src/slic3r/GUI/Preferences.cpp:190 +msgid "Associate .gcode files to PrusaSlicer G-code Viewer" +msgstr "Зв’язати gcode-файли з PrusaSlicer Переглядачем G-коду" + +#: src/slic3r/GUI/Preferences.cpp:192 +msgid "" +"If enabled, sets PrusaSlicer G-code Viewer as default application to open ." +"gcode files." msgstr "" +"Якщо увімкнено, встановлює \"PrusaSlicer Переглядач G-коду\" як програму за " +"замовчуванням для відкриття GCODE-файлів." + +#: src/slic3r/GUI/Preferences.cpp:201 +msgid "Use Retina resolution for the 3D scene" +msgstr "Використовувати роздільну здатність Retina для 3D сцени" -#: src/slic3r/GUI/Preferences.cpp:103 +#: src/slic3r/GUI/Preferences.cpp:203 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." msgstr "" +"Якщо увімкнено, 3D-сцена відображатиметься з роздільною здатністю Retina. " +"Якщо у вас виникають проблеми з продуктивністю 3D, вимкнення цієї опції може " +"допомогти." -#: src/slic3r/GUI/Preferences.cpp:126 -msgid "You need to restart Slic3r to make the changes effective." -msgstr "З метою ефективності зміни, Вам потрібно буде перезапустити Slic3r." +#: src/slic3r/GUI/Preferences.cpp:211 src/slic3r/GUI/Preferences.cpp:213 +msgid "Show splash screen" +msgstr "Показувати заставку" -#: src/slic3r/GUI/Preset.cpp:207 -msgid "modified" -msgstr "модифікований" +#: src/slic3r/GUI/Preferences.cpp:220 +msgid "Enable support for legacy 3DConnexion devices" +msgstr "Увімкнути підтримку застарілих пристроїв 3DConnexion" -#: src/slic3r/GUI/Preset.cpp:918 src/slic3r/GUI/Preset.cpp:958 -#: src/slic3r/GUI/Preset.cpp:1011 src/slic3r/GUI/Preset.cpp:1043 -#: src/slic3r/GUI/PresetBundle.cpp:1484 src/slic3r/GUI/PresetBundle.cpp:1537 -msgid "System presets" -msgstr "Системні налаштування" +#: src/slic3r/GUI/Preferences.cpp:222 +msgid "" +"If enabled, the legacy 3DConnexion devices settings dialog is available by " +"pressing CTRL+M" +msgstr "" +"Якщо увімкнено, діалогове вікно налаштувань пристроїв 3DConnexion доступне, " +"натиснувши CTRL+M" -#: src/slic3r/GUI/Preset.cpp:962 src/slic3r/GUI/Preset.cpp:1047 -#: src/slic3r/GUI/PresetBundle.cpp:1542 -msgid "User presets" -msgstr "Налаштування користувача" +#: src/slic3r/GUI/Preferences.cpp:232 +msgid "Camera" +msgstr "Камера" + +#: src/slic3r/GUI/Preferences.cpp:237 +msgid "Use perspective camera" +msgstr "Використовувати перспективну камеру" -#: src/slic3r/GUI/Preset.cpp:991 src/slic3r/GUI/Tab.cpp:247 -msgid "Add a new printer" +#: src/slic3r/GUI/Preferences.cpp:239 +msgid "" +"If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" +"Якщо увімкнено, використовуватиметься перспективна камера. Якщо вимкнено, " +"використовуватиметься ортографічна камера." -#: src/slic3r/GUI/Preset.cpp:1251 -msgid "filament" +#: src/slic3r/GUI/Preferences.cpp:244 +msgid "Use free camera" +msgstr "Використовувати вільну камеру" + +#: src/slic3r/GUI/Preferences.cpp:246 +msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" +"Якщо увімкнено, використовуватиметься вільна камера. Якщо вимкнено, " +"використовуватиметься камера з обмеженими можливостями." -#: src/slic3r/GUI/PresetHints.cpp:28 -#, c-format +#: src/slic3r/GUI/Preferences.cpp:251 +msgid "Reverse direction of zoom with mouse wheel" +msgstr "Зворотний напрямок масштабування за допомогою колеса миші" + +#: src/slic3r/GUI/Preferences.cpp:253 +msgid "If enabled, reverses the direction of zoom with mouse wheel" +msgstr "Якщо увімкнено, змінює напрямок масштабування за допомогою колеса миші" + +#: src/slic3r/GUI/Preferences.cpp:261 +msgid "GUI" +msgstr "Графічний інтерфейс" + +#: src/slic3r/GUI/Preferences.cpp:276 +msgid "Sequential slider applied only to top layer" +msgstr "Послідовний повзунок застосовується лише до верхнього шару" + +#: src/slic3r/GUI/Preferences.cpp:278 msgid "" -"If estimated layer time is below ~%ds, fan will run at %d%% and print speed " -"will be reduced so that no less than %ds are spent on that layer (however, " -"speed will never be reduced below %dmm/s)." +"If enabled, changes made using the sequential slider, in preview, apply only " +"to gcode top layer. If disabled, changes made using the sequential slider, " +"in preview, apply to the whole gcode." msgstr "" -"Якщо запланований час друку шару нижче ~%dс, вентилятор буде працювати на%d" -"%%, і швидкість друку буде зменшена, так що на цей шар витрачається не менше " -"%dс (однак швидкість ніколи не зменшиться нижче %d mm/s) ." +"Якщо увімкнено, зміни, внесені за допомогою послідовного повзунка, у " +"попередньому перегляді застосовуються лише до верхнього шару G-коду. Якщо " +"вимкнено, зміни, внесені за допомогою послідовного повзунка, у попередньому " +"перегляді застосовуються до цілого G-коду." -#: src/slic3r/GUI/PresetHints.cpp:32 -#, c-format +#: src/slic3r/GUI/Preferences.cpp:285 +msgid "Show sidebar collapse/expand button" +msgstr "Показувати кнопку згортання/розгортання бічної панелі" + +#: src/slic3r/GUI/Preferences.cpp:287 msgid "" -"\n" -"If estimated layer time is greater, but still below ~%ds, fan will run at a " -"proportionally decreasing speed between %d%% and %d%%." +"If enabled, the button for the collapse sidebar will be appeared in top " +"right corner of the 3D Scene" msgstr "" -"\n" -"Якщо запланований час друку шару більше, але все ще нижче ~%dс, вентилятор " -"буде працювати з пропорційно зменшуваною швидкістю між %d%% та %d%%." +"Якщо увімкнено, у верхньому правому куті 3D-сцени з’явиться кнопка згортання " +"бічної панелі" + +#: src/slic3r/GUI/Preferences.cpp:292 +msgid "Suppress to open hyperlink in browser" +msgstr "Заборонити відкриття гіперпосилань у браузері" -#: src/slic3r/GUI/PresetHints.cpp:36 +#: src/slic3r/GUI/Preferences.cpp:294 msgid "" -"\n" -"During the other layers, fan " +"If enabled, the descriptions of configuration parameters in settings tabs " +"wouldn't work as hyperlinks. If disabled, the descriptions of configuration " +"parameters in settings tabs will work as hyperlinks." msgstr "" -"\n" -"Під час друку інших шарів вентилятор " +"Якщо увімкнено, описи параметрів конфігурації на вкладках параметрів не " +"працюватимуть як гіперпосилання. Якщо вимкнено, описи параметрів " +"конфігурації на вкладках параметрів працюватимуть як гіперпосилання." -#: src/slic3r/GUI/PresetHints.cpp:38 -msgid "Fan " -msgstr "Вентилятор " +#: src/slic3r/GUI/Preferences.cpp:300 +msgid "Use custom size for toolbar icons" +msgstr "" +"Використовуйте користувацький розмір для піктограм на панелі інструментів" -#: src/slic3r/GUI/PresetHints.cpp:43 -#, c-format -msgid "will always run at %d%% " -msgstr "буде завжди працювати на %d%% " +#: src/slic3r/GUI/Preferences.cpp:302 +msgid "If enabled, you can change size of toolbar icons manually." +msgstr "" +"Якщо увімкнено, ви можете змінювати розмір піктограм на панелі інструментів " +"вручну." + +#: src/slic3r/GUI/Preferences.cpp:320 +msgid "Render" +msgstr "Візуалізувати" -#: src/slic3r/GUI/PresetHints.cpp:46 +#: src/slic3r/GUI/Preferences.cpp:325 +msgid "Use environment map" +msgstr "Використовуйте карту середовища" + +#: src/slic3r/GUI/Preferences.cpp:327 +msgid "If enabled, renders object using the environment map." +msgstr "Якщо увімкнено, візуалізує об’єкт за допомогою карти середовища." + +#: src/slic3r/GUI/Preferences.cpp:352 #, c-format -msgid "except for the first %d layers" -msgstr "за винятком перших %d шарів" +msgid "You need to restart %s to make the changes effective." +msgstr "З метою ефективності зміни, Вам потрібно буде перезапустити %s." + +#: src/slic3r/GUI/Preferences.cpp:427 +msgid "Icon size in a respect to the default size" +msgstr "Розмір піктограми відносно розміру за промовчанням" + +#: src/slic3r/GUI/Preferences.cpp:442 +msgid "Select toolbar icon size in respect to the default one." +msgstr "" +"Виберіть розмір піктограми панелі інструментів щодо розміру за замовчуванням." + +#: src/slic3r/GUI/Preferences.cpp:473 +msgid "Old regular layout with the tab bar" +msgstr "Старий звичайний макет із панеллю вкладок" + +#: src/slic3r/GUI/Preferences.cpp:474 +msgid "New layout, access via settings button in the top menu" +msgstr "Нове розташування, доступ через кнопку налаштувань у верхньому меню" + +#: src/slic3r/GUI/Preferences.cpp:475 +msgid "Settings in non-modal window" +msgstr "Налаштування у немодальному вікні" + +#: src/slic3r/GUI/Preferences.cpp:484 +msgid "Layout Options" +msgstr "Параметри розташування" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:197 +#: src/slic3r/GUI/PresetComboBoxes.cpp:235 +#: src/slic3r/GUI/PresetComboBoxes.cpp:761 +#: src/slic3r/GUI/PresetComboBoxes.cpp:811 +#: src/slic3r/GUI/PresetComboBoxes.cpp:925 +#: src/slic3r/GUI/PresetComboBoxes.cpp:969 +msgid "System presets" +msgstr "Системні налаштування" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:239 +#: src/slic3r/GUI/PresetComboBoxes.cpp:815 +#: src/slic3r/GUI/PresetComboBoxes.cpp:973 +msgid "User presets" +msgstr "Налаштування користувача" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:250 +msgid "Incompatible presets" +msgstr "Несумісні пресети" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:285 +msgid "Are you sure you want to delete \"%1%\" printer?" +msgstr "Ви впевнені, що хочете видалити принтер \"%1%\"?" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:287 +msgid "Delete Physical Printer" +msgstr "Видалити фізичний принтер" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:624 +msgid "Click to edit preset" +msgstr "Клацніть, щоб змінити пресет" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:680 +#: src/slic3r/GUI/PresetComboBoxes.cpp:710 +msgid "Add/Remove presets" +msgstr "Додати/Видалити пресети" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:685 +#: src/slic3r/GUI/PresetComboBoxes.cpp:715 src/slic3r/GUI/Tab.cpp:2990 +msgid "Add physical printer" +msgstr "Додати фізичний принтер" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:699 +msgid "Edit preset" +msgstr "Редагувати пресет" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:703 src/slic3r/GUI/Tab.cpp:2990 +msgid "Edit physical printer" +msgstr "Редагувати фізичний принтер" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:706 +msgid "Delete physical printer" +msgstr "Видалити фізичний принтер" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:826 +#: src/slic3r/GUI/PresetComboBoxes.cpp:987 +msgid "Physical printers" +msgstr "Фізичний принтер" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:850 +msgid "Add/Remove filaments" +msgstr "Додати/Видалити філаменти" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:852 +msgid "Add/Remove materials" +msgstr "Додати/Видалити матеріали" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:854 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1011 +msgid "Add/Remove printers" +msgstr "Додати/Видалити прінтери" + +#: src/slic3r/GUI/PresetHints.cpp:32 +msgid "" +"If estimated layer time is below ~%1%s, fan will run at %2%%% and print " +"speed will be reduced so that no less than %3%s are spent on that layer " +"(however, speed will never be reduced below %4%mm/s)." +msgstr "" +"Якщо передбачуваний час шару менше ~%1%s, вентилятор працюватиме на %2%%% і " +"швидкість друку буде зменшена, так що на цей шар буде витрачено не менше " +"%3%s (однак швидкість ніколи не зменшиться нижче %4%мм/с)." + +#: src/slic3r/GUI/PresetHints.cpp:39 +msgid "" +"If estimated layer time is greater, but still below ~%1%s, fan will run at a " +"proportionally decreasing speed between %2%%% and %3%%%." +msgstr "" +"Якщо передбачуваний час шару більше, але все ще менше ~%1%s, вентилятор " +"працюватиме із пропорційно зменшуваною швидкістю між %2%%% і %3%%%." -#: src/slic3r/GUI/PresetHints.cpp:50 -msgid "except for the first layer" -msgstr "за винятком першого шару" +#: src/slic3r/GUI/PresetHints.cpp:49 +msgid "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%." +msgstr "" +"Швидкість вентилятора буде збільшена з нуля на шарі %1% до %2%%% на шарі %3%." + +#: src/slic3r/GUI/PresetHints.cpp:51 +msgid "During the other layers, fan will always run at %1%%%" +msgstr "Під час інших шарів вентилятор завжди працюватиме на %1%%%" + +#: src/slic3r/GUI/PresetHints.cpp:51 +msgid "Fan will always run at %1%%%" +msgstr "Вентилятор завжди працюватиме на %1%%%" + +#: src/slic3r/GUI/PresetHints.cpp:53 +msgid "except for the first %1% layers." +msgstr "за винятком перших %1% шарів." -#: src/slic3r/GUI/PresetHints.cpp:52 -msgid "will be turned off." -msgstr "буде вимкнено." +#: src/slic3r/GUI/PresetHints.cpp:55 +msgid "except for the first layer." +msgstr "за винятком першого шару." -#: src/slic3r/GUI/PresetHints.cpp:153 +#: src/slic3r/GUI/PresetHints.cpp:58 +msgid "During the other layers, fan will be turned off." +msgstr "Під час інших шарів вентилятор буде вимкнено." + +#: src/slic3r/GUI/PresetHints.cpp:58 +msgid "Fan will be turned off." +msgstr "Вентилятор буде вимкнено." + +#: src/slic3r/GUI/PresetHints.cpp:159 msgid "external perimeters" msgstr "зовнішні периметри" -#: src/slic3r/GUI/PresetHints.cpp:162 +#: src/slic3r/GUI/PresetHints.cpp:168 msgid "perimeters" msgstr "периметри" -#: src/slic3r/GUI/PresetHints.cpp:171 +#: src/slic3r/GUI/PresetHints.cpp:177 msgid "infill" msgstr "наповнення" -#: src/slic3r/GUI/PresetHints.cpp:181 +#: src/slic3r/GUI/PresetHints.cpp:187 msgid "solid infill" msgstr "суцільне наповнення" -#: src/slic3r/GUI/PresetHints.cpp:189 +#: src/slic3r/GUI/PresetHints.cpp:195 msgid "top solid infill" msgstr "верхній суцільне наповнення" -#: src/slic3r/GUI/PresetHints.cpp:200 +#: src/slic3r/GUI/PresetHints.cpp:206 msgid "support" msgstr "підтримка" -#: src/slic3r/GUI/PresetHints.cpp:210 +#: src/slic3r/GUI/PresetHints.cpp:216 msgid "support interface" msgstr "інтерфейс підтримки" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:222 msgid "First layer volumetric" msgstr "Об'єм першого шару" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:222 msgid "Bridging volumetric" msgstr "Об'єм мостів" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:222 msgid "Volumetric" msgstr "Об'ємний" -#: src/slic3r/GUI/PresetHints.cpp:217 -msgid " flow rate is maximized " -msgstr " швидкість потоку максимізується " +#: src/slic3r/GUI/PresetHints.cpp:223 +msgid "flow rate is maximized" +msgstr "швидкість потоку максимізується" -#: src/slic3r/GUI/PresetHints.cpp:220 +#: src/slic3r/GUI/PresetHints.cpp:226 msgid "by the print profile maximum" msgstr "за профілем друку максимум" -#: src/slic3r/GUI/PresetHints.cpp:221 -msgid "when printing " -msgstr "коли друкуємо " - -#: src/slic3r/GUI/PresetHints.cpp:222 -msgid " with a volumetric rate " -msgstr " з об'ємною швидкістю " - -#: src/slic3r/GUI/PresetHints.cpp:226 -#, c-format -msgid "%3.2f mm³/s" -msgstr "%3.2f мм³/с" +#: src/slic3r/GUI/PresetHints.cpp:227 +msgid "when printing" +msgstr "коли друкуємо" #: src/slic3r/GUI/PresetHints.cpp:228 +msgid "with a volumetric rate" +msgstr "з об'ємною швидкістю" + +#: src/slic3r/GUI/PresetHints.cpp:232 #, c-format -msgid " at filament speed %3.2f mm/s." -msgstr " при швидкості філаменту %3.2f мм/с." +msgid "%3.2f mm³/s at filament speed %3.2f mm/s." +msgstr "%3.2f мм³/с при швидкості філаменту %3.2f мм/с." -#: src/slic3r/GUI/PresetHints.cpp:247 +#: src/slic3r/GUI/PresetHints.cpp:250 msgid "" "Recommended object thin wall thickness: Not available due to invalid layer " "height." msgstr "" -"Рекомендований об'єкт товщиною тонкої стінки: Недоступний через невірне " -"значення висоти шару." +"Рекомендована товщина стінки об'єкту: Недоступний через невірне значення " +"висоти шару." -#: src/slic3r/GUI/PresetHints.cpp:264 +#: src/slic3r/GUI/PresetHints.cpp:266 #, c-format -msgid "Recommended object thin wall thickness for layer height %.2f and " -msgstr "Рекомендована товщина стінки для висоти шару %.2f та " +msgid "Recommended object thin wall thickness for layer height %.2f and" +msgstr "Рекомендована товщина стінки об'єкту для висоти шару %.2f та" -#: src/slic3r/GUI/PresetHints.cpp:271 +#: src/slic3r/GUI/PresetHints.cpp:273 #, c-format -msgid "%d lines: %.2lf mm" -msgstr "%d рядків: %.2lf мм" +msgid "%d lines: %.2f mm" +msgstr "%d рядків: %.2f мм" -#: src/slic3r/GUI/PrintHostDialogs.cpp:32 -msgid "Send G-Code to printer host" +#: src/slic3r/GUI/PresetHints.cpp:277 +msgid "" +"Recommended object thin wall thickness: Not available due to excessively " +"small extrusion width." msgstr "" +"Рекомендована товщина стінки об'єкту: Недоступний через надмірно малу ширину " +"екструзії." -#: src/slic3r/GUI/PrintHostDialogs.cpp:32 -msgid "Upload to Printer Host with the following filename:" +#: src/slic3r/GUI/PresetHints.cpp:306 +msgid "" +"Top / bottom shell thickness hint: Not available due to invalid layer height." msgstr "" +"Підказка щодо товщини верхньої/нижньої оболонки: Недоступна через " +"неправильну висоту шару." + +#: src/slic3r/GUI/PresetHints.cpp:319 +msgid "Top shell is %1% mm thick for layer height %2% mm." +msgstr "Верхня оболонка має товщину %1% мм для висоти шару %2% мм." + +#: src/slic3r/GUI/PresetHints.cpp:322 +msgid "Minimum top shell thickness is %1% mm." +msgstr "Мінімальна товщина верхньої оболонки становить %1% мм." + +#: src/slic3r/GUI/PresetHints.cpp:325 +msgid "Top is open." +msgstr "Верх відкритий." + +#: src/slic3r/GUI/PresetHints.cpp:338 +msgid "Bottom shell is %1% mm thick for layer height %2% mm." +msgstr "Нижня оболонка має товщину %1% мм для висоти шару %2% мм." + +#: src/slic3r/GUI/PresetHints.cpp:341 +msgid "Minimum bottom shell thickness is %1% mm." +msgstr "Мінімальна товщина нижньої оболонки становить %1% мм." + +#: src/slic3r/GUI/PresetHints.cpp:344 +msgid "Bottom is open." +msgstr "Внизу відкрито." + +#: src/slic3r/GUI/PrintHostDialogs.cpp:35 +msgid "Send G-Code to printer host" +msgstr "Надіслання G-коду на хост друку" -#: src/slic3r/GUI/PrintHostDialogs.cpp:34 +#: src/slic3r/GUI/PrintHostDialogs.cpp:35 +msgid "Upload to Printer Host with the following filename:" +msgstr "Завантажити на хост принтера з таким ім’ям файлу:" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:37 msgid "Start printing after upload" -msgstr "" +msgstr "Почати друк після заведення" -#: src/slic3r/GUI/PrintHostDialogs.cpp:41 +#: src/slic3r/GUI/PrintHostDialogs.cpp:45 msgid "Use forward slashes ( / ) as a directory separator if needed." -msgstr "" +msgstr "За потреби використовуйте скісні риски (/) як роздільник каталогів." + +#: src/slic3r/GUI/PrintHostDialogs.cpp:58 +msgid "Group" +msgstr "Group" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:176 +msgid "ID" +msgstr "ID" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:177 +msgid "Progress" +msgstr "Прогрес" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:178 +msgid "Status" +msgstr "Статус" -#: src/slic3r/GUI/PrintHostDialogs.cpp:157 +#: src/slic3r/GUI/PrintHostDialogs.cpp:179 +msgid "Host" +msgstr "Хост" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:180 +msgid "Filename" +msgstr "Ім'я файлу" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:181 +msgid "Error Message" +msgstr "Повідомлення про помилку" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:184 msgid "Cancel selected" -msgstr "" +msgstr "Скасувати вибране" -#: src/slic3r/GUI/PrintHostDialogs.cpp:159 +#: src/slic3r/GUI/PrintHostDialogs.cpp:186 msgid "Show error message" -msgstr "" +msgstr "Показати повідомлення про помилку" -#: src/slic3r/GUI/PrintHostDialogs.cpp:198 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/PrintHostDialogs.cpp:228 +#: src/slic3r/GUI/PrintHostDialogs.cpp:261 msgid "Enqueued" -msgstr "" +msgstr "У черзі" -#: src/slic3r/GUI/PrintHostDialogs.cpp:218 +#: src/slic3r/GUI/PrintHostDialogs.cpp:262 msgid "Uploading" +msgstr "Завантаження" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:266 +msgid "Completed" +msgstr "Завершено" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +msgid "Error uploading to print host:" +msgstr "Помилка завантаження на хост друку:" + +#: src/slic3r/GUI/RammingChart.cpp:23 +msgid "NO RAMMING AT ALL" +msgstr "ВЗАГАЛІ БЕЗ раммінгу" + +#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 +#: src/libslic3r/PrintConfig.cpp:706 src/libslic3r/PrintConfig.cpp:750 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:2636 +#: src/libslic3r/PrintConfig.cpp:2645 src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2763 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 +#: src/libslic3r/PrintConfig.cpp:2794 +msgid "s" +msgstr "с" + +#: src/slic3r/GUI/RammingChart.cpp:81 +msgid "Volumetric speed" +msgstr "Об'ємна швидкість" + +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:663 +#: src/libslic3r/PrintConfig.cpp:1458 +msgid "mm³/s" +msgstr "мм³/с" + +#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#, c-format +msgid "Save %s as:" +msgstr "Зберегти %s як:" + +#: src/slic3r/GUI/SavePresetDialog.cpp:110 +msgid "the following suffix is not allowed:" +msgstr "такий суфікс не допускається:" + +#: src/slic3r/GUI/SavePresetDialog.cpp:116 +msgid "The supplied name is not available." +msgstr "Надане ім'я недоступне." + +#: src/slic3r/GUI/SavePresetDialog.cpp:122 +msgid "Cannot overwrite a system profile." +msgstr "Неможливо замінити системний профіль." + +#: src/slic3r/GUI/SavePresetDialog.cpp:127 +msgid "Cannot overwrite an external profile." +msgstr "Неможливо замінити сторонній профіль." + +#: src/slic3r/GUI/SavePresetDialog.cpp:134 +msgid "Preset with name \"%1%\" already exists." +msgstr "Пресет з ім'ям \"%1%\" вже існує." + +#: src/slic3r/GUI/SavePresetDialog.cpp:136 +msgid "" +"Preset with name \"%1%\" already exists and is incompatible with selected " +"printer." +msgstr "Пресет з ім'ям \"%1%\" вже існує і несумісний з вибраним принтером." + +#: src/slic3r/GUI/SavePresetDialog.cpp:137 +msgid "Note: This preset will be replaced after saving" +msgstr "Примітка: Цей пресет буде замінено після збереження" + +#: src/slic3r/GUI/SavePresetDialog.cpp:142 +msgid "The name cannot be empty." +msgstr "Ім'я не може бути порожнім." + +#: src/slic3r/GUI/SavePresetDialog.cpp:147 +msgid "The name cannot start with space character." +msgstr "Ім'я не може починатися з пробілу." + +#: src/slic3r/GUI/SavePresetDialog.cpp:152 +msgid "The name cannot end with space character." +msgstr "Ім'я не може закінчуватися пробілом." + +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "Save preset" +msgstr "Зберегти налаштування" + +#: src/slic3r/GUI/SavePresetDialog.cpp:215 +msgctxt "PresetName" +msgid "Copy" +msgstr "Копія" + +#: src/slic3r/GUI/SavePresetDialog.cpp:273 +msgid "" +"You have selected physical printer \"%1%\" \n" +"with related printer preset \"%2%\"" msgstr "" +"Ви вибрали фізичний принтер \"%1%\"\n" +"із пов'язаним пресетом \"%2%\"" + +#: src/slic3r/GUI/SavePresetDialog.cpp:306 +msgid "What would you like to do with \"%1%\" preset after saving?" +msgstr "Що ви хочете зробити із пресетом \"%1%\" після збереження?" + +#: src/slic3r/GUI/SavePresetDialog.cpp:309 +msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" +msgstr "Для цього фізичного принтера \"%3%\" змінити \"%1%\" на \"%2%\"" + +#: src/slic3r/GUI/SavePresetDialog.cpp:310 +msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" +msgstr "Додати \"%1%\" як наступний пресет для фізичного принтера \"%2%\"" + +#: src/slic3r/GUI/SavePresetDialog.cpp:311 +msgid "Just switch to \"%1%\" preset" +msgstr "Просто переключитися до пресету \"%1%\"" + +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2421 +msgid "Stealth" +msgstr "Тихий" + +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2415 +msgid "Normal" +msgstr "Нормальний" + +#: src/slic3r/GUI/Selection.cpp:172 +msgid "Selection-Add" +msgstr "Виділення - Додано" + +#: src/slic3r/GUI/Selection.cpp:213 +msgid "Selection-Remove" +msgstr "Виділення - Видалено" + +#: src/slic3r/GUI/Selection.cpp:245 +msgid "Selection-Add Object" +msgstr "Виділення - Додано об'єкт" + +#: src/slic3r/GUI/Selection.cpp:264 +msgid "Selection-Remove Object" +msgstr "Виділення - Видалено об'єкт" + +#: src/slic3r/GUI/Selection.cpp:282 +msgid "Selection-Add Instance" +msgstr "Виділення - Додано екземпляр" -#: src/slic3r/GUI/PrintHostDialogs.cpp:222 -msgid "Completed" -msgstr "" +#: src/slic3r/GUI/Selection.cpp:301 +msgid "Selection-Remove Instance" +msgstr "Виділення - Видалено екземпляр" -#: src/slic3r/GUI/PrintHostDialogs.cpp:260 -msgid "Error uploading to print host:" -msgstr "" +#: src/slic3r/GUI/Selection.cpp:402 +msgid "Selection-Add All" +msgstr "Виділення - Додано все" -#: src/slic3r/GUI/RammingChart.cpp:23 -msgid "NO RAMMING AT ALL" -msgstr "" +#: src/slic3r/GUI/Selection.cpp:428 +msgid "Selection-Remove All" +msgstr "Виділення - Видалено все" -#: src/slic3r/GUI/RammingChart.cpp:76 -msgid "Time" -msgstr "" +#: src/slic3r/GUI/Selection.cpp:960 +msgid "Scale To Fit" +msgstr "Масштабувати під область друку" -#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/RammingChart.cpp:81 -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 src/libslic3r/PrintConfig.cpp:611 -#: src/libslic3r/PrintConfig.cpp:655 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2250 -#: src/libslic3r/PrintConfig.cpp:2308 src/libslic3r/PrintConfig.cpp:2315 -msgid "s" -msgstr "" +#: src/slic3r/GUI/Selection.cpp:1487 +msgid "Set Printable Instance" +msgstr "Встановити екземпляр \"Для друку\"" -#: src/slic3r/GUI/RammingChart.cpp:81 -msgid "Volumetric speed" -msgstr "" +#: src/slic3r/GUI/Selection.cpp:1487 +msgid "Set Unprintable Instance" +msgstr "Встановити екземпляр \"Не для друку\"" -#: src/slic3r/GUI/SysInfoDialog.cpp:44 -msgid "Slic3r Prusa Edition - System Information" -msgstr "" +#: src/slic3r/GUI/SysInfoDialog.cpp:82 +msgid "System Information" +msgstr "Інформація про систему" -#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:228 +#: src/slic3r/GUI/SysInfoDialog.cpp:158 +msgid "Copy to Clipboard" +msgstr "Скопіювати в буфер обміну" + +#: src/slic3r/GUI/Tab.cpp:109 src/libslic3r/PrintConfig.cpp:321 msgid "Compatible printers" msgstr "Сумісні принтери" -#: src/slic3r/GUI/Tab.cpp:51 +#: src/slic3r/GUI/Tab.cpp:110 msgid "Select the printers this profile is compatible with." msgstr "Оберіть принтери, сумісні з цим профілем." -#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:243 +#: src/slic3r/GUI/Tab.cpp:115 src/libslic3r/PrintConfig.cpp:336 msgid "Compatible print profiles" -msgstr "" +msgstr "Сумісні пресети друку" -#: src/slic3r/GUI/Tab.cpp:57 +#: src/slic3r/GUI/Tab.cpp:116 msgid "Select the print profiles this profile is compatible with." -msgstr "" +msgstr "Оберіть профілі друку, з якими цей профіль сумісний." -#: src/slic3r/GUI/Tab.cpp:132 -msgid "Save current " -msgstr "Зберегти поточний " +#. TRN "Save current Settings" +#: src/slic3r/GUI/Tab.cpp:211 +#, c-format +msgid "Save current %s" +msgstr "Зберегти поточний %s" -#: src/slic3r/GUI/Tab.cpp:133 +#: src/slic3r/GUI/Tab.cpp:212 msgid "Delete this preset" msgstr "Видалити це налаштування" -#: src/slic3r/GUI/Tab.cpp:145 +#: src/slic3r/GUI/Tab.cpp:216 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." msgstr "" +"Наведіть курсор на кнопки, щоб знайти додаткову інформацію\n" +"або натисніть цю кнопку." -#: src/slic3r/GUI/Tab.cpp:858 -msgid "It's a default preset." -msgstr "" +#: src/slic3r/GUI/Tab.cpp:220 +msgid "Search in settings [%1%]" +msgstr "Шукайте в налаштуваннях [%1%]" + +#: src/slic3r/GUI/Tab.cpp:1237 +msgid "Detach from system preset" +msgstr "Від'єднати від системного пресету" -#: src/slic3r/GUI/Tab.cpp:859 -msgid "It's a system preset." +#: src/slic3r/GUI/Tab.cpp:1250 +msgid "" +"A copy of the current system preset will be created, which will be detached " +"from the system preset." msgstr "" +"Буде створено копію поточного системного пресету, який буде від'єднано від " +"системного пресету." -#: src/slic3r/GUI/Tab.cpp:860 -msgid "Current preset is inherited from " +#: src/slic3r/GUI/Tab.cpp:1251 +msgid "" +"The current custom preset will be detached from the parent system preset." msgstr "" +"Поточний власний пресет буде від'єднаний від батьківського системного " +"пресету." -#: src/slic3r/GUI/Tab.cpp:865 -msgid "It can't be deleted or modified. " +#: src/slic3r/GUI/Tab.cpp:1254 +msgid "Modifications to the current profile will be saved." +msgstr "Зміни до поточного профілю буде збережено." + +#: src/slic3r/GUI/Tab.cpp:1257 +msgid "" +"This action is not revertable.\n" +"Do you want to proceed?" msgstr "" +"Цю дію не можна повернути.\n" +"Ви хочете продовжити?" + +#: src/slic3r/GUI/Tab.cpp:1259 +msgid "Detach preset" +msgstr "Від'єднати пресет" + +#: src/slic3r/GUI/Tab.cpp:1285 +msgid "This is a default preset." +msgstr "Цей пресет є пресетом за-замовчуванням." + +#: src/slic3r/GUI/Tab.cpp:1287 +msgid "This is a system preset." +msgstr "Цей пресет є системним пресетом." + +#: src/slic3r/GUI/Tab.cpp:1289 +msgid "Current preset is inherited from the default preset." +msgstr "Поточний пресет успадковується від пресету за замовчуванням." + +#: src/slic3r/GUI/Tab.cpp:1293 +msgid "Current preset is inherited from" +msgstr "Поточний пресет успадковується від" -#: src/slic3r/GUI/Tab.cpp:866 +#: src/slic3r/GUI/Tab.cpp:1297 +msgid "It can't be deleted or modified." +msgstr "Його не можна видалити або змінити." + +#: src/slic3r/GUI/Tab.cpp:1298 msgid "" -"Any modifications should be saved as a new preset inherited from this one. " +"Any modifications should be saved as a new preset inherited from this one." msgstr "" +"Будь-які модифікації слід зберігати як новий пресет, успадкований від цього." -#: src/slic3r/GUI/Tab.cpp:867 +#: src/slic3r/GUI/Tab.cpp:1299 msgid "To do that please specify a new name for the preset." -msgstr "" +msgstr "Для цього вкажіть нову назву пресету." -#: src/slic3r/GUI/Tab.cpp:871 +#: src/slic3r/GUI/Tab.cpp:1303 msgid "Additional information:" -msgstr "" +msgstr "Додаткова інформація:" -#: src/slic3r/GUI/Tab.cpp:877 +#: src/slic3r/GUI/Tab.cpp:1309 msgid "printer model" -msgstr "" +msgstr "модель принтеру" -#: src/slic3r/GUI/Tab.cpp:885 +#: src/slic3r/GUI/Tab.cpp:1317 msgid "default print profile" -msgstr "" +msgstr "профіль друку за замовчанням" -#: src/slic3r/GUI/Tab.cpp:888 +#: src/slic3r/GUI/Tab.cpp:1320 msgid "default filament profile" -msgstr "" +msgstr "профіль філаметну за замовчанням" -#: src/slic3r/GUI/Tab.cpp:902 +#: src/slic3r/GUI/Tab.cpp:1334 msgid "default SLA material profile" -msgstr "" +msgstr "профіль SLA-матеріалу за замовчанням" -#: src/slic3r/GUI/Tab.cpp:906 +#: src/slic3r/GUI/Tab.cpp:1338 msgid "default SLA print profile" -msgstr "" +msgstr "профіль SLA-друку за замовчанням" + +#: src/slic3r/GUI/Tab.cpp:1346 +msgid "full profile name" +msgstr "повне ім'я профілю" -#: src/slic3r/GUI/Tab.cpp:948 src/slic3r/GUI/Tab.cpp:3303 +#: src/slic3r/GUI/Tab.cpp:1347 +msgid "symbolic profile name" +msgstr "символічне ім'я профілю" + +#: src/slic3r/GUI/Tab.cpp:1385 src/slic3r/GUI/Tab.cpp:4042 msgid "Layers and perimeters" msgstr "Шари та периметри" -#: src/slic3r/GUI/Tab.cpp:949 src/libslic3r/PrintConfig.cpp:55 -msgid "Layer height" -msgstr "Висота шару" - -#: src/slic3r/GUI/Tab.cpp:953 +#: src/slic3r/GUI/Tab.cpp:1391 msgid "Vertical shells" msgstr "Вертикальні оболонки" -#: src/slic3r/GUI/Tab.cpp:964 +#: src/slic3r/GUI/Tab.cpp:1403 msgid "Horizontal shells" msgstr "Горизонтальні оболонки" -#: src/slic3r/GUI/Tab.cpp:965 src/libslic3r/PrintConfig.cpp:1709 +#: src/slic3r/GUI/Tab.cpp:1404 src/libslic3r/PrintConfig.cpp:1980 msgid "Solid layers" msgstr "Суцільні шари" -#: src/slic3r/GUI/Tab.cpp:970 +#: src/slic3r/GUI/Tab.cpp:1409 +msgid "Minimum shell thickness" +msgstr "Мінімальна товщина оболонки" + +#: src/slic3r/GUI/Tab.cpp:1420 msgid "Quality (slower slicing)" msgstr "Якість (повільне нарізання)" -#: src/slic3r/GUI/Tab.cpp:988 +#: src/slic3r/GUI/Tab.cpp:1448 msgid "Reducing printing time" msgstr "Зниження часу друку" -#: src/slic3r/GUI/Tab.cpp:1000 +#: src/slic3r/GUI/Tab.cpp:1460 msgid "Skirt and brim" msgstr "Плінтус та край" -#: src/slic3r/GUI/Tab.cpp:1017 +#: src/slic3r/GUI/Tab.cpp:1480 msgid "Raft" msgstr "Пліт" -#: src/slic3r/GUI/Tab.cpp:1021 +#: src/slic3r/GUI/Tab.cpp:1484 msgid "Options for support material and raft" msgstr "Варіанти для опорного матеріалу та плоту" -#: src/slic3r/GUI/Tab.cpp:1036 +#: src/slic3r/GUI/Tab.cpp:1499 msgid "Speed for print moves" msgstr "Швидкість друкарських рухів" -#: src/slic3r/GUI/Tab.cpp:1048 +#: src/slic3r/GUI/Tab.cpp:1512 msgid "Speed for non-print moves" msgstr "Швидкість недрукарських рухів" -#: src/slic3r/GUI/Tab.cpp:1051 +#: src/slic3r/GUI/Tab.cpp:1515 msgid "Modifiers" msgstr "Модифікатори" -#: src/slic3r/GUI/Tab.cpp:1054 +#: src/slic3r/GUI/Tab.cpp:1518 msgid "Acceleration control (advanced)" msgstr "Контроль прискорення (розширений)" -#: src/slic3r/GUI/Tab.cpp:1061 +#: src/slic3r/GUI/Tab.cpp:1525 msgid "Autospeed (advanced)" msgstr "Автоматична швидкість (розширена)" -#: src/slic3r/GUI/Tab.cpp:1069 +#: src/slic3r/GUI/Tab.cpp:1533 msgid "Multiple Extruders" msgstr "Кілька екструдерів" -#: src/slic3r/GUI/Tab.cpp:1077 +#: src/slic3r/GUI/Tab.cpp:1541 msgid "Ooze prevention" -msgstr "Профілактика просочування" +msgstr "Запобігання просочування" -#: src/slic3r/GUI/Tab.cpp:1094 +#: src/slic3r/GUI/Tab.cpp:1559 msgid "Extrusion width" msgstr "Ширина екструзії" -#: src/slic3r/GUI/Tab.cpp:1104 +#: src/slic3r/GUI/Tab.cpp:1569 msgid "Overlap" msgstr "Перекриття" -#: src/slic3r/GUI/Tab.cpp:1107 +#: src/slic3r/GUI/Tab.cpp:1572 msgid "Flow" msgstr "Потік" -#: src/slic3r/GUI/Tab.cpp:1116 +#: src/slic3r/GUI/Tab.cpp:1581 msgid "Other" msgstr "Інше" -#: src/slic3r/GUI/Tab.cpp:1119 src/slic3r/GUI/Tab.cpp:3351 +#: src/slic3r/GUI/Tab.cpp:1584 src/slic3r/GUI/Tab.cpp:4118 msgid "Output options" msgstr "Параметри виводу" -#: src/slic3r/GUI/Tab.cpp:1120 +#: src/slic3r/GUI/Tab.cpp:1585 msgid "Sequential printing" msgstr "Послідовне друкування" -#: src/slic3r/GUI/Tab.cpp:1122 -msgid "Extruder clearance (mm)" -msgstr "Розмір екструдера (мм)" +#: src/slic3r/GUI/Tab.cpp:1587 +msgid "Extruder clearance" +msgstr "Область зіткнення екструдера" -#: src/slic3r/GUI/Tab.cpp:1131 src/slic3r/GUI/Tab.cpp:3352 +#: src/slic3r/GUI/Tab.cpp:1592 src/slic3r/GUI/Tab.cpp:4119 msgid "Output file" msgstr "Вихідний файл" -#: src/slic3r/GUI/Tab.cpp:1138 src/libslic3r/PrintConfig.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1599 src/libslic3r/PrintConfig.cpp:1662 msgid "Post-processing scripts" msgstr "Скрипти пост-обробки" -#: src/slic3r/GUI/Tab.cpp:1144 src/slic3r/GUI/Tab.cpp:1145 -#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1528 -#: src/slic3r/GUI/Tab.cpp:1935 src/slic3r/GUI/Tab.cpp:1936 -#: src/slic3r/GUI/Tab.cpp:2027 src/slic3r/GUI/Tab.cpp:2028 -#: src/slic3r/GUI/Tab.cpp:3240 src/slic3r/GUI/Tab.cpp:3241 +#: src/slic3r/GUI/Tab.cpp:1605 src/slic3r/GUI/Tab.cpp:1606 +#: src/slic3r/GUI/Tab.cpp:1927 src/slic3r/GUI/Tab.cpp:1928 +#: src/slic3r/GUI/Tab.cpp:2266 src/slic3r/GUI/Tab.cpp:2267 +#: src/slic3r/GUI/Tab.cpp:2342 src/slic3r/GUI/Tab.cpp:2343 +#: src/slic3r/GUI/Tab.cpp:3985 src/slic3r/GUI/Tab.cpp:3986 msgid "Notes" msgstr "Примітки" -#: src/slic3r/GUI/Tab.cpp:1151 src/slic3r/GUI/Tab.cpp:1535 -#: src/slic3r/GUI/Tab.cpp:1942 src/slic3r/GUI/Tab.cpp:2034 -#: src/slic3r/GUI/Tab.cpp:3248 src/slic3r/GUI/Tab.cpp:3357 +#: src/slic3r/GUI/Tab.cpp:1612 src/slic3r/GUI/Tab.cpp:1935 +#: src/slic3r/GUI/Tab.cpp:2273 src/slic3r/GUI/Tab.cpp:2349 +#: src/slic3r/GUI/Tab.cpp:3993 src/slic3r/GUI/Tab.cpp:4124 msgid "Dependencies" msgstr "Залежності" -#: src/slic3r/GUI/Tab.cpp:1152 src/slic3r/GUI/Tab.cpp:1536 -#: src/slic3r/GUI/Tab.cpp:1943 src/slic3r/GUI/Tab.cpp:2035 -#: src/slic3r/GUI/Tab.cpp:3249 src/slic3r/GUI/Tab.cpp:3358 +#: src/slic3r/GUI/Tab.cpp:1613 src/slic3r/GUI/Tab.cpp:1936 +#: src/slic3r/GUI/Tab.cpp:2274 src/slic3r/GUI/Tab.cpp:2350 +#: src/slic3r/GUI/Tab.cpp:3994 src/slic3r/GUI/Tab.cpp:4125 msgid "Profile dependencies" msgstr "Залежності профілю" -#: src/slic3r/GUI/Tab.cpp:1198 -#, 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" -"- no ensure_vertical_shell_thickness\n" -"\n" -"Shall I adjust those settings in order to enable Spiral Vase?" -msgstr "" -"Режим спіральної вази вимагає:\n" -"- один периметр\n" -"- немає верхніх щільних шарів\n" -"- 0% щільність заповнення\n" -"- немає підтримуючого матеріалу\n" -"- не забезпечує товщини вертикальної оболонки\n" -"\n" -"Чи потрібно змінити ці налаштування, щоб увімкнути режим Спіральної вази?" - -#: src/slic3r/GUI/Tab.cpp:1205 -msgid "Spiral Vase" -msgstr "Спіральна ваза" - -#: src/slic3r/GUI/Tab.cpp:1228 -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).\n" -"\n" -"Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "" -"Вичіщуюча веж в даний час підтримує лише нерозчинну підтримку\n" -"якщо вони друкуються з поточним екструдером, не запускаючи зміну " -"інструменту.\n" -"(обидва значення support_material_extruder і " -"support_material_interface_extruder повинні бути встановлені на 0).\n" -"\n" -"Чи потрібно коригувати ці налаштування, щоб увімкнути вичіщуючу веж?" - -#: src/slic3r/GUI/Tab.cpp:1232 src/slic3r/GUI/Tab.cpp:1249 -msgid "Wipe Tower" -msgstr "Вичіщуюча веж" - -#: src/slic3r/GUI/Tab.cpp:1246 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers.\n" -"\n" -"Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "" -"Для того, щоб Вичіщуюча веж працювала з розчинними підтримками, шари " -"підтримки\n" -"повинні бути синхронізовані з шаром об'єкта.\n" -"\n" -"Чи потрібно синхронізувати шари підтримки, щоб увімкнути вичіщуючу веж?" - -#: src/slic3r/GUI/Tab.cpp:1264 -msgid "" -"Supports work better, if the following feature is enabled:\n" -"- Detect bridging perimeters\n" -"\n" -"Shall I adjust those settings for supports?" -msgstr "" -"Підтримка працює краще, якщо ввімкнено таку функцію:\n" -"- Виявлення висячих периметрів(перемичок)\n" -"\n" -"Чи потрібно змінити ці налаштування для підтримки?" - -#: src/slic3r/GUI/Tab.cpp:1267 -msgid "Support Generator" -msgstr "Створення підтримки" - -#: src/slic3r/GUI/Tab.cpp:1309 -msgid "The " -msgstr "Шаблон наповнення " +#: src/slic3r/GUI/Tab.cpp:1693 +msgid "Filament Overrides" +msgstr "Переписування глобальних змінних" -#: src/slic3r/GUI/Tab.cpp:1309 -#, no-c-format -msgid "" -" infill pattern is not supposed to work at 100%% density.\n" -"\n" -"Shall I switch to rectilinear fill pattern?" -msgstr "" -" не підтримується на 100% щільності.\n" -"\n" -"Чи потрібно змінити його на Rectilinear шаблон заповнення?" +#: src/slic3r/GUI/Tab.cpp:1815 +msgid "Temperature" +msgstr "Температура" -#: src/slic3r/GUI/Tab.cpp:1429 -msgid "Temperature " -msgstr "Температура " +#: src/slic3r/GUI/Tab.cpp:1816 +msgid "Nozzle" +msgstr "Сопло" -#: src/slic3r/GUI/Tab.cpp:1435 +#: src/slic3r/GUI/Tab.cpp:1821 msgid "Bed" -msgstr "Полотно" +msgstr "Стіл" -#: src/slic3r/GUI/Tab.cpp:1440 +#: src/slic3r/GUI/Tab.cpp:1826 msgid "Cooling" msgstr "Охолодження" -#: src/slic3r/GUI/Tab.cpp:1441 src/libslic3r/PrintConfig.cpp:1285 -#: src/libslic3r/PrintConfig.cpp:2097 +#: src/slic3r/GUI/Tab.cpp:1828 src/libslic3r/PrintConfig.cpp:1565 +#: src/libslic3r/PrintConfig.cpp:2428 msgid "Enable" msgstr "Увімкнути" -#: src/slic3r/GUI/Tab.cpp:1452 +#: src/slic3r/GUI/Tab.cpp:1839 msgid "Fan settings" msgstr "Налаштування вентилятора" -#: src/slic3r/GUI/Tab.cpp:1453 -msgid "Fan speed" -msgstr "Швидкість вентилятора" - -#: src/slic3r/GUI/Tab.cpp:1461 +#: src/slic3r/GUI/Tab.cpp:1850 msgid "Cooling thresholds" msgstr "Пороги охолодження" -#: src/slic3r/GUI/Tab.cpp:1467 +#: src/slic3r/GUI/Tab.cpp:1856 msgid "Filament properties" msgstr "Властивості філаменту" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1863 msgid "Print speed override" msgstr "Перевизначення швидкості друку" -#: src/slic3r/GUI/Tab.cpp:1481 +#: src/slic3r/GUI/Tab.cpp:1873 +msgid "Wipe tower parameters" +msgstr "Параметри вежі витирання" + +#: src/slic3r/GUI/Tab.cpp:1876 msgid "Toolchange parameters with single extruder MM printers" -msgstr "" +msgstr "Параметри зміни інструменту в одно-екструдерному ММ-принтері" -#: src/slic3r/GUI/Tab.cpp:1496 +#: src/slic3r/GUI/Tab.cpp:1889 msgid "Ramming settings" -msgstr "" +msgstr "Налаштування раммінгу" -#: src/slic3r/GUI/Tab.cpp:1514 src/slic3r/GUI/Tab.cpp:1898 +#: src/slic3r/GUI/Tab.cpp:1912 src/slic3r/GUI/Tab.cpp:2205 +#: src/libslic3r/PrintConfig.cpp:2063 msgid "Custom G-code" msgstr "Користувацький G-код" -#: src/slic3r/GUI/Tab.cpp:1515 src/slic3r/GUI/Tab.cpp:1899 -#: src/libslic3r/PrintConfig.cpp:1735 src/libslic3r/PrintConfig.cpp:1750 +#: src/slic3r/GUI/Tab.cpp:1913 src/slic3r/GUI/Tab.cpp:2206 +#: src/libslic3r/PrintConfig.cpp:2013 src/libslic3r/PrintConfig.cpp:2028 msgid "Start G-code" msgstr "Початок G-коду" -#: src/slic3r/GUI/Tab.cpp:1521 src/slic3r/GUI/Tab.cpp:1905 -#: src/libslic3r/PrintConfig.cpp:358 src/libslic3r/PrintConfig.cpp:368 +#: src/slic3r/GUI/Tab.cpp:1920 src/slic3r/GUI/Tab.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:441 src/libslic3r/PrintConfig.cpp:451 msgid "End G-code" msgstr "Закінчення G-коду" -#: src/slic3r/GUI/Tab.cpp:1632 src/slic3r/GUI/Tab.cpp:1689 -msgid " Browse " -msgstr " Переглянути " - -#: src/slic3r/GUI/Tab.cpp:1651 src/slic3r/GUI/Tab.cpp:1838 -msgid "Test" -msgstr "Перевірити" - -#: src/slic3r/GUI/Tab.cpp:1662 -msgid "Could not get a valid Printer Host reference" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1668 src/slic3r/GUI/Tab.cpp:1851 -msgid "Success!" -msgstr "Успіх!" - -#: src/slic3r/GUI/Tab.cpp:1683 -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:1696 -msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1697 -msgid "Open CA certificate file" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:1970 +msgid "Volumetric flow hints not available" +msgstr "Підказки об'ємного потоку відсутні" -#: src/slic3r/GUI/Tab.cpp:1725 +#: src/slic3r/GUI/Tab.cpp:2066 msgid "" -"HTTPS CA File:\n" -"\tOn this system, Slic3r 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 "" - -#: src/slic3r/GUI/Tab.cpp:1763 src/slic3r/GUI/Tab.cpp:1964 +"Note: All parameters from this group are moved to the Physical Printer " +"settings (see changelog).\n" +"\n" +"A new Physical Printer profile is created by clicking on the \"cog\" icon " +"right of the Printer profiles combo box, by selecting the \"Add physical " +"printer\" item in the Printer combo box. The Physical Printer profile editor " +"opens also when clicking on the \"cog\" icon in the Printer settings tab. " +"The Physical Printer profiles are being stored into PrusaSlicer/" +"physical_printer directory." +msgstr "" +"Примітка: Усі параметри з цієї групи переміщено до налаштувань фізичного " +"принтера (див. Журнал змін).\n" +"\n" +"Новий профіль фізичного принтера створюється натисканням на піктограму " +"\"гвинтик\" праворуч від списку \"Профілі принтера\", вибором пункту " +"\"Додати фізичний принтер\" у списку принтера. Редактор профілю фізичного " +"принтера відкривається також при натисканні на піктограму \"гвинтик\" на " +"вкладці \"Параметри принтеру\". Профілі фізичного принтера зберігаються в " +"каталозі \"PrusaSlicer/physical_printer\"." + +#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2286 msgid "Size and coordinates" msgstr "Розмір і координати" -#: src/slic3r/GUI/Tab.cpp:1767 src/slic3r/GUI/Tab.cpp:1968 -#: src/slic3r/GUI/Tab.cpp:2911 -msgid " Set " -msgstr " Встановити " - -#: src/slic3r/GUI/Tab.cpp:1790 +#: src/slic3r/GUI/Tab.cpp:2108 src/slic3r/GUI/UnsavedChangesDialog.cpp:1080 msgid "Capabilities" msgstr "Можливості" -#: src/slic3r/GUI/Tab.cpp:1795 +#: src/slic3r/GUI/Tab.cpp:2113 msgid "Number of extruders of the printer." msgstr "Кількість екструдерів у принтері." -#: src/slic3r/GUI/Tab.cpp:1823 -msgid "USB/Serial connection" -msgstr "USB/послідовне з'єднання" - -#: src/slic3r/GUI/Tab.cpp:1824 src/libslic3r/PrintConfig.cpp:1590 -msgid "Serial port" -msgstr "Послідовний порт" - -#: src/slic3r/GUI/Tab.cpp:1829 -msgid "Rescan serial ports" -msgstr "Сканувати ще раз послідовні порти" - -#: src/slic3r/GUI/Tab.cpp:1851 -msgid "Connection to printer works correctly." -msgstr "Підключення до принтера працює коректно." - -#: src/slic3r/GUI/Tab.cpp:1854 -msgid "Connection failed." -msgstr "Підключення не вдалося." - -#: src/slic3r/GUI/Tab.cpp:1867 src/slic3r/GUI/Tab.cpp:2022 -msgid "Print Host upload" +#: src/slic3r/GUI/Tab.cpp:2141 +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 "" +"Вибрано мульти-матеріальний (ММ) друк з одним екструдером,\n" +"і всі екструдери повинні мати однаковий діаметр.\n" +"Хочете змінити діаметр для всіх екструдерів на значення діаметра сопла " +"першого екструдера?" + +#: src/slic3r/GUI/Tab.cpp:2144 src/slic3r/GUI/Tab.cpp:2552 +#: src/libslic3r/PrintConfig.cpp:1534 +msgid "Nozzle diameter" +msgstr "Діаметр сопла" -#: src/slic3r/GUI/Tab.cpp:1911 src/libslic3r/PrintConfig.cpp:128 +#: src/slic3r/GUI/Tab.cpp:2220 src/libslic3r/PrintConfig.cpp:209 msgid "Before layer change G-code" msgstr "G-код перед зміною шару" -#: src/slic3r/GUI/Tab.cpp:1917 src/libslic3r/PrintConfig.cpp:1030 +#: src/slic3r/GUI/Tab.cpp:2227 src/libslic3r/PrintConfig.cpp:1273 msgid "After layer change G-code" msgstr "G-код після зміни шару" -#: src/slic3r/GUI/Tab.cpp:1923 src/libslic3r/PrintConfig.cpp:2005 +#: src/slic3r/GUI/Tab.cpp:2234 src/libslic3r/PrintConfig.cpp:2321 msgid "Tool change G-code" msgstr "G-код зміни інструменту" -#: src/slic3r/GUI/Tab.cpp:1929 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "Between objects G-code (for sequential printing)" msgstr "G-код між об'єктами (для послідовного друку)" -#: src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/Tab.cpp:2248 +msgid "Color Change G-code" +msgstr "G-код зміни кольору" + +#: src/slic3r/GUI/Tab.cpp:2254 src/libslic3r/PrintConfig.cpp:2054 +msgid "Pause Print G-code" +msgstr "G-код для паузи друку" + +#: src/slic3r/GUI/Tab.cpp:2260 +msgid "Template Custom G-code" +msgstr "Шаблон власного G-коду" + +#: src/slic3r/GUI/Tab.cpp:2293 msgid "Display" -msgstr "" +msgstr "Дисплей" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2308 msgid "Tilt" -msgstr "" +msgstr "Нахил" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:2309 msgid "Tilt time" -msgstr "" +msgstr "Час нахилу" -#: src/slic3r/GUI/Tab.cpp:2008 src/slic3r/GUI/Tab.cpp:3223 +#: src/slic3r/GUI/Tab.cpp:2315 src/slic3r/GUI/Tab.cpp:3969 msgid "Corrections" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2074 src/slic3r/GUI/Tab.cpp:2136 -#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1086 -#: src/libslic3r/PrintConfig.cpp:1096 src/libslic3r/PrintConfig.cpp:1109 -#: src/libslic3r/PrintConfig.cpp:1120 src/libslic3r/PrintConfig.cpp:1131 -#: src/libslic3r/PrintConfig.cpp:1142 -msgid "Machine limits" -msgstr "" +msgstr "Поправки" -#: src/slic3r/GUI/Tab.cpp:2088 -msgid "Values in this column are for Full Power mode" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:2332 src/slic3r/GUI/Tab.cpp:3965 +msgid "Exposure" +msgstr "Експозиція" -#: src/slic3r/GUI/Tab.cpp:2089 -msgid "Full Power" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:2391 src/slic3r/GUI/Tab.cpp:2485 +#: src/libslic3r/PrintConfig.cpp:1302 src/libslic3r/PrintConfig.cpp:1337 +#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1387 src/libslic3r/PrintConfig.cpp:1397 +#: src/libslic3r/PrintConfig.cpp:1407 src/libslic3r/PrintConfig.cpp:1417 +msgid "Machine limits" +msgstr "Механічних обмеження" -#: src/slic3r/GUI/Tab.cpp:2094 -msgid "Values in this column are for Silent mode" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:2414 +msgid "Values in this column are for Normal mode" +msgstr "Значення в цьому стовпці для нормального режиму" -#: src/slic3r/GUI/Tab.cpp:2095 -msgid "Silent" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:2420 +msgid "Values in this column are for Stealth mode" +msgstr "Значення в цьому стовпці для тихого режиму" -#: src/slic3r/GUI/Tab.cpp:2103 +#: src/slic3r/GUI/Tab.cpp:2429 msgid "Maximum feedrates" -msgstr "" +msgstr "Максимальна швидкість подачі" -#: src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2434 msgid "Maximum accelerations" -msgstr "" +msgstr "Максимальні прискорення" -#: src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2441 msgid "Jerk limits" -msgstr "" +msgstr "Обмеження ривку" -#: src/slic3r/GUI/Tab.cpp:2120 +#: src/slic3r/GUI/Tab.cpp:2446 msgid "Minimum feedrates" -msgstr "" +msgstr "Мінімальна швидкість подачі" -#: src/slic3r/GUI/Tab.cpp:2158 src/slic3r/GUI/Tab.cpp:2166 +#: src/slic3r/GUI/Tab.cpp:2510 src/slic3r/GUI/Tab.cpp:2518 msgid "Single extruder MM setup" -msgstr "" +msgstr "Налаштування MM екструдера" -#: src/slic3r/GUI/Tab.cpp:2167 +#: src/slic3r/GUI/Tab.cpp:2519 msgid "Single extruder multimaterial parameters" -msgstr "" +msgstr "Параметри екструдеру в багато-екструдерному принтері" -#: src/slic3r/GUI/Tab.cpp:2181 src/libslic3r/GCode/PreviewData.cpp:475 -#, c-format -msgid "Extruder %d" -msgstr "Екструдер %d" +#: src/slic3r/GUI/Tab.cpp:2550 +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:2188 +#: src/slic3r/GUI/Tab.cpp:2574 msgid "Layer height limits" msgstr "Межі висоти шару" -#: src/slic3r/GUI/Tab.cpp:2193 +#: src/slic3r/GUI/Tab.cpp:2579 msgid "Position (for multi-extruder printers)" msgstr "Позиція (для мульти-екструдерних принтерів)" -#: src/slic3r/GUI/Tab.cpp:2196 -msgid "Retraction" -msgstr "Переривання" - -#: src/slic3r/GUI/Tab.cpp:2199 +#: src/slic3r/GUI/Tab.cpp:2585 msgid "Only lift Z" msgstr "Межі підняття Z" -#: src/slic3r/GUI/Tab.cpp:2212 +#: src/slic3r/GUI/Tab.cpp:2598 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -3531,11 +7409,11 @@ msgstr "" "Переривання при відключенні інструмента (додаткові налаштування для " "налагодження мульти-екструдерів)" -#: src/slic3r/GUI/Tab.cpp:2216 -msgid "Preview" -msgstr "Попередній перегляд" +#: src/slic3r/GUI/Tab.cpp:2605 +msgid "Reset to Filament Color" +msgstr "Скинути до кольору філаменту" -#: src/slic3r/GUI/Tab.cpp:2352 +#: src/slic3r/GUI/Tab.cpp:2783 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -3546,281 +7424,468 @@ msgstr "" "\n" "Відключити його для увімкнення програмного переривання?" -#: src/slic3r/GUI/Tab.cpp:2354 +#: src/slic3r/GUI/Tab.cpp:2785 msgid "Firmware Retraction" msgstr "Програмне переривання" -#: src/slic3r/GUI/Tab.cpp:2681 -#, c-format -msgid "Default preset (%s)" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2682 -#, c-format -msgid "Preset (%s)" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:3376 +msgid "Detached" +msgstr "Від'єднаний" -#: src/slic3r/GUI/Tab.cpp:2699 -msgid "has the following unsaved changes:" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:3439 +msgid "remove" +msgstr "видалити" -#: src/slic3r/GUI/Tab.cpp:2702 -msgid "is not compatible with printer" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:3439 +msgid "delete" +msgstr "видалити" -#: src/slic3r/GUI/Tab.cpp:2703 -msgid "is not compatible with print profile" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:3448 +msgid "It's a last preset for this physical printer." +msgstr "Це останній пресет для цього фізичного принтера." -#: src/slic3r/GUI/Tab.cpp:2705 -msgid "and it has the following unsaved changes:" +#: src/slic3r/GUI/Tab.cpp:3453 +msgid "" +"Are you sure you want to delete \"%1%\" preset from the physical printer " +"\"%2%\"?" msgstr "" +"Ви впевнені, що хочете видалити пресет \"%1%\" із фізичного принтера \"%2%\"?" -#: src/slic3r/GUI/Tab.cpp:2708 -msgid "Discard changes and continue anyway?" +#: src/slic3r/GUI/Tab.cpp:3465 +msgid "" +"The physical printer(s) below is based on the preset, you are going to " +"delete." msgstr "" +"Наведений(і) нижче фізичний(і) принтер(и) базується на пресеті, які ви " +"збираєтеся видалити." -#: src/slic3r/GUI/Tab.cpp:2709 -msgid "Unsaved Changes" -msgstr "Незбережені зміни" - -#: src/slic3r/GUI/Tab.cpp:2721 -msgid "Please check your object list before preset changing." +#: src/slic3r/GUI/Tab.cpp:3469 +msgid "" +"Note, that selected preset will be deleted from this/those printer(s) too." msgstr "" +"Зверніть увагу, що вибраний пресет буде також видалено з цього/цих " +"принтеру(ів)." -#: src/slic3r/GUI/Tab.cpp:2801 -msgid "Copy" +#: src/slic3r/GUI/Tab.cpp:3473 +msgid "" +"The physical printer(s) below is based only on the preset, you are going to " +"delete." msgstr "" +"Наведений(і) нижче фізичний(і) принтер(и) базується тільки на пресеті, які " +"ви збираєтеся видалити." -#: src/slic3r/GUI/Tab.cpp:2823 -msgid "The supplied name is empty. It can't be saved." -msgstr "Надане ім'я порожнє. Не вдається зберегти." - -#: src/slic3r/GUI/Tab.cpp:2828 -msgid "Cannot overwrite a system profile." +#: src/slic3r/GUI/Tab.cpp:3477 +msgid "" +"Note, that this/those printer(s) will be deleted after deleting of the " +"selected preset." msgstr "" +"Зауважте, що цей/ці принтер(и) буде видалено після видалення вибраного " +"пресету." -#: src/slic3r/GUI/Tab.cpp:2832 -msgid "Cannot overwrite an external profile." -msgstr "" +#: src/slic3r/GUI/Tab.cpp:3481 +msgid "Are you sure you want to %1% the selected preset?" +msgstr "Ви впевнені, що хочете %1% вибраний пресет?" -#: src/slic3r/GUI/Tab.cpp:2858 -msgid "remove" -msgstr "перемістити" +#. TRN Remove/Delete +#: src/slic3r/GUI/Tab.cpp:3486 +msgid "%1% Preset" +msgstr "%1% пресет" -#: src/slic3r/GUI/Tab.cpp:2858 -msgid "delete" -msgstr "видалити" +#: src/slic3r/GUI/Tab.cpp:3567 src/slic3r/GUI/Tab.cpp:3639 +msgid "Set" +msgstr "Встановити" -#: src/slic3r/GUI/Tab.cpp:2859 -msgid "Are you sure you want to " -msgstr "Ви впевнені, що хочете " +#: src/slic3r/GUI/Tab.cpp:3703 +msgid "" +"Machine limits will be emitted to G-code and used to estimate print time." +msgstr "" +"Механічних обмеження публікуватимуться в G-код і використовуватимуться для " +"розрахунку часу друку." -#: src/slic3r/GUI/Tab.cpp:2859 -msgid " the selected preset?" -msgstr " вибране налаштування?" +#: src/slic3r/GUI/Tab.cpp:3706 +msgid "" +"Machine limits will NOT be emitted to G-code, however they will be used to " +"estimate print time, which may therefore not be accurate as the printer may " +"apply a different set of machine limits." +msgstr "" +"Механічних обмеження НЕ публікуватимуться в G-код, однак вони будуть " +"використовуватися для оцінки часу друку, що, отже, може бути неточним, " +"оскільки принтер може застосовувати інший набір механічних обмежень." -#: src/slic3r/GUI/Tab.cpp:2860 -msgid "Remove" -msgstr "Перемістити" +#: src/slic3r/GUI/Tab.cpp:3710 +msgid "" +"Machine limits are not set, therefore the print time estimate may not be " +"accurate." +msgstr "" +"Механічних обмеження не встановлені, тому оцінка часу друку може бути " +"неточною." -#: src/slic3r/GUI/Tab.cpp:2861 -msgid " Preset" -msgstr " Налаштування" +#: src/slic3r/GUI/Tab.cpp:3732 +msgid "LOCKED LOCK" +msgstr "ЗАКРИТИЙ ЗАМОК" -#: src/slic3r/GUI/Tab.cpp:2989 +#. TRN Description for "LOCKED LOCK" +#: src/slic3r/GUI/Tab.cpp:3734 msgid "" -"LOCKED LOCK;indicates that the settings are the same as the system values " +"indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "" +"вказує на те, що параметри збігаються із системними (або за замовчуванням) " +"значеннями для поточної групи опцій" -#: src/slic3r/GUI/Tab.cpp:2992 +#: src/slic3r/GUI/Tab.cpp:3736 +msgid "UNLOCKED LOCK" +msgstr "ВІДКРИТИЙ ЗАМОК" + +#. TRN Description for "UNLOCKED LOCK" +#: src/slic3r/GUI/Tab.cpp:3738 msgid "" -"UNLOCKED LOCK;indicates that some settings were changed and are not equal to " -"the system values for the current option group.\n" +"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 values." +"to the system (or default) values." msgstr "" +"вказує на те, що деякі параметри були змінені і не дорівнюють системним (або " +"за замовчуванням) значенням для поточної групи опцій.\n" +"Клацніть, щоб скинути всі налаштування для поточної групи опцій до системних " +"значень (або за замовчуванням)." + +#: src/slic3r/GUI/Tab.cpp:3743 +msgid "WHITE BULLET" +msgstr "БІЛА КУЛЯ" -#: src/slic3r/GUI/Tab.cpp:2998 +#. TRN Description for "WHITE BULLET" +#: src/slic3r/GUI/Tab.cpp:3745 msgid "" -"WHITE BULLET;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 (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." msgstr "" +"для лівої кнопки: вказує на несистемний (або не за замовчуванням) пресет,\n" +"для правої кнопки: вказує на те, що параметри не були змінені." -#: src/slic3r/GUI/Tab.cpp:3002 +#: src/slic3r/GUI/Tab.cpp:3748 +msgid "BACK ARROW" +msgstr "СТРІЛКА НАЗАД" + +#. TRN Description for "BACK ARROW" +#: src/slic3r/GUI/Tab.cpp:3750 msgid "" -"BACK ARROW;indicates that the settings were changed and are not equal to the " -"last saved preset for the current option group.\n" +"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 "" +"вказує на те, що параметри були змінені і не дорівнюють останньому " +"збереженому пресету для поточної групи параметрів.\n" +"Клацніть, щоб скинути всі параметри для поточної групи параметрів до " +"останнього збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:3028 +#: src/slic3r/GUI/Tab.cpp:3760 msgid "" -"LOCKED LOCK icon indicates that the settings are the same as the system " -"values for the current option group" +"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:3030 +#: src/slic3r/GUI/Tab.cpp:3762 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " -"equal to the system values for the current option group.\n" -"Click to reset all settings for current option group to the system values." +"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 "" +"Значок \"ВІДКРИТИЙ ЗАМОК\" вказує на те, що деякі параметри були змінені і " +"не дорівнюють системним (або за замовчуванням) значенням для поточної групи " +"опцій.\n" +"Клацніть, щоб скинути всі налаштування для поточної групи опцій до системних " +"значень (або за замовчуванням)." -#: src/slic3r/GUI/Tab.cpp:3033 -msgid "WHITE BULLET icon indicates a non system preset." +#: src/slic3r/GUI/Tab.cpp:3765 +msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" +"Значок \"БІЛА КУЛЯ\" вказує на несистемний (або не за замовчуванням) пресет." -#: src/slic3r/GUI/Tab.cpp:3036 +#: src/slic3r/GUI/Tab.cpp:3768 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:3038 +#: src/slic3r/GUI/Tab.cpp:3770 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 "" +"Значок \"СТРІЛКА НАЗАД\" вказує на те, що параметри були змінені і не " +"дорівнюють останньому збереженому пресету для поточної групи параметрів.\n" +"Клацніть, щоб скинути всі параметри для поточної групи параметрів до " +"останнього збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:3044 +#: src/slic3r/GUI/Tab.cpp:3776 msgid "" -"LOCKED LOCK icon indicates that the value is the same as the system value." +"LOCKED LOCK icon indicates that the value is the same as the system (or " +"default) value." msgstr "" +"Значок \"ЗАКРИТИЙ ЗАМОК\" вказує на те, що значення збігається із системним " +"(або за замовчуванням)." -#: src/slic3r/GUI/Tab.cpp:3045 +#: src/slic3r/GUI/Tab.cpp:3777 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " -"the system value.\n" -"Click to reset current value to the system value." +"the system (or default) value.\n" +"Click to reset current value to the system (or default) value." msgstr "" +"Значок \"ВІДКРИТИЙ ЗАМОК\" вказує на те, що значення було змінено і не " +"дорівнює системному (або за замовчуванням) значенню.\n" +"Клацніть, щоб скинути поточне значення до системного (або за замовчуванням)." -#: src/slic3r/GUI/Tab.cpp:3051 +#: src/slic3r/GUI/Tab.cpp:3783 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" +"Значок \"БІЛА КУЛЯ\" вказує на те, що значення збігається з значенням " +"збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:3052 +#: src/slic3r/GUI/Tab.cpp:3784 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 "" +"Значок \"СТРІЛКА НАЗАД\" вказує на те, що значення було змінено і не " +"дорівнює останньому збереженому пресету.\n" +"Клацніть, щоб скинути поточне значення до останнього збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:3152 -msgid " as:" -msgstr " як:" +#: src/slic3r/GUI/Tab.cpp:3928 src/slic3r/GUI/Tab.cpp:3930 +msgid "Material" +msgstr "Матеріал" -#: src/slic3r/GUI/Tab.cpp:3196 -msgid "the following postfix are not allowed:" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:4052 +msgid "Support head" +msgstr "Головка підтримки" -#: src/slic3r/GUI/Tab.cpp:3200 -msgid "The supplied name is not available." -msgstr "Надане ім'я недійсне." +#: src/slic3r/GUI/Tab.cpp:4057 +msgid "Support pillar" +msgstr "Стовп підтримки" -#: src/slic3r/GUI/Tab.cpp:3213 -msgid "Material" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:4080 +msgid "Connection of the support sticks and junctions" +msgstr "З'єднання опорних стовпів і стиків" -#: src/slic3r/GUI/Tab.cpp:3215 src/slic3r/GUI/Tab.cpp:3305 -msgid "Layers" -msgstr "Шари" +#: src/slic3r/GUI/Tab.cpp:4085 +msgid "Automatic generation" +msgstr "Автоматичне згенерування" -#: src/slic3r/GUI/Tab.cpp:3219 -msgid "Exposure" +#: src/slic3r/GUI/Tab.cpp:4159 +msgid "" +"\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" +"To enable \"%1%\", please switch off \"%2%\"" msgstr "" +"\"%1%\" вимкнено, оскільки в категорії \"%3%\" увімкнено \"%2%\".\n" +"Щоб увімкнути \"%1%\", вимкніть \"%2%\"" -#: src/slic3r/GUI/Tab.cpp:3313 -msgid "Support head" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3002 +msgid "Object elevation" +msgstr "Підняття об’єкта" + +#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3104 +msgid "Pad around object" +msgstr "Подушка навколо об’єкта" + +#: src/slic3r/GUI/Tab.hpp:370 src/slic3r/GUI/Tab.hpp:492 +msgid "Print Settings" +msgstr "Параметри друку" + +#: src/slic3r/GUI/Tab.hpp:401 +msgid "Filament Settings" +msgstr "Параметри філаменту" + +#: src/slic3r/GUI/Tab.hpp:442 +msgid "Printer Settings" +msgstr "Параметри принтеру" + +#: src/slic3r/GUI/Tab.hpp:476 +msgid "Material Settings" +msgstr "Параметри матеріалу" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:149 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:158 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:857 +msgid "Undef" +msgstr "Невизначений" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:537 +msgid "PrusaSlicer is closing: Unsaved Changes" +msgstr "PrusaSlicer закривається: Незбережені зміни" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:554 +msgid "Switching Presets: Unsaved Changes" +msgstr "Перемикання пресетів: незбережені зміни" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:620 +msgid "Old Value" +msgstr "Старе значення" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:621 +msgid "New Value" +msgstr "Нове значення" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:652 +msgid "Transfer" +msgstr "Перенести" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:653 +msgid "Discard" +msgstr "Відхилити" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:654 +msgid "Save" +msgstr "Зберегти" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:674 +msgid "PrusaSlicer will remember your action." +msgstr "PrusaSlicer запам'ятає ваші дії." -#: src/slic3r/GUI/Tab.cpp:3318 -msgid "Support pillar" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:676 +msgid "" +"You will not be asked about the unsaved changes the next time you close " +"PrusaSlicer." msgstr "" +"Наступного разу, коли ви закриватимете PrusaSlicer, вас не питатимуть про " +"незбережені зміни." -#: src/slic3r/GUI/Tab.cpp:3328 -msgid "Connection of the support sticks and junctions" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:677 +msgid "" +"You will not be asked about the unsaved changes the next time you switch a " +"preset." msgstr "" +"Наступного разу, коли ви переключите пресет, вас не питатимуть про " +"незбережені зміни." -#: src/slic3r/GUI/Tab.cpp:3333 -msgid "Automatic generation" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:678 +msgid "" +"Visit \"Preferences\" and check \"%1%\"\n" +"to be asked about unsaved changes again." msgstr "" +"Відвідайте \"Преференції\" та встановіть прапорець \"%1%\"\n" +"щоб знову запитати про незбережені зміни." -#: src/slic3r/GUI/Tab.cpp:3395 -msgid "Head penetration should not be greater than the head width." -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:680 +msgid "PrusaSlicer: Don't ask me again" +msgstr "PrusaSlicer: Не питай мене більше" -#: src/slic3r/GUI/Tab.cpp:3396 -msgid "Invalid Head penetration" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:747 +msgid "" +"Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" +"Деякі поля занадто довгі, щоб вміститися у чарунку. Клацніть правою кнопкою " +"миші, щоб відкрити повний текст." -#: src/slic3r/GUI/Tab.cpp:3408 -msgid "Pinhead diameter should be smaller than the pillar diameter." -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:749 +msgid "All settings changes will be discarded." +msgstr "Усі зміни параметрів буде відхилено." -#: src/slic3r/GUI/Tab.cpp:3409 -msgid "Invalid pinhead diameter" -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752 +msgid "Save the selected options." +msgstr "Зберегти вибрані параметри." -#: src/slic3r/GUI/Tab.hpp:307 src/slic3r/GUI/Tab.hpp:395 -msgid "Print Settings" -msgstr "Параметри друку" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752 +msgid "Transfer the selected settings to the newly selected preset." +msgstr "Перенести вибрані параметри до нещодавно вибраного пресету." -#: src/slic3r/GUI/Tab.hpp:325 -msgid "Filament Settings" -msgstr "Параметри філаменту" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:756 +msgid "Save the selected options to preset \"%1%\"." +msgstr "Зберегти вибрані параметри до пресету \"%1%\"." -#: src/slic3r/GUI/Tab.hpp:358 -msgid "Printer Settings" -msgstr "Параметри принтеру" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:757 +msgid "Transfer the selected options to the newly selected preset \"%1%\"." +msgstr "Перенести вибрані параметри до нещодавно вибраного пресету \"%1%\"." -#: src/slic3r/GUI/Tab.hpp:381 -msgid "Material Settings" -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1019 +msgid "The following presets were modified:" +msgstr "Наступні пресети були змінені :" -#: src/slic3r/GUI/Tab.hpp:407 -msgid "Save preset" -msgstr "Зберегти налаштування" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1024 +msgid "Preset \"%1%\" has the following unsaved changes:" +msgstr "Пресет \"%1%\" має такі незбережені зміни:" -#: src/slic3r/GUI/UpdateDialogs.cpp:29 -msgid "Update available" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1028 +msgid "" +"Preset \"%1%\" is not compatible with the new printer profile and it has the " +"following unsaved changes:" msgstr "" +"Пресет \"%1%\" несумісний з новим профілем принтера, і він має такі " +"незбережені зміни:" -#: src/slic3r/GUI/UpdateDialogs.cpp:29 -msgid "New version of Slic3r PE is available" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1029 +msgid "" +"Preset \"%1%\" is not compatible with the new print profile and it has the " +"following unsaved changes:" msgstr "" +"Пресет \"%1%\" несумісний з новим профілем друку, і він має такі незбережені " +"зміни:" -#: src/slic3r/GUI/UpdateDialogs.cpp:36 -msgid "To download, follow the link below." -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1075 +msgid "Extruders count" +msgstr "Кількість екструдерів" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 +msgid "Old value" +msgstr "Нове значення" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1198 +msgid "New value" +msgstr "Нове значення" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +msgid "Update available" +msgstr "Доступне оновлення" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +#, c-format +msgid "New version of %s is available" +msgstr "Доступна нова версія %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:43 msgid "Current version:" -msgstr "" +msgstr "Поточна версія:" -#: src/slic3r/GUI/UpdateDialogs.cpp:46 +#: src/slic3r/GUI/UpdateDialogs.cpp:45 msgid "New version:" -msgstr "" +msgstr "Нова версія:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:53 +msgid "Changelog && Download" +msgstr "Журнал змін і завантаження" + +#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 +#: src/slic3r/GUI/UpdateDialogs.cpp:183 +msgid "Open changelog page" +msgstr "Відкрийте сторінку журналу змін" + +#: src/slic3r/GUI/UpdateDialogs.cpp:65 +msgid "Open download page" +msgstr "Відкрити сторінку завантаження" -#: src/slic3r/GUI/UpdateDialogs.cpp:54 +#: src/slic3r/GUI/UpdateDialogs.cpp:71 msgid "Don't notify about new releases any more" -msgstr "" +msgstr "Більше не сповіщати про нові випуски" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 src/slic3r/GUI/UpdateDialogs.cpp:164 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 msgid "Configuration update" -msgstr "" +msgstr "Оновлення конфігурації" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 msgid "Configuration update is available" -msgstr "" +msgstr "Доступне оновлення конфігурації" -#: src/slic3r/GUI/UpdateDialogs.cpp:75 +#: src/slic3r/GUI/UpdateDialogs.cpp:92 msgid "" "Would you like to install it?\n" "\n" @@ -3829,48 +7894,91 @@ msgid "" "\n" "Updated configuration bundles:" msgstr "" +"Ви хотіли б його встановити?\n" +"\n" +"Зверніть увагу, що спочатку буде створено повний знімок конфігурації. Потім " +"його можна відновити в будь-який час, у випадку проблем з новою версією.\n" +"\n" +"Оновлені пакети конфігурації:" -#: src/slic3r/GUI/UpdateDialogs.cpp:111 -msgid "Slic3r incompatibility" -msgstr "" +#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 +msgid "Comment:" +msgstr "Коментар:" -#: src/slic3r/GUI/UpdateDialogs.cpp:111 -msgid "Slic3r configuration is incompatible" -msgstr "" +#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210 +#, c-format +msgid "%s incompatibility" +msgstr "Несумісність з %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:114 +#: src/slic3r/GUI/UpdateDialogs.cpp:148 +msgid "You must install a configuration update." +msgstr "Потрібно встановити оновлення конфігурації." + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +#, c-format msgid "" -"This version of Slic3r PE is not compatible with currently installed " -"configuration bundles.\n" -"This probably happened as a result of running an older Slic3r PE after using " -"a newer one.\n" +"%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" -"You may either exit Slic3r 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 Slic3r.\n" +"Updated configuration bundles:" msgstr "" +"Зараз %s розпочне оновлення. Інакше він не зможе запуститися.\n" +"\n" +"Зверніть увагу, що спочатку буде створено повний знімок конфігурації. Потім " +"його можна буде відновити в будь-який час, якщо виникне проблема з новою " +"версією.\n" +"\n" +"Оновлені пакети конфігурації:" -#: src/slic3r/GUI/UpdateDialogs.cpp:123 +#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 #, c-format -msgid "This Slic3r PE version: %s" -msgstr "" +msgid "Exit %s" +msgstr "Вихід %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:128 -msgid "Incompatible bundles:" -msgstr "" +#: src/slic3r/GUI/UpdateDialogs.cpp:211 +#, c-format +msgid "%s configuration is incompatible" +msgstr "конфігурація %s є несумісна" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 -msgid "Exit Slic3r" +#: 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 "" +"Ця версія %s не сумісна з встановленими на сьогодні пакетами конфігурації.\n" +"Можливо, це сталося в результаті запуску старішого %s після використання " +"нового.\n" +"\n" +"Ви можете вийти зі %s і спробувати ще раз із новою версією, або повторно " +"запустити початкову конфігурацію. Це створить резервний знімок існуючої " +"конфігурації перед встановленням файлів, сумісних із цим %s." -#: src/slic3r/GUI/UpdateDialogs.cpp:147 +#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#, c-format +msgid "This %s version: %s" +msgstr "%s версії %s" + +#: src/slic3r/GUI/UpdateDialogs.cpp:230 +msgid "Incompatible bundles:" +msgstr "Несумісні комплекти:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:249 msgid "Re-configure" -msgstr "" +msgstr "Пере-налаштувати" -#: src/slic3r/GUI/UpdateDialogs.cpp:168 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 #, c-format msgid "" -"Slic3r PE now uses an updated configuration structure.\n" +"%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 " @@ -3882,16 +7990,40 @@ msgid "" "Please proceed with the %s that follows to set up the new presets and to " "choose whether to enable automatic preset updates." msgstr "" +"%s тепер використовує оновлену структуру конфігурації.\n" +"\n" +"Були введені так звані \"системні пресети\", які містять вбудовані " +"налаштування за замовчуванням для різних принтерів. Ці системні пресети не " +"можуть бути змінені, натомість користувачі тепер можуть створювати власні " +"пресети, успадковуючи налаштування з одного із системних пресетів.\n" +"Спадковий пресет може успадкувати певне значення від свого батька або " +"замінити його своїм власним значенням.\n" +"\n" +"Будь ласка, перейдіть до %s, щоб налаштувати нові пресети та вибрати, чи " +"вмикати їх автоматичне оновлення." -#: src/slic3r/GUI/UpdateDialogs.cpp:184 +#: src/slic3r/GUI/UpdateDialogs.cpp:287 msgid "For more information please visit our wiki page:" -msgstr "" +msgstr "Для отримання додаткової інформації відвідайте нашу wiki-сторінку:" -#: src/slic3r/GUI/WipeTowerDialog.cpp:14 +#: src/slic3r/GUI/UpdateDialogs.cpp:304 +msgid "Configuration updates" +msgstr "Оновлення конфігурацій" + +#: src/slic3r/GUI/UpdateDialogs.cpp:304 +msgid "No updates available" +msgstr "Немає оновлень" + +#: src/slic3r/GUI/UpdateDialogs.cpp:309 +#, c-format +msgid "%s has no configuration updates available." +msgstr "%s не має оновлень конфігурації." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:15 msgid "Ramming customization" -msgstr "" +msgstr "Налаштування раммінгу" -#: src/slic3r/GUI/WipeTowerDialog.cpp:40 +#: 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 " @@ -3903,576 +8035,835 @@ msgid "" "This is an expert-level setting, incorrect adjustment will likely lead to " "jams, extruder wheel grinding into filament etc." msgstr "" +"Раммінг означає швидке екструдування безпосередньо перед заміною інструменту " +"в одно-екструдерному принтері ММ. Його мета полягає у правильній формі кінця " +"виведеного філаменту, щоб вона не заважала вставці нового філаменту і може " +"бути знову встановлений пізніше. Ця фаза є важливою, і різні матеріали " +"можуть вимагати різної швидкості екструзії для отримання гарної форми. З " +"цієї причини швидкість екструдування під час раммінгу регулюється.\n" +"\n" +"Це налаштування на рівні експерта, неправильне регулювання, ймовірно, " +"призведе до заклинювання, подрібнення екструдерного колеса до філаменту тощо." -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 +#: src/slic3r/GUI/WipeTowerDialog.cpp:83 msgid "Total ramming time" -msgstr "" +msgstr "Загальний час швидкої екструзії" -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 msgid "Total rammed volume" -msgstr "" +msgstr "Загальний обсяг швидкої екструзії" -#: src/slic3r/GUI/WipeTowerDialog.cpp:88 +#: src/slic3r/GUI/WipeTowerDialog.cpp:89 msgid "Ramming line width" -msgstr "" +msgstr "Ширина ліній раммінгу" -#: src/slic3r/GUI/WipeTowerDialog.cpp:90 +#: src/slic3r/GUI/WipeTowerDialog.cpp:91 msgid "Ramming line spacing" -msgstr "" +msgstr "Проміжки між лініями раммінгу" -#: src/slic3r/GUI/WipeTowerDialog.cpp:141 +#: src/slic3r/GUI/WipeTowerDialog.cpp:142 msgid "Wipe tower - Purging volume adjustment" -msgstr "" +msgstr "Вежа витирання - Регулювання об'єму продувки" -#: src/slic3r/GUI/WipeTowerDialog.cpp:225 +#: src/slic3r/GUI/WipeTowerDialog.cpp:254 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." msgstr "" +"Тут ви можете відрегулювати необхідний об'єм витирання (мм³) для будь-якої " +"пари інструментів." -#: src/slic3r/GUI/WipeTowerDialog.cpp:226 +#: src/slic3r/GUI/WipeTowerDialog.cpp:255 msgid "Extruder changed to" -msgstr "" +msgstr "Екструдер змінено на" -#: src/slic3r/GUI/WipeTowerDialog.cpp:234 +#: src/slic3r/GUI/WipeTowerDialog.cpp:263 msgid "unloaded" -msgstr "" +msgstr "виведено" -#: src/slic3r/GUI/WipeTowerDialog.cpp:235 +#: src/slic3r/GUI/WipeTowerDialog.cpp:264 msgid "loaded" -msgstr "" +msgstr "заведено" -#: src/slic3r/GUI/WipeTowerDialog.cpp:240 +#: src/slic3r/GUI/WipeTowerDialog.cpp:276 msgid "Tool #" -msgstr "" +msgstr "Інструмент №" -#: src/slic3r/GUI/WipeTowerDialog.cpp:247 +#: src/slic3r/GUI/WipeTowerDialog.cpp:285 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." msgstr "" +"Загальний об'єм витирання обчислюється шляхом підсумовування двох значень " +"нижче, залежно від того, який інструмент заведено/виведено." -#: src/slic3r/GUI/WipeTowerDialog.cpp:248 +#: src/slic3r/GUI/WipeTowerDialog.cpp:286 msgid "Volume to purge (mm³) when the filament is being" -msgstr "" +msgstr "Об'єм для витирання (мм³) при наявності філаменту" -#: src/slic3r/GUI/WipeTowerDialog.cpp:262 +#: src/slic3r/GUI/WipeTowerDialog.cpp:300 msgid "From" -msgstr "" +msgstr "Від" -#: src/slic3r/GUI/WipeTowerDialog.cpp:327 +#: 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 "" +"Перехід в простий режим налаштувань призведе до скасування змін, здійснених " +"у розширеному режимі!\n" +"\n" +"Хочете продовжити?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show simplified settings" -msgstr "" +msgstr "Показати спрощені налаштування" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show advanced settings" -msgstr "" +msgstr "Показати розширені налаштування" -#: src/slic3r/GUI/wxExtensions.cpp:2398 +#: src/slic3r/GUI/wxExtensions.cpp:627 #, c-format msgid "Switch to the %s mode" msgstr "Перейти до режиму %s" -#: src/slic3r/GUI/wxExtensions.cpp:2399 +#: src/slic3r/GUI/wxExtensions.cpp:628 #, c-format msgid "Current mode is %s" msgstr "Поточний режим - %s" -#: src/slic3r/Utils/Duet.cpp:51 -msgid "Connection to Duet works correctly." -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:56 -msgid "Could not connect to Duet" -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 -msgid "Unknown error occured" -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:148 -msgid "Wrong password" -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:151 -msgid "Could not get resources to create a new connection" -msgstr "" - -#: src/slic3r/Utils/OctoPrint.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68 #, c-format msgid "Mismatched type of print host: %s" -msgstr "" +msgstr "Несумісний тип хосту друку: %s" -#: src/slic3r/Utils/OctoPrint.cpp:84 -msgid "Connection to OctoPrint works correctly." +#: src/slic3r/Utils/AstroBox.cpp:84 +msgid "Connection to AstroBox works correctly." msgstr "Підключення до OctoPrint працює правильно." -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Could not connect to OctoPrint" -msgstr "" +#: src/slic3r/Utils/AstroBox.cpp:90 +msgid "Could not connect to AstroBox" +msgstr "Не можливо підключитися до AstroBox" -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Note: OctoPrint version at least 1.1.0 is required." -msgstr "" +#: src/slic3r/Utils/AstroBox.cpp:92 +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "Примітка: Потрібна версія AstroBox принаймні 1.1.0." -#: src/slic3r/Utils/OctoPrint.cpp:195 -msgid "Connection to Prusa SLA works correctly." -msgstr "" +#: src/slic3r/Utils/Duet.cpp:47 +msgid "Connection to Duet works correctly." +msgstr "Підключення до Duet працює правильно." -#: src/slic3r/Utils/OctoPrint.cpp:200 -msgid "Could not connect to Prusa SLA" -msgstr "" +#: src/slic3r/Utils/Duet.cpp:53 +msgid "Could not connect to Duet" +msgstr "Не можливо підключитися до Duet" -#: src/slic3r/Utils/PresetUpdater.cpp:583 -#, c-format -msgid "requires min. %s and max. %s" -msgstr "" +#: src/slic3r/Utils/Duet.cpp:88 src/slic3r/Utils/Duet.cpp:151 +#: 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/PresetUpdater.cpp:588 -#, c-format -msgid "requires min. %s" -msgstr "" +#: src/slic3r/Utils/Duet.cpp:145 +msgid "Wrong password" +msgstr "Неправильний пароль" -#: src/slic3r/Utils/PresetUpdater.cpp:590 -#, c-format -msgid "requires max. %s" -msgstr "" +#: src/slic3r/Utils/Duet.cpp:148 +msgid "Could not get resources to create a new connection" +msgstr "Не вдалося отримати ресурси для створення нового з’єднання" #: src/slic3r/Utils/FixModelByWin10.cpp:219 #: src/slic3r/Utils/FixModelByWin10.cpp:359 msgid "Exporting source model" -msgstr "" +msgstr "Експортування вихідної моделі" #: src/slic3r/Utils/FixModelByWin10.cpp:235 msgid "Failed loading the input model." -msgstr "" +msgstr "Помилка завантаження вхідної моделі." #: src/slic3r/Utils/FixModelByWin10.cpp:242 msgid "Repairing model by the Netfabb service" -msgstr "" +msgstr "Відновлення моделі службою Netfabb" #: src/slic3r/Utils/FixModelByWin10.cpp:248 msgid "Mesh repair failed." -msgstr "" +msgstr "Не вдалося відновити сітку." #: src/slic3r/Utils/FixModelByWin10.cpp:251 #: src/slic3r/Utils/FixModelByWin10.cpp:378 msgid "Loading repaired model" -msgstr "" +msgstr "Завантаження відремонтованої моделі" #: src/slic3r/Utils/FixModelByWin10.cpp:263 #: src/slic3r/Utils/FixModelByWin10.cpp:270 #: src/slic3r/Utils/FixModelByWin10.cpp:302 msgid "Saving mesh into the 3MF container failed." -msgstr "" +msgstr "Не вдалося зберегти сітку в контейнері 3MF." #: src/slic3r/Utils/FixModelByWin10.cpp:340 msgid "Model fixing" -msgstr "" +msgstr "Ремонт моделі" #: src/slic3r/Utils/FixModelByWin10.cpp:341 -msgid "Exporting model..." -msgstr "" +msgid "Exporting model" +msgstr "Експортування моделі" #: src/slic3r/Utils/FixModelByWin10.cpp:368 msgid "Export of a temporary 3mf file failed" -msgstr "" +msgstr "Не вдалося експортувати тимчасовий 3MF-файл" #: src/slic3r/Utils/FixModelByWin10.cpp:383 msgid "Import of the repaired 3mf file failed" -msgstr "" +msgstr "Не вдалося імпортувати відновлений 3MF-файл" #: src/slic3r/Utils/FixModelByWin10.cpp:385 msgid "Repaired 3MF file does not contain any object" -msgstr "" +msgstr "Відновлений 3MF-файл не містить жодного об'єкта" #: src/slic3r/Utils/FixModelByWin10.cpp:387 msgid "Repaired 3MF file contains more than one object" -msgstr "" +msgstr "Відновлений 3MF-файл містить більше одного об'єкта" #: src/slic3r/Utils/FixModelByWin10.cpp:389 msgid "Repaired 3MF file does not contain any volume" -msgstr "" +msgstr "Відновлений 3MF-файл не містить жодної часті" #: src/slic3r/Utils/FixModelByWin10.cpp:391 msgid "Repaired 3MF file contains more than one volume" -msgstr "" +msgstr "Відновлений 3MF-файл містить більше однієї часті" #: src/slic3r/Utils/FixModelByWin10.cpp:400 msgid "Model repair finished" -msgstr "" +msgstr "Ремонт моделі завершено" #: src/slic3r/Utils/FixModelByWin10.cpp:406 msgid "Model repair canceled" -msgstr "" +msgstr "Ремонт моделі скасовано" #: src/slic3r/Utils/FixModelByWin10.cpp:423 msgid "Model repaired successfully" -msgstr "" +msgstr "Модель успішно відремонтована" #: src/slic3r/Utils/FixModelByWin10.cpp:423 #: src/slic3r/Utils/FixModelByWin10.cpp:426 msgid "Model Repair by the Netfabb service" -msgstr "" +msgstr "Ремонт моделі сервісом Netfabb" #: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed: \n" +msgid "Model repair failed:" +msgstr "Не вдалося відремонтувати модель:" + +#: src/slic3r/Utils/FlashAir.cpp:58 +msgid "Upload not enabled on FlashAir card." +msgstr "Завантаження не ввімкнено на картці FlashAir." + +#: src/slic3r/Utils/FlashAir.cpp:68 +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "Підключення до FlashAir працює правильно, і завантаження ввімкнено." + +#: src/slic3r/Utils/FlashAir.cpp:74 +msgid "Could not connect to FlashAir" +msgstr "Не можливо підключитися до FlashAir" + +#: src/slic3r/Utils/FlashAir.cpp:76 +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." msgstr "" +"Примітка: Потрібна FlashAir із прошивкою 2.00.02 або новішою та активованою " +"функцією завантаження." -#: src/libslic3r/Zipper.cpp:35 -msgid "undefined error" +#: src/slic3r/Utils/OctoPrint.cpp:83 +msgid "Connection to OctoPrint works correctly." +msgstr "Підключення до OctoPrint працює правильно." + +#: src/slic3r/Utils/OctoPrint.cpp:89 +msgid "Could not connect to OctoPrint" +msgstr "Не можливо підключитися до OctoPrint" + +#: src/slic3r/Utils/OctoPrint.cpp:91 +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "Зауважте: Необхідна версія OctoPrint - принаймні 1.1.0." + +#: src/slic3r/Utils/OctoPrint.cpp:185 +msgid "Connection to Prusa SL1 works correctly." +msgstr "Підключення до Prusa SL1 працює правильно." + +#: src/slic3r/Utils/OctoPrint.cpp:191 +msgid "Could not connect to Prusa SLA" +msgstr "Не можливо підключитися до Prusa SLA" + +#: src/slic3r/Utils/PresetUpdater.cpp:727 +#, c-format +msgid "requires min. %s and max. %s" +msgstr "вимагається мін. %s та макс. %s" + +#: src/slic3r/Utils/PresetUpdater.cpp:731 +#, c-format +msgid "requires min. %s" +msgstr "вимагається мін. %s" + +#: src/slic3r/Utils/PresetUpdater.cpp:734 +#, c-format +msgid "requires max. %s" +msgstr "вимагається макс. %s" + +#: src/slic3r/Utils/Http.cpp:73 +msgid "" +"Could not detect system SSL certificate store. PrusaSlicer will be unable to " +"establish secure network connections." msgstr "" +"Не вдалося виявити системе сховище SSL сертифікатів. PrusaSlicer не зможе " +"встановити безпечні мережеві з'єднання." -#: src/libslic3r/Zipper.cpp:37 -msgid "too many files" +#: src/slic3r/Utils/Http.cpp:78 +msgid "PrusaSlicer detected system SSL certificate store in: %1%" +msgstr "PrusaSlicer виявив системне сховище сертифікатів SSL у: %1%" + +#: src/slic3r/Utils/Http.cpp:82 +msgid "" +"To specify the system certificate store manually, please set the %1% " +"environment variable to the correct CA bundle and restart the application." msgstr "" +"Щоб вказати системне сховище сертифікатів вручну, встановіть змінну " +"середовища %1% на правильний пакет CA і перезапустіть програму." -#: src/libslic3r/Zipper.cpp:39 -msgid "file too large" +#: src/slic3r/Utils/Http.cpp:91 +msgid "" +"CURL init has failed. PrusaSlicer will be unable to establish network " +"connections. See logs for additional details." msgstr "" +"Curl init зазнав невдачі. PrusaSlicer не зможе встановити мережні " +"підключення. Додаткові відомості див." -#: src/libslic3r/Zipper.cpp:41 -msgid "unsupported method" +#: src/slic3r/Utils/Process.cpp:151 +msgid "Open G-code file:" +msgstr "Відкрити файл G-кода:" + +#: src/libslic3r/GCode.cpp:518 +msgid "There is an object with no extrusions on the first layer." +msgstr "Виявлено об'єкт без екструзії на першому шарі." + +#: src/libslic3r/GCode.cpp:536 +msgid "Empty layers detected, the output would not be printable." +msgstr "Виявлено порожні шари, вихідні дані не можна надрукувати." + +#: src/libslic3r/GCode.cpp:537 +msgid "Print z" +msgstr "Друк на висоті" + +#: src/libslic3r/GCode.cpp:538 +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/Zipper.cpp:43 -msgid "unsupported encryption" +#: src/libslic3r/GCode.cpp:1261 +msgid "" +"Your print is very close to the priming regions. Make sure there is no " +"collision." msgstr "" +"Ваша модель для друку розташована дуже близький до основних областей. " +"Переконайтесь, що немає зіткнення." -#: src/libslic3r/Zipper.cpp:45 -msgid "unsupported feature" +#: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:360 +msgid "Mixed" +msgstr "Змішаний" + +#: src/libslic3r/Flow.cpp:61 +msgid "" +"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" +"Не вдається розрахувати ширину екструзії для %1%: Змінна \"%2%\" недоступна." + +#: src/libslic3r/Format/3mf.cpp:1668 +msgid "" +"The selected 3mf file has been saved with a newer version of %1% and is not " +"compatible." +msgstr "Вибраний 3MF-файл було збережено з новою версією %1% і не сумісний." + +#: src/libslic3r/Format/AMF.cpp:958 +msgid "" +"The selected amf file has been saved with a newer version of %1% and is not " +"compatible." +msgstr "Вибраний АMF-файл було збережено з новою версією %1% і не сумісний." + +#: src/libslic3r/miniz_extension.cpp:91 +msgid "undefined error" +msgstr "невизначена помилка" + +#: src/libslic3r/miniz_extension.cpp:93 +msgid "too many files" +msgstr "забагато файлів" + +#: src/libslic3r/miniz_extension.cpp:95 +msgid "file too large" +msgstr "файл занадто великий" + +#: src/libslic3r/miniz_extension.cpp:97 +msgid "unsupported method" +msgstr "непідтримуваний метод" + +#: src/libslic3r/miniz_extension.cpp:99 +msgid "unsupported encryption" +msgstr "непідтримуване шифрування" + +#: src/libslic3r/miniz_extension.cpp:101 +msgid "unsupported feature" +msgstr "непідтримувана функція" -#: src/libslic3r/Zipper.cpp:47 +#: src/libslic3r/miniz_extension.cpp:103 msgid "failed finding central directory" -msgstr "" +msgstr "не вдалося знайти центральний каталог" -#: src/libslic3r/Zipper.cpp:49 +#: src/libslic3r/miniz_extension.cpp:105 msgid "not a ZIP archive" -msgstr "" +msgstr "не ZIP-архів" -#: src/libslic3r/Zipper.cpp:51 +#: src/libslic3r/miniz_extension.cpp:107 msgid "invalid header or archive is corrupted" -msgstr "" +msgstr "недійсний заголовок або архів пошкоджено" -#: src/libslic3r/Zipper.cpp:53 +#: src/libslic3r/miniz_extension.cpp:109 msgid "unsupported multidisk archive" -msgstr "" +msgstr "непідтримуваний багатодисковий архів" -#: src/libslic3r/Zipper.cpp:55 +#: src/libslic3r/miniz_extension.cpp:111 msgid "decompression failed or archive is corrupted" -msgstr "" +msgstr "не вдалося розпакувати або архів пошкоджено" -#: src/libslic3r/Zipper.cpp:57 +#: src/libslic3r/miniz_extension.cpp:113 msgid "compression failed" -msgstr "" +msgstr "помилка компресії" -#: src/libslic3r/Zipper.cpp:59 +#: src/libslic3r/miniz_extension.cpp:115 msgid "unexpected decompressed size" -msgstr "" +msgstr "несподіваний розпакований розмір" -#: src/libslic3r/Zipper.cpp:61 +#: src/libslic3r/miniz_extension.cpp:117 msgid "CRC-32 check failed" -msgstr "" +msgstr "Помилка перевірки CRC-32" -#: src/libslic3r/Zipper.cpp:63 +#: src/libslic3r/miniz_extension.cpp:119 msgid "unsupported central directory size" -msgstr "" +msgstr "непідтримуваний розмір центрального каталогу" -#: src/libslic3r/Zipper.cpp:65 +#: src/libslic3r/miniz_extension.cpp:121 msgid "allocation failed" -msgstr "" +msgstr "розміщення не вдався" -#: src/libslic3r/Zipper.cpp:67 +#: src/libslic3r/miniz_extension.cpp:123 msgid "file open failed" -msgstr "" +msgstr "не вдалося відкрити файл" -#: src/libslic3r/Zipper.cpp:69 +#: src/libslic3r/miniz_extension.cpp:125 msgid "file create failed" -msgstr "" +msgstr "не вдалося створити файл" -#: src/libslic3r/Zipper.cpp:71 +#: src/libslic3r/miniz_extension.cpp:127 msgid "file write failed" -msgstr "" +msgstr "не вдалося записати файл" -#: src/libslic3r/Zipper.cpp:73 +#: src/libslic3r/miniz_extension.cpp:129 msgid "file read failed" -msgstr "" +msgstr "не вдалося прочитати файл" -#: src/libslic3r/Zipper.cpp:75 +#: src/libslic3r/miniz_extension.cpp:131 msgid "file close failed" -msgstr "" +msgstr "не вдалося закрити файл" -#: src/libslic3r/Zipper.cpp:77 +#: src/libslic3r/miniz_extension.cpp:133 msgid "file seek failed" -msgstr "" +msgstr "пошук файлу не вдався" -#: src/libslic3r/Zipper.cpp:79 +#: src/libslic3r/miniz_extension.cpp:135 msgid "file stat failed" -msgstr "" +msgstr "не вдалося відкрити STAT-файл" -#: src/libslic3r/Zipper.cpp:81 +#: src/libslic3r/miniz_extension.cpp:137 msgid "invalid parameter" -msgstr "" - -#: src/libslic3r/Zipper.cpp:83 -msgid "invalid filename" -msgstr "" - -#: src/libslic3r/Zipper.cpp:85 -msgid "buffer too small" -msgstr "" - -#: src/libslic3r/Zipper.cpp:87 -msgid "internal error" -msgstr "" - -#: src/libslic3r/Zipper.cpp:89 -msgid "file not found" -msgstr "" - -#: src/libslic3r/Zipper.cpp:91 -msgid "archive is too large" -msgstr "" - -#: src/libslic3r/Zipper.cpp:93 -msgid "validation failed" -msgstr "" - -#: src/libslic3r/Zipper.cpp:95 -msgid "write calledback failed" -msgstr "" +msgstr "некоректний параметр" -#: src/libslic3r/Zipper.cpp:105 -msgid "Error with zip archive" -msgstr "" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2153 -msgid "Starting" -msgstr "" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2154 -msgid "Filtering" -msgstr "" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2155 -msgid "Generate pinheads" -msgstr "" +#: src/libslic3r/miniz_extension.cpp:139 +msgid "invalid filename" +msgstr "некоректне ім'я файлу" -#: src/libslic3r/SLA/SLASupportTree.cpp:2156 -msgid "Classification" -msgstr "" +#: src/libslic3r/miniz_extension.cpp:141 +msgid "buffer too small" +msgstr "занадто малий буфер" -#: src/libslic3r/SLA/SLASupportTree.cpp:2157 -msgid "Routing to ground" -msgstr "" +#: src/libslic3r/miniz_extension.cpp:143 +msgid "internal error" +msgstr "внутрішня помилка" -#: src/libslic3r/SLA/SLASupportTree.cpp:2158 -msgid "Routing supports to model surface" -msgstr "" +#: src/libslic3r/miniz_extension.cpp:145 +msgid "file not found" +msgstr "файл не знайдено" -#: src/libslic3r/SLA/SLASupportTree.cpp:2159 -msgid "Cascading pillars" -msgstr "" +#: src/libslic3r/miniz_extension.cpp:147 +msgid "archive is too large" +msgstr "архів завеликий" -#: src/libslic3r/SLA/SLASupportTree.cpp:2160 -msgid "Processing small holes" -msgstr "" +#: src/libslic3r/miniz_extension.cpp:149 +msgid "validation failed" +msgstr "не вдалося перевірити" -#: src/libslic3r/SLA/SLASupportTree.cpp:2161 -msgid "Done" -msgstr "" +#: src/libslic3r/miniz_extension.cpp:151 +msgid "write calledback failed" +msgstr "помилка запису зворотного виклику" -#: src/libslic3r/SLA/SLASupportTree.cpp:2162 -msgid "Abort" -msgstr "" +#: src/libslic3r/Preset.cpp:1299 +msgid "filament" +msgstr "філамент" -#: src/libslic3r/Print.cpp:1136 +#: src/libslic3r/Print.cpp:1251 msgid "All objects are outside of the print volume." -msgstr "" +msgstr "Усі об'єкти знаходяться поза просторем друку." -#: src/libslic3r/Print.cpp:1165 +#: src/libslic3r/Print.cpp:1254 +msgid "The supplied settings will cause an empty print." +msgstr "Надані параметри спричинять порожній друк." + +#: src/libslic3r/Print.cpp:1258 msgid "Some objects are too close; your extruder will collide with them." msgstr "" +"Деякі предмети розташовано занадто близько; ваш екструдер зіткнеться з ними." -#: src/libslic3r/Print.cpp:1180 +#: src/libslic3r/Print.cpp:1260 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" +"Деякі предмети занадто високі, і їх неможливо надрукувати без зіткнення " +"екструдера." -#: src/libslic3r/Print.cpp:1190 -msgid "The Spiral Vase option can only be used when printing a single object." +#: src/libslic3r/Print.cpp:1269 +msgid "" +"Only a single object may be printed at a time in Spiral Vase mode. Either " +"remove all but the last object, or enable sequential mode by " +"\"complete_objects\"." msgstr "" +"Одночасно в режимі спіральної вази можна друкувати лише один об’єкт. Або " +"видаліть усі, крім останнього об'єкта, або ввімкніть послідовний режим за " +"допомогою \"повних об'єктів\" (\"complete_objects\")." -#: src/libslic3r/Print.cpp:1192 +#: src/libslic3r/Print.cpp:1277 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "" +"Варіант спіральної вази можна використовувати лише під час друку одно-" +"матеріальних об’єктів." -#: src/libslic3r/Print.cpp:1198 +#: src/libslic3r/Print.cpp:1290 msgid "" -"All extruders must have the same diameter for single extruder multimaterial " -"printer." +"The wipe tower is only supported if all extruders have the same nozzle " +"diameter and use filaments of the same diameter." msgstr "" +"Вежа витирання підтримується лише в тому випадку, якщо всі екструдери мають " +"однаковий діаметр сопла і використовують філаменти одинакового діаметру." -#: src/libslic3r/Print.cpp:1203 +#: src/libslic3r/Print.cpp:1296 msgid "" -"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " -"and Repetier G-code flavors." +"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." msgstr "" +"Наразі вежа витирання підтримується лише для G-кодів, сумісних з Marlin, " +"RepRap/Sprinter, RepRapFirmware та Repetier ." -#: src/libslic3r/Print.cpp:1205 +#: src/libslic3r/Print.cpp:1298 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." msgstr "" +"Наразі вежа витирання підтримує лише відносну адресацію екструдерів " +"(use_relative_e_distances = 1)." + +#: src/libslic3r/Print.cpp:1300 +msgid "Ooze prevention is currently not supported with the wipe tower enabled." +msgstr "" +"Наразі запобігання просочування не підтримується з увімкненою вежею " +"витирання." + +#: src/libslic3r/Print.cpp:1302 +msgid "" +"The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." +msgstr "Наразі вежа витирання не підтримує об'ємне E (use_volumetric_e = 0)." + +#: src/libslic3r/Print.cpp:1304 +msgid "" +"The Wipe Tower is currently not supported for multimaterial sequential " +"prints." +msgstr "" +"Наразі вежа витирання не підтримується для багато-матеріального послідовного " +"друку." -#: src/libslic3r/Print.cpp:1226 +#: src/libslic3r/Print.cpp:1325 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " -"layer heigths" +"layer heights" msgstr "" +"Вежа витирання для кількох об’єктів підтримується лише у випадку, коли вони " +"мають однакову висоту шару" -#: src/libslic3r/Print.cpp:1228 +#: src/libslic3r/Print.cpp:1327 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" msgstr "" +"Вежа витирання для кількох об’єктів підтримується лише у випадку, коли вони " +"надруковані на рівній кількості шарів плоту" -#: src/libslic3r/Print.cpp:1230 +#: src/libslic3r/Print.cpp:1329 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" msgstr "" +"Вежа витирання для кількох об’єктів підтримується лише у випадку, коли вони " +"надруковані з однаковою відстанню support_material_contact_distance" -#: src/libslic3r/Print.cpp:1232 +#: src/libslic3r/Print.cpp:1331 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "" +"Вежа витирання для кількох об’єктів підтримується лише у випадку, коли вони " +"нарізані однаково." -#: src/libslic3r/Print.cpp:1261 +#: src/libslic3r/Print.cpp:1373 msgid "" -"The Wipe tower is only supported if all objects have the same layer height " -"profile" +"The Wipe tower is only supported if all objects have the same variable layer " +"height" msgstr "" +"Вежа витирання підтримується лише в тому випадку, якщо всі об’єкти мають " +"однакову висоту змінного шару" -#: src/libslic3r/Print.cpp:1271 -msgid "The supplied settings will cause an empty print." -msgstr "" - -#: src/libslic3r/Print.cpp:1288 +#: src/libslic3r/Print.cpp:1399 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" +"Одному або декільком об’єктам було призначено екструдер, якого принтер не " +"має." + +#: src/libslic3r/Print.cpp:1408 +msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" +msgstr "%1%=%2% мм є занадто низьким для друку на висоті шару %3% мм" -#: src/libslic3r/Print.cpp:1297 +#: src/libslic3r/Print.cpp:1411 +msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" +msgstr "%1% = %2% мм є надмірно для друку з діаметром сопла %3% мм" + +#: src/libslic3r/Print.cpp:1422 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " "or support_material_interface_extruder == 0), all nozzles have to be of the " "same diameter." msgstr "" +"Друк за допомогою декількох екструдерів різного діаметру сопла. Якщо " +"підтримки слід друкувати поточним екструдерем (support_material_extruder == " +"0 або support_material_interface_extruder == 0), усі сопла повинні мати " +"однаковий діаметр." -#: src/libslic3r/Print.cpp:1305 +#: src/libslic3r/Print.cpp:1430 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." msgstr "" +"Для того, щоб вежа витирання працювала з розчинними підтримками, шари " +"підтримки повинні бути синхронізовані з шарами об'єкта." -#: src/libslic3r/Print.cpp:1309 +#: src/libslic3r/Print.cpp:1434 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)." msgstr "" +"Вежа витирання в даний момент підтримує лише нерозчинні підтримки, якщо вони " +"друкуються з поточним екструдером, не запускаючи зміну інструменту. (Обидва " +"значення support_material_extruder і support_material_interface_extruder " +"повинні бути встановлені на 0)." + +#: src/libslic3r/Print.cpp:1456 +msgid "First layer height can't be greater than nozzle diameter" +msgstr "Висота першого шару не може перевищувати діаметр сопла" + +#: src/libslic3r/Print.cpp:1461 +msgid "Layer height can't be greater than nozzle diameter" +msgstr "Висота шару не може перевищувати діаметр сопла" + +#: src/libslic3r/Print.cpp:1620 +msgid "Infilling layers" +msgstr "Шари наповнення" + +#: src/libslic3r/Print.cpp:1646 +msgid "Generating skirt" +msgstr "Генерування спідниці" + +#: src/libslic3r/Print.cpp:1655 +msgid "Generating brim" +msgstr "Генерування краю" -#: src/libslic3r/Print.cpp:1316 -msgid "first_layer_height" +#: src/libslic3r/Print.cpp:1678 +msgid "Exporting G-code" +msgstr "Експортування G-коду" + +#: src/libslic3r/Print.cpp:1682 +msgid "Generating G-code" +msgstr "Генерування G-коду" + +#: src/libslic3r/SLA/Pad.cpp:532 +msgid "Pad brim size is too small for the current configuration." +msgstr "Розмір краю подушки замалий для поточної конфігурації." + +#: src/libslic3r/SLAPrint.cpp:630 +msgid "" +"Cannot proceed without support points! Add support points or disable support " +"generation." msgstr "" +"Не можливо продовжувати без точок підтримки! Додайте точки підтримки або " +"вимкніть генерацію підтримки." -#: src/libslic3r/Print.cpp:1331 -msgid "First layer height can't be greater than nozzle diameter" +#: src/libslic3r/SLAPrint.cpp:642 +msgid "" +"Elevation is too low for object. Use the \"Pad around object\" feature to " +"print the object without elevation." msgstr "" +"Підняття занадто мале для об'єкта. Використовуйте функцію \"Подушка навколо " +"об'єкта\" для друку об'єкта без підняття." -#: src/libslic3r/Print.cpp:1335 -msgid "Layer height can't be greater than nozzle diameter" +#: src/libslic3r/SLAPrint.cpp:648 +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:663 +msgid "Exposition time is out of printer profile bounds." +msgstr "Час експозиції виходить за межі профілю принтера." + +#: src/libslic3r/SLAPrint.cpp:670 +msgid "Initial exposition time is out of printer profile bounds." +msgstr "Початковий час експозиції виходить за межі профілю принтера." + +#: src/libslic3r/SLAPrint.cpp:786 +msgid "Slicing done" +msgstr "Нарізання завершено" + +#: src/libslic3r/SLAPrintSteps.cpp:44 +msgid "Hollowing model" +msgstr "Випорожнення моделі" -#: src/libslic3r/SLAPrint.cpp:55 +#: src/libslic3r/SLAPrintSteps.cpp:45 +msgid "Drilling holes into model." +msgstr "Свердління отворів в моделі." + +#: src/libslic3r/SLAPrintSteps.cpp:46 msgid "Slicing model" -msgstr "" +msgstr "Нарізання моделі" -#: src/libslic3r/SLAPrint.cpp:56 src/libslic3r/SLAPrint.cpp:801 +#: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359 msgid "Generating support points" -msgstr "" +msgstr "Генерування точок підтримки" -#: src/libslic3r/SLAPrint.cpp:57 +#: src/libslic3r/SLAPrintSteps.cpp:48 msgid "Generating support tree" -msgstr "" +msgstr "Генерування дерева підтримки" -#: src/libslic3r/SLAPrint.cpp:58 +#: src/libslic3r/SLAPrintSteps.cpp:49 msgid "Generating pad" -msgstr "" +msgstr "Генерування подушки" -#: src/libslic3r/SLAPrint.cpp:59 +#: src/libslic3r/SLAPrintSteps.cpp:50 msgid "Slicing supports" -msgstr "" +msgstr "Нарізання підтримок" -#: src/libslic3r/SLAPrint.cpp:71 +#: src/libslic3r/SLAPrintSteps.cpp:65 msgid "Merging slices and calculating statistics" -msgstr "" +msgstr "Об'єднання шарів друку та обчислення статистики" -#: src/libslic3r/SLAPrint.cpp:72 +#: src/libslic3r/SLAPrintSteps.cpp:66 msgid "Rasterizing layers" -msgstr "" +msgstr "Растеризуючі шари" -#: src/libslic3r/SLAPrint.cpp:605 -msgid "" -"Cannot proceed without support points! Add support points or disable support " -"generation." -msgstr "" +#: src/libslic3r/SLAPrintSteps.cpp:192 +msgid "Too many overlapping holes." +msgstr "Забагато отворів, що перекриваються." -#: src/libslic3r/SLAPrint.cpp:617 -msgid "Elevation is too low for object." +#: src/libslic3r/SLAPrintSteps.cpp:201 +msgid "" +"Drilling holes into the mesh failed. This is usually caused by broken model. " +"Try to fix it first." msgstr "" +"Не вдалося висвердлити отвори. Зазвичай це викликано зламаною моделлю. " +"Спершу спробуйте її виправити." -#: src/libslic3r/SLAPrint.cpp:699 -msgid "Slicing had to be stopped due to an internal error." +#: src/libslic3r/SLAPrintSteps.cpp:247 +msgid "" +"Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" +"Нарізання довелося зупинити через внутрішню помилку: Невідповідний індекс " +"зрізу." -#: src/libslic3r/SLAPrint.cpp:849 src/libslic3r/SLAPrint.cpp:859 -#: src/libslic3r/SLAPrint.cpp:907 +#: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420 +#: src/libslic3r/SLAPrintSteps.cpp:459 msgid "Visualizing supports" +msgstr "Візуалізація підтримки" + +#: src/libslic3r/SLAPrintSteps.cpp:451 +msgid "No pad can be generated for this model with the current configuration" msgstr "" +"Для цієї моделі з поточною конфігурацією неможливо створити жодну подушку" -#: src/libslic3r/SLAPrint.cpp:1449 -msgid "Slicing done" +#: src/libslic3r/SLAPrintSteps.cpp:619 +msgid "" +"There are unprintable objects. Try to adjust support settings to make the " +"objects printable." msgstr "" +"Є об’єкти, що не друкуються. Спробуйте налаштувати параметри підтримки, щоб " +"зробити об’єкти для друку." -#: src/libslic3r/PrintBase.cpp:65 +#: src/libslic3r/PrintBase.cpp:72 msgid "Failed processing of the output_filename_format template." -msgstr "" +msgstr "Помилка обробки шаблону output_filename_format." -#: src/libslic3r/PrintConfig.cpp:42 src/libslic3r/PrintConfig.cpp:43 +#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44 msgid "Printer technology" -msgstr "" +msgstr "Технологія друку" -#: src/libslic3r/PrintConfig.cpp:50 +#: src/libslic3r/PrintConfig.cpp:51 msgid "Bed shape" -msgstr "Форма полотна" +msgstr "Форма столу" + +#: src/libslic3r/PrintConfig.cpp:56 +msgid "Bed custom texture" +msgstr "Власна текстура столу" + +#: src/libslic3r/PrintConfig.cpp:61 +msgid "Bed custom model" +msgstr "Власна модель столу" + +#: src/libslic3r/PrintConfig.cpp:66 +msgid "G-code thumbnails" +msgstr "Ескізи G-коду" + +#: src/libslic3r/PrintConfig.cpp:67 +msgid "" +"Picture sizes to be stored into a .gcode and .sl1 files, in the following " +"format: \"XxY, XxY, ...\"" +msgstr "" +"Розміри зображень, які слід зберігати у файлах .gcode та .sl1, у такому " +"форматі: \"XxY, XxY, ...\"" -#: src/libslic3r/PrintConfig.cpp:57 +#: src/libslic3r/PrintConfig.cpp:75 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." @@ -4480,52 +8871,118 @@ msgstr "" "Цей параметр визначає висоту (і, таким чином, загальну кількість) шарів. " "Тонкі шари забезпечують більшу точність, але для друку потрібно більше часу." -#: src/libslic3r/PrintConfig.cpp:64 +#: src/libslic3r/PrintConfig.cpp:82 msgid "Max print height" -msgstr "" +msgstr "Максимальна висота друку" -#: src/libslic3r/PrintConfig.cpp:65 +#: src/libslic3r/PrintConfig.cpp:83 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." msgstr "" +"Встановіть це значення на максимальну висоту, якої може досягти ваш " +"екструдер під час друку." -#: src/libslic3r/PrintConfig.cpp:71 +#: src/libslic3r/PrintConfig.cpp:91 msgid "Slice gap closing radius" -msgstr "" +msgstr "Радіус закриття зазору зрізу" -#: src/libslic3r/PrintConfig.cpp:73 +#: src/libslic3r/PrintConfig.cpp:93 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " "resolution, therefore it is advisable to keep the value reasonably low." msgstr "" +"Тріщини з радіусом, меншим ніж 2 закриття зазору, заповнюються під час " +"нарізування трикутної сітки. Операція заповнення проміжку може зменшити " +"остаточну роздільну здатність друку, тому доцільно підтримувати значення на " +"досить низькому рівні." -#: src/libslic3r/PrintConfig.cpp:81 +#: src/libslic3r/PrintConfig.cpp:101 msgid "Hostname, IP or URL" -msgstr "" +msgstr "Ім'я хоста, IP або URL" -#: src/libslic3r/PrintConfig.cpp:82 +#: src/libslic3r/PrintConfig.cpp:102 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " -"the hostname, IP address or URL of the printer host instance." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:88 +"the hostname, IP address or URL of the printer host instance. Print host " +"behind HAProxy with basic auth enabled can be accessed by putting the user " +"name and password into the URL in the following format: https://username:" +"password@your-octopi-address/" +msgstr "" +"Slic3r може завантажувати файли G-коду на хост принтера. Це поле повинно " +"містити ім’я хосту, IP-адресу або URL-адресу екземпляра хосту принтера. Хост " +"друку, що стоїть за HAProxy з увімкненою базовою автентифікацією, можна " +"отримати, ввівши ім’я користувача та пароль у URL-адресу у такому форматі: " +"https://username:password@your-octopi-address/" + +#: src/libslic3r/PrintConfig.cpp:110 msgid "API Key / Password" -msgstr "" +msgstr "Ключ API / Пароль" -#: src/libslic3r/PrintConfig.cpp:89 +#: src/libslic3r/PrintConfig.cpp:111 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." msgstr "" +"Slic3r може завантажувати файли G-коду на хост принтера. Це поле повинно " +"містити ключ API або пароль, необхідний для автентифікації." -#: src/libslic3r/PrintConfig.cpp:111 +#: src/libslic3r/PrintConfig.cpp:118 +msgid "Name of the printer" +msgstr "Назва принтера" + +#: src/libslic3r/PrintConfig.cpp:125 +msgid "" +"Custom CA certificate file can be specified for HTTPS OctoPrint connections, " +"in crt/pem format. If left blank, the default OS CA certificate repository " +"is used." +msgstr "" +"Настроюваний файл сертифіката CA можна вказати для з'єднань HTTPS OctoPrint " +"у форматі crt/pem. Якщо залишити це поле порожнім, буде використано типове " +"сховище сертифікатів OS CA." + +#: src/libslic3r/PrintConfig.cpp:131 +msgid "Elephant foot compensation" +msgstr "Зрівноваження Стопи слона" + +#: src/libslic3r/PrintConfig.cpp:133 +msgid "" +"The first layer will be shrunk in the XY plane by the configured value to " +"compensate for the 1st layer squish aka an Elephant Foot effect." +msgstr "" +"Перший шар буде зменшено в площині XY завдяки налаштованому значенню, щоб " +"компенсувати ефект Ноги Слона для 1-го шару." + +#: src/libslic3r/PrintConfig.cpp:149 +msgid "Password" +msgstr "Пароль" + +#: src/libslic3r/PrintConfig.cpp:155 +msgid "Printer preset name" +msgstr "Назва пресету принтера" + +#: src/libslic3r/PrintConfig.cpp:156 +msgid "Related printer preset name" +msgstr "Назва пов’язаного пресету принтера" + +#: src/libslic3r/PrintConfig.cpp:161 +msgid "Authorization Type" +msgstr "Тип авторизації" + +#: src/libslic3r/PrintConfig.cpp:166 +msgid "API key" +msgstr "Ключ API" + +#: src/libslic3r/PrintConfig.cpp:167 +msgid "HTTP digest" +msgstr "Дайджест HTTP" + +#: src/libslic3r/PrintConfig.cpp:180 msgid "Avoid crossing perimeters" msgstr "Уникати перетинання периметрів" -#: src/libslic3r/PrintConfig.cpp:112 +#: src/libslic3r/PrintConfig.cpp:181 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " @@ -4535,37 +8992,57 @@ msgstr "" "основному це корисно для екструдерів Bowden, які страждають від протікання. " "Ця функція уповільнює як друк, так і генерацію G-коду." -#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:1976 +#: src/libslic3r/PrintConfig.cpp:188 +msgid "Avoid crossing perimeters - Max detour length" +msgstr "Уникати перетинання периметрів - Макс. довжина обходу" + +#: src/libslic3r/PrintConfig.cpp:190 +msgid "" +"The maximum detour length for avoid crossing perimeters. If the detour is " +"longer than this value, avoid crossing perimeters is not applied for this " +"travel path. Detour length could be specified either as an absolute value or " +"as percentage (for example 50%) of a direct travel path." +msgstr "" +"Максимальна довжина обходу, щоб уникнути перетину периметрів. Якщо обхід " +"довший за це значення, уникнення перетину периметрів для цього шляху не " +"застосовується. Довжина обходу може бути вказана або як абсолютне значення, " +"або як відсоток (наприклад, 50%) від прямого шляху проходу." + +#: src/libslic3r/PrintConfig.cpp:193 +msgid "mm or % (zero to disable)" +msgstr "мм або % (0, щоб вимкнути)" + +#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:2291 msgid "Other layers" msgstr "Інші шари" -#: src/libslic3r/PrintConfig.cpp:120 +#: src/libslic3r/PrintConfig.cpp:200 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." msgstr "" -"Температура полотна для останніх шарів після першого. Установіть 0, щоб " -"відключити команди керування температурою полотна на виході." +"Температура столу для останніх шарів після першого. Установіть 0, щоб " +"відключити команди керування температурою столу на виході." -#: src/libslic3r/PrintConfig.cpp:122 +#: src/libslic3r/PrintConfig.cpp:203 msgid "Bed temperature" -msgstr "Температура полотна" +msgstr "Температура столу" -#: src/libslic3r/PrintConfig.cpp:129 +#: src/libslic3r/PrintConfig.cpp:210 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " "as [layer_num] and [layer_z]." msgstr "" "Цей користувацький код вставляється при кожній зміні шару перед початком " -"переміщення Z. Зауважте, що ви можете використовувати змінні-заповнювачі для " +"переміщення Z. Зауважте, що ви можете використовувати шаблонні змінні для " "всіх параметрів Slic3r, а також [layer_num] і [layer_z]." -#: src/libslic3r/PrintConfig.cpp:139 +#: src/libslic3r/PrintConfig.cpp:220 msgid "Between objects G-code" msgstr "G-код між об'єктами" -#: src/libslic3r/PrintConfig.cpp:140 +#: src/libslic3r/PrintConfig.cpp:221 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -4578,23 +9055,35 @@ msgstr "" "замовчуванням екструдер і температура полотна скидаються за допомогою " "команди non-wait; однак, якщо в цьому користувальному коді виявляються M104, " "M109, M140 або M190, Slic3r не додаватиме команди температури. Зверніть " -"увагу, що ви можете використовувати змінні-заповнювачі для всіх параметрів " +"увагу, що ви можете використовувати шаблонні змінні для всіх параметрів " "Slic3r, то ж ви можете вставити команду \"M109 S [first_layer_temperature]\" " "де завгодно." -#: src/libslic3r/PrintConfig.cpp:150 +#: src/libslic3r/PrintConfig.cpp:232 msgid "Number of solid layers to generate on bottom surfaces." msgstr "Кількість суцільних шарів, генерованих на нижніх поверхнях." -#: src/libslic3r/PrintConfig.cpp:151 +#: src/libslic3r/PrintConfig.cpp:233 msgid "Bottom solid layers" msgstr "Нижні суцільні шари" -#: src/libslic3r/PrintConfig.cpp:156 +#: src/libslic3r/PrintConfig.cpp:241 +msgid "" +"The number of bottom solid layers is increased above bottom_solid_layers if " +"necessary to satisfy minimum thickness of bottom shell." +msgstr "" +"Кількість твердих шарів знизу збільшується над нижчими твердими шарами, якщо " +"це необхідно для задоволення мінімальної товщини донної оболонки." + +#: src/libslic3r/PrintConfig.cpp:243 +msgid "Minimum bottom shell thickness" +msgstr "Мінімальна товщина нижньої оболонки" + +#: src/libslic3r/PrintConfig.cpp:249 msgid "Bridge" msgstr "Міст" -#: src/libslic3r/PrintConfig.cpp:157 +#: src/libslic3r/PrintConfig.cpp:250 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." @@ -4602,18 +9091,18 @@ msgstr "" "Це прискорення, яке ваш принтер використовуватиме для мостів. Встановити 0, " "щоб відключити управління прискоренням для мостів." -#: src/libslic3r/PrintConfig.cpp:159 src/libslic3r/PrintConfig.cpp:302 -#: src/libslic3r/PrintConfig.cpp:814 src/libslic3r/PrintConfig.cpp:935 -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:1133 -#: src/libslic3r/PrintConfig.cpp:1144 src/libslic3r/PrintConfig.cpp:1333 +#: src/libslic3r/PrintConfig.cpp:252 src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:940 src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1409 +#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1612 msgid "mm/s²" msgstr "мм/с²" -#: src/libslic3r/PrintConfig.cpp:165 +#: src/libslic3r/PrintConfig.cpp:258 msgid "Bridging angle" msgstr "Кут моста" -#: src/libslic3r/PrintConfig.cpp:167 +#: src/libslic3r/PrintConfig.cpp:260 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -4623,33 +9112,35 @@ msgstr "" "автоматично. Інакше передбачений кут буде використаний для всіх мостів. " "Використовуйте 180° для нульового кута." -#: src/libslic3r/PrintConfig.cpp:170 src/libslic3r/PrintConfig.cpp:732 -#: src/libslic3r/PrintConfig.cpp:1569 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1807 src/libslic3r/PrintConfig.cpp:1961 -#: src/libslic3r/PrintConfig.cpp:2459 +#: src/libslic3r/PrintConfig.cpp:263 src/libslic3r/PrintConfig.cpp:852 +#: src/libslic3r/PrintConfig.cpp:1853 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:2121 src/libslic3r/PrintConfig.cpp:2276 +#: src/libslic3r/PrintConfig.cpp:2475 src/libslic3r/PrintConfig.cpp:2976 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "°" msgstr "°" -#: src/libslic3r/PrintConfig.cpp:176 +#: src/libslic3r/PrintConfig.cpp:269 msgid "Bridges fan speed" msgstr "Швидкість вентилятора для мостів" -#: src/libslic3r/PrintConfig.cpp:177 +#: src/libslic3r/PrintConfig.cpp:270 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "Ця швидкість вентилятора виконується для всіх мостів і виступів." -#: src/libslic3r/PrintConfig.cpp:178 src/libslic3r/PrintConfig.cpp:744 -#: src/libslic3r/PrintConfig.cpp:1153 src/libslic3r/PrintConfig.cpp:1216 -#: src/libslic3r/PrintConfig.cpp:1461 src/libslic3r/PrintConfig.cpp:2258 -#: src/libslic3r/PrintConfig.cpp:2498 +#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:864 +#: src/libslic3r/PrintConfig.cpp:1248 src/libslic3r/PrintConfig.cpp:1427 +#: src/libslic3r/PrintConfig.cpp:1490 src/libslic3r/PrintConfig.cpp:1745 +#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2890 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:185 +#: src/libslic3r/PrintConfig.cpp:278 msgid "Bridge flow ratio" msgstr "Співвідношення мостового потоку" -#: src/libslic3r/PrintConfig.cpp:187 +#: src/libslic3r/PrintConfig.cpp:280 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -4661,32 +9152,33 @@ msgstr "" "стандартні налаштування зазвичай добрі, тому ви маете по-експериментувати з " "охолодженням (використовуйте вентилятор), перш ніж їх налаштувати." -#: src/libslic3r/PrintConfig.cpp:197 +#: src/libslic3r/PrintConfig.cpp:290 msgid "Bridges" msgstr "Мости" -#: src/libslic3r/PrintConfig.cpp:199 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Speed for printing bridges." msgstr "Швидкість друку мостів." -#: src/libslic3r/PrintConfig.cpp:200 src/libslic3r/PrintConfig.cpp:576 -#: src/libslic3r/PrintConfig.cpp:584 src/libslic3r/PrintConfig.cpp:593 -#: src/libslic3r/PrintConfig.cpp:601 src/libslic3r/PrintConfig.cpp:628 -#: src/libslic3r/PrintConfig.cpp:647 src/libslic3r/PrintConfig.cpp:873 -#: src/libslic3r/PrintConfig.cpp:1000 src/libslic3r/PrintConfig.cpp:1078 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1111 -#: src/libslic3r/PrintConfig.cpp:1122 src/libslic3r/PrintConfig.cpp:1175 -#: src/libslic3r/PrintConfig.cpp:1234 src/libslic3r/PrintConfig.cpp:1362 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1545 -#: src/libslic3r/PrintConfig.cpp:1940 src/libslic3r/PrintConfig.cpp:2051 +#: src/libslic3r/PrintConfig.cpp:293 src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:679 src/libslic3r/PrintConfig.cpp:688 +#: src/libslic3r/PrintConfig.cpp:696 src/libslic3r/PrintConfig.cpp:723 +#: src/libslic3r/PrintConfig.cpp:742 src/libslic3r/PrintConfig.cpp:1015 +#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1267 +#: src/libslic3r/PrintConfig.cpp:1343 src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1449 src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1642 src/libslic3r/PrintConfig.cpp:1820 +#: src/libslic3r/PrintConfig.cpp:1829 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "mm/s" msgstr "мм/с" -#: src/libslic3r/PrintConfig.cpp:207 +#: src/libslic3r/PrintConfig.cpp:300 msgid "Brim width" msgstr "Ширина краю" -#: src/libslic3r/PrintConfig.cpp:208 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "Horizontal width of the brim that will be printed around each object on the " "first layer." @@ -4694,33 +9186,33 @@ msgstr "" "Горизонтальна ширина краю, яка буде надрукована навколо кожного об'єкта на " "першому шарі." -#: src/libslic3r/PrintConfig.cpp:215 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Clip multi-part objects" msgstr "Обрізати об'єкти, що складаються з кількох частин" -#: src/libslic3r/PrintConfig.cpp:216 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" -"When printing multi-material objects, this settings will make slic3r to clip " +"When printing multi-material objects, this settings will make Slic3r to clip " "the overlapping object parts one by the other (2nd part will be clipped by " "the 1st, 3rd part will be clipped by the 1st and 2nd etc)." msgstr "" -"Під час друку багатоматеріальних об'єктів ці налаштування змушують slic3r " -"обрізати частини, що перекриваються один одною (друга частина буде обрізана " -"першою, третя - першою та другою, тощо)." +"Під час друку багато-матеріальних об'єктів ці налаштування дозволять Slic3r " +"відсікати накладені частини об'єкта одна за одною (друга частина буде " +"відсічена першою, третя частина буде відсічена першою та другою тощо)." -#: src/libslic3r/PrintConfig.cpp:223 +#: src/libslic3r/PrintConfig.cpp:316 msgid "Colorprint height" -msgstr "" +msgstr "Висота кольорового друку" -#: src/libslic3r/PrintConfig.cpp:224 -msgid "Heights at which a filament change is to occur. " -msgstr "" +#: src/libslic3r/PrintConfig.cpp:317 +msgid "Heights at which a filament change is to occur." +msgstr "Висоти, на яких має відбуватися зміна філаменту." -#: src/libslic3r/PrintConfig.cpp:234 +#: src/libslic3r/PrintConfig.cpp:327 msgid "Compatible printers condition" -msgstr "Стан сумісних принтерів" +msgstr "Умови сумісності принтерів" -#: src/libslic3r/PrintConfig.cpp:235 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -4730,22 +9222,25 @@ msgstr "" "принтера. Якщо цей вираз оцінюється як Правда, цей профіль вважається " "сумісним з активним профілем принтера." -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:342 msgid "Compatible print profiles condition" -msgstr "" +msgstr "Умови сумісності пресетів друку" -#: src/libslic3r/PrintConfig.cpp:250 +#: src/libslic3r/PrintConfig.cpp:343 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " "compatible with the active print profile." msgstr "" +"Логічний вираз, що використовує значення конфігурації активного профілю " +"друку. Якщо цей вираз оцінюється як Правда, цей профіль вважається сумісним " +"з активним профілем друку." -#: src/libslic3r/PrintConfig.cpp:267 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Complete individual objects" msgstr "Закінчити окремі об'єкти" -#: src/libslic3r/PrintConfig.cpp:268 +#: src/libslic3r/PrintConfig.cpp:361 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -4757,11 +9252,11 @@ msgstr "" "шару). Ця функція корисна для уникнення ризику зіпсованих відбитків. Slic3r " "має попередити та запобігти зіткненню екструдера, але будьте обережні." -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:369 msgid "Enable auto cooling" msgstr "Увімкнути автоматичне охолодження" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:370 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." @@ -4769,23 +9264,26 @@ msgstr "" "Цей прапорець дозволяє автоматичну логіку охолодження, яка регулює швидкість " "друку та швидкість вентиляції відповідно до часу друку шару." -#: src/libslic3r/PrintConfig.cpp:282 +#: src/libslic3r/PrintConfig.cpp:375 msgid "Cooling tube position" -msgstr "" +msgstr "Позиція охолоджувальної трубки" -#: src/libslic3r/PrintConfig.cpp:283 -msgid "Distance of the center-point of the cooling tube from the extruder tip " +#: src/libslic3r/PrintConfig.cpp:376 +msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" +"Відстань центральної точки охолоджувальної трубки від наконечника екструдера." -#: src/libslic3r/PrintConfig.cpp:290 +#: src/libslic3r/PrintConfig.cpp:383 msgid "Cooling tube length" -msgstr "" +msgstr "Довжина охолоджувальної трубки" -#: src/libslic3r/PrintConfig.cpp:291 -msgid "Length of the cooling tube to limit space for cooling moves inside it " +#: src/libslic3r/PrintConfig.cpp:384 +msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" +"Довжина охолоджувальної трубки для обмеження простору для охолоджуючих рухів " +"всередині неї." -#: src/libslic3r/PrintConfig.cpp:299 +#: src/libslic3r/PrintConfig.cpp:392 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -4795,34 +9293,38 @@ msgstr "" "використані конкретні визначені прискорення (периметру / заповнення). " "Встановити 0, щоб запобігти скиданням прискорення взагалі." -#: src/libslic3r/PrintConfig.cpp:308 +#: src/libslic3r/PrintConfig.cpp:401 msgid "Default filament profile" -msgstr "" +msgstr "Профіль філаметну за замовчанням" -#: src/libslic3r/PrintConfig.cpp:309 +#: src/libslic3r/PrintConfig.cpp:402 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " "activated." msgstr "" +"Профіль філаметну за замовчанням, пов'язаний з поточним профілем принтера. " +"При виборі поточного профілю принтера цей профіль філаметну буде активовано." -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:408 msgid "Default print profile" -msgstr "" +msgstr "Профіль друку за замовчанням" -#: src/libslic3r/PrintConfig.cpp:316 src/libslic3r/PrintConfig.cpp:2337 -#: src/libslic3r/PrintConfig.cpp:2348 +#: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:2820 +#: src/libslic3r/PrintConfig.cpp:2831 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " "activated." msgstr "" +"Профіль друку за промовчанням, пов'язаний із поточним профілем принтера. При " +"виборі поточного профілю принтера цей профіль друку буде активовано." -#: src/libslic3r/PrintConfig.cpp:322 +#: src/libslic3r/PrintConfig.cpp:415 msgid "Disable fan for the first" msgstr "Вимкнути вентилятор для першого(их)" -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:416 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." @@ -4831,18 +9333,11 @@ msgstr "" "протягом друку декількох перших шарів, щоб це не призвело до гіршого " "зчеплення." -#: src/libslic3r/PrintConfig.cpp:325 src/libslic3r/PrintConfig.cpp:945 -#: src/libslic3r/PrintConfig.cpp:1434 src/libslic3r/PrintConfig.cpp:1619 -#: src/libslic3r/PrintConfig.cpp:1680 src/libslic3r/PrintConfig.cpp:1843 -#: src/libslic3r/PrintConfig.cpp:1888 -msgid "layers" -msgstr "шару(ів)" - -#: src/libslic3r/PrintConfig.cpp:332 +#: src/libslic3r/PrintConfig.cpp:425 msgid "Don't support bridges" msgstr "Не підтримувати мости" -#: src/libslic3r/PrintConfig.cpp:334 +#: src/libslic3r/PrintConfig.cpp:427 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." @@ -4850,51 +9345,42 @@ msgstr "" "Експериментальний варіант для запобігання утворенню допоміжного матеріалу в " "областях під мостами." -#: src/libslic3r/PrintConfig.cpp:340 +#: src/libslic3r/PrintConfig.cpp:433 msgid "Distance between copies" msgstr "Відстань між копіями" -#: src/libslic3r/PrintConfig.cpp:341 +#: src/libslic3r/PrintConfig.cpp:434 msgid "Distance used for the auto-arrange feature of the plater." msgstr "Відстань використовується для автоматичного розташування платеру." -#: src/libslic3r/PrintConfig.cpp:348 -msgid "Elephant foot compensation" -msgstr "Зрівноваження Стопи слона" - -#: src/libslic3r/PrintConfig.cpp:350 -msgid "" -"The first layer will be shrunk in the XY plane by the configured value to " -"compensate for the 1st layer squish aka an Elephant Foot effect." -msgstr "" -"Перший шар буде зменшено в площині XY завдяки налаштованому значенню, щоб " -"компенсувати ефект Ноги Слона для 1-го шару." - -#: src/libslic3r/PrintConfig.cpp:359 +#: src/libslic3r/PrintConfig.cpp:442 msgid "" "This end procedure is inserted at the end of the output file. Note that you " -"can use placeholder variables for all Slic3r settings." +"can use placeholder variables for all PrusaSlicer settings." msgstr "" -"Ця кінцева процедура вставляється в кінці вихідного файлу. Зауважте, що ви " -"можете використовувати заповнювачі змінних для всіх параметрів Slic3r." +"Ця процедура завершення вставляється в кінець вихідного файлу. Зверніть " +"увагу, що ви можете використовувати шаблонні змінні для всіх налаштувань " +"PrusaSlicer." -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:452 msgid "" "This end procedure is inserted at the end of the output file, before the " -"printer end gcode. Note that you can use placeholder variables for all " -"Slic3r settings. If you have multiple extruders, the gcode is processed in " -"extruder order." -msgstr "" -"Ця кінцева процедура вставляється в кінці вихідного файлу перед кінцевим " -"кодом принтера. Зауважте, що ви можете використовувати заповнювачі змінних " -"для всіх параметрів Slic3r. Якщо у вас є кілька екструдерів, G-code " -"обробляється в порядку екструдерів." - -#: src/libslic3r/PrintConfig.cpp:379 +"printer end gcode (and before any toolchange from this filament in case of " +"multimaterial printers). Note that you can use placeholder variables for all " +"PrusaSlicer settings. If you have multiple extruders, the gcode is processed " +"in extruder order." +msgstr "" +"Ця процедура завершення вставляється в кінець вихідного файлу, перед " +"кінцевим кодом принтера (і перед будь-якою заміною інструменту з цього " +"філаменту у разі багатоматеріальних принтерів). Зверніть увагу, що ви можете " +"використовувати шаблонні змінні для всіх налаштувань PrusaSlicer. Якщо у вас " +"кілька екструдерів, G-код обробляється в порядку екструдера." + +#: src/libslic3r/PrintConfig.cpp:463 msgid "Ensure vertical shell thickness" -msgstr "Перевірте товщину вертикальної оболонки" +msgstr "Забезпечення товщини вертикальної оболонки" -#: src/libslic3r/PrintConfig.cpp:381 +#: src/libslic3r/PrintConfig.cpp:465 msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell " "thickness (top+bottom solid layers)." @@ -4902,52 +9388,64 @@ msgstr "" "Додайте суцільні наповнювачі біля нахилених поверхонь, щоб гарантувати " "товщину вертикальної оболонки (верхній і нижній суцільні шари)." -#: src/libslic3r/PrintConfig.cpp:387 +#: src/libslic3r/PrintConfig.cpp:471 msgid "Top fill pattern" -msgstr "" +msgstr "Верхній шаблон наповнення" -#: src/libslic3r/PrintConfig.cpp:389 +#: src/libslic3r/PrintConfig.cpp:473 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." msgstr "" +"Шаблон для верхнього наповнення. Це впливає лише на зовнішній видимий шар, а " +"не на сусідні суцільні оболонки." -#: src/libslic3r/PrintConfig.cpp:397 src/libslic3r/PrintConfig.cpp:795 -#: src/libslic3r/PrintConfig.cpp:1921 +#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:2236 msgid "Rectilinear" -msgstr "" +msgstr "Прямолінійний" -#: src/libslic3r/PrintConfig.cpp:398 src/libslic3r/PrintConfig.cpp:801 +#: src/libslic3r/PrintConfig.cpp:484 +msgid "Monotonic" +msgstr "Монотонне" + +#: src/libslic3r/PrintConfig.cpp:485 src/libslic3r/PrintConfig.cpp:919 +msgid "Aligned Rectilinear" +msgstr "Вирівняний прямолінійний" + +#: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:925 msgid "Concentric" -msgstr "" +msgstr "Концентричний" -#: src/libslic3r/PrintConfig.cpp:399 src/libslic3r/PrintConfig.cpp:805 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:929 msgid "Hilbert Curve" -msgstr "" +msgstr "Крива Гільберта" -#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:806 +#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:930 msgid "Archimedean Chords" -msgstr "" +msgstr "Архімедові акорди" -#: src/libslic3r/PrintConfig.cpp:401 src/libslic3r/PrintConfig.cpp:807 +#: src/libslic3r/PrintConfig.cpp:489 src/libslic3r/PrintConfig.cpp:931 msgid "Octagram Spiral" -msgstr "" +msgstr "Спіраль октаграм" -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:495 msgid "Bottom fill pattern" -msgstr "" +msgstr "Нижній шаблон наповнення" -#: src/libslic3r/PrintConfig.cpp:409 +#: src/libslic3r/PrintConfig.cpp:497 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." msgstr "" +"Шаблон для нижнього наповнення. Це впливає лише на зовнішній видимий шар, а " +"не на сусідні суцільні оболонки." -#: src/libslic3r/PrintConfig.cpp:414 src/libslic3r/PrintConfig.cpp:424 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:517 msgid "External perimeters" msgstr "Зовнішні периметри" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:508 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -4960,14 +9458,16 @@ msgstr "" "сопла. Якщо він виражений у відсотках (наприклад, 200%), він буде " "обчислюватися за висотою шару." -#: src/libslic3r/PrintConfig.cpp:419 src/libslic3r/PrintConfig.cpp:834 -#: src/libslic3r/PrintConfig.cpp:966 src/libslic3r/PrintConfig.cpp:1353 -#: src/libslic3r/PrintConfig.cpp:1691 src/libslic3r/PrintConfig.cpp:1864 -#: src/libslic3r/PrintConfig.cpp:2022 -msgid "mm or % (leave 0 for default)" -msgstr "мм або % (залиште 0 за замовчанням)" +#: src/libslic3r/PrintConfig.cpp:511 src/libslic3r/PrintConfig.cpp:621 +#: src/libslic3r/PrintConfig.cpp:962 src/libslic3r/PrintConfig.cpp:975 +#: src/libslic3r/PrintConfig.cpp:1104 src/libslic3r/PrintConfig.cpp:1159 +#: src/libslic3r/PrintConfig.cpp:1185 src/libslic3r/PrintConfig.cpp:1632 +#: src/libslic3r/PrintConfig.cpp:1961 src/libslic3r/PrintConfig.cpp:2110 +#: src/libslic3r/PrintConfig.cpp:2178 src/libslic3r/PrintConfig.cpp:2339 +msgid "mm or %" +msgstr "мм або %" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:519 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -4978,17 +9478,17 @@ msgstr "" "налаштування швидкості периметра вище. Встановити 0 для автоматичного " "використання." -#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855 -#: src/libslic3r/PrintConfig.cpp:1650 src/libslic3r/PrintConfig.cpp:1701 -#: src/libslic3r/PrintConfig.cpp:1907 src/libslic3r/PrintConfig.cpp:2034 +#: src/libslic3r/PrintConfig.cpp:522 src/libslic3r/PrintConfig.cpp:984 +#: src/libslic3r/PrintConfig.cpp:1920 src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2222 src/libslic3r/PrintConfig.cpp:2352 msgid "mm/s or %" msgstr "мм/с або %" -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:529 msgid "External perimeters first" msgstr "Спочатку зовнішні периметри" -#: src/libslic3r/PrintConfig.cpp:438 +#: src/libslic3r/PrintConfig.cpp:531 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." @@ -4996,12 +9496,11 @@ msgstr "" "Друкувати контури периметра від найзовнішнього до найвнутрішнього, замість " "інверсного порядку за замовчанням." -#: src/libslic3r/PrintConfig.cpp:444 +#: src/libslic3r/PrintConfig.cpp:537 msgid "Extra perimeters if needed" msgstr "Додаткові периметри, якщо необхідно" -#: src/libslic3r/PrintConfig.cpp:446 -#, no-c-format +#: src/libslic3r/PrintConfig.cpp:539 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 " @@ -5011,7 +9510,7 @@ msgstr "" "Slic3r продовжує додавати периметри, поки підтримується більше 70% петель " "безпосередньо вище." -#: src/libslic3r/PrintConfig.cpp:456 +#: src/libslic3r/PrintConfig.cpp:549 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -5021,7 +9520,7 @@ msgstr "" "екструдера). Це значення перевизначає екструдери периметра та наповнювача, " "але не екструдери підтримки." -#: src/libslic3r/PrintConfig.cpp:468 +#: src/libslic3r/PrintConfig.cpp:561 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -5033,11 +9532,7 @@ msgstr "" "навколо вашого екструдера, і це являє собою максимальну глибину, яку " "екструдер може розглядати до зіткнення з іншими друкованими предметами." -#: src/libslic3r/PrintConfig.cpp:478 -msgid "Radius" -msgstr "Радіус" - -#: src/libslic3r/PrintConfig.cpp:479 +#: src/libslic3r/PrintConfig.cpp:572 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " @@ -5048,20 +9543,20 @@ msgstr "" "параметр використовується для перевірки зіткнень та відображення графічного " "попереднього перегляду в панелі." -#: src/libslic3r/PrintConfig.cpp:489 +#: src/libslic3r/PrintConfig.cpp:582 msgid "Extruder Color" msgstr "Колір екструдера" -#: src/libslic3r/PrintConfig.cpp:490 src/libslic3r/PrintConfig.cpp:550 +#: src/libslic3r/PrintConfig.cpp:583 src/libslic3r/PrintConfig.cpp:645 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" "Ця опція використовується лише у інтерфейсі Slic3r як візуальна допомога." -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:589 msgid "Extruder offset" msgstr "Зміщення екструдеру" -#: src/libslic3r/PrintConfig.cpp:497 +#: src/libslic3r/PrintConfig.cpp:590 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -5073,11 +9568,11 @@ msgstr "" "відносно першого. Він очікує позитивних координат (вони будуть віднімані від " "координати XY)." -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:599 msgid "Extrusion axis" msgstr "Ось екструзії" -#: src/libslic3r/PrintConfig.cpp:507 +#: src/libslic3r/PrintConfig.cpp:600 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." @@ -5085,11 +9580,11 @@ msgstr "" "Використовуйте цю опцію, щоб встановити букву осей, пов'язану з екструдером " "принтера (зазвичай E, але деякі принтери використовують A)." -#: src/libslic3r/PrintConfig.cpp:512 +#: src/libslic3r/PrintConfig.cpp:605 msgid "Extrusion multiplier" msgstr "Коефіцієнт екструзії" -#: src/libslic3r/PrintConfig.cpp:513 +#: src/libslic3r/PrintConfig.cpp:606 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -5099,14 +9594,14 @@ msgstr "" "Цей фактор пропорційно змінює величину потоку. Вам може знадобитися " "налаштувати цей параметр, щоб отримати хорошу обробку поверхні та правильно " "визначити ширину однієї стіни. Звичайні значення - від 0,9 до 1,1. Якщо ви " -"вважаєте, що його потрібно більше змінити, перевірте діаметр нитки та E " +"вважаєте, що його потрібно більше змінити, перевірте діаметр філаменту та E " "кроки прошивки ." -#: src/libslic3r/PrintConfig.cpp:521 +#: src/libslic3r/PrintConfig.cpp:615 msgid "Default extrusion width" msgstr "Ширина екструзії за замовчанням" -#: src/libslic3r/PrintConfig.cpp:523 +#: src/libslic3r/PrintConfig.cpp:617 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -5120,15 +9615,11 @@ msgstr "" "наповнювача тощо). Якщо значення виражене у відсотках (наприклад: 230%), " "воно буде обчислюватися за висотою шару." -#: src/libslic3r/PrintConfig.cpp:527 -msgid "mm or % (leave 0 for auto)" -msgstr "мм або % (залиште 0 для автообчислення)" - -#: src/libslic3r/PrintConfig.cpp:532 +#: src/libslic3r/PrintConfig.cpp:628 msgid "Keep fan always on" msgstr "Тримайте вентилятор завжди" -#: src/libslic3r/PrintConfig.cpp:533 +#: src/libslic3r/PrintConfig.cpp:629 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." @@ -5137,11 +9628,11 @@ msgstr "" "триматися, як мінімум, на мінімальній швидкості. Корисно для PLA, шкідливо " "для ABS." -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:634 msgid "Enable fan if layer print time is below" msgstr "Увімкнути вентилятор, якщо час друку шару нижче" -#: src/libslic3r/PrintConfig.cpp:539 +#: src/libslic3r/PrintConfig.cpp:635 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " @@ -5151,27 +9642,27 @@ msgstr "" "активований, а його швидкість буде розрахована шляхом інтерполяції " "мінімальної та максимальної швидкості." -#: src/libslic3r/PrintConfig.cpp:541 src/libslic3r/PrintConfig.cpp:1637 +#: src/libslic3r/PrintConfig.cpp:637 src/libslic3r/PrintConfig.cpp:1908 msgid "approximate seconds" msgstr "приблизні секунди" -#: src/libslic3r/PrintConfig.cpp:549 +#: src/libslic3r/PrintConfig.cpp:644 msgid "Color" msgstr "Колір" -#: src/libslic3r/PrintConfig.cpp:555 +#: src/libslic3r/PrintConfig.cpp:650 msgid "Filament notes" msgstr "Примітки до філаменту" -#: src/libslic3r/PrintConfig.cpp:556 +#: src/libslic3r/PrintConfig.cpp:651 msgid "You can put your notes regarding the filament here." msgstr "Тут ви можете помістити свої нотатки щодо філаменту." -#: src/libslic3r/PrintConfig.cpp:564 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:659 src/libslic3r/PrintConfig.cpp:1455 msgid "Max volumetric speed" msgstr "Максимальна об'ємна швидкість" -#: src/libslic3r/PrintConfig.cpp:565 +#: src/libslic3r/PrintConfig.cpp:660 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -5181,79 +9672,86 @@ msgstr "" "максимальну об'ємну швидкість друку до мінімуму об'ємної швидкості друку та " "філаметну. Встановити 0 для відсутності обмежень." -#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:1184 -msgid "mm³/s" -msgstr "мм³/с" - -#: src/libslic3r/PrintConfig.cpp:574 +#: src/libslic3r/PrintConfig.cpp:669 msgid "Loading speed" -msgstr "" +msgstr "Швидкість заведення" -#: src/libslic3r/PrintConfig.cpp:575 -msgid "Speed used for loading the filament on the wipe tower. " +#: src/libslic3r/PrintConfig.cpp:670 +msgid "Speed used for loading the filament on the wipe tower." msgstr "" +"Швидкість, що використовується для заведення філаменту на вежі витирання." -#: src/libslic3r/PrintConfig.cpp:582 +#: src/libslic3r/PrintConfig.cpp:677 msgid "Loading speed at the start" -msgstr "" +msgstr "Швидкість заведення на старті" -#: src/libslic3r/PrintConfig.cpp:583 -msgid "Speed used at the very beginning of loading phase. " -msgstr "" +#: src/libslic3r/PrintConfig.cpp:678 +msgid "Speed used at the very beginning of loading phase." +msgstr "Швидкість, що використовується на самому початку фази заведення." -#: src/libslic3r/PrintConfig.cpp:590 +#: src/libslic3r/PrintConfig.cpp:685 msgid "Unloading speed" -msgstr "" +msgstr "Швидкість виведення" -#: src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:686 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " -"initial part of unloading just after ramming). " +"initial part of unloading just after ramming)." msgstr "" +"Швидкість, яка використовується для виведення філаменту на вежі витирання " +"(не впливає на початкову частину виведення безпосередньо після раммінгу)." -#: src/libslic3r/PrintConfig.cpp:599 +#: src/libslic3r/PrintConfig.cpp:694 msgid "Unloading speed at the start" -msgstr "" +msgstr "Швидкість виведення на старті" -#: src/libslic3r/PrintConfig.cpp:600 +#: src/libslic3r/PrintConfig.cpp:695 msgid "" -"Speed used for unloading the tip of the filament immediately after ramming. " +"Speed used for unloading the tip of the filament immediately after ramming." msgstr "" +"Швидкість, яка використовується для виведення кінчику філаменту " +"безпосередньо після раммінгу." -#: src/libslic3r/PrintConfig.cpp:607 +#: src/libslic3r/PrintConfig.cpp:702 msgid "Delay after unloading" -msgstr "" +msgstr "Затримка після виведення" -#: src/libslic3r/PrintConfig.cpp:608 +#: src/libslic3r/PrintConfig.cpp:703 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " -"original dimensions. " +"original dimensions." msgstr "" +"Час очікування після виведення філаменту. Може допомогти отримати надійну " +"заміну інструменту для гнучких матеріалів, яким може знадобитися більше " +"часу, щоб зменшитись до початкових розмірів." -#: src/libslic3r/PrintConfig.cpp:617 +#: src/libslic3r/PrintConfig.cpp:712 msgid "Number of cooling moves" -msgstr "" +msgstr "Кількість охолоджуючих рухів" -#: src/libslic3r/PrintConfig.cpp:618 +#: src/libslic3r/PrintConfig.cpp:713 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " -"Specify desired number of these moves " +"Specify desired number of these moves." msgstr "" +"Філамент охолоджується шляхом переміщення вперед-назад у охолоджувальних " +"трубках. Вкажіть бажану кількість цих рухів." -#: src/libslic3r/PrintConfig.cpp:626 +#: src/libslic3r/PrintConfig.cpp:721 msgid "Speed of the first cooling move" -msgstr "" +msgstr "Швидкість першого охолоджуючого руху" -#: src/libslic3r/PrintConfig.cpp:627 -msgid "Cooling moves are gradually accelerating beginning at this speed. " +#: src/libslic3r/PrintConfig.cpp:722 +msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" +"Охолоджувальні рухи поступово прискорюються, починаючи з цієї швидкості." -#: src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:729 msgid "Minimal purge on wipe tower" -msgstr "" +msgstr "Мінімальний екструдований об'єм на очисній вежі" -#: src/libslic3r/PrintConfig.cpp:635 +#: src/libslic3r/PrintConfig.cpp:730 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -5261,66 +9759,80 @@ msgid "" "object, Slic3r will always prime this amount of material into the wipe tower " "to produce successive infill or sacrificial object extrusions reliably." msgstr "" +"Після зміни інструменту точне положення знову заведеного філаменту всередину " +"сопла може бути невідоме, а тиск філаменту, скоріше за все, ще не " +"стабільний. Перш ніж прочищати друкувальну головку до заповнення або " +"очищувальної вежі, Slic3r завжди продавлює цю кількість матеріалу до " +"очищувальної вежі, щоб отримати послідовне заповнення." -#: src/libslic3r/PrintConfig.cpp:639 +#: src/libslic3r/PrintConfig.cpp:734 msgid "mm³" -msgstr "" +msgstr "мм³" -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:740 msgid "Speed of the last cooling move" -msgstr "" +msgstr "Швидкість останнього охолоджуючого руху" -#: src/libslic3r/PrintConfig.cpp:646 -msgid "Cooling moves are gradually accelerating towards this speed. " -msgstr "" +#: src/libslic3r/PrintConfig.cpp:741 +msgid "Cooling moves are gradually accelerating towards this speed." +msgstr "Охолоджувальні рухи поступово прискорюються до цієї швидкості." -#: src/libslic3r/PrintConfig.cpp:653 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Filament load time" -msgstr "" +msgstr "Час заведення філаменту" -#: src/libslic3r/PrintConfig.cpp:654 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" +"Час для прошивки принтера (або Multi Material Unit 2.0), щоб завести новий " +"філамент під час заміни інструменту (під час виконання коду Т). Цей час " +"додається до загального часу друку за допомогою оцінювача часу G-коду." -#: src/libslic3r/PrintConfig.cpp:661 +#: src/libslic3r/PrintConfig.cpp:756 msgid "Ramming parameters" -msgstr "" +msgstr "Параметри раммінгу" -#: src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:757 msgid "" "This string is edited by RammingDialog and contains ramming specific " -"parameters " +"parameters." msgstr "" +"Цей рядок відредаговано у діалогу налаштувань раммінгу та містить певні " +"параметри раммінгу." -#: src/libslic3r/PrintConfig.cpp:668 +#: src/libslic3r/PrintConfig.cpp:763 msgid "Filament unload time" -msgstr "" +msgstr "Час виведення філаменту" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:764 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" +"Час для прошивки принтера (або Multi Material Unit 2.0), щоб вивести " +"філамент під час заміни інструменту (під час виконання коду Т). Цей час " +"додається до загального часу друку за допомогою оцінювача часу G-коду." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:772 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " "average." msgstr "" "Введіть тут діаметр свого філаменту. Необхідна висока точність, тому " -"використовуйте суматор і виконайте декілька вимірювань вздовж нитки, потім " -"обчисліть середнє значення." +"використовуйте суматор і виконайте декілька вимірювань вздовж філаменту, " +"потім обчисліть середнє значення." -#: src/libslic3r/PrintConfig.cpp:684 +#: src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:2731 +#: src/libslic3r/PrintConfig.cpp:2732 msgid "Density" msgstr "Щільність" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:780 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -5328,31 +9840,31 @@ msgid "" "displacement." msgstr "" "Введіть тут щільність свого філаменту. Це тільки для статистичної " -"інформації. Пристойним способом є зважування відомої довжини нитки та " +"інформації. Пристойним способом є зважування відомої довжини філаменту та " "обчислення співвідношення довжини до обсягу. Краще обчислити об'єм " "безпосередньо через зміщення." -#: src/libslic3r/PrintConfig.cpp:688 +#: src/libslic3r/PrintConfig.cpp:783 msgid "g/cm³" msgstr "г/см³" -#: src/libslic3r/PrintConfig.cpp:693 +#: src/libslic3r/PrintConfig.cpp:788 msgid "Filament type" msgstr "Тип філаменту" -#: src/libslic3r/PrintConfig.cpp:694 +#: src/libslic3r/PrintConfig.cpp:789 msgid "The filament material type for use in custom G-codes." -msgstr "" +msgstr "Тип матеріалу філаменту для використання в користувацьких G-кодах." -#: src/libslic3r/PrintConfig.cpp:710 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Soluble material" msgstr "Розчинний матеріал" -#: src/libslic3r/PrintConfig.cpp:711 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Soluble material is most likely used for a soluble support." msgstr "Розчинний матеріал переважно використовується для розчинної підтримки." -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:823 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." @@ -5360,15 +9872,39 @@ msgstr "" "Введіть тут свою вартість філаменту на кг. Це тільки для статистичної " "інформації." -#: src/libslic3r/PrintConfig.cpp:718 +#: src/libslic3r/PrintConfig.cpp:824 msgid "money/kg" msgstr "грошових одиниць/кг" -#: src/libslic3r/PrintConfig.cpp:727 +#: src/libslic3r/PrintConfig.cpp:829 +msgid "Spool weight" +msgstr "Вага котушки" + +#: src/libslic3r/PrintConfig.cpp:830 +msgid "" +"Enter weight of the empty filament spool. One may weigh a partially consumed " +"filament spool before printing and one may compare the measured weight with " +"the calculated weight of the filament with the spool to find out whether the " +"amount of filament on the spool is sufficient to finish the print." +msgstr "" +"Введіть вагу порожньої котушки філаменту. Перед друком можна зважити " +"частково витрачену котушку філаменту, а можна порівняти виміряну вагу з " +"розрахунковою вагою філаменту з котушкою, щоб з’ясувати, чи достатньо " +"кількості філаменту на котушці для закінчення друку." + +#: src/libslic3r/PrintConfig.cpp:834 +msgid "g" +msgstr "г" + +#: src/libslic3r/PrintConfig.cpp:843 src/libslic3r/PrintConfig.cpp:2815 +msgid "(Unknown)" +msgstr "(Невідомий)" + +#: src/libslic3r/PrintConfig.cpp:847 msgid "Fill angle" msgstr "Кут наповнення" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:849 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " @@ -5378,60 +9914,68 @@ msgstr "" "застосовуватися крос-штрих. Мости будуть заповнені, використовуючи найкращий " "напрям, який може виявити Slic3r, тому цей параметр на них не впливає." -#: src/libslic3r/PrintConfig.cpp:741 +#: src/libslic3r/PrintConfig.cpp:861 msgid "Fill density" msgstr "Щільність заповнення" -#: src/libslic3r/PrintConfig.cpp:743 +#: src/libslic3r/PrintConfig.cpp:863 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "Щільність внутрішнього заповнення, виражена в діапазоні 0% - 100%." -#: src/libslic3r/PrintConfig.cpp:778 +#: src/libslic3r/PrintConfig.cpp:898 msgid "Fill pattern" msgstr "Шаблон заповнення" -#: src/libslic3r/PrintConfig.cpp:780 +#: src/libslic3r/PrintConfig.cpp:900 msgid "Fill pattern for general low-density infill." msgstr "Шаблон заповнення для загального низько-швидкісного наповнення." -#: src/libslic3r/PrintConfig.cpp:796 +#: src/libslic3r/PrintConfig.cpp:920 msgid "Grid" -msgstr "" +msgstr "Сітка" -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:921 msgid "Triangles" -msgstr "" +msgstr "Трикутники" -#: src/libslic3r/PrintConfig.cpp:798 +#: src/libslic3r/PrintConfig.cpp:922 msgid "Stars" -msgstr "" +msgstr "Зірки" -#: src/libslic3r/PrintConfig.cpp:799 +#: src/libslic3r/PrintConfig.cpp:923 msgid "Cubic" -msgstr "" +msgstr "Кубічний" -#: src/libslic3r/PrintConfig.cpp:800 +#: src/libslic3r/PrintConfig.cpp:924 msgid "Line" -msgstr "" +msgstr "Лінії" -#: src/libslic3r/PrintConfig.cpp:802 src/libslic3r/PrintConfig.cpp:1923 +#: src/libslic3r/PrintConfig.cpp:926 src/libslic3r/PrintConfig.cpp:2238 msgid "Honeycomb" -msgstr "" +msgstr "Стільниковий" -#: src/libslic3r/PrintConfig.cpp:803 +#: src/libslic3r/PrintConfig.cpp:927 msgid "3D Honeycomb" -msgstr "" +msgstr "3D стільник" -#: src/libslic3r/PrintConfig.cpp:804 +#: src/libslic3r/PrintConfig.cpp:928 msgid "Gyroid" -msgstr "" +msgstr "Гіроїд" -#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:820 -#: src/libslic3r/PrintConfig.cpp:828 src/libslic3r/PrintConfig.cpp:861 +#: src/libslic3r/PrintConfig.cpp:932 +msgid "Adaptive Cubic" +msgstr "Адаптивний кубічний" + +#: src/libslic3r/PrintConfig.cpp:933 +msgid "Support Cubic" +msgstr "Кубічна підтримка" + +#: src/libslic3r/PrintConfig.cpp:937 src/libslic3r/PrintConfig.cpp:946 +#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:990 msgid "First layer" msgstr "Перший шар" -#: src/libslic3r/PrintConfig.cpp:812 +#: src/libslic3r/PrintConfig.cpp:938 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." @@ -5439,7 +9983,11 @@ msgstr "" "Це прискорення, яке ваш принтер використовуватиме для першого шару. " "Встановити 0, щоб вимкнути керування прискоренням для першого шару." -#: src/libslic3r/PrintConfig.cpp:821 +#: src/libslic3r/PrintConfig.cpp:947 +msgid "First layer bed temperature" +msgstr "Температура столу на першому шарі" + +#: src/libslic3r/PrintConfig.cpp:948 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." @@ -5447,7 +9995,7 @@ msgstr "" "Температура підігрітої збірної пластини для першого шару. Установіть 0, щоб " "відключити команди керування температурою полотна на виході." -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:958 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -5460,11 +10008,7 @@ msgstr "" "(наприклад, 120%), вона буде обчислена за висотою першого шару. Якщо " "встановлено на 0 - використовуватиме стандартну ширину екструзії." -#: src/libslic3r/PrintConfig.cpp:840 -msgid "First layer height" -msgstr "Висота першого шару" - -#: src/libslic3r/PrintConfig.cpp:842 +#: src/libslic3r/PrintConfig.cpp:971 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " @@ -5476,16 +10020,11 @@ msgstr "" "до невідповідних збірних пластин. Можна виразити як абсолютне значення або " "як відсоток (наприклад: 150%) по висоті шару за замовчуванням." -#: src/libslic3r/PrintConfig.cpp:846 src/libslic3r/PrintConfig.cpp:991 -#: src/libslic3r/PrintConfig.cpp:1796 -msgid "mm or %" -msgstr "мм або %" - -#: src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:980 msgid "First layer speed" msgstr "Швидкість першого шару" -#: src/libslic3r/PrintConfig.cpp:852 +#: src/libslic3r/PrintConfig.cpp:981 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " @@ -5496,17 +10035,39 @@ msgstr "" "вона виражена у відсотках (наприклад: 40%), вона буде масштабувати швидкість " "за замовчуванням." -#: src/libslic3r/PrintConfig.cpp:862 +#: src/libslic3r/PrintConfig.cpp:991 +msgid "First layer nozzle temperature" +msgstr "Температура сопла на першому шарі" + +#: src/libslic3r/PrintConfig.cpp:992 msgid "" -"Extruder temperature for first layer. If you want to control temperature " +"Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " -"commands in the output file." +"commands in the output G-code." +msgstr "" +"Температура сопла для першого шару. Якщо ви хочете контролювати температуру " +"вручну під час друку, встановіть її на нуль, щоб вимкнути команди контролю " +"температури у вихідному G-коді." + +#: src/libslic3r/PrintConfig.cpp:1000 +msgid "Full fan speed at layer" +msgstr "Повна швидкість вентилятора на шарі" + +#: src/libslic3r/PrintConfig.cpp:1001 +msgid "" +"Fan speed will be ramped up linearly from zero at layer " +"\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " +"\"full_fan_speed_layer\" will be ignored if lower than " +"\"disable_fan_first_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"disable_fan_first_layers\" + 1." msgstr "" -"Температура екструдеру для першого шару. Якщо ви хочете контролювати " -"температуру вручну під час друку, встановіть 0, щоб вимкнути команди " -"керування температурою у вихідному файлі." +"Швидкість вентилятора буде збільшена лінійно з нуля на шарі " +"\"disable_fan_first_layers\" до максимальної на шарі \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" буде проігноровано, якщо нижче " +"\"disable_fan_first_layers\", і в цьому випадку вентилятор буде працювати з " +"максимально дозволеною швидкістю на рівні \"disable_fan_first_layers\" + 1." -#: src/libslic3r/PrintConfig.cpp:871 +#: src/libslic3r/PrintConfig.cpp:1013 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " @@ -5517,11 +10078,11 @@ msgstr "" "надмірних потрясінь та резонансних проблем. Встановити 0, щоб вимкнути " "заповнення розривів." -#: src/libslic3r/PrintConfig.cpp:879 +#: src/libslic3r/PrintConfig.cpp:1021 msgid "Verbose G-code" msgstr "Докладний G-код" -#: src/libslic3r/PrintConfig.cpp:880 +#: src/libslic3r/PrintConfig.cpp:1022 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " @@ -5531,38 +10092,57 @@ msgstr "" "пояснюється описовим текстом. Якщо ви друкуєте з SD-карти, додаткова вага " "файлу може призвести до уповільнення прошивки." -#: src/libslic3r/PrintConfig.cpp:887 +#: src/libslic3r/PrintConfig.cpp:1029 msgid "G-code flavor" msgstr "Особливість G-коду" -#: src/libslic3r/PrintConfig.cpp:888 +#: src/libslic3r/PrintConfig.cpp:1030 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " -"output. The \"No extrusion\" flavor prevents Slic3r from exporting any " +"output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any " "extrusion value at all." msgstr "" -"Деякі команди G/M-коду, включаючи контроль температури тощо, не є " -"універсальними. Установіть цей параметр на прошивку принтера, щоб отримати " -"сумісний вихід. \"Відсутність екструзії\" не дозволяє Slic3r експортувати " -"будь-яке значення екструзії." +"Деякі команди G/M-коду, включаючи контроль температури та інші, не є " +"універсальними. Встановіть для цього параметра мікропрограму принтера, щоб " +"отримати сумісний вихід. Наявність вибору \"Без екструзії\" захищаюсь " +"PrusaSlicer від експорту взагалі будь-яких екструзійних значень." -#: src/libslic3r/PrintConfig.cpp:911 +#: src/libslic3r/PrintConfig.cpp:1055 msgid "No extrusion" +msgstr "Без екструзії" + +#: src/libslic3r/PrintConfig.cpp:1060 +msgid "Label objects" +msgstr "Маркувати об'єкти" + +#: src/libslic3r/PrintConfig.cpp:1061 +msgid "" +"Enable this to add comments into the G-Code labeling print moves with what " +"object they belong to, which is useful for the Octoprint CancelObject " +"plugin. This settings is NOT compatible with Single Extruder Multi Material " +"setup and Wipe into Object / Wipe into Infill." msgstr "" +"Увімкніть це, щоб додати коментарі до ходів друку міток G-Code із об’єктом, " +"до якого вони належать, що корисно для плагіна Octoprint CancelObject. Ці " +"налаштування НЕ сумісні з параметрами \"Мульти-матеріальний (ММ) друк з " +"одним екструдером\" та \"Витирати в об'єкт\" / \"Витирати в заповнення\"." -#: src/libslic3r/PrintConfig.cpp:924 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "High extruder current on filament swap" -msgstr "" +msgstr "Звищення струму екструдера на заміні філамента" -#: src/libslic3r/PrintConfig.cpp:925 +#: src/libslic3r/PrintConfig.cpp:1069 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " "overcome resistance when loading a filament with an ugly shaped tip." msgstr "" +"Може бути корисно збільшити струм двигуна екструдера під час заміни " +"філаменту, щоб забезпечити швидкий раммінг та подолати опір при заведенні " +"філаменту з кінчиком потворної форми." -#: src/libslic3r/PrintConfig.cpp:933 +#: src/libslic3r/PrintConfig.cpp:1077 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." @@ -5570,11 +10150,11 @@ msgstr "" "Це прискорення, яке ваш принтер використовуватиме для наповнення. Встановити " "0, щоб вимкнути регулятор прискорення для заповнення." -#: src/libslic3r/PrintConfig.cpp:941 +#: src/libslic3r/PrintConfig.cpp:1085 msgid "Combine infill every" msgstr "Об'єднати наповнення кожні" -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -5582,19 +10162,83 @@ msgstr "" "Ця функція дозволяє поєднувати наповнення та прискорити друк, екструдуючи " "більш товсті шари наповнення, зберігаючи тонкі периметри, а отже, і точністю." -#: src/libslic3r/PrintConfig.cpp:946 +#: src/libslic3r/PrintConfig.cpp:1090 msgid "Combine infill every n layers" msgstr "Об'єднати наповнення кожні n шарів" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1096 +msgid "Length of the infill anchor" +msgstr "Довжина якоря заповнення" + +#: src/libslic3r/PrintConfig.cpp:1098 +msgid "" +"Connect an infill line to an internal perimeter with a short segment of an " +"additional perimeter. If expressed as percentage (example: 15%) it is " +"calculated over infill extrusion width. PrusaSlicer tries to connect two " +"close infill lines to a short perimeter segment. If no such perimeter " +"segment shorter than infill_anchor_max is found, the infill line is " +"connected to a perimeter segment at just one side and the length of the " +"perimeter segment taken is limited to this parameter, but no longer than " +"anchor_length_max. Set this parameter to zero to disable anchoring " +"perimeters connected to a single infill line." +msgstr "" +"З'єднати лінію заповнення з внутрішнім периметром за допомогою короткого " +"відрізку додаткового периметра. Якщо це значення виражається у відсотках " +"(приклад: 15%), воно розраховується за шириною екструзії заповнення. " +"PrusaSlicer намагається з'єднати дві тісні лінії заповнення з коротким " +"периметром. Якщо такого відрізка периметра, коротшого за infill_anchor_max, " +"не знайдено, лінія заповнення з'єднується з відрізком периметра лише з " +"одного боку, і довжина прийнятого відрізка периметра обмежена цим " +"параметром, але не довше anchor_length_max. Встановіть для цього параметра " +"нуль, щоб вимкнути периметри закріплення, підключені до однієї лінії " +"заповнення." + +#: src/libslic3r/PrintConfig.cpp:1113 +msgid "0 (no open anchors)" +msgstr "0 (без відкритих якорів)" + +#: src/libslic3r/PrintConfig.cpp:1118 src/libslic3r/PrintConfig.cpp:1140 +msgid "1000 (unlimited)" +msgstr "1000 (необмежено)" + +#: src/libslic3r/PrintConfig.cpp:1123 +msgid "Maximum length of the infill anchor" +msgstr "Максимальна довжина якоря заповнення" + +#: src/libslic3r/PrintConfig.cpp:1125 +msgid "" +"Connect an infill line to an internal perimeter with a short segment of an " +"additional perimeter. If expressed as percentage (example: 15%) it is " +"calculated over infill extrusion width. PrusaSlicer tries to connect two " +"close infill lines to a short perimeter segment. If no such perimeter " +"segment shorter than this parameter is found, the infill line is connected " +"to a perimeter segment at just one side and the length of the perimeter " +"segment taken is limited to infill_anchor, but no longer than this " +"parameter. Set this parameter to zero to disable anchoring." +msgstr "" +"З'єднати лінію заповнення з внутрішнім периметром за допомогою короткого " +"відрізку додаткового периметра. Якщо це значення виражається у відсотках " +"(приклад: 15%), воно розраховується за шириною екструзії заповнення. " +"PrusaSlicer намагається з'єднати дві найближчі лінії заповнення з коротким " +"периметром. Якщо такого відрізка периметра, коротшого за цей параметр, не " +"знайдено, лінія заповнення з'єднується з відрізком периметра лише з одного " +"боку, і довжина прийнятого відрізка периметра обмежена параметром " +"infill_anchor, але не довше за цей параметр. Встановіть для цього параметра " +"нуль, щоб вимкнути закріплення." + +#: src/libslic3r/PrintConfig.cpp:1135 +msgid "0 (not anchored)" +msgstr "0 (не закріплено)" + +#: src/libslic3r/PrintConfig.cpp:1145 msgid "Infill extruder" msgstr "Наповнювач екструдера" -#: src/libslic3r/PrintConfig.cpp:954 +#: src/libslic3r/PrintConfig.cpp:1147 msgid "The extruder to use when printing infill." msgstr "Екструдер, використовуваний під час друку наповнення." -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -5609,11 +10253,11 @@ msgstr "" "прискорити наповнення та зміцнити свої деталі. Якщо він виражений у " "відсотках (наприклад, 90%), він буде обчислюватися за висотою шару." -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1165 msgid "Infill before perimeters" msgstr "Заповнення перед периметрами" -#: src/libslic3r/PrintConfig.cpp:972 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." @@ -5621,11 +10265,11 @@ msgstr "" "За допомогою цього параметра можна буде змінити порядок друку периметрів та " "наповнювачів, зробивши останнє першим." -#: src/libslic3r/PrintConfig.cpp:977 +#: src/libslic3r/PrintConfig.cpp:1171 msgid "Only infill where needed" msgstr "Заповнити тільки там, де потрібно" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " @@ -5635,11 +10279,11 @@ msgstr "" "стель (це буде діяти як внутрішній матеріал підтримки). Якщо це ввімкнено, " "сповільнюється генерація G-коду через декілька перевірок." -#: src/libslic3r/PrintConfig.cpp:986 +#: src/libslic3r/PrintConfig.cpp:1180 msgid "Infill/perimeters overlap" msgstr "Перекриття наповнення/периметрів" -#: src/libslic3r/PrintConfig.cpp:988 +#: src/libslic3r/PrintConfig.cpp:1182 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -5651,25 +10295,25 @@ msgstr "" "може спричинити розриви. Якщо він виражений у відсотках (приклад: 15%), його " "розраховують за шириною екструзії по периметру." -#: src/libslic3r/PrintConfig.cpp:999 +#: src/libslic3r/PrintConfig.cpp:1193 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" "Швидкість друку внутрішнього заповнення. Встановити 0 для автоматичного " "обчислення." -#: src/libslic3r/PrintConfig.cpp:1007 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Inherits profile" -msgstr "" +msgstr "Успадковує профіль" -#: src/libslic3r/PrintConfig.cpp:1008 +#: src/libslic3r/PrintConfig.cpp:1202 msgid "Name of the profile, from which this profile inherits." -msgstr "" +msgstr "Ім'я профілю, від якого цей профіль успадковується." -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1215 msgid "Interface shells" msgstr "Інтерфейсні оболонки" -#: src/libslic3r/PrintConfig.cpp:1022 +#: src/libslic3r/PrintConfig.cpp:1216 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -5679,7 +10323,50 @@ msgstr "" "Корисно для друку з багатьма екструдерами з напівпрозорими матеріалами або " "ручним розчинним матеріалом для підтримки." -#: src/libslic3r/PrintConfig.cpp:1031 +#: src/libslic3r/PrintConfig.cpp:1224 +msgid "Enable ironing" +msgstr "Увімкнути прасування" + +#: src/libslic3r/PrintConfig.cpp:1225 +msgid "" +"Enable ironing of the top layers with the hot print head for smooth surface" +msgstr "" +"Для гладкої поверхні увімкніть прасування верхніх шарів гарячою друкуючою " +"головкою" + +#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1233 +msgid "Ironing Type" +msgstr "Тип прасування" + +#: src/libslic3r/PrintConfig.cpp:1238 +msgid "All top surfaces" +msgstr "Всі верхні поверхні" + +#: src/libslic3r/PrintConfig.cpp:1239 +msgid "Topmost surface only" +msgstr "Тільки верхня поверхня" + +#: src/libslic3r/PrintConfig.cpp:1240 +msgid "All solid surfaces" +msgstr "Всі тверді поверхні" + +#: src/libslic3r/PrintConfig.cpp:1245 +msgid "Flow rate" +msgstr "Швидкість потоку" + +#: src/libslic3r/PrintConfig.cpp:1247 +msgid "Percent of a flow rate relative to object's normal layer height." +msgstr "Відсоток швидкість потоку відносно нормальної висоти шару об'єкта." + +#: src/libslic3r/PrintConfig.cpp:1255 +msgid "Spacing between ironing passes" +msgstr "Відстань між лініями прасування" + +#: src/libslic3r/PrintConfig.cpp:1257 +msgid "Distance between ironing lines" +msgstr "Відстань між прасувальними лініями" + +#: src/libslic3r/PrintConfig.cpp:1274 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -5688,79 +10375,194 @@ msgid "" msgstr "" "Цей користувацький код вставляється при кожній зміні шару відразу після " "переміщення Z і перед тим, як екструдер переміститься до точки першого шару. " -"Зауважте, що ви можете використовувати змінні-заповнювачі для всіх " -"параметрів Slic3r, а також [layer_num] і [layer_z]." +"Зауважте, що ви можете використовувати шаблонні змінні для всіх параметрів " +"Slic3r, а також [layer_num] і [layer_z]." -#: src/libslic3r/PrintConfig.cpp:1042 +#: src/libslic3r/PrintConfig.cpp:1285 msgid "Supports remaining times" -msgstr "" +msgstr "Підтримує час, що залишився" -#: src/libslic3r/PrintConfig.cpp:1043 +#: src/libslic3r/PrintConfig.cpp:1286 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " "As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 " "firmware supports M73 Qxx Sxx for the silent mode." msgstr "" +"Публікувати M73 P[відсоток друку] R[час, що залишився у хвилинах] з " +"інтервалом у 1 хвилину в G-код, щоб прошивка показувала точний час, що " +"залишився. На сьогоднішній день лише прошивка Prusa i3 MK3 розпізнає M73. " +"Також прошивка i3 MK3 підтримує M73 Qxx Sxx для тихого режиму." -#: src/libslic3r/PrintConfig.cpp:1051 -msgid "Supports silent mode" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1294 +msgid "Supports stealth mode" +msgstr "Підтримує тихий режим" -#: src/libslic3r/PrintConfig.cpp:1052 -msgid "Set silent mode for the G-code flavor" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1295 +msgid "The firmware supports stealth mode" +msgstr "Прошивка підтримує тихий режим" -#: src/libslic3r/PrintConfig.cpp:1075 -msgid "Maximum feedrate %1%" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1300 +msgid "How to apply limits" +msgstr "Як застосовувати обмеження" -#: src/libslic3r/PrintConfig.cpp:1077 -msgid "Maximum feedrate of the %1% axis" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1301 +msgid "Purpose of Machine Limits" +msgstr "Призначення механічних обмежень" -#: src/libslic3r/PrintConfig.cpp:1085 -msgid "Maximum acceleration %1%" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1303 +msgid "How to apply the Machine Limits" +msgstr "Призначення механічних обмежень" -#: src/libslic3r/PrintConfig.cpp:1087 -msgid "Maximum acceleration of the %1% axis" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1308 +msgid "Emit to G-code" +msgstr "Публікувати в G-код" -#: src/libslic3r/PrintConfig.cpp:1095 -msgid "Maximum jerk %1%" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1309 +msgid "Use for time estimate" +msgstr "Для оцінки часу" -#: src/libslic3r/PrintConfig.cpp:1097 -msgid "Maximum jerk of the %1% axis" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1310 +msgid "Ignore" +msgstr "Ігнорувати" + +#: src/libslic3r/PrintConfig.cpp:1333 +msgid "Maximum feedrate X" +msgstr "Максимальна швидкість подачі за X" + +#: src/libslic3r/PrintConfig.cpp:1334 +msgid "Maximum feedrate Y" +msgstr "Максимальна швидкість подачі за Y" -#: src/libslic3r/PrintConfig.cpp:1108 src/libslic3r/PrintConfig.cpp:1110 +#: src/libslic3r/PrintConfig.cpp:1335 +msgid "Maximum feedrate Z" +msgstr "Максимальна швидкість подачі за Y" + +#: src/libslic3r/PrintConfig.cpp:1336 +msgid "Maximum feedrate E" +msgstr "Максимальна швидкість подачі за Е" + +#: src/libslic3r/PrintConfig.cpp:1339 +msgid "Maximum feedrate of the X axis" +msgstr "Максимальна швидкість подачі за віссю X" + +#: src/libslic3r/PrintConfig.cpp:1340 +msgid "Maximum feedrate of the Y axis" +msgstr "Максимальна швидкість подачі за віссю Y" + +#: src/libslic3r/PrintConfig.cpp:1341 +msgid "Maximum feedrate of the Z axis" +msgstr "Максимальна швидкість подачі за віссю Z" + +#: src/libslic3r/PrintConfig.cpp:1342 +msgid "Maximum feedrate of the E axis" +msgstr "Максимальна швидкість подачі за віссю Е" + +#: src/libslic3r/PrintConfig.cpp:1350 +msgid "Maximum acceleration X" +msgstr "Максимальне прискорення X" + +#: src/libslic3r/PrintConfig.cpp:1351 +msgid "Maximum acceleration Y" +msgstr "Максимальне прискорення Y" + +#: src/libslic3r/PrintConfig.cpp:1352 +msgid "Maximum acceleration Z" +msgstr "Максимальне прискорення Z" + +#: src/libslic3r/PrintConfig.cpp:1353 +msgid "Maximum acceleration E" +msgstr "Максимальне прискорення E" + +#: src/libslic3r/PrintConfig.cpp:1356 +msgid "Maximum acceleration of the X axis" +msgstr "Максимальне прискорення за віссю X" + +#: src/libslic3r/PrintConfig.cpp:1357 +msgid "Maximum acceleration of the Y axis" +msgstr "Максимальне прискорення за віссю Y" + +#: src/libslic3r/PrintConfig.cpp:1358 +msgid "Maximum acceleration of the Z axis" +msgstr "Максимальне прискорення за віссю Z" + +#: src/libslic3r/PrintConfig.cpp:1359 +msgid "Maximum acceleration of the E axis" +msgstr "Максимальне прискорення за віссю E" + +#: src/libslic3r/PrintConfig.cpp:1367 +msgid "Maximum jerk X" +msgstr "Максимальний ривок за X" + +#: src/libslic3r/PrintConfig.cpp:1368 +msgid "Maximum jerk Y" +msgstr "Максимальний ривок за Y" + +#: src/libslic3r/PrintConfig.cpp:1369 +msgid "Maximum jerk Z" +msgstr "Максимальний ривок за Z" + +#: src/libslic3r/PrintConfig.cpp:1370 +msgid "Maximum jerk E" +msgstr "Максимальний ривок за E" + +#: src/libslic3r/PrintConfig.cpp:1373 +msgid "Maximum jerk of the X axis" +msgstr "Максимальний ривок за віссю X" + +#: src/libslic3r/PrintConfig.cpp:1374 +msgid "Maximum jerk of the Y axis" +msgstr "Максимальний ривок за віссю Y" + +#: src/libslic3r/PrintConfig.cpp:1375 +msgid "Maximum jerk of the Z axis" +msgstr "Максимальний ривок за віссю Z" + +#: src/libslic3r/PrintConfig.cpp:1376 +msgid "Maximum jerk of the E axis" +msgstr "Максимальний ривок за віссю E" + +#: src/libslic3r/PrintConfig.cpp:1386 msgid "Minimum feedrate when extruding" -msgstr "" +msgstr "Мінімальне прискорення при екструзії" + +#: src/libslic3r/PrintConfig.cpp:1388 +msgid "Minimum feedrate when extruding (M205 S)" +msgstr "Мінімальне прискорення при екструзії (M205 S)" -#: src/libslic3r/PrintConfig.cpp:1119 src/libslic3r/PrintConfig.cpp:1121 +#: src/libslic3r/PrintConfig.cpp:1396 msgid "Minimum travel feedrate" -msgstr "" +msgstr "Мінімальна швидкість подачі" -#: src/libslic3r/PrintConfig.cpp:1130 src/libslic3r/PrintConfig.cpp:1132 +#: src/libslic3r/PrintConfig.cpp:1398 +msgid "Minimum travel feedrate (M205 T)" +msgstr "Мінімальна швидкість подачі (M205 T)" + +#: src/libslic3r/PrintConfig.cpp:1406 msgid "Maximum acceleration when extruding" -msgstr "" +msgstr "Максимальне прискорення при екструзії" -#: src/libslic3r/PrintConfig.cpp:1141 src/libslic3r/PrintConfig.cpp:1143 +#: src/libslic3r/PrintConfig.cpp:1408 +msgid "Maximum acceleration when extruding (M204 S)" +msgstr "Максимальне прискорення при екструзії (M204 S)" + +#: src/libslic3r/PrintConfig.cpp:1416 msgid "Maximum acceleration when retracting" -msgstr "" +msgstr "Максимальне прискорення при втягуванні" + +#: src/libslic3r/PrintConfig.cpp:1418 +msgid "Maximum acceleration when retracting (M204 T)" +msgstr "Максимальне прискорення при втягуванні (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1151 src/libslic3r/PrintConfig.cpp:1160 +#: src/libslic3r/PrintConfig.cpp:1425 src/libslic3r/PrintConfig.cpp:1434 msgid "Max" msgstr "Максимально" -#: src/libslic3r/PrintConfig.cpp:1152 +#: src/libslic3r/PrintConfig.cpp:1426 msgid "This setting represents the maximum speed of your fan." msgstr "Цей параметр відображає максимальну швидкість вашого вентилятора." -#: src/libslic3r/PrintConfig.cpp:1161 -#, no-c-format +#: src/libslic3r/PrintConfig.cpp:1435 msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -5773,11 +10575,11 @@ msgstr "" "для досягнення розумної міжшарової адгезії. Якщо встановлено 0, висота шару " "обмежена 75% діаметра сопла." -#: src/libslic3r/PrintConfig.cpp:1171 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "Max print speed" msgstr "Максимальна швидкість друку" -#: src/libslic3r/PrintConfig.cpp:1172 +#: src/libslic3r/PrintConfig.cpp:1446 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -5788,7 +10590,7 @@ msgstr "" "екструдера. Цей експериментальний параметр використовується для встановлення " "максимальної швидкості друку, яку ви хочете дозволити." -#: src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:1456 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." @@ -5796,11 +10598,11 @@ msgstr "" "Цей експериментальний параметр використовується для встановлення " "максимальної об'ємної швидкості, яку підтримує екструдер." -#: src/libslic3r/PrintConfig.cpp:1191 +#: src/libslic3r/PrintConfig.cpp:1465 msgid "Max volumetric slope positive" msgstr "Максимальний об'ємний нахил позитивний" -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1203 +#: src/libslic3r/PrintConfig.cpp:1466 src/libslic3r/PrintConfig.cpp:1477 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " @@ -5813,25 +10615,25 @@ msgstr "" "швидкість подачі 20 мм/с) до 5,4 мм³/с (подача 60 мм/с) займе принаймні 2 " "секунди." -#: src/libslic3r/PrintConfig.cpp:1196 src/libslic3r/PrintConfig.cpp:1207 +#: src/libslic3r/PrintConfig.cpp:1470 src/libslic3r/PrintConfig.cpp:1481 msgid "mm³/s²" msgstr "мм³/с²" -#: src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1476 msgid "Max volumetric slope negative" msgstr "Максимальний об'ємний схил негативний" -#: src/libslic3r/PrintConfig.cpp:1214 src/libslic3r/PrintConfig.cpp:1223 +#: src/libslic3r/PrintConfig.cpp:1488 src/libslic3r/PrintConfig.cpp:1497 msgid "Min" msgstr "Мінімально" -#: src/libslic3r/PrintConfig.cpp:1215 +#: src/libslic3r/PrintConfig.cpp:1489 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" "Цей параметр відповідає мінімальній ШІМ, на якій повинен працювати ваш " "вентилятор." -#: src/libslic3r/PrintConfig.cpp:1224 +#: src/libslic3r/PrintConfig.cpp:1498 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " @@ -5841,19 +10643,19 @@ msgstr "" "роздільну здатність для висоти змінного шару. Типові значення - від 0,05 мм " "до 0,1 мм." -#: src/libslic3r/PrintConfig.cpp:1232 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Min print speed" msgstr "Мінімальна швидкість друку" -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1507 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r не буде масштабувати швидкість нижче цієї швидкості." -#: src/libslic3r/PrintConfig.cpp:1240 +#: src/libslic3r/PrintConfig.cpp:1514 msgid "Minimal filament extrusion length" -msgstr "" +msgstr "Мінімальна довжина екструзії філаменту" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1515 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " @@ -5863,11 +10665,11 @@ msgstr "" "зазначеної кількості філаменту на нижньому шарі. Для машин із декількома " "екструдерами цей мінімум застосовується до кожного екструдера." -#: src/libslic3r/PrintConfig.cpp:1250 +#: src/libslic3r/PrintConfig.cpp:1524 msgid "Configuration notes" msgstr "Примітки до конфігурації" -#: src/libslic3r/PrintConfig.cpp:1251 +#: src/libslic3r/PrintConfig.cpp:1525 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." @@ -5875,30 +10677,28 @@ msgstr "" "Ви можете додати тут свої особисті примітки. Цей текст буде додано до " "коментарів заголовка G-коду." -#: src/libslic3r/PrintConfig.cpp:1260 -msgid "Nozzle diameter" -msgstr "Діаметр сопла" - -#: src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1535 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "Це діаметр сопла вашого екструдера (наприклад: 0.5, 0.35 тощо)" -#: src/libslic3r/PrintConfig.cpp:1266 +#: src/libslic3r/PrintConfig.cpp:1540 msgid "Host Type" -msgstr "" +msgstr "Тип хосту" -#: src/libslic3r/PrintConfig.cpp:1267 +#: src/libslic3r/PrintConfig.cpp:1541 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." msgstr "" +"Slic3r може завантажувати файли G-коду на хост принтера. Це поле повинно " +"містити тип хоста." -#: src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "Only retract when crossing perimeters" msgstr "Перервати тільки у разі перетину периметрів" -#: src/libslic3r/PrintConfig.cpp:1279 +#: src/libslic3r/PrintConfig.cpp:1559 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." @@ -5906,7 +10706,7 @@ msgstr "" "Вимикає переривання, коли шлях не перевищує периметри верхніх шарів (і, " "таким чином, будь-який розрядник буде, мабуть, невидимим)." -#: src/libslic3r/PrintConfig.cpp:1286 +#: src/libslic3r/PrintConfig.cpp:1566 msgid "" "This option will drop the temperature of the inactive extruders to prevent " "oozing. It will enable a tall skirt automatically and move extruders outside " @@ -5916,11 +10716,11 @@ msgstr "" "протіканню. Це дозволить автоматично ввімкнути високий плінтус та " "перемістить екструдери за межі такого плінтуса у разі зміни температури." -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1573 msgid "Output filename format" msgstr "Формат вихідного файлу" -#: src/libslic3r/PrintConfig.cpp:1294 +#: src/libslic3r/PrintConfig.cpp:1574 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -5932,11 +10732,11 @@ msgstr "" "можете використовувати [timestamp], [year], [month], [day], [hour], " "[minute], [second], [version], [input_filename] ], [input_filename_base]." -#: src/libslic3r/PrintConfig.cpp:1303 +#: src/libslic3r/PrintConfig.cpp:1583 msgid "Detect bridging perimeters" msgstr "Виявлення висячих периметрів" -#: src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1585 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -5945,56 +10745,59 @@ msgstr "" "використано мостовий потік), щоб застосувати до них швидкість мосту та " "увімкнути вентилятор." -#: src/libslic3r/PrintConfig.cpp:1311 +#: src/libslic3r/PrintConfig.cpp:1591 msgid "Filament parking position" -msgstr "" +msgstr "Позиція паркування філаменту" -#: src/libslic3r/PrintConfig.cpp:1312 +#: src/libslic3r/PrintConfig.cpp:1592 msgid "" "Distance of the extruder tip from the position where the filament is parked " -"when unloaded. This should match the value in printer firmware. " +"when unloaded. This should match the value in printer firmware." msgstr "" +"Відстань наконечника екструдера від місця паркування філаменту при " +"виведенні. Це має відповідати значенню в мікропрограмі принтера." -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Extra loading distance" -msgstr "" +msgstr "Додаткова відстань заведення" -#: src/libslic3r/PrintConfig.cpp:1321 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " "positive, it is loaded further, if negative, the loading move is shorter " -"than unloading. " +"than unloading." msgstr "" +"Якщо встановлено на нуль, відстань, на яку філамент переміщується з " +"положення стоянки під час заведення, є точно такою ж, як і при переміщенні " +"назад під час виведення. Якщо позитивне, воно заводеться далі, якщо " +"негативне, рух заведення коротший, ніж виведення." -#: src/libslic3r/PrintConfig.cpp:1329 src/libslic3r/PrintConfig.cpp:1347 -#: src/libslic3r/PrintConfig.cpp:1359 src/libslic3r/PrintConfig.cpp:1369 +#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1639 src/libslic3r/PrintConfig.cpp:1649 msgid "Perimeters" msgstr "Периметри" -#: src/libslic3r/PrintConfig.cpp:1330 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "" -"This is the acceleration your printer will use for perimeters. A high value " -"like 9000 usually gives good results if your hardware is up to the job. Set " -"zero to disable acceleration control for perimeters." +"This is the acceleration your printer will use for perimeters. Set zero to " +"disable acceleration control for perimeters." msgstr "" -"Це прискорення, яке ваш принтер використовуватиме для периметрів. Висока " -"значення, таке як 9000, зазвичай дає хороші результати, якщо ваше апаратне " -"забезпечення відповідає завданню. Встановити 0, щоб вимкнути регулятор " -"прискорення для периметрів." +"Це прискорення, яке ваш принтер використовуватиме для периметрів. Встановити " +"0, щоб відключити управління прискоренням для периметрів." -#: src/libslic3r/PrintConfig.cpp:1338 +#: src/libslic3r/PrintConfig.cpp:1617 msgid "Perimeter extruder" msgstr "Екструдер периметру" -#: src/libslic3r/PrintConfig.cpp:1340 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" "Екструдер, що використовується при друці периметрів і краю. Перший екструдер " "- 1." -#: src/libslic3r/PrintConfig.cpp:1349 +#: src/libslic3r/PrintConfig.cpp:1628 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -6009,14 +10812,14 @@ msgstr "" "діаметр сопла. Якщо він виражений у відсотках (наприклад, 200%), він буде " "обчислюватися за висотою шару." -#: src/libslic3r/PrintConfig.cpp:1361 +#: src/libslic3r/PrintConfig.cpp:1641 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" "Швидкість для периметрів (контури, вертикальні оболонки). Встановити 0 для " "автоматичного використання." -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1651 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 " @@ -6028,11 +10831,11 @@ msgstr "" "які отримують вигоду від більшої кількості периметрів, якщо опція «Додаткові " "периметри» увімкнена." -#: src/libslic3r/PrintConfig.cpp:1375 +#: src/libslic3r/PrintConfig.cpp:1655 msgid "(minimum)" msgstr "(мінімум)" -#: src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1663 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -6046,45 +10849,47 @@ msgstr "" "аргумент, і вони можуть отримати доступ до параметрів конфігурації Slic3r, " "прочитавши змінні середовища." -#: src/libslic3r/PrintConfig.cpp:1395 +#: src/libslic3r/PrintConfig.cpp:1675 msgid "Printer type" -msgstr "" +msgstr "Тип принтеру" -#: src/libslic3r/PrintConfig.cpp:1396 +#: src/libslic3r/PrintConfig.cpp:1676 msgid "Type of the printer." -msgstr "" +msgstr "Тип принтеру." -#: src/libslic3r/PrintConfig.cpp:1401 +#: src/libslic3r/PrintConfig.cpp:1681 msgid "Printer notes" msgstr "Примітки принтера" -#: src/libslic3r/PrintConfig.cpp:1402 +#: src/libslic3r/PrintConfig.cpp:1682 msgid "You can put your notes regarding the printer here." msgstr "Тут ви можете помістити свої нотатки щодо принтера." -#: src/libslic3r/PrintConfig.cpp:1410 +#: src/libslic3r/PrintConfig.cpp:1690 msgid "Printer vendor" -msgstr "" +msgstr "Виробник принтера" -#: src/libslic3r/PrintConfig.cpp:1411 +#: src/libslic3r/PrintConfig.cpp:1691 msgid "Name of the printer vendor." -msgstr "" +msgstr "Назва виробника принтера." -#: src/libslic3r/PrintConfig.cpp:1416 +#: src/libslic3r/PrintConfig.cpp:1696 msgid "Printer variant" -msgstr "" +msgstr "Варіант принтера" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "" +"Назва варіанту принтера. Наприклад, варіанти принтера можуть відрізнятися за " +"діаметром сопла." -#: src/libslic3r/PrintConfig.cpp:1430 +#: src/libslic3r/PrintConfig.cpp:1714 msgid "Raft layers" msgstr "Плоскі шари" -#: src/libslic3r/PrintConfig.cpp:1432 +#: src/libslic3r/PrintConfig.cpp:1716 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." @@ -6092,11 +10897,11 @@ msgstr "" "Об'єкт буде піднятий цією кількістю шарів, і під ним буде згенерований " "матеріал підтримки." -#: src/libslic3r/PrintConfig.cpp:1440 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Resolution" msgstr "Роздільна здатність" -#: src/libslic3r/PrintConfig.cpp:1441 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -6110,20 +10915,20 @@ msgstr "" "вимкнути будь-яке спрощення та використовувати повну роздільну здатність від " "введення." -#: src/libslic3r/PrintConfig.cpp:1451 +#: src/libslic3r/PrintConfig.cpp:1735 msgid "Minimum travel after retraction" msgstr "Мінімальне переміщення після переривання" -#: src/libslic3r/PrintConfig.cpp:1452 +#: src/libslic3r/PrintConfig.cpp:1736 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "Переривання не спрацьовує, коли переміщення коротше за цю довжину." -#: src/libslic3r/PrintConfig.cpp:1458 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Retract amount before wipe" msgstr "Кількість переривань перед чищенням" -#: src/libslic3r/PrintConfig.cpp:1459 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." @@ -6131,25 +10936,25 @@ msgstr "" "Завдяки екструдерам з бандами, має зміст зробити певну кількість переривань " "перед рухами очищення." -#: src/libslic3r/PrintConfig.cpp:1466 +#: src/libslic3r/PrintConfig.cpp:1750 msgid "Retract on layer change" msgstr "Переривання на зміну шарів" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1751 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" "Цей прапор забезпечує переривання кожного разу, коли виконується переміщення " "Z." -#: src/libslic3r/PrintConfig.cpp:1472 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1764 msgid "Length" msgstr "Довжина" -#: src/libslic3r/PrintConfig.cpp:1473 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Retraction Length" msgstr "Довжина переривання" -#: src/libslic3r/PrintConfig.cpp:1474 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -6159,15 +10964,15 @@ msgstr "" "кількості (довжина вимірюється на сирого філаменту перед тим, як вона " "надходить у екструдер)." -#: src/libslic3r/PrintConfig.cpp:1476 src/libslic3r/PrintConfig.cpp:1485 +#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1769 msgid "mm (zero to disable)" msgstr "мм (0, щоб вимкнути)" -#: src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Retraction Length (Toolchange)" msgstr "Довжина переривання (зміна інструмента)" -#: src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " @@ -6177,11 +10982,11 @@ msgstr "" "назад до вказаної кількості (довжина вимірюється на сирого філаменту перед " "тим, як вона надходить у екструдер)." -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1774 msgid "Lift Z" msgstr "Підняти Z" -#: src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1775 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " @@ -6191,15 +10996,15 @@ msgstr "" "коли спрацьовує переривання. При використанні декількох екструдерів буде " "розглянуто налаштування лише першого екструдера." -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1782 msgid "Above Z" msgstr "Вище Z" -#: src/libslic3r/PrintConfig.cpp:1499 +#: src/libslic3r/PrintConfig.cpp:1783 msgid "Only lift Z above" msgstr "Тільки піднімати Z" -#: src/libslic3r/PrintConfig.cpp:1500 +#: src/libslic3r/PrintConfig.cpp:1784 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " @@ -6209,15 +11014,15 @@ msgstr "" "вказаним абсолютним Z. Ви можете налаштувати цей параметр так, що підняття " "буде пропускатися на перших шарах." -#: src/libslic3r/PrintConfig.cpp:1507 +#: src/libslic3r/PrintConfig.cpp:1791 msgid "Below Z" msgstr "Нижче Z" -#: src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1792 msgid "Only lift Z below" msgstr "Тільки опускати Z" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1793 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " @@ -6227,11 +11032,11 @@ msgstr "" "вказаного абсолютного Z. Ви можете налаштувати цей параметр так, що підняття " "буде обмежене на перших шарах." -#: src/libslic3r/PrintConfig.cpp:1517 src/libslic3r/PrintConfig.cpp:1525 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1809 msgid "Extra length on restart" msgstr "Додаткова довжина при перезапуску" -#: src/libslic3r/PrintConfig.cpp:1518 +#: src/libslic3r/PrintConfig.cpp:1802 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." @@ -6239,7 +11044,7 @@ msgstr "" "Коли переривання компенсується після руху переміщення, екструдер буде " "проштовхувати цю додаткову кількість філамента. Цей параметр рідко потрібний." -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1810 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." @@ -6247,19 +11052,19 @@ msgstr "" "Коли переривання компенсується після зміни інструмента, екструдер буде " "проштовхувати цю додаткову кількість філамента." -#: src/libslic3r/PrintConfig.cpp:1533 src/libslic3r/PrintConfig.cpp:1534 +#: src/libslic3r/PrintConfig.cpp:1817 src/libslic3r/PrintConfig.cpp:1818 msgid "Retraction Speed" msgstr "Швидкість переривання" -#: src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "Швидкість переривання (це стосується лише двигуна екструдера)." -#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:1542 +#: src/libslic3r/PrintConfig.cpp:1825 src/libslic3r/PrintConfig.cpp:1826 msgid "Deretraction Speed" msgstr "Швидкість після-переривання" -#: src/libslic3r/PrintConfig.cpp:1543 +#: src/libslic3r/PrintConfig.cpp:1827 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " @@ -6269,67 +11074,55 @@ msgstr "" "лише двигуна екструдера ). Якщо залишити 0, використовується швидкість " "переривання ." -#: src/libslic3r/PrintConfig.cpp:1550 +#: src/libslic3r/PrintConfig.cpp:1834 msgid "Seam position" msgstr "Позиція шва" -#: src/libslic3r/PrintConfig.cpp:1552 +#: src/libslic3r/PrintConfig.cpp:1836 msgid "Position of perimeters starting points." msgstr "Позиція стартових точок периметра." -#: src/libslic3r/PrintConfig.cpp:1558 +#: src/libslic3r/PrintConfig.cpp:1842 msgid "Random" -msgstr "" +msgstr "Випадкова" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1843 msgid "Nearest" -msgstr "" +msgstr "Найближча" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1844 msgid "Aligned" -msgstr "" +msgstr "Вирівняно" -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1852 msgid "Direction" msgstr "Напрямок" -#: src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:1854 msgid "Preferred direction of the seam" msgstr "Бажаний напрямок шва" -#: src/libslic3r/PrintConfig.cpp:1571 +#: src/libslic3r/PrintConfig.cpp:1855 msgid "Seam preferred direction" msgstr "Бажаний напрямок шва" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1862 msgid "Jitter" msgstr "Джиттер" -#: src/libslic3r/PrintConfig.cpp:1580 +#: src/libslic3r/PrintConfig.cpp:1864 msgid "Seam preferred direction jitter" msgstr "Бажаний напрямок шва джитера" -#: src/libslic3r/PrintConfig.cpp:1581 +#: src/libslic3r/PrintConfig.cpp:1865 msgid "Preferred direction of the seam - jitter" msgstr "Бажаний напрямок шва - джитера" -#: src/libslic3r/PrintConfig.cpp:1591 -msgid "USB/serial port for printer connection." -msgstr "USB / послідовний порт для підключення принтера." - -#: src/libslic3r/PrintConfig.cpp:1598 -msgid "Serial port speed" -msgstr "Швидкість послідовного порту" - -#: src/libslic3r/PrintConfig.cpp:1599 -msgid "Speed (baud) of USB/serial port for printer connection." -msgstr "Швидкість (бод) USB / послідовного порту для підключення принтера." - -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1872 msgid "Distance from object" msgstr "Відстань від об'єкту" -#: src/libslic3r/PrintConfig.cpp:1609 +#: src/libslic3r/PrintConfig.cpp:1873 msgid "" "Distance between skirt and object(s). Set this to zero to attach the skirt " "to the object(s) and get a brim for better adhesion." @@ -6337,11 +11130,11 @@ msgstr "" "Відстань між плінтусом та об'єктом (-ами). Установіть 0, щоб прикріпити " "плінтус до об'єкта (-ів) і отримати край для кращої адгезії." -#: src/libslic3r/PrintConfig.cpp:1616 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "Skirt height" msgstr "Висота плінтусу" -#: src/libslic3r/PrintConfig.cpp:1617 +#: src/libslic3r/PrintConfig.cpp:1881 msgid "" "Height of skirt expressed in layers. Set this to a tall value to use skirt " "as a shield against drafts." @@ -6349,15 +11142,29 @@ msgstr "" "Висота плінтусу виражена в шарах. Встановіть це значення на високе, щоб " "використовувати плінтус як щит проти протягів." -#: src/libslic3r/PrintConfig.cpp:1624 +#: src/libslic3r/PrintConfig.cpp:1888 +msgid "Draft shield" +msgstr "Чорновий щит" + +#: src/libslic3r/PrintConfig.cpp:1889 +msgid "" +"If enabled, the skirt will be as tall as a highest printed object. This is " +"useful to protect an ABS or ASA print from warping and detaching from print " +"bed due to wind draft." +msgstr "" +"Якщо увімкнено, спідниця буде такою ж високою, як найвищий друкований " +"предмет. Це корисно, щоб захистити друк ABS або ASA від деформації та " +"від'єднання від друкарського столу через протяг." + +#: src/libslic3r/PrintConfig.cpp:1895 msgid "Loops (minimum)" msgstr "Петлі (мінімум)" -#: src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:1896 msgid "Skirt Loops" msgstr "Петлі плінтусу" -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1897 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " @@ -6367,11 +11174,11 @@ msgstr "" "довжина екструзії\", кількість петель може бути більшою, ніж налаштована " "тут. Установіть 0, щоб повністю вимкнути плінтус." -#: src/libslic3r/PrintConfig.cpp:1634 +#: src/libslic3r/PrintConfig.cpp:1905 msgid "Slow down if layer print time is below" msgstr "Уповільнення, якщо час друку шару нижче" -#: src/libslic3r/PrintConfig.cpp:1635 +#: src/libslic3r/PrintConfig.cpp:1906 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." @@ -6379,11 +11186,11 @@ msgstr "" "Якщо час друку шару оцінюється нижче цієї кількості секунд, швидкість друку " "рухів зменшуватиметься, щоб збільшити тривалість до цього значення." -#: src/libslic3r/PrintConfig.cpp:1645 +#: src/libslic3r/PrintConfig.cpp:1915 msgid "Small perimeters" msgstr "Маленькі периметри" -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " @@ -6394,11 +11201,11 @@ msgstr "" "вона буде розрахована за наведеним вище параметром швидкості. Встановити 0 " "для автоматичного використання." -#: src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Solid infill threshold area" msgstr "Порогова площа суцільного наповнення" -#: src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1929 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." @@ -6406,23 +11213,23 @@ msgstr "" "Встановити суцільне заповнення для регіонів, що мають площу, меншу " "зазначеного порогу." -#: src/libslic3r/PrintConfig.cpp:1660 +#: src/libslic3r/PrintConfig.cpp:1930 msgid "mm²" msgstr "мм²" -#: src/libslic3r/PrintConfig.cpp:1666 +#: src/libslic3r/PrintConfig.cpp:1936 msgid "Solid infill extruder" msgstr "Екструдер суцільних наповнень" -#: src/libslic3r/PrintConfig.cpp:1668 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "The extruder to use when printing solid infill." msgstr "Екструдер для друку суцільних наповнень." -#: src/libslic3r/PrintConfig.cpp:1674 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "Solid infill every" msgstr "Суцільне наповнення кожні" -#: src/libslic3r/PrintConfig.cpp:1676 +#: src/libslic3r/PrintConfig.cpp:1946 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -6434,7 +11241,7 @@ msgstr "" "Slic3r автоматично вибере максимально можливу кількість шарів для " "комбінування відповідно до діаметра сопла та висоти шару." -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1958 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -6447,7 +11254,7 @@ msgstr "" "діаметр сопла. Якщо він виражений у відсотках (наприклад, 90%), він буде " "обчислюватися за висотою шару." -#: src/libslic3r/PrintConfig.cpp:1698 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -6458,35 +11265,39 @@ msgstr "" "швидкості заповнення за замовчуванням. Встановити 0 для автоматичного " "використання." -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1981 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" "Кількість суцільних шарів для генерування на верхній і нижній поверхні." -#: src/libslic3r/PrintConfig.cpp:1716 +#: src/libslic3r/PrintConfig.cpp:1987 src/libslic3r/PrintConfig.cpp:1988 +msgid "Minimum thickness of a top / bottom shell" +msgstr "Мінімальна товщина верхньої / нижньої оболонки" + +#: src/libslic3r/PrintConfig.cpp:1994 msgid "Spiral vase" msgstr "Спіральна ваза" -#: src/libslic3r/PrintConfig.cpp:1717 +#: src/libslic3r/PrintConfig.cpp:1995 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " "no infill, no top solid layers and no support material. You can still set " "any number of bottom solid layers as well as skirt/brim loops. It won't work " -"when printing more than an object." +"when printing more than one single object." msgstr "" "Ця функція буде поступово підвищувати Z протягом друку одного-стінного " "об'єкта для уникнення будь-якого видимого шву. Цей параметр вимагає " "одношарового периметру, відсутнє наповнення, відсутність верхніх суцільних " "шарів і відсутність матеріалу підтримки. Ви все ще можете встановити будь-" -"яку кількість нижніх суцільних шарів, а також петель плінтусу/краю. Це не " -"спрацює при друку більше, ніж одного об'єкта." +"яку кількість нижніх твердих шарів, а також спідниці краю. Це не спрацює при " +"друку більше, ніж одного об'єкта." -#: src/libslic3r/PrintConfig.cpp:1725 +#: src/libslic3r/PrintConfig.cpp:2003 msgid "Temperature variation" msgstr "Варіація температури" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:2004 msgid "" "Temperature difference to be applied when an extruder is not active. Enables " "a full-height \"sacrificial\" skirt on which the nozzles are periodically " @@ -6495,88 +11306,127 @@ msgstr "" "Відмітка температури, яка застосовується, коли екструдер не активний. Вмикає " "\"жертовний\" плінтус на повній висоті, на які періодично очищуються сопла." -#: src/libslic3r/PrintConfig.cpp:1736 +#: src/libslic3r/PrintConfig.cpp:2014 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " -"has finished heating. If Slic3r detects M104 or M190 in your custom codes, " -"such commands will not be prepended automatically so you're free to " +"has finished heating. If PrusaSlicer detects M104 or M190 in your custom " +"codes, such commands will not be prepended automatically so you're free to " "customize the order of heating commands and other custom actions. Note that " -"you can use placeholder variables for all Slic3r settings, so you can put a " -"\"M109 S[first_layer_temperature]\" command wherever you want." -msgstr "" -"Ця початкова процедура вставляється на початку, після того, як полотно " -"досягне цільової температури, а екструдер тільки починає нагріватися, і " -"перед тим, як екструдер закінчить нагрівання. Якщо Slic3r виявляє M104 або " -"M190 у ваших користувацьких кодах, такі команди не будуть додаватися " -"автоматично, щоб ви могли вільно налаштовувати порядок команд нагріву та " -"інших спеціальних дій. Зверніть увагу, що ви можете використовувати змінні-" -"заповнювачі для всіх параметрів Slic3r, щоб ви могли поставити команду " -"\"M109 S [first_layer_temperature]\" де завгодно." +"you can use placeholder variables for all PrusaSlicer settings, so you can " +"put a \"M109 S[first_layer_temperature]\" command wherever you want." +msgstr "" +"Ця процедура початку вставляється на початку, після того, як стіл досягне " +"цільової температури, а екструдер тільки починає нагріватися, і перед тим, " +"як екструдер закінчить нагрівання. Якщо Slic3r виявляє M104 або M190 у ваших " +"користувацьких кодах, такі команди не будуть додаватися автоматично, щоб ви " +"могли вільно налаштовувати порядок команд нагріву та інших спеціальних дій. " +"Зверніть увагу, що ви можете використовувати шаблонні змінні для всіх " +"параметрів Slic3r, щоб ви могли поставити команду \"M109 S " +"[first_layer_temperature]\" де завгодно." -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:2029 msgid "" "This start procedure is inserted at the beginning, after any printer start " -"gcode. This is used to override settings for a specific filament. If Slic3r " -"detects M104, M109, M140 or M190 in your custom codes, such commands will " -"not be prepended automatically so you're free to customize the order of " -"heating commands and other custom actions. Note that you can use placeholder " -"variables for all Slic3r settings, so you can put a \"M109 " +"gcode (and after any toolchange to this filament in case of multi-material " +"printers). This is used to override settings for a specific filament. If " +"PrusaSlicer detects M104, M109, M140 or M190 in your custom codes, such " +"commands will not be prepended automatically so you're free to customize the " +"order of heating commands and other custom actions. Note that you can use " +"placeholder variables for all PrusaSlicer settings, so you can put a \"M109 " "S[first_layer_temperature]\" command wherever you want. If you have multiple " "extruders, the gcode is processed in extruder order." msgstr "" -"Ця початкова процедура вставляється на початку, після того, як будь-який " -"принтер запускає G-code. Це використовується для перевизначення параметрів " -"для певної нитки. Якщо Slic3r виявляє M104, M109, M140 або M190 у ваших " -"користувацьких кодах, такі команди не будуть автоматично додаватися, тому ви " -"можете налаштувати порядок команд нагріву та інших спеціальних дій. Зверніть " -"увагу, що ви можете використовувати змінні-заповнювачі для всіх параметрів " -"Slic3r, щоб ви могли поставити команду \"M109 S [first_layer_temperature]\" " -"де завгодно. Якщо у вас є кілька екструдерів, G-code обробляється в порядку " -"екструдерів." +"Ця процедура початку вставляється на початку, після будь-якого стартового G-" +"коду принтера (і після будь-якої зміни інструменту на цей філамент, у разі " +"багато-матеріальних принтерів). Вона використовується для заміни налаштувань " +"для певного філаменту. Якщо PrusaSlicer виявить M104, M109, M140 або M190 у " +"ваших користувацьких кодах, такі команди не додаватимуться автоматично, тому " +"ви можете налаштувати порядок команд нагрівання та інші спеціальні дії. " +"Зверніть увагу, що ви можете використовувати шаблонні змінні для всіх " +"налаштувань PrusaSlicer, тому ви можете поставити команду \"M109 S " +"[first_layer_temperature]\" де завгодно. Якщо у вас кілька екструдерів, G-" +"код обробляється в порядку екструдера." + +#: src/libslic3r/PrintConfig.cpp:2045 +msgid "Color change G-code" +msgstr "G-код зміни кольору" + +#: src/libslic3r/PrintConfig.cpp:2046 +msgid "This G-code will be used as a code for the color change" +msgstr "Цей G-код буде використовуватися як код для зміни кольору" + +#: src/libslic3r/PrintConfig.cpp:2055 +msgid "This G-code will be used as a code for the pause print" +msgstr "Цей G-код буде використовуватися як код для паузи друку" + +#: src/libslic3r/PrintConfig.cpp:2064 +msgid "This G-code will be used as a custom code" +msgstr "Цей G-код буде використовуватися як власний код" -#: src/libslic3r/PrintConfig.cpp:1766 +#: src/libslic3r/PrintConfig.cpp:2072 msgid "Single Extruder Multi Material" -msgstr "Одиночний екструдер кількох матеріалів" +msgstr "Мульти-матеріальний (ММ) друк з одним екструдером" -#: src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "The printer multiplexes filaments into a single hot end." -msgstr "Принтер мультиплексує нитки в єдиний гарячий кінець." +msgstr "Принтер змішує філаменту в єдиний гарячий кінець." -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:2078 msgid "Prime all printing extruders" -msgstr "" +msgstr "Підготовка всіх друкуючих екструдерів" -#: src/libslic3r/PrintConfig.cpp:1773 +#: src/libslic3r/PrintConfig.cpp:2079 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." msgstr "" +"Якщо увімкнено, усі друкуючі екструдери будуть отестовані на передньому краї " +"друкарського столу перед початком друку." -#: src/libslic3r/PrintConfig.cpp:1778 +#: src/libslic3r/PrintConfig.cpp:2084 +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "Немає розріджених шарів (ЕКСПЕРИМЕНТАЛЬНИЙ)" + +#: src/libslic3r/PrintConfig.cpp:2085 +msgid "" +"If enabled, the wipe tower will not be printed on layers with no " +"toolchanges. On layers with a toolchange, extruder will travel downward to " +"print the wipe tower. User is responsible for ensuring there is no collision " +"with the print." +msgstr "" +"Якщо увімкнено, вежа витирання не друкується на шарах без змін інструментів. " +"На шарах із зміною інструменту екструдер рухатиметься вниз, щоб надрукувати " +"вежу витирання. Користувач несе відповідальність за те, щоб не було " +"зіткнення з друком." + +#: src/libslic3r/PrintConfig.cpp:2092 msgid "Generate support material" msgstr "Створити підтримуючий матеріал" -#: src/libslic3r/PrintConfig.cpp:1780 +#: src/libslic3r/PrintConfig.cpp:2094 msgid "Enable support material generation." msgstr "Увімкнути генерацію матеріалів підтримки." -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:2098 msgid "Auto generated supports" -msgstr "" +msgstr "Автоматично згенеровані підтримки" -#: src/libslic3r/PrintConfig.cpp:1786 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " "\"Support Enforcer\" volumes only." msgstr "" +"Якщо увімкнено, підтримка буде генеруватися автоматично на основі порогового " +"значення звису. Якщо вимкнено, підтримка буде генеруватися лише для " +"\"Примусових підтримок\"." -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "XY separation between an object and its support" msgstr "Розподіл XY між об'єктом та його підтримкою" -#: src/libslic3r/PrintConfig.cpp:1794 +#: src/libslic3r/PrintConfig.cpp:2108 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." @@ -6584,11 +11434,11 @@ msgstr "" "Розподіл XY між об'єктом та його підтримкою. Якщо вона виражена у відсотках " "(наприклад, 50%), вона буде розрахована за зовнішньою шириною периметру." -#: src/libslic3r/PrintConfig.cpp:1804 +#: src/libslic3r/PrintConfig.cpp:2118 msgid "Pattern angle" msgstr "Кут шаблону" -#: src/libslic3r/PrintConfig.cpp:1806 +#: src/libslic3r/PrintConfig.cpp:2120 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." @@ -6596,7 +11446,7 @@ msgstr "" "Використовуйте цей параметр, щоб повернути шаблон підтримуючого матеріалу на " "горизонтальній площині." -#: src/libslic3r/PrintConfig.cpp:1816 src/libslic3r/PrintConfig.cpp:2421 +#: src/libslic3r/PrintConfig.cpp:2130 src/libslic3r/PrintConfig.cpp:2925 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -6604,11 +11454,11 @@ msgstr "" "Створити підтримку лише, для того, що лежить на збірній пластині. Не " "створювати підтримку на друк." -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:2136 msgid "Contact Z distance" msgstr "Контактна відстань по осі Z" -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/libslic3r/PrintConfig.cpp:2138 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " @@ -6618,19 +11468,19 @@ msgstr "" "Встановлення значення 0 також захистить Slic3r від використання потоку " "мостів та швидкості для першого шару об'єктну." -#: src/libslic3r/PrintConfig.cpp:1831 -msgid "soluble" -msgstr "розчинний" +#: src/libslic3r/PrintConfig.cpp:2145 +msgid "0 (soluble)" +msgstr "0 (розчинний)" -#: src/libslic3r/PrintConfig.cpp:1832 -msgid "detachable" -msgstr "відривний" +#: src/libslic3r/PrintConfig.cpp:2146 +msgid "0.2 (detachable)" +msgstr "0,2 (відривний)" -#: src/libslic3r/PrintConfig.cpp:1837 +#: src/libslic3r/PrintConfig.cpp:2151 msgid "Enforce support for the first" msgstr "Забезпечити підтримку першого(их)" -#: src/libslic3r/PrintConfig.cpp:1839 +#: src/libslic3r/PrintConfig.cpp:2153 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -6643,15 +11493,15 @@ msgstr "" "більшої адгезії об'єктів, що мають дуже тонкий або поганий слід на збірній " "пластині." -#: src/libslic3r/PrintConfig.cpp:1844 +#: src/libslic3r/PrintConfig.cpp:2158 msgid "Enforce support for the first n layers" msgstr "Забезпечити підтримку перших n шарів" -#: src/libslic3r/PrintConfig.cpp:1850 +#: src/libslic3r/PrintConfig.cpp:2164 msgid "Support material/raft/skirt extruder" msgstr "Підтримуючий матеріал / пліт / плінтус екструдеру" -#: src/libslic3r/PrintConfig.cpp:1852 +#: src/libslic3r/PrintConfig.cpp:2166 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -6659,7 +11509,7 @@ msgstr "" "Екструдер для друку підтримуючого матеріалу, плоту та плінтусу (1+, 0 для " "використання поточного екструдера, щоб мінімізувати зміни інструменту)." -#: src/libslic3r/PrintConfig.cpp:1861 +#: src/libslic3r/PrintConfig.cpp:2175 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -6672,21 +11522,21 @@ msgstr "" "Якщо він виражений у відсотках (наприклад, 90%), він буде обчислюватися за " "висотою шару." -#: src/libslic3r/PrintConfig.cpp:1869 +#: src/libslic3r/PrintConfig.cpp:2184 msgid "Interface loops" msgstr "Інтерфейсні петлі" -#: src/libslic3r/PrintConfig.cpp:1871 +#: src/libslic3r/PrintConfig.cpp:2186 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" "Закрити петлями верхній контактний шар підтримки. За замовчанням вимкнено." -#: src/libslic3r/PrintConfig.cpp:1876 +#: src/libslic3r/PrintConfig.cpp:2191 msgid "Support material/raft interface extruder" msgstr "Екструдер інтерфейсу підтримуючого матеріалу / плоту" -#: src/libslic3r/PrintConfig.cpp:1878 +#: src/libslic3r/PrintConfig.cpp:2193 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." @@ -6695,11 +11545,11 @@ msgstr "" "(1+, 0 для використання поточного екструдера, щоб звести до мінімуму зміни " "інструменту). Це також впливає на плот." -#: src/libslic3r/PrintConfig.cpp:1885 +#: src/libslic3r/PrintConfig.cpp:2200 msgid "Interface layers" msgstr "Інтерфейсні шари" -#: src/libslic3r/PrintConfig.cpp:1887 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "Number of interface layers to insert between the object(s) and support " "material." @@ -6707,17 +11557,17 @@ msgstr "" "Кількість шарів інтерфейсу для вставки між об'єктом(ами) та підтримуючим " "матеріалом." -#: src/libslic3r/PrintConfig.cpp:1894 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Interface pattern spacing" msgstr "Відстань між шаблонами інтерфейсу" -#: src/libslic3r/PrintConfig.cpp:1896 +#: src/libslic3r/PrintConfig.cpp:2211 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" "Відстань між інтерфейсними лініями. Встановити 0, щоб отримати надійний " "інтерфейс." -#: src/libslic3r/PrintConfig.cpp:1905 +#: src/libslic3r/PrintConfig.cpp:2220 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " @@ -6727,35 +11577,35 @@ msgstr "" "виражена у відсотках (наприклад, 50%), вона буде розрахована за швидкістю " "матеріалу підтримки." -#: src/libslic3r/PrintConfig.cpp:1914 +#: src/libslic3r/PrintConfig.cpp:2229 msgid "Pattern" msgstr "Шаблон" -#: src/libslic3r/PrintConfig.cpp:1916 +#: src/libslic3r/PrintConfig.cpp:2231 msgid "Pattern used to generate support material." msgstr "Шаблон, що використовується для створення матеріалу підтримки." -#: src/libslic3r/PrintConfig.cpp:1922 +#: src/libslic3r/PrintConfig.cpp:2237 msgid "Rectilinear grid" -msgstr "" +msgstr "Прямолінійна сітка" -#: src/libslic3r/PrintConfig.cpp:1928 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "Pattern spacing" msgstr "Відстань між шаблонами" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:2245 msgid "Spacing between support material lines." msgstr "Відстань між лініями підтримуючого матеріалу." -#: src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:2254 msgid "Speed for printing support material." msgstr "Швидкість друку підтримуючого матеріалу." -#: src/libslic3r/PrintConfig.cpp:1946 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "Synchronize with object layers" msgstr "Синхронізувати з шарами об'єкту" -#: src/libslic3r/PrintConfig.cpp:1948 +#: src/libslic3r/PrintConfig.cpp:2263 msgid "" "Synchronize support layers with the object print layers. This is useful with " "multi-material printers, where the extruder switch is expensive." @@ -6764,11 +11614,11 @@ msgstr "" "використовувати з багато-матеріальними принтерами, де перемикання " "екструдерів -затратна процедура." -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "Overhang threshold" msgstr "Порог нависання" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:2271 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -6782,11 +11632,11 @@ msgstr "" "площини), який ви можете надрукувати без підтримуючого матеріалу. Встановити " "0 для автоматичного визначення (рекомендовано)." -#: src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:2283 msgid "With sheath around the support" msgstr "З оболонкою навколо підтримки" -#: src/libslic3r/PrintConfig.cpp:1970 +#: src/libslic3r/PrintConfig.cpp:2285 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." @@ -6794,23 +11644,23 @@ msgstr "" "Додати оболонку (одну лінію периметра) навколо базової підтримки. Це робить " "підтримку більш надійною, але її важче видалити." -#: src/libslic3r/PrintConfig.cpp:1977 +#: src/libslic3r/PrintConfig.cpp:2292 msgid "" -"Extruder temperature for layers after the first one. Set this to zero to " -"disable temperature control commands in the output." +"Nozzle temperature for layers after the first one. Set this to zero to " +"disable temperature control commands in the output G-code." msgstr "" -"Температура екструдеру для шарів після першого. Установіть 0, щоб вимкнути " -"команди керування температурою на виході." +"Температура сопла для шарів після першого. Встановіть значення нуля, щоб " +"вимкнути команди регулювання температури у вихідному G-коді." -#: src/libslic3r/PrintConfig.cpp:1979 -msgid "Temperature" -msgstr "Температура" +#: src/libslic3r/PrintConfig.cpp:2295 +msgid "Nozzle temperature" +msgstr "Температура сопла" -#: src/libslic3r/PrintConfig.cpp:1985 +#: src/libslic3r/PrintConfig.cpp:2301 msgid "Detect thin walls" -msgstr "Виявлення тонких стін" +msgstr "Виявлення тонких стінок" -#: src/libslic3r/PrintConfig.cpp:1987 +#: src/libslic3r/PrintConfig.cpp:2303 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." @@ -6818,11 +11668,11 @@ msgstr "" "Визначення одношарової стінки (частини, де два екструзії не підходять, і нам " "потрібно згорнути їх у єдиний слід)." -#: src/libslic3r/PrintConfig.cpp:1993 +#: src/libslic3r/PrintConfig.cpp:2309 msgid "Threads" msgstr "Нитки" -#: src/libslic3r/PrintConfig.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:2310 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." @@ -6830,17 +11680,23 @@ msgstr "" "Нитки використовуються для паралелізації довготривалих завдань. Оптимальна " "кількість ниток трохи перевищує кількість доступних ядер / процесорів." -#: src/libslic3r/PrintConfig.cpp:2006 +#: src/libslic3r/PrintConfig.cpp:2322 msgid "" -"This custom code is inserted right before every extruder change. Note that " -"you can use placeholder variables for all Slic3r settings as well as " -"[previous_extruder] and [next_extruder]." +"This custom code is inserted before every toolchange. Placeholder variables " +"for all PrusaSlicer settings as well as {previous_extruder} and " +"{next_extruder} can be used. When a tool-changing command which changes to " +"the correct extruder is included (such as T{next_extruder}), PrusaSlicer " +"will emit no other such command. It is therefore possible to script custom " +"behaviour both before and after the toolchange." msgstr "" -"Цей спеціальний код вставляється безпосередньо перед кожною зміненою " -"екструдера. Зверніть увагу, що ви можете використовувати змінні-заповнювачі " -"для всіх параметрів Slic3r, а також [previous_extruder] і [next_extruder]." +"Цей користувацький код вставляється перед кожною заміною інструменту. Можна " +"використовувати шаблонні змінні для всіх налаштувань PrusaSlicer, таких як " +"{previous_extruder} та {next_extruder}. Коли включається команда зміни " +"інструмента, яка змінюється на правильний екструдер (наприклад, " +"T{next_extruder}), PrusaSlicer не видасть жодної такої команди. Отже, можна " +"створювати сценарії до поведінки як до, так і після заміни інструменту." -#: src/libslic3r/PrintConfig.cpp:2018 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -6856,7 +11712,7 @@ msgstr "" "виражена у відсотках (наприклад, 90%), вона буде обчислюватися за висотою " "шару." -#: src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2347 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -6870,23 +11726,37 @@ msgstr "" "відсотком (наприклад, 80%) звищення швидкості щільного наповнення . " "Встановити 0 для автоматичного обчислення." -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Number of solid layers to generate on top surfaces." msgstr "Кількість суцільних шарів, генерованих на верхніх поверхнях." -#: src/libslic3r/PrintConfig.cpp:2044 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Top solid layers" msgstr "Верхні суцільні шари" -#: src/libslic3r/PrintConfig.cpp:2050 +#: src/libslic3r/PrintConfig.cpp:2371 +msgid "" +"The number of top solid layers is increased above top_solid_layers if " +"necessary to satisfy minimum thickness of top shell. This is useful to " +"prevent pillowing effect when printing with variable layer height." +msgstr "" +"Кількість верхніх твердих шарів збільшується над top_solid_layers, якщо це " +"необхідно для задоволення мінімальної товщини верхньої оболонки. Це корисно " +"для запобігання ефекту подушки під час друку зі змінною висотою шару." + +#: src/libslic3r/PrintConfig.cpp:2374 +msgid "Minimum top shell thickness" +msgstr "Мінімальна товщина верхньої оболонки" + +#: src/libslic3r/PrintConfig.cpp:2381 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "Швидкість рухів пересування (стрибки між далекими точками екструзії)." -#: src/libslic3r/PrintConfig.cpp:2058 +#: src/libslic3r/PrintConfig.cpp:2389 msgid "Use firmware retraction" msgstr "Використовувати відмову прошивки" -#: src/libslic3r/PrintConfig.cpp:2059 +#: src/libslic3r/PrintConfig.cpp:2390 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." @@ -6894,11 +11764,11 @@ msgstr "" "Цей експериментальний параметр використовує команди G10 і G11 для обробки " "відмови прошивки. Останнім часом це підтримується лише Marlin-ом." -#: src/libslic3r/PrintConfig.cpp:2065 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "Use relative E distances" msgstr "Використовувати відносні E відстані" -#: src/libslic3r/PrintConfig.cpp:2066 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -6906,11 +11776,11 @@ msgstr "" "Якщо ваша прошивка потребує відносне значення E, зазначте це, інакше залиште " "його незазначеним. Більшість прошивок використовують абсолютні значення." -#: src/libslic3r/PrintConfig.cpp:2072 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Use volumetric E" msgstr "Використовувати об'ємний Е" -#: src/libslic3r/PrintConfig.cpp:2073 +#: src/libslic3r/PrintConfig.cpp:2404 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -6923,14 +11793,14 @@ msgstr "" "міліметрах замість лінійних міліметрів. Якщо ваша прошивку ще не знає " "діаметр ниток, ви можете встановити такі команди, як \"M200 D " "[filament_diameter_0] T0\" у вашому старті G-коду, щоб включити об'ємний " -"режим і використовувати діаметр нитки, пов'язаний з вибраною ниткою в " -"Slic3r. Останнім часом це підтримується лише Marlin-ом." +"режим і використовувати діаметр філаменту, пов'язаний з вибраним філаментем " +"у Slic3r. Останнім часом це підтримується лише Marlin-ом." -#: src/libslic3r/PrintConfig.cpp:2083 +#: src/libslic3r/PrintConfig.cpp:2414 msgid "Enable variable layer height feature" msgstr "Увімкнути функцію шарів змінної висоти" -#: src/libslic3r/PrintConfig.cpp:2084 +#: src/libslic3r/PrintConfig.cpp:2415 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." @@ -6938,11 +11808,11 @@ msgstr "" "Деякі принтери або налаштування принтера можуть мати труднощі з друкуванням " "шарів змінної висоти. Увімкнено за умовчанням." -#: src/libslic3r/PrintConfig.cpp:2090 +#: src/libslic3r/PrintConfig.cpp:2421 msgid "Wipe while retracting" -msgstr "Вичіщувати при відмові" +msgstr "Витирання протягом ретракту" -#: src/libslic3r/PrintConfig.cpp:2091 +#: src/libslic3r/PrintConfig.cpp:2422 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." @@ -6950,7 +11820,7 @@ msgstr "" "Цей прапорець перемістить сопло під час відмови, щоб мінімізувати можливість " "утворення краплі на витікаючих екструдерах." -#: src/libslic3r/PrintConfig.cpp:2098 +#: src/libslic3r/PrintConfig.cpp:2429 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." @@ -6959,94 +11829,101 @@ msgstr "" "екструдерів при зміні інструмента. Екструдуйте надлишок матеріалу до " "вичищуючої вежі." -#: src/libslic3r/PrintConfig.cpp:2104 +#: src/libslic3r/PrintConfig.cpp:2435 msgid "Purging volumes - load/unload volumes" -msgstr "" +msgstr "Обсяги витирання - обсяги заведення/виведення" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2436 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " -"volumes below. " +"volumes below." msgstr "" +"Цей вектор економить необхідні обсяги для зміни від / до кожного " +"інструменту, що використовується на вежі витирання. Ці значення " +"використовуються для спрощення створення повних обсягів продувки нижче." -#: src/libslic3r/PrintConfig.cpp:2111 +#: src/libslic3r/PrintConfig.cpp:2442 msgid "Purging volumes - matrix" -msgstr "" +msgstr "Таблиця обсягів очищення" -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2443 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " -"new filament on the wipe tower for any given pair of tools. " +"new filament on the wipe tower for any given pair of tools." msgstr "" +"Ця матриця описує обсяги (у кубічних міліметрах), необхідні для витирання " +"нового філаменту на вежі витирання для будь-якої пари інструментів." -#: src/libslic3r/PrintConfig.cpp:2121 +#: src/libslic3r/PrintConfig.cpp:2452 msgid "Position X" msgstr "Позиція X" -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2453 msgid "X coordinate of the left front corner of a wipe tower" msgstr "X координата лівого переднього кута вичищуючої вежі" -#: src/libslic3r/PrintConfig.cpp:2128 +#: src/libslic3r/PrintConfig.cpp:2459 msgid "Position Y" msgstr "Позиція Y" -#: src/libslic3r/PrintConfig.cpp:2129 +#: src/libslic3r/PrintConfig.cpp:2460 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "Y координата лівого переднього кута вичищуючої вежі" -#: src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2467 msgid "Width of a wipe tower" msgstr "Ширина вичищуючої вежі" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2473 msgid "Wipe tower rotation angle" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2143 -msgid "Wipe tower rotation angle with respect to x-axis " -msgstr "" +msgstr "Кут повороту вежі витирання" -#: src/libslic3r/PrintConfig.cpp:2144 src/libslic3r/PrintConfig.cpp:2565 -msgid "degrees" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:2474 +msgid "Wipe tower rotation angle with respect to x-axis." +msgstr "Кут повороту вежі витирання за віссю Х." -#: src/libslic3r/PrintConfig.cpp:2150 +#: src/libslic3r/PrintConfig.cpp:2481 msgid "Wipe into this object's infill" -msgstr "" +msgstr "Витирати до наповнення цього об'єкту" -#: src/libslic3r/PrintConfig.cpp:2151 +#: src/libslic3r/PrintConfig.cpp:2482 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." msgstr "" +"Очищення після заміни інструменту виконується всередині заповнювачів цього " +"об’єкта. Це зменшує кількість відходів, але може призвести до збільшення " +"часу друку через додаткові переміщення." -#: src/libslic3r/PrintConfig.cpp:2158 +#: src/libslic3r/PrintConfig.cpp:2489 msgid "Wipe into this object" -msgstr "" +msgstr "Витирати до цього об'єкту" -#: src/libslic3r/PrintConfig.cpp:2159 +#: src/libslic3r/PrintConfig.cpp:2490 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " "Colours of the objects will be mixed as a result." msgstr "" +"Об'єкт буде використаний для продувки сопла після заміни інструменту, щоб " +"заощадити матеріал, який інакше потрапив би до вежі витирання, і зменшити " +"час друку. В результаті кольори предметів будуть змішані." -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2496 msgid "Maximal bridging distance" -msgstr "" +msgstr "Максимальна мостова відстань" -#: src/libslic3r/PrintConfig.cpp:2166 -msgid "Maximal distance between supports on sparse infill sections. " -msgstr "" +#: src/libslic3r/PrintConfig.cpp:2497 +msgid "Maximal distance between supports on sparse infill sections." +msgstr "Максимальна відстань між підтримками на рідкісних ділянках заповнення." -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2503 msgid "XY Size Compensation" msgstr "Зрівноваження розміру за XY" -#: src/libslic3r/PrintConfig.cpp:2174 +#: src/libslic3r/PrintConfig.cpp:2505 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" @@ -7056,11 +11933,11 @@ msgstr "" "(негативний - внутрішній, позитивний - ззовнішній). Це може бути корисним " "для точного налаштування розмірів отворів." -#: src/libslic3r/PrintConfig.cpp:2182 +#: src/libslic3r/PrintConfig.cpp:2513 msgid "Z offset" msgstr "Зміщення Z" -#: src/libslic3r/PrintConfig.cpp:2183 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -7072,615 +11949,1382 @@ msgstr "" "наприклад, якщо ваш кінцевий нуль фактично залишає сопло на 0,3 мм від " "полотна друку, встановіть його на значення -0,3 (або виправте ваш endstop)." -#: src/libslic3r/PrintConfig.cpp:2200 +#: src/libslic3r/PrintConfig.cpp:2581 msgid "Display width" -msgstr "" +msgstr "Ширина дисплея" -#: src/libslic3r/PrintConfig.cpp:2201 +#: src/libslic3r/PrintConfig.cpp:2582 msgid "Width of the display" -msgstr "" +msgstr "Ширина дисплея" -#: src/libslic3r/PrintConfig.cpp:2206 +#: src/libslic3r/PrintConfig.cpp:2587 msgid "Display height" -msgstr "" +msgstr "Висота дисплея" -#: src/libslic3r/PrintConfig.cpp:2207 +#: src/libslic3r/PrintConfig.cpp:2588 msgid "Height of the display" -msgstr "" +msgstr "Висота дисплею" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2593 msgid "Number of pixels in" -msgstr "" +msgstr "Кількість пікселів за віссю" -#: src/libslic3r/PrintConfig.cpp:2214 +#: src/libslic3r/PrintConfig.cpp:2595 msgid "Number of pixels in X" -msgstr "" +msgstr "Кількість пікселів за віссю X" -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2601 msgid "Number of pixels in Y" -msgstr "" +msgstr "Кількість пікселів за віссю Y" + +#: src/libslic3r/PrintConfig.cpp:2606 +msgid "Display horizontal mirroring" +msgstr "Горизонтальне віддзеркалення дисплея" + +#: src/libslic3r/PrintConfig.cpp:2607 +msgid "Mirror horizontally" +msgstr "Віддзеркалити горизонтально" + +#: src/libslic3r/PrintConfig.cpp:2608 +msgid "Enable horizontal mirroring of output images" +msgstr "Увімкнути горизонтальне віддзеркалення вихідних зображень" + +#: src/libslic3r/PrintConfig.cpp:2613 +msgid "Display vertical mirroring" +msgstr "Вертикальне віддзеркалення дисплея" + +#: src/libslic3r/PrintConfig.cpp:2614 +msgid "Mirror vertically" +msgstr "Віддзеркалити вертикально" + +#: src/libslic3r/PrintConfig.cpp:2615 +msgid "Enable vertical mirroring of output images" +msgstr "Увімкнути вертикальне віддзеркалення вихідних зображень" -#: src/libslic3r/PrintConfig.cpp:2225 +#: src/libslic3r/PrintConfig.cpp:2620 msgid "Display orientation" -msgstr "" +msgstr "Орієнтація дисплея" -#: src/libslic3r/PrintConfig.cpp:2226 +#: src/libslic3r/PrintConfig.cpp:2621 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " "images will be rotated by 90 degrees." msgstr "" +"Встановіть фактичну орієнтацію LCD-дисплея всередині SLA принтера. " +"Портретний режим переверне значення параметрів ширини та висоти дисплея, а " +"вихідні зображення повернуть на 90 градусів." -#: src/libslic3r/PrintConfig.cpp:2232 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Landscape" -msgstr "" +msgstr "Альбомна" -#: src/libslic3r/PrintConfig.cpp:2233 +#: src/libslic3r/PrintConfig.cpp:2628 msgid "Portrait" -msgstr "" +msgstr "Книжкова" -#: src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2633 msgid "Fast" -msgstr "" +msgstr "Швидкий" -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2634 msgid "Fast tilt" -msgstr "" +msgstr "Швидкий нахил" -#: src/libslic3r/PrintConfig.cpp:2240 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "Time of the fast tilt" -msgstr "" +msgstr "Час швидкого нахилу" -#: src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2642 msgid "Slow" -msgstr "" +msgstr "Повільний" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Slow tilt" -msgstr "" +msgstr "Повільний нахил" -#: src/libslic3r/PrintConfig.cpp:2249 +#: src/libslic3r/PrintConfig.cpp:2644 msgid "Time of the slow tilt" -msgstr "" +msgstr "Час повільного нахилу" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2651 msgid "Area fill" -msgstr "" +msgstr "Заповнена область" -#: src/libslic3r/PrintConfig.cpp:2257 +#: src/libslic3r/PrintConfig.cpp:2652 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 "" +"Відсоток площі столу.\n" +"Якщо область друку перевищує вказане значення,\n" +"тоді буде використовуватися повільний нахил, інакше - швидкий нахил" -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2265 -#: src/libslic3r/PrintConfig.cpp:2266 +#: src/libslic3r/PrintConfig.cpp:2659 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "Printer scaling correction" -msgstr "" +msgstr "Корекція масштабування принтера" -#: src/libslic3r/PrintConfig.cpp:2272 src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2667 src/libslic3r/PrintConfig.cpp:2668 msgid "Printer absolute correction" -msgstr "" +msgstr "Абсолютна корекція принтера" -#: src/libslic3r/PrintConfig.cpp:2274 +#: src/libslic3r/PrintConfig.cpp:2669 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." +msgstr "Надує або спустить нарізані 2D-полігони відповідно до знака корекції." + +#: src/libslic3r/PrintConfig.cpp:2675 +msgid "Elephant foot minimum width" +msgstr "Мінімальна ширина слонової стопи" + +#: src/libslic3r/PrintConfig.cpp:2677 +msgid "" +"Minimum width of features to maintain when doing elephant foot compensation." msgstr "" +"Мінімальна ширина частей, яку слід підтримувати, виконуючи компенсацію стопи " +"слона." -#: src/libslic3r/PrintConfig.cpp:2280 src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685 msgid "Printer gamma correction" -msgstr "" +msgstr "Гамма - корекція принтера" -#: src/libslic3r/PrintConfig.cpp:2282 -msgid "This will apply a gamm correction to the rasterized 2D polygons." +#: src/libslic3r/PrintConfig.cpp:2686 +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." msgstr "" +"Це застосує гамма-корекцію до растеризованих 2D-полігонів. Нульове значення " +"гамми означає порогове значення з порогом посередині. Така поведінка усуває " +"згладжування, не втрачаючи дірок у полігонах." + +#: src/libslic3r/PrintConfig.cpp:2698 src/libslic3r/PrintConfig.cpp:2699 +msgid "SLA material type" +msgstr "Тип SLA-матеріалу" -#: src/libslic3r/PrintConfig.cpp:2291 src/libslic3r/PrintConfig.cpp:2292 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2711 msgid "Initial layer height" -msgstr "" +msgstr "Висота першого шару" + +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2718 +msgid "Bottle volume" +msgstr "Об’єм пляшки" + +#: src/libslic3r/PrintConfig.cpp:2719 +msgid "ml" +msgstr "мл" + +#: src/libslic3r/PrintConfig.cpp:2724 src/libslic3r/PrintConfig.cpp:2725 +msgid "Bottle weight" +msgstr "Вага пляшки" + +#: src/libslic3r/PrintConfig.cpp:2726 +msgid "kg" +msgstr "кг" -#: src/libslic3r/PrintConfig.cpp:2298 +#: src/libslic3r/PrintConfig.cpp:2733 +msgid "g/ml" +msgstr "г/мл" + +#: src/libslic3r/PrintConfig.cpp:2740 +msgid "money/bottle" +msgstr "грошових одиниць/пляшку" + +#: src/libslic3r/PrintConfig.cpp:2745 msgid "Faded layers" -msgstr "" +msgstr "Шари початкового контакту" -#: src/libslic3r/PrintConfig.cpp:2299 +#: src/libslic3r/PrintConfig.cpp:2746 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "" +"Кількість шарів, необхідних для часу експозиції, зменшується від початкового " +"часу експозиції до часу експозиції" + +#: src/libslic3r/PrintConfig.cpp:2753 src/libslic3r/PrintConfig.cpp:2754 +msgid "Minimum exposure time" +msgstr "Мінімальний час експозиції" -#: src/libslic3r/PrintConfig.cpp:2306 src/libslic3r/PrintConfig.cpp:2307 +#: src/libslic3r/PrintConfig.cpp:2761 src/libslic3r/PrintConfig.cpp:2762 +msgid "Maximum exposure time" +msgstr "Максимальний час експозиції" + +#: src/libslic3r/PrintConfig.cpp:2769 src/libslic3r/PrintConfig.cpp:2770 msgid "Exposure time" -msgstr "" +msgstr "Час експозиції" + +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2777 +msgid "Minimum initial exposure time" +msgstr "Мінімальний час початкової експозиції" + +#: src/libslic3r/PrintConfig.cpp:2784 src/libslic3r/PrintConfig.cpp:2785 +msgid "Maximum initial exposure time" +msgstr "Максимальний час початкової експозиції" -#: src/libslic3r/PrintConfig.cpp:2313 src/libslic3r/PrintConfig.cpp:2314 +#: src/libslic3r/PrintConfig.cpp:2792 src/libslic3r/PrintConfig.cpp:2793 msgid "Initial exposure time" -msgstr "" +msgstr "Час початкової експозиції" -#: src/libslic3r/PrintConfig.cpp:2320 src/libslic3r/PrintConfig.cpp:2321 +#: src/libslic3r/PrintConfig.cpp:2799 src/libslic3r/PrintConfig.cpp:2800 msgid "Correction for expansion" -msgstr "" +msgstr "Поправка на розширення" -#: src/libslic3r/PrintConfig.cpp:2327 +#: src/libslic3r/PrintConfig.cpp:2806 msgid "SLA print material notes" -msgstr "" +msgstr "Примітки до друкованих SLA-матеріалів" -#: src/libslic3r/PrintConfig.cpp:2328 +#: src/libslic3r/PrintConfig.cpp:2807 msgid "You can put your notes regarding the SLA print material here." -msgstr "" +msgstr "Тут ви можете помістити свої нотатки щодо SLA-матеріалу." -#: src/libslic3r/PrintConfig.cpp:2336 src/libslic3r/PrintConfig.cpp:2347 +#: src/libslic3r/PrintConfig.cpp:2819 src/libslic3r/PrintConfig.cpp:2830 msgid "Default SLA material profile" -msgstr "" +msgstr "Профіль SLA-матеріалу за замовчанням" -#: src/libslic3r/PrintConfig.cpp:2358 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "Generate supports" -msgstr "" +msgstr "Генерувати підтримки" -#: src/libslic3r/PrintConfig.cpp:2360 +#: src/libslic3r/PrintConfig.cpp:2843 msgid "Generate supports for the models" -msgstr "" +msgstr "Генерувати підтримки для моделей" -#: src/libslic3r/PrintConfig.cpp:2365 -msgid "Support head front diameter" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:2848 +msgid "Pinhead front diameter" +msgstr "Діаметр головки стовпа" -#: src/libslic3r/PrintConfig.cpp:2367 +#: src/libslic3r/PrintConfig.cpp:2850 msgid "Diameter of the pointing side of the head" -msgstr "" +msgstr "Діаметр носику головки" -#: src/libslic3r/PrintConfig.cpp:2374 -msgid "Support head penetration" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:2857 +msgid "Head penetration" +msgstr "Проникнення головки" -#: src/libslic3r/PrintConfig.cpp:2376 +#: src/libslic3r/PrintConfig.cpp:2859 msgid "How much the pinhead has to penetrate the model surface" -msgstr "" +msgstr "На скільки носики повинні проникати в поверхню моделі" -#: src/libslic3r/PrintConfig.cpp:2383 -msgid "Support head width" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:2866 +msgid "Pinhead width" +msgstr "Ширина головки стовпа" -#: src/libslic3r/PrintConfig.cpp:2385 +#: src/libslic3r/PrintConfig.cpp:2868 msgid "Width from the back sphere center to the front sphere center" -msgstr "" +msgstr "Ширина від центру задньої кулі до передньої кулі" -#: src/libslic3r/PrintConfig.cpp:2393 -msgid "Support pillar diameter" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:2876 +msgid "Pillar diameter" +msgstr "Діаметр стовпів" -#: src/libslic3r/PrintConfig.cpp:2395 +#: src/libslic3r/PrintConfig.cpp:2878 msgid "Diameter in mm of the support pillars" +msgstr "Діаметр стовпів підтримки у мм" + +#: src/libslic3r/PrintConfig.cpp:2886 +msgid "Small pillar diameter percent" +msgstr "Процентний діаметр малих стовпів" + +#: src/libslic3r/PrintConfig.cpp:2888 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." msgstr "" +"Відсоток менших стовпів порівняно з нормальним діаметром стовпа, які " +"використовуються в проблемних зонах, де нормальний стовп не може поміститися." -#: src/libslic3r/PrintConfig.cpp:2403 -msgid "Support pillar connection mode" +#: src/libslic3r/PrintConfig.cpp:2897 +msgid "Max bridges on a pillar" +msgstr "Макс. мостів на стовпі" + +#: src/libslic3r/PrintConfig.cpp:2899 +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:2404 +#: src/libslic3r/PrintConfig.cpp:2907 +msgid "Pillar connection mode" +msgstr "Режим з'єднання стовпів" + +#: src/libslic3r/PrintConfig.cpp:2908 msgid "" -"Controls the bridge type between two neigboring pillars. Can be zig-zag, " +"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:2412 +#: src/libslic3r/PrintConfig.cpp:2916 msgid "Zig-Zag" -msgstr "" +msgstr "Зіг-Заг" -#: src/libslic3r/PrintConfig.cpp:2413 +#: src/libslic3r/PrintConfig.cpp:2917 msgid "Cross" -msgstr "" +msgstr "Перехресний" -#: src/libslic3r/PrintConfig.cpp:2414 +#: src/libslic3r/PrintConfig.cpp:2918 msgid "Dynamic" -msgstr "" +msgstr "Динамічний" -#: src/libslic3r/PrintConfig.cpp:2426 +#: src/libslic3r/PrintConfig.cpp:2930 msgid "Pillar widening factor" -msgstr "" +msgstr "Коефіцієнт розширення стовпа" -#: src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2932 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:2437 +#: src/libslic3r/PrintConfig.cpp:2941 msgid "Support base diameter" -msgstr "" +msgstr "Діаметр основи підтримки" -#: src/libslic3r/PrintConfig.cpp:2439 +#: src/libslic3r/PrintConfig.cpp:2943 msgid "Diameter in mm of the pillar base" -msgstr "" +msgstr "Діаметр основи стовпа у мм" -#: src/libslic3r/PrintConfig.cpp:2447 +#: src/libslic3r/PrintConfig.cpp:2951 msgid "Support base height" -msgstr "" +msgstr "Висота основи підтримки" -#: src/libslic3r/PrintConfig.cpp:2449 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "The height of the pillar base cone" +msgstr "Висота конуса основи стовпа" + +#: src/libslic3r/PrintConfig.cpp:2960 +msgid "Support base safety distance" +msgstr "Безпечна відстань між основами підтримки" + +#: src/libslic3r/PrintConfig.cpp:2963 +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:2456 +#: src/libslic3r/PrintConfig.cpp:2973 msgid "Critical angle" -msgstr "" +msgstr "Критичний кут" -#: src/libslic3r/PrintConfig.cpp:2458 +#: src/libslic3r/PrintConfig.cpp:2975 msgid "The default angle for connecting support sticks and junctions." -msgstr "" +msgstr "Кут за замовчуванням для з'єднання опорних палочок і з'єднань." -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2983 msgid "Max bridge length" -msgstr "" +msgstr "Максимальна довжина мосту" -#: src/libslic3r/PrintConfig.cpp:2468 +#: src/libslic3r/PrintConfig.cpp:2985 msgid "The max length of a bridge" -msgstr "" +msgstr "Максимальна довжина мосту" -#: src/libslic3r/PrintConfig.cpp:2475 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "Max pillar linking distance" -msgstr "" +msgstr "Макс. відстань між стовпами" -#: src/libslic3r/PrintConfig.cpp:2477 +#: src/libslic3r/PrintConfig.cpp:2994 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:2485 -msgid "Object elevation" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2487 -msgid "How much the supports should lift up the supported object." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2495 -msgid "Support points density" +#: src/libslic3r/PrintConfig.cpp:3004 +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:2497 +#: src/libslic3r/PrintConfig.cpp:3015 msgid "This is a relative measure of support points density." -msgstr "" +msgstr "Відносний показних щільності точок підтримки." -#: src/libslic3r/PrintConfig.cpp:2503 +#: src/libslic3r/PrintConfig.cpp:3021 msgid "Minimal distance of the support points" -msgstr "" +msgstr "Мінімальна відстань опорних точок" -#: src/libslic3r/PrintConfig.cpp:2505 +#: src/libslic3r/PrintConfig.cpp:3023 msgid "No support points will be placed closer than this threshold." -msgstr "" +msgstr "Жодні точки підтримки не будуть розміщені ближче цього порогу." -#: src/libslic3r/PrintConfig.cpp:2511 +#: src/libslic3r/PrintConfig.cpp:3029 msgid "Use pad" -msgstr "" +msgstr "Використовувати полушку" -#: src/libslic3r/PrintConfig.cpp:2513 +#: src/libslic3r/PrintConfig.cpp:3031 msgid "Add a pad underneath the supported model" -msgstr "" +msgstr "Додати подушечку під підтримувану модель" -#: src/libslic3r/PrintConfig.cpp:2518 +#: src/libslic3r/PrintConfig.cpp:3036 msgid "Pad wall thickness" -msgstr "" +msgstr "Товщина стінки подушки" -#: src/libslic3r/PrintConfig.cpp:2520 +#: src/libslic3r/PrintConfig.cpp:3038 msgid "The thickness of the pad and its optional cavity walls." -msgstr "" +msgstr "Товщина подушки та її додаткових стінок порожнини." -#: src/libslic3r/PrintConfig.cpp:2528 +#: src/libslic3r/PrintConfig.cpp:3046 msgid "Pad wall height" -msgstr "" +msgstr "Висота стінки подушки" -#: src/libslic3r/PrintConfig.cpp:2529 -msgid "Defines the cavity depth. Set to zero to disable the cavity." +#: src/libslic3r/PrintConfig.cpp:3047 +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 " +"effect inside the cavity, which makes peeling the print off the vat foil " +"difficult." msgstr "" +"Визначає глибину порожнини подушечки. Встановіть нуль, щоб вимкнути " +"порожнину. Будьте обережні, включаючи цю функцію, оскільки деякі смоли " +"можуть мати надзвичайний ефект всмоктування всередині порожнини, що " +"ускладнює відшарування відбитка з фольги." + +#: src/libslic3r/PrintConfig.cpp:3060 +msgid "Pad brim size" +msgstr "Розмір краю подушки" + +#: src/libslic3r/PrintConfig.cpp:3061 +msgid "How far should the pad extend around the contained geometry" +msgstr "Як далеко повинна розширюватися подушка навколо вміщуваної геометрії" -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:3071 msgid "Max merge distance" -msgstr "" +msgstr "Макс. відстань об'єднання" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:3073 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:2552 -msgid "Pad edge radius" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:3093 msgid "Pad wall slope" -msgstr "" +msgstr "Нахил стінки подушки" -#: src/libslic3r/PrintConfig.cpp:2563 +#: src/libslic3r/PrintConfig.cpp:3095 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" +"Нахил стінки подушки відносно площини столу. 90 градусів означає прямі стіни." + +#: src/libslic3r/PrintConfig.cpp:3106 +msgid "Create pad around object and ignore the support elevation" +msgstr "Створити подушку навколо об’єкта та ігнорувати підняття підтримки" -#: src/libslic3r/PrintConfig.cpp:2924 -msgid "Export SVG" +#: src/libslic3r/PrintConfig.cpp:3111 +msgid "Pad around object everywhere" +msgstr "Подушка скрізь навколо об’єкта" + +#: src/libslic3r/PrintConfig.cpp:3113 +msgid "Force pad around object everywhere" +msgstr "Створити подушку навколо об’єкта" + +#: src/libslic3r/PrintConfig.cpp:3118 +msgid "Pad object gap" +msgstr "Розрив Подушка-Об'єкт" + +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "" +"The gap between the object bottom and the generated pad in zero elevation " +"mode." msgstr "" +"Розрив між дном об’єкта та генерованою подушкою в режимі нульового підняття." -#: src/libslic3r/PrintConfig.cpp:2925 -msgid "Export the model(s) as OBJ." +#: src/libslic3r/PrintConfig.cpp:3129 +msgid "Pad object connector stride" +msgstr "Крок з'єднувача Подушка-Об'єкт" + +#: src/libslic3r/PrintConfig.cpp:3131 +msgid "" +"Distance between two connector sticks which connect the object and the " +"generated pad." msgstr "" +"Відстань між двома з'єднувальними паличками, які з'єднують об'єкт та " +"генеровану подушку." -#: src/libslic3r/PrintConfig.cpp:2936 -msgid "Export SLA" +#: src/libslic3r/PrintConfig.cpp:3138 +msgid "Pad object connector width" +msgstr "Ширина з'єднувача Подушка-Об'єкт" + +#: src/libslic3r/PrintConfig.cpp:3140 +msgid "" +"Width of the connector sticks which connect the object and the generated pad." msgstr "" +"Ширина з'єднувальної паличками, що з'єднує об'єкт та генеровану подушку." -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Slice the model and export SLA printing layers as PNG." +#: src/libslic3r/PrintConfig.cpp:3147 +msgid "Pad object connector penetration" +msgstr "Глибина проникнення з'єднувача Подушка-Об'єкт" + +#: src/libslic3r/PrintConfig.cpp:3150 +msgid "How much should the tiny connectors penetrate into the model body." +msgstr "На скільки крихітні з'єднувачі повинні проникати в тіло моделі." + +#: src/libslic3r/PrintConfig.cpp:3157 +msgid "Enable hollowing" +msgstr "Увімкнути формування порожнин" + +#: src/libslic3r/PrintConfig.cpp:3159 +msgid "Hollow out a model to have an empty interior" +msgstr "Випорожнити модель, щоб мати порожній інтер’єр" + +#: src/libslic3r/PrintConfig.cpp:3164 +msgid "Wall thickness" +msgstr "Товщина стінки" + +#: src/libslic3r/PrintConfig.cpp:3166 +msgid "Minimum wall thickness of a hollowed model." +msgstr "Мінімальна товщина стінки порожнистої моделі." + +#: src/libslic3r/PrintConfig.cpp:3174 +msgid "Accuracy" +msgstr "Точність" + +#: src/libslic3r/PrintConfig.cpp:3176 +msgid "" +"Performance vs accuracy of calculation. Lower values may produce unwanted " +"artifacts." msgstr "" +"Продуктивність проти точності розрахунку. Менші значення можуть спричинити " +"небажані артефакти." -#: src/libslic3r/PrintConfig.cpp:2942 -msgid "Export 3MF" +#: src/libslic3r/PrintConfig.cpp:3186 +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 " +"inflated back to the specified offset. A greater closing distance makes the " +"interior more rounded. At zero, the interior will resemble the exterior the " +"most." msgstr "" +"Випорожнення виконується у два етапи: спочатку уявний інтер’єр обчислюється " +"глибше (зміщення плюс відстань закриття) в об’єкті, а потім він завищується " +"назад до заданого зміщення. Більша відстань до закриття робить інтер’єр " +"більш округлим. При нулі інтер’єр найбільше буде нагадувати екстер’єр." -#: src/libslic3r/PrintConfig.cpp:2943 +#: src/libslic3r/PrintConfig.cpp:3602 +msgid "Export OBJ" +msgstr "Експорт OBJ" + +#: src/libslic3r/PrintConfig.cpp:3603 +msgid "Export the model(s) as OBJ." +msgstr "Експорт моделі як OBJ." + +#: src/libslic3r/PrintConfig.cpp:3614 +msgid "Export SLA" +msgstr "Експорт SLA" + +#: src/libslic3r/PrintConfig.cpp:3615 +msgid "Slice the model and export SLA printing layers as PNG." +msgstr "Нарізати модель та експортувати шари SLA-друку до PNG." + +#: src/libslic3r/PrintConfig.cpp:3620 +msgid "Export 3MF" +msgstr "Експортувати 3MF" + +#: src/libslic3r/PrintConfig.cpp:3621 msgid "Export the model(s) as 3MF." -msgstr "" +msgstr "Експорт моделі як 3MF." -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3625 msgid "Export AMF" -msgstr "" +msgstr "Експортувати AMF" -#: src/libslic3r/PrintConfig.cpp:2948 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Export the model(s) as AMF." -msgstr "" +msgstr "Експорт моделі як АMF." -#: src/libslic3r/PrintConfig.cpp:2952 +#: src/libslic3r/PrintConfig.cpp:3630 msgid "Export STL" -msgstr "" +msgstr "Експорт STL" -#: src/libslic3r/PrintConfig.cpp:2953 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Export the model(s) as STL." -msgstr "" +msgstr "Експорт моделі як STL." -#: src/libslic3r/PrintConfig.cpp:2958 +#: src/libslic3r/PrintConfig.cpp:3636 msgid "Slice the model and export toolpaths as G-code." -msgstr "" +msgstr "Нарізати та експортувати G-код." -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3641 +msgid "G-code viewer" +msgstr "Переглядач G-коду" + +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Visualize an already sliced and saved G-code" +msgstr "Візуалізувати вже нарізаний та збережений G-код" + +#: src/libslic3r/PrintConfig.cpp:3647 msgid "Slice" -msgstr "" +msgstr "Нарізати" -#: src/libslic3r/PrintConfig.cpp:2964 +#: src/libslic3r/PrintConfig.cpp:3648 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" +"Нарізати модель як FFF або SLA на основі значення printer_technology, " +"зазначеного у конфігурації." -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3653 msgid "Help" msgstr "Допомога" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3654 msgid "Show this help." -msgstr "" +msgstr "Показати цю підказку." -#: src/libslic3r/PrintConfig.cpp:2975 +#: src/libslic3r/PrintConfig.cpp:3659 msgid "Help (FFF options)" -msgstr "" +msgstr "Допомога (FFF параметри)" -#: src/libslic3r/PrintConfig.cpp:2976 +#: src/libslic3r/PrintConfig.cpp:3660 msgid "Show the full list of print/G-code configuration options." -msgstr "" +msgstr "Показати повний список параметрів конфігурації друку / G-коду." -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3664 msgid "Help (SLA options)" -msgstr "" +msgstr "Допомога (SLA параметри)" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "Show the full list of SLA print configuration options." -msgstr "" +msgstr "Показати повний перелік параметрів конфігурації SLA-друку." -#: src/libslic3r/PrintConfig.cpp:2985 +#: src/libslic3r/PrintConfig.cpp:3669 msgid "Output Model Info" -msgstr "" +msgstr "Інформація про вихідну модель" -#: src/libslic3r/PrintConfig.cpp:2986 +#: src/libslic3r/PrintConfig.cpp:3670 msgid "Write information about the model to the console." -msgstr "" +msgstr "Писати інформацію про модель на консолі." -#: src/libslic3r/PrintConfig.cpp:2990 +#: src/libslic3r/PrintConfig.cpp:3674 msgid "Save config file" -msgstr "" +msgstr "Зберегти файл конфігурації" -#: src/libslic3r/PrintConfig.cpp:2991 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "Save configuration to the specified file." -msgstr "" +msgstr "Зберегти конфігурацію у вказаному файлі." -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3685 msgid "Align XY" -msgstr "" +msgstr "Вирівняти XY" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3686 msgid "Align the model to the given point." -msgstr "" +msgstr "Вирівняйте модель за заданою точкою." -#: src/libslic3r/PrintConfig.cpp:3007 +#: src/libslic3r/PrintConfig.cpp:3691 msgid "Cut model at the given Z." msgstr "Розрізати модель за заданим Z." -#: src/libslic3r/PrintConfig.cpp:3028 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Center" -msgstr "" +msgstr "Центр" -#: src/libslic3r/PrintConfig.cpp:3029 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "Center the print around the given center." -msgstr "" +msgstr "Відцентруйте друк навколо заданого центру." -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3717 msgid "Don't arrange" -msgstr "" +msgstr "Не впорядковувати" -#: src/libslic3r/PrintConfig.cpp:3034 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" +"Не переставляйте дані моделі перед об’єднанням та зберігайте їх початкові " +"координати XY." -#: src/libslic3r/PrintConfig.cpp:3037 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Duplicate" -msgstr "" +msgstr "Дублювати" -#: src/libslic3r/PrintConfig.cpp:3038 +#: src/libslic3r/PrintConfig.cpp:3722 msgid "Multiply copies by this factor." -msgstr "" +msgstr "Збільшить кількість копій на цей коефіцієнт." -#: src/libslic3r/PrintConfig.cpp:3042 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Duplicate by grid" -msgstr "" +msgstr "Дублювати за сіткою" -#: src/libslic3r/PrintConfig.cpp:3043 +#: src/libslic3r/PrintConfig.cpp:3727 msgid "Multiply copies by creating a grid." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3046 -msgid "Merge" -msgstr "" +msgstr "Збільшить кількість копій, створивши сітку." -#: src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3731 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:3052 +#: src/libslic3r/PrintConfig.cpp:3736 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:3056 +#: src/libslic3r/PrintConfig.cpp:3740 msgid "Rotation angle around the Z axis in degrees." -msgstr "" +msgstr "Кут обертання навколо осі Z у градусах." -#: src/libslic3r/PrintConfig.cpp:3060 +#: src/libslic3r/PrintConfig.cpp:3744 msgid "Rotate around X" -msgstr "" +msgstr "Обертати навколо осі X" -#: src/libslic3r/PrintConfig.cpp:3061 +#: src/libslic3r/PrintConfig.cpp:3745 msgid "Rotation angle around the X axis in degrees." -msgstr "" +msgstr "Кут обертання навколо осі Х у градусах." -#: src/libslic3r/PrintConfig.cpp:3065 +#: src/libslic3r/PrintConfig.cpp:3749 msgid "Rotate around Y" -msgstr "" +msgstr "Обертати навколо осі Y" -#: src/libslic3r/PrintConfig.cpp:3066 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Rotation angle around the Y axis in degrees." -msgstr "" +msgstr "Кут обертання навколо осі Y у градусах." -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3755 msgid "Scaling factor or percentage." -msgstr "" +msgstr "Коефіцієнт масштабування або відсоток." -#: src/libslic3r/PrintConfig.cpp:3076 +#: src/libslic3r/PrintConfig.cpp:3760 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" +"Визначити непоєднані частини у даній моделі (моделях) та розділити їх на " +"окремі об’єкти." -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3763 msgid "Scale to Fit" -msgstr "" +msgstr "Масштабувати під область друку" -#: src/libslic3r/PrintConfig.cpp:3080 +#: src/libslic3r/PrintConfig.cpp:3764 msgid "Scale to fit the given volume." -msgstr "" +msgstr "Масштабувати під задану область друку." -#: src/libslic3r/PrintConfig.cpp:3089 +#: src/libslic3r/PrintConfig.cpp:3773 msgid "Ignore non-existent config files" -msgstr "" +msgstr "Ігнорувати неіснуючі конфігураційні файли" -#: src/libslic3r/PrintConfig.cpp:3090 +#: src/libslic3r/PrintConfig.cpp:3774 msgid "Do not fail if a file supplied to --load does not exist." -msgstr "" +msgstr "Не відмовляти, якщо файл, який подається до --load, не існує." -#: src/libslic3r/PrintConfig.cpp:3093 +#: src/libslic3r/PrintConfig.cpp:3777 msgid "Load config file" -msgstr "" +msgstr "Завантажити файл конфігурації" -#: src/libslic3r/PrintConfig.cpp:3094 +#: src/libslic3r/PrintConfig.cpp:3778 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:3097 +#: src/libslic3r/PrintConfig.cpp:3781 msgid "Output File" -msgstr "" +msgstr "Вихідний файл" -#: src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:3782 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:3108 -msgid "Data directory" +#: src/libslic3r/PrintConfig.cpp:3786 +msgid "Single instance mode" +msgstr "Режим одного екземпляру PrusaSlicer" + +#: src/libslic3r/PrintConfig.cpp:3787 +msgid "" +"If enabled, the command line arguments are sent to an existing instance of " +"GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " +"the \"single_instance\" configuration value from application preferences." msgstr "" +"Якщо увімкнено, аргументи командного рядка надсилаються до існуючого " +"екземпляра графічного інтерфейсу PrusaSlicer, або ж активується існуюче " +"вікно PrusaSlicer. Замінює значення конфігурації \"single_instance\" у " +"налаштуваннях програми." + +#: src/libslic3r/PrintConfig.cpp:3798 +msgid "Data directory" +msgstr "Каталог даних" -#: src/libslic3r/PrintConfig.cpp:3109 +#: src/libslic3r/PrintConfig.cpp:3799 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:3112 +#: src/libslic3r/PrintConfig.cpp:3802 msgid "Logging level" -msgstr "" +msgstr "Рівень журналізації" -#: src/libslic3r/PrintConfig.cpp:3113 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "" -"Messages with severity lower or eqal to the loglevel will be printed out. 0:" -"trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" +"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 "" +"Встановлює чутливість журналювання. 0:fatal, 1:помилка, 2:попередження, 3:" +"info, 4:налагодження, 5:trace\n" +"Наприклад. loglevel=2 журнали фатальних, помилок і повідомлень рівня " +"попередження." -#: src/libslic3r/GCode/PreviewData.cpp:176 -msgid "Mixed" +#: src/libslic3r/PrintConfig.cpp:3809 +msgid "Render with a software renderer" +msgstr "Візуалізувати за допомогою програмного засобу візуалізації" + +#: src/libslic3r/PrintConfig.cpp:3810 +msgid "" +"Render with a software renderer. The bundled MESA software renderer is " +"loaded instead of the default OpenGL driver." msgstr "" +"Візуалізувати за допомогою програмного засобу візуалізації. Комплектний " +"візуалізатор програмного забезпечення MESA завантажується замість драйвера " +"OpenGL за замовчуванням." -#: src/libslic3r/GCode/PreviewData.cpp:396 -msgid "Height (mm)" -msgstr "Висота (мм)" +#: src/libslic3r/Zipper.cpp:27 +msgid "Error with zip archive" +msgstr "Помилка ZIP-архіву" -#: src/libslic3r/GCode/PreviewData.cpp:398 -msgid "Width (mm)" -msgstr "Ширина (мм)" +#: src/libslic3r/PrintObject.cpp:112 +msgid "Processing triangulated mesh" +msgstr "Обробка триангульованої сітки" -#: src/libslic3r/GCode/PreviewData.cpp:400 -msgid "Speed (mm/s)" -msgstr "Швидкість (мм/с)" +#: src/libslic3r/PrintObject.cpp:157 +msgid "Generating perimeters" +msgstr "Створення периметрів" -#: src/libslic3r/GCode/PreviewData.cpp:402 -msgid "Volumetric flow rate (mm3/s)" -msgstr "" +#: src/libslic3r/PrintObject.cpp:260 +msgid "Preparing infill" +msgstr "Підготовка заповнення" -#: src/libslic3r/GCode/PreviewData.cpp:491 -msgid "Default print color" -msgstr "" +#: src/libslic3r/PrintObject.cpp:421 +msgid "Generating support material" +msgstr "Створення підтримок" -#: src/libslic3r/GCode/PreviewData.cpp:495 -#, c-format -msgid "up to %.2f mm" -msgstr "" +#~ msgid "About Slic3r" +#~ msgstr "Про Slic3r" -#: src/libslic3r/GCode/PreviewData.cpp:499 -#, c-format -msgid "above %.2f mm" -msgstr "" +#~ msgid "Choose a file to import bed shape from (STL/OBJ/AMF/3MF/PRUSA):" +#~ msgstr "Виберіть файл, щоб імпортувати форму полотна з (STL/OBJ/AMF/PRUSA):" -#: src/libslic3r/GCode/PreviewData.cpp:504 -#, c-format -msgid "%.2f - %.2f mm" -msgstr "" +#~ msgid "Error! " +#~ msgstr "Помилка! " + +#~ msgid "slic3r version" +#~ msgstr "версія slic3r" + +#~ msgid "min slic3r version" +#~ msgstr "мінімальна версія slic3r" + +#~ msgid "max slic3r version" +#~ msgstr "максимальна версія slic3r" + +#~ msgid "Welcome to the Slic3r %s" +#~ msgstr "Ласкаво просимо до Slic3r %s" + +#~ msgid "Cut object:" +#~ msgstr "Розрізати об'єкт:" + +#~ msgid "Left mouse click - add point" +#~ msgstr "Ліва кнопка миші - додати точку" + +#~ msgid "Right mouse click - remove point" +#~ msgstr "Права кнопка миші - видалити точку" + +#~ msgid "SLA Support Points [L]" +#~ msgstr "Точки SLA підтримки [L]" + +#~ msgid "Array of language names and identifiers should have the same size." +#~ msgstr "Масив імен мов та їх ідентифікаторів має бути однакового розміру." + +#~ msgid "Slic3r View Mode" +#~ msgstr "Режим перегляду Slic3r'у" + +#~ msgid "Change Application &Language" +#~ msgstr "Змінити &мову застосування" + +#~ msgid "Application will be restarted after language change." +#~ msgstr "Застосування буде перезапущене після зміни мови." + +#~ msgid "You have unsaved changes " +#~ msgstr "У вас є незбережені зміни " + +#~ msgid ". Discard changes and continue anyway?" +#~ msgstr ". Відхилити зміни і продовжити в будь-якому випадку?" + +#~ msgid "Unsaved Presets" +#~ msgstr "Незбереженні налаштування" + +#~ msgid "Unretractions" +#~ msgstr "Непереривання" + +#~ msgid "Delete All" +#~ msgstr "Видалити все" + +#~ msgid "" +#~ " - Remember to check for updates at http://github.com/prusa3d/slic3r/" +#~ "releases" +#~ msgstr "" +#~ " - Пам'ятайте оновлювати з http://github.com/prusa3d/slic3r/releases" + +#~ msgid "Quit Slic3r" +#~ msgstr "Вийти зі Slic3r" + +#~ msgid "Open the Prusa Edition releases page in your browser" +#~ msgstr "Відкрити сторінку релізів Prusa Edition у своєму браузері" + +#~ msgid "Slic3r &Website" +#~ msgstr "Веб-сайт Slic3r" + +#~ msgid "Open the Slic3r website in your browser" +#~ msgstr "Відкрити сторінку Slic3r у своєму браузері" + +#~ msgid "Slic3r &Manual" +#~ msgstr "Посібник до Slic3r" + +#~ msgid "Open the Slic3r manual in your browser" +#~ msgstr "Відкрити сторінку посібнику до Slic3r у своєму браузері" + +#~ msgid "Report an issue on the Slic3r Prusa Edition" +#~ msgstr "Повідомити про проблему на Slic3r Prusa Edition" + +#~ msgid "&About Slic3r" +#~ msgstr "&Про Slic3r" + +#~ msgid "Save " +#~ msgstr "Зберегти " + +#~ msgid " file as:" +#~ msgstr " файл як:" + +#~ msgid "Processing " +#~ msgstr "Обробка " + +#~ msgid " was successfully sliced." +#~ msgstr " був успішно нарізаний." + +#~ msgid "" +#~ "This file contains several objects positioned at multiple heights. " +#~ "Instead of considering them as multiple objects, should I consider\n" +#~ "this file as a single object having multiple parts?\n" +#~ msgstr "" +#~ "Цей файл містить кілька об'єктів, розташованих на декількох висотах. " +#~ "Замість того, щоб розглядати їх як кілька об'єктів, чи потрібно " +#~ "розглянути\n" +#~ "цей файл як єдиний об'єкт, що має декілька частин?\n" + +#~ 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?\n" +#~ msgstr "" +#~ "До мульти-матеріального принтеру завантажено кілька об'єктів.\n" +#~ "Замість того, щоб розглядати їх як кілька об'єктів, чи потрібно " +#~ "розглянути\n" +#~ "ці файл як єдиний об'єкт, що має декілька частин?\n" + +#~ msgid "Export failed" +#~ msgstr "Експортувати не вдалося" + +#~ msgid "Increase copies" +#~ msgstr "Збільшити копії" + +#~ msgid "Place one more copy of the selected object" +#~ msgstr "Розташувати ще одну копію обраного об'єкта" + +#~ msgid "Decrease copies" +#~ msgstr "Зменшити копії" + +#~ msgid "Remove one copy of the selected object" +#~ msgstr "Вилучіть одну копію обраного об'єкта" + +#~ msgid "Change the number of copies of the selected object" +#~ msgstr "Змінити кількість копій обраного об'єкта" + +#~ msgid "Reload from Disk" +#~ msgstr "Перезавантажити з диска" + +#~ msgid "Reload the selected file from Disk" +#~ msgstr "Перезавантажити вибраний файл із диска" + +#~ msgid "Use legacy OpenGL 1.1 rendering" +#~ msgstr "Використовувати застарілий OpenGL 1.1 рендеринг" + +#~ msgid "" +#~ "If you have rendering issues caused by a buggy OpenGL 2.0 driver, you may " +#~ "try to check this checkbox. This will disable the layer height editing " +#~ "and anti aliasing, so it is likely better to upgrade your graphics driver." +#~ msgstr "" +#~ "Якщо у вас виникають проблеми з візуалізацією, спричинені помилковим " +#~ "драйвером OpenGL 2.0, спробуйте вибрати цю опцію. Це призведе до " +#~ "вимкнення редагування висоти шару та згладжування, тому краще оновити " +#~ "графічний драйвер." + +#~ msgid "You need to restart Slic3r to make the changes effective." +#~ msgstr "З метою ефективності зміни, Вам потрібно буде перезапустити Slic3r." + +#~ msgid "" +#~ "If estimated layer time is below ~%ds, fan will run at %d%% and print " +#~ "speed will be reduced so that no less than %ds are spent on that layer " +#~ "(however, speed will never be reduced below %dmm/s)." +#~ msgstr "" +#~ "Якщо запланований час друку шару нижче ~%dс, вентилятор буде працювати на" +#~ "%d%%, і швидкість друку буде зменшена, так що на цей шар витрачається не " +#~ "менше %dс (однак швидкість ніколи не зменшиться нижче %d mm/s) ." + +#~ msgid "" +#~ "\n" +#~ "If estimated layer time is greater, but still below ~%ds, fan will run at " +#~ "a proportionally decreasing speed between %d%% and %d%%." +#~ msgstr "" +#~ "\n" +#~ "Якщо запланований час друку шару більше, але все ще нижче ~%dс, " +#~ "вентилятор буде працювати з пропорційно зменшуваною швидкістю між %d%% та " +#~ "%d%%." + +#~ msgid "" +#~ "\n" +#~ "During the other layers, fan " +#~ msgstr "" +#~ "\n" +#~ "Під час друку інших шарів вентилятор " + +#~ msgid "Fan " +#~ msgstr "Вентилятор " + +#~ msgid "will always run at %d%% " +#~ msgstr "буде завжди працювати на %d%% " + +#~ msgid "except for the first %d layers" +#~ msgstr "за винятком перших %d шарів" + +#~ msgid "except for the first layer" +#~ msgstr "за винятком першого шару" + +#~ msgid "will be turned off." +#~ msgstr "буде вимкнено." + +#~ msgid " flow rate is maximized " +#~ msgstr " швидкість потоку максимізується " + +#~ msgid "when printing " +#~ msgstr "коли друкуємо " + +#~ msgid " with a volumetric rate " +#~ msgstr " з об'ємною швидкістю " + +#~ msgid "%3.2f mm³/s" +#~ msgstr "%3.2f мм³/с" + +#~ msgid " at filament speed %3.2f mm/s." +#~ msgstr " при швидкості філаменту %3.2f мм/с." + +#~ msgid "Recommended object thin wall thickness for layer height %.2f and " +#~ msgstr "Рекомендована товщина стінки для висоти шару %.2f та " + +#~ msgid "%d lines: %.2lf mm" +#~ msgstr "%d рядків: %.2lf мм" + +#~ msgid "Save current " +#~ msgstr "Зберегти поточний " + +#~ msgid "Extruder clearance (mm)" +#~ msgstr "Розмір екструдера (мм)" + +#~ msgid "" +#~ "The Spiral Vase mode requires:\n" +#~ "- one perimeter\n" +#~ "- no top solid layers\n" +#~ "- 0% fill density\n" +#~ "- no support material\n" +#~ "- no ensure_vertical_shell_thickness\n" +#~ "\n" +#~ "Shall I adjust those settings in order to enable Spiral Vase?" +#~ msgstr "" +#~ "Режим спіральної вази вимагає:\n" +#~ "- один периметр\n" +#~ "- немає верхніх щільних шарів\n" +#~ "- 0% щільність заповнення\n" +#~ "- немає підтримуючого матеріалу\n" +#~ "- не забезпечує товщини вертикальної оболонки\n" +#~ "\n" +#~ "Чи потрібно змінити ці налаштування, щоб увімкнути режим Спіральної вази?" + +#~ 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).\n" +#~ "\n" +#~ "Shall I adjust those settings in order to enable the Wipe Tower?" +#~ msgstr "" +#~ "Вичіщуюча веж в даний час підтримує лише нерозчинну підтримку\n" +#~ "якщо вони друкуються з поточним екструдером, не запускаючи зміну " +#~ "інструменту.\n" +#~ "(обидва значення support_material_extruder і " +#~ "support_material_interface_extruder повинні бути встановлені на 0).\n" +#~ "\n" +#~ "Чи потрібно коригувати ці налаштування, щоб увімкнути вичіщуючу веж?" + +#~ msgid "" +#~ "For the Wipe Tower to work with the soluble supports, the support layers\n" +#~ "need to be synchronized with the object layers.\n" +#~ "\n" +#~ "Shall I synchronize support layers in order to enable the Wipe Tower?" +#~ msgstr "" +#~ "Для того, щоб Вичіщуюча веж працювала з розчинними підтримками, шари " +#~ "підтримки\n" +#~ "повинні бути синхронізовані з шаром об'єкта.\n" +#~ "\n" +#~ "Чи потрібно синхронізувати шари підтримки, щоб увімкнути вичіщуючу веж?" + +#~ msgid "" +#~ "Supports work better, if the following feature is enabled:\n" +#~ "- Detect bridging perimeters\n" +#~ "\n" +#~ "Shall I adjust those settings for supports?" +#~ msgstr "" +#~ "Підтримка працює краще, якщо ввімкнено таку функцію:\n" +#~ "- Виявлення висячих периметрів(перемичок)\n" +#~ "\n" +#~ "Чи потрібно змінити ці налаштування для підтримки?" + +#~ msgid "The " +#~ msgstr "Шаблон наповнення " + +#~ msgid "" +#~ " infill pattern is not supposed to work at 100%% density.\n" +#~ "\n" +#~ "Shall I switch to rectilinear fill pattern?" +#~ msgstr "" +#~ " не підтримується на 100% щільності.\n" +#~ "\n" +#~ "Чи потрібно змінити його на Rectilinear шаблон заповнення?" + +#~ msgid "Temperature " +#~ msgstr "Температура " + +#~ msgid " Browse " +#~ msgstr " Переглянути " + +#~ msgid " Set " +#~ msgstr " Встановити " + +#~ msgid "USB/Serial connection" +#~ msgstr "USB/послідовне з'єднання" + +#~ msgid "Serial port" +#~ msgstr "Послідовний порт" + +#~ msgid "Rescan serial ports" +#~ msgstr "Сканувати ще раз послідовні порти" + +#~ msgid "Connection to printer works correctly." +#~ msgstr "Підключення до принтера працює коректно." + +#~ msgid "Connection failed." +#~ msgstr "Підключення не вдалося." + +#~ msgid "Unsaved Changes" +#~ msgstr "Незбережені зміни" + +#~ msgid "Are you sure you want to " +#~ msgstr "Ви впевнені, що хочете " + +#~ msgid " the selected preset?" +#~ msgstr " вибране налаштування?" + +#~ msgid " Preset" +#~ msgstr " Налаштування" + +#~ msgid " as:" +#~ msgstr " як:" + +#~ msgid "" +#~ "When printing multi-material objects, this settings will make slic3r to " +#~ "clip the overlapping object parts one by the other (2nd part will be " +#~ "clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)." +#~ msgstr "" +#~ "Під час друку багатоматеріальних об'єктів ці налаштування змушують slic3r " +#~ "обрізати частини, що перекриваються один одною (друга частина буде " +#~ "обрізана першою, третя - першою та другою, тощо)." + +#~ msgid "" +#~ "This end procedure is inserted at the end of the output file. Note that " +#~ "you can use placeholder variables for all Slic3r settings." +#~ msgstr "" +#~ "Ця кінцева процедура вставляється в кінці вихідного файлу. Зауважте, що " +#~ "ви можете використовувати заповнювачі змінних для всіх параметрів Slic3r." + +#~ msgid "" +#~ "This end procedure is inserted at the end of the output file, before the " +#~ "printer end gcode. Note that you can use placeholder variables for all " +#~ "Slic3r settings. If you have multiple extruders, the gcode is processed " +#~ "in extruder order." +#~ msgstr "" +#~ "Ця кінцева процедура вставляється в кінці вихідного файлу перед кінцевим " +#~ "кодом принтера. Зауважте, що ви можете використовувати заповнювачі " +#~ "змінних для всіх параметрів Slic3r. Якщо у вас є кілька екструдерів, G-" +#~ "code обробляється в порядку екструдерів." + +#~ msgid "mm or % (leave 0 for default)" +#~ msgstr "мм або % (залиште 0 за замовчанням)" + +#~ msgid "mm or % (leave 0 for auto)" +#~ msgstr "мм або % (залиште 0 для автообчислення)" + +#~ msgid "" +#~ "Extruder temperature for first layer. If you want to control temperature " +#~ "manually during print, set this to zero to disable temperature control " +#~ "commands in the output file." +#~ msgstr "" +#~ "Температура екструдеру для першого шару. Якщо ви хочете контролювати " +#~ "температуру вручну під час друку, встановіть 0, щоб вимкнути команди " +#~ "керування температурою у вихідному файлі." + +#~ msgid "" +#~ "Some G/M-code commands, including temperature control and others, are not " +#~ "universal. Set this option to your printer's firmware to get a compatible " +#~ "output. The \"No extrusion\" flavor prevents Slic3r from exporting any " +#~ "extrusion value at all." +#~ msgstr "" +#~ "Деякі команди G/M-коду, включаючи контроль температури тощо, не є " +#~ "універсальними. Установіть цей параметр на прошивку принтера, щоб " +#~ "отримати сумісний вихід. \"Відсутність екструзії\" не дозволяє Slic3r " +#~ "експортувати будь-яке значення екструзії." + +#~ msgid "" +#~ "This is the acceleration your printer will use for perimeters. A high " +#~ "value like 9000 usually gives good results if your hardware is up to the " +#~ "job. Set zero to disable acceleration control for perimeters." +#~ msgstr "" +#~ "Це прискорення, яке ваш принтер використовуватиме для периметрів. Висока " +#~ "значення, таке як 9000, зазвичай дає хороші результати, якщо ваше " +#~ "апаратне забезпечення відповідає завданню. Встановити 0, щоб вимкнути " +#~ "регулятор прискорення для периметрів." + +#~ msgid "USB/serial port for printer connection." +#~ msgstr "USB / послідовний порт для підключення принтера." + +#~ msgid "Serial port speed" +#~ msgstr "Швидкість послідовного порту" + +#~ msgid "Speed (baud) of USB/serial port for printer connection." +#~ msgstr "Швидкість (бод) USB / послідовного порту для підключення принтера." + +#~ msgid "" +#~ "This feature will raise Z gradually while printing a single-walled object " +#~ "in order to remove any visible seam. This option requires a single " +#~ "perimeter, no infill, no top solid layers and no support material. You " +#~ "can still set any number of bottom solid layers as well as skirt/brim " +#~ "loops. It won't work when printing more than an object." +#~ msgstr "" +#~ "Ця функція буде поступово підвищувати Z протягом друку одного-стінного " +#~ "об'єкта для уникнення будь-якого видимого шву. Цей параметр вимагає " +#~ "одношарового периметру, відсутнє наповнення, відсутність верхніх " +#~ "суцільних шарів і відсутність матеріалу підтримки. Ви все ще можете " +#~ "встановити будь-яку кількість нижніх суцільних шарів, а також петель " +#~ "плінтусу/краю. Це не спрацює при друку більше, ніж одного об'єкта." + +#~ msgid "" +#~ "This start procedure is inserted at the beginning, after bed has reached " +#~ "the target temperature and extruder just started heating, and before " +#~ "extruder has finished heating. If Slic3r detects M104 or M190 in your " +#~ "custom codes, such commands will not be prepended automatically so you're " +#~ "free to customize the order of heating commands and other custom actions. " +#~ "Note that you can use placeholder variables for all Slic3r settings, so " +#~ "you can put a \"M109 S[first_layer_temperature]\" command wherever you " +#~ "want." +#~ msgstr "" +#~ "Ця початкова процедура вставляється на початку, після того, як полотно " +#~ "досягне цільової температури, а екструдер тільки починає нагріватися, і " +#~ "перед тим, як екструдер закінчить нагрівання. Якщо Slic3r виявляє M104 " +#~ "або M190 у ваших користувацьких кодах, такі команди не будуть додаватися " +#~ "автоматично, щоб ви могли вільно налаштовувати порядок команд нагріву та " +#~ "інших спеціальних дій. Зверніть увагу, що ви можете використовувати " +#~ "змінні-заповнювачі для всіх параметрів Slic3r, щоб ви могли поставити " +#~ "команду \"M109 S [first_layer_temperature]\" де завгодно." + +#~ msgid "" +#~ "This start procedure is inserted at the beginning, after any printer " +#~ "start gcode. This is used to override settings for a specific filament. " +#~ "If Slic3r detects M104, M109, M140 or M190 in your custom codes, such " +#~ "commands will not be prepended automatically so you're free to customize " +#~ "the order of heating commands and other custom actions. Note that you can " +#~ "use placeholder variables for all Slic3r settings, so you can put a " +#~ "\"M109 S[first_layer_temperature]\" command wherever you want. If you " +#~ "have multiple extruders, the gcode is processed in extruder order." +#~ msgstr "" +#~ "Ця початкова процедура вставляється на початку, після того, як будь-який " +#~ "принтер запускає G-code. Це використовується для перевизначення " +#~ "параметрів для певної нитки. Якщо Slic3r виявляє M104, M109, M140 або " +#~ "M190 у ваших користувацьких кодах, такі команди не будуть автоматично " +#~ "додаватися, тому ви можете налаштувати порядок команд нагріву та інших " +#~ "спеціальних дій. Зверніть увагу, що ви можете використовувати змінні-" +#~ "заповнювачі для всіх параметрів Slic3r, щоб ви могли поставити команду " +#~ "\"M109 S [first_layer_temperature]\" де завгодно. Якщо у вас є кілька " +#~ "екструдерів, G-code обробляється в порядку екструдерів." + +#~ msgid "soluble" +#~ msgstr "розчинний" + +#~ msgid "detachable" +#~ msgstr "відривний" + +#~ msgid "" +#~ "Extruder temperature for layers after the first one. Set this to zero to " +#~ "disable temperature control commands in the output." +#~ msgstr "" +#~ "Температура екструдеру для шарів після першого. Установіть 0, щоб " +#~ "вимкнути команди керування температурою на виході." + +#~ msgid "" +#~ "This custom code is inserted right before every extruder change. Note " +#~ "that you can use placeholder variables for all Slic3r settings as well as " +#~ "[previous_extruder] and [next_extruder]." +#~ msgstr "" +#~ "Цей спеціальний код вставляється безпосередньо перед кожною зміненою " +#~ "екструдера. Зверніть увагу, що ви можете використовувати змінні-" +#~ "заповнювачі для всіх параметрів Slic3r, а також [previous_extruder] і " +#~ "[next_extruder]." From 6846ba0b592f77b383c9f685bd56181469033729 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 3 Feb 2021 17:29:26 +0100 Subject: [PATCH 109/143] Localization: Fixed localization of some 3d-Scene notifications + Move a call of the load_language() before SplashScreen creation --- src/slic3r/GUI/GLCanvas3D.cpp | 10 +++++----- src/slic3r/GUI/GUI_App.cpp | 6 +++--- src/slic3r/GUI/NotificationManager.cpp | 10 +++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index fbe6681f4ec..917e11d0fdd 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -631,12 +631,12 @@ void GLCanvas3D::WarningTexture::activate(WarningTexture::Warning warning, bool std::string text; bool error = false; switch (warning) { - case ObjectOutside: text = L("An object outside the print area was detected."); break; - case ToolpathOutside: text = L("A toolpath outside the print area was detected."); error = true; break; - case SlaSupportsOutside: text = L("SLA supports outside the print area were detected."); error = true; break; - case SomethingNotShown: text = L("Some objects are not visible."); break; + case ObjectOutside: text = _u8L("An object outside the print area was detected."); break; + case ToolpathOutside: text = _u8L("A toolpath outside the print area was detected."); error = true; break; + case SlaSupportsOutside: text = _u8L("SLA supports outside the print area were detected."); error = true; break; + case SomethingNotShown: text = _u8L("Some objects are not visible."); break; case ObjectClashed: - text = L( "An object outside the print area was detected.\n" + text = _u8L( "An object outside the print area was detected.\n" "Resolve the current problem to continue slicing."); error = true; break; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 085bdb865ab..12fba187e7f 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -799,6 +799,9 @@ bool GUI_App::on_init_inner() app_config->set("version", SLIC3R_VERSION); app_config->save(); + // If load_language() fails, the application closes. + load_language(wxString(), true); + wxInitAllImageHandlers(); SplashScreen* scrn = nullptr; @@ -866,9 +869,6 @@ bool GUI_App::on_init_inner() init_label_colours(); init_fonts(); - // If load_language() fails, the application closes. - load_language(wxString(), true); - // Suppress the '- default -' presets. preset_bundle->set_default_suppressed(app_config->get("no_defaults") == "1"); try { diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index b0d0a556c6c..72fd22b1a3f 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -740,11 +740,11 @@ void NotificationManager::PopNotification::update(const NotificationData& n) } bool NotificationManager::PopNotification::compare_text(const std::string& text) { - std::string t1(m_text1); - std::string t2(text); - t1.erase(std::remove_if(t1.begin(), t1.end(), ::isspace), t1.end()); - t2.erase(std::remove_if(t2.begin(), t2.end(), ::isspace), t2.end()); - if (t1.compare(t2) == 0) + std::wstring wt1 = boost::nowide::widen(m_text1); + std::wstring wt2 = boost::nowide::widen(text); + wt1.erase(std::remove_if(wt1.begin(), wt1.end(), ::iswspace), wt1.end()); + wt2.erase(std::remove_if(wt2.begin(), wt2.end(), ::iswspace), wt2.end()); + if (wt1.compare(wt2) == 0) return true; return false; } From a4a465b9a688dc78ad7e70ec8545f8ab044cebbc Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Wed, 3 Feb 2021 17:34:06 +0100 Subject: [PATCH 110/143] creality.ini: Creality CR-6 SE improvements --- resources/profiles/Creality.ini | 5 +- resources/profiles/Creality/cr6se.svg | 4 + resources/profiles/Creality/cr6se_bed.stl | 2774 +++++++++++++++++++++ 3 files changed, 2781 insertions(+), 2 deletions(-) create mode 100644 resources/profiles/Creality/cr6se.svg create mode 100644 resources/profiles/Creality/cr6se_bed.stl diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 68a1015046a..4c78de412a2 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -73,8 +73,8 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ #variants = 0.4 #technology = FFF #family = CR -#bed_model = ender3_bed.stl -#bed_texture = cr20.svg +#bed_model = cr6se_bed.stl +#bed_texture = cr6se.svg #default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10MINI] @@ -769,6 +769,7 @@ max_print_height = 200 #[printer:Creality CR-6 SE] #inherits = Creality Ender-3; *fastabl* +#bed_shape = 5x0,230x0,230x235,5x235 #printer_model = CR6SE #printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR6SE\nPRINTER_HAS_BOWDEN diff --git a/resources/profiles/Creality/cr6se.svg b/resources/profiles/Creality/cr6se.svg new file mode 100644 index 00000000000..d9eb920bc39 --- /dev/null +++ b/resources/profiles/Creality/cr6se.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/cr6se_bed.stl b/resources/profiles/Creality/cr6se_bed.stl new file mode 100644 index 00000000000..31bf786ed2f --- /dev/null +++ b/resources/profiles/Creality/cr6se_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 119.605 -127.498 -3 + vertex 119.502 -127.498 -3 + vertex 119.814 -127.484 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 119.814 -127.484 -3 + vertex 119.502 -127.498 -3 + vertex 120.021 -127.454 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex 119.502 127.498 -3 + vertex -122.5 124.5 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 120.021 -127.454 -3 + vertex 119.502 -127.498 -3 + vertex 120.226 -127.411 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 120.226 -127.411 -3 + vertex 119.502 -127.498 -3 + vertex 120.427 -127.353 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 120.427 -127.353 -3 + vertex 119.502 -127.498 -3 + vertex 120.624 -127.282 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 120.624 -127.282 -3 + vertex 119.502 -127.498 -3 + vertex 120.815 -127.196 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 120.815 -127.196 -3 + vertex 119.502 -127.498 -3 + vertex 121 -127.098 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 121 -127.098 -3 + vertex 119.502 -127.498 -3 + vertex 121.178 -126.987 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 121.178 -126.987 -3 + vertex 119.502 -127.498 -3 + vertex 121.347 -126.864 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 121.347 -126.864 -3 + vertex 119.502 -127.498 -3 + vertex 121.507 -126.729 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 121.507 -126.729 -3 + vertex 119.502 -127.498 -3 + vertex 121.658 -126.584 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 121.658 -126.584 -3 + vertex 119.502 -127.498 -3 + vertex 121.798 -126.428 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 121.798 -126.428 -3 + vertex 119.502 -127.498 -3 + vertex 121.927 -126.263 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 121.927 -126.263 -3 + vertex 119.502 -127.498 -3 + vertex 122.044 -126.09 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.044 -126.09 -3 + vertex 119.502 -127.498 -3 + vertex 122.149 -125.908 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.149 -125.908 -3 + vertex 119.502 -127.498 -3 + vertex 122.241 -125.72 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.241 -125.72 -3 + vertex 119.502 -127.498 -3 + vertex 122.319 -125.526 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.319 -125.526 -3 + vertex 119.502 -127.498 -3 + vertex 122.384 -125.327 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.384 -125.327 -3 + vertex 119.502 -127.498 -3 + vertex 122.434 -125.124 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.434 -125.124 -3 + vertex 119.502 -127.498 -3 + vertex 122.471 -124.918 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.471 -124.918 -3 + vertex 119.502 -127.498 -3 + vertex 122.493 -124.709 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.493 -124.709 -3 + vertex 119.502 -127.498 -3 + vertex 122.5 -124.5 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex 119.5 127.5 -3 + vertex 119.502 127.498 -3 + vertex -119.502 127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.502 127.498 -3 + vertex 122.471 124.918 -3 + vertex 122.493 124.709 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 122.384 125.327 -3 + vertex 122.434 125.124 -3 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 122.241 125.72 -3 + vertex 119.502 127.498 -3 + vertex 122.149 125.908 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 122.241 125.72 -3 + vertex 122.319 125.526 -3 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.502 127.498 -3 + vertex 121.507 126.729 -3 + vertex 121.658 126.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 121.927 126.263 -3 + vertex 119.502 127.498 -3 + vertex 121.798 126.428 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 121.927 126.263 -3 + vertex 122.044 126.09 -3 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 121.798 126.428 -3 + vertex 119.502 127.498 -3 + vertex 121.658 126.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.502 127.498 -3 + vertex 120.427 127.353 -3 + vertex 120.624 127.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 121.347 126.864 -3 + vertex 119.502 127.498 -3 + vertex 121.178 126.987 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 121.347 126.864 -3 + vertex 121.507 126.729 -3 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 121.178 126.987 -3 + vertex 119.502 127.498 -3 + vertex 121 127.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 121 127.098 -3 + vertex 119.502 127.498 -3 + vertex 120.815 127.196 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 120.815 127.196 -3 + vertex 119.502 127.498 -3 + vertex 120.624 127.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 122.149 125.908 -3 + vertex 119.502 127.498 -3 + vertex 122.044 126.09 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 120.226 127.411 -3 + vertex 119.502 127.498 -3 + vertex 120.021 127.454 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 120.226 127.411 -3 + vertex 120.427 127.353 -3 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 122.319 125.526 -3 + vertex 122.384 125.327 -3 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 119.814 127.484 -3 + vertex 120.021 127.454 -3 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.502 127.498 -3 + vertex 122.434 125.124 -3 + vertex 122.471 124.918 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.502 127.498 -3 + vertex 119.605 127.498 -3 + vertex 119.814 127.484 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 122.5 124.5 -3 + vertex 119.502 127.498 -3 + vertex 122.493 124.709 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -119.5 127.5 -3 + vertex 119.5 127.5 -3 + vertex -119.502 127.498 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex 119.502 127.498 -3 + vertex 122.5 124.5 -3 + vertex -122.5 124.5 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -122.493 124.709 -3 + vertex -119.502 127.498 -3 + vertex -122.5 124.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.5 124.5 -3 + vertex 122.5 124.5 -3 + vertex 122.5 -124.5 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -119.814 127.484 -3 + vertex -119.605 127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -120.021 127.454 -3 + vertex -119.814 127.484 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -120.226 127.411 -3 + vertex -120.021 127.454 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -120.427 127.353 -3 + vertex -120.226 127.411 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -120.624 127.282 -3 + vertex -120.427 127.353 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -120.815 127.196 -3 + vertex -120.624 127.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -121 127.098 -3 + vertex -120.815 127.196 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -121.178 126.987 -3 + vertex -121 127.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -121.347 126.864 -3 + vertex -121.178 126.987 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -121.507 126.729 -3 + vertex -121.347 126.864 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -121.658 126.584 -3 + vertex -121.507 126.729 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -121.798 126.428 -3 + vertex -121.658 126.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -121.927 126.263 -3 + vertex -121.798 126.428 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.044 126.09 -3 + vertex -121.927 126.263 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.149 125.908 -3 + vertex -122.044 126.09 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.241 125.72 -3 + vertex -122.149 125.908 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.319 125.526 -3 + vertex -122.241 125.72 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.384 125.327 -3 + vertex -122.319 125.526 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.434 125.124 -3 + vertex -122.384 125.327 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.471 124.918 -3 + vertex -122.434 125.124 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.493 124.709 -3 + vertex -122.471 124.918 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.5 -124.5 -3 + vertex -122.5 124.5 -3 + vertex 122.5 -124.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.502 -127.498 -3 + vertex -122.5 -124.5 -3 + vertex 122.5 -124.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.502 -127.498 -3 + vertex -119.502 -127.498 -3 + vertex -122.5 -124.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 -127.498 -3 + vertex -122.471 -124.918 -3 + vertex -122.493 -124.709 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.384 -125.327 -3 + vertex -122.434 -125.124 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.241 -125.72 -3 + vertex -119.502 -127.498 -3 + vertex -122.149 -125.908 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.241 -125.72 -3 + vertex -122.319 -125.526 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 -127.498 -3 + vertex -121.507 -126.729 -3 + vertex -121.658 -126.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -121.927 -126.263 -3 + vertex -119.502 -127.498 -3 + vertex -121.798 -126.428 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -121.927 -126.263 -3 + vertex -122.044 -126.09 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -121.798 -126.428 -3 + vertex -119.502 -127.498 -3 + vertex -121.658 -126.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 -127.498 -3 + vertex -120.427 -127.353 -3 + vertex -120.624 -127.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -121.347 -126.864 -3 + vertex -119.502 -127.498 -3 + vertex -121.178 -126.987 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -121.347 -126.864 -3 + vertex -121.507 -126.729 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -121.178 -126.987 -3 + vertex -119.502 -127.498 -3 + vertex -121 -127.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -121 -127.098 -3 + vertex -119.502 -127.498 -3 + vertex -120.815 -127.196 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -120.815 -127.196 -3 + vertex -119.502 -127.498 -3 + vertex -120.624 -127.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.149 -125.908 -3 + vertex -119.502 -127.498 -3 + vertex -122.044 -126.09 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -120.226 -127.411 -3 + vertex -119.502 -127.498 -3 + vertex -120.021 -127.454 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -120.226 -127.411 -3 + vertex -120.427 -127.353 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.319 -125.526 -3 + vertex -122.384 -125.327 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.814 -127.484 -3 + vertex -120.021 -127.454 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 -127.498 -3 + vertex -122.434 -125.124 -3 + vertex -122.471 -124.918 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 -127.498 -3 + vertex -119.605 -127.498 -3 + vertex -119.814 -127.484 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 119.502 -127.498 -3 + vertex 119.5 -127.5 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 -127.498 -3 + vertex 119.5 -127.5 -3 + vertex -119.5 -127.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.5 -124.5 -3 + vertex -119.502 -127.498 -3 + vertex -122.493 -124.709 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.814 -127.484 0 + vertex 119.502 -127.498 0 + vertex 119.605 -127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.021 -127.454 0 + vertex 119.502 -127.498 0 + vertex 119.814 -127.484 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -122.5 124.5 0 + vertex 119.502 127.498 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.226 -127.411 0 + vertex 119.502 -127.498 0 + vertex 120.021 -127.454 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.427 -127.353 0 + vertex 119.502 -127.498 0 + vertex 120.226 -127.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.624 -127.282 0 + vertex 119.502 -127.498 0 + vertex 120.427 -127.353 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.815 -127.196 0 + vertex 119.502 -127.498 0 + vertex 120.624 -127.282 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121 -127.098 0 + vertex 119.502 -127.498 0 + vertex 120.815 -127.196 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.178 -126.987 0 + vertex 119.502 -127.498 0 + vertex 121 -127.098 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.347 -126.864 0 + vertex 119.502 -127.498 0 + vertex 121.178 -126.987 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.507 -126.729 0 + vertex 119.502 -127.498 0 + vertex 121.347 -126.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.658 -126.584 0 + vertex 119.502 -127.498 0 + vertex 121.507 -126.729 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.798 -126.428 0 + vertex 119.502 -127.498 0 + vertex 121.658 -126.584 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.927 -126.263 0 + vertex 119.502 -127.498 0 + vertex 121.798 -126.428 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.044 -126.09 0 + vertex 119.502 -127.498 0 + vertex 121.927 -126.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.149 -125.908 0 + vertex 119.502 -127.498 0 + vertex 122.044 -126.09 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.241 -125.72 0 + vertex 119.502 -127.498 0 + vertex 122.149 -125.908 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.319 -125.526 0 + vertex 119.502 -127.498 0 + vertex 122.241 -125.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.384 -125.327 0 + vertex 119.502 -127.498 0 + vertex 122.319 -125.526 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.434 -125.124 0 + vertex 119.502 -127.498 0 + vertex 122.384 -125.327 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.471 -124.918 0 + vertex 119.502 -127.498 0 + vertex 122.434 -125.124 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.493 -124.709 0 + vertex 119.502 -127.498 0 + vertex 122.471 -124.918 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.5 -124.5 0 + vertex 119.502 -127.498 0 + vertex 122.493 -124.709 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 127.498 0 + vertex 119.502 127.498 0 + vertex 119.5 127.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.493 124.709 0 + vertex 122.471 124.918 0 + vertex 119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.502 127.498 0 + vertex 122.434 125.124 0 + vertex 122.384 125.327 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.149 125.908 0 + vertex 119.502 127.498 0 + vertex 122.241 125.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.502 127.498 0 + vertex 122.319 125.526 0 + vertex 122.241 125.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.658 126.584 0 + vertex 121.507 126.729 0 + vertex 119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.798 126.428 0 + vertex 119.502 127.498 0 + vertex 121.927 126.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.502 127.498 0 + vertex 122.044 126.09 0 + vertex 121.927 126.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.658 126.584 0 + vertex 119.502 127.498 0 + vertex 121.798 126.428 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.624 127.282 0 + vertex 120.427 127.353 0 + vertex 119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.178 126.987 0 + vertex 119.502 127.498 0 + vertex 121.347 126.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.502 127.498 0 + vertex 121.507 126.729 0 + vertex 121.347 126.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121 127.098 0 + vertex 119.502 127.498 0 + vertex 121.178 126.987 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.815 127.196 0 + vertex 119.502 127.498 0 + vertex 121 127.098 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.624 127.282 0 + vertex 119.502 127.498 0 + vertex 120.815 127.196 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.044 126.09 0 + vertex 119.502 127.498 0 + vertex 122.149 125.908 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.021 127.454 0 + vertex 119.502 127.498 0 + vertex 120.226 127.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.502 127.498 0 + vertex 120.427 127.353 0 + vertex 120.226 127.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.502 127.498 0 + vertex 122.384 125.327 0 + vertex 122.319 125.526 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.502 127.498 0 + vertex 120.021 127.454 0 + vertex 119.814 127.484 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.471 124.918 0 + vertex 122.434 125.124 0 + vertex 119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.814 127.484 0 + vertex 119.605 127.498 0 + vertex 119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.493 124.709 0 + vertex 119.502 127.498 0 + vertex 122.5 124.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 127.498 0 + vertex 119.5 127.5 0 + vertex -119.5 127.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -122.5 124.5 0 + vertex 122.5 124.5 0 + vertex 119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -122.5 124.5 0 + vertex -119.502 127.498 0 + vertex -122.493 124.709 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 122.5 -124.5 0 + vertex 122.5 124.5 0 + vertex -122.5 124.5 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -119.605 127.498 0 + vertex -119.814 127.484 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -119.814 127.484 0 + vertex -120.021 127.454 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -120.021 127.454 0 + vertex -120.226 127.411 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -120.226 127.411 0 + vertex -120.427 127.353 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -120.427 127.353 0 + vertex -120.624 127.282 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -120.624 127.282 0 + vertex -120.815 127.196 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -120.815 127.196 0 + vertex -121 127.098 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -121 127.098 0 + vertex -121.178 126.987 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -121.178 126.987 0 + vertex -121.347 126.864 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -121.347 126.864 0 + vertex -121.507 126.729 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -121.507 126.729 0 + vertex -121.658 126.584 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -121.658 126.584 0 + vertex -121.798 126.428 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -121.798 126.428 0 + vertex -121.927 126.263 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -121.927 126.263 0 + vertex -122.044 126.09 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -122.044 126.09 0 + vertex -122.149 125.908 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -122.149 125.908 0 + vertex -122.241 125.72 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -122.241 125.72 0 + vertex -122.319 125.526 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -122.319 125.526 0 + vertex -122.384 125.327 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -122.384 125.327 0 + vertex -122.434 125.124 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -122.434 125.124 0 + vertex -122.471 124.918 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -122.471 124.918 0 + vertex -122.493 124.709 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.5 -124.5 0 + vertex -122.5 124.5 0 + vertex -122.5 -124.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.5 -124.5 0 + vertex -122.5 -124.5 0 + vertex 119.502 -127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -122.5 -124.5 0 + vertex -119.502 -127.498 0 + vertex 119.502 -127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -122.493 -124.709 0 + vertex -122.471 -124.918 0 + vertex -119.502 -127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex -122.434 -125.124 0 + vertex -122.384 -125.327 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -122.149 -125.908 0 + vertex -119.502 -127.498 0 + vertex -122.241 -125.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex -122.319 -125.526 0 + vertex -122.241 -125.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -121.658 -126.584 0 + vertex -121.507 -126.729 0 + vertex -119.502 -127.498 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -121.798 -126.428 0 + vertex -119.502 -127.498 0 + vertex -121.927 -126.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex -122.044 -126.09 0 + vertex -121.927 -126.263 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -121.658 -126.584 0 + vertex -119.502 -127.498 0 + vertex -121.798 -126.428 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -120.624 -127.282 0 + vertex -120.427 -127.353 0 + vertex -119.502 -127.498 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -121.178 -126.987 0 + vertex -119.502 -127.498 0 + vertex -121.347 -126.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex -121.507 -126.729 0 + vertex -121.347 -126.864 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -121 -127.098 0 + vertex -119.502 -127.498 0 + vertex -121.178 -126.987 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -120.815 -127.196 0 + vertex -119.502 -127.498 0 + vertex -121 -127.098 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -120.624 -127.282 0 + vertex -119.502 -127.498 0 + vertex -120.815 -127.196 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -122.044 -126.09 0 + vertex -119.502 -127.498 0 + vertex -122.149 -125.908 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -120.021 -127.454 0 + vertex -119.502 -127.498 0 + vertex -120.226 -127.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex -120.427 -127.353 0 + vertex -120.226 -127.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex -122.384 -125.327 0 + vertex -122.319 -125.526 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex -120.021 -127.454 0 + vertex -119.814 -127.484 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -122.471 -124.918 0 + vertex -122.434 -125.124 0 + vertex -119.502 -127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.814 -127.484 0 + vertex -119.605 -127.498 0 + vertex -119.502 -127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex 119.5 -127.5 0 + vertex 119.502 -127.498 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -119.5 -127.5 0 + vertex 119.5 -127.5 0 + vertex -119.502 -127.498 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -122.493 -124.709 0 + vertex -119.502 -127.498 0 + vertex -122.5 -124.5 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 119.605 -127.498 -3 + vertex 119.502 -127.498 0 + vertex 119.502 -127.498 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 119.605 -127.498 -3 + vertex 119.605 -127.498 0 + vertex 119.502 -127.498 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 119.814 -127.484 -3 + vertex 119.605 -127.498 0 + vertex 119.605 -127.498 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 119.814 -127.484 -3 + vertex 119.814 -127.484 0 + vertex 119.605 -127.498 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 120.021 -127.454 -3 + vertex 119.814 -127.484 0 + vertex 119.814 -127.484 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 120.021 -127.454 -3 + vertex 120.021 -127.454 0 + vertex 119.814 -127.484 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 120.226 -127.411 -3 + vertex 120.021 -127.454 0 + vertex 120.021 -127.454 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 120.226 -127.411 -3 + vertex 120.226 -127.411 0 + vertex 120.021 -127.454 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 120.427 -127.353 -3 + vertex 120.226 -127.411 0 + vertex 120.226 -127.411 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 120.427 -127.353 -3 + vertex 120.427 -127.353 0 + vertex 120.226 -127.411 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 120.624 -127.282 -3 + vertex 120.427 -127.353 0 + vertex 120.427 -127.353 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 120.624 -127.282 -3 + vertex 120.624 -127.282 0 + vertex 120.427 -127.353 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 120.815 -127.196 -3 + vertex 120.624 -127.282 0 + vertex 120.624 -127.282 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 120.815 -127.196 -3 + vertex 120.815 -127.196 0 + vertex 120.624 -127.282 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 121 -127.098 -3 + vertex 120.815 -127.196 0 + vertex 120.815 -127.196 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 121 -127.098 -3 + vertex 121 -127.098 0 + vertex 120.815 -127.196 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 121.178 -126.987 -3 + vertex 121 -127.098 0 + vertex 121 -127.098 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 121.178 -126.987 -3 + vertex 121.178 -126.987 0 + vertex 121 -127.098 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 121.347 -126.864 -3 + vertex 121.178 -126.987 0 + vertex 121.178 -126.987 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 121.347 -126.864 -3 + vertex 121.347 -126.864 0 + vertex 121.178 -126.987 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 121.507 -126.729 -3 + vertex 121.347 -126.864 0 + vertex 121.347 -126.864 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 121.507 -126.729 -3 + vertex 121.507 -126.729 0 + vertex 121.347 -126.864 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 121.658 -126.584 -3 + vertex 121.507 -126.729 0 + vertex 121.507 -126.729 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 121.658 -126.584 -3 + vertex 121.658 -126.584 0 + vertex 121.507 -126.729 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 121.798 -126.428 -3 + vertex 121.658 -126.584 0 + vertex 121.658 -126.584 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 121.798 -126.428 -3 + vertex 121.798 -126.428 0 + vertex 121.658 -126.584 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 121.927 -126.263 -3 + vertex 121.798 -126.428 0 + vertex 121.798 -126.428 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 121.927 -126.263 -3 + vertex 121.927 -126.263 0 + vertex 121.798 -126.428 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 122.044 -126.09 -3 + vertex 121.927 -126.263 0 + vertex 121.927 -126.263 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 122.044 -126.09 -3 + vertex 122.044 -126.09 0 + vertex 121.927 -126.263 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 122.149 -125.908 -3 + vertex 122.044 -126.09 0 + vertex 122.044 -126.09 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 122.149 -125.908 -3 + vertex 122.149 -125.908 0 + vertex 122.044 -126.09 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 122.241 -125.72 -3 + vertex 122.149 -125.908 0 + vertex 122.149 -125.908 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 122.241 -125.72 -3 + vertex 122.241 -125.72 0 + vertex 122.149 -125.908 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 122.319 -125.526 -3 + vertex 122.241 -125.72 0 + vertex 122.241 -125.72 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 122.319 -125.526 -3 + vertex 122.319 -125.526 0 + vertex 122.241 -125.72 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 122.384 -125.327 -3 + vertex 122.319 -125.526 0 + vertex 122.319 -125.526 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 122.384 -125.327 -3 + vertex 122.384 -125.327 0 + vertex 122.319 -125.526 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 122.434 -125.124 -3 + vertex 122.384 -125.327 0 + vertex 122.384 -125.327 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 122.434 -125.124 -3 + vertex 122.434 -125.124 0 + vertex 122.384 -125.327 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 122.471 -124.918 -3 + vertex 122.434 -125.124 0 + vertex 122.434 -125.124 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 122.471 -124.918 -3 + vertex 122.471 -124.918 0 + vertex 122.434 -125.124 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 122.493 -124.709 -3 + vertex 122.471 -124.918 0 + vertex 122.471 -124.918 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 122.493 -124.709 -3 + vertex 122.493 -124.709 0 + vertex 122.471 -124.918 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 122.5 -124.5 -3 + vertex 122.493 -124.709 0 + vertex 122.493 -124.709 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 122.5 -124.5 -3 + vertex 122.5 -124.5 0 + vertex 122.493 -124.709 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 122.5 124.5 -3 + vertex 122.5 -124.5 0 + vertex 122.5 -124.5 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 122.5 124.5 -3 + vertex 122.5 124.5 0 + vertex 122.5 -124.5 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 122.493 124.709 -3 + vertex 122.5 124.5 0 + vertex 122.5 124.5 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 122.493 124.709 -3 + vertex 122.493 124.709 0 + vertex 122.5 124.5 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 122.471 124.918 -3 + vertex 122.493 124.709 0 + vertex 122.493 124.709 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 122.471 124.918 -3 + vertex 122.471 124.918 0 + vertex 122.493 124.709 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 122.434 125.124 -3 + vertex 122.471 124.918 0 + vertex 122.471 124.918 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 122.434 125.124 -3 + vertex 122.434 125.124 0 + vertex 122.471 124.918 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 122.384 125.327 -3 + vertex 122.434 125.124 0 + vertex 122.434 125.124 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 122.384 125.327 -3 + vertex 122.384 125.327 0 + vertex 122.434 125.124 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 122.319 125.526 -3 + vertex 122.384 125.327 0 + vertex 122.384 125.327 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 122.319 125.526 -3 + vertex 122.319 125.526 0 + vertex 122.384 125.327 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 122.241 125.72 -3 + vertex 122.319 125.526 0 + vertex 122.319 125.526 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 122.241 125.72 -3 + vertex 122.241 125.72 0 + vertex 122.319 125.526 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 122.149 125.908 -3 + vertex 122.241 125.72 0 + vertex 122.241 125.72 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 122.149 125.908 -3 + vertex 122.149 125.908 0 + vertex 122.241 125.72 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 122.044 126.09 -3 + vertex 122.149 125.908 0 + vertex 122.149 125.908 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 122.044 126.09 -3 + vertex 122.044 126.09 0 + vertex 122.149 125.908 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 121.927 126.263 -3 + vertex 122.044 126.09 0 + vertex 122.044 126.09 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 121.927 126.263 -3 + vertex 121.927 126.263 0 + vertex 122.044 126.09 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 121.798 126.428 -3 + vertex 121.927 126.263 0 + vertex 121.927 126.263 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 121.798 126.428 -3 + vertex 121.798 126.428 0 + vertex 121.927 126.263 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 121.658 126.584 -3 + vertex 121.798 126.428 0 + vertex 121.798 126.428 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 121.658 126.584 -3 + vertex 121.658 126.584 0 + vertex 121.798 126.428 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 121.507 126.729 -3 + vertex 121.658 126.584 0 + vertex 121.658 126.584 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 121.507 126.729 -3 + vertex 121.507 126.729 0 + vertex 121.658 126.584 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 121.347 126.864 -3 + vertex 121.507 126.729 0 + vertex 121.507 126.729 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 121.347 126.864 -3 + vertex 121.347 126.864 0 + vertex 121.507 126.729 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 121.178 126.987 -3 + vertex 121.347 126.864 0 + vertex 121.347 126.864 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 121.178 126.987 -3 + vertex 121.178 126.987 0 + vertex 121.347 126.864 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 121 127.098 -3 + vertex 121.178 126.987 0 + vertex 121.178 126.987 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 121 127.098 -3 + vertex 121 127.098 0 + vertex 121.178 126.987 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 120.815 127.196 -3 + vertex 121 127.098 0 + vertex 121 127.098 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 120.815 127.196 -3 + vertex 120.815 127.196 0 + vertex 121 127.098 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 120.624 127.282 -3 + vertex 120.815 127.196 0 + vertex 120.815 127.196 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 120.624 127.282 -3 + vertex 120.624 127.282 0 + vertex 120.815 127.196 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 120.427 127.353 -3 + vertex 120.624 127.282 0 + vertex 120.624 127.282 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 120.427 127.353 -3 + vertex 120.427 127.353 0 + vertex 120.624 127.282 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 120.226 127.411 -3 + vertex 120.427 127.353 0 + vertex 120.427 127.353 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 120.226 127.411 -3 + vertex 120.226 127.411 0 + vertex 120.427 127.353 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 120.021 127.454 -3 + vertex 120.226 127.411 0 + vertex 120.226 127.411 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 120.021 127.454 -3 + vertex 120.021 127.454 0 + vertex 120.226 127.411 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 119.814 127.484 -3 + vertex 120.021 127.454 0 + vertex 120.021 127.454 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 119.814 127.484 -3 + vertex 119.814 127.484 0 + vertex 120.021 127.454 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 119.605 127.498 -3 + vertex 119.814 127.484 0 + vertex 119.814 127.484 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 119.605 127.498 -3 + vertex 119.605 127.498 0 + vertex 119.814 127.484 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 119.502 127.498 -3 + vertex 119.605 127.498 0 + vertex 119.605 127.498 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 119.502 127.498 -3 + vertex 119.502 127.498 0 + vertex 119.605 127.498 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 119.5 127.5 -3 + vertex 119.502 127.498 0 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 119.5 127.5 -3 + vertex 119.5 127.5 0 + vertex 119.502 127.498 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -119.5 127.5 -3 + vertex 119.5 127.5 0 + vertex 119.5 127.5 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -119.5 127.5 -3 + vertex -119.5 127.5 0 + vertex 119.5 127.5 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -119.502 127.498 -3 + vertex -119.5 127.5 0 + vertex -119.5 127.5 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -119.502 127.498 -3 + vertex -119.502 127.498 0 + vertex -119.5 127.5 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -119.605 127.498 -3 + vertex -119.502 127.498 0 + vertex -119.502 127.498 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -119.605 127.498 -3 + vertex -119.605 127.498 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -119.814 127.484 -3 + vertex -119.605 127.498 0 + vertex -119.605 127.498 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -119.814 127.484 -3 + vertex -119.814 127.484 0 + vertex -119.605 127.498 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -120.021 127.454 -3 + vertex -119.814 127.484 0 + vertex -119.814 127.484 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -120.021 127.454 -3 + vertex -120.021 127.454 0 + vertex -119.814 127.484 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -120.226 127.411 -3 + vertex -120.021 127.454 0 + vertex -120.021 127.454 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -120.226 127.411 -3 + vertex -120.226 127.411 0 + vertex -120.021 127.454 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -120.427 127.353 -3 + vertex -120.226 127.411 0 + vertex -120.226 127.411 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -120.427 127.353 -3 + vertex -120.427 127.353 0 + vertex -120.226 127.411 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -120.624 127.282 -3 + vertex -120.427 127.353 0 + vertex -120.427 127.353 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -120.624 127.282 -3 + vertex -120.624 127.282 0 + vertex -120.427 127.353 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -120.815 127.196 -3 + vertex -120.624 127.282 0 + vertex -120.624 127.282 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -120.815 127.196 -3 + vertex -120.815 127.196 0 + vertex -120.624 127.282 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -121 127.098 -3 + vertex -120.815 127.196 0 + vertex -120.815 127.196 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -121 127.098 -3 + vertex -121 127.098 0 + vertex -120.815 127.196 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -121.178 126.987 -3 + vertex -121 127.098 0 + vertex -121 127.098 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -121.178 126.987 -3 + vertex -121.178 126.987 0 + vertex -121 127.098 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -121.347 126.864 -3 + vertex -121.178 126.987 0 + vertex -121.178 126.987 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -121.347 126.864 -3 + vertex -121.347 126.864 0 + vertex -121.178 126.987 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -121.507 126.729 -3 + vertex -121.347 126.864 0 + vertex -121.347 126.864 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -121.507 126.729 -3 + vertex -121.507 126.729 0 + vertex -121.347 126.864 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -121.658 126.584 -3 + vertex -121.507 126.729 0 + vertex -121.507 126.729 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -121.658 126.584 -3 + vertex -121.658 126.584 0 + vertex -121.507 126.729 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -121.798 126.428 -3 + vertex -121.658 126.584 0 + vertex -121.658 126.584 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -121.798 126.428 -3 + vertex -121.798 126.428 0 + vertex -121.658 126.584 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -121.927 126.263 -3 + vertex -121.798 126.428 0 + vertex -121.798 126.428 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -121.927 126.263 -3 + vertex -121.927 126.263 0 + vertex -121.798 126.428 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -122.044 126.09 -3 + vertex -121.927 126.263 0 + vertex -121.927 126.263 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -122.044 126.09 -3 + vertex -122.044 126.09 0 + vertex -121.927 126.263 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -122.149 125.908 -3 + vertex -122.044 126.09 0 + vertex -122.044 126.09 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -122.149 125.908 -3 + vertex -122.149 125.908 0 + vertex -122.044 126.09 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -122.241 125.72 -3 + vertex -122.149 125.908 0 + vertex -122.149 125.908 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -122.241 125.72 -3 + vertex -122.241 125.72 0 + vertex -122.149 125.908 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -122.319 125.526 -3 + vertex -122.241 125.72 0 + vertex -122.241 125.72 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -122.319 125.526 -3 + vertex -122.319 125.526 0 + vertex -122.241 125.72 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -122.384 125.327 -3 + vertex -122.319 125.526 0 + vertex -122.319 125.526 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -122.384 125.327 -3 + vertex -122.384 125.327 0 + vertex -122.319 125.526 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -122.434 125.124 -3 + vertex -122.384 125.327 0 + vertex -122.384 125.327 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -122.434 125.124 -3 + vertex -122.434 125.124 0 + vertex -122.384 125.327 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -122.471 124.918 -3 + vertex -122.434 125.124 0 + vertex -122.434 125.124 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -122.471 124.918 -3 + vertex -122.471 124.918 0 + vertex -122.434 125.124 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -122.493 124.709 -3 + vertex -122.471 124.918 0 + vertex -122.471 124.918 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -122.493 124.709 -3 + vertex -122.493 124.709 0 + vertex -122.471 124.918 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -122.5 124.5 -3 + vertex -122.493 124.709 0 + vertex -122.493 124.709 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -122.5 124.5 -3 + vertex -122.5 124.5 0 + vertex -122.493 124.709 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -122.5 -124.5 -3 + vertex -122.5 124.5 0 + vertex -122.5 124.5 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -122.5 -124.5 -3 + vertex -122.5 -124.5 0 + vertex -122.5 124.5 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -122.493 -124.709 -3 + vertex -122.5 -124.5 0 + vertex -122.5 -124.5 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -122.493 -124.709 -3 + vertex -122.493 -124.709 0 + vertex -122.5 -124.5 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -122.471 -124.918 -3 + vertex -122.493 -124.709 0 + vertex -122.493 -124.709 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -122.471 -124.918 -3 + vertex -122.471 -124.918 0 + vertex -122.493 -124.709 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -122.434 -125.124 -3 + vertex -122.471 -124.918 0 + vertex -122.471 -124.918 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -122.434 -125.124 -3 + vertex -122.434 -125.124 0 + vertex -122.471 -124.918 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -122.384 -125.327 -3 + vertex -122.434 -125.124 0 + vertex -122.434 -125.124 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -122.384 -125.327 -3 + vertex -122.384 -125.327 0 + vertex -122.434 -125.124 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -122.319 -125.526 -3 + vertex -122.384 -125.327 0 + vertex -122.384 -125.327 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -122.319 -125.526 -3 + vertex -122.319 -125.526 0 + vertex -122.384 -125.327 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -122.241 -125.72 -3 + vertex -122.319 -125.526 0 + vertex -122.319 -125.526 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -122.241 -125.72 -3 + vertex -122.241 -125.72 0 + vertex -122.319 -125.526 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -122.149 -125.908 -3 + vertex -122.241 -125.72 0 + vertex -122.241 -125.72 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -122.149 -125.908 -3 + vertex -122.149 -125.908 0 + vertex -122.241 -125.72 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -122.044 -126.09 -3 + vertex -122.149 -125.908 0 + vertex -122.149 -125.908 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -122.044 -126.09 -3 + vertex -122.044 -126.09 0 + vertex -122.149 -125.908 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -121.927 -126.263 -3 + vertex -122.044 -126.09 0 + vertex -122.044 -126.09 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -121.927 -126.263 -3 + vertex -121.927 -126.263 0 + vertex -122.044 -126.09 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -121.798 -126.428 -3 + vertex -121.927 -126.263 0 + vertex -121.927 -126.263 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -121.798 -126.428 -3 + vertex -121.798 -126.428 0 + vertex -121.927 -126.263 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -121.658 -126.584 -3 + vertex -121.798 -126.428 0 + vertex -121.798 -126.428 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -121.658 -126.584 -3 + vertex -121.658 -126.584 0 + vertex -121.798 -126.428 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -121.507 -126.729 -3 + vertex -121.658 -126.584 0 + vertex -121.658 -126.584 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -121.507 -126.729 -3 + vertex -121.507 -126.729 0 + vertex -121.658 -126.584 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -121.347 -126.864 -3 + vertex -121.507 -126.729 0 + vertex -121.507 -126.729 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -121.347 -126.864 -3 + vertex -121.347 -126.864 0 + vertex -121.507 -126.729 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -121.178 -126.987 -3 + vertex -121.347 -126.864 0 + vertex -121.347 -126.864 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -121.178 -126.987 -3 + vertex -121.178 -126.987 0 + vertex -121.347 -126.864 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -121 -127.098 -3 + vertex -121.178 -126.987 0 + vertex -121.178 -126.987 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -121 -127.098 -3 + vertex -121 -127.098 0 + vertex -121.178 -126.987 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -120.815 -127.196 -3 + vertex -121 -127.098 0 + vertex -121 -127.098 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -120.815 -127.196 -3 + vertex -120.815 -127.196 0 + vertex -121 -127.098 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -120.624 -127.282 -3 + vertex -120.815 -127.196 0 + vertex -120.815 -127.196 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -120.624 -127.282 -3 + vertex -120.624 -127.282 0 + vertex -120.815 -127.196 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -120.427 -127.353 -3 + vertex -120.624 -127.282 0 + vertex -120.624 -127.282 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -120.427 -127.353 -3 + vertex -120.427 -127.353 0 + vertex -120.624 -127.282 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -120.226 -127.411 -3 + vertex -120.427 -127.353 0 + vertex -120.427 -127.353 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -120.226 -127.411 -3 + vertex -120.226 -127.411 0 + vertex -120.427 -127.353 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -120.021 -127.454 -3 + vertex -120.226 -127.411 0 + vertex -120.226 -127.411 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -120.021 -127.454 -3 + vertex -120.021 -127.454 0 + vertex -120.226 -127.411 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -119.814 -127.484 -3 + vertex -120.021 -127.454 0 + vertex -120.021 -127.454 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -119.814 -127.484 -3 + vertex -119.814 -127.484 0 + vertex -120.021 -127.454 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -119.605 -127.498 -3 + vertex -119.814 -127.484 0 + vertex -119.814 -127.484 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -119.605 -127.498 -3 + vertex -119.605 -127.498 0 + vertex -119.814 -127.484 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -119.502 -127.498 -3 + vertex -119.605 -127.498 0 + vertex -119.605 -127.498 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -119.502 -127.498 -3 + vertex -119.502 -127.498 0 + vertex -119.605 -127.498 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -119.5 -127.5 -3 + vertex -119.502 -127.498 0 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -119.5 -127.5 -3 + vertex -119.5 -127.5 0 + vertex -119.502 -127.498 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 119.5 -127.5 -3 + vertex -119.5 -127.5 0 + vertex -119.5 -127.5 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 119.5 -127.5 -3 + vertex 119.5 -127.5 0 + vertex -119.5 -127.5 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 119.502 -127.498 -3 + vertex 119.5 -127.5 0 + vertex 119.5 -127.5 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 119.502 -127.498 -3 + vertex 119.502 -127.498 0 + vertex 119.5 -127.5 0 + endloop + endfacet +endsolid OpenSCAD_Model From 0baa92fab80f8a6d7072181d843e94ecf374af3b Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 3 Feb 2021 21:30:38 +0100 Subject: [PATCH 111/143] Localization: Added plural form for some phrases, updated POT --- resources/localization/PrusaSlicer.pot | 3798 +++++++++++----------- src/libslic3r/PrintConfig.cpp | 4 +- src/slic3r/GUI/GUI_App.cpp | 3 +- src/slic3r/GUI/GUI_ObjectList.cpp | 28 +- src/slic3r/GUI/PhysicalPrinterDialog.cpp | 11 +- src/slic3r/GUI/Plater.cpp | 33 +- src/slic3r/GUI/Tab.cpp | 12 +- 7 files changed, 2014 insertions(+), 1875 deletions(-) diff --git a/resources/localization/PrusaSlicer.pot b/resources/localization/PrusaSlicer.pot index 5c328e479c0..58ed3370e60 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-12-18 13:59+0100\n" +"POT-Creation-Date: 2021-02-03 21:27+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -39,16 +39,16 @@ msgid "About %s" msgstr "" #: src/slic3r/GUI/AboutDialog.cpp:238 src/slic3r/GUI/AboutDialog.cpp:361 -#: src/slic3r/GUI/GUI_App.cpp:235 src/slic3r/GUI/MainFrame.cpp:151 +#: src/slic3r/GUI/GUI_App.cpp:243 src/slic3r/GUI/MainFrame.cpp:151 msgid "Version" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:265 src/slic3r/GUI/GUI_App.cpp:240 +#: src/slic3r/GUI/AboutDialog.cpp:265 src/slic3r/GUI/GUI_App.cpp:248 msgid "is licensed under the" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:266 src/slic3r/GUI/GUI_App.cpp:240 +#: src/slic3r/GUI/AboutDialog.cpp:266 src/slic3r/GUI/GUI_App.cpp:248 msgid "GNU Affero General Public License, version 3" msgstr "" @@ -141,8 +141,8 @@ msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:93 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:162 -#: src/slic3r/GUI/Tab.cpp:2536 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 src/slic3r/GUI/Plater.cpp:162 +#: src/slic3r/GUI/Tab.cpp:2550 msgid "Size" msgstr "" @@ -150,7 +150,7 @@ msgstr "" msgid "Origin" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:771 +#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:796 msgid "Diameter" msgstr "" @@ -165,47 +165,49 @@ msgid "" msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:242 -#: src/slic3r/GUI/ConfigWizard.cpp:1368 src/slic3r/GUI/ConfigWizard.cpp:1382 +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/ConfigWizard.cpp:1380 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:88 -#: src/slic3r/GUI/GCodeViewer.cpp:2337 src/slic3r/GUI/GCodeViewer.cpp:2343 -#: src/slic3r/GUI/GCodeViewer.cpp:2351 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 +#: src/slic3r/GUI/GCodeViewer.cpp:3647 src/slic3r/GUI/GCodeViewer.cpp:3653 +#: src/slic3r/GUI/GCodeViewer.cpp:3661 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:322 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:467 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:468 #: src/slic3r/GUI/ObjectDataViewModel.cpp:96 #: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:77 #: src/libslic3r/PrintConfig.cpp:84 src/libslic3r/PrintConfig.cpp:95 #: src/libslic3r/PrintConfig.cpp:135 src/libslic3r/PrintConfig.cpp:244 -#: src/libslic3r/PrintConfig.cpp:302 src/libslic3r/PrintConfig.cpp:377 -#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:435 -#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:576 -#: src/libslic3r/PrintConfig.cpp:594 src/libslic3r/PrintConfig.cpp:774 -#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1439 -#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1518 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1594 -#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1729 -#: src/libslic3r/PrintConfig.cpp:1737 src/libslic3r/PrintConfig.cpp:1778 -#: src/libslic3r/PrintConfig.cpp:1786 src/libslic3r/PrintConfig.cpp:1796 -#: src/libslic3r/PrintConfig.cpp:1804 src/libslic3r/PrintConfig.cpp:1812 -#: src/libslic3r/PrintConfig.cpp:1875 src/libslic3r/PrintConfig.cpp:2141 -#: src/libslic3r/PrintConfig.cpp:2212 src/libslic3r/PrintConfig.cpp:2246 -#: src/libslic3r/PrintConfig.cpp:2375 src/libslic3r/PrintConfig.cpp:2454 -#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2468 -#: src/libslic3r/PrintConfig.cpp:2498 src/libslic3r/PrintConfig.cpp:2508 -#: src/libslic3r/PrintConfig.cpp:2518 src/libslic3r/PrintConfig.cpp:2678 -#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2851 -#: src/libslic3r/PrintConfig.cpp:2860 src/libslic3r/PrintConfig.cpp:2869 -#: src/libslic3r/PrintConfig.cpp:2879 src/libslic3r/PrintConfig.cpp:2944 -#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2966 -#: src/libslic3r/PrintConfig.cpp:2986 src/libslic3r/PrintConfig.cpp:2996 -#: src/libslic3r/PrintConfig.cpp:3006 src/libslic3r/PrintConfig.cpp:3024 -#: src/libslic3r/PrintConfig.cpp:3039 src/libslic3r/PrintConfig.cpp:3053 -#: src/libslic3r/PrintConfig.cpp:3064 src/libslic3r/PrintConfig.cpp:3077 -#: src/libslic3r/PrintConfig.cpp:3122 src/libslic3r/PrintConfig.cpp:3132 -#: src/libslic3r/PrintConfig.cpp:3141 src/libslic3r/PrintConfig.cpp:3151 -#: src/libslic3r/PrintConfig.cpp:3167 src/libslic3r/PrintConfig.cpp:3191 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:328 +#: src/libslic3r/PrintConfig.cpp:402 src/libslic3r/PrintConfig.cpp:410 +#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:590 +#: src/libslic3r/PrintConfig.cpp:601 src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:799 src/libslic3r/PrintConfig.cpp:1085 +#: src/libslic3r/PrintConfig.cpp:1094 src/libslic3r/PrintConfig.cpp:1347 +#: src/libslic3r/PrintConfig.cpp:1528 src/libslic3r/PrintConfig.cpp:1589 +#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1818 src/libslic3r/PrintConfig.cpp:1826 +#: src/libslic3r/PrintConfig.cpp:1867 src/libslic3r/PrintConfig.cpp:1875 +#: src/libslic3r/PrintConfig.cpp:1885 src/libslic3r/PrintConfig.cpp:1893 +#: src/libslic3r/PrintConfig.cpp:1901 src/libslic3r/PrintConfig.cpp:1964 +#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2335 src/libslic3r/PrintConfig.cpp:2464 +#: src/libslic3r/PrintConfig.cpp:2543 src/libslic3r/PrintConfig.cpp:2550 +#: src/libslic3r/PrintConfig.cpp:2557 src/libslic3r/PrintConfig.cpp:2587 +#: src/libslic3r/PrintConfig.cpp:2597 src/libslic3r/PrintConfig.cpp:2607 +#: src/libslic3r/PrintConfig.cpp:2767 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2940 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:2958 src/libslic3r/PrintConfig.cpp:2968 +#: src/libslic3r/PrintConfig.cpp:3033 src/libslic3r/PrintConfig.cpp:3043 +#: src/libslic3r/PrintConfig.cpp:3055 src/libslic3r/PrintConfig.cpp:3075 +#: src/libslic3r/PrintConfig.cpp:3085 src/libslic3r/PrintConfig.cpp:3095 +#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3128 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3153 +#: src/libslic3r/PrintConfig.cpp:3166 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3221 src/libslic3r/PrintConfig.cpp:3230 +#: src/libslic3r/PrintConfig.cpp:3240 src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3280 msgid "mm" msgstr "" @@ -223,7 +225,7 @@ msgstr "" msgid "Circular" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:243 +#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:240 #: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:358 msgid "Custom" msgstr "" @@ -233,7 +235,7 @@ msgid "Invalid" msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2288 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2306 msgid "Shape" msgstr "" @@ -254,7 +256,7 @@ msgid "Load..." msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413 -#: src/slic3r/GUI/Tab.cpp:3484 +#: src/slic3r/GUI/Tab.cpp:3502 msgid "Remove" msgstr "" @@ -296,7 +298,7 @@ msgstr "" msgid "Choose an STL file to import bed model from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1327 +#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1325 msgid "Bed Shape" msgstr "" @@ -320,11 +322,11 @@ msgstr "" msgid "OctoPrint version" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:218 +#: src/slic3r/GUI/BonjourDialog.cpp:224 msgid "Searching for devices" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:225 +#: src/slic3r/GUI/BonjourDialog.cpp:231 msgid "Finished" msgstr "" @@ -332,11 +334,11 @@ msgstr "" msgid "Buttons And Text Colors Description" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:36 +#: src/slic3r/GUI/ButtonsDescription.cpp:36 src/slic3r/GUI/Preferences.cpp:517 msgid "Value is the same as the system value" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:53 +#: src/slic3r/GUI/ButtonsDescription.cpp:53 src/slic3r/GUI/Preferences.cpp:528 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" @@ -362,7 +364,7 @@ msgid "" "The first layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:969 +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:994 msgid "First layer height" msgstr "" @@ -438,31 +440,31 @@ msgstr "" #: src/slic3r/GUI/ConfigManipulation.cpp:202 #: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93 -#: src/slic3r/GUI/GUI_ObjectList.cpp:668 src/slic3r/GUI/Plater.cpp:389 -#: src/slic3r/GUI/Tab.cpp:1432 src/slic3r/GUI/Tab.cpp:1434 -#: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:472 -#: src/libslic3r/PrintConfig.cpp:496 src/libslic3r/PrintConfig.cpp:848 -#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:899 -#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1086 -#: src/libslic3r/PrintConfig.cpp:1153 src/libslic3r/PrintConfig.cpp:1172 -#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1928 -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/slic3r/GUI/GUI_ObjectList.cpp:682 src/slic3r/GUI/Plater.cpp:389 +#: src/slic3r/GUI/Tab.cpp:1444 src/slic3r/GUI/Tab.cpp:1446 +#: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:497 +#: src/libslic3r/PrintConfig.cpp:521 src/libslic3r/PrintConfig.cpp:873 +#: src/libslic3r/PrintConfig.cpp:887 src/libslic3r/PrintConfig.cpp:924 +#: src/libslic3r/PrintConfig.cpp:1165 src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1242 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:2017 +#: src/libslic3r/PrintConfig.cpp:2034 msgid "Infill" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:320 +#: src/slic3r/GUI/ConfigManipulation.cpp:322 msgid "Head penetration should not be greater than the head width." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:322 +#: src/slic3r/GUI/ConfigManipulation.cpp:324 msgid "Invalid Head penetration" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:333 +#: src/slic3r/GUI/ConfigManipulation.cpp:335 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:335 +#: src/slic3r/GUI/ConfigManipulation.cpp:337 msgid "Invalid pinhead diameter" msgstr "" @@ -483,7 +485,7 @@ msgid "User" msgstr "" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/ExtrusionEntity.cpp:309 +#: src/slic3r/GUI/GUI_Preview.cpp:226 src/libslic3r/ExtrusionEntity.cpp:309 msgid "Unknown" msgstr "" @@ -495,7 +497,7 @@ msgstr "" msgid "PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 src/libslic3r/Preset.cpp:1298 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 src/libslic3r/Preset.cpp:1303 msgid "print" msgstr "" @@ -503,16 +505,16 @@ msgstr "" msgid "filaments" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1300 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1305 msgid "SLA print" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 src/slic3r/GUI/Plater.cpp:696 -#: src/libslic3r/Preset.cpp:1301 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 src/slic3r/GUI/Plater.cpp:693 +#: src/libslic3r/Preset.cpp:1306 msgid "SLA material" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:62 src/libslic3r/Preset.cpp:1302 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:62 src/libslic3r/Preset.cpp:1307 msgid "printer" msgstr "" @@ -570,13 +572,13 @@ msgid "Standard" msgstr "" #: src/slic3r/GUI/ConfigWizard.cpp:311 src/slic3r/GUI/ConfigWizard.cpp:605 -#: src/slic3r/GUI/Tab.cpp:3565 src/slic3r/GUI/UnsavedChangesDialog.cpp:933 +#: src/slic3r/GUI/Tab.cpp:3583 src/slic3r/GUI/UnsavedChangesDialog.cpp:933 msgid "All" msgstr "" #: src/slic3r/GUI/ConfigWizard.cpp:312 src/slic3r/GUI/ConfigWizard.cpp:606 -#: src/slic3r/GUI/DoubleSlider.cpp:1859 src/slic3r/GUI/Plater.cpp:361 -#: src/slic3r/GUI/Plater.cpp:504 +#: src/slic3r/GUI/DoubleSlider.cpp:1879 src/slic3r/GUI/Plater.cpp:361 +#: src/slic3r/GUI/Plater.cpp:504 src/libslic3r/PrintConfig.cpp:1045 msgid "None" msgstr "" @@ -643,35 +645,35 @@ msgid "" "filament:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1107 +#: src/slic3r/GUI/ConfigWizard.cpp:1105 msgid "Custom Printer Setup" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1107 +#: src/slic3r/GUI/ConfigWizard.cpp:1105 msgid "Custom Printer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1109 +#: src/slic3r/GUI/ConfigWizard.cpp:1107 msgid "Define a custom printer profile" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1111 +#: src/slic3r/GUI/ConfigWizard.cpp:1109 msgid "Custom profile name:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1136 +#: src/slic3r/GUI/ConfigWizard.cpp:1134 msgid "Automatic updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1136 +#: src/slic3r/GUI/ConfigWizard.cpp:1134 msgid "Updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1144 src/slic3r/GUI/Preferences.cpp:94 +#: src/slic3r/GUI/ConfigWizard.cpp:1142 src/slic3r/GUI/Preferences.cpp:94 msgid "Check for application updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1148 +#: src/slic3r/GUI/ConfigWizard.cpp:1146 #, possible-c-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -680,11 +682,11 @@ msgid "" "notification mechanisms, no automatic installation is done." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1154 src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/ConfigWizard.cpp:1152 src/slic3r/GUI/Preferences.cpp:129 msgid "Update built-in Presets automatically" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1158 +#: src/slic3r/GUI/ConfigWizard.cpp:1156 #, possible-c-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -693,30 +695,30 @@ msgid "" "startup." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1161 +#: src/slic3r/GUI/ConfigWizard.cpp:1159 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1166 +#: src/slic3r/GUI/ConfigWizard.cpp:1164 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1173 src/slic3r/GUI/GUI_ObjectList.cpp:1825 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4567 src/slic3r/GUI/Plater.cpp:3116 -#: src/slic3r/GUI/Plater.cpp:4001 src/slic3r/GUI/Plater.cpp:4032 +#: src/slic3r/GUI/ConfigWizard.cpp:1171 src/slic3r/GUI/GUI_ObjectList.cpp:1843 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4601 src/slic3r/GUI/Plater.cpp:3130 +#: src/slic3r/GUI/Plater.cpp:4022 src/slic3r/GUI/Plater.cpp:4053 msgid "Reload from disk" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1176 +#: src/slic3r/GUI/ConfigWizard.cpp:1174 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1180 +#: src/slic3r/GUI/ConfigWizard.cpp:1178 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -724,23 +726,23 @@ msgid "" "using an open file dialog." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1190 +#: src/slic3r/GUI/ConfigWizard.cpp:1188 msgid "Files association" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1192 src/slic3r/GUI/Preferences.cpp:112 +#: src/slic3r/GUI/ConfigWizard.cpp:1190 src/slic3r/GUI/Preferences.cpp:112 msgid "Associate .3mf files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1193 src/slic3r/GUI/Preferences.cpp:119 +#: src/slic3r/GUI/ConfigWizard.cpp:1191 src/slic3r/GUI/Preferences.cpp:119 msgid "Associate .stl files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1204 +#: src/slic3r/GUI/ConfigWizard.cpp:1202 msgid "View mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1204 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -749,221 +751,221 @@ msgid "" "fine-tuning, they are suitable for advanced and expert users, respectively." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1211 +#: src/slic3r/GUI/ConfigWizard.cpp:1209 msgid "Simple mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1212 +#: src/slic3r/GUI/ConfigWizard.cpp:1210 msgid "Advanced mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1213 +#: src/slic3r/GUI/ConfigWizard.cpp:1211 msgid "Expert mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1219 +#: src/slic3r/GUI/ConfigWizard.cpp:1217 msgid "The size of the object can be specified in inches" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1220 +#: src/slic3r/GUI/ConfigWizard.cpp:1218 msgid "Use inches" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1254 +#: src/slic3r/GUI/ConfigWizard.cpp:1252 msgid "Other Vendors" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1258 +#: src/slic3r/GUI/ConfigWizard.cpp:1256 #, possible-c-format msgid "Pick another vendor supported by %s" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1289 +#: src/slic3r/GUI/ConfigWizard.cpp:1287 msgid "Firmware Type" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1289 src/slic3r/GUI/Tab.cpp:2172 +#: src/slic3r/GUI/ConfigWizard.cpp:1287 src/slic3r/GUI/Tab.cpp:2186 msgid "Firmware" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1293 +#: src/slic3r/GUI/ConfigWizard.cpp:1291 msgid "Choose the type of firmware used by your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1327 +#: src/slic3r/GUI/ConfigWizard.cpp:1325 msgid "Bed Shape and Size" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1330 +#: src/slic3r/GUI/ConfigWizard.cpp:1328 msgid "Set the shape of your printer's bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1350 +#: src/slic3r/GUI/ConfigWizard.cpp:1348 msgid "Filament and Nozzle Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1350 +#: src/slic3r/GUI/ConfigWizard.cpp:1348 msgid "Print Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1364 +#: src/slic3r/GUI/ConfigWizard.cpp:1362 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1367 +#: src/slic3r/GUI/ConfigWizard.cpp:1365 msgid "Nozzle Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1377 +#: src/slic3r/GUI/ConfigWizard.cpp:1375 msgid "Enter the diameter of your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1378 +#: src/slic3r/GUI/ConfigWizard.cpp:1376 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1381 +#: src/slic3r/GUI/ConfigWizard.cpp:1379 msgid "Filament Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1415 +#: src/slic3r/GUI/ConfigWizard.cpp:1413 msgid "Nozzle and Bed Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1415 +#: src/slic3r/GUI/ConfigWizard.cpp:1413 msgid "Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1431 +#: src/slic3r/GUI/ConfigWizard.cpp:1429 msgid "Enter the temperature needed for extruding your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1432 +#: src/slic3r/GUI/ConfigWizard.cpp:1430 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1435 +#: src/slic3r/GUI/ConfigWizard.cpp:1433 msgid "Extrusion Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1436 src/slic3r/GUI/ConfigWizard.cpp:1450 -#: src/libslic3r/PrintConfig.cpp:202 src/libslic3r/PrintConfig.cpp:950 -#: src/libslic3r/PrintConfig.cpp:994 src/libslic3r/PrintConfig.cpp:2294 +#: src/slic3r/GUI/ConfigWizard.cpp:1434 src/slic3r/GUI/ConfigWizard.cpp:1448 +#: src/libslic3r/PrintConfig.cpp:202 src/libslic3r/PrintConfig.cpp:975 +#: src/libslic3r/PrintConfig.cpp:1019 src/libslic3r/PrintConfig.cpp:2383 msgid "°C" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1445 +#: src/slic3r/GUI/ConfigWizard.cpp:1443 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1446 +#: src/slic3r/GUI/ConfigWizard.cpp:1444 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1449 +#: src/slic3r/GUI/ConfigWizard.cpp:1447 msgid "Bed Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2582 +#: src/slic3r/GUI/ConfigWizard.cpp:1907 src/slic3r/GUI/ConfigWizard.cpp:2580 msgid "Filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2584 +#: src/slic3r/GUI/ConfigWizard.cpp:1907 src/slic3r/GUI/ConfigWizard.cpp:2582 msgid "SLA Materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1963 +#: src/slic3r/GUI/ConfigWizard.cpp:1961 msgid "FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1968 +#: src/slic3r/GUI/ConfigWizard.cpp:1966 msgid "SLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2274 src/slic3r/GUI/DoubleSlider.cpp:2245 -#: src/slic3r/GUI/DoubleSlider.cpp:2265 src/slic3r/GUI/GUI.cpp:244 +#: src/slic3r/GUI/ConfigWizard.cpp:2272 src/slic3r/GUI/DoubleSlider.cpp:2265 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 src/slic3r/GUI/GUI.cpp:250 msgid "Notice" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2295 +#: src/slic3r/GUI/ConfigWizard.cpp:2293 msgid "The following FFF printer models have no filament selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2299 +#: src/slic3r/GUI/ConfigWizard.cpp:2297 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2313 +#: src/slic3r/GUI/ConfigWizard.cpp:2311 msgid "The following SLA printer models have no materials selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2317 +#: src/slic3r/GUI/ConfigWizard.cpp:2315 msgid "Do you want to select default SLA materials for these printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2545 +#: src/slic3r/GUI/ConfigWizard.cpp:2543 msgid "Select all standard printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2548 +#: src/slic3r/GUI/ConfigWizard.cpp:2546 msgid "< &Back" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2549 +#: src/slic3r/GUI/ConfigWizard.cpp:2547 msgid "&Next >" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2550 +#: src/slic3r/GUI/ConfigWizard.cpp:2548 msgid "&Finish" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2551 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ConfigWizard.cpp:2549 src/slic3r/GUI/FirmwareDialog.cpp:151 #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:248 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:656 msgid "Cancel" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2564 +#: src/slic3r/GUI/ConfigWizard.cpp:2562 msgid "Prusa FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2567 +#: src/slic3r/GUI/ConfigWizard.cpp:2565 msgid "Prusa MSLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2582 +#: src/slic3r/GUI/ConfigWizard.cpp:2580 msgid "Filament Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2582 src/slic3r/GUI/ConfigWizard.cpp:2584 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4144 +#: src/slic3r/GUI/ConfigWizard.cpp:2580 src/slic3r/GUI/ConfigWizard.cpp:2582 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4178 msgid "Type:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2584 +#: src/slic3r/GUI/ConfigWizard.cpp:2582 msgid "SLA Material Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2701 +#: src/slic3r/GUI/ConfigWizard.cpp:2699 msgid "Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2702 +#: src/slic3r/GUI/ConfigWizard.cpp:2700 msgid "Configuration &Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2704 +#: src/slic3r/GUI/ConfigWizard.cpp:2702 msgid "Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2705 +#: src/slic3r/GUI/ConfigWizard.cpp:2703 msgid "Configuration &Wizard" msgstr "" @@ -971,19 +973,19 @@ msgstr "" msgid "Place bearings in slots and resume printing" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1224 +#: src/slic3r/GUI/DoubleSlider.cpp:1244 msgid "One layer mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1226 +#: src/slic3r/GUI/DoubleSlider.cpp:1246 msgid "Discard all custom changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1230 src/slic3r/GUI/DoubleSlider.cpp:1995 +#: src/slic3r/GUI/DoubleSlider.cpp:1250 src/slic3r/GUI/DoubleSlider.cpp:2015 msgid "Jump to move" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1233 +#: src/slic3r/GUI/DoubleSlider.cpp:1253 #, possible-c-format msgid "" "Jump to height %s\n" @@ -991,48 +993,48 @@ msgid "" "or Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1236 +#: src/slic3r/GUI/DoubleSlider.cpp:1256 #, possible-c-format msgid "" "Jump to height %s\n" "or Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1241 +#: src/slic3r/GUI/DoubleSlider.cpp:1261 msgid "Edit current color - Right click the colored slider segment" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1251 +#: src/slic3r/GUI/DoubleSlider.cpp:1271 msgid "Print mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1265 +#: src/slic3r/GUI/DoubleSlider.cpp:1285 msgid "Add extruder change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1267 +#: src/slic3r/GUI/DoubleSlider.cpp:1287 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1269 +#: src/slic3r/GUI/DoubleSlider.cpp:1289 msgid "Add color change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1270 +#: src/slic3r/GUI/DoubleSlider.cpp:1290 msgid "or press \"+\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1272 +#: src/slic3r/GUI/DoubleSlider.cpp:1292 msgid "Add another code - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1273 +#: src/slic3r/GUI/DoubleSlider.cpp:1293 msgid "Add another code - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1279 +#: src/slic3r/GUI/DoubleSlider.cpp:1299 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1040,255 +1042,255 @@ msgid "" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1288 +#: src/slic3r/GUI/DoubleSlider.cpp:1308 msgid "Color change (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1289 +#: src/slic3r/GUI/DoubleSlider.cpp:1309 msgid "Color change (\"%1%\") for Extruder %2%" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1291 +#: src/slic3r/GUI/DoubleSlider.cpp:1311 msgid "Pause print (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1293 +#: src/slic3r/GUI/DoubleSlider.cpp:1313 msgid "Custom template (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1295 +#: src/slic3r/GUI/DoubleSlider.cpp:1315 msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1302 +#: src/slic3r/GUI/DoubleSlider.cpp:1322 msgid "Note" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1304 +#: src/slic3r/GUI/DoubleSlider.cpp:1324 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 "" -#: src/slic3r/GUI/DoubleSlider.cpp:1307 +#: src/slic3r/GUI/DoubleSlider.cpp:1327 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." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1310 +#: src/slic3r/GUI/DoubleSlider.cpp:1330 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1313 +#: src/slic3r/GUI/DoubleSlider.cpp:1333 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:1338 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1320 +#: src/slic3r/GUI/DoubleSlider.cpp:1340 msgid "Edit tick mark - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1321 +#: src/slic3r/GUI/DoubleSlider.cpp:1341 msgid "Edit tick mark - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1417 src/slic3r/GUI/DoubleSlider.cpp:1451 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1864 +#: src/slic3r/GUI/DoubleSlider.cpp:1437 src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1882 #, possible-c-format msgid "Extruder %d" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1418 src/slic3r/GUI/GUI_ObjectList.cpp:1865 +#: src/slic3r/GUI/DoubleSlider.cpp:1438 src/slic3r/GUI/GUI_ObjectList.cpp:1883 msgid "active" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1427 +#: src/slic3r/GUI/DoubleSlider.cpp:1447 msgid "Switch code to Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1427 src/slic3r/GUI/GUI_ObjectList.cpp:1832 +#: src/slic3r/GUI/DoubleSlider.cpp:1447 src/slic3r/GUI/GUI_ObjectList.cpp:1850 msgid "Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "Change extruder (N/A)" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Use another extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1452 +#: src/slic3r/GUI/DoubleSlider.cpp:1472 msgid "used" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1460 +#: src/slic3r/GUI/DoubleSlider.cpp:1480 msgid "Switch code to Color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1461 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Add color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1797 +#: src/slic3r/GUI/DoubleSlider.cpp:1817 msgid "Add color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1808 +#: src/slic3r/GUI/DoubleSlider.cpp:1828 msgid "Add pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1812 +#: src/slic3r/GUI/DoubleSlider.cpp:1832 msgid "Add custom template" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1815 +#: src/slic3r/GUI/DoubleSlider.cpp:1835 msgid "Add custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1833 +#: src/slic3r/GUI/DoubleSlider.cpp:1853 msgid "Edit color" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1834 +#: src/slic3r/GUI/DoubleSlider.cpp:1854 msgid "Edit pause print message" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1835 +#: src/slic3r/GUI/DoubleSlider.cpp:1855 msgid "Edit custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1841 +#: src/slic3r/GUI/DoubleSlider.cpp:1861 msgid "Delete color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1842 +#: src/slic3r/GUI/DoubleSlider.cpp:1862 msgid "Delete tool change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1843 +#: src/slic3r/GUI/DoubleSlider.cpp:1863 msgid "Delete pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1844 +#: src/slic3r/GUI/DoubleSlider.cpp:1864 msgid "Delete custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1854 src/slic3r/GUI/DoubleSlider.cpp:1995 +#: src/slic3r/GUI/DoubleSlider.cpp:1874 src/slic3r/GUI/DoubleSlider.cpp:2015 msgid "Jump to height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1859 +#: src/slic3r/GUI/DoubleSlider.cpp:1879 msgid "Hide ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1863 +#: src/slic3r/GUI/DoubleSlider.cpp:1883 msgid "Show object height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1863 +#: src/slic3r/GUI/DoubleSlider.cpp:1883 msgid "Show object height on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1867 +#: src/slic3r/GUI/DoubleSlider.cpp:1887 msgid "Show estimated print time" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1867 +#: src/slic3r/GUI/DoubleSlider.cpp:1887 msgid "Show estimated print time on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1871 +#: src/slic3r/GUI/DoubleSlider.cpp:1891 msgid "Ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1871 +#: src/slic3r/GUI/DoubleSlider.cpp:1891 msgid "Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1876 +#: src/slic3r/GUI/DoubleSlider.cpp:1896 msgid "Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1962 +#: src/slic3r/GUI/DoubleSlider.cpp:1982 msgid "Enter custom G-code used on current layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1963 +#: src/slic3r/GUI/DoubleSlider.cpp:1983 msgid "Custom G-code on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1978 +#: src/slic3r/GUI/DoubleSlider.cpp:1998 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:1999 msgid "Message for pause print on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1994 +#: src/slic3r/GUI/DoubleSlider.cpp:2014 msgid "Enter the move you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1994 +#: src/slic3r/GUI/DoubleSlider.cpp:2014 msgid "Enter the height you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2259 msgid "The last color change data was saved for a single extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2240 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2260 src/slic3r/GUI/DoubleSlider.cpp:2275 msgid "The last color change data was saved for a multi extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2242 +#: src/slic3r/GUI/DoubleSlider.cpp:2262 msgid "Your current changes will delete all saved color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2243 src/slic3r/GUI/DoubleSlider.cpp:2263 +#: src/slic3r/GUI/DoubleSlider.cpp:2263 src/slic3r/GUI/DoubleSlider.cpp:2283 msgid "Are you sure you want to continue?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2256 +#: src/slic3r/GUI/DoubleSlider.cpp:2276 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 "" -#: src/slic3r/GUI/DoubleSlider.cpp:2259 +#: src/slic3r/GUI/DoubleSlider.cpp:2279 msgid "Do you want to delete all saved tool changes?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2261 +#: src/slic3r/GUI/DoubleSlider.cpp:2281 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2262 +#: src/slic3r/GUI/DoubleSlider.cpp:2282 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" -#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:512 -#: src/slic3r/GUI/GUI_ObjectList.cpp:524 src/slic3r/GUI/GUI_ObjectList.cpp:1033 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4582 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4592 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4627 +#: src/slic3r/GUI/ExtraRenderers.cpp:296 src/slic3r/GUI/GUI_ObjectList.cpp:526 +#: src/slic3r/GUI/GUI_ObjectList.cpp:538 src/slic3r/GUI/GUI_ObjectList.cpp:1047 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4626 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4661 #: src/slic3r/GUI/ObjectDataViewModel.cpp:209 #: src/slic3r/GUI/ObjectDataViewModel.cpp:266 #: src/slic3r/GUI/ObjectDataViewModel.cpp:291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:499 src/libslic3r/PrintConfig.cpp:552 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:499 src/libslic3r/PrintConfig.cpp:577 msgid "default" msgstr "" @@ -1301,10 +1303,10 @@ msgid "Set extruder change for every" msgstr "" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:53 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1089 -#: src/libslic3r/PrintConfig.cpp:1718 src/libslic3r/PrintConfig.cpp:1883 -#: src/libslic3r/PrintConfig.cpp:1950 src/libslic3r/PrintConfig.cpp:2157 -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:443 src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1807 src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2039 src/libslic3r/PrintConfig.cpp:2246 +#: src/libslic3r/PrintConfig.cpp:2292 msgid "layers" msgstr "" @@ -1328,7 +1330,7 @@ msgstr "" msgid "parameter name" msgstr "" -#: src/slic3r/GUI/Field.cpp:211 src/slic3r/GUI/OptionsGroup.cpp:781 +#: src/slic3r/GUI/Field.cpp:211 src/slic3r/GUI/OptionsGroup.cpp:780 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:886 msgid "N/A" msgstr "" @@ -1339,7 +1341,7 @@ msgid "%s doesn't support percentage" msgstr "" #: src/slic3r/GUI/Field.cpp:253 src/slic3r/GUI/Field.cpp:307 -#: src/slic3r/GUI/Field.cpp:1520 src/slic3r/GUI/GUI_ObjectLayers.cpp:413 +#: src/slic3r/GUI/Field.cpp:1507 src/slic3r/GUI/GUI_ObjectLayers.cpp:413 msgid "Invalid numeric input." msgstr "" @@ -1355,7 +1357,7 @@ msgid "Parameter validation" msgstr "" #: src/slic3r/GUI/Field.cpp:279 src/slic3r/GUI/Field.cpp:373 -#: src/slic3r/GUI/Field.cpp:1532 +#: src/slic3r/GUI/Field.cpp:1519 msgid "Input value is out of range" msgstr "" @@ -1481,7 +1483,7 @@ msgstr "" #: src/slic3r/GUI/FirmwareDialog.cpp:852 #: src/slic3r/GUI/Mouse3DController.cpp:551 -#: src/slic3r/GUI/PrintHostDialogs.cpp:189 +#: src/slic3r/GUI/PrintHostDialogs.cpp:200 msgid "Close" msgstr "" @@ -1499,222 +1501,222 @@ msgstr "" msgid "Cancelling..." msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:239 +#: src/slic3r/GUI/GCodeViewer.cpp:289 msgid "Tool position" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1016 +#: src/slic3r/GUI/GCodeViewer.cpp:1418 src/slic3r/GUI/GCodeViewer.cpp:1918 msgid "Generating toolpaths" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1405 +#: src/slic3r/GUI/GCodeViewer.cpp:1456 src/slic3r/GUI/GCodeViewer.cpp:2302 msgid "Generating vertex buffer" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1496 +#: src/slic3r/GUI/GCodeViewer.cpp:1719 src/slic3r/GUI/GCodeViewer.cpp:2390 msgid "Generating index buffers" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2225 +#: src/slic3r/GUI/GCodeViewer.cpp:3535 msgid "Click to hide" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2225 +#: src/slic3r/GUI/GCodeViewer.cpp:3535 msgid "Click to show" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2337 +#: src/slic3r/GUI/GCodeViewer.cpp:3647 msgid "up to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2343 +#: src/slic3r/GUI/GCodeViewer.cpp:3653 msgid "above" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2351 +#: src/slic3r/GUI/GCodeViewer.cpp:3661 msgid "from" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2351 +#: src/slic3r/GUI/GCodeViewer.cpp:3661 msgid "to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387 -#: src/slic3r/GUI/GUI_Preview.cpp:214 src/slic3r/GUI/GUI_Preview.cpp:533 -#: src/slic3r/GUI/GUI_Preview.cpp:942 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GCodeViewer.cpp:3697 +#: src/slic3r/GUI/GUI_Preview.cpp:211 src/slic3r/GUI/GUI_Preview.cpp:536 +#: src/slic3r/GUI/GUI_Preview.cpp:945 msgid "Feature type" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GCodeViewer.cpp:3697 #: src/slic3r/GUI/RammingChart.cpp:76 msgid "Time" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2387 +#: src/slic3r/GUI/GCodeViewer.cpp:3697 msgid "Percentage" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2390 +#: src/slic3r/GUI/GCodeViewer.cpp:3700 msgid "Height (mm)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2391 +#: src/slic3r/GUI/GCodeViewer.cpp:3701 msgid "Width (mm)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2392 +#: src/slic3r/GUI/GCodeViewer.cpp:3702 msgid "Speed (mm/s)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2393 +#: src/slic3r/GUI/GCodeViewer.cpp:3703 msgid "Fan Speed (%)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2394 +#: src/slic3r/GUI/GCodeViewer.cpp:3704 msgid "Volumetric flow rate (mm³/s)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2395 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/GUI_Preview.cpp:326 src/slic3r/GUI/GUI_Preview.cpp:471 -#: src/slic3r/GUI/GUI_Preview.cpp:532 src/slic3r/GUI/GUI_Preview.cpp:878 -#: src/slic3r/GUI/GUI_Preview.cpp:942 +#: src/slic3r/GUI/GCodeViewer.cpp:3705 src/slic3r/GUI/GUI_Preview.cpp:217 +#: src/slic3r/GUI/GUI_Preview.cpp:323 src/slic3r/GUI/GUI_Preview.cpp:474 +#: src/slic3r/GUI/GUI_Preview.cpp:535 src/slic3r/GUI/GUI_Preview.cpp:881 +#: src/slic3r/GUI/GUI_Preview.cpp:945 msgid "Tool" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2396 src/slic3r/GUI/GUI_Preview.cpp:221 -#: src/slic3r/GUI/GUI_Preview.cpp:530 src/slic3r/GUI/GUI_Preview.cpp:941 +#: src/slic3r/GUI/GCodeViewer.cpp:3706 src/slic3r/GUI/GUI_Preview.cpp:218 +#: src/slic3r/GUI/GUI_Preview.cpp:533 src/slic3r/GUI/GUI_Preview.cpp:944 msgid "Color Print" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2432 src/slic3r/GUI/GCodeViewer.cpp:2467 -#: src/slic3r/GUI/GCodeViewer.cpp:2472 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:519 src/libslic3r/PrintConfig.cpp:547 +#: src/slic3r/GUI/GCodeViewer.cpp:3742 src/slic3r/GUI/GCodeViewer.cpp:3777 +#: src/slic3r/GUI/GCodeViewer.cpp:3782 src/slic3r/GUI/GUI_ObjectList.cpp:326 +#: src/slic3r/GUI/wxExtensions.cpp:519 src/libslic3r/PrintConfig.cpp:572 msgid "Extruder" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2443 +#: src/slic3r/GUI/GCodeViewer.cpp:3753 msgid "Default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2467 +#: src/slic3r/GUI/GCodeViewer.cpp:3777 msgid "default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2562 src/slic3r/GUI/GCodeViewer.cpp:2608 +#: src/slic3r/GUI/GCodeViewer.cpp:3872 src/slic3r/GUI/GCodeViewer.cpp:3918 msgid "Color change" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2581 src/slic3r/GUI/GCodeViewer.cpp:2606 +#: src/slic3r/GUI/GCodeViewer.cpp:3891 src/slic3r/GUI/GCodeViewer.cpp:3916 msgid "Print" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2607 src/slic3r/GUI/GCodeViewer.cpp:2624 +#: src/slic3r/GUI/GCodeViewer.cpp:3917 src/slic3r/GUI/GCodeViewer.cpp:3934 msgid "Pause" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615 +#: src/slic3r/GUI/GCodeViewer.cpp:3922 src/slic3r/GUI/GCodeViewer.cpp:3925 msgid "Event" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615 +#: src/slic3r/GUI/GCodeViewer.cpp:3922 src/slic3r/GUI/GCodeViewer.cpp:3925 msgid "Remaining time" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2615 +#: src/slic3r/GUI/GCodeViewer.cpp:3925 msgid "Duration" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2650 src/slic3r/GUI/GUI_Preview.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/slic3r/GUI/GCodeViewer.cpp:3960 src/slic3r/GUI/GUI_Preview.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:2469 msgid "Travel" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2653 +#: src/slic3r/GUI/GCodeViewer.cpp:3963 msgid "Movement" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2654 +#: src/slic3r/GUI/GCodeViewer.cpp:3964 msgid "Extrusion" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2655 src/slic3r/GUI/Tab.cpp:1694 -#: src/slic3r/GUI/Tab.cpp:2582 +#: src/slic3r/GUI/GCodeViewer.cpp:3965 src/slic3r/GUI/Tab.cpp:1708 +#: src/slic3r/GUI/Tab.cpp:2596 msgid "Retraction" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2672 src/slic3r/GUI/GCodeViewer.cpp:2675 -#: src/slic3r/GUI/GUI_Preview.cpp:1024 +#: src/slic3r/GUI/GCodeViewer.cpp:3982 src/slic3r/GUI/GCodeViewer.cpp:3985 +#: src/slic3r/GUI/GUI_Preview.cpp:1027 msgid "Wipe" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2706 src/slic3r/GUI/GUI_Preview.cpp:248 -#: src/slic3r/GUI/GUI_Preview.cpp:262 +#: src/slic3r/GUI/GCodeViewer.cpp:4016 src/slic3r/GUI/GUI_Preview.cpp:245 +#: src/slic3r/GUI/GUI_Preview.cpp:259 msgid "Options" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2709 src/slic3r/GUI/GUI_Preview.cpp:1025 +#: src/slic3r/GUI/GCodeViewer.cpp:4019 src/slic3r/GUI/GUI_Preview.cpp:1028 msgid "Retractions" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2710 src/slic3r/GUI/GUI_Preview.cpp:1026 +#: src/slic3r/GUI/GCodeViewer.cpp:4020 src/slic3r/GUI/GUI_Preview.cpp:1029 msgid "Deretractions" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2711 src/slic3r/GUI/GUI_Preview.cpp:1027 +#: src/slic3r/GUI/GCodeViewer.cpp:4021 src/slic3r/GUI/GUI_Preview.cpp:1030 msgid "Tool changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2712 src/slic3r/GUI/GUI_Preview.cpp:1028 +#: src/slic3r/GUI/GCodeViewer.cpp:4022 src/slic3r/GUI/GUI_Preview.cpp:1031 msgid "Color changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2713 src/slic3r/GUI/GUI_Preview.cpp:1029 +#: src/slic3r/GUI/GCodeViewer.cpp:4023 src/slic3r/GUI/GUI_Preview.cpp:1032 msgid "Print pauses" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2714 src/slic3r/GUI/GUI_Preview.cpp:1030 +#: src/slic3r/GUI/GCodeViewer.cpp:4024 src/slic3r/GUI/GUI_Preview.cpp:1033 msgid "Custom G-codes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2725 src/slic3r/GUI/GCodeViewer.cpp:2749 -#: src/slic3r/GUI/Plater.cpp:697 src/libslic3r/PrintConfig.cpp:117 +#: src/slic3r/GUI/GCodeViewer.cpp:4035 src/slic3r/GUI/GCodeViewer.cpp:4059 +#: src/slic3r/GUI/Plater.cpp:694 src/libslic3r/PrintConfig.cpp:117 msgid "Printer" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2727 src/slic3r/GUI/GCodeViewer.cpp:2754 -#: src/slic3r/GUI/Plater.cpp:693 +#: src/slic3r/GUI/GCodeViewer.cpp:4037 src/slic3r/GUI/GCodeViewer.cpp:4064 +#: src/slic3r/GUI/Plater.cpp:690 msgid "Print settings" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2730 src/slic3r/GUI/GCodeViewer.cpp:2760 -#: src/slic3r/GUI/Plater.cpp:694 src/slic3r/GUI/Tab.cpp:1794 -#: src/slic3r/GUI/Tab.cpp:1795 +#: src/slic3r/GUI/GCodeViewer.cpp:4040 src/slic3r/GUI/GCodeViewer.cpp:4070 +#: src/slic3r/GUI/Plater.cpp:691 src/slic3r/GUI/Tab.cpp:1808 +#: src/slic3r/GUI/Tab.cpp:1809 msgid "Filament" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2785 src/slic3r/GUI/GCodeViewer.cpp:2790 -#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1135 -#: src/slic3r/GUI/Plater.cpp:1220 +#: src/slic3r/GUI/GCodeViewer.cpp:4095 src/slic3r/GUI/GCodeViewer.cpp:4100 +#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1143 +#: src/slic3r/GUI/Plater.cpp:1228 msgid "Estimated printing time" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2785 +#: src/slic3r/GUI/GCodeViewer.cpp:4095 msgid "Normal mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2790 +#: src/slic3r/GUI/GCodeViewer.cpp:4100 msgid "Stealth mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2817 +#: src/slic3r/GUI/GCodeViewer.cpp:4128 msgid "Show stealth mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2821 +#: src/slic3r/GUI/GCodeViewer.cpp:4132 msgid "Show normal mode" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:236 src/slic3r/GUI/GLCanvas3D.cpp:4610 +#: src/slic3r/GUI/GLCanvas3D.cpp:236 src/slic3r/GUI/GLCanvas3D.cpp:4619 msgid "Variable layer height" msgstr "" @@ -1774,7 +1776,7 @@ msgstr "" msgid "Smooth" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:285 src/libslic3r/PrintConfig.cpp:571 +#: src/slic3r/GUI/GLCanvas3D.cpp:285 src/libslic3r/PrintConfig.cpp:596 msgid "Radius" msgstr "" @@ -1782,7 +1784,7 @@ msgstr "" msgid "Keep min" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:304 src/slic3r/GUI/GLCanvas3D.cpp:4050 +#: src/slic3r/GUI/GLCanvas3D.cpp:304 src/slic3r/GUI/GLCanvas3D.cpp:4055 msgid "Reset" msgstr "" @@ -1842,171 +1844,171 @@ msgstr "" msgid "Gizmo-Rotate" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3388 +#: src/slic3r/GUI/GLCanvas3D.cpp:3389 msgid "Move Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3858 src/slic3r/GUI/GLCanvas3D.cpp:4571 +#: src/slic3r/GUI/GLCanvas3D.cpp:3859 src/slic3r/GUI/GLCanvas3D.cpp:4580 msgid "Switch to Settings" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3859 src/slic3r/GUI/GLCanvas3D.cpp:4571 +#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4580 msgid "Print Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572 +#: src/slic3r/GUI/GLCanvas3D.cpp:3861 src/slic3r/GUI/GLCanvas3D.cpp:4581 msgid "Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572 +#: src/slic3r/GUI/GLCanvas3D.cpp:3861 src/slic3r/GUI/GLCanvas3D.cpp:4581 msgid "Material Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3861 src/slic3r/GUI/GLCanvas3D.cpp:4573 +#: src/slic3r/GUI/GLCanvas3D.cpp:3862 src/slic3r/GUI/GLCanvas3D.cpp:4582 msgid "Printer Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3909 +#: src/slic3r/GUI/GLCanvas3D.cpp:3914 msgid "Undo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3909 +#: src/slic3r/GUI/GLCanvas3D.cpp:3914 msgid "Redo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3930 +#: src/slic3r/GUI/GLCanvas3D.cpp:3935 #, possible-c-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3930 +#: src/slic3r/GUI/GLCanvas3D.cpp:3935 #, possible-c-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3950 src/slic3r/GUI/GLCanvas3D.cpp:4589 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 src/slic3r/GUI/Search.cpp:351 +#: src/slic3r/GUI/GLCanvas3D.cpp:3955 src/slic3r/GUI/GLCanvas3D.cpp:4598 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 src/slic3r/GUI/Search.cpp:348 msgid "Search" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3964 src/slic3r/GUI/GLCanvas3D.cpp:3972 -#: src/slic3r/GUI/Search.cpp:358 +#: src/slic3r/GUI/GLCanvas3D.cpp:3969 src/slic3r/GUI/GLCanvas3D.cpp:3977 +#: src/slic3r/GUI/Search.cpp:355 msgid "Enter a search term" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4003 +#: src/slic3r/GUI/GLCanvas3D.cpp:4008 msgid "Arrange options" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4033 +#: src/slic3r/GUI/GLCanvas3D.cpp:4038 msgid "Press %1%left mouse button to enter the exact value" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4035 +#: src/slic3r/GUI/GLCanvas3D.cpp:4040 msgid "Spacing" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4042 +#: src/slic3r/GUI/GLCanvas3D.cpp:4047 msgid "Enable rotations (slow)" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4060 src/slic3r/GUI/GLCanvas3D.cpp:4481 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Plater.cpp:1648 +#: src/slic3r/GUI/GLCanvas3D.cpp:4065 src/slic3r/GUI/GLCanvas3D.cpp:4490 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Plater.cpp:1656 msgid "Arrange" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4455 +#: src/slic3r/GUI/GLCanvas3D.cpp:4464 msgid "Add..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4463 src/slic3r/GUI/GUI_ObjectList.cpp:1878 -#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022 -#: src/slic3r/GUI/Tab.cpp:3484 +#: src/slic3r/GUI/GLCanvas3D.cpp:4472 src/slic3r/GUI/GUI_ObjectList.cpp:1896 +#: src/slic3r/GUI/Plater.cpp:4019 src/slic3r/GUI/Plater.cpp:4043 +#: src/slic3r/GUI/Tab.cpp:3502 msgid "Delete" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4472 src/slic3r/GUI/KBShortcutsDialog.cpp:88 -#: src/slic3r/GUI/Plater.cpp:5107 +#: src/slic3r/GUI/GLCanvas3D.cpp:4481 src/slic3r/GUI/KBShortcutsDialog.cpp:88 +#: src/slic3r/GUI/Plater.cpp:5130 msgid "Delete all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4481 src/slic3r/GUI/KBShortcutsDialog.cpp:121 +#: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Arrange selection" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4481 +#: src/slic3r/GUI/GLCanvas3D.cpp:4490 msgid "Click right mouse button to show arrangement options" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4503 +#: src/slic3r/GUI/GLCanvas3D.cpp:4512 msgid "Copy" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4512 +#: src/slic3r/GUI/GLCanvas3D.cpp:4521 msgid "Paste" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4524 src/slic3r/GUI/Plater.cpp:3857 -#: src/slic3r/GUI/Plater.cpp:3869 src/slic3r/GUI/Plater.cpp:4007 +#: src/slic3r/GUI/GLCanvas3D.cpp:4533 src/slic3r/GUI/Plater.cpp:3878 +#: src/slic3r/GUI/Plater.cpp:3890 src/slic3r/GUI/Plater.cpp:4028 msgid "Add instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4535 src/slic3r/GUI/Plater.cpp:4009 +#: src/slic3r/GUI/GLCanvas3D.cpp:4544 src/slic3r/GUI/Plater.cpp:4030 msgid "Remove instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4548 +#: src/slic3r/GUI/GLCanvas3D.cpp:4557 msgid "Split to objects" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4558 src/slic3r/GUI/GUI_ObjectList.cpp:1650 +#: src/slic3r/GUI/GLCanvas3D.cpp:4567 src/slic3r/GUI/GUI_ObjectList.cpp:1668 msgid "Split to parts" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/GLCanvas3D.cpp:4669 src/slic3r/GUI/KBShortcutsDialog.cpp:89 #: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Undo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/GLCanvas3D.cpp:4699 +#: src/slic3r/GUI/GLCanvas3D.cpp:4669 src/slic3r/GUI/GLCanvas3D.cpp:4708 msgid "Click right mouse button to open/close History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4683 +#: src/slic3r/GUI/GLCanvas3D.cpp:4692 msgid "Next Undo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:90 +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/KBShortcutsDialog.cpp:90 #: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Redo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4721 +#: src/slic3r/GUI/GLCanvas3D.cpp:4730 msgid "Next Redo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6345 +#: src/slic3r/GUI/GLCanvas3D.cpp:6354 msgid "Selection-Add from rectangle" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6364 +#: src/slic3r/GUI/GLCanvas3D.cpp:6373 msgid "Selection-Remove from rectangle" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 src/libslic3r/PrintConfig.cpp:3690 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 src/libslic3r/PrintConfig.cpp:3771 msgid "Cut" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:322 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:467 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:468 msgid "in" msgstr "" @@ -2097,7 +2099,7 @@ msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1613 msgid "Sphere" msgstr "" @@ -2176,7 +2178,7 @@ msgid "Quality" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 -#: src/libslic3r/PrintConfig.cpp:3183 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Closing distance" msgstr "" @@ -2229,18 +2231,18 @@ msgid "Move" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:461 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:508 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 +#: src/libslic3r/PrintConfig.cpp:3820 msgid "Rotate" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/libslic3r/PrintConfig.cpp:3754 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:219 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:528 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:544 +#: src/libslic3r/PrintConfig.cpp:3835 msgid "Scale" msgstr "" @@ -2290,7 +2292,7 @@ msgid "Minimal points distance" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 -#: src/libslic3r/PrintConfig.cpp:3013 +#: src/libslic3r/PrintConfig.cpp:3102 msgid "Support points density" msgstr "" @@ -2355,9 +2357,9 @@ msgstr "" msgid "Are you sure you want to do it?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:262 #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:557 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:581 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:586 #: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366 msgid "Warning" msgstr "" @@ -2466,21 +2468,21 @@ msgstr "" msgid "Add supports" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:239 +#: src/slic3r/GUI/GUI_App.cpp:247 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:241 +#: src/slic3r/GUI/GUI_App.cpp:249 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:242 +#: src/slic3r/GUI/GUI_App.cpp:250 msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:391 msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " "(according to XDG Base Directory Specification) to \n" @@ -2499,20 +2501,20 @@ msgid "" "What do you want to do now?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:390 +#: src/slic3r/GUI/GUI_App.cpp:399 #, possible-c-format msgid "%s - BREAKING CHANGE" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:392 +#: src/slic3r/GUI/GUI_App.cpp:401 msgid "Quit, I will move my data now" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:392 +#: src/slic3r/GUI/GUI_App.cpp:401 msgid "Start the application" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:580 +#: src/slic3r/GUI/GUI_App.cpp:589 #, possible-c-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -2522,11 +2524,11 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:583 +#: src/slic3r/GUI/GUI_App.cpp:592 msgid "Fatal error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:587 +#: src/slic3r/GUI/GUI_App.cpp:596 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -2535,256 +2537,258 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:590 +#: src/slic3r/GUI/GUI_App.cpp:599 msgid "Critical error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:711 +#: src/slic3r/GUI/GUI_App.cpp:726 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " "not be affected." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:717 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:771 +#: src/slic3r/GUI/GUI_App.cpp:787 #, possible-c-format msgid "" "%s\n" "Do you want to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:773 src/slic3r/GUI/UnsavedChangesDialog.cpp:665 +#: src/slic3r/GUI/GUI_App.cpp:789 src/slic3r/GUI/UnsavedChangesDialog.cpp:665 msgid "Remember my choice" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:808 +#: src/slic3r/GUI/GUI_App.cpp:827 msgid "Loading configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:876 +#: src/slic3r/GUI/GUI_App.cpp:892 msgid "Preparing settings tabs" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1115 +#: src/slic3r/GUI/GUI_App.cpp:1149 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1119 +#: src/slic3r/GUI/GUI_App.cpp:1153 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" "Settings will be available in physical printers settings." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1121 +#: src/slic3r/GUI/GUI_App.cpp:1155 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" "Note: This name can be changed later from the physical printers settings" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1124 src/slic3r/GUI/PhysicalPrinterDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:1158 src/slic3r/GUI/PhysicalPrinterDialog.cpp:631 msgid "Information" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1137 src/slic3r/GUI/GUI_App.cpp:1148 +#: src/slic3r/GUI/GUI_App.cpp:1171 src/slic3r/GUI/GUI_App.cpp:1182 msgid "Recreating" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1153 +#: src/slic3r/GUI/GUI_App.cpp:1187 msgid "Loading of current presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1158 +#: src/slic3r/GUI/GUI_App.cpp:1192 msgid "Loading of a mode view" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1234 +#: src/slic3r/GUI/GUI_App.cpp:1269 msgid "Choose one file (3MF/AMF):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1246 +#: src/slic3r/GUI/GUI_App.cpp:1281 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1258 +#: src/slic3r/GUI/GUI_App.cpp:1293 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1269 +#: src/slic3r/GUI/GUI_App.cpp:1304 msgid "Changing of an application language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1392 +#: src/slic3r/GUI/GUI_App.cpp:1427 msgid "Select the language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1392 +#: src/slic3r/GUI/GUI_App.cpp:1427 msgid "Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1541 +#: src/slic3r/GUI/GUI_App.cpp:1576 msgid "modified" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1590 +#: src/slic3r/GUI/GUI_App.cpp:1625 #, possible-c-format msgid "Run %s" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1594 +#: src/slic3r/GUI/GUI_App.cpp:1629 msgid "&Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1594 +#: src/slic3r/GUI/GUI_App.cpp:1629 msgid "Inspect / activate configuration snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1595 +#: src/slic3r/GUI/GUI_App.cpp:1630 msgid "Take Configuration &Snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1595 +#: src/slic3r/GUI/GUI_App.cpp:1630 msgid "Capture a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1596 +#: src/slic3r/GUI/GUI_App.cpp:1631 msgid "Check for updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1596 +#: src/slic3r/GUI/GUI_App.cpp:1631 msgid "Check for configuration updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1599 +#: src/slic3r/GUI/GUI_App.cpp:1634 msgid "&Preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1605 +#: src/slic3r/GUI/GUI_App.cpp:1640 msgid "Application preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1610 src/slic3r/GUI/wxExtensions.cpp:685 +#: src/slic3r/GUI/GUI_App.cpp:1645 src/slic3r/GUI/wxExtensions.cpp:685 msgid "Simple" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1610 +#: src/slic3r/GUI/GUI_App.cpp:1645 msgid "Simple View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1612 src/slic3r/GUI/wxExtensions.cpp:687 +#: src/slic3r/GUI/GUI_App.cpp:1647 src/slic3r/GUI/wxExtensions.cpp:687 msgctxt "Mode" msgid "Advanced" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1612 +#: src/slic3r/GUI/GUI_App.cpp:1647 msgid "Advanced View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1613 src/slic3r/GUI/wxExtensions.cpp:688 +#: src/slic3r/GUI/GUI_App.cpp:1648 src/slic3r/GUI/wxExtensions.cpp:688 msgid "Expert" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1613 +#: src/slic3r/GUI/GUI_App.cpp:1648 msgid "Expert View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1618 +#: src/slic3r/GUI/GUI_App.cpp:1653 msgid "Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1618 +#: src/slic3r/GUI/GUI_App.cpp:1653 #, possible-c-format msgid "%s View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1621 +#: src/slic3r/GUI/GUI_App.cpp:1656 msgid "&Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1624 +#: src/slic3r/GUI/GUI_App.cpp:1659 msgid "Flash printer &firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1624 +#: src/slic3r/GUI/GUI_App.cpp:1659 msgid "Upload a firmware image into an Arduino based printer" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1640 +#: src/slic3r/GUI/GUI_App.cpp:1675 msgid "Taking configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1640 +#: src/slic3r/GUI/GUI_App.cpp:1675 msgid "Snapshot name" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1669 +#: src/slic3r/GUI/GUI_App.cpp:1704 msgid "Failed to activate configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1719 +#: src/slic3r/GUI/GUI_App.cpp:1754 msgid "Language selection" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1756 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1723 +#: src/slic3r/GUI/GUI_App.cpp:1758 msgid "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1750 +#: src/slic3r/GUI/GUI_App.cpp:1785 msgid "&Configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1781 -msgid "The preset(s) modifications are successfully saved" -msgstr "" +#: src/slic3r/GUI/GUI_App.cpp:1816 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_App.cpp:1802 +#: src/slic3r/GUI/GUI_App.cpp:1838 msgid "The uploads are still ongoing" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1802 +#: src/slic3r/GUI/GUI_App.cpp:1838 msgid "Stop them and continue anyway?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1805 +#: src/slic3r/GUI/GUI_App.cpp:1841 msgid "Ongoing uploads" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2019 src/slic3r/GUI/Tab.cpp:3242 +#: src/slic3r/GUI/GUI_App.cpp:2052 src/slic3r/GUI/Tab.cpp:3256 msgid "It's impossible to print multi-part object(s) with SLA technology." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2020 +#: src/slic3r/GUI/GUI_App.cpp:2053 msgid "Please check and fix your object list." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2021 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210 -#: src/slic3r/GUI/Plater.cpp:2359 src/slic3r/GUI/Tab.cpp:3244 +#: src/slic3r/GUI/GUI_App.cpp:2054 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210 +#: src/slic3r/GUI/Plater.cpp:2367 src/slic3r/GUI/Tab.cpp:3258 msgid "Attention!" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2038 +#: src/slic3r/GUI/GUI_App.cpp:2071 msgid "Select a gcode file:" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:73 src/slic3r/GUI/GUI_Init.cpp:76 +#: src/slic3r/GUI/GUI_Init.cpp:88 src/slic3r/GUI/GUI_Init.cpp:91 msgid "PrusaSlicer GUI initialization failed" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:76 +#: src/slic3r/GUI/GUI_Init.cpp:91 msgid "Fatal error, exception catched: %1%" msgstr "" @@ -2805,38 +2809,38 @@ msgid "Add layer range" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92 -#: src/slic3r/GUI/GUI_ObjectList.cpp:667 src/libslic3r/PrintConfig.cpp:74 +#: src/slic3r/GUI/GUI_ObjectList.cpp:681 src/libslic3r/PrintConfig.cpp:74 #: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:231 -#: src/libslic3r/PrintConfig.cpp:240 src/libslic3r/PrintConfig.cpp:464 -#: src/libslic3r/PrintConfig.cpp:530 src/libslic3r/PrintConfig.cpp:538 -#: src/libslic3r/PrintConfig.cpp:970 src/libslic3r/PrintConfig.cpp:1219 -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1650 -#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:2302 -#: src/libslic3r/PrintConfig.cpp:2361 src/libslic3r/PrintConfig.cpp:2370 +#: src/libslic3r/PrintConfig.cpp:240 src/libslic3r/PrintConfig.cpp:489 +#: src/libslic3r/PrintConfig.cpp:555 src/libslic3r/PrintConfig.cpp:563 +#: src/libslic3r/PrintConfig.cpp:995 src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1673 src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1924 src/libslic3r/PrintConfig.cpp:2391 +#: src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2459 msgid "Layers and Perimeters" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95 -#: src/slic3r/GUI/GUI_ObjectList.cpp:670 src/slic3r/GUI/GUI_Preview.cpp:240 -#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1474 +#: src/slic3r/GUI/GUI_ObjectList.cpp:684 src/slic3r/GUI/GUI_Preview.cpp:237 +#: src/slic3r/GUI/Tab.cpp:1486 src/slic3r/GUI/Tab.cpp:1488 #: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:352 -#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:1715 -#: src/libslic3r/PrintConfig.cpp:2093 src/libslic3r/PrintConfig.cpp:2099 -#: src/libslic3r/PrintConfig.cpp:2107 src/libslic3r/PrintConfig.cpp:2119 -#: src/libslic3r/PrintConfig.cpp:2129 src/libslic3r/PrintConfig.cpp:2137 -#: src/libslic3r/PrintConfig.cpp:2152 src/libslic3r/PrintConfig.cpp:2173 -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2201 -#: src/libslic3r/PrintConfig.cpp:2210 src/libslic3r/PrintConfig.cpp:2219 -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2244 -#: src/libslic3r/PrintConfig.cpp:2252 src/libslic3r/PrintConfig.cpp:2253 -#: src/libslic3r/PrintConfig.cpp:2262 src/libslic3r/PrintConfig.cpp:2270 -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:1804 +#: src/libslic3r/PrintConfig.cpp:2182 src/libslic3r/PrintConfig.cpp:2188 +#: src/libslic3r/PrintConfig.cpp:2196 src/libslic3r/PrintConfig.cpp:2208 +#: src/libslic3r/PrintConfig.cpp:2218 src/libslic3r/PrintConfig.cpp:2226 +#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2262 +#: src/libslic3r/PrintConfig.cpp:2274 src/libslic3r/PrintConfig.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:2299 src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2319 src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2351 src/libslic3r/PrintConfig.cpp:2359 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "Support material" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99 -#: src/slic3r/GUI/GUI_ObjectList.cpp:674 src/libslic3r/PrintConfig.cpp:2480 -#: src/libslic3r/PrintConfig.cpp:2488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:688 src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Wipe options" msgstr "" @@ -2860,432 +2864,458 @@ msgstr "" msgid "Add support blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:669 -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1442 +#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:683 +#: src/slic3r/GUI/GUI_Preview.cpp:233 src/slic3r/GUI/Tab.cpp:1454 #: src/libslic3r/ExtrusionEntity.cpp:316 src/libslic3r/ExtrusionEntity.cpp:344 -#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1256 -#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1266 +#: src/libslic3r/PrintConfig.cpp:1315 src/libslic3r/PrintConfig.cpp:1321 +#: src/libslic3r/PrintConfig.cpp:1335 src/libslic3r/PrintConfig.cpp:1345 +#: src/libslic3r/PrintConfig.cpp:1353 src/libslic3r/PrintConfig.cpp:1355 msgid "Ironing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:671 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/Tab.cpp:1498 -#: src/libslic3r/PrintConfig.cpp:291 src/libslic3r/PrintConfig.cpp:518 -#: src/libslic3r/PrintConfig.cpp:1012 src/libslic3r/PrintConfig.cpp:1192 -#: src/libslic3r/PrintConfig.cpp:1265 src/libslic3r/PrintConfig.cpp:1640 -#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1968 -#: src/libslic3r/PrintConfig.cpp:2346 +#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:685 +#: src/slic3r/GUI/GUI_Preview.cpp:214 src/slic3r/GUI/Tab.cpp:1512 +#: src/libslic3r/PrintConfig.cpp:291 src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:1101 src/libslic3r/PrintConfig.cpp:1281 +#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:2005 src/libslic3r/PrintConfig.cpp:2057 +#: src/libslic3r/PrintConfig.cpp:2435 msgid "Speed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:672 -#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:2112 -#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:1146 -#: src/libslic3r/PrintConfig.cpp:1618 src/libslic3r/PrintConfig.cpp:1937 -#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2192 +#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:686 +#: src/slic3r/GUI/Tab.cpp:1548 src/slic3r/GUI/Tab.cpp:2126 +#: src/libslic3r/PrintConfig.cpp:573 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:2026 +#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2281 msgid "Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:673 -#: src/libslic3r/PrintConfig.cpp:507 src/libslic3r/PrintConfig.cpp:616 -#: src/libslic3r/PrintConfig.cpp:957 src/libslic3r/PrintConfig.cpp:1154 -#: src/libslic3r/PrintConfig.cpp:1627 src/libslic3r/PrintConfig.cpp:1957 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:2334 +#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:687 +#: src/libslic3r/PrintConfig.cpp:532 src/libslic3r/PrintConfig.cpp:641 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:1243 +#: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:2046 +#: src/libslic3r/PrintConfig.cpp:2263 src/libslic3r/PrintConfig.cpp:2423 msgid "Extrusion Width" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:677 -#: src/slic3r/GUI/Tab.cpp:1428 src/slic3r/GUI/Tab.cpp:1452 -#: src/slic3r/GUI/Tab.cpp:1555 src/slic3r/GUI/Tab.cpp:1558 -#: src/slic3r/GUI/Tab.cpp:1855 src/slic3r/GUI/Tab.cpp:2197 -#: src/slic3r/GUI/Tab.cpp:4114 src/libslic3r/PrintConfig.cpp:92 +#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:689 +#: src/slic3r/GUI/Tab.cpp:1472 src/libslic3r/PrintConfig.cpp:301 +#: src/libslic3r/PrintConfig.cpp:310 src/libslic3r/PrintConfig.cpp:326 +msgid "Skirt and brim" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:691 +#: src/slic3r/GUI/Tab.cpp:1428 src/slic3r/GUI/Tab.cpp:1464 +#: src/slic3r/GUI/Tab.cpp:1569 src/slic3r/GUI/Tab.cpp:1572 +#: src/slic3r/GUI/Tab.cpp:1869 src/slic3r/GUI/Tab.cpp:2211 +#: src/slic3r/GUI/Tab.cpp:4132 src/libslic3r/PrintConfig.cpp:92 #: src/libslic3r/PrintConfig.cpp:132 src/libslic3r/PrintConfig.cpp:279 -#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1181 -#: src/libslic3r/PrintConfig.cpp:2504 src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:1186 src/libslic3r/PrintConfig.cpp:1270 +#: src/libslic3r/PrintConfig.cpp:2593 src/libslic3r/PrintConfig.cpp:2765 msgid "Advanced" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:679 -#: src/slic3r/GUI/Plater.cpp:357 src/slic3r/GUI/Tab.cpp:4048 -#: src/slic3r/GUI/Tab.cpp:4049 src/libslic3r/PrintConfig.cpp:2842 -#: src/libslic3r/PrintConfig.cpp:2849 src/libslic3r/PrintConfig.cpp:2858 -#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2877 -#: src/libslic3r/PrintConfig.cpp:2887 src/libslic3r/PrintConfig.cpp:2924 -#: src/libslic3r/PrintConfig.cpp:2931 src/libslic3r/PrintConfig.cpp:2942 -#: src/libslic3r/PrintConfig.cpp:2952 src/libslic3r/PrintConfig.cpp:2961 -#: src/libslic3r/PrintConfig.cpp:2974 src/libslic3r/PrintConfig.cpp:2984 -#: src/libslic3r/PrintConfig.cpp:2993 src/libslic3r/PrintConfig.cpp:3003 -#: src/libslic3r/PrintConfig.cpp:3014 src/libslic3r/PrintConfig.cpp:3022 +#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:693 +#: src/slic3r/GUI/Plater.cpp:357 src/slic3r/GUI/Tab.cpp:4066 +#: src/slic3r/GUI/Tab.cpp:4067 src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:2938 src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:2956 src/libslic3r/PrintConfig.cpp:2966 +#: src/libslic3r/PrintConfig.cpp:2976 src/libslic3r/PrintConfig.cpp:3013 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3031 +#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3050 +#: src/libslic3r/PrintConfig.cpp:3063 src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3103 src/libslic3r/PrintConfig.cpp:3111 msgid "Supports" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:680 -#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:4089 -#: src/slic3r/GUI/Tab.cpp:4090 src/slic3r/GUI/Tab.cpp:4161 -#: src/libslic3r/PrintConfig.cpp:3030 src/libslic3r/PrintConfig.cpp:3037 -#: src/libslic3r/PrintConfig.cpp:3051 src/libslic3r/PrintConfig.cpp:3062 -#: src/libslic3r/PrintConfig.cpp:3072 src/libslic3r/PrintConfig.cpp:3094 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3112 -#: src/libslic3r/PrintConfig.cpp:3119 src/libslic3r/PrintConfig.cpp:3130 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3148 +#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:694 +#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:4107 +#: src/slic3r/GUI/Tab.cpp:4108 src/slic3r/GUI/Tab.cpp:4179 +#: src/libslic3r/PrintConfig.cpp:3119 src/libslic3r/PrintConfig.cpp:3126 +#: src/libslic3r/PrintConfig.cpp:3140 src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3183 +#: src/libslic3r/PrintConfig.cpp:3194 src/libslic3r/PrintConfig.cpp:3201 +#: src/libslic3r/PrintConfig.cpp:3208 src/libslic3r/PrintConfig.cpp:3219 +#: src/libslic3r/PrintConfig.cpp:3228 src/libslic3r/PrintConfig.cpp:3237 msgid "Pad" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4107 -#: src/slic3r/GUI/Tab.cpp:4108 src/libslic3r/SLA/Hollowing.cpp:45 +#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4125 +#: src/slic3r/GUI/Tab.cpp:4126 src/libslic3r/SLA/Hollowing.cpp:45 #: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66 -#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3158 -#: src/libslic3r/PrintConfig.cpp:3165 src/libslic3r/PrintConfig.cpp:3175 -#: src/libslic3r/PrintConfig.cpp:3184 +#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3247 +#: src/libslic3r/PrintConfig.cpp:3254 src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Hollowing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:300 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161 +#: src/slic3r/GUI/GUI_ObjectList.cpp:314 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:142 msgid "Name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:457 +#: src/slic3r/GUI/GUI_ObjectList.cpp:330 src/slic3r/GUI/GUI_ObjectList.cpp:471 msgid "Editing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:402 +#: src/slic3r/GUI/GUI_ObjectList.cpp:416 src/slic3r/GUI/Plater.cpp:1074 #, possible-c-format -msgid "Auto-repaired (%d errors):" -msgstr "" +msgid "Auto-repaired %1$d error" +msgid_plural "Auto-repaired %1$d errors" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 -msgid "degenerate facets" -msgstr "" +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 src/slic3r/GUI/Plater.cpp:1079 +#, possible-c-format +msgid "%1$d degenerate facet" +msgid_plural "%1$d degenerate facets" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:410 -msgid "edges fixed" -msgstr "" +#: src/slic3r/GUI/GUI_ObjectList.cpp:425 src/slic3r/GUI/Plater.cpp:1081 +#, possible-c-format +msgid "%1$d edge fixed" +msgid_plural "%1$d edges fixed" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:411 -msgid "facets removed" -msgstr "" +#: src/slic3r/GUI/GUI_ObjectList.cpp:427 src/slic3r/GUI/Plater.cpp:1083 +#, possible-c-format +msgid "%1$d facet removed" +msgid_plural "%1$d facets removed" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:412 -msgid "facets added" -msgstr "" +#: src/slic3r/GUI/GUI_ObjectList.cpp:429 src/slic3r/GUI/Plater.cpp:1085 +#, possible-c-format +msgid "%1$d facet added" +msgid_plural "%1$d facets added" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:413 -msgid "facets reversed" -msgstr "" +#: src/slic3r/GUI/GUI_ObjectList.cpp:431 src/slic3r/GUI/Plater.cpp:1087 +#, possible-c-format +msgid "%1$d facet reversed" +msgid_plural "%1$d facets reversed" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:414 -msgid "backwards edges" -msgstr "" +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 src/slic3r/GUI/Plater.cpp:1089 +#, possible-c-format +msgid "%1$d backwards edge" +msgid_plural "%1$d backwards edges" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:422 +#: src/slic3r/GUI/GUI_ObjectList.cpp:436 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:459 +#: src/slic3r/GUI/GUI_ObjectList.cpp:473 msgid "Right button click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:461 +#: src/slic3r/GUI/GUI_ObjectList.cpp:475 msgid "Click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:465 +#: src/slic3r/GUI/GUI_ObjectList.cpp:479 msgid "Right button click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:467 +#: src/slic3r/GUI/GUI_ObjectList.cpp:481 msgid "Click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:590 +#: src/slic3r/GUI/GUI_ObjectList.cpp:604 msgid "Change Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:605 +#: src/slic3r/GUI/GUI_ObjectList.cpp:619 msgid "Rename Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:605 +#: src/slic3r/GUI/GUI_ObjectList.cpp:619 msgid "Rename Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1247 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4372 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1265 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4406 msgid "Instances to Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1262 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1280 msgid "Volumes in Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1262 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1280 msgid "Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1338 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1693 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1699 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2081 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1356 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1711 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1717 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2099 #, possible-c-format msgid "Quick Add Settings (%s)" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 msgid "Select showing settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1477 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1495 msgid "Add Settings for Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1478 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1496 msgid "Add Settings for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1479 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1497 msgid "Add Settings for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1567 msgid "Add Settings Bundle for Height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1550 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1568 msgid "Add Settings Bundle for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1551 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1569 msgid "Add Settings Bundle for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1590 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1608 msgid "Load" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1627 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1613 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1645 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1649 msgid "Box" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1613 msgid "Cylinder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1613 msgid "Slab" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1681 msgid "Height range Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1672 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1690 msgid "Add settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1750 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1768 msgid "Change type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1760 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1778 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1790 msgid "Set as a Separated Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1790 msgid "Set as a Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1800 msgid "Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1797 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1815 msgid "Rename" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1808 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Fix through the Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1818 src/slic3r/GUI/Plater.cpp:4035 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1836 src/slic3r/GUI/Plater.cpp:4056 msgid "Export as STL" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1825 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4567 src/slic3r/GUI/Plater.cpp:4001 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1843 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4601 src/slic3r/GUI/Plater.cpp:4022 msgid "Reload the selected volumes from disk" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 msgid "Set extruder for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1864 src/libslic3r/PrintConfig.cpp:391 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1882 src/libslic3r/PrintConfig.cpp:416 msgid "Default" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1884 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1902 msgid "Scale to print volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1884 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1902 msgid "Scale the selected object to fit the print volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1913 src/slic3r/GUI/Plater.cpp:5224 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1931 src/slic3r/GUI/Plater.cpp:5247 msgid "Convert from imperial units" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1915 src/slic3r/GUI/Plater.cpp:5224 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1933 src/slic3r/GUI/Plater.cpp:5247 msgid "Revert conversion from imperial units" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1944 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2630 src/libslic3r/PrintConfig.cpp:3730 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1962 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1970 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2650 src/libslic3r/PrintConfig.cpp:3811 msgid "Merge" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1944 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1962 msgid "Merge objects to the one multipart object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1970 msgid "Merge objects to the one single object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2026 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2283 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2044 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2301 msgid "Add Shape" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2111 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2129 msgid "Load Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2150 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2168 msgid "Error!" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2225 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2243 msgid "Add Generic Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2254 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2272 msgid "Generic" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2398 msgid "Delete Settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2402 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2422 msgid "Delete All Instances from Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 msgid "Delete Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2450 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2470 msgid "From Object List You can't delete the last solid part from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2454 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2474 msgid "Delete Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2489 msgid "Last instance of an object cannot be deleted." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2473 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2493 msgid "Delete Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:2865 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2517 src/slic3r/GUI/Plater.cpp:2879 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2521 msgid "Split to Parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2637 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2657 msgid "Merged" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2721 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2741 msgid "Merge all parts to the one single object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2753 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2773 msgid "Add Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2907 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2927 msgid "Group manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2919 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2939 msgid "Object manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2932 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2952 msgid "Object Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2936 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2956 msgid "Part Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2941 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2961 msgid "Layer range Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2947 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2967 msgid "Part manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2973 msgid "Instance manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2960 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2980 msgid "Height ranges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2960 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2980 msgid "Settings for height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3144 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3166 msgid "Delete Selected Item" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3332 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3354 msgid "Delete Selected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3408 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3436 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3456 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3430 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3458 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3478 msgid "Add Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3502 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3524 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" "without violating the minimum layer height." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3506 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3528 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -3293,212 +3323,212 @@ msgid "" "is thinner than the minimum layer height allowed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3511 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3533 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3570 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3592 msgid "Edit Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3865 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3899 msgid "Selection-Remove from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3873 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3907 msgid "Selection-Add from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4042 msgid "Object or Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4176 msgid "Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4043 msgid "Layer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4011 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4045 msgid "Unsupported selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4012 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4046 #, possible-c-format msgid "You started your selection with %s Item." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4047 #, possible-c-format msgid "In this mode you can select only other %s Items%s" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4050 msgid "of a current Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4021 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4096 src/slic3r/GUI/Plater.cpp:143 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4055 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4130 src/slic3r/GUI/Plater.cpp:143 msgid "Info" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4137 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4171 msgid "You can't change a type of the last solid part of the object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4176 msgid "Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4176 msgid "Support Enforcer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4176 msgid "Support Blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4144 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4178 msgid "Select type of part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4149 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4183 msgid "Change Part Type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4394 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4428 msgid "Enter new name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4394 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4428 msgid "Renaming" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4410 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4537 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4444 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4571 #: src/slic3r/GUI/SavePresetDialog.cpp:101 #: src/slic3r/GUI/SavePresetDialog.cpp:109 msgid "The supplied name is not valid;" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4411 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4538 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4445 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4572 #: src/slic3r/GUI/SavePresetDialog.cpp:102 msgid "the following characters are not allowed:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4586 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4620 msgid "Select extruder number:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4587 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4621 msgid "This extruder will be set for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4612 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4646 msgid "Change Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4743 src/slic3r/GUI/Selection.cpp:1485 msgid "Set Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4743 src/slic3r/GUI/Selection.cpp:1485 msgid "Set Unprintable" msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 msgid "World coordinates" msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:73 msgid "Select coordinate space, in which the transformation will be performed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:537 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:144 src/libslic3r/GCode.cpp:537 msgid "Object name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:204 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 msgid "Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:205 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 #: src/slic3r/GUI/Mouse3DController.cpp:486 #: src/slic3r/GUI/Mouse3DController.cpp:507 msgid "Rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:252 #, possible-c-format msgid "Toggle %c axis mirroring" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:286 msgid "Set Mirror" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:326 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:338 msgid "Drop to bed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:353 msgid "Reset rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:375 msgid "Reset Rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:390 msgid "Reset scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:423 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:404 msgid "Inches" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:488 msgid "Scale factors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:542 msgid "Translate" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:606 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:778 msgid "Set Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:809 msgid "Set Orientation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:874 msgid "Set Scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:906 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -3507,7 +3537,7 @@ msgid "" "once the rotation is embedded into the object coordinates." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:909 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -3531,132 +3561,132 @@ msgstr "" msgid "Change Option %s" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:212 +#: src/slic3r/GUI/GUI_Preview.cpp:209 msgid "View" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:215 src/libslic3r/PrintConfig.cpp:560 +#: src/slic3r/GUI/GUI_Preview.cpp:212 src/libslic3r/PrintConfig.cpp:585 msgid "Height" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:216 src/libslic3r/PrintConfig.cpp:2466 +#: src/slic3r/GUI/GUI_Preview.cpp:213 src/libslic3r/PrintConfig.cpp:2555 msgid "Width" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/Tab.cpp:1840 +#: src/slic3r/GUI/GUI_Preview.cpp:215 src/slic3r/GUI/Tab.cpp:1854 msgid "Fan speed" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:219 +#: src/slic3r/GUI/GUI_Preview.cpp:216 msgid "Volumetric flow rate" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:224 +#: src/slic3r/GUI/GUI_Preview.cpp:221 msgid "Show" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:245 +#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:242 msgid "Feature types" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/ExtrusionEntity.cpp:310 +#: src/slic3r/GUI/GUI_Preview.cpp:227 src/libslic3r/ExtrusionEntity.cpp:310 #: src/libslic3r/ExtrusionEntity.cpp:332 msgid "Perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/ExtrusionEntity.cpp:311 +#: src/slic3r/GUI/GUI_Preview.cpp:228 src/libslic3r/ExtrusionEntity.cpp:311 #: src/libslic3r/ExtrusionEntity.cpp:334 msgid "External perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/ExtrusionEntity.cpp:312 +#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/ExtrusionEntity.cpp:312 #: src/libslic3r/ExtrusionEntity.cpp:336 msgid "Overhang perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/ExtrusionEntity.cpp:313 +#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/ExtrusionEntity.cpp:313 #: src/libslic3r/ExtrusionEntity.cpp:338 msgid "Internal infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/ExtrusionEntity.cpp:314 -#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:1956 -#: src/libslic3r/PrintConfig.cpp:1967 +#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:2045 +#: src/libslic3r/PrintConfig.cpp:2056 msgid "Solid infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/ExtrusionEntity.cpp:315 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2333 -#: src/libslic3r/PrintConfig.cpp:2345 +#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2422 +#: src/libslic3r/PrintConfig.cpp:2434 msgid "Top solid infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/ExtrusionEntity.cpp:317 #: src/libslic3r/ExtrusionEntity.cpp:346 msgid "Bridge infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:318 -#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:1011 +#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/ExtrusionEntity.cpp:318 +#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:1100 msgid "Gap fill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/slic3r/GUI/Tab.cpp:1462 +#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1474 #: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/ExtrusionEntity.cpp:350 msgid "Skirt" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:321 -#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2218 +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:321 +#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2307 msgid "Support material interface" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/slic3r/GUI/Tab.cpp:1545 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/slic3r/GUI/Tab.cpp:1559 #: src/libslic3r/ExtrusionEntity.cpp:322 src/libslic3r/ExtrusionEntity.cpp:356 msgid "Wipe tower" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1031 +#: src/slic3r/GUI/GUI_Preview.cpp:1034 msgid "Shells" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1032 +#: src/slic3r/GUI/GUI_Preview.cpp:1035 msgid "Tool marker" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1033 +#: src/slic3r/GUI/GUI_Preview.cpp:1036 msgid "Legend/Estimated printing time" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:804 src/slic3r/GUI/Search.cpp:389 +#: src/slic3r/GUI/ImGuiWrapper.cpp:804 src/slic3r/GUI/Search.cpp:386 msgid "Use for search" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:805 src/slic3r/GUI/Search.cpp:383 +#: src/slic3r/GUI/ImGuiWrapper.cpp:805 src/slic3r/GUI/Search.cpp:380 msgid "Category" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:807 src/slic3r/GUI/Search.cpp:385 +#: src/slic3r/GUI/ImGuiWrapper.cpp:807 src/slic3r/GUI/Search.cpp:382 msgid "Search in English" msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:145 -msgid "Arranging" +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:153 +msgid "Could not arrange model objects! Some geometries may be invalid." msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:175 -msgid "Could not arrange model objects! Some geometries may be invalid." +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:162 +msgid "Arranging" msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:181 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:191 msgid "Arranging canceled." msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:192 msgid "Arranging done." msgstr "" -#: src/slic3r/GUI/Jobs/Job.cpp:75 +#: src/slic3r/GUI/Jobs/Job.cpp:89 msgid "ERROR: not enough resources to execute a new job." msgstr "" @@ -3716,12 +3746,12 @@ msgstr "" msgid "Importing done." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2357 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2365 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2358 -#: src/slic3r/GUI/Tab.cpp:3243 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2366 +#: src/slic3r/GUI/Tab.cpp:3257 msgid "Please check your object list before preset changing." msgstr "" @@ -3761,12 +3791,12 @@ msgstr "" msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 src/slic3r/GUI/Plater.cpp:770 -#: src/slic3r/GUI/Plater.cpp:6054 src/libslic3r/PrintConfig.cpp:3635 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 src/slic3r/GUI/Plater.cpp:767 +#: src/slic3r/GUI/Plater.cpp:6081 src/libslic3r/PrintConfig.cpp:3716 msgid "Export G-code" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 src/slic3r/GUI/Plater.cpp:6055 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 src/slic3r/GUI/Plater.cpp:6082 msgid "Send G-code" msgstr "" @@ -3774,7 +3804,7 @@ msgstr "" msgid "Export config" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:82 src/slic3r/GUI/Plater.cpp:758 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:82 src/slic3r/GUI/Plater.cpp:755 msgid "Export to SD card / Flash drive" msgstr "" @@ -3833,7 +3863,7 @@ msgid "Switch to Preview" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:106 -#: src/slic3r/GUI/PrintHostDialogs.cpp:165 +#: src/slic3r/GUI/PrintHostDialogs.cpp:176 msgid "Print host upload queue" msgstr "" @@ -4137,8 +4167,8 @@ msgstr "" msgid "Show/Hide Legend & Estimated printing time" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 src/slic3r/GUI/Plater.cpp:4200 -#: src/slic3r/GUI/Tab.cpp:2602 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 src/slic3r/GUI/Plater.cpp:4221 +#: src/slic3r/GUI/Tab.cpp:2616 msgid "Preview" msgstr "" @@ -4346,8 +4376,8 @@ 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:912 src/libslic3r/PrintConfig.cpp:2360 -#: src/libslic3r/PrintConfig.cpp:2369 +#: src/slic3r/GUI/MainFrame.cpp:912 src/libslic3r/PrintConfig.cpp:2449 +#: src/libslic3r/PrintConfig.cpp:2458 msgid "Top" msgstr "" @@ -4375,7 +4405,7 @@ msgstr "" msgid "Front View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:919 src/libslic3r/PrintConfig.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:919 src/libslic3r/PrintConfig.cpp:1934 msgid "Rear" msgstr "" @@ -4426,7 +4456,7 @@ msgid "" msgstr "" #: src/slic3r/GUI/MainFrame.cpp:953 src/slic3r/GUI/MainFrame.cpp:1343 -#: src/slic3r/GUI/PrintHostDialogs.cpp:263 +#: src/slic3r/GUI/PrintHostDialogs.cpp:274 msgid "Error" msgstr "" @@ -4780,7 +4810,7 @@ msgstr "" msgid "&Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1204 src/slic3r/GUI/Plater.cpp:2247 +#: src/slic3r/GUI/MainFrame.cpp:1204 src/slic3r/GUI/Plater.cpp:2255 msgid "Collapse sidebar" msgstr "" @@ -4861,9 +4891,9 @@ msgstr "" msgid "Save zip file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1405 src/slic3r/GUI/Plater.cpp:3009 -#: src/slic3r/GUI/Plater.cpp:5581 src/slic3r/GUI/Tab.cpp:1575 -#: src/slic3r/GUI/Tab.cpp:4115 +#: src/slic3r/GUI/MainFrame.cpp:1405 src/slic3r/GUI/Plater.cpp:3023 +#: src/slic3r/GUI/Plater.cpp:5604 src/slic3r/GUI/Tab.cpp:1589 +#: src/slic3r/GUI/Tab.cpp:4133 msgid "Slicing" msgstr "" @@ -4893,7 +4923,7 @@ msgstr "" msgid "Your file was repaired." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1469 src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/libslic3r/PrintConfig.cpp:3816 msgid "Repair" msgstr "" @@ -4970,56 +5000,56 @@ msgstr "" msgid "See more." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:476 +#: src/slic3r/GUI/NotificationManager.hpp:481 msgid "New version is available." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:476 +#: src/slic3r/GUI/NotificationManager.hpp:481 msgid "See Releases page." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:479 +#: src/slic3r/GUI/NotificationManager.hpp:484 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " "\"Printer Settings > Custom G-code\"" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:490 -#: src/slic3r/GUI/NotificationManager.cpp:500 +#: src/slic3r/GUI/NotificationManager.cpp:493 +#: src/slic3r/GUI/NotificationManager.cpp:503 msgid "More" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:864 -#: src/slic3r/GUI/NotificationManager.cpp:1141 +#: src/slic3r/GUI/NotificationManager.cpp:863 +#: src/slic3r/GUI/NotificationManager.cpp:1134 msgid "Export G-Code." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:908 +#: src/slic3r/GUI/NotificationManager.cpp:904 msgid "Open Folder." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:946 +#: src/slic3r/GUI/NotificationManager.cpp:940 msgid "Eject drive" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1060 -#: src/slic3r/GUI/NotificationManager.cpp:1076 -#: src/slic3r/GUI/NotificationManager.cpp:1087 +#: src/slic3r/GUI/NotificationManager.cpp:1053 +#: src/slic3r/GUI/NotificationManager.cpp:1069 +#: src/slic3r/GUI/NotificationManager.cpp:1080 msgid "ERROR:" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1065 -#: src/slic3r/GUI/NotificationManager.cpp:1080 -#: src/slic3r/GUI/NotificationManager.cpp:1095 +#: src/slic3r/GUI/NotificationManager.cpp:1058 +#: src/slic3r/GUI/NotificationManager.cpp:1073 +#: src/slic3r/GUI/NotificationManager.cpp:1088 msgid "WARNING:" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1144 +#: src/slic3r/GUI/NotificationManager.cpp:1137 msgid "Slicing finished." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1186 +#: src/slic3r/GUI/NotificationManager.cpp:1184 msgid "Exporting finished." msgstr "" @@ -5033,8 +5063,8 @@ msgstr "" msgid "Instance %d" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3962 -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3980 +#: src/slic3r/GUI/Tab.cpp:4062 msgid "Layers" msgstr "" @@ -5074,12 +5104,12 @@ msgstr "" msgid "Error loading shaders" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:335 +#: src/slic3r/GUI/OptionsGroup.cpp:334 msgctxt "Layers" msgid "Top" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:335 +#: src/slic3r/GUI/OptionsGroup.cpp:334 msgctxt "Layers" msgid "Bottom" msgstr "" @@ -5108,7 +5138,7 @@ msgstr "" msgid "Add preset for this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:205 src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:205 src/slic3r/GUI/Tab.cpp:2078 msgid "Print Host upload" msgstr "" @@ -5180,13 +5210,17 @@ msgstr "" msgid "Replace?" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:579 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:582 msgid "" -"Following printer preset(s) is duplicated:%1%The above preset for printer " +"Following printer preset is duplicated:%1%The above preset for printer \"%2%" +"\" will be used just once." +msgid_plural "" +"Following printer presets are duplicated:%1%The above presets for printer " "\"%2%\" will be used just once." -msgstr "" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:625 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:630 msgid "It's not possible to delete the last related preset for the printer." msgstr "" @@ -5210,15 +5244,15 @@ msgstr "" msgid "Sliced Info" msgstr "" -#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1151 +#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1159 msgid "Used Filament (m)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:238 src/slic3r/GUI/Plater.cpp:1163 +#: src/slic3r/GUI/Plater.cpp:238 src/slic3r/GUI/Plater.cpp:1171 msgid "Used Filament (mm³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:239 src/slic3r/GUI/Plater.cpp:1170 +#: src/slic3r/GUI/Plater.cpp:239 src/slic3r/GUI/Plater.cpp:1178 msgid "Used Filament (g)" msgstr "" @@ -5238,8 +5272,8 @@ msgstr "" msgid "Select what kind of support do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:362 src/libslic3r/PrintConfig.cpp:2128 -#: src/libslic3r/PrintConfig.cpp:2923 +#: src/slic3r/GUI/Plater.cpp:362 src/libslic3r/PrintConfig.cpp:2217 +#: src/libslic3r/PrintConfig.cpp:3012 msgid "Support on build plate only" msgstr "" @@ -5251,7 +5285,7 @@ msgstr "" msgid "Everywhere" msgstr "" -#: src/slic3r/GUI/Plater.cpp:396 src/slic3r/GUI/Tab.cpp:1469 +#: src/slic3r/GUI/Plater.cpp:396 src/slic3r/GUI/Tab.cpp:1481 msgid "Brim" msgstr "" @@ -5277,555 +5311,550 @@ msgstr "" msgid "Around object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:695 +#: src/slic3r/GUI/Plater.cpp:692 msgid "SLA print settings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:756 src/slic3r/GUI/Plater.cpp:6055 +#: src/slic3r/GUI/Plater.cpp:753 src/slic3r/GUI/Plater.cpp:6082 msgid "Send to printer" msgstr "" -#: src/slic3r/GUI/Plater.cpp:771 src/slic3r/GUI/Plater.cpp:3009 -#: src/slic3r/GUI/Plater.cpp:5584 +#: src/slic3r/GUI/Plater.cpp:768 src/slic3r/GUI/Plater.cpp:3023 +#: src/slic3r/GUI/Plater.cpp:5607 msgid "Slice now" msgstr "" -#: src/slic3r/GUI/Plater.cpp:926 +#: src/slic3r/GUI/Plater.cpp:923 msgid "Hold Shift to Slice & Export G-code" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1071 -#, possible-c-format -msgid "%d (%d shells)" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1076 -#, possible-c-format -msgid "Auto-repaired (%d errors)" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1079 -#, possible-c-format -msgid "" -"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " -"facets reversed, %d backwards edges" -msgstr "" +#: src/slic3r/GUI/Plater.cpp:1068 +msgid "%1% (%2$d shell)" +msgid_plural "%1% (%2$d shells)" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:1089 +#: src/slic3r/GUI/Plater.cpp:1097 msgid "Yes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1110 +#: src/slic3r/GUI/Plater.cpp:1118 msgid "Used Material (ml)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1113 -msgid "object(s)" -msgstr "" +#: src/slic3r/GUI/Plater.cpp:1121 +msgid "object" +msgid_plural "objects" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:1113 +#: src/slic3r/GUI/Plater.cpp:1121 msgid "supports and pad" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1151 +#: src/slic3r/GUI/Plater.cpp:1159 msgid "Used Filament (in)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206 +#: src/slic3r/GUI/Plater.cpp:1161 src/slic3r/GUI/Plater.cpp:1214 msgid "objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206 +#: src/slic3r/GUI/Plater.cpp:1161 src/slic3r/GUI/Plater.cpp:1214 msgid "wipe tower" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1163 +#: src/slic3r/GUI/Plater.cpp:1171 msgid "Used Filament (in³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1189 +#: src/slic3r/GUI/Plater.cpp:1197 msgid "Filament at extruder %1%" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1195 +#: src/slic3r/GUI/Plater.cpp:1203 msgid "(including spool)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1204 src/libslic3r/PrintConfig.cpp:822 -#: src/libslic3r/PrintConfig.cpp:2738 src/libslic3r/PrintConfig.cpp:2739 +#: src/slic3r/GUI/Plater.cpp:1212 src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:2827 src/libslic3r/PrintConfig.cpp:2828 msgid "Cost" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1222 +#: src/slic3r/GUI/Plater.cpp:1230 msgid "normal mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1232 +#: src/slic3r/GUI/Plater.cpp:1240 msgid "stealth mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1403 src/slic3r/GUI/Plater.cpp:4923 +#: src/slic3r/GUI/Plater.cpp:1411 src/slic3r/GUI/Plater.cpp:4942 #, possible-c-format msgid "%s - Drop project file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1410 src/slic3r/GUI/Plater.cpp:4930 +#: src/slic3r/GUI/Plater.cpp:1418 src/slic3r/GUI/Plater.cpp:4949 msgid "Open as project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1411 src/slic3r/GUI/Plater.cpp:4931 +#: src/slic3r/GUI/Plater.cpp:1419 src/slic3r/GUI/Plater.cpp:4950 msgid "Import geometry only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1412 src/slic3r/GUI/Plater.cpp:4932 +#: src/slic3r/GUI/Plater.cpp:1420 src/slic3r/GUI/Plater.cpp:4951 msgid "Import config only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1415 src/slic3r/GUI/Plater.cpp:4935 +#: src/slic3r/GUI/Plater.cpp:1423 src/slic3r/GUI/Plater.cpp:4954 msgid "Select an action to apply to the file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1416 src/slic3r/GUI/Plater.cpp:4936 +#: src/slic3r/GUI/Plater.cpp:1424 src/slic3r/GUI/Plater.cpp:4955 msgid "Action" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1424 src/slic3r/GUI/Plater.cpp:4944 +#: src/slic3r/GUI/Plater.cpp:1432 src/slic3r/GUI/Plater.cpp:4963 msgid "Don't show again" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1469 src/slic3r/GUI/Plater.cpp:4981 +#: src/slic3r/GUI/Plater.cpp:1477 src/slic3r/GUI/Plater.cpp:5000 msgid "You can open only one .gcode file at a time." msgstr "" -#: src/slic3r/GUI/Plater.cpp:1470 src/slic3r/GUI/Plater.cpp:4982 +#: src/slic3r/GUI/Plater.cpp:1478 src/slic3r/GUI/Plater.cpp:5001 msgid "Drag and drop G-code file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1524 src/slic3r/GUI/Plater.cpp:4796 -#: src/slic3r/GUI/Plater.cpp:5036 +#: src/slic3r/GUI/Plater.cpp:1532 src/slic3r/GUI/Plater.cpp:4817 +#: src/slic3r/GUI/Plater.cpp:5055 msgid "Import Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1546 src/slic3r/GUI/Plater.cpp:5058 +#: src/slic3r/GUI/Plater.cpp:1554 src/slic3r/GUI/Plater.cpp:5081 msgid "Load File" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1551 src/slic3r/GUI/Plater.cpp:5063 +#: src/slic3r/GUI/Plater.cpp:1559 src/slic3r/GUI/Plater.cpp:5086 msgid "Load Files" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1654 +#: src/slic3r/GUI/Plater.cpp:1662 msgid "Fill bed" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1660 +#: src/slic3r/GUI/Plater.cpp:1668 msgid "Optimize Rotation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1666 +#: src/slic3r/GUI/Plater.cpp:1674 msgid "Import SLA archive" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2129 +#: src/slic3r/GUI/Plater.cpp:2137 #, possible-c-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " "computer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2134 +#: src/slic3r/GUI/Plater.cpp:2142 #, possible-c-format msgid "Ejecting of device %s(%s) has failed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2153 +#: src/slic3r/GUI/Plater.cpp:2161 msgid "New Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2246 +#: src/slic3r/GUI/Plater.cpp:2254 msgid "Expand sidebar" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2327 msgid "Loading" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2329 +#: src/slic3r/GUI/Plater.cpp:2337 msgid "Loading file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2415 +#: src/slic3r/GUI/Plater.cpp:2427 #, possible-c-format msgid "" -"Some object(s) in file %s looks like saved in inches.\n" +"The object in file %s looks like saved in inches.\n" +"Should I consider it as a saved in inches and convert it?" +msgid_plural "" +"Some objects in file %s look like saved in inches.\n" "Should I consider them as a saved in inches and convert them?" -msgstr "" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/Plater.cpp:2431 msgid "The object appears to be saved in inches" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2425 +#: src/slic3r/GUI/Plater.cpp:2439 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:2428 src/slic3r/GUI/Plater.cpp:2481 +#: src/slic3r/GUI/Plater.cpp:2442 src/slic3r/GUI/Plater.cpp:2495 msgid "Multi-part object detected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2435 +#: src/slic3r/GUI/Plater.cpp:2449 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:2436 +#: src/slic3r/GUI/Plater.cpp:2450 msgid "Detected advanced data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Plater.cpp:2472 #, 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:2478 +#: src/slic3r/GUI/Plater.cpp:2492 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:2494 +#: src/slic3r/GUI/Plater.cpp:2508 msgid "Loaded" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2596 +#: src/slic3r/GUI/Plater.cpp:2610 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:2597 +#: src/slic3r/GUI/Plater.cpp:2611 msgid "Object too large?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2659 +#: src/slic3r/GUI/Plater.cpp:2673 msgid "Export STL file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2666 +#: src/slic3r/GUI/Plater.cpp:2680 msgid "Export AMF file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2672 +#: src/slic3r/GUI/Plater.cpp:2686 msgid "Save file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2678 +#: src/slic3r/GUI/Plater.cpp:2692 msgid "Export OBJ file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2774 +#: src/slic3r/GUI/Plater.cpp:2788 msgid "Delete Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2785 +#: src/slic3r/GUI/Plater.cpp:2799 msgid "Reset Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2857 +#: src/slic3r/GUI/Plater.cpp:2871 msgid "" "The selected object can't be split because it contains more than one volume/" "material." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2868 +#: src/slic3r/GUI/Plater.cpp:2882 msgid "Split to Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2993 src/slic3r/GUI/Plater.cpp:3723 +#: src/slic3r/GUI/Plater.cpp:3007 src/slic3r/GUI/Plater.cpp:3744 msgid "Invalid data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3003 +#: src/slic3r/GUI/Plater.cpp:3017 msgid "Ready to slice" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3041 src/slic3r/GUI/PrintHostDialogs.cpp:264 +#: src/slic3r/GUI/Plater.cpp:3055 src/slic3r/GUI/PrintHostDialogs.cpp:275 msgid "Cancelling" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3060 +#: src/slic3r/GUI/Plater.cpp:3074 msgid "Another export job is currently running." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3177 +#: src/slic3r/GUI/Plater.cpp:3191 msgid "Please select the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3212 +#: src/slic3r/GUI/Plater.cpp:3226 msgid "It is not allowed to change the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3212 +#: src/slic3r/GUI/Plater.cpp:3226 msgid "Do you want to retry" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3230 +#: src/slic3r/GUI/Plater.cpp:3244 msgid "Reload from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3323 +#: src/slic3r/GUI/Plater.cpp:3337 msgid "Unable to reload:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3328 +#: src/slic3r/GUI/Plater.cpp:3342 msgid "Error during reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3347 +#: src/slic3r/GUI/Plater.cpp:3361 msgid "Reload all from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3374 +#: src/slic3r/GUI/Plater.cpp:3388 msgid "" "ERROR: Please close all manipulators available from the left toolbar before " "fixing the mesh." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3394 msgid "Fix through NetFabb" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3397 +#: src/slic3r/GUI/Plater.cpp:3411 msgid "Custom supports and seams were removed after repairing the mesh." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3680 +#: src/slic3r/GUI/Plater.cpp:3702 msgid "There are active warnings concerning sliced models:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3691 +#: src/slic3r/GUI/Plater.cpp:3712 msgid "generated warnings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3731 src/slic3r/GUI/PrintHostDialogs.cpp:265 +#: src/slic3r/GUI/Plater.cpp:3752 src/slic3r/GUI/PrintHostDialogs.cpp:276 msgid "Cancelled" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022 +#: src/slic3r/GUI/Plater.cpp:4019 src/slic3r/GUI/Plater.cpp:4043 msgid "Remove the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4007 +#: src/slic3r/GUI/Plater.cpp:4028 msgid "Add one more instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4009 +#: src/slic3r/GUI/Plater.cpp:4030 msgid "Remove one instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4011 +#: src/slic3r/GUI/Plater.cpp:4032 msgid "Set number of instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4011 +#: src/slic3r/GUI/Plater.cpp:4032 msgid "Change the number of instances of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4013 +#: src/slic3r/GUI/Plater.cpp:4034 msgid "Fill bed with instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4013 +#: src/slic3r/GUI/Plater.cpp:4034 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4032 +#: src/slic3r/GUI/Plater.cpp:4053 msgid "Reload the selected object from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4035 +#: src/slic3r/GUI/Plater.cpp:4056 msgid "Export the selected object as STL file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4065 +#: src/slic3r/GUI/Plater.cpp:4086 msgid "Along X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4065 +#: src/slic3r/GUI/Plater.cpp:4086 msgid "Mirror the selected object along the X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4067 +#: src/slic3r/GUI/Plater.cpp:4088 msgid "Along Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4067 +#: src/slic3r/GUI/Plater.cpp:4088 msgid "Mirror the selected object along the Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4069 +#: src/slic3r/GUI/Plater.cpp:4090 msgid "Along Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4069 +#: src/slic3r/GUI/Plater.cpp:4090 msgid "Mirror the selected object along the Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4072 +#: src/slic3r/GUI/Plater.cpp:4093 msgid "Mirror" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4072 +#: src/slic3r/GUI/Plater.cpp:4093 msgid "Mirror the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4084 +#: src/slic3r/GUI/Plater.cpp:4105 msgid "To objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4084 src/slic3r/GUI/Plater.cpp:4104 +#: src/slic3r/GUI/Plater.cpp:4105 src/slic3r/GUI/Plater.cpp:4125 msgid "Split the selected object into individual objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4086 +#: src/slic3r/GUI/Plater.cpp:4107 msgid "To parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4086 src/slic3r/GUI/Plater.cpp:4122 +#: src/slic3r/GUI/Plater.cpp:4107 src/slic3r/GUI/Plater.cpp:4143 msgid "Split the selected object into individual sub-parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4089 src/slic3r/GUI/Plater.cpp:4104 -#: src/slic3r/GUI/Plater.cpp:4122 src/libslic3r/PrintConfig.cpp:3759 +#: src/slic3r/GUI/Plater.cpp:4110 src/slic3r/GUI/Plater.cpp:4125 +#: src/slic3r/GUI/Plater.cpp:4143 src/libslic3r/PrintConfig.cpp:3840 msgid "Split" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4089 +#: src/slic3r/GUI/Plater.cpp:4110 msgid "Split the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4111 +#: src/slic3r/GUI/Plater.cpp:4132 msgid "Optimize orientation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4112 +#: src/slic3r/GUI/Plater.cpp:4133 msgid "Optimize the rotation of the object for better print results." msgstr "" -#: src/slic3r/GUI/Plater.cpp:4192 +#: src/slic3r/GUI/Plater.cpp:4213 msgid "3D editor view" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4564 +#: src/slic3r/GUI/Plater.cpp:4585 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:4768 +#: src/slic3r/GUI/Plater.cpp:4789 msgid "Load Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4800 +#: src/slic3r/GUI/Plater.cpp:4821 msgid "Import Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4868 +#: src/slic3r/GUI/Plater.cpp:4887 msgid "The selected file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4868 +#: src/slic3r/GUI/Plater.cpp:4887 msgid "does not contain valid gcode." msgstr "" -#: src/slic3r/GUI/Plater.cpp:4869 +#: src/slic3r/GUI/Plater.cpp:4888 msgid "Error while loading .gcode file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5107 +#: src/slic3r/GUI/Plater.cpp:5130 msgid "All objects will be removed, continue?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5115 +#: src/slic3r/GUI/Plater.cpp:5138 msgid "Delete Selected Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5123 +#: src/slic3r/GUI/Plater.cpp:5146 msgid "Increase Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5157 +#: src/slic3r/GUI/Plater.cpp:5180 msgid "Decrease Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5188 +#: src/slic3r/GUI/Plater.cpp:5211 msgid "Enter the number of copies:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5189 +#: src/slic3r/GUI/Plater.cpp:5212 msgid "Copies of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5193 +#: src/slic3r/GUI/Plater.cpp:5216 #, possible-c-format msgid "Set numbers of copies to %d" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5259 +#: src/slic3r/GUI/Plater.cpp:5282 msgid "Cut by Plane" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5316 +#: src/slic3r/GUI/Plater.cpp:5339 msgid "Save G-code file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5316 +#: src/slic3r/GUI/Plater.cpp:5339 msgid "Save SL1 file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5463 +#: src/slic3r/GUI/Plater.cpp:5486 #, possible-c-format msgid "STL file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5480 +#: src/slic3r/GUI/Plater.cpp:5503 #, possible-c-format msgid "AMF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5483 +#: src/slic3r/GUI/Plater.cpp:5506 #, possible-c-format msgid "Error exporting AMF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5512 +#: src/slic3r/GUI/Plater.cpp:5535 #, possible-c-format msgid "3MF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5517 +#: src/slic3r/GUI/Plater.cpp:5540 #, possible-c-format msgid "Error exporting 3MF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6054 +#: src/slic3r/GUI/Plater.cpp:6081 msgid "Export" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6149 +#: src/slic3r/GUI/Plater.cpp:6178 msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:56 src/slic3r/GUI/Tab.cpp:2098 -#: src/slic3r/GUI/Tab.cpp:2285 src/slic3r/GUI/Tab.cpp:2393 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1080 +#: src/slic3r/GUI/Preferences.cpp:56 src/slic3r/GUI/Tab.cpp:2112 +#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1082 msgid "General" msgstr "" @@ -6067,115 +6096,119 @@ msgstr "" msgid "If enabled, you can change size of toolbar icons manually." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:320 +#: src/slic3r/GUI/Preferences.cpp:321 msgid "Render" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:325 +#: src/slic3r/GUI/Preferences.cpp:326 msgid "Use environment map" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:327 +#: src/slic3r/GUI/Preferences.cpp:328 msgid "If enabled, renders object using the environment map." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:352 +#: src/slic3r/GUI/Preferences.cpp:353 #, possible-c-format msgid "You need to restart %s to make the changes effective." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:432 msgid "Icon size in a respect to the default size" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:442 +#: src/slic3r/GUI/Preferences.cpp:447 msgid "Select toolbar icon size in respect to the default one." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:473 +#: src/slic3r/GUI/Preferences.cpp:478 msgid "Old regular layout with the tab bar" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:474 +#: src/slic3r/GUI/Preferences.cpp:479 msgid "New layout, access via settings button in the top menu" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:475 +#: src/slic3r/GUI/Preferences.cpp:480 msgid "Settings in non-modal window" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:484 +#: src/slic3r/GUI/Preferences.cpp:489 msgid "Layout Options" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:197 -#: src/slic3r/GUI/PresetComboBoxes.cpp:235 -#: src/slic3r/GUI/PresetComboBoxes.cpp:761 -#: src/slic3r/GUI/PresetComboBoxes.cpp:811 -#: src/slic3r/GUI/PresetComboBoxes.cpp:925 -#: src/slic3r/GUI/PresetComboBoxes.cpp:969 +#: src/slic3r/GUI/Preferences.cpp:510 +msgid "Text color Settings" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:224 +#: src/slic3r/GUI/PresetComboBoxes.cpp:262 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 +#: src/slic3r/GUI/PresetComboBoxes.cpp:838 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1007 msgid "System presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:239 -#: src/slic3r/GUI/PresetComboBoxes.cpp:815 -#: src/slic3r/GUI/PresetComboBoxes.cpp:973 +#: src/slic3r/GUI/PresetComboBoxes.cpp:266 +#: src/slic3r/GUI/PresetComboBoxes.cpp:842 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1011 msgid "User presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:250 +#: src/slic3r/GUI/PresetComboBoxes.cpp:277 msgid "Incompatible presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:285 +#: src/slic3r/GUI/PresetComboBoxes.cpp:312 msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 +#: src/slic3r/GUI/PresetComboBoxes.cpp:314 msgid "Delete Physical Printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:624 +#: src/slic3r/GUI/PresetComboBoxes.cpp:651 msgid "Click to edit preset" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:680 -#: src/slic3r/GUI/PresetComboBoxes.cpp:710 +#: src/slic3r/GUI/PresetComboBoxes.cpp:707 +#: src/slic3r/GUI/PresetComboBoxes.cpp:737 msgid "Add/Remove presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:685 -#: src/slic3r/GUI/PresetComboBoxes.cpp:715 src/slic3r/GUI/Tab.cpp:2990 +#: src/slic3r/GUI/PresetComboBoxes.cpp:712 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3004 msgid "Add physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:699 +#: src/slic3r/GUI/PresetComboBoxes.cpp:726 msgid "Edit preset" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:703 src/slic3r/GUI/Tab.cpp:2990 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3004 msgid "Edit physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:706 +#: src/slic3r/GUI/PresetComboBoxes.cpp:733 msgid "Delete physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:826 -#: src/slic3r/GUI/PresetComboBoxes.cpp:987 +#: src/slic3r/GUI/PresetComboBoxes.cpp:853 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1025 msgid "Physical printers" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:850 +#: src/slic3r/GUI/PresetComboBoxes.cpp:877 msgid "Add/Remove filaments" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:852 +#: src/slic3r/GUI/PresetComboBoxes.cpp:879 msgid "Add/Remove materials" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:854 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1011 +#: src/slic3r/GUI/PresetComboBoxes.cpp:881 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1049 msgid "Add/Remove printers" msgstr "" @@ -6352,52 +6385,52 @@ msgstr "" msgid "Group" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:176 +#: src/slic3r/GUI/PrintHostDialogs.cpp:187 msgid "ID" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:177 +#: src/slic3r/GUI/PrintHostDialogs.cpp:188 msgid "Progress" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:178 +#: src/slic3r/GUI/PrintHostDialogs.cpp:189 msgid "Status" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:179 +#: src/slic3r/GUI/PrintHostDialogs.cpp:190 msgid "Host" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:180 +#: src/slic3r/GUI/PrintHostDialogs.cpp:191 msgid "Filename" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:181 +#: src/slic3r/GUI/PrintHostDialogs.cpp:192 msgid "Error Message" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:184 +#: src/slic3r/GUI/PrintHostDialogs.cpp:195 msgid "Cancel selected" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:186 +#: src/slic3r/GUI/PrintHostDialogs.cpp:197 msgid "Show error message" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:228 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 +#: src/slic3r/GUI/PrintHostDialogs.cpp:239 +#: src/slic3r/GUI/PrintHostDialogs.cpp:272 msgid "Enqueued" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:262 +#: src/slic3r/GUI/PrintHostDialogs.cpp:273 msgid "Uploading" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:266 +#: src/slic3r/GUI/PrintHostDialogs.cpp:277 msgid "Completed" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +#: src/slic3r/GUI/PrintHostDialogs.cpp:315 msgid "Error uploading to print host:" msgstr "" @@ -6406,12 +6439,12 @@ msgid "NO RAMMING AT ALL" msgstr "" #: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 -#: src/libslic3r/PrintConfig.cpp:706 src/libslic3r/PrintConfig.cpp:750 -#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:2636 -#: src/libslic3r/PrintConfig.cpp:2645 src/libslic3r/PrintConfig.cpp:2755 -#: src/libslic3r/PrintConfig.cpp:2763 src/libslic3r/PrintConfig.cpp:2771 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2794 +#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:775 +#: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2734 src/libslic3r/PrintConfig.cpp:2844 +#: src/libslic3r/PrintConfig.cpp:2852 src/libslic3r/PrintConfig.cpp:2860 +#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:2883 msgid "s" msgstr "" @@ -6419,8 +6452,8 @@ msgstr "" msgid "Volumetric speed" msgstr "" -#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:663 -#: src/libslic3r/PrintConfig.cpp:1458 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:688 +#: src/libslic3r/PrintConfig.cpp:1547 msgid "mm³/s" msgstr "" @@ -6471,43 +6504,47 @@ msgstr "" msgid "The name cannot end with space character." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:186 -#: src/slic3r/GUI/SavePresetDialog.cpp:192 +#: src/slic3r/GUI/SavePresetDialog.cpp:157 +msgid "The name cannot be the same as a preset alias name." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:191 +#: src/slic3r/GUI/SavePresetDialog.cpp:197 msgid "Save preset" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:215 +#: src/slic3r/GUI/SavePresetDialog.cpp:220 msgctxt "PresetName" msgid "Copy" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:273 +#: src/slic3r/GUI/SavePresetDialog.cpp:278 msgid "" "You have selected physical printer \"%1%\" \n" "with related printer preset \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:306 +#: src/slic3r/GUI/SavePresetDialog.cpp:311 msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:309 +#: src/slic3r/GUI/SavePresetDialog.cpp:314 msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:310 +#: src/slic3r/GUI/SavePresetDialog.cpp:315 msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:311 +#: src/slic3r/GUI/SavePresetDialog.cpp:316 msgid "Just switch to \"%1%\" preset" msgstr "" -#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2421 +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2435 msgid "Stealth" msgstr "" -#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2415 +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2429 msgid "Normal" msgstr "" @@ -6555,15 +6592,15 @@ msgstr "" msgid "Set Unprintable Instance" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:82 +#: src/slic3r/GUI/SysInfoDialog.cpp:83 msgid "System Information" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:158 +#: src/slic3r/GUI/SysInfoDialog.cpp:164 msgid "Copy to Clipboard" msgstr "" -#: src/slic3r/GUI/Tab.cpp:109 src/libslic3r/PrintConfig.cpp:321 +#: src/slic3r/GUI/Tab.cpp:109 src/libslic3r/PrintConfig.cpp:346 msgid "Compatible printers" msgstr "" @@ -6571,7 +6608,7 @@ msgstr "" msgid "Select the printers this profile is compatible with." msgstr "" -#: src/slic3r/GUI/Tab.cpp:115 src/libslic3r/PrintConfig.cpp:336 +#: src/slic3r/GUI/Tab.cpp:115 src/libslic3r/PrintConfig.cpp:361 msgid "Compatible print profiles" msgstr "" @@ -6689,7 +6726,7 @@ msgstr "" msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1385 src/slic3r/GUI/Tab.cpp:4042 +#: src/slic3r/GUI/Tab.cpp:1385 src/slic3r/GUI/Tab.cpp:4060 msgid "Layers and perimeters" msgstr "" @@ -6701,7 +6738,7 @@ msgstr "" msgid "Horizontal shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1404 src/libslic3r/PrintConfig.cpp:1980 +#: src/slic3r/GUI/Tab.cpp:1404 src/libslic3r/PrintConfig.cpp:2069 msgid "Solid layers" msgstr "" @@ -6713,179 +6750,179 @@ msgstr "" msgid "Quality (slower slicing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1448 -msgid "Reducing printing time" +#: src/slic3r/GUI/Tab.cpp:1432 +msgid "Fuzzy skin (experimental)" msgstr "" #: src/slic3r/GUI/Tab.cpp:1460 -msgid "Skirt and brim" +msgid "Reducing printing time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1480 +#: src/slic3r/GUI/Tab.cpp:1494 msgid "Raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1484 +#: src/slic3r/GUI/Tab.cpp:1498 msgid "Options for support material and raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1499 +#: src/slic3r/GUI/Tab.cpp:1513 msgid "Speed for print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1512 +#: src/slic3r/GUI/Tab.cpp:1526 msgid "Speed for non-print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1515 +#: src/slic3r/GUI/Tab.cpp:1529 msgid "Modifiers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1518 +#: src/slic3r/GUI/Tab.cpp:1532 msgid "Acceleration control (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1525 +#: src/slic3r/GUI/Tab.cpp:1539 msgid "Autospeed (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1533 +#: src/slic3r/GUI/Tab.cpp:1547 msgid "Multiple Extruders" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1541 +#: src/slic3r/GUI/Tab.cpp:1555 msgid "Ooze prevention" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1559 +#: src/slic3r/GUI/Tab.cpp:1573 msgid "Extrusion width" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1569 +#: src/slic3r/GUI/Tab.cpp:1583 msgid "Overlap" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1572 +#: src/slic3r/GUI/Tab.cpp:1586 msgid "Flow" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1581 +#: src/slic3r/GUI/Tab.cpp:1595 msgid "Other" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1584 src/slic3r/GUI/Tab.cpp:4118 +#: src/slic3r/GUI/Tab.cpp:1598 src/slic3r/GUI/Tab.cpp:4136 msgid "Output options" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:1599 msgid "Sequential printing" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1587 +#: src/slic3r/GUI/Tab.cpp:1601 msgid "Extruder clearance" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1592 src/slic3r/GUI/Tab.cpp:4119 +#: src/slic3r/GUI/Tab.cpp:1606 src/slic3r/GUI/Tab.cpp:4137 msgid "Output file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1599 src/libslic3r/PrintConfig.cpp:1662 +#: src/slic3r/GUI/Tab.cpp:1613 src/libslic3r/PrintConfig.cpp:1751 msgid "Post-processing scripts" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1605 src/slic3r/GUI/Tab.cpp:1606 -#: src/slic3r/GUI/Tab.cpp:1927 src/slic3r/GUI/Tab.cpp:1928 -#: src/slic3r/GUI/Tab.cpp:2266 src/slic3r/GUI/Tab.cpp:2267 -#: src/slic3r/GUI/Tab.cpp:2342 src/slic3r/GUI/Tab.cpp:2343 -#: src/slic3r/GUI/Tab.cpp:3985 src/slic3r/GUI/Tab.cpp:3986 +#: src/slic3r/GUI/Tab.cpp:1619 src/slic3r/GUI/Tab.cpp:1620 +#: src/slic3r/GUI/Tab.cpp:1941 src/slic3r/GUI/Tab.cpp:1942 +#: src/slic3r/GUI/Tab.cpp:2280 src/slic3r/GUI/Tab.cpp:2281 +#: src/slic3r/GUI/Tab.cpp:2356 src/slic3r/GUI/Tab.cpp:2357 +#: src/slic3r/GUI/Tab.cpp:4003 src/slic3r/GUI/Tab.cpp:4004 msgid "Notes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1612 src/slic3r/GUI/Tab.cpp:1935 -#: src/slic3r/GUI/Tab.cpp:2273 src/slic3r/GUI/Tab.cpp:2349 -#: src/slic3r/GUI/Tab.cpp:3993 src/slic3r/GUI/Tab.cpp:4124 +#: src/slic3r/GUI/Tab.cpp:1626 src/slic3r/GUI/Tab.cpp:1949 +#: src/slic3r/GUI/Tab.cpp:2287 src/slic3r/GUI/Tab.cpp:2363 +#: src/slic3r/GUI/Tab.cpp:4011 src/slic3r/GUI/Tab.cpp:4142 msgid "Dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1613 src/slic3r/GUI/Tab.cpp:1936 -#: src/slic3r/GUI/Tab.cpp:2274 src/slic3r/GUI/Tab.cpp:2350 -#: src/slic3r/GUI/Tab.cpp:3994 src/slic3r/GUI/Tab.cpp:4125 +#: src/slic3r/GUI/Tab.cpp:1627 src/slic3r/GUI/Tab.cpp:1950 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2364 +#: src/slic3r/GUI/Tab.cpp:4012 src/slic3r/GUI/Tab.cpp:4143 msgid "Profile dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1693 +#: src/slic3r/GUI/Tab.cpp:1707 msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1815 +#: src/slic3r/GUI/Tab.cpp:1829 msgid "Temperature" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1816 +#: src/slic3r/GUI/Tab.cpp:1830 msgid "Nozzle" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1821 +#: src/slic3r/GUI/Tab.cpp:1835 msgid "Bed" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1826 +#: src/slic3r/GUI/Tab.cpp:1840 msgid "Cooling" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1828 src/libslic3r/PrintConfig.cpp:1565 -#: src/libslic3r/PrintConfig.cpp:2428 +#: src/slic3r/GUI/Tab.cpp:1842 src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:2517 msgid "Enable" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1839 +#: src/slic3r/GUI/Tab.cpp:1853 msgid "Fan settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1864 msgid "Cooling thresholds" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1856 +#: src/slic3r/GUI/Tab.cpp:1870 msgid "Filament properties" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1863 +#: src/slic3r/GUI/Tab.cpp:1877 msgid "Print speed override" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1873 +#: src/slic3r/GUI/Tab.cpp:1887 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1876 +#: src/slic3r/GUI/Tab.cpp:1890 msgid "Toolchange parameters with single extruder MM printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1889 +#: src/slic3r/GUI/Tab.cpp:1903 msgid "Ramming settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1912 src/slic3r/GUI/Tab.cpp:2205 -#: src/libslic3r/PrintConfig.cpp:2063 +#: src/slic3r/GUI/Tab.cpp:1926 src/slic3r/GUI/Tab.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1913 src/slic3r/GUI/Tab.cpp:2206 -#: src/libslic3r/PrintConfig.cpp:2013 src/libslic3r/PrintConfig.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:1927 src/slic3r/GUI/Tab.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2102 src/libslic3r/PrintConfig.cpp:2117 msgid "Start G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1920 src/slic3r/GUI/Tab.cpp:2213 -#: src/libslic3r/PrintConfig.cpp:441 src/libslic3r/PrintConfig.cpp:451 +#: src/slic3r/GUI/Tab.cpp:1934 src/slic3r/GUI/Tab.cpp:2227 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:476 msgid "End G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1984 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2066 +#: src/slic3r/GUI/Tab.cpp:2080 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -6898,19 +6935,19 @@ msgid "" "physical_printer directory." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2286 +#: src/slic3r/GUI/Tab.cpp:2113 src/slic3r/GUI/Tab.cpp:2300 msgid "Size and coordinates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2108 src/slic3r/GUI/UnsavedChangesDialog.cpp:1080 +#: src/slic3r/GUI/Tab.cpp:2122 src/slic3r/GUI/UnsavedChangesDialog.cpp:1082 msgid "Capabilities" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2113 +#: src/slic3r/GUI/Tab.cpp:2127 msgid "Number of extruders of the printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2141 +#: src/slic3r/GUI/Tab.cpp:2155 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -6918,231 +6955,243 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2144 src/slic3r/GUI/Tab.cpp:2552 -#: src/libslic3r/PrintConfig.cpp:1534 +#: src/slic3r/GUI/Tab.cpp:2158 src/slic3r/GUI/Tab.cpp:2566 +#: src/libslic3r/PrintConfig.cpp:1623 msgid "Nozzle diameter" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2220 src/libslic3r/PrintConfig.cpp:209 +#: src/slic3r/GUI/Tab.cpp:2234 src/libslic3r/PrintConfig.cpp:209 msgid "Before layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2227 src/libslic3r/PrintConfig.cpp:1273 +#: src/slic3r/GUI/Tab.cpp:2241 src/libslic3r/PrintConfig.cpp:1362 msgid "After layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2234 src/libslic3r/PrintConfig.cpp:2321 +#: src/slic3r/GUI/Tab.cpp:2248 src/libslic3r/PrintConfig.cpp:2410 msgid "Tool change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2241 +#: src/slic3r/GUI/Tab.cpp:2255 msgid "Between objects G-code (for sequential printing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2248 +#: src/slic3r/GUI/Tab.cpp:2262 msgid "Color Change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2254 src/libslic3r/PrintConfig.cpp:2054 +#: src/slic3r/GUI/Tab.cpp:2268 src/libslic3r/PrintConfig.cpp:2143 msgid "Pause Print G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2260 +#: src/slic3r/GUI/Tab.cpp:2274 msgid "Template Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2293 +#: src/slic3r/GUI/Tab.cpp:2307 msgid "Display" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2308 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "Tilt" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2309 +#: src/slic3r/GUI/Tab.cpp:2323 msgid "Tilt time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2315 src/slic3r/GUI/Tab.cpp:3969 +#: src/slic3r/GUI/Tab.cpp:2329 src/slic3r/GUI/Tab.cpp:3987 msgid "Corrections" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2332 src/slic3r/GUI/Tab.cpp:3965 +#: src/slic3r/GUI/Tab.cpp:2346 src/slic3r/GUI/Tab.cpp:3983 msgid "Exposure" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2391 src/slic3r/GUI/Tab.cpp:2485 -#: src/libslic3r/PrintConfig.cpp:1302 src/libslic3r/PrintConfig.cpp:1337 -#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1371 -#: src/libslic3r/PrintConfig.cpp:1387 src/libslic3r/PrintConfig.cpp:1397 -#: src/libslic3r/PrintConfig.cpp:1407 src/libslic3r/PrintConfig.cpp:1417 +#: src/slic3r/GUI/Tab.cpp:2405 src/slic3r/GUI/Tab.cpp:2499 +#: src/libslic3r/PrintConfig.cpp:1391 src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1443 src/libslic3r/PrintConfig.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1476 src/libslic3r/PrintConfig.cpp:1486 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1506 msgid "Machine limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2414 +#: src/slic3r/GUI/Tab.cpp:2428 msgid "Values in this column are for Normal mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2434 msgid "Values in this column are for Stealth mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2429 +#: src/slic3r/GUI/Tab.cpp:2443 msgid "Maximum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2434 +#: src/slic3r/GUI/Tab.cpp:2448 msgid "Maximum accelerations" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2441 +#: src/slic3r/GUI/Tab.cpp:2455 msgid "Jerk limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2446 +#: src/slic3r/GUI/Tab.cpp:2460 msgid "Minimum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2510 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2524 src/slic3r/GUI/Tab.cpp:2532 msgid "Single extruder MM setup" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2519 +#: src/slic3r/GUI/Tab.cpp:2533 msgid "Single extruder multimaterial parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2550 +#: src/slic3r/GUI/Tab.cpp:2564 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:2574 +#: src/slic3r/GUI/Tab.cpp:2588 msgid "Layer height limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2579 +#: src/slic3r/GUI/Tab.cpp:2593 msgid "Position (for multi-extruder printers)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2585 +#: src/slic3r/GUI/Tab.cpp:2599 msgid "Only lift Z" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2598 +#: src/slic3r/GUI/Tab.cpp:2612 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2605 +#: src/slic3r/GUI/Tab.cpp:2619 msgid "Reset to Filament Color" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2783 +#: src/slic3r/GUI/Tab.cpp:2797 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:2785 +#: src/slic3r/GUI/Tab.cpp:2799 msgid "Firmware Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3376 +#: src/slic3r/GUI/Tab.cpp:3390 msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3439 +#: src/slic3r/GUI/Tab.cpp:3453 msgid "remove" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3439 +#: src/slic3r/GUI/Tab.cpp:3453 msgid "delete" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3448 +#: src/slic3r/GUI/Tab.cpp:3462 msgid "It's a last preset for this physical printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3453 +#: src/slic3r/GUI/Tab.cpp:3467 msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3465 +#: src/slic3r/GUI/Tab.cpp:3479 msgid "" -"The physical printer(s) below is based on the preset, you are going to " -"delete." -msgstr "" +"The physical printer below is based on the preset, you are going to delete." +msgid_plural "" +"The physical printers below are based on the preset, you are going to delete." +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3469 -msgid "" -"Note, that selected preset will be deleted from this/those printer(s) too." -msgstr "" +#: src/slic3r/GUI/Tab.cpp:3484 +msgid "Note, that selected preset will be deleted from this printer too." +msgid_plural "" +"Note, that selected preset will be deleted from these printers too." +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3473 +#: src/slic3r/GUI/Tab.cpp:3489 msgid "" -"The physical printer(s) below is based only on the preset, you are going to " +"The physical printer below is based only on the preset, you are going to " "delete." -msgstr "" +msgid_plural "" +"The physical printers below are based only on the preset, you are going to " +"delete." +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3477 +#: src/slic3r/GUI/Tab.cpp:3494 msgid "" -"Note, that this/those printer(s) will be deleted after deleting of the " -"selected preset." -msgstr "" +"Note, that this printer will be deleted after deleting of the selected " +"preset." +msgid_plural "" +"Note, that these printers will be deleted after deleting of the selected " +"preset." +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3481 +#: src/slic3r/GUI/Tab.cpp:3499 msgid "Are you sure you want to %1% the selected preset?" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3486 +#: src/slic3r/GUI/Tab.cpp:3504 msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3567 src/slic3r/GUI/Tab.cpp:3639 +#: src/slic3r/GUI/Tab.cpp:3585 src/slic3r/GUI/Tab.cpp:3657 msgid "Set" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3703 +#: src/slic3r/GUI/Tab.cpp:3721 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3706 +#: src/slic3r/GUI/Tab.cpp:3724 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " "apply a different set of machine limits." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3728 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3750 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3734 +#: src/slic3r/GUI/Tab.cpp:3752 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:3736 +#: src/slic3r/GUI/Tab.cpp:3754 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3756 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -7150,23 +7199,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3761 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3745 +#: src/slic3r/GUI/Tab.cpp:3763 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 "" -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3766 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3768 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -7174,13 +7223,13 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3760 +#: src/slic3r/GUI/Tab.cpp:3778 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:3762 +#: src/slic3r/GUI/Tab.cpp:3780 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" @@ -7188,17 +7237,17 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3765 +#: src/slic3r/GUI/Tab.cpp:3783 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3768 +#: src/slic3r/GUI/Tab.cpp:3786 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:3770 +#: src/slic3r/GUI/Tab.cpp:3788 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" @@ -7206,63 +7255,63 @@ msgid "" "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3776 +#: src/slic3r/GUI/Tab.cpp:3794 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3777 +#: src/slic3r/GUI/Tab.cpp:3795 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:3783 +#: src/slic3r/GUI/Tab.cpp:3801 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3784 +#: src/slic3r/GUI/Tab.cpp:3802 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 "" -#: src/slic3r/GUI/Tab.cpp:3928 src/slic3r/GUI/Tab.cpp:3930 +#: src/slic3r/GUI/Tab.cpp:3946 src/slic3r/GUI/Tab.cpp:3948 msgid "Material" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4070 msgid "Support head" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4075 msgid "Support pillar" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4080 +#: src/slic3r/GUI/Tab.cpp:4098 msgid "Connection of the support sticks and junctions" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4085 +#: src/slic3r/GUI/Tab.cpp:4103 msgid "Automatic generation" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4177 msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" "To enable \"%1%\", please switch off \"%2%\"" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3002 +#: src/slic3r/GUI/Tab.cpp:4179 src/libslic3r/PrintConfig.cpp:3091 msgid "Object elevation" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3104 +#: src/slic3r/GUI/Tab.cpp:4179 src/libslic3r/PrintConfig.cpp:3193 msgid "Pad around object" msgstr "" @@ -7367,35 +7416,35 @@ msgstr "" msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1019 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1021 msgid "The following presets were modified:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1024 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1026 msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1028 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1030 msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1029 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1031 msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1075 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1077 msgid "Extruders count" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1199 msgid "Old value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1198 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1200 msgid "New value" msgstr "" @@ -7838,7 +7887,7 @@ msgid "" "connections. See logs for additional details." msgstr "" -#: src/slic3r/Utils/Process.cpp:151 +#: src/slic3r/Utils/Process.cpp:157 msgid "Open G-code file:" msgstr "" @@ -7860,7 +7909,7 @@ msgid "" "Try to repair the model or change its orientation on the bed." msgstr "" -#: src/libslic3r/GCode.cpp:1261 +#: src/libslic3r/GCode.cpp:1274 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." @@ -7875,7 +7924,7 @@ msgid "" "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1668 +#: src/libslic3r/Format/3mf.cpp:1641 msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." @@ -8011,117 +8060,117 @@ msgstr "" msgid "write calledback failed" msgstr "" -#: src/libslic3r/Preset.cpp:1299 +#: src/libslic3r/Preset.cpp:1304 msgid "filament" msgstr "" -#: src/libslic3r/Print.cpp:1251 +#: src/libslic3r/Print.cpp:1257 msgid "All objects are outside of the print volume." msgstr "" -#: src/libslic3r/Print.cpp:1254 +#: src/libslic3r/Print.cpp:1260 msgid "The supplied settings will cause an empty print." msgstr "" -#: src/libslic3r/Print.cpp:1258 +#: src/libslic3r/Print.cpp:1264 msgid "Some objects are too close; your extruder will collide with them." msgstr "" -#: src/libslic3r/Print.cpp:1260 +#: src/libslic3r/Print.cpp:1266 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" -#: src/libslic3r/Print.cpp:1269 +#: src/libslic3r/Print.cpp:1275 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " "\"complete_objects\"." msgstr "" -#: src/libslic3r/Print.cpp:1277 +#: src/libslic3r/Print.cpp:1283 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "" -#: src/libslic3r/Print.cpp:1290 +#: src/libslic3r/Print.cpp:1296 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." msgstr "" -#: src/libslic3r/Print.cpp:1296 +#: src/libslic3r/Print.cpp:1302 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." msgstr "" -#: src/libslic3r/Print.cpp:1298 +#: src/libslic3r/Print.cpp:1304 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." msgstr "" -#: src/libslic3r/Print.cpp:1300 +#: src/libslic3r/Print.cpp:1306 msgid "Ooze prevention is currently not supported with the wipe tower enabled." msgstr "" -#: src/libslic3r/Print.cpp:1302 +#: src/libslic3r/Print.cpp:1308 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" -#: src/libslic3r/Print.cpp:1304 +#: src/libslic3r/Print.cpp:1310 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." msgstr "" -#: src/libslic3r/Print.cpp:1325 +#: src/libslic3r/Print.cpp:1331 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" msgstr "" -#: src/libslic3r/Print.cpp:1327 +#: src/libslic3r/Print.cpp:1333 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" msgstr "" -#: src/libslic3r/Print.cpp:1329 +#: src/libslic3r/Print.cpp:1335 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" msgstr "" -#: src/libslic3r/Print.cpp:1331 +#: src/libslic3r/Print.cpp:1337 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "" -#: src/libslic3r/Print.cpp:1373 +#: src/libslic3r/Print.cpp:1379 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" msgstr "" -#: src/libslic3r/Print.cpp:1399 +#: src/libslic3r/Print.cpp:1405 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" -#: src/libslic3r/Print.cpp:1408 +#: src/libslic3r/Print.cpp:1418 msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:1411 +#: src/libslic3r/Print.cpp:1421 msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:1422 +#: src/libslic3r/Print.cpp:1432 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -8129,13 +8178,13 @@ msgid "" "same diameter." msgstr "" -#: src/libslic3r/Print.cpp:1430 +#: src/libslic3r/Print.cpp:1440 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." msgstr "" -#: src/libslic3r/Print.cpp:1434 +#: src/libslic3r/Print.cpp:1444 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 " @@ -8143,31 +8192,31 @@ msgid "" "set to 0)." msgstr "" -#: src/libslic3r/Print.cpp:1456 +#: src/libslic3r/Print.cpp:1466 msgid "First layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:1461 +#: src/libslic3r/Print.cpp:1471 msgid "Layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:1620 +#: src/libslic3r/Print.cpp:1630 msgid "Infilling layers" msgstr "" -#: src/libslic3r/Print.cpp:1646 +#: src/libslic3r/Print.cpp:1656 msgid "Generating skirt" msgstr "" -#: src/libslic3r/Print.cpp:1655 +#: src/libslic3r/Print.cpp:1665 msgid "Generating brim" msgstr "" -#: src/libslic3r/Print.cpp:1678 +#: src/libslic3r/Print.cpp:1691 msgid "Exporting G-code" msgstr "" -#: src/libslic3r/Print.cpp:1682 +#: src/libslic3r/Print.cpp:1695 msgid "Generating G-code" msgstr "" @@ -8272,7 +8321,7 @@ msgid "" "objects printable." msgstr "" -#: src/libslic3r/PrintBase.cpp:72 +#: src/libslic3r/PrintBase.cpp:77 msgid "Failed processing of the output_filename_format template." msgstr "" @@ -8424,7 +8473,7 @@ msgstr "" msgid "mm or % (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:2380 msgid "Other layers" msgstr "" @@ -8487,10 +8536,10 @@ msgid "" "disable acceleration control for bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:252 src/libslic3r/PrintConfig.cpp:395 -#: src/libslic3r/PrintConfig.cpp:940 src/libslic3r/PrintConfig.cpp:1079 -#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1409 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1612 +#: src/libslic3r/PrintConfig.cpp:252 src/libslic3r/PrintConfig.cpp:420 +#: src/libslic3r/PrintConfig.cpp:965 src/libslic3r/PrintConfig.cpp:1168 +#: src/libslic3r/PrintConfig.cpp:1449 src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1508 src/libslic3r/PrintConfig.cpp:1701 msgid "mm/s²" msgstr "" @@ -8505,11 +8554,11 @@ msgid "" "bridges. Use 180° for zero angle." msgstr "" -#: src/libslic3r/PrintConfig.cpp:263 src/libslic3r/PrintConfig.cpp:852 -#: src/libslic3r/PrintConfig.cpp:1853 src/libslic3r/PrintConfig.cpp:1863 -#: src/libslic3r/PrintConfig.cpp:2121 src/libslic3r/PrintConfig.cpp:2276 -#: src/libslic3r/PrintConfig.cpp:2475 src/libslic3r/PrintConfig.cpp:2976 -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:263 src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:1942 src/libslic3r/PrintConfig.cpp:1952 +#: src/libslic3r/PrintConfig.cpp:2210 src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:3065 +#: src/libslic3r/PrintConfig.cpp:3186 msgid "°" msgstr "" @@ -8521,11 +8570,11 @@ msgstr "" msgid "This fan speed is enforced during all bridges and overhangs." msgstr "" -#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:864 -#: src/libslic3r/PrintConfig.cpp:1248 src/libslic3r/PrintConfig.cpp:1427 -#: src/libslic3r/PrintConfig.cpp:1490 src/libslic3r/PrintConfig.cpp:1745 -#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2890 -#: src/libslic3r/PrintConfig.cpp:3016 +#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1337 src/libslic3r/PrintConfig.cpp:1516 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1834 +#: src/libslic3r/PrintConfig.cpp:2742 src/libslic3r/PrintConfig.cpp:2979 +#: src/libslic3r/PrintConfig.cpp:3105 msgid "%" msgstr "" @@ -8549,17 +8598,17 @@ msgstr "" msgid "Speed for printing bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:293 src/libslic3r/PrintConfig.cpp:671 -#: src/libslic3r/PrintConfig.cpp:679 src/libslic3r/PrintConfig.cpp:688 -#: src/libslic3r/PrintConfig.cpp:696 src/libslic3r/PrintConfig.cpp:723 -#: src/libslic3r/PrintConfig.cpp:742 src/libslic3r/PrintConfig.cpp:1015 -#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1267 -#: src/libslic3r/PrintConfig.cpp:1343 src/libslic3r/PrintConfig.cpp:1377 -#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1399 -#: src/libslic3r/PrintConfig.cpp:1449 src/libslic3r/PrintConfig.cpp:1508 -#: src/libslic3r/PrintConfig.cpp:1642 src/libslic3r/PrintConfig.cpp:1820 -#: src/libslic3r/PrintConfig.cpp:1829 src/libslic3r/PrintConfig.cpp:2255 -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:293 src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:704 src/libslic3r/PrintConfig.cpp:713 +#: src/libslic3r/PrintConfig.cpp:721 src/libslic3r/PrintConfig.cpp:748 +#: src/libslic3r/PrintConfig.cpp:767 src/libslic3r/PrintConfig.cpp:1104 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1432 src/libslic3r/PrintConfig.cpp:1466 +#: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1597 +#: src/libslic3r/PrintConfig.cpp:1731 src/libslic3r/PrintConfig.cpp:1909 +#: src/libslic3r/PrintConfig.cpp:1918 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "mm/s" msgstr "" @@ -8567,58 +8616,92 @@ msgstr "" msgid "Brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:301 +#: src/libslic3r/PrintConfig.cpp:302 msgid "" "Horizontal width of the brim that will be printed around each object on the " "first layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:308 +#: src/libslic3r/PrintConfig.cpp:309 +msgid "Brim type" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:311 +msgid "" +"The places where the brim will be printed around each object on the first " +"layer." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:317 +msgid "No brim" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:318 +msgid "Outer brim only" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:319 +msgid "Inner brim only" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:320 +msgid "Outer and inner brim" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:325 +msgid "Brim offset" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:327 +msgid "The offset of the brim from the printed object." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:333 msgid "Clip multi-part objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:309 +#: src/libslic3r/PrintConfig.cpp:334 msgid "" "When printing multi-material objects, this settings will make Slic3r to clip " "the overlapping object parts one by the other (2nd part will be clipped by " "the 1st, 3rd part will be clipped by the 1st and 2nd etc)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:316 +#: src/libslic3r/PrintConfig.cpp:341 msgid "Colorprint height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:317 +#: src/libslic3r/PrintConfig.cpp:342 msgid "Heights at which a filament change is to occur." msgstr "" -#: src/libslic3r/PrintConfig.cpp:327 +#: src/libslic3r/PrintConfig.cpp:352 msgid "Compatible printers condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:328 +#: src/libslic3r/PrintConfig.cpp:353 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " "compatible with the active printer profile." msgstr "" -#: src/libslic3r/PrintConfig.cpp:342 +#: src/libslic3r/PrintConfig.cpp:367 msgid "Compatible print profiles condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:343 +#: src/libslic3r/PrintConfig.cpp:368 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " "compatible with the active print profile." msgstr "" -#: src/libslic3r/PrintConfig.cpp:360 +#: src/libslic3r/PrintConfig.cpp:385 msgid "Complete individual objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:361 +#: src/libslic3r/PrintConfig.cpp:386 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -8626,97 +8709,97 @@ msgid "" "warn and prevent you from extruder collisions, but beware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:394 msgid "Enable auto cooling" msgstr "" -#: src/libslic3r/PrintConfig.cpp:370 +#: src/libslic3r/PrintConfig.cpp:395 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." msgstr "" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:400 msgid "Cooling tube position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:376 +#: src/libslic3r/PrintConfig.cpp:401 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:383 +#: src/libslic3r/PrintConfig.cpp:408 msgid "Cooling tube length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:384 +#: src/libslic3r/PrintConfig.cpp:409 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:392 +#: src/libslic3r/PrintConfig.cpp:417 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " "prevent resetting acceleration at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:401 +#: src/libslic3r/PrintConfig.cpp:426 msgid "Default filament profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:402 +#: src/libslic3r/PrintConfig.cpp:427 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " "activated." msgstr "" -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:433 msgid "Default print profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:2820 -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2909 +#: src/libslic3r/PrintConfig.cpp:2920 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " "activated." msgstr "" -#: src/libslic3r/PrintConfig.cpp:415 +#: src/libslic3r/PrintConfig.cpp:440 msgid "Disable fan for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:441 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." msgstr "" -#: src/libslic3r/PrintConfig.cpp:425 +#: src/libslic3r/PrintConfig.cpp:450 msgid "Don't support bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:427 +#: src/libslic3r/PrintConfig.cpp:452 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" -#: src/libslic3r/PrintConfig.cpp:433 +#: src/libslic3r/PrintConfig.cpp:458 msgid "Distance between copies" msgstr "" -#: src/libslic3r/PrintConfig.cpp:434 +#: src/libslic3r/PrintConfig.cpp:459 msgid "Distance used for the auto-arrange feature of the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:442 +#: src/libslic3r/PrintConfig.cpp:467 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." msgstr "" -#: src/libslic3r/PrintConfig.cpp:452 +#: src/libslic3r/PrintConfig.cpp:477 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -8725,70 +8808,70 @@ msgid "" "in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:463 +#: src/libslic3r/PrintConfig.cpp:488 msgid "Ensure vertical shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:490 msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell " "thickness (top+bottom solid layers)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:471 +#: src/libslic3r/PrintConfig.cpp:496 msgid "Top fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:473 +#: src/libslic3r/PrintConfig.cpp:498 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:918 -#: src/libslic3r/PrintConfig.cpp:2236 +#: src/libslic3r/PrintConfig.cpp:508 src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:2325 msgid "Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:484 +#: src/libslic3r/PrintConfig.cpp:509 msgid "Monotonic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:485 src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:510 src/libslic3r/PrintConfig.cpp:944 msgid "Aligned Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:925 +#: src/libslic3r/PrintConfig.cpp:511 src/libslic3r/PrintConfig.cpp:950 msgid "Concentric" msgstr "" -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:929 +#: src/libslic3r/PrintConfig.cpp:512 src/libslic3r/PrintConfig.cpp:954 msgid "Hilbert Curve" msgstr "" -#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:930 +#: src/libslic3r/PrintConfig.cpp:513 src/libslic3r/PrintConfig.cpp:955 msgid "Archimedean Chords" msgstr "" -#: src/libslic3r/PrintConfig.cpp:489 src/libslic3r/PrintConfig.cpp:931 +#: src/libslic3r/PrintConfig.cpp:514 src/libslic3r/PrintConfig.cpp:956 msgid "Octagram Spiral" msgstr "" -#: src/libslic3r/PrintConfig.cpp:495 +#: src/libslic3r/PrintConfig.cpp:520 msgid "Bottom fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:497 +#: src/libslic3r/PrintConfig.cpp:522 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:517 +#: src/libslic3r/PrintConfig.cpp:531 src/libslic3r/PrintConfig.cpp:542 msgid "External perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:533 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -8796,43 +8879,43 @@ msgid "" "(for example 200%), it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:511 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:962 src/libslic3r/PrintConfig.cpp:975 -#: src/libslic3r/PrintConfig.cpp:1104 src/libslic3r/PrintConfig.cpp:1159 -#: src/libslic3r/PrintConfig.cpp:1185 src/libslic3r/PrintConfig.cpp:1632 -#: src/libslic3r/PrintConfig.cpp:1961 src/libslic3r/PrintConfig.cpp:2110 -#: src/libslic3r/PrintConfig.cpp:2178 src/libslic3r/PrintConfig.cpp:2339 +#: src/libslic3r/PrintConfig.cpp:536 src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:987 src/libslic3r/PrintConfig.cpp:1000 +#: src/libslic3r/PrintConfig.cpp:1193 src/libslic3r/PrintConfig.cpp:1248 +#: src/libslic3r/PrintConfig.cpp:1274 src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2199 +#: src/libslic3r/PrintConfig.cpp:2267 src/libslic3r/PrintConfig.cpp:2428 msgid "mm or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:519 +#: src/libslic3r/PrintConfig.cpp:544 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " "calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:522 src/libslic3r/PrintConfig.cpp:984 -#: src/libslic3r/PrintConfig.cpp:1920 src/libslic3r/PrintConfig.cpp:1972 -#: src/libslic3r/PrintConfig.cpp:2222 src/libslic3r/PrintConfig.cpp:2352 +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:2009 src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2311 src/libslic3r/PrintConfig.cpp:2441 msgid "mm/s or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:554 msgid "External perimeters first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:531 +#: src/libslic3r/PrintConfig.cpp:556 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:562 msgid "Extra perimeters if needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:539 +#: src/libslic3r/PrintConfig.cpp:564 #, possible-c-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " @@ -8840,14 +8923,14 @@ msgid "" "is supported." msgstr "" -#: src/libslic3r/PrintConfig.cpp:549 +#: src/libslic3r/PrintConfig.cpp:574 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " "extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:586 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -8855,26 +8938,26 @@ msgid "" "extruder can peek before colliding with other printed objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:597 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " "check for collisions and to display the graphical preview in the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:582 +#: src/libslic3r/PrintConfig.cpp:607 msgid "Extruder Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:583 src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:608 src/libslic3r/PrintConfig.cpp:670 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:589 +#: src/libslic3r/PrintConfig.cpp:614 msgid "Extruder offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:590 +#: src/libslic3r/PrintConfig.cpp:615 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -8882,21 +8965,21 @@ msgid "" "coordinates (they will be subtracted from the XY coordinate)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:599 +#: src/libslic3r/PrintConfig.cpp:624 msgid "Extrusion axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:600 +#: src/libslic3r/PrintConfig.cpp:625 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:630 msgid "Extrusion multiplier" msgstr "" -#: src/libslic3r/PrintConfig.cpp:606 +#: src/libslic3r/PrintConfig.cpp:631 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -8904,11 +8987,11 @@ msgid "" "more, check filament diameter and your firmware E steps." msgstr "" -#: src/libslic3r/PrintConfig.cpp:615 +#: src/libslic3r/PrintConfig.cpp:640 msgid "Default extrusion width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:617 +#: src/libslic3r/PrintConfig.cpp:642 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -8917,123 +9000,123 @@ msgid "" "height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:653 msgid "Keep fan always on" msgstr "" -#: src/libslic3r/PrintConfig.cpp:629 +#: src/libslic3r/PrintConfig.cpp:654 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." msgstr "" -#: src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:659 msgid "Enable fan if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:635 +#: src/libslic3r/PrintConfig.cpp:660 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " "maximum speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:637 src/libslic3r/PrintConfig.cpp:1908 +#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1997 msgid "approximate seconds" msgstr "" -#: src/libslic3r/PrintConfig.cpp:644 +#: src/libslic3r/PrintConfig.cpp:669 msgid "Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:650 +#: src/libslic3r/PrintConfig.cpp:675 msgid "Filament notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:651 +#: src/libslic3r/PrintConfig.cpp:676 msgid "You can put your notes regarding the filament here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:659 src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:684 src/libslic3r/PrintConfig.cpp:1544 msgid "Max volumetric speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:685 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 "" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:694 msgid "Loading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:670 +#: src/libslic3r/PrintConfig.cpp:695 msgid "Speed used for loading the filament on the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:702 msgid "Loading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:703 msgid "Speed used at the very beginning of loading phase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:710 msgid "Unloading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:711 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:694 +#: src/libslic3r/PrintConfig.cpp:719 msgid "Unloading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:695 +#: src/libslic3r/PrintConfig.cpp:720 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" -#: src/libslic3r/PrintConfig.cpp:702 +#: src/libslic3r/PrintConfig.cpp:727 msgid "Delay after unloading" msgstr "" -#: src/libslic3r/PrintConfig.cpp:703 +#: src/libslic3r/PrintConfig.cpp:728 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " "original dimensions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:712 +#: src/libslic3r/PrintConfig.cpp:737 msgid "Number of cooling moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:713 +#: src/libslic3r/PrintConfig.cpp:738 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:721 +#: src/libslic3r/PrintConfig.cpp:746 msgid "Speed of the first cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:722 +#: src/libslic3r/PrintConfig.cpp:747 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:754 msgid "Minimal purge on wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:755 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -9042,63 +9125,63 @@ msgid "" "to produce successive infill or sacrificial object extrusions reliably." msgstr "" -#: src/libslic3r/PrintConfig.cpp:734 +#: src/libslic3r/PrintConfig.cpp:759 msgid "mm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:740 +#: src/libslic3r/PrintConfig.cpp:765 msgid "Speed of the last cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:741 +#: src/libslic3r/PrintConfig.cpp:766 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:748 +#: src/libslic3r/PrintConfig.cpp:773 msgid "Filament load time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:749 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:756 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Ramming parameters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:757 +#: src/libslic3r/PrintConfig.cpp:782 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:763 +#: src/libslic3r/PrintConfig.cpp:788 msgid "Filament unload time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:764 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:772 +#: src/libslic3r/PrintConfig.cpp:797 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " "average." msgstr "" -#: src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:2731 -#: src/libslic3r/PrintConfig.cpp:2732 +#: src/libslic3r/PrintConfig.cpp:804 src/libslic3r/PrintConfig.cpp:2820 +#: src/libslic3r/PrintConfig.cpp:2821 msgid "Density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:780 +#: src/libslic3r/PrintConfig.cpp:805 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -9106,41 +9189,41 @@ msgid "" "displacement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:783 +#: src/libslic3r/PrintConfig.cpp:808 msgid "g/cm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:813 msgid "Filament type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:789 +#: src/libslic3r/PrintConfig.cpp:814 msgid "The filament material type for use in custom G-codes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:816 +#: src/libslic3r/PrintConfig.cpp:841 msgid "Soluble material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:817 +#: src/libslic3r/PrintConfig.cpp:842 msgid "Soluble material is most likely used for a soluble support." msgstr "" -#: src/libslic3r/PrintConfig.cpp:823 +#: src/libslic3r/PrintConfig.cpp:848 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "" -#: src/libslic3r/PrintConfig.cpp:824 +#: src/libslic3r/PrintConfig.cpp:849 msgid "money/kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:829 +#: src/libslic3r/PrintConfig.cpp:854 msgid "Spool weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:855 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -9148,103 +9231,103 @@ msgid "" "amount of filament on the spool is sufficient to finish the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:834 +#: src/libslic3r/PrintConfig.cpp:859 msgid "g" msgstr "" -#: src/libslic3r/PrintConfig.cpp:843 src/libslic3r/PrintConfig.cpp:2815 +#: src/libslic3r/PrintConfig.cpp:868 src/libslic3r/PrintConfig.cpp:2904 msgid "(Unknown)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:872 msgid "Fill angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:849 +#: src/libslic3r/PrintConfig.cpp:874 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " "so this setting does not affect them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:861 +#: src/libslic3r/PrintConfig.cpp:886 msgid "Fill density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:888 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" -#: src/libslic3r/PrintConfig.cpp:898 +#: src/libslic3r/PrintConfig.cpp:923 msgid "Fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:925 msgid "Fill pattern for general low-density infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:920 +#: src/libslic3r/PrintConfig.cpp:945 msgid "Grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:921 +#: src/libslic3r/PrintConfig.cpp:946 msgid "Triangles" msgstr "" -#: src/libslic3r/PrintConfig.cpp:922 +#: src/libslic3r/PrintConfig.cpp:947 msgid "Stars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:923 +#: src/libslic3r/PrintConfig.cpp:948 msgid "Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:924 +#: src/libslic3r/PrintConfig.cpp:949 msgid "Line" msgstr "" -#: src/libslic3r/PrintConfig.cpp:926 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:2327 msgid "Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:952 msgid "3D Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:928 +#: src/libslic3r/PrintConfig.cpp:953 msgid "Gyroid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:932 +#: src/libslic3r/PrintConfig.cpp:957 msgid "Adaptive Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:933 +#: src/libslic3r/PrintConfig.cpp:958 msgid "Support Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:937 src/libslic3r/PrintConfig.cpp:946 -#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:962 src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:981 src/libslic3r/PrintConfig.cpp:1015 msgid "First layer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:938 +#: src/libslic3r/PrintConfig.cpp:963 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:947 +#: src/libslic3r/PrintConfig.cpp:972 msgid "First layer bed temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:948 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:983 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -9252,7 +9335,7 @@ msgid "" "layer height. If set to zero, it will use the default extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:996 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " @@ -9260,33 +9343,33 @@ msgid "" "example: 150%) over the default layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:980 +#: src/libslic3r/PrintConfig.cpp:1005 msgid "First layer speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:981 +#: src/libslic3r/PrintConfig.cpp:1006 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " "as a percentage (for example: 40%) it will scale the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:991 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "First layer nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:992 +#: src/libslic3r/PrintConfig.cpp:1017 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " "commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1000 +#: src/libslic3r/PrintConfig.cpp:1025 msgid "Full fan speed at layer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1026 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -9295,29 +9378,62 @@ msgid "" "maximum allowed speed at layer \"disable_fan_first_layers\" + 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1036 +msgid "Fuzzy skin perimeter mode" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:1083 +#: src/libslic3r/PrintConfig.cpp:1092 +msgid "Fuzzy Skin" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1038 +msgid "Fuzzy skin perimeter mode." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1046 +msgid "External" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1047 +msgid "External (skip first layer)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1048 +msgid "All perimeters" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1082 +msgid "Fuzzy skin thickness" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1091 +msgid "Fuzzy skin point distance" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " "filling." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "Verbose G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1022 +#: src/libslic3r/PrintConfig.cpp:1111 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " "file could make your firmware slow down." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "G-code flavor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1030 +#: src/libslic3r/PrintConfig.cpp:1119 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -9325,15 +9441,15 @@ msgid "" "extrusion value at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1055 +#: src/libslic3r/PrintConfig.cpp:1144 msgid "No extrusion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1060 +#: src/libslic3r/PrintConfig.cpp:1149 msgid "Label objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1150 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -9341,42 +9457,42 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1068 +#: src/libslic3r/PrintConfig.cpp:1157 msgid "High extruder current on filament swap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1069 +#: src/libslic3r/PrintConfig.cpp:1158 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " "overcome resistance when loading a filament with an ugly shaped tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1077 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1085 +#: src/libslic3r/PrintConfig.cpp:1174 msgid "Combine infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1087 +#: src/libslic3r/PrintConfig.cpp:1176 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1090 +#: src/libslic3r/PrintConfig.cpp:1179 msgid "Combine infill every n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1096 +#: src/libslic3r/PrintConfig.cpp:1185 msgid "Length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1098 +#: src/libslic3r/PrintConfig.cpp:1187 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -9389,19 +9505,19 @@ msgid "" "perimeters connected to a single infill line." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1202 msgid "0 (no open anchors)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1118 src/libslic3r/PrintConfig.cpp:1140 +#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1229 msgid "1000 (unlimited)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1123 +#: src/libslic3r/PrintConfig.cpp:1212 msgid "Maximum length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1125 +#: src/libslic3r/PrintConfig.cpp:1214 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -9413,19 +9529,19 @@ msgid "" "parameter. Set this parameter to zero to disable anchoring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1135 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "0 (not anchored)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1145 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1147 +#: src/libslic3r/PrintConfig.cpp:1236 msgid "The extruder to use when printing infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1155 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -9434,32 +9550,32 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1165 +#: src/libslic3r/PrintConfig.cpp:1254 msgid "Infill before perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1166 +#: src/libslic3r/PrintConfig.cpp:1255 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1171 +#: src/libslic3r/PrintConfig.cpp:1260 msgid "Only infill where needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1262 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " "the G-code generation due to the multiple checks involved." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "Infill/perimeters overlap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:1271 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -9467,71 +9583,71 @@ msgid "" "perimeter extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1193 +#: src/libslic3r/PrintConfig.cpp:1282 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1201 +#: src/libslic3r/PrintConfig.cpp:1290 msgid "Inherits profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1291 msgid "Name of the profile, from which this profile inherits." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1215 +#: src/libslic3r/PrintConfig.cpp:1304 msgid "Interface shells" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1216 +#: src/libslic3r/PrintConfig.cpp:1305 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " "soluble support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1224 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "Enable ironing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1225 +#: src/libslic3r/PrintConfig.cpp:1314 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1320 src/libslic3r/PrintConfig.cpp:1322 msgid "Ironing Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1238 +#: src/libslic3r/PrintConfig.cpp:1327 msgid "All top surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1239 +#: src/libslic3r/PrintConfig.cpp:1328 msgid "Topmost surface only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1240 +#: src/libslic3r/PrintConfig.cpp:1329 msgid "All solid surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1245 +#: src/libslic3r/PrintConfig.cpp:1334 msgid "Flow rate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1247 +#: src/libslic3r/PrintConfig.cpp:1336 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1255 +#: src/libslic3r/PrintConfig.cpp:1344 msgid "Spacing between ironing passes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1257 +#: src/libslic3r/PrintConfig.cpp:1346 msgid "Distance between ironing lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1274 +#: src/libslic3r/PrintConfig.cpp:1363 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -9539,11 +9655,11 @@ msgid "" "[layer_z]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1374 msgid "Supports remaining times" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1286 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -9551,175 +9667,175 @@ msgid "" "firmware supports M73 Qxx Sxx for the silent mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1294 +#: src/libslic3r/PrintConfig.cpp:1383 msgid "Supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1295 +#: src/libslic3r/PrintConfig.cpp:1384 msgid "The firmware supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1389 msgid "How to apply limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1301 +#: src/libslic3r/PrintConfig.cpp:1390 msgid "Purpose of Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1303 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "How to apply the Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1397 msgid "Emit to G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/libslic3r/PrintConfig.cpp:1398 msgid "Use for time estimate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1399 msgid "Ignore" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1333 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Maximum feedrate X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1334 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "Maximum feedrate Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1424 msgid "Maximum feedrate Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1425 msgid "Maximum feedrate E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1339 +#: src/libslic3r/PrintConfig.cpp:1428 msgid "Maximum feedrate of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1340 +#: src/libslic3r/PrintConfig.cpp:1429 msgid "Maximum feedrate of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1341 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "Maximum feedrate of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1342 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Maximum feedrate of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1350 +#: src/libslic3r/PrintConfig.cpp:1439 msgid "Maximum acceleration X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1351 +#: src/libslic3r/PrintConfig.cpp:1440 msgid "Maximum acceleration Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1352 +#: src/libslic3r/PrintConfig.cpp:1441 msgid "Maximum acceleration Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1353 +#: src/libslic3r/PrintConfig.cpp:1442 msgid "Maximum acceleration E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "Maximum acceleration of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1357 +#: src/libslic3r/PrintConfig.cpp:1446 msgid "Maximum acceleration of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1358 +#: src/libslic3r/PrintConfig.cpp:1447 msgid "Maximum acceleration of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1448 msgid "Maximum acceleration of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1367 +#: src/libslic3r/PrintConfig.cpp:1456 msgid "Maximum jerk X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1368 +#: src/libslic3r/PrintConfig.cpp:1457 msgid "Maximum jerk Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1369 +#: src/libslic3r/PrintConfig.cpp:1458 msgid "Maximum jerk Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1370 +#: src/libslic3r/PrintConfig.cpp:1459 msgid "Maximum jerk E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1373 +#: src/libslic3r/PrintConfig.cpp:1462 msgid "Maximum jerk of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1374 +#: src/libslic3r/PrintConfig.cpp:1463 msgid "Maximum jerk of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1375 +#: src/libslic3r/PrintConfig.cpp:1464 msgid "Maximum jerk of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1465 msgid "Maximum jerk of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1475 msgid "Minimum feedrate when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1388 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Minimum feedrate when extruding (M205 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1396 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "Minimum travel feedrate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1398 +#: src/libslic3r/PrintConfig.cpp:1487 msgid "Minimum travel feedrate (M205 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1406 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "Maximum acceleration when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1497 msgid "Maximum acceleration when extruding (M204 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1416 +#: src/libslic3r/PrintConfig.cpp:1505 msgid "Maximum acceleration when retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1418 +#: src/libslic3r/PrintConfig.cpp:1507 msgid "Maximum acceleration when retracting (M204 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1425 src/libslic3r/PrintConfig.cpp:1434 +#: src/libslic3r/PrintConfig.cpp:1514 src/libslic3r/PrintConfig.cpp:1523 msgid "Max" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1515 msgid "This setting represents the maximum speed of your fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1435 +#: src/libslic3r/PrintConfig.cpp:1524 #, possible-c-format msgid "" "This is the highest printable layer height for this extruder, used to cap " @@ -9728,28 +9844,28 @@ msgid "" "adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1445 +#: src/libslic3r/PrintConfig.cpp:1534 msgid "Max print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1446 +#: src/libslic3r/PrintConfig.cpp:1535 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " "is used to set the highest print speed you want to allow." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1545 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1554 msgid "Max volumetric slope positive" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1466 src/libslic3r/PrintConfig.cpp:1477 +#: src/libslic3r/PrintConfig.cpp:1555 src/libslic3r/PrintConfig.cpp:1566 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " @@ -9757,95 +9873,95 @@ msgid "" "s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1470 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1559 src/libslic3r/PrintConfig.cpp:1570 msgid "mm³/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Max volumetric slope negative" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1488 src/libslic3r/PrintConfig.cpp:1497 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1586 msgid "Min" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1489 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " "0.1 mm." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1506 +#: src/libslic3r/PrintConfig.cpp:1595 msgid "Min print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1507 +#: src/libslic3r/PrintConfig.cpp:1596 msgid "Slic3r will not scale speed down below this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1514 +#: src/libslic3r/PrintConfig.cpp:1603 msgid "Minimal filament extrusion length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1604 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " "machines, this minimum applies to each extruder." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1613 msgid "Configuration notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1525 +#: src/libslic3r/PrintConfig.cpp:1614 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1624 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1540 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "Host Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1541 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1558 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Only retract when crossing perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1648 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1655 msgid "" "This option will drop the temperature of the inactive extruders to prevent " "oozing. It will enable a tall skirt automatically and move extruders outside " "such skirt when changing temperatures." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1573 +#: src/libslic3r/PrintConfig.cpp:1662 msgid "Output filename format" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1574 +#: src/libslic3r/PrintConfig.cpp:1663 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -9853,31 +9969,31 @@ msgid "" "[input_filename], [input_filename_base]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1583 +#: src/libslic3r/PrintConfig.cpp:1672 msgid "Detect bridging perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1585 +#: src/libslic3r/PrintConfig.cpp:1674 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1680 msgid "Filament parking position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1681 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1689 msgid "Extra loading distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1601 +#: src/libslic3r/PrintConfig.cpp:1690 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -9885,27 +10001,27 @@ msgid "" "than unloading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1626 -#: src/libslic3r/PrintConfig.cpp:1639 src/libslic3r/PrintConfig.cpp:1649 +#: src/libslic3r/PrintConfig.cpp:1698 src/libslic3r/PrintConfig.cpp:1715 +#: src/libslic3r/PrintConfig.cpp:1728 src/libslic3r/PrintConfig.cpp:1738 msgid "Perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1617 +#: src/libslic3r/PrintConfig.cpp:1706 msgid "Perimeter extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/libslic3r/PrintConfig.cpp:1708 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1628 +#: src/libslic3r/PrintConfig.cpp:1717 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -9914,12 +10030,12 @@ msgid "" "it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1641 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1651 +#: src/libslic3r/PrintConfig.cpp:1740 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 " @@ -9927,11 +10043,11 @@ msgid "" "Perimeters option is enabled." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1655 +#: src/libslic3r/PrintConfig.cpp:1744 msgid "(minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1752 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -9940,55 +10056,55 @@ msgid "" "environment variables." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1675 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Printer type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1676 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Type of the printer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1681 +#: src/libslic3r/PrintConfig.cpp:1770 msgid "Printer notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1682 +#: src/libslic3r/PrintConfig.cpp:1771 msgid "You can put your notes regarding the printer here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1690 +#: src/libslic3r/PrintConfig.cpp:1779 msgid "Printer vendor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1691 +#: src/libslic3r/PrintConfig.cpp:1780 msgid "Name of the printer vendor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1696 +#: src/libslic3r/PrintConfig.cpp:1785 msgid "Printer variant" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1697 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1714 +#: src/libslic3r/PrintConfig.cpp:1803 msgid "Raft layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1716 +#: src/libslic3r/PrintConfig.cpp:1805 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1724 +#: src/libslic3r/PrintConfig.cpp:1813 msgid "Resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1725 +#: src/libslic3r/PrintConfig.cpp:1814 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -9996,277 +10112,277 @@ msgid "" "simplification and use full resolution from input." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1735 +#: src/libslic3r/PrintConfig.cpp:1824 msgid "Minimum travel after retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1736 +#: src/libslic3r/PrintConfig.cpp:1825 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1742 +#: src/libslic3r/PrintConfig.cpp:1831 msgid "Retract amount before wipe" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1743 +#: src/libslic3r/PrintConfig.cpp:1832 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1839 msgid "Retract on layer change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1840 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1764 +#: src/libslic3r/PrintConfig.cpp:1845 src/libslic3r/PrintConfig.cpp:1853 msgid "Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1757 +#: src/libslic3r/PrintConfig.cpp:1846 msgid "Retraction Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1758 +#: src/libslic3r/PrintConfig.cpp:1847 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " "extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1769 +#: src/libslic3r/PrintConfig.cpp:1849 src/libslic3r/PrintConfig.cpp:1858 msgid "mm (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1765 +#: src/libslic3r/PrintConfig.cpp:1854 msgid "Retraction Length (Toolchange)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1766 +#: src/libslic3r/PrintConfig.cpp:1855 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " "enters the extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1863 msgid "Lift Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1775 +#: src/libslic3r/PrintConfig.cpp:1864 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " "the first extruder will be considered." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1871 msgid "Above Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/libslic3r/PrintConfig.cpp:1872 msgid "Only lift Z above" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1873 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1791 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "Below Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1881 msgid "Only lift Z below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1793 +#: src/libslic3r/PrintConfig.cpp:1882 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1809 +#: src/libslic3r/PrintConfig.cpp:1890 src/libslic3r/PrintConfig.cpp:1898 msgid "Extra length on restart" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1802 +#: src/libslic3r/PrintConfig.cpp:1891 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1899 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1817 src/libslic3r/PrintConfig.cpp:1818 +#: src/libslic3r/PrintConfig.cpp:1906 src/libslic3r/PrintConfig.cpp:1907 msgid "Retraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1819 +#: src/libslic3r/PrintConfig.cpp:1908 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1825 src/libslic3r/PrintConfig.cpp:1826 +#: src/libslic3r/PrintConfig.cpp:1914 src/libslic3r/PrintConfig.cpp:1915 msgid "Deretraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1827 +#: src/libslic3r/PrintConfig.cpp:1916 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " "used." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1834 +#: src/libslic3r/PrintConfig.cpp:1923 msgid "Seam position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1836 +#: src/libslic3r/PrintConfig.cpp:1925 msgid "Position of perimeters starting points." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1931 msgid "Random" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1932 msgid "Nearest" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1844 +#: src/libslic3r/PrintConfig.cpp:1933 msgid "Aligned" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1852 +#: src/libslic3r/PrintConfig.cpp:1941 msgid "Direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1854 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Preferred direction of the seam" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "Seam preferred direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1862 +#: src/libslic3r/PrintConfig.cpp:1951 msgid "Jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1953 msgid "Seam preferred direction jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1865 +#: src/libslic3r/PrintConfig.cpp:1954 msgid "Preferred direction of the seam - jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Distance from object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Distance between skirt and object(s). Set this to zero to attach the skirt " "to the object(s) and get a brim for better adhesion." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "Skirt height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1970 msgid "" "Height of skirt expressed in layers. Set this to a tall value to use skirt " "as a shield against drafts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1888 +#: src/libslic3r/PrintConfig.cpp:1977 msgid "Draft shield" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1889 +#: src/libslic3r/PrintConfig.cpp:1978 msgid "" "If enabled, the skirt will be as tall as a highest printed object. This is " "useful to protect an ABS or ASA print from warping and detaching from print " "bed due to wind draft." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1895 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Loops (minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1896 +#: src/libslic3r/PrintConfig.cpp:1985 msgid "Skirt Loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1897 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " "this to zero to disable skirt completely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1905 +#: src/libslic3r/PrintConfig.cpp:1994 msgid "Slow down if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1995 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1915 +#: src/libslic3r/PrintConfig.cpp:2004 msgid "Small perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1917 +#: src/libslic3r/PrintConfig.cpp:2006 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " "be calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1927 +#: src/libslic3r/PrintConfig.cpp:2016 msgid "Solid infill threshold area" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "mm²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1936 +#: src/libslic3r/PrintConfig.cpp:2025 msgid "Solid infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:2027 msgid "The extruder to use when printing solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:2033 msgid "Solid infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1946 +#: src/libslic3r/PrintConfig.cpp:2035 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -10274,7 +10390,7 @@ msgid "" "according to nozzle diameter and layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1958 +#: src/libslic3r/PrintConfig.cpp:2047 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -10282,26 +10398,26 @@ msgid "" "(for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1969 +#: src/libslic3r/PrintConfig.cpp:2058 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " "infill speed above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2070 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1987 src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:2076 src/libslic3r/PrintConfig.cpp:2077 msgid "Minimum thickness of a top / bottom shell" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:2083 msgid "Spiral vase" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1995 +#: src/libslic3r/PrintConfig.cpp:2084 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -10310,18 +10426,18 @@ msgid "" "when printing more than one single object." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2003 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "Temperature variation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2004 +#: src/libslic3r/PrintConfig.cpp:2093 msgid "" "Temperature difference to be applied when an extruder is not active. Enables " "a full-height \"sacrificial\" skirt on which the nozzles are periodically " "wiped." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2014 +#: src/libslic3r/PrintConfig.cpp:2103 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -10332,7 +10448,7 @@ msgid "" "put a \"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2118 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -10345,45 +10461,45 @@ msgid "" "extruders, the gcode is processed in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2045 +#: src/libslic3r/PrintConfig.cpp:2134 msgid "Color change G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2046 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "This G-code will be used as a code for the color change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "This G-code will be used as a code for the pause print" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2064 +#: src/libslic3r/PrintConfig.cpp:2153 msgid "This G-code will be used as a custom code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2072 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Single Extruder Multi Material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2073 +#: src/libslic3r/PrintConfig.cpp:2162 msgid "The printer multiplexes filaments into a single hot end." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2078 +#: src/libslic3r/PrintConfig.cpp:2167 msgid "Prime all printing extruders" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2079 +#: src/libslic3r/PrintConfig.cpp:2168 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2084 +#: src/libslic3r/PrintConfig.cpp:2173 msgid "No sparse layers (EXPERIMENTAL)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2085 +#: src/libslic3r/PrintConfig.cpp:2174 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -10391,75 +10507,75 @@ msgid "" "with the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2092 +#: src/libslic3r/PrintConfig.cpp:2181 msgid "Generate support material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "Enable support material generation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2098 +#: src/libslic3r/PrintConfig.cpp:2187 msgid "Auto generated supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2100 +#: src/libslic3r/PrintConfig.cpp:2189 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " "\"Support Enforcer\" volumes only." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2106 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "XY separation between an object and its support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2108 +#: src/libslic3r/PrintConfig.cpp:2197 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2118 +#: src/libslic3r/PrintConfig.cpp:2207 msgid "Pattern angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2120 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2130 src/libslic3r/PrintConfig.cpp:2925 +#: src/libslic3r/PrintConfig.cpp:2219 src/libslic3r/PrintConfig.cpp:3014 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "Contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2138 +#: src/libslic3r/PrintConfig.cpp:2227 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " "first object layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "0 (soluble)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2146 +#: src/libslic3r/PrintConfig.cpp:2235 msgid "0.2 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2151 +#: src/libslic3r/PrintConfig.cpp:2240 msgid "Enforce support for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -10467,21 +10583,21 @@ msgid "" "of objects having a very thin or poor footprint on the build plate." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2158 +#: src/libslic3r/PrintConfig.cpp:2247 msgid "Enforce support for the first n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2253 msgid "Support material/raft/skirt extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2166 +#: src/libslic3r/PrintConfig.cpp:2255 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2175 +#: src/libslic3r/PrintConfig.cpp:2264 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -10489,89 +10605,89 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2184 +#: src/libslic3r/PrintConfig.cpp:2273 msgid "Interface loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2275 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2191 +#: src/libslic3r/PrintConfig.cpp:2280 msgid "Support material/raft interface extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2282 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2200 +#: src/libslic3r/PrintConfig.cpp:2289 msgid "Interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2202 +#: src/libslic3r/PrintConfig.cpp:2291 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2209 +#: src/libslic3r/PrintConfig.cpp:2298 msgid "Interface pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2300 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2309 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " "speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2229 +#: src/libslic3r/PrintConfig.cpp:2318 msgid "Pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2320 msgid "Pattern used to generate support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2237 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Rectilinear grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2243 +#: src/libslic3r/PrintConfig.cpp:2332 msgid "Pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Spacing between support material lines." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2254 +#: src/libslic3r/PrintConfig.cpp:2343 msgid "Speed for printing support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2261 +#: src/libslic3r/PrintConfig.cpp:2350 msgid "Synchronize with object layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2352 msgid "" "Synchronize support layers with the object print layers. This is useful with " "multi-material printers, where the extruder switch is expensive." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2269 +#: src/libslic3r/PrintConfig.cpp:2358 msgid "Overhang threshold" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2271 +#: src/libslic3r/PrintConfig.cpp:2360 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -10580,47 +10696,47 @@ msgid "" "detection (recommended)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "With sheath around the support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2285 +#: src/libslic3r/PrintConfig.cpp:2374 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2292 +#: src/libslic3r/PrintConfig.cpp:2381 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2295 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "Nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2390 msgid "Detect thin walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2303 +#: src/libslic3r/PrintConfig.cpp:2392 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2398 msgid "Threads" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2310 +#: src/libslic3r/PrintConfig.cpp:2399 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2322 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {previous_extruder} and " @@ -10630,7 +10746,7 @@ msgid "" "behaviour both before and after the toolchange." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2335 +#: src/libslic3r/PrintConfig.cpp:2424 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -10639,7 +10755,7 @@ msgid "" "percentage (for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2347 +#: src/libslic3r/PrintConfig.cpp:2436 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -10648,54 +10764,54 @@ msgid "" "for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2362 +#: src/libslic3r/PrintConfig.cpp:2451 msgid "Number of solid layers to generate on top surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2452 msgid "Top solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2371 +#: src/libslic3r/PrintConfig.cpp:2460 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " "prevent pillowing effect when printing with variable layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "Minimum top shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2381 +#: src/libslic3r/PrintConfig.cpp:2470 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2389 +#: src/libslic3r/PrintConfig.cpp:2478 msgid "Use firmware retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2390 +#: src/libslic3r/PrintConfig.cpp:2479 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2396 +#: src/libslic3r/PrintConfig.cpp:2485 msgid "Use relative E distances" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2397 +#: src/libslic3r/PrintConfig.cpp:2486 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2403 +#: src/libslic3r/PrintConfig.cpp:2492 msgid "Use volumetric E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2404 +#: src/libslic3r/PrintConfig.cpp:2493 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -10705,127 +10821,127 @@ msgid "" "only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2414 +#: src/libslic3r/PrintConfig.cpp:2503 msgid "Enable variable layer height feature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2415 +#: src/libslic3r/PrintConfig.cpp:2504 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2421 +#: src/libslic3r/PrintConfig.cpp:2510 msgid "Wipe while retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2422 +#: src/libslic3r/PrintConfig.cpp:2511 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2429 +#: src/libslic3r/PrintConfig.cpp:2518 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2435 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "Purging volumes - load/unload volumes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2436 +#: src/libslic3r/PrintConfig.cpp:2525 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " "volumes below." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2442 +#: src/libslic3r/PrintConfig.cpp:2531 msgid "Purging volumes - matrix" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2443 +#: src/libslic3r/PrintConfig.cpp:2532 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 "" -#: src/libslic3r/PrintConfig.cpp:2452 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Position X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2453 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "X coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2459 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "Position Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2460 +#: src/libslic3r/PrintConfig.cpp:2549 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2467 +#: src/libslic3r/PrintConfig.cpp:2556 msgid "Width of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2473 +#: src/libslic3r/PrintConfig.cpp:2562 msgid "Wipe tower rotation angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2474 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2481 +#: src/libslic3r/PrintConfig.cpp:2570 msgid "Wipe into this object's infill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2571 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." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2489 +#: src/libslic3r/PrintConfig.cpp:2578 msgid "Wipe into this object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2490 +#: src/libslic3r/PrintConfig.cpp:2579 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " "Colours of the objects will be mixed as a result." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2496 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Maximal bridging distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2497 +#: src/libslic3r/PrintConfig.cpp:2586 msgid "Maximal distance between supports on sparse infill sections." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2503 +#: src/libslic3r/PrintConfig.cpp:2592 msgid "XY Size Compensation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2505 +#: src/libslic3r/PrintConfig.cpp:2594 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" "tuning hole sizes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2513 +#: src/libslic3r/PrintConfig.cpp:2602 msgid "Z offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2514 +#: src/libslic3r/PrintConfig.cpp:2603 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -10833,414 +10949,414 @@ msgid "" "print bed, set this to -0.3 (or fix your endstop)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2581 +#: src/libslic3r/PrintConfig.cpp:2670 msgid "Display width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2671 msgid "Width of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2587 +#: src/libslic3r/PrintConfig.cpp:2676 msgid "Display height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2588 +#: src/libslic3r/PrintConfig.cpp:2677 msgid "Height of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2593 +#: src/libslic3r/PrintConfig.cpp:2682 msgid "Number of pixels in" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2595 +#: src/libslic3r/PrintConfig.cpp:2684 msgid "Number of pixels in X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2601 +#: src/libslic3r/PrintConfig.cpp:2690 msgid "Number of pixels in Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2606 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "Display horizontal mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2607 +#: src/libslic3r/PrintConfig.cpp:2696 msgid "Mirror horizontally" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2697 msgid "Enable horizontal mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "Display vertical mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2614 +#: src/libslic3r/PrintConfig.cpp:2703 msgid "Mirror vertically" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2615 +#: src/libslic3r/PrintConfig.cpp:2704 msgid "Enable vertical mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Display orientation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2621 +#: src/libslic3r/PrintConfig.cpp:2710 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " "images will be rotated by 90 degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2627 +#: src/libslic3r/PrintConfig.cpp:2716 msgid "Landscape" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2717 msgid "Portrait" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2722 msgid "Fast" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2634 +#: src/libslic3r/PrintConfig.cpp:2723 msgid "Fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Time of the fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2642 +#: src/libslic3r/PrintConfig.cpp:2731 msgid "Slow" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2643 +#: src/libslic3r/PrintConfig.cpp:2732 msgid "Slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2644 +#: src/libslic3r/PrintConfig.cpp:2733 msgid "Time of the slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2651 +#: src/libslic3r/PrintConfig.cpp:2740 msgid "Area fill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2652 +#: src/libslic3r/PrintConfig.cpp:2741 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 "" -#: src/libslic3r/PrintConfig.cpp:2659 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2661 +#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2750 msgid "Printer scaling correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2667 src/libslic3r/PrintConfig.cpp:2668 +#: src/libslic3r/PrintConfig.cpp:2756 src/libslic3r/PrintConfig.cpp:2757 msgid "Printer absolute correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2758 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/libslic3r/PrintConfig.cpp:2764 msgid "Elephant foot minimum width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2677 +#: src/libslic3r/PrintConfig.cpp:2766 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685 +#: src/libslic3r/PrintConfig.cpp:2773 src/libslic3r/PrintConfig.cpp:2774 msgid "Printer gamma correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2775 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." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2698 src/libslic3r/PrintConfig.cpp:2699 +#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2788 msgid "SLA material type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2799 src/libslic3r/PrintConfig.cpp:2800 msgid "Initial layer height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2718 +#: src/libslic3r/PrintConfig.cpp:2806 src/libslic3r/PrintConfig.cpp:2807 msgid "Bottle volume" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2808 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2724 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2813 src/libslic3r/PrintConfig.cpp:2814 msgid "Bottle weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2726 +#: src/libslic3r/PrintConfig.cpp:2815 msgid "kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2733 +#: src/libslic3r/PrintConfig.cpp:2822 msgid "g/ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2740 +#: src/libslic3r/PrintConfig.cpp:2829 msgid "money/bottle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2745 +#: src/libslic3r/PrintConfig.cpp:2834 msgid "Faded layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2835 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2753 src/libslic3r/PrintConfig.cpp:2754 +#: src/libslic3r/PrintConfig.cpp:2842 src/libslic3r/PrintConfig.cpp:2843 msgid "Minimum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2761 src/libslic3r/PrintConfig.cpp:2762 +#: src/libslic3r/PrintConfig.cpp:2850 src/libslic3r/PrintConfig.cpp:2851 msgid "Maximum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2769 src/libslic3r/PrintConfig.cpp:2770 +#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2859 msgid "Exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2865 src/libslic3r/PrintConfig.cpp:2866 msgid "Minimum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2784 src/libslic3r/PrintConfig.cpp:2785 +#: src/libslic3r/PrintConfig.cpp:2873 src/libslic3r/PrintConfig.cpp:2874 msgid "Maximum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2792 src/libslic3r/PrintConfig.cpp:2793 +#: src/libslic3r/PrintConfig.cpp:2881 src/libslic3r/PrintConfig.cpp:2882 msgid "Initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2799 src/libslic3r/PrintConfig.cpp:2800 +#: src/libslic3r/PrintConfig.cpp:2888 src/libslic3r/PrintConfig.cpp:2889 msgid "Correction for expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2806 +#: src/libslic3r/PrintConfig.cpp:2895 msgid "SLA print material notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2807 +#: src/libslic3r/PrintConfig.cpp:2896 msgid "You can put your notes regarding the SLA print material here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2819 src/libslic3r/PrintConfig.cpp:2830 +#: src/libslic3r/PrintConfig.cpp:2908 src/libslic3r/PrintConfig.cpp:2919 msgid "Default SLA material profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2841 +#: src/libslic3r/PrintConfig.cpp:2930 msgid "Generate supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2932 msgid "Generate supports for the models" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2848 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Pinhead front diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2850 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "Diameter of the pointing side of the head" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2946 msgid "Head penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2948 msgid "How much the pinhead has to penetrate the model surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2955 msgid "Pinhead width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2868 +#: src/libslic3r/PrintConfig.cpp:2957 msgid "Width from the back sphere center to the front sphere center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2876 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Pillar diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2967 msgid "Diameter in mm of the support pillars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2886 +#: src/libslic3r/PrintConfig.cpp:2975 msgid "Small pillar diameter percent" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2888 +#: src/libslic3r/PrintConfig.cpp:2977 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2897 +#: src/libslic3r/PrintConfig.cpp:2986 msgid "Max bridges on a pillar" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2899 +#: src/libslic3r/PrintConfig.cpp:2988 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:2907 +#: src/libslic3r/PrintConfig.cpp:2996 msgid "Pillar connection mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2908 +#: src/libslic3r/PrintConfig.cpp:2997 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:2916 +#: src/libslic3r/PrintConfig.cpp:3005 msgid "Zig-Zag" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2917 +#: src/libslic3r/PrintConfig.cpp:3006 msgid "Cross" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2918 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Dynamic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Pillar widening factor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2932 +#: src/libslic3r/PrintConfig.cpp:3021 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:2941 +#: src/libslic3r/PrintConfig.cpp:3030 msgid "Support base diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2943 +#: src/libslic3r/PrintConfig.cpp:3032 msgid "Diameter in mm of the pillar base" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2951 +#: src/libslic3r/PrintConfig.cpp:3040 msgid "Support base height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2953 +#: src/libslic3r/PrintConfig.cpp:3042 msgid "The height of the pillar base cone" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2960 +#: src/libslic3r/PrintConfig.cpp:3049 msgid "Support base safety distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3052 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:2973 +#: src/libslic3r/PrintConfig.cpp:3062 msgid "Critical angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2975 +#: src/libslic3r/PrintConfig.cpp:3064 msgid "The default angle for connecting support sticks and junctions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2983 +#: src/libslic3r/PrintConfig.cpp:3072 msgid "Max bridge length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2985 +#: src/libslic3r/PrintConfig.cpp:3074 msgid "The max length of a bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2992 +#: src/libslic3r/PrintConfig.cpp:3081 msgid "Max pillar linking distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/libslic3r/PrintConfig.cpp:3083 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:3004 +#: src/libslic3r/PrintConfig.cpp:3093 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:3015 +#: src/libslic3r/PrintConfig.cpp:3104 msgid "This is a relative measure of support points density." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3021 +#: src/libslic3r/PrintConfig.cpp:3110 msgid "Minimal distance of the support points" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3023 +#: src/libslic3r/PrintConfig.cpp:3112 msgid "No support points will be placed closer than this threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3029 +#: src/libslic3r/PrintConfig.cpp:3118 msgid "Use pad" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3031 +#: src/libslic3r/PrintConfig.cpp:3120 msgid "Add a pad underneath the supported model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3036 +#: src/libslic3r/PrintConfig.cpp:3125 msgid "Pad wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3038 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "The thickness of the pad and its optional cavity walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3046 +#: src/libslic3r/PrintConfig.cpp:3135 msgid "Pad wall height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3136 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 " @@ -11248,111 +11364,111 @@ msgid "" "difficult." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3060 +#: src/libslic3r/PrintConfig.cpp:3149 msgid "Pad brim size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3061 +#: src/libslic3r/PrintConfig.cpp:3150 msgid "How far should the pad extend around the contained geometry" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3160 msgid "Max merge distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3162 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:3093 +#: src/libslic3r/PrintConfig.cpp:3182 msgid "Pad wall slope" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3095 +#: src/libslic3r/PrintConfig.cpp:3184 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3195 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3111 +#: src/libslic3r/PrintConfig.cpp:3200 msgid "Pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3113 +#: src/libslic3r/PrintConfig.cpp:3202 msgid "Force pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3118 +#: src/libslic3r/PrintConfig.cpp:3207 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3209 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3129 +#: src/libslic3r/PrintConfig.cpp:3218 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3131 +#: src/libslic3r/PrintConfig.cpp:3220 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3138 +#: src/libslic3r/PrintConfig.cpp:3227 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3229 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3147 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3150 +#: src/libslic3r/PrintConfig.cpp:3239 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3157 +#: src/libslic3r/PrintConfig.cpp:3246 msgid "Enable hollowing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3159 +#: src/libslic3r/PrintConfig.cpp:3248 msgid "Hollow out a model to have an empty interior" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3164 +#: src/libslic3r/PrintConfig.cpp:3253 msgid "Wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3255 msgid "Minimum wall thickness of a hollowed model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Accuracy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3176 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3186 +#: src/libslic3r/PrintConfig.cpp:3275 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 " @@ -11361,270 +11477,270 @@ msgid "" "most." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3683 msgid "Export OBJ" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "Export the model(s) as OBJ." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3695 msgid "Export SLA" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3615 +#: src/libslic3r/PrintConfig.cpp:3696 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3620 +#: src/libslic3r/PrintConfig.cpp:3701 msgid "Export 3MF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3702 msgid "Export the model(s) as 3MF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3706 msgid "Export AMF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3626 +#: src/libslic3r/PrintConfig.cpp:3707 msgid "Export the model(s) as AMF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3630 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Export STL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3631 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Export the model(s) as STL." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3636 +#: src/libslic3r/PrintConfig.cpp:3717 msgid "Slice the model and export toolpaths as G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3641 +#: src/libslic3r/PrintConfig.cpp:3722 msgid "G-code viewer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Visualize an already sliced and saved G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "Slice" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3648 +#: src/libslic3r/PrintConfig.cpp:3729 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3653 +#: src/libslic3r/PrintConfig.cpp:3734 msgid "Help" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3654 +#: src/libslic3r/PrintConfig.cpp:3735 msgid "Show this help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3659 +#: src/libslic3r/PrintConfig.cpp:3740 msgid "Help (FFF options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3741 msgid "Show the full list of print/G-code configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3745 msgid "Help (SLA options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3665 +#: src/libslic3r/PrintConfig.cpp:3746 msgid "Show the full list of SLA print configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3669 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Output Model Info" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "Write information about the model to the console." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3674 +#: src/libslic3r/PrintConfig.cpp:3755 msgid "Save config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3675 +#: src/libslic3r/PrintConfig.cpp:3756 msgid "Save configuration to the specified file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3685 +#: src/libslic3r/PrintConfig.cpp:3766 msgid "Align XY" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3686 +#: src/libslic3r/PrintConfig.cpp:3767 msgid "Align the model to the given point." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3691 +#: src/libslic3r/PrintConfig.cpp:3772 msgid "Cut model at the given Z." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3712 +#: src/libslic3r/PrintConfig.cpp:3793 msgid "Center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3713 +#: src/libslic3r/PrintConfig.cpp:3794 msgid "Center the print around the given center." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3717 +#: src/libslic3r/PrintConfig.cpp:3798 msgid "Don't arrange" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3718 +#: src/libslic3r/PrintConfig.cpp:3799 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3721 +#: src/libslic3r/PrintConfig.cpp:3802 msgid "Duplicate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3722 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Multiply copies by this factor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3726 +#: src/libslic3r/PrintConfig.cpp:3807 msgid "Duplicate by grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3727 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Multiply copies by creating a grid." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3731 +#: src/libslic3r/PrintConfig.cpp:3812 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:3736 +#: src/libslic3r/PrintConfig.cpp:3817 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:3740 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "Rotation angle around the Z axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/libslic3r/PrintConfig.cpp:3825 msgid "Rotate around X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3826 msgid "Rotation angle around the X axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3749 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "Rotate around Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3750 +#: src/libslic3r/PrintConfig.cpp:3831 msgid "Rotation angle around the Y axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3836 msgid "Scaling factor or percentage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3841 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3844 msgid "Scale to Fit" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3845 msgid "Scale to fit the given volume." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3773 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Ignore non-existent config files" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3774 +#: src/libslic3r/PrintConfig.cpp:3855 msgid "Do not fail if a file supplied to --load does not exist." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3858 msgid "Load config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3859 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:3781 +#: src/libslic3r/PrintConfig.cpp:3862 msgid "Output File" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3863 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:3786 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Single instance mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3787 +#: src/libslic3r/PrintConfig.cpp:3868 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " "the \"single_instance\" configuration value from application preferences." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3798 +#: src/libslic3r/PrintConfig.cpp:3879 msgid "Data directory" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3799 +#: src/libslic3r/PrintConfig.cpp:3880 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:3802 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Logging level" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3803 +#: src/libslic3r/PrintConfig.cpp:3884 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:3809 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Render with a software renderer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3891 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 20f3991c9f2..7aaacc4c740 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1081,7 +1081,7 @@ void PrintConfigDef::init_fff_params() def = this->add("fuzzy_skin_thickness", coFloat); def->label = L("Fuzzy skin thickness"); def->category = L("Fuzzy Skin"); - def->tooltip = L(""); + def->tooltip = ""; def->sidetext = L("mm"); def->min = 0; def->mode = comAdvanced; @@ -1090,7 +1090,7 @@ void PrintConfigDef::init_fff_params() def = this->add("fuzzy_skin_point_dist", coFloat); def->label = L("Fuzzy skin point distance"); def->category = L("Fuzzy Skin"); - def->tooltip = L(""); + def->tooltip = ""; def->sidetext = L("mm"); def->min = 0; def->mode = comAdvanced; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 12fba187e7f..c672e0609a3 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -1813,7 +1813,8 @@ bool GUI_App::check_unsaved_changes(const wxString &header) // synchronize config.ini with the current selections. preset_bundle->export_selections(*app_config); - wxMessageBox(_L("The preset(s) modifications are successfully saved")); + wxMessageBox(_L_PLURAL("The preset modifications are successfully saved", + "The presets modifications are successfully saved", dlg.get_names_and_types().size())); } } diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index cf21782808a..14aebcb3a19 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -413,27 +413,27 @@ wxString ObjectList::get_mesh_errors_list(const int obj_idx, const int vol_idx / return ""; // hide tooltip // Create tooltip string, if there are errors - wxString tooltip = wxString::Format(_(L("Auto-repaired (%d errors):")), errors) + "\n"; + wxString tooltip = format_wxstr(_L_PLURAL("Auto-repaired %1$d error", "Auto-repaired %1$d errors", errors), errors) + ":\n"; const stl_stats& stats = vol_idx == -1 ? (*m_objects)[obj_idx]->get_object_stl_stats() : (*m_objects)[obj_idx]->volumes[vol_idx]->mesh().stl.stats; - std::map error_msg = { - { L("degenerate facets"), stats.degenerate_facets }, - { L("edges fixed"), stats.edges_fixed }, - { L("facets removed"), stats.facets_removed }, - { L("facets added"), stats.facets_added }, - { L("facets reversed"), stats.facets_reversed }, - { L("backwards edges"), stats.backwards_edges } - }; - - for (const auto& error : error_msg) - if (error.second > 0) - tooltip += from_u8((boost::format("\t%1% %2%\n") % error.second % _utf8(error.first)).str()); + if (stats.degenerate_facets > 0) + tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d degenerate facet", "%1$d degenerate facets", stats.degenerate_facets), stats.degenerate_facets) + "\n"; + if (stats.edges_fixed > 0) + tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d edge fixed", "%1$d edges fixed", stats.edges_fixed), stats.edges_fixed) + "\n"; + if (stats.facets_removed > 0) + tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d facet removed", "%1$d facets removed", stats.facets_removed), stats.facets_removed) + "\n"; + if (stats.facets_added > 0) + tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d facet added", "%1$d facets added", stats.facets_added), stats.facets_added) + "\n"; + if (stats.facets_reversed > 0) + tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d facet reversed", "%1$d facets reversed", stats.facets_reversed), stats.facets_reversed) + "\n"; + if (stats.backwards_edges > 0) + tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d backwards edge", "%1$d backwards edges", stats.backwards_edges), stats.backwards_edges) + "\n"; if (is_windows10()) - tooltip += _(L("Right button click the icon to fix STL through Netfabb")); + tooltip += _L("Right button click the icon to fix STL through Netfabb"); return tooltip; } diff --git a/src/slic3r/GUI/PhysicalPrinterDialog.cpp b/src/slic3r/GUI/PhysicalPrinterDialog.cpp index 620a3ddcade..b80d8514ff7 100644 --- a/src/slic3r/GUI/PhysicalPrinterDialog.cpp +++ b/src/slic3r/GUI/PhysicalPrinterDialog.cpp @@ -572,12 +572,17 @@ void PhysicalPrinterDialog::OnOK(wxEvent& event) if (!repeat_presets.empty()) { wxString repeatable_presets = "\n"; - for (const std::string& preset_name : repeat_presets) + int repeat_cnt = 0; + for (const std::string& preset_name : repeat_presets) { repeatable_presets += " " + from_u8(preset_name) + "\n"; + repeat_cnt++; + } repeatable_presets += "\n"; - wxString msg_text = from_u8((boost::format(_u8L("Following printer preset(s) is duplicated:%1%" - "The above preset for printer \"%2%\" will be used just once.")) % repeatable_presets % printer_name).str()); + wxString msg_text = format_wxstr(_L_PLURAL("Following printer preset is duplicated:%1%" + "The above preset for printer \"%2%\" will be used just once.", + "Following printer presets are duplicated:%1%" + "The above presets for printer \"%2%\" will be used just once.", repeat_cnt), repeatable_presets, printer_name); wxMessageDialog dialog(nullptr, msg_text, _L("Warning"), wxICON_WARNING | wxOK | wxCANCEL); if (dialog.ShowModal() == wxID_CANCEL) return; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 398502b53c4..60e6e2c124e 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1065,18 +1065,29 @@ void Sidebar::show_info_sizer() const auto& stats = model_object->get_object_stl_stats();//model_object->volumes.front()->mesh.stl.stats; p->object_info->info_volume->SetLabel(wxString::Format("%.2f", stats.volume*pow(koef,3))); - p->object_info->info_facets->SetLabel(wxString::Format(_L("%d (%d shells)"), static_cast(model_object->facets_count()), stats.number_of_parts)); + p->object_info->info_facets->SetLabel(format_wxstr(_L_PLURAL("%1% (%2$d shell)", "%1% (%2$d shells)", stats.number_of_parts), + static_cast(model_object->facets_count()), stats.number_of_parts)); int errors = stats.degenerate_facets + stats.edges_fixed + stats.facets_removed + stats.facets_added + stats.facets_reversed + stats.backwards_edges; if (errors > 0) { - wxString tooltip = wxString::Format(_L("Auto-repaired (%d errors)"), errors); + wxString tooltip = format_wxstr(_L_PLURAL("Auto-repaired %1$d error", "Auto-repaired %1$d errors", errors), errors); p->object_info->info_manifold->SetLabel(tooltip); - tooltip += ":\n" + wxString::Format(_L("%d degenerate facets, %d edges fixed, %d facets removed, " - "%d facets added, %d facets reversed, %d backwards edges"), - stats.degenerate_facets, stats.edges_fixed, stats.facets_removed, - stats.facets_added, stats.facets_reversed, stats.backwards_edges); + tooltip += ":\n"; + if (stats.degenerate_facets > 0) + tooltip += format_wxstr(_L_PLURAL("%1$d degenerate facet", "%1$d degenerate facets", stats.degenerate_facets), stats.degenerate_facets) + ", "; + if (stats.edges_fixed > 0) + tooltip += format_wxstr(_L_PLURAL("%1$d edge fixed", "%1$d edges fixed", stats.edges_fixed), stats.edges_fixed) + ", "; + if (stats.facets_removed > 0) + tooltip += format_wxstr(_L_PLURAL("%1$d facet removed", "%1$d facets removed", stats.facets_removed), stats.facets_removed) + ", "; + if (stats.facets_added > 0) + tooltip += format_wxstr(_L_PLURAL("%1$d facet added", "%1$d facets added", stats.facets_added), stats.facets_added) + ", "; + if (stats.facets_reversed > 0) + tooltip += format_wxstr(_L_PLURAL("%1$d facet reversed", "%1$d facets reversed", stats.facets_reversed), stats.facets_reversed) + ", "; + if (stats.backwards_edges > 0) + tooltip += format_wxstr(_L_PLURAL("%1$d backwards edge", "%1$d backwards edges", stats.backwards_edges), stats.backwards_edges) + ", "; + tooltip.RemoveLast(2);//remove last coma p->object_info->showing_manifold_warning_icon = true; p->object_info->info_manifold->SetToolTip(tooltip); @@ -1107,7 +1118,7 @@ void Sidebar::update_sliced_info_sizer() wxString new_label = _L("Used Material (ml)") + ":"; const bool is_supports = ps.support_used_material > 0.0; if (is_supports) - new_label += format_wxstr("\n - %s\n - %s", _L("object(s)"), _L("supports and pad")); + new_label += format_wxstr("\n - %s\n - %s", _L_PLURAL("object", "objects", p->plater->model().objects.size()), _L("supports and pad")); wxString info_text = is_supports ? wxString::Format("%.2f \n%.2f \n%.2f", (ps.objects_used_material + ps.support_used_material) / 1000, @@ -2412,9 +2423,11 @@ std::vector Plater::priv::load_files(const std::vector& input_ // Convert even if the object is big. convert_from_imperial_units(model, false); else if (model.looks_like_imperial_units()) { - wxMessageDialog msg_dlg(q, format_wxstr(_L( - "Some object(s) in file %s looks like saved in inches.\n" - "Should I consider them as a saved in inches and convert them?"), from_path(filename)) + "\n", + wxMessageDialog msg_dlg(q, format_wxstr(_L_PLURAL( + "The object in file %s looks like saved in inches.\n" + "Should I consider it as a saved in inches and convert it?", + "Some objects in file %s look like saved in inches.\n" + "Should I consider them as a saved in inches and convert them?", model.objects.size()), from_path(filename)) + "\n", _L("The object appears to be saved in inches"), wxICON_WARNING | wxYES | wxNO); if (msg_dlg.ShowModal() == wxID_YES) //FIXME up-scale only the small parts? diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 843ec565218..4243595a09d 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3476,19 +3476,23 @@ void Tab::delete_preset() std::vector ph_printers_only = physical_printers.get_printers_with_only_preset(current_preset.name); if (!ph_printers.empty()) { - msg += _L("The physical printer(s) below is based on the preset, you are going to delete."); + msg += _L_PLURAL("The physical printer below is based on the preset, you are going to delete.", + "The physical printers below are based on the preset, you are going to delete.", ph_printers.size()); for (const std::string& printer : ph_printers) msg += "\n \"" + from_u8(printer) + "\","; msg.RemoveLast(); - msg += "\n" + _L("Note, that selected preset will be deleted from this/those printer(s) too.")+ "\n\n"; + msg += "\n" + _L_PLURAL("Note, that selected preset will be deleted from this printer too.", + "Note, that selected preset will be deleted from these printers too.", ph_printers.size()) + "\n\n"; } if (!ph_printers_only.empty()) { - msg += _L("The physical printer(s) below is based only on the preset, you are going to delete."); + msg += _L_PLURAL("The physical printer below is based only on the preset, you are going to delete.", + "The physical printers below are based only on the preset, you are going to delete.", ph_printers_only.size()); for (const std::string& printer : ph_printers_only) msg += "\n \"" + from_u8(printer) + "\","; msg.RemoveLast(); - msg += "\n" + _L("Note, that this/those printer(s) will be deleted after deleting of the selected preset.") + "\n\n"; + msg += "\n" + _L_PLURAL("Note, that this printer will be deleted after deleting of the selected preset.", + "Note, that these printers will be deleted after deleting of the selected preset.", ph_printers_only.size()) + "\n\n"; } } From 4cdcfe600598b5cb725fa346be6b7aa9e8bd7906 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Thu, 4 Feb 2021 09:42:32 +0100 Subject: [PATCH 112/143] DiffPresetDialog, non modal to compare two presets. Added menu item "Window->Compare presets" to compare more than one type of presets. Code refactoring for PresetComboBox: Use suffix "modified" just for PlaterPresetComboBox and TabPresetComboBox Code refactoring. wxDataViewCtrl and related functions extracted from DiffPresetDialog and UnsavedChangesDialog to the separate class DiffViewCtrl Code refactoring, Tab.cpp: Build all unregular pages on a first build of the Printer Settings Squashed commit of the following: commit 91f45a8a2d97d252337c7306dd02db607fd79c00 Author: Vojtech Bubnik Date: Thu Feb 4 09:34:29 2021 +0100 Fixed after merge commit 09aa502498b08c059ecdf334f5db1567739b4520 Merge: 6df8e83e1 0baa92fab Author: Vojtech Bubnik Date: Thu Feb 4 09:31:43 2021 +0100 Merge remote-tracking branch 'remotes/origin/master' into ys_diff_dlg commit 6df8e83e1af3ba096ac39d25985b6deb2e0a245b Author: Vojtech Bubnik Date: Thu Feb 4 09:29:53 2021 +0100 Tiny beautification. commit e781ceaaf7c39bc073476409cc02918d9f182930 Author: Vojtech Bubnik Date: Wed Feb 3 18:05:19 2021 +0100 Reworked copying of PresetBundles: 1) Simplified by using the default copy constructors and copy operators. 2) Made safer by not allowing PresetCollection and PhysicalPrinterPresetCollection to be copied or instantiated outside of PresetBundle. 3) Fixed Preset::vendor pointers after copying PresetBundle. commit a8f0b7aa5156465cdb3e3dbb86feb66a64bcebc0 Author: YuSanka Date: Mon Jan 25 16:13:53 2021 +0100 DiffPresetsDialog: Show compatibility to print/printer presets selected in DiffPresetDialog commit 597451f930a4330376966d8cf3350056d4f85a73 Merge: cce5b5710 59017a7da Author: YuSanka Date: Thu Jan 21 12:14:48 2021 +0100 Merge remote-tracking branch 'origin/master' into ys_diff_dlg commit cce5b5710d1225c7eaa52d0abb4b3f66fbd3b6a1 Author: YuSanka Date: Thu Jan 21 12:11:40 2021 +0100 DiffPresetDialog: Fixed crash on ASAN build commit ad8d728d89d7a75c2ac136ea8cdbb730ab774cd9 Author: YuSanka Date: Wed Jan 20 16:38:28 2021 +0100 FullCompareDialog improvements commit 316bafbeec9bb63f731b653d296062d9e22dd02f Author: YuSanka Date: Wed Jan 20 09:25:46 2021 +0100 DiffPresetDialog improvements: * Update presets lists after save changes in edited preset or change printer_technology * Tab.cpp: Build all unregular pages on a first build of the Printer Settings commit 01171c8ef50389d0801b0ccc5746ab0c3b731b11 Author: YuSanka Date: Tue Jan 19 17:26:28 2021 +0100 DiffPresetDialog : improvements * This dialog is non-modal now * "Compare presets" menu item is moved from "View" to the "Window" menu group * Added info tooltips for the bitmap buttons between presets * Added "Show all presets" checkbox * Show full difference between printer presets with different count of extruders commit 3d38b62f3c9de8aab352ed3bcff297d5c0239b2e Merge: e50fe6de9 9a2310ae9 Author: YuSanka Date: Mon Jan 18 10:00:18 2021 +0100 Merge remote-tracking branch 'origin/master' into ys_diff_dlg commit e50fe6de984decadfef3d4b952f0eec8ab9e6670 Author: YuSanka Date: Sat Jan 16 02:27:24 2021 +0100 DiffPresetDialog improvements Added menu item "View->Compare presets" to compare more than one type of presets commit bf08b7c8c969ad0ca631b9eeac1bc231f474e72b Author: YuSanka Date: Sat Jan 16 00:28:39 2021 +0100 Code refactoring. wxDataViewCtrl and related functions extracted from DiffPresetDialog and UnsavedChangesDialog to the separate class DiffViewCtrl commit 7aeb63032b0bc2bd06e60990c060008660a5c44f Author: YuSanka Date: Fri Jan 15 21:35:43 2021 +0100 DiffPresetDialog: first implementation commit 2f23d5af9d6b5dd670dfb7d06eedbe0e6d2960c6 Author: YuSanka Date: Thu Jan 14 16:28:43 2021 +0100 Code refactoring for PresetComboBox. Use suffix "modified" just for PlaterPresetComboBox and TabPresetComboBox --- resources/icons/compare.svg | 30 + resources/icons/equal.svg | 15 + resources/icons/not_equal.svg | 16 + src/libslic3r/Preset.cpp | 16 +- src/libslic3r/Preset.hpp | 40 +- src/libslic3r/PresetBundle.cpp | 27 +- src/libslic3r/PresetBundle.hpp | 3 +- src/slic3r/GUI/MainFrame.cpp | 5 + src/slic3r/GUI/MainFrame.hpp | 2 + src/slic3r/GUI/PresetComboBoxes.cpp | 77 +- src/slic3r/GUI/PresetComboBoxes.hpp | 10 +- src/slic3r/GUI/Search.cpp | 47 ++ src/slic3r/GUI/Search.hpp | 1 + src/slic3r/GUI/Tab.cpp | 82 ++- src/slic3r/GUI/Tab.hpp | 4 +- src/slic3r/GUI/UnsavedChangesDialog.cpp | 932 +++++++++++++++++++----- src/slic3r/GUI/UnsavedChangesDialog.hpp | 156 ++-- 17 files changed, 1149 insertions(+), 314 deletions(-) create mode 100644 resources/icons/compare.svg create mode 100644 resources/icons/equal.svg create mode 100644 resources/icons/not_equal.svg diff --git a/resources/icons/compare.svg b/resources/icons/compare.svg new file mode 100644 index 00000000000..fcb458f7c46 --- /dev/null +++ b/resources/icons/compare.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/resources/icons/equal.svg b/resources/icons/equal.svg new file mode 100644 index 00000000000..bce4a24f7c9 --- /dev/null +++ b/resources/icons/equal.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/resources/icons/not_equal.svg b/resources/icons/not_equal.svg new file mode 100644 index 00000000000..bc881443530 --- /dev/null +++ b/resources/icons/not_equal.svg @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index f535555d00c..b7e966c9e77 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -616,10 +616,6 @@ PresetCollection::PresetCollection(Preset::Type type, const std::vector m_num_default_presets) { @@ -1278,6 +1274,18 @@ std::vector PresetCollection::merge_presets(PresetCollection &&othe return duplicates; } +void PresetCollection::update_vendor_ptrs_after_copy(const VendorMap &new_vendors) +{ + for (Preset &preset : m_presets) + if (preset.vendor != nullptr) { + assert(! preset.is_default && ! preset.is_external); + // Re-assign a pointer to the vendor structure in the new PresetBundle. + auto it = new_vendors.find(preset.vendor->id); + assert(it != new_vendors.end()); + preset.vendor = &it->second; + } +} + void PresetCollection::update_map_alias_to_profile_name() { m_map_alias_to_profile_name.clear(); diff --git a/src/libslic3r/Preset.hpp b/src/libslic3r/Preset.hpp index b6d44d58ff5..d81717f0e00 100644 --- a/src/libslic3r/Preset.hpp +++ b/src/libslic3r/Preset.hpp @@ -115,13 +115,11 @@ class Preset TYPE_COUNT, }; - Preset(Type type, const std::string &name, bool is_default = false) : type(type), is_default(is_default), name(name) {} - Type type = TYPE_INVALID; // The preset represents a "default" set of properties, // pulled from the default values of the PrintConfig (see PrintConfigDef for their definitions). - bool is_default; + bool is_default = false; // External preset points to a configuration, which has been loaded but not imported // into the Slic3r default configuration location. bool is_external = false; @@ -233,6 +231,9 @@ class Preset static std::string remove_invalid_keys(DynamicPrintConfig &config, const DynamicPrintConfig &default_config); protected: + Preset(Type type, const std::string &name, bool is_default = false) : type(type), is_default(is_default), name(name) {} + Preset() = default; + friend class PresetCollection; friend class PresetBundle; }; @@ -256,7 +257,6 @@ class PresetCollection public: // Initialize the PresetCollection with the "- default -" preset. PresetCollection(Preset::Type type, const std::vector &keys, const Slic3r::StaticPrintConfig &defaults, const std::string &default_name = "- default -"); - ~PresetCollection(); typedef std::deque::iterator Iterator; typedef std::deque::const_iterator ConstIterator; @@ -460,6 +460,15 @@ class PresetCollection size_t num_default_presets() { return m_num_default_presets; } protected: + PresetCollection() = default; + // Copy constructor and copy operators are not to be used from outside PresetBundle, + // as the Profile::vendor points to an instance of VendorProfile stored at parent PresetBundle! + PresetCollection(const PresetCollection &other) = default; + PresetCollection& operator=(const PresetCollection &other) = default; + // After copying a collection with the default operators above, call this function + // to adjust Profile::vendor pointers. + void update_vendor_ptrs_after_copy(const VendorMap &vendors); + // Select a preset, if it exists. If it does not exist, select an invalid (-1) index. // This is a temporary state, which shall be fixed immediately by the following step. bool select_preset_by_name_strict(const std::string &name); @@ -474,10 +483,6 @@ class PresetCollection void update_map_system_profile_renamed(); private: - PresetCollection(); - PresetCollection(const PresetCollection &other); - PresetCollection& operator=(const PresetCollection &other); - // Find a preset position in the sorted list of presets. // The "-- default -- " preset is always the first, so it needs // to be handled differently. @@ -507,9 +512,9 @@ class PresetCollection { return const_cast(this)->find_preset_renamed(name); } size_t update_compatible_internal(const PresetWithVendorProfile &active_printer, const PresetWithVendorProfile *active_print, PresetSelectCompatibleType unselect_if_incompatible); - +public: static std::vector dirty_options(const Preset *edited, const Preset *reference, const bool is_printer_type = false); - +private: // Type of this PresetCollection: TYPE_PRINT, TYPE_FILAMENT or TYPE_PRINTER. Preset::Type m_type; // List of presets, starting with the "- default -" preset. @@ -531,7 +536,7 @@ class PresetCollection // Path to the directory to store the config files into. std::string m_dir_path; - // to access select_preset_by_name_strict() + // to access select_preset_by_name_strict() and the default & copy constructors. friend class PresetBundle; }; @@ -542,9 +547,17 @@ class PrinterPresetCollection : public PresetCollection public: PrinterPresetCollection(Preset::Type type, const std::vector &keys, const Slic3r::StaticPrintConfig &defaults, const std::string &default_name = "- default -") : PresetCollection(type, keys, defaults, default_name) {} + const Preset& default_preset_for(const DynamicPrintConfig &config) const override; const Preset* find_by_model_id(const std::string &model_id) const; + +private: + PrinterPresetCollection() = default; + PrinterPresetCollection(const PrinterPresetCollection &other) = default; + PrinterPresetCollection& operator=(const PrinterPresetCollection &other) = default; + + friend class PresetBundle; }; namespace PresetUtils { @@ -634,7 +647,6 @@ class PhysicalPrinterCollection { public: PhysicalPrinterCollection(const std::vector& keys); - ~PhysicalPrinterCollection() {} typedef std::deque::iterator Iterator; typedef std::deque::const_iterator ConstIterator; @@ -725,7 +737,9 @@ class PhysicalPrinterCollection const DynamicPrintConfig& default_config() const { return m_default_config; } private: - PhysicalPrinterCollection& operator=(const PhysicalPrinterCollection& other); + friend class PresetBundle; + PhysicalPrinterCollection() = default; + PhysicalPrinterCollection& operator=(const PhysicalPrinterCollection& other) = default; // Find a physical printer position in the sorted list of printers. // The name of a printer should be unique and case insensitive diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index d9b1ed76ef8..bfc1e222c7a 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -105,8 +105,33 @@ PresetBundle::PresetBundle() : this->project_config.apply_only(FullPrintConfig::defaults(), s_project_options); } -PresetBundle::~PresetBundle() +PresetBundle::PresetBundle(const PresetBundle &rhs) { + *this = rhs; +} + +PresetBundle& PresetBundle::operator=(const PresetBundle &rhs) +{ + prints = rhs.prints; + sla_prints = rhs.sla_prints; + filaments = rhs.filaments; + sla_materials = rhs.sla_materials; + printers = rhs.printers; + physical_printers = rhs.physical_printers; + + filament_presets = rhs.filament_presets; + project_config = rhs.project_config; + vendors = rhs.vendors; + obsolete_presets = rhs.obsolete_presets; + + // Adjust Preset::vendor pointers to point to the copied vendors map. + prints .update_vendor_ptrs_after_copy(this->vendors); + sla_prints .update_vendor_ptrs_after_copy(this->vendors); + filaments .update_vendor_ptrs_after_copy(this->vendors); + sla_materials.update_vendor_ptrs_after_copy(this->vendors); + printers .update_vendor_ptrs_after_copy(this->vendors); + + return *this; } void PresetBundle::reset(bool delete_files) diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index 5d7cc84ba2d..f98b9653320 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -15,7 +15,8 @@ class PresetBundle { public: PresetBundle(); - ~PresetBundle(); + PresetBundle(const PresetBundle &rhs); + PresetBundle& operator=(const PresetBundle &rhs); // Remove all the presets but the "-- default --". // Optionally remove all the files referenced by the presets from the user profile directory. diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 8e6b1c5ef2c..9c30ac330c5 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -37,6 +37,7 @@ #include #include "GUI_App.hpp" +#include "UnsavedChangesDialog.hpp" #ifdef _WIN32 #include @@ -1190,6 +1191,10 @@ void MainFrame::init_menubar_as_editor() windowMenu->AppendSeparator(); append_menu_item(windowMenu, wxID_ANY, _L("Open new instance") + "\tCtrl+Shift+I", _L("Open a new PrusaSlicer instance"), [this](wxCommandEvent&) { start_new_slicer(); }, "", nullptr, [this]() {return m_plater != nullptr && wxGetApp().app_config->get("single_instance") != "1"; }, this); + + windowMenu->AppendSeparator(); + append_menu_item(windowMenu, wxID_ANY, _L("Compare presets")/* + "\tCtrl+F"*/, _L("Compare presets"), + [this](wxCommandEvent&) { diff_dialog.show();}, "compare", nullptr, []() {return true; }, this); } // View menu diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 9504376b45a..c39527409c6 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -16,6 +16,7 @@ #include "GUI_Utils.hpp" #include "Event.hpp" +#include "UnsavedChangesDialog.hpp" class wxNotebook; class wxProgressDialog; @@ -190,6 +191,7 @@ class MainFrame : public DPIFrame Plater* m_plater { nullptr }; wxNotebook* m_tabpanel { nullptr }; SettingsDialog m_settings_dialog; + DiffPresetDialog diff_dialog; wxWindow* m_plater_page{ nullptr }; wxProgressDialog* m_progress_dialog { nullptr }; PrintHostQueueDialog* m_printhost_queue_dlg; diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index 60bb9a5aeb6..38d45f1720d 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -62,12 +62,12 @@ namespace GUI { * control size calculation methods (virtual) are overridden. **/ -PresetComboBox::PresetComboBox(wxWindow* parent, Preset::Type preset_type, const wxSize& size) : +PresetComboBox::PresetComboBox(wxWindow* parent, Preset::Type preset_type, const wxSize& size, PresetBundle* preset_bundle/* = nullptr*/) : wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, size, 0, nullptr, wxCB_READONLY), m_type(preset_type), m_last_selected(wxNOT_FOUND), m_em_unit(em_unit(this)), - m_preset_bundle(wxGetApp().preset_bundle) + m_preset_bundle(preset_bundle ? preset_bundle : wxGetApp().preset_bundle) { SetFont(wxGetApp().normal_font()); #ifdef _WIN32 @@ -208,6 +208,21 @@ void PresetComboBox::update_selection() #endif } +static std::string suffix(const Preset& preset) +{ + return (preset.is_dirty ? Preset::suffix_modified() : ""); +} + +static std::string suffix(Preset* preset) +{ + return (preset->is_dirty ? Preset::suffix_modified() : ""); +} + +wxString PresetComboBox::get_preset_name(const Preset & preset) +{ + return from_u8(preset.name/* + suffix(preset)*/); +} + void PresetComboBox::update(std::string select_preset_name) { Freeze(); @@ -226,7 +241,7 @@ void PresetComboBox::update(std::string select_preset_name) for (size_t i = presets.front().is_visible ? 0 : m_collection->num_default_presets(); i < presets.size(); ++i) { const Preset& preset = presets[i]; - if (!preset.is_visible || !preset.is_compatible) + if (!m_show_all && (!preset.is_visible || !preset.is_compatible)) continue; // marker used for disable incompatible printer models for the selected physical printer @@ -246,17 +261,17 @@ void PresetComboBox::update(std::string select_preset_name) assert(bmp); if (!is_enabled) - incomp_presets.emplace(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), bmp); + incomp_presets.emplace(get_preset_name(preset), bmp); else if (preset.is_default || preset.is_system) { - Append(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), *bmp); + Append(get_preset_name(preset), *bmp); validate_selection(preset.name == select_preset_name); } else { - nonsys_presets.emplace(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), std::pair(bmp, is_enabled)); + nonsys_presets.emplace(get_preset_name(preset), std::pair(bmp, is_enabled)); if (preset.name == select_preset_name || (select_preset_name.empty() && is_enabled)) - selected = wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()); + selected = get_preset_name(preset); } if (i + 1 == m_collection->num_default_presets()) set_label_marker(Append(separator(L("System presets")), wxNullBitmap)); @@ -329,11 +344,22 @@ bool PresetComboBox::del_physical_printer(const wxString& note_string/* = wxEmpt return true; } +void PresetComboBox::show_all(bool show_all) +{ + m_show_all = show_all; + update(); +} + void PresetComboBox::update() { this->update(into_u8(this->GetString(this->GetSelection()))); } +void PresetComboBox::update_from_bundle() +{ + this->update(m_collection->get_selected_preset().name); +} + void PresetComboBox::msw_rescale() { m_em_unit = em_unit(this); @@ -745,6 +771,12 @@ void PlaterPresetComboBox::show_edit_menu() wxGetApp().plater()->PopupMenu(menu); } +wxString PlaterPresetComboBox::get_preset_name(const Preset& preset) +{ + std::string name = preset.alias.empty() ? preset.name : preset.alias; + return from_u8(name + suffix(preset)); +} + // Only the compatible presets are shown. // If an incompatible preset is selected, it is shown as well. void PlaterPresetComboBox::update() @@ -821,17 +853,17 @@ void PlaterPresetComboBox::update() const std::string name = preset.alias.empty() ? preset.name : preset.alias; if (preset.is_default || preset.is_system) { - Append(wxString::FromUTF8((name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), *bmp); + Append(get_preset_name(preset), *bmp); validate_selection(is_selected); if (is_selected) - tooltip = wxString::FromUTF8(preset.name.c_str()); + tooltip = from_u8(preset.name); } else { - nonsys_presets.emplace(wxString::FromUTF8((name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), bmp); + nonsys_presets.emplace(get_preset_name(preset), bmp); if (is_selected) { - selected_user_preset = wxString::FromUTF8((name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()); - tooltip = wxString::FromUTF8(preset.name.c_str()); + selected_user_preset = get_preset_name(preset); + tooltip = from_u8(preset.name); } } if (i + 1 == m_collection->num_default_presets()) @@ -862,7 +894,7 @@ void PlaterPresetComboBox::update() wxBitmap* bmp = get_bmp(main_icon_name, wide_icons, main_icon_name); assert(bmp); - set_label_marker(Append(wxString::FromUTF8((it->get_full_name(preset_name) + (preset->is_dirty ? Preset::suffix_modified() : "")).c_str()), *bmp), LABEL_ITEM_PHYSICAL_PRINTER); + set_label_marker(Append(from_u8(it->get_full_name(preset_name) + suffix(preset)), *bmp), LABEL_ITEM_PHYSICAL_PRINTER); validate_selection(ph_printers.is_selected(it, preset_name)); } } @@ -946,6 +978,11 @@ TabPresetComboBox::TabPresetComboBox(wxWindow* parent, Preset::Type preset_type) }); } +wxString TabPresetComboBox::get_preset_name(const Preset& preset) +{ + return from_u8(preset.name + suffix(preset)); +} + // Update the choice UI from the list of presets. // If show_incompatible, all presets are shown, otherwise only the compatible presets are shown. // If an incompatible preset is selected, it is shown as well. @@ -991,7 +1028,7 @@ void TabPresetComboBox::update() assert(bmp); if (preset.is_default || preset.is_system) { - int item_id = Append(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), *bmp); + int item_id = Append(get_preset_name(preset), *bmp); if (!is_enabled) set_label_marker(item_id, LABEL_ITEM_DISABLED); validate_selection(i == idx_selected); @@ -999,9 +1036,9 @@ void TabPresetComboBox::update() else { std::pair pair(bmp, is_enabled); - nonsys_presets.emplace(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), std::pair(bmp, is_enabled)); + nonsys_presets.emplace(get_preset_name(preset), std::pair(bmp, is_enabled)); if (i == idx_selected) - selected = wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()); + selected = get_preset_name(preset); } if (i + 1 == m_collection->num_default_presets()) set_label_marker(Append(separator(L("System presets")), wxNullBitmap)); @@ -1035,7 +1072,7 @@ void TabPresetComboBox::update() wxBitmap* bmp = get_bmp(main_icon_name, main_icon_name, "", true, true, false); assert(bmp); - set_label_marker(Append(wxString::FromUTF8((it->get_full_name(preset_name) + (preset->is_dirty ? Preset::suffix_modified() : "")).c_str()), *bmp), LABEL_ITEM_PHYSICAL_PRINTER); + set_label_marker(Append(from_u8(it->get_full_name(preset_name) + suffix(preset)), *bmp), LABEL_ITEM_PHYSICAL_PRINTER); validate_selection(ph_printers.is_selected(it, preset_name)); } } @@ -1082,15 +1119,15 @@ void TabPresetComboBox::update_dirty() preset_name = PhysicalPrinter::get_preset_name(preset_name); } - const Preset* preset = m_collection->find_preset(preset_name, false); + Preset* preset = m_collection->find_preset(preset_name, false); if (preset) { - std::string new_label = preset->is_dirty ? preset->name + Preset::suffix_modified() : preset->name; + std::string new_label = preset->name + suffix(preset); if (marker == LABEL_ITEM_PHYSICAL_PRINTER) new_label = ph_printer_name + PhysicalPrinter::separator() + new_label; if (old_label != new_label) - SetString(ui_id, wxString::FromUTF8(new_label.c_str())); + SetString(ui_id, from_u8(new_label)); } } #ifdef __APPLE__ diff --git a/src/slic3r/GUI/PresetComboBoxes.hpp b/src/slic3r/GUI/PresetComboBoxes.hpp index d3cc6277dbd..6f41c95f4e1 100644 --- a/src/slic3r/GUI/PresetComboBoxes.hpp +++ b/src/slic3r/GUI/PresetComboBoxes.hpp @@ -30,8 +30,9 @@ class BitmapCache; // BitmapComboBox used to presets list on Sidebar and Tabs class PresetComboBox : public wxBitmapComboBox { + bool m_show_all { false }; public: - PresetComboBox(wxWindow* parent, Preset::Type preset_type, const wxSize& size = wxDefaultSize); + PresetComboBox(wxWindow* parent, Preset::Type preset_type, const wxSize& size = wxDefaultSize, PresetBundle* preset_bundle = nullptr); ~PresetComboBox(); enum LabelItemType { @@ -58,11 +59,16 @@ class PresetComboBox : public wxBitmapComboBox bool selection_is_changed_according_to_physical_printers(); void update(std::string select_preset); + // select preset which is selected in PreseBundle + void update_from_bundle(); void edit_physical_printer(); void add_physical_printer(); bool del_physical_printer(const wxString& note_string = wxEmptyString); + virtual wxString get_preset_name(const Preset& preset); + Preset::Type get_type() { return m_type; } + void show_all(bool show_all); virtual void update(); virtual void msw_rescale(); @@ -158,6 +164,7 @@ class PlaterPresetComboBox : public PresetComboBox void show_add_menu(); void show_edit_menu(); + wxString get_preset_name(const Preset& preset) override; void update() override; void msw_rescale() override; @@ -182,6 +189,7 @@ class TabPresetComboBox : public PresetComboBox show_incompatible = show_incompatible_presets; } + wxString get_preset_name(const Preset& preset) override; void update() override; void update_dirty(); void msw_rescale() override; diff --git a/src/slic3r/GUI/Search.cpp b/src/slic3r/GUI/Search.cpp index 2b7b3f3d9d5..03aa11eb69b 100644 --- a/src/slic3r/GUI/Search.cpp +++ b/src/slic3r/GUI/Search.cpp @@ -326,6 +326,53 @@ const Option& OptionsSearcher::get_option(const std::string& opt_key) const return options[it - options.begin()]; } +static Option create_option(const std::string& opt_key, const wxString& label, Preset::Type type, const GroupAndCategory& gc) +{ + wxString suffix; + wxString suffix_local; + if (gc.category == "Machine limits") { + suffix = opt_key.back() == '1' ? L("Stealth") : L("Normal"); + suffix_local = " " + _(suffix); + suffix = " " + suffix; + } + + wxString category = gc.category; + if (type == Preset::TYPE_PRINTER && category.Contains("Extruder ")) { + std::string opt_idx = opt_key.substr(opt_key.find("#") + 1); + category = wxString::Format("%s %d", "Extruder", atoi(opt_idx.c_str()) + 1); + } + + return Option{ boost::nowide::widen(opt_key), type, + (label + suffix).ToStdWstring(), (_(label) + suffix_local).ToStdWstring(), + gc.group.ToStdWstring(), _(gc.group).ToStdWstring(), + gc.category.ToStdWstring(), GUI::Tab::translate_category(category, type).ToStdWstring() }; +} + +Option OptionsSearcher::get_option(const std::string& opt_key, const wxString& label, Preset::Type type) const +{ + auto it = std::lower_bound(options.begin(), options.end(), Option({ boost::nowide::widen(opt_key) })); + if(it->opt_key == boost::nowide::widen(opt_key)) + return options[it - options.begin()]; + if (groups_and_categories.find(opt_key) == groups_and_categories.end()) { + size_t pos = opt_key.find('#'); + if (pos == std::string::npos) + return options[it - options.begin()]; + + std::string zero_opt_key = opt_key.substr(0, pos + 1) + "0"; + + if(groups_and_categories.find(zero_opt_key) == groups_and_categories.end()) + return options[it - options.begin()]; + + return create_option(opt_key, label, type, groups_and_categories.at(zero_opt_key)); + } + + const GroupAndCategory& gc = groups_and_categories.at(opt_key); + if (gc.group.IsEmpty() || gc.category.IsEmpty()) + return options[it - options.begin()]; + + return create_option(opt_key, label, type, gc); +} + void OptionsSearcher::add_key(const std::string& opt_key, const wxString& group, const wxString& category) { groups_and_categories[opt_key] = GroupAndCategory{group, category}; diff --git a/src/slic3r/GUI/Search.hpp b/src/slic3r/GUI/Search.hpp index f8c9dffa6aa..1f2909564db 100644 --- a/src/slic3r/GUI/Search.hpp +++ b/src/slic3r/GUI/Search.hpp @@ -117,6 +117,7 @@ class OptionsSearcher const FoundOption& operator[](const size_t pos) const noexcept { return found[pos]; } const Option& get_option(size_t pos_in_filter) const; const Option& get_option(const std::string& opt_key) const; + Option get_option(const std::string& opt_key, const wxString& label, Preset::Type type) const; const std::vector& found_options() { return found; } const GroupAndCategory& get_group_and_category (const std::string& opt_key) { return groups_and_categories[opt_key]; } diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 4243595a09d..cdcc98d0613 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -196,6 +196,7 @@ void Tab::create_preset_tab() m_scaled_buttons.reserve(6); m_scaled_buttons.reserve(2); + add_scaled_button(panel, &m_btn_compare_preset, "compare"); add_scaled_button(panel, &m_btn_save_preset, "save"); add_scaled_button(panel, &m_btn_delete_preset, "cross"); if (m_type == Preset::Type::TYPE_PRINTER) @@ -207,6 +208,7 @@ void Tab::create_preset_tab() add_scaled_button(panel, &m_btn_hide_incompatible_presets, m_bmp_hide_incompatible_presets.name()); + m_btn_compare_preset->SetToolTip(_L("Compare this preset with some another")); // TRN "Save current Settings" m_btn_save_preset->SetToolTip(from_u8((boost::format(_utf8(L("Save current %s"))) % m_title).str())); m_btn_delete_preset->SetToolTip(_(L("Delete this preset"))); @@ -271,6 +273,9 @@ void Tab::create_preset_tab() m_hsizer->Add(m_undo_btn, 0, wxALIGN_CENTER_VERTICAL); m_hsizer->AddSpacer(int(32 * scale_factor)); m_hsizer->Add(m_search_btn, 0, wxALIGN_CENTER_VERTICAL); + m_hsizer->AddSpacer(int(8*scale_factor)); + m_hsizer->Add(m_btn_compare_preset, 0, wxALIGN_CENTER_VERTICAL); + m_hsizer->AddSpacer(int(16*scale_factor)); // m_hsizer->AddStretchSpacer(32); // StretchSpacer has a strange behavior under OSX, so // There is used just additional sizer for m_mode_sizer with right alignment @@ -338,6 +343,7 @@ void Tab::create_preset_tab() m_page_view->SetScrollbars(1, 20, 1, 2); m_hsizer->Add(m_page_view, 1, wxEXPAND | wxLEFT, 5); + m_btn_compare_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { compare_preset(); })); m_btn_save_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { save_preset(); })); m_btn_delete_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { delete_preset(); })); m_btn_hide_incompatible_presets->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { @@ -2066,11 +2072,18 @@ bool Tab::current_preset_is_dirty() void TabPrinter::build() { m_presets = &m_preset_bundle->printers; - load_initial_data(); - m_printer_technology = m_presets->get_selected_preset().printer_technology(); - m_presets->get_selected_preset().printer_technology() == ptSLA ? build_sla() : build_fff(); + // For DiffPresetDialog we use options list which is saved in Searcher class. + // Options for the Searcher is added in the moment of pages creation. + // So, build first of all printer pages for non-selected printer technology... + std::string def_preset_name = "- default " + std::string(m_printer_technology == ptSLA ? "FFF" : "SLA") + " -"; + m_config = &m_presets->find_preset(def_preset_name)->config; + m_printer_technology == ptSLA ? build_fff() : build_sla(); + + // ... and than for selected printer technology + load_initial_data(); + m_printer_technology == ptSLA ? build_sla() : build_fff(); } void TabPrinter::build_print_host_upload_group(Page* page) @@ -2105,7 +2118,8 @@ void TabPrinter::build_fff() m_initial_extruders_count = m_extruders_count = nozzle_diameter->values.size(); wxGetApp().sidebar().update_objects_list_extruder_column(m_initial_extruders_count); - const Preset* parent_preset = m_presets->get_selected_preset_parent(); + const Preset* parent_preset = m_printer_technology == ptSLA ? nullptr // just for first build, if SLA printer preset is selected + : m_presets->get_selected_preset_parent(); m_sys_extruders_count = parent_preset == nullptr ? 0 : static_cast(parent_preset->config.option("nozzle_diameter"))->values.size(); @@ -2289,7 +2303,7 @@ void TabPrinter::build_fff() build_preset_description_line(optgroup.get()); - build_unregular_pages(); + build_unregular_pages(true); } void TabPrinter::build_sla() @@ -2395,7 +2409,9 @@ void TabPrinter::append_option_line(ConfigOptionsGroupShp optgroup, const std::s auto option = optgroup->get_option(opt_key, 0); auto line = Line{ option.opt.full_label, "" }; line.append_option(option); - if (m_use_silent_mode) + if (m_use_silent_mode + || m_printer_technology == ptSLA // just for first build, if SLA printer preset is selected + ) line.append_option(optgroup->get_option(opt_key, 1)); optgroup->append_line(line); } @@ -2470,7 +2486,7 @@ PageShp TabPrinter::build_kinematics_page() * but "Machine limits" and "Single extruder MM setup" too * (These pages can changes according to the another values of a current preset) * */ -void TabPrinter::build_unregular_pages() +void TabPrinter::build_unregular_pages(bool from_initial_build/* = false*/) { size_t n_before_extruders = 2; // Count of pages before Extruder pages bool is_marlin_flavor = m_config->option>("gcode_flavor")->value == gcfMarlin; @@ -2481,18 +2497,6 @@ void TabPrinter::build_unregular_pages() * */ Freeze(); -#ifdef __WXMSW__ - /* Workaround for correct layout of controls inside the created page: - * In some _strange_ way we should we should imitate page resizing. - */ -/* auto layout_page = [this](PageShp page) - { - const wxSize& sz = page->GetSize(); - page->SetSize(sz.x + 1, sz.y + 1); - page->SetSize(sz); - };*/ -#endif //__WXMSW__ - // Add/delete Kinematics page according to is_marlin_flavor size_t existed_page = 0; for (size_t i = n_before_extruders; i < m_pages.size(); ++i) // first make sure it's not there already @@ -2504,12 +2508,12 @@ void TabPrinter::build_unregular_pages() break; } - if (existed_page < n_before_extruders && is_marlin_flavor) { + if (existed_page < n_before_extruders && (is_marlin_flavor || from_initial_build)) { auto page = build_kinematics_page(); -#ifdef __WXMSW__ -// layout_page(page); -#endif - m_pages.insert(m_pages.begin() + n_before_extruders, page); + if (from_initial_build) + page->clear(); + else + m_pages.insert(m_pages.begin() + n_before_extruders, page); } if (is_marlin_flavor) @@ -2527,7 +2531,8 @@ void TabPrinter::build_unregular_pages() } m_has_single_extruder_MM_page = false; } - if (m_extruders_count > 1 && m_config->opt_bool("single_extruder_multi_material") && !m_has_single_extruder_MM_page) { + if (from_initial_build || + (m_extruders_count > 1 && m_config->opt_bool("single_extruder_multi_material") && !m_has_single_extruder_MM_page)) { // create a page, but pretend it's an extruder page, so we can add it to m_pages ourselves auto page = add_options_page(L("Single extruder MM setup"), "printer", true); auto optgroup = page->new_optgroup(L("Single extruder multimaterial parameters")); @@ -2536,8 +2541,12 @@ void TabPrinter::build_unregular_pages() optgroup->append_single_option_line("parking_pos_retraction"); optgroup->append_single_option_line("extra_loading_move"); optgroup->append_single_option_line("high_current_on_filament_swap"); - m_pages.insert(m_pages.end() - n_after_single_extruder_MM, page); - m_has_single_extruder_MM_page = true; + if (from_initial_build) + page->clear(); + else { + m_pages.insert(m_pages.end() - n_after_single_extruder_MM, page); + m_has_single_extruder_MM_page = true; + } } // Build missed extruder pages @@ -2642,10 +2651,6 @@ void TabPrinter::build_unregular_pages() line = optgroup->create_single_option_line("extruder_colour", wxEmptyString, extruder_idx); line.append_widget(reset_to_filament_color); optgroup->append_line(line); - -#ifdef __WXMSW__ -// layout_page(page); -#endif } // # remove extra pages @@ -2656,6 +2661,10 @@ void TabPrinter::build_unregular_pages() Thaw(); m_extruders_count_old = m_extruders_count; + + if (m_printer_technology == ptSLA/*from_initial_build*/) + return; // next part of code is no needed to execute at this moment + rebuild_page_tree(); // Reload preset pages with current configuration values @@ -3187,6 +3196,9 @@ void Tab::select_preset(std::string preset_name, bool delete_current /*=false*/, load_current_preset(); } + + if (technology_changed) + wxGetApp().mainframe->diff_dialog.update_presets(); } // If the current preset is dirty, the user is asked whether the changes may be discarded. @@ -3374,6 +3386,11 @@ void Tab::OnKeyDown(wxKeyEvent& event) event.Skip(); } +void Tab::compare_preset() +{ + wxGetApp().mainframe->diff_dialog.show(m_type); +} + // Save the current preset into file. // This removes the "dirty" flag of the preset, possibly creates a new preset under a new name, // and activates the new preset. @@ -3443,6 +3460,9 @@ void Tab::save_preset(std::string name /*= ""*/, bool detach) for (Preset::Type preset_type : dependent) wxGetApp().get_tab(preset_type)->update_tab_ui(); } + + // update preset comboboxes in DiffPresetDlg + wxGetApp().mainframe->diff_dialog.update_presets(m_type); } // Called for a currently selected preset. diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 29588ba20e0..0358fd3150f 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -112,6 +112,7 @@ class Tab: public wxPanel const wxString m_title; TabPresetComboBox* m_presets_choice; ScalableButton* m_search_btn; + ScalableButton* m_btn_compare_preset; ScalableButton* m_btn_save_preset; ScalableButton* m_btn_delete_preset; ScalableButton* m_btn_edit_ph_printer {nullptr}; @@ -290,6 +291,7 @@ class Tab: public wxPanel void OnTreeSelChange(wxTreeEvent& event); void OnKeyDown(wxKeyEvent& event); + void compare_preset(); void save_preset(std::string name = std::string(), bool detach = false); void delete_preset(); void toggle_show_hide_incompatible(); @@ -456,7 +458,7 @@ class TabPrinter : public Tab void update_pages(); // update m_pages according to printer technology void extruders_count_changed(size_t extruders_count); PageShp build_kinematics_page(); - void build_unregular_pages(); + void build_unregular_pages(bool from_initial_build = false); void on_preset_loaded() override; void init_options_list() override; void msw_rescale() override; diff --git a/src/slic3r/GUI/UnsavedChangesDialog.cpp b/src/slic3r/GUI/UnsavedChangesDialog.cpp index 68487921d58..2727a298269 100644 --- a/src/slic3r/GUI/UnsavedChangesDialog.cpp +++ b/src/slic3r/GUI/UnsavedChangesDialog.cpp @@ -7,6 +7,8 @@ #include #include +#include + #include "libslic3r/PrintConfig.hpp" #include "libslic3r/PresetBundle.hpp" #include "format.hpp" @@ -22,6 +24,7 @@ //#include "fts_fuzzy_match.h" #include "BitmapCache.hpp" +#include "PresetComboBoxes.hpp" using boost::optional; @@ -36,7 +39,7 @@ namespace Slic3r { namespace GUI { // ---------------------------------------------------------------------------- -// ModelNode: a node inside UnsavedChangesModel +// ModelNode: a node inside DiffModel // ---------------------------------------------------------------------------- static const std::map type_icon_names = { @@ -215,21 +218,15 @@ void ModelNode::UpdateIcons() // ---------------------------------------------------------------------------- -// UnsavedChangesModel +// DiffModel // ---------------------------------------------------------------------------- -UnsavedChangesModel::UnsavedChangesModel(wxWindow* parent) : +DiffModel::DiffModel(wxWindow* parent) : m_parent_win(parent) { } -UnsavedChangesModel::~UnsavedChangesModel() -{ - for (ModelNode* preset_node : m_preset_nodes) - delete preset_node; -} - -wxDataViewItem UnsavedChangesModel::AddPreset(Preset::Type type, wxString preset_name, PrinterTechnology pt) +wxDataViewItem DiffModel::AddPreset(Preset::Type type, wxString preset_name, PrinterTechnology pt) { // "color" strings color_string(preset_name, def_text_color()); @@ -245,7 +242,7 @@ wxDataViewItem UnsavedChangesModel::AddPreset(Preset::Type type, wxString preset return child; } -ModelNode* UnsavedChangesModel::AddOption(ModelNode* group_node, wxString option_name, wxString old_value, wxString new_value) +ModelNode* DiffModel::AddOption(ModelNode* group_node, wxString option_name, wxString old_value, wxString new_value) { group_node->Append(std::make_unique(group_node, option_name, old_value, new_value)); ModelNode* option = group_node->GetChildren().back().get(); @@ -256,7 +253,7 @@ ModelNode* UnsavedChangesModel::AddOption(ModelNode* group_node, wxString option return option; } -ModelNode* UnsavedChangesModel::AddOptionWithGroup(ModelNode* category_node, wxString group_name, wxString option_name, wxString old_value, wxString new_value) +ModelNode* DiffModel::AddOptionWithGroup(ModelNode* category_node, wxString group_name, wxString option_name, wxString old_value, wxString new_value) { category_node->Append(std::make_unique(category_node, group_name)); ModelNode* group_node = category_node->GetChildren().back().get(); @@ -265,7 +262,7 @@ ModelNode* UnsavedChangesModel::AddOptionWithGroup(ModelNode* category_node, wxS return AddOption(group_node, option_name, old_value, new_value); } -ModelNode* UnsavedChangesModel::AddOptionWithGroupAndCategory(ModelNode* preset_node, wxString category_name, wxString group_name, +ModelNode* DiffModel::AddOptionWithGroupAndCategory(ModelNode* preset_node, wxString category_name, wxString group_name, wxString option_name, wxString old_value, wxString new_value, const std::string category_icon_name) { preset_node->Append(std::make_unique(preset_node, category_name, category_icon_name)); @@ -275,7 +272,7 @@ ModelNode* UnsavedChangesModel::AddOptionWithGroupAndCategory(ModelNode* preset_ return AddOptionWithGroup(category_node, group_name, option_name, old_value, new_value); } -wxDataViewItem UnsavedChangesModel::AddOption(Preset::Type type, wxString category_name, wxString group_name, wxString option_name, +wxDataViewItem DiffModel::AddOption(Preset::Type type, wxString category_name, wxString group_name, wxString option_name, wxString old_value, wxString new_value, const std::string category_icon_name) { // "color" strings @@ -288,7 +285,7 @@ wxDataViewItem UnsavedChangesModel::AddOption(Preset::Type type, wxString catego make_string_bold(group_name); // add items - for (ModelNode* preset : m_preset_nodes) + for (std::unique_ptr& preset : m_preset_nodes) if (preset->type() == type) { for (std::unique_ptr &category : preset->GetChildren()) @@ -301,7 +298,7 @@ wxDataViewItem UnsavedChangesModel::AddOption(Preset::Type type, wxString catego return wxDataViewItem((void*)AddOptionWithGroup(category.get(), group_name, option_name, old_value, new_value)); } - return wxDataViewItem((void*)AddOptionWithGroupAndCategory(preset, category_name, group_name, option_name, old_value, new_value, category_icon_name)); + return wxDataViewItem((void*)AddOptionWithGroupAndCategory(preset.get(), category_name, group_name, option_name, old_value, new_value, category_icon_name)); } return wxDataViewItem(nullptr); @@ -336,7 +333,7 @@ static void update_parents(ModelNode* node) } } -void UnsavedChangesModel::UpdateItemEnabling(wxDataViewItem item) +void DiffModel::UpdateItemEnabling(wxDataViewItem item) { assert(item.IsOk()); ModelNode* node = static_cast(item.GetID()); @@ -346,14 +343,14 @@ void UnsavedChangesModel::UpdateItemEnabling(wxDataViewItem item) update_parents(node); } -bool UnsavedChangesModel::IsEnabledItem(const wxDataViewItem& item) +bool DiffModel::IsEnabledItem(const wxDataViewItem& item) { assert(item.IsOk()); ModelNode* node = static_cast(item.GetID()); return node->IsToggled(); } -void UnsavedChangesModel::GetValue(wxVariant& variant, const wxDataViewItem& item, unsigned int col) const +void DiffModel::GetValue(wxVariant& variant, const wxDataViewItem& item, unsigned int col) const { assert(item.IsOk()); @@ -386,11 +383,11 @@ void UnsavedChangesModel::GetValue(wxVariant& variant, const wxDataViewItem& ite #endif //__linux__ default: - wxLogError("UnsavedChangesModel::GetValue: wrong column %d", col); + wxLogError("DiffModel::GetValue: wrong column %d", col); } } -bool UnsavedChangesModel::SetValue(const wxVariant& variant, const wxDataViewItem& item, unsigned int col) +bool DiffModel::SetValue(const wxVariant& variant, const wxDataViewItem& item, unsigned int col) { assert(item.IsOk()); @@ -440,12 +437,12 @@ bool UnsavedChangesModel::SetValue(const wxVariant& variant, const wxDataViewIte return true; } #endif //__linux__ default: - wxLogError("UnsavedChangesModel::SetValue: wrong column"); + wxLogError("DiffModel::SetValue: wrong column"); } return false; } -bool UnsavedChangesModel::IsEnabled(const wxDataViewItem& item, unsigned int col) const +bool DiffModel::IsEnabled(const wxDataViewItem& item, unsigned int col) const { assert(item.IsOk()); if (col == colToggle) @@ -455,7 +452,7 @@ bool UnsavedChangesModel::IsEnabled(const wxDataViewItem& item, unsigned int col return (static_cast(item.GetID()))->IsToggled(); } -wxDataViewItem UnsavedChangesModel::GetParent(const wxDataViewItem& item) const +wxDataViewItem DiffModel::GetParent(const wxDataViewItem& item) const { // the invisible root node has no parent if (!item.IsOk()) @@ -463,14 +460,13 @@ wxDataViewItem UnsavedChangesModel::GetParent(const wxDataViewItem& item) const ModelNode* node = static_cast(item.GetID()); - // "MyMusic" also has no parent if (node->IsRoot()) return wxDataViewItem(nullptr); return wxDataViewItem((void*)node->GetParent()); } -bool UnsavedChangesModel::IsContainer(const wxDataViewItem& item) const +bool DiffModel::IsContainer(const wxDataViewItem& item) const { // the invisble root node can have children if (!item.IsOk()) @@ -480,23 +476,19 @@ bool UnsavedChangesModel::IsContainer(const wxDataViewItem& item) const return node->IsContainer(); } -unsigned int UnsavedChangesModel::GetChildren(const wxDataViewItem& parent, wxDataViewItemArray& array) const +unsigned int DiffModel::GetChildren(const wxDataViewItem& parent, wxDataViewItemArray& array) const { - ModelNode* node = (ModelNode*)parent.GetID(); - if (!node) { - for (auto preset_node : m_preset_nodes) - array.Add(wxDataViewItem((void*)preset_node)); - return m_preset_nodes.size(); - } + ModelNode* parent_node = (ModelNode*)parent.GetID(); - for (std::unique_ptr &child : node->GetChildren()) + const ModelNodePtrArray& children = parent_node ? parent_node->GetChildren() : m_preset_nodes; + for (const std::unique_ptr& child : children) array.Add(wxDataViewItem((void*)child.get())); - return node->GetChildCount(); + return array.size(); } -wxString UnsavedChangesModel::GetColumnType(unsigned int col) const +wxString DiffModel::GetColumnType(unsigned int col) const { switch (col) { @@ -520,12 +512,232 @@ static void rescale_children(ModelNode* parent) } } -void UnsavedChangesModel::Rescale() +void DiffModel::Rescale() { - for (ModelNode* node : m_preset_nodes) { + for (std::unique_ptr &node : m_preset_nodes) { node->UpdateIcons(); - rescale_children(node); + rescale_children(node.get()); + } +} + +wxDataViewItem DiffModel::Delete(const wxDataViewItem& item) +{ + auto ret_item = wxDataViewItem(nullptr); + ModelNode* node = static_cast(item.GetID()); + if (!node) // happens if item.IsOk()==false + return ret_item; + + // first remove the node from the parent's array of children; + // NOTE: m_preset_nodes is only a vector of _pointers_ + // thus removing the node from it doesn't result in freeing it + ModelNodePtrArray& children = node->GetChildren(); + // Delete all children + while (!children.empty()) + Delete(wxDataViewItem(children.back().get())); + + auto node_parent = node->GetParent(); + wxDataViewItem parent(node_parent); + + ModelNodePtrArray& parents_children = node_parent ? node_parent->GetChildren() : m_preset_nodes; + auto it = find_if(parents_children.begin(), parents_children.end(), + [node](std::unique_ptr& child) { return child.get() == node; }); + assert(it != parents_children.end()); + it = parents_children.erase(it); + + if (it != parents_children.end()) + ret_item = wxDataViewItem(it->get()); + + // set m_container to FALSE if parent has no child + if (node_parent) { +#ifndef __WXGTK__ + if (node_parent->GetChildCount() == 0) + node_parent->m_container = false; +#endif //__WXGTK__ + ret_item = parent; + } + + // notify control + ItemDeleted(parent, item); + return ret_item; +} + +void DiffModel::Clear() +{ + while (!m_preset_nodes.empty()) + Delete(wxDataViewItem(m_preset_nodes.back().get())); +} + + +static std::string get_pure_opt_key(std::string opt_key) +{ + int pos = opt_key.find("#"); + if (pos > 0) + boost::erase_tail(opt_key, opt_key.size() - pos); + return opt_key; +} + +// ---------------------------------------------------------------------------- +// DiffViewCtrl +// ---------------------------------------------------------------------------- + +DiffViewCtrl::DiffViewCtrl(wxWindow* parent, wxSize size) + : wxDataViewCtrl(parent, wxID_ANY, wxDefaultPosition, size, wxBORDER_SIMPLE | wxDV_VARIABLE_LINE_HEIGHT | wxDV_ROW_LINES), + m_em_unit(em_unit(parent)) +{ + model = new DiffModel(parent); + this->AssociateModel(model); + model->SetAssociatedControl(this); + + this->Bind(wxEVT_DATAVIEW_ITEM_CONTEXT_MENU, &DiffViewCtrl::context_menu, this); + this->Bind(wxEVT_DATAVIEW_ITEM_ACTIVATED, &DiffViewCtrl::context_menu, this); + this->Bind(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, &DiffViewCtrl::item_value_changed, this); +} + +void DiffViewCtrl::AppendBmpTextColumn(const wxString& label, unsigned model_column, int width, bool set_expander/* = false*/) +{ + m_columns_width.emplace(this->GetColumnCount(), width); +#ifdef __linux__ + wxDataViewIconTextRenderer* rd = new wxDataViewIconTextRenderer(); +#ifdef SUPPORTS_MARKUP + rd->EnableMarkup(true); +#endif + wxDataViewColumn* column = new wxDataViewColumn(label, rd, model_column, width, wxALIGN_TOP, wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_CELL_INERT); +#else + wxDataViewColumn* column = new wxDataViewColumn(label, new BitmapTextRenderer(true, wxDATAVIEW_CELL_INERT), model_column, width * m_em_unit, wxALIGN_TOP, wxDATAVIEW_COL_RESIZABLE); +#endif //__linux__ + this->AppendColumn(column); + if (set_expander) + this->SetExpanderColumn(column); + +} + +void DiffViewCtrl::AppendToggleColumn_(const wxString& label, unsigned model_column, int width) +{ + m_columns_width.emplace(this->GetColumnCount(), width); + AppendToggleColumn(label, model_column, wxDATAVIEW_CELL_ACTIVATABLE, width * m_em_unit); +} + +void DiffViewCtrl::Rescale(int em /*= 0*/) +{ + if (em > 0) { + for (auto item : m_columns_width) + GetColumn(item.first)->SetWidth(item.second * em); + m_em_unit = em; } + + model->Rescale(); + Refresh(); +} + + +void DiffViewCtrl::Append( const std::string& opt_key, Preset::Type type, + wxString category_name, wxString group_name, wxString option_name, + wxString old_value, wxString new_value, const std::string category_icon_name) +{ + ItemData item_data = { opt_key, option_name, old_value, new_value, type }; + + wxString old_val = get_short_string(item_data.old_val); + wxString new_val = get_short_string(item_data.new_val); + if (old_val != item_data.old_val || new_val != item_data.new_val) + item_data.is_long = true; + + m_items_map.emplace(model->AddOption(type, category_name, group_name, option_name, old_val, new_val, category_icon_name), item_data); + +} + +void DiffViewCtrl::Clear() +{ + model->Clear(); + m_items_map.clear(); +} + +wxString DiffViewCtrl::get_short_string(wxString full_string) +{ + int max_len = 30; + if (full_string.IsEmpty() || full_string.StartsWith("#") || + (full_string.Find("\n") == wxNOT_FOUND && full_string.Length() < max_len)) + return full_string; + + m_has_long_strings = true; + + int n_pos = full_string.Find("\n"); + if (n_pos != wxNOT_FOUND && n_pos < max_len) + max_len = n_pos; + + full_string.Truncate(max_len); + return full_string + dots; +} + +void DiffViewCtrl::context_menu(wxDataViewEvent& event) +{ + if (!m_has_long_strings) + return; + + wxDataViewItem item = event.GetItem(); + if (!item) { + wxPoint mouse_pos = wxGetMousePosition() - this->GetScreenPosition(); + wxDataViewColumn* col = nullptr; + this->HitTest(mouse_pos, item, col); + + if (!item) + item = this->GetSelection(); + + if (!item) + return; + } + + auto it = m_items_map.find(item); + if (it == m_items_map.end() || !it->second.is_long) + return; + FullCompareDialog(it->second.opt_name, it->second.old_val, it->second.new_val).ShowModal(); + +#ifdef __WXOSX__ + wxWindow* parent = this->GetParent(); + if (parent && parent->IsShown()) { + // if this dialog is shown it have to be Hide and show again to be placed on the very Top of windows + parent->Hide(); + parent->Show(); + } +#endif // __WXOSX__ +} + +void DiffViewCtrl::item_value_changed(wxDataViewEvent& event) +{ + if (event.GetColumn() != DiffModel::colToggle) + return; + + wxDataViewItem item = event.GetItem(); + + model->UpdateItemEnabling(item); + Refresh(); + + // update an enabling of the "save/move" buttons + m_empty_selection = selected_options().empty(); +} + +std::vector DiffViewCtrl::unselected_options(Preset::Type type) +{ + std::vector ret; + + for (auto item : m_items_map) { + if (item.second.opt_key == "extruders_count") + continue; + if (item.second.type == type && !model->IsEnabledItem(item.first)) + ret.emplace_back(get_pure_opt_key(item.second.opt_key)); + } + + return ret; +} + +std::vector DiffViewCtrl::selected_options() +{ + std::vector ret; + + for (auto item : m_items_map) + if (model->IsEnabledItem(item.first)) + ret.emplace_back(get_pure_opt_key(item.second.opt_key)); + + return ret; } @@ -593,35 +805,11 @@ void UnsavedChangesDialog::build(Preset::Type type, PresetCollection* dependent_ m_action_line = new wxStaticText(this, wxID_ANY, ""); m_action_line->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Bold()); - m_tree = new wxDataViewCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(em * 60, em * 30), wxBORDER_SIMPLE | wxDV_VARIABLE_LINE_HEIGHT | wxDV_ROW_LINES); - m_tree_model = new UnsavedChangesModel(this); - m_tree->AssociateModel(m_tree_model); - m_tree_model->SetAssociatedControl(m_tree); - - m_tree->AppendToggleColumn(L"\u2714", UnsavedChangesModel::colToggle, wxDATAVIEW_CELL_ACTIVATABLE, (wxLinux ? 8 : 6) * em); - - auto append_bmp_text_column = [this](const wxString& label, unsigned model_column, int width, bool set_expander = false) - { -#ifdef __linux__ - wxDataViewIconTextRenderer* rd = new wxDataViewIconTextRenderer(); -#ifdef SUPPORTS_MARKUP - rd->EnableMarkup(true); -#endif - wxDataViewColumn* column = new wxDataViewColumn(label, rd, model_column, width, wxALIGN_TOP, wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_CELL_INERT); -#else - wxDataViewColumn* column = new wxDataViewColumn(label, new BitmapTextRenderer(true, wxDATAVIEW_CELL_INERT), model_column, width, wxALIGN_TOP, wxDATAVIEW_COL_RESIZABLE); -#endif //__linux__ - m_tree->AppendColumn(column); - if (set_expander) - m_tree->SetExpanderColumn(column); - }; - - append_bmp_text_column("" , UnsavedChangesModel::colIconText, 28 * em); - append_bmp_text_column(_L("Old Value"), UnsavedChangesModel::colOldValue, 12 * em); - append_bmp_text_column(_L("New Value"), UnsavedChangesModel::colNewValue, 12 * em); - - m_tree->Bind(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, &UnsavedChangesDialog::item_value_changed, this); - m_tree->Bind(wxEVT_DATAVIEW_ITEM_CONTEXT_MENU, &UnsavedChangesDialog::context_menu, this); + m_tree = new DiffViewCtrl(this, wxSize(em * 60, em * 30)); + m_tree->AppendToggleColumn_(L"\u2714" , DiffModel::colToggle, wxLinux ? 8 : 6); + m_tree->AppendBmpTextColumn("" , DiffModel::colIconText, 28); + m_tree->AppendBmpTextColumn(_L("Old Value"), DiffModel::colOldValue, 12); + m_tree->AppendBmpTextColumn(_L("New Value"), DiffModel::colNewValue, 12); // Add Buttons wxFont btn_font = this->GetFont().Scaled(1.4f); @@ -641,7 +829,7 @@ void UnsavedChangesDialog::build(Preset::Type type, PresetCollection* dependent_ close(close_act); }); if (process_enable) - (*btn)->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(!m_empty_selection); }); + (*btn)->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(m_tree->has_selection()); }); (*btn)->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) { show_info_line(Action::Undef); e.Skip(); }); }; @@ -698,45 +886,6 @@ void UnsavedChangesDialog::build(Preset::Type type, PresetCollection* dependent_ show_info_line(Action::Undef); } -void UnsavedChangesDialog::item_value_changed(wxDataViewEvent& event) -{ - if (event.GetColumn() != UnsavedChangesModel::colToggle) - return; - - wxDataViewItem item = event.GetItem(); - - m_tree_model->UpdateItemEnabling(item); - m_tree->Refresh(); - - // update an enabling of the "save/move" buttons - m_empty_selection = get_selected_options().empty(); -} - -void UnsavedChangesDialog::context_menu(wxDataViewEvent& event) -{ - if (!m_has_long_strings) - return; - - wxDataViewItem item = event.GetItem(); - if (!item) - { - wxPoint mouse_pos = wxGetMousePosition() - m_tree->GetScreenPosition(); - wxDataViewColumn* col = nullptr; - m_tree->HitTest(mouse_pos, item, col); - - if (!item) - item = m_tree->GetSelection(); - - if (!item) - return; - } - - auto it = m_items_map.find(item); - if (it == m_items_map.end() || !it->second.is_long) - return; - FullCompareDialog(it->second.opt_name, it->second.old_val, it->second.new_val).ShowModal(); -} - void UnsavedChangesDialog::show_info_line(Action action, std::string preset_name) { if (action == Action::Undef && !m_has_long_strings) @@ -869,12 +1018,15 @@ static int get_id_from_opt_key(std::string opt_key) return 0; } -static std::string get_pure_opt_key(std::string opt_key) +static wxString get_full_label(std::string opt_key, const DynamicPrintConfig& config) { - int pos = opt_key.find("#"); - if (pos > 0) - boost::erase_tail(opt_key, opt_key.size() - pos); - return opt_key; + opt_key = get_pure_opt_key(opt_key); + + if (config.option(opt_key)->is_nil()) + return _L("N/A"); + + const ConfigOptionDef* opt = config.def()->get(opt_key); + return opt->full_label.empty() ? opt->label : opt->full_label; } static wxString get_string_value(std::string opt_key, const DynamicPrintConfig& config) @@ -894,34 +1046,62 @@ static wxString get_string_value(std::string opt_key, const DynamicPrintConfig& case coInt: return from_u8((boost::format("%1%") % config.opt_int(opt_key)).str()); case coInts: { - int val = is_nullable ? - config.opt(opt_key)->get_at(opt_idx) : - config.opt(opt_key)->get_at(opt_idx); - return from_u8((boost::format("%1%") % val).str()); + if (is_nullable) { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return from_u8((boost::format("%1%") % values->get_at(opt_idx)).str()); + } + else { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return from_u8((boost::format("%1%") % values->get_at(opt_idx)).str()); + } + return _L("Undef"); } case coBool: return config.opt_bool(opt_key) ? "true" : "false"; case coBools: { - bool val = is_nullable ? - config.opt(opt_key)->get_at(opt_idx) : - config.opt(opt_key)->get_at(opt_idx); - return val ? "true" : "false"; + if (is_nullable) { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return values->get_at(opt_idx) ? "true" : "false"; + } + else { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return values->get_at(opt_idx) ? "true" : "false"; + } + return _L("Undef"); } case coPercent: return from_u8((boost::format("%1%%%") % int(config.optptr(opt_key)->getFloat())).str()); case coPercents: { - double val = is_nullable ? - config.opt(opt_key)->get_at(opt_idx) : - config.opt(opt_key)->get_at(opt_idx); - return from_u8((boost::format("%1%%%") % int(val)).str()); + if (is_nullable) { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return from_u8((boost::format("%1%%%") % values->get_at(opt_idx)).str()); + } + else { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return from_u8((boost::format("%1%%%") % values->get_at(opt_idx)).str()); + } + return _L("Undef"); } case coFloat: return double_to_string(config.opt_float(opt_key)); case coFloats: { - double val = is_nullable ? - config.opt(opt_key)->get_at(opt_idx) : - config.opt(opt_key)->get_at(opt_idx); - return double_to_string(val); + if (is_nullable) { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return double_to_string(values->get_at(opt_idx)); + } + else { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return double_to_string(values->get_at(opt_idx)); + } + return _L("Undef"); } case coString: return from_u8(config.opt_string(opt_key)); @@ -936,7 +1116,7 @@ static wxString get_string_value(std::string opt_key, const DynamicPrintConfig& out.RemoveLast(1); return out; } - if (!strings->empty()) + if (!strings->empty() && opt_idx < (int)strings->values.size()) return from_u8(strings->get_at(opt_idx)); } break; @@ -987,23 +1167,6 @@ static wxString get_string_value(std::string opt_key, const DynamicPrintConfig& return out; } -wxString UnsavedChangesDialog::get_short_string(wxString full_string) -{ - int max_len = 30; - if (full_string.IsEmpty() || full_string.StartsWith("#") || - (full_string.Find("\n") == wxNOT_FOUND && full_string.Length() < size_t(max_len))) - return full_string; - - m_has_long_strings = true; - - int n_pos = full_string.Find("\n"); - if (n_pos != wxNOT_FOUND && n_pos < max_len) - max_len = n_pos; - - full_string.Truncate(max_len); - return full_string + dots; -} - void UnsavedChangesDialog::update(Preset::Type type, PresetCollection* dependent_presets, const std::string& new_selected_preset, const wxString& header) { PresetCollection* presets = dependent_presets; @@ -1065,7 +1228,7 @@ void UnsavedChangesDialog::update_tree(Preset::Type type, PresetCollection* pres const std::map& category_icon_map = wxGetApp().get_tab(type)->get_category_icon_map(); - m_tree_model->AddPreset(type, from_u8(presets->get_edited_preset().name), old_pt); + m_tree->model->AddPreset(type, from_u8(presets->get_edited_preset().name), old_pt); // Collect dirty options. const bool deep_compare = (type == Preset::TYPE_PRINTER || type == Preset::TYPE_SLA_MATERIAL); @@ -1078,9 +1241,7 @@ void UnsavedChangesDialog::update_tree(Preset::Type type, PresetCollection* pres wxString old_val = from_u8((boost::format("%1%") % old_config.opt("extruder_colour")->values.size()).str()); wxString new_val = from_u8((boost::format("%1%") % new_config.opt("extruder_colour")->values.size()).str()); - ItemData item_data = { "extruders_count", local_label, old_val, new_val, type }; - m_items_map.emplace(m_tree_model->AddOption(type, _L("General"), _L("Capabilities"), local_label, old_val, new_val, category_icon_map.at("General")), item_data); - + m_tree->Append("extruders_count", type, _L("General"), _L("Capabilities"), local_label, old_val, new_val, category_icon_map.at("General")); } for (const std::string& opt_key : dirty_options) { @@ -1092,43 +1253,12 @@ void UnsavedChangesDialog::update_tree(Preset::Type type, PresetCollection* pres continue; } - ItemData item_data = { opt_key, option.label_local, get_string_value(opt_key, old_config), get_string_value(opt_key, new_config), type }; - - wxString old_val = get_short_string(item_data.old_val); - wxString new_val = get_short_string(item_data.new_val); - if (old_val != item_data.old_val || new_val != item_data.new_val) - item_data.is_long = true; - - m_items_map.emplace(m_tree_model->AddOption(type, option.category_local, option.group_local, option.label_local, old_val, new_val, category_icon_map.at(option.category)), item_data); + m_tree->Append(opt_key, type, option.category_local, option.group_local, option.label_local, + get_string_value(opt_key, old_config), get_string_value(opt_key, new_config), category_icon_map.at(option.category)); } } } -std::vector UnsavedChangesDialog::get_unselected_options(Preset::Type type) -{ - std::vector ret; - - for (auto item : m_items_map) { - if (item.second.opt_key == "extruders_count") - continue; - if (item.second.type == type && !m_tree_model->IsEnabledItem(item.first)) - ret.emplace_back(get_pure_opt_key(item.second.opt_key)); - } - - return ret; -} - -std::vector UnsavedChangesDialog::get_selected_options() -{ - std::vector ret; - - for (auto item : m_items_map) - if (m_tree_model->IsEnabledItem(item.first)) - ret.emplace_back(get_pure_opt_key(item.second.opt_key)); - - return ret; -} - void UnsavedChangesDialog::on_dpi_changed(const wxRect& suggested_rect) { int em = em_unit(); @@ -1137,16 +1267,10 @@ void UnsavedChangesDialog::on_dpi_changed(const wxRect& suggested_rect) for (auto btn : { m_save_btn, m_transfer_btn, m_discard_btn } ) if (btn) btn->msw_rescale(); - const wxSize& size = wxSize(80 * em, 30 * em); + const wxSize& size = wxSize(70 * em, 30 * em); SetMinSize(size); - m_tree->GetColumn(UnsavedChangesModel::colToggle )->SetWidth(6 * em); - m_tree->GetColumn(UnsavedChangesModel::colIconText)->SetWidth(30 * em); - m_tree->GetColumn(UnsavedChangesModel::colOldValue)->SetWidth(20 * em); - m_tree->GetColumn(UnsavedChangesModel::colNewValue)->SetWidth(20 * em); - - m_tree_model->Rescale(); - m_tree->Refresh(); + m_tree->Rescale(em); Fit(); Refresh(); @@ -1157,8 +1281,7 @@ void UnsavedChangesDialog::on_sys_color_changed() for (auto btn : { m_save_btn, m_transfer_btn, m_discard_btn } ) btn->msw_rescale(); // msw_rescale updates just icons, so use it - m_tree_model->Rescale(); - m_tree->Refresh(); + m_tree->Rescale(); Refresh(); } @@ -1190,16 +1313,45 @@ FullCompareDialog::FullCompareDialog(const wxString& option_name, const wxString grid_sizer->Add(text, 0, wxALL, border); }; - auto add_value = [grid_sizer, border, this](wxString label, bool is_colored = false) { - wxTextCtrl* text = new wxTextCtrl(this, wxID_ANY, label, wxDefaultPosition, wxSize(300, -1), wxTE_MULTILINE | wxTE_READONLY | wxBORDER_NONE | wxTE_RICH); + add_header(_L("Old value")); + add_header(_L("New value")); + + auto get_set_from_val = [](wxString str) { + if (str.Find("\n") == wxNOT_FOUND) + str.Replace(" ", "\n"); + + std::set str_set; + + wxStringTokenizer strings(str, "\n"); + while (strings.HasMoreTokens()) + str_set.emplace(strings.GetNextToken()); + + return str_set; + }; + + std::set old_set = get_set_from_val(old_value); + std::set new_set = get_set_from_val(new_value); + std::set old_new_diff_set; + std::set new_old_diff_set; + + std::set_difference(old_set.begin(), old_set.end(), new_set.begin(), new_set.end(), std::inserter(old_new_diff_set, old_new_diff_set.begin())); + std::set_difference(new_set.begin(), new_set.end(), old_set.begin(), old_set.end(), std::inserter(new_old_diff_set, new_old_diff_set.begin())); + + auto add_value = [grid_sizer, border, this](wxString label, const std::set& diff_set, bool is_colored = false) { + wxTextCtrl* text = new wxTextCtrl(this, wxID_ANY, label, wxDefaultPosition, wxSize(400, 400), wxTE_MULTILINE | wxTE_READONLY | wxBORDER_NONE | wxTE_RICH); text->SetStyle(0, label.Len(), wxTextAttr(is_colored ? wxColour(orange) : wxNullColour, wxNullColour, this->GetFont())); + + for (const wxString& str : diff_set) { + int pos = label.First(str); + if (pos == wxNOT_FOUND) + continue; + text->SetStyle(pos, pos + (int)str.Len(), wxTextAttr(is_colored ? wxColour(orange) : wxNullColour, wxNullColour, this->GetFont().Bold())); + } + grid_sizer->Add(text, 1, wxALL | wxEXPAND, border); }; - - add_header(_L("Old value")); - add_header(_L("New value")); - add_value(old_value); - add_value(new_value, true); + add_value(old_value, old_new_diff_set); + add_value(new_value, new_old_diff_set, true); sizer->Add(grid_sizer, 1, wxEXPAND); @@ -1215,6 +1367,384 @@ FullCompareDialog::FullCompareDialog(const wxString& option_name, const wxString } +static PresetCollection* get_preset_collection(Preset::Type type, PresetBundle* preset_bundle = nullptr) { + if (!preset_bundle) + preset_bundle = wxGetApp().preset_bundle; + return type == Preset::Type::TYPE_PRINT ? &preset_bundle->prints : + type == Preset::Type::TYPE_SLA_PRINT ? &preset_bundle->sla_prints : + type == Preset::Type::TYPE_FILAMENT ? &preset_bundle->filaments : + type == Preset::Type::TYPE_SLA_MATERIAL ? &preset_bundle->sla_materials : + type == Preset::Type::TYPE_PRINTER ? &preset_bundle->printers : + nullptr; +} + +//------------------------------------------ +// DiffPresetDialog +//------------------------------------------ +static std::string get_selection(PresetComboBox* preset_combo) +{ + return into_u8(preset_combo->GetString(preset_combo->GetSelection())); +} + +DiffPresetDialog::DiffPresetDialog() + : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER), + m_pr_technology(wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology()) +{ + wxColour bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); + SetBackgroundColour(bgr_clr); + +#if ENABLE_WX_3_1_3_DPI_CHANGED_EVENT && defined(__WXMSW__) + // ys_FIXME! temporary workaround for correct font scaling + // Because of from wxWidgets 3.1.3 auto rescaling is implemented for the Fonts, + // From the very beginning set dialog font to the wxSYS_DEFAULT_GUI_FONT + this->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); +#endif // ENABLE_WX_3_1_3_DPI_CHANGED_EVENT + + int border = 10; + int em = em_unit(); + + assert(wxGetApp().preset_bundle); + + m_preset_bundle_left = std::make_unique(*wxGetApp().preset_bundle); + m_preset_bundle_right = std::make_unique(*wxGetApp().preset_bundle); + + m_top_info_line = new wxStaticText(this, wxID_ANY, "Select presets to compare"); + m_top_info_line->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Bold()); + + m_bottom_info_line = new wxStaticText(this, wxID_ANY, ""); + m_bottom_info_line->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Bold()); + + wxBoxSizer* presets_sizer = new wxBoxSizer(wxVERTICAL); + + for (auto new_type : { Preset::TYPE_PRINT, Preset::TYPE_FILAMENT, Preset::TYPE_SLA_PRINT, Preset::TYPE_SLA_MATERIAL, Preset::TYPE_PRINTER }) + { + const PresetCollection* collection = get_preset_collection(new_type); + wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); + PresetComboBox* presets_left; + PresetComboBox* presets_right; + ScalableButton* equal_bmp = new ScalableButton(this, wxID_ANY, "equal"); + + auto add_preset_combobox = [collection, sizer, new_type, em, this](PresetComboBox** cb_, PresetBundle* preset_bundle) { + *cb_ = new PresetComboBox(this, new_type, wxSize(em * 35, -1), preset_bundle); + PresetComboBox* cb = (*cb_); + cb->set_selection_changed_function([this, new_type, preset_bundle, cb](int selection) { + if (m_view_type == Preset::TYPE_INVALID) { + std::string preset_name = cb->GetString(selection).ToUTF8().data(); + update_compatibility(Preset::remove_suffix_modified(preset_name), new_type, preset_bundle); + } + update_tree(); + }); + if (collection->get_selected_idx() != (size_t)-1) + cb->update(collection->get_selected_preset().name); + + sizer->Add(cb, 1); + cb->Show(new_type == Preset::TYPE_PRINTER); + }; + add_preset_combobox(&presets_left, m_preset_bundle_left.get()); + sizer->Add(equal_bmp, 0, wxRIGHT | wxLEFT | wxALIGN_CENTER_VERTICAL, 5); + add_preset_combobox(&presets_right, m_preset_bundle_right.get()); + presets_sizer->Add(sizer, 1, wxTOP, 5); + equal_bmp->Show(new_type == Preset::TYPE_PRINTER); + + m_preset_combos.push_back({ presets_left, equal_bmp, presets_right }); + + equal_bmp->Bind(wxEVT_BUTTON, [presets_left, presets_right, this](wxEvent&) { + std::string preset_name = get_selection(presets_left); + presets_right->update(preset_name); + if (m_view_type == Preset::TYPE_INVALID) + update_compatibility(Preset::remove_suffix_modified(preset_name), presets_right->get_type(), m_preset_bundle_right.get()); + update_tree(); + }); + } + + m_show_all_presets = new wxCheckBox(this, wxID_ANY, _L("Show all preset (including incompatible)")); + m_show_all_presets->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent&) { + bool show_all = m_show_all_presets->GetValue(); + for (auto preset_combos : m_preset_combos) { + if (preset_combos.presets_left->get_type() == Preset::TYPE_PRINTER) + continue; + preset_combos.presets_left->show_all(show_all); + preset_combos.presets_right->show_all(show_all); + } + if (m_view_type == Preset::TYPE_INVALID) + update_tree(); + }); + + m_tree = new DiffViewCtrl(this, wxSize(em * 65, em * 40)); + m_tree->AppendBmpTextColumn("", DiffModel::colIconText, 35); + m_tree->AppendBmpTextColumn(_L("Left Preset Value"), DiffModel::colOldValue, 15); + m_tree->AppendBmpTextColumn(_L("Right Preset Value"),DiffModel::colNewValue, 15); + m_tree->Hide(); + + wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); + + topSizer->Add(m_top_info_line, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, 2 * border); + topSizer->Add(presets_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, border); + topSizer->Add(m_show_all_presets, 0, wxEXPAND | wxALL, border); + topSizer->Add(m_bottom_info_line, 0, wxEXPAND | wxALL, 2 * border); + topSizer->Add(m_tree, 1, wxEXPAND | wxALL, border); + + this->SetMinSize(wxSize(80 * em, 30 * em)); + this->SetSizer(topSizer); + topSizer->SetSizeHints(this); +} + +void DiffPresetDialog::update_controls_visibility(Preset::Type type /* = Preset::TYPE_INVALID*/) +{ + for (auto preset_combos : m_preset_combos) { + Preset::Type cb_type = preset_combos.presets_left->get_type(); + bool show = type != Preset::TYPE_INVALID ? type == cb_type : + cb_type == Preset::TYPE_PRINTER ? true : + m_pr_technology == ptFFF ? cb_type == Preset::TYPE_PRINT || cb_type == Preset::TYPE_FILAMENT : + cb_type == Preset::TYPE_SLA_PRINT || cb_type == Preset::TYPE_SLA_MATERIAL; + preset_combos.presets_left->Show(show); + preset_combos.equal_bmp->Show(show); + preset_combos.presets_right->Show(show); + + if (show) { + preset_combos.presets_left->update_from_bundle(); + preset_combos.presets_right->update_from_bundle(); + } + } + + m_show_all_presets->Show(type != Preset::TYPE_PRINTER); +} + +void DiffPresetDialog::update_bundles_from_app() +{ + *m_preset_bundle_left = *wxGetApp().preset_bundle; + *m_preset_bundle_right = *wxGetApp().preset_bundle; +} + +void DiffPresetDialog::show(Preset::Type type /* = Preset::TYPE_INVALID*/) +{ + this->SetTitle(type == Preset::TYPE_INVALID ? _L("Compare Presets") : format_wxstr(_L("Compare %1% Presets"), wxGetApp().get_tab(type)->name())); + m_view_type = type; + + update_bundles_from_app(); + update_controls_visibility(type); + if (type == Preset::TYPE_INVALID) + Fit(); + + update_tree(); + + // if this dialog is shown it have to be Hide and show again to be placed on the very Top of windows + if (IsShown()) + Hide(); + Show(); +} + +void DiffPresetDialog::update_presets(Preset::Type type) +{ + m_pr_technology = m_preset_bundle_left.get()->printers.get_edited_preset().printer_technology(); + + update_bundles_from_app(); + update_controls_visibility(type); + + if (type == Preset::TYPE_INVALID) + for (auto preset_combos : m_preset_combos) { + if (preset_combos.presets_left->get_type() == Preset::TYPE_PRINTER) { + preset_combos.presets_left->update_from_bundle (); + preset_combos.presets_right->update_from_bundle(); + break; + } + } + else + for (auto preset_combos : m_preset_combos) { + if (preset_combos.presets_left->get_type() == type) { + preset_combos.presets_left->update(); + preset_combos.presets_right->update(); + break; + } + } + + update_tree(); +} + +void DiffPresetDialog::update_tree() +{ + Search::OptionsSearcher& searcher = wxGetApp().sidebar().get_searcher(); + searcher.sort_options_by_opt_key(); + + m_tree->Clear(); + wxString bottom_info = ""; + bool show_tree = false; + + for (auto preset_combos : m_preset_combos) + { + if (!preset_combos.presets_left->IsShown()) + continue; + Preset::Type type = preset_combos.presets_left->get_type(); + + const PresetCollection* presets = get_preset_collection(type); + const Preset* left_preset = presets->find_preset(get_selection(preset_combos.presets_left)); + const Preset* right_preset = presets->find_preset(get_selection(preset_combos.presets_right)); + if (!left_preset || !right_preset) { + bottom_info = _L("One of the presets doesn't found"); + preset_combos.equal_bmp->SetBitmap_(ScalableBitmap(this, "question")); + preset_combos.equal_bmp->SetToolTip(bottom_info); + continue; + } + + const DynamicPrintConfig& left_config = left_preset->config; + const PrinterTechnology& left_pt = left_preset->printer_technology(); + const DynamicPrintConfig& right_congig = right_preset->config; + + if (left_pt != right_preset->printer_technology()) { + bottom_info = _L("Comparable printer presets has different printer technology"); + preset_combos.equal_bmp->SetBitmap_(ScalableBitmap(this, "question")); + preset_combos.equal_bmp->SetToolTip(bottom_info); + continue; + } + + // Collect dirty options. + const bool deep_compare = (type == Preset::TYPE_PRINTER || type == Preset::TYPE_SLA_MATERIAL); + auto dirty_options = type == Preset::TYPE_PRINTER && left_pt == ptFFF && + left_config.opt("extruder_colour")->values.size() < right_congig.opt("extruder_colour")->values.size() ? + presets->dirty_options(right_preset, left_preset, deep_compare) : + presets->dirty_options(left_preset, right_preset, deep_compare); + + if (dirty_options.empty()) { + bottom_info = _L("Presets are the same"); + preset_combos.equal_bmp->SetBitmap_(ScalableBitmap(this, "equal")); + preset_combos.equal_bmp->SetToolTip(bottom_info); + continue; + } + + show_tree = true; + preset_combos.equal_bmp->SetBitmap_(ScalableBitmap(this, "not_equal")); + preset_combos.equal_bmp->SetToolTip(_L("Presets are different.\n" + "Click this button to select the same as left preset for the right preset.")); + + m_tree->model->AddPreset(type, "\"" + from_u8(left_preset->name) + "\" vs \"" + from_u8(right_preset->name) + "\"", left_pt); + + const std::map& category_icon_map = wxGetApp().get_tab(type)->get_category_icon_map(); + + // process changes of extruders count + if (type == Preset::TYPE_PRINTER && left_pt == ptFFF && + left_config.opt("extruder_colour")->values.size() != right_congig.opt("extruder_colour")->values.size()) { + wxString local_label = _L("Extruders count"); + wxString left_val = from_u8((boost::format("%1%") % left_config.opt("extruder_colour")->values.size()).str()); + wxString right_val = from_u8((boost::format("%1%") % right_congig.opt("extruder_colour")->values.size()).str()); + + m_tree->Append("extruders_count", type, _L("General"), _L("Capabilities"), local_label, left_val, right_val, category_icon_map.at("General")); + } + + for (const std::string& opt_key : dirty_options) { + wxString left_val = get_string_value(opt_key, left_config); + wxString right_val = get_string_value(opt_key, right_congig); + + Search::Option option = searcher.get_option(opt_key, get_full_label(opt_key, left_config), type); + if (option.opt_key != boost::nowide::widen(opt_key)) { + // temporary solution, just for testing + m_tree->Append(opt_key, type, _L("Undef category"), _L("Undef group"), opt_key, left_val, right_val, "question"); + // When founded option isn't the correct one. + // It can be for dirty_options: "default_print_profile", "printer_model", "printer_settings_id", + // because of they don't exist in searcher + continue; + } + m_tree->Append(opt_key, type, option.category_local, option.group_local, option.label_local, + left_val, right_val, category_icon_map.at(option.category)); + } + } + + bool tree_was_shown = m_tree->IsShown(); + m_tree->Show(show_tree); + if (!show_tree) + m_bottom_info_line->SetLabel(bottom_info); + m_bottom_info_line->Show(!show_tree); + + if (tree_was_shown == m_tree->IsShown()) + Layout(); + else { + Fit(); + Refresh(); + } +} + +void DiffPresetDialog::on_dpi_changed(const wxRect&) +{ + int em = em_unit(); + + msw_buttons_rescale(this, em, { wxID_CANCEL}); + + const wxSize& size = wxSize(80 * em, 30 * em); + SetMinSize(size); + + for (auto preset_combos : m_preset_combos) { + preset_combos.presets_left->msw_rescale(); + preset_combos.equal_bmp->msw_rescale(); + preset_combos.presets_right->msw_rescale(); + } + + m_tree->Rescale(em); + + Fit(); + Refresh(); +} + +void DiffPresetDialog::on_sys_color_changed() +{ + // msw_rescale updates just icons, so use it + m_tree->Rescale(); + Refresh(); +} + +void DiffPresetDialog::update_compatibility(const std::string& preset_name, Preset::Type type, PresetBundle* preset_bundle) +{ + PresetCollection* presets = get_preset_collection(type, preset_bundle); + + bool print_tab = type == Preset::TYPE_PRINT || type == Preset::TYPE_SLA_PRINT; + bool printer_tab = type == Preset::TYPE_PRINTER; + bool technology_changed = false; + + if (printer_tab) { + const Preset& new_printer_preset = *presets->find_preset(preset_name, true); + const PresetWithVendorProfile new_printer_preset_with_vendor_profile = presets->get_preset_with_vendor_profile(new_printer_preset); + PrinterTechnology old_printer_technology = presets->get_selected_preset().printer_technology(); + PrinterTechnology new_printer_technology = new_printer_preset.printer_technology(); + + technology_changed = old_printer_technology != new_printer_technology; + } + + bool is_selected = presets->select_preset_by_name(preset_name, false); + + // 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; + }; + if (print_tab || printer_tab) + preset_bundle->update_compatible( + update_compatible_type(technology_changed, print_tab, true), + update_compatible_type(technology_changed, false, true)); + + bool is_left_presets = preset_bundle == m_preset_bundle_left.get(); + PrinterTechnology pr_tech = preset_bundle->printers.get_selected_preset().printer_technology(); + + // update preset comboboxes + for (auto preset_combos : m_preset_combos) + { + PresetComboBox* cb = is_left_presets ? preset_combos.presets_left : preset_combos.presets_right; + Preset::Type presets_type = cb->get_type(); + if (print_tab && (pr_tech == ptFFF && presets_type == Preset::TYPE_FILAMENT || + pr_tech == ptSLA && presets_type == Preset::TYPE_SLA_MATERIAL) || + printer_tab && (pr_tech == ptFFF && (presets_type == Preset::TYPE_PRINT || presets_type == Preset::TYPE_FILAMENT) || + pr_tech == ptSLA && (presets_type == Preset::TYPE_SLA_PRINT || presets_type == Preset::TYPE_SLA_MATERIAL))) + cb->update(); + } + + if (technology_changed && + m_preset_bundle_left.get()->printers.get_selected_preset().printer_technology() == + m_preset_bundle_right.get()->printers.get_selected_preset().printer_technology()) + { + m_pr_technology = m_preset_bundle_left.get()->printers.get_edited_preset().printer_technology(); + update_controls_visibility(); + } +} } diff --git a/src/slic3r/GUI/UnsavedChangesDialog.hpp b/src/slic3r/GUI/UnsavedChangesDialog.hpp index 232802b661a..12c215e568f 100644 --- a/src/slic3r/GUI/UnsavedChangesDialog.hpp +++ b/src/slic3r/GUI/UnsavedChangesDialog.hpp @@ -7,7 +7,7 @@ #include "GUI_Utils.hpp" #include "wxExtensions.hpp" -#include "libslic3r/Preset.hpp" +#include "libslic3r/PresetBundle.hpp" class ScalableButton; class wxStaticText; @@ -16,10 +16,11 @@ namespace Slic3r { namespace GUI{ // ---------------------------------------------------------------------------- -// ModelNode: a node inside UnsavedChangesModel +// ModelNode: a node inside DiffModel // ---------------------------------------------------------------------------- class ModelNode; +class PresetComboBox; using ModelNodePtrArray = std::vector>; // On all of 3 different platforms Bitmap+Text icon column looks different @@ -42,17 +43,6 @@ class ModelNode wxString m_old_color; wxString m_new_color; - // TODO/FIXME: - // the GTK version of wxDVC (in particular wxDataViewCtrlInternal::ItemAdded) - // needs to know in advance if a node is or _will be_ a container. - // Thus implementing: - // bool IsContainer() const - // { return m_children.size()>0; } - // doesn't work with wxGTK when UnsavedChangesModel::AddToClassical is called - // AND the classical node was removed (a new node temporary without children - // would be added to the control) - bool m_container {true}; - #ifdef __linux__ wxIcon get_bitmap(const wxString& color); #else @@ -75,6 +65,17 @@ class ModelNode wxString m_old_value; wxString m_new_value; + // TODO/FIXME: + // the GTK version of wxDVC (in particular wxDataViewCtrlInternal::ItemAdded) + // needs to know in advance if a node is or _will be_ a container. + // Thus implementing: + // bool IsContainer() const + // { return m_children.size()>0; } + // doesn't work with wxGTK when DiffModel::AddToClassical is called + // AND the classical node was removed (a new node temporary without children + // would be added to the control) + bool m_container {true}; + // preset(root) node ModelNode(Preset::Type preset_type, wxWindow* parent_win, const wxString& text, const std::string& icon_name); @@ -107,13 +108,13 @@ class ModelNode // ---------------------------------------------------------------------------- -// UnsavedChangesModel +// DiffModel // ---------------------------------------------------------------------------- -class UnsavedChangesModel : public wxDataViewModel +class DiffModel : public wxDataViewModel { wxWindow* m_parent_win { nullptr }; - std::vector m_preset_nodes; + ModelNodePtrArray m_preset_nodes; wxDataViewCtrl* m_ctrl{ nullptr }; @@ -143,8 +144,8 @@ class UnsavedChangesModel : public wxDataViewModel colMax }; - UnsavedChangesModel(wxWindow* parent); - ~UnsavedChangesModel(); + DiffModel(wxWindow* parent); + ~DiffModel() {} void SetAssociatedControl(wxDataViewCtrl* ctrl) { m_ctrl = ctrl; } @@ -159,6 +160,9 @@ class UnsavedChangesModel : public wxDataViewModel wxString GetColumnType(unsigned int col) const override; void Rescale(); + wxDataViewItem Delete(const wxDataViewItem& item); + void Clear(); + wxDataViewItem GetParent(const wxDataViewItem& item) const override; unsigned int GetChildren(const wxDataViewItem& parent, wxDataViewItemArray& array) const override; @@ -173,14 +177,60 @@ class UnsavedChangesModel : public wxDataViewModel }; +// ---------------------------------------------------------------------------- +// DiffViewCtrl +// ---------------------------------------------------------------------------- + +class DiffViewCtrl : public wxDataViewCtrl +{ + bool m_has_long_strings{ false }; + bool m_empty_selection { false }; + int m_em_unit; + + struct ItemData + { + std::string opt_key; + wxString opt_name; + wxString old_val; + wxString new_val; + Preset::Type type; + bool is_long{ false }; + }; + + // tree items related to the options + std::map m_items_map; + std::map m_columns_width; + +public: + DiffViewCtrl(wxWindow* parent, wxSize size); + ~DiffViewCtrl() {} + + DiffModel* model{ nullptr }; + + void AppendBmpTextColumn(const wxString& label, unsigned model_column, int width, bool set_expander = false); + void AppendToggleColumn_(const wxString& label, unsigned model_column, int width); + void Rescale(int em = 0); + void Append(const std::string& opt_key, Preset::Type type, wxString category_name, wxString group_name, wxString option_name, + wxString old_value, wxString new_value, const std::string category_icon_name); + void Clear(); + + wxString get_short_string(wxString full_string); + bool has_selection() { return !m_empty_selection; } + void context_menu(wxDataViewEvent& event); + void item_value_changed(wxDataViewEvent& event); + void set_em_unit(int em) { m_em_unit = em; } + + std::vector unselected_options(Preset::Type type); + std::vector selected_options(); +}; + + //------------------------------------------ // UnsavedChangesDialog //------------------------------------------ class UnsavedChangesDialog : public DPIDialog { - wxDataViewCtrl* m_tree { nullptr }; - UnsavedChangesModel* m_tree_model { nullptr }; - + DiffViewCtrl* m_tree { nullptr }; ScalableButton* m_save_btn { nullptr }; ScalableButton* m_transfer_btn { nullptr }; ScalableButton* m_discard_btn { nullptr }; @@ -188,7 +238,6 @@ class UnsavedChangesDialog : public DPIDialog wxStaticText* m_info_line { nullptr }; wxCheckBox* m_remember_choice { nullptr }; - bool m_empty_selection { false }; bool m_has_long_strings { false }; int m_save_btn_id { wxID_ANY }; int m_move_btn_id { wxID_ANY }; @@ -209,19 +258,6 @@ class UnsavedChangesDialog : public DPIDialog // selected action after Dialog closing Action m_exit_action {Action::Undef}; - - struct ItemData - { - std::string opt_key; - wxString opt_name; - wxString old_val; - wxString new_val; - Preset::Type type; - bool is_long {false}; - }; - // tree items related to the options - std::map m_items_map; - // preset names which are modified in SavePresetDialog and related types std::vector> names_and_types; @@ -230,13 +266,9 @@ class UnsavedChangesDialog : public DPIDialog UnsavedChangesDialog(Preset::Type type, PresetCollection* dependent_presets, const std::string& new_selected_preset); ~UnsavedChangesDialog() {} - wxString get_short_string(wxString full_string); - void build(Preset::Type type, PresetCollection* dependent_presets, const std::string& new_selected_preset, const wxString& header = ""); void update(Preset::Type type, PresetCollection* dependent_presets, const std::string& new_selected_preset, const wxString& header); void update_tree(Preset::Type type, PresetCollection *presets); - void item_value_changed(wxDataViewEvent &event); - void context_menu(wxDataViewEvent &event); void show_info_line(Action action, std::string preset_name = ""); void update_config(Action action); void close(Action action); @@ -251,8 +283,8 @@ class UnsavedChangesDialog : public DPIDialog // short version of the previous function, for the case, when just one preset is modified std::string get_preset_name() { return names_and_types[0].first; } - std::vector get_unselected_options(Preset::Type type); - std::vector get_selected_options(); + std::vector get_unselected_options(Preset::Type type) { return m_tree->unselected_options(type); } + std::vector get_selected_options() { return m_tree->selected_options(); } protected: void on_dpi_changed(const wxRect& suggested_rect) override; @@ -270,6 +302,48 @@ class FullCompareDialog : public wxDialog ~FullCompareDialog() {} }; + +//------------------------------------------ +// DiffPresetDialog +//------------------------------------------ +class DiffPresetDialog : public DPIDialog +{ + DiffViewCtrl* m_tree { nullptr }; + wxStaticText* m_top_info_line { nullptr }; + wxStaticText* m_bottom_info_line { nullptr }; + wxCheckBox* m_show_all_presets { nullptr }; + + Preset::Type m_view_type { Preset::TYPE_INVALID }; + PrinterTechnology m_pr_technology; + std::unique_ptr m_preset_bundle_left; + std::unique_ptr m_preset_bundle_right; + + void update_tree(); + void update_bundles_from_app(); + void update_controls_visibility(Preset::Type type = Preset::TYPE_INVALID); + void update_compatibility(const std::string& preset_name, Preset::Type type, PresetBundle* preset_bundle); + + struct DiffPresets + { + PresetComboBox* presets_left { nullptr }; + ScalableButton* equal_bmp { nullptr }; + PresetComboBox* presets_right { nullptr }; + }; + + std::vector m_preset_combos; + +public: + DiffPresetDialog(); + ~DiffPresetDialog() {} + + void show(Preset::Type type = Preset::TYPE_INVALID); + void update_presets(Preset::Type type = Preset::TYPE_INVALID); + +protected: + void on_dpi_changed(const wxRect& suggested_rect) override; + void on_sys_color_changed() override; +}; + } } From 580f5044ba00b4107e8aff0bce3a18b56ab3bdda Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Thu, 4 Feb 2021 10:02:25 +0100 Subject: [PATCH 113/143] Fixed compilation on OSX --- src/slic3r/GUI/GUI_ObjectList.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 14aebcb3a19..94e55ce5c45 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -13,6 +13,7 @@ #include "libslic3r/Model.hpp" #include "GLCanvas3D.hpp" #include "Selection.hpp" +#include "format.hpp" #include #include "slic3r/Utils/FixModelByWin10.hpp" From d415c8ae8c9633a4d0b57e9e33358a5a649f7fcf Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 4 Feb 2021 10:15:29 +0100 Subject: [PATCH 114/143] MSW specific: GUI_ManipulatinPanel: Fixed rescaling of the system coordinate ComboBox --- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index b3cef47c55d..e9c873509e8 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -76,6 +76,7 @@ static choice_ctrl* create_word_local_combo(wxWindow *parent) void msw_rescale_word_local_combo(choice_ctrl* combo) { +#ifdef __WXOSX__ const wxString selection = combo->GetString(combo->GetSelection()); /* To correct scaling (set new controll size) of a wxBitmapCombobox @@ -97,6 +98,9 @@ void msw_rescale_word_local_combo(choice_ctrl* combo) combo->Append(_L("Local coordinates")); combo->SetValue(selection); +#else + combo->SetMinSize(wxSize(15 * wxGetApp().em_unit(), -1)); +#endif } static void set_font_and_background_style(wxWindow* win, const wxFont& font) From 3dd07dfd732754f8bab2cb85abb26123cedcb3df Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Thu, 4 Feb 2021 11:18:39 +0100 Subject: [PATCH 115/143] Fix of brim generator after refactoring. --- src/libslic3r/Brim.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index 0e677e8b7a9..ba4291446ce 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -288,16 +288,16 @@ static void make_inner_brim(const Print &print, const ConstPrintObjectPtrs &top_ { Flow flow = print.brim_flow(); ExPolygons islands_ex = inner_brim_area(print, top_level_objects_with_brim, flow.scaled_spacing()); - ExPolygons loops_ex; + Polygons loops; islands_ex = offset_ex(islands_ex, -0.5f * float(flow.scaled_spacing()), jtSquare); for (size_t i = 0; !islands_ex.empty(); ++i) { for (ExPolygon &poly_ex : islands_ex) poly_ex.douglas_peucker(SCALED_RESOLUTION); - expolygons_append(loops_ex, islands_ex); + polygons_append(loops, to_polygons(islands_ex)); islands_ex = offset_ex(islands_ex, -float(flow.scaled_spacing()), jtSquare); } - Polygons loops = union_pt_chained_outside_in(loops, false); + loops = union_pt_chained_outside_in(loops, false); std::reverse(loops.begin(), loops.end()); extrusion_entities_append_loops(brim.entities, std::move(loops), erSkirt, float(flow.mm3_per_mm()), float(flow.width), float(print.skirt_first_layer_height())); From d1dfbb31abff520a429783e35c6a6658b3f290f5 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Thu, 4 Feb 2021 13:59:59 +0100 Subject: [PATCH 116/143] WIP: Fixing brim generator unit tests by disabling connect_brim_lines() --- src/libslic3r/Brim.cpp | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index ba4291446ce..43931908c74 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -11,6 +11,10 @@ #include #include +#ifndef NDEBUG + // #define BRIM_DEBUG_TO_SVG +#endif + namespace Slic3r { static void append_and_translate(ExPolygons &dst, const ExPolygons &src, const PrintInstance &instance) { @@ -346,7 +350,30 @@ ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cance loops_pl_by_levels.clear(); optimize_polylines_by_reversing(&all_loops); - all_loops = connect_brim_lines(std::move(all_loops), offset(islands_area_ex,SCALED_EPSILON), flow.scaled_spacing() * 2); + +#ifdef BRIM_DEBUG_TO_SVG + static int irun = 0; + ++ irun; + + { + SVG svg(debug_out_path("brim-%d.svg", irun).c_str(), get_extents(all_loops)); + svg.draw(union_ex(islands), "blue"); + svg.draw(islands_area_ex, "green"); + svg.draw(all_loops, "black", coord_t(scale_(0.1))); + } +#endif // BRIM_DEBUG_TO_SVG + +//FIXME WIP this breaks unit tests. +// all_loops = connect_brim_lines(std::move(all_loops), offset(islands_area_ex,SCALED_EPSILON), flow.scaled_spacing() * 2); + +#ifdef BRIM_DEBUG_TO_SVG + { + SVG svg(debug_out_path("brim-connected-%d.svg", irun).c_str(), get_extents(all_loops)); + svg.draw(union_ex(islands), "blue"); + svg.draw(islands_area_ex, "green"); + svg.draw(all_loops, "black", coord_t(scale_(0.1))); + } +#endif // BRIM_DEBUG_TO_SVG const bool could_brim_intersects_skirt = std::any_of(print.objects().begin(), print.objects().end(), [&print](PrintObject *object) { const BrimType &bt = object->config().brim_type; @@ -483,7 +510,6 @@ ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cance } make_inner_brim(print, top_level_objects_with_brim, brim); - return brim; } From 1fff5a624ceaa80bfb278fea9015618366f3d79b Mon Sep 17 00:00:00 2001 From: Scott Mudge Date: Thu, 28 Jan 2021 16:03:12 -0500 Subject: [PATCH 117/143] Add border to filament color in combo box to improve visibility of light filaments. --- src/slic3r/GUI/BitmapCache.cpp | 26 +++++++++++++++++++++++++- src/slic3r/GUI/BitmapCache.hpp | 4 ++-- src/slic3r/GUI/PresetComboBoxes.cpp | 4 ++-- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp index c553f372898..f6562b29966 100644 --- a/src/slic3r/GUI/BitmapCache.cpp +++ b/src/slic3r/GUI/BitmapCache.cpp @@ -338,7 +338,7 @@ wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_ } //we make scaled solid bitmaps only for the cases, when its will be used with scaled SVG icon in one output bitmap -wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling/* = false*/) +wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling/* = false*/, size_t border_width /*= 0*/) { double scale = suppress_scaling ? 1.0f : m_scale; width *= scale; @@ -354,6 +354,30 @@ wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsi *imgdata ++ = b; *imgalpha ++ = transparency; } + + // Add border, make white/light spools easier to see + if (border_width > 0) { + + // Restrict to width of image + if (border_width > height) border_width = height - 1; + if (border_width > width) border_width = width - 1; + + auto px_data = (uint8_t*)image.GetData(); + auto a_data = (uint8_t*)image.GetAlpha(); + + for (size_t x = 0; x < width; ++x) { + for (size_t y = 0; y < height; ++y) { + if (x < border_width || y < border_width || + x >= (width - border_width) || y >= (height - border_width)) { + const size_t idx = (x + y * width); + const size_t idx_rgb = (x + y * width) * 3; + px_data[idx_rgb] = px_data[idx_rgb + 1] = px_data[idx_rgb + 2] = 0u; + a_data[idx] = 255u; + } + } + } + } + return wxImage_to_wxBitmap_with_alpha(std::move(image), scale); } diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp index 429b7dfd922..629733b520d 100644 --- a/src/slic3r/GUI/BitmapCache.hpp +++ b/src/slic3r/GUI/BitmapCache.hpp @@ -35,8 +35,8 @@ class BitmapCache // Load svg from resources/icons. bitmap_key is given without the .svg suffix. SVG will be rasterized to provided height/width. wxBitmap* load_svg(const std::string &bitmap_key, unsigned width = 0, unsigned height = 0, const bool grayscale = false, const bool dark_mode = false); - wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling = false); - wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE, suppress_scaling); } + wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling = false, size_t border_width = 0); + wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false, size_t border_width = 0) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE, suppress_scaling, border_width); } wxBitmap mkclear(size_t width, size_t height) { return mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT); } static bool parse_color(const std::string& scolor, unsigned char* rgb_out); diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index 38d45f1720d..e3ef37c0cea 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -427,10 +427,10 @@ wxBitmap* PresetComboBox::get_bmp( std::string bitmap_key, bool wide_icons, con unsigned char rgb[3]; // Paint the color bars. bitmap_cache().parse_color(filament_rgb, rgb); - bmps.emplace_back(bitmap_cache().mksolid(is_single_bar ? wide_icon_width : norm_icon_width, icon_height, rgb)); + bmps.emplace_back(bitmap_cache().mksolid(is_single_bar ? wide_icon_width : norm_icon_width, icon_height, rgb, false, 1)); if (!is_single_bar) { bitmap_cache().parse_color(extruder_rgb, rgb); - bmps.emplace_back(bitmap_cache().mksolid(thin_icon_width, icon_height, rgb)); + bmps.emplace_back(bitmap_cache().mksolid(thin_icon_width, icon_height, rgb, false, 1)); } // Paint a lock at the system presets. bmps.emplace_back(bitmap_cache().mkclear(space_icon_width, icon_height)); From ab6cc7085efb04d34d18aa402720dff9e1bc5d06 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Thu, 4 Feb 2021 15:48:36 +0100 Subject: [PATCH 118/143] WIP Brim improvements: Fix of connecting the brim polylines: Don't connect closed contours. Some optimizations, documentation etc. --- src/libslic3r/Brim.cpp | 78 +++++++++++++++++++++++--------------- src/libslic3r/EdgeGrid.cpp | 5 --- src/libslic3r/EdgeGrid.hpp | 7 ++-- 3 files changed, 52 insertions(+), 38 deletions(-) diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index 43931908c74..9f18405b7e4 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -34,9 +34,9 @@ static void append_and_translate(Polygons &dst, const Polygons &src, const Print static float max_brim_width(const ConstPrintObjectPtrsAdaptor &objects) { assert(!objects.empty()); - return float(std::accumulate(objects.begin() + 1, objects.end(), objects.front()->config().brim_width.value, + return float(std::accumulate(objects.begin(), objects.end(), 0., [](double partial_result, const PrintObject *object) { - return std::max(partial_result, object->config().brim_width.value); + return std::max(partial_result, object->config().brim_type == btNoBrim ? 0. : object->config().brim_width.value); })); } @@ -46,6 +46,7 @@ static ConstPrintObjectPtrs get_top_level_objects_with_brim(const Print &print) ConstPrintObjectPtrs island_to_object; for (const PrintObject *object : print.objects()) { Polygons islands_object; + islands_object.reserve(object->layers().front()->lslices.size()); for (const ExPolygon &ex_poly : object->layers().front()->lslices) islands_object.emplace_back(ex_poly.contour); @@ -101,6 +102,7 @@ static Polygons top_level_outer_brim_islands(const ConstPrintObjectPtrs &top_lev { Polygons islands; for (const PrintObject *object : top_level_objects_with_brim) { + //FIXME how about the brim type? float brim_offset = float(scale_(object->config().brim_offset.value)); Polygons islands_object; for (const ExPolygon &ex_poly : object->layers().front()->lslices) { @@ -206,6 +208,7 @@ static ExPolygons inner_brim_area(const Print &print, const ConstPrintObjectPtrs return diff_ex(intersection_ex(to_polygons(std::move(brim_area)), holes), no_brim_area); } +// Flip orientation of open polylines to minimize travel distance. static void optimize_polylines_by_reversing(Polylines *polylines) { for (size_t poly_idx = 1; poly_idx < polylines->size(); ++poly_idx) { @@ -216,23 +219,24 @@ static void optimize_polylines_by_reversing(Polylines *polylines) double dist_to_start = (next.first_point() - prev.last_point()).cast().norm(); double dist_to_end = (next.last_point() - prev.last_point()).cast().norm(); - if (dist_to_end < dist_to_start) next.reverse(); + if (dist_to_end < dist_to_start) + next.reverse(); } } } static Polylines connect_brim_lines(Polylines &&polylines, const Polygons &brim_area, float max_connection_length) { - EdgeGrid::Grid grid; - BoundingBox bbox(get_extents(polylines)); - bbox.offset(SCALED_EPSILON); - grid.set_bbox(bbox); + if (polylines.empty()) + return Polylines(); std::vector polylines_points(polylines.size() + brim_area.size()); for (const Polyline &poly : polylines) polylines_points[&poly - &polylines.front()] = poly.points; for (const Polygon &poly : brim_area) polylines_points.emplace_back(poly.points); + + EdgeGrid::Grid grid(get_extents(polylines).inflated(SCALED_EPSILON)); grid.create(polylines_points, coord_t(scale_(10.))); struct Visitor @@ -262,30 +266,44 @@ static Polylines connect_brim_lines(Polylines &&polylines, const Polygons &brim_ } visitor(grid); - Polyline *prev = &polylines.front(); - for (size_t poly_idx = 1; poly_idx < polylines.size(); ++poly_idx) { - Polyline &next = polylines[poly_idx]; - - double dist = Line(prev->last_point(), next.first_point()).length(); - if (dist <= max_connection_length) { - visitor.brim_line.a = prev->last_point(); - visitor.brim_line.b = next.first_point(); - visitor.brim_line.extend(-SCALED_EPSILON); - grid.visit_cells_intersecting_line(visitor.brim_line.a, visitor.brim_line.b, visitor); - if (!visitor.intersect) - append(prev->points, std::move(next.points)); - else - prev = &next; + // Connect successive polylines if they are open, their ends are closer than max_connection_length. + // Remove empty polylines. + { + // Skip initial empty lines. + size_t poly_idx = 0; + for (; poly_idx < polylines.size() && polylines[poly_idx].empty(); ++ poly_idx) ; + size_t end = ++ poly_idx; + double max_connection_length2 = Slic3r::sqr(max_connection_length); + for (; poly_idx < polylines.size(); ++poly_idx) { + Polyline &next = polylines[poly_idx]; + if (! next.empty()) { + Polyline &prev = polylines[end - 1]; + bool connect = false; + if (! prev.is_closed() && ! next.is_closed()) { + double dist2 = (prev.last_point() - next.first_point()).cast().squaredNorm(); + if (dist2 <= max_connection_length2) { + visitor.brim_line.a = prev.last_point(); + visitor.brim_line.b = next.first_point(); + // Shrink the connection line to avoid collisions with the brim centerlines. + visitor.brim_line.extend(-SCALED_EPSILON); + grid.visit_cells_intersecting_line(visitor.brim_line.a, visitor.brim_line.b, visitor); + connect = ! visitor.intersect; + } + } + if (connect) { + append(prev.points, std::move(next.points)); + } else { + if (end < poly_idx) + polylines[end] = std::move(next); + ++ end; + } + } } + if (end < polylines.size()) + polylines.erase(polylines.begin() + end, polylines.end()); } - Polylines polylines_out; - polylines_out.reserve(std::count_if(polylines.begin(), polylines.end(), [](const Polyline &pl) { return !pl.empty(); })); - for (Polyline &pl : polylines) - if (!pl.empty()) - polylines_out.emplace_back(std::move(pl)); - - return polylines_out; + return polylines; } static void make_inner_brim(const Print &print, const ConstPrintObjectPtrs &top_level_objects_with_brim, ExtrusionEntityCollection &brim) @@ -349,6 +367,7 @@ ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cance append(all_loops, std::move(polylines)); loops_pl_by_levels.clear(); + // Flip orientation of open polylines to minimize travel distance. optimize_polylines_by_reversing(&all_loops); #ifdef BRIM_DEBUG_TO_SVG @@ -363,8 +382,7 @@ ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cance } #endif // BRIM_DEBUG_TO_SVG -//FIXME WIP this breaks unit tests. -// all_loops = connect_brim_lines(std::move(all_loops), offset(islands_area_ex,SCALED_EPSILON), flow.scaled_spacing() * 2); + all_loops = connect_brim_lines(std::move(all_loops), offset(islands_area_ex,SCALED_EPSILON), flow.scaled_spacing() * 2); #ifdef BRIM_DEBUG_TO_SVG { diff --git a/src/libslic3r/EdgeGrid.cpp b/src/libslic3r/EdgeGrid.cpp index 7bab590f7ff..e5e8718c3f7 100644 --- a/src/libslic3r/EdgeGrid.cpp +++ b/src/libslic3r/EdgeGrid.cpp @@ -25,11 +25,6 @@ namespace Slic3r { -EdgeGrid::Grid::Grid() : - m_rows(0), m_cols(0) -{ -} - EdgeGrid::Grid::~Grid() { m_contours.clear(); diff --git a/src/libslic3r/EdgeGrid.hpp b/src/libslic3r/EdgeGrid.hpp index 7b5e3905cec..ef09e28dd08 100644 --- a/src/libslic3r/EdgeGrid.hpp +++ b/src/libslic3r/EdgeGrid.hpp @@ -15,7 +15,8 @@ namespace EdgeGrid { class Grid { public: - Grid(); + Grid() = default; + Grid(const BoundingBox &bbox) : m_bbox(bbox) {} ~Grid(); void set_bbox(const BoundingBox &bbox) { m_bbox = bbox; } @@ -295,8 +296,8 @@ class Grid BoundingBox m_bbox; // Grid dimensions. coord_t m_resolution; - size_t m_rows; - size_t m_cols; + size_t m_rows = 0; + size_t m_cols = 0; // Referencing the source contours. // This format allows one to work with any Slic3r fixed point contour format From 6f89da1f394561c7338676a1c8e8e72faeb85aad Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 4 Feb 2021 20:31:50 +0100 Subject: [PATCH 119/143] Disable libicu for boost-regex Should have been disabled from the beginning --- deps/deps-linux.cmake | 1 + deps/deps-macos.cmake | 1 + deps/deps-windows.cmake | 1 + 3 files changed, 3 insertions(+) diff --git a/deps/deps-linux.cmake b/deps/deps-linux.cmake index 2da28909762..35522504cab 100644 --- a/deps/deps-linux.cmake +++ b/deps/deps-linux.cmake @@ -26,6 +26,7 @@ ExternalProject_Add(dep_boost variant=release threading=multi boost.locale.icu=off + --disable-icu cflags=-fPIC cxxflags=-fPIC install diff --git a/deps/deps-macos.cmake b/deps/deps-macos.cmake index bf9501ca028..53ba008c3e5 100644 --- a/deps/deps-macos.cmake +++ b/deps/deps-macos.cmake @@ -33,6 +33,7 @@ ExternalProject_Add(dep_boost variant=release threading=multi boost.locale.icu=off + --disable-icu "cflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET}" "cxxflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET}" "mflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET}" diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake index 81d52b84246..c0d80bb291d 100644 --- a/deps/deps-windows.cmake +++ b/deps/deps-windows.cmake @@ -76,6 +76,7 @@ ExternalProject_Add(dep_boost variant=release threading=multi boost.locale.icu=off + --disable-icu "${DEP_BOOST_DEBUG}" release install INSTALL_COMMAND "" # b2 does that already ) From 5f86d11c74dbdb0a4aa955b358493f69bf72b5c1 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 5 Feb 2021 11:20:04 +0100 Subject: [PATCH 120/143] EdgeGrid refactoring to support both open and closed contours. Squashed commit of the following: commit 4e13a8fe19abcc9aae39a9bc4c7953a743196504 Merge: 6ae766409 6f89da1f3 Author: Vojtech Bubnik Date: Fri Feb 5 11:19:35 2021 +0100 Merge remote-tracking branch 'remotes/origin/master' into vb_edgegrid_open_lines commit 6ae76640942269993c942861f0444088843e3fa1 Author: Vojtech Bubnik Date: Fri Feb 5 11:14:48 2021 +0100 EdgeGrid enhancement to accept both the open and closed lines. commit 36a5efcd558bd5fd5f46b5f561387a2c73221553 Author: Vojtech Bubnik Date: Fri Feb 5 10:52:14 2021 +0100 EdgeGrid improvements: Documentation, one bug fix after recent refactoring. commit 6f89da1f394561c7338676a1c8e8e72faeb85aad Author: tamasmeszaros Date: Thu Feb 4 20:31:50 2021 +0100 Disable libicu for boost-regex Should have been disabled from the beginning commit ffc77b1a72a0be9b5622fd33defeebb24bf07b34 Author: Vojtech Bubnik Date: Thu Feb 4 18:40:33 2021 +0100 EdgeGrid: Annotated those methods that do not work with open contours. commit 8039a645b4bf0c46c99b90a9c34e7189d7442f86 Author: Vojtech Bubnik Date: Thu Feb 4 18:28:21 2021 +0100 Refactoring of EdgeGrid structure to support both closed and open lines. --- src/libslic3r/Brim.cpp | 13 +- src/libslic3r/EdgeGrid.cpp | 243 +++++++++--------- src/libslic3r/EdgeGrid.hpp | 95 ++++++- src/libslic3r/ElephantFootCompensation.cpp | 60 +++-- src/libslic3r/Fill/FillBase.cpp | 2 +- .../GCode/AvoidCrossingPerimeters.cpp | 46 ++-- 6 files changed, 272 insertions(+), 187 deletions(-) diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index 9f18405b7e4..0dc52881951 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -230,14 +230,11 @@ static Polylines connect_brim_lines(Polylines &&polylines, const Polygons &brim_ if (polylines.empty()) return Polylines(); - std::vector polylines_points(polylines.size() + brim_area.size()); - for (const Polyline &poly : polylines) - polylines_points[&poly - &polylines.front()] = poly.points; - for (const Polygon &poly : brim_area) - polylines_points.emplace_back(poly.points); - - EdgeGrid::Grid grid(get_extents(polylines).inflated(SCALED_EPSILON)); - grid.create(polylines_points, coord_t(scale_(10.))); + BoundingBox bbox = get_extents(polylines); + bbox.merge(get_extents(brim_area)); + + EdgeGrid::Grid grid(bbox.inflated(SCALED_EPSILON)); + grid.create(brim_area, polylines, coord_t(scale_(10.))); struct Visitor { diff --git a/src/libslic3r/EdgeGrid.cpp b/src/libslic3r/EdgeGrid.cpp index e5e8718c3f7..5e541ab69c1 100644 --- a/src/libslic3r/EdgeGrid.cpp +++ b/src/libslic3r/EdgeGrid.cpp @@ -34,76 +34,82 @@ EdgeGrid::Grid::~Grid() void EdgeGrid::Grid::create(const Polygons &polygons, coord_t resolution) { - // Count the contours. - size_t ncontours = 0; - for (size_t j = 0; j < polygons.size(); ++ j) - if (! polygons[j].points.empty()) - ++ ncontours; - // Collect the contours. - m_contours.assign(ncontours, nullptr); - ncontours = 0; - for (size_t j = 0; j < polygons.size(); ++ j) - if (! polygons[j].points.empty()) - m_contours[ncontours ++] = &polygons[j].points; + m_contours.reserve(std::count_if(polygons.begin(), polygons.end(), [](const Polygon &p) { return ! p.empty(); })); + for (const Polygon &polygon : polygons) + if (! polygon.empty()) + m_contours.emplace_back(polygon.points, false); create_from_m_contours(resolution); } void EdgeGrid::Grid::create(const std::vector &polygons, coord_t resolution) { - // Count the contours. - size_t ncontours = 0; - for (size_t j = 0; j < polygons.size(); ++ j) - if (! polygons[j]->points.empty()) - ++ ncontours; - // Collect the contours. - m_contours.assign(ncontours, nullptr); - ncontours = 0; - for (size_t j = 0; j < polygons.size(); ++ j) - if (! polygons[j]->points.empty()) - m_contours[ncontours ++] = &polygons[j]->points; + m_contours.reserve(std::count_if(polygons.begin(), polygons.end(), [](const Polygon *p) { return ! p->empty(); })); + for (const Polygon *polygon : polygons) + if (! polygon->empty()) + m_contours.emplace_back(polygon->points, false); create_from_m_contours(resolution); } -void EdgeGrid::Grid::create(const std::vector &polygons, coord_t resolution) +void EdgeGrid::Grid::create(const std::vector &polygons, coord_t resolution, bool open_polylines) { - // Count the contours. - size_t ncontours = 0; - for (size_t j = 0; j < polygons.size(); ++ j) - if (! polygons[j].empty()) - ++ ncontours; + // Collect the contours. + m_contours.reserve(std::count_if(polygons.begin(), polygons.end(), [](const Points &p) { return p.size() > 1; })); + for (const Points &points : polygons) + if (points.size() > 1) { + const Point *begin = points.data(); + const Point *end = points.data() + points.size(); + bool open = open_polylines; + if (open_polylines) { + if (*begin == end[-1]) { + open = false; + -- end; + } + } else + assert(*begin != end[-1]); + m_contours.emplace_back(begin, end, open); + } + create_from_m_contours(resolution); +} + +void EdgeGrid::Grid::create(const Polygons &polygons, const Polylines &polylines, coord_t resolution) +{ // Collect the contours. - m_contours.assign(ncontours, nullptr); - ncontours = 0; - for (size_t j = 0; j < polygons.size(); ++ j) - if (! polygons[j].empty()) - m_contours[ncontours ++] = &polygons[j]; + m_contours.reserve( + std::count_if(polygons.begin(), polygons.end(), [](const Polygon &p) { return p.size() > 1; }) + + std::count_if(polylines.begin(), polylines.end(), [](const Polyline &p) { return p.size() > 1; })); + + for (const Polyline &polyline : polylines) + if (polyline.size() > 1) { + const Point *begin = polyline.points.data(); + const Point *end = polyline.points.data() + polyline.size(); + bool open = true; + if (*begin == end[-1]) { + open = false; + -- end; + } + m_contours.emplace_back(begin, end, open); + } + + for (const Polygon &polygon : polygons) + if (polygon.size() > 1) + m_contours.emplace_back(polygon.points, false); create_from_m_contours(resolution); } void EdgeGrid::Grid::create(const ExPolygon &expoly, coord_t resolution) { - // Count the contours. - size_t ncontours = 0; - if (! expoly.contour.points.empty()) - ++ ncontours; - for (size_t j = 0; j < expoly.holes.size(); ++ j) - if (! expoly.holes[j].points.empty()) - ++ ncontours; - - // Collect the contours. - m_contours.assign(ncontours, nullptr); - ncontours = 0; - if (! expoly.contour.points.empty()) - m_contours[ncontours++] = &expoly.contour.points; - for (size_t j = 0; j < expoly.holes.size(); ++ j) - if (! expoly.holes[j].points.empty()) - m_contours[ncontours++] = &expoly.holes[j].points; + m_contours.reserve((expoly.contour.empty() ? 0 : 1) + std::count_if(expoly.holes.begin(), expoly.holes.end(), [](const Polygon &p) { return ! p.empty(); })); + if (! expoly.contour.empty()) + m_contours.emplace_back(expoly.contour.points, false); + for (const Polygon &hole : expoly.holes) + if (! hole.empty()) + m_contours.emplace_back(hole.points, false); create_from_m_contours(resolution); } @@ -112,25 +118,20 @@ void EdgeGrid::Grid::create(const ExPolygons &expolygons, coord_t resolution) { // Count the contours. size_t ncontours = 0; - for (size_t i = 0; i < expolygons.size(); ++ i) { - const ExPolygon &expoly = expolygons[i]; - if (! expoly.contour.points.empty()) + for (const ExPolygon &expoly : expolygons) { + if (! expoly.contour.empty()) ++ ncontours; - for (size_t j = 0; j < expoly.holes.size(); ++ j) - if (! expoly.holes[j].points.empty()) - ++ ncontours; + ncontours += std::count_if(expoly.holes.begin(), expoly.holes.end(), [](const Polygon &p) { return ! p.empty(); }); } // Collect the contours. - m_contours.assign(ncontours, nullptr); - ncontours = 0; - for (size_t i = 0; i < expolygons.size(); ++ i) { - const ExPolygon &expoly = expolygons[i]; - if (! expoly.contour.points.empty()) - m_contours[ncontours++] = &expoly.contour.points; - for (size_t j = 0; j < expoly.holes.size(); ++ j) - if (! expoly.holes[j].points.empty()) - m_contours[ncontours++] = &expoly.holes[j].points; + m_contours.reserve(ncontours); + for (const ExPolygon &expoly : expolygons) { + if (! expoly.contour.empty()) + m_contours.emplace_back(expoly.contour.points, false); + for (const Polygon &hole : expoly.holes) + if (! hole.empty()) + m_contours.emplace_back(hole.points, false); } create_from_m_contours(resolution); @@ -146,11 +147,13 @@ void EdgeGrid::Grid::create_from_m_contours(coord_t resolution) { assert(resolution > 0); // 1) Measure the bounding box. - for (size_t i = 0; i < m_contours.size(); ++ i) { - const Slic3r::Points &pts = *m_contours[i]; - for (size_t j = 0; j < pts.size(); ++ j) - m_bbox.merge(pts[j]); + for (const Contour &contour : m_contours) { + assert(contour.num_segments() > 0); + assert(*contour.begin() != contour.end()[-1]); + for (const Slic3r::Point &pt : contour) + m_bbox.merge(pt); } + coord_t eps = 16; m_bbox.min(0) -= eps; m_bbox.min(1) -= eps; @@ -165,11 +168,11 @@ void EdgeGrid::Grid::create_from_m_contours(coord_t resolution) // 3) First round of contour rasterization, count the edges per grid cell. for (size_t i = 0; i < m_contours.size(); ++ i) { - const Slic3r::Points &pts = *m_contours[i]; - for (size_t j = 0; j < pts.size(); ++ j) { + const Contour &contour = m_contours[i]; + for (size_t j = 0; j < contour.num_segments(); ++ j) { // End points of the line segment. - Slic3r::Point p1(pts[j]); - Slic3r::Point p2 = pts[(j + 1 == pts.size()) ? 0 : j + 1]; + Slic3r::Point p1(contour.segment_start(j)); + Slic3r::Point p2(contour.segment_end(j)); p1(0) -= m_bbox.min(0); p1(1) -= m_bbox.min(1); p2(0) -= m_bbox.min(0); @@ -328,9 +331,9 @@ void EdgeGrid::Grid::create_from_m_contours(coord_t resolution) assert(visitor.i == 0); for (; visitor.i < m_contours.size(); ++ visitor.i) { - const Slic3r::Points &pts = *m_contours[visitor.i]; - for (visitor.j = 0; visitor.j < pts.size(); ++ visitor.j) - this->visit_cells_intersecting_line(pts[visitor.j], pts[(visitor.j + 1 == pts.size()) ? 0 : visitor.j + 1], visitor); + const Contour &contour = m_contours[visitor.i]; + for (visitor.j = 0; visitor.j < contour.num_segments(); ++ visitor.j) + this->visit_cells_intersecting_line(contour.segment_start(visitor.j), contour.segment_end(visitor.j), visitor); } } @@ -696,11 +699,12 @@ void EdgeGrid::Grid::calculate_sdf() const Cell &cell = m_cells[r * m_cols + c]; // For each segment in the cell: for (size_t i = cell.begin; i != cell.end; ++ i) { - const Slic3r::Points &pts = *m_contours[m_cell_data[i].first]; + const Contour &contour = m_contours[m_cell_data[i].first]; + assert(contour.closed()); size_t ipt = m_cell_data[i].second; // End points of the line segment. - const Slic3r::Point &p1 = pts[ipt]; - const Slic3r::Point &p2 = pts[(ipt + 1 == pts.size()) ? 0 : ipt + 1]; + const Slic3r::Point &p1 = contour.segment_start(ipt); + const Slic3r::Point &p2 = contour.segment_end(ipt); // Segment vector const Slic3r::Point v_seg = p2 - p1; // l2 of v_seg @@ -724,7 +728,7 @@ void EdgeGrid::Grid::calculate_sdf() double dabs = sqrt(int64_t(v_pt(0)) * int64_t(v_pt(0)) + int64_t(v_pt(1)) * int64_t(v_pt(1))); if (dabs < d_min) { // Previous point. - const Slic3r::Point &p0 = pts[(ipt == 0) ? (pts.size() - 1) : ipt - 1]; + const Slic3r::Point &p0 = contour.segment_prev(ipt); Slic3r::Point v_seg_prev = p1 - p0; int64_t t2_pt = int64_t(v_seg_prev(0)) * int64_t(v_pt(0)) + int64_t(v_seg_prev(1)) * int64_t(v_pt(1)); if (t2_pt > 0) { @@ -1044,7 +1048,7 @@ float EdgeGrid::Grid::signed_distance_bilinear(const Point &pt) const return f; } -EdgeGrid::Grid::ClosestPointResult EdgeGrid::Grid::closest_point(const Point &pt, coord_t search_radius) const +EdgeGrid::Grid::ClosestPointResult EdgeGrid::Grid::closest_point_signed_distance(const Point &pt, coord_t search_radius) const { BoundingBox bbox; bbox.min = bbox.max = Point(pt(0) - m_bbox.min(0), pt(1) - m_bbox.min(1)); @@ -1083,12 +1087,13 @@ EdgeGrid::Grid::ClosestPointResult EdgeGrid::Grid::closest_point(const Point &pt for (int c = bbox.min(0); c <= bbox.max(0); ++ c) { const Cell &cell = m_cells[r * m_cols + c]; for (size_t i = cell.begin; i < cell.end; ++ i) { - const size_t contour_idx = m_cell_data[i].first; - const Slic3r::Points &pts = *m_contours[contour_idx]; + const size_t contour_idx = m_cell_data[i].first; + const Contour &contour = m_contours[contour_idx]; + assert(contour.closed()); size_t ipt = m_cell_data[i].second; // End points of the line segment. - const Slic3r::Point &p1 = pts[ipt]; - const Slic3r::Point &p2 = pts[(ipt + 1 == pts.size()) ? 0 : ipt + 1]; + const Slic3r::Point &p1 = contour.segment_start(ipt); + const Slic3r::Point &p2 = contour.segment_end(ipt); const Slic3r::Point v_seg = p2 - p1; const Slic3r::Point v_pt = pt - p1; // dot(p2-p1, pt-p1) @@ -1100,7 +1105,7 @@ EdgeGrid::Grid::ClosestPointResult EdgeGrid::Grid::closest_point(const Point &pt double dabs = sqrt(int64_t(v_pt(0)) * int64_t(v_pt(0)) + int64_t(v_pt(1)) * int64_t(v_pt(1))); if (dabs < d_min) { // Previous point. - const Slic3r::Point &p0 = pts[(ipt == 0) ? (pts.size() - 1) : ipt - 1]; + const Slic3r::Point &p0 = contour.segment_prev(ipt); Slic3r::Point v_seg_prev = p1 - p0; int64_t t2_pt = int64_t(v_seg_prev(0)) * int64_t(v_pt(0)) + int64_t(v_seg_prev(1)) * int64_t(v_pt(1)); if (t2_pt > 0) { @@ -1156,9 +1161,9 @@ EdgeGrid::Grid::ClosestPointResult EdgeGrid::Grid::closest_point(const Point &pt assert(result.t >= 0. && result.t <= 1.); #ifndef NDEBUG { - const Slic3r::Points &pts = *m_contours[result.contour_idx]; - const Slic3r::Point &p1 = pts[result.start_point_idx]; - const Slic3r::Point &p2 = pts[(result.start_point_idx + 1 == pts.size()) ? 0 : result.start_point_idx + 1]; + const Contour &contour = m_contours[result.contour_idx]; + const Slic3r::Point &p1 = contour.segment_start(result.start_point_idx); + const Slic3r::Point &p2 = contour.segment_end(result.start_point_idx); Vec2d vfoot; if (result.t == 0) vfoot = p1.cast() - pt.cast(); @@ -1212,11 +1217,12 @@ bool EdgeGrid::Grid::signed_distance_edges(const Point &pt, coord_t search_radiu for (int c = bbox.min(0); c <= bbox.max(0); ++ c) { const Cell &cell = m_cells[r * m_cols + c]; for (size_t i = cell.begin; i < cell.end; ++ i) { - const Slic3r::Points &pts = *m_contours[m_cell_data[i].first]; + const Contour &contour = m_contours[m_cell_data[i].first]; + assert(contour.closed()); size_t ipt = m_cell_data[i].second; // End points of the line segment. - const Slic3r::Point &p1 = pts[ipt]; - const Slic3r::Point &p2 = pts[(ipt + 1 == pts.size()) ? 0 : ipt + 1]; + const Slic3r::Point &p1 = contour.segment_start(ipt); + const Slic3r::Point &p2 = contour.segment_end(ipt); Slic3r::Point v_seg = p2 - p1; Slic3r::Point v_pt = pt - p1; // dot(p2-p1, pt-p1) @@ -1228,7 +1234,7 @@ bool EdgeGrid::Grid::signed_distance_edges(const Point &pt, coord_t search_radiu double dabs = sqrt(int64_t(v_pt(0)) * int64_t(v_pt(0)) + int64_t(v_pt(1)) * int64_t(v_pt(1))); if (dabs < d_min) { // Previous point. - const Slic3r::Point &p0 = pts[(ipt == 0) ? (pts.size() - 1) : ipt - 1]; + const Slic3r::Point &p0 = contour.segment_prev(ipt); Slic3r::Point v_seg_prev = p1 - p0; int64_t t2_pt = int64_t(v_seg_prev(0)) * int64_t(v_pt(0)) + int64_t(v_seg_prev(1)) * int64_t(v_pt(1)); if (t2_pt > 0) { @@ -1418,26 +1424,26 @@ std::vector> const Cell &cell = m_cells[r * m_cols + c]; // For each pair of segments in the cell: for (size_t i = cell.begin; i != cell.end; ++ i) { - const Slic3r::Points &ipts = *m_contours[m_cell_data[i].first]; + const Contour &icontour = m_contours[m_cell_data[i].first]; size_t ipt = m_cell_data[i].second; // End points of the line segment and their vector. - const Slic3r::Point &ip1 = ipts[ipt]; - const Slic3r::Point &ip2 = ipts[(ipt + 1 == ipts.size()) ? 0 : ipt + 1]; + const Slic3r::Point &ip1 = icontour.segment_start(ipt); + const Slic3r::Point &ip2 = icontour.segment_end(ipt); for (size_t j = i + 1; j != cell.end; ++ j) { - const Slic3r::Points &jpts = *m_contours[m_cell_data[j].first]; - size_t jpt = m_cell_data[j].second; + const Contour &jcontour = m_contours[m_cell_data[j].first]; + size_t jpt = m_cell_data[j].second; // End points of the line segment and their vector. - const Slic3r::Point &jp1 = jpts[jpt]; - const Slic3r::Point &jp2 = jpts[(jpt + 1 == jpts.size()) ? 0 : jpt + 1]; - if (&ipts == &jpts && (&ip1 == &jp2 || &jp1 == &ip2)) + const Slic3r::Point &jp1 = jcontour.segment_start(jpt); + const Slic3r::Point &jp2 = jcontour.segment_end(jpt); + if (&icontour == &jcontour && (&ip1 == &jp2 || &jp1 == &ip2)) // Segments of the same contour share a common vertex. continue; if (Geometry::segments_intersect(ip1, ip2, jp1, jp2)) { // The two segments intersect. Add them to the output. - int jfirst = (&jpts < &ipts) || (&jpts == &ipts && jpt < ipt); + int jfirst = (&jcontour < &icontour) || (&jcontour == &icontour && jpt < ipt); out.emplace_back(jfirst ? - std::make_pair(std::make_pair(&ipts, ipt), std::make_pair(&jpts, jpt)) : - std::make_pair(std::make_pair(&ipts, ipt), std::make_pair(&jpts, jpt))); + std::make_pair(std::make_pair(&icontour, ipt), std::make_pair(&jcontour, jpt)) : + std::make_pair(std::make_pair(&icontour, ipt), std::make_pair(&jcontour, jpt))); } } } @@ -1455,18 +1461,18 @@ bool EdgeGrid::Grid::has_intersecting_edges() const const Cell &cell = m_cells[r * m_cols + c]; // For each pair of segments in the cell: for (size_t i = cell.begin; i != cell.end; ++ i) { - const Slic3r::Points &ipts = *m_contours[m_cell_data[i].first]; + const Contour &icontour = m_contours[m_cell_data[i].first]; size_t ipt = m_cell_data[i].second; // End points of the line segment and their vector. - const Slic3r::Point &ip1 = ipts[ipt]; - const Slic3r::Point &ip2 = ipts[(ipt + 1 == ipts.size()) ? 0 : ipt + 1]; + const Slic3r::Point &ip1 = icontour.segment_start(ipt); + const Slic3r::Point &ip2 = icontour.segment_end(ipt); for (size_t j = i + 1; j != cell.end; ++ j) { - const Slic3r::Points &jpts = *m_contours[m_cell_data[j].first]; + const Contour &jcontour = m_contours[m_cell_data[j].first]; size_t jpt = m_cell_data[j].second; // End points of the line segment and their vector. - const Slic3r::Point &jp1 = jpts[jpt]; - const Slic3r::Point &jp2 = jpts[(jpt + 1 == jpts.size()) ? 0 : jpt + 1]; - if (! (&ipts == &jpts && (&ip1 == &jp2 || &jp1 == &ip2)) && + const Slic3r::Point &jp1 = jcontour.segment_start(jpt); + const Slic3r::Point &jp2 = jcontour.segment_end(jpt); + if (! (&icontour == &jcontour && (&ip1 == &jp2 || &jp1 == &ip2)) && Geometry::segments_intersect(ip1, ip2, jp1, jp2)) return true; } @@ -1601,22 +1607,27 @@ void export_intersections_to_svg(const std::string &filename, const Polygons &po SVG svg(filename.c_str(), bbox); svg.draw(union_ex(polygons), "gray", 0.25f); svg.draw_outline(polygons, "black"); - std::set intersecting_contours; + std::set intersecting_contours; for (const std::pair &ie : intersections) { intersecting_contours.insert(ie.first.first); intersecting_contours.insert(ie.second.first); } // Highlight the contours with intersections. coord_t line_width = coord_t(scale_(0.01)); - for (const Points *ic : intersecting_contours) { - svg.draw_outline(Polygon(*ic), "green"); - svg.draw_outline(Polygon(*ic), "black", line_width); + for (const EdgeGrid::Contour *ic : intersecting_contours) { + if (ic->open()) + svg.draw(Polyline(Points(ic->begin(), ic->end())), "green"); + else { + Polygon polygon(Points(ic->begin(), ic->end())); + svg.draw_outline(polygon, "green"); + svg.draw_outline(polygon, "black", line_width); + } } // Paint the intersections. for (const std::pair &intersecting_edges : intersections) { auto edge = [](const EdgeGrid::Grid::ContourEdge &e) { - return Line(e.first->at(e.second), - e.first->at((e.second + 1 == e.first->size()) ? 0 : e.second + 1)); + return Line(e.first->segment_start(e.second), + e.first->segment_end(e.second)); }; svg.draw(edge(intersecting_edges.first), "red", line_width); svg.draw(edge(intersecting_edges.second), "red", line_width); diff --git a/src/libslic3r/EdgeGrid.hpp b/src/libslic3r/EdgeGrid.hpp index ef09e28dd08..42d8d92c2f8 100644 --- a/src/libslic3r/EdgeGrid.hpp +++ b/src/libslic3r/EdgeGrid.hpp @@ -12,6 +12,63 @@ namespace Slic3r { namespace EdgeGrid { + +class Contour { +public: + Contour() = default; + Contour(const Slic3r::Point *begin, const Slic3r::Point *end, bool open) : m_begin(begin), m_end(end), m_open(open) {} + Contour(const Slic3r::Point *data, size_t size, bool open) : Contour(data, data + size, open) {} + Contour(const std::vector &pts, bool open) : Contour(pts.data(), pts.size(), open) {} + + const Slic3r::Point *begin() const { return m_begin; } + const Slic3r::Point *end() const { return m_end; } + bool open() const { return m_open; } + bool closed() const { return ! m_open; } + + // Start point of a segment idx. + const Slic3r::Point& segment_start(size_t idx) const { + assert(idx < this->num_segments()); + return m_begin[idx]; + } + + // End point of a segment idx. + const Slic3r::Point& segment_end(size_t idx) const { + assert(idx < this->num_segments()); + const Slic3r::Point *ptr = m_begin + idx + 1; + return ptr == m_end ? *m_begin : *ptr; + } + + // Start point of a segment preceding idx. + const Slic3r::Point& segment_prev(size_t idx) const { + assert(idx < this->num_segments()); + assert(idx > 0 || ! m_open); + return idx == 0 ? m_end[-1] : m_begin[idx - 1]; + } + + // Index of a segment preceding idx. + const size_t segment_idx_prev(size_t idx) const { + assert(idx < this->num_segments()); + assert(idx > 0 || ! m_open); + return (idx == 0 ? this->size() : idx) - 1; + } + + // Index of a segment preceding idx. + const size_t segment_idx_next(size_t idx) const { + assert(idx < this->num_segments()); + ++ idx; + return m_begin + idx == m_end ? 0 : idx; + } + + size_t num_segments() const { return this->size() - (m_open ? 1 : 0); } + +private: + size_t size() const { return m_end - m_begin; } + + const Slic3r::Point *m_begin { nullptr }; + const Slic3r::Point *m_end { nullptr }; + bool m_open { false }; +}; + class Grid { public: @@ -21,14 +78,24 @@ class Grid void set_bbox(const BoundingBox &bbox) { m_bbox = bbox; } + // Fill in the grid with open polylines or closed contours. + // If open flag is indicated, then polylines_or_polygons are considered to be open by default. + // Only if the first point of a polyline is equal to the last point of a polyline, + // then the polyline is considered to be closed and the last repeated point is removed when + // inserted into the EdgeGrid. + // Most of the Grid functions expect all the contours to be closed, you have been warned! + void create(const std::vector &polylines_or_polygons, coord_t resolution, bool open); + void create(const Polygons &polygons, const Polylines &polylines, coord_t resolution); + + // Fill in the grid with closed contours. void create(const Polygons &polygons, coord_t resolution); void create(const std::vector &polygons, coord_t resolution); - void create(const std::vector &polygons, coord_t resolution); + void create(const std::vector &polygons, coord_t resolution) { this->create(polygons, resolution, false); } void create(const ExPolygon &expoly, coord_t resolution); void create(const ExPolygons &expolygons, coord_t resolution); void create(const ExPolygonCollection &expolygons, coord_t resolution); - const std::vector& contours() const { return m_contours; } + const std::vector& contours() const { return m_contours; } #if 0 // Test, whether the edges inside the grid intersect with the polygons provided. @@ -45,12 +112,14 @@ class Grid // Fill in a rough m_signed_distance_field from the edge grid. // The rough SDF is used by signed_distance() for distances outside of the search_radius. + // Only call this function for closed contours! void calculate_sdf(); // Return an estimate of the signed distance based on m_signed_distance_field grid. float signed_distance_bilinear(const Point &pt) const; // Calculate a signed distance to the contours in search_radius from the point. + // Only call this function for closed contours! struct ClosestPointResult { size_t contour_idx = size_t(-1); size_t start_point_idx = size_t(-1); @@ -61,12 +130,14 @@ class Grid bool valid() const { return contour_idx != size_t(-1); } }; - ClosestPointResult closest_point(const Point &pt, coord_t search_radius) const; + ClosestPointResult closest_point_signed_distance(const Point &pt, coord_t search_radius) const; + // Only call this function for closed contours! bool signed_distance_edges(const Point &pt, coord_t search_radius, coordf_t &result_min_dist, bool *pon_segment = nullptr) const; // Calculate a signed distance to the contours in search_radius from the point. If no edge is found in search_radius, // return an interpolated value from m_signed_distance_field, if it exists. + // Only call this function for closed contours! bool signed_distance(const Point &pt, coord_t search_radius, coordf_t &result_min_dist) const; const BoundingBox& bbox() const { return m_bbox; } @@ -77,8 +148,8 @@ class Grid // For supports: Contours enclosing the rasterized edges. Polygons contours_simplified(coord_t offset, bool fill_holes) const; - typedef std::pair ContourPoint; - typedef std::pair ContourEdge; + typedef std::pair ContourPoint; + typedef std::pair ContourEdge; std::vector> intersecting_edges() const; bool has_intersecting_edges() const; @@ -256,16 +327,16 @@ class Grid std::pair segment(const std::pair &contour_and_segment_idx) const { - const Slic3r::Points &ipts = *m_contours[contour_and_segment_idx.first]; - size_t ipt = contour_and_segment_idx.second; - return std::pair(ipts[ipt], ipts[ipt + 1 == ipts.size() ? 0 : ipt + 1]); + const Contour &contour = m_contours[contour_and_segment_idx.first]; + size_t iseg = contour_and_segment_idx.second; + return std::pair(contour.segment_start(iseg), contour.segment_end(iseg)); } Line line(const std::pair &contour_and_segment_idx) const { - const Slic3r::Points &ipts = *m_contours[contour_and_segment_idx.first]; - size_t ipt = contour_and_segment_idx.second; - return Line(ipts[ipt], ipts[ipt + 1 == ipts.size() ? 0 : ipt + 1]); + const Contour &contour = m_contours[contour_and_segment_idx.first]; + size_t iseg = contour_and_segment_idx.second; + return Line(contour.segment_start(iseg), contour.segment_end(iseg)); } protected: @@ -302,7 +373,7 @@ class Grid // Referencing the source contours. // This format allows one to work with any Slic3r fixed point contour format // (Polygon, ExPolygon, ExPolygonCollection etc). - std::vector m_contours; + std::vector m_contours; // Referencing a contour and a line segment of m_contours. std::vector > m_cell_data; diff --git a/src/libslic3r/ElephantFootCompensation.cpp b/src/libslic3r/ElephantFootCompensation.cpp index 1e50ade5abe..9610582f776 100644 --- a/src/libslic3r/ElephantFootCompensation.cpp +++ b/src/libslic3r/ElephantFootCompensation.cpp @@ -104,7 +104,7 @@ std::vector contour_distance(const EdgeGrid::Grid &grid, const size_t idx double param_hi; double param_end = resampled_point_parameters.back().curve_parameter; { - const Slic3r::Points &ipts = *grid.contours()[it_contour_and_segment->first]; + const EdgeGrid::Contour &contour = grid.contours()[it_contour_and_segment->first]; size_t ipt = it_contour_and_segment->second; ResampledPoint key(ipt, false, 0.); auto lower = [](const ResampledPoint& l, const ResampledPoint r) { return l.idx_src < r.idx_src || (l.idx_src == r.idx_src && int(l.interpolated) > int(r.interpolated)); }; @@ -112,7 +112,7 @@ std::vector contour_distance(const EdgeGrid::Grid &grid, const size_t idx assert(it != resampled_point_parameters.end() && it->idx_src == ipt && ! it->interpolated); double t2 = cross2(dir, vptpt2) / denom; assert(t2 > - EPSILON && t2 < 1. + EPSILON); - if (++ ipt == ipts.size()) + if (contour.begin() + (++ ipt) == contour.end()) param_hi = t2 * dir2.norm(); else param_hi = it->curve_parameter + t2 * dir2.norm(); @@ -251,7 +251,7 @@ std::vector contour_distance2(const EdgeGrid::Grid &grid, const size_t id #endif struct Visitor { Visitor(const EdgeGrid::Grid &grid, const size_t idx_contour, const std::vector &resampled_point_parameters, double dist_same_contour_accept, double dist_same_contour_reject) : - grid(grid), idx_contour(idx_contour), contour(*grid.contours()[idx_contour]), resampled_point_parameters(resampled_point_parameters), dist_same_contour_accept(dist_same_contour_accept), dist_same_contour_reject(dist_same_contour_reject) {} + grid(grid), idx_contour(idx_contour), contour(grid.contours()[idx_contour]), resampled_point_parameters(resampled_point_parameters), dist_same_contour_accept(dist_same_contour_accept), dist_same_contour_reject(dist_same_contour_reject) {} void init(const Points &contour, const Point &apoint) { this->idx_point = &apoint - contour.data(); @@ -283,15 +283,15 @@ std::vector contour_distance2(const EdgeGrid::Grid &grid, const size_t id double param_lo = resampled_point_parameters[this->idx_point].curve_parameter; double param_hi; double param_end = resampled_point_parameters.back().curve_parameter; - const Slic3r::Points &ipts = *grid.contours()[it_contour_and_segment->first]; - const size_t ipt = it_contour_and_segment->second; + const EdgeGrid::Contour &contour = grid.contours()[it_contour_and_segment->first]; + const size_t ipt = it_contour_and_segment->second; { ResampledPoint key(ipt, false, 0.); auto lower = [](const ResampledPoint& l, const ResampledPoint r) { return l.idx_src < r.idx_src || (l.idx_src == r.idx_src && int(l.interpolated) > int(r.interpolated)); }; auto it = std::lower_bound(resampled_point_parameters.begin(), resampled_point_parameters.end(), key, lower); assert(it != resampled_point_parameters.end() && it->idx_src == ipt && ! it->interpolated); param_hi = t * sqrt(l2); - if (ipt + 1 < ipts.size()) + if (contour.begin() + ipt + 1 < contour.end()) param_hi += it->curve_parameter; } if (param_lo > param_hi) @@ -307,9 +307,9 @@ std::vector contour_distance2(const EdgeGrid::Grid &grid, const size_t id // Bulge is estimated by 0.6 of the circle circumference drawn around the bisector. // Test whether the contour is convex or concave. bool inside = - (t == 0.) ? this->inside_corner(ipts, ipt, this->point) : - (t == 1.) ? this->inside_corner(ipts, ipt + 1 == ipts.size() ? 0 : ipt + 1, this->point) : - this->left_of_segment(ipts, ipt, this->point); + (t == 0.) ? this->inside_corner(contour, ipt, this->point) : + (t == 1.) ? this->inside_corner(contour, contour.segment_idx_next(ipt), this->point) : + this->left_of_segment(contour, ipt, this->point); accept = inside && dist_along_contour > 0.6 * M_PI * dist; } } @@ -329,7 +329,7 @@ std::vector contour_distance2(const EdgeGrid::Grid &grid, const size_t id const EdgeGrid::Grid &grid; const size_t idx_contour; - const Points &contour; + const EdgeGrid::Contour &contour; const std::vector &resampled_point_parameters; const double dist_same_contour_accept; const double dist_same_contour_reject; @@ -358,24 +358,28 @@ std::vector contour_distance2(const EdgeGrid::Grid &grid, const size_t id return Vec2d(- v.y(), v.x()); } - static bool inside_corner(const Slic3r::Points &contour, size_t i, const Point &pt_oposite) { - const Vec2d pt = pt_oposite.cast(); - size_t iprev = prev_idx_modulo(i, contour); - size_t inext = next_idx_modulo(i, contour); - Vec2d v1 = (contour[i] - contour[iprev]).cast(); - Vec2d v2 = (contour[inext] - contour[i]).cast(); - bool left_of_v1 = cross2(v1, pt - contour[iprev].cast()) > 0.; - bool left_of_v2 = cross2(v2, pt - contour[i ].cast()) > 0.; - return cross2(v1, v2) > 0 ? - left_of_v1 && left_of_v2 : // convex corner - left_of_v1 || left_of_v2; // concave corner - } - static bool left_of_segment(const Slic3r::Points &contour, size_t i, const Point &pt_oposite) { - const Vec2d pt = pt_oposite.cast(); - size_t inext = next_idx_modulo(i, contour); - Vec2d v = (contour[inext] - contour[i]).cast(); - return cross2(v, pt - contour[i].cast()) > 0.; - } + static bool inside_corner(const EdgeGrid::Contour &contour, size_t i, const Point &pt_oposite) + { + const Vec2d pt = pt_oposite.cast(); + const Point &pt_prev = contour.segment_prev(i); + const Point &pt_this = contour.segment_start(i); + const Point &pt_next = contour.segment_end(i); + Vec2d v1 = (pt_this - pt_prev).cast(); + Vec2d v2 = (pt_next - pt_this).cast(); + bool left_of_v1 = cross2(v1, pt - pt_prev.cast()) > 0.; + bool left_of_v2 = cross2(v2, pt - pt_this.cast()) > 0.; + return cross2(v1, v2) > 0 ? left_of_v1 && left_of_v2 : // convex corner + left_of_v1 || left_of_v2; // concave corner + } + + static bool left_of_segment(const EdgeGrid::Contour &contour, size_t i, const Point &pt_oposite) + { + const Vec2d pt = pt_oposite.cast(); + const Point &pt_this = contour.segment_start(i); + const Point &pt_next = contour.segment_end(i); + Vec2d v = (pt_next - pt_this).cast(); + return cross2(v, pt - pt_this.cast()) > 0.; + } } visitor(grid, idx_contour, resampled_point_parameters, 0.5 * compensation * M_PI, search_radius); out.reserve(contour.size()); diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index af53907c798..6ebc6023c46 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -1129,7 +1129,7 @@ void Fill::connect_infill(Polylines &&infill_ordered, const std::vector contour_distance(const EdgeGrid::Grid &grid, { struct Visitor { Visitor(const EdgeGrid::Grid &grid, const size_t contour_idx, const std::vector &polygon_distances, double dist_same_contour_accept, double dist_same_contour_reject) : - grid(grid), idx_contour(contour_idx), contour(*grid.contours()[contour_idx]), boundary_parameters(polygon_distances), dist_same_contour_accept(dist_same_contour_accept), dist_same_contour_reject(dist_same_contour_reject) {} + grid(grid), idx_contour(contour_idx), contour(grid.contours()[contour_idx]), boundary_parameters(polygon_distances), dist_same_contour_accept(dist_same_contour_accept), dist_same_contour_reject(dist_same_contour_reject) {} void init(const Points &contour, const Point &apoint) { @@ -630,12 +630,12 @@ static std::vector contour_distance(const EdgeGrid::Grid &grid, // Complex case: The closest segment originates from the same contour as the starting point. // Reject the closest point if its distance along the contour is reasonable compared to the current contour bisector // (this->pt, foot). - const Slic3r::Points &ipts = *grid.contours()[it_contour_and_segment->first]; - double param_lo = boundary_parameters[this->idx_point]; - double param_hi = t * sqrt(l2); - double param_end = boundary_parameters.back(); + const EdgeGrid::Contour &contour = grid.contours()[it_contour_and_segment->first]; + double param_lo = boundary_parameters[this->idx_point]; + double param_hi = t * sqrt(l2); + double param_end = boundary_parameters.back(); const size_t ipt = it_contour_and_segment->second; - if (ipt + 1 < ipts.size()) + if (contour.begin() + ipt + 1 < contour.end()) param_hi += boundary_parameters[ipt > 0 ? ipt - 1 : 0]; if (param_lo > param_hi) std::swap(param_lo, param_hi); @@ -649,9 +649,9 @@ static std::vector contour_distance(const EdgeGrid::Grid &grid, // longer than the bisector. That is, the path shall not bulge away from the bisector too much. // Bulge is estimated by 0.6 of the circle circumference drawn around the bisector. // Test whether the contour is convex or concave. - bool inside = (t == 0.) ? this->inside_corner(ipts, ipt, this->point) : - (t == 1.) ? this->inside_corner(ipts, ipt + 1 == ipts.size() ? 0 : ipt + 1, this->point) : - this->left_of_segment(ipts, ipt, this->point); + bool inside = (t == 0.) ? this->inside_corner(contour, ipt, this->point) : + (t == 1.) ? this->inside_corner(contour, contour.segment_idx_next(ipt), this->point) : + this->left_of_segment(contour, ipt, this->point); accept = inside && dist_along_contour > 0.6 * M_PI * dist; } } @@ -668,7 +668,7 @@ static std::vector contour_distance(const EdgeGrid::Grid &grid, const EdgeGrid::Grid &grid; const size_t idx_contour; - const Points &contour; + const EdgeGrid::Contour &contour; const std::vector &boundary_parameters; const double dist_same_contour_accept; @@ -691,25 +691,27 @@ static std::vector contour_distance(const EdgeGrid::Grid &grid, return Vec2d(-v1.y() - v2.y(), v1.x() + v2.x()); } - static bool inside_corner(const Slic3r::Points &contour, size_t i, const Point &pt_oposite) + static bool inside_corner(const EdgeGrid::Contour &contour, size_t i, const Point &pt_oposite) { const Vec2d pt = pt_oposite.cast(); - size_t iprev = prev_idx_modulo(i, contour); - size_t inext = next_idx_modulo(i, contour); - Vec2d v1 = (contour[i] - contour[iprev]).cast(); - Vec2d v2 = (contour[inext] - contour[i]).cast(); - bool left_of_v1 = cross2(v1, pt - contour[iprev].cast()) > 0.; - bool left_of_v2 = cross2(v2, pt - contour[i].cast()) > 0.; + const Point &pt_prev = contour.segment_prev(i); + const Point &pt_this = contour.segment_start(i); + const Point &pt_next = contour.segment_end(i); + Vec2d v1 = (pt_this - pt_prev).cast(); + Vec2d v2 = (pt_next - pt_this).cast(); + bool left_of_v1 = cross2(v1, pt - pt_prev.cast()) > 0.; + bool left_of_v2 = cross2(v2, pt - pt_this.cast()) > 0.; return cross2(v1, v2) > 0 ? left_of_v1 && left_of_v2 : // convex corner left_of_v1 || left_of_v2; // concave corner } - static bool left_of_segment(const Slic3r::Points &contour, size_t i, const Point &pt_oposite) + static bool left_of_segment(const EdgeGrid::Contour &contour, size_t i, const Point &pt_oposite) { - const Vec2d pt = pt_oposite.cast(); - size_t inext = next_idx_modulo(i, contour); - Vec2d v = (contour[inext] - contour[i]).cast(); - return cross2(v, pt - contour[i].cast()) > 0.; + const Vec2d pt = pt_oposite.cast(); + const Point &pt_this = contour.segment_start(i); + const Point &pt_next = contour.segment_end(i); + Vec2d v = (pt_next - pt_this).cast(); + return cross2(v, pt - pt_this.cast()) > 0.; } } visitor(grid, contour_idx, poly_distances, 0.5 * compensation * M_PI, search_radius); From 76a92e40befc9ce57d7436170786435041e56ab1 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 5 Feb 2021 11:53:39 +0100 Subject: [PATCH 121/143] Toolpaths rendering - Reduced number of triangles per segment --- src/libslic3r/Technologies.hpp | 1 + src/slic3r/GUI/GCodeViewer.cpp | 423 ++++++++++++++++++++++++++++----- src/slic3r/GUI/GCodeViewer.hpp | 82 ++++++- 3 files changed, 440 insertions(+), 66 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 27f6719affd..0b8ac250fa9 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -115,6 +115,7 @@ #define ENABLE_SPLITTED_VERTEX_BUFFER (1 && ENABLE_2_3_1_ALPHA1) #define ENABLE_RELOAD_FROM_DISK_FOR_3MF (1 && ENABLE_2_3_1_ALPHA1) +#define ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS (1 && ENABLE_SPLITTED_VERTEX_BUFFER) #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 8fac1373331..e6c5f21de67 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -240,6 +240,23 @@ GCodeViewer::Color GCodeViewer::Extrusions::Range::get_color_at(float value) con return ret; } +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS +GCodeViewer::SequentialRangeCap::~SequentialRangeCap() { + if (ibo > 0) + glsafe(::glDeleteBuffers(1, &ibo)); +} + +void GCodeViewer::SequentialRangeCap::reset() { + if (ibo > 0) + glsafe(::glDeleteBuffers(1, &ibo)); + + buffer = nullptr; + ibo = 0; + vbo = 0; + color = { 0.0f, 0.0f, 0.0f }; +} +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + void GCodeViewer::SequentialView::Marker::init() { m_model.init_from(stilized_arrow(16, 2.0f, 4.0f, 1.0f, 8.0f)); @@ -574,7 +591,7 @@ void GCodeViewer::render() const auto init_gl_data = [this]() { // initializes opengl data of TBuffers for (size_t i = 0; i < m_buffers.size(); ++i) { - TBuffer& buffer = m_buffers[i]; + TBuffer& buffer = const_cast(m_buffers[i]); switch (buffer_type(i)) { default: { break; } @@ -600,17 +617,17 @@ void GCodeViewer::render() const } // initializes tool marker - m_sequential_view.marker.init(); + const_cast(&m_sequential_view)->marker.init(); // initializes point sizes std::array point_sizes; ::glGetIntegerv(GL_ALIASED_POINT_SIZE_RANGE, point_sizes.data()); - m_detected_point_sizes = { static_cast(point_sizes[0]), static_cast(point_sizes[1]) }; - m_gl_data_initialized = true; + *const_cast*>(&m_detected_point_sizes) = { static_cast(point_sizes[0]), static_cast(point_sizes[1]) }; + *const_cast(&m_gl_data_initialized) = true; }; #if ENABLE_GCODE_VIEWER_STATISTICS - m_statistics.reset_opengl(); + const_cast(&m_statistics)->reset_opengl(); #endif // ENABLE_GCODE_VIEWER_STATISTICS // OpenGL data must be initialized after the glContext has been created. @@ -623,9 +640,10 @@ void GCodeViewer::render() const glsafe(::glEnable(GL_DEPTH_TEST)); render_toolpaths(); - if (m_sequential_view.current.last != m_sequential_view.endpoints.last) { - m_sequential_view.marker.set_world_position(m_sequential_view.current_position); - m_sequential_view.marker.render(); + SequentialView* sequential_view = const_cast(&m_sequential_view); + if (sequential_view->current.last != sequential_view->endpoints.last) { + sequential_view->marker.set_world_position(sequential_view->current_position); + sequential_view->marker.render(); } render_shells(); render_legend(); @@ -1279,8 +1297,13 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) last_path.sub_paths.back().last = { vbuffer_id, vertices.size(), move_id, curr.position }; }; +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + auto add_indices_as_solid = [&](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, const GCodeProcessor::MoveVertex* next, + TBuffer& buffer, size_t& vbuffer_size, unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { +#else auto add_indices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, size_t& vbuffer_size, unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS static Vec3f prev_dir; static Vec3f prev_up; static float sq_prev_length; @@ -1293,7 +1316,40 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) store_triangle(indices, id, id, id); store_triangle(indices, id, id, id); }; - auto store_main_triangles = [&](IndexBuffer& indices, size_t vbuffer_size, const std::array& v_offsets) { +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + auto convert_vertices_offset = [](size_t vbuffer_size, const std::array& v_offsets) { + std::array ret = { + static_cast(static_cast(vbuffer_size) + v_offsets[0]), + static_cast(static_cast(vbuffer_size) + v_offsets[1]), + static_cast(static_cast(vbuffer_size) + v_offsets[2]), + static_cast(static_cast(vbuffer_size) + v_offsets[3]), + static_cast(static_cast(vbuffer_size) + v_offsets[4]), + static_cast(static_cast(vbuffer_size) + v_offsets[5]), + static_cast(static_cast(vbuffer_size) + v_offsets[6]), + static_cast(static_cast(vbuffer_size) + v_offsets[7]) + }; + return ret; + }; + auto append_starting_cap_triangles = [&](IndexBuffer& indices, const std::array& v_offsets) { + store_triangle(indices, v_offsets[0], v_offsets[2], v_offsets[1]); + store_triangle(indices, v_offsets[0], v_offsets[3], v_offsets[2]); + }; + auto append_stem_triangles = [&](IndexBuffer& indices, const std::array& v_offsets) { + store_triangle(indices, v_offsets[0], v_offsets[1], v_offsets[4]); + store_triangle(indices, v_offsets[1], v_offsets[5], v_offsets[4]); + store_triangle(indices, v_offsets[1], v_offsets[2], v_offsets[5]); + store_triangle(indices, v_offsets[2], v_offsets[6], v_offsets[5]); + store_triangle(indices, v_offsets[2], v_offsets[3], v_offsets[6]); + store_triangle(indices, v_offsets[3], v_offsets[7], v_offsets[6]); + store_triangle(indices, v_offsets[3], v_offsets[0], v_offsets[7]); + store_triangle(indices, v_offsets[0], v_offsets[4], v_offsets[7]); + }; + auto append_ending_cap_triangles = [&](IndexBuffer& indices, const std::array& v_offsets) { + store_triangle(indices, v_offsets[4], v_offsets[6], v_offsets[7]); + store_triangle(indices, v_offsets[4], v_offsets[5], v_offsets[6]); + }; +#else + auto append_stem_triangles = [&](IndexBuffer& indices, size_t vbuffer_size, const std::array& v_offsets) { std::array v_ids; for (size_t i = 0; i < v_ids.size(); ++i) { v_ids[i] = static_cast(static_cast(vbuffer_size) + v_offsets[i]); @@ -1317,6 +1373,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) store_triangle(indices, v_ids[4], v_ids[6], v_ids[7]); store_triangle(indices, v_ids[4], v_ids[5], v_ids[6]); }; +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { buffer.add_path(curr, ibuffer_id, indices.size(), move_id - 1); @@ -1330,14 +1387,28 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) Vec3f up = right.cross(dir); float sq_length = (curr.position - prev.position).squaredNorm(); +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + const std::array first_seg_v_offsets = convert_vertices_offset(vbuffer_size, { 0, 1, 2, 3, 4, 5, 6, 7 }); + const std::array non_first_seg_v_offsets = convert_vertices_offset(vbuffer_size, { -4, 0, -2, 1, 2, 3, 4, 5 }); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + if (last_path.vertices_count() == 1 || vbuffer_size == 0) { // 1st segment or restart into a new vertex buffer // =============================================== +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + if (last_path.vertices_count() == 1) + // starting cap triangles + append_starting_cap_triangles(indices, first_seg_v_offsets); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS // dummy triangles outer corner cap append_dummy_cap(indices, vbuffer_size); // stem triangles - store_main_triangles(indices, vbuffer_size, { 0, 1, 2, 3, 4, 5, 6, 7 }); +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + append_stem_triangles(indices, first_seg_v_offsets); +#else + append_stem_triangles(indices, vbuffer_size, { 0, 1, 2, 3, 4, 5, 6, 7 }); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS vbuffer_size += 8; } @@ -1391,11 +1462,21 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) } // stem triangles - store_main_triangles(indices, vbuffer_size, { -4, 0, -2, 1, 2, 3, 4, 5 }); +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + append_stem_triangles(indices, non_first_seg_v_offsets); +#else + append_stem_triangles(indices, vbuffer_size, { -4, 0, -2, 1, 2, 3, 4, 5 }); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS vbuffer_size += 6; } +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + if (next != nullptr && (curr.type != next->type || !last_path.matches(*next))) + // ending cap triangles + append_ending_cap_triangles(indices, non_first_seg_v_offsets); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + last_path.sub_paths.back().last = { ibuffer_id, indices.size() - 1, move_id, curr.position }; prev_dir = dir; prev_up = up; @@ -1635,6 +1716,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) } }; +#if ENABLE_GCODE_VIEWER_STATISTICS + auto load_vertices_time = std::chrono::high_resolution_clock::now(); + m_statistics.load_vertices = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + // smooth toolpaths corners for TBuffers using triangles for (size_t i = 0; i < m_buffers.size(); ++i) { const TBuffer& t_buffer = m_buffers[i]; @@ -1684,6 +1770,10 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) } } +#if ENABLE_GCODE_VIEWER_STATISTICS + auto smooth_vertices_time = std::chrono::high_resolution_clock::now(); + m_statistics.smooth_vertices = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - load_vertices_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS log_memory_usage("Loaded G-code generated vertex buffers ", vertices, indices); // dismiss vertices data, no more needed @@ -1712,6 +1802,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) continue; const GCodeProcessor::MoveVertex& prev = gcode_result.moves[i - 1]; +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + const GCodeProcessor::MoveVertex* next = nullptr; + if (i < m_moves_count - 1) + next = &gcode_result.moves[i + 1]; +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS ++progress_count; if (progress_dialog != nullptr && progress_count % progress_threshold == 0) { @@ -1735,7 +1830,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) // if adding the indices for the current segment exceeds the threshold size of the current index buffer // create another index buffer +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + if (i_multibuffer.back().size() * sizeof(IBufferType) >= IBUFFER_THRESHOLD_BYTES - t_buffer.max_indices_per_segment_size_bytes()) { +#else if (i_multibuffer.back().size() * sizeof(IBufferType) >= IBUFFER_THRESHOLD_BYTES - t_buffer.indices_per_segment_size_bytes()) { +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS i_multibuffer.push_back(IndexBuffer()); vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) { @@ -1774,7 +1873,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) break; } case TBuffer::ERenderPrimitiveType::Triangle: { +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + add_indices_as_solid(prev, curr, next, t_buffer, curr_vertex_buffer.second, static_cast(i_multibuffer.size()) - 1, i_buffer, i); +#else add_indices_as_solid(prev, curr, t_buffer, curr_vertex_buffer.second, static_cast(i_multibuffer.size()) - 1, i_buffer, i); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS break; } } @@ -1826,14 +1929,28 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) auto update_segments_count = [&](EMoveType type, int64_t& count) { unsigned int id = buffer_id(type); const MultiIndexBuffer& buffers = indices[id]; +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + int64_t indices_count = 0; + for (const IndexBuffer& buffer : buffers) { + indices_count += buffer.size(); + } + const TBuffer& t_buffer = m_buffers[id]; + if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) + indices_count -= static_cast(12 * t_buffer.paths.size()); // remove the starting + ending caps = 4 triangles + + count += indices_count / t_buffer.indices_per_segment(); +#else for (const IndexBuffer& buffer : buffers) { count += buffer.size() / m_buffers[id].indices_per_segment(); } +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS }; update_segments_count(EMoveType::Travel, m_statistics.travel_segments_count); update_segments_count(EMoveType::Wipe, m_statistics.wipe_segments_count); update_segments_count(EMoveType::Extrude, m_statistics.extrude_segments_count); + + m_statistics.load_indices = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - smooth_vertices_time).count(); #endif // ENABLE_GCODE_VIEWER_STATISTICS log_memory_usage("Loaded G-code generated indices buffers ", vertices, indices); @@ -2669,14 +2786,6 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool }; auto is_travel_in_layers_range = [this](size_t path_id, size_t min_id, size_t max_id) { - // auto is_in_z_range = [](const Path& path, double min_z, double max_z) { - // auto in_z_range = [min_z, max_z](double z) { - // return min_z - EPSILON < z && z < max_z + EPSILON; - // }; - // - // return in_z_range(path.sub_paths.front().first.position[2]) || in_z_range(path.sub_paths.back().last.position[2]); - // }; - const TBuffer& buffer = m_buffers[buffer_id(EMoveType::Travel)]; if (path_id >= buffer.paths.size()) return false; @@ -2703,19 +2812,22 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool }; #if ENABLE_GCODE_VIEWER_STATISTICS - m_statistics.render_paths_size = 0; + Statistics* statistics = const_cast(&m_statistics); + statistics->render_paths_size = 0; #endif // ENABLE_GCODE_VIEWER_STATISTICS bool top_layer_only = get_app_config()->get("seq_top_layer_only") == "1"; SequentialView::Endpoints global_endpoints = { m_moves_count , 0 }; SequentialView::Endpoints top_layer_endpoints = global_endpoints; - if (top_layer_only || !keep_sequential_current_first) m_sequential_view.current.first = 0; - if (!keep_sequential_current_last) m_sequential_view.current.last = m_moves_count; + SequentialView* sequential_view = const_cast(&m_sequential_view); + if (top_layer_only || !keep_sequential_current_first) sequential_view->current.first = 0; + if (!keep_sequential_current_last) sequential_view->current.last = m_moves_count; // first pass: collect visible paths and update sequential view data std::vector> paths; - for (TBuffer& buffer : m_buffers) { + for (size_t b = 0; b < m_buffers.size(); ++b) { + TBuffer& buffer = const_cast(m_buffers[b]); // reset render paths buffer.render_paths.clear(); @@ -2758,8 +2870,8 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool } // update current sequential position - m_sequential_view.current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(m_sequential_view.current.first, global_endpoints.first, global_endpoints.last) : global_endpoints.first; - m_sequential_view.current.last = keep_sequential_current_last ? std::clamp(m_sequential_view.current.last, global_endpoints.first, global_endpoints.last) : global_endpoints.last; + sequential_view->current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(sequential_view->current.first, global_endpoints.first, global_endpoints.last) : global_endpoints.first; + sequential_view->current.last = keep_sequential_current_last ? std::clamp(sequential_view->current.last, global_endpoints.first, global_endpoints.last) : global_endpoints.last; // get the world position from gpu bool found = false; @@ -2776,7 +2888,13 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool offset = 2 * offset - 1; else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { unsigned int indices_count = buffer.indices_per_segment(); +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + offset = indices_count * (offset - 1) + (indices_count - 2); + if (sub_path_id == 0) + offset += 6; // add 2 triangles for starting cap +#else offset = indices_count * (offset - 1) + (indices_count - 6); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS } } offset += static_cast(sub_path.first.i_id); @@ -2790,7 +2908,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool // gets the position from the vertices buffer on gpu glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); - glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, static_cast(index * buffer.vertices.vertex_size_bytes()), static_cast(3 * sizeof(float)), static_cast(m_sequential_view.current_position.data()))); + glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, static_cast(index * buffer.vertices.vertex_size_bytes()), static_cast(3 * sizeof(float)), static_cast(sequential_view->current_position.data()))); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); found = true; @@ -2839,13 +2957,19 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool break; } case EMoveType::Wipe: { color = Wipe_Color; break; } - default: { color = { 0.0f, 0.0f, 0.0f }; break; } + default: { color = { 0.0f, 0.0f, 0.0f }; break; } } RenderPath key{ color, static_cast(ibuffer_id), path_id }; if (render_path == nullptr || !RenderPathPropertyEqual()(*render_path, key)) render_path = const_cast(&(*buffer->render_paths.emplace(key).first)); +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + unsigned int delta_1st = 0; + if (sub_path.first.s_id < m_sequential_view.current.first && m_sequential_view.current.first <= sub_path.last.s_id) + delta_1st = static_cast(m_sequential_view.current.first - sub_path.first.s_id); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + unsigned int size_in_indices = 0; switch (buffer->render_primitive_type) { @@ -2860,14 +2984,42 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool break; } } + +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + if (size_in_indices == 0) + continue; + + if (buffer->render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { + if (sub_path_id == 0 && delta_1st == 0) + size_in_indices += 6; // add 2 triangles for starting cap + if (sub_path_id == path.sub_paths.size() - 1 && path.sub_paths.back().last.s_id <= m_sequential_view.current.last) + size_in_indices += 6; // add 2 triangles for ending cap + if (delta_1st > 0) + size_in_indices -= 6; // remove 2 triangles for corner cap + } +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + render_path->sizes.push_back(size_in_indices); +#if !ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS unsigned int delta_1st = 0; if (sub_path.first.s_id < m_sequential_view.current.first && m_sequential_view.current.first <= sub_path.last.s_id) delta_1st = m_sequential_view.current.first - sub_path.first.s_id; +#endif // !ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + if (buffer->render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { + delta_1st *= buffer->indices_per_segment(); + if (delta_1st > 0) { + delta_1st += 6; // skip 2 triangles for corner cap + if (sub_path_id == 0) + delta_1st += 6; // skip 2 triangles for starting cap + } + } +#else if (buffer->render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) delta_1st *= buffer->indices_per_segment(); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS render_path->offsets.push_back(static_cast((sub_path.first.i_id + delta_1st) * sizeof(IBufferType))); @@ -2883,20 +3035,132 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool } // set sequential data to their final value - m_sequential_view.endpoints = top_layer_only ? top_layer_endpoints : global_endpoints; - m_sequential_view.current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(m_sequential_view.current.first, m_sequential_view.endpoints.first, m_sequential_view.endpoints.last) : m_sequential_view.endpoints.first; + sequential_view->endpoints = top_layer_only ? top_layer_endpoints : global_endpoints; + sequential_view->current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(sequential_view->current.first, sequential_view->endpoints.first, sequential_view->endpoints.last) : sequential_view->endpoints.first; + +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + // updates sequential range caps + std::array* sequential_range_caps = const_cast*>(&m_sequential_range_caps); + (*sequential_range_caps)[0].reset(); + (*sequential_range_caps)[1].reset(); + + if (m_sequential_view.current.first != m_sequential_view.current.last) { + for (const auto& [buffer, ibuffer_id, path_id, sub_path_id] : paths) { + if (buffer->render_primitive_type != TBuffer::ERenderPrimitiveType::Triangle) + continue; + + const Path& path = buffer->paths[path_id]; + const Path::Sub_Path& sub_path = path.sub_paths[sub_path_id]; + if (m_sequential_view.current.last <= sub_path.first.s_id || sub_path.last.s_id <= m_sequential_view.current.first) + continue; + + // update cap for first endpoint of current range + if (m_sequential_view.current.first > sub_path.first.s_id) { + SequentialRangeCap& cap = (*sequential_range_caps)[0]; + const IBuffer& i_buffer = buffer->indices[ibuffer_id]; + cap.buffer = buffer; + cap.vbo = i_buffer.vbo; + + // calculate offset into the index buffer + unsigned int offset = sub_path.first.i_id; + offset += 6; // add 2 triangles for corner cap + offset += static_cast(m_sequential_view.current.first - sub_path.first.s_id) * buffer->indices_per_segment(); + if (sub_path_id == 0) + offset += 6; // add 2 triangles for starting cap + + // extract indices from index buffer + std::array indices{ 0, 0, 0, 0, 0, 0 }; + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 0) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[0]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 7) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[1]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 1) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[2]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 13) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[4]))); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + indices[3] = indices[0]; + indices[5] = indices[1]; + + // send indices to gpu + glsafe(::glGenBuffers(1, &cap.ibo)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(IBufferType), indices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + + // extract color from render path + size_t offset_bytes = offset * sizeof(IBufferType); + for (const RenderPath& render_path : buffer->render_paths) { + if (render_path.index_buffer_id == ibuffer_id) { + for (size_t j = 0; j < render_path.offsets.size(); ++j) { + if (render_path.contains(offset_bytes)) { + cap.color = render_path.color; + break; + } + } + } + } + } + + // update cap for last endpoint of current range + if (m_sequential_view.current.last < sub_path.last.s_id) { + SequentialRangeCap& cap = (*sequential_range_caps)[1]; + const IBuffer& i_buffer = buffer->indices[ibuffer_id]; + cap.buffer = buffer; + cap.vbo = i_buffer.vbo; + + // calculate offset into the index buffer + unsigned int offset = sub_path.first.i_id; + offset += 6; // add 2 triangles for corner cap + offset += static_cast(m_sequential_view.current.last - 1 - sub_path.first.s_id) * buffer->indices_per_segment(); + if (sub_path_id == 0) + offset += 6; // add 2 triangles for starting cap + + // extract indices from index buffer + std::array indices{ 0, 0, 0, 0, 0, 0 }; + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 2) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[0]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 4) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[1]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 10) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[2]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 16) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[5]))); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + indices[3] = indices[0]; + indices[4] = indices[2]; + + // send indices to gpu + glsafe(::glGenBuffers(1, &cap.ibo)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(IBufferType), indices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + + // extract color from render path + size_t offset_bytes = offset * sizeof(IBufferType); + for (const RenderPath& render_path : buffer->render_paths) { + if (render_path.index_buffer_id == ibuffer_id) { + for (size_t j = 0; j < render_path.offsets.size(); ++j) { + if (render_path.contains(offset_bytes)) { + cap.color = render_path.color; + break; + } + } + } + } + } + + if ((*sequential_range_caps)[0].is_renderable() && (*sequential_range_caps)[1].is_renderable()) + break; + } + } +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS wxGetApp().plater()->enable_preview_moves_slider(!paths.empty()); #if ENABLE_GCODE_VIEWER_STATISTICS for (const TBuffer& buffer : m_buffers) { - m_statistics.render_paths_size += SLIC3R_STDUNORDEREDSET_MEMSIZE(buffer.render_paths, RenderPath); + statistics->render_paths_size += SLIC3R_STDUNORDEREDSET_MEMSIZE(buffer.render_paths, RenderPath); for (const RenderPath& path : buffer.render_paths) { - m_statistics.render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.sizes, unsigned int); - m_statistics.render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.offsets, size_t); + statistics->render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.sizes, unsigned int); + statistics->render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.offsets, size_t); } } - m_statistics.refresh_paths_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); + statistics->refresh_paths_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); #endif // ENABLE_GCODE_VIEWER_STATISTICS } #else @@ -2984,19 +3248,22 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool }; #if ENABLE_GCODE_VIEWER_STATISTICS - m_statistics.render_paths_size = 0; + Statistics* statistics = const_cast(&m_statistics); + statistics->render_paths_size = 0; #endif // ENABLE_GCODE_VIEWER_STATISTICS bool top_layer_only = get_app_config()->get("seq_top_layer_only") == "1"; SequentialView::Endpoints global_endpoints = { m_moves_count , 0 }; SequentialView::Endpoints top_layer_endpoints = global_endpoints; - if (top_layer_only || !keep_sequential_current_first) m_sequential_view.current.first = 0; - if (!keep_sequential_current_last) m_sequential_view.current.last = m_moves_count; + SequentialView* sequential_view = const_cast(&m_sequential_view); + if (top_layer_only || !keep_sequential_current_first) sequential_view->current.first = 0; + if (!keep_sequential_current_last) sequential_view->current.last = m_moves_count; // first pass: collect visible paths and update sequential view data std::vector> paths; - for (TBuffer& buffer : m_buffers) { + for (size_t b = 0; b < m_buffers.size(); ++b) { + TBuffer& buffer = const_cast(m_buffers[b]); // reset render paths buffer.render_paths.clear(); @@ -3037,8 +3304,8 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool } // update current sequential position - m_sequential_view.current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(m_sequential_view.current.first, global_endpoints.first, global_endpoints.last) : global_endpoints.first; - m_sequential_view.current.last = keep_sequential_current_last ? std::clamp(m_sequential_view.current.last, global_endpoints.first, global_endpoints.last) : global_endpoints.last; + sequential_view->current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(sequential_view->current.first, global_endpoints.first, global_endpoints.last) : global_endpoints.first; + sequential_view->current.last = keep_sequential_current_last ? std::clamp(sequential_view->current.last, global_endpoints.first, global_endpoints.last) : global_endpoints.last; // get the world position from gpu bool found = false; @@ -3065,7 +3332,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool // gets the position from the vertices buffer on gpu glsafe(::glBindBuffer(GL_ARRAY_BUFFER, buffer.vertices.id)); - glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, static_cast(index * buffer.vertices.vertex_size_bytes()), static_cast(3 * sizeof(float)), static_cast(m_sequential_view.current_position.data()))); + glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, static_cast(index * buffer.vertices.vertex_size_bytes()), static_cast(3 * sizeof(float)), static_cast(sequential_view->current_position.data()))); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); found = true; break; @@ -3131,20 +3398,20 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool } // set sequential data to their final value - m_sequential_view.endpoints = top_layer_only ? top_layer_endpoints : global_endpoints; - m_sequential_view.current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(m_sequential_view.current.first, m_sequential_view.endpoints.first, m_sequential_view.endpoints.last) : m_sequential_view.endpoints.first; + sequential_view->endpoints = top_layer_only ? top_layer_endpoints : global_endpoints; + sequential_view->current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(sequential_view->current.first, sequential_view->endpoints.first, sequential_view->endpoints.last) : sequential_view->endpoints.first; wxGetApp().plater()->enable_preview_moves_slider(!paths.empty()); #if ENABLE_GCODE_VIEWER_STATISTICS for (const TBuffer& buffer : m_buffers) { - m_statistics.render_paths_size += SLIC3R_STDUNORDEREDSET_MEMSIZE(buffer.render_paths, RenderPath); + statistics->render_paths_size += SLIC3R_STDUNORDEREDSET_MEMSIZE(buffer.render_paths, RenderPath); for (const RenderPath& path : buffer.render_paths) { - m_statistics.render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.sizes, unsigned int); - m_statistics.render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.offsets, size_t); + statistics->render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.sizes, unsigned int); + statistics->render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.offsets, size_t); } } - m_statistics.refresh_paths_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); + statistics->refresh_paths_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); #endif // ENABLE_GCODE_VIEWER_STATISTICS } #endif // ENABLE_SPLITTED_VERTEX_BUFFER @@ -3190,7 +3457,7 @@ void GCodeViewer::render_toolpaths() const set_uniform_color(path.color, shader); glsafe(::glMultiDrawElements(GL_POINTS, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); #if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_multi_points_calls_count; + ++const_cast(&m_statistics)->gl_multi_points_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS } } @@ -3206,7 +3473,7 @@ void GCodeViewer::render_toolpaths() const set_uniform_color(path.color, shader); glsafe(::glMultiDrawElements(GL_LINES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); #if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_multi_lines_calls_count; + ++const_cast(&m_statistics)->gl_multi_lines_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS } } @@ -3218,7 +3485,7 @@ void GCodeViewer::render_toolpaths() const set_uniform_color(path.color, shader); glsafe(::glMultiDrawElements(GL_TRIANGLES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); #if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_multi_triangles_calls_count; + ++const_cast(&m_statistics)->gl_multi_triangles_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS } } @@ -3284,6 +3551,47 @@ void GCodeViewer::render_toolpaths() const shader->stop_using(); } } + +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + auto render_sequential_range_cap = [this, set_uniform_color](const SequentialRangeCap& cap) { + GLShaderProgram* shader = wxGetApp().get_shader(cap.buffer->shader.c_str()); + if (shader != nullptr) { + shader->start_using(); + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, cap.vbo)); + glsafe(::glVertexPointer(cap.buffer->vertices.position_size_floats(), GL_FLOAT, cap.buffer->vertices.vertex_size_bytes(), (const void*)cap.buffer->vertices.position_offset_size())); + glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); + bool has_normals = cap.buffer->vertices.normal_size_floats() > 0; + if (has_normals) { + glsafe(::glNormalPointer(GL_FLOAT, cap.buffer->vertices.vertex_size_bytes(), (const void*)cap.buffer->vertices.normal_offset_size())); + glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); + } + + set_uniform_color(cap.color, *shader); + + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); + glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)cap.indices_count(), GL_UNSIGNED_SHORT, nullptr)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + +#if ENABLE_GCODE_VIEWER_STATISTICS + ++const_cast(&m_statistics)->gl_triangles_calls_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + if (has_normals) + glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); + + glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + + shader->stop_using(); + } + }; + + for (unsigned int i = 0; i < 2; ++i) { + if (m_sequential_range_caps[i].is_renderable()) + render_sequential_range_cap(m_sequential_range_caps[i]); + } +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS } #else void GCodeViewer::render_toolpaths() const @@ -3326,7 +3634,7 @@ void GCodeViewer::render_toolpaths() const if (path.index_buffer_id == index_buffer_id) { glsafe(::glMultiDrawElements(GL_POINTS, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); #if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_multi_points_calls_count; + ++const_cast(&m_statistics)->gl_multi_points_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS } } @@ -3342,7 +3650,7 @@ void GCodeViewer::render_toolpaths() const set_uniform_color(path.color, shader); glsafe(::glMultiDrawElements(GL_LINES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); #if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_multi_lines_calls_count; + ++const_cast(&m_statistics)->gl_multi_lines_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS } } @@ -3354,7 +3662,7 @@ void GCodeViewer::render_toolpaths() const set_uniform_color(path.color, shader); glsafe(::glMultiDrawElements(GL_TRIANGLES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); #if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_multi_triangles_calls_count; + ++const_cast(&m_statistics)->gl_multi_triangles_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS } } @@ -3719,7 +4027,8 @@ void GCodeViewer::render_legend() const bool visible = is_visible(role); append_item(EItemType::Rect, Extrusion_Role_Colors[static_cast(role)], labels[i], visible, times[i], percents[i], max_percent, offsets, [this, role, visible]() { - m_extrusions.role_visibility_flags = visible ? m_extrusions.role_visibility_flags & ~(1 << role) : m_extrusions.role_visibility_flags | (1 << role); + Extrusions* extrusions = const_cast(&m_extrusions); + extrusions->role_visibility_flags = visible ? extrusions->role_visibility_flags & ~(1 << role) : extrusions->role_visibility_flags | (1 << role); // update buffers' render paths refresh_render_paths(false, false); wxGetApp().plater()->update_preview_moves_slider(); @@ -4116,7 +4425,7 @@ void GCodeViewer::render_legend() const } if (show && m_time_statistics.modes[static_cast(mode)].roles_times.size() > 0) { if (imgui.button(label)) { - m_time_estimate_mode = mode; + *const_cast(&m_time_estimate_mode) = mode; wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); } @@ -4196,6 +4505,9 @@ void GCodeViewer::render_statistics() const ImGui::Separator(); add_time(std::string("Load:"), m_statistics.load_time); + add_time(std::string(" Load vertices:"), m_statistics.load_vertices); + add_time(std::string(" Smooth vertices:"), m_statistics.smooth_vertices); + add_time(std::string(" Load indices:"), m_statistics.load_indices); add_time(std::string("Refresh:"), m_statistics.refresh_time); add_time(std::string("Refresh paths:"), m_statistics.refresh_paths_time); } @@ -4204,6 +4516,9 @@ void GCodeViewer::render_statistics() const add_counter(std::string("Multi GL_POINTS:"), m_statistics.gl_multi_points_calls_count); add_counter(std::string("Multi GL_LINES:"), m_statistics.gl_multi_lines_calls_count); add_counter(std::string("Multi GL_TRIANGLES:"), m_statistics.gl_multi_triangles_calls_count); +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + add_counter(std::string("GL_TRIANGLES:"), m_statistics.gl_triangles_calls_count); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS } if (ImGui::CollapsingHeader("CPU memory")) { diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index a4663dc04c9..1d86cf55a20 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -226,6 +226,15 @@ class GCodeViewer unsigned int path_id; std::vector sizes; std::vector offsets; // use size_t because we need an unsigned int whose size matches pointer's size (used in the call glMultiDrawElements()) +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + bool contains(size_t offset) const { + for (size_t i = 0; i < offsets.size(); ++i) { + if (offsets[i] <= offset && offset <= offsets[i] + static_cast(sizes[i] * sizeof(IBufferType))) + return true; + } + return false; + } +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS }; struct RenderPathPropertyHash { size_t operator() (const RenderPath &p) const { @@ -297,29 +306,46 @@ class GCodeViewer { case ERenderPrimitiveType::Point: { return 1; } case ERenderPrimitiveType::Line: { return 2; } +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + case ERenderPrimitiveType::Triangle: { return 30; } // 3 indices x 10 triangles +#else case ERenderPrimitiveType::Triangle: { return 42; } // 3 indices x 14 triangles +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS default: { return 0; } } } #if ENABLE_SPLITTED_VERTEX_BUFFER size_t indices_per_segment_size_bytes() const { return static_cast(indices_per_segment() * sizeof(IBufferType)); } #endif // ENABLE_SPLITTED_VERTEX_BUFFER - unsigned int start_segment_vertex_offset() const { return 0; } - unsigned int end_segment_vertex_offset() const { +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + unsigned int max_indices_per_segment() const { switch (render_primitive_type) { - case ERenderPrimitiveType::Point: { return 0; } - case ERenderPrimitiveType::Line: { return 1; } - case ERenderPrimitiveType::Triangle: { return 36; } // 1st vertex of 13th triangle + case ERenderPrimitiveType::Point: { return 1; } + case ERenderPrimitiveType::Line: { return 2; } + case ERenderPrimitiveType::Triangle: { return 36; } // 3 indices x 12 triangles default: { return 0; } } } + size_t max_indices_per_segment_size_bytes() const { return max_indices_per_segment() * sizeof(IBufferType); } +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS #if ENABLE_SPLITTED_VERTEX_BUFFER bool has_data() const { return !vertices.vbos.empty() && vertices.vbos.front() != 0 && !indices.empty() && indices.front().ibo != 0; } #else + unsigned int start_segment_vertex_offset() const { return 0; } + unsigned int end_segment_vertex_offset() const { + switch (render_primitive_type) + { + case ERenderPrimitiveType::Point: { return 0; } + case ERenderPrimitiveType::Line: { return 1; } + case ERenderPrimitiveType::Triangle: { return 36; } // 1st vertex of 13th triangle + default: { return 0; } + } + } + bool has_data() const { return vertices.id != 0 && !indices.empty() && indices.front().id != 0; } #endif // ENABLE_SPLITTED_VERTEX_BUFFER }; @@ -439,18 +465,41 @@ class GCodeViewer #endif // ENABLE_SPLITTED_VERTEX_BUFFER }; +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + // used to render the toolpath caps of the current sequential range + // (i.e. when sliding on the horizontal slider) + struct SequentialRangeCap + { + TBuffer* buffer{ nullptr }; + unsigned int ibo{ 0 }; + unsigned int vbo{ 0 }; + Color color; + + ~SequentialRangeCap(); + bool is_renderable() const { return buffer != nullptr; } + void reset(); + size_t indices_count() const { return 6; } + }; +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + #if ENABLE_GCODE_VIEWER_STATISTICS struct Statistics { // time int64_t results_time{ 0 }; int64_t load_time{ 0 }; + int64_t load_vertices{ 0 }; + int64_t smooth_vertices{ 0 }; + int64_t load_indices{ 0 }; int64_t refresh_time{ 0 }; int64_t refresh_paths_time{ 0 }; // opengl calls int64_t gl_multi_points_calls_count{ 0 }; int64_t gl_multi_lines_calls_count{ 0 }; int64_t gl_multi_triangles_calls_count{ 0 }; +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + int64_t gl_triangles_calls_count{ 0 }; +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS // memory int64_t results_size{ 0 }; int64_t total_vertices_gpu_size{ 0 }; @@ -476,6 +525,9 @@ class GCodeViewer void reset_times() { results_time = 0; load_time = 0; + load_vertices = 0; + smooth_vertices = 0; + load_indices = 0; refresh_time = 0; refresh_paths_time = 0; } @@ -484,6 +536,9 @@ class GCodeViewer gl_multi_points_calls_count = 0; gl_multi_lines_calls_count = 0; gl_multi_triangles_calls_count = 0; +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + gl_triangles_calls_count = 0; +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS } void reset_sizes() { @@ -560,10 +615,10 @@ class GCodeViewer }; private: - mutable bool m_gl_data_initialized{ false }; + bool m_gl_data_initialized{ false }; unsigned int m_last_result_id{ 0 }; size_t m_moves_count{ 0 }; - mutable std::vector m_buffers{ static_cast(EMoveType::Extrude) }; + std::vector m_buffers{ static_cast(EMoveType::Extrude) }; // bounding box of toolpaths BoundingBoxf3 m_paths_bounding_box; // bounding box of toolpaths + marker tools @@ -574,18 +629,21 @@ class GCodeViewer std::vector m_roles; size_t m_extruders_count; std::vector m_extruder_ids; - mutable Extrusions m_extrusions; - mutable SequentialView m_sequential_view; + Extrusions m_extrusions; + SequentialView m_sequential_view; Shells m_shells; EViewType m_view_type{ EViewType::FeatureType }; bool m_legend_enabled{ true }; PrintEstimatedTimeStatistics m_time_statistics; - mutable PrintEstimatedTimeStatistics::ETimeMode m_time_estimate_mode{ PrintEstimatedTimeStatistics::ETimeMode::Normal }; + PrintEstimatedTimeStatistics::ETimeMode m_time_estimate_mode{ PrintEstimatedTimeStatistics::ETimeMode::Normal }; #if ENABLE_GCODE_VIEWER_STATISTICS - mutable Statistics m_statistics; + Statistics m_statistics; #endif // ENABLE_GCODE_VIEWER_STATISTICS - mutable std::array m_detected_point_sizes = { 0.0f, 0.0f }; + std::array m_detected_point_sizes = { 0.0f, 0.0f }; GCodeProcessor::Result::SettingsIds m_settings_ids; +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + std::array m_sequential_range_caps; +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS public: GCodeViewer(); From f9451eaf812de8f9c0bbae036d7b03214ffdde17 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 5 Feb 2021 13:26:03 +0100 Subject: [PATCH 122/143] Follow-up https://github.com/prusa3d/PrusaSlicer/commit/1fff5a624ceaa80bfb278fea9015618366f3d79b: Respect border color to the dark/light mode + Fixed issue with tooltips for PresetComboBoxes on Windows 2004 --- src/slic3r/GUI/BitmapCache.cpp | 4 ++-- src/slic3r/GUI/BitmapCache.hpp | 4 ++-- src/slic3r/GUI/PresetComboBoxes.cpp | 23 +++++++++++++++++++---- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp index f6562b29966..0a6f3e4f9f6 100644 --- a/src/slic3r/GUI/BitmapCache.cpp +++ b/src/slic3r/GUI/BitmapCache.cpp @@ -338,7 +338,7 @@ wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_ } //we make scaled solid bitmaps only for the cases, when its will be used with scaled SVG icon in one output bitmap -wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling/* = false*/, size_t border_width /*= 0*/) +wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling/* = false*/, size_t border_width /*= 0*/, bool dark_mode/* = false*/) { double scale = suppress_scaling ? 1.0f : m_scale; width *= scale; @@ -371,7 +371,7 @@ wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsi x >= (width - border_width) || y >= (height - border_width)) { const size_t idx = (x + y * width); const size_t idx_rgb = (x + y * width) * 3; - px_data[idx_rgb] = px_data[idx_rgb + 1] = px_data[idx_rgb + 2] = 0u; + px_data[idx_rgb] = px_data[idx_rgb + 1] = px_data[idx_rgb + 2] = dark_mode ? 245u : 110u; a_data[idx] = 255u; } } diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp index 629733b520d..8147de99630 100644 --- a/src/slic3r/GUI/BitmapCache.hpp +++ b/src/slic3r/GUI/BitmapCache.hpp @@ -35,8 +35,8 @@ class BitmapCache // Load svg from resources/icons. bitmap_key is given without the .svg suffix. SVG will be rasterized to provided height/width. wxBitmap* load_svg(const std::string &bitmap_key, unsigned width = 0, unsigned height = 0, const bool grayscale = false, const bool dark_mode = false); - wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling = false, size_t border_width = 0); - wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false, size_t border_width = 0) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE, suppress_scaling, border_width); } + wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling = false, size_t border_width = 0, bool dark_mode = false); + wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false, size_t border_width = 0, bool dark_mode = false) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE, suppress_scaling, border_width, dark_mode); } wxBitmap mkclear(size_t width, size_t height) { return mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT); } static bool parse_color(const std::string& scolor, unsigned char* rgb_out); diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index e3ef37c0cea..86c643c049f 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -186,6 +186,12 @@ void PresetComboBox::update_selection() validate_selection(); SetSelection(m_last_selected); +#ifdef __WXMSW__ + // From the Windows 2004 the tooltip for preset combobox doesn't work after next call of SetTooltip() + // (There was an issue, when tooltip doesn't appears after changing of the preset selection) + // But this workaround seems to work: We should to kill tooltip and than set new tooltip value + SetToolTip(NULL); +#endif SetToolTip(GetString(m_last_selected)); // A workaround for a set of issues related to text fitting into gtk widgets: @@ -411,7 +417,8 @@ wxBitmap* PresetComboBox::get_bmp( std::string bitmap_key, bool wide_icons, con bitmap_key += is_system ? ",syst" : ",nsyst"; bitmap_key += ",h" + std::to_string(icon_height); - if (wxGetApp().dark_mode()) + bool dark_mode = wxGetApp().dark_mode(); + if (dark_mode) bitmap_key += ",dark"; wxBitmap* bmp = bitmap_cache().find(bitmap_key); @@ -427,10 +434,10 @@ wxBitmap* PresetComboBox::get_bmp( std::string bitmap_key, bool wide_icons, con unsigned char rgb[3]; // Paint the color bars. bitmap_cache().parse_color(filament_rgb, rgb); - bmps.emplace_back(bitmap_cache().mksolid(is_single_bar ? wide_icon_width : norm_icon_width, icon_height, rgb, false, 1)); + bmps.emplace_back(bitmap_cache().mksolid(is_single_bar ? wide_icon_width : norm_icon_width, icon_height, rgb, false, 1, dark_mode)); if (!is_single_bar) { bitmap_cache().parse_color(extruder_rgb, rgb); - bmps.emplace_back(bitmap_cache().mksolid(thin_icon_width, icon_height, rgb, false, 1)); + bmps.emplace_back(bitmap_cache().mksolid(thin_icon_width, icon_height, rgb, false, 1, dark_mode)); } // Paint a lock at the system presets. bmps.emplace_back(bitmap_cache().mkclear(space_icon_width, icon_height)); @@ -916,8 +923,16 @@ void PlaterPresetComboBox::update() update_selection(); Thaw(); - if (!tooltip.IsEmpty()) + if (!tooltip.IsEmpty()) { +#ifdef __WXMSW__ + // From the Windows 2004 the tooltip for preset combobox doesn't work after next call of SetTooltip() + // (There was an issue, when tooltip doesn't appears after changing of the preset selection) + // But this workaround seems to work: We should to kill tooltip and than set new tooltip value + // See, https://groups.google.com/g/wx-users/c/mOEe3fgHrzk + SetToolTip(NULL); +#endif SetToolTip(tooltip); + } #ifdef __WXMSW__ // Use this part of code just on Windows to avoid of some layout issues on Linux From 828271d01614d6dff598144010b7265da0e60759 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 5 Feb 2021 14:19:41 +0100 Subject: [PATCH 123/143] Improved AMF/3MF security when parsing invalid meshes. --- src/libslic3r/Format/3mf.cpp | 38 ++++++++++++++++++----- src/libslic3r/Format/AMF.cpp | 59 +++++++++++++++++++++++------------- 2 files changed, 68 insertions(+), 29 deletions(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 7a066f25594..af3d768aaf0 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -392,6 +392,10 @@ namespace Slic3r { bool m_check_version; XML_Parser m_xml_parser; + // Error code returned by the application side of the parser. In that case the expat may not reliably deliver the error state + // after returning from XML_Parse() function, thus we keep the error state here. + bool m_parse_error { false }; + std::string m_parse_error_message; Model* m_model; float m_unit_factor; CurrentObject m_curr_object; @@ -417,7 +421,16 @@ namespace Slic3r { private: void _destroy_xml_parser(); - void _stop_xml_parser(); + void _stop_xml_parser(const std::string& msg = std::string()); + + bool parse_error() const { return m_parse_error; } + const char* parse_error_message() const { + return m_parse_error ? + // The error was signalled by the user code, not the expat parser. + (m_parse_error_message.empty() ? "Invalid 3MF format" : m_parse_error_message.c_str()) : + // The error was signalled by the expat parser. + XML_ErrorString(XML_GetErrorCode(m_xml_parser)); + } bool _load_model_from_file(const std::string& filename, Model& model, DynamicPrintConfig& config); bool _extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); @@ -556,10 +569,14 @@ namespace Slic3r { } } - void _3MF_Importer::_stop_xml_parser() + void _3MF_Importer::_stop_xml_parser(const std::string &msg) { - if (m_xml_parser != nullptr) - XML_StopParser(m_xml_parser, false); + assert(! m_parse_error); + assert(m_parse_error_message.empty()); + assert(m_xml_parser != nullptr); + m_parse_error = true; + m_parse_error_message = msg; + XML_StopParser(m_xml_parser, false); } bool _3MF_Importer::_load_model_from_file(const std::string& filename, Model& model, DynamicPrintConfig& config) @@ -802,12 +819,13 @@ namespace Slic3r { struct CallbackData { XML_Parser& parser; + _3MF_Importer& importer; const mz_zip_archive_file_stat& stat; - CallbackData(XML_Parser& parser, const mz_zip_archive_file_stat& stat) : parser(parser), stat(stat) {} + CallbackData(XML_Parser& parser, _3MF_Importer& importer, const mz_zip_archive_file_stat& stat) : parser(parser), importer(importer), stat(stat) {} }; - CallbackData data(m_xml_parser, stat); + CallbackData data(m_xml_parser, *this, stat); mz_bool res = 0; @@ -815,9 +833,9 @@ namespace Slic3r { { res = mz_zip_reader_extract_file_to_callback(&archive, stat.m_filename, [](void* pOpaque, mz_uint64 file_ofs, const void* pBuf, size_t n)->size_t { CallbackData* data = (CallbackData*)pOpaque; - if (!XML_Parse(data->parser, (const char*)pBuf, (int)n, (file_ofs + n == data->stat.m_uncomp_size) ? 1 : 0)) { + if (!XML_Parse(data->parser, (const char*)pBuf, (int)n, (file_ofs + n == data->stat.m_uncomp_size) ? 1 : 0) || data->importer.parse_error()) { char error_buf[1024]; - ::sprintf(error_buf, "Error (%s) while parsing '%s' at line %d", XML_ErrorString(XML_GetErrorCode(data->parser)), data->stat.m_filename, (int)XML_GetCurrentLineNumber(data->parser)); + ::sprintf(error_buf, "Error (%s) while parsing '%s' at line %d", data->importer.parse_error_message(), data->stat.m_filename, (int)XML_GetCurrentLineNumber(data->parser)); throw Slic3r::FileIOError(error_buf); } @@ -1834,6 +1852,10 @@ namespace Slic3r { stl_facet& facet = stl.facet_start[i]; for (unsigned int v = 0; v < 3; ++v) { unsigned int tri_id = geometry.triangles[src_start_id + ii + v] * 3; + if (tri_id + 2 >= geometry.vertices.size()) { + add_error("Malformed triangle mesh"); + return false; + } facet.vertex[v] = Vec3f(geometry.vertices[tri_id + 0], geometry.vertices[tri_id + 1], geometry.vertices[tri_id + 2]); } } diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp index 07095d10b9f..14d23011e43 100644 --- a/src/libslic3r/Format/AMF.cpp +++ b/src/libslic3r/Format/AMF.cpp @@ -63,23 +63,31 @@ namespace Slic3r struct AMFParserContext { AMFParserContext(XML_Parser parser, DynamicPrintConfig* config, Model* model) : - m_version(0), m_parser(parser), m_model(*model), - m_object(nullptr), - m_volume(nullptr), - m_material(nullptr), - m_instance(nullptr), m_config(config) { m_path.reserve(12); } - void stop() + void stop(const std::string &msg = std::string()) { + assert(! m_error); + assert(m_error_message.empty()); + m_error = true; + m_error_message = msg; XML_StopParser(m_parser, 0); } + bool error() const { return m_error; } + const char* error_message() const { + return m_error ? + // The error was signalled by the user code, not the expat parser. + (m_error_message.empty() ? "Invalid AMF format" : m_error_message.c_str()) : + // The error was signalled by the expat parser. + XML_ErrorString(XML_GetErrorCode(m_parser)); + } + void startElement(const char *name, const char **atts); void endElement(const char *name); void endDocument(); @@ -217,33 +225,37 @@ struct AMFParserContext }; // Version of the amf file - unsigned int m_version; + unsigned int m_version { 0 }; // Current Expat XML parser instance. XML_Parser m_parser; + // Error code returned by the application side of the parser. In that case the expat may not reliably deliver the error state + // after returning from XML_Parse() function, thus we keep the error state here. + bool m_error { false }; + std::string m_error_message; // Model to receive objects extracted from an AMF file. Model &m_model; // Current parsing path in the XML file. std::vector m_path; // Current object allocated for an amf/object XML subtree. - ModelObject *m_object; + ModelObject *m_object { nullptr }; // Map from obect name to object idx & instances. std::map m_object_instances_map; // Vertices parsed for the current m_object. std::vector m_object_vertices; // Current volume allocated for an amf/object/mesh/volume subtree. - ModelVolume *m_volume; + ModelVolume *m_volume { nullptr }; // Faces collected for the current m_volume. std::vector m_volume_facets; // Transformation matrix of a volume mesh from its coordinate system to Object's coordinate system. Transform3d m_volume_transform; // Current material allocated for an amf/metadata subtree. - ModelMaterial *m_material; + ModelMaterial *m_material { nullptr }; // Current instance allocated for an amf/constellation/instance subtree. - Instance *m_instance; + Instance *m_instance { nullptr }; // Generic string buffer for vertices, face indices, metadata etc. std::string m_value[5]; // Pointer to config to update if config data are stored inside the amf file - DynamicPrintConfig *m_config; + DynamicPrintConfig *m_config { nullptr }; private: AMFParserContext& operator=(AMFParserContext&); @@ -591,9 +603,9 @@ void AMFParserContext::endElement(const char * /* name */) // Faces of the current volume: case NODE_TYPE_TRIANGLE: assert(m_object && m_volume); - m_volume_facets.push_back(atoi(m_value[0].c_str())); - m_volume_facets.push_back(atoi(m_value[1].c_str())); - m_volume_facets.push_back(atoi(m_value[2].c_str())); + m_volume_facets.emplace_back(atoi(m_value[0].c_str())); + m_volume_facets.emplace_back(atoi(m_value[1].c_str())); + m_volume_facets.emplace_back(atoi(m_value[2].c_str())); m_value[0].clear(); m_value[1].clear(); m_value[2].clear(); @@ -616,6 +628,10 @@ void AMFParserContext::endElement(const char * /* name */) for (unsigned int v = 0; v < 3; ++v) { unsigned int tri_id = m_volume_facets[i++] * 3; + if (tri_id < 0 || tri_id + 2 >= m_object_vertices.size()) { + this->stop("Malformed triangle mesh"); + return; + } facet.vertex[v] = Vec3f(m_object_vertices[tri_id + 0], m_object_vertices[tri_id + 1], m_object_vertices[tri_id + 2]); } } @@ -858,10 +874,10 @@ bool load_amf_file(const char *path, DynamicPrintConfig *config, Model *model) break; } int done = feof(pFile); - if (XML_Parse(parser, buff, len, done) == XML_STATUS_ERROR) { + if (XML_Parse(parser, buff, len, done) == XML_STATUS_ERROR || ctx.error()) { printf("AMF parser: Parse error at line %d:\n%s\n", (int)XML_GetCurrentLineNumber(parser), - XML_ErrorString(XML_GetErrorCode(parser))); + ctx.error_message()); break; } if (done) { @@ -912,12 +928,13 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi struct CallbackData { XML_Parser& parser; + AMFParserContext& ctx; const mz_zip_archive_file_stat& stat; - CallbackData(XML_Parser& parser, const mz_zip_archive_file_stat& stat) : parser(parser), stat(stat) {} + CallbackData(XML_Parser& parser, AMFParserContext& ctx, const mz_zip_archive_file_stat& stat) : parser(parser), ctx(ctx), stat(stat) {} }; - CallbackData data(parser, stat); + CallbackData data(parser, ctx, stat); mz_bool res = 0; @@ -925,10 +942,10 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi { res = mz_zip_reader_extract_file_to_callback(&archive, stat.m_filename, [](void* pOpaque, mz_uint64 file_ofs, const void* pBuf, size_t n)->size_t { CallbackData* data = (CallbackData*)pOpaque; - if (!XML_Parse(data->parser, (const char*)pBuf, (int)n, (file_ofs + n == data->stat.m_uncomp_size) ? 1 : 0)) + if (!XML_Parse(data->parser, (const char*)pBuf, (int)n, (file_ofs + n == data->stat.m_uncomp_size) ? 1 : 0) || data->ctx.error()) { char error_buf[1024]; - ::sprintf(error_buf, "Error (%s) while parsing '%s' at line %d", XML_ErrorString(XML_GetErrorCode(data->parser)), data->stat.m_filename, (int)XML_GetCurrentLineNumber(data->parser)); + ::sprintf(error_buf, "Error (%s) while parsing '%s' at line %d", data->ctx.error_message(), data->stat.m_filename, (int)XML_GetCurrentLineNumber(data->parser)); throw Slic3r::FileIOError(error_buf); } From 298097c814e0a58b8c4606edf317a15be835306d Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 5 Feb 2021 14:54:05 +0100 Subject: [PATCH 124/143] Improved robustness of stl_fix_normal_directions(stl_file *stl) by further C++isation of the legacy C code. --- src/admesh/normals.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/admesh/normals.cpp b/src/admesh/normals.cpp index 16bb3daab55..a470d081de2 100644 --- a/src/admesh/normals.cpp +++ b/src/admesh/normals.cpp @@ -133,16 +133,16 @@ void stl_fix_normal_directions(stl_file *stl) // Initialize list that keeps track of already fixed facets. std::vector norm_sw(stl->stats.number_of_facets, 0); // Initialize list that keeps track of reversed facets. - std::vector reversed_ids(stl->stats.number_of_facets, 0); + std::vector reversed_ids; + reversed_ids.reserve(stl->stats.number_of_facets); int facet_num = 0; - int reversed_count = 0; // If normal vector is not within tolerance and backwards: // Arbitrarily starts at face 0. If this one is wrong, we're screwed. Thankfully, the chances // of it being wrong randomly are low if most of the triangles are right: if (check_normal_vector(stl, 0, 0)) { reverse_facet(stl, 0); - reversed_ids[reversed_count ++] = 0; + reversed_ids.emplace_back(0); } // Say that we've fixed this facet: @@ -159,13 +159,13 @@ void stl_fix_normal_directions(stl_file *stl) if (stl->neighbors_start[facet_num].neighbor[j] != -1) { if (norm_sw[stl->neighbors_start[facet_num].neighbor[j]] == 1) { // trying to modify a facet already marked as fixed, revert all changes made until now and exit (fixes: #716, #574, #413, #269, #262, #259, #230, #228, #206) - for (int id = reversed_count - 1; id >= 0; -- id) + for (int id = int(reversed_ids.size()) - 1; id >= 0; -- id) reverse_facet(stl, reversed_ids[id]); force_exit = true; break; } reverse_facet(stl, stl->neighbors_start[facet_num].neighbor[j]); - reversed_ids[reversed_count ++] = stl->neighbors_start[facet_num].neighbor[j]; + reversed_ids.emplace_back(stl->neighbors_start[facet_num].neighbor[j]); } } // If this edge of the facet is connected: @@ -188,6 +188,7 @@ void stl_fix_normal_directions(stl_file *stl) // Get next facet to fix from top of list. if (head->next != tail) { facet_num = head->next->facet_num; + assert(facet_num < stl->stats.number_of_facets); if (norm_sw[facet_num] != 1) { // If facet is in list mutiple times norm_sw[facet_num] = 1; // Record this one as being fixed. ++ checked; @@ -207,7 +208,7 @@ void stl_fix_normal_directions(stl_file *stl) facet_num = i; if (check_normal_vector(stl, i, 0)) { reverse_facet(stl, i); - reversed_ids[reversed_count++] = i; + reversed_ids.emplace_back(i); } norm_sw[facet_num] = 1; ++ checked; From c2e956c6d1bcc58f36c412f792c9b15bb161a9a5 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 5 Feb 2021 15:20:23 +0100 Subject: [PATCH 125/143] 3MF and AMF error reporting: Use boost::log instead of printf(). --- src/libslic3r/Format/3mf.cpp | 6 +++--- src/libslic3r/Format/AMF.cpp | 27 +++++++++++++-------------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index af3d768aaf0..8fb7b3e2fbf 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -257,9 +258,8 @@ namespace Slic3r { public: void log_errors() { - for (const std::string& error : m_errors) { - printf("%s\n", error.c_str()); - } + for (const std::string& error : m_errors) + BOOST_LOG_TRIVIAL(error) << error; } }; diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp index 14d23011e43..9b71990eac0 100644 --- a/src/libslic3r/Format/AMF.cpp +++ b/src/libslic3r/Format/AMF.cpp @@ -24,6 +24,7 @@ namespace pt = boost::property_tree; #include #include +#include #include #include "miniz_extension.hpp" @@ -827,7 +828,7 @@ void AMFParserContext::endDocument() { for (const auto &object : m_object_instances_map) { if (object.second.idx == -1) { - printf("Undefined object %s referenced in constellation\n", object.first.c_str()); + BOOST_LOG_TRIVIAL(error) << "Undefined object " << object.first.c_str() << " referenced in constellation"; continue; } for (const Instance &instance : object.second.instances) @@ -850,13 +851,13 @@ bool load_amf_file(const char *path, DynamicPrintConfig *config, Model *model) XML_Parser parser = XML_ParserCreate(nullptr); // encoding if (!parser) { - printf("Couldn't allocate memory for parser\n"); + BOOST_LOG_TRIVIAL(error) << "Couldn't allocate memory for parser"; return false; } FILE *pFile = boost::nowide::fopen(path, "rt"); if (pFile == nullptr) { - printf("Cannot open file %s\n", path); + BOOST_LOG_TRIVIAL(error) << "Cannot open file " << path; return false; } @@ -870,14 +871,12 @@ bool load_amf_file(const char *path, DynamicPrintConfig *config, Model *model) for (;;) { int len = (int)fread(buff, 1, 8192, pFile); if (ferror(pFile)) { - printf("AMF parser: Read error\n"); + BOOST_LOG_TRIVIAL(error) << "AMF parser: Read error"; break; } int done = feof(pFile); if (XML_Parse(parser, buff, len, done) == XML_STATUS_ERROR || ctx.error()) { - printf("AMF parser: Parse error at line %d:\n%s\n", - (int)XML_GetCurrentLineNumber(parser), - ctx.error_message()); + BOOST_LOG_TRIVIAL(error) << "AMF parser: Parse error at line " << int(XML_GetCurrentLineNumber(parser)) << ": " << ctx.error_message(); break; } if (done) { @@ -908,14 +907,14 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi { if (stat.m_uncomp_size == 0) { - printf("Found invalid size\n"); + BOOST_LOG_TRIVIAL(error) << "Found invalid size"; close_zip_reader(&archive); return false; } XML_Parser parser = XML_ParserCreate(nullptr); // encoding if (!parser) { - printf("Couldn't allocate memory for parser\n"); + BOOST_LOG_TRIVIAL(error) << "Couldn't allocate memory for parser"; close_zip_reader(&archive); return false; } @@ -954,14 +953,14 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi } catch (std::exception& e) { - printf("%s\n", e.what()); + BOOST_LOG_TRIVIAL(error) << "Error reading AMF file: " << e.what(); close_zip_reader(&archive); return false; } if (res == 0) { - printf("Error while extracting model data from zip archive"); + BOOST_LOG_TRIVIAL(error) << "Error while extracting model data from zip archive"; close_zip_reader(&archive); return false; } @@ -990,7 +989,7 @@ bool load_amf_archive(const char* path, DynamicPrintConfig* config, Model* model if (!open_zip_reader(&archive, path)) { - printf("Unable to init zip reader\n"); + BOOST_LOG_TRIVIAL(error) << "Unable to init zip reader"; return false; } @@ -1009,7 +1008,7 @@ bool load_amf_archive(const char* path, DynamicPrintConfig* config, Model* model if (!extract_model_from_archive(archive, stat, config, model, check_version)) { close_zip_reader(&archive); - printf("Archive does not contain a valid model"); + BOOST_LOG_TRIVIAL(error) << "Archive does not contain a valid model"; return false; } } @@ -1248,7 +1247,7 @@ bool store_amf(const char* path, Model* model, const DynamicPrintConfig* config, if (!object->instances.empty()) { for (ModelInstance *instance : object->instances) { char buf[512]; - sprintf(buf, + ::sprintf(buf, " \n" " %lf\n" " %lf\n" From aa4c018cd5857814ed9ac0cd93d526f3f172d4ab Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 5 Feb 2021 17:58:55 +0100 Subject: [PATCH 126/143] Fix of Slicing hangs when Infill Percentage set very low #5910 When passing a PrintRegionConfig to the slicing back end, zero an infill density if it is already nearly zero. This avoids an ugly division by zero in the infill code and it also makes clear to the back end that we don't want an infill. --- src/libslic3r/PrintObject.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index d639d03c8f2..2fe93ec0726 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -1601,6 +1601,12 @@ PrintRegionConfig PrintObject::region_config_from_model_volume(const PrintRegion clamp_exturder_to_default(config.infill_extruder, num_extruders); clamp_exturder_to_default(config.perimeter_extruder, num_extruders); clamp_exturder_to_default(config.solid_infill_extruder, num_extruders); + if (config.fill_density.value < 0.00011f) + // Switch of infill for very low infill rates, also avoid division by zero in infill generator for these very low rates. + // See GH issue #5910. + config.fill_density.value = 0; + else + config.fill_density.value = std::min(config.fill_density.value, 1.); return config; } From e7544ed0c415f5a5ac315937e362d4d03a015080 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 5 Feb 2021 19:38:39 +0100 Subject: [PATCH 127/143] Fix of #5888 - Pause Print M117 message not saved after reloading .3mf project --- src/libslic3r/Format/3mf.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 8fb7b3e2fbf..698382c6f9e 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -1239,7 +1239,8 @@ namespace Slic3r { CustomGCode::Type type; std::string extra; - if (tree.find("type") == tree.not_found()) { + pt::ptree attr_tree = tree.find("")->second; + if (attr_tree.find("type") == attr_tree.not_found()) { // It means that data was saved in old version (2.2.0 and older) of PrusaSlicer // read old data ... std::string gcode = tree.get (".gcode"); From 53539a5993e0382ab7125b5648ac2b32f18b0e6a Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 8 Feb 2021 08:10:14 +0100 Subject: [PATCH 128/143] Added a missing include --- src/libslic3r/Brim.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index 0dc52881951..78a6bad7085 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #ifndef NDEBUG From f3c4888291ac9fa11f1e096675ef643dde06d966 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 8 Feb 2021 08:13:22 +0100 Subject: [PATCH 129/143] Added a missing include --- src/slic3r/GUI/NotificationManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 72fd22b1a3f..78969d7255a 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include From d001195ebd2239ba21f31a908d1c146e7af03c08 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 8 Feb 2021 09:51:47 +0100 Subject: [PATCH 130/143] Restoring custom supports/seams after reload from disk Until now, the custom data were lost. --- src/slic3r/GUI/Plater.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 60e6e2c124e..3722c55455f 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3322,6 +3322,8 @@ void Plater::priv::reload_from_disk() new_volume->translate(new_volume->get_transformation().get_matrix(true) * (new_volume->source.mesh_offset - old_volume->source.mesh_offset)); if (old_volume->source.is_converted_from_inches) new_volume->convert_from_imperial_units(); + new_volume->supported_facets.assign(old_volume->supported_facets); + new_volume->seam_facets.assign(old_volume->seam_facets); std::swap(old_model_object->volumes[sel_v.volume_idx], old_model_object->volumes.back()); old_model_object->delete_volume(old_model_object->volumes.size() - 1); old_model_object->ensure_on_bed(); From cbee82dc957f980c2d7a6d55de415136f6be2bed Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Mon, 8 Feb 2021 11:39:30 +0100 Subject: [PATCH 131/143] Fix of "infill percentage not changing #5993" Fix of aa4c018cd5857814ed9ac0cd93d526f3f172d4ab Infill is a percent, which is a number from 0 to 100, not from 0 to 1. --- src/libslic3r/PrintObject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 2fe93ec0726..3595f68388c 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -1606,7 +1606,7 @@ PrintRegionConfig PrintObject::region_config_from_model_volume(const PrintRegion // See GH issue #5910. config.fill_density.value = 0; else - config.fill_density.value = std::min(config.fill_density.value, 1.); + config.fill_density.value = std::min(config.fill_density.value, 100.); return config; } From 5449e6c54990dd01c6fae5f27044fce3db2a01fb Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Mon, 8 Feb 2021 11:58:03 +0100 Subject: [PATCH 132/143] Fixing some compiler warnings on Linux --- src/libslic3r/Format/3mf.cpp | 3 +-- src/libslic3r/SupportMaterial.cpp | 2 +- src/libslic3r/VoronoiOffset.cpp | 7 +++++-- tests/libslic3r/test_voronoi.cpp | 6 +++--- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 698382c6f9e..845e982a9bd 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -676,7 +676,7 @@ namespace Slic3r { // select the geometry associated with the original model object const Geometry* geometry = nullptr; for (const IdToModelObjectMap::value_type& object : m_objects) { - if (static_cast(object.second) == i) { + if (object.second == int(i)) { IdToGeometryMap::const_iterator obj_geometry = m_geometries.find(object.first); if (obj_geometry == m_geometries.end()) { add_error("Unable to find object geometry"); @@ -1875,7 +1875,6 @@ namespace Slic3r { } else { std::cout << "non-single instance !!!\n"; - int a = 0; } } #endif // ENABLE_RELOAD_FROM_DISK_FOR_3MF diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp index 1695075c88f..33e74254ee5 100644 --- a/src/libslic3r/SupportMaterial.cpp +++ b/src/libslic3r/SupportMaterial.cpp @@ -1683,7 +1683,7 @@ size_t idx_higher_or_equal(IT begin, IT end, size_t idx, FN_HIGHER_EQUAL fn_high (fn_higher_equal(begin[idx_high]) ? idx_high : size); } else { // For the other layers of this batch of layers, search incrementally, which is cheaper than the binary search. - while (idx < size && ! fn_higher_equal(begin[idx])) + while (int(idx) < size && ! fn_higher_equal(begin[idx])) ++ idx; } return idx; diff --git a/src/libslic3r/VoronoiOffset.cpp b/src/libslic3r/VoronoiOffset.cpp index 7ad0f7af4b3..2108388f50f 100644 --- a/src/libslic3r/VoronoiOffset.cpp +++ b/src/libslic3r/VoronoiOffset.cpp @@ -666,19 +666,21 @@ void annotate_inside_outside(VD &vd, const Lines &lines) // Set a VertexCategory, verify validity of the operation. auto annotate_vertex = [](const VD::vertex_type *vertex, VertexCategory new_vertex_category) { +#ifndef NDEBUG VertexCategory vc = vertex_category(vertex); assert(vc == VertexCategory::Unknown || vc == new_vertex_category); assert(new_vertex_category == VertexCategory::Inside || new_vertex_category == VertexCategory::Outside || new_vertex_category == VertexCategory::OnContour); +#endif // NDEBUG set_vertex_category(const_cast(vertex), new_vertex_category); }; // Set an EdgeCategory, verify validity of the operation. auto annotate_edge = [](const VD::edge_type *edge, EdgeCategory new_edge_category) { +#ifndef NDEBUG EdgeCategory ec = edge_category(edge); assert(ec == EdgeCategory::Unknown || ec == new_edge_category); -#ifndef NDEBUG switch (new_edge_category) { case EdgeCategory::PointsInside: assert(edge->vertex0() != nullptr); @@ -693,7 +695,6 @@ void annotate_inside_outside(VD &vd, const Lines &lines) default: assert(false); } - #endif // NDEBUG set_edge_category(const_cast(edge), new_edge_category); }; @@ -760,10 +761,12 @@ void annotate_inside_outside(VD &vd, const Lines &lines) // Only one of the two vertices may lie on input contour. const VD::vertex_type *v0 = edge.vertex0(); const VD::vertex_type *v1 = edge.vertex1(); +#ifndef NDEBUG VertexCategory v0_category = vertex_category(v0); VertexCategory v1_category = vertex_category(v1); assert(v0_category != VertexCategory::OnContour || v1_category != VertexCategory::OnContour); assert(! (on_contour(v0) && on_contour(v1))); +#endif // NDEBUG if (on_contour(v0)) annotate_vertex(v0, VertexCategory::OnContour); else { diff --git a/tests/libslic3r/test_voronoi.cpp b/tests/libslic3r/test_voronoi.cpp index 189dde7ceec..bbcea7301fd 100644 --- a/tests/libslic3r/test_voronoi.cpp +++ b/tests/libslic3r/test_voronoi.cpp @@ -176,13 +176,13 @@ TEST_CASE("Voronoi missing edges - Alessandro gapfill 12707", "[Voronoi]") std::mt19937 gen; std::uniform_int_distribution dist(-100, 100); - for (Point &p : poly.points) { #if 0 + for (Point &p : poly.points) { // Wiggle the points a bit to find out whether this fixes the voronoi diagram for this particular polygon. p.x() = (p.x() += dist(gen)); p.y() = (p.y() += dist(gen)); -#endif } +#endif REQUIRE(intersecting_edges({ poly }).empty()); @@ -267,7 +267,7 @@ TEST_CASE("Voronoi weirdness", "[Voronoi]") }; // coord_t shift = 35058881; - coord_t shift_ok = 17000000; +// coord_t shift_ok = 17000000; coord_t shift = 35058881; Polygon poly { // <-4, 0>: bug From de32992b4937a8ff6c9a6fc5f38ca1d092ec4787 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Mon, 8 Feb 2021 12:43:27 +0100 Subject: [PATCH 133/143] Fix of Fan ramp not correct for layer 1 #5893 --- src/libslic3r/GCode/CoolingBuffer.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp index 07ab197f27f..3c9c62fc5eb 100644 --- a/src/libslic3r/GCode/CoolingBuffer.cpp +++ b/src/libslic3r/GCode/CoolingBuffer.cpp @@ -683,6 +683,13 @@ std::string CoolingBuffer::apply_layer_cooldown( int min_fan_speed = EXTRUDER_CONFIG(min_fan_speed); int fan_speed_new = EXTRUDER_CONFIG(fan_always_on) ? min_fan_speed : 0; int disable_fan_first_layers = EXTRUDER_CONFIG(disable_fan_first_layers); + // Is the fan speed ramp enabled? + int full_fan_speed_layer = EXTRUDER_CONFIG(full_fan_speed_layer); + if (disable_fan_first_layers <= 0 && full_fan_speed_layer > 0) { + // When ramping up fan speed from disable_fan_first_layers to full_fan_speed_layer, force disable_fan_first_layers above zero, + // so there will be a zero fan speed at least at the 1st layer. + disable_fan_first_layers = 1; + } if (int(layer_id) >= disable_fan_first_layers) { int max_fan_speed = EXTRUDER_CONFIG(max_fan_speed); float slowdown_below_layer_time = float(EXTRUDER_CONFIG(slowdown_below_layer_time)); @@ -699,11 +706,6 @@ std::string CoolingBuffer::apply_layer_cooldown( } } bridge_fan_speed = EXTRUDER_CONFIG(bridge_fan_speed); - // Is the fan speed ramp enabled? - int full_fan_speed_layer = EXTRUDER_CONFIG(full_fan_speed_layer); - // When ramping up fan speed from disable_fan_first_layers to full_fan_speed_layer, force disable_fan_first_layers above zero, - // so there will be a zero fan speed at least at the 1st layer. - disable_fan_first_layers = std::max(disable_fan_first_layers, 1); if (int(layer_id) >= disable_fan_first_layers && int(layer_id) + 1 < full_fan_speed_layer) { // Ramp up the fan speed from disable_fan_first_layers to full_fan_speed_layer. float factor = float(int(layer_id + 1) - disable_fan_first_layers) / float(full_fan_speed_layer - disable_fan_first_layers); From 76291936d788f864ffbf054121c22076cbab0aa1 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 8 Feb 2021 13:14:35 +0100 Subject: [PATCH 134/143] UnsavedChangesDialog: Fixed warnings --- src/slic3r/GUI/UnsavedChangesDialog.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/slic3r/GUI/UnsavedChangesDialog.cpp b/src/slic3r/GUI/UnsavedChangesDialog.cpp index 2727a298269..68b115f092f 100644 --- a/src/slic3r/GUI/UnsavedChangesDialog.cpp +++ b/src/slic3r/GUI/UnsavedChangesDialog.cpp @@ -653,7 +653,7 @@ void DiffViewCtrl::Clear() wxString DiffViewCtrl::get_short_string(wxString full_string) { - int max_len = 30; + size_t max_len = 30; if (full_string.IsEmpty() || full_string.StartsWith("#") || (full_string.Find("\n") == wxNOT_FOUND && full_string.Length() < max_len)) return full_string; @@ -661,7 +661,7 @@ wxString DiffViewCtrl::get_short_string(wxString full_string) m_has_long_strings = true; int n_pos = full_string.Find("\n"); - if (n_pos != wxNOT_FOUND && n_pos < max_len) + if (n_pos != wxNOT_FOUND && n_pos < (int)max_len) max_len = n_pos; full_string.Truncate(max_len); @@ -1008,12 +1008,12 @@ wxString get_string_from_enum(const std::string& opt_key, const DynamicPrintConf return from_u8(_utf8(names[static_cast(val)])); } -static int get_id_from_opt_key(std::string opt_key) +static size_t get_id_from_opt_key(std::string opt_key) { int pos = opt_key.find("#"); if (pos > 0) { boost::erase_head(opt_key, pos + 1); - return atoi(opt_key.c_str()); + return static_cast(atoi(opt_key.c_str())); } return 0; } @@ -1031,7 +1031,7 @@ static wxString get_full_label(std::string opt_key, const DynamicPrintConfig& co static wxString get_string_value(std::string opt_key, const DynamicPrintConfig& config) { - int opt_idx = get_id_from_opt_key(opt_key); + size_t opt_idx = get_id_from_opt_key(opt_key); opt_key = get_pure_opt_key(opt_key); if (config.option(opt_key)->is_nil()) @@ -1700,15 +1700,12 @@ void DiffPresetDialog::update_compatibility(const std::string& preset_name, Pres if (printer_tab) { const Preset& new_printer_preset = *presets->find_preset(preset_name, true); - const PresetWithVendorProfile new_printer_preset_with_vendor_profile = presets->get_preset_with_vendor_profile(new_printer_preset); PrinterTechnology old_printer_technology = presets->get_selected_preset().printer_technology(); PrinterTechnology new_printer_technology = new_printer_preset.printer_technology(); technology_changed = old_printer_technology != new_printer_technology; } - bool is_selected = presets->select_preset_by_name(preset_name, false); - // 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. @@ -1730,10 +1727,12 @@ void DiffPresetDialog::update_compatibility(const std::string& preset_name, Pres { PresetComboBox* cb = is_left_presets ? preset_combos.presets_left : preset_combos.presets_right; Preset::Type presets_type = cb->get_type(); - if (print_tab && (pr_tech == ptFFF && presets_type == Preset::TYPE_FILAMENT || - pr_tech == ptSLA && presets_type == Preset::TYPE_SLA_MATERIAL) || - printer_tab && (pr_tech == ptFFF && (presets_type == Preset::TYPE_PRINT || presets_type == Preset::TYPE_FILAMENT) || - pr_tech == ptSLA && (presets_type == Preset::TYPE_SLA_PRINT || presets_type == Preset::TYPE_SLA_MATERIAL))) + if ((print_tab && ( + (pr_tech == ptFFF && presets_type == Preset::TYPE_FILAMENT) || + (pr_tech == ptSLA && presets_type == Preset::TYPE_SLA_MATERIAL) )) || + (printer_tab && ( + (pr_tech == ptFFF && (presets_type == Preset::TYPE_PRINT || presets_type == Preset::TYPE_FILAMENT) ) || + (pr_tech == ptSLA && (presets_type == Preset::TYPE_SLA_PRINT || presets_type == Preset::TYPE_SLA_MATERIAL) )) )) cb->update(); } From c767ce18de109c5c41215a4b94529a65d858b2f3 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 8 Feb 2021 13:23:11 +0100 Subject: [PATCH 135/143] Removed debug code --- src/libslic3r/Format/3mf.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 845e982a9bd..ba477be8e5b 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -1873,9 +1873,6 @@ namespace Slic3r { triangle_mesh.transform(object.instances.front()->get_transformation().get_matrix()); object.instances.front()->set_transformation(Slic3r::Geometry::Transformation()); } - else { - std::cout << "non-single instance !!!\n"; - } } #endif // ENABLE_RELOAD_FROM_DISK_FOR_3MF From 1f5b7fc16221b09b0e6a079b6343d1f9322b0210 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Mon, 8 Feb 2021 15:56:32 +0100 Subject: [PATCH 136/143] Fix of a selection of default print / filament / sla print / sla material profile after wizard closes for the first time with the first printer installed. --- src/libslic3r/PresetBundle.cpp | 41 ++++++++++++++++++++++------------ src/libslic3r/PresetBundle.hpp | 3 +-- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index bfc1e222c7a..8fc8e92899b 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -1484,11 +1484,15 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri int operator()(const Preset &preset) const { - return (! m_prefered_alias.empty() && m_prefered_alias == preset.alias) ? - // Matching an alias, always take this preset with priority. - std::numeric_limits::max() : - // Otherwise take the prefered profile, or the first compatible. - preset.name == m_prefered_name; + return + preset.is_default || preset.is_external ? + // Don't match any properties of the "-- default --" profile or the external profiles when switching printer profile. + 0 : + ! m_prefered_alias.empty() && m_prefered_alias == preset.alias ? + // Matching an alias, always take this preset with priority. + std::numeric_limits::max() : + // Otherwise take the prefered profile, or the first compatible. + preset.name == m_prefered_name; } private: @@ -1500,11 +1504,14 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri class PreferedPrintProfileMatch : public PreferedProfileMatch { public: - PreferedPrintProfileMatch(const Preset &preset, const std::string &prefered_name) : - PreferedProfileMatch(preset.alias, prefered_name), m_prefered_layer_height(preset.config.opt_float("layer_height")) {} + PreferedPrintProfileMatch(const Preset *preset, const std::string &prefered_name) : + PreferedProfileMatch(preset ? preset->alias : std::string(), prefered_name), m_prefered_layer_height(preset ? preset->config.opt_float("layer_height") : 0) {} int operator()(const Preset &preset) const { + // Don't match any properties of the "-- default --" profile or the external profiles when switching printer profile. + if (preset.is_default || preset.is_external) + return 0; int match_quality = PreferedProfileMatch::operator()(preset); if (match_quality < std::numeric_limits::max()) { match_quality += 1; @@ -1528,6 +1535,9 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri int operator()(const Preset &preset) const { + // Don't match any properties of the "-- default --" profile or the external profiles when switching printer profile. + if (preset.is_default || preset.is_external) + return 0; int match_quality = PreferedProfileMatch::operator()(preset); if (match_quality < std::numeric_limits::max()) { match_quality += 1; @@ -1545,14 +1555,17 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri class PreferedFilamentsProfileMatch { public: - PreferedFilamentsProfileMatch(const Preset &preset, const std::vector &prefered_names) : - m_prefered_alias(preset.alias), - m_prefered_filament_type(preset.config.opt_string("filament_type", 0)), + PreferedFilamentsProfileMatch(const Preset *preset, const std::vector &prefered_names) : + m_prefered_alias(preset ? preset->alias : std::string()), + m_prefered_filament_type(preset ? preset->config.opt_string("filament_type", 0) : std::string()), m_prefered_names(prefered_names) {} int operator()(const Preset &preset) const { + // Don't match any properties of the "-- default --" profile or the external profiles when switching printer profile. + if (preset.is_default || preset.is_external) + return 0; if (! m_prefered_alias.empty() && m_prefered_alias == preset.alias) // Matching an alias, always take this preset with priority. return std::numeric_limits::max(); @@ -1575,7 +1588,7 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri assert(printer_preset.config.has("default_filament_profile")); const std::vector &prefered_filament_profiles = printer_preset.config.option("default_filament_profile")->values; this->prints.update_compatible(printer_preset_with_vendor_profile, nullptr, select_other_print_if_incompatible, - PreferedPrintProfileMatch(this->prints.get_edited_preset(), printer_preset.config.opt_string("default_print_profile"))); + PreferedPrintProfileMatch(this->prints.get_selected_idx() == size_t(-1) ? nullptr : &this->prints.get_edited_preset(), printer_preset.config.opt_string("default_print_profile"))); const PresetWithVendorProfile print_preset_with_vendor_profile = this->prints.get_edited_preset_with_vendor_profile(); // Remember whether the filament profiles were compatible before updating the filament compatibility. std::vector filament_preset_was_compatible(this->filament_presets.size(), false); @@ -1585,7 +1598,7 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri } // First select a first compatible profile for the preset editor. this->filaments.update_compatible(printer_preset_with_vendor_profile, &print_preset_with_vendor_profile, select_other_filament_if_incompatible, - PreferedFilamentsProfileMatch(this->filaments.get_edited_preset(), prefered_filament_profiles)); + PreferedFilamentsProfileMatch(this->filaments.get_selected_idx() == size_t(-1) ? nullptr : &this->filaments.get_edited_preset(), prefered_filament_profiles)); if (select_other_filament_if_incompatible != PresetSelectCompatibleType::Never) { // Verify validity of the current filament presets. const std::string prefered_filament_profile = prefered_filament_profiles.empty() ? std::string() : prefered_filament_profiles.front(); @@ -1612,10 +1625,10 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri assert(printer_preset.config.has("default_sla_print_profile")); assert(printer_preset.config.has("default_sla_material_profile")); this->sla_prints.update_compatible(printer_preset_with_vendor_profile, nullptr, select_other_print_if_incompatible, - PreferedPrintProfileMatch(this->sla_prints.get_edited_preset(), printer_preset.config.opt_string("default_sla_print_profile"))); + PreferedPrintProfileMatch(this->sla_prints.get_selected_idx() == size_t(-1) ? nullptr : &this->sla_prints.get_edited_preset(), printer_preset.config.opt_string("default_sla_print_profile"))); const PresetWithVendorProfile sla_print_preset_with_vendor_profile = this->sla_prints.get_edited_preset_with_vendor_profile(); this->sla_materials.update_compatible(printer_preset_with_vendor_profile, &sla_print_preset_with_vendor_profile, select_other_filament_if_incompatible, - PreferedProfileMatch(this->sla_materials.get_edited_preset().alias, printer_preset.config.opt_string("default_sla_material_profile"))); + PreferedProfileMatch(this->sla_materials.get_selected_idx() == size_t(-1) ? std::string() : this->sla_materials.get_edited_preset().alias, printer_preset.config.opt_string("default_sla_material_profile"))); break; } default: break; diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index f98b9653320..5902d420886 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -26,8 +26,7 @@ class PresetBundle // Load ini files of all types (print, filament, printer) from Slic3r::data_dir() / presets. // Load selections (current print, current filaments, current printer) from config.ini - // This is done just once on application start up. - void load_presets(AppConfig &config, const std::string &preferred_model_id = ""); + void load_presets(AppConfig &config, const std::string &preferred_model_id = std::string()); // Export selections (current print, current filaments, current printer) into config.ini void export_selections(AppConfig &config); From ba479066b2f27634611d06ccf2b50a18c42495a1 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 8 Feb 2021 16:15:11 +0100 Subject: [PATCH 137/143] Fixed layout of the TreeCtrl for the Printer Settings Tab --- src/slic3r/GUI/Tab.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index cdcc98d0613..00e386c1d01 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -612,7 +612,7 @@ void Tab::update_changed_ui() const bool deep_compare = (m_type == Slic3r::Preset::TYPE_PRINTER || m_type == Slic3r::Preset::TYPE_SLA_MATERIAL); auto dirty_options = m_presets->current_dirty_options(deep_compare); auto nonsys_options = m_presets->current_different_from_parent_options(deep_compare); - if (m_type == Slic3r::Preset::TYPE_PRINTER) { + if (m_type == Preset::TYPE_PRINTER && static_cast(this)->m_printer_technology == ptFFF) { TabPrinter* tab = static_cast(this); if (tab->m_initial_extruders_count != tab->m_extruders_count) dirty_options.emplace_back("extruders_count"); @@ -673,7 +673,8 @@ void TabPrinter::init_options_list() default: m_options_list.emplace(opt_key, m_opt_status_value); break; } } - m_options_list.emplace("extruders_count", m_opt_status_value); + if (m_printer_technology == ptFFF) + m_options_list.emplace("extruders_count", m_opt_status_value); } void TabPrinter::msw_rescale() @@ -2080,6 +2081,8 @@ void TabPrinter::build() std::string def_preset_name = "- default " + std::string(m_printer_technology == ptSLA ? "FFF" : "SLA") + " -"; m_config = &m_presets->find_preset(def_preset_name)->config; m_printer_technology == ptSLA ? build_fff() : build_sla(); + if (m_printer_technology == ptSLA) + m_extruders_count_old = 0;// revert this value // ... and than for selected printer technology load_initial_data(); @@ -2510,7 +2513,7 @@ void TabPrinter::build_unregular_pages(bool from_initial_build/* = false*/) if (existed_page < n_before_extruders && (is_marlin_flavor || from_initial_build)) { auto page = build_kinematics_page(); - if (from_initial_build) + if (from_initial_build && !is_marlin_flavor) page->clear(); else m_pages.insert(m_pages.begin() + n_before_extruders, page); @@ -2662,7 +2665,7 @@ void TabPrinter::build_unregular_pages(bool from_initial_build/* = false*/) m_extruders_count_old = m_extruders_count; - if (m_printer_technology == ptSLA/*from_initial_build*/) + if (from_initial_build && m_printer_technology == ptSLA) return; // next part of code is no needed to execute at this moment rebuild_page_tree(); From 672ed99320ba7e57fa5c1daad3b450ca6320b2f1 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Mon, 8 Feb 2021 17:40:47 +0100 Subject: [PATCH 138/143] Fix of Hilbert Curve Infill: Unable to slice, PrusaSlicer not responding. #5771 Fixed by hard limiting the number of iterations of reorder_by_two_exchanges_with_segment_flipping() --- src/libslic3r/ShortestPath.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/ShortestPath.cpp b/src/libslic3r/ShortestPath.cpp index facedec3fb6..9565b1874e5 100644 --- a/src/libslic3r/ShortestPath.cpp +++ b/src/libslic3r/ShortestPath.cpp @@ -1527,6 +1527,11 @@ static inline void do_crossover(const std::vector &edges_in, std::vect assert(edges_in.size() == edges_out.size()); } +// Worst time complexity: O(min(n, 100) * (n * log n + n^2) +// Expected time complexity: O(min(n, 100) * (n * log n + k * n) +// where n is the number of edges and k is the number of connection_lengths candidates after the first one +// is found that improves the total cost. +//FIXME there are likley better heuristics to lower the time complexity. static inline void reorder_by_two_exchanges_with_segment_flipping(std::vector &edges) { if (edges.size() < 2) @@ -1536,7 +1541,8 @@ static inline void reorder_by_two_exchanges_with_segment_flipping(std::vector edges_tmp(edges); std::vector> connection_lengths(edges.size() - 1, std::pair(0., 0)); std::vector connection_tried(edges.size(), false); - for (size_t iter = 0; iter < edges.size(); ++ iter) { + const size_t max_iterations = std::min(edges.size(), size_t(100)); + for (size_t iter = 0; iter < max_iterations; ++ iter) { // Initialize connection costs and connection lengths. for (size_t i = 1; i < edges.size(); ++ i) { const FlipEdge &e1 = edges[i - 1]; @@ -1600,6 +1606,8 @@ static inline void reorder_by_two_exchanges_with_segment_flipping(std::vector &edges) { if (edges.size() < 3) { @@ -1680,6 +1688,7 @@ static inline void reorder_by_three_exchanges_with_segment_flipping(std::vector< } } } +#endif typedef Eigen::Matrix Matrixd; @@ -1751,6 +1760,8 @@ static inline std::pair minimum_crossover_cost( return std::make_pair(cost_min, flip_min); } +#if 0 +// Currently not used, too slow. static inline void reorder_by_three_exchanges_with_segment_flipping2(std::vector &edges) { if (edges.size() < 3) { @@ -1845,8 +1856,11 @@ static inline void reorder_by_three_exchanges_with_segment_flipping2(std::vector } } } +#endif // Flip the sequences of polylines to lower the total length of connecting lines. +// Used by the infill generator if the infill is not connected with perimeter lines +// and to order the brim lines. static inline void improve_ordering_by_two_exchanges_with_segment_flipping(Polylines &polylines, bool fixed_start) { #ifndef NDEBUG @@ -1898,6 +1912,7 @@ static inline void improve_ordering_by_two_exchanges_with_segment_flipping(Polyl #endif /* NDEBUG */ } +// Used to optimize order of infill lines and brim lines. Polylines chain_polylines(Polylines &&polylines, const Point *start_near) { #ifdef DEBUG_SVG_OUTPUT From cd1322ce3ffbdc3b3b34bc9ab619f6f3b233b179 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 14 Jan 2021 13:00:54 +0100 Subject: [PATCH 139/143] FDM supports gizmo 'autoset by angle' improvements: - Extra dialog for autosetting by angle in FDM supports gizmo was removed - Highlighting facets by angle is now controlled by a slider in the main gizmo dialog - User is allowed to paint even when using the slope highlighter - The button to turn highlighted facets to blockers was removed, it made no sense - Highlighted facets are now rendered in light blue --- resources/shaders/gouraud.fs | 16 +- src/libslic3r/TriangleSelector.cpp | 30 +- src/libslic3r/TriangleSelector.hpp | 8 +- src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp | 307 ++++++++++--------- src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 26 +- 6 files changed, 207 insertions(+), 183 deletions(-) diff --git a/resources/shaders/gouraud.fs b/resources/shaders/gouraud.fs index 40182a14baa..6dbd0e6fe1d 100644 --- a/resources/shaders/gouraud.fs +++ b/resources/shaders/gouraud.fs @@ -32,22 +32,22 @@ varying vec3 delta_box_max; varying float world_normal_z; varying vec3 eye_normal; -vec3 slope_color() -{ - return (world_normal_z > slope.normal_z - EPSILON) ? GREEN : RED; -} - void main() { if (any(lessThan(clipping_planes_dots, ZERO))) discard; - vec3 color = slope.actived ? slope_color() : uniform_color.rgb; + vec3 color = uniform_color.rgb; + float alpha = uniform_color.a; + if (slope.actived && world_normal_z < slope.normal_z - EPSILON) { + color = vec3(0.7f, 0.7f, 1.f); + alpha = 1.f; + } // if the fragment is outside the print volume -> use darker color color = (any(lessThan(delta_box_min, ZERO)) || any(greaterThan(delta_box_max, ZERO))) ? mix(color, ZERO, 0.3333) : color; #ifdef ENABLE_ENVIRONMENT_MAP if (use_environment_tex) - gl_FragColor = vec4(0.45 * texture2D(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color * intensity.x, uniform_color.a); + gl_FragColor = vec4(0.45 * texture2D(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color * intensity.x, alpha); else #endif - gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, uniform_color.a); + gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); } diff --git a/src/libslic3r/TriangleSelector.cpp b/src/libslic3r/TriangleSelector.cpp index 3fe68819584..f29d9738890 100644 --- a/src/libslic3r/TriangleSelector.cpp +++ b/src/libslic3r/TriangleSelector.cpp @@ -425,8 +425,11 @@ void TriangleSelector::reset() m_triangles.clear(); for (const stl_vertex& vert : m_mesh->its.vertices) m_vertices.emplace_back(vert); - for (const stl_triangle_vertex_indices& ind : m_mesh->its.indices) - push_triangle(ind[0], ind[1], ind[2]); + for (size_t i=0; iits.indices.size(); ++i) { + const stl_triangle_vertex_indices& ind = m_mesh->its.indices[i]; + const Vec3f& normal = m_mesh->stl.facet_start[i].normal; + push_triangle(ind[0], ind[1], ind[2], normal); + } m_orig_size_vertices = m_vertices.size(); m_orig_size_indices = m_triangles.size(); m_invalid_triangles = 0; @@ -451,19 +454,20 @@ void TriangleSelector::set_edge_limit(float edge_limit) -void TriangleSelector::push_triangle(int a, int b, int c) +void TriangleSelector::push_triangle(int a, int b, int c, const Vec3f& normal) { for (int i : {a, b, c}) { assert(i >= 0 && i < int(m_vertices.size())); ++m_vertices[i].ref_cnt; } - m_triangles.emplace_back(a, b, c); + m_triangles.emplace_back(a, b, c, normal); } void TriangleSelector::perform_split(int facet_idx, EnforcerBlockerType old_state) { Triangle* tr = &m_triangles[facet_idx]; + const Vec3f normal = tr->normal; assert(tr->is_split()); @@ -483,8 +487,8 @@ void TriangleSelector::perform_split(int facet_idx, EnforcerBlockerType old_stat m_vertices.emplace_back((m_vertices[verts_idxs[1]].v + m_vertices[verts_idxs[2]].v)/2.); verts_idxs.insert(verts_idxs.begin()+2, m_vertices.size() - 1); - push_triangle(verts_idxs[0], verts_idxs[1], verts_idxs[2]); - push_triangle(verts_idxs[2], verts_idxs[3], verts_idxs[0]); + push_triangle(verts_idxs[0], verts_idxs[1], verts_idxs[2], normal); + push_triangle(verts_idxs[2], verts_idxs[3], verts_idxs[0], normal); } if (sides_to_split == 2) { @@ -494,9 +498,9 @@ void TriangleSelector::perform_split(int facet_idx, EnforcerBlockerType old_stat m_vertices.emplace_back((m_vertices[verts_idxs[0]].v + m_vertices[verts_idxs[3]].v)/2.); verts_idxs.insert(verts_idxs.begin()+4, m_vertices.size() - 1); - push_triangle(verts_idxs[0], verts_idxs[1], verts_idxs[4]); - push_triangle(verts_idxs[1], verts_idxs[2], verts_idxs[4]); - push_triangle(verts_idxs[2], verts_idxs[3], verts_idxs[4]); + push_triangle(verts_idxs[0], verts_idxs[1], verts_idxs[4], normal); + push_triangle(verts_idxs[1], verts_idxs[2], verts_idxs[4], normal); + push_triangle(verts_idxs[2], verts_idxs[3], verts_idxs[4], normal); } if (sides_to_split == 3) { @@ -507,10 +511,10 @@ void TriangleSelector::perform_split(int facet_idx, EnforcerBlockerType old_stat m_vertices.emplace_back((m_vertices[verts_idxs[4]].v + m_vertices[verts_idxs[0]].v)/2.); verts_idxs.insert(verts_idxs.begin()+5, m_vertices.size() - 1); - push_triangle(verts_idxs[0], verts_idxs[1], verts_idxs[5]); - push_triangle(verts_idxs[1], verts_idxs[2], verts_idxs[3]); - push_triangle(verts_idxs[3], verts_idxs[4], verts_idxs[5]); - push_triangle(verts_idxs[1], verts_idxs[3], verts_idxs[5]); + push_triangle(verts_idxs[0], verts_idxs[1], verts_idxs[5], normal); + push_triangle(verts_idxs[1], verts_idxs[2], verts_idxs[3], normal); + push_triangle(verts_idxs[3], verts_idxs[4], verts_idxs[5], normal); + push_triangle(verts_idxs[1], verts_idxs[3], verts_idxs[5], normal); } tr = &m_triangles[facet_idx]; // may have been invalidated diff --git a/src/libslic3r/TriangleSelector.hpp b/src/libslic3r/TriangleSelector.hpp index 11387c766ce..9d159007042 100644 --- a/src/libslic3r/TriangleSelector.hpp +++ b/src/libslic3r/TriangleSelector.hpp @@ -63,8 +63,9 @@ class TriangleSelector { public: // Use TriangleSelector::push_triangle to create a new triangle. // It increments/decrements reference counter on vertices. - Triangle(int a, int b, int c) + Triangle(int a, int b, int c, const Vec3f& normal_) : verts_idxs{a, b, c}, + normal{normal_}, state{EnforcerBlockerType(0)}, number_of_splits{0}, special_side_idx{0}, @@ -73,6 +74,9 @@ class TriangleSelector { // Indices into m_vertices. std::array verts_idxs; + // Triangle normal (a shader might need it). + Vec3f normal; + // Is this triangle valid or marked to be removed? bool valid{true}; @@ -158,7 +162,7 @@ class TriangleSelector { void remove_useless_children(int facet_idx); // No hidden meaning. Triangles are meant. bool is_pointer_in_triangle(int facet_idx) const; bool is_edge_inside_cursor(int facet_idx) const; - void push_triangle(int a, int b, int c); + void push_triangle(int a, int b, int c, const Vec3f& normal); void perform_split(int facet_idx, EnforcerBlockerType old_state); }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp index 8f2703faad6..f3f87cc33e5 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp @@ -20,10 +20,8 @@ namespace GUI { void GLGizmoFdmSupports::on_shutdown() { - if (m_setting_angle) { - m_setting_angle = false; - m_parent.use_slope(false); - } + m_angle_threshold_deg = 0.f; + m_parent.use_slope(false); } @@ -52,6 +50,9 @@ bool GLGizmoFdmSupports::on_init() m_desc["remove_all"] = _L("Remove all selection"); m_desc["circle"] = _L("Circle"); m_desc["sphere"] = _L("Sphere"); + m_desc["highlight_by_angle"] = _L("Highlight by angle"); + m_desc["enforce_button"] = _L("Enforce"); + m_desc["cancel"] = _L("Cancel"); return true; } @@ -65,8 +66,7 @@ void GLGizmoFdmSupports::render_painter_gizmo() const glsafe(::glEnable(GL_BLEND)); glsafe(::glEnable(GL_DEPTH_TEST)); - if (! m_setting_angle) - render_triangles(selection); + render_triangles(selection); m_c->object_clipper()->render_cut(); render_cursor(); @@ -81,179 +81,183 @@ void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_l if (! m_c->selection_info()->model_object()) return; - const float approx_height = m_imgui->scaled(14.0f); + const float approx_height = m_imgui->scaled(17.0f); y = std::min(y, bottom_limit - approx_height); m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - if (! m_setting_angle) { - m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); - - // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that: - const float clipping_slider_left = std::max(m_imgui->calc_text_size(m_desc.at("clipping_of_view")).x, - m_imgui->calc_text_size(m_desc.at("reset_direction")).x) - + m_imgui->scaled(1.5f); - const float cursor_slider_left = m_imgui->calc_text_size(m_desc.at("cursor_size")).x + m_imgui->scaled(1.f); - const float cursor_type_radio_left = m_imgui->calc_text_size(m_desc.at("cursor_type")).x + m_imgui->scaled(1.f); - const float cursor_type_radio_width1 = m_imgui->calc_text_size(m_desc["circle"]).x - + m_imgui->scaled(2.5f); - const float cursor_type_radio_width2 = m_imgui->calc_text_size(m_desc["sphere"]).x - + m_imgui->scaled(2.5f); - const float button_width = m_imgui->calc_text_size(m_desc.at("remove_all")).x + m_imgui->scaled(1.f); - const float minimal_slider_width = m_imgui->scaled(4.f); - - float caption_max = 0.f; - float total_text_max = 0.; - for (const std::string& t : {"enforce", "block", "remove"}) { - caption_max = std::max(caption_max, m_imgui->calc_text_size(m_desc.at(t+"_caption")).x); - total_text_max = std::max(total_text_max, caption_max + m_imgui->calc_text_size(m_desc.at(t)).x); + m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); + + // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that: + const float clipping_slider_left = std::max(m_imgui->calc_text_size(m_desc.at("clipping_of_view")).x, + m_imgui->calc_text_size(m_desc.at("reset_direction")).x) + + m_imgui->scaled(1.5f); + const float cursor_slider_left = m_imgui->calc_text_size(m_desc.at("cursor_size")).x + m_imgui->scaled(1.f); + const float autoset_slider_left = m_imgui->calc_text_size(m_desc.at("highlight_by_angle")).x + m_imgui->scaled(1.f); + const float cursor_type_radio_left = m_imgui->calc_text_size(m_desc.at("cursor_type")).x + m_imgui->scaled(1.f); + const float cursor_type_radio_width1 = m_imgui->calc_text_size(m_desc["circle"]).x + + m_imgui->scaled(2.5f); + const float cursor_type_radio_width2 = m_imgui->calc_text_size(m_desc["sphere"]).x + + m_imgui->scaled(2.5f); + const float button_width = m_imgui->calc_text_size(m_desc.at("remove_all")).x + m_imgui->scaled(1.f); + const float button_enforce_width = m_imgui->calc_text_size(m_desc.at("enforce_button")).x; + const float button_cancel_width = m_imgui->calc_text_size(m_desc.at("cancel")).x; + const float buttons_width = std::max(button_enforce_width, button_cancel_width) + m_imgui->scaled(0.5f); + const float minimal_slider_width = m_imgui->scaled(4.f); + + float caption_max = 0.f; + float total_text_max = 0.; + for (const std::string& t : {"enforce", "block", "remove"}) { + caption_max = std::max(caption_max, m_imgui->calc_text_size(m_desc.at(t+"_caption")).x); + total_text_max = std::max(total_text_max, caption_max + m_imgui->calc_text_size(m_desc.at(t)).x); + } + caption_max += m_imgui->scaled(1.f); + total_text_max += m_imgui->scaled(1.f); + + float window_width = minimal_slider_width + std::max(autoset_slider_left, std::max(cursor_slider_left, clipping_slider_left)); + window_width = std::max(window_width, total_text_max); + window_width = std::max(window_width, button_width); + window_width = std::max(window_width, cursor_type_radio_left + cursor_type_radio_width1 + cursor_type_radio_width2); + window_width = std::max(window_width, 2.f * buttons_width + m_imgui->scaled(1.f)); + + auto draw_text_with_caption = [this, &caption_max](const wxString& caption, const wxString& text) { + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, caption); + ImGui::SameLine(caption_max); + m_imgui->text(text); + }; + + for (const std::string& t : {"enforce", "block", "remove"}) + draw_text_with_caption(m_desc.at(t + "_caption"), m_desc.at(t)); + + m_imgui->text(""); + ImGui::Separator(); + + m_imgui->text(m_desc["highlight_by_angle"] + ":"); + ImGui::AlignTextToFramePadding(); + std::string format_str = std::string("%.f") + I18N::translate_utf8("°", + "Degree sign to use in the respective slider in FDM supports gizmo," + "placed after the number with no whitespace in between."); + ImGui::SameLine(autoset_slider_left); + ImGui::PushItemWidth(window_width - autoset_slider_left); + if (m_imgui->slider_float("", &m_angle_threshold_deg, 0.f, 90.f, format_str.data())) { + m_parent.set_slope_normal_angle(90.f - m_angle_threshold_deg); + if (! m_parent.is_using_slope()) { + m_parent.use_slope(true); + m_parent.set_as_dirty(); } - caption_max += m_imgui->scaled(1.f); - total_text_max += m_imgui->scaled(1.f); - - float window_width = minimal_slider_width + std::max(cursor_slider_left, clipping_slider_left); - window_width = std::max(window_width, total_text_max); - window_width = std::max(window_width, button_width); - window_width = std::max(window_width, cursor_type_radio_left + cursor_type_radio_width1 + cursor_type_radio_width2); - - auto draw_text_with_caption = [this, &caption_max](const wxString& caption, const wxString& text) { - m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, caption); - ImGui::SameLine(caption_max); - m_imgui->text(text); - }; + } - for (const std::string& t : {"enforce", "block", "remove"}) - draw_text_with_caption(m_desc.at(t + "_caption"), m_desc.at(t)); + m_imgui->disabled_begin(m_angle_threshold_deg == 0.f); + ImGui::NewLine(); + ImGui::SameLine(window_width - 2.f*buttons_width - m_imgui->scaled(0.5f)); + if (m_imgui->button(m_desc["enforce_button"], buttons_width, 0.f)) { + select_facets_by_angle(m_angle_threshold_deg, false); + m_angle_threshold_deg = 0.f; + } + ImGui::SameLine(window_width - buttons_width); + if (m_imgui->button(m_desc["cancel"], buttons_width, 0.f)) { + m_angle_threshold_deg = 0.f; + m_parent.use_slope(false); + } + m_imgui->disabled_end(); - m_imgui->text(""); + ImGui::Separator(); - if (m_imgui->button(_L("Autoset by angle") + "...")) { - m_setting_angle = true; + if (m_imgui->button(m_desc.at("remove_all"))) { + Plater::TakeSnapshot(wxGetApp().plater(), wxString(_L("Reset selection"))); + ModelObject* mo = m_c->selection_info()->model_object(); + int idx = -1; + for (ModelVolume* mv : mo->volumes) { + if (mv->is_model_part()) { + ++idx; + m_triangle_selectors[idx]->reset(); + } } - ImGui::SameLine(); - - if (m_imgui->button(m_desc.at("remove_all"))) { - Plater::TakeSnapshot(wxGetApp().plater(), wxString(_L("Reset selection"))); - ModelObject* mo = m_c->selection_info()->model_object(); - int idx = -1; - for (ModelVolume* mv : mo->volumes) { - if (mv->is_model_part()) { - ++idx; - m_triangle_selectors[idx]->reset(); - } - } + update_model_object(); + m_parent.set_as_dirty(); + } - update_model_object(); - m_parent.set_as_dirty(); - } - const float max_tooltip_width = ImGui::GetFontSize() * 20.0f; + const float max_tooltip_width = ImGui::GetFontSize() * 20.0f; - ImGui::AlignTextToFramePadding(); - m_imgui->text(m_desc.at("cursor_size")); - ImGui::SameLine(cursor_slider_left); - ImGui::PushItemWidth(window_width - cursor_slider_left); - ImGui::SliderFloat(" ", &m_cursor_radius, CursorRadiusMin, CursorRadiusMax, "%.2f"); - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::PushTextWrapPos(max_tooltip_width); - ImGui::TextUnformatted(_L("Alt + Mouse wheel").ToUTF8().data()); - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); - } + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc.at("cursor_size")); + ImGui::SameLine(cursor_slider_left); + ImGui::PushItemWidth(window_width - cursor_slider_left); + ImGui::SliderFloat(" ", &m_cursor_radius, CursorRadiusMin, CursorRadiusMax, "%.2f"); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(max_tooltip_width); + ImGui::TextUnformatted(_L("Alt + Mouse wheel").ToUTF8().data()); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } - ImGui::AlignTextToFramePadding(); - m_imgui->text(m_desc.at("cursor_type")); - ImGui::SameLine(cursor_type_radio_left + m_imgui->scaled(0.f)); - ImGui::PushItemWidth(cursor_type_radio_width1); - - bool sphere_sel = m_cursor_type == TriangleSelector::CursorType::SPHERE; - if (m_imgui->radio_button(m_desc["sphere"], sphere_sel)) - sphere_sel = true; - - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::PushTextWrapPos(max_tooltip_width); - ImGui::TextUnformatted(_L("Paints all facets inside, regardless of their orientation.").ToUTF8().data()); - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); - } + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc.at("cursor_type")); + ImGui::SameLine(cursor_type_radio_left + m_imgui->scaled(0.f)); + ImGui::PushItemWidth(cursor_type_radio_width1); - ImGui::SameLine(cursor_type_radio_left + cursor_type_radio_width2 + m_imgui->scaled(0.f)); - ImGui::PushItemWidth(cursor_type_radio_width2); + bool sphere_sel = m_cursor_type == TriangleSelector::CursorType::SPHERE; + if (m_imgui->radio_button(m_desc["sphere"], sphere_sel)) + sphere_sel = true; - if (m_imgui->radio_button(m_desc["circle"], ! sphere_sel)) - sphere_sel = false; + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(max_tooltip_width); + ImGui::TextUnformatted(_L("Paints all facets inside, regardless of their orientation.").ToUTF8().data()); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::PushTextWrapPos(max_tooltip_width); - ImGui::TextUnformatted(_L("Ignores facets facing away from the camera.").ToUTF8().data()); - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); - } + ImGui::SameLine(cursor_type_radio_left + cursor_type_radio_width2 + m_imgui->scaled(0.f)); + ImGui::PushItemWidth(cursor_type_radio_width2); - m_cursor_type = sphere_sel - ? TriangleSelector::CursorType::SPHERE - : TriangleSelector::CursorType::CIRCLE; + if (m_imgui->radio_button(m_desc["circle"], ! sphere_sel)) + sphere_sel = false; + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(max_tooltip_width); + ImGui::TextUnformatted(_L("Ignores facets facing away from the camera.").ToUTF8().data()); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } + m_cursor_type = sphere_sel + ? TriangleSelector::CursorType::SPHERE + : TriangleSelector::CursorType::CIRCLE; - ImGui::Separator(); - if (m_c->object_clipper()->get_position() == 0.f) { - ImGui::AlignTextToFramePadding(); - m_imgui->text(m_desc.at("clipping_of_view")); - } - else { - if (m_imgui->button(m_desc.at("reset_direction"))) { - wxGetApp().CallAfter([this](){ - m_c->object_clipper()->set_position(-1., false); - }); - } - } - ImGui::SameLine(clipping_slider_left); - ImGui::PushItemWidth(window_width - clipping_slider_left); - float clp_dist = m_c->object_clipper()->get_position(); - if (ImGui::SliderFloat(" ", &clp_dist, 0.f, 1.f, "%.2f")) - m_c->object_clipper()->set_position(clp_dist, true); - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::PushTextWrapPos(max_tooltip_width); - ImGui::TextUnformatted(_L("Ctrl + Mouse wheel").ToUTF8().data()); - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); - } - m_imgui->end(); + ImGui::Separator(); + if (m_c->object_clipper()->get_position() == 0.f) { + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc.at("clipping_of_view")); } else { - m_imgui->begin(_L("Autoset custom supports"), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); - ImGui::AlignTextToFramePadding(); - m_imgui->text(_L("Threshold:")); - std::string format_str = std::string("%.f") + I18N::translate_utf8("°", - "Degree sign to use in the respective slider in FDM supports gizmo," - "placed after the number with no whitespace in between."); - ImGui::SameLine(); - if (m_imgui->slider_float("", &m_angle_threshold_deg, 0.f, 90.f, format_str.data())) - m_parent.set_slope_normal_angle(90.f - m_angle_threshold_deg); - if (m_imgui->button(_L("Enforce"))) - select_facets_by_angle(m_angle_threshold_deg, false); - ImGui::SameLine(); - if (m_imgui->button(_L("Block"))) - select_facets_by_angle(m_angle_threshold_deg, true); - ImGui::SameLine(); - if (m_imgui->button(_L("Cancel"))) - m_setting_angle = false; - m_imgui->end(); - bool needs_update = !(m_setting_angle && m_parent.is_using_slope()); - if (needs_update) { - m_parent.use_slope(m_setting_angle); - m_parent.set_as_dirty(); + if (m_imgui->button(m_desc.at("reset_direction"))) { + wxGetApp().CallAfter([this](){ + m_c->object_clipper()->set_position(-1., false); + }); } } + + ImGui::SameLine(clipping_slider_left); + ImGui::PushItemWidth(window_width - clipping_slider_left); + float clp_dist = m_c->object_clipper()->get_position(); + if (ImGui::SliderFloat(" ", &clp_dist, 0.f, 1.f, "%.2f")) + m_c->object_clipper()->set_position(clp_dist, true); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(max_tooltip_width); + ImGui::TextUnformatted(_L("Ctrl + Mouse wheel").ToUTF8().data()); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } + m_imgui->end(); } @@ -296,7 +300,6 @@ void GLGizmoFdmSupports::select_facets_by_angle(float threshold_deg, bool block) : _L("Add supports by angle")); update_model_object(); m_parent.set_as_dirty(); - m_setting_angle = false; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp index fc977078739..41e4cc514b7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp @@ -30,8 +30,7 @@ class GLGizmoFdmSupports : public GLGizmoPainterBase PainterGizmoType get_painter_type() const override; void select_facets_by_angle(float threshold, bool block); - float m_angle_threshold_deg = 45.f; - bool m_setting_angle = false; + float m_angle_threshold_deg = 0.f; // This map holds all translated description texts, so they can be easily referenced during layout calculations // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect. diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 819d014e812..91aef75d9a6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -540,7 +540,9 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui) va.push_geometry(double(m_vertices[tr.verts_idxs[i]].v[0]), double(m_vertices[tr.verts_idxs[i]].v[1]), double(m_vertices[tr.verts_idxs[i]].v[2]), - 0., 0., 1.); + double(tr.normal[0]), + double(tr.normal[1]), + double(tr.normal[2])); va.push_triangle(cnt, cnt+1, cnt+2); @@ -550,14 +552,26 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui) m_iva_enforcers.finalize_geometry(true); m_iva_blockers.finalize_geometry(true); - if (m_iva_enforcers.has_VBOs()) { - ::glColor4f(0.f, 0.f, 1.f, 0.4f); + bool render_enf = m_iva_enforcers.has_VBOs(); + bool render_blc = m_iva_blockers.has_VBOs(); + + auto* shader = wxGetApp().get_shader("gouraud"); + if (! shader) + return; + + shader->start_using(); + ScopeGuard guard([shader]() { if (shader) shader->stop_using(); }); + shader->set_uniform("slope.actived", false); + + if (render_enf) { + std::array color = { 0.47f, 0.47f, 1.f, 1.f }; + shader->set_uniform("uniform_color", color); m_iva_enforcers.render(); } - - if (m_iva_blockers.has_VBOs()) { - ::glColor4f(1.f, 0.f, 0.f, 0.4f); + if (render_blc) { + std::array color = { 1.f, 0.44f, 0.44f, 1.f }; + shader->set_uniform("uniform_color", color); m_iva_blockers.render(); } From 0ff0444dcc3975d823872f6ec841e1f26a69c3b4 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 29 Jan 2021 16:16:23 +0100 Subject: [PATCH 140/143] Fixing Clang warnings 1 --- src/libslic3r/AppConfig.cpp | 6 ++--- src/libslic3r/Config.hpp | 2 +- src/libslic3r/GCode/WipeTower.cpp | 2 +- src/libslic3r/LayerRegion.cpp | 6 ++--- src/libslic3r/TriangleMesh.hpp | 4 ++-- src/slic3r/Config/Snapshot.cpp | 4 ++-- src/slic3r/GUI/BonjourDialog.cpp | 5 ++-- src/slic3r/GUI/ConfigSnapshotDialog.cpp | 2 +- src/slic3r/GUI/ConfigWizard.cpp | 4 ++-- src/slic3r/GUI/FirmwareDialog.cpp | 12 +++++----- src/slic3r/GUI/GUI_ObjectList.cpp | 18 +++++++------- src/slic3r/GUI/MainFrame.cpp | 16 ++++++------- src/slic3r/GUI/Mouse3DController.cpp | 2 +- src/slic3r/GUI/ObjectDataViewModel.cpp | 2 +- src/slic3r/GUI/OptionsGroup.cpp | 20 ++++++++-------- src/slic3r/GUI/PhysicalPrinterDialog.cpp | 10 ++++---- src/slic3r/GUI/Plater.cpp | 12 +++++----- src/slic3r/GUI/PresetComboBoxes.cpp | 8 +++---- src/slic3r/GUI/Tab.cpp | 30 +++++++++++++----------- src/slic3r/GUI/Tab.hpp | 1 - src/slic3r/Utils/Bonjour.cpp | 2 +- src/slic3r/Utils/Http.cpp | 2 +- src/slic3r/Utils/PresetUpdater.cpp | 8 +++---- 23 files changed, 90 insertions(+), 88 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 7c940338220..4b3d33a549d 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -266,14 +266,14 @@ void AppConfig::save() else c << "# " << Slic3r::header_gcodeviewer_generated() << std::endl; // Make sure the "no" category is written first. - for (const std::pair &kvp : m_storage[""]) + for (const auto& kvp : m_storage[""]) c << kvp.first << " = " << kvp.second << std::endl; // Write the other categories. - for (const auto category : m_storage) { + for (const auto& category : m_storage) { if (category.first.empty()) continue; c << std::endl << "[" << category.first << "]" << std::endl; - for (const std::pair &kvp : category.second) + for (const auto& kvp : category.second) c << kvp.first << " = " << kvp.second << std::endl; } // Write vendor sections diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index 0b91648da29..4b726bea9ec 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -1344,7 +1344,7 @@ class ConfigOptionEnum : public ConfigOptionSingle static bool has(T value) { - for (const std::pair &kvp : ConfigOptionEnum::get_enum_values()) + for (const auto &kvp : ConfigOptionEnum::get_enum_values()) if (kvp.second == value) return true; return false; diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index 0f72dc415d7..e39b8191914 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -405,7 +405,7 @@ class WipeTowerWriter WipeTowerWriter& append(const std::string& text) { m_gcode += text; return *this; } - std::vector wipe_path() const + const std::vector& wipe_path() const { return m_wipe_path; } diff --git a/src/libslic3r/LayerRegion.cpp b/src/libslic3r/LayerRegion.cpp index b3383fcc5a1..3763f2498b4 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -290,7 +290,7 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly surfaces_append(bottom, union_ex(grown, true), bridges[idx_last]); } - fill_boundaries = std::move(to_polygons(fill_boundaries_ex)); + fill_boundaries = to_polygons(fill_boundaries_ex); BOOST_LOG_TRIVIAL(trace) << "Processing external surface, detecting bridges - done"; } @@ -327,7 +327,7 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly surfaces_append( new_surfaces, // Don't use a safety offset as fill_boundaries were already united using the safety offset. - std::move(intersection_ex(polys, fill_boundaries, false)), + intersection_ex(polys, fill_boundaries, false), s1); } } @@ -424,7 +424,7 @@ void LayerRegion::elephant_foot_compensation_step(const float elephant_foot_comp Polygons slices_polygons = to_polygons(slices_expolygons); Polygons tmp = intersection(slices_polygons, trimming_polygons, false); append(tmp, diff(slices_polygons, offset(offset_ex(slices_expolygons, -elephant_foot_compensation_perimeter_step), elephant_foot_compensation_perimeter_step))); - this->slices.set(std::move(union_ex(tmp)), stInternal); + this->slices.set(union_ex(tmp), stInternal); } void LayerRegion::export_region_slices_to_svg(const char *path) const diff --git a/src/libslic3r/TriangleMesh.hpp b/src/libslic3r/TriangleMesh.hpp index 71cd231c3f0..9625298f4ef 100644 --- a/src/libslic3r/TriangleMesh.hpp +++ b/src/libslic3r/TriangleMesh.hpp @@ -103,7 +103,7 @@ enum FacetEdgeType { class IntersectionReference { public: - IntersectionReference() : point_id(-1), edge_id(-1) {}; + IntersectionReference() : point_id(-1), edge_id(-1) {} IntersectionReference(int point_id, int edge_id) : point_id(point_id), edge_id(edge_id) {} // Where is this intersection point located? On mesh vertex or mesh edge? // Only one of the following will be set, the other will remain set to -1. @@ -116,7 +116,7 @@ class IntersectionReference class IntersectionPoint : public Point, public IntersectionReference { public: - IntersectionPoint() {}; + IntersectionPoint() {} IntersectionPoint(int point_id, int edge_id, const Point &pt) : IntersectionReference(point_id, edge_id), Point(pt) {} IntersectionPoint(const IntersectionReference &ir, const Point &pt) : IntersectionReference(ir), Point(pt) {} // Inherits coord_t x, y diff --git a/src/slic3r/Config/Snapshot.cpp b/src/slic3r/Config/Snapshot.cpp index 900172d3eb6..ecfc32b58fb 100644 --- a/src/slic3r/Config/Snapshot.cpp +++ b/src/slic3r/Config/Snapshot.cpp @@ -251,7 +251,7 @@ bool Snapshot::equal_to_active(const AppConfig &app_config) const return false; matched.insert(vc.name); } - for (const std::pair>> &v : app_config.vendors()) + for (const auto &v : app_config.vendors()) if (matched.find(v.first) == matched.end() && ! v.second.empty()) // There are more vendors currently installed than enabled in the snapshot. return false; @@ -402,7 +402,7 @@ const Snapshot& SnapshotDB::take_snapshot(const AppConfig &app_config, Snapshot: snapshot.filaments.emplace_back(app_config.get("presets", name)); } // Vendor specific config bundles and installed printers. - for (const std::pair>> &vendor : app_config.vendors()) { + for (const auto &vendor : app_config.vendors()) { Snapshot::VendorConfig cfg; cfg.name = vendor.first; cfg.models_variants_installed = vendor.second; diff --git a/src/slic3r/GUI/BonjourDialog.cpp b/src/slic3r/GUI/BonjourDialog.cpp index 51f18dce720..65d5524c2db 100644 --- a/src/slic3r/GUI/BonjourDialog.cpp +++ b/src/slic3r/GUI/BonjourDialog.cpp @@ -119,7 +119,7 @@ bool BonjourDialog::show_and_lookup() // Note: More can be done here when we support discovery of hosts other than Octoprint and SL1 Bonjour::TxtKeys txt_keys { "version", "model" }; - bonjour = std::move(Bonjour("octoprint") + bonjour = Bonjour("octoprint") .set_txt_keys(std::move(txt_keys)) .set_retries(3) .set_timeout(4) @@ -139,8 +139,7 @@ bool BonjourDialog::show_and_lookup() wxQueueEvent(dialog, evt); } }) - .lookup() - ); + .lookup(); bool res = ShowModal() == wxID_OK && list->GetFirstSelected() >= 0; { diff --git a/src/slic3r/GUI/ConfigSnapshotDialog.cpp b/src/slic3r/GUI/ConfigSnapshotDialog.cpp index 487604b1c0e..9f996d378bd 100644 --- a/src/slic3r/GUI/ConfigSnapshotDialog.cpp +++ b/src/slic3r/GUI/ConfigSnapshotDialog.cpp @@ -68,7 +68,7 @@ static wxString generate_html_row(const Config::Snapshot &snapshot, bool row_eve if (vc.version.max_slic3r_version != Semver::inf()) text += ", " + _(L("max PrusaSlicer version")) + ": " + vc.version.max_slic3r_version.to_string(); text += "
"; - for (const std::pair> &model : vc.models_variants_installed) { + for (const auto& model : vc.models_variants_installed) { text += _(L("model")) + ": " + model.first + ", " + _(L("variants")) + ": "; for (const std::string &variant : model.second) { if (&variant != &*model.second.begin()) diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index 568c15a1654..047a0046f40 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -1872,7 +1872,7 @@ void ConfigWizard::priv::load_vendors() std::map section_new; if (app_config->has_section(section_name)) { const std::map §ion_old = app_config->get_section(section_name); - for (const std::pair &material_name_and_installed : section_old) + for (const auto& material_name_and_installed : section_old) if (material_name_and_installed.second == "1") { // Material is installed. Resolve it in bundles. size_t num_found = 0; @@ -2248,7 +2248,7 @@ bool ConfigWizard::priv::check_and_install_missing_materials(Technology technolo if ((only_for_model_id.empty() || only_for_model_id == printer_model->id) && printer_models_without_material.find(printer_model) == printer_models_without_material.end()) { bool has_material = false; - for (const std::pair &preset : appconfig_presets) { + for (const auto& preset : appconfig_presets) { if (preset.second == "1") { const Preset *material = materials.find_preset(preset.first, false); if (material != nullptr && is_compatible_with_printer(PresetWithVendorProfile(*material, nullptr), PresetWithVendorProfile(printer, nullptr))) { diff --git a/src/slic3r/GUI/FirmwareDialog.cpp b/src/slic3r/GUI/FirmwareDialog.cpp index 879e7fe34ef..046d9d1386f 100644 --- a/src/slic3r/GUI/FirmwareDialog.cpp +++ b/src/slic3r/GUI/FirmwareDialog.cpp @@ -648,7 +648,7 @@ void FirmwareDialog::priv::perform_upload() } } }) - .on_message(std::move([q, extra_verbose](const char *msg, unsigned /* size */) { + .on_message([q, extra_verbose](const char *msg, unsigned /* size */) { if (extra_verbose) { BOOST_LOG_TRIVIAL(debug) << "avrdude: " << msg; } @@ -665,19 +665,19 @@ void FirmwareDialog::priv::perform_upload() evt->SetExtraLong(AE_MESSAGE); evt->SetString(std::move(wxmsg)); wxQueueEvent(q, evt); - })) - .on_progress(std::move([q](const char * /* task */, unsigned progress) { + }) + .on_progress([q](const char * /* task */, unsigned progress) { auto evt = new wxCommandEvent(EVT_AVRDUDE, q->GetId()); evt->SetExtraLong(AE_PROGRESS); evt->SetInt(progress); wxQueueEvent(q, evt); - })) - .on_complete(std::move([this]() { + }) + .on_complete([this]() { auto evt = new wxCommandEvent(EVT_AVRDUDE, this->q->GetId()); evt->SetExtraLong(AE_EXIT); evt->SetInt(this->avrdude->exit_code()); wxQueueEvent(this->q, evt); - })) + }) .run(); } diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 94e55ce5c45..87bc1090fcc 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -117,7 +117,9 @@ ObjectList::ObjectList(wxWindow* parent) : // detect the current mouse position here, to pass it to list_manipulation() method // if we detect it later, the user may have moved the mouse pointer while calculations are performed, and this would mess-up the HitTest() call performed into list_manipulation() // see: https://github.com/prusa3d/PrusaSlicer/issues/3802 +#ifndef __WXOSX__ const wxPoint mouse_pos = this->get_mouse_position_in_control(); +#endif #ifndef __APPLE__ // On Windows and Linux, forces a kill focus emulation on the object manipulator fields because this event handler is called @@ -752,7 +754,7 @@ void ObjectList::copy_layers_to_clipboard() return; } - for (const auto layer_item : sel_layers) + for (const auto& layer_item : sel_layers) if (m_objects_model->GetItemType(layer_item) & itLayer) { auto range = m_objects_model->GetLayerRangeByItem(layer_item); auto it = ranges.find(range); @@ -778,7 +780,7 @@ void ObjectList::paste_layers_into_list() t_layer_config_ranges& ranges = object(obj_idx)->layer_config_ranges; // and create Layer item(s) according to the layer_config_ranges - for (const auto range : cache_ranges) + for (const auto& range : cache_ranges) ranges.emplace(range); layers_item = add_layer_root_item(object_item); @@ -1842,7 +1844,7 @@ void ObjectList::append_menu_item_export_stl(wxMenu* menu) const void ObjectList::append_menu_item_reload_from_disk(wxMenu* menu) const { append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected volumes from disk")), - [this](wxCommandEvent&) { wxGetApp().plater()->reload_from_disk(); }, "", menu, + [](wxCommandEvent&) { wxGetApp().plater()->reload_from_disk(); }, "", menu, []() { return wxGetApp().plater()->can_reload_from_disk(); }, wxGetApp().plater()); } @@ -2063,9 +2065,9 @@ wxMenu* ObjectList::create_settings_popupmenu(wxMenu *parent_menu) for (auto cat : settings_menu) { append_menu_item(menu, wxID_ANY, _(cat.first), "", - [menu, this](wxCommandEvent& event) { get_settings_choice(menu->GetLabel(event.GetId())); }, + [this, menu](wxCommandEvent& event) { get_settings_choice(menu->GetLabel(event.GetId())); }, CATEGORY_ICON.find(cat.first) == CATEGORY_ICON.end() ? wxNullBitmap : CATEGORY_ICON.at(cat.first), parent_menu, - [this]() { return true; }, wxGetApp().plater()); + []() { return true; }, wxGetApp().plater()); } return menu; @@ -2084,9 +2086,9 @@ void ObjectList::create_freq_settings_popupmenu(wxMenu *menu, const bool is_obje continue; append_menu_item(menu, wxID_ANY, _(it.first), "", - [menu, this](wxCommandEvent& event) { get_freq_settings_choice(menu->GetLabel(event.GetId())); }, + [this, menu](wxCommandEvent& event) { get_freq_settings_choice(menu->GetLabel(event.GetId())); }, CATEGORY_ICON.find(it.first) == CATEGORY_ICON.end() ? wxNullBitmap : CATEGORY_ICON.at(it.first), menu, - [this]() { return true; }, wxGetApp().plater()); + []() { return true; }, wxGetApp().plater()); } #if 0 // Add "Quick" settings bundles @@ -4600,7 +4602,7 @@ void ObjectList::show_multi_selection_menu() append_menu_item_change_extruder(menu); append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected volumes from disk")), - [this](wxCommandEvent&) { wxGetApp().plater()->reload_from_disk(); }, "", menu, []() { + [](wxCommandEvent&) { wxGetApp().plater()->reload_from_disk(); }, "", menu, []() { return wxGetApp().plater()->can_reload_from_disk(); }, wxGetApp().plater()); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 9c30ac330c5..3fccb7f8438 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -64,10 +64,10 @@ class PrusaSlicerTaskBarIcon : public wxTaskBarIcon // Only allow opening a new PrusaSlicer instance on OSX if "single_instance" is disabled, // as starting new instances would interfere with the locking mechanism of "single_instance" support. append_menu_item(menu, wxID_ANY, _L("Open new instance"), _L("Open a new PrusaSlicer instance"), - [this](wxCommandEvent&) { start_new_slicer(); }, "", nullptr); + [](wxCommandEvent&) { start_new_slicer(); }, "", nullptr); } append_menu_item(menu, wxID_ANY, _L("G-code preview") + dots, _L("Open G-code viewer"), - [this](wxCommandEvent&) { start_new_gcodeviewer_open_file(); }, "", nullptr); + [](wxCommandEvent&) { start_new_gcodeviewer_open_file(); }, "", nullptr); return menu; } }; @@ -78,9 +78,9 @@ class GCodeViewerTaskBarIcon : public wxTaskBarIcon wxMenu *CreatePopupMenu() override { wxMenu *menu = new wxMenu; append_menu_item(menu, wxID_ANY, _L("Open PrusaSlicer"), _L("Open a new PrusaSlicer instance"), - [this](wxCommandEvent&) { start_new_slicer(nullptr, true); }, "", nullptr); + [](wxCommandEvent&) { start_new_slicer(nullptr, true); }, "", nullptr); append_menu_item(menu, wxID_ANY, _L("G-code preview") + dots, _L("Open new G-code viewer"), - [this](wxCommandEvent&) { start_new_gcodeviewer_open_file(); }, "", nullptr); + [](wxCommandEvent&) { start_new_gcodeviewer_open_file(); }, "", nullptr); return menu; } }; @@ -231,7 +231,7 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S // So, redraw explicitly canvas, when application is moved //FIXME maybe this is useful for __WXGTK3__ as well? #if __APPLE__ - Bind(wxEVT_MOVE, [this](wxMoveEvent& event) { + Bind(wxEVT_MOVE, [](wxMoveEvent& event) { wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); event.Skip(); @@ -1190,7 +1190,7 @@ void MainFrame::init_menubar_as_editor() windowMenu->AppendSeparator(); append_menu_item(windowMenu, wxID_ANY, _L("Open new instance") + "\tCtrl+Shift+I", _L("Open a new PrusaSlicer instance"), - [this](wxCommandEvent&) { start_new_slicer(); }, "", nullptr, [this]() {return m_plater != nullptr && wxGetApp().app_config->get("single_instance") != "1"; }, this); + [](wxCommandEvent&) { start_new_slicer(); }, "", nullptr, [this]() {return m_plater != nullptr && wxGetApp().app_config->get("single_instance") != "1"; }, this); windowMenu->AppendSeparator(); append_menu_item(windowMenu, wxID_ANY, _L("Compare presets")/* + "\tCtrl+F"*/, _L("Compare presets"), @@ -1263,8 +1263,8 @@ void MainFrame::init_menubar_as_gcodeviewer() [this](wxCommandEvent&) { if (m_plater != nullptr) m_plater->export_toolpaths_to_obj(); }, "export_plater", nullptr, [this]() {return can_export_toolpaths(); }, this); append_menu_item(fileMenu, wxID_ANY, _L("Open &PrusaSlicer") + dots, _L("Open PrusaSlicer"), - [this](wxCommandEvent&) { start_new_slicer(); }, "", nullptr, - [this]() {return true; }, this); + [](wxCommandEvent&) { start_new_slicer(); }, "", nullptr, + []() {return true; }, this); fileMenu->AppendSeparator(); append_menu_item(fileMenu, wxID_EXIT, _L("&Quit"), wxString::Format(_L("Quit %s"), SLIC3R_APP_NAME), [this](wxCommandEvent&) { Close(false); }); diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp index 692ae7f1bab..9ff5688be25 100644 --- a/src/slic3r/GUI/Mouse3DController.cpp +++ b/src/slic3r/GUI/Mouse3DController.cpp @@ -397,7 +397,7 @@ void Mouse3DController::save_config(AppConfig &appconfig) const // We do not synchronize m_params_by_device with the background thread explicitely // as there should be a full memory barrier executed once the background thread is stopped. - for (const std::pair &key_value_pair : m_params_by_device) { + for (const auto &key_value_pair : m_params_by_device) { const std::string &device_name = key_value_pair.first; const Params ¶ms = key_value_pair.second; // Store current device parameters into the config diff --git a/src/slic3r/GUI/ObjectDataViewModel.cpp b/src/slic3r/GUI/ObjectDataViewModel.cpp index ef65f59748f..d69f2d07739 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.cpp +++ b/src/slic3r/GUI/ObjectDataViewModel.cpp @@ -1362,7 +1362,7 @@ void ObjectDataViewModel::GetAllChildren(const wxDataViewItem &parent, wxDataVie } wxDataViewItemArray new_array = array; - for (const auto item : new_array) + for (const auto& item : new_array) { wxDataViewItemArray children; GetAllChildren(item, children); diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index dafce5efc65..953275be7e9 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -27,20 +27,20 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co // is the normal type. if (opt.gui_type == "select") { } else if (opt.gui_type == "select_open") { - m_fields.emplace(id, std::move(Choice::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, Choice::Create(this->ctrl_parent(), opt, id)); } else if (opt.gui_type == "color") { - m_fields.emplace(id, std::move(ColourPicker::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, ColourPicker::Create(this->ctrl_parent(), opt, id)); } else if (opt.gui_type == "f_enum_open" || opt.gui_type == "i_enum_open" || opt.gui_type == "i_enum_closed") { - m_fields.emplace(id, std::move(Choice::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, Choice::Create(this->ctrl_parent(), opt, id)); } else if (opt.gui_type == "slider") { - m_fields.emplace(id, std::move(SliderCtrl::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, SliderCtrl::Create(this->ctrl_parent(), opt, id)); } else if (opt.gui_type == "i_spin") { // Spinctrl } else if (opt.gui_type == "legend") { // StaticText - m_fields.emplace(id, std::move(StaticText::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, StaticText::Create(this->ctrl_parent(), opt, id)); } else if (opt.gui_type == "one_string") { - m_fields.emplace(id, std::move(TextCtrl::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, TextCtrl::Create(this->ctrl_parent(), opt, id)); } else { switch (opt.type) { case coFloatOrPercent: @@ -50,18 +50,18 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co case coPercents: case coString: case coStrings: - m_fields.emplace(id, std::move(TextCtrl::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, TextCtrl::Create(this->ctrl_parent(), opt, id)); break; case coBool: case coBools: - m_fields.emplace(id, std::move(CheckBox::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, CheckBox::Create(this->ctrl_parent(), opt, id)); break; case coInt: case coInts: - m_fields.emplace(id, std::move(SpinCtrl::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, SpinCtrl::Create(this->ctrl_parent(), opt, id)); break; case coEnum: - m_fields.emplace(id, std::move(Choice::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, Choice::Create(this->ctrl_parent(), opt, id)); break; case coPoints: m_fields.emplace(id, std::move(PointCtrl::Create(this->ctrl_parent(), opt, id))); diff --git a/src/slic3r/GUI/PhysicalPrinterDialog.cpp b/src/slic3r/GUI/PhysicalPrinterDialog.cpp index b80d8514ff7..8b16575ba85 100644 --- a/src/slic3r/GUI/PhysicalPrinterDialog.cpp +++ b/src/slic3r/GUI/PhysicalPrinterDialog.cpp @@ -275,7 +275,7 @@ void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgr m_optgroup->append_single_option_line("host_type"); - auto create_sizer_with_btn = [this](wxWindow* parent, ScalableButton** btn, const std::string& icon_name, const wxString& label) { + auto create_sizer_with_btn = [](wxWindow* parent, ScalableButton** btn, const std::string& icon_name, const wxString& label) { *btn = new ScalableButton(parent, wxID_ANY, icon_name, label, wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT); (*btn)->SetFont(wxGetApp().normal_font()); @@ -290,7 +290,7 @@ void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgr m_printhost_browse_btn->Bind(wxEVT_BUTTON, [=](wxCommandEvent& e) { BonjourDialog dialog(this, Preset::printer_technology(m_printer.config)); if (dialog.show_and_lookup()) { - m_optgroup->set_value("print_host", std::move(dialog.get_selected()), true); + m_optgroup->set_value("print_host", dialog.get_selected(), true); m_optgroup->get_field("print_host")->field_changed(); } }); @@ -366,7 +366,7 @@ void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgr static const auto filemasks = _L("Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"); wxFileDialog openFileDialog(this, _L("Open CA certificate file"), "", "", filemasks, wxFD_OPEN | wxFD_FILE_MUST_EXIST); if (openFileDialog.ShowModal() != wxID_CANCEL) { - m_optgroup->set_value("printhost_cafile", std::move(openFileDialog.GetPath()), true); + m_optgroup->set_value("printhost_cafile", openFileDialog.GetPath(), true); m_optgroup->get_field("printhost_cafile")->field_changed(); } }); @@ -379,7 +379,7 @@ void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgr Line cafile_hint{ "", "" }; cafile_hint.full_width = 1; - cafile_hint.widget = [this, ca_file_hint](wxWindow* parent) { + cafile_hint.widget = [ca_file_hint](wxWindow* parent) { auto txt = new wxStaticText(parent, wxID_ANY, ca_file_hint); auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(txt); @@ -420,7 +420,7 @@ void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgr { wxTextCtrl* temp = dynamic_cast(printhost_field->getWindow()); if (temp) - temp->Bind(wxEVT_TEXT, ([this, printhost_field, temp](wxEvent& e) + temp->Bind(wxEVT_TEXT, ([printhost_field, temp](wxEvent& e) { #ifndef __WXGTK__ e.Skip(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 3722c55455f..8ca335fa869 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -274,7 +274,7 @@ class FreqChangedParams : public OG_Settings wxButton* get_wiping_dialog_button() { return m_wiping_dialog_button; } wxSizer* get_sizer() override; ConfigOptionsGroup* get_og(const bool is_fff); - void Show(const bool is_fff); + void Show(const bool is_fff) override; void msw_rescale(); }; @@ -2065,7 +2065,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) view3D_canvas->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [q](SimpleEvent&) { q->set_bed_shape(); }); // Preview events: - preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_QUESTION_MARK, [this](SimpleEvent&) { wxGetApp().keyboard_shortcuts(); }); + preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_QUESTION_MARK, [](SimpleEvent&) { wxGetApp().keyboard_shortcuts(); }); preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [q](SimpleEvent&) { q->set_bed_shape(); }); if (wxGetApp().is_editor()) { preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_TAB, [this](SimpleEvent&) { select_next_view_3D(); }); @@ -2127,8 +2127,8 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) if (wxGetApp().is_editor()) { this->q->Bind(EVT_EJECT_DRIVE_NOTIFICAION_CLICKED, [this](EjectDriveNotificationClickedEvent&) { this->q->eject_drive(); }); this->q->Bind(EVT_EXPORT_GCODE_NOTIFICAION_CLICKED, [this](ExportGcodeNotificationClickedEvent&) { this->q->export_gcode(true); }); - this->q->Bind(EVT_PRESET_UPDATE_AVAILABLE_CLICKED, [this](PresetUpdateAvailableClickedEvent&) { wxGetApp().get_preset_updater()->on_update_notification_confirm(); }); - this->q->Bind(EVT_REMOVABLE_DRIVE_EJECTED, [this, q](RemovableDriveEjectEvent &evt) { + this->q->Bind(EVT_PRESET_UPDATE_AVAILABLE_CLICKED, [](PresetUpdateAvailableClickedEvent&) { wxGetApp().get_preset_updater()->on_update_notification_confirm(); }); + this->q->Bind(EVT_REMOVABLE_DRIVE_EJECTED, [this](RemovableDriveEjectEvent &evt) { if (evt.data.second) { this->show_action_buttons(this->ready_to_slice); notification_manager->close_notification_of_type(NotificationType::ExportFinished); @@ -2143,7 +2143,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) ); } }); - this->q->Bind(EVT_REMOVABLE_DRIVES_CHANGED, [this, q](RemovableDrivesChangedEvent &) { + this->q->Bind(EVT_REMOVABLE_DRIVES_CHANGED, [this](RemovableDrivesChangedEvent &) { this->show_action_buttons(this->ready_to_slice); // Close notification ExportingFinished but only if last export was to removable notification_manager->device_ejected(); @@ -4963,7 +4963,7 @@ ProjectDropDialog::ProjectDropDialog(const std::string& filename) wxBoxSizer* bottom_sizer = new wxBoxSizer(wxHORIZONTAL); wxCheckBox* check = new wxCheckBox(this, wxID_ANY, _L("Don't show again")); - check->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent& evt) { + check->Bind(wxEVT_CHECKBOX, [](wxCommandEvent& evt) { wxGetApp().app_config->set("show_drop_project_dialog", evt.IsChecked() ? "0" : "1"); }); diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index 86c643c049f..569cb9a2936 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -738,7 +738,7 @@ void PlaterPresetComboBox::show_add_menu() wxMenu* menu = new wxMenu(); append_menu_item(menu, wxID_ANY, _L("Add/Remove presets"), "", - [this](wxCommandEvent&) { + [](wxCommandEvent&) { wxTheApp->CallAfter([]() { wxGetApp().run_wizard(ConfigWizard::RR_USER, ConfigWizard::SP_PRINTERS); }); }, "edit_uni", menu, []() { return true; }, wxGetApp().plater()); @@ -768,7 +768,7 @@ void PlaterPresetComboBox::show_edit_menu() } else append_menu_item(menu, wxID_ANY, _L("Add/Remove presets"), "", - [this](wxCommandEvent&) { + [](wxCommandEvent&) { wxTheApp->CallAfter([]() { wxGetApp().run_wizard(ConfigWizard::RR_USER, ConfigWizard::SP_PRINTERS); }); }, "edit_uni", menu, []() { return true; }, wxGetApp().plater()); @@ -893,7 +893,7 @@ void PlaterPresetComboBox::update() const PhysicalPrinterCollection& ph_printers = m_preset_bundle->physical_printers; for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) { - for (const std::string preset_name : it->get_preset_names()) { + for (const std::string& preset_name : it->get_preset_names()) { Preset* preset = m_collection->find_preset(preset_name); if (!preset) continue; @@ -1078,7 +1078,7 @@ void TabPresetComboBox::update() const PhysicalPrinterCollection& ph_printers = m_preset_bundle->physical_printers; for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) { - for (const std::string preset_name : it->get_preset_names()) { + for (const std::string& preset_name : it->get_preset_names()) { Preset* preset = m_collection->find_preset(preset_name); if (!preset) continue; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 00e386c1d01..6f371d17521 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -121,7 +121,7 @@ Tab::Tab(wxNotebook* parent, const wxString& title, Preset::Type type) : m_config_manipulation = get_config_manipulation(); - Bind(wxEVT_SIZE, ([this](wxSizeEvent &evt) { + Bind(wxEVT_SIZE, ([](wxSizeEvent &evt) { //for (auto page : m_pages) // if (! page.get()->IsShown()) // page->layout_valid = false; @@ -242,7 +242,7 @@ void Tab::create_preset_tab() if (dlg.ShowModal() == wxID_OK) wxGetApp().update_label_colours(); }); - m_search_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent) { wxGetApp().plater()->search(false); }); + m_search_btn->Bind(wxEVT_BUTTON, [](wxCommandEvent) { wxGetApp().plater()->search(false); }); // Colors for ui "decoration" m_sys_label_clr = wxGetApp().get_label_clr_sys(); @@ -491,7 +491,7 @@ void Tab::update_label_colours() m_modified_label_clr = wxGetApp().get_label_clr_modified(); //update options "decoration" - for (const auto opt : m_options_list) + for (const auto& opt : m_options_list) { const wxColour *color = &m_sys_label_clr; @@ -541,7 +541,7 @@ void Tab::update_label_colours() void Tab::decorate() { - for (const auto opt : m_options_list) + for (const auto& opt : m_options_list) { Field* field = nullptr; wxColour* colored_label_clr = nullptr; @@ -639,7 +639,7 @@ void Tab::init_options_list() if (!m_options_list.empty()) m_options_list.clear(); - for (const auto opt_key : m_config->keys()) + for (const std::string& opt_key : m_config->keys()) m_options_list.emplace(opt_key, m_opt_status_value); } @@ -656,7 +656,7 @@ void TabPrinter::init_options_list() if (!m_options_list.empty()) m_options_list.clear(); - for (const auto opt_key : m_config->keys()) + for (const std::string& opt_key : m_config->keys()) { if (opt_key == "bed_shape" || opt_key == "thumbnails") { m_options_list.emplace(opt_key, m_opt_status_value); @@ -709,7 +709,7 @@ void TabSLAMaterial::init_options_list() if (!m_options_list.empty()) m_options_list.clear(); - for (const auto opt_key : m_config->keys()) + for (const std::string& opt_key : m_config->keys()) { if (opt_key == "compatible_prints" || opt_key == "compatible_printers") { m_options_list.emplace(opt_key, m_opt_status_value); @@ -1728,7 +1728,7 @@ void TabFilament::add_filament_overrides_page() line.near_label_widget = [this, optgroup, opt_key, opt_index](wxWindow* parent) { wxCheckBox* check_box = new wxCheckBox(parent, wxID_ANY, ""); - check_box->Bind(wxEVT_CHECKBOX, [this, optgroup, opt_key, opt_index](wxCommandEvent& evt) { + check_box->Bind(wxEVT_CHECKBOX, [optgroup, opt_key, opt_index](wxCommandEvent& evt) { const bool is_checked = evt.IsChecked(); Field* field = optgroup->get_fieldc(opt_key, opt_index); if (field != nullptr) { @@ -3352,7 +3352,9 @@ bool Tab::tree_sel_change_delayed() wxCheckForInterrupt(m_treectrl); if (m_page_switch_planned) throw UIBuildCanceled(); -#endif // WIN32 +#else // WIN32 + (void)this; // silence warning +#endif }); try { @@ -3924,7 +3926,7 @@ ConfigOptionsGroupShp Page::new_optgroup(const wxString& title, int noncommon_la #else auto tab = parent()->GetParent();// GetParent(); #endif - optgroup->m_on_change = [this, tab](t_config_option_key opt_key, boost::any value) { + optgroup->m_on_change = [tab](t_config_option_key opt_key, boost::any value) { //! This function will be called from OptionGroup. //! Using of CallAfter is redundant. //! And in some cases it causes update() function to be recalled again @@ -3934,21 +3936,21 @@ ConfigOptionsGroupShp Page::new_optgroup(const wxString& title, int noncommon_la //! }); }; - optgroup->m_get_initial_config = [this, tab]() { + optgroup->m_get_initial_config = [tab]() { DynamicPrintConfig config = static_cast(tab)->m_presets->get_selected_preset().config; return config; }; - optgroup->m_get_sys_config = [this, tab]() { + optgroup->m_get_sys_config = [tab]() { DynamicPrintConfig config = static_cast(tab)->m_presets->get_selected_preset_parent()->config; return config; }; - optgroup->have_sys_config = [this, tab]() { + optgroup->have_sys_config = [tab]() { return static_cast(tab)->m_presets->get_selected_preset_parent() != nullptr; }; - optgroup->rescale_extra_column_item = [this](wxWindow* win) { + optgroup->rescale_extra_column_item = [](wxWindow* win) { auto *ctrl = dynamic_cast(win); if (ctrl == nullptr) return; diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 0358fd3150f..d341b7360cf 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -383,7 +383,6 @@ class TabPrint : public Tab private: ogStaticText* m_recommended_thin_wall_thickness_description_line = nullptr; ogStaticText* m_top_bottom_shell_thickness_explanation = nullptr; - bool m_support_material_overhangs_queried = false; }; class TabFilament : public Tab diff --git a/src/slic3r/Utils/Bonjour.cpp b/src/slic3r/Utils/Bonjour.cpp index 28b3b2228a8..f121e6e87ab 100644 --- a/src/slic3r/Utils/Bonjour.cpp +++ b/src/slic3r/Utils/Bonjour.cpp @@ -226,7 +226,7 @@ struct DnsResource } dataoffset = offset; - res.data = std::move(std::vector(buffer.begin() + offset, buffer.begin() + offset + rdlength)); + res.data = std::vector(buffer.begin() + offset, buffer.begin() + offset + rdlength); offset += rdlength; return std::move(res); diff --git a/src/slic3r/Utils/Http.cpp b/src/slic3r/Utils/Http.cpp index 94a8c9a56d5..2afb7ed5046 100644 --- a/src/slic3r/Utils/Http.cpp +++ b/src/slic3r/Utils/Http.cpp @@ -553,7 +553,7 @@ void Http::cancel() Http Http::get(std::string url) { - return std::move(Http{std::move(url)}); + return Http{std::move(url)}; } Http Http::post(std::string url) diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 60dfe05c78e..f0310073fdd 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -206,7 +206,7 @@ bool PresetUpdater::priv::get_file(const std::string &url, const fs::path &targe tmp_path.string()); Http::get(url) - .on_progress([this](Http::Progress, bool &cancel) { + .on_progress([](Http::Progress, bool &cancel) { if (cancel) { cancel = true; } }) .on_error([&](std::string body, std::string error, unsigned http_status) { @@ -406,7 +406,7 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version BOOST_LOG_TRIVIAL(info) << "Checking for cached configuration updates..."; // Over all indices from the cache directory: - for (const auto idx : index_db) { + for (const Index& idx : index_db) { auto bundle_path = vendor_path / (idx.vendor() + ".ini"); auto bundle_path_idx = vendor_path / idx.path().filename(); @@ -679,11 +679,11 @@ void PresetUpdater::sync(PresetBundle *preset_bundle) // into the closure (but perhaps the compiler can elide this). VendorMap vendors = preset_bundle->vendors; - p->thread = std::move(std::thread([this, vendors]() { + p->thread = std::thread([this, vendors]() { this->p->prune_tmps(); this->p->sync_version(); this->p->sync_config(std::move(vendors)); - })); + }); } void PresetUpdater::slic3r_update_notify() From b85de89751c5589b982eb928a49ac05e3242382e Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 29 Jan 2021 17:12:06 +0100 Subject: [PATCH 141/143] Fixing Clang warnings 2 --- src/libslic3r/AABBTreeIndirect.hpp | 2 +- src/libslic3r/Fill/FillRectilinear.hpp | 18 +++++------ src/libslic3r/Geometry.hpp | 2 +- src/libslic3r/MarchingSquares.hpp | 2 +- src/libslic3r/SLA/Concurrency.hpp | 2 +- src/libslic3r/SLAPrint.hpp | 2 +- src/libslic3r/SupportMaterial.cpp | 32 ++------------------ src/libslic3r/SupportMaterial.hpp | 2 +- src/slic3r/GUI/Camera.cpp | 9 ------ src/slic3r/GUI/Field.hpp | 18 +++++------ src/slic3r/GUI/GCodeViewer.cpp | 18 +++++------ src/slic3r/GUI/GLCanvas3D.hpp | 1 - src/slic3r/GUI/GUI.cpp | 4 +-- src/slic3r/GUI/Gizmos/GLGizmoCut.hpp | 22 +++++++------- src/slic3r/GUI/Gizmos/GLGizmoMove.hpp | 16 +++++----- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp | 4 +-- src/slic3r/GUI/Gizmos/GLGizmoScale.hpp | 14 ++++----- src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp | 2 +- src/slic3r/GUI/MainFrame.hpp | 2 +- src/slic3r/GUI/OptionsGroup.hpp | 1 - src/slic3r/Utils/OctoPrint.hpp | 2 +- src/slic3r/Utils/Repetier.hpp | 2 +- 22 files changed, 70 insertions(+), 107 deletions(-) diff --git a/src/libslic3r/AABBTreeIndirect.hpp b/src/libslic3r/AABBTreeIndirect.hpp index 87d1ee9dba4..70096b557bc 100644 --- a/src/libslic3r/AABBTreeIndirect.hpp +++ b/src/libslic3r/AABBTreeIndirect.hpp @@ -653,7 +653,7 @@ inline bool intersect_ray_all_hits( std::vector &hits) { auto ray_intersector = detail::RayIntersectorHits { - vertices, faces, tree, + vertices, faces, {tree}, origin, dir, VectorType(dir.cwiseInverse()) }; if (! tree.empty()) { diff --git a/src/libslic3r/Fill/FillRectilinear.hpp b/src/libslic3r/Fill/FillRectilinear.hpp index 0686fa166a5..692fba2bd1f 100644 --- a/src/libslic3r/Fill/FillRectilinear.hpp +++ b/src/libslic3r/Fill/FillRectilinear.hpp @@ -12,7 +12,7 @@ class Surface; class FillRectilinear : public Fill { public: - Fill* clone() const override { return new FillRectilinear(*this); }; + Fill* clone() const override { return new FillRectilinear(*this); } ~FillRectilinear() override = default; Polylines fill_surface(const Surface *surface, const FillParams ¶ms) override; @@ -32,18 +32,18 @@ class FillRectilinear : public Fill class FillAlignedRectilinear : public FillRectilinear { public: - Fill* clone() const override { return new FillAlignedRectilinear(*this); }; + Fill* clone() const override { return new FillAlignedRectilinear(*this); } ~FillAlignedRectilinear() override = default; protected: // Always generate infill at the same angle. - virtual float _layer_angle(size_t idx) const { return 0.f; } + virtual float _layer_angle(size_t idx) const override { return 0.f; } }; class FillMonotonic : public FillRectilinear { public: - Fill* clone() const override { return new FillMonotonic(*this); }; + Fill* clone() const override { return new FillMonotonic(*this); } ~FillMonotonic() override = default; Polylines fill_surface(const Surface *surface, const FillParams ¶ms) override; bool no_sort() const override { return true; } @@ -52,7 +52,7 @@ class FillMonotonic : public FillRectilinear class FillGrid : public FillRectilinear { public: - Fill* clone() const override { return new FillGrid(*this); }; + Fill* clone() const override { return new FillGrid(*this); } ~FillGrid() override = default; Polylines fill_surface(const Surface *surface, const FillParams ¶ms) override; @@ -64,7 +64,7 @@ class FillGrid : public FillRectilinear class FillTriangles : public FillRectilinear { public: - Fill* clone() const override { return new FillTriangles(*this); }; + Fill* clone() const override { return new FillTriangles(*this); } ~FillTriangles() override = default; Polylines fill_surface(const Surface *surface, const FillParams ¶ms) override; @@ -76,7 +76,7 @@ class FillTriangles : public FillRectilinear class FillStars : public FillRectilinear { public: - Fill* clone() const override { return new FillStars(*this); }; + Fill* clone() const override { return new FillStars(*this); } ~FillStars() override = default; Polylines fill_surface(const Surface *surface, const FillParams ¶ms) override; @@ -88,7 +88,7 @@ class FillStars : public FillRectilinear class FillCubic : public FillRectilinear { public: - Fill* clone() const override { return new FillCubic(*this); }; + Fill* clone() const override { return new FillCubic(*this); } ~FillCubic() override = default; Polylines fill_surface(const Surface *surface, const FillParams ¶ms) override; @@ -98,6 +98,6 @@ class FillCubic : public FillRectilinear }; -}; // namespace Slic3r +} // namespace Slic3r #endif // slic3r_FillRectilinear_hpp_ diff --git a/src/libslic3r/Geometry.hpp b/src/libslic3r/Geometry.hpp index f8d3b0a5c9f..85f181b92fd 100644 --- a/src/libslic3r/Geometry.hpp +++ b/src/libslic3r/Geometry.hpp @@ -213,7 +213,7 @@ inline bool liang_barsky_line_clipping_interval( double t0 = 0.0; double t1 = 1.0; // Traverse through left, right, bottom, top edges. - auto clip_side = [&x0, &v, &bbox, &t0, &t1](double p, double q) -> bool { + auto clip_side = [&t0, &t1](double p, double q) -> bool { if (p == 0) { if (q < 0) // Line parallel to the bounding box edge is fully outside of the bounding box. diff --git a/src/libslic3r/MarchingSquares.hpp b/src/libslic3r/MarchingSquares.hpp index d5f07fbde6d..8370c8cef9a 100644 --- a/src/libslic3r/MarchingSquares.hpp +++ b/src/libslic3r/MarchingSquares.hpp @@ -297,7 +297,7 @@ template class Grid { case SquareTag::full: case SquareTag::none: { Coord crd{tl(cell) + Coord{m_cellsize.r / 2, m_cellsize.c / 2}}; - return {{crd, Dir::none, m_rst}, crd}; + return {{crd, Dir::none, m_rst}, {crd}}; } } diff --git a/src/libslic3r/SLA/Concurrency.hpp b/src/libslic3r/SLA/Concurrency.hpp index 300024c76dd..b692914aca9 100644 --- a/src/libslic3r/SLA/Concurrency.hpp +++ b/src/libslic3r/SLA/Concurrency.hpp @@ -41,7 +41,7 @@ template<> struct _ccr static void for_each(It from, It to, Fn &&fn, size_t granularity = 1) { tbb::parallel_for(tbb::blocked_range{from, to, granularity}, - [&fn, from](const auto &range) { + [&fn](const auto &range) { loop_(range, std::forward(fn)); }); } diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index f69ed7b8e94..742670e2cb9 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -424,7 +424,7 @@ class SLAPrint : public PrintBaseWithState void clear() override; bool empty() const override { return m_objects.empty(); } // List of existing PrintObject IDs, to remove notifications for non-existent IDs. - std::vector print_object_ids() const; + std::vector print_object_ids() const override; ApplyStatus apply(const Model &model, DynamicPrintConfig config) override; void set_task(const TaskParams ¶ms) override; void process() override; diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp index 33e74254ee5..a2d25b51c62 100644 --- a/src/libslic3r/SupportMaterial.cpp +++ b/src/libslic3r/SupportMaterial.cpp @@ -1582,7 +1582,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_conta }); Polygons &layer_support_area = layer_support_areas[layer_id]; - task_group.run([this, &projection, &projection_raw, &layer, &layer_support_area, layer_id] { + task_group.run([this, &projection, &projection_raw, &layer, &layer_support_area] { // Remove the areas that touched from the projection that will continue on next, lower, top surfaces. // Polygons trimming = union_(to_polygons(layer.slices), touching, true); Polygons trimming = offset(layer.lslices, float(SCALED_EPSILON)); @@ -1736,7 +1736,7 @@ void PrintObjectSupportMaterial::trim_top_contacts_by_bottom_contacts( const PrintObject &object, const MyLayersPtr &bottom_contacts, MyLayersPtr &top_contacts) const { tbb::parallel_for(tbb::blocked_range(0, int(top_contacts.size())), - [this, &object, &bottom_contacts, &top_contacts](const tbb::blocked_range& range) { + [&bottom_contacts, &top_contacts](const tbb::blocked_range& range) { int idx_bottom_overlapping_first = -2; // For all top contact layers, counting downwards due to the way idx_higher_or_equal caches the last index to avoid repeated binary search. for (int idx_top = range.end() - 1; idx_top >= range.begin(); -- idx_top) { @@ -1965,7 +1965,7 @@ void PrintObjectSupportMaterial::generate_base_layers( BOOST_LOG_TRIVIAL(debug) << "PrintObjectSupportMaterial::generate_base_layers() in parallel - start"; tbb::parallel_for( tbb::blocked_range(0, intermediate_layers.size()), - [this, &object, &bottom_contacts, &top_contacts, &intermediate_layers, &layer_support_areas](const tbb::blocked_range& range) { + [&object, &bottom_contacts, &top_contacts, &intermediate_layers, &layer_support_areas](const tbb::blocked_range& range) { // index -2 means not initialized yet, -1 means intialized and decremented to 0 and then -1. int idx_top_contact_above = -2; int idx_bottom_contact_overlapping = -2; @@ -2328,32 +2328,6 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_int return interface_layers; } -static inline void fill_expolygons_generate_paths( - ExtrusionEntitiesPtr &dst, - const ExPolygons &expolygons, - Fill *filler, - float density, - ExtrusionRole role, - const Flow &flow) -{ - FillParams fill_params; - fill_params.density = density; - fill_params.dont_adjust = true; - for (const ExPolygon &expoly : expolygons) { - Surface surface(stInternal, expoly); - Polylines polylines; - try { - polylines = filler->fill_surface(&surface, fill_params); - } catch (InfillFailedException &) { - } - extrusion_entities_append_paths( - dst, - std::move(polylines), - role, - flow.mm3_per_mm(), flow.width, flow.height); - } -} - static inline void fill_expolygons_generate_paths( ExtrusionEntitiesPtr &dst, ExPolygons &&expolygons, diff --git a/src/libslic3r/SupportMaterial.hpp b/src/libslic3r/SupportMaterial.hpp index 72d487949f4..e579fd66fbe 100644 --- a/src/libslic3r/SupportMaterial.hpp +++ b/src/libslic3r/SupportMaterial.hpp @@ -246,7 +246,7 @@ class PrintObjectSupportMaterial bool m_can_merge_support_regions; coordf_t m_support_layer_height_min; - coordf_t m_support_layer_height_max; + // coordf_t m_support_layer_height_max; coordf_t m_gap_xy; }; diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 1e589f1a15e..ade1d404370 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -10,15 +10,6 @@ #include -// phi / theta angles to orient the camera. -static const float VIEW_DEFAULT[2] = { 45.0f, 45.0f }; -static const float VIEW_LEFT[2] = { 90.0f, 90.0f }; -static const float VIEW_RIGHT[2] = { -90.0f, 90.0f }; -static const float VIEW_TOP[2] = { 0.0f, 0.0f }; -static const float VIEW_BOTTOM[2] = { 0.0f, 180.0f }; -static const float VIEW_FRONT[2] = { 0.0f, 90.0f }; -static const float VIEW_REAR[2] = { 180.0f, 90.0f }; - namespace Slic3r { namespace GUI { diff --git a/src/slic3r/GUI/Field.hpp b/src/slic3r/GUI/Field.hpp index 5b01c92c954..1b350324129 100644 --- a/src/slic3r/GUI/Field.hpp +++ b/src/slic3r/GUI/Field.hpp @@ -113,8 +113,8 @@ class Field { void field_changed() { on_change_field(); } - Field(const ConfigOptionDef& opt, const t_config_option_key& id) : m_opt(opt), m_opt_id(id) {}; - Field(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : m_parent(parent), m_opt(opt), m_opt_id(id) {}; + Field(const ConfigOptionDef& opt, const t_config_option_key& id) : m_opt(opt), m_opt_id(id) {} + Field(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : m_parent(parent), m_opt(opt), m_opt_id(id) {} virtual ~Field(); /// If you don't know what you are getting back, check both methods for nullptr. @@ -315,12 +315,12 @@ class SpinCtrl : public Field { /// Propagate value from field to the OptionGroupe and Config after kill_focus/ENTER void propagate_value() ; - void set_value(const std::string& value, bool change_event = false) { + void set_value(const std::string& value, bool change_event = false) { m_disable_change_event = !change_event; dynamic_cast(window)->SetValue(value); m_disable_change_event = false; - } - void set_value(const boost::any& value, bool change_event = false) { + } + void set_value(const boost::any& value, bool change_event = false) override { m_disable_change_event = !change_event; tmp_value = boost::any_cast(value); m_value = value; @@ -395,8 +395,8 @@ class ColourPicker : public Field { boost::any& get_value() override; void msw_rescale() override; - void enable() override { dynamic_cast(window)->Enable(); }; - void disable() override{ dynamic_cast(window)->Disable(); }; + void enable() override { dynamic_cast(window)->Enable(); } + void disable() override{ dynamic_cast(window)->Disable(); } wxWindow* getWindow() override { return window; } }; @@ -456,8 +456,8 @@ class StaticText : public Field { void msw_rescale() override; - void enable() override { dynamic_cast(window)->Enable(); }; - void disable() override{ dynamic_cast(window)->Disable(); }; + void enable() override { dynamic_cast(window)->Enable(); } + void disable() override{ dynamic_cast(window)->Disable(); } wxWindow* getWindow() override { return window; } }; diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index e6c5f21de67..48428b4eee7 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -2771,7 +2771,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool return color; }; - auto travel_color = [this](const Path& path) { + auto travel_color = [](const Path& path) { return (path.delta_extruder < 0.0f) ? Travel_Colors[2] /* Retract */ : ((path.delta_extruder > 0.0f) ? Travel_Colors[1] /* Extrude */ : Travel_Colors[0] /* Move */); @@ -3436,7 +3436,7 @@ void GCodeViewer::render_toolpaths() const shader.set_uniform("uniform_color", color4); }; - auto render_as_points = [this, zoom, point_size, near_plane_height, set_uniform_color] + auto render_as_points = [zoom, point_size, near_plane_height, set_uniform_color] (const TBuffer& buffer, unsigned int ibuffer_id, GLShaderProgram& shader) { #if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS shader.set_uniform("use_fixed_screen_size", 1); @@ -3466,7 +3466,7 @@ void GCodeViewer::render_toolpaths() const glsafe(::glDisable(GL_VERTEX_PROGRAM_POINT_SIZE)); }; - auto render_as_lines = [this, light_intensity, set_uniform_color](const TBuffer& buffer, unsigned int ibuffer_id, GLShaderProgram& shader) { + auto render_as_lines = [light_intensity, set_uniform_color](const TBuffer& buffer, unsigned int ibuffer_id, GLShaderProgram& shader) { shader.set_uniform("light_intensity", light_intensity); for (const RenderPath& path : buffer.render_paths) { if (path.index_buffer_id == ibuffer_id) { @@ -3479,7 +3479,7 @@ void GCodeViewer::render_toolpaths() const } }; - auto render_as_triangles = [this, set_uniform_color](const TBuffer& buffer, unsigned int ibuffer_id, GLShaderProgram& shader) { + auto render_as_triangles = [set_uniform_color](const TBuffer& buffer, unsigned int ibuffer_id, GLShaderProgram& shader) { for (const RenderPath& path : buffer.render_paths) { if (path.index_buffer_id == ibuffer_id) { set_uniform_color(path.color, shader); @@ -3874,8 +3874,8 @@ void GCodeViewer::render_legend() const ImGui::PopStyleVar(); }; - auto append_range = [this, draw_list, &imgui, append_item](const Extrusions::Range& range, unsigned int decimals) { - auto append_range_item = [this, draw_list, &imgui, append_item](int i, float value, unsigned int decimals) { + auto append_range = [append_item](const Extrusions::Range& range, unsigned int decimals) { + auto append_range_item = [append_item](int i, float value, unsigned int decimals) { char buf[1024]; ::sprintf(buf, "%.*f", decimals, value); append_item(EItemType::Rect, Range_Colors[i], buf); @@ -3969,7 +3969,7 @@ void GCodeViewer::render_legend() const return _u8L("from") + " " + std::string(buf1) + " " + _u8L("to") + " " + std::string(buf2) + " " + _u8L("mm"); }; - auto role_time_and_percent = [this, time_mode](ExtrusionRole role) { + auto role_time_and_percent = [ time_mode](ExtrusionRole role) { auto it = std::find_if(time_mode.roles_times.begin(), time_mode.roles_times.end(), [role](const std::pair& item) { return role == item.first; }); return (it != time_mode.roles_times.end()) ? std::make_pair(it->second, it->second / time_mode.time) : std::make_pair(0.0f, 0.0f); }; @@ -4177,7 +4177,7 @@ void GCodeViewer::render_legend() const return items; }; - auto append_color_change = [this, &imgui](const Color& color1, const Color& color2, const std::array& offsets, const Times& times) { + auto append_color_change = [&imgui](const Color& color1, const Color& color2, const std::array& offsets, const Times& times) { imgui.text(_u8L("Color change")); ImGui::SameLine(); @@ -4196,7 +4196,7 @@ void GCodeViewer::render_legend() const imgui.text(short_time(get_time_dhms(times.second - times.first))); }; - auto append_print = [this, &imgui](const Color& color, const std::array& offsets, const Times& times) { + auto append_print = [&imgui](const Color& color, const std::array& offsets, const Times& times) { imgui.text(_u8L("Print")); ImGui::SameLine(); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 8e31addaabd..d3b4e17483e 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -394,7 +394,6 @@ class GLCanvas3D class Slope { bool m_enabled{ false }; - bool m_dialog_shown{ false }; GLCanvas3D& m_canvas; GLVolumeCollection& m_volumes; static float s_window_width; diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index 58149181d9e..3b44f20696d 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -35,7 +35,7 @@ void disable_screensaver() { #if __APPLE__ CFStringRef reasonForActivity = CFSTR("Slic3r"); - IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, + [[maybe_unused]]IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, kIOPMAssertionLevelOn, reasonForActivity, &assertionID); // ignore result: success == kIOReturnSuccess #elif _WIN32 @@ -46,7 +46,7 @@ void disable_screensaver() void enable_screensaver() { #if __APPLE__ - IOReturn success = IOPMAssertionRelease(assertionID); + IOPMAssertionRelease(assertionID); #elif _WIN32 SetThreadExecutionState(ES_CONTINUOUS); #endif diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp index c0f33978f61..1bd917c8627 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp @@ -31,17 +31,17 @@ class GLGizmoCut : public GLGizmoBase std::string get_tooltip() const override; protected: - virtual bool on_init(); - virtual void on_load(cereal::BinaryInputArchive& ar) { ar(m_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower); } - virtual void on_save(cereal::BinaryOutputArchive& ar) const { ar(m_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower); } - virtual std::string on_get_name() const; - virtual void on_set_state(); - virtual bool on_is_activable() const; - virtual void on_start_dragging(); - virtual void on_update(const UpdateData& data); - virtual void on_render() const; - virtual void on_render_for_picking() const; - virtual void on_render_input_window(float x, float y, float bottom_limit); + virtual bool on_init() override; + virtual void on_load(cereal::BinaryInputArchive& ar) override{ ar(m_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower); } + virtual void on_save(cereal::BinaryOutputArchive& ar) const override { ar(m_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower); } + virtual std::string on_get_name() const override; + virtual void on_set_state() override; + virtual bool on_is_activable() const override; + virtual void on_start_dragging() override; + virtual void on_update(const UpdateData& data) override; + virtual void on_render() const override; + virtual void on_render_for_picking() const override; + virtual void on_render_input_window(float x, float y, float bottom_limit) override; private: void update_max_z(const Selection& selection) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp index 5a4275b7fcc..20aa9f56cce 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp @@ -33,14 +33,14 @@ class GLGizmoMove3D : public GLGizmoBase std::string get_tooltip() const override; protected: - virtual bool on_init(); - virtual std::string on_get_name() const; - virtual bool on_is_activable() const; - virtual void on_start_dragging(); - virtual void on_stop_dragging(); - virtual void on_update(const UpdateData& data); - virtual void on_render() const; - virtual void on_render_for_picking() const; + virtual bool on_init() override; + virtual std::string on_get_name() const override; + virtual bool on_is_activable() const override; + virtual void on_start_dragging() override; + virtual void on_stop_dragging() override; + virtual void on_update(const UpdateData& data) override; + virtual void on_render() const override; + virtual void on_render_for_picking() const override; private: double calc_projection(const UpdateData& data) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp index 6f8cbec603d..da415ce09aa 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp @@ -59,8 +59,8 @@ class GLGizmoPainterBase : public GLGizmoBase private: ObjectID m_old_mo_id; size_t m_old_volumes_size = 0; - virtual void on_render() const {} - virtual void on_render_for_picking() const {} + virtual void on_render() const override {} + virtual void on_render_for_picking() const override {} public: GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp index 0d8f3f7fa79..39021640ad0 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp @@ -47,13 +47,13 @@ class GLGizmoScale3D : public GLGizmoBase std::string get_tooltip() const override; protected: - virtual bool on_init(); - virtual std::string on_get_name() const; - virtual bool on_is_activable() const; - virtual void on_start_dragging(); - virtual void on_update(const UpdateData& data); - virtual void on_render() const; - virtual void on_render_for_picking() const; + virtual bool on_init() override; + virtual std::string on_get_name() const override; + virtual bool on_is_activable() const override; + virtual void on_start_dragging() override; + virtual void on_update(const UpdateData& data) override; + virtual void on_render() const override; + virtual void on_render_for_picking() const override; private: void render_grabbers_connection(unsigned int id_1, unsigned int id_2) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp index aedf782e89f..61c27329766 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp @@ -161,7 +161,7 @@ class SelectionInfo : public CommonGizmosDataBase private: ModelObject* m_model_object = nullptr; - int m_active_inst = -1; + // int m_active_inst = -1; float m_z_shift = 0.f; }; diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index c39527409c6..0971fdc77a7 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -133,7 +133,7 @@ class MainFrame : public DPIFrame ESettingsLayout m_layout{ ESettingsLayout::Unknown }; protected: - virtual void on_dpi_changed(const wxRect &suggested_rect); + virtual void on_dpi_changed(const wxRect &suggested_rect) override; virtual void on_sys_color_changed() override; public: diff --git a/src/slic3r/GUI/OptionsGroup.hpp b/src/slic3r/GUI/OptionsGroup.hpp index 5bc2d45959d..f19a3e0336a 100644 --- a/src/slic3r/GUI/OptionsGroup.hpp +++ b/src/slic3r/GUI/OptionsGroup.hpp @@ -273,7 +273,6 @@ class ConfigOptionsGroup: public OptionsGroup { const DynamicPrintConfig* m_config {nullptr}; // If the config is modelconfig, then ModelConfig::touch() has to be called after value change. ModelConfig* m_modelconfig { nullptr }; - bool m_full_labels{ 0 }; t_opt_map m_opt_map; std::string m_config_category; diff --git a/src/slic3r/Utils/OctoPrint.hpp b/src/slic3r/Utils/OctoPrint.hpp index ed1c61bd607..f1b36096c65 100644 --- a/src/slic3r/Utils/OctoPrint.hpp +++ b/src/slic3r/Utils/OctoPrint.hpp @@ -20,7 +20,7 @@ class OctoPrint : public PrintHost OctoPrint(DynamicPrintConfig *config); ~OctoPrint() override = default; - const char* get_name() const; + const char* get_name() const override; bool test(wxString &curl_msg) const override; wxString get_test_ok_msg () const override; diff --git a/src/slic3r/Utils/Repetier.hpp b/src/slic3r/Utils/Repetier.hpp index d94d7ec56ab..5141dc040bb 100644 --- a/src/slic3r/Utils/Repetier.hpp +++ b/src/slic3r/Utils/Repetier.hpp @@ -19,7 +19,7 @@ class Repetier : public PrintHost Repetier(DynamicPrintConfig *config); ~Repetier() override = default; - const char* get_name() const; + const char* get_name() const override; bool test(wxString &curl_msg) const override; wxString get_test_ok_msg () const override; From 1834ebe9815fa58fb6376cbe269d8c1f44aa6d9f Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 29 Jan 2021 18:08:04 +0100 Subject: [PATCH 142/143] Fixing Clang warnings 3 --- src/libslic3r/AppConfig.cpp | 2 +- src/libslic3r/Config.hpp | 4 ++-- src/libslic3r/Format/3mf.cpp | 1 - src/libslic3r/GCode.cpp | 2 +- src/libslic3r/GCode/SeamPlacer.cpp | 2 +- src/libslic3r/PresetBundle.cpp | 2 +- src/libslic3r/Print.cpp | 2 +- src/libslic3r/PrintObject.cpp | 2 +- src/libslic3r/SLA/IndexedMesh.cpp | 2 -- src/libslic3r/ShortestPath.cpp | 4 ++-- src/slic3r/GUI/DoubleSlider.cpp | 2 +- src/slic3r/GUI/FirmwareDialog.cpp | 2 +- src/slic3r/GUI/GLCanvas3D.cpp | 9 ++++----- src/slic3r/GUI/GUI_ObjectLayers.cpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 2 +- src/slic3r/GUI/ImGuiWrapper.cpp | 2 +- src/slic3r/GUI/ObjectDataViewModel.cpp | 2 +- src/slic3r/GUI/OptionsGroup.cpp | 2 +- src/slic3r/Utils/FlashAir.cpp | 2 +- src/slic3r/Utils/Repetier.cpp | 4 ++-- src/slic3r/Utils/UndoRedo.cpp | 2 +- 21 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 4b3d33a549d..79b9a025a65 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -395,7 +395,7 @@ std::vector AppConfig::get_mouse_device_names() const static constexpr const char *prefix = "mouse_device:"; static const size_t prefix_len = strlen(prefix); std::vector out; - for (const std::pair>& key_value_pair : m_storage) + for (const auto& key_value_pair : m_storage) if (boost::starts_with(key_value_pair.first, prefix) && key_value_pair.first.size() > prefix_len) out.emplace_back(key_value_pair.first.substr(prefix_len)); return out; diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index 4b726bea9ec..5e4b2ed6a08 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -1358,11 +1358,11 @@ class ConfigOptionEnum : public ConfigOptionSingle // Initialize the map. const t_config_enum_values &enum_keys_map = ConfigOptionEnum::get_enum_values(); int cnt = 0; - for (const std::pair &kvp : enum_keys_map) + for (const auto& kvp : enum_keys_map) cnt = std::max(cnt, kvp.second); cnt += 1; names.assign(cnt, ""); - for (const std::pair &kvp : enum_keys_map) + for (const auto& kvp : enum_keys_map) names[kvp.second] = kvp.first; } return names; diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index ba477be8e5b..c9f11086442 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -124,7 +124,6 @@ const char* VALID_OBJECT_TYPES[] = "model" }; -const unsigned int INVALID_OBJECT_TYPES_COUNT = 4; const char* INVALID_OBJECT_TYPES[] = { "solidsupport", diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 261487cc163..f076a74ca0d 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -851,7 +851,7 @@ namespace DoExport { double extruded_volume = extruder.extruded_volume() + (has_wipe_tower ? wipe_tower_data.used_filament[extruder.id()] * 2.4052f : 0.f); // assumes 1.75mm filament diameter double filament_weight = extruded_volume * extruder.filament_density() * 0.001; double filament_cost = filament_weight * extruder.filament_cost() * 0.001; - auto append = [&extruder, &extruders](std::pair &dst, const char *tmpl, double value) { + auto append = [&extruder](std::pair &dst, const char *tmpl, double value) { while (dst.second < extruder.id()) { // Fill in the non-printing extruders with zeros. dst.first += (dst.second > 0) ? ", 0" : "0"; diff --git a/src/libslic3r/GCode/SeamPlacer.cpp b/src/libslic3r/GCode/SeamPlacer.cpp index 1acc160f0f8..1778e06892a 100644 --- a/src/libslic3r/GCode/SeamPlacer.cpp +++ b/src/libslic3r/GCode/SeamPlacer.cpp @@ -664,7 +664,7 @@ static std::vector find_enforcer_centers(const Polygon& polygon, if (polygon.size() < 2 || enforcers_idxs.empty()) return out; - auto get_center_idx = [&polygon, &lengths](size_t start_idx, size_t end_idx) -> size_t { + auto get_center_idx = [&lengths](size_t start_idx, size_t end_idx) -> size_t { assert(end_idx >= start_idx); if (start_idx == end_idx) return start_idx; diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 8fc8e92899b..7d08c93592e 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -915,7 +915,7 @@ void PresetBundle::load_config_file_config_bundle(const std::string &path, const std::string bundle_name = std::string(" - ") + boost::filesystem::path(path).filename().string(); // 2) Extract active configs from the config bundle, copy them and activate them in this bundle. - auto load_one = [this, &path, &bundle_name](PresetCollection &collection_dst, PresetCollection &collection_src, const std::string &preset_name_src, bool activate) -> std::string { + auto load_one = [&path, &bundle_name](PresetCollection &collection_dst, PresetCollection &collection_src, const std::string &preset_name_src, bool activate) -> std::string { Preset *preset_src = collection_src.find_preset(preset_name_src, false); Preset *preset_dst = collection_dst.find_preset(preset_name_src, false); assert(preset_src != nullptr); diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 61a5ae99c3b..b96768904d8 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1405,7 +1405,7 @@ std::string Print::validate() const return L("One or more object were assigned an extruder that the printer does not have."); #endif - auto validate_extrusion_width = [min_nozzle_diameter, max_nozzle_diameter](const ConfigBase &config, const char *opt_key, double layer_height, std::string &err_msg) -> bool { + auto validate_extrusion_width = [/*min_nozzle_diameter,*/ max_nozzle_diameter](const ConfigBase &config, const char *opt_key, double layer_height, std::string &err_msg) -> bool { // This may change in the future, if we switch to "extrusion width wrt. nozzle diameter" // instead of currently used logic "extrusion width wrt. layer height", see GH issues #1923 #2829. // double extrusion_width_min = config.get_abs_value(opt_key, min_nozzle_diameter); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 3595f68388c..ee2e645695a 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -908,7 +908,7 @@ void PrintObject::detect_surfaces_type() // Fill in layerm->fill_surfaces by trimming the layerm->slices by the cummulative layerm->fill_surfaces. tbb::parallel_for( tbb::blocked_range(0, m_layers.size()), - [this, idx_region, interface_shells](const tbb::blocked_range& range) { + [this, idx_region](const tbb::blocked_range& range) { for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { m_print->throw_if_canceled(); LayerRegion *layerm = m_layers[idx_layer]->m_regions[idx_region]; diff --git a/src/libslic3r/SLA/IndexedMesh.cpp b/src/libslic3r/SLA/IndexedMesh.cpp index efcf09873eb..485fa98ed83 100644 --- a/src/libslic3r/SLA/IndexedMesh.cpp +++ b/src/libslic3r/SLA/IndexedMesh.cpp @@ -55,8 +55,6 @@ class IndexedMesh::AABBImpl { } }; -static const constexpr double MESH_EPS = 1e-6; - IndexedMesh::IndexedMesh(const TriangleMesh& tmesh) : m_aabb(new AABBImpl()), m_tm(&tmesh) { diff --git a/src/libslic3r/ShortestPath.cpp b/src/libslic3r/ShortestPath.cpp index 9565b1874e5..60f8feaa636 100644 --- a/src/libslic3r/ShortestPath.cpp +++ b/src/libslic3r/ShortestPath.cpp @@ -1423,7 +1423,7 @@ static inline void do_crossover(const std::vector &edges_in, std::vect const std::pair &span2, bool reversed2, bool flipped2, const std::pair &span3, bool reversed3, bool flipped3) { auto it_edges_out = edges_out.begin(); - auto copy_span = [&edges_in, &edges_out, &it_edges_out](std::pair span, bool reversed, bool flipped) { + auto copy_span = [&edges_in, &it_edges_out](std::pair span, bool reversed, bool flipped) { assert(span.first < span.second); auto it = it_edges_out; if (reversed) @@ -1466,7 +1466,7 @@ static inline void do_crossover(const std::vector &edges_in, std::vect const std::pair &span3, bool reversed3, bool flipped3, const std::pair &span4, bool reversed4, bool flipped4) { auto it_edges_out = edges_out.begin(); - auto copy_span = [&edges_in, &edges_out, &it_edges_out](std::pair span, bool reversed, bool flipped) { + auto copy_span = [&edges_in, &it_edges_out](std::pair span, bool reversed, bool flipped) { assert(span.first < span.second); auto it = it_edges_out; if (reversed) diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 1e4eed1e8c6..fddb63e3e4b 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -1889,7 +1889,7 @@ void Control::show_cog_icon_context_menu() []() { return true; }, [this]() { return m_extra_style & wxSL_VALUE_LABEL; }, GUI::wxGetApp().plater()); append_submenu(&menu, ruler_mode_menu, wxID_ANY, _L("Ruler mode"), _L("Set ruler mode"), "", - [this]() { return true; }, this); + []() { return true; }, this); } if (m_mode == MultiAsSingle && m_draw_mode == dmRegular) diff --git a/src/slic3r/GUI/FirmwareDialog.cpp b/src/slic3r/GUI/FirmwareDialog.cpp index 046d9d1386f..6927a03302a 100644 --- a/src/slic3r/GUI/FirmwareDialog.cpp +++ b/src/slic3r/GUI/FirmwareDialog.cpp @@ -648,7 +648,7 @@ void FirmwareDialog::priv::perform_upload() } } }) - .on_message([q, extra_verbose](const char *msg, unsigned /* size */) { + .on_message([q](const char *msg, unsigned /* size */) { if (extra_verbose) { BOOST_LOG_TRIVIAL(debug) << "avrdude: " << msg; } diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 917e11d0fdd..b97c51d1b0a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4582,9 +4582,9 @@ bool GLCanvas3D::_init_main_toolbar() "\n" + "[" + GUI::shortkey_ctrl_prefix() + "4] - " + _u8L("Printer Settings Tab") ; item.sprite_id = 10; item.enabling_callback = GLToolbarItem::Default_Enabling_Callback; - item.visibility_callback = [this]() { return (wxGetApp().app_config->get("new_settings_layout_mode") == "1" || - wxGetApp().app_config->get("dlg_settings_layout_mode") == "1"); }; - item.left.action_callback = [this]() { wxGetApp().mainframe->select_tab(); }; + item.visibility_callback = []() { return (wxGetApp().app_config->get("new_settings_layout_mode") == "1" || + wxGetApp().app_config->get("dlg_settings_layout_mode") == "1"); }; + item.left.action_callback = []() { wxGetApp().mainframe->select_tab(); }; if (!m_main_toolbar.add_item(item)) return false; @@ -5910,8 +5910,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c tbb::blocked_range(0, ctxt.layers.size(), grain_size), [&ctxt, &new_volume, is_selected_separate_extruder, this](const tbb::blocked_range& range) { GLVolumePtrs vols; - std::vector color_print_layer_to_glvolume; - auto volume = [&ctxt, &vols, &color_print_layer_to_glvolume, &range](size_t layer_idx, int extruder, int feature) -> GLVolume& { + auto volume = [&ctxt, &vols](size_t layer_idx, int extruder, int feature) -> GLVolume& { return *vols[ctxt.color_by_color_print()? ctxt.color_print_color_idx_by_layer_idx_and_extruder(layer_idx, extruder) : ctxt.color_by_tool() ? diff --git a/src/slic3r/GUI/GUI_ObjectLayers.cpp b/src/slic3r/GUI/GUI_ObjectLayers.cpp index 7d8643c7f84..8768f39ff71 100644 --- a/src/slic3r/GUI/GUI_ObjectLayers.cpp +++ b/src/slic3r/GUI/GUI_ObjectLayers.cpp @@ -132,7 +132,7 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range, PlusMinus // Add control for the "Layer height" editor = new LayerRangeEditor(this, double_to_string(m_object->layer_config_ranges[range].option("layer_height")->getFloat()), etLayerHeight, set_focus_data, - [range, this](coordf_t layer_height, bool, bool) + [range](coordf_t layer_height, bool, bool) { return wxGetApp().obj_list()->edit_layer_range(range, layer_height); }); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index e626aa7f866..2f7fa4638b5 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -893,7 +893,7 @@ void GLGizmoSlaSupports::on_set_state() // Only take the snapshot when the USER opens the gizmo. Common gizmos // data are not yet available, the CallAfter will postpone taking the // snapshot until they are. No, it does not feel right. - wxGetApp().CallAfter([this]() { + wxGetApp().CallAfter([]() { Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on"))); }); } diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index ff8ba8f48ab..1ed4b492fd2 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -940,7 +940,7 @@ void ImGuiWrapper::init_font(bool compress) config.MergeMode = true; if (! m_font_cjk) { // Apple keyboard shortcuts are only contained in the CJK fonts. - ImFont *font_cjk = io.Fonts->AddFontFromFileTTF((Slic3r::resources_dir() + "/fonts/NotoSansCJK-Regular.ttc").c_str(), m_font_size, &config, ranges_keyboard_shortcuts); + [[maybe_unused]]ImFont *font_cjk = io.Fonts->AddFontFromFileTTF((Slic3r::resources_dir() + "/fonts/NotoSansCJK-Regular.ttc").c_str(), m_font_size, &config, ranges_keyboard_shortcuts); assert(font_cjk != nullptr); } #endif diff --git a/src/slic3r/GUI/ObjectDataViewModel.cpp b/src/slic3r/GUI/ObjectDataViewModel.cpp index d69f2d07739..7de37fb48c4 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.cpp +++ b/src/slic3r/GUI/ObjectDataViewModel.cpp @@ -1208,7 +1208,7 @@ void ObjectDataViewModel::AddAllChildren(const wxDataViewItem& parent) ItemAdded(parent, wxDataViewItem((void*)child)); } - for (const auto item : array) + for (const auto& item : array) AddAllChildren(item); m_ctrl->Expand(parent); diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 953275be7e9..d077c81f601 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -64,7 +64,7 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co m_fields.emplace(id, Choice::Create(this->ctrl_parent(), opt, id)); break; case coPoints: - m_fields.emplace(id, std::move(PointCtrl::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, PointCtrl::Create(this->ctrl_parent(), opt, id)); break; case coNone: break; default: diff --git a/src/slic3r/Utils/FlashAir.cpp b/src/slic3r/Utils/FlashAir.cpp index 22eaddecef5..2337ac29043 100644 --- a/src/slic3r/Utils/FlashAir.cpp +++ b/src/slic3r/Utils/FlashAir.cpp @@ -50,7 +50,7 @@ bool FlashAir::test(wxString &msg) const res = false; msg = format_error(body, error, status); }) - .on_complete([&, this](std::string body, unsigned) { + .on_complete([&](std::string body, unsigned) { BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: Got upload enabled: %2%") % name % body; res = boost::starts_with(body, "1"); diff --git a/src/slic3r/Utils/Repetier.cpp b/src/slic3r/Utils/Repetier.cpp index 115ea010ef9..7b66922d708 100644 --- a/src/slic3r/Utils/Repetier.cpp +++ b/src/slic3r/Utils/Repetier.cpp @@ -190,7 +190,7 @@ bool Repetier::get_groups(wxArrayString& groups) const http.on_error([&](std::string body, std::string error, unsigned status) { BOOST_LOG_TRIVIAL(error) << boost::format("%1%: Error getting version: %2%, HTTP %3%, body: `%4%`") % name % error % status % body; }) - .on_complete([&, this](std::string body, unsigned) { + .on_complete([&](std::string body, unsigned) { BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: Got groups: %2%") % name % body; try { @@ -233,7 +233,7 @@ bool Repetier::get_printers(wxArrayString& printers) const BOOST_LOG_TRIVIAL(error) << boost::format("%1%: Error listing printers: %2%, HTTP %3%, body: `%4%`") % name % error % status % body; res = false; }) - .on_complete([&, this](std::string body, unsigned http_status) { + .on_complete([&](std::string body, unsigned http_status) { BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: Got printers: %2%, HTTP status: %3%") % name % body % http_status; if (http_status != 200) diff --git a/src/slic3r/Utils/UndoRedo.cpp b/src/slic3r/Utils/UndoRedo.cpp index d82d9e31db8..697c1209dee 100644 --- a/src/slic3r/Utils/UndoRedo.cpp +++ b/src/slic3r/Utils/UndoRedo.cpp @@ -209,7 +209,7 @@ class ImmutableObjectHistory : public ObjectHistory bool is_immutable() const override { return true; } bool is_optional() const override { return m_optional; } // If it is an immutable object, return its pointer. There is a map assigning a temporary ObjectID to the immutable object pointer. - const void* immutable_object_ptr() const { return (const void*)m_shared_object.get(); } + const void* immutable_object_ptr() const override { return (const void*)m_shared_object.get(); } // Estimated size in memory, to be used to drop least recently used snapshots. size_t memsize() const override { From a7728634f0a641672747c578f83a1245881d54a4 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 8 Feb 2021 17:50:29 +0100 Subject: [PATCH 143/143] Clang: silence -Wdeprecated-declarations for now RPi: hopefully silence a warning --- CMakeLists.txt | 7 +++++++ src/libslic3r/SLA/Rotfinder.cpp | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c32fc6b7b0e..1a751eafe66 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -202,6 +202,13 @@ if (NOT MSVC AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMP add_compile_options(-Wno-ignored-attributes) # Tamas: Eigen include dirs are marked as SYSTEM endif() + # Clang reports legacy OpenGL calls as deprecated. Turn off the warning for now + # to reduce the clutter, we know about this one. It should be reenabled after + # we finally get rid of the deprecated code. + if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + add_compile_options(-Wno-deprecated-declarations) + endif() + #GCC generates loads of -Wunknown-pragmas when compiling igl. The fix is not easy due to a bug in gcc, see # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66943 or # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431 diff --git a/src/libslic3r/SLA/Rotfinder.cpp b/src/libslic3r/SLA/Rotfinder.cpp index 9378977663b..702690c196d 100644 --- a/src/libslic3r/SLA/Rotfinder.cpp +++ b/src/libslic3r/SLA/Rotfinder.cpp @@ -165,7 +165,7 @@ XYRotation from_transform3d(const Transform3d &tr) template std::array find_min_score(Fn &&fn, It from, It to, StopCond &&stopfn) { - std::array ret; + std::array ret = {}; double score = std::numeric_limits::max();

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μUgK&-22%Bq)6Q+`G7`GuDHQ*nA50aCi_B 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