From ee4f2cf549cc6e32b3b4d9ef7bf7e9f9d055f910 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 23 Jul 2018 09:59:04 +0200 Subject: [PATCH 01/21] Try to fix #977 --- xs/src/slic3r/GUI/GLCanvas3D.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index 064a9adce9..94f6f0441e 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -3379,7 +3379,13 @@ void GLCanvas3D::on_key_down(wxKeyEvent& evt) if (key == WXK_DELETE) m_on_remove_object_callback.call(); else - evt.Skip(); + { +#ifdef __WXOSX__ + if (key == WXK_BACK) + m_on_remove_object_callback.call(); +#endif + evt.Skip(); + } } } From 40b55a3818fa52158616944daaa1d0e04c786f40 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 23 Jul 2018 11:33:13 +0200 Subject: [PATCH 02/21] Allow delete button in object list --- lib/Slic3r/GUI/Plater.pm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 4a56ce632b..44b5d94a98 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -310,6 +310,9 @@ sub new { my ($list, $event) = @_; if ($event->GetKeyCode == WXK_TAB) { $list->Navigate($event->ShiftDown ? &Wx::wxNavigateBackward : &Wx::wxNavigateForward); + } elsif ($event->GetKeyCode == WXK_DELETE || + ($event->GetKeyCode == WXK_BACK && &Wx::wxMAC) ) { + $self->remove; } else { $event->Skip; } From dd088ba0cc84cb3cb80c4152e388ec16feb85c67 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 23 Jul 2018 15:44:01 +0200 Subject: [PATCH 03/21] Localized the (modified) profile indicator --- resources/localization/Slic3rPE.pot | 2298 +++++++------ resources/localization/uk/Slic3rPE.mo | Bin 140068 -> 137296 bytes resources/localization/uk/Slic3rPE_uk.po | 3737 +++++++++++++++------- xs/src/slic3r/GUI/GUI.cpp | 2 + xs/src/slic3r/GUI/Preset.cpp | 5 + xs/src/slic3r/GUI/Preset.hpp | 3 +- xs/src/slic3r/GUI/Tab.cpp | 7 +- 7 files changed, 3867 insertions(+), 2185 deletions(-) diff --git a/resources/localization/Slic3rPE.pot b/resources/localization/Slic3rPE.pot index 029e7c4b2f..7fa65fc5ed 100644 --- a/resources/localization/Slic3rPE.pot +++ b/resources/localization/Slic3rPE.pot @@ -3,12 +3,13 @@ # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # +#: xs/src/slic3r/GUI/Tab.cpp:1721 #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-26 11:11+0200\n" +"POT-Creation-Date: 2018-07-23 12:06+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -32,8 +33,8 @@ msgstr "" msgid "Rectangular" msgstr "" -#: xs/src/slic3r/GUI/BedShapeDialog.cpp:50 xs/src/slic3r/GUI/Tab.cpp:1745 -#: lib/Slic3r/GUI/Plater.pm:477 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:50 xs/src/slic3r/GUI/Tab.cpp:1826 +#: lib/Slic3r/GUI/Plater.pm:498 msgid "Size" msgstr "" @@ -56,33 +57,33 @@ msgid "Circular" msgstr "" #: xs/src/slic3r/GUI/BedShapeDialog.cpp:65 -#: xs/src/slic3r/GUI/ConfigWizard.cpp:87 -#: xs/src/slic3r/GUI/ConfigWizard.cpp:439 -#: xs/src/slic3r/GUI/ConfigWizard.cpp:453 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:88 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:446 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:460 #: xs/src/slic3r/GUI/RammingChart.cpp:81 #: xs/src/slic3r/GUI/WipeTowerDialog.cpp:79 -#: xs/src/libslic3r/PrintConfig.cpp:130 xs/src/libslic3r/PrintConfig.cpp:173 -#: xs/src/libslic3r/PrintConfig.cpp:181 xs/src/libslic3r/PrintConfig.cpp:229 -#: xs/src/libslic3r/PrintConfig.cpp:240 xs/src/libslic3r/PrintConfig.cpp:354 -#: xs/src/libslic3r/PrintConfig.cpp:365 xs/src/libslic3r/PrintConfig.cpp:384 -#: xs/src/libslic3r/PrintConfig.cpp:497 xs/src/libslic3r/PrintConfig.cpp:851 -#: xs/src/libslic3r/PrintConfig.cpp:871 xs/src/libslic3r/PrintConfig.cpp:879 -#: xs/src/libslic3r/PrintConfig.cpp:937 xs/src/libslic3r/PrintConfig.cpp:955 -#: xs/src/libslic3r/PrintConfig.cpp:973 xs/src/libslic3r/PrintConfig.cpp:1035 -#: xs/src/libslic3r/PrintConfig.cpp:1152 xs/src/libslic3r/PrintConfig.cpp:1160 -#: xs/src/libslic3r/PrintConfig.cpp:1202 xs/src/libslic3r/PrintConfig.cpp:1211 -#: xs/src/libslic3r/PrintConfig.cpp:1221 xs/src/libslic3r/PrintConfig.cpp:1229 -#: xs/src/libslic3r/PrintConfig.cpp:1237 xs/src/libslic3r/PrintConfig.cpp:1323 -#: xs/src/libslic3r/PrintConfig.cpp:1529 xs/src/libslic3r/PrintConfig.cpp:1599 -#: xs/src/libslic3r/PrintConfig.cpp:1633 xs/src/libslic3r/PrintConfig.cpp:1829 -#: xs/src/libslic3r/PrintConfig.cpp:1836 xs/src/libslic3r/PrintConfig.cpp:1843 -#: xs/src/libslic3r/PrintConfig.cpp:1857 xs/src/libslic3r/PrintConfig.cpp:1867 -#: xs/src/libslic3r/PrintConfig.cpp:1877 +#: xs/src/libslic3r/PrintConfig.cpp:133 xs/src/libslic3r/PrintConfig.cpp:181 +#: xs/src/libslic3r/PrintConfig.cpp:189 xs/src/libslic3r/PrintConfig.cpp:237 +#: xs/src/libslic3r/PrintConfig.cpp:248 xs/src/libslic3r/PrintConfig.cpp:363 +#: xs/src/libslic3r/PrintConfig.cpp:374 xs/src/libslic3r/PrintConfig.cpp:393 +#: xs/src/libslic3r/PrintConfig.cpp:531 xs/src/libslic3r/PrintConfig.cpp:890 +#: xs/src/libslic3r/PrintConfig.cpp:1002 xs/src/libslic3r/PrintConfig.cpp:1010 +#: xs/src/libslic3r/PrintConfig.cpp:1068 xs/src/libslic3r/PrintConfig.cpp:1086 +#: xs/src/libslic3r/PrintConfig.cpp:1104 xs/src/libslic3r/PrintConfig.cpp:1166 +#: xs/src/libslic3r/PrintConfig.cpp:1176 xs/src/libslic3r/PrintConfig.cpp:1292 +#: xs/src/libslic3r/PrintConfig.cpp:1300 xs/src/libslic3r/PrintConfig.cpp:1342 +#: xs/src/libslic3r/PrintConfig.cpp:1351 xs/src/libslic3r/PrintConfig.cpp:1361 +#: xs/src/libslic3r/PrintConfig.cpp:1369 xs/src/libslic3r/PrintConfig.cpp:1377 +#: xs/src/libslic3r/PrintConfig.cpp:1463 xs/src/libslic3r/PrintConfig.cpp:1669 +#: xs/src/libslic3r/PrintConfig.cpp:1739 xs/src/libslic3r/PrintConfig.cpp:1773 +#: xs/src/libslic3r/PrintConfig.cpp:1969 xs/src/libslic3r/PrintConfig.cpp:1976 +#: xs/src/libslic3r/PrintConfig.cpp:1983 xs/src/libslic3r/PrintConfig.cpp:2015 +#: xs/src/libslic3r/PrintConfig.cpp:2025 xs/src/libslic3r/PrintConfig.cpp:2035 msgid "mm" msgstr "" #: xs/src/slic3r/GUI/BedShapeDialog.cpp:66 -#: xs/src/libslic3r/PrintConfig.cpp:494 +#: xs/src/libslic3r/PrintConfig.cpp:528 msgid "Diameter" msgstr "" @@ -93,7 +94,7 @@ msgid "" msgstr "" #: xs/src/slic3r/GUI/BedShapeDialog.cpp:71 -#: xs/src/libslic3r/GCode/PreviewData.cpp:170 +#: xs/src/libslic3r/GCode/PreviewData.cpp:175 #: lib/Slic3r/GUI/Plater/3DPreview.pm:102 msgid "Custom" msgstr "" @@ -124,7 +125,7 @@ msgid "" msgstr "" #: xs/src/slic3r/GUI/BedShapeDialog.hpp:44 -#: xs/src/slic3r/GUI/ConfigWizard.cpp:402 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:409 msgid "Bed Shape" msgstr "" @@ -210,7 +211,7 @@ msgstr "" msgid "printer" msgstr "" -#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:49 xs/src/slic3r/GUI/Tab.cpp:758 +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:49 xs/src/slic3r/GUI/Tab.cpp:730 msgid "vendor" msgstr "" @@ -242,70 +243,74 @@ msgstr "" msgid "Activate" msgstr "" -#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 xs/src/slic3r/GUI/GUI.cpp:323 +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 xs/src/slic3r/GUI/GUI.cpp:349 msgid "Configuration Snapshots" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:87 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:88 msgid "nozzle" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:105 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:89 +msgid "(default)" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:108 msgid "Select all" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:106 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:109 msgid "Select none" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:212 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:218 #, possible-c-format msgid "Welcome to the Slic3r %s" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:212 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:218 msgid "Welcome" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:218 xs/src/slic3r/GUI/GUI.cpp:320 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:224 xs/src/slic3r/GUI/GUI.cpp:346 #, possible-c-format msgid "Run %s" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:220 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:226 #, possible-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." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:224 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:230 msgid "" "Remove user profiles - install from scratch (a snapshot will be taken " "beforehand)" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:245 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:252 msgid "Other vendors" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:247 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:254 msgid "Custom setup" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:271 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:278 msgid "Automatic updates" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:271 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:278 msgid "Updates" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:279 xs/src/slic3r/GUI/Preferences.cpp:59 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:286 xs/src/slic3r/GUI/Preferences.cpp:59 msgid "Check for application updates" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:282 xs/src/slic3r/GUI/Preferences.cpp:61 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:289 xs/src/slic3r/GUI/Preferences.cpp:61 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 " @@ -313,11 +318,11 @@ msgid "" "notification mechanisms, no automatic installation is done." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:286 xs/src/slic3r/GUI/Preferences.cpp:67 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:293 xs/src/slic3r/GUI/Preferences.cpp:67 msgid "Update built-in Presets automatically" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:289 xs/src/slic3r/GUI/Preferences.cpp:69 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:296 xs/src/slic3r/GUI/Preferences.cpp:69 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -325,134 +330,134 @@ msgid "" "startup." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:290 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:297 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:295 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:302 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:302 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:309 msgid "Other Vendors" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:304 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:311 msgid "Pick another vendor supported by Slic3r PE:" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:363 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:370 msgid "Firmware Type" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:363 xs/src/slic3r/GUI/Tab.cpp:1628 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:370 xs/src/slic3r/GUI/Tab.cpp:1606 msgid "Firmware" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:367 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:374 msgid "Choose the type of firmware used by your printer." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:402 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:409 msgid "Bed Shape and Size" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:405 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:412 msgid "Set the shape of your printer's bed." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:419 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:426 msgid "Filament and Nozzle Diameters" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:419 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:426 msgid "Print Diameters" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:435 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:442 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:438 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:445 msgid "Nozzle Diameter:" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:448 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:455 msgid "Enter the diameter of your filament." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:449 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:456 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:452 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:459 msgid "Filament Diameter:" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:470 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:477 msgid "Extruder and Bed Temperatures" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:470 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:477 msgid "Temperatures" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:486 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:493 msgid "Enter the temperature needed for extruding your filament." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:487 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:494 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:490 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:497 msgid "Extrusion Temperature:" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:491 -#: xs/src/slic3r/GUI/ConfigWizard.cpp:505 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:498 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:512 msgid "°C" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:500 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:507 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:501 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:508 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:504 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:511 msgid "Bed Temperature:" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:817 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:824 msgid "< &Back" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:818 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:825 msgid "&Next >" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:819 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:826 msgid "&Finish" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:889 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:896 msgid "Configuration Wizard" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:891 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:898 msgid "Configuration Assistant" msgstr "" @@ -526,138 +531,138 @@ msgstr "" msgid "Confirmation" msgstr "" -#: xs/src/slic3r/GUI/GLCanvas3D.cpp:1990 +#: xs/src/slic3r/GUI/GLCanvas3D.cpp:2308 msgid "Detected object outside print volume" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:208 +#: xs/src/slic3r/GUI/GUI.cpp:233 msgid "Array of language names and identifiers should have the same size." msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:219 +#: xs/src/slic3r/GUI/GUI.cpp:244 msgid "Select the language" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:219 +#: xs/src/slic3r/GUI/GUI.cpp:244 msgid "Language" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:281 xs/src/libslic3r/PrintConfig.cpp:187 +#: xs/src/slic3r/GUI/GUI.cpp:306 xs/src/libslic3r/PrintConfig.cpp:195 msgid "Default" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:323 +#: xs/src/slic3r/GUI/GUI.cpp:349 msgid "Inspect / activate configuration snapshots" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:324 +#: xs/src/slic3r/GUI/GUI.cpp:350 msgid "Take Configuration Snapshot" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:324 +#: xs/src/slic3r/GUI/GUI.cpp:350 msgid "Capture a configuration snapshot" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:327 xs/src/slic3r/GUI/Preferences.cpp:9 +#: xs/src/slic3r/GUI/GUI.cpp:353 xs/src/slic3r/GUI/Preferences.cpp:9 msgid "Preferences" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:327 +#: xs/src/slic3r/GUI/GUI.cpp:353 msgid "Application preferences" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:328 +#: xs/src/slic3r/GUI/GUI.cpp:354 msgid "Change Application Language" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:330 +#: xs/src/slic3r/GUI/GUI.cpp:356 msgid "Flash printer firmware" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:330 +#: xs/src/slic3r/GUI/GUI.cpp:356 msgid "Upload a firmware image into an Arduino based printer" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:342 +#: xs/src/slic3r/GUI/GUI.cpp:368 msgid "Taking configuration snapshot" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:342 +#: xs/src/slic3r/GUI/GUI.cpp:368 msgid "Snapshot name" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:380 +#: xs/src/slic3r/GUI/GUI.cpp:406 msgid "Application will be restarted" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:380 +#: xs/src/slic3r/GUI/GUI.cpp:406 msgid "Attention!" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:396 +#: xs/src/slic3r/GUI/GUI.cpp:422 msgid "&Configuration" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:420 +#: xs/src/slic3r/GUI/GUI.cpp:446 msgid "You have unsaved changes " msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:420 +#: xs/src/slic3r/GUI/GUI.cpp:446 msgid ". Discard changes and continue anyway?" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:421 +#: xs/src/slic3r/GUI/GUI.cpp:447 msgid "Unsaved Presets" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:629 +#: xs/src/slic3r/GUI/GUI.cpp:655 msgid "Notice" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:634 +#: xs/src/slic3r/GUI/GUI.cpp:660 msgid "Attempt to free unreferenced scalar" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:636 xs/src/slic3r/GUI/WipeTowerDialog.cpp:39 +#: xs/src/slic3r/GUI/GUI.cpp:662 xs/src/slic3r/GUI/WipeTowerDialog.cpp:39 #: xs/src/slic3r/GUI/WipeTowerDialog.cpp:321 msgid "Warning" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:825 +#: xs/src/slic3r/GUI/GUI.cpp:859 msgid "Support" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:828 +#: xs/src/slic3r/GUI/GUI.cpp:862 msgid "Select what kind of support do you need" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:829 xs/src/libslic3r/GCode/PreviewData.cpp:157 +#: xs/src/slic3r/GUI/GUI.cpp:863 xs/src/libslic3r/GCode/PreviewData.cpp:162 msgid "None" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:830 xs/src/libslic3r/PrintConfig.cpp:1516 +#: xs/src/slic3r/GUI/GUI.cpp:864 xs/src/libslic3r/PrintConfig.cpp:1656 msgid "Support on build plate only" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:831 +#: xs/src/slic3r/GUI/GUI.cpp:865 msgid "Everywhere" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:843 xs/src/slic3r/GUI/Tab.cpp:872 +#: xs/src/slic3r/GUI/GUI.cpp:877 xs/src/slic3r/GUI/Tab.cpp:844 msgid "Brim" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:845 +#: xs/src/slic3r/GUI/GUI.cpp:879 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:854 +#: xs/src/slic3r/GUI/GUI.cpp:888 msgid "Purging volumes" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:896 +#: xs/src/slic3r/GUI/GUI.cpp:930 msgid "Export print config" msgstr "" @@ -669,248 +674,249 @@ msgstr "" msgid "Slic3r has encountered an error" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:103 +#: xs/src/slic3r/GUI/Tab.cpp:84 msgid "Save current " msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:104 +#: xs/src/slic3r/GUI/Tab.cpp:85 msgid "Delete this preset" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:116 +#: xs/src/slic3r/GUI/Tab.cpp:97 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:744 +#: xs/src/slic3r/GUI/Tab.cpp:716 msgid "It's a default preset." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:745 +#: xs/src/slic3r/GUI/Tab.cpp:717 msgid "It's a system preset." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:746 +#: xs/src/slic3r/GUI/Tab.cpp:718 msgid "Current preset is inherited from " msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:751 +#: xs/src/slic3r/GUI/Tab.cpp:723 msgid "It can't be deleted or modified. " msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:752 +#: xs/src/slic3r/GUI/Tab.cpp:724 msgid "" "Any modifications should be saved as a new preset inherited from this one. " msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:753 +#: xs/src/slic3r/GUI/Tab.cpp:725 msgid "To do that please specify a new name for the preset." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:757 +#: xs/src/slic3r/GUI/Tab.cpp:729 msgid "Additional information:" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:765 +#: xs/src/slic3r/GUI/Tab.cpp:737 msgid "printer model" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:767 +#: xs/src/slic3r/GUI/Tab.cpp:739 msgid "default print profile" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:770 +#: xs/src/slic3r/GUI/Tab.cpp:742 msgid "default filament profile" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:814 +#: xs/src/slic3r/GUI/Tab.cpp:786 msgid "Layers and perimeters" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:815 xs/src/libslic3r/PrintConfig.cpp:847 +#: xs/src/slic3r/GUI/Tab.cpp:787 xs/src/libslic3r/PrintConfig.cpp:886 msgid "Layer height" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:819 +#: xs/src/slic3r/GUI/Tab.cpp:791 msgid "Vertical shells" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:830 +#: xs/src/slic3r/GUI/Tab.cpp:802 msgid "Horizontal shells" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:831 xs/src/libslic3r/PrintConfig.cpp:1422 +#: xs/src/slic3r/GUI/Tab.cpp:803 xs/src/libslic3r/PrintConfig.cpp:1562 msgid "Solid layers" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:836 +#: xs/src/slic3r/GUI/Tab.cpp:808 msgid "Quality (slower slicing)" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:843 xs/src/slic3r/GUI/Tab.cpp:857 -#: xs/src/slic3r/GUI/Tab.cpp:951 xs/src/slic3r/GUI/Tab.cpp:954 -#: xs/src/slic3r/GUI/Tab.cpp:1303 xs/src/slic3r/GUI/Tab.cpp:1631 -#: xs/src/libslic3r/PrintConfig.cpp:107 xs/src/libslic3r/PrintConfig.cpp:237 -#: xs/src/libslic3r/PrintConfig.cpp:799 xs/src/libslic3r/PrintConfig.cpp:1863 +#: xs/src/slic3r/GUI/Tab.cpp:815 xs/src/slic3r/GUI/Tab.cpp:829 +#: xs/src/slic3r/GUI/Tab.cpp:923 xs/src/slic3r/GUI/Tab.cpp:926 +#: xs/src/slic3r/GUI/Tab.cpp:1276 xs/src/slic3r/GUI/Tab.cpp:1625 +#: xs/src/libslic3r/PrintConfig.cpp:110 xs/src/libslic3r/PrintConfig.cpp:245 +#: xs/src/libslic3r/PrintConfig.cpp:833 xs/src/libslic3r/PrintConfig.cpp:2021 msgid "Advanced" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:847 xs/src/slic3r/GUI/Tab.cpp:848 -#: xs/src/slic3r/GUI/Tab.cpp:1155 xs/src/libslic3r/PrintConfig.cpp:87 -#: xs/src/libslic3r/PrintConfig.cpp:276 xs/src/libslic3r/PrintConfig.cpp:551 -#: xs/src/libslic3r/PrintConfig.cpp:565 xs/src/libslic3r/PrintConfig.cpp:603 -#: xs/src/libslic3r/PrintConfig.cpp:744 xs/src/libslic3r/PrintConfig.cpp:754 -#: xs/src/libslic3r/PrintConfig.cpp:772 xs/src/libslic3r/PrintConfig.cpp:790 -#: xs/src/libslic3r/PrintConfig.cpp:809 xs/src/libslic3r/PrintConfig.cpp:1371 -#: xs/src/libslic3r/PrintConfig.cpp:1388 +#: xs/src/slic3r/GUI/Tab.cpp:819 xs/src/slic3r/GUI/Tab.cpp:820 +#: xs/src/slic3r/GUI/Tab.cpp:1127 xs/src/libslic3r/PrintConfig.cpp:90 +#: xs/src/libslic3r/PrintConfig.cpp:284 xs/src/libslic3r/PrintConfig.cpp:585 +#: xs/src/libslic3r/PrintConfig.cpp:599 xs/src/libslic3r/PrintConfig.cpp:637 +#: xs/src/libslic3r/PrintConfig.cpp:778 xs/src/libslic3r/PrintConfig.cpp:788 +#: xs/src/libslic3r/PrintConfig.cpp:806 xs/src/libslic3r/PrintConfig.cpp:824 +#: xs/src/libslic3r/PrintConfig.cpp:843 xs/src/libslic3r/PrintConfig.cpp:1511 +#: xs/src/libslic3r/PrintConfig.cpp:1528 msgid "Infill" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:853 +#: xs/src/slic3r/GUI/Tab.cpp:825 msgid "Reducing printing time" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:865 +#: xs/src/slic3r/GUI/Tab.cpp:837 msgid "Skirt and brim" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:866 xs/src/libslic3r/GCode/PreviewData.cpp:166 +#: xs/src/slic3r/GUI/Tab.cpp:838 xs/src/libslic3r/GCode/PreviewData.cpp:171 #: lib/Slic3r/GUI/Plater/3DPreview.pm:98 msgid "Skirt" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:875 xs/src/slic3r/GUI/Tab.cpp:876 -#: xs/src/libslic3r/PrintConfig.cpp:220 xs/src/libslic3r/PrintConfig.cpp:1138 -#: xs/src/libslic3r/PrintConfig.cpp:1488 xs/src/libslic3r/PrintConfig.cpp:1495 -#: xs/src/libslic3r/PrintConfig.cpp:1507 xs/src/libslic3r/PrintConfig.cpp:1517 -#: xs/src/libslic3r/PrintConfig.cpp:1525 xs/src/libslic3r/PrintConfig.cpp:1540 -#: xs/src/libslic3r/PrintConfig.cpp:1561 xs/src/libslic3r/PrintConfig.cpp:1572 -#: xs/src/libslic3r/PrintConfig.cpp:1588 xs/src/libslic3r/PrintConfig.cpp:1597 -#: xs/src/libslic3r/PrintConfig.cpp:1606 xs/src/libslic3r/PrintConfig.cpp:1617 -#: xs/src/libslic3r/PrintConfig.cpp:1631 xs/src/libslic3r/PrintConfig.cpp:1639 -#: xs/src/libslic3r/PrintConfig.cpp:1640 xs/src/libslic3r/PrintConfig.cpp:1649 -#: xs/src/libslic3r/PrintConfig.cpp:1657 xs/src/libslic3r/PrintConfig.cpp:1671 -#: xs/src/libslic3r/GCode/PreviewData.cpp:167 +#: xs/src/slic3r/GUI/Tab.cpp:847 xs/src/slic3r/GUI/Tab.cpp:848 +#: xs/src/libslic3r/PrintConfig.cpp:228 xs/src/libslic3r/PrintConfig.cpp:1278 +#: xs/src/libslic3r/PrintConfig.cpp:1628 xs/src/libslic3r/PrintConfig.cpp:1635 +#: xs/src/libslic3r/PrintConfig.cpp:1647 xs/src/libslic3r/PrintConfig.cpp:1657 +#: xs/src/libslic3r/PrintConfig.cpp:1665 xs/src/libslic3r/PrintConfig.cpp:1680 +#: xs/src/libslic3r/PrintConfig.cpp:1701 xs/src/libslic3r/PrintConfig.cpp:1712 +#: xs/src/libslic3r/PrintConfig.cpp:1728 xs/src/libslic3r/PrintConfig.cpp:1737 +#: xs/src/libslic3r/PrintConfig.cpp:1746 xs/src/libslic3r/PrintConfig.cpp:1757 +#: xs/src/libslic3r/PrintConfig.cpp:1771 xs/src/libslic3r/PrintConfig.cpp:1779 +#: xs/src/libslic3r/PrintConfig.cpp:1780 xs/src/libslic3r/PrintConfig.cpp:1789 +#: xs/src/libslic3r/PrintConfig.cpp:1797 xs/src/libslic3r/PrintConfig.cpp:1811 +#: xs/src/libslic3r/GCode/PreviewData.cpp:172 #: lib/Slic3r/GUI/Plater/3DPreview.pm:99 msgid "Support material" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:881 +#: xs/src/slic3r/GUI/Tab.cpp:853 msgid "Raft" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:885 +#: xs/src/slic3r/GUI/Tab.cpp:857 msgid "Options for support material and raft" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:899 xs/src/libslic3r/PrintConfig.cpp:119 -#: xs/src/libslic3r/PrintConfig.cpp:307 xs/src/libslic3r/PrintConfig.cpp:698 -#: xs/src/libslic3r/PrintConfig.cpp:810 xs/src/libslic3r/PrintConfig.cpp:1072 -#: xs/src/libslic3r/PrintConfig.cpp:1309 xs/src/libslic3r/PrintConfig.cpp:1359 -#: xs/src/libslic3r/PrintConfig.cpp:1410 xs/src/libslic3r/PrintConfig.cpp:1731 +#: xs/src/slic3r/GUI/Tab.cpp:871 xs/src/libslic3r/PrintConfig.cpp:122 +#: xs/src/libslic3r/PrintConfig.cpp:315 xs/src/libslic3r/PrintConfig.cpp:732 +#: xs/src/libslic3r/PrintConfig.cpp:844 xs/src/libslic3r/PrintConfig.cpp:1212 +#: xs/src/libslic3r/PrintConfig.cpp:1449 xs/src/libslic3r/PrintConfig.cpp:1499 +#: xs/src/libslic3r/PrintConfig.cpp:1550 xs/src/libslic3r/PrintConfig.cpp:1871 #: lib/Slic3r/GUI/Plater/3DPreview.pm:77 msgid "Speed" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:900 +#: xs/src/slic3r/GUI/Tab.cpp:872 msgid "Speed for print moves" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:912 +#: xs/src/slic3r/GUI/Tab.cpp:884 msgid "Speed for non-print moves" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:915 +#: xs/src/slic3r/GUI/Tab.cpp:887 msgid "Modifiers" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:918 +#: xs/src/slic3r/GUI/Tab.cpp:890 msgid "Acceleration control (advanced)" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:925 +#: xs/src/slic3r/GUI/Tab.cpp:897 msgid "Autospeed (advanced)" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:931 +#: xs/src/slic3r/GUI/Tab.cpp:903 msgid "Multiple Extruders" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:932 xs/src/slic3r/GUI/Tab.cpp:1473 -#: xs/src/libslic3r/PrintConfig.cpp:337 xs/src/libslic3r/PrintConfig.cpp:765 -#: xs/src/libslic3r/PrintConfig.cpp:1051 xs/src/libslic3r/PrintConfig.cpp:1380 -#: xs/src/libslic3r/PrintConfig.cpp:1553 xs/src/libslic3r/PrintConfig.cpp:1579 +#: xs/src/slic3r/GUI/Tab.cpp:904 xs/src/slic3r/GUI/Tab.cpp:1451 +#: xs/src/libslic3r/PrintConfig.cpp:345 xs/src/libslic3r/PrintConfig.cpp:799 +#: xs/src/libslic3r/PrintConfig.cpp:1191 xs/src/libslic3r/PrintConfig.cpp:1520 +#: xs/src/libslic3r/PrintConfig.cpp:1693 xs/src/libslic3r/PrintConfig.cpp:1719 +#: xs/src/libslic3r/PrintConfig.cpp:1995 xs/src/libslic3r/PrintConfig.cpp:2004 msgid "Extruders" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:939 +#: xs/src/slic3r/GUI/Tab.cpp:911 msgid "Ooze prevention" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:943 xs/src/libslic3r/GCode/PreviewData.cpp:169 +#: xs/src/slic3r/GUI/Tab.cpp:915 xs/src/libslic3r/GCode/PreviewData.cpp:174 #: lib/Slic3r/GUI/Plater/3DPreview.pm:101 msgid "Wipe tower" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:955 +#: xs/src/slic3r/GUI/Tab.cpp:927 msgid "Extrusion width" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:965 +#: xs/src/slic3r/GUI/Tab.cpp:937 msgid "Overlap" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:968 +#: xs/src/slic3r/GUI/Tab.cpp:940 msgid "Flow" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:971 +#: xs/src/slic3r/GUI/Tab.cpp:943 msgid "Other" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:978 +#: xs/src/slic3r/GUI/Tab.cpp:950 msgid "Output options" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:979 +#: xs/src/slic3r/GUI/Tab.cpp:951 msgid "Sequential printing" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:981 +#: xs/src/slic3r/GUI/Tab.cpp:953 msgid "Extruder clearance (mm)" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:990 +#: xs/src/slic3r/GUI/Tab.cpp:962 msgid "Output file" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:996 xs/src/libslic3r/PrintConfig.cpp:1094 +#: xs/src/slic3r/GUI/Tab.cpp:968 xs/src/libslic3r/PrintConfig.cpp:1234 msgid "Post-processing scripts" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1002 xs/src/slic3r/GUI/Tab.cpp:1003 -#: xs/src/slic3r/GUI/Tab.cpp:1352 xs/src/slic3r/GUI/Tab.cpp:1353 -#: xs/src/slic3r/GUI/Tab.cpp:1674 xs/src/slic3r/GUI/Tab.cpp:1675 +#: xs/src/slic3r/GUI/Tab.cpp:974 xs/src/slic3r/GUI/Tab.cpp:975 +#: xs/src/slic3r/GUI/Tab.cpp:1329 xs/src/slic3r/GUI/Tab.cpp:1330 +#: xs/src/slic3r/GUI/Tab.cpp:1668 xs/src/slic3r/GUI/Tab.cpp:1669 msgid "Notes" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1009 xs/src/slic3r/GUI/Tab.cpp:1360 -#: xs/src/slic3r/GUI/Tab.cpp:1681 +#: xs/src/slic3r/GUI/Tab.cpp:981 xs/src/slic3r/GUI/Tab.cpp:1337 +#: xs/src/slic3r/GUI/Tab.cpp:1675 msgid "Dependencies" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1010 xs/src/slic3r/GUI/Tab.cpp:1361 -#: xs/src/slic3r/GUI/Tab.cpp:1682 +#: xs/src/slic3r/GUI/Tab.cpp:982 xs/src/slic3r/GUI/Tab.cpp:1338 +#: xs/src/slic3r/GUI/Tab.cpp:1676 msgid "Profile dependencies" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1011 xs/src/slic3r/GUI/Tab.cpp:1362 -#: xs/src/slic3r/GUI/Tab.cpp:2261 xs/src/libslic3r/PrintConfig.cpp:144 +#: xs/src/slic3r/GUI/Tab.cpp:983 xs/src/slic3r/GUI/Tab.cpp:1339 +#: xs/src/slic3r/GUI/Tab.cpp:2364 xs/src/libslic3r/PrintConfig.cpp:147 msgid "Compatible printers" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1044 +#: xs/src/slic3r/GUI/Tab.cpp:1016 #, no-c-format msgid "" "The Spiral Vase mode requires:\n" @@ -923,11 +929,11 @@ msgid "" "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1051 +#: xs/src/slic3r/GUI/Tab.cpp:1023 msgid "Spiral Vase" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1072 +#: xs/src/slic3r/GUI/Tab.cpp:1044 msgid "" "The Wipe Tower currently supports the non-soluble supports only\n" "if they are printed with the current extruder without triggering a tool " @@ -938,11 +944,11 @@ msgid "" "Shall I adjust those settings in order to enable the Wipe Tower?" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1076 xs/src/slic3r/GUI/Tab.cpp:1093 +#: xs/src/slic3r/GUI/Tab.cpp:1048 xs/src/slic3r/GUI/Tab.cpp:1065 msgid "Wipe Tower" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1090 +#: xs/src/slic3r/GUI/Tab.cpp:1062 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers\n" "need to be synchronized with the object layers.\n" @@ -950,7 +956,7 @@ msgid "" "Shall I synchronize support layers in order to enable the Wipe Tower?" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1108 +#: xs/src/slic3r/GUI/Tab.cpp:1080 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters\n" @@ -958,15 +964,15 @@ msgid "" "Shall I adjust those settings for supports?" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1111 +#: xs/src/slic3r/GUI/Tab.cpp:1083 msgid "Support Generator" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1153 +#: xs/src/slic3r/GUI/Tab.cpp:1125 msgid "The " msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1153 +#: xs/src/slic3r/GUI/Tab.cpp:1125 #, no-c-format msgid "" " infill pattern is not supposed to work at 100% density.\n" @@ -974,343 +980,384 @@ msgid "" "Shall I switch to rectilinear fill pattern?" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1258 xs/src/slic3r/GUI/Tab.cpp:1259 -#: lib/Slic3r/GUI/Plater.pm:433 +#: xs/src/slic3r/GUI/Tab.cpp:1231 xs/src/slic3r/GUI/Tab.cpp:1232 +#: lib/Slic3r/GUI/Plater.pm:454 msgid "Filament" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1266 +#: xs/src/slic3r/GUI/Tab.cpp:1239 msgid "Temperature " msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1267 xs/src/libslic3r/PrintConfig.cpp:336 +#: xs/src/slic3r/GUI/Tab.cpp:1240 xs/src/libslic3r/PrintConfig.cpp:344 msgid "Extruder" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1272 +#: xs/src/slic3r/GUI/Tab.cpp:1245 msgid "Bed" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1277 +#: xs/src/slic3r/GUI/Tab.cpp:1250 msgid "Cooling" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1278 xs/src/libslic3r/PrintConfig.cpp:1006 -#: xs/src/libslic3r/PrintConfig.cpp:1801 +#: xs/src/slic3r/GUI/Tab.cpp:1251 xs/src/libslic3r/PrintConfig.cpp:1137 +#: xs/src/libslic3r/PrintConfig.cpp:1941 msgid "Enable" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1289 +#: xs/src/slic3r/GUI/Tab.cpp:1262 msgid "Fan settings" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1290 +#: xs/src/slic3r/GUI/Tab.cpp:1263 msgid "Fan speed" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1298 +#: xs/src/slic3r/GUI/Tab.cpp:1271 msgid "Cooling thresholds" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1304 +#: xs/src/slic3r/GUI/Tab.cpp:1277 msgid "Filament properties" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1308 +#: xs/src/slic3r/GUI/Tab.cpp:1281 msgid "Print speed override" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1318 +#: xs/src/slic3r/GUI/Tab.cpp:1291 msgid "Toolchange parameters with single extruder MM printers" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1322 +#: xs/src/slic3r/GUI/Tab.cpp:1299 msgid "Ramming" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1324 +#: xs/src/slic3r/GUI/Tab.cpp:1301 msgid "Ramming settings" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1339 xs/src/slic3r/GUI/Tab.cpp:1637 +#: xs/src/slic3r/GUI/Tab.cpp:1316 xs/src/slic3r/GUI/Tab.cpp:1631 msgid "Custom G-code" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1340 xs/src/slic3r/GUI/Tab.cpp:1638 -#: xs/src/libslic3r/PrintConfig.cpp:1450 xs/src/libslic3r/PrintConfig.cpp:1465 +#: xs/src/slic3r/GUI/Tab.cpp:1317 xs/src/slic3r/GUI/Tab.cpp:1632 +#: xs/src/libslic3r/PrintConfig.cpp:1590 xs/src/libslic3r/PrintConfig.cpp:1605 msgid "Start G-code" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1346 xs/src/slic3r/GUI/Tab.cpp:1644 -#: xs/src/libslic3r/PrintConfig.cpp:246 xs/src/libslic3r/PrintConfig.cpp:256 +#: xs/src/slic3r/GUI/Tab.cpp:1323 xs/src/slic3r/GUI/Tab.cpp:1638 +#: xs/src/libslic3r/PrintConfig.cpp:254 xs/src/libslic3r/PrintConfig.cpp:264 msgid "End G-code" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1441 xs/src/slic3r/GUI/Preferences.cpp:17 +#: xs/src/slic3r/GUI/Tab.cpp:1419 xs/src/slic3r/GUI/Preferences.cpp:17 msgid "General" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1442 +#: xs/src/slic3r/GUI/Tab.cpp:1420 msgid "Size and coordinates" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1444 xs/src/libslic3r/PrintConfig.cpp:34 +#: xs/src/slic3r/GUI/Tab.cpp:1422 xs/src/libslic3r/PrintConfig.cpp:37 msgid "Bed shape" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1446 xs/src/slic3r/GUI/Tab.cpp:2229 +#: xs/src/slic3r/GUI/Tab.cpp:1424 xs/src/slic3r/GUI/Tab.cpp:2332 msgid " Set " msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1469 +#: xs/src/slic3r/GUI/Tab.cpp:1447 msgid "Capabilities" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1474 +#: xs/src/slic3r/GUI/Tab.cpp:1452 msgid "Number of extruders of the printer." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1499 +#: xs/src/slic3r/GUI/Tab.cpp:1477 msgid "USB/Serial connection" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1500 xs/src/libslic3r/PrintConfig.cpp:1301 +#: xs/src/slic3r/GUI/Tab.cpp:1478 xs/src/libslic3r/PrintConfig.cpp:1441 msgid "Serial port" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1505 +#: xs/src/slic3r/GUI/Tab.cpp:1483 msgid "Rescan serial ports" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1514 xs/src/slic3r/GUI/Tab.cpp:1561 +#: xs/src/slic3r/GUI/Tab.cpp:1492 xs/src/slic3r/GUI/Tab.cpp:1539 msgid "Test" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1527 +#: xs/src/slic3r/GUI/Tab.cpp:1505 msgid "Connection to printer works correctly." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1527 xs/src/slic3r/GUI/Tab.cpp:1571 +#: xs/src/slic3r/GUI/Tab.cpp:1505 xs/src/slic3r/GUI/Tab.cpp:1549 msgid "Success!" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1530 +#: xs/src/slic3r/GUI/Tab.cpp:1508 msgid "Connection failed." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1542 xs/src/slic3r/Utils/OctoPrint.cpp:110 +#: xs/src/slic3r/GUI/Tab.cpp:1520 xs/src/slic3r/Utils/OctoPrint.cpp:110 msgid "OctoPrint upload" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1545 xs/src/slic3r/GUI/Tab.cpp:1594 +#: xs/src/slic3r/GUI/Tab.cpp:1523 xs/src/slic3r/GUI/Tab.cpp:1572 msgid " Browse " msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1571 +#: xs/src/slic3r/GUI/Tab.cpp:1549 msgid "Connection to OctoPrint works correctly." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1574 +#: xs/src/slic3r/GUI/Tab.cpp:1552 msgid "Could not connect to OctoPrint" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1574 +#: xs/src/slic3r/GUI/Tab.cpp:1552 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1600 +#: xs/src/slic3r/GUI/Tab.cpp:1578 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1601 +#: xs/src/slic3r/GUI/Tab.cpp:1579 msgid "Open CA certificate file" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1615 +#: xs/src/slic3r/GUI/Tab.cpp:1593 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1650 xs/src/libslic3r/PrintConfig.cpp:48 +#: xs/src/slic3r/GUI/Tab.cpp:1644 xs/src/libslic3r/PrintConfig.cpp:51 msgid "Before layer change G-code" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1656 xs/src/libslic3r/PrintConfig.cpp:836 +#: xs/src/slic3r/GUI/Tab.cpp:1650 xs/src/libslic3r/PrintConfig.cpp:875 msgid "After layer change G-code" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1662 xs/src/libslic3r/PrintConfig.cpp:1708 +#: xs/src/slic3r/GUI/Tab.cpp:1656 xs/src/libslic3r/PrintConfig.cpp:1848 msgid "Tool change G-code" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1668 +#: xs/src/slic3r/GUI/Tab.cpp:1662 msgid "Between objects G-code (for sequential printing)" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1720 xs/src/slic3r/GUI/Tab.cpp:1728 +#: xs/src/slic3r/GUI/Tab.cpp:1717 xs/src/slic3r/GUI/Tab.cpp:1778 +#: xs/src/slic3r/GUI/Tab.cpp:2037 xs/src/libslic3r/PrintConfig.cpp:920 +#: xs/src/libslic3r/PrintConfig.cpp:929 xs/src/libslic3r/PrintConfig.cpp:938 +#: xs/src/libslic3r/PrintConfig.cpp:950 xs/src/libslic3r/PrintConfig.cpp:960 +#: xs/src/libslic3r/PrintConfig.cpp:970 xs/src/libslic3r/PrintConfig.cpp:980 +msgid "Machine limits" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1730 +msgid "Values in this column are for Full Power mode" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1731 +msgid "Full Power" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1736 +msgid "Values in this column are for Silent mode" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1737 +msgid "Silent" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1745 +msgid "Maximum feedrates" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1750 +msgid "Maximum accelerations" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1757 +msgid "Jerk limits" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1762 +msgid "Minimum feedrates" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1800 xs/src/slic3r/GUI/Tab.cpp:1808 +#: xs/src/slic3r/GUI/Tab.cpp:2037 msgid "Single extruder MM setup" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1729 +#: xs/src/slic3r/GUI/Tab.cpp:1809 msgid "Single extruder multimaterial parameters" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1741 xs/src/libslic3r/GCode/PreviewData.cpp:440 +#: xs/src/slic3r/GUI/Tab.cpp:1822 xs/src/libslic3r/GCode/PreviewData.cpp:446 #, possible-c-format msgid "Extruder %d" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1748 +#: xs/src/slic3r/GUI/Tab.cpp:1829 msgid "Layer height limits" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1753 +#: xs/src/slic3r/GUI/Tab.cpp:1834 msgid "Position (for multi-extruder printers)" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1756 +#: xs/src/slic3r/GUI/Tab.cpp:1837 msgid "Retraction" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1759 +#: xs/src/slic3r/GUI/Tab.cpp:1840 msgid "Only lift Z" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1772 +#: xs/src/slic3r/GUI/Tab.cpp:1853 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1776 lib/Slic3r/GUI/Plater.pm:192 -#: lib/Slic3r/GUI/Plater.pm:2283 +#: xs/src/slic3r/GUI/Tab.cpp:1857 lib/Slic3r/GUI/Plater.pm:217 +#: lib/Slic3r/GUI/Plater.pm:2324 msgid "Preview" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1855 +#: xs/src/slic3r/GUI/Tab.cpp:1953 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 "" -#: xs/src/slic3r/GUI/Tab.cpp:1857 +#: xs/src/slic3r/GUI/Tab.cpp:1955 msgid "Firmware Retraction" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2029 +#: xs/src/slic3r/GUI/Tab.cpp:2130 msgid "Default " msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2029 +#: xs/src/slic3r/GUI/Tab.cpp:2130 msgid " preset" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2030 +#: xs/src/slic3r/GUI/Tab.cpp:2131 msgid " preset\n" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2048 +#: xs/src/slic3r/GUI/Tab.cpp:2149 msgid "" "\n" "\n" "is not compatible with printer\n" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2048 +#: xs/src/slic3r/GUI/Tab.cpp:2149 msgid "" "\n" "\n" "and it has the following unsaved changes:" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2049 +#: xs/src/slic3r/GUI/Tab.cpp:2150 msgid "" "\n" "\n" "has the following unsaved changes:" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2051 +#: xs/src/slic3r/GUI/Tab.cpp:2152 msgid "" "\n" "\n" "Discard changes and continue anyway?" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2052 +#: xs/src/slic3r/GUI/Tab.cpp:2153 msgid "Unsaved Changes" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2139 +#: xs/src/slic3r/GUI/Tab.cpp:2240 msgid "The supplied name is empty. It can't be saved." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2144 +#: xs/src/slic3r/GUI/Tab.cpp:2245 msgid "Cannot overwrite a system profile." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2148 +#: xs/src/slic3r/GUI/Tab.cpp:2249 msgid "Cannot overwrite an external profile." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2172 +#: xs/src/slic3r/GUI/Tab.cpp:2275 msgid "remove" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2172 +#: xs/src/slic3r/GUI/Tab.cpp:2275 msgid "delete" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2173 +#: xs/src/slic3r/GUI/Tab.cpp:2276 msgid "Are you sure you want to " msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2173 +#: xs/src/slic3r/GUI/Tab.cpp:2276 msgid " the selected preset?" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2174 +#: xs/src/slic3r/GUI/Tab.cpp:2277 msgid "Remove" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2174 lib/Slic3r/GUI/Plater.pm:233 -#: lib/Slic3r/GUI/Plater.pm:251 lib/Slic3r/GUI/Plater.pm:2174 +#: xs/src/slic3r/GUI/Tab.cpp:2277 lib/Slic3r/GUI/Plater.pm:251 +#: lib/Slic3r/GUI/Plater.pm:269 lib/Slic3r/GUI/Plater.pm:2215 msgid "Delete" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2175 +#: xs/src/slic3r/GUI/Tab.cpp:2278 msgid " Preset" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2228 +#: xs/src/slic3r/GUI/Tab.cpp:2331 msgid "All" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2260 +#: xs/src/slic3r/GUI/Tab.cpp:2363 msgid "Select the printers this profile is compatible with." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2306 xs/src/slic3r/GUI/Tab.cpp:2392 -#: xs/src/slic3r/GUI/Preset.cpp:613 xs/src/slic3r/GUI/Preset.cpp:653 -#: xs/src/slic3r/GUI/Preset.cpp:678 xs/src/slic3r/GUI/Preset.cpp:710 -#: xs/src/slic3r/GUI/PresetBundle.cpp:1119 -#: xs/src/slic3r/GUI/PresetBundle.cpp:1172 lib/Slic3r/GUI/Plater.pm:618 +#: xs/src/slic3r/GUI/Tab.cpp:2409 xs/src/slic3r/GUI/Tab.cpp:2495 +#: xs/src/slic3r/GUI/Preset.cpp:702 xs/src/slic3r/GUI/Preset.cpp:742 +#: xs/src/slic3r/GUI/Preset.cpp:770 xs/src/slic3r/GUI/Preset.cpp:802 +#: xs/src/slic3r/GUI/PresetBundle.cpp:1193 +#: xs/src/slic3r/GUI/PresetBundle.cpp:1246 lib/Slic3r/GUI/Plater.pm:603 msgid "System presets" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2307 xs/src/slic3r/GUI/Tab.cpp:2393 +#: xs/src/slic3r/GUI/Tab.cpp:2410 xs/src/slic3r/GUI/Tab.cpp:2496 msgid "Default presets" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2462 +#: xs/src/slic3r/GUI/Tab.cpp:2565 msgid "" "LOCKED LOCK;indicates that the settings are the same as the system values " "for the current option group" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2465 +#: xs/src/slic3r/GUI/Tab.cpp:2568 msgid "" "UNLOCKED LOCK;indicates that some settings were changed and are not equal to " "the system values for the current option group.\n" @@ -1318,13 +1365,13 @@ msgid "" "to the system values." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2471 +#: xs/src/slic3r/GUI/Tab.cpp:2574 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." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2475 +#: xs/src/slic3r/GUI/Tab.cpp:2578 msgid "" "BACK ARROW;indicates that the settings were changed and are not equal to the " "last saved preset for the current option group.\n" @@ -1332,30 +1379,30 @@ msgid "" "to the last saved preset." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2501 +#: xs/src/slic3r/GUI/Tab.cpp:2604 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system " "values for the current option group" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2503 +#: xs/src/slic3r/GUI/Tab.cpp:2606 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." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2506 +#: xs/src/slic3r/GUI/Tab.cpp:2609 msgid "WHITE BULLET icon indicates a non system preset." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2509 +#: xs/src/slic3r/GUI/Tab.cpp:2612 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2511 +#: xs/src/slic3r/GUI/Tab.cpp:2614 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" @@ -1363,87 +1410,91 @@ msgid "" "preset." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2517 +#: xs/src/slic3r/GUI/Tab.cpp:2620 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system value." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2518 +#: xs/src/slic3r/GUI/Tab.cpp:2621 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." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2524 +#: xs/src/slic3r/GUI/Tab.cpp:2627 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2525 +#: xs/src/slic3r/GUI/Tab.cpp:2628 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 "" -#: xs/src/slic3r/GUI/Tab.cpp:2595 lib/Slic3r/GUI/MainFrame.pm:450 -#: lib/Slic3r/GUI/Plater.pm:1756 +#: xs/src/slic3r/GUI/Tab.cpp:2703 lib/Slic3r/GUI/MainFrame.pm:469 +#: lib/Slic3r/GUI/Plater.pm:1795 msgid "Save " msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2595 +#: xs/src/slic3r/GUI/Tab.cpp:2703 msgid " as:" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2634 xs/src/slic3r/GUI/Tab.cpp:2638 +#: xs/src/slic3r/GUI/Tab.cpp:2742 xs/src/slic3r/GUI/Tab.cpp:2746 msgid "The supplied name is not valid;" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2635 +#: xs/src/slic3r/GUI/Tab.cpp:2743 msgid "the following characters are not allowed:" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2639 +#: xs/src/slic3r/GUI/Tab.cpp:2747 msgid "the following postfix are not allowed:" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2642 +#: xs/src/slic3r/GUI/Tab.cpp:2750 msgid "The supplied name is not available." msgstr "" -#: xs/src/slic3r/GUI/Tab.hpp:283 +#: xs/src/slic3r/GUI/Tab.hpp:286 msgid "Print Settings" msgstr "" -#: xs/src/slic3r/GUI/Tab.hpp:303 +#: xs/src/slic3r/GUI/Tab.hpp:306 msgid "Filament Settings" msgstr "" -#: xs/src/slic3r/GUI/Tab.hpp:326 +#: xs/src/slic3r/GUI/Tab.hpp:332 msgid "Printer Settings" msgstr "" -#: xs/src/slic3r/GUI/Tab.hpp:341 +#: xs/src/slic3r/GUI/Tab.hpp:348 msgid "Save preset" msgstr "" -#: xs/src/slic3r/GUI/Field.cpp:82 +#: xs/src/slic3r/GUI/Field.cpp:98 msgid "default" msgstr "" -#: xs/src/slic3r/GUI/Field.cpp:112 +#: xs/src/slic3r/GUI/Field.cpp:128 #, possible-c-format msgid "%s doesn't support percentage" msgstr "" -#: xs/src/slic3r/GUI/Field.cpp:121 +#: xs/src/slic3r/GUI/Field.cpp:137 msgid "Input value is out of range" msgstr "" -#: xs/src/slic3r/GUI/Preset.cpp:657 xs/src/slic3r/GUI/Preset.cpp:714 -#: xs/src/slic3r/GUI/PresetBundle.cpp:1177 lib/Slic3r/GUI/Plater.pm:619 +#: xs/src/slic3r/GUI/Preset.cpp:144 +msgid "modified" +msgstr "" + +#: xs/src/slic3r/GUI/Preset.cpp:746 xs/src/slic3r/GUI/Preset.cpp:806 +#: xs/src/slic3r/GUI/PresetBundle.cpp:1251 lib/Slic3r/GUI/Plater.pm:604 msgid "User presets" msgstr "" @@ -1659,7 +1710,7 @@ msgstr "" #: xs/src/slic3r/GUI/RammingChart.cpp:76 xs/src/slic3r/GUI/RammingChart.cpp:81 #: xs/src/slic3r/GUI/WipeTowerDialog.cpp:77 -#: xs/src/libslic3r/PrintConfig.cpp:481 +#: xs/src/libslic3r/PrintConfig.cpp:490 msgid "s" msgstr "" @@ -1876,56 +1927,156 @@ msgstr "" msgid "Error while uploading to the OctoPrint server" msgstr "" -#: xs/src/slic3r/Utils/OctoPrint.cpp:111 lib/Slic3r/GUI/Plater.pm:1559 +#: xs/src/slic3r/Utils/OctoPrint.cpp:111 lib/Slic3r/GUI/Plater.pm:1558 msgid "Sending G-code file to the OctoPrint server..." msgstr "" -#: xs/src/slic3r/Utils/OctoPrint.cpp:192 -msgid "Invalid API key" -msgstr "" - -#: xs/src/slic3r/Utils/PresetUpdater.cpp:533 +#: xs/src/slic3r/Utils/PresetUpdater.cpp:544 #, possible-c-format msgid "requires min. %s and max. %s" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:26 +#: xs/src/libslic3r/Print.cpp:553 +msgid "All objects are outside of the print volume." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:579 +msgid "Some objects are too close; your extruder will collide with them." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:594 +msgid "" +"Some objects are too tall and cannot be printed without extruder collisions." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:604 +msgid "The Spiral Vase option can only be used when printing a single object." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:606 +msgid "" +"The Spiral Vase option can only be used when printing single material " +"objects." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:612 +msgid "" +"All extruders must have the same diameter for single extruder multimaterial " +"printer." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:617 +msgid "" +"The Wipe Tower is currently only supported for the Marlin and RepRap/" +"Sprinter G-code flavors." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:619 +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:631 +msgid "" +"The Wipe Tower is only supported for multiple objects if they have equal " +"layer heigths" +msgstr "" + +#: xs/src/libslic3r/Print.cpp:633 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed " +"over an equal number of raft layers" +msgstr "" + +#: xs/src/libslic3r/Print.cpp:635 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed " +"with the same support_material_contact_distance" +msgstr "" + +#: xs/src/libslic3r/Print.cpp:637 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are sliced " +"equally." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:661 +msgid "" +"The Wipe tower is only supported if all objects have the same layer height " +"profile" +msgstr "" + +#: xs/src/libslic3r/Print.cpp:670 +msgid "The supplied settings will cause an empty print." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:680 +msgid "" +"One or more object were assigned an extruder that the printer does not have." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:689 +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 "" + +#: xs/src/libslic3r/Print.cpp:695 +msgid "first_layer_height" +msgstr "" + +#: xs/src/libslic3r/Print.cpp:710 +msgid "First layer height can't be greater than nozzle diameter" +msgstr "" + +#: xs/src/libslic3r/Print.cpp:714 +msgid "Layer height can't be greater than nozzle diameter" +msgstr "" + +#: xs/src/libslic3r/Print.cpp:1196 +msgid "Failed processing of the output_filename_format template." +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:29 msgid "Avoid crossing perimeters" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:27 +#: xs/src/libslic3r/PrintConfig.cpp:30 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." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:38 xs/src/libslic3r/PrintConfig.cpp:1678 +#: xs/src/libslic3r/PrintConfig.cpp:41 xs/src/libslic3r/PrintConfig.cpp:1818 msgid "Other layers" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:39 +#: xs/src/libslic3r/PrintConfig.cpp:42 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:42 +#: xs/src/libslic3r/PrintConfig.cpp:45 msgid "Bed temperature" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:49 +#: xs/src/libslic3r/PrintConfig.cpp:52 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:59 +#: xs/src/libslic3r/PrintConfig.cpp:62 msgid "Between objects G-code" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:60 +#: xs/src/libslic3r/PrintConfig.cpp:63 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -1935,79 +2086,80 @@ msgid "" "[first_layer_temperature]\" command wherever you want." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:68 lib/Slic3r/GUI/MainFrame.pm:309 +#: xs/src/libslic3r/PrintConfig.cpp:71 lib/Slic3r/GUI/MainFrame.pm:328 msgid "Bottom" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:69 xs/src/libslic3r/PrintConfig.cpp:268 -#: xs/src/libslic3r/PrintConfig.cpp:319 xs/src/libslic3r/PrintConfig.cpp:327 -#: xs/src/libslic3r/PrintConfig.cpp:667 xs/src/libslic3r/PrintConfig.cpp:832 -#: xs/src/libslic3r/PrintConfig.cpp:848 xs/src/libslic3r/PrintConfig.cpp:1025 -#: xs/src/libslic3r/PrintConfig.cpp:1082 xs/src/libslic3r/PrintConfig.cpp:1260 -#: xs/src/libslic3r/PrintConfig.cpp:1689 xs/src/libslic3r/PrintConfig.cpp:1745 +#: xs/src/libslic3r/PrintConfig.cpp:72 xs/src/libslic3r/PrintConfig.cpp:276 +#: xs/src/libslic3r/PrintConfig.cpp:327 xs/src/libslic3r/PrintConfig.cpp:335 +#: xs/src/libslic3r/PrintConfig.cpp:701 xs/src/libslic3r/PrintConfig.cpp:871 +#: xs/src/libslic3r/PrintConfig.cpp:887 xs/src/libslic3r/PrintConfig.cpp:1156 +#: xs/src/libslic3r/PrintConfig.cpp:1222 xs/src/libslic3r/PrintConfig.cpp:1400 +#: xs/src/libslic3r/PrintConfig.cpp:1829 xs/src/libslic3r/PrintConfig.cpp:1885 msgid "Layers and Perimeters" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:70 +#: xs/src/libslic3r/PrintConfig.cpp:73 msgid "Number of solid layers to generate on bottom surfaces." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:72 +#: xs/src/libslic3r/PrintConfig.cpp:75 msgid "Bottom solid layers" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:77 +#: xs/src/libslic3r/PrintConfig.cpp:80 msgid "Bridge" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:78 +#: xs/src/libslic3r/PrintConfig.cpp:81 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:80 xs/src/libslic3r/PrintConfig.cpp:191 -#: xs/src/libslic3r/PrintConfig.cpp:639 xs/src/libslic3r/PrintConfig.cpp:747 -#: xs/src/libslic3r/PrintConfig.cpp:1045 +#: xs/src/libslic3r/PrintConfig.cpp:83 xs/src/libslic3r/PrintConfig.cpp:199 +#: xs/src/libslic3r/PrintConfig.cpp:673 xs/src/libslic3r/PrintConfig.cpp:781 +#: xs/src/libslic3r/PrintConfig.cpp:931 xs/src/libslic3r/PrintConfig.cpp:972 +#: xs/src/libslic3r/PrintConfig.cpp:982 xs/src/libslic3r/PrintConfig.cpp:1185 msgid "mm/s²" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:86 +#: xs/src/libslic3r/PrintConfig.cpp:89 msgid "Bridging angle" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:88 +#: xs/src/libslic3r/PrintConfig.cpp:91 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." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:91 xs/src/libslic3r/PrintConfig.cpp:555 -#: xs/src/libslic3r/PrintConfig.cpp:1278 xs/src/libslic3r/PrintConfig.cpp:1289 -#: xs/src/libslic3r/PrintConfig.cpp:1509 xs/src/libslic3r/PrintConfig.cpp:1663 +#: xs/src/libslic3r/PrintConfig.cpp:94 xs/src/libslic3r/PrintConfig.cpp:589 +#: xs/src/libslic3r/PrintConfig.cpp:1418 xs/src/libslic3r/PrintConfig.cpp:1429 +#: xs/src/libslic3r/PrintConfig.cpp:1649 xs/src/libslic3r/PrintConfig.cpp:1803 msgid "°" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:97 +#: xs/src/libslic3r/PrintConfig.cpp:100 msgid "Bridges fan speed" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:98 +#: xs/src/libslic3r/PrintConfig.cpp:101 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:99 xs/src/libslic3r/PrintConfig.cpp:567 -#: xs/src/libslic3r/PrintConfig.cpp:859 xs/src/libslic3r/PrintConfig.cpp:927 -#: xs/src/libslic3r/PrintConfig.cpp:1168 +#: xs/src/libslic3r/PrintConfig.cpp:102 xs/src/libslic3r/PrintConfig.cpp:601 +#: xs/src/libslic3r/PrintConfig.cpp:990 xs/src/libslic3r/PrintConfig.cpp:1058 +#: xs/src/libslic3r/PrintConfig.cpp:1308 msgid "%" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:106 +#: xs/src/libslic3r/PrintConfig.cpp:109 msgid "Bridge flow ratio" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:108 +#: xs/src/libslic3r/PrintConfig.cpp:111 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -2015,60 +2167,63 @@ msgid "" "before tweaking this." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:118 +#: xs/src/libslic3r/PrintConfig.cpp:121 msgid "Bridges" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:120 +#: xs/src/libslic3r/PrintConfig.cpp:123 msgid "Speed for printing bridges." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:121 xs/src/libslic3r/PrintConfig.cpp:462 -#: xs/src/libslic3r/PrintConfig.cpp:471 xs/src/libslic3r/PrintConfig.cpp:701 -#: xs/src/libslic3r/PrintConfig.cpp:812 xs/src/libslic3r/PrintConfig.cpp:888 -#: xs/src/libslic3r/PrintConfig.cpp:945 xs/src/libslic3r/PrintConfig.cpp:1074 -#: xs/src/libslic3r/PrintConfig.cpp:1245 xs/src/libslic3r/PrintConfig.cpp:1254 -#: xs/src/libslic3r/PrintConfig.cpp:1642 xs/src/libslic3r/PrintConfig.cpp:1755 +#: xs/src/libslic3r/PrintConfig.cpp:124 xs/src/libslic3r/PrintConfig.cpp:471 +#: xs/src/libslic3r/PrintConfig.cpp:480 xs/src/libslic3r/PrintConfig.cpp:508 +#: xs/src/libslic3r/PrintConfig.cpp:516 xs/src/libslic3r/PrintConfig.cpp:735 +#: xs/src/libslic3r/PrintConfig.cpp:846 xs/src/libslic3r/PrintConfig.cpp:922 +#: xs/src/libslic3r/PrintConfig.cpp:940 xs/src/libslic3r/PrintConfig.cpp:952 +#: xs/src/libslic3r/PrintConfig.cpp:962 xs/src/libslic3r/PrintConfig.cpp:1019 +#: xs/src/libslic3r/PrintConfig.cpp:1076 xs/src/libslic3r/PrintConfig.cpp:1214 +#: xs/src/libslic3r/PrintConfig.cpp:1385 xs/src/libslic3r/PrintConfig.cpp:1394 +#: xs/src/libslic3r/PrintConfig.cpp:1782 xs/src/libslic3r/PrintConfig.cpp:1895 msgid "mm/s" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:128 +#: xs/src/libslic3r/PrintConfig.cpp:131 msgid "Brim width" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:129 +#: xs/src/libslic3r/PrintConfig.cpp:132 msgid "" "Horizontal width of the brim that will be printed around each object on the " "first layer." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:136 +#: xs/src/libslic3r/PrintConfig.cpp:139 msgid "Clip multi-part objects" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:137 +#: xs/src/libslic3r/PrintConfig.cpp:140 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:148 +#: xs/src/libslic3r/PrintConfig.cpp:151 msgid "Compatible printers condition" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:149 +#: xs/src/libslic3r/PrintConfig.cpp:152 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:155 +#: xs/src/libslic3r/PrintConfig.cpp:163 msgid "Complete individual objects" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:156 +#: xs/src/libslic3r/PrintConfig.cpp:164 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). " @@ -2076,113 +2231,113 @@ msgid "" "warn and prevent you from extruder collisions, but beware." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:164 +#: xs/src/libslic3r/PrintConfig.cpp:172 msgid "Enable auto cooling" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:165 +#: xs/src/libslic3r/PrintConfig.cpp:173 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:171 +#: xs/src/libslic3r/PrintConfig.cpp:179 msgid "Cooling tube position" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:172 +#: xs/src/libslic3r/PrintConfig.cpp:180 msgid "Distance of the center-point of the cooling tube from the extruder tip " msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:179 +#: xs/src/libslic3r/PrintConfig.cpp:187 msgid "Cooling tube length" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:180 +#: xs/src/libslic3r/PrintConfig.cpp:188 msgid "Length of the cooling tube to limit space for cooling moves inside it " msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:188 +#: xs/src/libslic3r/PrintConfig.cpp:196 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:197 +#: xs/src/libslic3r/PrintConfig.cpp:205 msgid "Default filament profile" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:198 +#: xs/src/libslic3r/PrintConfig.cpp:206 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " "activated." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:203 +#: xs/src/libslic3r/PrintConfig.cpp:211 msgid "Default print profile" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:204 +#: xs/src/libslic3r/PrintConfig.cpp:212 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " "activated." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:209 +#: xs/src/libslic3r/PrintConfig.cpp:217 msgid "Disable fan for the first" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:210 +#: xs/src/libslic3r/PrintConfig.cpp:218 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:212 xs/src/libslic3r/PrintConfig.cpp:757 -#: xs/src/libslic3r/PrintConfig.cpp:1141 xs/src/libslic3r/PrintConfig.cpp:1332 -#: xs/src/libslic3r/PrintConfig.cpp:1393 xs/src/libslic3r/PrintConfig.cpp:1545 -#: xs/src/libslic3r/PrintConfig.cpp:1590 +#: xs/src/libslic3r/PrintConfig.cpp:220 xs/src/libslic3r/PrintConfig.cpp:791 +#: xs/src/libslic3r/PrintConfig.cpp:1281 xs/src/libslic3r/PrintConfig.cpp:1472 +#: xs/src/libslic3r/PrintConfig.cpp:1533 xs/src/libslic3r/PrintConfig.cpp:1685 +#: xs/src/libslic3r/PrintConfig.cpp:1730 msgid "layers" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:219 +#: xs/src/libslic3r/PrintConfig.cpp:227 msgid "Don't support bridges" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:221 +#: xs/src/libslic3r/PrintConfig.cpp:229 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:227 +#: xs/src/libslic3r/PrintConfig.cpp:235 msgid "Distance between copies" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:228 +#: xs/src/libslic3r/PrintConfig.cpp:236 msgid "Distance used for the auto-arrange feature of the plater." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:236 +#: xs/src/libslic3r/PrintConfig.cpp:244 msgid "Elephant foot compensation" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:238 +#: xs/src/libslic3r/PrintConfig.cpp:246 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:247 +#: xs/src/libslic3r/PrintConfig.cpp:255 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:257 +#: xs/src/libslic3r/PrintConfig.cpp:265 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 " @@ -2190,38 +2345,59 @@ msgid "" "extruder order." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:267 +#: xs/src/libslic3r/PrintConfig.cpp:275 msgid "Ensure vertical shell thickness" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:269 +#: xs/src/libslic3r/PrintConfig.cpp:277 msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell " "thickness (top+bottom solid layers)." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:275 +#: xs/src/libslic3r/PrintConfig.cpp:283 msgid "Top/bottom fill pattern" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:277 +#: xs/src/libslic3r/PrintConfig.cpp:285 msgid "" "Fill pattern for top/bottom infill. This only affects the external visible " "layer, and not its adjacent solid shells." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:296 xs/src/libslic3r/PrintConfig.cpp:306 +#: xs/src/libslic3r/PrintConfig.cpp:294 xs/src/libslic3r/PrintConfig.cpp:654 +#: xs/src/libslic3r/PrintConfig.cpp:1764 +msgid "Rectilinear" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:295 xs/src/libslic3r/PrintConfig.cpp:660 +msgid "Concentric" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:296 xs/src/libslic3r/PrintConfig.cpp:664 +msgid "Hilbert Curve" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:297 xs/src/libslic3r/PrintConfig.cpp:665 +msgid "Archimedean Chords" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:298 xs/src/libslic3r/PrintConfig.cpp:666 +msgid "Octagram Spiral" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:304 xs/src/libslic3r/PrintConfig.cpp:314 msgid "External perimeters" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:297 xs/src/libslic3r/PrintConfig.cpp:406 -#: xs/src/libslic3r/PrintConfig.cpp:655 xs/src/libslic3r/PrintConfig.cpp:773 -#: xs/src/libslic3r/PrintConfig.cpp:1060 xs/src/libslic3r/PrintConfig.cpp:1400 -#: xs/src/libslic3r/PrintConfig.cpp:1562 xs/src/libslic3r/PrintConfig.cpp:1720 +#: xs/src/libslic3r/PrintConfig.cpp:305 xs/src/libslic3r/PrintConfig.cpp:415 +#: xs/src/libslic3r/PrintConfig.cpp:689 xs/src/libslic3r/PrintConfig.cpp:807 +#: xs/src/libslic3r/PrintConfig.cpp:1200 xs/src/libslic3r/PrintConfig.cpp:1540 +#: xs/src/libslic3r/PrintConfig.cpp:1702 xs/src/libslic3r/PrintConfig.cpp:1860 msgid "Extrusion Width" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:298 +#: xs/src/libslic3r/PrintConfig.cpp:306 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, " @@ -2229,41 +2405,41 @@ msgid "" "(for example 200%), it will be computed over layer height." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:301 xs/src/libslic3r/PrintConfig.cpp:660 -#: xs/src/libslic3r/PrintConfig.cpp:778 xs/src/libslic3r/PrintConfig.cpp:1065 -#: xs/src/libslic3r/PrintConfig.cpp:1404 xs/src/libslic3r/PrintConfig.cpp:1566 -#: xs/src/libslic3r/PrintConfig.cpp:1725 +#: xs/src/libslic3r/PrintConfig.cpp:309 xs/src/libslic3r/PrintConfig.cpp:694 +#: xs/src/libslic3r/PrintConfig.cpp:812 xs/src/libslic3r/PrintConfig.cpp:1205 +#: xs/src/libslic3r/PrintConfig.cpp:1544 xs/src/libslic3r/PrintConfig.cpp:1706 +#: xs/src/libslic3r/PrintConfig.cpp:1865 msgid "mm or % (leave 0 for default)" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:308 +#: xs/src/libslic3r/PrintConfig.cpp:316 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:311 xs/src/libslic3r/PrintConfig.cpp:682 -#: xs/src/libslic3r/PrintConfig.cpp:1363 xs/src/libslic3r/PrintConfig.cpp:1414 -#: xs/src/libslic3r/PrintConfig.cpp:1609 xs/src/libslic3r/PrintConfig.cpp:1737 +#: xs/src/libslic3r/PrintConfig.cpp:319 xs/src/libslic3r/PrintConfig.cpp:716 +#: xs/src/libslic3r/PrintConfig.cpp:1503 xs/src/libslic3r/PrintConfig.cpp:1554 +#: xs/src/libslic3r/PrintConfig.cpp:1749 xs/src/libslic3r/PrintConfig.cpp:1877 msgid "mm/s or %" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:318 +#: xs/src/libslic3r/PrintConfig.cpp:326 msgid "External perimeters first" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:320 +#: xs/src/libslic3r/PrintConfig.cpp:328 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:326 +#: xs/src/libslic3r/PrintConfig.cpp:334 msgid "Extra perimeters if needed" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:328 +#: xs/src/libslic3r/PrintConfig.cpp:336 #, no-c-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " @@ -2271,18 +2447,18 @@ msgid "" "is supported." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:338 +#: xs/src/libslic3r/PrintConfig.cpp:346 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:349 lib/Slic3r/GUI/Plater/3DPreview.pm:75 +#: xs/src/libslic3r/PrintConfig.cpp:358 lib/Slic3r/GUI/Plater/3DPreview.pm:75 msgid "Height" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:350 +#: xs/src/libslic3r/PrintConfig.cpp:359 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 " @@ -2290,30 +2466,30 @@ msgid "" "extruder can peek before colliding with other printed objects." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:360 +#: xs/src/libslic3r/PrintConfig.cpp:369 msgid "Radius" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:361 +#: xs/src/libslic3r/PrintConfig.cpp:370 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:371 +#: xs/src/libslic3r/PrintConfig.cpp:380 msgid "Extruder Color" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:372 xs/src/libslic3r/PrintConfig.cpp:435 +#: xs/src/libslic3r/PrintConfig.cpp:381 xs/src/libslic3r/PrintConfig.cpp:444 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:379 +#: xs/src/libslic3r/PrintConfig.cpp:388 msgid "Extruder offset" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:380 +#: xs/src/libslic3r/PrintConfig.cpp:389 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 " @@ -2321,21 +2497,21 @@ msgid "" "coordinates (they will be subtracted from the XY coordinate)." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:389 +#: xs/src/libslic3r/PrintConfig.cpp:398 msgid "Extrusion axis" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:390 +#: xs/src/libslic3r/PrintConfig.cpp:399 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:396 +#: xs/src/libslic3r/PrintConfig.cpp:405 msgid "Extrusion multiplier" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:397 +#: xs/src/libslic3r/PrintConfig.cpp:406 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. " @@ -2343,11 +2519,11 @@ msgid "" "more, check filament diameter and your firmware E steps." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:405 +#: xs/src/libslic3r/PrintConfig.cpp:414 msgid "Default extrusion width" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:407 +#: xs/src/libslic3r/PrintConfig.cpp:416 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 " @@ -2356,113 +2532,139 @@ msgid "" "height." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:411 +#: xs/src/libslic3r/PrintConfig.cpp:420 msgid "mm or % (leave 0 for auto)" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:416 +#: xs/src/libslic3r/PrintConfig.cpp:425 msgid "Keep fan always on" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:417 +#: xs/src/libslic3r/PrintConfig.cpp:426 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:423 +#: xs/src/libslic3r/PrintConfig.cpp:432 msgid "Enable fan if layer print time is below" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:424 +#: xs/src/libslic3r/PrintConfig.cpp:433 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:426 xs/src/libslic3r/PrintConfig.cpp:1350 +#: xs/src/libslic3r/PrintConfig.cpp:435 xs/src/libslic3r/PrintConfig.cpp:1490 msgid "approximate seconds" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:434 +#: xs/src/libslic3r/PrintConfig.cpp:443 msgid "Color" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:441 +#: xs/src/libslic3r/PrintConfig.cpp:450 msgid "Filament notes" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:442 +#: xs/src/libslic3r/PrintConfig.cpp:451 msgid "You can put your notes regarding the filament here." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:450 xs/src/libslic3r/PrintConfig.cpp:894 +#: xs/src/libslic3r/PrintConfig.cpp:459 xs/src/libslic3r/PrintConfig.cpp:1025 msgid "Max volumetric speed" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:451 +#: xs/src/libslic3r/PrintConfig.cpp:460 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:454 xs/src/libslic3r/PrintConfig.cpp:897 +#: xs/src/libslic3r/PrintConfig.cpp:463 xs/src/libslic3r/PrintConfig.cpp:1028 msgid "mm³/s" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:460 +#: xs/src/libslic3r/PrintConfig.cpp:469 msgid "Loading speed" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:461 +#: xs/src/libslic3r/PrintConfig.cpp:470 msgid "Speed used for loading the filament on the wipe tower. " msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:468 +#: xs/src/libslic3r/PrintConfig.cpp:477 msgid "Unloading speed" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:469 +#: xs/src/libslic3r/PrintConfig.cpp:478 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming). " msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:477 +#: xs/src/libslic3r/PrintConfig.cpp:486 msgid "Delay after unloading" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:478 +#: xs/src/libslic3r/PrintConfig.cpp:487 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:487 +#: xs/src/libslic3r/PrintConfig.cpp:496 +msgid "Number of cooling moves" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:497 +msgid "" +"Filament is cooled by being moved back and forth in the cooling tubes. " +"Specify desired number of these moves " +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:505 +msgid "Speed of the first cooling move" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:506 +msgid "Cooling moves are gradually accelerating beginning at this speed. " +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:513 +msgid "Speed of the last cooling move" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:514 +msgid "Cooling moves are gradually accelerating towards this speed. " +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:521 msgid "Ramming parameters" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:488 +#: xs/src/libslic3r/PrintConfig.cpp:522 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters " msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:495 +#: xs/src/libslic3r/PrintConfig.cpp:529 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:503 +#: xs/src/libslic3r/PrintConfig.cpp:537 msgid "Density" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:504 +#: xs/src/libslic3r/PrintConfig.cpp:538 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 " @@ -2470,15 +2672,15 @@ msgid "" "displacement." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:507 +#: xs/src/libslic3r/PrintConfig.cpp:541 msgid "g/cm³" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:513 +#: xs/src/libslic3r/PrintConfig.cpp:547 msgid "Filament type" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:514 xs/src/libslic3r/PrintConfig.cpp:1095 +#: xs/src/libslic3r/PrintConfig.cpp:548 xs/src/libslic3r/PrintConfig.cpp:1235 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. " @@ -2487,74 +2689,106 @@ msgid "" "environment variables." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:533 +#: xs/src/libslic3r/PrintConfig.cpp:567 msgid "Soluble material" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:534 +#: xs/src/libslic3r/PrintConfig.cpp:568 msgid "Soluble material is most likely used for a soluble support." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:539 lib/Slic3r/GUI/Plater.pm:519 +#: xs/src/libslic3r/PrintConfig.cpp:573 lib/Slic3r/GUI/Plater.pm:1616 msgid "Cost" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:540 +#: xs/src/libslic3r/PrintConfig.cpp:574 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:541 +#: xs/src/libslic3r/PrintConfig.cpp:575 msgid "money/kg" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:550 +#: xs/src/libslic3r/PrintConfig.cpp:584 msgid "Fill angle" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:552 +#: xs/src/libslic3r/PrintConfig.cpp:586 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:564 +#: xs/src/libslic3r/PrintConfig.cpp:598 msgid "Fill density" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:566 +#: xs/src/libslic3r/PrintConfig.cpp:600 #, no-c-format msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:602 +#: xs/src/libslic3r/PrintConfig.cpp:636 msgid "Fill pattern" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:604 +#: xs/src/libslic3r/PrintConfig.cpp:638 msgid "Fill pattern for general low-density infill." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:636 xs/src/libslic3r/PrintConfig.cpp:645 -#: xs/src/libslic3r/PrintConfig.cpp:654 xs/src/libslic3r/PrintConfig.cpp:688 +#: xs/src/libslic3r/PrintConfig.cpp:655 +msgid "Grid" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:656 +msgid "Triangles" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:657 +msgid "Stars" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:658 +msgid "Cubic" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:659 +msgid "Line" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:661 xs/src/libslic3r/PrintConfig.cpp:1766 +msgid "Honeycomb" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:662 +msgid "3D Honeycomb" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:663 +msgid "Gyroid" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:670 xs/src/libslic3r/PrintConfig.cpp:679 +#: xs/src/libslic3r/PrintConfig.cpp:688 xs/src/libslic3r/PrintConfig.cpp:722 msgid "First layer" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:637 +#: xs/src/libslic3r/PrintConfig.cpp:671 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:646 +#: xs/src/libslic3r/PrintConfig.cpp:680 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:656 +#: xs/src/libslic3r/PrintConfig.cpp:690 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 " @@ -2562,11 +2796,11 @@ msgid "" "layer height. If set to zero, it will use the default extrusion width." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:666 +#: xs/src/libslic3r/PrintConfig.cpp:700 msgid "First layer height" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:668 +#: xs/src/libslic3r/PrintConfig.cpp:702 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 " @@ -2574,58 +2808,58 @@ msgid "" "example: 150%) over the default layer height." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:672 xs/src/libslic3r/PrintConfig.cpp:803 -#: xs/src/libslic3r/PrintConfig.cpp:1498 +#: xs/src/libslic3r/PrintConfig.cpp:706 xs/src/libslic3r/PrintConfig.cpp:837 +#: xs/src/libslic3r/PrintConfig.cpp:1638 msgid "mm or %" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:678 +#: xs/src/libslic3r/PrintConfig.cpp:712 msgid "First layer speed" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:679 +#: xs/src/libslic3r/PrintConfig.cpp:713 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:689 +#: xs/src/libslic3r/PrintConfig.cpp:723 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:697 -#: xs/src/libslic3r/GCode/PreviewData.cpp:165 +#: xs/src/libslic3r/PrintConfig.cpp:731 +#: xs/src/libslic3r/GCode/PreviewData.cpp:170 #: lib/Slic3r/GUI/Plater/3DPreview.pm:97 msgid "Gap fill" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:699 +#: xs/src/libslic3r/PrintConfig.cpp:733 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:707 +#: xs/src/libslic3r/PrintConfig.cpp:741 msgid "Verbose G-code" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:708 +#: xs/src/libslic3r/PrintConfig.cpp:742 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:715 +#: xs/src/libslic3r/PrintConfig.cpp:749 msgid "G-code flavor" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:716 +#: xs/src/libslic3r/PrintConfig.cpp:750 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 " @@ -2633,35 +2867,39 @@ msgid "" "extrusion value at all." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:745 +#: xs/src/libslic3r/PrintConfig.cpp:774 +msgid "No extrusion" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:779 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:753 +#: xs/src/libslic3r/PrintConfig.cpp:787 msgid "Combine infill every" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:755 +#: xs/src/libslic3r/PrintConfig.cpp:789 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:759 +#: xs/src/libslic3r/PrintConfig.cpp:793 msgid "Combine infill every n layers" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:764 +#: xs/src/libslic3r/PrintConfig.cpp:798 msgid "Infill extruder" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:766 +#: xs/src/libslic3r/PrintConfig.cpp:800 msgid "The extruder to use when printing infill." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:774 +#: xs/src/libslic3r/PrintConfig.cpp:808 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 " @@ -2670,32 +2908,32 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:783 +#: xs/src/libslic3r/PrintConfig.cpp:817 msgid "Infill before perimeters" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:784 +#: xs/src/libslic3r/PrintConfig.cpp:818 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:789 +#: xs/src/libslic3r/PrintConfig.cpp:823 msgid "Only infill where needed" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:791 +#: xs/src/libslic3r/PrintConfig.cpp:825 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:798 +#: xs/src/libslic3r/PrintConfig.cpp:832 msgid "Infill/perimeters overlap" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:800 +#: xs/src/libslic3r/PrintConfig.cpp:834 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -2703,30 +2941,30 @@ msgid "" "perimeter extrusion width." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:811 +#: xs/src/libslic3r/PrintConfig.cpp:845 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:820 +#: xs/src/libslic3r/PrintConfig.cpp:854 msgid "Inherits profile" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:821 +#: xs/src/libslic3r/PrintConfig.cpp:855 msgid "Name of the profile, from which this profile inherits." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:827 +#: xs/src/libslic3r/PrintConfig.cpp:866 msgid "Interface shells" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:828 +#: xs/src/libslic3r/PrintConfig.cpp:867 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:837 +#: xs/src/libslic3r/PrintConfig.cpp:876 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 " @@ -2734,21 +2972,75 @@ msgid "" "[layer_z]." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:849 +#: xs/src/libslic3r/PrintConfig.cpp:888 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." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:857 xs/src/libslic3r/PrintConfig.cpp:866 +#: xs/src/libslic3r/PrintConfig.cpp:896 +msgid "Support silent mode" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:897 +msgid "Set silent mode for the G-code flavor" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:919 +#, possible-c-format +msgid "Maximum feedrate %1%" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:921 +#, possible-c-format +msgid "Maximum feedrate of the %1% axis" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:928 +#, possible-c-format +msgid "Maximum acceleration %1%" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:930 +#, possible-c-format +msgid "Maximum acceleration of the %1% axis" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:937 +#, possible-c-format +msgid "Maximum jerk %1%" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:939 +#, possible-c-format +msgid "Maximum jerk of the %1% axis" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:949 xs/src/libslic3r/PrintConfig.cpp:951 +msgid "Minimum feedrate when extruding" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:959 xs/src/libslic3r/PrintConfig.cpp:961 +msgid "Minimum travel feedrate" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:969 xs/src/libslic3r/PrintConfig.cpp:971 +msgid "Maximum acceleration when extruding" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:979 xs/src/libslic3r/PrintConfig.cpp:981 +msgid "Maximum acceleration when retracting" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:988 xs/src/libslic3r/PrintConfig.cpp:997 msgid "Max" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:858 +#: xs/src/libslic3r/PrintConfig.cpp:989 msgid "This setting represents the maximum speed of your fan." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:867 +#: xs/src/libslic3r/PrintConfig.cpp:998 #, no-c-format msgid "" "This is the highest printable layer height for this extruder, used to cap " @@ -2757,38 +3049,38 @@ msgid "" "adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:877 +#: xs/src/libslic3r/PrintConfig.cpp:1008 msgid "Max print height" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:878 +#: xs/src/libslic3r/PrintConfig.cpp:1009 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:884 +#: xs/src/libslic3r/PrintConfig.cpp:1015 msgid "Max print speed" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:885 +#: xs/src/libslic3r/PrintConfig.cpp:1016 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:895 +#: xs/src/libslic3r/PrintConfig.cpp:1026 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:903 +#: xs/src/libslic3r/PrintConfig.cpp:1034 msgid "Max volumetric slope positive" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:904 xs/src/libslic3r/PrintConfig.cpp:915 +#: xs/src/libslic3r/PrintConfig.cpp:1035 xs/src/libslic3r/PrintConfig.cpp:1046 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 " @@ -2796,109 +3088,109 @@ msgid "" "s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:908 xs/src/libslic3r/PrintConfig.cpp:919 +#: xs/src/libslic3r/PrintConfig.cpp:1039 xs/src/libslic3r/PrintConfig.cpp:1050 msgid "mm³/s²" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:914 +#: xs/src/libslic3r/PrintConfig.cpp:1045 msgid "Max volumetric slope negative" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:925 xs/src/libslic3r/PrintConfig.cpp:934 +#: xs/src/libslic3r/PrintConfig.cpp:1056 xs/src/libslic3r/PrintConfig.cpp:1065 msgid "Min" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:926 +#: xs/src/libslic3r/PrintConfig.cpp:1057 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:935 +#: xs/src/libslic3r/PrintConfig.cpp:1066 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:943 +#: xs/src/libslic3r/PrintConfig.cpp:1074 msgid "Min print speed" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:944 +#: xs/src/libslic3r/PrintConfig.cpp:1075 msgid "Slic3r will not scale speed down below this speed." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:951 +#: xs/src/libslic3r/PrintConfig.cpp:1082 msgid "Minimal filament extrusion length" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:952 +#: xs/src/libslic3r/PrintConfig.cpp:1083 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:961 +#: xs/src/libslic3r/PrintConfig.cpp:1092 msgid "Configuration notes" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:962 +#: xs/src/libslic3r/PrintConfig.cpp:1093 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:971 +#: xs/src/libslic3r/PrintConfig.cpp:1102 msgid "Nozzle diameter" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:972 +#: xs/src/libslic3r/PrintConfig.cpp:1103 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:978 +#: xs/src/libslic3r/PrintConfig.cpp:1109 msgid "API Key" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:979 +#: xs/src/libslic3r/PrintConfig.cpp:1110 msgid "" "Slic3r can upload G-code files to OctoPrint. This field should contain the " "API Key required for authentication." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:992 +#: xs/src/libslic3r/PrintConfig.cpp:1123 msgid "Hostname, IP or URL" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:993 +#: xs/src/libslic3r/PrintConfig.cpp:1124 msgid "" "Slic3r can upload G-code files to OctoPrint. This field should contain the " "hostname, IP address or URL of the OctoPrint instance." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:999 +#: xs/src/libslic3r/PrintConfig.cpp:1130 msgid "Only retract when crossing perimeters" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1000 +#: xs/src/libslic3r/PrintConfig.cpp:1131 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1007 +#: xs/src/libslic3r/PrintConfig.cpp:1138 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1014 +#: xs/src/libslic3r/PrintConfig.cpp:1145 msgid "Output filename format" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1015 +#: xs/src/libslic3r/PrintConfig.cpp:1146 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -2906,48 +3198,60 @@ msgid "" "[input_filename], [input_filename_base]." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1024 +#: xs/src/libslic3r/PrintConfig.cpp:1155 msgid "Detect bridging perimeters" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1026 +#: xs/src/libslic3r/PrintConfig.cpp:1157 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1032 +#: xs/src/libslic3r/PrintConfig.cpp:1163 msgid "Filament parking position" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1033 +#: xs/src/libslic3r/PrintConfig.cpp:1164 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1041 xs/src/libslic3r/PrintConfig.cpp:1059 -#: xs/src/libslic3r/PrintConfig.cpp:1071 xs/src/libslic3r/PrintConfig.cpp:1081 +#: xs/src/libslic3r/PrintConfig.cpp:1172 +msgid "Extra loading distance" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1173 +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. " +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1181 xs/src/libslic3r/PrintConfig.cpp:1199 +#: xs/src/libslic3r/PrintConfig.cpp:1211 xs/src/libslic3r/PrintConfig.cpp:1221 msgid "Perimeters" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1042 +#: xs/src/libslic3r/PrintConfig.cpp:1182 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1050 +#: xs/src/libslic3r/PrintConfig.cpp:1190 msgid "Perimeter extruder" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1052 +#: xs/src/libslic3r/PrintConfig.cpp:1192 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1061 +#: xs/src/libslic3r/PrintConfig.cpp:1201 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 " @@ -2956,12 +3260,12 @@ msgid "" "it will be computed over layer height." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1073 +#: xs/src/libslic3r/PrintConfig.cpp:1213 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1083 +#: xs/src/libslic3r/PrintConfig.cpp:1223 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 " @@ -2969,59 +3273,59 @@ msgid "" "Perimeters option is enabled." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1087 +#: xs/src/libslic3r/PrintConfig.cpp:1227 msgid "(minimum)" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1107 +#: xs/src/libslic3r/PrintConfig.cpp:1247 msgid "Printer type" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1108 +#: xs/src/libslic3r/PrintConfig.cpp:1248 msgid "Type of the printer." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1112 +#: xs/src/libslic3r/PrintConfig.cpp:1252 msgid "Printer notes" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1113 +#: xs/src/libslic3r/PrintConfig.cpp:1253 msgid "You can put your notes regarding the printer here." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1121 +#: xs/src/libslic3r/PrintConfig.cpp:1261 msgid "Printer vendor" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1122 +#: xs/src/libslic3r/PrintConfig.cpp:1262 msgid "Name of the printer vendor." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1126 +#: xs/src/libslic3r/PrintConfig.cpp:1266 msgid "Printer variant" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1127 +#: xs/src/libslic3r/PrintConfig.cpp:1267 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1137 +#: xs/src/libslic3r/PrintConfig.cpp:1277 msgid "Raft layers" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1139 +#: xs/src/libslic3r/PrintConfig.cpp:1279 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1147 +#: xs/src/libslic3r/PrintConfig.cpp:1287 msgid "Resolution" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1148 +#: xs/src/libslic3r/PrintConfig.cpp:1288 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -3029,266 +3333,282 @@ msgid "" "simplification and use full resolution from input." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1158 +#: xs/src/libslic3r/PrintConfig.cpp:1298 msgid "Minimum travel after retraction" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1159 +#: xs/src/libslic3r/PrintConfig.cpp:1299 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1165 +#: xs/src/libslic3r/PrintConfig.cpp:1305 msgid "Retract amount before wipe" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1166 +#: xs/src/libslic3r/PrintConfig.cpp:1306 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1173 +#: xs/src/libslic3r/PrintConfig.cpp:1313 msgid "Retract on layer change" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1174 +#: xs/src/libslic3r/PrintConfig.cpp:1314 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1179 xs/src/libslic3r/PrintConfig.cpp:1188 +#: xs/src/libslic3r/PrintConfig.cpp:1319 xs/src/libslic3r/PrintConfig.cpp:1328 msgid "Length" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1180 +#: xs/src/libslic3r/PrintConfig.cpp:1320 msgid "Retraction Length" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1181 +#: xs/src/libslic3r/PrintConfig.cpp:1321 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1183 xs/src/libslic3r/PrintConfig.cpp:1193 +#: xs/src/libslic3r/PrintConfig.cpp:1323 xs/src/libslic3r/PrintConfig.cpp:1333 msgid "mm (zero to disable)" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1189 +#: xs/src/libslic3r/PrintConfig.cpp:1329 msgid "Retraction Length (Toolchange)" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1190 +#: xs/src/libslic3r/PrintConfig.cpp:1330 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1198 +#: xs/src/libslic3r/PrintConfig.cpp:1338 msgid "Lift Z" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1199 +#: xs/src/libslic3r/PrintConfig.cpp:1339 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1207 +#: xs/src/libslic3r/PrintConfig.cpp:1347 msgid "Above Z" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1208 +#: xs/src/libslic3r/PrintConfig.cpp:1348 msgid "Only lift Z above" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1209 +#: xs/src/libslic3r/PrintConfig.cpp:1349 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1216 +#: xs/src/libslic3r/PrintConfig.cpp:1356 msgid "Below Z" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1217 +#: xs/src/libslic3r/PrintConfig.cpp:1357 msgid "Only lift Z below" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1218 +#: xs/src/libslic3r/PrintConfig.cpp:1358 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1226 xs/src/libslic3r/PrintConfig.cpp:1234 +#: xs/src/libslic3r/PrintConfig.cpp:1366 xs/src/libslic3r/PrintConfig.cpp:1374 msgid "Extra length on restart" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1227 +#: xs/src/libslic3r/PrintConfig.cpp:1367 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1235 +#: xs/src/libslic3r/PrintConfig.cpp:1375 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1242 xs/src/libslic3r/PrintConfig.cpp:1243 +#: xs/src/libslic3r/PrintConfig.cpp:1382 xs/src/libslic3r/PrintConfig.cpp:1383 msgid "Retraction Speed" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1244 +#: xs/src/libslic3r/PrintConfig.cpp:1384 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1250 xs/src/libslic3r/PrintConfig.cpp:1251 +#: xs/src/libslic3r/PrintConfig.cpp:1390 xs/src/libslic3r/PrintConfig.cpp:1391 msgid "Deretraction Speed" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1252 +#: xs/src/libslic3r/PrintConfig.cpp:1392 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1259 +#: xs/src/libslic3r/PrintConfig.cpp:1399 msgid "Seam position" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1261 +#: xs/src/libslic3r/PrintConfig.cpp:1401 msgid "Position of perimeters starting points." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1277 +#: xs/src/libslic3r/PrintConfig.cpp:1408 +msgid "Random" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1409 +msgid "Nearest" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1410 +msgid "Aligned" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1411 lib/Slic3r/GUI/MainFrame.pm:330 +msgid "Rear" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1417 msgid "Direction" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1279 +#: xs/src/libslic3r/PrintConfig.cpp:1419 msgid "Preferred direction of the seam" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1280 +#: xs/src/libslic3r/PrintConfig.cpp:1420 msgid "Seam preferred direction" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1288 +#: xs/src/libslic3r/PrintConfig.cpp:1428 msgid "Jitter" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1290 +#: xs/src/libslic3r/PrintConfig.cpp:1430 msgid "Seam preferred direction jitter" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1291 +#: xs/src/libslic3r/PrintConfig.cpp:1431 msgid "Preferred direction of the seam - jitter" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1302 +#: xs/src/libslic3r/PrintConfig.cpp:1442 msgid "USB/serial port for printer connection." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1310 +#: xs/src/libslic3r/PrintConfig.cpp:1450 msgid "Serial port speed" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1311 +#: xs/src/libslic3r/PrintConfig.cpp:1451 msgid "Speed (baud) of USB/serial port for printer connection." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1320 +#: xs/src/libslic3r/PrintConfig.cpp:1460 msgid "Distance from object" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1321 +#: xs/src/libslic3r/PrintConfig.cpp:1461 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1329 +#: xs/src/libslic3r/PrintConfig.cpp:1469 msgid "Skirt height" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1330 +#: xs/src/libslic3r/PrintConfig.cpp:1470 msgid "" "Height of skirt expressed in layers. Set this to a tall value to use skirt " "as a shield against drafts." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1337 +#: xs/src/libslic3r/PrintConfig.cpp:1477 msgid "Loops (minimum)" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1338 +#: xs/src/libslic3r/PrintConfig.cpp:1478 msgid "Skirt Loops" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1339 +#: xs/src/libslic3r/PrintConfig.cpp:1479 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1347 +#: xs/src/libslic3r/PrintConfig.cpp:1487 msgid "Slow down if layer print time is below" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1348 +#: xs/src/libslic3r/PrintConfig.cpp:1488 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1358 +#: xs/src/libslic3r/PrintConfig.cpp:1498 msgid "Small perimeters" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1360 +#: xs/src/libslic3r/PrintConfig.cpp:1500 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1370 +#: xs/src/libslic3r/PrintConfig.cpp:1510 msgid "Solid infill threshold area" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1372 +#: xs/src/libslic3r/PrintConfig.cpp:1512 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1373 +#: xs/src/libslic3r/PrintConfig.cpp:1513 msgid "mm²" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1379 +#: xs/src/libslic3r/PrintConfig.cpp:1519 msgid "Solid infill extruder" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1381 +#: xs/src/libslic3r/PrintConfig.cpp:1521 msgid "The extruder to use when printing solid infill." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1387 +#: xs/src/libslic3r/PrintConfig.cpp:1527 msgid "Solid infill every" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1389 +#: xs/src/libslic3r/PrintConfig.cpp:1529 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 " @@ -3296,13 +3616,13 @@ msgid "" "according to nozzle diameter and layer height." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1399 xs/src/libslic3r/PrintConfig.cpp:1409 -#: xs/src/libslic3r/GCode/PreviewData.cpp:162 +#: xs/src/libslic3r/PrintConfig.cpp:1539 xs/src/libslic3r/PrintConfig.cpp:1549 +#: xs/src/libslic3r/GCode/PreviewData.cpp:167 #: lib/Slic3r/GUI/Plater/3DPreview.pm:94 msgid "Solid infill" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1401 +#: xs/src/libslic3r/PrintConfig.cpp:1541 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, " @@ -3310,22 +3630,22 @@ msgid "" "(for example 90%) it will be computed over layer height." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1411 +#: xs/src/libslic3r/PrintConfig.cpp:1551 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1423 +#: xs/src/libslic3r/PrintConfig.cpp:1563 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1430 +#: xs/src/libslic3r/PrintConfig.cpp:1570 msgid "Spiral vase" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1431 +#: xs/src/libslic3r/PrintConfig.cpp:1571 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, " @@ -3334,18 +3654,18 @@ msgid "" "when printing more than an object." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1440 +#: xs/src/libslic3r/PrintConfig.cpp:1580 msgid "Temperature variation" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1441 +#: xs/src/libslic3r/PrintConfig.cpp:1581 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1451 +#: xs/src/libslic3r/PrintConfig.cpp:1591 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -3356,7 +3676,7 @@ msgid "" "\"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1466 +#: xs/src/libslic3r/PrintConfig.cpp:1606 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 " @@ -3368,64 +3688,72 @@ msgid "" "extruders, the gcode is processed in extruder order." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1481 +#: xs/src/libslic3r/PrintConfig.cpp:1621 msgid "Single Extruder Multi Material" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1482 +#: xs/src/libslic3r/PrintConfig.cpp:1622 msgid "The printer multiplexes filaments into a single hot end." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1487 +#: xs/src/libslic3r/PrintConfig.cpp:1627 msgid "Generate support material" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1489 +#: xs/src/libslic3r/PrintConfig.cpp:1629 msgid "Enable support material generation." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1494 +#: xs/src/libslic3r/PrintConfig.cpp:1634 msgid "XY separation between an object and its support" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1496 +#: xs/src/libslic3r/PrintConfig.cpp:1636 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1506 +#: xs/src/libslic3r/PrintConfig.cpp:1646 msgid "Pattern angle" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1508 +#: xs/src/libslic3r/PrintConfig.cpp:1648 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1518 +#: xs/src/libslic3r/PrintConfig.cpp:1658 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1524 +#: xs/src/libslic3r/PrintConfig.cpp:1664 msgid "Contact Z distance" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1526 +#: xs/src/libslic3r/PrintConfig.cpp:1666 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1539 +#: xs/src/libslic3r/PrintConfig.cpp:1674 +msgid "soluble" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1675 +msgid "detachable" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1679 msgid "Enforce support for the first" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1541 +#: xs/src/libslic3r/PrintConfig.cpp:1681 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -3433,21 +3761,21 @@ msgid "" "of objects having a very thin or poor footprint on the build plate." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1547 +#: xs/src/libslic3r/PrintConfig.cpp:1687 msgid "Enforce support for the first n layers" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1552 +#: xs/src/libslic3r/PrintConfig.cpp:1692 msgid "Support material/raft/skirt extruder" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1554 +#: xs/src/libslic3r/PrintConfig.cpp:1694 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1563 +#: xs/src/libslic3r/PrintConfig.cpp:1703 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, " @@ -3455,91 +3783,95 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1571 +#: xs/src/libslic3r/PrintConfig.cpp:1711 msgid "Interface loops" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1573 +#: xs/src/libslic3r/PrintConfig.cpp:1713 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1578 +#: xs/src/libslic3r/PrintConfig.cpp:1718 msgid "Support material/raft interface extruder" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1580 +#: xs/src/libslic3r/PrintConfig.cpp:1720 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1587 +#: xs/src/libslic3r/PrintConfig.cpp:1727 msgid "Interface layers" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1589 +#: xs/src/libslic3r/PrintConfig.cpp:1729 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1596 +#: xs/src/libslic3r/PrintConfig.cpp:1736 msgid "Interface pattern spacing" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1598 +#: xs/src/libslic3r/PrintConfig.cpp:1738 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1605 -#: xs/src/libslic3r/GCode/PreviewData.cpp:168 +#: xs/src/libslic3r/PrintConfig.cpp:1745 +#: xs/src/libslic3r/GCode/PreviewData.cpp:173 #: lib/Slic3r/GUI/Plater/3DPreview.pm:100 msgid "Support material interface" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1607 +#: xs/src/libslic3r/PrintConfig.cpp:1747 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " "speed." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1616 +#: xs/src/libslic3r/PrintConfig.cpp:1756 msgid "Pattern" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1618 +#: xs/src/libslic3r/PrintConfig.cpp:1758 msgid "Pattern used to generate support material." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1630 +#: xs/src/libslic3r/PrintConfig.cpp:1765 +msgid "Rectilinear grid" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1770 msgid "Pattern spacing" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1632 +#: xs/src/libslic3r/PrintConfig.cpp:1772 msgid "Spacing between support material lines." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1641 +#: xs/src/libslic3r/PrintConfig.cpp:1781 msgid "Speed for printing support material." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1648 +#: xs/src/libslic3r/PrintConfig.cpp:1788 msgid "Synchronize with object layers" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1650 +#: xs/src/libslic3r/PrintConfig.cpp:1790 msgid "" "Synchronize support layers with the object print layers. This is useful with " "multi-material printers, where the extruder switch is expensive." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1656 +#: xs/src/libslic3r/PrintConfig.cpp:1796 msgid "Overhang threshold" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1658 +#: xs/src/libslic3r/PrintConfig.cpp:1798 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -3548,60 +3880,60 @@ msgid "" "detection (recommended)." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1670 +#: xs/src/libslic3r/PrintConfig.cpp:1810 msgid "With sheath around the support" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1672 +#: xs/src/libslic3r/PrintConfig.cpp:1812 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1679 +#: xs/src/libslic3r/PrintConfig.cpp:1819 msgid "" "Extruder temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1682 +#: xs/src/libslic3r/PrintConfig.cpp:1822 msgid "Temperature" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1688 +#: xs/src/libslic3r/PrintConfig.cpp:1828 msgid "Detect thin walls" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1690 +#: xs/src/libslic3r/PrintConfig.cpp:1830 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1696 +#: xs/src/libslic3r/PrintConfig.cpp:1836 msgid "Threads" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1697 +#: xs/src/libslic3r/PrintConfig.cpp:1837 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1709 +#: xs/src/libslic3r/PrintConfig.cpp:1849 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1719 xs/src/libslic3r/PrintConfig.cpp:1730 -#: xs/src/libslic3r/GCode/PreviewData.cpp:163 +#: xs/src/libslic3r/PrintConfig.cpp:1859 xs/src/libslic3r/PrintConfig.cpp:1870 +#: xs/src/libslic3r/GCode/PreviewData.cpp:168 #: lib/Slic3r/GUI/Plater/3DPreview.pm:95 msgid "Top solid infill" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1721 +#: xs/src/libslic3r/PrintConfig.cpp:1861 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 " @@ -3610,7 +3942,7 @@ msgid "" "percentage (for example 90%) it will be computed over layer height." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1732 +#: xs/src/libslic3r/PrintConfig.cpp:1872 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 " @@ -3619,52 +3951,52 @@ msgid "" "for auto." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1744 lib/Slic3r/GUI/MainFrame.pm:308 +#: xs/src/libslic3r/PrintConfig.cpp:1884 lib/Slic3r/GUI/MainFrame.pm:327 msgid "Top" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1746 +#: xs/src/libslic3r/PrintConfig.cpp:1886 msgid "Number of solid layers to generate on top surfaces." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1748 +#: xs/src/libslic3r/PrintConfig.cpp:1888 msgid "Top solid layers" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1753 +#: xs/src/libslic3r/PrintConfig.cpp:1893 #: lib/Slic3r/GUI/Plater/3DPreview.pm:105 msgid "Travel" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1754 +#: xs/src/libslic3r/PrintConfig.cpp:1894 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1762 +#: xs/src/libslic3r/PrintConfig.cpp:1902 msgid "Use firmware retraction" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1763 +#: xs/src/libslic3r/PrintConfig.cpp:1903 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1769 +#: xs/src/libslic3r/PrintConfig.cpp:1909 msgid "Use relative E distances" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1770 +#: xs/src/libslic3r/PrintConfig.cpp:1910 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1776 +#: xs/src/libslic3r/PrintConfig.cpp:1916 msgid "Use volumetric E" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1777 +#: xs/src/libslic3r/PrintConfig.cpp:1917 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -3674,113 +4006,135 @@ msgid "" "only supported in recent Marlin." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1787 +#: xs/src/libslic3r/PrintConfig.cpp:1927 msgid "Enable variable layer height feature" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1788 +#: xs/src/libslic3r/PrintConfig.cpp:1928 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1794 +#: xs/src/libslic3r/PrintConfig.cpp:1934 msgid "Wipe while retracting" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1795 +#: xs/src/libslic3r/PrintConfig.cpp:1935 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1802 +#: xs/src/libslic3r/PrintConfig.cpp:1942 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1808 +#: xs/src/libslic3r/PrintConfig.cpp:1948 msgid "Purging volumes - load/unload volumes" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1809 +#: xs/src/libslic3r/PrintConfig.cpp:1949 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1816 +#: xs/src/libslic3r/PrintConfig.cpp:1956 msgid "Purging volumes - matrix" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1817 +#: xs/src/libslic3r/PrintConfig.cpp:1957 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1827 +#: xs/src/libslic3r/PrintConfig.cpp:1967 msgid "Position X" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1828 +#: xs/src/libslic3r/PrintConfig.cpp:1968 msgid "X coordinate of the left front corner of a wipe tower" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1834 +#: xs/src/libslic3r/PrintConfig.cpp:1974 msgid "Position Y" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1835 +#: xs/src/libslic3r/PrintConfig.cpp:1975 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1841 lib/Slic3r/GUI/Plater/3DPreview.pm:76 +#: xs/src/libslic3r/PrintConfig.cpp:1981 lib/Slic3r/GUI/Plater/3DPreview.pm:76 msgid "Width" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1842 +#: xs/src/libslic3r/PrintConfig.cpp:1982 msgid "Width of a wipe tower" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1848 +#: xs/src/libslic3r/PrintConfig.cpp:1988 msgid "Wipe tower rotation angle" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1849 +#: xs/src/libslic3r/PrintConfig.cpp:1989 msgid "Wipe tower rotation angle with respect to x-axis " msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1850 +#: xs/src/libslic3r/PrintConfig.cpp:1990 msgid "degrees" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1855 +#: xs/src/libslic3r/PrintConfig.cpp:1996 +msgid "Purging into infill" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1997 +msgid "" +"Wiping after toolchange will be preferentially done inside infills. This " +"lowers the amount of waste but may result in longer print time due to " +"additional travel moves." +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:2005 +msgid "Purging into objects" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:2006 +msgid "" +"Objects will be used to wipe 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 "" + +#: xs/src/libslic3r/PrintConfig.cpp:2013 msgid "Maximal bridging distance" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1856 +#: xs/src/libslic3r/PrintConfig.cpp:2014 msgid "Maximal distance between supports on sparse infill sections. " msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1862 +#: xs/src/libslic3r/PrintConfig.cpp:2020 msgid "XY Size Compensation" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1864 +#: xs/src/libslic3r/PrintConfig.cpp:2022 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 "" -#: xs/src/libslic3r/PrintConfig.cpp:1872 +#: xs/src/libslic3r/PrintConfig.cpp:2030 msgid "Z offset" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1873 +#: xs/src/libslic3r/PrintConfig.cpp:2031 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 " @@ -3788,962 +4142,962 @@ msgid "" "print bed, set this to -0.3 (or fix your endstop)." msgstr "" -#: xs/src/libslic3r/GCode/PreviewData.cpp:158 +#: xs/src/libslic3r/GCode/PreviewData.cpp:163 #: lib/Slic3r/GUI/Plater/3DPreview.pm:90 msgid "Perimeter" msgstr "" -#: xs/src/libslic3r/GCode/PreviewData.cpp:159 +#: xs/src/libslic3r/GCode/PreviewData.cpp:164 #: lib/Slic3r/GUI/Plater/3DPreview.pm:91 msgid "External perimeter" msgstr "" -#: xs/src/libslic3r/GCode/PreviewData.cpp:160 +#: xs/src/libslic3r/GCode/PreviewData.cpp:165 #: lib/Slic3r/GUI/Plater/3DPreview.pm:92 msgid "Overhang perimeter" msgstr "" -#: xs/src/libslic3r/GCode/PreviewData.cpp:161 +#: xs/src/libslic3r/GCode/PreviewData.cpp:166 #: lib/Slic3r/GUI/Plater/3DPreview.pm:93 msgid "Internal infill" msgstr "" -#: xs/src/libslic3r/GCode/PreviewData.cpp:164 +#: xs/src/libslic3r/GCode/PreviewData.cpp:169 #: lib/Slic3r/GUI/Plater/3DPreview.pm:96 msgid "Bridge infill" msgstr "" -#: xs/src/libslic3r/GCode/PreviewData.cpp:171 +#: xs/src/libslic3r/GCode/PreviewData.cpp:176 msgid "Mixed" msgstr "" -#: xs/src/libslic3r/GCode/PreviewData.cpp:362 +#: xs/src/libslic3r/GCode/PreviewData.cpp:367 #: lib/Slic3r/GUI/Plater/3DPreview.pm:74 msgid "Feature type" msgstr "" -#: xs/src/libslic3r/GCode/PreviewData.cpp:364 +#: xs/src/libslic3r/GCode/PreviewData.cpp:369 msgid "Height (mm)" msgstr "" -#: xs/src/libslic3r/GCode/PreviewData.cpp:366 +#: xs/src/libslic3r/GCode/PreviewData.cpp:371 msgid "Width (mm)" msgstr "" -#: xs/src/libslic3r/GCode/PreviewData.cpp:368 +#: xs/src/libslic3r/GCode/PreviewData.cpp:373 msgid "Speed (mm/s)" msgstr "" -#: xs/src/libslic3r/GCode/PreviewData.cpp:370 +#: xs/src/libslic3r/GCode/PreviewData.cpp:375 msgid "Volumetric flow rate (mm3/s)" msgstr "" -#: xs/src/libslic3r/GCode/PreviewData.cpp:372 +#: xs/src/libslic3r/GCode/PreviewData.cpp:377 #: lib/Slic3r/GUI/Plater/3DPreview.pm:79 msgid "Tool" msgstr "" -#: lib/Slic3r/GUI.pm:307 +#: lib/Slic3r/GUI.pm:308 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:62 +#: lib/Slic3r/GUI/MainFrame.pm:66 msgid "Version " msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:62 +#: lib/Slic3r/GUI/MainFrame.pm:66 msgid "" " - Remember to check for updates at http://github.com/prusa3d/slic3r/releases" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:116 +#: lib/Slic3r/GUI/MainFrame.pm:135 msgid "Plater" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:118 +#: lib/Slic3r/GUI/MainFrame.pm:137 msgid "Controller" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:196 +#: lib/Slic3r/GUI/MainFrame.pm:215 msgid "Open STL/OBJ/AMF/3MF…\tCtrl+O" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:196 +#: lib/Slic3r/GUI/MainFrame.pm:215 msgid "Open a model" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:199 +#: lib/Slic3r/GUI/MainFrame.pm:218 msgid "&Load Config…\tCtrl+L" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:199 +#: lib/Slic3r/GUI/MainFrame.pm:218 msgid "Load exported configuration file" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:202 +#: lib/Slic3r/GUI/MainFrame.pm:221 msgid "&Export Config…\tCtrl+E" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:202 +#: lib/Slic3r/GUI/MainFrame.pm:221 msgid "Export current configuration to file" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:205 +#: lib/Slic3r/GUI/MainFrame.pm:224 msgid "&Load Config Bundle…" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:205 +#: lib/Slic3r/GUI/MainFrame.pm:224 msgid "Load presets from a bundle" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:208 +#: lib/Slic3r/GUI/MainFrame.pm:227 msgid "&Export Config Bundle…" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:208 +#: lib/Slic3r/GUI/MainFrame.pm:227 msgid "Export all presets to file" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:213 +#: lib/Slic3r/GUI/MainFrame.pm:232 msgid "Q&uick Slice…\tCtrl+U" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:213 +#: lib/Slic3r/GUI/MainFrame.pm:232 msgid "Slice a file into a G-code" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:219 +#: lib/Slic3r/GUI/MainFrame.pm:238 msgid "Quick Slice and Save &As…\tCtrl+Alt+U" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:219 +#: lib/Slic3r/GUI/MainFrame.pm:238 msgid "Slice a file into a G-code, save as" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:225 +#: lib/Slic3r/GUI/MainFrame.pm:244 msgid "&Repeat Last Quick Slice\tCtrl+Shift+U" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:225 +#: lib/Slic3r/GUI/MainFrame.pm:244 msgid "Repeat last quick slice" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:232 +#: lib/Slic3r/GUI/MainFrame.pm:251 msgid "Slice to SV&G…\tCtrl+G" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:232 +#: lib/Slic3r/GUI/MainFrame.pm:251 msgid "Slice file to a multi-layer SVG" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:236 +#: lib/Slic3r/GUI/MainFrame.pm:255 msgid "(&Re)Slice Now\tCtrl+S" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:236 +#: lib/Slic3r/GUI/MainFrame.pm:255 msgid "Start new slicing process" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:239 +#: lib/Slic3r/GUI/MainFrame.pm:258 msgid "Repair STL file…" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:239 +#: lib/Slic3r/GUI/MainFrame.pm:258 msgid "Automatically repair an STL file" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:243 +#: lib/Slic3r/GUI/MainFrame.pm:262 msgid "&Quit" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:243 +#: lib/Slic3r/GUI/MainFrame.pm:262 msgid "Quit Slic3r" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:253 +#: lib/Slic3r/GUI/MainFrame.pm:272 msgid "Export G-code..." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:253 +#: lib/Slic3r/GUI/MainFrame.pm:272 msgid "Export current plate as G-code" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:256 +#: lib/Slic3r/GUI/MainFrame.pm:275 msgid "Export plate as STL..." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:256 +#: lib/Slic3r/GUI/MainFrame.pm:275 msgid "Export current plate as STL" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:259 +#: lib/Slic3r/GUI/MainFrame.pm:278 msgid "Export plate as AMF..." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:259 +#: lib/Slic3r/GUI/MainFrame.pm:278 msgid "Export current plate as AMF" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:262 +#: lib/Slic3r/GUI/MainFrame.pm:281 msgid "Export plate as 3MF..." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:262 +#: lib/Slic3r/GUI/MainFrame.pm:281 msgid "Export current plate as 3MF" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:275 +#: lib/Slic3r/GUI/MainFrame.pm:294 msgid "Select &Plater Tab\tCtrl+1" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:275 +#: lib/Slic3r/GUI/MainFrame.pm:294 msgid "Show the plater" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:281 +#: lib/Slic3r/GUI/MainFrame.pm:300 msgid "Select &Controller Tab\tCtrl+T" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:281 +#: lib/Slic3r/GUI/MainFrame.pm:300 msgid "Show the printer controller" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:289 +#: lib/Slic3r/GUI/MainFrame.pm:308 msgid "Select P&rint Settings Tab\tCtrl+2" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:289 +#: lib/Slic3r/GUI/MainFrame.pm:308 msgid "Show the print settings" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:292 +#: lib/Slic3r/GUI/MainFrame.pm:311 msgid "Select &Filament Settings Tab\tCtrl+3" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:292 +#: lib/Slic3r/GUI/MainFrame.pm:311 msgid "Show the filament settings" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:295 +#: lib/Slic3r/GUI/MainFrame.pm:314 msgid "Select Print&er Settings Tab\tCtrl+4" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:295 +#: lib/Slic3r/GUI/MainFrame.pm:314 msgid "Show the printer settings" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:307 +#: lib/Slic3r/GUI/MainFrame.pm:326 msgid "Iso" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:307 +#: lib/Slic3r/GUI/MainFrame.pm:326 msgid "Iso View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:308 +#: lib/Slic3r/GUI/MainFrame.pm:327 msgid "Top View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:309 +#: lib/Slic3r/GUI/MainFrame.pm:328 msgid "Bottom View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:310 +#: lib/Slic3r/GUI/MainFrame.pm:329 msgid "Front" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:310 +#: lib/Slic3r/GUI/MainFrame.pm:329 msgid "Front View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:311 -msgid "Rear" -msgstr "" - -#: lib/Slic3r/GUI/MainFrame.pm:311 +#: lib/Slic3r/GUI/MainFrame.pm:330 msgid "Rear View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:312 +#: lib/Slic3r/GUI/MainFrame.pm:331 msgid "Left" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:312 +#: lib/Slic3r/GUI/MainFrame.pm:331 msgid "Left View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:313 +#: lib/Slic3r/GUI/MainFrame.pm:332 msgid "Right" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:313 +#: lib/Slic3r/GUI/MainFrame.pm:332 msgid "Right View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:319 +#: lib/Slic3r/GUI/MainFrame.pm:338 msgid "Prusa 3D Drivers" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:319 +#: lib/Slic3r/GUI/MainFrame.pm:338 msgid "Open the Prusa3D drivers download page in your browser" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:322 +#: lib/Slic3r/GUI/MainFrame.pm:341 msgid "Prusa Edition Releases" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:322 +#: lib/Slic3r/GUI/MainFrame.pm:341 msgid "Open the Prusa Edition releases page in your browser" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:329 +#: lib/Slic3r/GUI/MainFrame.pm:348 msgid "Slic3r &Website" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:329 +#: lib/Slic3r/GUI/MainFrame.pm:348 msgid "Open the Slic3r website in your browser" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:332 +#: lib/Slic3r/GUI/MainFrame.pm:351 msgid "Slic3r &Manual" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:332 +#: lib/Slic3r/GUI/MainFrame.pm:351 msgid "Open the Slic3r manual in your browser" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:336 +#: lib/Slic3r/GUI/MainFrame.pm:355 msgid "System Info" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:336 +#: lib/Slic3r/GUI/MainFrame.pm:355 msgid "Show system information" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:339 +#: lib/Slic3r/GUI/MainFrame.pm:358 msgid "Show &Configuration Folder" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:339 +#: lib/Slic3r/GUI/MainFrame.pm:358 msgid "Show user configuration folder (datadir)" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:342 +#: lib/Slic3r/GUI/MainFrame.pm:361 msgid "Report an Issue" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:342 +#: lib/Slic3r/GUI/MainFrame.pm:361 msgid "Report an issue on the Slic3r Prusa Edition" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:345 +#: lib/Slic3r/GUI/MainFrame.pm:364 msgid "&About Slic3r" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:345 +#: lib/Slic3r/GUI/MainFrame.pm:364 msgid "Show about dialog" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:355 +#: lib/Slic3r/GUI/MainFrame.pm:374 msgid "&File" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:356 +#: lib/Slic3r/GUI/MainFrame.pm:375 msgid "&Plater" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:357 +#: lib/Slic3r/GUI/MainFrame.pm:376 msgid "&Object" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:358 +#: lib/Slic3r/GUI/MainFrame.pm:377 msgid "&Window" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:359 +#: lib/Slic3r/GUI/MainFrame.pm:378 msgid "&View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:362 +#: lib/Slic3r/GUI/MainFrame.pm:381 msgid "&Help" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:393 +#: lib/Slic3r/GUI/MainFrame.pm:412 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:405 +#: lib/Slic3r/GUI/MainFrame.pm:424 msgid "No previously sliced file." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:406 lib/Slic3r/GUI/Plater.pm:1406 +#: lib/Slic3r/GUI/MainFrame.pm:425 lib/Slic3r/GUI/Plater.pm:1405 msgid "Error" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:410 +#: lib/Slic3r/GUI/MainFrame.pm:429 msgid "Previously sliced file (" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:410 +#: lib/Slic3r/GUI/MainFrame.pm:429 msgid ") not found." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:411 +#: lib/Slic3r/GUI/MainFrame.pm:430 msgid "File Not Found" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:450 +#: lib/Slic3r/GUI/MainFrame.pm:469 msgid "SVG" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:450 +#: lib/Slic3r/GUI/MainFrame.pm:469 msgid "G-code" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:450 lib/Slic3r/GUI/Plater.pm:1756 +#: lib/Slic3r/GUI/MainFrame.pm:469 lib/Slic3r/GUI/Plater.pm:1795 msgid " file as:" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:464 +#: lib/Slic3r/GUI/MainFrame.pm:483 msgid "Slicing…" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:464 +#: lib/Slic3r/GUI/MainFrame.pm:483 msgid "Processing " msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:484 +#: lib/Slic3r/GUI/MainFrame.pm:503 msgid " was successfully sliced." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:486 +#: lib/Slic3r/GUI/MainFrame.pm:505 msgid "Slicing Done!" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:502 +#: lib/Slic3r/GUI/MainFrame.pm:521 msgid "Select the STL file to repair:" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:516 +#: lib/Slic3r/GUI/MainFrame.pm:535 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:530 +#: lib/Slic3r/GUI/MainFrame.pm:549 msgid "Your file was repaired." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:530 +#: lib/Slic3r/GUI/MainFrame.pm:549 msgid "Repair" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:541 +#: lib/Slic3r/GUI/MainFrame.pm:560 msgid "Save configuration as:" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:559 lib/Slic3r/GUI/MainFrame.pm:603 +#: lib/Slic3r/GUI/MainFrame.pm:578 lib/Slic3r/GUI/MainFrame.pm:622 msgid "Select configuration to load:" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:582 +#: lib/Slic3r/GUI/MainFrame.pm:601 msgid "Save presets bundle as:" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:623 +#: lib/Slic3r/GUI/MainFrame.pm:642 #, possible-perl-format msgid "%d presets successfully imported." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:140 lib/Slic3r/GUI/Plater.pm:2282 +#: lib/Slic3r/GUI/Plater.pm:164 lib/Slic3r/GUI/Plater.pm:2323 msgid "3D" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:180 +#: lib/Slic3r/GUI/Plater.pm:206 msgid "2D" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:199 +#: lib/Slic3r/GUI/Plater.pm:224 msgid "Layers" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:232 lib/Slic3r/GUI/Plater.pm:250 +#: lib/Slic3r/GUI/Plater.pm:250 lib/Slic3r/GUI/Plater.pm:268 msgid "Add…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:234 lib/Slic3r/GUI/Plater.pm:252 +#: lib/Slic3r/GUI/Plater.pm:252 lib/Slic3r/GUI/Plater.pm:270 msgid "Delete All" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:235 lib/Slic3r/GUI/Plater.pm:253 +#: lib/Slic3r/GUI/Plater.pm:253 lib/Slic3r/GUI/Plater.pm:271 msgid "Arrange" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:237 +#: lib/Slic3r/GUI/Plater.pm:255 msgid "More" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:238 +#: lib/Slic3r/GUI/Plater.pm:256 msgid "Fewer" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:240 +#: lib/Slic3r/GUI/Plater.pm:258 msgid "45° ccw" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:241 +#: lib/Slic3r/GUI/Plater.pm:259 msgid "45° cw" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:242 lib/Slic3r/GUI/Plater.pm:258 +#: lib/Slic3r/GUI/Plater.pm:260 lib/Slic3r/GUI/Plater.pm:276 msgid "Scale…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:243 lib/Slic3r/GUI/Plater.pm:259 -#: lib/Slic3r/GUI/Plater.pm:2252 +#: lib/Slic3r/GUI/Plater.pm:261 lib/Slic3r/GUI/Plater.pm:277 +#: lib/Slic3r/GUI/Plater.pm:2293 msgid "Split" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:244 lib/Slic3r/GUI/Plater.pm:260 -#: lib/Slic3r/GUI/Plater.pm:2255 +#: lib/Slic3r/GUI/Plater.pm:262 lib/Slic3r/GUI/Plater.pm:278 +#: lib/Slic3r/GUI/Plater.pm:2296 msgid "Cut…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:246 lib/Slic3r/GUI/Plater.pm:261 -#: lib/Slic3r/GUI/Plater.pm:2259 +#: lib/Slic3r/GUI/Plater.pm:264 lib/Slic3r/GUI/Plater.pm:279 +#: lib/Slic3r/GUI/Plater.pm:2300 msgid "Settings…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:247 +#: lib/Slic3r/GUI/Plater.pm:265 msgid "Layer Editing" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:262 +#: lib/Slic3r/GUI/Plater.pm:280 msgid "Layer editing" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:285 +#: lib/Slic3r/GUI/Plater.pm:303 msgid "Name" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:286 lib/Slic3r/GUI/Plater.pm:1007 +#: lib/Slic3r/GUI/Plater.pm:304 lib/Slic3r/GUI/Plater.pm:992 msgid "Copies" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:287 lib/Slic3r/GUI/Plater.pm:1163 -#: lib/Slic3r/GUI/Plater.pm:1168 lib/Slic3r/GUI/Plater.pm:2221 +#: lib/Slic3r/GUI/Plater.pm:305 lib/Slic3r/GUI/Plater.pm:1158 +#: lib/Slic3r/GUI/Plater.pm:1163 lib/Slic3r/GUI/Plater.pm:2262 msgid "Scale" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:301 +#: lib/Slic3r/GUI/Plater.pm:322 msgid "Export G-code…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:302 +#: lib/Slic3r/GUI/Plater.pm:323 msgid "Slice now" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:303 +#: lib/Slic3r/GUI/Plater.pm:324 msgid "Print…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:304 +#: lib/Slic3r/GUI/Plater.pm:325 msgid "Send to printer" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:305 +#: lib/Slic3r/GUI/Plater.pm:326 msgid "Export STL…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:432 +#: lib/Slic3r/GUI/Plater.pm:453 msgid "Print settings" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:434 +#: lib/Slic3r/GUI/Plater.pm:455 msgid "Printer" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:467 +#: lib/Slic3r/GUI/Plater.pm:488 msgid "Info" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:478 +#: lib/Slic3r/GUI/Plater.pm:499 msgid "Volume" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:479 +#: lib/Slic3r/GUI/Plater.pm:500 msgid "Facets" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:480 +#: lib/Slic3r/GUI/Plater.pm:501 msgid "Materials" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:481 +#: lib/Slic3r/GUI/Plater.pm:502 msgid "Manifold" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:507 +#: lib/Slic3r/GUI/Plater.pm:527 msgid "Sliced Info" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:516 -msgid "Used Filament (m)" -msgstr "" - -#: lib/Slic3r/GUI/Plater.pm:517 -msgid "Used Filament (mm³)" -msgstr "" - -#: lib/Slic3r/GUI/Plater.pm:518 -msgid "Used Filament (g)" -msgstr "" - -#: lib/Slic3r/GUI/Plater.pm:520 -msgid "Estimated printing time" -msgstr "" - -#: lib/Slic3r/GUI/Plater.pm:728 +#: lib/Slic3r/GUI/Plater.pm:713 msgid "Loading…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:728 lib/Slic3r/GUI/Plater.pm:742 +#: lib/Slic3r/GUI/Plater.pm:713 lib/Slic3r/GUI/Plater.pm:727 msgid "Processing input file\n" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:765 +#: lib/Slic3r/GUI/Plater.pm:750 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 "" -#: lib/Slic3r/GUI/Plater.pm:768 lib/Slic3r/GUI/Plater.pm:785 +#: lib/Slic3r/GUI/Plater.pm:753 lib/Slic3r/GUI/Plater.pm:770 msgid "Multi-part object detected" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:782 +#: lib/Slic3r/GUI/Plater.pm:767 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 "" -#: lib/Slic3r/GUI/Plater.pm:794 +#: lib/Slic3r/GUI/Plater.pm:779 msgid "Loaded " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:852 +#: lib/Slic3r/GUI/Plater.pm:837 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:853 +#: lib/Slic3r/GUI/Plater.pm:838 msgid "Object too large?" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1007 +#: lib/Slic3r/GUI/Plater.pm:992 msgid "Enter the number of copies of the selected object:" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1034 +#: lib/Slic3r/GUI/Plater.pm:1019 msgid "" "\n" "Non-positive value." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1035 +#: lib/Slic3r/GUI/Plater.pm:1020 msgid "" "\n" "Not a numeric value." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1036 +#: lib/Slic3r/GUI/Plater.pm:1021 msgid "Slic3r Error" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1057 +#: lib/Slic3r/GUI/Plater.pm:1042 msgid "Enter the rotation angle:" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1057 +#: lib/Slic3r/GUI/Plater.pm:1042 msgid "Rotate around " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1057 +#: lib/Slic3r/GUI/Plater.pm:1042 msgid "Invalid rotation angle entered" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1137 +#: lib/Slic3r/GUI/Plater.pm:1132 #, possible-perl-format msgid "Enter the new size for the selected object (print bed: %smm):" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1138 lib/Slic3r/GUI/Plater.pm:1142 +#: lib/Slic3r/GUI/Plater.pm:1133 lib/Slic3r/GUI/Plater.pm:1137 msgid "Scale along " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1138 lib/Slic3r/GUI/Plater.pm:1142 -#: lib/Slic3r/GUI/Plater.pm:1163 lib/Slic3r/GUI/Plater.pm:1168 +#: lib/Slic3r/GUI/Plater.pm:1133 lib/Slic3r/GUI/Plater.pm:1137 +#: lib/Slic3r/GUI/Plater.pm:1158 lib/Slic3r/GUI/Plater.pm:1163 msgid "Invalid scaling value entered" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1142 lib/Slic3r/GUI/Plater.pm:1168 +#: lib/Slic3r/GUI/Plater.pm:1137 lib/Slic3r/GUI/Plater.pm:1163 #, no-perl-format msgid "Enter the scale % for the selected object:" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1163 +#: lib/Slic3r/GUI/Plater.pm:1158 msgid "Enter the new max size for the selected object:" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1219 +#: lib/Slic3r/GUI/Plater.pm:1218 msgid "" "The selected object can't be split because it contains more than one volume/" "material." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1228 +#: lib/Slic3r/GUI/Plater.pm:1227 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1392 +#: lib/Slic3r/GUI/Plater.pm:1391 msgid "Slicing cancelled" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1406 +#: lib/Slic3r/GUI/Plater.pm:1405 msgid "Another export job is currently running." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1556 +#: lib/Slic3r/GUI/Plater.pm:1555 msgid "File added to print queue" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1562 +#: lib/Slic3r/GUI/Plater.pm:1561 msgid "G-code file exported to " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1565 +#: lib/Slic3r/GUI/Plater.pm:1564 msgid "Export failed" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1577 +#: lib/Slic3r/GUI/Plater.pm:1576 msgid "OctoPrint upload finished." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1620 lib/Slic3r/GUI/Plater.pm:1662 +#: lib/Slic3r/GUI/Plater.pm:1610 +msgid "Used Filament (m)" +msgstr "" + +#: lib/Slic3r/GUI/Plater.pm:1612 +msgid "Used Filament (mm³)" +msgstr "" + +#: lib/Slic3r/GUI/Plater.pm:1614 +msgid "Used Filament (g)" +msgstr "" + +#: lib/Slic3r/GUI/Plater.pm:1618 +msgid "Estimated printing time (normal mode)" +msgstr "" + +#: lib/Slic3r/GUI/Plater.pm:1620 +msgid "Estimated printing time (silent mode)" +msgstr "" + +#: lib/Slic3r/GUI/Plater.pm:1659 lib/Slic3r/GUI/Plater.pm:1701 msgid "STL file exported to " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1701 +#: lib/Slic3r/GUI/Plater.pm:1740 msgid "AMF file exported to " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1705 +#: lib/Slic3r/GUI/Plater.pm:1744 msgid "Error exporting AMF file " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1717 +#: lib/Slic3r/GUI/Plater.pm:1756 msgid "3MF file exported to " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1721 +#: lib/Slic3r/GUI/Plater.pm:1760 msgid "Error exporting 3MF file " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2099 +#: lib/Slic3r/GUI/Plater.pm:2140 #, possible-perl-format msgid "%d (%d shells)" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2101 +#: lib/Slic3r/GUI/Plater.pm:2142 #, possible-perl-format msgid "Auto-repaired (%d errors)" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2106 +#: lib/Slic3r/GUI/Plater.pm:2147 #, possible-perl-format msgid "" "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " "facets reversed, %d backwards edges" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2111 +#: lib/Slic3r/GUI/Plater.pm:2152 msgid "Yes" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2174 +#: lib/Slic3r/GUI/Plater.pm:2215 msgid "Remove the selected object" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2177 +#: lib/Slic3r/GUI/Plater.pm:2218 msgid "Increase copies" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2177 +#: lib/Slic3r/GUI/Plater.pm:2218 msgid "Place one more copy of the selected object" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2180 +#: lib/Slic3r/GUI/Plater.pm:2221 msgid "Decrease copies" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2180 +#: lib/Slic3r/GUI/Plater.pm:2221 msgid "Remove one copy of the selected object" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2183 +#: lib/Slic3r/GUI/Plater.pm:2224 msgid "Set number of copies…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2183 +#: lib/Slic3r/GUI/Plater.pm:2224 msgid "Change the number of copies of the selected object" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2187 +#: lib/Slic3r/GUI/Plater.pm:2228 msgid "Rotate 45° clockwise" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2187 +#: lib/Slic3r/GUI/Plater.pm:2228 msgid "Rotate the selected object by 45° clockwise" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2190 +#: lib/Slic3r/GUI/Plater.pm:2231 msgid "Rotate 45° counter-clockwise" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2190 +#: lib/Slic3r/GUI/Plater.pm:2231 msgid "Rotate the selected object by 45° counter-clockwise" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2195 +#: lib/Slic3r/GUI/Plater.pm:2236 msgid "Rotate" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2195 +#: lib/Slic3r/GUI/Plater.pm:2236 msgid "Rotate the selected object by an arbitrary angle" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2197 +#: lib/Slic3r/GUI/Plater.pm:2238 msgid "Around X axis…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2197 +#: lib/Slic3r/GUI/Plater.pm:2238 msgid "Rotate the selected object by an arbitrary angle around X axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2200 +#: lib/Slic3r/GUI/Plater.pm:2241 msgid "Around Y axis…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2200 +#: lib/Slic3r/GUI/Plater.pm:2241 msgid "Rotate the selected object by an arbitrary angle around Y axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2203 +#: lib/Slic3r/GUI/Plater.pm:2244 msgid "Around Z axis…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2203 +#: lib/Slic3r/GUI/Plater.pm:2244 msgid "Rotate the selected object by an arbitrary angle around Z axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2208 +#: lib/Slic3r/GUI/Plater.pm:2249 msgid "Mirror" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2208 +#: lib/Slic3r/GUI/Plater.pm:2249 msgid "Mirror the selected object" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2210 lib/Slic3r/GUI/Plater.pm:2226 -#: lib/Slic3r/GUI/Plater.pm:2242 +#: lib/Slic3r/GUI/Plater.pm:2251 lib/Slic3r/GUI/Plater.pm:2267 +#: lib/Slic3r/GUI/Plater.pm:2283 msgid "Along X axis…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2210 +#: lib/Slic3r/GUI/Plater.pm:2251 msgid "Mirror the selected object along the X axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2213 lib/Slic3r/GUI/Plater.pm:2229 -#: lib/Slic3r/GUI/Plater.pm:2245 +#: lib/Slic3r/GUI/Plater.pm:2254 lib/Slic3r/GUI/Plater.pm:2270 +#: lib/Slic3r/GUI/Plater.pm:2286 msgid "Along Y axis…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2213 +#: lib/Slic3r/GUI/Plater.pm:2254 msgid "Mirror the selected object along the Y axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2216 lib/Slic3r/GUI/Plater.pm:2232 -#: lib/Slic3r/GUI/Plater.pm:2248 +#: lib/Slic3r/GUI/Plater.pm:2257 lib/Slic3r/GUI/Plater.pm:2273 +#: lib/Slic3r/GUI/Plater.pm:2289 msgid "Along Z axis…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2216 +#: lib/Slic3r/GUI/Plater.pm:2257 msgid "Mirror the selected object along the Z axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2221 lib/Slic3r/GUI/Plater.pm:2237 +#: lib/Slic3r/GUI/Plater.pm:2262 lib/Slic3r/GUI/Plater.pm:2278 msgid "Scale the selected object along a single axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2223 lib/Slic3r/GUI/Plater.pm:2239 +#: lib/Slic3r/GUI/Plater.pm:2264 lib/Slic3r/GUI/Plater.pm:2280 msgid "Uniformly…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2223 lib/Slic3r/GUI/Plater.pm:2239 +#: lib/Slic3r/GUI/Plater.pm:2264 lib/Slic3r/GUI/Plater.pm:2280 msgid "Scale the selected object along the XYZ axes" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2226 lib/Slic3r/GUI/Plater.pm:2242 +#: lib/Slic3r/GUI/Plater.pm:2267 lib/Slic3r/GUI/Plater.pm:2283 msgid "Scale the selected object along the X axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2229 lib/Slic3r/GUI/Plater.pm:2245 +#: lib/Slic3r/GUI/Plater.pm:2270 lib/Slic3r/GUI/Plater.pm:2286 msgid "Scale the selected object along the Y axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2232 lib/Slic3r/GUI/Plater.pm:2248 +#: lib/Slic3r/GUI/Plater.pm:2273 lib/Slic3r/GUI/Plater.pm:2289 msgid "Scale the selected object along the Z axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2237 +#: lib/Slic3r/GUI/Plater.pm:2278 msgid "Scale to size" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2252 +#: lib/Slic3r/GUI/Plater.pm:2293 msgid "Split the selected object into individual parts" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2255 +#: lib/Slic3r/GUI/Plater.pm:2296 msgid "Open the 3D cutting tool" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2259 +#: lib/Slic3r/GUI/Plater.pm:2300 msgid "Open the object editor dialog" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2263 +#: lib/Slic3r/GUI/Plater.pm:2304 msgid "Reload from Disk" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2263 +#: lib/Slic3r/GUI/Plater.pm:2304 msgid "Reload the selected file from Disk" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2266 +#: lib/Slic3r/GUI/Plater.pm:2307 msgid "Export object as STL…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2266 +#: lib/Slic3r/GUI/Plater.pm:2307 msgid "Export this single object as STL file" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2270 +#: lib/Slic3r/GUI/Plater.pm:2311 msgid "Fix STL through Netfabb" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2270 +#: lib/Slic3r/GUI/Plater.pm:2311 msgid "" "Fix the model by sending it to a Netfabb cloud service through Windows 10 API" msgstr "" diff --git a/resources/localization/uk/Slic3rPE.mo b/resources/localization/uk/Slic3rPE.mo index 7ced15dc8c91acee358022d27d2d1abdf88c2313..db63e8c8f02d6385fad4ea6b9e32f275ed0facd5 100644 GIT binary patch delta 16643 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 Md#PuN2DS743t%*CegFUf delta 18663 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

K0hhuweag+xKH<*o@g1zrM&VB54%zS!vJ#MD1 z&}DTbXk z-vcdK7*n~h17^lEsQr5ZGvN;yj6Y#Myk`y0Fwco%n3eo6)Z%*@HTU6|i~Bnxh~&me zm>1_;S78y-+psjA#G?2;4#S``<|8y2b>rihAJ1EFqMnrZQBT0UpP7c1Lfxk#`qiTb zMAX7(F$cE9Y#5H^u^Z0Bu}ED`wzKSOM(7ge!{5*G+$TQ^L)|b2 zm7ieK$*6{owN6G&>14%8z00JT^ypcdN=R1f|^HMHQ@Y&+(> zFb*Jn?i=&cdHS09Fd2$rlGn|XGxS^YR&0emwEtfrq8lB9R+5kE!R?c7Dxa}SGZ|7W}DIETsb zVR8H#o8jN6ZQ0~|bAyi9l=MJsgzGUFzd?=MkJuO=Vnb~BgXzd{)R50Y)%Ov?Seq#JJlp#czCZ`MPt@rdD{`^Wh=4Ufh1AZ}!GZ8hE(@+iGf@;_<>uKvvY)iiT ztJ$9IQ6n-2E8|Yo;=cMTZDk6zT@) zs44svwTScFHB(p8+5n#-{{^IoGx9FuuNKAqVTNWAmLa_c!|^z3s0!UPyQDOhCmn_w z`fm6v_Q!I#6jlB(YAt+>`7!&SJcJn8;#in;B*Uxg$M}ha5SfI9@GY!`o3R64#lcwh zzIhui!skhUjanNuADFjZGt`ZjU>L4PP3`Ac8jG+8t6>AIj!{?x{R@a_XpdlPyp6hX z-M>vmhF>V|r^sv$XX2A04QxB)fP$FLy&fW`3w1siny8kxK{aFqCgF6{i2aQNxxPS<>-|O?oyqn760#XT<@~o; z3DYvW-ly7S)Y{0E#pRvhr&UCB!!6ht4`T=wKEmdt3uSYiAF&%&z!t%-!xnd9Q9XQ# zpGRYGG`@tA#t*P9>E5|rZ>ZK{ z6Vk`9C1%RwdQ;Q}2a--fJs0j{M;x5j^|om`wjg~K-@vlGtG7`9Zft@v1zg9kq1aH+ z_5P;2%lb3EM1GY*W@N^pdOjD^aTivlf_R2W`+qUND77onurz*-t?*A&gBlkx_0O;# zLv`p;5!dhCxG`UtTAd?NL$wyQD9>44zBZJuj;gRHY7wrteuQ;N|AbAk9KUGQ^GMW? zuSe~&J*WnrMorP3P`{bOqQzaOJw0lI=Q%OGgjrlKmoyg)$71BafqDXNvH2HJyWk$` z20^9FA}fk|uCzt1{zU6kRQbiIHMh=BM2lz_szsMk7iKAKZdembk#2_?nHbbIdJEN% zomd91;7I%jKgW?ibA!%hOnnikhRj4w)e5YF{$oT`!5vh~@|Sg;7)GK5t{^?7oJl`b z-fWvWPnn)B!(h&*p@x1xcE?{(^|h;Drsx$^Pv_!z>RpKqNtfZ*N2MV4UmqeobDSwv zT<e4XQpHrSc`p@UWdi7l=7Ed%_`(fBKuG1RFG<2Qkf_OqUa-Bn@ zvo&FDs9aOm`!u`U%&e9BSf7gXHaA1w8nw!YqDE>9YVqyHGWa<*<^IlnBAUyFEsO)O zDd`#b0)B*=ni4Hd&nseW()Cdl$D%4sv@S#~#$Bkj^9iclkLbhSts$-0|JuLxiKu0r zP(z!5nzM1J=fGT4gRY?#O}XdH;tWSE#u)2lRDCN^+inl)o$(23ja);$V~R4YZLxoA z#=ilPx5?1Ze}#Icw`cs-!~VE~pxX;trgZw_>ezQt44_^@le(IrJ%VLOUqMaL zKd3cPx|{30=ZB#l&1g

XRH>bf*c#xJpszW-lh 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\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 2.0.8\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" "Language: uk\n" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:39 +#: xs/src/slic3r/GUI/AboutDialog.cpp:32 +msgid "About Slic3r" +msgstr "" + +#: xs/src/slic3r/GUI/AboutDialog.cpp:67 +msgid "Version" +msgstr "" + +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:39 msgid "Shape" msgstr "Вигляд (Форма)" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:46 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:46 msgid "Rectangular" msgstr "Прямокутний" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:50 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1191 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:408 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:50 xs/src/slic3r/GUI/Tab.cpp:1826 +#: lib/Slic3r/GUI/Plater.pm:498 msgid "Size" msgstr "Розмір" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:51 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:51 msgid "Size in X and Y of the rectangular plate." msgstr "Розмір прямокутної подложки за X та Y." -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:57 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:57 msgid "Origin" msgstr "Початок координат" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:58 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:58 msgid "" "Distance of the 0,0 G-code coordinate from the front left corner of the " "rectangle." msgstr "Відстань координат 0,0 G-коду від нижнього лівого кута прямокутника." -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:62 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:62 msgid "Circular" msgstr "Круговий" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:65 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:129 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:200 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:211 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:325 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:336 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:355 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:434 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:781 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:801 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:860 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:878 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:896 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1044 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1052 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1094 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1103 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1113 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1121 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1129 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1215 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1421 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1491 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1527 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1704 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1711 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1718 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1727 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1737 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1747 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:65 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:88 xs/src/slic3r/GUI/ConfigWizard.cpp:446 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:460 xs/src/slic3r/GUI/RammingChart.cpp:81 +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:79 +#: xs/src/libslic3r/PrintConfig.cpp:133 xs/src/libslic3r/PrintConfig.cpp:181 +#: xs/src/libslic3r/PrintConfig.cpp:189 xs/src/libslic3r/PrintConfig.cpp:237 +#: xs/src/libslic3r/PrintConfig.cpp:248 xs/src/libslic3r/PrintConfig.cpp:363 +#: xs/src/libslic3r/PrintConfig.cpp:374 xs/src/libslic3r/PrintConfig.cpp:393 +#: xs/src/libslic3r/PrintConfig.cpp:531 xs/src/libslic3r/PrintConfig.cpp:890 +#: xs/src/libslic3r/PrintConfig.cpp:1002 xs/src/libslic3r/PrintConfig.cpp:1010 +#: xs/src/libslic3r/PrintConfig.cpp:1068 xs/src/libslic3r/PrintConfig.cpp:1086 +#: xs/src/libslic3r/PrintConfig.cpp:1104 xs/src/libslic3r/PrintConfig.cpp:1166 +#: xs/src/libslic3r/PrintConfig.cpp:1176 xs/src/libslic3r/PrintConfig.cpp:1292 +#: xs/src/libslic3r/PrintConfig.cpp:1300 xs/src/libslic3r/PrintConfig.cpp:1342 +#: xs/src/libslic3r/PrintConfig.cpp:1351 xs/src/libslic3r/PrintConfig.cpp:1361 +#: xs/src/libslic3r/PrintConfig.cpp:1369 xs/src/libslic3r/PrintConfig.cpp:1377 +#: xs/src/libslic3r/PrintConfig.cpp:1463 xs/src/libslic3r/PrintConfig.cpp:1669 +#: xs/src/libslic3r/PrintConfig.cpp:1739 xs/src/libslic3r/PrintConfig.cpp:1773 +#: xs/src/libslic3r/PrintConfig.cpp:1969 xs/src/libslic3r/PrintConfig.cpp:1976 +#: xs/src/libslic3r/PrintConfig.cpp:1983 xs/src/libslic3r/PrintConfig.cpp:2015 +#: xs/src/libslic3r/PrintConfig.cpp:2025 xs/src/libslic3r/PrintConfig.cpp:2035 msgid "mm" msgstr "мм" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:66 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:431 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:66 xs/src/libslic3r/PrintConfig.cpp:528 msgid "Diameter" msgstr "Діаметр" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:67 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:67 msgid "" "Diameter of the print bed. It is assumed that origin (0,0) is located in the " "center." @@ -92,333 +89,830 @@ msgstr "" "Діаметр подложки. Передбачається, що початок координат (0,0) знаходиться в " "центрі." -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:71 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:150 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:92 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:71 +#: xs/src/libslic3r/GCode/PreviewData.cpp:175 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:102 msgid "Custom" msgstr "Користувацький" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:75 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:75 msgid "Load shape from STL..." msgstr "Завантажте форму з STL ..." -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:120 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:120 msgid "Settings" msgstr "Налаштування" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:298 +#: xs/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):" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:315 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:316 msgid "Error! " msgstr "Помилка! " -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:324 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:325 msgid "The selected file contains no geometry." msgstr "Обраний файл не містить геометрії." -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:328 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:329 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "Обраний файл містить декілька непересічних областей. Не підтримується." -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.hpp:42 +#: xs/src/slic3r/GUI/BedShapeDialog.hpp:44 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:409 msgid "Bed Shape" msgstr "Форма полотна" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:224 +#: xs/src/slic3r/GUI/BonjourDialog.cpp:53 +msgid "Network lookup" +msgstr "" + +#: xs/src/slic3r/GUI/BonjourDialog.cpp:66 +msgid "Address" +msgstr "" + +#: xs/src/slic3r/GUI/BonjourDialog.cpp:67 +msgid "Hostname" +msgstr "" + +#: xs/src/slic3r/GUI/BonjourDialog.cpp:68 +msgid "Service name" +msgstr "" + +#: xs/src/slic3r/GUI/BonjourDialog.cpp:69 +msgid "OctoPrint version" +msgstr "" + +#: xs/src/slic3r/GUI/BonjourDialog.cpp:187 +msgid "Searching for devices" +msgstr "" + +#: xs/src/slic3r/GUI/BonjourDialog.cpp:194 +msgid "Finished" +msgstr "" + +#: xs/src/slic3r/GUI/ButtonsDescription.cpp:13 +msgid "Buttons And Text Colors Description" +msgstr "" + +#: xs/src/slic3r/GUI/ButtonsDescription.cpp:38 +msgid "Value is the same as the system value" +msgstr "" + +#: xs/src/slic3r/GUI/ButtonsDescription.cpp:55 +msgid "" +"Value was changed and is not equal to the system value or the last saved " +"preset" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:15 +msgid "Upgrade" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:17 +msgid "Downgrade" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +msgid "Before roll back" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +msgid "User" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 +msgid "Unknown" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:36 +msgid "Active: " +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:42 +msgid "slic3r version" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:43 +msgid "print" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:44 +msgid "filaments" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 +msgid "printer" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:49 xs/src/slic3r/GUI/Tab.cpp:730 +msgid "vendor" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:49 +msgid "version" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:50 +msgid "min slic3r version" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +msgid "max slic3r version" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 +msgid "model" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 +msgid "variants" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 +msgid "Incompatible with this Slic3r" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 +msgid "Activate" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 xs/src/slic3r/GUI/GUI.cpp:349 +msgid "Configuration Snapshots" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:88 +msgid "nozzle" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:89 +msgid "(default)" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:108 +msgid "Select all" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:109 +msgid "Select none" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:218 +#, c-format +msgid "Welcome to the Slic3r %s" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:218 +msgid "Welcome" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:224 xs/src/slic3r/GUI/GUI.cpp:346 +#, c-format +msgid "Run %s" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:226 +#, 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." +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:230 +msgid "" +"Remove user profiles - install from scratch (a snapshot will be taken " +"beforehand)" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:252 +msgid "Other vendors" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:254 +msgid "Custom setup" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:278 +msgid "Automatic updates" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:278 +msgid "Updates" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:286 xs/src/slic3r/GUI/Preferences.cpp:59 +msgid "Check for application updates" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:289 xs/src/slic3r/GUI/Preferences.cpp:61 +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 " +"application startup (never during program usage). This is only a " +"notification mechanisms, no automatic installation is done." +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:293 xs/src/slic3r/GUI/Preferences.cpp:67 +msgid "Update built-in Presets automatically" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:296 xs/src/slic3r/GUI/Preferences.cpp:69 +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 "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:297 +msgid "" +"Updates are never applied without user's consent and never overwrite user's " +"customized settings." +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:302 +msgid "" +"Additionally a backup snapshot of the whole configuration is created before " +"an update is applied." +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:309 +msgid "Other Vendors" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:311 +msgid "Pick another vendor supported by Slic3r PE:" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:370 +msgid "Firmware Type" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:370 xs/src/slic3r/GUI/Tab.cpp:1606 +msgid "Firmware" +msgstr "Прошивка" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:374 +msgid "Choose the type of firmware used by your printer." +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:409 +msgid "Bed Shape and Size" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:412 +msgid "Set the shape of your printer's bed." +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:426 +msgid "Filament and Nozzle Diameters" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:426 +msgid "Print Diameters" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:442 +msgid "Enter the diameter of your printer's hot end nozzle." +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:445 +msgid "Nozzle Diameter:" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:455 +msgid "Enter the diameter of your filament." +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:456 +msgid "" +"Good precision is required, so use a caliper and do multiple measurements " +"along the filament, then compute the average." +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:459 +msgid "Filament Diameter:" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:477 +msgid "Extruder and Bed Temperatures" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:477 +msgid "Temperatures" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:493 +msgid "Enter the temperature needed for extruding your filament." +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:494 +msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:497 +msgid "Extrusion Temperature:" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:498 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:512 +msgid "°C" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:507 +msgid "" +"Enter the bed temperature needed for getting your filament to stick to your " +"heated bed." +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:508 +msgid "" +"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " +"no heated bed." +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:511 +msgid "Bed Temperature:" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:824 +msgid "< &Back" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:825 +msgid "&Next >" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:826 +msgid "&Finish" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:896 +msgid "Configuration Wizard" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:898 +msgid "Configuration Assistant" +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:87 +msgid "Flash!" +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:88 +msgid "Cancel" +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:128 +msgid "Flashing in progress. Please do not disconnect the printer!" +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:155 +msgid "Flashing succeeded!" +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:156 +msgid "Flashing failed. Please see the avrdude log below." +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:157 +msgid "Flashing cancelled." +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:294 +msgid "Cancelling..." +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:347 +msgid "Firmware flasher" +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:367 +msgid "Serial port:" +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:369 +msgid "Rescan" +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:374 +msgid "Firmware image:" +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:377 +msgid "Status:" +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:378 +msgid "Ready" +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:381 +msgid "Progress:" +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:400 +msgid "Advanced: avrdude output log" +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:446 +msgid "" +"Are you sure you want to cancel firmware flashing?\n" +"This could leave your printer in an unusable state!" +msgstr "" + +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:447 +msgid "Confirmation" +msgstr "" + +#: xs/src/slic3r/GUI/GLCanvas3D.cpp:2308 +msgid "Detected object outside print volume" +msgstr "" + +#: xs/src/slic3r/GUI/GUI.cpp:233 msgid "Array of language names and identifiers should have the same size." msgstr "Масив імен мов та їх ідентифікаторів має бути однакового розміру." -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:235 +#: xs/src/slic3r/GUI/GUI.cpp:244 msgid "Select the language" msgstr "Оберіть мову" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:235 +#: xs/src/slic3r/GUI/GUI.cpp:244 msgid "Language" msgstr "Мова" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:300 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:170 +#: xs/src/slic3r/GUI/GUI.cpp:306 xs/src/libslic3r/PrintConfig.cpp:195 msgid "Default" msgstr "За замовчуванням" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:325 +#: xs/src/slic3r/GUI/GUI.cpp:349 +msgid "Inspect / activate configuration snapshots" +msgstr "" + +#: xs/src/slic3r/GUI/GUI.cpp:350 +msgid "Take Configuration Snapshot" +msgstr "" + +#: xs/src/slic3r/GUI/GUI.cpp:350 +msgid "Capture a configuration snapshot" +msgstr "" + +#: xs/src/slic3r/GUI/GUI.cpp:353 xs/src/slic3r/GUI/Preferences.cpp:9 +msgid "Preferences" +msgstr "Налаштування" + +#: xs/src/slic3r/GUI/GUI.cpp:353 +msgid "Application preferences" +msgstr "Преференції застосування" + +#: xs/src/slic3r/GUI/GUI.cpp:354 msgid "Change Application Language" msgstr "Змінити мову застосування" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:332 +#: xs/src/slic3r/GUI/GUI.cpp:356 +msgid "Flash printer firmware" +msgstr "" + +#: xs/src/slic3r/GUI/GUI.cpp:356 +msgid "Upload a firmware image into an Arduino based printer" +msgstr "" + +#: xs/src/slic3r/GUI/GUI.cpp:368 +msgid "Taking configuration snapshot" +msgstr "" + +#: xs/src/slic3r/GUI/GUI.cpp:368 +msgid "Snapshot name" +msgstr "" + +#: xs/src/slic3r/GUI/GUI.cpp:406 msgid "Application will be restarted" msgstr "Застосування буде перезапущене" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:332 +#: xs/src/slic3r/GUI/GUI.cpp:406 msgid "Attention!" msgstr "Увага!" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:339 -msgid "&Localization" -msgstr "Локалізація" +#: xs/src/slic3r/GUI/GUI.cpp:422 +msgid "&Configuration" +msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:488 -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:470 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1300 -msgid "Error" -msgstr "Помилка" +#: xs/src/slic3r/GUI/GUI.cpp:446 +msgid "You have unsaved changes " +msgstr "У вас є незбережені зміни " -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:493 +#: xs/src/slic3r/GUI/GUI.cpp:446 +msgid ". Discard changes and continue anyway?" +msgstr ". Відхилити зміни і продовжити в будь-якому випадку?" + +#: xs/src/slic3r/GUI/GUI.cpp:447 +msgid "Unsaved Presets" +msgstr "Незбереженні налаштування" + +#: xs/src/slic3r/GUI/GUI.cpp:655 msgid "Notice" msgstr "Зауваження" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:498 -msgid "GLUquadricObjPtr | Attempt to free unreferenced scalar" +#: xs/src/slic3r/GUI/GUI.cpp:660 +msgid "Attempt to free unreferenced scalar" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:500 +#: xs/src/slic3r/GUI/GUI.cpp:662 xs/src/slic3r/GUI/WipeTowerDialog.cpp:39 +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:321 msgid "Warning" msgstr "Застереження" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:50 -msgid "Save current " -msgstr "Зберегти поточний " +#: xs/src/slic3r/GUI/GUI.cpp:859 +msgid "Support" +msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:51 -msgid "Delete this preset" -msgstr "Видалити це налаштування" +#: xs/src/slic3r/GUI/GUI.cpp:862 +msgid "Select what kind of support do you need" +msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:313 -msgid "Layers and perimeters" -msgstr "Шари та периметри" +#: xs/src/slic3r/GUI/GUI.cpp:863 xs/src/libslic3r/GCode/PreviewData.cpp:162 +msgid "None" +msgstr "Жодне" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:314 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:777 -msgid "Layer height" -msgstr "Висота шару" +#: xs/src/slic3r/GUI/GUI.cpp:864 xs/src/libslic3r/PrintConfig.cpp:1656 +msgid "Support on build plate only" +msgstr "Підтримка тільки на збірній пластині" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:318 -msgid "Vertical shells" -msgstr "Вертикальні оболонки" +#: xs/src/slic3r/GUI/GUI.cpp:865 +msgid "Everywhere" +msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:329 -msgid "Horizontal shells" -msgstr "Горизонтальні оболонки" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:330 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1314 -msgid "Solid layers" -msgstr "Суцільні шари" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:335 -msgid "Quality (slower slicing)" -msgstr "Якість (повільне нарізання)" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:342 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:356 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:449 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:452 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:831 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1113 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:107 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:208 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:736 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1733 -msgid "Advanced" -msgstr "Розширений" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:346 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:347 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:664 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:87 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:247 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:488 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:502 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:540 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:681 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:691 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:709 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:727 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:746 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1263 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1280 -msgid "Infill" -msgstr "Заповнення" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:352 -msgid "Reducing printing time" -msgstr "Зниження часу друку" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:364 -msgid "Skirt and brim" -msgstr "Плінтус та край" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:365 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:146 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:88 -msgid "Skirt" -msgstr "Плінтус" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:371 +#: xs/src/slic3r/GUI/GUI.cpp:877 xs/src/slic3r/GUI/Tab.cpp:844 msgid "Brim" msgstr "Край" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:374 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:375 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:191 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1030 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1380 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1387 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1399 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1409 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1417 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1432 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1453 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1464 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1480 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1489 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1498 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1509 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1525 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1533 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1534 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1543 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1551 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1565 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:147 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:89 +#: xs/src/slic3r/GUI/GUI.cpp:879 +msgid "" +"This flag enables the brim that will be printed around each object on the " +"first layer." +msgstr "" + +#: xs/src/slic3r/GUI/GUI.cpp:888 +msgid "Purging volumes" +msgstr "" + +#: xs/src/slic3r/GUI/GUI.cpp:930 +msgid "Export print config" +msgstr "" + +#: xs/src/slic3r/GUI/MsgDialog.cpp:64 +msgid "Slic3r error" +msgstr "" + +#: xs/src/slic3r/GUI/MsgDialog.cpp:64 +msgid "Slic3r has encountered an error" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:84 +msgid "Save current " +msgstr "Зберегти поточний " + +#: xs/src/slic3r/GUI/Tab.cpp:85 +msgid "Delete this preset" +msgstr "Видалити це налаштування" + +#: xs/src/slic3r/GUI/Tab.cpp:97 +msgid "" +"Hover the cursor over buttons to find more information \n" +"or click this button." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:716 +msgid "It's a default preset." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:717 +msgid "It's a system preset." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:718 +msgid "Current preset is inherited from " +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:723 +msgid "It can't be deleted or modified. " +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:724 +msgid "" +"Any modifications should be saved as a new preset inherited from this one. " +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:725 +msgid "To do that please specify a new name for the preset." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:729 +msgid "Additional information:" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:737 +msgid "printer model" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:739 +msgid "default print profile" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:742 +msgid "default filament profile" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:786 +msgid "Layers and perimeters" +msgstr "Шари та периметри" + +#: xs/src/slic3r/GUI/Tab.cpp:787 xs/src/libslic3r/PrintConfig.cpp:886 +msgid "Layer height" +msgstr "Висота шару" + +#: xs/src/slic3r/GUI/Tab.cpp:791 +msgid "Vertical shells" +msgstr "Вертикальні оболонки" + +#: xs/src/slic3r/GUI/Tab.cpp:802 +msgid "Horizontal shells" +msgstr "Горизонтальні оболонки" + +#: xs/src/slic3r/GUI/Tab.cpp:803 xs/src/libslic3r/PrintConfig.cpp:1562 +msgid "Solid layers" +msgstr "Суцільні шари" + +#: xs/src/slic3r/GUI/Tab.cpp:808 +msgid "Quality (slower slicing)" +msgstr "Якість (повільне нарізання)" + +#: xs/src/slic3r/GUI/Tab.cpp:815 xs/src/slic3r/GUI/Tab.cpp:829 +#: xs/src/slic3r/GUI/Tab.cpp:923 xs/src/slic3r/GUI/Tab.cpp:926 +#: xs/src/slic3r/GUI/Tab.cpp:1276 xs/src/slic3r/GUI/Tab.cpp:1625 +#: xs/src/libslic3r/PrintConfig.cpp:110 xs/src/libslic3r/PrintConfig.cpp:245 +#: xs/src/libslic3r/PrintConfig.cpp:833 xs/src/libslic3r/PrintConfig.cpp:2021 +msgid "Advanced" +msgstr "Розширений" + +#: xs/src/slic3r/GUI/Tab.cpp:819 xs/src/slic3r/GUI/Tab.cpp:820 +#: xs/src/slic3r/GUI/Tab.cpp:1127 xs/src/libslic3r/PrintConfig.cpp:90 +#: xs/src/libslic3r/PrintConfig.cpp:284 xs/src/libslic3r/PrintConfig.cpp:585 +#: xs/src/libslic3r/PrintConfig.cpp:599 xs/src/libslic3r/PrintConfig.cpp:637 +#: xs/src/libslic3r/PrintConfig.cpp:778 xs/src/libslic3r/PrintConfig.cpp:788 +#: xs/src/libslic3r/PrintConfig.cpp:806 xs/src/libslic3r/PrintConfig.cpp:824 +#: xs/src/libslic3r/PrintConfig.cpp:843 xs/src/libslic3r/PrintConfig.cpp:1511 +#: xs/src/libslic3r/PrintConfig.cpp:1528 +msgid "Infill" +msgstr "Заповнення" + +#: xs/src/slic3r/GUI/Tab.cpp:825 +msgid "Reducing printing time" +msgstr "Зниження часу друку" + +#: xs/src/slic3r/GUI/Tab.cpp:837 +msgid "Skirt and brim" +msgstr "Плінтус та край" + +#: xs/src/slic3r/GUI/Tab.cpp:838 xs/src/libslic3r/GCode/PreviewData.cpp:171 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:98 +msgid "Skirt" +msgstr "Плінтус" + +#: xs/src/slic3r/GUI/Tab.cpp:847 xs/src/slic3r/GUI/Tab.cpp:848 +#: xs/src/libslic3r/PrintConfig.cpp:228 xs/src/libslic3r/PrintConfig.cpp:1278 +#: xs/src/libslic3r/PrintConfig.cpp:1628 xs/src/libslic3r/PrintConfig.cpp:1635 +#: xs/src/libslic3r/PrintConfig.cpp:1647 xs/src/libslic3r/PrintConfig.cpp:1657 +#: xs/src/libslic3r/PrintConfig.cpp:1665 xs/src/libslic3r/PrintConfig.cpp:1680 +#: xs/src/libslic3r/PrintConfig.cpp:1701 xs/src/libslic3r/PrintConfig.cpp:1712 +#: xs/src/libslic3r/PrintConfig.cpp:1728 xs/src/libslic3r/PrintConfig.cpp:1737 +#: xs/src/libslic3r/PrintConfig.cpp:1746 xs/src/libslic3r/PrintConfig.cpp:1757 +#: xs/src/libslic3r/PrintConfig.cpp:1771 xs/src/libslic3r/PrintConfig.cpp:1779 +#: xs/src/libslic3r/PrintConfig.cpp:1780 xs/src/libslic3r/PrintConfig.cpp:1789 +#: xs/src/libslic3r/PrintConfig.cpp:1797 xs/src/libslic3r/PrintConfig.cpp:1811 +#: xs/src/libslic3r/GCode/PreviewData.cpp:172 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:99 msgid "Support material" msgstr "Підтримка" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:380 +#: xs/src/slic3r/GUI/Tab.cpp:853 msgid "Raft" msgstr "Пліт" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:384 +#: xs/src/slic3r/GUI/Tab.cpp:857 msgid "Options for support material and raft" msgstr "Варіанти для опорного матеріалу та плоту" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:398 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:118 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:278 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:635 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:747 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:979 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1201 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1251 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1302 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1625 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:71 +#: xs/src/slic3r/GUI/Tab.cpp:871 xs/src/libslic3r/PrintConfig.cpp:122 +#: xs/src/libslic3r/PrintConfig.cpp:315 xs/src/libslic3r/PrintConfig.cpp:732 +#: xs/src/libslic3r/PrintConfig.cpp:844 xs/src/libslic3r/PrintConfig.cpp:1212 +#: xs/src/libslic3r/PrintConfig.cpp:1449 xs/src/libslic3r/PrintConfig.cpp:1499 +#: xs/src/libslic3r/PrintConfig.cpp:1550 xs/src/libslic3r/PrintConfig.cpp:1871 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:77 msgid "Speed" msgstr "Швидкість" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:399 +#: xs/src/slic3r/GUI/Tab.cpp:872 msgid "Speed for print moves" msgstr "Швидкість друкарських рухів" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:411 +#: xs/src/slic3r/GUI/Tab.cpp:884 msgid "Speed for non-print moves" msgstr "Швидкість недрукарських рухів" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:414 +#: xs/src/slic3r/GUI/Tab.cpp:887 msgid "Modifiers" msgstr "Модифікатори" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:417 +#: xs/src/slic3r/GUI/Tab.cpp:890 msgid "Acceleration control (advanced)" msgstr "Контроль прискорення (розширений)" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:424 +#: xs/src/slic3r/GUI/Tab.cpp:897 msgid "Autospeed (advanced)" msgstr "Автоматична швидкість (розширена)" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:430 +#: xs/src/slic3r/GUI/Tab.cpp:903 msgid "Multiple Extruders" msgstr "Кілька екструдерів" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:431 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:966 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:308 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:702 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:958 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1272 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1445 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1471 +#: xs/src/slic3r/GUI/Tab.cpp:904 xs/src/slic3r/GUI/Tab.cpp:1451 +#: xs/src/libslic3r/PrintConfig.cpp:345 xs/src/libslic3r/PrintConfig.cpp:799 +#: xs/src/libslic3r/PrintConfig.cpp:1191 xs/src/libslic3r/PrintConfig.cpp:1520 +#: xs/src/libslic3r/PrintConfig.cpp:1693 xs/src/libslic3r/PrintConfig.cpp:1719 +#: xs/src/libslic3r/PrintConfig.cpp:1995 xs/src/libslic3r/PrintConfig.cpp:2004 msgid "Extruders" msgstr "Екструдери" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:438 +#: xs/src/slic3r/GUI/Tab.cpp:911 msgid "Ooze prevention" msgstr "Профілактика просочування" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:442 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:149 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:91 +#: xs/src/slic3r/GUI/Tab.cpp:915 xs/src/libslic3r/GCode/PreviewData.cpp:174 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:101 msgid "Wipe tower" msgstr "Вежа вичищування" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:453 +#: xs/src/slic3r/GUI/Tab.cpp:927 msgid "Extrusion width" msgstr "Ширина екструзії" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:463 +#: xs/src/slic3r/GUI/Tab.cpp:937 msgid "Overlap" msgstr "Перекриття" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:466 +#: xs/src/slic3r/GUI/Tab.cpp:940 msgid "Flow" msgstr "Потік" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:469 +#: xs/src/slic3r/GUI/Tab.cpp:943 msgid "Other" msgstr "Інше" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:476 +#: xs/src/slic3r/GUI/Tab.cpp:950 msgid "Output options" msgstr "Параметри виводу" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:477 +#: xs/src/slic3r/GUI/Tab.cpp:951 msgid "Sequential printing" msgstr "Послідовне друкування" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:479 +#: xs/src/slic3r/GUI/Tab.cpp:953 msgid "Extruder clearance (mm)" msgstr "Розмір екструдера (мм)" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:488 +#: xs/src/slic3r/GUI/Tab.cpp:962 msgid "Output file" msgstr "Вихідний файл" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:494 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1001 +#: xs/src/slic3r/GUI/Tab.cpp:968 xs/src/libslic3r/PrintConfig.cpp:1234 msgid "Post-processing scripts" msgstr "Скрипти пост-обробки" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:500 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:501 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:859 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:860 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1156 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1157 +#: xs/src/slic3r/GUI/Tab.cpp:974 xs/src/slic3r/GUI/Tab.cpp:975 +#: xs/src/slic3r/GUI/Tab.cpp:1329 xs/src/slic3r/GUI/Tab.cpp:1330 +#: xs/src/slic3r/GUI/Tab.cpp:1668 xs/src/slic3r/GUI/Tab.cpp:1669 msgid "Notes" msgstr "Примітки" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:507 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:867 +#: xs/src/slic3r/GUI/Tab.cpp:981 xs/src/slic3r/GUI/Tab.cpp:1337 +#: xs/src/slic3r/GUI/Tab.cpp:1675 msgid "Dependencies" msgstr "Залежності" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:508 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:868 +#: xs/src/slic3r/GUI/Tab.cpp:982 xs/src/slic3r/GUI/Tab.cpp:1338 +#: xs/src/slic3r/GUI/Tab.cpp:1676 msgid "Profile dependencies" msgstr "Залежності профілю" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:509 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:869 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1668 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:143 +#: xs/src/slic3r/GUI/Tab.cpp:983 xs/src/slic3r/GUI/Tab.cpp:1339 +#: xs/src/slic3r/GUI/Tab.cpp:2364 xs/src/libslic3r/PrintConfig.cpp:147 msgid "Compatible printers" msgstr "Сумісні принтери" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:533 +#: xs/src/slic3r/GUI/Tab.cpp:1016 #, no-c-format msgid "" "The Spiral Vase mode requires:\n" @@ -439,31 +933,11 @@ msgstr "" "\n" "Чи потрібно змінити ці налаштування, щоб увімкнути режим Спіральної вази?" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:540 +#: xs/src/slic3r/GUI/Tab.cpp:1023 msgid "Spiral Vase" msgstr "Спіральна ваза" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:560 -msgid "" -"The Wipe Tower currently supports only:\n" -"- first layer height 0.2mm\n" -"- layer height from 0.15mm to 0.35mm\n" -"\n" -"Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "" -"Вичіщуюча веж в даний час підтримує тільки:\n" -"- висота першого шару 0,2 мм\n" -"- висота шару від 0,15 мм до 0,35 мм\n" -"\n" -"Чи потрібно коригувати ці налаштування, щоб увімкнути вичіщуючу веж?" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:564 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:585 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:602 -msgid "Wipe Tower" -msgstr "Вичіщуюча веж" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:581 +#: xs/src/slic3r/GUI/Tab.cpp:1044 msgid "" "The Wipe Tower currently supports the non-soluble supports only\n" "if they are printed with the current extruder without triggering a tool " @@ -481,7 +955,11 @@ msgstr "" "\n" "Чи потрібно коригувати ці налаштування, щоб увімкнути вичіщуючу веж?" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:599 +#: xs/src/slic3r/GUI/Tab.cpp:1048 xs/src/slic3r/GUI/Tab.cpp:1065 +msgid "Wipe Tower" +msgstr "Вичіщуюча веж" + +#: xs/src/slic3r/GUI/Tab.cpp:1062 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers\n" "need to be synchronized with the object layers.\n" @@ -494,7 +972,7 @@ msgstr "" "\n" "Чи потрібно синхронізувати шари підтримки, щоб увімкнути вичіщуючу веж?" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:617 +#: xs/src/slic3r/GUI/Tab.cpp:1080 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters\n" @@ -506,15 +984,15 @@ msgstr "" "\n" "Чи потрібно змінити ці налаштування для підтримки?" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:620 +#: xs/src/slic3r/GUI/Tab.cpp:1083 msgid "Support Generator" msgstr "Створення підтримки" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:662 +#: xs/src/slic3r/GUI/Tab.cpp:1125 msgid "The " msgstr "Шаблон наповнення " -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:662 +#: xs/src/slic3r/GUI/Tab.cpp:1125 #, no-c-format msgid "" " infill pattern is not supposed to work at 100% density.\n" @@ -525,186 +1003,251 @@ msgstr "" "\n" "Чи потрібно змінити його на Rectilinear шаблон заповнення?" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:786 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:787 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:368 +#: xs/src/slic3r/GUI/Tab.cpp:1231 xs/src/slic3r/GUI/Tab.cpp:1232 +#: lib/Slic3r/GUI/Plater.pm:454 msgid "Filament" msgstr "Філамент" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:794 +#: xs/src/slic3r/GUI/Tab.cpp:1239 msgid "Temperature " msgstr "Температура " -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:795 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1234 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:307 +#: xs/src/slic3r/GUI/Tab.cpp:1240 xs/src/libslic3r/PrintConfig.cpp:344 msgid "Extruder" msgstr "Екструдер" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:800 +#: xs/src/slic3r/GUI/Tab.cpp:1245 msgid "Bed" msgstr "Полотно" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:805 +#: xs/src/slic3r/GUI/Tab.cpp:1250 msgid "Cooling" msgstr "Охолодження" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:806 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:922 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1695 +#: xs/src/slic3r/GUI/Tab.cpp:1251 xs/src/libslic3r/PrintConfig.cpp:1137 +#: xs/src/libslic3r/PrintConfig.cpp:1941 msgid "Enable" msgstr "Увімкнути" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:817 +#: xs/src/slic3r/GUI/Tab.cpp:1262 msgid "Fan settings" msgstr "Налаштування вентилятора" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:818 +#: xs/src/slic3r/GUI/Tab.cpp:1263 msgid "Fan speed" msgstr "Швидкість вентилятора" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:826 +#: xs/src/slic3r/GUI/Tab.cpp:1271 msgid "Cooling thresholds" msgstr "Пороги охолодження" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:832 +#: xs/src/slic3r/GUI/Tab.cpp:1277 msgid "Filament properties" msgstr "Властивості філаменту" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:836 +#: xs/src/slic3r/GUI/Tab.cpp:1281 msgid "Print speed override" msgstr "Перевизначення швидкості друку" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:846 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1119 +#: xs/src/slic3r/GUI/Tab.cpp:1291 +msgid "Toolchange parameters with single extruder MM printers" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1299 +msgid "Ramming" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1301 +msgid "Ramming settings" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1316 xs/src/slic3r/GUI/Tab.cpp:1631 msgid "Custom G-code" msgstr "Користувацький G-код" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:847 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1120 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1342 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1357 +#: xs/src/slic3r/GUI/Tab.cpp:1317 xs/src/slic3r/GUI/Tab.cpp:1632 +#: xs/src/libslic3r/PrintConfig.cpp:1590 xs/src/libslic3r/PrintConfig.cpp:1605 msgid "Start G-code" msgstr "Початок G-коду" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:853 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1126 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:217 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:227 +#: xs/src/slic3r/GUI/Tab.cpp:1323 xs/src/slic3r/GUI/Tab.cpp:1638 +#: xs/src/libslic3r/PrintConfig.cpp:254 xs/src/libslic3r/PrintConfig.cpp:264 msgid "End G-code" msgstr "Закінчення G-коду" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:937 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:11 +#: xs/src/slic3r/GUI/Tab.cpp:1419 xs/src/slic3r/GUI/Preferences.cpp:17 msgid "General" msgstr "Загальне" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:938 +#: xs/src/slic3r/GUI/Tab.cpp:1420 msgid "Size and coordinates" msgstr "Розмір і координати" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:940 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:34 +#: xs/src/slic3r/GUI/Tab.cpp:1422 xs/src/libslic3r/PrintConfig.cpp:37 msgid "Bed shape" msgstr "Форма полотна" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:942 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1637 +#: xs/src/slic3r/GUI/Tab.cpp:1424 xs/src/slic3r/GUI/Tab.cpp:2332 msgid " Set " msgstr " Встановити " -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:962 +#: xs/src/slic3r/GUI/Tab.cpp:1447 msgid "Capabilities" msgstr "Можливості" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:967 +#: xs/src/slic3r/GUI/Tab.cpp:1452 msgid "Number of extruders of the printer." msgstr "Кількість екструдерів у принтері." -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:989 +#: xs/src/slic3r/GUI/Tab.cpp:1477 msgid "USB/Serial connection" msgstr "USB/послідовне з'єднання" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:990 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1193 +#: xs/src/slic3r/GUI/Tab.cpp:1478 xs/src/libslic3r/PrintConfig.cpp:1441 msgid "Serial port" msgstr "Послідовний порт" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:995 +#: xs/src/slic3r/GUI/Tab.cpp:1483 msgid "Rescan serial ports" msgstr "Сканувати ще раз послідовні порти" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1004 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1072 +#: xs/src/slic3r/GUI/Tab.cpp:1492 xs/src/slic3r/GUI/Tab.cpp:1539 msgid "Test" msgstr "Перевірити" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1017 +#: xs/src/slic3r/GUI/Tab.cpp:1505 msgid "Connection to printer works correctly." msgstr "Підключення до принтера працює коректно." -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1017 +#: xs/src/slic3r/GUI/Tab.cpp:1505 xs/src/slic3r/GUI/Tab.cpp:1549 msgid "Success!" msgstr "Успіх!" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1020 +#: xs/src/slic3r/GUI/Tab.cpp:1508 msgid "Connection failed." msgstr "Підключення не вдалося." -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1032 +#: xs/src/slic3r/GUI/Tab.cpp:1520 xs/src/slic3r/Utils/OctoPrint.cpp:110 msgid "OctoPrint upload" msgstr "Завантаження OctoPrint" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1035 +#: xs/src/slic3r/GUI/Tab.cpp:1523 xs/src/slic3r/GUI/Tab.cpp:1572 msgid " Browse " msgstr " Переглянути " -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1110 -msgid "Firmware" -msgstr "Прошивка" +#: xs/src/slic3r/GUI/Tab.cpp:1549 +msgid "Connection to OctoPrint works correctly." +msgstr "Підключення до OctoPrint працює правильно." -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1132 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:48 +#: xs/src/slic3r/GUI/Tab.cpp:1552 +msgid "Could not connect to OctoPrint" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1552 +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1578 +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1579 +msgid "Open CA certificate file" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1593 +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1644 xs/src/libslic3r/PrintConfig.cpp:51 msgid "Before layer change G-code" msgstr "G-код перед зміною шару" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1138 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:766 +#: xs/src/slic3r/GUI/Tab.cpp:1650 xs/src/libslic3r/PrintConfig.cpp:875 msgid "After layer change G-code" msgstr "G-код після зміни шару" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1144 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1602 +#: xs/src/slic3r/GUI/Tab.cpp:1656 xs/src/libslic3r/PrintConfig.cpp:1848 msgid "Tool change G-code" msgstr "G-код зміни інструменту" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1150 +#: xs/src/slic3r/GUI/Tab.cpp:1662 msgid "Between objects G-code (for sequential printing)" msgstr "G-код між об'єктами (для послідовного друку)" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1187 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:400 +#: xs/src/slic3r/GUI/Tab.cpp:1717 xs/src/slic3r/GUI/Tab.cpp:1778 +#: xs/src/slic3r/GUI/Tab.cpp:2037 xs/src/libslic3r/PrintConfig.cpp:920 +#: xs/src/libslic3r/PrintConfig.cpp:929 xs/src/libslic3r/PrintConfig.cpp:938 +#: xs/src/libslic3r/PrintConfig.cpp:950 xs/src/libslic3r/PrintConfig.cpp:960 +#: xs/src/libslic3r/PrintConfig.cpp:970 xs/src/libslic3r/PrintConfig.cpp:980 +msgid "Machine limits" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1730 +msgid "Values in this column are for Full Power mode" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1731 +msgid "Full Power" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1736 +msgid "Values in this column are for Silent mode" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1737 +msgid "Silent" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1745 +msgid "Maximum feedrates" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1750 +msgid "Maximum accelerations" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1757 +msgid "Jerk limits" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1762 +msgid "Minimum feedrates" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1800 xs/src/slic3r/GUI/Tab.cpp:1808 +#: xs/src/slic3r/GUI/Tab.cpp:2037 +msgid "Single extruder MM setup" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1809 +msgid "Single extruder multimaterial parameters" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1822 xs/src/libslic3r/GCode/PreviewData.cpp:446 #, c-format msgid "Extruder %d" msgstr "Екструдер %d" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1194 +#: xs/src/slic3r/GUI/Tab.cpp:1829 msgid "Layer height limits" msgstr "Межі висоти шару" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1199 +#: xs/src/slic3r/GUI/Tab.cpp:1834 msgid "Position (for multi-extruder printers)" msgstr "Позиція (для мульти-екструдерних принтерів)" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1202 +#: xs/src/slic3r/GUI/Tab.cpp:1837 msgid "Retraction" msgstr "Переривання" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1205 +#: xs/src/slic3r/GUI/Tab.cpp:1840 msgid "Only lift Z" msgstr "Межі підняття Z" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1218 +#: xs/src/slic3r/GUI/Tab.cpp:1853 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -712,13 +1255,12 @@ msgstr "" "Переривання при відключенні інструмента (додаткові налаштування для " "налагодження мульти-екструдерів)" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1222 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:150 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2125 +#: xs/src/slic3r/GUI/Tab.cpp:1857 lib/Slic3r/GUI/Plater.pm:217 +#: lib/Slic3r/GUI/Plater.pm:2324 msgid "Preview" msgstr "Попередній перегляд" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1312 +#: xs/src/slic3r/GUI/Tab.cpp:1953 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -729,23 +1271,23 @@ msgstr "" "\n" "Відключити його для увімкнення програмного переривання?" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1314 +#: xs/src/slic3r/GUI/Tab.cpp:1955 msgid "Firmware Retraction" msgstr "Програмне переривання" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1469 +#: xs/src/slic3r/GUI/Tab.cpp:2130 msgid "Default " msgstr "За замовчуванням " -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1469 +#: xs/src/slic3r/GUI/Tab.cpp:2130 msgid " preset" msgstr " налаштування" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1470 +#: xs/src/slic3r/GUI/Tab.cpp:2131 msgid " preset\n" msgstr " налаштування\n" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1488 +#: xs/src/slic3r/GUI/Tab.cpp:2149 msgid "" "\n" "\n" @@ -755,7 +1297,7 @@ msgstr "" "\n" "є не сумісним з принтером\n" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1488 +#: xs/src/slic3r/GUI/Tab.cpp:2149 msgid "" "\n" "\n" @@ -765,7 +1307,7 @@ msgstr "" "\n" "і має такі незбережені зміни:" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1489 +#: xs/src/slic3r/GUI/Tab.cpp:2150 msgid "" "\n" "\n" @@ -775,7 +1317,7 @@ msgstr "" "\n" "має такі незбережені зміни:" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1491 +#: xs/src/slic3r/GUI/Tab.cpp:2152 msgid "" "\n" "\n" @@ -785,93 +1327,219 @@ msgstr "" "\n" "Відхилити зміни і продовжувати в будь-якому випадку?" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1492 +#: xs/src/slic3r/GUI/Tab.cpp:2153 msgid "Unsaved Changes" msgstr "Незбережені зміни" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1560 +#: xs/src/slic3r/GUI/Tab.cpp:2240 msgid "The supplied name is empty. It can't be saved." msgstr "Надане ім'я порожнє. Не вдається зберегти." -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1580 +#: xs/src/slic3r/GUI/Tab.cpp:2245 +msgid "Cannot overwrite a system profile." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2249 +msgid "Cannot overwrite an external profile." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2275 msgid "remove" msgstr "перемістити" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1580 +#: xs/src/slic3r/GUI/Tab.cpp:2275 msgid "delete" msgstr "видалити" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1581 +#: xs/src/slic3r/GUI/Tab.cpp:2276 msgid "Are you sure you want to " msgstr "Ви впевнені, що хочете " -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1581 +#: xs/src/slic3r/GUI/Tab.cpp:2276 msgid " the selected preset?" msgstr " вибране налаштування?" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1582 +#: xs/src/slic3r/GUI/Tab.cpp:2277 msgid "Remove" msgstr "Перемістити" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1582 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:178 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:196 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2021 +#: xs/src/slic3r/GUI/Tab.cpp:2277 lib/Slic3r/GUI/Plater.pm:251 +#: lib/Slic3r/GUI/Plater.pm:269 lib/Slic3r/GUI/Plater.pm:2215 msgid "Delete" msgstr "Видалити" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1583 +#: xs/src/slic3r/GUI/Tab.cpp:2278 msgid " Preset" msgstr " Налаштування" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1636 +#: xs/src/slic3r/GUI/Tab.cpp:2331 msgid "All" msgstr "Всі" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1667 +#: xs/src/slic3r/GUI/Tab.cpp:2363 msgid "Select the printers this profile is compatible with." msgstr "Оберіть принтери, сумісні з цим профілем." -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1751 -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:514 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1645 +#: xs/src/slic3r/GUI/Tab.cpp:2409 xs/src/slic3r/GUI/Tab.cpp:2495 +#: xs/src/slic3r/GUI/Preset.cpp:702 xs/src/slic3r/GUI/Preset.cpp:742 +#: xs/src/slic3r/GUI/Preset.cpp:770 xs/src/slic3r/GUI/Preset.cpp:802 +#: xs/src/slic3r/GUI/PresetBundle.cpp:1193 +#: xs/src/slic3r/GUI/PresetBundle.cpp:1246 lib/Slic3r/GUI/Plater.pm:603 +msgid "System presets" +msgstr "Системні налаштування" + +#: xs/src/slic3r/GUI/Tab.cpp:2410 xs/src/slic3r/GUI/Tab.cpp:2496 +msgid "Default presets" +msgstr "Налаштування за замовчанням" + +#: xs/src/slic3r/GUI/Tab.cpp:2565 +msgid "" +"LOCKED LOCK;indicates that the settings are the same as the system values " +"for the current option group" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2568 +msgid "" +"UNLOCKED LOCK;indicates that some settings were changed and are not equal to " +"the system values for the current option group.\n" +"Click the UNLOCKED LOCK icon to reset all settings for current option group " +"to the system values." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2574 +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." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2578 +msgid "" +"BACK ARROW;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 "" + +#: xs/src/slic3r/GUI/Tab.cpp:2604 +msgid "" +"LOCKED LOCK icon indicates that the settings are the same as the system " +"values for the current option group" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2606 +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." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2609 +msgid "WHITE BULLET icon indicates a non system preset." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2612 +msgid "" +"WHITE BULLET icon indicates that the settings are the same as in the last " +"saved preset for the current option group." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2614 +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 "" + +#: xs/src/slic3r/GUI/Tab.cpp:2620 +msgid "" +"LOCKED LOCK icon indicates that the value is the same as the system value." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2621 +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." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2627 +msgid "" +"WHITE BULLET icon indicates that the value is the same as in the last saved " +"preset." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2628 +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 "" + +#: xs/src/slic3r/GUI/Tab.cpp:2703 lib/Slic3r/GUI/MainFrame.pm:469 +#: lib/Slic3r/GUI/Plater.pm:1795 msgid "Save " msgstr "Зберегти " -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1751 +#: xs/src/slic3r/GUI/Tab.cpp:2703 msgid " as:" msgstr " як:" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1785 -msgid "" -"The supplied name is not valid; the following characters are not allowed:" -msgstr "Надане ім'я недійсне; такі символи не допускаються:" +#: xs/src/slic3r/GUI/Tab.cpp:2742 xs/src/slic3r/GUI/Tab.cpp:2746 +msgid "The supplied name is not valid;" +msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1788 +#: xs/src/slic3r/GUI/Tab.cpp:2743 +msgid "the following characters are not allowed:" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2747 +msgid "the following postfix are not allowed:" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2750 msgid "The supplied name is not available." msgstr "Надане ім'я недійсне." -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.hpp:182 +#: xs/src/slic3r/GUI/Tab.hpp:286 msgid "Print Settings" msgstr "Параметри друку" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.hpp:202 +#: xs/src/slic3r/GUI/Tab.hpp:306 msgid "Filament Settings" msgstr "Параметри філаменту" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.hpp:228 +#: xs/src/slic3r/GUI/Tab.hpp:332 msgid "Printer Settings" msgstr "Параметри принтеру" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.hpp:248 +#: xs/src/slic3r/GUI/Tab.hpp:348 msgid "Save preset" msgstr "Зберегти налаштування" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Field.cpp:42 +#: xs/src/slic3r/GUI/Field.cpp:98 msgid "default" msgstr "за замовчуванням" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:26 +#: xs/src/slic3r/GUI/Field.cpp:128 +#, c-format +msgid "%s doesn't support percentage" +msgstr "" + +#: xs/src/slic3r/GUI/Field.cpp:137 +msgid "Input value is out of range" +msgstr "" + +#: xs/src/slic3r/GUI/Preset.cpp:144 +msgid "modified" +msgstr "модифікований" + +#: xs/src/slic3r/GUI/Preset.cpp:746 xs/src/slic3r/GUI/Preset.cpp:806 +#: xs/src/slic3r/GUI/PresetBundle.cpp:1251 lib/Slic3r/GUI/Plater.pm:604 +msgid "User presets" +msgstr "Налаштування користувача" + +#: xs/src/slic3r/GUI/PresetHints.cpp:27 #, c-format msgid "" "If estimated layer time is below ~%ds, fan will run at %d%% and print speed " @@ -882,7 +1550,7 @@ msgstr "" "%%, і швидкість друку буде зменшена, так що на цей шар витрачається не менше " "%dс (однак швидкість ніколи не зменшиться нижче %d mm/s) ." -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:30 +#: xs/src/slic3r/GUI/PresetHints.cpp:31 #, c-format msgid "" "\n" @@ -893,7 +1561,7 @@ msgstr "" "Якщо запланований час друку шару більше, але все ще нижче ~%dс, вентилятор " "буде працювати з пропорційно зменшуваною швидкістю між %d%% та %d%%." -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:34 +#: xs/src/slic3r/GUI/PresetHints.cpp:35 msgid "" "\n" "During the other layers, fan " @@ -901,95 +1569,95 @@ msgstr "" "\n" "Під час друку інших шарів вентилятор " -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:36 +#: xs/src/slic3r/GUI/PresetHints.cpp:37 msgid "Fan " msgstr "Вентилятор " -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:41 +#: xs/src/slic3r/GUI/PresetHints.cpp:42 #, c-format msgid "will always run at %d%% " msgstr "буде завжди працювати на %d%% " -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:44 +#: xs/src/slic3r/GUI/PresetHints.cpp:45 #, c-format msgid "except for the first %d layers" msgstr "за винятком перших %d шарів" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:48 +#: xs/src/slic3r/GUI/PresetHints.cpp:49 msgid "except for the first layer" msgstr "за винятком першого шару" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:50 +#: xs/src/slic3r/GUI/PresetHints.cpp:51 msgid "will be turned off." msgstr "буде вимкнено." -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:151 +#: xs/src/slic3r/GUI/PresetHints.cpp:152 msgid "external perimeters" msgstr "зовнішні периметри" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:160 +#: xs/src/slic3r/GUI/PresetHints.cpp:161 msgid "perimeters" msgstr "периметри" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:169 +#: xs/src/slic3r/GUI/PresetHints.cpp:170 msgid "infill" msgstr "наповнення" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:179 +#: xs/src/slic3r/GUI/PresetHints.cpp:180 msgid "solid infill" msgstr "суцільне наповнення" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:187 +#: xs/src/slic3r/GUI/PresetHints.cpp:188 msgid "top solid infill" msgstr "верхній суцільне наповнення" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:198 +#: xs/src/slic3r/GUI/PresetHints.cpp:199 msgid "support" msgstr "підтримка" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:208 +#: xs/src/slic3r/GUI/PresetHints.cpp:209 msgid "support interface" msgstr "інтерфейс підтримки" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:214 +#: xs/src/slic3r/GUI/PresetHints.cpp:215 msgid "First layer volumetric" msgstr "Об'єм першого шару" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:214 +#: xs/src/slic3r/GUI/PresetHints.cpp:215 msgid "Bridging volumetric" msgstr "Об'єм мостів" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:214 +#: xs/src/slic3r/GUI/PresetHints.cpp:215 msgid "Volumetric" msgstr "Об'ємний" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:215 +#: xs/src/slic3r/GUI/PresetHints.cpp:216 msgid " flow rate is maximized " msgstr " швидкість потоку максимізується " -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:218 +#: xs/src/slic3r/GUI/PresetHints.cpp:219 msgid "by the print profile maximum" msgstr "за профілем друку максимум" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:219 +#: xs/src/slic3r/GUI/PresetHints.cpp:220 msgid "when printing " msgstr "коли друкуємо " -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:220 +#: xs/src/slic3r/GUI/PresetHints.cpp:221 msgid " with a volumetric rate " msgstr " з об'ємною швидкістю " -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:224 +#: xs/src/slic3r/GUI/PresetHints.cpp:225 #, c-format msgid "%3.2f mm³/s" msgstr "%3.2f мм³/с" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:226 +#: xs/src/slic3r/GUI/PresetHints.cpp:227 #, c-format msgid " at filament speed %3.2f mm/s." msgstr " при швидкості філаменту %3.2f мм/с." -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:245 +#: xs/src/slic3r/GUI/PresetHints.cpp:246 msgid "" "Recommended object thin wall thickness: Not available due to invalid layer " "height." @@ -997,25 +1665,21 @@ msgstr "" "Рекомендований об'єкт товщиною тонкої стінки: Недоступний через невірне " "значення висоти шару." -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:262 +#: xs/src/slic3r/GUI/PresetHints.cpp:263 #, c-format msgid "Recommended object thin wall thickness for layer height %.2f and " msgstr "Рекомендована товщина стінки для висоти шару %.2f та " -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:269 +#: xs/src/slic3r/GUI/PresetHints.cpp:270 #, c-format msgid "%d lines: %.2lf mm" msgstr "%d рядків: %.2lf мм" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.hpp:17 -msgid "Preferences" -msgstr "Налаштування" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:27 +#: xs/src/slic3r/GUI/Preferences.cpp:34 msgid "Remember output directory" msgstr "Пам'ятати вихідний каталог" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:29 +#: xs/src/slic3r/GUI/Preferences.cpp:36 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." @@ -1023,22 +1687,22 @@ msgstr "" "Якщо вибрано, Slic3r запропонує останню вихідну директорію замість тої, що " "вказана у вхідному файлі." -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:35 +#: xs/src/slic3r/GUI/Preferences.cpp:42 msgid "Auto-center parts" msgstr "Автоцентрувати частини" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:37 +#: xs/src/slic3r/GUI/Preferences.cpp:44 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "" "Якщо вибрано, Slic3r автоматично орієнтує об'єкти навколо центру друку." -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:43 +#: xs/src/slic3r/GUI/Preferences.cpp:50 msgid "Background processing" msgstr "Фонова обробка" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:45 +#: xs/src/slic3r/GUI/Preferences.cpp:52 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." @@ -1046,11 +1710,11 @@ msgstr "" "Якщо вибрано, Slic3r буде попередньо обробляти об'єкти, як тільки вони " "будуть завантажені, щоб заощадити час при експорті G-коду." -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:51 +#: xs/src/slic3r/GUI/Preferences.cpp:74 msgid "Disable USB/serial connection" msgstr "Вимкнути USB / послідовне з'єднання" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:53 +#: xs/src/slic3r/GUI/Preferences.cpp:76 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 " @@ -1060,11 +1724,11 @@ msgstr "" "Користувальницький інтерфейс спрощує, якщо принтер ніколи не приєднується до " "комп'ютера." -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:59 +#: xs/src/slic3r/GUI/Preferences.cpp:82 msgid "Suppress \" - default - \" presets" msgstr "Заборонити налаштування \"- за замовчуванням -\"" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:61 +#: xs/src/slic3r/GUI/Preferences.cpp:84 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." @@ -1072,11 +1736,11 @@ msgstr "" "Заборонити налаштування \"- за замовчуванням -\" у параметрах Друк / " "Філамент / Принтер, якщо доступні інші діючі налаштування." -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:67 +#: xs/src/slic3r/GUI/Preferences.cpp:90 msgid "Show incompatible print and filament presets" msgstr "Показувати несумісні налаштування друку та філаменту" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:69 +#: xs/src/slic3r/GUI/Preferences.cpp:92 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" @@ -1084,11 +1748,11 @@ msgstr "" "Якщо вибрано, налаштування друку та філаменту відображаються у списку " "налаштувань, навіть якщо вони позначені як несумісні з активним принтером" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:75 +#: xs/src/slic3r/GUI/Preferences.cpp:98 msgid "Use legacy OpenGL 1.1 rendering" msgstr "Використовувати застарілий OpenGL 1.1 рендеринг" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:77 +#: xs/src/slic3r/GUI/Preferences.cpp:100 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 " @@ -1099,15 +1763,355 @@ msgstr "" "редагування висоти шару та згладжування, тому краще оновити графічний " "драйвер." -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:101 +#: xs/src/slic3r/GUI/Preferences.cpp:124 msgid "You need to restart Slic3r to make the changes effective." msgstr "З метою ефективності зміни, Вам потрібно буде перезапустити Slic3r." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:26 +#: xs/src/slic3r/GUI/RammingChart.cpp:23 +msgid "NO RAMMING AT ALL" +msgstr "" + +#: xs/src/slic3r/GUI/RammingChart.cpp:76 +msgid "Time" +msgstr "" + +#: xs/src/slic3r/GUI/RammingChart.cpp:76 xs/src/slic3r/GUI/RammingChart.cpp:81 +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:77 +#: xs/src/libslic3r/PrintConfig.cpp:490 +msgid "s" +msgstr "" + +#: xs/src/slic3r/GUI/RammingChart.cpp:81 +msgid "Volumetric speed" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:27 +msgid "Update available" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:27 +msgid "New version of Slic3r PE is available" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:34 +msgid "To download, follow the link below." +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:41 +msgid "Current version:" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:43 +msgid "New version:" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:51 +msgid "Don't notify about new releases any more" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:69 +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:161 +msgid "Configuration update" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:69 +msgid "Configuration update is available" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:72 +msgid "" +"Would you like to install it?\n" +"\n" +"Note that a full configuration snapshot will be created first. It can then " +"be restored at any time should there be a problem with the new version.\n" +"\n" +"Updated configuration bundles:" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:108 +msgid "Slic3r incompatibility" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:108 +msgid "Slic3r configuration is incompatible" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:111 +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" +"\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" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:120 +#, c-format +msgid "This Slic3r PE version: %s" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:125 +msgid "Incompatible bundles:" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:141 +msgid "Exit Slic3r" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:144 +msgid "Re-configure" +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:165 +#, c-format +msgid "" +"Slic3r PE now uses an updated configuration structure.\n" +"\n" +"So called 'System presets' have been introduced, which hold the built-in " +"default settings for various printers. These System presets cannot be " +"modified, instead, users now may create their own presets inheriting " +"settings from one of the System presets.\n" +"An inheriting preset may either inherit a particular value from its parent " +"or override it with a customized value.\n" +"\n" +"Please proceed with the %s that follows to set up the new presets and to " +"choose whether to enable automatic preset updates." +msgstr "" + +#: xs/src/slic3r/GUI/UpdateDialogs.cpp:181 +msgid "For more information please visit our wiki page:" +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:9 +msgid "Ramming customization" +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:35 +msgid "" +"Ramming denotes the rapid extrusion just before a tool change in a single-" +"extruder MM printer. Its purpose is to properly shape the end of the " +"unloaded filament so it does not prevent insertion of the new filament and " +"can itself be reinserted later. This phase is important and different " +"materials can require different extrusion speeds to get the good shape. For " +"this reason, the extrusion rates during ramming are adjustable.\n" +"\n" +"This is an expert-level setting, incorrect adjustment will likely lead to " +"jams, extruder wheel grinding into filament etc." +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:77 +msgid "Total ramming time" +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:79 +msgid "Total rammed volume" +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:83 +msgid "Ramming line width" +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:85 +msgid "Ramming line spacing" +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:137 +msgid "Wipe tower - Purging volume adjustment" +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:218 +msgid "" +"Here you can adjust required purging volume (mm³) for any given pair of " +"tools." +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:219 +msgid "Extruder changed to" +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:227 +msgid "unloaded" +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:228 +msgid "loaded" +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:233 +msgid "Tool #" +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:240 +msgid "" +"Total purging volume is calculated by summing two values below, depending on " +"which tools are loaded/unloaded." +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:241 +msgid "Volume to purge (mm³) when the filament is being" +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:255 +msgid "From" +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:320 +msgid "" +"Switching to simple settings will discard changes done in the advanced " +"mode!\n" +"\n" +"Do you want to proceed?" +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:332 +msgid "Show simplified settings" +msgstr "" + +#: xs/src/slic3r/GUI/WipeTowerDialog.cpp:332 +msgid "Show advanced settings" +msgstr "" + +#: xs/src/slic3r/Utils/OctoPrint.cpp:33 +msgid "Send G-Code to printer" +msgstr "" + +#: xs/src/slic3r/Utils/OctoPrint.cpp:33 +msgid "Upload to OctoPrint with the following filename:" +msgstr "" + +#: xs/src/slic3r/Utils/OctoPrint.cpp:35 +msgid "Start printing after upload" +msgstr "" + +#: xs/src/slic3r/Utils/OctoPrint.cpp:37 +msgid "Use forward slashes ( / ) as a directory separator if needed." +msgstr "" + +#: xs/src/slic3r/Utils/OctoPrint.cpp:98 +msgid "Error while uploading to the OctoPrint server" +msgstr "" + +#: xs/src/slic3r/Utils/OctoPrint.cpp:111 lib/Slic3r/GUI/Plater.pm:1558 +msgid "Sending G-code file to the OctoPrint server..." +msgstr "Відправка файлу G-коду на сервер OctoPrint..." + +#: xs/src/slic3r/Utils/PresetUpdater.cpp:544 +#, c-format +msgid "requires min. %s and max. %s" +msgstr "" + +#: xs/src/libslic3r/Print.cpp:553 +msgid "All objects are outside of the print volume." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:579 +msgid "Some objects are too close; your extruder will collide with them." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:594 +msgid "" +"Some objects are too tall and cannot be printed without extruder collisions." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:604 +msgid "The Spiral Vase option can only be used when printing a single object." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:606 +msgid "" +"The Spiral Vase option can only be used when printing single material " +"objects." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:612 +msgid "" +"All extruders must have the same diameter for single extruder multimaterial " +"printer." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:617 +msgid "" +"The Wipe Tower is currently only supported for the Marlin and RepRap/" +"Sprinter G-code flavors." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:619 +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:631 +msgid "" +"The Wipe Tower is only supported for multiple objects if they have equal " +"layer heigths" +msgstr "" + +#: xs/src/libslic3r/Print.cpp:633 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed " +"over an equal number of raft layers" +msgstr "" + +#: xs/src/libslic3r/Print.cpp:635 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed " +"with the same support_material_contact_distance" +msgstr "" + +#: xs/src/libslic3r/Print.cpp:637 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are sliced " +"equally." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:661 +msgid "" +"The Wipe tower is only supported if all objects have the same layer height " +"profile" +msgstr "" + +#: xs/src/libslic3r/Print.cpp:670 +msgid "The supplied settings will cause an empty print." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:680 +msgid "" +"One or more object were assigned an extruder that the printer does not have." +msgstr "" + +#: xs/src/libslic3r/Print.cpp:689 +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 "" + +#: xs/src/libslic3r/Print.cpp:695 +msgid "first_layer_height" +msgstr "" + +#: xs/src/libslic3r/Print.cpp:710 +msgid "First layer height can't be greater than nozzle diameter" +msgstr "" + +#: xs/src/libslic3r/Print.cpp:714 +msgid "Layer height can't be greater than nozzle diameter" +msgstr "" + +#: xs/src/libslic3r/Print.cpp:1196 +msgid "Failed processing of the output_filename_format template." +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:29 msgid "Avoid crossing perimeters" msgstr "Уникати перетинання периметрів" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:27 +#: xs/src/libslic3r/PrintConfig.cpp:30 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " @@ -1117,12 +2121,11 @@ msgstr "" "основному це корисно для екструдерів Bowden, які страждають від протікання. " "Ця функція уповільнює як друк, так і генерацію G-коду." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:38 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1572 +#: xs/src/libslic3r/PrintConfig.cpp:41 xs/src/libslic3r/PrintConfig.cpp:1818 msgid "Other layers" msgstr "Інші шари" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:39 +#: xs/src/libslic3r/PrintConfig.cpp:42 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." @@ -1130,11 +2133,11 @@ msgstr "" "Температура полотна для останніх шарів після першого. Установіть 0, щоб " "відключити команди керування температурою полотна на виході." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:42 +#: xs/src/libslic3r/PrintConfig.cpp:45 msgid "Bed temperature" msgstr "Температура полотна" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:49 +#: xs/src/libslic3r/PrintConfig.cpp:52 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 " @@ -1144,11 +2147,11 @@ msgstr "" "переміщення Z. Зауважте, що ви можете використовувати змінні-заповнювачі для " "всіх параметрів Slic3r, а також [layer_num] і [layer_z]." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:59 +#: xs/src/libslic3r/PrintConfig.cpp:62 msgid "Between objects G-code" msgstr "G-код між об'єктами" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:60 +#: xs/src/libslic3r/PrintConfig.cpp:63 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -1165,39 +2168,32 @@ msgstr "" "Slic3r, то ж ви можете вставити команду \"M109 S [first_layer_temperature]\" " "де завгодно." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:68 -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:370 +#: xs/src/libslic3r/PrintConfig.cpp:71 lib/Slic3r/GUI/MainFrame.pm:328 msgid "Bottom" msgstr "Знизу" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:69 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:239 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:290 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:298 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:604 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:762 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:778 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:941 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:989 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1152 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1583 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1639 +#: xs/src/libslic3r/PrintConfig.cpp:72 xs/src/libslic3r/PrintConfig.cpp:276 +#: xs/src/libslic3r/PrintConfig.cpp:327 xs/src/libslic3r/PrintConfig.cpp:335 +#: xs/src/libslic3r/PrintConfig.cpp:701 xs/src/libslic3r/PrintConfig.cpp:871 +#: xs/src/libslic3r/PrintConfig.cpp:887 xs/src/libslic3r/PrintConfig.cpp:1156 +#: xs/src/libslic3r/PrintConfig.cpp:1222 xs/src/libslic3r/PrintConfig.cpp:1400 +#: xs/src/libslic3r/PrintConfig.cpp:1829 xs/src/libslic3r/PrintConfig.cpp:1885 msgid "Layers and Perimeters" msgstr "Шари та периметри" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:70 +#: xs/src/libslic3r/PrintConfig.cpp:73 msgid "Number of solid layers to generate on bottom surfaces." msgstr "Кількість суцільних шарів, генерованих на нижніх поверхнях." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:72 +#: xs/src/libslic3r/PrintConfig.cpp:75 msgid "Bottom solid layers" msgstr "Нижні суцільні шари" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:77 +#: xs/src/libslic3r/PrintConfig.cpp:80 msgid "Bridge" msgstr "Міст" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:78 +#: xs/src/libslic3r/PrintConfig.cpp:81 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." @@ -1205,19 +2201,18 @@ msgstr "" "Це прискорення, яке ваш принтер використовуватиме для мостів. Встановити 0, " "щоб відключити управління прискоренням для мостів." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:80 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:174 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:576 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:684 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:952 +#: xs/src/libslic3r/PrintConfig.cpp:83 xs/src/libslic3r/PrintConfig.cpp:199 +#: xs/src/libslic3r/PrintConfig.cpp:673 xs/src/libslic3r/PrintConfig.cpp:781 +#: xs/src/libslic3r/PrintConfig.cpp:931 xs/src/libslic3r/PrintConfig.cpp:972 +#: xs/src/libslic3r/PrintConfig.cpp:982 xs/src/libslic3r/PrintConfig.cpp:1185 msgid "mm/s²" msgstr "мм/с²" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:86 +#: xs/src/libslic3r/PrintConfig.cpp:89 msgid "Bridging angle" msgstr "Кут моста" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:88 +#: xs/src/libslic3r/PrintConfig.cpp:91 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -1227,36 +2222,31 @@ msgstr "" "автоматично. Інакше передбачений кут буде використаний для всіх мостів. " "Використовуйте 180° для нульового кута." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:91 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:492 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1170 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1181 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1401 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1557 +#: xs/src/libslic3r/PrintConfig.cpp:94 xs/src/libslic3r/PrintConfig.cpp:589 +#: xs/src/libslic3r/PrintConfig.cpp:1418 xs/src/libslic3r/PrintConfig.cpp:1429 +#: xs/src/libslic3r/PrintConfig.cpp:1649 xs/src/libslic3r/PrintConfig.cpp:1803 msgid "°" msgstr "°" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:97 +#: xs/src/libslic3r/PrintConfig.cpp:100 msgid "Bridges fan speed" msgstr "Швидкість вентилятора для мостів" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:98 +#: xs/src/libslic3r/PrintConfig.cpp:101 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "Ця швидкість вентилятора виконується для всіх мостів і виступів." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:99 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:504 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:789 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:850 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1060 +#: xs/src/libslic3r/PrintConfig.cpp:102 xs/src/libslic3r/PrintConfig.cpp:601 +#: xs/src/libslic3r/PrintConfig.cpp:990 xs/src/libslic3r/PrintConfig.cpp:1058 +#: xs/src/libslic3r/PrintConfig.cpp:1308 msgid "%" msgstr "%" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:106 +#: xs/src/libslic3r/PrintConfig.cpp:109 msgid "Bridge flow ratio" msgstr "Співвідношення мостового потоку" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:108 +#: xs/src/libslic3r/PrintConfig.cpp:111 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -1268,32 +2258,31 @@ msgstr "" "стандартні налаштування зазвичай добрі, тому ви маете по-експериментувати з " "охолодженням (використовуйте вентилятор), перш ніж їх налаштувати." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:117 +#: xs/src/libslic3r/PrintConfig.cpp:121 msgid "Bridges" msgstr "Мости" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:119 +#: xs/src/libslic3r/PrintConfig.cpp:123 msgid "Speed for printing bridges." msgstr "Швидкість друку мостів." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:120 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:638 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:749 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:811 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:868 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:981 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1137 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1146 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1536 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1649 +#: xs/src/libslic3r/PrintConfig.cpp:124 xs/src/libslic3r/PrintConfig.cpp:471 +#: xs/src/libslic3r/PrintConfig.cpp:480 xs/src/libslic3r/PrintConfig.cpp:508 +#: xs/src/libslic3r/PrintConfig.cpp:516 xs/src/libslic3r/PrintConfig.cpp:735 +#: xs/src/libslic3r/PrintConfig.cpp:846 xs/src/libslic3r/PrintConfig.cpp:922 +#: xs/src/libslic3r/PrintConfig.cpp:940 xs/src/libslic3r/PrintConfig.cpp:952 +#: xs/src/libslic3r/PrintConfig.cpp:962 xs/src/libslic3r/PrintConfig.cpp:1019 +#: xs/src/libslic3r/PrintConfig.cpp:1076 xs/src/libslic3r/PrintConfig.cpp:1214 +#: xs/src/libslic3r/PrintConfig.cpp:1385 xs/src/libslic3r/PrintConfig.cpp:1394 +#: xs/src/libslic3r/PrintConfig.cpp:1782 xs/src/libslic3r/PrintConfig.cpp:1895 msgid "mm/s" msgstr "мм/с" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:127 +#: xs/src/libslic3r/PrintConfig.cpp:131 msgid "Brim width" msgstr "Ширина краю" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:128 +#: xs/src/libslic3r/PrintConfig.cpp:132 msgid "" "Horizontal width of the brim that will be printed around each object on the " "first layer." @@ -1301,11 +2290,11 @@ msgstr "" "Горизонтальна ширина краю, яка буде надрукована навколо кожного об'єкта на " "першому шарі." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:135 +#: xs/src/libslic3r/PrintConfig.cpp:139 msgid "Clip multi-part objects" msgstr "Обрізати об'єкти, що складаються з кількох частин" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:136 +#: xs/src/libslic3r/PrintConfig.cpp:140 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 " @@ -1315,11 +2304,11 @@ msgstr "" "обрізати частини, що перекриваються один одною (друга частина буде обрізана " "першою, третя - першою та другою, тощо)." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:147 +#: xs/src/libslic3r/PrintConfig.cpp:151 msgid "Compatible printers condition" msgstr "Стан сумісних принтерів" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:148 +#: xs/src/libslic3r/PrintConfig.cpp:152 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -1329,11 +2318,11 @@ msgstr "" "принтера. Якщо цей вираз оцінюється як Правда, цей профіль вважається " "сумісним з активним профілем принтера." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:154 +#: xs/src/libslic3r/PrintConfig.cpp:163 msgid "Complete individual objects" msgstr "Закінчити окремі об'єкти" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:155 +#: xs/src/libslic3r/PrintConfig.cpp:164 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). " @@ -1345,11 +2334,11 @@ msgstr "" "шару). Ця функція корисна для уникнення ризику зіпсованих відбитків. Slic3r " "має попередити та запобігти зіткненню екструдера, але будьте обережні." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:163 +#: xs/src/libslic3r/PrintConfig.cpp:172 msgid "Enable auto cooling" msgstr "Увімкнути автоматичне охолодження" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:164 +#: xs/src/libslic3r/PrintConfig.cpp:173 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." @@ -1357,7 +2346,23 @@ msgstr "" "Цей прапорець дозволяє автоматичну логіку охолодження, яка регулює швидкість " "друку та швидкість вентиляції відповідно до часу друку шару." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:171 +#: xs/src/libslic3r/PrintConfig.cpp:179 +msgid "Cooling tube position" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:180 +msgid "Distance of the center-point of the cooling tube from the extruder tip " +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:187 +msgid "Cooling tube length" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:188 +msgid "Length of the cooling tube to limit space for cooling moves inside it " +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:196 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -1367,11 +2372,33 @@ msgstr "" "використані конкретні визначені прискорення (периметру / заповнення). " "Встановити 0, щоб запобігти скиданням прискорення взагалі." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:180 +#: xs/src/libslic3r/PrintConfig.cpp:205 +msgid "Default filament profile" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:206 +msgid "" +"Default filament profile associated with the current printer profile. On " +"selection of the current printer profile, this filament profile will be " +"activated." +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:211 +msgid "Default print profile" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:212 +msgid "" +"Default print profile associated with the current printer profile. On " +"selection of the current printer profile, this print profile will be " +"activated." +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:217 msgid "Disable fan for the first" msgstr "Вимкнути вентилятор для першого(их)" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:181 +#: xs/src/libslic3r/PrintConfig.cpp:218 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." @@ -1380,21 +2407,18 @@ msgstr "" "протягом друку декількох перших шарів, щоб це не призвело до гіршого " "зчеплення." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:183 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:694 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1033 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1224 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1285 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1437 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1482 +#: xs/src/libslic3r/PrintConfig.cpp:220 xs/src/libslic3r/PrintConfig.cpp:791 +#: xs/src/libslic3r/PrintConfig.cpp:1281 xs/src/libslic3r/PrintConfig.cpp:1472 +#: xs/src/libslic3r/PrintConfig.cpp:1533 xs/src/libslic3r/PrintConfig.cpp:1685 +#: xs/src/libslic3r/PrintConfig.cpp:1730 msgid "layers" msgstr "шару(ів)" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:190 +#: xs/src/libslic3r/PrintConfig.cpp:227 msgid "Don't support bridges" msgstr "Не підтримувати мости" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:192 +#: xs/src/libslic3r/PrintConfig.cpp:229 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." @@ -1402,19 +2426,19 @@ msgstr "" "Експериментальний варіант для запобігання утворенню допоміжного матеріалу в " "областях під мостами." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:198 +#: xs/src/libslic3r/PrintConfig.cpp:235 msgid "Distance between copies" msgstr "Відстань між копіями" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:199 +#: xs/src/libslic3r/PrintConfig.cpp:236 msgid "Distance used for the auto-arrange feature of the plater." msgstr "Відстань використовується для автоматичного розташування платеру." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:207 +#: xs/src/libslic3r/PrintConfig.cpp:244 msgid "Elephant foot compensation" msgstr "Зрівноваження Стопи слона" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:209 +#: xs/src/libslic3r/PrintConfig.cpp:246 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." @@ -1422,7 +2446,7 @@ msgstr "" "Перший шар буде зменшено в площині XY завдяки налаштованому значенню, щоб " "компенсувати ефект Ноги Слона для 1-го шару." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:218 +#: xs/src/libslic3r/PrintConfig.cpp:255 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all Slic3r settings." @@ -1430,7 +2454,7 @@ msgstr "" "Ця кінцева процедура вставляється в кінці вихідного файлу. Зауважте, що ви " "можете використовувати заповнювачі змінних для всіх параметрів Slic3r." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:228 +#: xs/src/libslic3r/PrintConfig.cpp:265 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 " @@ -1442,11 +2466,11 @@ msgstr "" "для всіх параметрів Slic3r. Якщо у вас є кілька екструдерів, G-code " "обробляється в порядку екструдерів." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:238 +#: xs/src/libslic3r/PrintConfig.cpp:275 msgid "Ensure vertical shell thickness" msgstr "Перевірте товщину вертикальної оболонки" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:240 +#: xs/src/libslic3r/PrintConfig.cpp:277 msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell " "thickness (top+bottom solid layers)." @@ -1454,11 +2478,11 @@ msgstr "" "Додайте суцільні наповнювачі біля нахилених поверхонь, щоб гарантувати " "товщину вертикальної оболонки (верхній і нижній суцільні шари)." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:246 +#: xs/src/libslic3r/PrintConfig.cpp:283 msgid "Top/bottom fill pattern" msgstr "Верхній/нижній шаблон наповнення" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:248 +#: xs/src/libslic3r/PrintConfig.cpp:285 msgid "" "Fill pattern for top/bottom infill. This only affects the external visible " "layer, and not its adjacent solid shells." @@ -1466,23 +2490,39 @@ msgstr "" "Шаблон для верхнього/нижнього наповнення. Це впливає лише на зовнішній " "видимий шар, а не на сусідні суцільні оболонки." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:267 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:277 +#: xs/src/libslic3r/PrintConfig.cpp:294 xs/src/libslic3r/PrintConfig.cpp:654 +#: xs/src/libslic3r/PrintConfig.cpp:1764 +msgid "Rectilinear" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:295 xs/src/libslic3r/PrintConfig.cpp:660 +msgid "Concentric" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:296 xs/src/libslic3r/PrintConfig.cpp:664 +msgid "Hilbert Curve" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:297 xs/src/libslic3r/PrintConfig.cpp:665 +msgid "Archimedean Chords" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:298 xs/src/libslic3r/PrintConfig.cpp:666 +msgid "Octagram Spiral" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:304 xs/src/libslic3r/PrintConfig.cpp:314 msgid "External perimeters" msgstr "Зовнішні периметри" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:268 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:377 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:592 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:710 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:967 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1292 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1454 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1614 +#: xs/src/libslic3r/PrintConfig.cpp:305 xs/src/libslic3r/PrintConfig.cpp:415 +#: xs/src/libslic3r/PrintConfig.cpp:689 xs/src/libslic3r/PrintConfig.cpp:807 +#: xs/src/libslic3r/PrintConfig.cpp:1200 xs/src/libslic3r/PrintConfig.cpp:1540 +#: xs/src/libslic3r/PrintConfig.cpp:1702 xs/src/libslic3r/PrintConfig.cpp:1860 msgid "Extrusion Width" msgstr "Ширина екструзії" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:269 +#: xs/src/libslic3r/PrintConfig.cpp:306 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, " @@ -1495,17 +2535,14 @@ msgstr "" "сопла. Якщо він виражений у відсотках (наприклад, 200%), він буде " "обчислюватися за висотою шару." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:272 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:597 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:715 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:972 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1296 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1458 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1619 +#: xs/src/libslic3r/PrintConfig.cpp:309 xs/src/libslic3r/PrintConfig.cpp:694 +#: xs/src/libslic3r/PrintConfig.cpp:812 xs/src/libslic3r/PrintConfig.cpp:1205 +#: xs/src/libslic3r/PrintConfig.cpp:1544 xs/src/libslic3r/PrintConfig.cpp:1706 +#: xs/src/libslic3r/PrintConfig.cpp:1865 msgid "mm or % (leave 0 for default)" msgstr "мм або % (залиште 0 за замовчанням)" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:279 +#: xs/src/libslic3r/PrintConfig.cpp:316 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -1516,20 +2553,17 @@ msgstr "" "налаштування швидкості периметра вище. Встановити 0 для автоматичного " "використання." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:282 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:619 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1255 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1306 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1501 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1631 +#: xs/src/libslic3r/PrintConfig.cpp:319 xs/src/libslic3r/PrintConfig.cpp:716 +#: xs/src/libslic3r/PrintConfig.cpp:1503 xs/src/libslic3r/PrintConfig.cpp:1554 +#: xs/src/libslic3r/PrintConfig.cpp:1749 xs/src/libslic3r/PrintConfig.cpp:1877 msgid "mm/s or %" msgstr "мм/с або %" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:289 +#: xs/src/libslic3r/PrintConfig.cpp:326 msgid "External perimeters first" msgstr "Спочатку зовнішні периметри" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:291 +#: xs/src/libslic3r/PrintConfig.cpp:328 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." @@ -1537,11 +2571,11 @@ msgstr "" "Друкувати контури периметра від найзовнішнього до найвнутрішнього, замість " "інверсного порядку за замовчанням." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:297 +#: xs/src/libslic3r/PrintConfig.cpp:334 msgid "Extra perimeters if needed" msgstr "Додаткові периметри, якщо необхідно" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:299 +#: xs/src/libslic3r/PrintConfig.cpp:336 #, no-c-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " @@ -1552,7 +2586,7 @@ msgstr "" "Slic3r продовжує додавати периметри, поки підтримується більше 70% петель " "безпосередньо вище." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:309 +#: xs/src/libslic3r/PrintConfig.cpp:346 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -1562,12 +2596,11 @@ msgstr "" "екструдера). Це значення перевизначає екструдери периметра та наповнювача, " "але не екструдери підтримки." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:320 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:69 +#: xs/src/libslic3r/PrintConfig.cpp:358 lib/Slic3r/GUI/Plater/3DPreview.pm:75 msgid "Height" msgstr "Висота" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:321 +#: xs/src/libslic3r/PrintConfig.cpp:359 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 " @@ -1579,11 +2612,11 @@ msgstr "" "навколо вашого екструдера, і це являє собою максимальну глибину, яку " "екструдер може розглядати до зіткнення з іншими друкованими предметами." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:331 +#: xs/src/libslic3r/PrintConfig.cpp:369 msgid "Radius" msgstr "Радіус" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:332 +#: xs/src/libslic3r/PrintConfig.cpp:370 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 " @@ -1594,21 +2627,20 @@ msgstr "" "параметр використовується для перевірки зіткнень та відображення графічного " "попереднього перегляду в панелі." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:342 +#: xs/src/libslic3r/PrintConfig.cpp:380 msgid "Extruder Color" msgstr "Колір екструдера" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:343 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:406 +#: xs/src/libslic3r/PrintConfig.cpp:381 xs/src/libslic3r/PrintConfig.cpp:444 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" "Ця опція використовується лише у інтерфейсі Slic3r як візуальна допомога." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:350 +#: xs/src/libslic3r/PrintConfig.cpp:388 msgid "Extruder offset" msgstr "Зміщення екструдеру" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:351 +#: xs/src/libslic3r/PrintConfig.cpp:389 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 " @@ -1620,11 +2652,11 @@ msgstr "" "відносно першого. Він очікує позитивних координат (вони будуть віднімані від " "координати XY)." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:360 +#: xs/src/libslic3r/PrintConfig.cpp:398 msgid "Extrusion axis" msgstr "Ось екструзії" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:361 +#: xs/src/libslic3r/PrintConfig.cpp:399 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." @@ -1632,11 +2664,11 @@ msgstr "" "Використовуйте цю опцію, щоб встановити букву осей, пов'язану з екструдером " "принтера (зазвичай E, але деякі принтери використовують A)." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:367 +#: xs/src/libslic3r/PrintConfig.cpp:405 msgid "Extrusion multiplier" msgstr "Коефіцієнт екструзії" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:368 +#: xs/src/libslic3r/PrintConfig.cpp:406 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. " @@ -1649,11 +2681,11 @@ msgstr "" "вважаєте, що його потрібно більше змінити, перевірте діаметр нитки та E " "кроки прошивки ." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:376 +#: xs/src/libslic3r/PrintConfig.cpp:414 msgid "Default extrusion width" msgstr "Ширина екструзії за замовчанням" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:378 +#: xs/src/libslic3r/PrintConfig.cpp:416 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 " @@ -1667,15 +2699,15 @@ msgstr "" "наповнювача тощо). Якщо значення виражене у відсотках (наприклад: 230%), " "воно буде обчислюватися за висотою шару." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:382 +#: xs/src/libslic3r/PrintConfig.cpp:420 msgid "mm or % (leave 0 for auto)" msgstr "мм або % (залиште 0 для автообчислення)" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:387 +#: xs/src/libslic3r/PrintConfig.cpp:425 msgid "Keep fan always on" msgstr "Тримайте вентилятор завжди" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:388 +#: xs/src/libslic3r/PrintConfig.cpp:426 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." @@ -1684,11 +2716,11 @@ msgstr "" "триматися, як мінімум, на мінімальній швидкості. Корисно для PLA, шкідливо " "для ABS." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:394 +#: xs/src/libslic3r/PrintConfig.cpp:432 msgid "Enable fan if layer print time is below" msgstr "Увімкнути вентилятор, якщо час друку шару нижче" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:395 +#: xs/src/libslic3r/PrintConfig.cpp:433 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 " @@ -1698,29 +2730,27 @@ msgstr "" "активований, а його швидкість буде розрахована шляхом інтерполяції " "мінімальної та максимальної швидкості." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:397 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1242 +#: xs/src/libslic3r/PrintConfig.cpp:435 xs/src/libslic3r/PrintConfig.cpp:1490 msgid "approximate seconds" msgstr "приблизні секунди" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:405 +#: xs/src/libslic3r/PrintConfig.cpp:443 msgid "Color" msgstr "Колір" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:412 +#: xs/src/libslic3r/PrintConfig.cpp:450 msgid "Filament notes" msgstr "Примітки до філаменту" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:413 +#: xs/src/libslic3r/PrintConfig.cpp:451 msgid "You can put your notes regarding the filament here." msgstr "Тут ви можете помістити свої нотатки щодо філаменту." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:421 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:817 +#: xs/src/libslic3r/PrintConfig.cpp:459 xs/src/libslic3r/PrintConfig.cpp:1025 msgid "Max volumetric speed" msgstr "Максимальна об'ємна швидкість" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:422 +#: xs/src/libslic3r/PrintConfig.cpp:460 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -1730,12 +2760,76 @@ msgstr "" "максимальну об'ємну швидкість друку до мінімуму об'ємної швидкості друку та " "філаметну. Встановити 0 для відсутності обмежень." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:425 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:820 +#: xs/src/libslic3r/PrintConfig.cpp:463 xs/src/libslic3r/PrintConfig.cpp:1028 msgid "mm³/s" msgstr "мм³/с" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:432 +#: xs/src/libslic3r/PrintConfig.cpp:469 +msgid "Loading speed" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:470 +msgid "Speed used for loading the filament on the wipe tower. " +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:477 +msgid "Unloading speed" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:478 +msgid "" +"Speed used for unloading the filament on the wipe tower (does not affect " +"initial part of unloading just after ramming). " +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:486 +msgid "Delay after unloading" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:487 +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 "" + +#: xs/src/libslic3r/PrintConfig.cpp:496 +msgid "Number of cooling moves" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:497 +msgid "" +"Filament is cooled by being moved back and forth in the cooling tubes. " +"Specify desired number of these moves " +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:505 +msgid "Speed of the first cooling move" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:506 +msgid "Cooling moves are gradually accelerating beginning at this speed. " +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:513 +msgid "Speed of the last cooling move" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:514 +msgid "Cooling moves are gradually accelerating towards this speed. " +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:521 +msgid "Ramming parameters" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:522 +msgid "" +"This string is edited by RammingDialog and contains ramming specific " +"parameters " +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:529 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " @@ -1745,11 +2839,11 @@ msgstr "" "використовуйте суматор і виконайте декілька вимірювань вздовж нитки, потім " "обчисліть середнє значення." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:440 +#: xs/src/libslic3r/PrintConfig.cpp:537 msgid "Density" msgstr "Щільність" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:441 +#: xs/src/libslic3r/PrintConfig.cpp:538 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 " @@ -1761,16 +2855,15 @@ msgstr "" "обчислення співвідношення довжини до обсягу. Краще обчислити об'єм " "безпосередньо через зміщення." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:444 +#: xs/src/libslic3r/PrintConfig.cpp:541 msgid "g/cm³" msgstr "г/см³" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:450 +#: xs/src/libslic3r/PrintConfig.cpp:547 msgid "Filament type" msgstr "Тип філаменту" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:451 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1002 +#: xs/src/libslic3r/PrintConfig.cpp:548 xs/src/libslic3r/PrintConfig.cpp:1235 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. " @@ -1784,20 +2877,19 @@ msgstr "" "аргумент, і вони можуть отримати доступ до параметрів конфігурації Slic3r, " "прочитавши змінні середовища." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:470 +#: xs/src/libslic3r/PrintConfig.cpp:567 msgid "Soluble material" msgstr "Розчинний матеріал" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:471 +#: xs/src/libslic3r/PrintConfig.cpp:568 msgid "Soluble material is most likely used for a soluble support." msgstr "Розчинний матеріал переважно використовується для розчинної підтримки." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:476 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:450 +#: xs/src/libslic3r/PrintConfig.cpp:573 lib/Slic3r/GUI/Plater.pm:1616 msgid "Cost" msgstr "Вартість" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:477 +#: xs/src/libslic3r/PrintConfig.cpp:574 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." @@ -1805,15 +2897,15 @@ msgstr "" "Введіть тут свою вартість філаменту на кг. Це тільки для статистичної " "інформації." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:478 +#: xs/src/libslic3r/PrintConfig.cpp:575 msgid "money/kg" msgstr "грошових одиниць/кг" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:487 +#: xs/src/libslic3r/PrintConfig.cpp:584 msgid "Fill angle" msgstr "Кут наповнення" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:489 +#: xs/src/libslic3r/PrintConfig.cpp:586 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, " @@ -1823,31 +2915,61 @@ msgstr "" "застосовуватися крос-штрих. Мости будуть заповнені, використовуючи найкращий " "напрям, який може виявити Slic3r, тому цей параметр на них не впливає." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:501 +#: xs/src/libslic3r/PrintConfig.cpp:598 msgid "Fill density" msgstr "Щільність заповнення" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:503 +#: xs/src/libslic3r/PrintConfig.cpp:600 #, no-c-format msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "Щільність внутрішнього заповнення, виражена в діапазоні 0% - 100%." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:539 +#: xs/src/libslic3r/PrintConfig.cpp:636 msgid "Fill pattern" msgstr "Шаблон заповнення" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:541 +#: xs/src/libslic3r/PrintConfig.cpp:638 msgid "Fill pattern for general low-density infill." msgstr "Шаблон заповнення для загального низько-швидкісного наповнення." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:573 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:582 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:591 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:625 +#: xs/src/libslic3r/PrintConfig.cpp:655 +msgid "Grid" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:656 +msgid "Triangles" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:657 +msgid "Stars" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:658 +msgid "Cubic" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:659 +msgid "Line" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:661 xs/src/libslic3r/PrintConfig.cpp:1766 +msgid "Honeycomb" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:662 +msgid "3D Honeycomb" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:663 +msgid "Gyroid" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:670 xs/src/libslic3r/PrintConfig.cpp:679 +#: xs/src/libslic3r/PrintConfig.cpp:688 xs/src/libslic3r/PrintConfig.cpp:722 msgid "First layer" msgstr "Перший шар" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:574 +#: xs/src/libslic3r/PrintConfig.cpp:671 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." @@ -1855,7 +2977,7 @@ msgstr "" "Це прискорення, яке ваш принтер використовуватиме для першого шару. " "Встановити 0, щоб вимкнути керування прискоренням для першого шару." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:583 +#: xs/src/libslic3r/PrintConfig.cpp:680 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." @@ -1863,7 +2985,7 @@ msgstr "" "Температура підігрітої збірної пластини для першого шару. Установіть 0, щоб " "відключити команди керування температурою полотна на виході." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:593 +#: xs/src/libslic3r/PrintConfig.cpp:690 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 " @@ -1876,11 +2998,11 @@ msgstr "" "(наприклад, 120%), вона буде обчислена за висотою першого шару. Якщо " "встановлено на 0 - використовуватиме стандартну ширину екструзії." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:603 +#: xs/src/libslic3r/PrintConfig.cpp:700 msgid "First layer height" msgstr "Висота першого шару" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:605 +#: xs/src/libslic3r/PrintConfig.cpp:702 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 " @@ -1892,17 +3014,16 @@ msgstr "" "до невідповідних збірних пластин. Можна виразити як абсолютне значення або " "як відсоток (наприклад: 150%) по висоті шару за замовчуванням." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:609 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:740 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1390 +#: xs/src/libslic3r/PrintConfig.cpp:706 xs/src/libslic3r/PrintConfig.cpp:837 +#: xs/src/libslic3r/PrintConfig.cpp:1638 msgid "mm or %" msgstr "мм або %" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:615 +#: xs/src/libslic3r/PrintConfig.cpp:712 msgid "First layer speed" msgstr "Швидкість першого шару" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:616 +#: xs/src/libslic3r/PrintConfig.cpp:713 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 " @@ -1913,7 +3034,7 @@ msgstr "" "вона виражена у відсотках (наприклад: 40%), вона буде масштабувати швидкість " "за замовчуванням." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:626 +#: xs/src/libslic3r/PrintConfig.cpp:723 msgid "" "Extruder temperature for first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " @@ -1923,13 +3044,13 @@ msgstr "" "температуру вручну під час друку, встановіть 0, щоб вимкнути команди " "керування температурою у вихідному файлі." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:634 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:145 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:87 +#: xs/src/libslic3r/PrintConfig.cpp:731 +#: xs/src/libslic3r/GCode/PreviewData.cpp:170 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:97 msgid "Gap fill" msgstr "Заповнення розриву" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:636 +#: xs/src/libslic3r/PrintConfig.cpp:733 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 " @@ -1940,11 +3061,11 @@ msgstr "" "надмірних потрясінь та резонансних проблем. Встановити 0, щоб вимкнути " "заповнення розривів." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:644 +#: xs/src/libslic3r/PrintConfig.cpp:741 msgid "Verbose G-code" msgstr "Докладний G-код" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:645 +#: xs/src/libslic3r/PrintConfig.cpp:742 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 " @@ -1954,11 +3075,11 @@ msgstr "" "пояснюється описовим текстом. Якщо ви друкуєте з SD-карти, додаткова вага " "файлу може призвести до уповільнення прошивки." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:652 +#: xs/src/libslic3r/PrintConfig.cpp:749 msgid "G-code flavor" msgstr "Особливість G-коду" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:653 +#: xs/src/libslic3r/PrintConfig.cpp:750 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 " @@ -1970,7 +3091,11 @@ msgstr "" "сумісний вихід. \"Відсутність екструзії\" не дозволяє Slic3r експортувати " "будь-яке значення екструзії." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:682 +#: xs/src/libslic3r/PrintConfig.cpp:774 +msgid "No extrusion" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:779 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." @@ -1978,11 +3103,11 @@ msgstr "" "Це прискорення, яке ваш принтер використовуватиме для наповнення. Встановити " "0, щоб вимкнути регулятор прискорення для заповнення." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:690 +#: xs/src/libslic3r/PrintConfig.cpp:787 msgid "Combine infill every" msgstr "Об'єднати наповнення кожні" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:692 +#: xs/src/libslic3r/PrintConfig.cpp:789 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -1990,19 +3115,19 @@ msgstr "" "Ця функція дозволяє поєднувати наповнення та прискорити друк, екструдуючи " "більш товсті шари наповнення, зберігаючи тонкі периметри, а отже, і точністю." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:696 +#: xs/src/libslic3r/PrintConfig.cpp:793 msgid "Combine infill every n layers" msgstr "Об'єднати наповнення кожні n шарів" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:701 +#: xs/src/libslic3r/PrintConfig.cpp:798 msgid "Infill extruder" msgstr "Наповнювач екструдера" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:703 +#: xs/src/libslic3r/PrintConfig.cpp:800 msgid "The extruder to use when printing infill." msgstr "Екструдер, використовуваний під час друку наповнення." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:711 +#: xs/src/libslic3r/PrintConfig.cpp:808 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 " @@ -2017,11 +3142,11 @@ msgstr "" "прискорити наповнення та зміцнити свої деталі. Якщо він виражений у " "відсотках (наприклад, 90%), він буде обчислюватися за висотою шару." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:720 +#: xs/src/libslic3r/PrintConfig.cpp:817 msgid "Infill before perimeters" msgstr "Заповнення перед периметрами" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:721 +#: xs/src/libslic3r/PrintConfig.cpp:818 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." @@ -2029,11 +3154,11 @@ msgstr "" "За допомогою цього параметра можна буде змінити порядок друку периметрів та " "наповнювачів, зробивши останнє першим." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:726 +#: xs/src/libslic3r/PrintConfig.cpp:823 msgid "Only infill where needed" msgstr "Заповнити тільки там, де потрібно" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:728 +#: xs/src/libslic3r/PrintConfig.cpp:825 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 " @@ -2043,11 +3168,11 @@ msgstr "" "стель (це буде діяти як внутрішній матеріал підтримки). Якщо це ввімкнено, " "сповільнюється генерація G-коду через декілька перевірок." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:735 +#: xs/src/libslic3r/PrintConfig.cpp:832 msgid "Infill/perimeters overlap" msgstr "Перекриття наповнення/периметрів" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:737 +#: xs/src/libslic3r/PrintConfig.cpp:834 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -2059,17 +3184,25 @@ msgstr "" "може спричинити розриви. Якщо він виражений у відсотках (приклад: 15%), його " "розраховують за шириною екструзії по периметру." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:748 +#: xs/src/libslic3r/PrintConfig.cpp:845 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" "Швидкість друку внутрішнього заповнення. Встановити 0 для автоматичного " "обчислення." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:757 +#: xs/src/libslic3r/PrintConfig.cpp:854 +msgid "Inherits profile" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:855 +msgid "Name of the profile, from which this profile inherits." +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:866 msgid "Interface shells" msgstr "Інтерфейсні оболонки" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:758 +#: xs/src/libslic3r/PrintConfig.cpp:867 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -2079,7 +3212,7 @@ msgstr "" "Корисно для друку з багатьма екструдерами з напівпрозорими матеріалами або " "ручним розчинним матеріалом для підтримки." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:767 +#: xs/src/libslic3r/PrintConfig.cpp:876 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 " @@ -2091,7 +3224,7 @@ msgstr "" "Зауважте, що ви можете використовувати змінні-заповнювачі для всіх " "параметрів Slic3r, а також [layer_num] і [layer_z]." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:779 +#: xs/src/libslic3r/PrintConfig.cpp:888 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." @@ -2099,16 +3232,69 @@ msgstr "" "Цей параметр визначає висоту (і, таким чином, загальну кількість) шарів. " "Тонкі шари забезпечують більшу точність, але для друку потрібно більше часу." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:787 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:796 +#: xs/src/libslic3r/PrintConfig.cpp:896 +msgid "Support silent mode" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:897 +msgid "Set silent mode for the G-code flavor" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:919 +#, c-format +msgid "Maximum feedrate %1%" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:921 +#, c-format +msgid "Maximum feedrate of the %1% axis" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:928 +#, c-format +msgid "Maximum acceleration %1%" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:930 +#, c-format +msgid "Maximum acceleration of the %1% axis" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:937 +#, c-format +msgid "Maximum jerk %1%" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:939 +#, c-format +msgid "Maximum jerk of the %1% axis" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:949 xs/src/libslic3r/PrintConfig.cpp:951 +msgid "Minimum feedrate when extruding" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:959 xs/src/libslic3r/PrintConfig.cpp:961 +msgid "Minimum travel feedrate" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:969 xs/src/libslic3r/PrintConfig.cpp:971 +msgid "Maximum acceleration when extruding" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:979 xs/src/libslic3r/PrintConfig.cpp:981 +msgid "Maximum acceleration when retracting" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:988 xs/src/libslic3r/PrintConfig.cpp:997 msgid "Max" msgstr "Максимально" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:788 +#: xs/src/libslic3r/PrintConfig.cpp:989 msgid "This setting represents the maximum speed of your fan." msgstr "Цей параметр відображає максимальну швидкість вашого вентилятора." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:797 +#: xs/src/libslic3r/PrintConfig.cpp:998 #, no-c-format msgid "" "This is the highest printable layer height for this extruder, used to cap " @@ -2122,11 +3308,21 @@ msgstr "" "для досягнення розумної міжшарової адгезії. Якщо встановлено 0, висота шару " "обмежена 75% діаметра сопла." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:807 +#: xs/src/libslic3r/PrintConfig.cpp:1008 +msgid "Max print height" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1009 +msgid "" +"Set this to the maximum height that can be reached by your extruder while " +"printing." +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1015 msgid "Max print speed" msgstr "Максимальна швидкість друку" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:808 +#: xs/src/libslic3r/PrintConfig.cpp:1016 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -2137,7 +3333,7 @@ msgstr "" "екструдера. Цей експериментальний параметр використовується для встановлення " "максимальної швидкості друку, яку ви хочете дозволити." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:818 +#: xs/src/libslic3r/PrintConfig.cpp:1026 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." @@ -2145,12 +3341,11 @@ msgstr "" "Цей експериментальний параметр використовується для встановлення " "максимальної об'ємної швидкості, яку підтримує екструдер." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:826 +#: xs/src/libslic3r/PrintConfig.cpp:1034 msgid "Max volumetric slope positive" msgstr "Максимальний об'ємний нахил позитивний" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:827 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:838 +#: xs/src/libslic3r/PrintConfig.cpp:1035 xs/src/libslic3r/PrintConfig.cpp:1046 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 " @@ -2163,27 +3358,25 @@ msgstr "" "швидкість подачі 20 мм/с) до 5,4 мм³/с (подача 60 мм/с) займе принаймні 2 " "секунди." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:831 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:842 +#: xs/src/libslic3r/PrintConfig.cpp:1039 xs/src/libslic3r/PrintConfig.cpp:1050 msgid "mm³/s²" msgstr "мм³/с²" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:837 +#: xs/src/libslic3r/PrintConfig.cpp:1045 msgid "Max volumetric slope negative" msgstr "Максимальний об'ємний схил негативний" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:848 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:857 +#: xs/src/libslic3r/PrintConfig.cpp:1056 xs/src/libslic3r/PrintConfig.cpp:1065 msgid "Min" msgstr "Мінімально" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:849 +#: xs/src/libslic3r/PrintConfig.cpp:1057 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" "Цей параметр відповідає мінімальній ШІМ, на якій повинен працювати ваш " "вентилятор." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:858 +#: xs/src/libslic3r/PrintConfig.cpp:1066 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 " @@ -2193,19 +3386,19 @@ msgstr "" "роздільну здатність для висоти змінного шару. Типові значення - від 0,05 мм " "до 0,1 мм." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:866 +#: xs/src/libslic3r/PrintConfig.cpp:1074 msgid "Min print speed" msgstr "Мінімальна швидкість друку" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:867 +#: xs/src/libslic3r/PrintConfig.cpp:1075 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r не буде масштабувати швидкість нижче цієї швидкості." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:874 -msgid "Minimum extrusion length" -msgstr "Мінімальна довжина екструзії" +#: xs/src/libslic3r/PrintConfig.cpp:1082 +msgid "Minimal filament extrusion length" +msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:875 +#: xs/src/libslic3r/PrintConfig.cpp:1083 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 " @@ -2215,11 +3408,11 @@ msgstr "" "зазначеної кількості філаменту на нижньому шарі. Для машин із декількома " "екструдерами цей мінімум застосовується до кожного екструдера." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:884 +#: xs/src/libslic3r/PrintConfig.cpp:1092 msgid "Configuration notes" msgstr "Примітки до конфігурації" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:885 +#: xs/src/libslic3r/PrintConfig.cpp:1093 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." @@ -2227,20 +3420,20 @@ msgstr "" "Ви можете додати тут свої особисті примітки. Цей текст буде додано до " "коментарів заголовка G-коду." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:894 +#: xs/src/libslic3r/PrintConfig.cpp:1102 msgid "Nozzle diameter" msgstr "Діаметр сопла" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:895 +#: xs/src/libslic3r/PrintConfig.cpp:1103 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "Це діаметр сопла вашого екструдера (наприклад: 0.5, 0.35 тощо)" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:901 +#: xs/src/libslic3r/PrintConfig.cpp:1109 msgid "API Key" msgstr "Ключ API" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:902 +#: xs/src/libslic3r/PrintConfig.cpp:1110 msgid "" "Slic3r can upload G-code files to OctoPrint. This field should contain the " "API Key required for authentication." @@ -2248,23 +3441,21 @@ msgstr "" "Slic3r може завантажувати файли G-коду в OctoPrint. Це поле має містити ключ " "API, необхідний для аутентифікації." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:908 -msgid "Host or IP" -msgstr "Host або IP" +#: xs/src/libslic3r/PrintConfig.cpp:1123 +msgid "Hostname, IP or URL" +msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:909 +#: xs/src/libslic3r/PrintConfig.cpp:1124 msgid "" "Slic3r can upload G-code files to OctoPrint. This field should contain the " -"hostname or IP address of the OctoPrint instance." +"hostname, IP address or URL of the OctoPrint instance." msgstr "" -"Slic3r може завантажувати файли G-коду в OctoPrint. Це поле повинно містити " -"ім'я хоста або IP-адресу екземпляру OctoPrint." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:915 +#: xs/src/libslic3r/PrintConfig.cpp:1130 msgid "Only retract when crossing perimeters" msgstr "Перервати тільки у разі перетину периметрів" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:916 +#: xs/src/libslic3r/PrintConfig.cpp:1131 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." @@ -2272,7 +3463,7 @@ msgstr "" "Вимикає переривання, коли шлях не перевищує периметри верхніх шарів (і, " "таким чином, будь-який розрядник буде, мабуть, невидимим)." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:923 +#: xs/src/libslic3r/PrintConfig.cpp:1138 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 " @@ -2282,11 +3473,11 @@ msgstr "" "протіканню. Це дозволить автоматично ввімкнути високий плінтус та " "перемістить екструдери за межі такого плінтуса у разі зміни температури." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:930 +#: xs/src/libslic3r/PrintConfig.cpp:1145 msgid "Output filename format" msgstr "Формат вихідного файлу" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:931 +#: xs/src/libslic3r/PrintConfig.cpp:1146 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -2298,11 +3489,11 @@ msgstr "" "можете використовувати [timestamp], [year], [month], [day], [hour], " "[minute], [second], [version], [input_filename] ], [input_filename_base]." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:940 +#: xs/src/libslic3r/PrintConfig.cpp:1155 msgid "Detect bridging perimeters" msgstr "Виявлення висячих периметрів" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:942 +#: xs/src/libslic3r/PrintConfig.cpp:1157 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -2311,14 +3502,34 @@ msgstr "" "використано мостовий потік), щоб застосувати до них швидкість мосту та " "увімкнути вентилятор." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:948 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:966 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:978 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:988 +#: xs/src/libslic3r/PrintConfig.cpp:1163 +msgid "Filament parking position" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1164 +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 "" + +#: xs/src/libslic3r/PrintConfig.cpp:1172 +msgid "Extra loading distance" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1173 +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. " +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1181 xs/src/libslic3r/PrintConfig.cpp:1199 +#: xs/src/libslic3r/PrintConfig.cpp:1211 xs/src/libslic3r/PrintConfig.cpp:1221 msgid "Perimeters" msgstr "Периметри" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:949 +#: xs/src/libslic3r/PrintConfig.cpp:1182 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 " @@ -2329,18 +3540,18 @@ msgstr "" "забезпечення відповідає завданню. Встановити 0, щоб вимкнути регулятор " "прискорення для периметрів." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:957 +#: xs/src/libslic3r/PrintConfig.cpp:1190 msgid "Perimeter extruder" msgstr "Екструдер периметру" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:959 +#: xs/src/libslic3r/PrintConfig.cpp:1192 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" "Екструдер, що використовується при друці периметрів і краю. Перший екструдер " "- 1." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:968 +#: xs/src/libslic3r/PrintConfig.cpp:1201 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 " @@ -2355,14 +3566,14 @@ msgstr "" "діаметр сопла. Якщо він виражений у відсотках (наприклад, 200%), він буде " "обчислюватися за висотою шару." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:980 +#: xs/src/libslic3r/PrintConfig.cpp:1213 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" "Швидкість для периметрів (контури, вертикальні оболонки). Встановити 0 для " "автоматичного використання." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:990 +#: xs/src/libslic3r/PrintConfig.cpp:1223 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 " @@ -2374,23 +3585,49 @@ msgstr "" "які отримують вигоду від більшої кількості периметрів, якщо опція «Додаткові " "периметри» увімкнена." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:994 +#: xs/src/libslic3r/PrintConfig.cpp:1227 msgid "(minimum)" msgstr "(мінімум)" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1014 +#: xs/src/libslic3r/PrintConfig.cpp:1247 +msgid "Printer type" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1248 +msgid "Type of the printer." +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1252 msgid "Printer notes" msgstr "Примітки принтера" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1015 +#: xs/src/libslic3r/PrintConfig.cpp:1253 msgid "You can put your notes regarding the printer here." msgstr "Тут ви можете помістити свої нотатки щодо принтера." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1029 +#: xs/src/libslic3r/PrintConfig.cpp:1261 +msgid "Printer vendor" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1262 +msgid "Name of the printer vendor." +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1266 +msgid "Printer variant" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1267 +msgid "" +"Name of the printer variant. For example, the printer variants may be " +"differentiated by a nozzle diameter." +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1277 msgid "Raft layers" msgstr "Плоскі шари" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1031 +#: xs/src/libslic3r/PrintConfig.cpp:1279 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." @@ -2398,11 +3635,11 @@ msgstr "" "Об'єкт буде піднятий цією кількістю шарів, і під ним буде згенерований " "матеріал підтримки." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1039 +#: xs/src/libslic3r/PrintConfig.cpp:1287 msgid "Resolution" msgstr "Роздільна здатність" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1040 +#: xs/src/libslic3r/PrintConfig.cpp:1288 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -2416,20 +3653,20 @@ msgstr "" "вимкнути будь-яке спрощення та використовувати повну роздільну здатність від " "введення." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1050 +#: xs/src/libslic3r/PrintConfig.cpp:1298 msgid "Minimum travel after retraction" msgstr "Мінімальне переміщення після переривання" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1051 +#: xs/src/libslic3r/PrintConfig.cpp:1299 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "Переривання не спрацьовує, коли переміщення коротше за цю довжину." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1057 +#: xs/src/libslic3r/PrintConfig.cpp:1305 msgid "Retract amount before wipe" msgstr "Кількість переривань перед чищенням" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1058 +#: xs/src/libslic3r/PrintConfig.cpp:1306 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." @@ -2437,26 +3674,25 @@ msgstr "" "Завдяки екструдерам з бандами, має зміст зробити певну кількість переривань " "перед рухами очищення." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1065 +#: xs/src/libslic3r/PrintConfig.cpp:1313 msgid "Retract on layer change" msgstr "Переривання на зміну шарів" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1066 +#: xs/src/libslic3r/PrintConfig.cpp:1314 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" "Цей прапор забезпечує переривання кожного разу, коли виконується переміщення " "Z." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1071 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1080 +#: xs/src/libslic3r/PrintConfig.cpp:1319 xs/src/libslic3r/PrintConfig.cpp:1328 msgid "Length" msgstr "Довжина" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1072 +#: xs/src/libslic3r/PrintConfig.cpp:1320 msgid "Retraction Length" msgstr "Довжина переривання" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1073 +#: xs/src/libslic3r/PrintConfig.cpp:1321 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -2466,16 +3702,15 @@ msgstr "" "кількості (довжина вимірюється на сирого філаменту перед тим, як вона " "надходить у екструдер)." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1075 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1085 +#: xs/src/libslic3r/PrintConfig.cpp:1323 xs/src/libslic3r/PrintConfig.cpp:1333 msgid "mm (zero to disable)" msgstr "мм (0, щоб вимкнути)" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1081 +#: xs/src/libslic3r/PrintConfig.cpp:1329 msgid "Retraction Length (Toolchange)" msgstr "Довжина переривання (зміна інструмента)" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1082 +#: xs/src/libslic3r/PrintConfig.cpp:1330 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 " @@ -2485,11 +3720,11 @@ msgstr "" "назад до вказаної кількості (довжина вимірюється на сирого філаменту перед " "тим, як вона надходить у екструдер)." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1090 +#: xs/src/libslic3r/PrintConfig.cpp:1338 msgid "Lift Z" msgstr "Підняти Z" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1091 +#: xs/src/libslic3r/PrintConfig.cpp:1339 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 " @@ -2499,15 +3734,15 @@ msgstr "" "коли спрацьовує переривання. При використанні декількох екструдерів буде " "розглянуто налаштування лише першого екструдера." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1099 +#: xs/src/libslic3r/PrintConfig.cpp:1347 msgid "Above Z" msgstr "Вище Z" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1100 +#: xs/src/libslic3r/PrintConfig.cpp:1348 msgid "Only lift Z above" msgstr "Тільки піднімати Z" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1101 +#: xs/src/libslic3r/PrintConfig.cpp:1349 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 " @@ -2517,15 +3752,15 @@ msgstr "" "вказаним абсолютним Z. Ви можете налаштувати цей параметр так, що підняття " "буде пропускатися на перших шарах." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1108 +#: xs/src/libslic3r/PrintConfig.cpp:1356 msgid "Below Z" msgstr "Нижче Z" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1109 +#: xs/src/libslic3r/PrintConfig.cpp:1357 msgid "Only lift Z below" msgstr "Тільки опускати Z" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1110 +#: xs/src/libslic3r/PrintConfig.cpp:1358 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 " @@ -2535,12 +3770,11 @@ msgstr "" "вказаного абсолютного Z. Ви можете налаштувати цей параметр так, що підняття " "буде обмежене на перших шарах." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1118 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1126 +#: xs/src/libslic3r/PrintConfig.cpp:1366 xs/src/libslic3r/PrintConfig.cpp:1374 msgid "Extra length on restart" msgstr "Додаткова довжина при перезапуску" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1119 +#: xs/src/libslic3r/PrintConfig.cpp:1367 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." @@ -2548,7 +3782,7 @@ msgstr "" "Коли переривання компенсується після руху переміщення, екструдер буде " "проштовхувати цю додаткову кількість філамента. Цей параметр рідко потрібний." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1127 +#: xs/src/libslic3r/PrintConfig.cpp:1375 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." @@ -2556,21 +3790,19 @@ msgstr "" "Коли переривання компенсується після зміни інструмента, екструдер буде " "проштовхувати цю додаткову кількість філамента." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1134 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1135 +#: xs/src/libslic3r/PrintConfig.cpp:1382 xs/src/libslic3r/PrintConfig.cpp:1383 msgid "Retraction Speed" msgstr "Швидкість переривання" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1136 +#: xs/src/libslic3r/PrintConfig.cpp:1384 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "Швидкість переривання (це стосується лише двигуна екструдера)." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1142 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1143 +#: xs/src/libslic3r/PrintConfig.cpp:1390 xs/src/libslic3r/PrintConfig.cpp:1391 msgid "Deretraction Speed" msgstr "Швидкість після-переривання" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1144 +#: xs/src/libslic3r/PrintConfig.cpp:1392 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 " @@ -2580,55 +3812,71 @@ msgstr "" "лише двигуна екструдера ). Якщо залишити 0, використовується швидкість " "переривання ." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1151 +#: xs/src/libslic3r/PrintConfig.cpp:1399 msgid "Seam position" msgstr "Позиція шва" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1153 +#: xs/src/libslic3r/PrintConfig.cpp:1401 msgid "Position of perimeters starting points." msgstr "Позиція стартових точок периметра." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1169 +#: xs/src/libslic3r/PrintConfig.cpp:1408 +msgid "Random" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1409 +msgid "Nearest" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1410 +msgid "Aligned" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1411 lib/Slic3r/GUI/MainFrame.pm:330 +msgid "Rear" +msgstr "Ззаду" + +#: xs/src/libslic3r/PrintConfig.cpp:1417 msgid "Direction" msgstr "Напрямок" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1171 +#: xs/src/libslic3r/PrintConfig.cpp:1419 msgid "Preferred direction of the seam" msgstr "Бажаний напрямок шва" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1172 +#: xs/src/libslic3r/PrintConfig.cpp:1420 msgid "Seam preferred direction" msgstr "Бажаний напрямок шва" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1180 +#: xs/src/libslic3r/PrintConfig.cpp:1428 msgid "Jitter" msgstr "Джиттер" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1182 +#: xs/src/libslic3r/PrintConfig.cpp:1430 msgid "Seam preferred direction jitter" msgstr "Бажаний напрямок шва джитера" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1183 +#: xs/src/libslic3r/PrintConfig.cpp:1431 msgid "Preferred direction of the seam - jitter" msgstr "Бажаний напрямок шва - джитера" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1194 +#: xs/src/libslic3r/PrintConfig.cpp:1442 msgid "USB/serial port for printer connection." msgstr "USB / послідовний порт для підключення принтера." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1202 +#: xs/src/libslic3r/PrintConfig.cpp:1450 msgid "Serial port speed" msgstr "Швидкість послідовного порту" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1203 +#: xs/src/libslic3r/PrintConfig.cpp:1451 msgid "Speed (baud) of USB/serial port for printer connection." msgstr "Швидкість (бод) USB / послідовного порту для підключення принтера." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1212 +#: xs/src/libslic3r/PrintConfig.cpp:1460 msgid "Distance from object" msgstr "Відстань від об'єкту" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1213 +#: xs/src/libslic3r/PrintConfig.cpp:1461 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." @@ -2636,11 +3884,11 @@ msgstr "" "Відстань між плінтусом та об'єктом (-ами). Установіть 0, щоб прикріпити " "плінтус до об'єкта (-ів) і отримати край для кращої адгезії." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1221 +#: xs/src/libslic3r/PrintConfig.cpp:1469 msgid "Skirt height" msgstr "Висота плінтусу" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1222 +#: xs/src/libslic3r/PrintConfig.cpp:1470 msgid "" "Height of skirt expressed in layers. Set this to a tall value to use skirt " "as a shield against drafts." @@ -2648,15 +3896,15 @@ msgstr "" "Висота плінтусу виражена в шарах. Встановіть це значення на високе, щоб " "використовувати плінтус як щит проти протягів." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1229 +#: xs/src/libslic3r/PrintConfig.cpp:1477 msgid "Loops (minimum)" msgstr "Петлі (мінімум)" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1230 +#: xs/src/libslic3r/PrintConfig.cpp:1478 msgid "Skirt Loops" msgstr "Петлі плінтусу" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1231 +#: xs/src/libslic3r/PrintConfig.cpp:1479 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 " @@ -2666,11 +3914,11 @@ msgstr "" "довжина екструзії\", кількість петель може бути більшою, ніж налаштована " "тут. Установіть 0, щоб повністю вимкнути плінтус." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1239 +#: xs/src/libslic3r/PrintConfig.cpp:1487 msgid "Slow down if layer print time is below" msgstr "Уповільнення, якщо час друку шару нижче" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1240 +#: xs/src/libslic3r/PrintConfig.cpp:1488 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." @@ -2678,11 +3926,11 @@ msgstr "" "Якщо час друку шару оцінюється нижче цієї кількості секунд, швидкість друку " "рухів зменшуватиметься, щоб збільшити тривалість до цього значення." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1250 +#: xs/src/libslic3r/PrintConfig.cpp:1498 msgid "Small perimeters" msgstr "Маленькі периметри" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1252 +#: xs/src/libslic3r/PrintConfig.cpp:1500 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 " @@ -2693,11 +3941,11 @@ msgstr "" "вона буде розрахована за наведеним вище параметром швидкості. Встановити 0 " "для автоматичного використання." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1262 +#: xs/src/libslic3r/PrintConfig.cpp:1510 msgid "Solid infill threshold area" msgstr "Порогова площа суцільного наповнення" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1264 +#: xs/src/libslic3r/PrintConfig.cpp:1512 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." @@ -2705,23 +3953,23 @@ msgstr "" "Встановити суцільне заповнення для регіонів, що мають площу, меншу " "зазначеного порогу." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1265 +#: xs/src/libslic3r/PrintConfig.cpp:1513 msgid "mm²" msgstr "мм²" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1271 +#: xs/src/libslic3r/PrintConfig.cpp:1519 msgid "Solid infill extruder" msgstr "Екструдер суцільних наповнень" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1273 +#: xs/src/libslic3r/PrintConfig.cpp:1521 msgid "The extruder to use when printing solid infill." msgstr "Екструдер для друку суцільних наповнень." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1279 +#: xs/src/libslic3r/PrintConfig.cpp:1527 msgid "Solid infill every" msgstr "Суцільне наповнення кожні" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1281 +#: xs/src/libslic3r/PrintConfig.cpp:1529 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 " @@ -2733,14 +3981,13 @@ msgstr "" "Slic3r автоматично вибере максимально можливу кількість шарів для " "комбінування відповідно до діаметра сопла та висоти шару." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1291 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1301 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:142 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:84 +#: xs/src/libslic3r/PrintConfig.cpp:1539 xs/src/libslic3r/PrintConfig.cpp:1549 +#: xs/src/libslic3r/GCode/PreviewData.cpp:167 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:94 msgid "Solid infill" msgstr "Суцільне наповнення" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1293 +#: xs/src/libslic3r/PrintConfig.cpp:1541 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, " @@ -2753,7 +4000,7 @@ msgstr "" "діаметр сопла. Якщо він виражений у відсотках (наприклад, 90%), він буде " "обчислюватися за висотою шару." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1303 +#: xs/src/libslic3r/PrintConfig.cpp:1551 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -2764,16 +4011,16 @@ msgstr "" "швидкості заповнення за замовчуванням. Встановити 0 для автоматичного " "використання." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1315 +#: xs/src/libslic3r/PrintConfig.cpp:1563 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" "Кількість суцільних шарів для генерування на верхній і нижній поверхні." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1322 +#: xs/src/libslic3r/PrintConfig.cpp:1570 msgid "Spiral vase" msgstr "Спіральна ваза" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1323 +#: xs/src/libslic3r/PrintConfig.cpp:1571 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, " @@ -2788,11 +4035,11 @@ msgstr "" "яку кількість нижніх суцільних шарів, а також петель плінтусу/краю. Це не " "спрацює при друку більше, ніж одного об'єкта." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1332 +#: xs/src/libslic3r/PrintConfig.cpp:1580 msgid "Temperature variation" msgstr "Варіація температури" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1333 +#: xs/src/libslic3r/PrintConfig.cpp:1581 msgid "" "Temperature difference to be applied when an extruder is not active. Enables " "a full-height \"sacrificial\" skirt on which the nozzles are periodically " @@ -2801,7 +4048,7 @@ msgstr "" "Відмітка температури, яка застосовується, коли екструдер не активний. Вмикає " "\"жертовний\" плінтус на повній висоті, на які періодично очищуються сопла." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1343 +#: xs/src/libslic3r/PrintConfig.cpp:1591 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -2820,7 +4067,7 @@ msgstr "" "заповнювачі для всіх параметрів Slic3r, щоб ви могли поставити команду " "\"M109 S [first_layer_temperature]\" де завгодно." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1358 +#: xs/src/libslic3r/PrintConfig.cpp:1606 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 " @@ -2841,27 +4088,27 @@ msgstr "" "де завгодно. Якщо у вас є кілька екструдерів, G-code обробляється в порядку " "екструдерів." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1373 +#: xs/src/libslic3r/PrintConfig.cpp:1621 msgid "Single Extruder Multi Material" msgstr "Одиночний екструдер кількох матеріалів" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1374 +#: xs/src/libslic3r/PrintConfig.cpp:1622 msgid "The printer multiplexes filaments into a single hot end." msgstr "Принтер мультиплексує нитки в єдиний гарячий кінець." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1379 +#: xs/src/libslic3r/PrintConfig.cpp:1627 msgid "Generate support material" msgstr "Створити підтримуючий матеріал" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1381 +#: xs/src/libslic3r/PrintConfig.cpp:1629 msgid "Enable support material generation." msgstr "Увімкнути генерацію матеріалів підтримки." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1386 +#: xs/src/libslic3r/PrintConfig.cpp:1634 msgid "XY separation between an object and its support" msgstr "Розподіл XY між об'єктом та його підтримкою" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1388 +#: xs/src/libslic3r/PrintConfig.cpp:1636 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." @@ -2869,11 +4116,11 @@ msgstr "" "Розподіл XY між об'єктом та його підтримкою. Якщо вона виражена у відсотках " "(наприклад, 50%), вона буде розрахована за зовнішньою шириною периметру." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1398 +#: xs/src/libslic3r/PrintConfig.cpp:1646 msgid "Pattern angle" msgstr "Кут шаблону" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1400 +#: xs/src/libslic3r/PrintConfig.cpp:1648 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." @@ -2881,11 +4128,7 @@ msgstr "" "Використовуйте цей параметр, щоб повернути шаблон підтримуючого матеріалу на " "горизонтальній площині." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1408 -msgid "Support on build plate only" -msgstr "Підтримка тільки на збірній пластині" - -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1410 +#: xs/src/libslic3r/PrintConfig.cpp:1658 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -2893,11 +4136,11 @@ msgstr "" "Створити підтримку лише, для того, що лежить на збірній пластині. Не " "створювати підтримку на друк." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1416 +#: xs/src/libslic3r/PrintConfig.cpp:1664 msgid "Contact Z distance" msgstr "Контактна відстань по осі Z" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1418 +#: xs/src/libslic3r/PrintConfig.cpp:1666 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 " @@ -2907,11 +4150,19 @@ msgstr "" "Встановлення значення 0 також захистить Slic3r від використання потоку " "мостів та швидкості для першого шару об'єктну." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1431 +#: xs/src/libslic3r/PrintConfig.cpp:1674 +msgid "soluble" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1675 +msgid "detachable" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1679 msgid "Enforce support for the first" msgstr "Забезпечити підтримку першого(их)" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1433 +#: xs/src/libslic3r/PrintConfig.cpp:1681 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -2924,15 +4175,15 @@ msgstr "" "більшої адгезії об'єктів, що мають дуже тонкий або поганий слід на збірній " "пластині." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1439 +#: xs/src/libslic3r/PrintConfig.cpp:1687 msgid "Enforce support for the first n layers" msgstr "Забезпечити підтримку перших n шарів" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1444 +#: xs/src/libslic3r/PrintConfig.cpp:1692 msgid "Support material/raft/skirt extruder" msgstr "Підтримуючий матеріал / пліт / плінтус екструдеру" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1446 +#: xs/src/libslic3r/PrintConfig.cpp:1694 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -2940,7 +4191,7 @@ msgstr "" "Екструдер для друку підтримуючого матеріалу, плоту та плінтусу (1+, 0 для " "використання поточного екструдера, щоб мінімізувати зміни інструменту)." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1455 +#: xs/src/libslic3r/PrintConfig.cpp:1703 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, " @@ -2953,21 +4204,21 @@ msgstr "" "Якщо він виражений у відсотках (наприклад, 90%), він буде обчислюватися за " "висотою шару." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1463 +#: xs/src/libslic3r/PrintConfig.cpp:1711 msgid "Interface loops" msgstr "Інтерфейсні петлі" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1465 +#: xs/src/libslic3r/PrintConfig.cpp:1713 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" "Закрити петлями верхній контактний шар підтримки. За замовчанням вимкнено." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1470 +#: xs/src/libslic3r/PrintConfig.cpp:1718 msgid "Support material/raft interface extruder" msgstr "Екструдер інтерфейсу підтримуючого матеріалу / плоту" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1472 +#: xs/src/libslic3r/PrintConfig.cpp:1720 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." @@ -2976,11 +4227,11 @@ msgstr "" "(1+, 0 для використання поточного екструдера, щоб звести до мінімуму зміни " "інструменту). Це також впливає на плот." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1479 +#: xs/src/libslic3r/PrintConfig.cpp:1727 msgid "Interface layers" msgstr "Інтерфейсні шари" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1481 +#: xs/src/libslic3r/PrintConfig.cpp:1729 msgid "" "Number of interface layers to insert between the object(s) and support " "material." @@ -2988,23 +4239,23 @@ msgstr "" "Кількість шарів інтерфейсу для вставки між об'єктом(ами) та підтримуючим " "матеріалом." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1488 +#: xs/src/libslic3r/PrintConfig.cpp:1736 msgid "Interface pattern spacing" msgstr "Відстань між шаблонами інтерфейсу" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1490 +#: xs/src/libslic3r/PrintConfig.cpp:1738 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" "Відстань між інтерфейсними лініями. Встановити 0, щоб отримати надійний " "інтерфейс." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1497 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:148 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:90 +#: xs/src/libslic3r/PrintConfig.cpp:1745 +#: xs/src/libslic3r/GCode/PreviewData.cpp:173 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:100 msgid "Support material interface" msgstr "Інтерфейс підтримуючого матеріалу" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1499 +#: xs/src/libslic3r/PrintConfig.cpp:1747 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " @@ -3014,31 +4265,35 @@ msgstr "" "виражена у відсотках (наприклад, 50%), вона буде розрахована за швидкістю " "матеріалу підтримки." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1508 +#: xs/src/libslic3r/PrintConfig.cpp:1756 msgid "Pattern" msgstr "Шаблон" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1510 +#: xs/src/libslic3r/PrintConfig.cpp:1758 msgid "Pattern used to generate support material." msgstr "Шаблон, що використовується для створення матеріалу підтримки." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1524 +#: xs/src/libslic3r/PrintConfig.cpp:1765 +msgid "Rectilinear grid" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1770 msgid "Pattern spacing" msgstr "Відстань між шаблонами" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1526 +#: xs/src/libslic3r/PrintConfig.cpp:1772 msgid "Spacing between support material lines." msgstr "Відстань між лініями підтримуючого матеріалу." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1535 +#: xs/src/libslic3r/PrintConfig.cpp:1781 msgid "Speed for printing support material." msgstr "Швидкість друку підтримуючого матеріалу." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1542 +#: xs/src/libslic3r/PrintConfig.cpp:1788 msgid "Synchronize with object layers" msgstr "Синхронізувати з шарами об'єкту" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1544 +#: xs/src/libslic3r/PrintConfig.cpp:1790 msgid "" "Synchronize support layers with the object print layers. This is useful with " "multi-material printers, where the extruder switch is expensive." @@ -3047,11 +4302,11 @@ msgstr "" "використовувати з багато-матеріальними принтерами, де перемикання " "екструдерів -затратна процедура." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1550 +#: xs/src/libslic3r/PrintConfig.cpp:1796 msgid "Overhang threshold" msgstr "Порог нависання" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1552 +#: xs/src/libslic3r/PrintConfig.cpp:1798 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -3065,11 +4320,11 @@ msgstr "" "площини), який ви можете надрукувати без підтримуючого матеріалу. Встановити " "0 для автоматичного визначення (рекомендовано)." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1564 +#: xs/src/libslic3r/PrintConfig.cpp:1810 msgid "With sheath around the support" msgstr "З оболонкою навколо підтримки" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1566 +#: xs/src/libslic3r/PrintConfig.cpp:1812 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." @@ -3077,7 +4332,7 @@ msgstr "" "Додати оболонку (одну лінію периметра) навколо базової підтримки. Це робить " "підтримку більш надійною, але її важче видалити." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1573 +#: xs/src/libslic3r/PrintConfig.cpp:1819 msgid "" "Extruder temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output." @@ -3085,15 +4340,15 @@ msgstr "" "Температура екструдеру для шарів після першого. Установіть 0, щоб вимкнути " "команди керування температурою на виході." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1576 +#: xs/src/libslic3r/PrintConfig.cpp:1822 msgid "Temperature" msgstr "Температура" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1582 +#: xs/src/libslic3r/PrintConfig.cpp:1828 msgid "Detect thin walls" msgstr "Виявлення тонких стін" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1584 +#: xs/src/libslic3r/PrintConfig.cpp:1830 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." @@ -3101,11 +4356,11 @@ msgstr "" "Визначення одношарової стінки (частини, де два екструзії не підходять, і нам " "потрібно згорнути їх у єдиний слід)." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1590 +#: xs/src/libslic3r/PrintConfig.cpp:1836 msgid "Threads" msgstr "Нитки" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1591 +#: xs/src/libslic3r/PrintConfig.cpp:1837 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." @@ -3113,7 +4368,7 @@ msgstr "" "Нитки використовуються для паралелізації довготривалих завдань. Оптимальна " "кількість ниток трохи перевищує кількість доступних ядер / процесорів." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1603 +#: xs/src/libslic3r/PrintConfig.cpp:1849 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 " @@ -3123,14 +4378,13 @@ msgstr "" "екструдера. Зверніть увагу, що ви можете використовувати змінні-заповнювачі " "для всіх параметрів Slic3r, а також [previous_extruder] і [next_extruder]." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1613 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1624 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:143 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:85 +#: xs/src/libslic3r/PrintConfig.cpp:1859 xs/src/libslic3r/PrintConfig.cpp:1870 +#: xs/src/libslic3r/GCode/PreviewData.cpp:168 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:95 msgid "Top solid infill" msgstr "Верхнє суцільне наповнення" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1615 +#: xs/src/libslic3r/PrintConfig.cpp:1861 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 " @@ -3146,7 +4400,7 @@ msgstr "" "виражена у відсотках (наприклад, 90%), вона буде обчислюватися за висотою " "шару." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1626 +#: xs/src/libslic3r/PrintConfig.cpp:1872 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 " @@ -3160,33 +4414,31 @@ msgstr "" "відсотком (наприклад, 80%) звищення швидкості щільного наповнення . " "Встановити 0 для автоматичного обчислення." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1638 -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:369 +#: xs/src/libslic3r/PrintConfig.cpp:1884 lib/Slic3r/GUI/MainFrame.pm:327 msgid "Top" msgstr "Зверху" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1640 +#: xs/src/libslic3r/PrintConfig.cpp:1886 msgid "Number of solid layers to generate on top surfaces." msgstr "Кількість суцільних шарів, генерованих на верхніх поверхнях." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1642 +#: xs/src/libslic3r/PrintConfig.cpp:1888 msgid "Top solid layers" msgstr "Верхні суцільні шари" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1647 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:95 +#: xs/src/libslic3r/PrintConfig.cpp:1893 lib/Slic3r/GUI/Plater/3DPreview.pm:105 msgid "Travel" msgstr "Пересування" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1648 +#: xs/src/libslic3r/PrintConfig.cpp:1894 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "Швидкість рухів пересування (стрибки між далекими точками екструзії)." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1656 +#: xs/src/libslic3r/PrintConfig.cpp:1902 msgid "Use firmware retraction" msgstr "Використовувати відмову прошивки" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1657 +#: xs/src/libslic3r/PrintConfig.cpp:1903 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." @@ -3194,11 +4446,11 @@ msgstr "" "Цей експериментальний параметр використовує команди G10 і G11 для обробки " "відмови прошивки. Останнім часом це підтримується лише Marlin-ом." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1663 +#: xs/src/libslic3r/PrintConfig.cpp:1909 msgid "Use relative E distances" msgstr "Використовувати відносні E відстані" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1664 +#: xs/src/libslic3r/PrintConfig.cpp:1910 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -3206,11 +4458,11 @@ msgstr "" "Якщо ваша прошивка потребує відносне значення E, зазначте це, інакше залиште " "його незазначеним. Більшість прошивок використовують абсолютні значення." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1670 +#: xs/src/libslic3r/PrintConfig.cpp:1916 msgid "Use volumetric E" msgstr "Використовувати об'ємний Е" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1671 +#: xs/src/libslic3r/PrintConfig.cpp:1917 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -3226,11 +4478,11 @@ msgstr "" "режим і використовувати діаметр нитки, пов'язаний з вибраною ниткою в " "Slic3r. Останнім часом це підтримується лише Marlin-ом." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1681 +#: xs/src/libslic3r/PrintConfig.cpp:1927 msgid "Enable variable layer height feature" msgstr "Увімкнути функцію шарів змінної висоти" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1682 +#: xs/src/libslic3r/PrintConfig.cpp:1928 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." @@ -3238,11 +4490,11 @@ msgstr "" "Деякі принтери або налаштування принтера можуть мати труднощі з друкуванням " "шарів змінної висоти. Увімкнено за умовчанням." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1688 +#: xs/src/libslic3r/PrintConfig.cpp:1934 msgid "Wipe while retracting" msgstr "Вичіщувати при відмові" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1689 +#: xs/src/libslic3r/PrintConfig.cpp:1935 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." @@ -3250,7 +4502,7 @@ msgstr "" "Цей прапорець перемістить сопло під час відмови, щоб мінімізувати можливість " "утворення краплі на витікаючих екструдерах." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1696 +#: xs/src/libslic3r/PrintConfig.cpp:1942 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." @@ -3259,50 +4511,98 @@ msgstr "" "екструдерів при зміні інструмента. Екструдуйте надлишок матеріалу до " "вичищуючої вежі." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1702 +#: xs/src/libslic3r/PrintConfig.cpp:1948 +msgid "Purging volumes - load/unload volumes" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1949 +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 "" + +#: xs/src/libslic3r/PrintConfig.cpp:1956 +msgid "Purging volumes - matrix" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1957 +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 "" + +#: xs/src/libslic3r/PrintConfig.cpp:1967 msgid "Position X" msgstr "Позиція X" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1703 +#: xs/src/libslic3r/PrintConfig.cpp:1968 msgid "X coordinate of the left front corner of a wipe tower" msgstr "X координата лівого переднього кута вичищуючої вежі" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1709 +#: xs/src/libslic3r/PrintConfig.cpp:1974 msgid "Position Y" msgstr "Позиція Y" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1710 +#: xs/src/libslic3r/PrintConfig.cpp:1975 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "Y координата лівого переднього кута вичищуючої вежі" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1716 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:70 +#: xs/src/libslic3r/PrintConfig.cpp:1981 lib/Slic3r/GUI/Plater/3DPreview.pm:76 msgid "Width" msgstr "Ширина" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1717 +#: xs/src/libslic3r/PrintConfig.cpp:1982 msgid "Width of a wipe tower" msgstr "Ширина вичищуючої вежі" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1723 -msgid "Per color change depth" -msgstr "Змінити глибину за кольором" - -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1724 -msgid "" -"Depth of a wipe color per color change. For N colors, there will be maximum " -"(N-1) tool switches performed, therefore the total depth of the wipe tower " -"will be (N-1) times this value." +#: xs/src/libslic3r/PrintConfig.cpp:1988 +msgid "Wipe tower rotation angle" msgstr "" -"Глибина вичищення кольору для кожної зміни кольору. Для N кольорів буде " -"виконано максимум (N-1) інструментальних перемикачів, тому загальна глибина " -"вичищуючої вежі буде (N-1) разів до цього значення." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1732 +#: xs/src/libslic3r/PrintConfig.cpp:1989 +msgid "Wipe tower rotation angle with respect to x-axis " +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1990 +msgid "degrees" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1996 +msgid "Purging into infill" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:1997 +msgid "" +"Wiping after toolchange will be preferentially done inside infills. This " +"lowers the amount of waste but may result in longer print time due to " +"additional travel moves." +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:2005 +msgid "Purging into objects" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:2006 +msgid "" +"Objects will be used to wipe 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 "" + +#: xs/src/libslic3r/PrintConfig.cpp:2013 +msgid "Maximal bridging distance" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:2014 +msgid "Maximal distance between supports on sparse infill sections. " +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:2020 msgid "XY Size Compensation" msgstr "Зрівноваження розміру за XY" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1734 +#: xs/src/libslic3r/PrintConfig.cpp:2022 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-" @@ -3312,11 +4612,11 @@ msgstr "" "(негативний - внутрішній, позитивний - ззовнішній). Це може бути корисним " "для точного налаштування розмірів отворів." -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1742 +#: xs/src/libslic3r/PrintConfig.cpp:2030 msgid "Z offset" msgstr "Зміщення Z" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1743 +#: xs/src/libslic3r/PrintConfig.cpp:2031 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 " @@ -3328,678 +4628,608 @@ msgstr "" "наприклад, якщо ваш кінцевий нуль фактично залишає сопло на 0,3 мм від " "полотна друку, встановіть його на значення -0,3 (або виправте ваш endstop)." -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:137 -msgid "None" -msgstr "Жодне" - -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:138 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:80 +#: xs/src/libslic3r/GCode/PreviewData.cpp:163 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:90 msgid "Perimeter" msgstr "Периметр" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:139 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:81 +#: xs/src/libslic3r/GCode/PreviewData.cpp:164 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:91 msgid "External perimeter" msgstr "Зовнішній периметр" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:140 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:82 +#: xs/src/libslic3r/GCode/PreviewData.cpp:165 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:92 msgid "Overhang perimeter" msgstr "Нависаючий периметр" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:141 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:83 +#: xs/src/libslic3r/GCode/PreviewData.cpp:166 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:93 msgid "Internal infill" msgstr "Внутрішнє наповнення" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:144 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:86 +#: xs/src/libslic3r/GCode/PreviewData.cpp:169 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:96 msgid "Bridge infill" msgstr "Мостове наповнення" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:151 +#: xs/src/libslic3r/GCode/PreviewData.cpp:176 msgid "Mixed" msgstr "" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:330 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:68 +#: xs/src/libslic3r/GCode/PreviewData.cpp:367 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:74 msgid "Feature type" msgstr "Тип ознаки" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:332 +#: xs/src/libslic3r/GCode/PreviewData.cpp:369 msgid "Height (mm)" msgstr "Висота (мм)" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:334 +#: xs/src/libslic3r/GCode/PreviewData.cpp:371 msgid "Width (mm)" msgstr "Ширина (мм)" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:336 +#: xs/src/libslic3r/GCode/PreviewData.cpp:373 msgid "Speed (mm/s)" msgstr "Швидкість (мм/с)" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:338 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:72 +#: xs/src/libslic3r/GCode/PreviewData.cpp:375 +msgid "Volumetric flow rate (mm3/s)" +msgstr "" + +#: xs/src/libslic3r/GCode/PreviewData.cpp:377 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:79 msgid "Tool" msgstr "Інструмент" -#: c:\src\Slic3r\lib\Slic3r\GUI.pm:286 +#: lib/Slic3r/GUI.pm:308 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Виберіть один чи кілька файлів (STL/OBJ/AMF/PRUSA):" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:66 +#: lib/Slic3r/GUI/MainFrame.pm:66 msgid "Version " msgstr "Версія " -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:66 +#: lib/Slic3r/GUI/MainFrame.pm:66 msgid "" " - Remember to check for updates at http://github.com/prusa3d/slic3r/releases" msgstr " - Пам'ятайте оновлювати з http://github.com/prusa3d/slic3r/releases" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:118 +#: lib/Slic3r/GUI/MainFrame.pm:135 msgid "Plater" msgstr "Платер" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:120 +#: lib/Slic3r/GUI/MainFrame.pm:137 msgid "Controller" msgstr "Контролер" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:192 -msgid "No Bonjour device found" -msgstr "Немає пристрою Bonjour" +#: lib/Slic3r/GUI/MainFrame.pm:215 +msgid "Open STL/OBJ/AMF/3MF…\tCtrl+O" +msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:192 -msgid "Device Browser" -msgstr "Браузер(список) пристроїв" - -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:211 -msgid "Connection to OctoPrint works correctly." -msgstr "Підключення до OctoPrint працює правильно." - -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:214 -msgid "I wasn't able to connect to OctoPrint (" -msgstr "Не можливо підключитися до OctoPrint (" - -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:215 -msgid "). Check hostname and OctoPrint version (at least 1.1.0 is required)." -msgstr ") Перевірте версію хоста та OctoPrint (принаймні 1.1.0 - обов'язкова)." - -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:251 -msgid "Open STL/OBJ/AMF…\tCtrl+O" -msgstr "Відкрити STL/OBJ/AMF…\tCtrl+O" - -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:251 +#: lib/Slic3r/GUI/MainFrame.pm:215 msgid "Open a model" msgstr "Відкрити модель" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:254 +#: lib/Slic3r/GUI/MainFrame.pm:218 msgid "&Load Config…\tCtrl+L" msgstr "Завантажити конфігурацію... \tCtrl+L" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:254 +#: lib/Slic3r/GUI/MainFrame.pm:218 msgid "Load exported configuration file" msgstr "Завантажити експортований файл конфігурації" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:257 +#: lib/Slic3r/GUI/MainFrame.pm:221 msgid "&Export Config…\tCtrl+E" msgstr "Експортувати конфігурацію...\tCtrl+E" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:257 +#: lib/Slic3r/GUI/MainFrame.pm:221 msgid "Export current configuration to file" msgstr "Експортувати поточну конфігурацію в файл" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:260 +#: lib/Slic3r/GUI/MainFrame.pm:224 msgid "&Load Config Bundle…" msgstr "Завантажити пакет конфігурації…" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:260 +#: lib/Slic3r/GUI/MainFrame.pm:224 msgid "Load presets from a bundle" msgstr "Завантажити налаштування з пакету" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:263 +#: lib/Slic3r/GUI/MainFrame.pm:227 msgid "&Export Config Bundle…" msgstr "Експортувати пакет налаштування…" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:263 +#: lib/Slic3r/GUI/MainFrame.pm:227 msgid "Export all presets to file" msgstr "Експортувати всі налаштування у файл" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:268 +#: lib/Slic3r/GUI/MainFrame.pm:232 msgid "Q&uick Slice…\tCtrl+U" msgstr "Швидке нарізання…\tCtrl+U" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:268 +#: lib/Slic3r/GUI/MainFrame.pm:232 msgid "Slice a file into a G-code" msgstr "Нарізати файл у G-код" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:274 +#: lib/Slic3r/GUI/MainFrame.pm:238 msgid "Quick Slice and Save &As…\tCtrl+Alt+U" msgstr "Швидко нарізати та зберегти як…\tCtrl+Alt+U" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:274 +#: lib/Slic3r/GUI/MainFrame.pm:238 msgid "Slice a file into a G-code, save as" msgstr "Нарізати файл у G-код, зберегти як" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:280 +#: lib/Slic3r/GUI/MainFrame.pm:244 msgid "&Repeat Last Quick Slice\tCtrl+Shift+U" msgstr "Повторити останнє швидке нарізання\tCtrl+Shift+U" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:280 +#: lib/Slic3r/GUI/MainFrame.pm:244 msgid "Repeat last quick slice" msgstr "Повторити останнє швидке нарізання" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:287 +#: lib/Slic3r/GUI/MainFrame.pm:251 msgid "Slice to SV&G…\tCtrl+G" msgstr "Нарізати в SV&G…\tCtrl+G" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:287 +#: lib/Slic3r/GUI/MainFrame.pm:251 msgid "Slice file to a multi-layer SVG" msgstr "Нарізати файл в багатошаровий SVG" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:291 +#: lib/Slic3r/GUI/MainFrame.pm:255 msgid "(&Re)Slice Now\tCtrl+S" msgstr "(Пере)Нарізати зараз\tCtrl+S" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:291 +#: lib/Slic3r/GUI/MainFrame.pm:255 msgid "Start new slicing process" msgstr "Почати новий процес нарізання" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:294 +#: lib/Slic3r/GUI/MainFrame.pm:258 msgid "Repair STL file…" msgstr "Відновити STL-файл…" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:294 +#: lib/Slic3r/GUI/MainFrame.pm:258 msgid "Automatically repair an STL file" msgstr "Автоматично відновити як STL-файл" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:299 -msgid "Preferences…\tCtrl+," -msgstr "Преференції…\tCtrl+," - -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:299 -msgid "Application preferences" -msgstr "Преференції застосування" - -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:304 +#: lib/Slic3r/GUI/MainFrame.pm:262 msgid "&Quit" msgstr "Вихід" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:304 +#: lib/Slic3r/GUI/MainFrame.pm:262 msgid "Quit Slic3r" msgstr "Вийти зі Slic3r" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:314 +#: lib/Slic3r/GUI/MainFrame.pm:272 msgid "Export G-code..." msgstr "Експорт G-code..." -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:314 +#: lib/Slic3r/GUI/MainFrame.pm:272 msgid "Export current plate as G-code" msgstr "Експорт поточної пластини як G-код" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:317 +#: lib/Slic3r/GUI/MainFrame.pm:275 msgid "Export plate as STL..." msgstr "Експорт пластини як STL..." -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:317 +#: lib/Slic3r/GUI/MainFrame.pm:275 msgid "Export current plate as STL" msgstr "Експорт поточної пластини як STL" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:320 +#: lib/Slic3r/GUI/MainFrame.pm:278 msgid "Export plate as AMF..." msgstr "Експорт пластини як AMF..." -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:320 +#: lib/Slic3r/GUI/MainFrame.pm:278 msgid "Export current plate as AMF" msgstr "Експорт поточної пластини як AMF" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:323 +#: lib/Slic3r/GUI/MainFrame.pm:281 msgid "Export plate as 3MF..." msgstr "Експорт пластини як 3MF..." -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:323 +#: lib/Slic3r/GUI/MainFrame.pm:281 msgid "Export current plate as 3MF" msgstr "Експорт поточної пластини як 3MF" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:336 +#: lib/Slic3r/GUI/MainFrame.pm:294 msgid "Select &Plater Tab\tCtrl+1" msgstr "Вибрати вкладку Plater\tCtrl+1" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:336 +#: lib/Slic3r/GUI/MainFrame.pm:294 msgid "Show the plater" msgstr "Показати plater" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:342 +#: lib/Slic3r/GUI/MainFrame.pm:300 msgid "Select &Controller Tab\tCtrl+T" msgstr "Вибрати вкладку Контроллер" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:342 +#: lib/Slic3r/GUI/MainFrame.pm:300 msgid "Show the printer controller" msgstr "Показати контролер принтера" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:350 +#: lib/Slic3r/GUI/MainFrame.pm:308 msgid "Select P&rint Settings Tab\tCtrl+2" msgstr "Вибрати вкладку параметрів друку\tCtrl+2" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:350 +#: lib/Slic3r/GUI/MainFrame.pm:308 msgid "Show the print settings" msgstr "Показати параметри друку" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:353 +#: lib/Slic3r/GUI/MainFrame.pm:311 msgid "Select &Filament Settings Tab\tCtrl+3" msgstr "Вибрати вкладку параметрів філаменту\tCtrl+3" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:353 +#: lib/Slic3r/GUI/MainFrame.pm:311 msgid "Show the filament settings" msgstr "Показати параметри філаменту" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:356 +#: lib/Slic3r/GUI/MainFrame.pm:314 msgid "Select Print&er Settings Tab\tCtrl+4" msgstr "Вибрати вкладку параметрів принтеру\tCtrl+4" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:356 +#: lib/Slic3r/GUI/MainFrame.pm:314 msgid "Show the printer settings" msgstr "Показати параметри принтеру" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:368 +#: lib/Slic3r/GUI/MainFrame.pm:326 msgid "Iso" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:368 +#: lib/Slic3r/GUI/MainFrame.pm:326 msgid "Iso View" msgstr "Вид Iso" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:369 +#: lib/Slic3r/GUI/MainFrame.pm:327 msgid "Top View" msgstr "Вид зверху" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:370 +#: lib/Slic3r/GUI/MainFrame.pm:328 msgid "Bottom View" msgstr "Вид знизу" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:371 +#: lib/Slic3r/GUI/MainFrame.pm:329 msgid "Front" msgstr "Спереду" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:371 +#: lib/Slic3r/GUI/MainFrame.pm:329 msgid "Front View" msgstr "Вид спереду" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:372 -msgid "Rear" -msgstr "Ззаду" - -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:372 +#: lib/Slic3r/GUI/MainFrame.pm:330 msgid "Rear View" msgstr "Вид ззаду" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:373 +#: lib/Slic3r/GUI/MainFrame.pm:331 msgid "Left" msgstr "З лівого боку" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:373 +#: lib/Slic3r/GUI/MainFrame.pm:331 msgid "Left View" msgstr "Вид з лівого боку" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:374 +#: lib/Slic3r/GUI/MainFrame.pm:332 msgid "Right" msgstr "З правого боку" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:374 +#: lib/Slic3r/GUI/MainFrame.pm:332 msgid "Right View" msgstr "Вид з правого боку" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:380 -msgid "&Configuration " -msgstr "Конфігурація " - -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:380 -msgid "Run Configuration " -msgstr "Запустити конфігурацію " - -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:385 +#: lib/Slic3r/GUI/MainFrame.pm:338 msgid "Prusa 3D Drivers" msgstr "Драйвери Prusa3D" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:385 +#: lib/Slic3r/GUI/MainFrame.pm:338 msgid "Open the Prusa3D drivers download page in your browser" msgstr "Відкрити сторінку завантаження драйверів Prusa3D у своєму браузері" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:388 +#: lib/Slic3r/GUI/MainFrame.pm:341 msgid "Prusa Edition Releases" msgstr "Випуски(релізи) Prusa Edition" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:388 +#: lib/Slic3r/GUI/MainFrame.pm:341 msgid "Open the Prusa Edition releases page in your browser" msgstr "Відкрити сторінку релізів Prusa Edition у своєму браузері" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:395 +#: lib/Slic3r/GUI/MainFrame.pm:348 msgid "Slic3r &Website" msgstr "Веб-сайт Slic3r" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:395 +#: lib/Slic3r/GUI/MainFrame.pm:348 msgid "Open the Slic3r website in your browser" msgstr "Відкрити сторінку Slic3r у своєму браузері" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:398 +#: lib/Slic3r/GUI/MainFrame.pm:351 msgid "Slic3r &Manual" msgstr "Посібник до Slic3r" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:398 +#: lib/Slic3r/GUI/MainFrame.pm:351 msgid "Open the Slic3r manual in your browser" msgstr "Відкрити сторінку посібнику до Slic3r у своєму браузері" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:402 +#: lib/Slic3r/GUI/MainFrame.pm:355 msgid "System Info" msgstr "Інформація про систему" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:402 +#: lib/Slic3r/GUI/MainFrame.pm:355 msgid "Show system information" msgstr "Показати інформацію про систему" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:405 +#: lib/Slic3r/GUI/MainFrame.pm:358 +msgid "Show &Configuration Folder" +msgstr "" + +#: lib/Slic3r/GUI/MainFrame.pm:358 +msgid "Show user configuration folder (datadir)" +msgstr "" + +#: lib/Slic3r/GUI/MainFrame.pm:361 msgid "Report an Issue" msgstr "Повідомити про проблему" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:405 +#: lib/Slic3r/GUI/MainFrame.pm:361 msgid "Report an issue on the Slic3r Prusa Edition" msgstr "Повідомити про проблему на Slic3r Prusa Edition" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:408 +#: lib/Slic3r/GUI/MainFrame.pm:364 msgid "&About Slic3r" msgstr "Про Slic3r" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:408 +#: lib/Slic3r/GUI/MainFrame.pm:364 msgid "Show about dialog" msgstr "Показати діалог Про Slic3r" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:418 +#: lib/Slic3r/GUI/MainFrame.pm:374 msgid "&File" msgstr "Файл" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:419 +#: lib/Slic3r/GUI/MainFrame.pm:375 msgid "&Plater" msgstr "&Платер" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:420 +#: lib/Slic3r/GUI/MainFrame.pm:376 msgid "&Object" msgstr "&Об'єкт" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:421 +#: lib/Slic3r/GUI/MainFrame.pm:377 msgid "&Window" msgstr "Вікно" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:422 +#: lib/Slic3r/GUI/MainFrame.pm:378 msgid "&View" msgstr "Вид" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:426 +#: lib/Slic3r/GUI/MainFrame.pm:381 msgid "&Help" msgstr "Доромога" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:457 +#: lib/Slic3r/GUI/MainFrame.pm:412 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Вибрати файл для нарізання (STL/OBJ/AMF/3MF/PRUSA):" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:469 +#: lib/Slic3r/GUI/MainFrame.pm:424 msgid "No previously sliced file." msgstr "Немає попередньо нарізаного файлу." -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:474 +#: lib/Slic3r/GUI/MainFrame.pm:425 lib/Slic3r/GUI/Plater.pm:1405 +msgid "Error" +msgstr "Помилка" + +#: lib/Slic3r/GUI/MainFrame.pm:429 msgid "Previously sliced file (" msgstr "Попередньо нарізаний файл (" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:474 +#: lib/Slic3r/GUI/MainFrame.pm:429 msgid ") not found." msgstr ") не знайдено." -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:475 +#: lib/Slic3r/GUI/MainFrame.pm:430 msgid "File Not Found" msgstr "Файл не знайдено" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:514 +#: lib/Slic3r/GUI/MainFrame.pm:469 msgid "SVG" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:514 +#: lib/Slic3r/GUI/MainFrame.pm:469 msgid "G-code" msgstr "G-код" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:514 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1645 +#: lib/Slic3r/GUI/MainFrame.pm:469 lib/Slic3r/GUI/Plater.pm:1795 msgid " file as:" msgstr " файл як:" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:528 +#: lib/Slic3r/GUI/MainFrame.pm:483 msgid "Slicing…" msgstr "Нарізання…" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:528 +#: lib/Slic3r/GUI/MainFrame.pm:483 msgid "Processing " msgstr "Обробка " -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:548 +#: lib/Slic3r/GUI/MainFrame.pm:503 msgid " was successfully sliced." msgstr " був успішно нарізаний." -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:550 +#: lib/Slic3r/GUI/MainFrame.pm:505 msgid "Slicing Done!" msgstr "Нарізання завершено!" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:566 +#: lib/Slic3r/GUI/MainFrame.pm:521 msgid "Select the STL file to repair:" msgstr "Вибрати STL-файл для відновлення:" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:580 +#: lib/Slic3r/GUI/MainFrame.pm:535 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "Зберегти OBJ-файл (менш схильний координувати помилки, ніж STL) як:" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:594 +#: lib/Slic3r/GUI/MainFrame.pm:549 msgid "Your file was repaired." msgstr "Ваш файл було відновлено." -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:594 +#: lib/Slic3r/GUI/MainFrame.pm:549 msgid "Repair" msgstr "Відновити" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:605 +#: lib/Slic3r/GUI/MainFrame.pm:560 msgid "Save configuration as:" msgstr "Зберегти конфігурацію як:" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:623 -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:667 +#: lib/Slic3r/GUI/MainFrame.pm:578 lib/Slic3r/GUI/MainFrame.pm:622 msgid "Select configuration to load:" msgstr "Вибрати конфігурацію для завантаження:" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:646 +#: lib/Slic3r/GUI/MainFrame.pm:601 msgid "Save presets bundle as:" msgstr "Зберегти набір налаштувань як:" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:687 +#: lib/Slic3r/GUI/MainFrame.pm:642 #, perl-format msgid "%d presets successfully imported." msgstr "%d налаштувань успішно імпортовано." -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:749 -msgid "You have unsaved changes " -msgstr "У вас є незбережені зміни " - -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:749 -msgid ". Discard changes and continue anyway?" -msgstr ". Відхилити зміни і продовжити в будь-якому випадку?" - -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:750 -msgid "Unsaved Presets" -msgstr "Незбереженні налаштування" - -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:104 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2124 +#: lib/Slic3r/GUI/Plater.pm:164 lib/Slic3r/GUI/Plater.pm:2323 msgid "3D" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:138 +#: lib/Slic3r/GUI/Plater.pm:206 msgid "2D" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:157 +#: lib/Slic3r/GUI/Plater.pm:224 msgid "Layers" msgstr "Шари" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:177 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:195 +#: lib/Slic3r/GUI/Plater.pm:250 lib/Slic3r/GUI/Plater.pm:268 msgid "Add…" msgstr "Додати…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:179 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:197 +#: lib/Slic3r/GUI/Plater.pm:252 lib/Slic3r/GUI/Plater.pm:270 msgid "Delete All" msgstr "Видалити все" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:180 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:198 +#: lib/Slic3r/GUI/Plater.pm:253 lib/Slic3r/GUI/Plater.pm:271 msgid "Arrange" msgstr "Організувати" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:182 +#: lib/Slic3r/GUI/Plater.pm:255 msgid "More" msgstr "Більше" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:183 +#: lib/Slic3r/GUI/Plater.pm:256 msgid "Fewer" msgstr "Менше" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:185 +#: lib/Slic3r/GUI/Plater.pm:258 msgid "45° ccw" msgstr "45° пгс" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:186 +#: lib/Slic3r/GUI/Plater.pm:259 msgid "45° cw" msgstr "45° згс" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:187 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:203 +#: lib/Slic3r/GUI/Plater.pm:260 lib/Slic3r/GUI/Plater.pm:276 msgid "Scale…" msgstr "Масштаб…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:188 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:204 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2099 +#: lib/Slic3r/GUI/Plater.pm:261 lib/Slic3r/GUI/Plater.pm:277 +#: lib/Slic3r/GUI/Plater.pm:2293 msgid "Split" msgstr "Розділити" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:189 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:205 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2102 +#: lib/Slic3r/GUI/Plater.pm:262 lib/Slic3r/GUI/Plater.pm:278 +#: lib/Slic3r/GUI/Plater.pm:2296 msgid "Cut…" msgstr "Вирізати…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:191 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:206 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2106 +#: lib/Slic3r/GUI/Plater.pm:264 lib/Slic3r/GUI/Plater.pm:279 +#: lib/Slic3r/GUI/Plater.pm:2300 msgid "Settings…" msgstr "Параметри…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:192 +#: lib/Slic3r/GUI/Plater.pm:265 msgid "Layer Editing" msgstr "Редагування шарів" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:207 +#: lib/Slic3r/GUI/Plater.pm:280 msgid "Layer editing" msgstr "Редагування шарів" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:220 +#: lib/Slic3r/GUI/Plater.pm:303 msgid "Name" msgstr "Ім'я" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:221 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:900 +#: lib/Slic3r/GUI/Plater.pm:304 lib/Slic3r/GUI/Plater.pm:992 msgid "Copies" msgstr "Копії" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:222 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1056 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1061 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2068 +#: lib/Slic3r/GUI/Plater.pm:305 lib/Slic3r/GUI/Plater.pm:1158 +#: lib/Slic3r/GUI/Plater.pm:1163 lib/Slic3r/GUI/Plater.pm:2262 msgid "Scale" msgstr "Масштаб" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:236 +#: lib/Slic3r/GUI/Plater.pm:322 msgid "Export G-code…" msgstr "Експортувати G-код…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:237 +#: lib/Slic3r/GUI/Plater.pm:323 msgid "Slice now" msgstr "Нарізати зараз" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:238 +#: lib/Slic3r/GUI/Plater.pm:324 msgid "Print…" msgstr "Друк…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:239 +#: lib/Slic3r/GUI/Plater.pm:325 msgid "Send to printer" msgstr "Надіслати на принтер" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:240 +#: lib/Slic3r/GUI/Plater.pm:326 msgid "Export STL…" msgstr "Експортувати STL…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:367 +#: lib/Slic3r/GUI/Plater.pm:453 msgid "Print settings" msgstr "Параметри друку" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:369 +#: lib/Slic3r/GUI/Plater.pm:455 msgid "Printer" msgstr "Принтер" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:398 +#: lib/Slic3r/GUI/Plater.pm:488 msgid "Info" msgstr "Інфо" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:409 +#: lib/Slic3r/GUI/Plater.pm:499 msgid "Volume" msgstr "Обсяг" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:410 +#: lib/Slic3r/GUI/Plater.pm:500 msgid "Facets" msgstr "Грані" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:411 +#: lib/Slic3r/GUI/Plater.pm:501 msgid "Materials" msgstr "Матеріали" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:412 +#: lib/Slic3r/GUI/Plater.pm:502 msgid "Manifold" msgstr "Різноманіття" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:438 +#: lib/Slic3r/GUI/Plater.pm:527 msgid "Sliced Info" msgstr "Інформація з нарізання" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:447 -msgid "Used Filament (m)" -msgstr "Використано філаметну (м)" - -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:448 -msgid "Used Filament (mm³)" -msgstr "Використано філаметну (мм³)" - -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:449 -msgid "Used Filament (g)" -msgstr "Використано філаметну (г)" - -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:451 -msgid "Estimated printing time" -msgstr "Приблизний час друку" - -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:629 +#: lib/Slic3r/GUI/Plater.pm:713 msgid "Loading…" msgstr "Завантаження…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:629 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:643 +#: lib/Slic3r/GUI/Plater.pm:713 lib/Slic3r/GUI/Plater.pm:727 msgid "Processing input file\n" msgstr "Обробка вхідного файлу\n" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:663 +#: lib/Slic3r/GUI/Plater.pm:750 msgid "" "This file contains several objects positioned at multiple heights. Instead " "of considering them as multiple objects, should I consider\n" @@ -4009,12 +5239,11 @@ msgstr "" "того, щоб розглядати їх як кілька об'єктів, чи потрібно розглянути\n" "цей файл як єдиний об'єкт, що має декілька частин?\n" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:666 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:683 +#: lib/Slic3r/GUI/Plater.pm:753 lib/Slic3r/GUI/Plater.pm:770 msgid "Multi-part object detected" msgstr "Виявлено об'єкт, що складається з кількох частин" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:680 +#: lib/Slic3r/GUI/Plater.pm:767 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" @@ -4024,11 +5253,11 @@ msgstr "" "Замість того, щоб розглядати їх як кілька об'єктів, чи потрібно розглянути\n" "ці файл як єдиний об'єкт, що має декілька частин?\n" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:692 +#: lib/Slic3r/GUI/Plater.pm:779 msgid "Loaded " msgstr "Завантажений " -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:744 +#: lib/Slic3r/GUI/Plater.pm:837 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." @@ -4036,15 +5265,15 @@ msgstr "" "Ваш об'єкт видався занадто великим, тому він автоматично зменшився " "відповідно до вашої полотна друку." -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:745 +#: lib/Slic3r/GUI/Plater.pm:838 msgid "Object too large?" msgstr "Об'єкт занадто великий?" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:900 +#: lib/Slic3r/GUI/Plater.pm:992 msgid "Enter the number of copies of the selected object:" msgstr "Введіть кількість копій обраного об'єкта:" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:927 +#: lib/Slic3r/GUI/Plater.pm:1019 msgid "" "\n" "Non-positive value." @@ -4052,7 +5281,7 @@ msgstr "" "\n" "Непозитивне значення." -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:928 +#: lib/Slic3r/GUI/Plater.pm:1020 msgid "" "\n" "Not a numeric value." @@ -4060,50 +5289,46 @@ msgstr "" "\n" "Не числове значення." -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:929 +#: lib/Slic3r/GUI/Plater.pm:1021 msgid "Slic3r Error" msgstr "Помилка Slic3r" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:950 +#: lib/Slic3r/GUI/Plater.pm:1042 msgid "Enter the rotation angle:" msgstr "Введіть кут повороту:" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:950 +#: lib/Slic3r/GUI/Plater.pm:1042 msgid "Rotate around " msgstr "Обертати навколо " -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:950 +#: lib/Slic3r/GUI/Plater.pm:1042 msgid "Invalid rotation angle entered" msgstr "Введено неправильний кут повороту" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1030 +#: lib/Slic3r/GUI/Plater.pm:1132 #, perl-format msgid "Enter the new size for the selected object (print bed: %smm):" msgstr "Введіть новий розмір для обраного об'єкта (полотна друку: %smm):" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1031 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1035 +#: lib/Slic3r/GUI/Plater.pm:1133 lib/Slic3r/GUI/Plater.pm:1137 msgid "Scale along " msgstr "Масштабувати разом " -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1031 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1035 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1056 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1061 +#: lib/Slic3r/GUI/Plater.pm:1133 lib/Slic3r/GUI/Plater.pm:1137 +#: lib/Slic3r/GUI/Plater.pm:1158 lib/Slic3r/GUI/Plater.pm:1163 msgid "Invalid scaling value entered" msgstr "Введено неправильне значення масштабування" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1035 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1061 +#: lib/Slic3r/GUI/Plater.pm:1137 lib/Slic3r/GUI/Plater.pm:1163 #, no-perl-format msgid "Enter the scale % for the selected object:" msgstr "Введіть шкалу % для обраного об'єкта:" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1056 +#: lib/Slic3r/GUI/Plater.pm:1158 msgid "Enter the new max size for the selected object:" msgstr "Введіть новий максимальний розмір для обраного об'єкта:" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1112 +#: lib/Slic3r/GUI/Plater.pm:1218 msgid "" "The selected object can't be split because it contains more than one volume/" "material." @@ -4111,76 +5336,87 @@ msgstr "" "Вибраний об'єкт не можна розділити, оскільки містить більше одного об'єму/" "матеріалу." -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1121 +#: lib/Slic3r/GUI/Plater.pm:1227 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" "Вибраний об'єкт не можна розділити, оскільки він містить лише одну частину." -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1286 +#: lib/Slic3r/GUI/Plater.pm:1391 msgid "Slicing cancelled" msgstr "Нарізання скасовано" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1300 +#: lib/Slic3r/GUI/Plater.pm:1405 msgid "Another export job is currently running." msgstr "На даний час виконується інший експорт." -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1445 +#: lib/Slic3r/GUI/Plater.pm:1555 msgid "File added to print queue" msgstr "Файл додано до черги друку" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1448 -msgid "Sending G-code file to the OctoPrint server..." -msgstr "Відправка файлу G-коду на сервер OctoPrint..." - -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1451 +#: lib/Slic3r/GUI/Plater.pm:1561 msgid "G-code file exported to " msgstr "Файл G-коду експортується до " -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1454 +#: lib/Slic3r/GUI/Plater.pm:1564 msgid "Export failed" msgstr "Експортувати не вдалося" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1524 -msgid "G-code file successfully uploaded to the OctoPrint server" -msgstr "Файл G-коду успішно завантажений на сервер OctoPrint" +#: lib/Slic3r/GUI/Plater.pm:1576 +msgid "OctoPrint upload finished." +msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1526 -msgid "Error while uploading to the OctoPrint server: " -msgstr "Помилка під час завантаження на сервер OctoPrint: " +#: lib/Slic3r/GUI/Plater.pm:1610 +msgid "Used Filament (m)" +msgstr "Використано філаметну (м)" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1539 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1581 +#: lib/Slic3r/GUI/Plater.pm:1612 +msgid "Used Filament (mm³)" +msgstr "Використано філаметну (мм³)" + +#: lib/Slic3r/GUI/Plater.pm:1614 +msgid "Used Filament (g)" +msgstr "Використано філаметну (г)" + +#: lib/Slic3r/GUI/Plater.pm:1618 +msgid "Estimated printing time (normal mode)" +msgstr "" + +#: lib/Slic3r/GUI/Plater.pm:1620 +msgid "Estimated printing time (silent mode)" +msgstr "" + +#: lib/Slic3r/GUI/Plater.pm:1659 lib/Slic3r/GUI/Plater.pm:1701 msgid "STL file exported to " msgstr "STL-файл експортовано в " -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1592 +#: lib/Slic3r/GUI/Plater.pm:1740 msgid "AMF file exported to " msgstr "AMF-файл експортовано в " -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1596 +#: lib/Slic3r/GUI/Plater.pm:1744 msgid "Error exporting AMF file " msgstr "Помилка експортування AMF-файлу " -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1608 +#: lib/Slic3r/GUI/Plater.pm:1756 msgid "3MF file exported to " msgstr "3MF-файл експортовано в " -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1612 +#: lib/Slic3r/GUI/Plater.pm:1760 msgid "Error exporting 3MF file " msgstr "Помилка експортування 3MF-файлу " -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1958 +#: lib/Slic3r/GUI/Plater.pm:2140 #, perl-format msgid "%d (%d shells)" msgstr "%d (%d оболонок)" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1960 +#: lib/Slic3r/GUI/Plater.pm:2142 #, perl-format msgid "Auto-repaired (%d errors)" msgstr "Автоматичне відновлення (%d помилок)" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1965 +#: lib/Slic3r/GUI/Plater.pm:2147 #, perl-format msgid "" "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " @@ -4189,219 +5425,302 @@ msgstr "" "вироджено %d грані, виправлено %d країв, вилучено %d грані, додано %d грані, " "змінено %d грані, повернуто %d країв" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1970 +#: lib/Slic3r/GUI/Plater.pm:2152 msgid "Yes" msgstr "Так" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2021 +#: lib/Slic3r/GUI/Plater.pm:2215 msgid "Remove the selected object" msgstr "Видалити вибраний об'єкт" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2024 +#: lib/Slic3r/GUI/Plater.pm:2218 msgid "Increase copies" msgstr "Збільшити копії" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2024 +#: lib/Slic3r/GUI/Plater.pm:2218 msgid "Place one more copy of the selected object" msgstr "Розташувати ще одну копію обраного об'єкта" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2027 +#: lib/Slic3r/GUI/Plater.pm:2221 msgid "Decrease copies" msgstr "Зменшити копії" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2027 +#: lib/Slic3r/GUI/Plater.pm:2221 msgid "Remove one copy of the selected object" msgstr "Вилучіть одну копію обраного об'єкта" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2030 +#: lib/Slic3r/GUI/Plater.pm:2224 msgid "Set number of copies…" msgstr "Встановити кількість копій…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2030 +#: lib/Slic3r/GUI/Plater.pm:2224 msgid "Change the number of copies of the selected object" msgstr "Змінити кількість копій обраного об'єкта" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2034 +#: lib/Slic3r/GUI/Plater.pm:2228 msgid "Rotate 45° clockwise" msgstr "Повернути на 45° за годинниковою стрілкою" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2034 +#: lib/Slic3r/GUI/Plater.pm:2228 msgid "Rotate the selected object by 45° clockwise" msgstr "Повернути виділений об'єкт на 45° за годинниковою стрілкою" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2037 +#: lib/Slic3r/GUI/Plater.pm:2231 msgid "Rotate 45° counter-clockwise" msgstr "Повернути 45° проти годинникової стрілки" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2037 +#: lib/Slic3r/GUI/Plater.pm:2231 msgid "Rotate the selected object by 45° counter-clockwise" msgstr "Повернути виділений об'єкт на 45° проти годинникової стрілки" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2042 +#: lib/Slic3r/GUI/Plater.pm:2236 msgid "Rotate" msgstr "Повернути" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2042 +#: lib/Slic3r/GUI/Plater.pm:2236 msgid "Rotate the selected object by an arbitrary angle" msgstr "Повернути виділений об'єкт на довільний кут" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2044 +#: lib/Slic3r/GUI/Plater.pm:2238 msgid "Around X axis…" msgstr "Навколо осі X…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2044 +#: lib/Slic3r/GUI/Plater.pm:2238 msgid "Rotate the selected object by an arbitrary angle around X axis" msgstr "Повернути виділений об'єкт на довільний кут навколо осі Х" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2047 +#: lib/Slic3r/GUI/Plater.pm:2241 msgid "Around Y axis…" msgstr "Навколо осі Y…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2047 +#: lib/Slic3r/GUI/Plater.pm:2241 msgid "Rotate the selected object by an arbitrary angle around Y axis" msgstr "Повернути виділений об'єкт на довільний кут навколо осі Y" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2050 +#: lib/Slic3r/GUI/Plater.pm:2244 msgid "Around Z axis…" msgstr "Навколо осі Z…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2050 +#: lib/Slic3r/GUI/Plater.pm:2244 msgid "Rotate the selected object by an arbitrary angle around Z axis" msgstr "Повернути виділений об'єкт на довільний кут навколо осі Z" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2055 +#: lib/Slic3r/GUI/Plater.pm:2249 msgid "Mirror" msgstr "Віддзеркалити" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2055 +#: lib/Slic3r/GUI/Plater.pm:2249 msgid "Mirror the selected object" msgstr "Віддзеркалити виділений об'єкт" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2057 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2073 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2089 +#: lib/Slic3r/GUI/Plater.pm:2251 lib/Slic3r/GUI/Plater.pm:2267 +#: lib/Slic3r/GUI/Plater.pm:2283 msgid "Along X axis…" msgstr "Уздовж осі X…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2057 +#: lib/Slic3r/GUI/Plater.pm:2251 msgid "Mirror the selected object along the X axis" msgstr "Віддзеркалити виділений об'єкт уздовж осі Х" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2060 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2076 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2092 +#: lib/Slic3r/GUI/Plater.pm:2254 lib/Slic3r/GUI/Plater.pm:2270 +#: lib/Slic3r/GUI/Plater.pm:2286 msgid "Along Y axis…" msgstr "Уздовж осі Y…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2060 +#: lib/Slic3r/GUI/Plater.pm:2254 msgid "Mirror the selected object along the Y axis" msgstr "Віддзеркалити виділений об'єкт уздовж осі Y" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2063 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2079 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2095 +#: lib/Slic3r/GUI/Plater.pm:2257 lib/Slic3r/GUI/Plater.pm:2273 +#: lib/Slic3r/GUI/Plater.pm:2289 msgid "Along Z axis…" msgstr "Уздовж осі Z…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2063 +#: lib/Slic3r/GUI/Plater.pm:2257 msgid "Mirror the selected object along the Z axis" msgstr "Віддзеркалити виділений об'єкт уздовж осі Z" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2068 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2084 +#: lib/Slic3r/GUI/Plater.pm:2262 lib/Slic3r/GUI/Plater.pm:2278 msgid "Scale the selected object along a single axis" msgstr "Масштабувати виділений об'єкт уздовж осі" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2070 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2086 +#: lib/Slic3r/GUI/Plater.pm:2264 lib/Slic3r/GUI/Plater.pm:2280 msgid "Uniformly…" msgstr "Рівномірно…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2070 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2086 +#: lib/Slic3r/GUI/Plater.pm:2264 lib/Slic3r/GUI/Plater.pm:2280 msgid "Scale the selected object along the XYZ axes" msgstr "Масштабувати виділений об'єкт уздовж осей XYZ" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2073 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2089 +#: lib/Slic3r/GUI/Plater.pm:2267 lib/Slic3r/GUI/Plater.pm:2283 msgid "Scale the selected object along the X axis" msgstr "Масштабувати виділений об'єкт уздовж осі X" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2076 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2092 +#: lib/Slic3r/GUI/Plater.pm:2270 lib/Slic3r/GUI/Plater.pm:2286 msgid "Scale the selected object along the Y axis" msgstr "Масштабувати виділений об'єкт уздовж осі Y" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2079 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2095 +#: lib/Slic3r/GUI/Plater.pm:2273 lib/Slic3r/GUI/Plater.pm:2289 msgid "Scale the selected object along the Z axis" msgstr "Масштабувати виділений об'єкт уздовж осі Z" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2084 +#: lib/Slic3r/GUI/Plater.pm:2278 msgid "Scale to size" msgstr "Масштабувати до розміру" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2099 +#: lib/Slic3r/GUI/Plater.pm:2293 msgid "Split the selected object into individual parts" msgstr "Розділити вибраний об'єкт на окремі частини" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2102 +#: lib/Slic3r/GUI/Plater.pm:2296 msgid "Open the 3D cutting tool" msgstr "Відкрити інструмент 3D-нарізки" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2106 +#: lib/Slic3r/GUI/Plater.pm:2300 msgid "Open the object editor dialog" msgstr "Відкрити діалог редактора об'єктів" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2110 +#: lib/Slic3r/GUI/Plater.pm:2304 msgid "Reload from Disk" msgstr "Перезавантажити з диска" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2110 +#: lib/Slic3r/GUI/Plater.pm:2304 msgid "Reload the selected file from Disk" msgstr "Перезавантажити вибраний файл із диска" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2113 +#: lib/Slic3r/GUI/Plater.pm:2307 msgid "Export object as STL…" msgstr "Експортувати об'єкт як STL…" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2113 +#: lib/Slic3r/GUI/Plater.pm:2307 msgid "Export this single object as STL file" msgstr "Експортувати цей окремий об'єкт як STL-файл" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\2D.pm:131 +#: lib/Slic3r/GUI/Plater.pm:2311 +msgid "Fix STL through Netfabb" +msgstr "" + +#: lib/Slic3r/GUI/Plater.pm:2311 +msgid "" +"Fix the model by sending it to a Netfabb cloud service through Windows 10 API" +msgstr "" + +#: lib/Slic3r/GUI/Plater/2D.pm:131 msgid "What do you want to print today? ™" msgstr "Що б Ви хотіли надрукувати сьогодні? ™" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\2D.pm:132 +#: lib/Slic3r/GUI/Plater/2D.pm:132 msgid "Drag your objects here" msgstr "Перетягніть сюди свій об'єкт" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:63 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:69 msgid "1 Layer" msgstr "1 Шар" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:65 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:71 msgid "View" msgstr "Вид" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:75 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:78 +msgid "Volumetric flow rate" +msgstr "" + +#: lib/Slic3r/GUI/Plater/3DPreview.pm:85 msgid "Show" msgstr "Показати" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:78 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:79 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:88 lib/Slic3r/GUI/Plater/3DPreview.pm:89 msgid "Feature types" msgstr "Типи ознак" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:96 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:106 msgid "Retractions" msgstr "Переривання" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:97 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:107 msgid "Unretractions" msgstr "Непереривання" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:98 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:108 msgid "Shells" msgstr "Оболонки" + +#~ msgid "&Localization" +#~ msgstr "Локалізація" + +#~ msgid "" +#~ "The Wipe Tower currently supports only:\n" +#~ "- first layer height 0.2mm\n" +#~ "- layer height from 0.15mm to 0.35mm\n" +#~ "\n" +#~ "Shall I adjust those settings in order to enable the Wipe Tower?" +#~ msgstr "" +#~ "Вичіщуюча веж в даний час підтримує тільки:\n" +#~ "- висота першого шару 0,2 мм\n" +#~ "- висота шару від 0,15 мм до 0,35 мм\n" +#~ "\n" +#~ "Чи потрібно коригувати ці налаштування, щоб увімкнути вичіщуючу веж?" + +#~ msgid "" +#~ "The supplied name is not valid; the following characters are not allowed:" +#~ msgstr "Надане ім'я недійсне; такі символи не допускаються:" + +#~ msgid "Minimum extrusion length" +#~ msgstr "Мінімальна довжина екструзії" + +#~ msgid "Host or IP" +#~ msgstr "Host або IP" + +#~ msgid "" +#~ "Slic3r can upload G-code files to OctoPrint. This field should contain " +#~ "the hostname or IP address of the OctoPrint instance." +#~ msgstr "" +#~ "Slic3r може завантажувати файли G-коду в OctoPrint. Це поле повинно " +#~ "містити ім'я хоста або IP-адресу екземпляру OctoPrint." + +#~ msgid "Per color change depth" +#~ msgstr "Змінити глибину за кольором" + +#~ msgid "" +#~ "Depth of a wipe color per color change. For N colors, there will be " +#~ "maximum (N-1) tool switches performed, therefore the total depth of the " +#~ "wipe tower will be (N-1) times this value." +#~ msgstr "" +#~ "Глибина вичищення кольору для кожної зміни кольору. Для N кольорів буде " +#~ "виконано максимум (N-1) інструментальних перемикачів, тому загальна " +#~ "глибина вичищуючої вежі буде (N-1) разів до цього значення." + +#~ msgid "No Bonjour device found" +#~ msgstr "Немає пристрою Bonjour" + +#~ msgid "Device Browser" +#~ msgstr "Браузер(список) пристроїв" + +#~ msgid "I wasn't able to connect to OctoPrint (" +#~ msgstr "Не можливо підключитися до OctoPrint (" + +#~ msgid "" +#~ "). Check hostname and OctoPrint version (at least 1.1.0 is required)." +#~ msgstr "" +#~ ") Перевірте версію хоста та OctoPrint (принаймні 1.1.0 - обов'язкова)." + +#~ msgid "Open STL/OBJ/AMF…\tCtrl+O" +#~ msgstr "Відкрити STL/OBJ/AMF…\tCtrl+O" + +#~ msgid "Preferences…\tCtrl+," +#~ msgstr "Преференції…\tCtrl+," + +#~ msgid "&Configuration " +#~ msgstr "Конфігурація " + +#~ msgid "Run Configuration " +#~ msgstr "Запустити конфігурацію " + +#~ msgid "Estimated printing time" +#~ msgstr "Приблизний час друку" + +#~ msgid "G-code file successfully uploaded to the OctoPrint server" +#~ msgstr "Файл G-коду успішно завантажений на сервер OctoPrint" + +#~ msgid "Error while uploading to the OctoPrint server: " +#~ msgstr "Помилка під час завантаження на сервер OctoPrint: " diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index af7022f2ba..9c62fe8ebf 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -250,6 +250,7 @@ bool select_language(wxArrayString & names, g_wxLocale->AddCatalogLookupPathPrefix(wxPathOnly(localization_dir())); g_wxLocale->AddCatalog(g_wxApp->GetAppName()); wxSetlocale(LC_NUMERIC, "C"); + Preset::update_suffix_modified(); return true; } return false; @@ -275,6 +276,7 @@ bool load_language() g_wxLocale->AddCatalogLookupPathPrefix(wxPathOnly(localization_dir())); g_wxLocale->AddCatalog(g_wxApp->GetAppName()); wxSetlocale(LC_NUMERIC, "C"); + Preset::update_suffix_modified(); return true; } } diff --git a/xs/src/slic3r/GUI/Preset.cpp b/xs/src/slic3r/GUI/Preset.cpp index 54a5c90fe4..49e235146c 100644 --- a/xs/src/slic3r/GUI/Preset.cpp +++ b/xs/src/slic3r/GUI/Preset.cpp @@ -146,6 +146,11 @@ const std::string& Preset::suffix_modified() { return g_suffix_modified; } + +void Preset::update_suffix_modified() +{ + g_suffix_modified = (" (" + _(L("modified")) + ")").ToUTF8().data(); +} // Remove an optional "(modified)" suffix from a name. // This converts a UI name to a unique preset identifier. std::string Preset::remove_suffix_modified(const std::string &name) diff --git a/xs/src/slic3r/GUI/Preset.hpp b/xs/src/slic3r/GUI/Preset.hpp index a2ee1d2eb0..0d00cae485 100644 --- a/xs/src/slic3r/GUI/Preset.hpp +++ b/xs/src/slic3r/GUI/Preset.hpp @@ -167,6 +167,7 @@ public: static const std::vector& printer_options(); // Nozzle options of the printer options. static const std::vector& nozzle_options(); + static void update_suffix_modified(); protected: friend class PresetCollection; @@ -260,7 +261,7 @@ public: // used to update preset_choice from Tab const std::deque& get_presets() { return m_presets; } int get_idx_selected() { return m_idx_selected; } - const std::string& get_suffix_modified(); + static const std::string& get_suffix_modified(); // Return a preset possibly with modifications. Preset& default_preset() { return m_presets.front(); } diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 5d1c51eb3b..187030f31b 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -2728,7 +2728,7 @@ void SavePresetWindow::accept() const char* unusable_symbols = "<>:/\\|?*\""; bool is_unusable_symbol = false; bool is_unusable_postfix = false; - const std::string unusable_postfix = "(modified)"; + const std::string unusable_postfix = PresetCollection::get_suffix_modified();//"(modified)"; for (size_t i = 0; i < std::strlen(unusable_symbols); i++){ if (m_chosen_name.find_first_of(unusable_symbols[i]) != std::string::npos){ is_unusable_symbol = true; @@ -2743,8 +2743,9 @@ void SavePresetWindow::accept() _(L("the following characters are not allowed:")) + " <>:/\\|?*\""); } else if (is_unusable_postfix){ - show_error(this, _(L("The supplied name is not valid;")) + "\n" + - _(L("the following postfix are not allowed:")) + "\n\t" + unusable_postfix); + show_error(this,_(L("The supplied name is not valid;")) + "\n" + + _(L("the following postfix are not allowed:")) + "\n\t" + //unusable_postfix); + wxString::FromUTF8(unusable_postfix.c_str())); } else if (m_chosen_name.compare("- default -") == 0) { show_error(this, _(L("The supplied name is not available."))); From d4adcd4077d2514059da880cb11a6f1a1760d0c7 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 24 Jul 2018 13:39:17 +0200 Subject: [PATCH 04/21] Out of print volume detection for toolpaths --- lib/Slic3r/GUI/Plater/3DPreview.pm | 11 +- xs/src/slic3r/GUI/3DScene.cpp | 22 +- xs/src/slic3r/GUI/3DScene.hpp | 4 +- xs/src/slic3r/GUI/GLCanvas3D.cpp | 801 +++++++++++++----------- xs/src/slic3r/GUI/GLCanvas3D.hpp | 22 +- xs/src/slic3r/GUI/GLCanvas3DManager.cpp | 31 +- xs/src/slic3r/GUI/GLCanvas3DManager.hpp | 4 +- xs/xsp/GUI_3DScene.xsp | 30 +- 8 files changed, 473 insertions(+), 452 deletions(-) diff --git a/lib/Slic3r/GUI/Plater/3DPreview.pm b/lib/Slic3r/GUI/Plater/3DPreview.pm index 9ed2374ec4..09c2f0b8cf 100644 --- a/lib/Slic3r/GUI/Plater/3DPreview.pm +++ b/lib/Slic3r/GUI/Plater/3DPreview.pm @@ -25,6 +25,7 @@ sub new { # init GUI elements my $canvas = Slic3r::GUI::3DScene->new($self); Slic3r::GUI::_3DScene::enable_shader($canvas, 1); + Slic3r::GUI::_3DScene::set_config($canvas, $config); $self->canvas($canvas); my $slider_low = Wx::Slider->new( $self, -1, @@ -365,16 +366,8 @@ sub load_print { if ($self->gcode_preview_data->empty) { # load skirt and brim Slic3r::GUI::_3DScene::set_print($self->canvas, $self->print); - Slic3r::GUI::_3DScene::load_print_toolpaths($self->canvas); - Slic3r::GUI::_3DScene::load_wipe_tower_toolpaths($self->canvas, \@colors); - foreach my $object (@{$self->print->objects}) { - Slic3r::GUI::_3DScene::load_print_object_toolpaths($self->canvas, $object, \@colors); - # Show the objects in very transparent color. - #my @volume_ids = $self->canvas->load_object($object->model_object); - #$self->canvas->volumes->[$_]->color->[3] = 0.2 for @volume_ids; - } + Slic3r::GUI::_3DScene::load_preview($self->canvas, \@colors); $self->show_hide_ui_elements('simple'); - Slic3r::GUI::_3DScene::reset_legend_texture(); } else { $self->{force_sliders_full_range} = (Slic3r::GUI::_3DScene::get_volumes_count($self->canvas) == 0); Slic3r::GUI::_3DScene::set_print($self->canvas, $self->print); diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index 62659033ad..e23641cb18 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -250,7 +250,7 @@ void GLVolume::set_render_color() set_render_color(is_outside ? SELECTED_OUTSIDE_COLOR : SELECTED_COLOR, 4); else if (hover) set_render_color(HOVER_COLOR, 4); - else if (is_outside) + else if (is_outside && outside_printer_detection_enabled) set_render_color(OUTSIDE_COLOR, 4); else set_render_color(color, 4); @@ -1968,26 +1968,16 @@ void _3DScene::reload_scene(wxGLCanvas* canvas, bool force) s_canvas_mgr.reload_scene(canvas, force); } -void _3DScene::load_print_toolpaths(wxGLCanvas* canvas) -{ - s_canvas_mgr.load_print_toolpaths(canvas); -} - -void _3DScene::load_print_object_toolpaths(wxGLCanvas* canvas, const PrintObject* print_object, const std::vector& str_tool_colors) -{ - s_canvas_mgr.load_print_object_toolpaths(canvas, print_object, str_tool_colors); -} - -void _3DScene::load_wipe_tower_toolpaths(wxGLCanvas* canvas, const std::vector& str_tool_colors) -{ - s_canvas_mgr.load_wipe_tower_toolpaths(canvas, str_tool_colors); -} - void _3DScene::load_gcode_preview(wxGLCanvas* canvas, const GCodePreviewData* preview_data, const std::vector& str_tool_colors) { s_canvas_mgr.load_gcode_preview(canvas, preview_data, str_tool_colors); } +void _3DScene::load_preview(wxGLCanvas* canvas, const std::vector& str_tool_colors) +{ + s_canvas_mgr.load_preview(canvas, str_tool_colors); +} + void _3DScene::reset_legend_texture() { s_canvas_mgr.reset_legend_texture(); diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index 5409b95883..0cd2d81f0e 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -536,10 +536,8 @@ public: static void reload_scene(wxGLCanvas* canvas, bool force); - static void load_print_toolpaths(wxGLCanvas* canvas); - static void load_print_object_toolpaths(wxGLCanvas* canvas, const PrintObject* print_object, const std::vector& str_tool_colors); - static void load_wipe_tower_toolpaths(wxGLCanvas* canvas, const std::vector& str_tool_colors); static void load_gcode_preview(wxGLCanvas* canvas, const GCodePreviewData* preview_data, const std::vector& str_tool_colors); + static void load_preview(wxGLCanvas* canvas, const std::vector& str_tool_colors); static void reset_legend_texture(); diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index 722f1c1124..819f26609d 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -2326,372 +2326,6 @@ void GLCanvas3D::reload_scene(bool force) } } -void GLCanvas3D::load_print_toolpaths() -{ - // ensures this canvas is current - if (!set_current()) - return; - - if (m_print == nullptr) - return; - - if (!m_print->state.is_done(psSkirt) || !m_print->state.is_done(psBrim)) - return; - - if (!m_print->has_skirt() && (m_print->config.brim_width.value == 0)) - return; - - const float color[] = { 0.5f, 1.0f, 0.5f, 1.0f }; // greenish - - // number of skirt layers - size_t total_layer_count = 0; - for (const PrintObject* print_object : m_print->objects) - { - total_layer_count = std::max(total_layer_count, print_object->total_layer_count()); - } - size_t skirt_height = m_print->has_infinite_skirt() ? total_layer_count : std::min(m_print->config.skirt_height.value, total_layer_count); - if ((skirt_height == 0) && (m_print->config.brim_width.value > 0)) - skirt_height = 1; - - // get first skirt_height layers (maybe this should be moved to a PrintObject method?) - const PrintObject* object0 = m_print->objects.front(); - std::vector print_zs; - print_zs.reserve(skirt_height * 2); - for (size_t i = 0; i < std::min(skirt_height, object0->layers.size()); ++i) - { - print_zs.push_back(float(object0->layers[i]->print_z)); - } - //FIXME why there are support layers? - for (size_t i = 0; i < std::min(skirt_height, object0->support_layers.size()); ++i) - { - print_zs.push_back(float(object0->support_layers[i]->print_z)); - } - sort_remove_duplicates(print_zs); - if (print_zs.size() > skirt_height) - print_zs.erase(print_zs.begin() + skirt_height, print_zs.end()); - - m_volumes.volumes.emplace_back(new GLVolume(color)); - GLVolume& volume = *m_volumes.volumes.back(); - for (size_t i = 0; i < skirt_height; ++i) { - volume.print_zs.push_back(print_zs[i]); - volume.offsets.push_back(volume.indexed_vertex_array.quad_indices.size()); - volume.offsets.push_back(volume.indexed_vertex_array.triangle_indices.size()); - if (i == 0) - _3DScene::extrusionentity_to_verts(m_print->brim, print_zs[i], Point(0, 0), volume); - - _3DScene::extrusionentity_to_verts(m_print->skirt, print_zs[i], Point(0, 0), volume); - } - volume.bounding_box = volume.indexed_vertex_array.bounding_box(); - volume.indexed_vertex_array.finalize_geometry(m_use_VBOs && m_initialized); -} - -void GLCanvas3D::load_print_object_toolpaths(const PrintObject& print_object, const std::vector& str_tool_colors) -{ - std::vector tool_colors = _parse_colors(str_tool_colors); - - struct Ctxt - { - const Points *shifted_copies; - std::vector layers; - bool has_perimeters; - bool has_infill; - bool has_support; - const std::vector* tool_colors; - - // Number of vertices (each vertex is 6x4=24 bytes long) - static const size_t alloc_size_max() { return 131072; } // 3.15MB - // static const size_t alloc_size_max () { return 65536; } // 1.57MB - // static const size_t alloc_size_max () { return 32768; } // 786kB - static const size_t alloc_size_reserve() { return alloc_size_max() * 2; } - - static const float* color_perimeters() { static float color[4] = { 1.0f, 1.0f, 0.0f, 1.f }; return color; } // yellow - static const float* color_infill() { static float color[4] = { 1.0f, 0.5f, 0.5f, 1.f }; return color; } // redish - static const float* color_support() { static float color[4] = { 0.5f, 1.0f, 0.5f, 1.f }; return color; } // greenish - - // For cloring by a tool, return a parsed color. - bool color_by_tool() const { return tool_colors != nullptr; } - size_t number_tools() const { return this->color_by_tool() ? tool_colors->size() / 4 : 0; } - const float* color_tool(size_t tool) const { return tool_colors->data() + tool * 4; } - int volume_idx(int extruder, int feature) const - { - return this->color_by_tool() ? std::min(this->number_tools() - 1, std::max(extruder - 1, 0)) : feature; - } - } ctxt; - - ctxt.shifted_copies = &print_object._shifted_copies; - - // order layers by print_z - ctxt.layers.reserve(print_object.layers.size() + print_object.support_layers.size()); - for (const Layer *layer : print_object.layers) - ctxt.layers.push_back(layer); - for (const Layer *layer : print_object.support_layers) - ctxt.layers.push_back(layer); - std::sort(ctxt.layers.begin(), ctxt.layers.end(), [](const Layer *l1, const Layer *l2) { return l1->print_z < l2->print_z; }); - - // Maximum size of an allocation block: 32MB / sizeof(float) - ctxt.has_perimeters = print_object.state.is_done(posPerimeters); - ctxt.has_infill = print_object.state.is_done(posInfill); - ctxt.has_support = print_object.state.is_done(posSupportMaterial); - ctxt.tool_colors = tool_colors.empty() ? nullptr : &tool_colors; - - BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - start"; - - //FIXME Improve the heuristics for a grain size. - size_t grain_size = std::max(ctxt.layers.size() / 16, size_t(1)); - tbb::spin_mutex new_volume_mutex; - auto new_volume = [this, &new_volume_mutex](const float *color) -> GLVolume* { - auto *volume = new GLVolume(color); - new_volume_mutex.lock(); - volume->outside_printer_detection_enabled = false; - m_volumes.volumes.emplace_back(volume); - new_volume_mutex.unlock(); - return volume; - }; - const size_t volumes_cnt_initial = m_volumes.volumes.size(); - std::vector volumes_per_thread(ctxt.layers.size()); - tbb::parallel_for( - tbb::blocked_range(0, ctxt.layers.size(), grain_size), - [&ctxt, &new_volume](const tbb::blocked_range& range) { - std::vector vols; - if (ctxt.color_by_tool()) { - for (size_t i = 0; i < ctxt.number_tools(); ++i) - vols.emplace_back(new_volume(ctxt.color_tool(i))); - } - else - vols = { new_volume(ctxt.color_perimeters()), new_volume(ctxt.color_infill()), new_volume(ctxt.color_support()) }; - for (GLVolume *vol : vols) - vol->indexed_vertex_array.reserve(ctxt.alloc_size_reserve()); - for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++idx_layer) { - const Layer *layer = ctxt.layers[idx_layer]; - for (size_t i = 0; i < vols.size(); ++i) { - GLVolume &vol = *vols[i]; - if (vol.print_zs.empty() || vol.print_zs.back() != layer->print_z) { - vol.print_zs.push_back(layer->print_z); - vol.offsets.push_back(vol.indexed_vertex_array.quad_indices.size()); - vol.offsets.push_back(vol.indexed_vertex_array.triangle_indices.size()); - } - } - for (const Point © : *ctxt.shifted_copies) { - for (const LayerRegion *layerm : layer->regions) { - if (ctxt.has_perimeters) - _3DScene::extrusionentity_to_verts(layerm->perimeters, float(layer->print_z), copy, - *vols[ctxt.volume_idx(layerm->region()->config.perimeter_extruder.value, 0)]); - if (ctxt.has_infill) { - for (const ExtrusionEntity *ee : layerm->fills.entities) { - // fill represents infill extrusions of a single island. - const auto *fill = dynamic_cast(ee); - if (!fill->entities.empty()) - _3DScene::extrusionentity_to_verts(*fill, float(layer->print_z), copy, - *vols[ctxt.volume_idx( - is_solid_infill(fill->entities.front()->role()) ? - layerm->region()->config.solid_infill_extruder : - layerm->region()->config.infill_extruder, - 1)]); - } - } - } - if (ctxt.has_support) { - const SupportLayer *support_layer = dynamic_cast(layer); - if (support_layer) { - for (const ExtrusionEntity *extrusion_entity : support_layer->support_fills.entities) - _3DScene::extrusionentity_to_verts(extrusion_entity, float(layer->print_z), copy, - *vols[ctxt.volume_idx( - (extrusion_entity->role() == erSupportMaterial) ? - support_layer->object()->config.support_material_extruder : - support_layer->object()->config.support_material_interface_extruder, - 2)]); - } - } - } - for (size_t i = 0; i < vols.size(); ++i) { - GLVolume &vol = *vols[i]; - if (vol.indexed_vertex_array.vertices_and_normals_interleaved.size() / 6 > ctxt.alloc_size_max()) { - // Store the vertex arrays and restart their containers, - vols[i] = new_volume(vol.color); - GLVolume &vol_new = *vols[i]; - // Assign the large pre-allocated buffers to the new GLVolume. - vol_new.indexed_vertex_array = std::move(vol.indexed_vertex_array); - // Copy the content back to the old GLVolume. - vol.indexed_vertex_array = vol_new.indexed_vertex_array; - // Finalize a bounding box of the old GLVolume. - vol.bounding_box = vol.indexed_vertex_array.bounding_box(); - // Clear the buffers, but keep them pre-allocated. - vol_new.indexed_vertex_array.clear(); - // Just make sure that clear did not clear the reserved memory. - vol_new.indexed_vertex_array.reserve(ctxt.alloc_size_reserve()); - } - } - } - for (GLVolume *vol : vols) { - vol->bounding_box = vol->indexed_vertex_array.bounding_box(); - vol->indexed_vertex_array.shrink_to_fit(); - } - }); - - BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - finalizing results"; - // Remove empty volumes from the newly added volumes. - m_volumes.volumes.erase( - std::remove_if(m_volumes.volumes.begin() + volumes_cnt_initial, m_volumes.volumes.end(), - [](const GLVolume *volume) { return volume->empty(); }), - m_volumes.volumes.end()); - for (size_t i = volumes_cnt_initial; i < m_volumes.volumes.size(); ++i) - m_volumes.volumes[i]->indexed_vertex_array.finalize_geometry(m_use_VBOs && m_initialized); - - BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - end"; -} - -void GLCanvas3D::load_wipe_tower_toolpaths(const std::vector& str_tool_colors) -{ - if ((m_print == nullptr) || m_print->m_wipe_tower_tool_changes.empty()) - return; - - if (!m_print->state.is_done(psWipeTower)) - return; - - std::vector tool_colors = _parse_colors(str_tool_colors); - - struct Ctxt - { - const Print *print; - const std::vector *tool_colors; - - // Number of vertices (each vertex is 6x4=24 bytes long) - static const size_t alloc_size_max() { return 131072; } // 3.15MB - static const size_t alloc_size_reserve() { return alloc_size_max() * 2; } - - static const float* color_support() { static float color[4] = { 0.5f, 1.0f, 0.5f, 1.f }; return color; } // greenish - - // For cloring by a tool, return a parsed color. - bool color_by_tool() const { return tool_colors != nullptr; } - size_t number_tools() const { return this->color_by_tool() ? tool_colors->size() / 4 : 0; } - const float* color_tool(size_t tool) const { return tool_colors->data() + tool * 4; } - int volume_idx(int tool, int feature) const - { - return this->color_by_tool() ? std::min(this->number_tools() - 1, std::max(tool, 0)) : feature; - } - - const std::vector& tool_change(size_t idx) { - return priming.empty() ? - ((idx == print->m_wipe_tower_tool_changes.size()) ? final : print->m_wipe_tower_tool_changes[idx]) : - ((idx == 0) ? priming : (idx == print->m_wipe_tower_tool_changes.size() + 1) ? final : print->m_wipe_tower_tool_changes[idx - 1]); - } - std::vector priming; - std::vector final; - } ctxt; - - ctxt.print = m_print; - ctxt.tool_colors = tool_colors.empty() ? nullptr : &tool_colors; - if (m_print->m_wipe_tower_priming) - ctxt.priming.emplace_back(*m_print->m_wipe_tower_priming.get()); - if (m_print->m_wipe_tower_final_purge) - ctxt.final.emplace_back(*m_print->m_wipe_tower_final_purge.get()); - - BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - start"; - - //FIXME Improve the heuristics for a grain size. - size_t n_items = m_print->m_wipe_tower_tool_changes.size() + (ctxt.priming.empty() ? 0 : 1); - size_t grain_size = std::max(n_items / 128, size_t(1)); - tbb::spin_mutex new_volume_mutex; - auto new_volume = [this, &new_volume_mutex](const float *color) -> GLVolume* { - auto *volume = new GLVolume(color); - new_volume_mutex.lock(); - volume->outside_printer_detection_enabled = false; - m_volumes.volumes.emplace_back(volume); - new_volume_mutex.unlock(); - return volume; - }; - const size_t volumes_cnt_initial = m_volumes.volumes.size(); - std::vector volumes_per_thread(n_items); - tbb::parallel_for( - tbb::blocked_range(0, n_items, grain_size), - [&ctxt, &new_volume](const tbb::blocked_range& range) { - // Bounding box of this slab of a wipe tower. - std::vector vols; - if (ctxt.color_by_tool()) { - for (size_t i = 0; i < ctxt.number_tools(); ++i) - vols.emplace_back(new_volume(ctxt.color_tool(i))); - } - else - vols = { new_volume(ctxt.color_support()) }; - for (GLVolume *volume : vols) - volume->indexed_vertex_array.reserve(ctxt.alloc_size_reserve()); - for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++idx_layer) { - const std::vector &layer = ctxt.tool_change(idx_layer); - for (size_t i = 0; i < vols.size(); ++i) { - GLVolume &vol = *vols[i]; - if (vol.print_zs.empty() || vol.print_zs.back() != layer.front().print_z) { - vol.print_zs.push_back(layer.front().print_z); - vol.offsets.push_back(vol.indexed_vertex_array.quad_indices.size()); - vol.offsets.push_back(vol.indexed_vertex_array.triangle_indices.size()); - } - } - for (const WipeTower::ToolChangeResult &extrusions : layer) { - for (size_t i = 1; i < extrusions.extrusions.size();) { - const WipeTower::Extrusion &e = extrusions.extrusions[i]; - if (e.width == 0.) { - ++i; - continue; - } - size_t j = i + 1; - if (ctxt.color_by_tool()) - for (; j < extrusions.extrusions.size() && extrusions.extrusions[j].tool == e.tool && extrusions.extrusions[j].width > 0.f; ++j); - else - for (; j < extrusions.extrusions.size() && extrusions.extrusions[j].width > 0.f; ++j); - size_t n_lines = j - i; - Lines lines; - std::vector widths; - std::vector heights; - lines.reserve(n_lines); - widths.reserve(n_lines); - heights.assign(n_lines, extrusions.layer_height); - for (; i < j; ++i) { - const WipeTower::Extrusion &e = extrusions.extrusions[i]; - assert(e.width > 0.f); - const WipeTower::Extrusion &e_prev = *(&e - 1); - lines.emplace_back(Point::new_scale(e_prev.pos.x, e_prev.pos.y), Point::new_scale(e.pos.x, e.pos.y)); - widths.emplace_back(e.width); - } - _3DScene::thick_lines_to_verts(lines, widths, heights, lines.front().a == lines.back().b, extrusions.print_z, - *vols[ctxt.volume_idx(e.tool, 0)]); - } - } - } - for (size_t i = 0; i < vols.size(); ++i) { - GLVolume &vol = *vols[i]; - if (vol.indexed_vertex_array.vertices_and_normals_interleaved.size() / 6 > ctxt.alloc_size_max()) { - // Store the vertex arrays and restart their containers, - vols[i] = new_volume(vol.color); - GLVolume &vol_new = *vols[i]; - // Assign the large pre-allocated buffers to the new GLVolume. - vol_new.indexed_vertex_array = std::move(vol.indexed_vertex_array); - // Copy the content back to the old GLVolume. - vol.indexed_vertex_array = vol_new.indexed_vertex_array; - // Finalize a bounding box of the old GLVolume. - vol.bounding_box = vol.indexed_vertex_array.bounding_box(); - // Clear the buffers, but keep them pre-allocated. - vol_new.indexed_vertex_array.clear(); - // Just make sure that clear did not clear the reserved memory. - vol_new.indexed_vertex_array.reserve(ctxt.alloc_size_reserve()); - } - } - for (GLVolume *vol : vols) { - vol->bounding_box = vol->indexed_vertex_array.bounding_box(); - vol->indexed_vertex_array.shrink_to_fit(); - } - }); - - BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - finalizing results"; - // Remove empty volumes from the newly added volumes. - m_volumes.volumes.erase( - std::remove_if(m_volumes.volumes.begin() + volumes_cnt_initial, m_volumes.volumes.end(), - [](const GLVolume *volume) { return volume->empty(); }), - m_volumes.volumes.end()); - for (size_t i = volumes_cnt_initial; i < m_volumes.volumes.size(); ++i) - m_volumes.volumes[i]->indexed_vertex_array.finalize_geometry(m_use_VBOs && m_initialized); - - BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - end"; -} - void GLCanvas3D::load_gcode_preview(const GCodePreviewData& preview_data, const std::vector& str_tool_colors) { if ((m_canvas != nullptr) && (m_print != nullptr)) @@ -2723,12 +2357,31 @@ void GLCanvas3D::load_gcode_preview(const GCodePreviewData& preview_data, const _load_shells(); } + _update_toolpath_volumes_outside_state(); } _update_gcode_volumes_visibility(preview_data); + _show_warning_texture_if_needed(); } } +void GLCanvas3D::load_preview(const std::vector& str_tool_colors) +{ + if (m_print == nullptr) + return; + + _load_print_toolpaths(); + _load_wipe_tower_toolpaths(str_tool_colors); + for (const PrintObject* object : m_print->objects) + { + if (object != nullptr) + _load_print_object_toolpaths(*object, str_tool_colors); + } + _update_toolpath_volumes_outside_state(); + _show_warning_texture_if_needed(); + reset_legend_texture(); +} + void GLCanvas3D::register_on_viewport_changed_callback(void* callback) { if (callback != nullptr) @@ -4112,6 +3765,372 @@ int GLCanvas3D::_get_first_selected_volume_id() const return -1; } +void GLCanvas3D::_load_print_toolpaths() +{ + // ensures this canvas is current + if (!set_current()) + return; + + if (m_print == nullptr) + return; + + if (!m_print->state.is_done(psSkirt) || !m_print->state.is_done(psBrim)) + return; + + if (!m_print->has_skirt() && (m_print->config.brim_width.value == 0)) + return; + + const float color[] = { 0.5f, 1.0f, 0.5f, 1.0f }; // greenish + + // number of skirt layers + size_t total_layer_count = 0; + for (const PrintObject* print_object : m_print->objects) + { + total_layer_count = std::max(total_layer_count, print_object->total_layer_count()); + } + size_t skirt_height = m_print->has_infinite_skirt() ? total_layer_count : std::min(m_print->config.skirt_height.value, total_layer_count); + if ((skirt_height == 0) && (m_print->config.brim_width.value > 0)) + skirt_height = 1; + + // get first skirt_height layers (maybe this should be moved to a PrintObject method?) + const PrintObject* object0 = m_print->objects.front(); + std::vector print_zs; + print_zs.reserve(skirt_height * 2); + for (size_t i = 0; i < std::min(skirt_height, object0->layers.size()); ++i) + { + print_zs.push_back(float(object0->layers[i]->print_z)); + } + //FIXME why there are support layers? + for (size_t i = 0; i < std::min(skirt_height, object0->support_layers.size()); ++i) + { + print_zs.push_back(float(object0->support_layers[i]->print_z)); + } + sort_remove_duplicates(print_zs); + if (print_zs.size() > skirt_height) + print_zs.erase(print_zs.begin() + skirt_height, print_zs.end()); + + m_volumes.volumes.emplace_back(new GLVolume(color)); + GLVolume& volume = *m_volumes.volumes.back(); + for (size_t i = 0; i < skirt_height; ++i) { + volume.print_zs.push_back(print_zs[i]); + volume.offsets.push_back(volume.indexed_vertex_array.quad_indices.size()); + volume.offsets.push_back(volume.indexed_vertex_array.triangle_indices.size()); + if (i == 0) + _3DScene::extrusionentity_to_verts(m_print->brim, print_zs[i], Point(0, 0), volume); + + _3DScene::extrusionentity_to_verts(m_print->skirt, print_zs[i], Point(0, 0), volume); + } + volume.bounding_box = volume.indexed_vertex_array.bounding_box(); + volume.indexed_vertex_array.finalize_geometry(m_use_VBOs && m_initialized); +} + +void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, const std::vector& str_tool_colors) +{ + std::vector tool_colors = _parse_colors(str_tool_colors); + + struct Ctxt + { + const Points *shifted_copies; + std::vector layers; + bool has_perimeters; + bool has_infill; + bool has_support; + const std::vector* tool_colors; + + // Number of vertices (each vertex is 6x4=24 bytes long) + static const size_t alloc_size_max() { return 131072; } // 3.15MB + // static const size_t alloc_size_max () { return 65536; } // 1.57MB + // static const size_t alloc_size_max () { return 32768; } // 786kB + static const size_t alloc_size_reserve() { return alloc_size_max() * 2; } + + static const float* color_perimeters() { static float color[4] = { 1.0f, 1.0f, 0.0f, 1.f }; return color; } // yellow + static const float* color_infill() { static float color[4] = { 1.0f, 0.5f, 0.5f, 1.f }; return color; } // redish + static const float* color_support() { static float color[4] = { 0.5f, 1.0f, 0.5f, 1.f }; return color; } // greenish + + // For cloring by a tool, return a parsed color. + bool color_by_tool() const { return tool_colors != nullptr; } + size_t number_tools() const { return this->color_by_tool() ? tool_colors->size() / 4 : 0; } + const float* color_tool(size_t tool) const { return tool_colors->data() + tool * 4; } + int volume_idx(int extruder, int feature) const + { + return this->color_by_tool() ? std::min(this->number_tools() - 1, std::max(extruder - 1, 0)) : feature; + } + } ctxt; + + ctxt.shifted_copies = &print_object._shifted_copies; + + // order layers by print_z + ctxt.layers.reserve(print_object.layers.size() + print_object.support_layers.size()); + for (const Layer *layer : print_object.layers) + ctxt.layers.push_back(layer); + for (const Layer *layer : print_object.support_layers) + ctxt.layers.push_back(layer); + std::sort(ctxt.layers.begin(), ctxt.layers.end(), [](const Layer *l1, const Layer *l2) { return l1->print_z < l2->print_z; }); + + // Maximum size of an allocation block: 32MB / sizeof(float) + ctxt.has_perimeters = print_object.state.is_done(posPerimeters); + ctxt.has_infill = print_object.state.is_done(posInfill); + ctxt.has_support = print_object.state.is_done(posSupportMaterial); + ctxt.tool_colors = tool_colors.empty() ? nullptr : &tool_colors; + + BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - start"; + + //FIXME Improve the heuristics for a grain size. + size_t grain_size = std::max(ctxt.layers.size() / 16, size_t(1)); + tbb::spin_mutex new_volume_mutex; + auto new_volume = [this, &new_volume_mutex](const float *color) -> GLVolume* { + auto *volume = new GLVolume(color); + new_volume_mutex.lock(); + volume->outside_printer_detection_enabled = false; + m_volumes.volumes.emplace_back(volume); + new_volume_mutex.unlock(); + return volume; + }; + const size_t volumes_cnt_initial = m_volumes.volumes.size(); + std::vector volumes_per_thread(ctxt.layers.size()); + tbb::parallel_for( + tbb::blocked_range(0, ctxt.layers.size(), grain_size), + [&ctxt, &new_volume](const tbb::blocked_range& range) { + std::vector vols; + if (ctxt.color_by_tool()) { + for (size_t i = 0; i < ctxt.number_tools(); ++i) + vols.emplace_back(new_volume(ctxt.color_tool(i))); + } + else + vols = { new_volume(ctxt.color_perimeters()), new_volume(ctxt.color_infill()), new_volume(ctxt.color_support()) }; + for (GLVolume *vol : vols) + vol->indexed_vertex_array.reserve(ctxt.alloc_size_reserve()); + for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++idx_layer) { + const Layer *layer = ctxt.layers[idx_layer]; + for (size_t i = 0; i < vols.size(); ++i) { + GLVolume &vol = *vols[i]; + if (vol.print_zs.empty() || vol.print_zs.back() != layer->print_z) { + vol.print_zs.push_back(layer->print_z); + vol.offsets.push_back(vol.indexed_vertex_array.quad_indices.size()); + vol.offsets.push_back(vol.indexed_vertex_array.triangle_indices.size()); + } + } + for (const Point © : *ctxt.shifted_copies) { + for (const LayerRegion *layerm : layer->regions) { + if (ctxt.has_perimeters) + _3DScene::extrusionentity_to_verts(layerm->perimeters, float(layer->print_z), copy, + *vols[ctxt.volume_idx(layerm->region()->config.perimeter_extruder.value, 0)]); + if (ctxt.has_infill) { + for (const ExtrusionEntity *ee : layerm->fills.entities) { + // fill represents infill extrusions of a single island. + const auto *fill = dynamic_cast(ee); + if (!fill->entities.empty()) + _3DScene::extrusionentity_to_verts(*fill, float(layer->print_z), copy, + *vols[ctxt.volume_idx( + is_solid_infill(fill->entities.front()->role()) ? + layerm->region()->config.solid_infill_extruder : + layerm->region()->config.infill_extruder, + 1)]); + } + } + } + if (ctxt.has_support) { + const SupportLayer *support_layer = dynamic_cast(layer); + if (support_layer) { + for (const ExtrusionEntity *extrusion_entity : support_layer->support_fills.entities) + _3DScene::extrusionentity_to_verts(extrusion_entity, float(layer->print_z), copy, + *vols[ctxt.volume_idx( + (extrusion_entity->role() == erSupportMaterial) ? + support_layer->object()->config.support_material_extruder : + support_layer->object()->config.support_material_interface_extruder, + 2)]); + } + } + } + for (size_t i = 0; i < vols.size(); ++i) { + GLVolume &vol = *vols[i]; + if (vol.indexed_vertex_array.vertices_and_normals_interleaved.size() / 6 > ctxt.alloc_size_max()) { + // Store the vertex arrays and restart their containers, + vols[i] = new_volume(vol.color); + GLVolume &vol_new = *vols[i]; + // Assign the large pre-allocated buffers to the new GLVolume. + vol_new.indexed_vertex_array = std::move(vol.indexed_vertex_array); + // Copy the content back to the old GLVolume. + vol.indexed_vertex_array = vol_new.indexed_vertex_array; + // Finalize a bounding box of the old GLVolume. + vol.bounding_box = vol.indexed_vertex_array.bounding_box(); + // Clear the buffers, but keep them pre-allocated. + vol_new.indexed_vertex_array.clear(); + // Just make sure that clear did not clear the reserved memory. + vol_new.indexed_vertex_array.reserve(ctxt.alloc_size_reserve()); + } + } + } + for (GLVolume *vol : vols) { + vol->bounding_box = vol->indexed_vertex_array.bounding_box(); + vol->indexed_vertex_array.shrink_to_fit(); + } + }); + + BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - finalizing results"; + // Remove empty volumes from the newly added volumes. + m_volumes.volumes.erase( + std::remove_if(m_volumes.volumes.begin() + volumes_cnt_initial, m_volumes.volumes.end(), + [](const GLVolume *volume) { return volume->empty(); }), + m_volumes.volumes.end()); + for (size_t i = volumes_cnt_initial; i < m_volumes.volumes.size(); ++i) + m_volumes.volumes[i]->indexed_vertex_array.finalize_geometry(m_use_VBOs && m_initialized); + + BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - end"; +} + +void GLCanvas3D::_load_wipe_tower_toolpaths(const std::vector& str_tool_colors) +{ + if ((m_print == nullptr) || m_print->m_wipe_tower_tool_changes.empty()) + return; + + if (!m_print->state.is_done(psWipeTower)) + return; + + std::vector tool_colors = _parse_colors(str_tool_colors); + + struct Ctxt + { + const Print *print; + const std::vector *tool_colors; + + // Number of vertices (each vertex is 6x4=24 bytes long) + static const size_t alloc_size_max() { return 131072; } // 3.15MB + static const size_t alloc_size_reserve() { return alloc_size_max() * 2; } + + static const float* color_support() { static float color[4] = { 0.5f, 1.0f, 0.5f, 1.f }; return color; } // greenish + + // For cloring by a tool, return a parsed color. + bool color_by_tool() const { return tool_colors != nullptr; } + size_t number_tools() const { return this->color_by_tool() ? tool_colors->size() / 4 : 0; } + const float* color_tool(size_t tool) const { return tool_colors->data() + tool * 4; } + int volume_idx(int tool, int feature) const + { + return this->color_by_tool() ? std::min(this->number_tools() - 1, std::max(tool, 0)) : feature; + } + + const std::vector& tool_change(size_t idx) { + return priming.empty() ? + ((idx == print->m_wipe_tower_tool_changes.size()) ? final : print->m_wipe_tower_tool_changes[idx]) : + ((idx == 0) ? priming : (idx == print->m_wipe_tower_tool_changes.size() + 1) ? final : print->m_wipe_tower_tool_changes[idx - 1]); + } + std::vector priming; + std::vector final; + } ctxt; + + ctxt.print = m_print; + ctxt.tool_colors = tool_colors.empty() ? nullptr : &tool_colors; + if (m_print->m_wipe_tower_priming) + ctxt.priming.emplace_back(*m_print->m_wipe_tower_priming.get()); + if (m_print->m_wipe_tower_final_purge) + ctxt.final.emplace_back(*m_print->m_wipe_tower_final_purge.get()); + + BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - start"; + + //FIXME Improve the heuristics for a grain size. + size_t n_items = m_print->m_wipe_tower_tool_changes.size() + (ctxt.priming.empty() ? 0 : 1); + size_t grain_size = std::max(n_items / 128, size_t(1)); + tbb::spin_mutex new_volume_mutex; + auto new_volume = [this, &new_volume_mutex](const float *color) -> GLVolume* { + auto *volume = new GLVolume(color); + new_volume_mutex.lock(); + volume->outside_printer_detection_enabled = false; + m_volumes.volumes.emplace_back(volume); + new_volume_mutex.unlock(); + return volume; + }; + const size_t volumes_cnt_initial = m_volumes.volumes.size(); + std::vector volumes_per_thread(n_items); + tbb::parallel_for( + tbb::blocked_range(0, n_items, grain_size), + [&ctxt, &new_volume](const tbb::blocked_range& range) { + // Bounding box of this slab of a wipe tower. + std::vector vols; + if (ctxt.color_by_tool()) { + for (size_t i = 0; i < ctxt.number_tools(); ++i) + vols.emplace_back(new_volume(ctxt.color_tool(i))); + } + else + vols = { new_volume(ctxt.color_support()) }; + for (GLVolume *volume : vols) + volume->indexed_vertex_array.reserve(ctxt.alloc_size_reserve()); + for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++idx_layer) { + const std::vector &layer = ctxt.tool_change(idx_layer); + for (size_t i = 0; i < vols.size(); ++i) { + GLVolume &vol = *vols[i]; + if (vol.print_zs.empty() || vol.print_zs.back() != layer.front().print_z) { + vol.print_zs.push_back(layer.front().print_z); + vol.offsets.push_back(vol.indexed_vertex_array.quad_indices.size()); + vol.offsets.push_back(vol.indexed_vertex_array.triangle_indices.size()); + } + } + for (const WipeTower::ToolChangeResult &extrusions : layer) { + for (size_t i = 1; i < extrusions.extrusions.size();) { + const WipeTower::Extrusion &e = extrusions.extrusions[i]; + if (e.width == 0.) { + ++i; + continue; + } + size_t j = i + 1; + if (ctxt.color_by_tool()) + for (; j < extrusions.extrusions.size() && extrusions.extrusions[j].tool == e.tool && extrusions.extrusions[j].width > 0.f; ++j); + else + for (; j < extrusions.extrusions.size() && extrusions.extrusions[j].width > 0.f; ++j); + size_t n_lines = j - i; + Lines lines; + std::vector widths; + std::vector heights; + lines.reserve(n_lines); + widths.reserve(n_lines); + heights.assign(n_lines, extrusions.layer_height); + for (; i < j; ++i) { + const WipeTower::Extrusion &e = extrusions.extrusions[i]; + assert(e.width > 0.f); + const WipeTower::Extrusion &e_prev = *(&e - 1); + lines.emplace_back(Point::new_scale(e_prev.pos.x, e_prev.pos.y), Point::new_scale(e.pos.x, e.pos.y)); + widths.emplace_back(e.width); + } + _3DScene::thick_lines_to_verts(lines, widths, heights, lines.front().a == lines.back().b, extrusions.print_z, + *vols[ctxt.volume_idx(e.tool, 0)]); + } + } + } + for (size_t i = 0; i < vols.size(); ++i) { + GLVolume &vol = *vols[i]; + if (vol.indexed_vertex_array.vertices_and_normals_interleaved.size() / 6 > ctxt.alloc_size_max()) { + // Store the vertex arrays and restart their containers, + vols[i] = new_volume(vol.color); + GLVolume &vol_new = *vols[i]; + // Assign the large pre-allocated buffers to the new GLVolume. + vol_new.indexed_vertex_array = std::move(vol.indexed_vertex_array); + // Copy the content back to the old GLVolume. + vol.indexed_vertex_array = vol_new.indexed_vertex_array; + // Finalize a bounding box of the old GLVolume. + vol.bounding_box = vol.indexed_vertex_array.bounding_box(); + // Clear the buffers, but keep them pre-allocated. + vol_new.indexed_vertex_array.clear(); + // Just make sure that clear did not clear the reserved memory. + vol_new.indexed_vertex_array.reserve(ctxt.alloc_size_reserve()); + } + } + for (GLVolume *vol : vols) { + vol->bounding_box = vol->indexed_vertex_array.bounding_box(); + vol->indexed_vertex_array.shrink_to_fit(); + } + }); + + BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - finalizing results"; + // Remove empty volumes from the newly added volumes. + m_volumes.volumes.erase( + std::remove_if(m_volumes.volumes.begin() + volumes_cnt_initial, m_volumes.volumes.end(), + [](const GLVolume *volume) { return volume->empty(); }), + m_volumes.volumes.end()); + for (size_t i = volumes_cnt_initial; i < m_volumes.volumes.size(); ++i) + m_volumes.volumes[i]->indexed_vertex_array.finalize_geometry(m_use_VBOs && m_initialized); + + BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - end"; +} + static inline int hex_digit_to_int(const char c) { return @@ -4643,6 +4662,7 @@ void GLCanvas3D::_update_gcode_volumes_visibility(const GCodePreviewData& previe for (std::vector::iterator it = begin; it != end; ++it) { GLVolume* volume = *it; + // to avoid the shader to change the color of this volume if outside the print volume volume->outside_printer_detection_enabled = false; switch (m_gcode_preview_volume_index.first_volumes[i].type) @@ -4691,6 +4711,55 @@ void GLCanvas3D::_update_gcode_volumes_visibility(const GCodePreviewData& previe } } +void GLCanvas3D::_update_toolpath_volumes_outside_state() +{ + // tolerance to avoid false detection at bed edges + static const coordf_t tolerance_x = 0.05; + static const coordf_t tolerance_y = 0.05; + + BoundingBoxf3 print_volume; + if (m_config != nullptr) + { + const ConfigOptionPoints* opt = dynamic_cast(m_config->option("bed_shape")); + if (opt != nullptr) + { + BoundingBox bed_box_2D = get_extents(Polygon::new_scale(opt->values)); + print_volume = BoundingBoxf3(Pointf3(unscale(bed_box_2D.min.x) - tolerance_x, unscale(bed_box_2D.min.y) - tolerance_y, 0.0), Pointf3(unscale(bed_box_2D.max.x) + tolerance_x, unscale(bed_box_2D.max.y) + tolerance_y, m_config->opt_float("max_print_height"))); + // Allow the objects to protrude below the print bed + print_volume.min.z = -1e10; + } + } + + for (GLVolume* volume : m_volumes.volumes) + { + volume->is_outside = (print_volume.radius() > 0.0) ? !print_volume.contains(volume->transformed_bounding_box()) : false; + } +} + +void GLCanvas3D::_show_warning_texture_if_needed() +{ + bool detected_outside = false; + for (const GLVolume* volume : m_volumes.volumes) + { + if ((volume != nullptr) && volume->is_outside) + { + detected_outside = true; + break; + } + } + + if (detected_outside) + { + enable_warning_texture(true); + _generate_warning_texture(L("Detected toolpath outside print volume")); + } + else + { + enable_warning_texture(false); + _reset_warning_texture(); + } +} + void GLCanvas3D::_on_move(const std::vector& volume_idxs) { if (m_model == nullptr) diff --git a/xs/src/slic3r/GUI/GLCanvas3D.hpp b/xs/src/slic3r/GUI/GLCanvas3D.hpp index a9a6117ecc..d52d69eebf 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.hpp @@ -559,16 +559,8 @@ public: void reload_scene(bool force); - // Create 3D thick extrusion lines for a skirt and brim. - // Adds a new Slic3r::GUI::3DScene::Volume to volumes. - void load_print_toolpaths(); - // Create 3D thick extrusion lines for object forming extrusions. - // Adds a new Slic3r::GUI::3DScene::Volume to $self->volumes, - // one for perimeters, one for infill and one for supports. - void load_print_object_toolpaths(const PrintObject& print_object, const std::vector& str_tool_colors); - // Create 3D thick extrusion lines for wipe tower extrusions - void load_wipe_tower_toolpaths(const std::vector& str_tool_colors); void load_gcode_preview(const GCodePreviewData& preview_data, const std::vector& str_tool_colors); + void load_preview(const std::vector& str_tool_colors); void register_on_viewport_changed_callback(void* callback); void register_on_double_click_callback(void* callback); @@ -652,6 +644,16 @@ private: int _get_first_selected_object_id() const; int _get_first_selected_volume_id() const; + // Create 3D thick extrusion lines for a skirt and brim. + // Adds a new Slic3r::GUI::3DScene::Volume to volumes. + void _load_print_toolpaths(); + // Create 3D thick extrusion lines for object forming extrusions. + // Adds a new Slic3r::GUI::3DScene::Volume to $self->volumes, + // one for perimeters, one for infill and one for supports. + void _load_print_object_toolpaths(const PrintObject& print_object, const std::vector& str_tool_colors); + // Create 3D thick extrusion lines for wipe tower extrusions + void _load_wipe_tower_toolpaths(const std::vector& str_tool_colors); + // generates gcode extrusion paths geometry void _load_gcode_extrusion_paths(const GCodePreviewData& preview_data, const std::vector& tool_colors); // generates gcode travel paths geometry @@ -667,6 +669,8 @@ private: void _load_shells(); // sets gcode geometry visibility according to user selection void _update_gcode_volumes_visibility(const GCodePreviewData& preview_data); + void _update_toolpath_volumes_outside_state(); + void _show_warning_texture_if_needed(); void _on_move(const std::vector& volume_idxs); void _on_select(int volume_idx); diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp index 5e9048d541..25733c7a26 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp @@ -516,30 +516,6 @@ void GLCanvas3DManager::reload_scene(wxGLCanvas* canvas, bool force) it->second->reload_scene(force); } -void GLCanvas3DManager::load_print_toolpaths(wxGLCanvas* canvas) -{ - CanvasesMap::iterator it = _get_canvas(canvas); - if (it != m_canvases.end()) - it->second->load_print_toolpaths(); -} - -void GLCanvas3DManager::load_print_object_toolpaths(wxGLCanvas* canvas, const PrintObject* print_object, const std::vector& tool_colors) -{ - if (print_object == nullptr) - return; - - CanvasesMap::iterator it = _get_canvas(canvas); - if (it != m_canvases.end()) - it->second->load_print_object_toolpaths(*print_object, tool_colors); -} - -void GLCanvas3DManager::load_wipe_tower_toolpaths(wxGLCanvas* canvas, const std::vector& str_tool_colors) -{ - CanvasesMap::iterator it = _get_canvas(canvas); - if (it != m_canvases.end()) - it->second->load_wipe_tower_toolpaths(str_tool_colors); -} - void GLCanvas3DManager::load_gcode_preview(wxGLCanvas* canvas, const GCodePreviewData* preview_data, const std::vector& str_tool_colors) { if (preview_data == nullptr) @@ -550,6 +526,13 @@ void GLCanvas3DManager::load_gcode_preview(wxGLCanvas* canvas, const GCodePrevie it->second->load_gcode_preview(*preview_data, str_tool_colors); } +void GLCanvas3DManager::load_preview(wxGLCanvas* canvas, const std::vector& str_tool_colors) +{ + CanvasesMap::iterator it = _get_canvas(canvas); + if (it != m_canvases.end()) + it->second->load_preview(str_tool_colors); +} + void GLCanvas3DManager::reset_legend_texture() { for (CanvasesMap::value_type& canvas : m_canvases) diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp index 32aa712d35..f27293273e 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp @@ -132,10 +132,8 @@ public: void reload_scene(wxGLCanvas* canvas, bool force); - void load_print_toolpaths(wxGLCanvas* canvas); - void load_print_object_toolpaths(wxGLCanvas* canvas, const PrintObject* print_object, const std::vector& tool_colors); - void load_wipe_tower_toolpaths(wxGLCanvas* canvas, const std::vector& str_tool_colors); void load_gcode_preview(wxGLCanvas* canvas, const GCodePreviewData* preview_data, const std::vector& str_tool_colors); + void load_preview(wxGLCanvas* canvas, const std::vector& str_tool_colors); void reset_legend_texture(); diff --git a/xs/xsp/GUI_3DScene.xsp b/xs/xsp/GUI_3DScene.xsp index 5c2f7df854..e094941462 100644 --- a/xs/xsp/GUI_3DScene.xsp +++ b/xs/xsp/GUI_3DScene.xsp @@ -657,27 +657,6 @@ reload_scene(canvas, force) CODE: _3DScene::reload_scene((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), force); -void -load_print_toolpaths(canvas) - SV *canvas; - CODE: - _3DScene::load_print_toolpaths((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas")); - -void -load_print_object_toolpaths(canvas, print_object, tool_colors) - SV *canvas; - PrintObject *print_object; - std::vector tool_colors; - CODE: - _3DScene::load_print_object_toolpaths((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), print_object, tool_colors); - -void -load_wipe_tower_toolpaths(canvas, tool_colors) - SV *canvas; - std::vector tool_colors; - CODE: - _3DScene::load_wipe_tower_toolpaths((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), tool_colors); - void load_gcode_preview(canvas, preview_data, str_tool_colors) SV *canvas; @@ -685,5 +664,12 @@ load_gcode_preview(canvas, preview_data, str_tool_colors) std::vector str_tool_colors; CODE: _3DScene::load_gcode_preview((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), preview_data, str_tool_colors); - + +void +load_preview(canvas, str_tool_colors) + SV *canvas; + std::vector str_tool_colors; + CODE: + _3DScene::load_preview((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), str_tool_colors); + %} From d8f5daf345d09e61a6e6fd48ad1d09d6d1b073fb Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 24 Jul 2018 15:32:44 +0200 Subject: [PATCH 05/21] Fixed selection of object modified by gizmo --- xs/src/slic3r/GUI/GLCanvas3D.cpp | 33 +++++++++----------------------- xs/src/slic3r/GUI/GLCanvas3D.hpp | 2 +- 2 files changed, 10 insertions(+), 25 deletions(-) diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index 819f26609d..193ccd0687 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -2715,7 +2715,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) { update_gizmos_data(); m_gizmos.start_dragging(); - m_mouse.drag.gizmo_volume_idx = _get_first_selected_volume_id(); + m_mouse.drag.gizmo_volume_idx = _get_first_selected_volume_id(selected_object_idx); m_dirty = true; } else @@ -3736,32 +3736,17 @@ int GLCanvas3D::_get_first_selected_object_id() const return -1; } -int GLCanvas3D::_get_first_selected_volume_id() const +int GLCanvas3D::_get_first_selected_volume_id(int object_id) const { - if (m_print != nullptr) - { - int objects_count = (int)m_print->objects.size(); + int volume_id = -1; - for (const GLVolume* vol : m_volumes.volumes) - { - if ((vol != nullptr) && vol->selected) - { - int object_id = vol->select_group_id / 1000000; - // Objects with object_id >= 1000 have a specific meaning, for example the wipe tower proxy. - if ((object_id < 10000) && (object_id < objects_count)) - { - int volume_id = 0; - for (int i = 0; i < object_id; ++i) - { - const PrintObject* obj = m_print->objects[i]; - const ModelObject* model = obj->model_object(); - volume_id += model->instances.size(); - } - return volume_id; - } - } - } + for (const GLVolume* vol : m_volumes.volumes) + { + ++volume_id; + if ((vol != nullptr) && vol->selected && (object_id == vol->select_group_id / 1000000)) + return volume_id; } + return -1; } diff --git a/xs/src/slic3r/GUI/GLCanvas3D.hpp b/xs/src/slic3r/GUI/GLCanvas3D.hpp index d52d69eebf..0d8cf8855e 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.hpp @@ -642,7 +642,7 @@ private: void _stop_timer(); int _get_first_selected_object_id() const; - int _get_first_selected_volume_id() const; + int _get_first_selected_volume_id(int object_id) const; // Create 3D thick extrusion lines for a skirt and brim. // Adds a new Slic3r::GUI::3DScene::Volume to volumes. From 2107ea7702d56810c584f3fcafff5555458a86f9 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 25 Jul 2018 08:40:34 +0200 Subject: [PATCH 06/21] Fixed selection of multimaterial objects --- xs/src/slic3r/GUI/GLCanvas3D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index 193ccd0687..3ee1fdb02c 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -2816,7 +2816,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) { if (v != nullptr) { - if ((m_mouse.drag.move_with_shift && (v->select_group_id == group_id)) || (v->drag_group_id == group_id)) + if ((m_mouse.drag.move_with_shift && (v->select_group_id == group_id)) || (!m_mouse.drag.move_with_shift && (v->drag_group_id == group_id))) volumes.push_back(v); } } From 4243c7d84aff757108d365c147955210c7058b86 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 25 Jul 2018 09:42:03 +0200 Subject: [PATCH 07/21] Removed 2D panel --- lib/Slic3r/GUI/Plater.pm | 157 ++++++++++++++++++++------------------- 1 file changed, 79 insertions(+), 78 deletions(-) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index c0718c77be..0433deac66 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -128,8 +128,8 @@ sub new { } $_->set_scaling_factor($scale) for @{ $model_object->instances }; - $self->{list}->SetItem($obj_idx, 2, ($model_object->instances->[0]->scaling_factor * 100) . "%"); - $object->transform_thumbnail($self->{model}, $obj_idx); + $self->{list}->SetItem($obj_idx, 2, ($model_object->instances->[0]->scaling_factor * 100) . "%"); +# $object->transform_thumbnail($self->{model}, $obj_idx); #update print and start background processing $self->{print}->add_model_object($model_object, $obj_idx); @@ -203,13 +203,13 @@ sub new { Slic3r::GUI::_3DScene::register_on_viewport_changed_callback($self->{canvas3D}, sub { Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{preview3D}->canvas, $self->{canvas3D}); }); } - # Initialize 2D preview canvas - $self->{canvas} = Slic3r::GUI::Plater::2D->new($self->{preview_notebook}, wxDefaultSize, $self->{objects}, $self->{model}, $self->{config}); - $self->{preview_notebook}->AddPage($self->{canvas}, L('2D')); - $self->{canvas}->on_select_object($on_select_object); - $self->{canvas}->on_double_click($on_double_click); - $self->{canvas}->on_right_click(sub { $on_right_click->($self->{canvas}, @_); }); - $self->{canvas}->on_instances_moved($on_instances_moved); +# # Initialize 2D preview canvas +# $self->{canvas} = Slic3r::GUI::Plater::2D->new($self->{preview_notebook}, wxDefaultSize, $self->{objects}, $self->{model}, $self->{config}); +# $self->{preview_notebook}->AddPage($self->{canvas}, L('2D')); +# $self->{canvas}->on_select_object($on_select_object); +# $self->{canvas}->on_double_click($on_double_click); +# $self->{canvas}->on_right_click(sub { $on_right_click->($self->{canvas}, @_); }); +# $self->{canvas}->on_instances_moved($on_instances_moved); # Initialize 3D toolpaths preview if ($Slic3r::GUI::have_OpenGL) { @@ -401,7 +401,8 @@ sub new { $_->SetDropTarget(Slic3r::GUI::Plater::DropTarget->new($self)) for grep defined($_), - $self, $self->{canvas}, $self->{canvas3D}, $self->{preview3D}, $self->{list}; + $self, $self->{canvas3D}, $self->{preview3D}, $self->{list}; +# $self, $self->{canvas}, $self->{canvas3D}, $self->{preview3D}, $self->{list}; EVT_COMMAND($self, -1, $PROGRESS_BAR_EVENT, sub { my ($self, $event) = @_; @@ -432,7 +433,7 @@ sub new { }); } - $self->{canvas}->update_bed_size; +# $self->{canvas}->update_bed_size; if ($self->{canvas3D}) { Slic3r::GUI::_3DScene::set_bed_shape($self->{canvas3D}, $self->{config}->bed_shape); Slic3r::GUI::_3DScene::zoom_to_bed($self->{canvas3D}); @@ -847,8 +848,8 @@ sub load_model_objects { $self->{list}->SetItem($obj_idx, 1, $model_object->instances_count); $self->{list}->SetItem($obj_idx, 2, ($model_object->instances->[0]->scaling_factor * 100) . "%"); - - $self->reset_thumbnail($obj_idx); + +# $self->reset_thumbnail($obj_idx); } $self->arrange if $need_arrange; $self->update; @@ -1057,7 +1058,7 @@ sub rotate { $inst->set_rotation($rotation); Slic3r::GUI::_3DScene::update_gizmos_data($self->{canvas3D}) if ($self->{canvas3D}); } - $object->transform_thumbnail($self->{model}, $obj_idx); +# $object->transform_thumbnail($self->{model}, $obj_idx); } else { # rotation around X and Y needs to be performed on mesh # so we first apply any Z rotation @@ -1067,9 +1068,9 @@ sub rotate { } $model_object->rotate(deg2rad($angle), $axis); - # realign object to Z = 0 - $model_object->center_around_origin; - $self->reset_thumbnail($obj_idx); +# # realign object to Z = 0 +# $model_object->center_around_origin; +# $self->reset_thumbnail($obj_idx); } # update print and start background processing @@ -1097,9 +1098,9 @@ sub mirror { $model_object->mirror($axis); - # realign object to Z = 0 - $model_object->center_around_origin; - $self->reset_thumbnail($obj_idx); +# # realign object to Z = 0 +# $model_object->center_around_origin; +# $self->reset_thumbnail($obj_idx); # update print and start background processing $self->stop_background_process; @@ -1149,7 +1150,7 @@ sub changescale { #FIXME Scale the layer height profile when $axis == Z? #FIXME Scale the layer height ranges $axis == Z? # object was already aligned to Z = 0, so no need to realign it - $self->reset_thumbnail($obj_idx); +# $self->reset_thumbnail($obj_idx); } else { my $scale; if ($tosize) { @@ -1173,7 +1174,7 @@ sub changescale { $range->[1] *= $variation; } $_->set_scaling_factor($scale) for @{ $model_object->instances }; - $object->transform_thumbnail($self->{model}, $obj_idx); +# $object->transform_thumbnail($self->{model}, $obj_idx); } # update print and start background processing @@ -1804,10 +1805,10 @@ sub _get_export_file { return $output_file; } -sub reset_thumbnail { - my ($self, $obj_idx) = @_; - $self->{objects}[$obj_idx]->thumbnail(undef); -} +#sub reset_thumbnail { +# my ($self, $obj_idx) = @_; +# $self->{objects}[$obj_idx]->thumbnail(undef); +#} # this method gets called whenever print center is changed or the objects' bounding box changes # (i.e. when an object is added/removed/moved/rotated/scaled) @@ -1831,7 +1832,7 @@ sub update { $self->resume_background_process; } - $self->{canvas}->reload_scene if $self->{canvas}; +# $self->{canvas}->reload_scene if $self->{canvas}; my $selections = $self->collect_selections; Slic3r::GUI::_3DScene::set_objects_selections($self->{canvas3D}, \@$selections); Slic3r::GUI::_3DScene::reload_scene($self->{canvas3D}, 0); @@ -1888,7 +1889,7 @@ sub on_config_change { foreach my $opt_key (@{$self->{config}->diff($config)}) { $self->{config}->set($opt_key, $config->get($opt_key)); if ($opt_key eq 'bed_shape') { - $self->{canvas}->update_bed_size; +# $self->{canvas}->update_bed_size; Slic3r::GUI::_3DScene::set_bed_shape($self->{canvas3D}, $self->{config}->bed_shape) if $self->{canvas3D}; Slic3r::GUI::_3DScene::set_bed_shape($self->{preview3D}->canvas, $self->{config}->bed_shape) if $self->{preview3D}; $update_scheduled = 1; @@ -1948,7 +1949,7 @@ sub list_item_deselected { $self->{_lecursor} = Wx::BusyCursor->new(); if ($self->{list}->GetFirstSelected == -1) { $self->select_object(undef); - $self->{canvas}->Refresh; +# $self->{canvas}->Refresh; Slic3r::GUI::_3DScene::deselect_volumes($self->{canvas3D}) if $self->{canvas3D}; Slic3r::GUI::_3DScene::render($self->{canvas3D}) if $self->{canvas3D}; } @@ -1961,7 +1962,7 @@ sub list_item_selected { $self->{_lecursor} = Wx::BusyCursor->new(); my $obj_idx = $event->GetIndex; $self->select_object($obj_idx); - $self->{canvas}->Refresh; +# $self->{canvas}->Refresh; if ($self->{canvas3D}) { my $selections = $self->collect_selections; Slic3r::GUI::_3DScene::update_volumes_selection($self->{canvas3D}, \@$selections); @@ -2058,19 +2059,19 @@ sub object_settings_dialog { $self->pause_background_process; $dlg->ShowModal; - # update thumbnail since parts may have changed - if ($dlg->PartsChanged) { - # recenter and re-align to Z = 0 - $model_object->center_around_origin; - $self->reset_thumbnail($obj_idx); - } +# # update thumbnail since parts may have changed +# if ($dlg->PartsChanged) { +# # recenter and re-align to Z = 0 +# $model_object->center_around_origin; +# $self->reset_thumbnail($obj_idx); +# } # update print if ($dlg->PartsChanged || $dlg->PartSettingsChanged) { $self->stop_background_process; $self->{print}->reload_object($obj_idx); $self->schedule_background_process; - $self->{canvas}->reload_scene if $self->{canvas}; +# $self->{canvas}->reload_scene if $self->{canvas}; my $selections = $self->collect_selections; Slic3r::GUI::_3DScene::set_objects_selections($self->{canvas3D}, \@$selections); Slic3r::GUI::_3DScene::reload_scene($self->{canvas3D}, 0); @@ -2356,48 +2357,48 @@ package Slic3r::GUI::Plater::Object; use Moo; has 'name' => (is => 'rw', required => 1); -has 'thumbnail' => (is => 'rw'); # ExPolygon::Collection in scaled model units with no transforms -has 'transformed_thumbnail' => (is => 'rw'); -has 'instance_thumbnails' => (is => 'ro', default => sub { [] }); # array of ExPolygon::Collection objects, each one representing the actual placed thumbnail of each instance in pixel units +#has 'thumbnail' => (is => 'rw'); # ExPolygon::Collection in scaled model units with no transforms +#has 'transformed_thumbnail' => (is => 'rw'); +#has 'instance_thumbnails' => (is => 'ro', default => sub { [] }); # array of ExPolygon::Collection objects, each one representing the actual placed thumbnail of each instance in pixel units has 'selected' => (is => 'rw', default => sub { 0 }); -sub make_thumbnail { - my ($self, $model, $obj_idx) = @_; - # make method idempotent - $self->thumbnail->clear; - # raw_mesh is the non-transformed (non-rotated, non-scaled, non-translated) sum of non-modifier object volumes. - my $mesh = $model->objects->[$obj_idx]->raw_mesh; -#FIXME The "correct" variant could be extremely slow. -# if ($mesh->facets_count <= 5000) { -# # remove polygons with area <= 1mm -# my $area_threshold = Slic3r::Geometry::scale 1; -# $self->thumbnail->append( -# grep $_->area >= $area_threshold, -# @{ $mesh->horizontal_projection }, # horizontal_projection returns scaled expolygons -# ); -# $self->thumbnail->simplify(0.5); -# } else { - my $convex_hull = Slic3r::ExPolygon->new($mesh->convex_hull); - $self->thumbnail->append($convex_hull); -# } - return $self->thumbnail; -} - -sub transform_thumbnail { - my ($self, $model, $obj_idx) = @_; - - return unless defined $self->thumbnail; - - my $model_object = $model->objects->[$obj_idx]; - my $model_instance = $model_object->instances->[0]; - - # the order of these transformations MUST be the same everywhere, including - # in Slic3r::Print->add_model_object() - my $t = $self->thumbnail->clone; - $t->rotate($model_instance->rotation, Slic3r::Point->new(0,0)); - $t->scale($model_instance->scaling_factor); - - $self->transformed_thumbnail($t); -} +#sub make_thumbnail { +# my ($self, $model, $obj_idx) = @_; +# # make method idempotent +# $self->thumbnail->clear; +# # raw_mesh is the non-transformed (non-rotated, non-scaled, non-translated) sum of non-modifier object volumes. +# my $mesh = $model->objects->[$obj_idx]->raw_mesh; +##FIXME The "correct" variant could be extremely slow. +## if ($mesh->facets_count <= 5000) { +## # remove polygons with area <= 1mm +## my $area_threshold = Slic3r::Geometry::scale 1; +## $self->thumbnail->append( +## grep $_->area >= $area_threshold, +## @{ $mesh->horizontal_projection }, # horizontal_projection returns scaled expolygons +## ); +## $self->thumbnail->simplify(0.5); +## } else { +# my $convex_hull = Slic3r::ExPolygon->new($mesh->convex_hull); +# $self->thumbnail->append($convex_hull); +## } +# return $self->thumbnail; +#} +# +#sub transform_thumbnail { +# my ($self, $model, $obj_idx) = @_; +# +# return unless defined $self->thumbnail; +# +# my $model_object = $model->objects->[$obj_idx]; +# my $model_instance = $model_object->instances->[0]; +# +# # the order of these transformations MUST be the same everywhere, including +# # in Slic3r::Print->add_model_object() +# my $t = $self->thumbnail->clone; +# $t->rotate($model_instance->rotation, Slic3r::Point->new(0,0)); +# $t->scale($model_instance->scaling_factor); +# +# $self->transformed_thumbnail($t); +#} 1; From efbc1cce2511c0a47d0dee7fd45df897e27ca982 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 25 Jul 2018 11:49:38 +0200 Subject: [PATCH 08/21] Fixed rotate gizmo update with multimaterial objects --- xs/src/slic3r/GUI/GLCanvas3D.cpp | 42 ++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index 3ee1fdb02c..5ad9da9c4e 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -2887,7 +2887,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (!volumes.empty()) { - const BoundingBoxf3& bb = volumes[0]->transformed_bounding_box(); + BoundingBoxf3 bb; + for (const GLVolume* volume : volumes) + { + bb.merge(volume->transformed_bounding_box()); + } const Pointf3& size = bb.size(); m_on_update_geometry_info_callback.call(size.x, size.y, size.z, m_gizmos.get_scale()); } @@ -3155,11 +3159,45 @@ BoundingBoxf3 GLCanvas3D::_max_bounding_box() const BoundingBoxf3 GLCanvas3D::_selected_volumes_bounding_box() const { BoundingBoxf3 bb; + + std::vector selected_volumes; for (const GLVolume* volume : m_volumes.volumes) { if ((volume != nullptr) && !volume->is_wipe_tower && volume->selected) - bb.merge(volume->transformed_bounding_box()); + selected_volumes.push_back(volume); } + + bool use_drag_group_id = selected_volumes.size() > 1; + if (use_drag_group_id) + { + int drag_group_id = selected_volumes[0]->drag_group_id; + for (const GLVolume* volume : selected_volumes) + { + if (drag_group_id != volume->drag_group_id) + { + use_drag_group_id = false; + break; + } + } + } + + if (use_drag_group_id) + { + for (const GLVolume* volume : selected_volumes) + { + bb.merge(volume->bounding_box); + } + + bb = bb.transformed(selected_volumes[0]->world_matrix()); + } + else + { + for (const GLVolume* volume : selected_volumes) + { + bb.merge(volume->transformed_bounding_box()); + } + } + return bb; } From dd014136b00569f9ad7f1ba72676b9f8d3d8fea6 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 26 Jul 2018 12:51:31 +0200 Subject: [PATCH 09/21] Remove hovering on objects when mouse leaves 3D scene --- xs/src/slic3r/GUI/GLCanvas3D.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index 5ad9da9c4e..79ec73625d 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -2678,6 +2678,12 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_mouse.set_start_position_2D_as_invalid(); #endif } + else if (evt.Leaving()) + { + // to remove hover when mouse goes out of this canvas + m_mouse.position = Pointf((coordf_t)pos.x, (coordf_t)pos.y); + render(); + } else if (evt.LeftDClick() && (m_hover_volume_id != -1)) m_on_double_click_callback.call(); else if (evt.LeftDown() || evt.RightDown()) From b5b7894a6f6ac57b3a3f2b2546fc1c98b77f4935 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 26 Jul 2018 13:12:09 +0200 Subject: [PATCH 10/21] Fixed color of all toolpaths when detected as out of print bed volume --- xs/src/slic3r/GUI/3DScene.cpp | 10 +++++----- xs/src/slic3r/GUI/3DScene.hpp | 4 ++-- xs/src/slic3r/GUI/GLCanvas3D.cpp | 4 ---- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index e23641cb18..2d405e54ad 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -210,7 +210,7 @@ GLVolume::GLVolume(float r, float g, float b, float a) , selected(false) , is_active(true) , zoom_to_volumes(true) - , outside_printer_detection_enabled(true) + , shader_outside_printer_detection_enabled(false) , is_outside(false) , hover(false) , is_modifier(false) @@ -250,7 +250,7 @@ void GLVolume::set_render_color() set_render_color(is_outside ? SELECTED_OUTSIDE_COLOR : SELECTED_COLOR, 4); else if (hover) set_render_color(HOVER_COLOR, 4); - else if (is_outside && outside_printer_detection_enabled) + else if (is_outside && shader_outside_printer_detection_enabled) set_render_color(OUTSIDE_COLOR, 4); else set_render_color(color, 4); @@ -441,7 +441,7 @@ void GLVolume::render_VBOs(int color_id, int detection_id, int worldmatrix_id) c ::glColor4f(render_color[0], render_color[1], render_color[2], render_color[3]); if (detection_id != -1) - ::glUniform1i(detection_id, outside_printer_detection_enabled ? 1 : 0); + ::glUniform1i(detection_id, shader_outside_printer_detection_enabled ? 1 : 0); if (worldmatrix_id != -1) ::glUniformMatrix4fv(worldmatrix_id, 1, GL_FALSE, (const GLfloat*)world_matrix().data()); @@ -460,7 +460,7 @@ void GLVolume::render_VBOs(int color_id, int detection_id, int worldmatrix_id) c ::glColor4f(render_color[0], render_color[1], render_color[2], render_color[3]); if (detection_id != -1) - ::glUniform1i(detection_id, outside_printer_detection_enabled ? 1 : 0); + ::glUniform1i(detection_id, shader_outside_printer_detection_enabled ? 1 : 0); if (worldmatrix_id != -1) ::glUniformMatrix4fv(worldmatrix_id, 1, GL_FALSE, (const GLfloat*)world_matrix().data()); @@ -633,7 +633,7 @@ std::vector GLVolumeCollection::load_object( v.extruder_id = extruder_id; } v.is_modifier = model_volume->modifier; - v.outside_printer_detection_enabled = !model_volume->modifier; + v.shader_outside_printer_detection_enabled = !model_volume->modifier; v.set_origin(Pointf3(instance->offset.x, instance->offset.y, 0.0)); v.set_angle_z(instance->rotation); v.set_scale_factor(instance->scaling_factor); diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index 0cd2d81f0e..242487195e 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -289,8 +289,8 @@ public: bool is_active; // Whether or not to use this volume when applying zoom_to_volumes() bool zoom_to_volumes; - // Wheter or not this volume is enabled for outside print volume detection. - bool outside_printer_detection_enabled; + // Wheter or not this volume is enabled for outside print volume detection in shader. + bool shader_outside_printer_detection_enabled; // Wheter or not this volume is outside print volume. bool is_outside; // Boolean: Is mouse over this object? diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index 79ec73625d..6bca173755 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -3910,7 +3910,6 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c auto new_volume = [this, &new_volume_mutex](const float *color) -> GLVolume* { auto *volume = new GLVolume(color); new_volume_mutex.lock(); - volume->outside_printer_detection_enabled = false; m_volumes.volumes.emplace_back(volume); new_volume_mutex.unlock(); return volume; @@ -4063,7 +4062,6 @@ void GLCanvas3D::_load_wipe_tower_toolpaths(const std::vector& str_ auto new_volume = [this, &new_volume_mutex](const float *color) -> GLVolume* { auto *volume = new GLVolume(color); new_volume_mutex.lock(); - volume->outside_printer_detection_enabled = false; m_volumes.volumes.emplace_back(volume); new_volume_mutex.unlock(); return volume; @@ -4691,8 +4689,6 @@ void GLCanvas3D::_update_gcode_volumes_visibility(const GCodePreviewData& previe for (std::vector::iterator it = begin; it != end; ++it) { GLVolume* volume = *it; - // to avoid the shader to change the color of this volume if outside the print volume - volume->outside_printer_detection_enabled = false; switch (m_gcode_preview_volume_index.first_volumes[i].type) { From c2ab8c2ae3af6bd5489a7f1525b65fb51862b724 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 27 Jul 2018 08:49:58 +0200 Subject: [PATCH 11/21] Out of print volume detection for extrusion toolpaths only --- xs/src/slic3r/GUI/3DScene.cpp | 1 + xs/src/slic3r/GUI/3DScene.hpp | 2 ++ xs/src/slic3r/GUI/GLCanvas3D.cpp | 13 +++++++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index 2d405e54ad..601d10aaa0 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -215,6 +215,7 @@ GLVolume::GLVolume(float r, float g, float b, float a) , hover(false) , is_modifier(false) , is_wipe_tower(false) + , is_extrusion_path(false) , tverts_range(0, size_t(-1)) , qverts_range(0, size_t(-1)) { diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index 242487195e..a1227d8ddb 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -299,6 +299,8 @@ public: bool is_modifier; // Wheter or not this volume has been generated from the wipe tower bool is_wipe_tower; + // Wheter or not this volume has been generated from an extrusion path + bool is_extrusion_path; // Interleaved triangles & normals with indexed triangles & quads. GLIndexedVertexArray indexed_vertex_array; diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index 6bca173755..bcd4e65ba6 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -1828,7 +1828,6 @@ unsigned int GLCanvas3D::get_volumes_count() const void GLCanvas3D::reset_volumes() { - if (!m_volumes.empty()) { // ensures this canvas is current @@ -1839,6 +1838,9 @@ void GLCanvas3D::reset_volumes() m_volumes.clear(); m_dirty = true; } + + enable_warning_texture(false); + _reset_warning_texture(); } void GLCanvas3D::deselect_volumes() @@ -2377,6 +2379,12 @@ void GLCanvas3D::load_preview(const std::vector& str_tool_colors) if (object != nullptr) _load_print_object_toolpaths(*object, str_tool_colors); } + + for (GLVolume* volume : m_volumes.volumes) + { + volume->is_extrusion_path = true; + } + _update_toolpath_volumes_outside_state(); _show_warning_texture_if_needed(); reset_legend_texture(); @@ -4276,6 +4284,7 @@ void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_dat if (volume != nullptr) { filter.volume = volume; + volume->is_extrusion_path = true; m_volumes.volumes.emplace_back(volume); } else @@ -4757,7 +4766,7 @@ void GLCanvas3D::_update_toolpath_volumes_outside_state() for (GLVolume* volume : m_volumes.volumes) { - volume->is_outside = (print_volume.radius() > 0.0) ? !print_volume.contains(volume->transformed_bounding_box()) : false; + volume->is_outside = ((print_volume.radius() > 0.0) && volume->is_extrusion_path) ? !print_volume.contains(volume->bounding_box) : false; } } From 3a1ec8285eef3fd1709b40abd0504778a370fcbb Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 27 Jul 2018 09:38:39 +0200 Subject: [PATCH 12/21] Reddish background when detected out of print volume toolpaths --- lib/Slic3r/GUI/Plater.pm | 1 + xs/src/slic3r/GUI/3DScene.cpp | 5 +++ xs/src/slic3r/GUI/3DScene.hpp | 1 + xs/src/slic3r/GUI/GLCanvas3D.cpp | 49 ++++++++++++++++--------- xs/src/slic3r/GUI/GLCanvas3D.hpp | 4 ++ xs/src/slic3r/GUI/GLCanvas3DManager.cpp | 7 ++++ xs/src/slic3r/GUI/GLCanvas3DManager.hpp | 1 + xs/xsp/GUI_3DScene.xsp | 7 ++++ 8 files changed, 57 insertions(+), 18 deletions(-) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 0433deac66..3bcf3b3e6b 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -215,6 +215,7 @@ sub new { if ($Slic3r::GUI::have_OpenGL) { $self->{preview3D} = Slic3r::GUI::Plater::3DPreview->new($self->{preview_notebook}, $self->{print}, $self->{gcode_preview_data}, $self->{config}); Slic3r::GUI::_3DScene::enable_legend_texture($self->{preview3D}->canvas, 1); + Slic3r::GUI::_3DScene::enable_dynamic_background($self->{preview3D}->canvas, 1); Slic3r::GUI::_3DScene::register_on_viewport_changed_callback($self->{preview3D}->canvas, sub { Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{canvas3D}, $self->{preview3D}->canvas); }); $self->{preview_notebook}->AddPage($self->{preview3D}, L('Preview')); $self->{preview3D_page_idx} = $self->{preview_notebook}->GetPageCount-1; diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index 601d10aaa0..6ec3391539 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -1787,6 +1787,11 @@ void _3DScene::enable_force_zoom_to_bed(wxGLCanvas* canvas, bool enable) s_canvas_mgr.enable_force_zoom_to_bed(canvas, enable); } +void _3DScene::enable_dynamic_background(wxGLCanvas* canvas, bool enable) +{ + s_canvas_mgr.enable_dynamic_background(canvas, enable); +} + void _3DScene::allow_multisample(wxGLCanvas* canvas, bool allow) { s_canvas_mgr.allow_multisample(canvas, allow); diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index a1227d8ddb..a2050e5a15 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -499,6 +499,7 @@ public: static void enable_gizmos(wxGLCanvas* canvas, bool enable); static void enable_shader(wxGLCanvas* canvas, bool enable); static void enable_force_zoom_to_bed(wxGLCanvas* canvas, bool enable); + static void enable_dynamic_background(wxGLCanvas* canvas, bool enable); static void allow_multisample(wxGLCanvas* canvas, bool allow); static void zoom_to_bed(wxGLCanvas* canvas); diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index bcd4e65ba6..d53436969c 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -51,6 +51,9 @@ static const float UNIT_MATRIX[] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }; +static const float DEFAULT_BG_COLOR[3] = { 10.0f / 255.0f, 98.0f / 255.0f, 144.0f / 255.0f }; +static const float ERROR_BG_COLOR[3] = { 144.0f / 255.0f, 49.0f / 255.0f, 10.0f / 255.0f }; + namespace Slic3r { namespace GUI { @@ -1703,6 +1706,7 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) , m_picking_enabled(false) , m_moving_enabled(false) , m_shader_enabled(false) + , m_dynamic_background_enabled(false) , m_multisample_allowed(false) , m_color_by("volume") , m_select_by("object") @@ -2067,6 +2071,11 @@ void GLCanvas3D::enable_force_zoom_to_bed(bool enable) m_force_zoom_to_bed_enabled = enable; } +void GLCanvas3D::enable_dynamic_background(bool enable) +{ + m_dynamic_background_enabled = enable; +} + void GLCanvas3D::allow_multisample(bool allow) { m_multisample_allowed = allow; @@ -3431,8 +3440,6 @@ void GLCanvas3D::_render_background() const { ::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - static const float COLOR[3] = { 10.0f / 255.0f, 98.0f / 255.0f, 144.0f / 255.0f }; - ::glPushMatrix(); ::glLoadIdentity(); ::glMatrixMode(GL_PROJECTION); @@ -3444,11 +3451,16 @@ void GLCanvas3D::_render_background() const ::glBegin(GL_QUADS); ::glColor3f(0.0f, 0.0f, 0.0f); - ::glVertex3f(-1.0f, -1.0f, 1.0f); - ::glVertex3f(1.0f, -1.0f, 1.0f); - ::glColor3f(COLOR[0], COLOR[1], COLOR[2]); - ::glVertex3f(1.0f, 1.0f, 1.0f); - ::glVertex3f(-1.0f, 1.0f, 1.0f); + ::glVertex2f(-1.0f, -1.0f); + ::glVertex2f(1.0f, -1.0f); + + if (m_dynamic_background_enabled && _is_any_volume_outside()) + ::glColor3f(ERROR_BG_COLOR[0], ERROR_BG_COLOR[1], ERROR_BG_COLOR[2]); + else + ::glColor3f(DEFAULT_BG_COLOR[0], DEFAULT_BG_COLOR[1], DEFAULT_BG_COLOR[2]); + + ::glVertex2f(1.0f, 1.0f); + ::glVertex2f(-1.0f, 1.0f); ::glEnd(); ::glEnable(GL_DEPTH_TEST); @@ -4772,17 +4784,7 @@ void GLCanvas3D::_update_toolpath_volumes_outside_state() void GLCanvas3D::_show_warning_texture_if_needed() { - bool detected_outside = false; - for (const GLVolume* volume : m_volumes.volumes) - { - if ((volume != nullptr) && volume->is_outside) - { - detected_outside = true; - break; - } - } - - if (detected_outside) + if (_is_any_volume_outside()) { enable_warning_texture(true); _generate_warning_texture(L("Detected toolpath outside print volume")); @@ -4899,5 +4901,16 @@ void GLCanvas3D::_reset_warning_texture() m_warning_texture.reset(); } +bool GLCanvas3D::_is_any_volume_outside() const +{ + for (const GLVolume* volume : m_volumes.volumes) + { + if ((volume != nullptr) && volume->is_outside) + return true; + } + + return false; +} + } // namespace GUI } // namespace Slic3r diff --git a/xs/src/slic3r/GUI/GLCanvas3D.hpp b/xs/src/slic3r/GUI/GLCanvas3D.hpp index 0d8cf8855e..a874862613 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.hpp @@ -449,6 +449,7 @@ private: bool m_picking_enabled; bool m_moving_enabled; bool m_shader_enabled; + bool m_dynamic_background_enabled; bool m_multisample_allowed; std::string m_color_by; @@ -539,6 +540,7 @@ public: void enable_gizmos(bool enable); void enable_shader(bool enable); void enable_force_zoom_to_bed(bool enable); + void enable_dynamic_background(bool enable); void allow_multisample(bool allow); void zoom_to_bed(); @@ -682,6 +684,8 @@ private: void _generate_warning_texture(const std::string& msg); void _reset_warning_texture(); + bool _is_any_volume_outside() const; + static std::vector _parse_colors(const std::vector& colors); }; diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp index 25733c7a26..5249f6dc4f 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp @@ -418,6 +418,13 @@ void GLCanvas3DManager::enable_force_zoom_to_bed(wxGLCanvas* canvas, bool enable it->second->enable_force_zoom_to_bed(enable); } +void GLCanvas3DManager::enable_dynamic_background(wxGLCanvas* canvas, bool enable) +{ + CanvasesMap::iterator it = _get_canvas(canvas); + if (it != m_canvases.end()) + it->second->enable_dynamic_background(enable); +} + void GLCanvas3DManager::allow_multisample(wxGLCanvas* canvas, bool allow) { CanvasesMap::iterator it = _get_canvas(canvas); diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp index f27293273e..55c42fda69 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp @@ -112,6 +112,7 @@ public: void enable_gizmos(wxGLCanvas* canvas, bool enable); void enable_shader(wxGLCanvas* canvas, bool enable); void enable_force_zoom_to_bed(wxGLCanvas* canvas, bool enable); + void enable_dynamic_background(wxGLCanvas* canvas, bool enable); void allow_multisample(wxGLCanvas* canvas, bool allow); void zoom_to_bed(wxGLCanvas* canvas); diff --git a/xs/xsp/GUI_3DScene.xsp b/xs/xsp/GUI_3DScene.xsp index e094941462..a91f32d293 100644 --- a/xs/xsp/GUI_3DScene.xsp +++ b/xs/xsp/GUI_3DScene.xsp @@ -430,6 +430,13 @@ enable_force_zoom_to_bed(canvas, enable) CODE: _3DScene::enable_force_zoom_to_bed((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), enable); +void +enable_dynamic_background(canvas, enable) + SV *canvas; + bool enable; + CODE: + _3DScene::enable_dynamic_background((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), enable); + void allow_multisample(canvas, allow) SV *canvas; From c2291e54f4ab34c2cdce9b8fc1a1e93c4779b1f7 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 27 Jul 2018 09:53:12 +0200 Subject: [PATCH 13/21] Fixes crash when loading a config with zero number of default_filament_profile values. Fixes SPE-427 --- xs/src/slic3r/GUI/PresetBundle.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xs/src/slic3r/GUI/PresetBundle.cpp b/xs/src/slic3r/GUI/PresetBundle.cpp index 58553e1bcf..94baa0e0ef 100644 --- a/xs/src/slic3r/GUI/PresetBundle.cpp +++ b/xs/src/slic3r/GUI/PresetBundle.cpp @@ -552,6 +552,8 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool std::string &inherits = Preset::inherits(config); compatible_printers_condition_values.resize(num_extruders + 2, std::string()); inherits_values.resize(num_extruders + 2, std::string()); + // The "default_filament_profile" will be later extracted into the printer profile. + config.option("default_filament_profile", true)->values.resize(num_extruders, std::string()); // 1) Create a name from the file name. // Keep the suffix (.ini, .gcode, .amf, .3mf etc) to differentiate it from the normal profiles. @@ -576,7 +578,6 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool // 3) Now load the filaments. If there are multiple filament presets, split them and load them. auto old_filament_profile_names = config.option("filament_settings_id", true); old_filament_profile_names->values.resize(num_extruders, std::string()); - config.option("default_filament_profile", true)->values.resize(num_extruders, std::string()); if (num_extruders <= 1) { // Split the "compatible_printers_condition" and "inherits" from the cummulative vectors to separate filament presets. From 6b801f250a75515660a2588492022444de74069a Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Mon, 25 Jun 2018 18:19:51 +0200 Subject: [PATCH 14/21] avrdude: use sections instead of offsets --- xs/src/avrdude/fileio.c | 56 +++++++++++++++++++--------- xs/src/avrdude/libavrdude.h | 6 +-- xs/src/avrdude/main.c | 2 +- xs/src/avrdude/update.c | 20 +++++----- xs/src/slic3r/GUI/FirmwareDialog.cpp | 23 ++++-------- 5 files changed, 61 insertions(+), 46 deletions(-) diff --git a/xs/src/avrdude/fileio.c b/xs/src/avrdude/fileio.c index aa57f55870..7081592951 100644 --- a/xs/src/avrdude/fileio.c +++ b/xs/src/avrdude/fileio.c @@ -98,11 +98,11 @@ static int fileio_num(struct fioparms * fio, char * filename, FILE * f, AVRMEM * mem, int size, FILEFMT fmt); -static int fmt_autodetect(char * fname, size_t offset); +static int fmt_autodetect(char * fname, unsigned section); -static FILE *fopen_and_seek(const char *filename, const char *mode, size_t offset) +static FILE *fopen_and_seek(const char *filename, const char *mode, unsigned section) { FILE *file; // On Windows we need to convert the filename to UTF-16 @@ -118,16 +118,38 @@ static FILE *fopen_and_seek(const char *filename, const char *mode, size_t offse file = fopen(filename, mode); #endif - if (file != NULL) { - // Some systems allow seeking past the end of file, so we need check for that first and disallow - if (fseek(file, 0, SEEK_END) != 0 - || offset >= ftell(file) - || fseek(file, offset, SEEK_SET) != 0 - ) { - fclose(file); - file = NULL; - errno = EINVAL; + if (file == NULL) { + return NULL; + } + + // Seek to the specified 'section' + static const char *hex_terminator = ":00000001FF\r"; + unsigned terms_seen = 0; + char buffer[MAX_LINE_LEN + 1]; + + while (terms_seen < section && fgets(buffer, MAX_LINE_LEN, file) != NULL) { + size_t len = strlen(buffer); + + if (buffer[len - 1] == '\n') { + len--; + buffer[len] = 0; } + if (buffer[len - 1] != '\r') { + buffer[len] = '\r'; + len++; + buffer[len] = 0; + } + + if (strcmp(buffer, hex_terminator) == 0) { + // Found a section terminator + terms_seen++; + } + } + + if (feof(file)) { + // Section not found + fclose(file); + return NULL; } return file; @@ -1392,7 +1414,7 @@ int fileio_setparms(int op, struct fioparms * fp, -static int fmt_autodetect(char * fname, size_t offset) +static int fmt_autodetect(char * fname, unsigned section) { FILE * f; unsigned char buf[MAX_LINE_LEN]; @@ -1402,9 +1424,9 @@ static int fmt_autodetect(char * fname, size_t offset) int first = 1; #if defined(WIN32NATIVE) - f = fopen_and_seek(fname, "r", offset); + f = fopen_and_seek(fname, "r", section); #else - f = fopen_and_seek(fname, "rb", offset); + f = fopen_and_seek(fname, "rb", section); #endif if (f == NULL) { @@ -1480,7 +1502,7 @@ static int fmt_autodetect(char * fname, size_t offset) int fileio(int op, char * filename, FILEFMT format, - struct avrpart * p, char * memtype, int size, size_t offset) + struct avrpart * p, char * memtype, int size, unsigned section) { int rc; FILE * f; @@ -1539,7 +1561,7 @@ int fileio(int op, char * filename, FILEFMT format, return -1; } - format_detect = fmt_autodetect(fname, offset); + format_detect = fmt_autodetect(fname, section); if (format_detect < 0) { avrdude_message(MSG_INFO, "%s: can't determine file format for %s, specify explicitly\n", progname, fname); @@ -1570,7 +1592,7 @@ int fileio(int op, char * filename, FILEFMT format, if (format != FMT_IMM) { if (!using_stdio) { - f = fopen_and_seek(fname, fio.mode, offset); + f = fopen_and_seek(fname, fio.mode, section); if (f == NULL) { avrdude_message(MSG_INFO, "%s: can't open %s file %s: %s\n", progname, fio.iodesc, fname, strerror(errno)); diff --git a/xs/src/avrdude/libavrdude.h b/xs/src/avrdude/libavrdude.h index 536f1a2f79..aef792476a 100644 --- a/xs/src/avrdude/libavrdude.h +++ b/xs/src/avrdude/libavrdude.h @@ -821,7 +821,7 @@ extern "C" { char * fmtstr(FILEFMT format); int fileio(int op, char * filename, FILEFMT format, - struct avrpart * p, char * memtype, int size, size_t offset); + struct avrpart * p, char * memtype, int size, unsigned section); #ifdef __cplusplus } @@ -870,7 +870,7 @@ enum updateflags { typedef struct update_t { char * memtype; int op; - size_t offset; + unsigned section; char * filename; int format; } UPDATE; @@ -882,7 +882,7 @@ extern "C" { extern UPDATE * parse_op(char * s); extern UPDATE * dup_update(UPDATE * upd); extern UPDATE * new_update(int op, char * memtype, int filefmt, - char * filename, size_t offset); + char * filename, unsigned section); extern void free_update(UPDATE * upd); extern int do_op(PROGRAMMER * pgm, struct avrpart * p, UPDATE * upd, enum updateflags flags); diff --git a/xs/src/avrdude/main.c b/xs/src/avrdude/main.c index d4c34fe44c..5d73403b09 100644 --- a/xs/src/avrdude/main.c +++ b/xs/src/avrdude/main.c @@ -194,7 +194,7 @@ static void usage(void) " -F Override invalid signature check.\n" " -e Perform a chip erase.\n" " -O Perform RC oscillator calibration (see AVR053). \n" - " -U :r|w|v::[:format]\n" + " -U :r|w|v:

:[:format]\n" " Memory operation specification.\n" " Multiple -U options are allowed, each request\n" " is performed in the order specified.\n" diff --git a/xs/src/avrdude/update.c b/xs/src/avrdude/update.c index e9dd6e3251..417cbf71d4 100644 --- a/xs/src/avrdude/update.c +++ b/xs/src/avrdude/update.c @@ -101,22 +101,22 @@ UPDATE * parse_op(char * s) p++; - // Extension: Parse file contents offset - size_t offset = 0; + // Extension: Parse file section number + unsigned section = 0; for (; *p != ':'; p++) { if (*p >= '0' && *p <= '9') { - offset *= 10; - offset += *p - 0x30; + section *= 10; + section += *p - 0x30; } else { - avrdude_message(MSG_INFO, "%s: invalid update specification: offset is not a number\n", progname); + avrdude_message(MSG_INFO, "%s: invalid update specification:
is not a number\n", progname); free(upd->memtype); free(upd); return NULL; } } - upd->offset = offset; + upd->section = section; p++; /* @@ -194,7 +194,7 @@ UPDATE * dup_update(UPDATE * upd) return u; } -UPDATE * new_update(int op, char * memtype, int filefmt, char * filename, size_t offset) +UPDATE * new_update(int op, char * memtype, int filefmt, char * filename, unsigned section) { UPDATE * u; @@ -208,7 +208,7 @@ UPDATE * new_update(int op, char * memtype, int filefmt, char * filename, size_t u->filename = strdup(filename); u->op = op; u->format = filefmt; - u->offset = offset; + u->section = section; return u; } @@ -286,7 +286,7 @@ int do_op(PROGRAMMER * pgm, struct avrpart * p, UPDATE * upd, enum updateflags f progname, strcmp(upd->filename, "-")==0 ? "" : upd->filename); } - rc = fileio(FIO_READ, upd->filename, upd->format, p, upd->memtype, -1, upd->offset); + rc = fileio(FIO_READ, upd->filename, upd->format, p, upd->memtype, -1, upd->section); if (rc < 0) { avrdude_message(MSG_INFO, "%s: read from file '%s' failed\n", progname, upd->filename); @@ -351,7 +351,7 @@ int do_op(PROGRAMMER * pgm, struct avrpart * p, UPDATE * upd, enum updateflags f progname, mem->desc, upd->filename); } - rc = fileio(FIO_READ, upd->filename, upd->format, p, upd->memtype, -1, upd->offset); + rc = fileio(FIO_READ, upd->filename, upd->format, p, upd->memtype, -1, upd->section); if (rc < 0) { avrdude_message(MSG_INFO, "%s: read from file '%s' failed\n", progname, upd->filename); diff --git a/xs/src/slic3r/GUI/FirmwareDialog.cpp b/xs/src/slic3r/GUI/FirmwareDialog.cpp index d747430554..17ff422450 100644 --- a/xs/src/slic3r/GUI/FirmwareDialog.cpp +++ b/xs/src/slic3r/GUI/FirmwareDialog.cpp @@ -95,7 +95,7 @@ struct FirmwareDialog::priv void find_serial_ports(); void flashing_start(bool flashing_l10n); void flashing_done(AvrDudeComplete complete); - size_t hex_lang_offset(const wxString &path); + size_t hex_num_sections(const wxString &path); void perform_upload(); void cancel(); void on_avrdude(const wxCommandEvent &evt); @@ -158,7 +158,7 @@ void FirmwareDialog::priv::flashing_done(AvrDudeComplete complete) } } -size_t FirmwareDialog::priv::hex_lang_offset(const wxString &path) +size_t FirmwareDialog::priv::hex_num_sections(const wxString &path) { fs::ifstream file(fs::path(path.wx_str())); if (! file.good()) { @@ -175,18 +175,11 @@ size_t FirmwareDialog::priv::hex_lang_offset(const wxString &path) } if (line == hex_terminator) { - if (res == 0) { - // This is the first terminator seen, save the position - res = file.tellg(); - } else { - // We've found another terminator, return the offset just after the first one - // which is the start of the second 'section'. - return res; - } + res++; } } - return 0; + return res; } void FirmwareDialog::priv::perform_upload() @@ -202,10 +195,10 @@ void FirmwareDialog::priv::perform_upload() if (filename.IsEmpty() || port.empty()) { return; } const bool extra_verbose = false; // For debugging - const auto lang_offset = hex_lang_offset(filename); + const auto num_secions = hex_num_sections(filename); const auto filename_utf8 = filename.utf8_str(); - flashing_start(lang_offset > 0); + flashing_start(num_secions > 1); // It is ok here to use the q-pointer to the FirmwareDialog // because the dialog ensures it doesn't exit before the background thread is done. @@ -236,7 +229,7 @@ void FirmwareDialog::priv::perform_upload() avrdude.push_args(std::move(args)); - if (lang_offset > 0) { + if (num_secions > 1) { // The hex file also contains another section with l10n data to be flashed into the external flash on MK3 (Einsy) // This is done via another avrdude invocation, here we build arg list for that: std::vector args_l10n {{ @@ -249,7 +242,7 @@ void FirmwareDialog::priv::perform_upload() "-b", "115200", "-D", "-u", // disable safe mode - "-U", (boost::format("flash:w:%1%:%2%:i") % lang_offset % filename_utf8.data()).str(), + "-U", (boost::format("flash:w:1:%1%:i") % filename_utf8.data()).str(), }}; BOOST_LOG_TRIVIAL(info) << "Invoking avrdude for external flash flashing, arguments: " From 3c2170acf8406bbe26c923c5b0fefde3b4d7d8e8 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Wed, 27 Jun 2018 15:02:32 +0200 Subject: [PATCH 15/21] avrdude: Standalone binary --- xs/src/avrdude/CMakeLists.txt | 114 +++++++++++++++-------------- xs/src/avrdude/Makefile.standalone | 54 ++++++++++++++ xs/src/avrdude/main-standalone.c | 9 +++ 3 files changed, 124 insertions(+), 53 deletions(-) create mode 100644 xs/src/avrdude/Makefile.standalone create mode 100644 xs/src/avrdude/main-standalone.c diff --git a/xs/src/avrdude/CMakeLists.txt b/xs/src/avrdude/CMakeLists.txt index 043f8fb7b5..d885633689 100644 --- a/xs/src/avrdude/CMakeLists.txt +++ b/xs/src/avrdude/CMakeLists.txt @@ -1,3 +1,4 @@ +cmake_minimum_required(VERSION 3.0) add_definitions(-D_BSD_SOURCE -D_DEFAULT_SOURCE) # To enable various useful macros and functions on Unices @@ -13,67 +14,74 @@ endif() set(AVRDUDE_SOURCES - ${LIBDIR}/avrdude/arduino.c - ${LIBDIR}/avrdude/avr.c - # ${LIBDIR}/avrdude/avrftdi.c - # ${LIBDIR}/avrdude/avrftdi_tpi.c - ${LIBDIR}/avrdude/avrpart.c - ${LIBDIR}/avrdude/avr910.c - ${LIBDIR}/avrdude/bitbang.c - ${LIBDIR}/avrdude/buspirate.c - ${LIBDIR}/avrdude/butterfly.c - ${LIBDIR}/avrdude/config.c - ${LIBDIR}/avrdude/config_gram.c - # ${LIBDIR}/avrdude/confwin.c - ${LIBDIR}/avrdude/crc16.c - # ${LIBDIR}/avrdude/dfu.c - ${LIBDIR}/avrdude/fileio.c - # ${LIBDIR}/avrdude/flip1.c - # ${LIBDIR}/avrdude/flip2.c - # ${LIBDIR}/avrdude/ft245r.c - # ${LIBDIR}/avrdude/jtagmkI.c - # ${LIBDIR}/avrdude/jtagmkII.c - # ${LIBDIR}/avrdude/jtag3.c - ${LIBDIR}/avrdude/lexer.c - ${LIBDIR}/avrdude/linuxgpio.c - ${LIBDIR}/avrdude/lists.c - # ${LIBDIR}/avrdude/par.c - ${LIBDIR}/avrdude/pgm.c - ${LIBDIR}/avrdude/pgm_type.c - ${LIBDIR}/avrdude/pickit2.c - ${LIBDIR}/avrdude/pindefs.c - # ${LIBDIR}/avrdude/ppi.c - # ${LIBDIR}/avrdude/ppiwin.c - ${LIBDIR}/avrdude/safemode.c - ${LIBDIR}/avrdude/ser_avrdoper.c - ${LIBDIR}/avrdude/serbb_posix.c - ${LIBDIR}/avrdude/serbb_win32.c - ${LIBDIR}/avrdude/ser_posix.c - ${LIBDIR}/avrdude/ser_win32.c - ${LIBDIR}/avrdude/stk500.c - ${LIBDIR}/avrdude/stk500generic.c - ${LIBDIR}/avrdude/stk500v2.c - ${LIBDIR}/avrdude/term.c - ${LIBDIR}/avrdude/update.c - # ${LIBDIR}/avrdude/usbasp.c - # ${LIBDIR}/avrdude/usb_hidapi.c - # ${LIBDIR}/avrdude/usb_libusb.c - # ${LIBDIR}/avrdude/usbtiny.c - ${LIBDIR}/avrdude/wiring.c + arduino.c + avr.c + # avrftdi.c + # avrftdi_tpi.c + avrpart.c + avr910.c + bitbang.c + buspirate.c + butterfly.c + config.c + config_gram.c + # confwin.c + crc16.c + # dfu.c + fileio.c + # flip1.c + # flip2.c + # ft245r.c + # jtagmkI.c + # jtagmkII.c + # jtag3.c + lexer.c + linuxgpio.c + lists.c + # par.c + pgm.c + pgm_type.c + pickit2.c + pindefs.c + # ppi.c + # ppiwin.c + safemode.c + ser_avrdoper.c + serbb_posix.c + serbb_win32.c + ser_posix.c + ser_win32.c + stk500.c + stk500generic.c + stk500v2.c + term.c + update.c + # usbasp.c + # usb_hidapi.c + # usb_libusb.c + # usbtiny.c + wiring.c - ${LIBDIR}/avrdude/main.c - ${LIBDIR}/avrdude/avrdude-slic3r.hpp - ${LIBDIR}/avrdude/avrdude-slic3r.cpp + main.c + avrdude-slic3r.hpp + avrdude-slic3r.cpp ) if (WIN32) set(AVRDUDE_SOURCES ${AVRDUDE_SOURCES} - ${LIBDIR}/avrdude/windows/unistd.cpp - ${LIBDIR}/avrdude/windows/getopt.c + windows/unistd.cpp + windows/getopt.c ) endif() add_library(avrdude STATIC ${AVRDUDE_SOURCES}) +set(STANDALONE_SOURCES + main-standalone.c +) +add_executable(avrdude-slic3r ${STANDALONE_SOURCES}) +target_link_libraries(avrdude-slic3r avrdude) +set_target_properties(avrdude-slic3r PROPERTIES EXCLUDE_FROM_ALL TRUE) + if (WIN32) target_compile_definitions(avrdude PRIVATE WIN32NATIVE=1) - target_include_directories(avrdude SYSTEM PRIVATE ${LIBDIR}/avrdude/windows) # So that sources find the getopt.h windows drop-in + target_include_directories(avrdude SYSTEM PRIVATE windows) # So that sources find the getopt.h windows drop-in endif() diff --git a/xs/src/avrdude/Makefile.standalone b/xs/src/avrdude/Makefile.standalone new file mode 100644 index 0000000000..d9a773771e --- /dev/null +++ b/xs/src/avrdude/Makefile.standalone @@ -0,0 +1,54 @@ + +TARGET = avrdude-slic3r + +SOURCES = \ + arduino.c \ + avr.c \ + avrpart.c \ + avr910.c \ + bitbang.c \ + buspirate.c \ + butterfly.c \ + config.c \ + config_gram.c \ + crc16.c \ + fileio.c \ + lexer.c \ + linuxgpio.c \ + lists.c \ + pgm.c \ + pgm_type.c \ + pickit2.c \ + pindefs.c \ + safemode.c \ + ser_avrdoper.c \ + serbb_posix.c \ + serbb_win32.c \ + ser_posix.c \ + ser_win32.c \ + stk500.c \ + stk500generic.c \ + stk500v2.c \ + term.c \ + update.c \ + wiring.c \ + main.c \ + main-standalone.c + +OBJECTS = $(SOURCES:.c=.o) +CFLAGS = -std=c99 -Wall -D_BSD_SOURCE -D_DEFAULT_SOURCE -O3 -DNDEBUG -fPIC +LDFLAGS = -lm + +CC = gcc +RM = rm + +all: $(TARGET) + +$(TARGET): $(OBJECTS) + $(CC) -o ./$@ $(OBJECTS) $(LDFLAGS) + +$(OBJECTS): %.o: %.c + $(CC) $(CFLAGS) -o $@ -c $< + +clean: + $(RM) -f $(OBJECTS) $(TARGET) diff --git a/xs/src/avrdude/main-standalone.c b/xs/src/avrdude/main-standalone.c new file mode 100644 index 0000000000..359a055ca8 --- /dev/null +++ b/xs/src/avrdude/main-standalone.c @@ -0,0 +1,9 @@ +#include "avrdude.h" + + +static const char* SYS_CONFIG = "/etc/avrdude-slic3r.conf"; + +int main(int argc, char *argv[]) +{ + return avrdude_main(argc, argv, SYS_CONFIG); +} From a7eaf38853c1c804c4f4c7d5e30801f196713727 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Tue, 24 Jul 2018 17:41:57 +0200 Subject: [PATCH 16/21] Utils: Serial port printer communication abstraction --- xs/src/libslic3r/GCodeSender.cpp | 17 +-- xs/src/slic3r/Utils/Serial.cpp | 238 +++++++++++++++++++++++++++++++ xs/src/slic3r/Utils/Serial.hpp | 52 ++++++- 3 files changed, 294 insertions(+), 13 deletions(-) diff --git a/xs/src/libslic3r/GCodeSender.cpp b/xs/src/libslic3r/GCodeSender.cpp index c3530e00f7..0988091ce3 100644 --- a/xs/src/libslic3r/GCodeSender.cpp +++ b/xs/src/libslic3r/GCodeSender.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -568,16 +569,12 @@ GCodeSender::set_DTR(bool on) void GCodeSender::reset() { - this->set_DTR(false); - boost::this_thread::sleep(boost::posix_time::milliseconds(200)); - this->set_DTR(true); - boost::this_thread::sleep(boost::posix_time::milliseconds(200)); - this->set_DTR(false); - boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); - { - boost::lock_guard l(this->queue_mutex); - this->can_send = true; - } + set_DTR(false); + std::this_thread::sleep_for(std::chrono::milliseconds(200)); + set_DTR(true); + std::this_thread::sleep_for(std::chrono::milliseconds(200)); + set_DTR(false); + std::this_thread::sleep_for(std::chrono::milliseconds(500)); } } // namespace Slic3r diff --git a/xs/src/slic3r/Utils/Serial.cpp b/xs/src/slic3r/Utils/Serial.cpp index 32b6bb160c..8a454b1195 100644 --- a/xs/src/slic3r/Utils/Serial.cpp +++ b/xs/src/slic3r/Utils/Serial.cpp @@ -3,7 +3,10 @@ #include #include #include +#include +#include #include +#include #include #include @@ -34,6 +37,21 @@ #include #endif +#ifndef _WIN32 + #include + #include + #include + #include +#endif + +#if defined(__APPLE__) || defined(__OpenBSD__) + #include +#elif defined __linux__ + #include + #include +#endif + + namespace Slic3r { namespace Utils { @@ -189,5 +207,225 @@ std::vector scan_serial_ports() return output; } + + +// Class Serial + +namespace asio = boost::asio; +using boost::system::error_code; + +Serial::Serial(asio::io_service& io_service) : + asio::serial_port(io_service) +{} + +Serial::Serial(asio::io_service& io_service, const std::string &name, unsigned baud_rate) : + asio::serial_port(io_service, name) +{ + printer_setup(baud_rate); +} + +Serial::~Serial() {} + +void Serial::set_baud_rate(unsigned baud_rate) +{ + try { + // This does not support speeds > 115200 + set_option(boost::asio::serial_port_base::baud_rate(baud_rate)); + } catch (boost::system::system_error &) { + auto handle = native_handle(); + + auto handle_errno = [](int retval) { + if (retval != 0) { + throw std::runtime_error( + (boost::format("Could not set baud rate: %1%") % strerror(errno)).str() + ); + } + }; + +#if __APPLE__ + termios ios; + handle_errno(::tcgetattr(handle, &ios)); + handle_errno(::cfsetspeed(&ios, baud_rate)); + speed_t newSpeed = baud_rate; + handle_errno(::ioctl(handle, IOSSIOSPEED, &newSpeed)); + handle_errno(::tcsetattr(handle, TCSANOW, &ios)); +#elif __linux + + /* The following definitions are kindly borrowed from: + /usr/include/asm-generic/termbits.h + Unfortunately we cannot just include that one because + it would redefine the "struct termios" already defined + the already included by Boost.ASIO. */ +#define K_NCCS 19 + struct termios2 { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[K_NCCS]; + speed_t c_ispeed; + speed_t c_ospeed; + }; +#define BOTHER CBAUDEX + + termios2 ios; + handle_errno(::ioctl(handle, TCGETS2, &ios)); + ios.c_ispeed = ios.c_ospeed = baud_rate; + ios.c_cflag &= ~CBAUD; + ios.c_cflag |= BOTHER | CLOCAL | CREAD; + ios.c_cc[VMIN] = 1; // Minimum of characters to read, prevents eof errors when 0 bytes are read + ios.c_cc[VTIME] = 1; + handle_errno(::ioctl(handle, TCSETS2, &ios)); + +#elif __OpenBSD__ + struct termios ios; + handle_errno(::tcgetattr(handle, &ios)); + handle_errno(::cfsetspeed(&ios, baud_rate)); + handle_errno(::tcsetattr(handle, TCSAFLUSH, &ios)); +#else + throw std::runtime_error("Custom baud rates are not currently supported on this OS"); +#endif + } +} + +void Serial::set_DTR(bool on) +{ + auto handle = native_handle(); +#if defined(_WIN32) && !defined(__SYMBIAN32__) + if (! EscapeCommFunction(handle, on ? SETDTR : CLRDTR)) { + throw std::runtime_error("Could not set serial port DTR"); + } +#else + int status; + if (::ioctl(handle, TIOCMGET, &status) == 0) { + on ? status |= TIOCM_DTR : status &= ~TIOCM_DTR; + if (::ioctl(handle, TIOCMSET, &status) == 0) { + return; + } + } + + throw std::runtime_error( + (boost::format("Could not set serial port DTR: %1%") % strerror(errno)).str() + ); +#endif +} + +void Serial::reset_line_num() +{ + // See https://github.com/MarlinFirmware/Marlin/wiki/M110 + printer_write_line("M110 N0", 0); + m_line_num = 0; +} + +bool Serial::read_line(unsigned timeout, std::string &line, error_code &ec) +{ + auto &io_service = get_io_service(); + asio::deadline_timer timer(io_service); + char c = 0; + bool fail = false; + + while (true) { + io_service.reset(); + + asio::async_read(*this, boost::asio::buffer(&c, 1), [&](const error_code &read_ec, size_t size) { + if (ec || size == 0) { + fail = true; + ec = read_ec; + } + timer.cancel(); + }); + + if (timeout > 0) { + timer.expires_from_now(boost::posix_time::milliseconds(timeout)); + timer.async_wait([&](const error_code &ec) { + // Ignore timer aborts + if (!ec) { + fail = true; + this->cancel(); + } + }); + } + + io_service.run(); + + if (fail) { + return false; + } else if (c != '\n') { + line += c; + } else { + return true; + } + } +} + +void Serial::printer_setup(unsigned baud_rate) +{ + set_baud_rate(baud_rate); + printer_reset(); + write_string("\r\r\r\r\r\r\r\r\r\r"); // Gets rid of line noise, if any +} + +size_t Serial::write_string(const std::string &str) +{ + // TODO: might be wise to timeout here as well + return asio::write(*this, asio::buffer(str)); +} + +bool Serial::printer_ready_wait(unsigned retries, unsigned timeout) +{ + std::string line; + error_code ec; + + for (; retries > 0; retries--) { + reset_line_num(); + + while (read_line(timeout, line, ec)) { + if (line == "ok") { + return true; + } + line.clear(); + } + line.clear(); + } + + return false; +} + +size_t Serial::printer_write_line(const std::string &line, unsigned line_num) +{ + const auto formatted_line = Utils::Serial::printer_format_line(line, line_num); + return write_string(formatted_line); +} + +size_t Serial::printer_write_line(const std::string &line) +{ + m_line_num++; + return printer_write_line(line, m_line_num); +} + +void Serial::printer_reset() +{ + this->set_DTR(false); + std::this_thread::sleep_for(std::chrono::milliseconds(200)); + this->set_DTR(true); + std::this_thread::sleep_for(std::chrono::milliseconds(200)); + this->set_DTR(false); + std::this_thread::sleep_for(std::chrono::milliseconds(2000)); +} + +std::string Serial::printer_format_line(const std::string &line, unsigned line_num) +{ + const auto line_num_str = std::to_string(line_num); + + unsigned checksum = 'N'; + for (auto c : line_num_str) { checksum ^= c; } + checksum ^= ' '; + for (auto c : line) { checksum ^= c; } + + return (boost::format("N%1% %2%*%3%\n") % line_num_str % line % checksum).str(); +} + + } // namespace Utils } // namespace Slic3r diff --git a/xs/src/slic3r/Utils/Serial.hpp b/xs/src/slic3r/Utils/Serial.hpp index 9381ab3987..5df33916f0 100644 --- a/xs/src/slic3r/Utils/Serial.hpp +++ b/xs/src/slic3r/Utils/Serial.hpp @@ -1,10 +1,11 @@ #ifndef slic3r_GUI_Utils_Serial_hpp_ #define slic3r_GUI_Utils_Serial_hpp_ -#include #include #include -#include +#include +#include + namespace Slic3r { namespace Utils { @@ -16,7 +17,7 @@ struct SerialPortInfo { bool is_printer = false; }; -inline bool operator==(const SerialPortInfo &sp1, const SerialPortInfo &sp2) +inline bool operator==(const SerialPortInfo &sp1, const SerialPortInfo &sp2) { return sp1.port == sp2.port && sp1.hardware_id == sp2.hardware_id && @@ -26,6 +27,51 @@ inline bool operator==(const SerialPortInfo &sp1, const SerialPortInfo &sp2) extern std::vector scan_serial_ports(); extern std::vector scan_serial_ports_extended(); + +class Serial : public boost::asio::serial_port +{ +public: + Serial(boost::asio::io_service &io_service); + // This c-tor opens the port for communication with a printer - it sets a baud rate and calls printer_reset() + Serial(boost::asio::io_service &io_service, const std::string &name, unsigned baud_rate); + Serial(const Serial &) = delete; + Serial &operator=(const Serial &) = delete; + ~Serial(); + + void set_baud_rate(unsigned baud_rate); + void set_DTR(bool on); + + // Resets the line number both internally as well as with the firmware using M110 + void reset_line_num(); + + // Reads a line or times out, the timeout is in milliseconds + bool read_line(unsigned timeout, std::string &line, boost::system::error_code &ec); + + // Perform setup for communicating with a printer + // Sets a baud rate and calls printer_reset() + void printer_setup(unsigned baud_rate); + + // Write data from a string + size_t write_string(const std::string &str); + + bool printer_ready_wait(unsigned retries, unsigned timeout); + + // Write Marlin-formatted line, with a line number and a checksum + size_t printer_write_line(const std::string &line, unsigned line_num); + + // Same as above, but with internally-managed line number + size_t printer_write_line(const std::string &line); + + // Toggles DTR to reset the printer + void printer_reset(); + + // Formats a line Marlin-style, ie. with a sequential number and a checksum + static std::string printer_format_line(const std::string &line, unsigned line_num); +private: + unsigned m_line_num = 0; +}; + + } // Utils } // Slic3r From a32bd17b752317450e35c398b61356cdbe13998d Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Tue, 24 Jul 2018 17:42:12 +0200 Subject: [PATCH 17/21] FirmwareUpdater: MMU 2.0 / Caterina flashing --- xs/CMakeLists.txt | 4 +- xs/src/avrdude/avrdude-slic3r.cpp | 15 +- xs/src/avrdude/avrdude-slic3r.hpp | 5 +- xs/src/slic3r/GUI/FirmwareDialog.cpp | 339 ++++++++++++++++++++------- xs/src/slic3r/Utils/HexFile.cpp | 107 +++++++++ xs/src/slic3r/Utils/HexFile.hpp | 32 +++ xs/src/slic3r/Utils/Serial.cpp | 84 ++++++- xs/src/slic3r/Utils/Serial.hpp | 19 +- 8 files changed, 496 insertions(+), 109 deletions(-) create mode 100644 xs/src/slic3r/Utils/HexFile.cpp create mode 100644 xs/src/slic3r/Utils/HexFile.hpp diff --git a/xs/CMakeLists.txt b/xs/CMakeLists.txt index 976943d64d..95ff990aae 100644 --- a/xs/CMakeLists.txt +++ b/xs/CMakeLists.txt @@ -26,7 +26,7 @@ include_directories(${LIBDIR}/libslic3r) if(WIN32) # BOOST_ALL_NO_LIB: Avoid the automatic linking of Boost libraries on Windows. Rather rely on explicit linking. - add_definitions(-D_USE_MATH_DEFINES -D_WIN32 -DBOOST_ALL_NO_LIB) + add_definitions(-D_USE_MATH_DEFINES -D_WIN32 -DBOOST_ALL_NO_LIB -DBOOST_USE_WINAPI_VERSION=0x601) # -D_ITERATOR_DEBUG_LEVEL) if(WIN10SDK_PATH) message("Building with Win10 Netfabb STL fixing service support") @@ -258,6 +258,8 @@ add_library(libslic3r_gui STATIC ${LIBDIR}/slic3r/Utils/PresetUpdater.hpp ${LIBDIR}/slic3r/Utils/Time.cpp ${LIBDIR}/slic3r/Utils/Time.hpp + ${LIBDIR}/slic3r/Utils/HexFile.cpp + ${LIBDIR}/slic3r/Utils/HexFile.hpp ${LIBDIR}/slic3r/IProgressIndicator.hpp ${LIBDIR}/slic3r/AppController.hpp ${LIBDIR}/slic3r/AppController.cpp diff --git a/xs/src/avrdude/avrdude-slic3r.cpp b/xs/src/avrdude/avrdude-slic3r.cpp index 030353413c..4a7f22d6e5 100644 --- a/xs/src/avrdude/avrdude-slic3r.cpp +++ b/xs/src/avrdude/avrdude-slic3r.cpp @@ -36,6 +36,7 @@ struct AvrDude::priv std::string sys_config; std::deque> args; size_t current_args_set = 0; + bool cancelled = false; RunFn run_fn; MessageFn message_fn; ProgressFn progress_fn; @@ -141,11 +142,16 @@ AvrDude::Ptr AvrDude::run() if (self->p) { auto avrdude_thread = std::thread([self]() { + bool cancel = false; + int res = -1; + if (self->p->run_fn) { - self->p->run_fn(); + self->p->run_fn(*self); } - auto res = self->p->run(); + if (! self->p->cancelled) { + res = self->p->run(); + } if (self->p->complete_fn) { self->p->complete_fn(res, self->p->current_args_set); @@ -160,7 +166,10 @@ AvrDude::Ptr AvrDude::run() void AvrDude::cancel() { - ::avrdude_cancel(); + if (p) { + p->cancelled = true; + ::avrdude_cancel(); + } } void AvrDude::join() diff --git a/xs/src/avrdude/avrdude-slic3r.hpp b/xs/src/avrdude/avrdude-slic3r.hpp index 273aa23782..399df2358f 100644 --- a/xs/src/avrdude/avrdude-slic3r.hpp +++ b/xs/src/avrdude/avrdude-slic3r.hpp @@ -12,7 +12,7 @@ class AvrDude { public: typedef std::shared_ptr Ptr; - typedef std::function RunFn; + typedef std::function RunFn; typedef std::function MessageFn; typedef std::function ProgressFn; typedef std::function CompleteFn; @@ -31,7 +31,8 @@ public: AvrDude& push_args(std::vector args); // Set a callback to be called just after run() before avrdude is ran - // This can be used to perform any needed setup tasks from the background thread. + // This can be used to perform any needed setup tasks from the background thread, + // and, optionally, to cancel by writing true to the `cancel` argument. // This has no effect when using run_sync(). AvrDude& on_run(RunFn fn); diff --git a/xs/src/slic3r/GUI/FirmwareDialog.cpp b/xs/src/slic3r/GUI/FirmwareDialog.cpp index 17ff422450..38c2937fc5 100644 --- a/xs/src/slic3r/GUI/FirmwareDialog.cpp +++ b/xs/src/slic3r/GUI/FirmwareDialog.cpp @@ -1,12 +1,23 @@ -#include "FirmwareDialog.hpp" - #include #include +#include +#include #include +#include #include #include #include +#include "libslic3r/Utils.hpp" +#include "avrdude/avrdude-slic3r.hpp" +#include "GUI.hpp" +#include "MsgDialog.hpp" +#include "../Utils/HexFile.hpp" +#include "../Utils/Serial.hpp" + +// wx includes need to come after asio because of the WinSock.h problem +#include "FirmwareDialog.hpp" + #include #include #include @@ -22,16 +33,18 @@ #include #include -#include "libslic3r/Utils.hpp" -#include "avrdude/avrdude-slic3r.hpp" -#include "GUI.hpp" -#include "../Utils/Serial.hpp" namespace fs = boost::filesystem; +namespace asio = boost::asio; +using boost::system::error_code; namespace Slic3r { +using Utils::HexFile; +using Utils::SerialPortInfo; +using Utils::Serial; + // This enum discriminates the kind of information in EVT_AVRDUDE, // it's stored in the ExtraLong field of wxCommandEvent. @@ -40,6 +53,7 @@ enum AvrdudeEvent AE_MESSAGE, AE_PROGRESS, AE_EXIT, + AE_ERROR, }; wxDECLARE_EVENT(EVT_AVRDUDE, wxCommandEvent); @@ -52,7 +66,6 @@ struct FirmwareDialog::priv { enum AvrDudeComplete { - AC_NONE, AC_SUCCESS, AC_FAILURE, AC_CANCEL, @@ -61,7 +74,7 @@ struct FirmwareDialog::priv FirmwareDialog *q; // PIMPL back pointer ("Q-Pointer") wxComboBox *port_picker; - std::vector ports; + std::vector ports; wxFilePickerCtrl *hex_picker; wxStaticText *txt_status; wxGauge *progressbar; @@ -80,7 +93,9 @@ struct FirmwareDialog::priv AvrDude::Ptr avrdude; std::string avrdude_config; unsigned progress_tasks_done; + unsigned progress_tasks_bar; bool cancelled; + const bool extra_verbose; // For debugging priv(FirmwareDialog *q) : q(q), @@ -89,16 +104,25 @@ struct FirmwareDialog::priv timer_pulse(q), avrdude_config((fs::path(::Slic3r::resources_dir()) / "avrdude" / "avrdude.conf").string()), progress_tasks_done(0), - cancelled(false) + progress_tasks_bar(0), + cancelled(false), + extra_verbose(false) {} void find_serial_ports(); - void flashing_start(bool flashing_l10n); + void flashing_start(unsigned tasks); void flashing_done(AvrDudeComplete complete); - size_t hex_num_sections(const wxString &path); + void check_model_id(const HexFile &metadata, const SerialPortInfo &port); + + void prepare_common(AvrDude &, const SerialPortInfo &port); + void prepare_mk2(AvrDude &, const SerialPortInfo &port); + void prepare_mk3(AvrDude &, const SerialPortInfo &port); + void prepare_mm_control(AvrDude &, const SerialPortInfo &port); void perform_upload(); + void cancel(); void on_avrdude(const wxCommandEvent &evt); + void ensure_joined(); }; void FirmwareDialog::priv::find_serial_ports() @@ -122,7 +146,7 @@ void FirmwareDialog::priv::find_serial_ports() } } -void FirmwareDialog::priv::flashing_start(bool flashing_l10n) +void FirmwareDialog::priv::flashing_start(unsigned tasks) { txt_stdout->Clear(); txt_status->SetLabel(_(L("Flashing in progress. Please do not disconnect the printer!"))); @@ -132,9 +156,10 @@ void FirmwareDialog::priv::flashing_start(bool flashing_l10n) hex_picker->Disable(); btn_close->Disable(); btn_flash->SetLabel(btn_flash_label_flashing); - progressbar->SetRange(flashing_l10n ? 500 : 200); // See progress callback below + progressbar->SetRange(200 * tasks); // See progress callback below progressbar->SetValue(0); progress_tasks_done = 0; + progress_tasks_bar = 0; cancelled = false; timer_pulse.Start(50); } @@ -158,56 +183,51 @@ void FirmwareDialog::priv::flashing_done(AvrDudeComplete complete) } } -size_t FirmwareDialog::priv::hex_num_sections(const wxString &path) +void FirmwareDialog::priv::check_model_id(const HexFile &metadata, const SerialPortInfo &port) { - fs::ifstream file(fs::path(path.wx_str())); - if (! file.good()) { - return 0; + if (metadata.model_id.empty()) { + // No data to check against + return; + } + + asio::io_service io; + Serial serial(io, port.port, 115200); + serial.printer_setup(); + + enum { + TIMEOUT = 1000, + RETREIES = 3, + }; + + if (! serial.printer_ready_wait(RETREIES, TIMEOUT)) { + throw wxString::Format(_(L("Could not connect to the printer at %s")), port.port); } - static const char *hex_terminator = ":00000001FF\r"; - size_t res = 0; std::string line; - while (getline(file, line, '\n').good()) { - // Account for LF vs CRLF - if (!line.empty() && line.back() != '\r') { - line.push_back('\r'); + error_code ec; + serial.printer_write_line("PRUSA Rev"); + while (serial.read_line(TIMEOUT, line, ec)) { + if (ec) { throw wxString::Format(_(L("Could not connect to the printer at %s")), port.port); } + if (line == "ok") { continue; } + + if (line == metadata.model_id) { + return; + } else { + throw wxString::Format(_(L( + "The firmware hex file does not match the printer model.\n" + "The hex file is intended for:\n %s\n" + "Printer reports:\n %s" + )), metadata.model_id, line); } - if (line == hex_terminator) { - res++; - } + line.clear(); } - - return res; } -void FirmwareDialog::priv::perform_upload() +void FirmwareDialog::priv::prepare_common(AvrDude &avrdude, const SerialPortInfo &port) { auto filename = hex_picker->GetPath(); - std::string port = port_picker->GetValue().ToStdString(); - int selection = port_picker->GetSelection(); - if (selection != -1) { - // Verify whether the combo box list selection equals to the combo box edit value. - if (this->ports[selection].friendly_name == port) - port = this->ports[selection].port; - } - if (filename.IsEmpty() || port.empty()) { return; } - const bool extra_verbose = false; // For debugging - const auto num_secions = hex_num_sections(filename); - const auto filename_utf8 = filename.utf8_str(); - - flashing_start(num_secions > 1); - - // It is ok here to use the q-pointer to the FirmwareDialog - // because the dialog ensures it doesn't exit before the background thread is done. - auto q = this->q; - - // Init the avrdude object - AvrDude avrdude(avrdude_config); - - // Build argument list(s) std::vector args {{ extra_verbose ? "-vvvvv" : "-v", "-p", "atmega2560", @@ -215,11 +235,10 @@ void FirmwareDialog::priv::perform_upload() // The Prusa's avrdude is patched to never send semicolons inside the data packets, as the USB to serial chip // is flashed with a buggy firmware. "-c", "wiring", - "-P", port, + "-P", port.port, "-b", "115200", // TODO: Allow other rates? Ditto below. "-D", - // XXX: Safe mode? - "-U", (boost::format("flash:w:0:%1%:i") % filename_utf8.data()).str(), + "-U", (boost::format("flash:w:0:%1%:i") % filename.utf8_str().data()).str(), }}; BOOST_LOG_TRIVIAL(info) << "Invoking avrdude, arguments: " @@ -228,32 +247,172 @@ void FirmwareDialog::priv::perform_upload() }); avrdude.push_args(std::move(args)); - - if (num_secions > 1) { - // The hex file also contains another section with l10n data to be flashed into the external flash on MK3 (Einsy) - // This is done via another avrdude invocation, here we build arg list for that: - std::vector args_l10n {{ - extra_verbose ? "-vvvvv" : "-v", - "-p", "atmega2560", - // Using the "Arduino" mode to program Einsy's external flash with languages, using the STK500 protocol (not the STK500v2). - // The Prusa's avrdude is patched again to never send semicolons inside the data packets. - "-c", "arduino", - "-P", port, - "-b", "115200", - "-D", - "-u", // disable safe mode - "-U", (boost::format("flash:w:1:%1%:i") % filename_utf8.data()).str(), - }}; +} - BOOST_LOG_TRIVIAL(info) << "Invoking avrdude for external flash flashing, arguments: " - << std::accumulate(std::next(args_l10n.begin()), args_l10n.end(), args_l10n[0], [](std::string a, const std::string &b) { - return a + ' ' + b; - }); +void FirmwareDialog::priv::prepare_mk2(AvrDude &avrdude, const SerialPortInfo &port) +{ + flashing_start(1); + prepare_common(avrdude, port); +} - avrdude.push_args(std::move(args_l10n)); +void FirmwareDialog::priv::prepare_mk3(AvrDude &avrdude, const SerialPortInfo &port) +{ + flashing_start(2); + prepare_common(avrdude, port); + + auto filename = hex_picker->GetPath(); + + // The hex file also contains another section with l10n data to be flashed into the external flash on MK3 (Einsy) + // This is done via another avrdude invocation, here we build arg list for that: + std::vector args_l10n {{ + extra_verbose ? "-vvvvv" : "-v", + "-p", "atmega2560", + // Using the "Arduino" mode to program Einsy's external flash with languages, using the STK500 protocol (not the STK500v2). + // The Prusa's avrdude is patched again to never send semicolons inside the data packets. + "-c", "arduino", + "-P", port.port, + "-b", "115200", + "-D", + "-u", // disable safe mode + "-U", (boost::format("flash:w:1:%1%:i") % filename.utf8_str().data()).str(), + }}; + + BOOST_LOG_TRIVIAL(info) << "Invoking avrdude for external flash flashing, arguments: " + << std::accumulate(std::next(args_l10n.begin()), args_l10n.end(), args_l10n[0], [](std::string a, const std::string &b) { + return a + ' ' + b; + }); + + avrdude.push_args(std::move(args_l10n)); +} + +void FirmwareDialog::priv::prepare_mm_control(AvrDude &avrdude, const SerialPortInfo &port_in) +{ + // Check if the port has the PID/VID of 0x2c99/3 + // If not, check if it is the MMU (0x2c99/4) and reboot the by opening @ 1200 bauds + BOOST_LOG_TRIVIAL(info) << "Flashing MMU 2.0, looking for VID/PID 0x2c99/3 or 0x2c99/4 ..."; + SerialPortInfo port = port_in; + if (! port.id_match(0x2c99, 3)) { + if (! port.id_match(0x2c99, 4)) { + // This is not a Prusa MMU 2.0 device + BOOST_LOG_TRIVIAL(error) << boost::format("Not a Prusa MMU 2.0 device: `%1%`") % port.port; + throw wxString::Format(_(L("The device at `%s` is not am Original Prusa i3 MMU 2.0 device")), port.port); + } + + BOOST_LOG_TRIVIAL(info) << boost::format("Found VID/PID 0x2c99/4 at `%1%`, rebooting the device ...") % port.port; + + { + asio::io_service io; + Serial serial(io, port.port, 1200); + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + } + + // Wait for the bootloader to show up + std::this_thread::sleep_for(std::chrono::milliseconds(2000)); + + // Look for the rebooted device + BOOST_LOG_TRIVIAL(info) << "... looking for VID/PID 0x2c99/3 ..."; + auto new_ports = Utils::scan_serial_ports_extended(); + unsigned hits = 0; + for (auto &&new_port : new_ports) { + if (new_port.id_match(0x2c99, 3)) { + hits++; + port = std::move(new_port); + } + } + + if (hits == 0) { + BOOST_LOG_TRIVIAL(error) << "No VID/PID 0x2c99/3 device found after rebooting the MMU 2.0"; + throw wxString::Format(_(L("Failed to reboot the device at `%s` for programming")), port.port); + } else if (hits > 1) { + // We found multiple 0x2c99/3 devices, this is bad, because there's no way to find out + // which one is the one user wants to flash. + BOOST_LOG_TRIVIAL(error) << "Several VID/PID 0x2c99/3 devices found after rebooting the MMU 2.0"; + throw wxString::Format(_(L("Multiple Original Prusa i3 MMU 2.0 devices found. Please only connect one at a time for flashing.")), port.port); + } } - + + BOOST_LOG_TRIVIAL(info) << boost::format("Found VID/PID 0x2c99/3 at `%1%`, flashing ...") % port.port; + + auto filename = hex_picker->GetPath(); + + std::vector args {{ + extra_verbose ? "-vvvvv" : "-v", + "-p", "atmega32u4", + "-c", "avr109", + "-P", port.port, + "-b", "57600", + "-D", + "-U", (boost::format("flash:w:0:%1%:i") % filename.utf8_str().data()).str(), + }}; + + BOOST_LOG_TRIVIAL(info) << "Invoking avrdude, arguments: " + << std::accumulate(std::next(args.begin()), args.end(), args[0], [](std::string a, const std::string &b) { + return a + ' ' + b; + }); + + avrdude.push_args(std::move(args)); +} + + +void FirmwareDialog::priv::perform_upload() +{ + auto filename = hex_picker->GetPath(); + if (filename.IsEmpty()) { return; } + + int selection = port_picker->GetSelection(); + if (selection == wxNOT_FOUND) { return; } + + std::string port_selected = port_picker->GetValue().ToStdString(); + const SerialPortInfo &port = this->ports[selection]; + // Verify whether the combo box list selection equals to the combo box edit value. + if (this->ports[selection].friendly_name != port_selected) { return; } + + const bool extra_verbose = false; // For debugging + HexFile metadata(filename.wx_str()); + // const auto filename_utf8 = filename.utf8_str(); + + flashing_start(metadata.device == HexFile::DEV_MK3 ? 2 : 1); + + // Init the avrdude object + AvrDude avrdude(avrdude_config); + + // It is ok here to use the q-pointer to the FirmwareDialog + // because the dialog ensures it doesn't exit before the background thread is done. + auto q = this->q; + this->avrdude = avrdude + .on_run([this, metadata, port](AvrDude &avrdude) { + auto queue_error = [&](wxString message) { + avrdude.cancel(); + + auto evt = new wxCommandEvent(EVT_AVRDUDE, this->q->GetId()); + evt->SetExtraLong(AE_ERROR); + evt->SetString(std::move(message)); + wxQueueEvent(this->q, evt); + }; + + try { + switch (metadata.device) { + case HexFile::DEV_MK3: + this->check_model_id(metadata, port); + this->prepare_mk3(avrdude, port); + break; + + case HexFile::DEV_MM_CONTROL: + this->check_model_id(metadata, port); + this->prepare_mm_control(avrdude, port); + break; + + default: + this->prepare_mk2(avrdude, port); + break; + } + } catch (const wxString &message) { + queue_error(message); + } catch (const std::exception &ex) { + queue_error(wxString::Format(_(L("Error accessing port at %s: %s")), port.port, ex.what())); + } + }) .on_message(std::move([q, extra_verbose](const char *msg, unsigned /* size */) { if (extra_verbose) { BOOST_LOG_TRIVIAL(debug) << "avrdude: " << msg; @@ -306,12 +465,15 @@ void FirmwareDialog::priv::on_avrdude(const wxCommandEvent &evt) // and then display overall progress during the latter tasks. if (progress_tasks_done > 0) { - progressbar->SetValue(progress_tasks_done - 100 + evt.GetInt()); + progressbar->SetValue(progress_tasks_bar + evt.GetInt()); } if (evt.GetInt() == 100) { timer_pulse.Stop(); - progress_tasks_done += 100; + if (progress_tasks_done % 3 != 0) { + progress_tasks_bar += 100; + } + progress_tasks_done++; } break; @@ -321,11 +483,17 @@ void FirmwareDialog::priv::on_avrdude(const wxCommandEvent &evt) complete_kind = cancelled ? AC_CANCEL : (evt.GetInt() == 0 ? AC_SUCCESS : AC_FAILURE); flashing_done(complete_kind); + ensure_joined(); + break; - // Make sure the background thread is collected and the AvrDude object reset - if (avrdude) { avrdude->join(); } - avrdude.reset(); - + case AE_ERROR: + txt_stdout->AppendText(evt.GetString()); + flashing_done(AC_FAILURE); + ensure_joined(); + { + GUI::ErrorDialog dlg(this->q, evt.GetString()); + dlg.ShowModal(); + } break; default: @@ -333,6 +501,13 @@ void FirmwareDialog::priv::on_avrdude(const wxCommandEvent &evt) } } +void FirmwareDialog::priv::ensure_joined() +{ + // Make sure the background thread is collected and the AvrDude object reset + if (avrdude) { avrdude->join(); } + avrdude.reset(); +} + // Public diff --git a/xs/src/slic3r/Utils/HexFile.cpp b/xs/src/slic3r/Utils/HexFile.cpp new file mode 100644 index 0000000000..ed26ddf37e --- /dev/null +++ b/xs/src/slic3r/Utils/HexFile.cpp @@ -0,0 +1,107 @@ +#include "HexFile.hpp" + +#include +#include +#include +#include + +namespace fs = boost::filesystem; +namespace pt = boost::property_tree; + + +namespace Slic3r { +namespace Utils { + + +static HexFile::DeviceKind parse_device_kind(const std::string &str) +{ + if (str == "mk2") { return HexFile::DEV_MK2; } + else if (str == "mk3") { return HexFile::DEV_MK3; } + else if (str == "mm-control") { return HexFile::DEV_MM_CONTROL; } + else { return HexFile::DEV_GENERIC; } +} + +static size_t hex_num_sections(fs::ifstream &file) +{ + file.seekg(0); + if (! file.good()) { + return 0; + } + + static const char *hex_terminator = ":00000001FF\r"; + size_t res = 0; + std::string line; + while (getline(file, line, '\n').good()) { + // Account for LF vs CRLF + if (!line.empty() && line.back() != '\r') { + line.push_back('\r'); + } + + if (line == hex_terminator) { + res++; + } + } + + return res; +} + +HexFile::HexFile(fs::path path) : + path(std::move(path)), + device(DEV_GENERIC) +{ + fs::ifstream file(this->path); + if (! file.good()) { + return; + } + + std::string line; + std::stringstream header_ini; + while (std::getline(file, line, '\n').good()) { + if (line.empty()) { + continue; + } + + // Account for LF vs CRLF + if (!line.empty() && line.back() == '\r') { + line.pop_back(); + } + + if (line.front() == ';') { + line.front() = ' '; + header_ini << line << std::endl; + } else if (line.front() == ':') { + break; + } + } + + pt::ptree ptree; + try { + pt::read_ini(header_ini, ptree); + } catch (std::exception &e) { + return; + } + + bool has_device_meta = false; + const auto device = ptree.find("device"); + if (device != ptree.not_found()) { + this->device = parse_device_kind(device->second.data()); + has_device_meta = true; + } + + const auto model_id = ptree.find("model_id"); + if (model_id != ptree.not_found()) { + this->model_id = model_id->second.data(); + } + + if (! has_device_meta) { + // No device metadata, look at the number of 'sections' + if (hex_num_sections(file) == 2) { + // Looks like a pre-metadata l10n firmware for the MK3, assume that's the case + this->device = DEV_MK3; + } + } +} + + +} +} diff --git a/xs/src/slic3r/Utils/HexFile.hpp b/xs/src/slic3r/Utils/HexFile.hpp new file mode 100644 index 0000000000..d8d1e09abd --- /dev/null +++ b/xs/src/slic3r/Utils/HexFile.hpp @@ -0,0 +1,32 @@ +#ifndef slic3r_Hex_hpp_ +#define slic3r_Hex_hpp_ + +#include +#include + + +namespace Slic3r { +namespace Utils { + + +struct HexFile +{ + enum DeviceKind { + DEV_GENERIC, + DEV_MK2, + DEV_MK3, + DEV_MM_CONTROL, + }; + + boost::filesystem::path path; + DeviceKind device; + std::string model_id; + + HexFile(boost::filesystem::path path); +}; + + +} +} + +#endif diff --git a/xs/src/slic3r/Utils/Serial.cpp b/xs/src/slic3r/Utils/Serial.cpp index 8a454b1195..c3c16b314e 100644 --- a/xs/src/slic3r/Utils/Serial.cpp +++ b/xs/src/slic3r/Utils/Serial.cpp @@ -11,12 +11,14 @@ #include #include #include +#include #if _WIN32 #include #include #include #include + #include // Undefine min/max macros incompatible with the standard library // For example, std::numeric_limits::max() // produces some weird errors @@ -51,6 +53,8 @@ #include #endif +using boost::optional; + namespace Slic3r { namespace Utils { @@ -60,15 +64,43 @@ static bool looks_like_printer(const std::string &friendly_name) return friendly_name.find("Original Prusa") != std::string::npos; } -#ifdef __linux__ -static std::string get_tty_friendly_name(const std::string &path, const std::string &name) +#if _WIN32 +void parse_hardware_id(const std::string &hardware_id, SerialPortInfo &spi) { - const auto sysfs_product = (boost::format("/sys/class/tty/%1%/device/../product") % name).str(); - std::ifstream file(sysfs_product); - std::string product; + unsigned vid, pid; + std::regex pattern("USB\\\\.*VID_([[:xdigit:]]+)&PID_([[:xdigit:]]+).*"); + std::smatch matches; + if (std::regex_match(hardware_id, matches, pattern)) { + try { + vid = std::stoul(matches[1].str(), 0, 16); + pid = std::stoul(matches[2].str(), 0, 16); + spi.id_vendor = vid; + spi.id_product = pid; + } + catch (...) {} + } +} +#endif - std::getline(file, product); - return file.good() ? (boost::format("%1% (%2%)") % product % path).str() : path; +#ifdef __linux__ +optional sysfs_tty_prop(const std::string &tty_dev, const std::string &name) +{ + const auto prop_path = (boost::format("/sys/class/tty/%1%/device/../%2%") % tty_dev % name).str(); + std::ifstream file(prop_path); + std::string res; + + std::getline(file, res); + if (file.good()) { return res; } + else { return boost::none; } +} + +optional sysfs_tty_prop_hex(const std::string &tty_dev, const std::string &name) +{ + auto prop = sysfs_tty_prop(tty_dev, name); + if (!prop) { return boost::none; } + + try { return std::stoul(*prop, 0, 16); } + catch (...) { return boost::none; } } #endif @@ -98,6 +130,7 @@ std::vector scan_serial_ports_extended() if (port_info.port.empty()) continue; } + // Find the size required to hold the device info. DWORD regDataType; DWORD reqSize = 0; @@ -106,7 +139,8 @@ std::vector scan_serial_ports_extended() // Now store it in a buffer. if (! SetupDiGetDeviceRegistryProperty(hDeviceInfo, &devInfoData, SPDRP_HARDWAREID, ®DataType, (BYTE*)hardware_id.data(), reqSize, nullptr)) continue; - port_info.hardware_id = boost::nowide::narrow(hardware_id.data()); + parse_hardware_id(boost::nowide::narrow(hardware_id.data()), port_info); + // Find the size required to hold the friendly name. reqSize = 0; SetupDiGetDeviceRegistryProperty(hDeviceInfo, &devInfoData, SPDRP_FRIENDLYNAME, nullptr, nullptr, 0, &reqSize); @@ -138,6 +172,8 @@ std::vector scan_serial_ports_extended() if (result) { SerialPortInfo port_info; port_info.port = path; + + // Attempt to read out the device friendly name if ((cf_property = IORegistryEntrySearchCFProperty(port, kIOServicePlane, CFSTR("USB Interface Name"), kCFAllocatorDefault, kIORegistryIterateRecursively | kIORegistryIterateParents)) || @@ -159,6 +195,23 @@ std::vector scan_serial_ports_extended() } if (port_info.friendly_name.empty()) port_info.friendly_name = port_info.port; + + // Attempt to read out the VID & PID + int vid, pid; + auto cf_vendor = IORegistryEntrySearchCFProperty(port, kIOServicePlane, CFSTR("idVendor"), + kCFAllocatorDefault, kIORegistryIterateRecursively | kIORegistryIterateParents); + auto cf_product = IORegistryEntrySearchCFProperty(port, kIOServicePlane, CFSTR("idProduct"), + kCFAllocatorDefault, kIORegistryIterateRecursively | kIORegistryIterateParents); + if (cf_vendor && cf_product) { + if (CFNumberGetValue((CFNumberRef)cf_vendor, kCFNumberIntType, &vid) && + CFNumberGetValue((CFNumberRef)cf_product, kCFNumberIntType, &pid)) { + port_info.id_vendor = vid; + port_info.id_product = pid; + } + } + if (cf_vendor) { CFRelease(cf_vendor); } + if (cf_product) { CFRelease(cf_product); } + output.emplace_back(std::move(port_info)); } } @@ -176,9 +229,15 @@ std::vector scan_serial_ports_extended() const auto path = dir_entry.path().string(); SerialPortInfo spi; spi.port = path; - spi.hardware_id = path; #ifdef __linux__ - spi.friendly_name = get_tty_friendly_name(path, name); + auto friendly_name = sysfs_tty_prop(name, "product"); + spi.friendly_name = friendly_name ? (boost::format("%1% (%2%)") % *friendly_name % path).str() : path; + auto vid = sysfs_tty_prop_hex(name, "idVendor"); + auto pid = sysfs_tty_prop_hex(name, "idProduct"); + if (vid && pid) { + spi.id_vendor = *vid; + spi.id_product = *pid; + } #else spi.friendly_name = path; #endif @@ -221,7 +280,7 @@ Serial::Serial(asio::io_service& io_service) : Serial::Serial(asio::io_service& io_service, const std::string &name, unsigned baud_rate) : asio::serial_port(io_service, name) { - printer_setup(baud_rate); + set_baud_rate(baud_rate); } Serial::~Serial() {} @@ -359,9 +418,8 @@ bool Serial::read_line(unsigned timeout, std::string &line, error_code &ec) } } -void Serial::printer_setup(unsigned baud_rate) +void Serial::printer_setup() { - set_baud_rate(baud_rate); printer_reset(); write_string("\r\r\r\r\r\r\r\r\r\r"); // Gets rid of line noise, if any } diff --git a/xs/src/slic3r/Utils/Serial.hpp b/xs/src/slic3r/Utils/Serial.hpp index 5df33916f0..d15f249c07 100644 --- a/xs/src/slic3r/Utils/Serial.hpp +++ b/xs/src/slic3r/Utils/Serial.hpp @@ -12,16 +12,21 @@ namespace Utils { struct SerialPortInfo { std::string port; - std::string hardware_id; + unsigned id_vendor = -1; + unsigned id_product = -1; std::string friendly_name; - bool is_printer = false; + bool is_printer = false; + + bool id_match(unsigned id_vendor, unsigned id_product) const { return id_vendor == this->id_vendor && id_product == this->id_product; } }; inline bool operator==(const SerialPortInfo &sp1, const SerialPortInfo &sp2) { - return sp1.port == sp2.port && - sp1.hardware_id == sp2.hardware_id && - sp1.is_printer == sp2.is_printer; + return + sp1.port == sp2.port && + sp1.id_vendor == sp2.id_vendor && + sp1.id_product == sp2.id_product && + sp1.is_printer == sp2.is_printer; } extern std::vector scan_serial_ports(); @@ -32,7 +37,6 @@ class Serial : public boost::asio::serial_port { public: Serial(boost::asio::io_service &io_service); - // This c-tor opens the port for communication with a printer - it sets a baud rate and calls printer_reset() Serial(boost::asio::io_service &io_service, const std::string &name, unsigned baud_rate); Serial(const Serial &) = delete; Serial &operator=(const Serial &) = delete; @@ -48,8 +52,7 @@ public: bool read_line(unsigned timeout, std::string &line, boost::system::error_code &ec); // Perform setup for communicating with a printer - // Sets a baud rate and calls printer_reset() - void printer_setup(unsigned baud_rate); + void printer_setup(); // Write data from a string size_t write_string(const std::string &str); From f729ab4b1217f6acc22436e2c78e9bb600e289f7 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Wed, 25 Jul 2018 15:20:04 +0200 Subject: [PATCH 18/21] Fix: Race conditions --- xs/src/slic3r/GUI/FirmwareDialog.cpp | 44 ++++++++++++---------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/xs/src/slic3r/GUI/FirmwareDialog.cpp b/xs/src/slic3r/GUI/FirmwareDialog.cpp index 38c2937fc5..e9499239ab 100644 --- a/xs/src/slic3r/GUI/FirmwareDialog.cpp +++ b/xs/src/slic3r/GUI/FirmwareDialog.cpp @@ -114,10 +114,10 @@ struct FirmwareDialog::priv void flashing_done(AvrDudeComplete complete); void check_model_id(const HexFile &metadata, const SerialPortInfo &port); - void prepare_common(AvrDude &, const SerialPortInfo &port); - void prepare_mk2(AvrDude &, const SerialPortInfo &port); - void prepare_mk3(AvrDude &, const SerialPortInfo &port); - void prepare_mm_control(AvrDude &, const SerialPortInfo &port); + void prepare_common(AvrDude &, const SerialPortInfo &port, const std::string &filename); + void prepare_mk2(AvrDude &, const SerialPortInfo &port, const std::string &filename); + void prepare_mk3(AvrDude &, const SerialPortInfo &port, const std::string &filename); + void prepare_mm_control(AvrDude &, const SerialPortInfo &port, const std::string &filename); void perform_upload(); void cancel(); @@ -224,10 +224,8 @@ void FirmwareDialog::priv::check_model_id(const HexFile &metadata, const SerialP } } -void FirmwareDialog::priv::prepare_common(AvrDude &avrdude, const SerialPortInfo &port) +void FirmwareDialog::priv::prepare_common(AvrDude &avrdude, const SerialPortInfo &port, const std::string &filename) { - auto filename = hex_picker->GetPath(); - std::vector args {{ extra_verbose ? "-vvvvv" : "-v", "-p", "atmega2560", @@ -238,7 +236,7 @@ void FirmwareDialog::priv::prepare_common(AvrDude &avrdude, const SerialPortInfo "-P", port.port, "-b", "115200", // TODO: Allow other rates? Ditto below. "-D", - "-U", (boost::format("flash:w:0:%1%:i") % filename.utf8_str().data()).str(), + "-U", (boost::format("flash:w:0:%1%:i") % filename).str(), }}; BOOST_LOG_TRIVIAL(info) << "Invoking avrdude, arguments: " @@ -249,18 +247,14 @@ void FirmwareDialog::priv::prepare_common(AvrDude &avrdude, const SerialPortInfo avrdude.push_args(std::move(args)); } -void FirmwareDialog::priv::prepare_mk2(AvrDude &avrdude, const SerialPortInfo &port) +void FirmwareDialog::priv::prepare_mk2(AvrDude &avrdude, const SerialPortInfo &port, const std::string &filename) { - flashing_start(1); - prepare_common(avrdude, port); + prepare_common(avrdude, port, filename); } -void FirmwareDialog::priv::prepare_mk3(AvrDude &avrdude, const SerialPortInfo &port) +void FirmwareDialog::priv::prepare_mk3(AvrDude &avrdude, const SerialPortInfo &port, const std::string &filename) { - flashing_start(2); - prepare_common(avrdude, port); - - auto filename = hex_picker->GetPath(); + prepare_common(avrdude, port, filename); // The hex file also contains another section with l10n data to be flashed into the external flash on MK3 (Einsy) // This is done via another avrdude invocation, here we build arg list for that: @@ -274,7 +268,7 @@ void FirmwareDialog::priv::prepare_mk3(AvrDude &avrdude, const SerialPortInfo &p "-b", "115200", "-D", "-u", // disable safe mode - "-U", (boost::format("flash:w:1:%1%:i") % filename.utf8_str().data()).str(), + "-U", (boost::format("flash:w:1:%1%:i") % filename).str(), }}; BOOST_LOG_TRIVIAL(info) << "Invoking avrdude for external flash flashing, arguments: " @@ -285,7 +279,7 @@ void FirmwareDialog::priv::prepare_mk3(AvrDude &avrdude, const SerialPortInfo &p avrdude.push_args(std::move(args_l10n)); } -void FirmwareDialog::priv::prepare_mm_control(AvrDude &avrdude, const SerialPortInfo &port_in) +void FirmwareDialog::priv::prepare_mm_control(AvrDude &avrdude, const SerialPortInfo &port_in, const std::string &filename) { // Check if the port has the PID/VID of 0x2c99/3 // If not, check if it is the MMU (0x2c99/4) and reboot the by opening @ 1200 bauds @@ -333,8 +327,6 @@ void FirmwareDialog::priv::prepare_mm_control(AvrDude &avrdude, const SerialPort BOOST_LOG_TRIVIAL(info) << boost::format("Found VID/PID 0x2c99/3 at `%1%`, flashing ...") % port.port; - auto filename = hex_picker->GetPath(); - std::vector args {{ extra_verbose ? "-vvvvv" : "-v", "-p", "atmega32u4", @@ -342,7 +334,7 @@ void FirmwareDialog::priv::prepare_mm_control(AvrDude &avrdude, const SerialPort "-P", port.port, "-b", "57600", "-D", - "-U", (boost::format("flash:w:0:%1%:i") % filename.utf8_str().data()).str(), + "-U", (boost::format("flash:w:0:%1%:i") % filename).str(), }}; BOOST_LOG_TRIVIAL(info) << "Invoking avrdude, arguments: " @@ -369,7 +361,7 @@ void FirmwareDialog::priv::perform_upload() const bool extra_verbose = false; // For debugging HexFile metadata(filename.wx_str()); - // const auto filename_utf8 = filename.utf8_str(); + const std::string filename_utf8(filename.utf8_str().data()); flashing_start(metadata.device == HexFile::DEV_MK3 ? 2 : 1); @@ -381,7 +373,7 @@ void FirmwareDialog::priv::perform_upload() auto q = this->q; this->avrdude = avrdude - .on_run([this, metadata, port](AvrDude &avrdude) { + .on_run([=](AvrDude &avrdude) { auto queue_error = [&](wxString message) { avrdude.cancel(); @@ -395,16 +387,16 @@ void FirmwareDialog::priv::perform_upload() switch (metadata.device) { case HexFile::DEV_MK3: this->check_model_id(metadata, port); - this->prepare_mk3(avrdude, port); + this->prepare_mk3(avrdude, port, filename_utf8); break; case HexFile::DEV_MM_CONTROL: this->check_model_id(metadata, port); - this->prepare_mm_control(avrdude, port); + this->prepare_mm_control(avrdude, port, filename_utf8); break; default: - this->prepare_mk2(avrdude, port); + this->prepare_mk2(avrdude, port, filename_utf8); break; } } catch (const wxString &message) { From a9aca4426ca1c389dec4d415659467569e87cfb2 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Wed, 25 Jul 2018 16:54:02 +0200 Subject: [PATCH 19/21] Fix: port friendly name encoding --- xs/src/slic3r/GUI/FirmwareDialog.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/xs/src/slic3r/GUI/FirmwareDialog.cpp b/xs/src/slic3r/GUI/FirmwareDialog.cpp index e9499239ab..30339e3cb0 100644 --- a/xs/src/slic3r/GUI/FirmwareDialog.cpp +++ b/xs/src/slic3r/GUI/FirmwareDialog.cpp @@ -132,7 +132,7 @@ void FirmwareDialog::priv::find_serial_ports() this->ports = new_ports; port_picker->Clear(); for (const auto &port : this->ports) - port_picker->Append(port.friendly_name); + port_picker->Append(wxString::FromUTF8(port.friendly_name.data())); if (ports.size() > 0) { int idx = port_picker->GetValue().IsEmpty() ? 0 : -1; for (int i = 0; i < (int)this->ports.size(); ++ i) @@ -354,10 +354,11 @@ void FirmwareDialog::priv::perform_upload() int selection = port_picker->GetSelection(); if (selection == wxNOT_FOUND) { return; } - std::string port_selected = port_picker->GetValue().ToStdString(); const SerialPortInfo &port = this->ports[selection]; // Verify whether the combo box list selection equals to the combo box edit value. - if (this->ports[selection].friendly_name != port_selected) { return; } + if (wxString::FromUTF8(this->ports[selection].friendly_name.data()) != port_picker->GetValue()) { + return; + } const bool extra_verbose = false; // For debugging HexFile metadata(filename.wx_str()); From 81a229045a81337d36a845da7b497baab7b1a849 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Fri, 27 Jul 2018 15:10:25 +0200 Subject: [PATCH 20/21] avrdude: Fix: Stray winsock usage on Windows --- xs/src/avrdude/ser_win32.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xs/src/avrdude/ser_win32.c b/xs/src/avrdude/ser_win32.c index 20d085d13b..3a05cfa905 100644 --- a/xs/src/avrdude/ser_win32.c +++ b/xs/src/avrdude/ser_win32.c @@ -311,8 +311,10 @@ static int ser_open(char * port, union pinfo pinfo, union filedescriptor *fdp) static void ser_close(union filedescriptor *fd) { if (serial_over_ethernet) { +#ifdef HAVE_LIBWS2_32 closesocket(fd->ifd); WSACleanup(); +#endif } else { HANDLE hComPort=(HANDLE)fd->pfd; if (hComPort != INVALID_HANDLE_VALUE) From 78a8acfcf187d05cfea8a0521cf238937221a86a Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 27 Jul 2018 15:57:00 +0200 Subject: [PATCH 21/21] New PrusaResearch configuration, renamed and improved the MK3 MMU2 wizard picture. --- .../icons/printers/PrusaResearch_MK3MM2.png | Bin 41571 -> 0 bytes .../icons/printers/PrusaResearch_MK3MMU2.png | Bin 0 -> 71328 bytes resources/profiles/PrusaResearch.idx | 1 + resources/profiles/PrusaResearch.ini | 150 +++++++++++------- 4 files changed, 91 insertions(+), 60 deletions(-) delete mode 100644 resources/icons/printers/PrusaResearch_MK3MM2.png create mode 100644 resources/icons/printers/PrusaResearch_MK3MMU2.png diff --git a/resources/icons/printers/PrusaResearch_MK3MM2.png b/resources/icons/printers/PrusaResearch_MK3MM2.png deleted file mode 100644 index 1068bfc105f02d13e374764352e61ce76087ecb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41571 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%0DF%RgsF}R*<8&ArgN&BuY(A6?$Vu7QvDx< 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 diff --git a/resources/icons/printers/PrusaResearch_MK3MMU2.png b/resources/icons/printers/PrusaResearch_MK3MMU2.png new file mode 100644 index 0000000000000000000000000000000000000000..eb5dccf08c6492825f2706d64805e2ba526d354c GIT binary patch literal 71328 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

X=%+NZBI531A>dAY2^iq9WcOZK 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

JEdk^NC_(}C2HjTtCe_E1U^ zB~cjct|M}3(3)V#aU8s3no_UTX*L^d+PaVgU6CNCsT1k4msQ9XhBc#80F>v!+vo_ii*xu5go=f9ruW8a~?^BeT7UzDs_+P|h&o8F|OT{83*1MT9ZXYA@-luG&HrB@UklQE+calLX-cPtGseX ztzIL|5;ko)6Di=;qjcIOY-5D3MYtMcj-tzzp%g4!TP0}Rhj5D@!<&_r_ML`lET;C912D=I- zD}5D44IN5lbfHg%Q5ZD}Vnq1K+v>g6{F{(BjC}s+e2o$=@2i^TDnclgq`TDSoC~kI z0l2l(UU?-#jAr5(Tg}9g0&6_N$7E?89SKTblE`4V7=g7BUJj)x;P~+)yyTUy$NPwX z`1_A>_St9iu0MM(=bd{V|NR$#mal&O8~o+R{*E|KAK#$8_Y`HoYoB)Q6{Km35Q4NG z^}g|yFWqt9cfWPbmp}K}SG?fIUiS0jQm6g$l^xmSQ6roR4*pX6#6nGmM%z*Cl z3TJM;HooGj3-GQeosUx)MFG)(x}y0w{8)4(~7%MB~#Uv9B!0ec!UDwe3gtzl$SUkwsa{a%|^z)M-FlQjd!Aw8q>{5 zyf-+R(;MGJ*(uRF9nE+tMc8_~OFfciiqsNY7*v)J>u{mGDM3ag6BBfMEyUEt)U~F+ zG)J>OhVz16zr*r!j+GHR&e_hUb#)9u=tc~uepR2yyAw=x=v+sJ>%?kTz|hr51aA0V zLr;8y6sMu}#m;>rOLc8uz8%&cF}*S`8SoE1FlSwDb|B_Dp@UvYh-$upk&JpRjDevR71 z1PhCcquRw|tstB$1X-H0Yu7G5_qi|fm9KoAJHB@>S-t+gXkv_q_CBb;`_1crVcQwo zNRuj2%2H~z8gZmZvY4!%obYHgGmI8xDNB-Aamgi@#{gcM!kL^#Bc;}?W4%KvNtUIg zNkW{YWVIT#%Ba`Pu4j679pC-dXF0O}L1tz)hnawBttzp*An96`;bK&ttfJ+v#*-B_ zRZ4-gVJd*q0k(T+=YIM|Fg`v(lBF0Gv*+%w)4t=&GbXen{N6!mJ38P@RvkAPnlmNYKFkV=I2?B!6D5yDIGg3^XDB(W0M(v1eucRC#!6BAr;*+ooFHTj3X z|0tjR!e@B?3tr6mmp_p|{?p&%uG?;PGc(hVtIHvW$(@vf(pZijpX2z#Joi8F5LZ3v zi61@d!V9|dx#tU?|Ce7F^m~j=PLN~?NtO_&DM^-+XhkG7ky4{atRi$IO6MhUTqDh5 z4G<-�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 As{jB1 literal 0 HcmV?d00001 diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index 5c06353caa..3652c0174c 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,4 +1,5 @@ min_slic3r_version = 1.41.0-alpha +0.2.0-alpha3 0.2.0-alpha2 Renamed the key MK3SMMU to MK3MMU2, added a generic PLA MMU2 material 0.2.0-alpha1 added initial profiles for the i3 MK3 Multi Material Upgrade 2.0 0.2.0-alpha moved machine limits from the start G-code to the new print profile parameters diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index fe403263d4..6817c87127 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -5,7 +5,7 @@ name = Prusa Research # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the Slic3r configuration to be downgraded. -config_version = 0.2.0-alpha2 +config_version = 0.2.0-alpha3 # Where to get the updates from? config_update_url = https://raw.githubusercontent.com/prusa3d/Slic3r-settings/master/live/PrusaResearch/ @@ -14,26 +14,27 @@ config_update_url = https://raw.githubusercontent.com/prusa3d/Slic3r-settings/ma #TODO: One day we may differentiate variants of the nozzles / hot ends, #for example by the melt zone size, or whether the nozzle is hardened. # Printer model name will be shown by the installation wizard. + [printer_model:MK3] name = Original Prusa i3 MK3 variants = 0.4; 0.25; 0.6 -[printer_model:MK2S] -name = Original Prusa i3 MK2S -variants = 0.4; 0.25; 0.6 - [printer_model:MK2.5] name = Original Prusa i3 MK2.5 variants = 0.4; 0.25; 0.6 -[printer_model:MK2SMM] -name = Original Prusa i3 MK2S Multi Material Upgrade -variants = 0.4; 0.6 +[printer_model:MK2S] +name = Original Prusa i3 MK2/S +variants = 0.4; 0.25; 0.6 -[printer_model:MK3MM2] -name = Original Prusa i3 MK3 Multi Material Upgrade 2.0 +[printer_model:MK3MMU2] +name = Original Prusa i3 MK3 MMU 2.0 variants = 0.4 +[printer_model:MK2SMM] +name = Original Prusa i3 MK2/S MMU 1.0 +variants = 0.4; 0.6 + # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -85,7 +86,7 @@ notes = overhangs = 0 only_retract_when_crossing_perimeters = 0 ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode +output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}.gcode perimeters = 2 perimeter_extruder = 1 perimeter_extrusion_width = 0.45 @@ -131,8 +132,8 @@ wipe_tower = 1 wipe_tower_bridging = 10 wipe_tower_rotation_angle = 0 wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 +wipe_tower_x = 200 +wipe_tower_y = 155 xy_size_compensation = 0 # Print parameters common to a 0.25mm diameter nozzle. @@ -259,7 +260,7 @@ bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and ! single_extruder_multi_material external_perimeter_speed = 35 fill_pattern = grid -infill_acceleration = 1500 +infill_acceleration = 1250 infill_speed = 200 max_print_speed = 200 perimeter_speed = 45 @@ -286,7 +287,7 @@ bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 external_perimeter_speed = 35 fill_pattern = grid -infill_acceleration = 1500 +infill_acceleration = 1250 infill_speed = 200 max_print_speed = 200 perimeter_speed = 45 @@ -299,7 +300,7 @@ bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 external_perimeter_speed = 35 fill_pattern = grid -infill_acceleration = 1500 +infill_acceleration = 1250 infill_speed = 200 max_print_speed = 200 perimeter_speed = 45 @@ -362,10 +363,10 @@ compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and [print:0.15mm OPTIMAL MK3] inherits = *0.15mm* bridge_speed = 30 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and ! single_extruder_multi_material +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 external_perimeter_speed = 35 fill_pattern = grid -infill_acceleration = 1500 +infill_acceleration = 1250 infill_speed = 200 max_print_speed = 200 perimeter_speed = 45 @@ -397,7 +398,7 @@ bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 external_perimeter_speed = 35 fill_pattern = grid -infill_acceleration = 1500 +infill_acceleration = 1250 infill_speed = 200 max_print_speed = 200 perimeter_speed = 45 @@ -408,7 +409,7 @@ inherits = *common* bottom_solid_layers = 4 bridge_flow_ratio = 0.95 external_perimeter_speed = 40 -infill_acceleration = 2000 +infill_acceleration = 1250 infill_speed = 60 layer_height = 0.2 perimeter_acceleration = 800 @@ -423,39 +424,13 @@ bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 external_perimeter_speed = 35 fill_pattern = grid -infill_acceleration = 1500 +infill_acceleration = 1250 infill_speed = 200 max_print_speed = 200 perimeter_speed = 45 solid_infill_speed = 200 top_solid_infill_speed = 50 -[print:0.15mm OPTIMAL MK3 MMU2] -inherits = 0.15mm OPTIMAL MK3 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and single_extruder_multi_material -bottom_solid_layers = 4 -external_perimeter_speed = 40 -fill_density = 10% -infill_overlap = 15% -perimeter_speed = 60 -small_perimeter_speed = 20 -support_material_threshold = 20 -top_solid_layers = 5 - -[print:0.20mm FAST MK3 MMU2] -inherits = 0.20mm FAST MK3 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and single_extruder_multi_material -bridge_flow_ratio = 0.8 -external_perimeter_speed = 40 -fill_density = 15% -infill_overlap = 35% -infill_speed = 150 -perimeter_speed = 50 -small_perimeter_speed = 20 -solid_infill_speed = 150 -wipe_tower_x = 169 -wipe_tower_y = 137 - # XXXXXXXXXXXXXXXXXXXX # XXX--- 0.20mm ---XXX # XXXXXXXXXXXXXXXXXXXX @@ -475,10 +450,10 @@ top_solid_infill_speed = 70 [print:0.20mm FAST MK3] inherits = *0.20mm* bridge_speed = 30 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and ! single_extruder_multi_material +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 external_perimeter_speed = 35 fill_pattern = grid -infill_acceleration = 1500 +infill_acceleration = 1250 infill_speed = 200 max_print_speed = 200 perimeter_speed = 45 @@ -516,7 +491,7 @@ bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 external_perimeter_speed = 35 fill_pattern = grid -infill_acceleration = 1500 +infill_acceleration = 1250 infill_speed = 200 max_print_speed = 200 perimeter_speed = 45 @@ -680,6 +655,8 @@ inherits = *PLA* # For now, all but selected filaments are disabled for the MMU 2.0 compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and single_extruder_multi_material) extrusion_multiplier = 1.2 +filament_cost = 80.65 +filament_density = 4 filament_colour = #804040 filament_max_volumetric_speed = 10 @@ -700,12 +677,16 @@ temperature = 270 [filament:ColorFabb PLA-PHA] inherits = *PLA* +filament_cost = 55.5 +filament_density = 1.24 [filament:ColorFabb Woodfil] inherits = *PLA* # For now, all but selected filaments are disabled for the MMU 2.0 compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and single_extruder_multi_material) extrusion_multiplier = 1.2 +filament_cost = 62.9 +filament_density = 1.15 filament_colour = #804040 filament_max_volumetric_speed = 10 first_layer_temperature = 200 @@ -714,7 +695,9 @@ temperature = 200 [filament:ColorFabb XT] inherits = *PET* -filament_type = PLA +filament_type = PET +filament_cost = 62.9 +filament_density = 1.27 first_layer_bed_temperature = 90 first_layer_temperature = 260 temperature = 270 @@ -722,6 +705,8 @@ temperature = 270 [filament:ColorFabb XT-CF20] inherits = *PET* extrusion_multiplier = 1.2 +filament_cost = 80.65 +filament_density = 1.35 filament_colour = #804040 filament_max_volumetric_speed = 1 first_layer_bed_temperature = 90 @@ -731,6 +716,8 @@ temperature = 260 [filament:ColorFabb nGen] inherits = *PET* +filament_cost = 21.2 +filament_density = 1.2 bridge_fan_speed = 40 fan_always_on = 0 fan_below_layer_time = 10 @@ -741,6 +728,8 @@ min_fan_speed = 20 [filament:ColorFabb nGen flex] inherits = *FLEX* +filament_cost = 0 +filament_density = 1 bed_temperature = 85 bridge_fan_speed = 40 cooling = 1 @@ -756,26 +745,36 @@ temperature = 260 [filament:E3D Edge] inherits = *PET* +filament_cost = 0 +filament_density = 1.26 filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" [filament:E3D PC-ABS] inherits = *ABS* +filament_cost = 0 +filament_density = 1.05 first_layer_temperature = 270 temperature = 270 [filament:Fillamentum ABS] inherits = *ABS* +filament_cost = 0 +filament_density = 1.04 first_layer_temperature = 240 temperature = 240 [filament:Fillamentum ASA] inherits = *ABS* +filament_cost = 0 +filament_density = 1.04 fan_always_on = 1 first_layer_temperature = 265 temperature = 265 [filament:Fillamentum CPE HG100 HM100] inherits = *PET* +filament_cost = 0 +filament_density = 1.25 filament_notes = "CPE HG100 , CPE HM100" first_layer_bed_temperature = 90 first_layer_temperature = 275 @@ -788,6 +787,8 @@ inherits = *PLA* # For now, all but selected filaments are disabled for the MMU 2.0 compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and single_extruder_multi_material) extrusion_multiplier = 1.2 +filament_cost = 0 +filament_density = 1.15 filament_colour = #804040 filament_max_volumetric_speed = 10 first_layer_temperature = 190 @@ -796,14 +797,20 @@ temperature = 190 [filament:Generic ABS] inherits = *ABS* +filament_cost = 0 +filament_density = 1.04 filament_notes = "List of materials tested with standart ABS print settings for MK2:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladeč ABS" [filament:Generic PET] inherits = *PET* +filament_cost = 0 +filament_density = 1.24 filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" [filament:Generic PLA] inherits = *PLA* +filament_cost = 0 +filament_density = 1.27 filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" [filament:Polymaker PC-Max] @@ -830,8 +837,25 @@ temperature = 195 [filament:Prusa ABS] inherits = *ABS* +filament_cost = 27.82 +filament_density = 1.08 filament_notes = "List of materials tested with standart ABS print settings for MK2:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladeč ABS" +[filament:*ABS MMU2*] +inherits = Prusa ABS +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and single_extruder_multi_material +filament_cooling_final_speed = 50 +filament_cooling_initial_speed = 10 +filament_cooling_moves = 5 +filament_loading_speed = 14 +filament_ramming_parameters = "120 110 5.32258 5.45161 5.67742 6 6.48387 7.12903 7.90323 8.70968 9.3871 9.83871 10.0968 10.2258| 0.05 5.30967 0.45 5.50967 0.95 6.1871 1.45 7.39677 1.95 9.05484 2.45 10 2.95 10.3098 3.45 13.0839 3.95 7.6 4.45 7.6 4.95 7.6"; + +[filament:Generic ABS MMU2] +inherits = *ABS MMU2* + +[filament:Prusa ABS MMU2] +inherits = *ABS MMU2* + [filament:Prusa HIPS] inherits = *ABS* bridge_fan_speed = 50 @@ -850,10 +874,14 @@ temperature = 220 [filament:Prusa PET] inherits = *PET* +filament_cost = 27.82 +filament_density = 1.27 filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" [filament:Prusa PLA] inherits = *PLA* +filament_cost = 25.4 +filament_density = 1.24 filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" [filament:*PLA MMU2*] @@ -873,6 +901,8 @@ inherits = *PLA MMU2* [filament:SemiFlex or Flexfill 98A] inherits = *FLEX* +filament_cost = 0 +filament_density = 1.22 [filament:Taulman Bridge] inherits = *common* @@ -956,7 +986,7 @@ extruder_offset = 0x0 gcode_flavor = marlin silent_mode = 0 machine_max_acceleration_e = 10000 -machine_max_acceleration_extruding = 1500 +machine_max_acceleration_extruding = 2000 machine_max_acceleration_retracting = 1500 machine_max_acceleration_x = 9000 machine_max_acceleration_y = 9000 @@ -1118,11 +1148,11 @@ start_gcode = M115 U3.2.1 ; tell printer latest fw version\nM83 ; extruder rela [printer:Original Prusa i3 MK3] inherits = *common* end_gcode = G4 ; wait\nM221 S100\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200; home X axis\nM84 ; disable motors -machine_max_acceleration_e = 9000,9000 -machine_max_acceleration_extruding = 1250,960 +machine_max_acceleration_e = 5000,5000 +machine_max_acceleration_extruding = 1250,1250 machine_max_acceleration_retracting = 1250,1250 -machine_max_acceleration_x = 1000,1000 -machine_max_acceleration_y = 1000,1000 +machine_max_acceleration_x = 1000,960 +machine_max_acceleration_y = 1000,960 machine_max_acceleration_z = 1000,1000 machine_max_feedrate_e = 120,120 machine_max_feedrate_x = 200,172 @@ -1167,8 +1197,8 @@ cooling_tube_retraction = 30 parking_pos_retraction = 85 retract_length_toolchange = 3 extra_loading_move = -13 -printer_model = MK3MM2 -default_print_profile = 0.15mm OPTIMAL MK3 MMU2 +printer_model = MK3MMU2 +default_print_profile = 0.15mm OPTIMAL MK3 default_filament_profile = Prusa PLA MMU2 [printer:Original Prusa i3 MK3 MMU2 Single] @@ -1182,11 +1212,11 @@ inherits = *mm2* # (for example the retract values) are duplicaed from the first value, so they do not need # to be defined explicitely. nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 -extruder_colour = #FFFF00;#FFFFFF;#804040;#0000FF;#C0C0C0 +extruder_colour = #FF8000;#0080FF;#00FFFF;#FF4F4F;#9FFF9F start_gcode = M107\n\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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\nG21 ; set units to millimeters\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n end_gcode = G1 E-15.0000 F3000\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200; home X axis\nM84 ; disable motors # The obsolete presets will be removed when upgrading from the legacy configuration structure (up to Slic3r 1.39.2) to 1.40.0 and newer. [obsolete_presets] -print="0.05mm DETAIL 0.25 nozzle";"0.05mm DETAIL MK3";"0.05mm DETAIL";"0.20mm NORMAL MK3";"0.35mm FAST MK3" +print="0.05mm DETAIL 0.25 nozzle";"0.05mm DETAIL MK3";"0.05mm DETAIL";"0.20mm NORMAL MK3";"0.35mm FAST MK3";"print:0.15mm OPTIMAL MK3 MMU2";"print:0.20mm FAST MK3 MMU2" filament="ColorFabb Brass Bronze 1.75mm";"ColorFabb HT 1.75mm";"ColorFabb nGen 1.75mm";"ColorFabb Woodfil 1.75mm";"ColorFabb XT 1.75mm";"ColorFabb XT-CF20 1.75mm";"E3D PC-ABS 1.75mm";"Fillamentum ABS 1.75mm";"Fillamentum ASA 1.75mm";"Generic ABS 1.75mm";"Generic PET 1.75mm";"Generic PLA 1.75mm";"Prusa ABS 1.75mm";"Prusa HIPS 1.75mm";"Prusa PET 1.75mm";"Prusa PLA 1.75mm";"Taulman Bridge 1.75mm";"Taulman T-Glase 1.75mm"