diff --git a/lib/Slic3r/Test.pm b/lib/Slic3r/Test.pm index 8d2a79f2a..d0696aab0 100644 --- a/lib/Slic3r/Test.pm +++ b/lib/Slic3r/Test.pm @@ -139,7 +139,6 @@ sub mesh { my $mesh = Slic3r::TriangleMesh->new; $mesh->ReadFromPerl($vertices, $facets); - $mesh->repair; $mesh->scale_xyz(Slic3r::Pointf3->new(@{$params{scale_xyz}})) if $params{scale_xyz}; $mesh->translate(@{$params{translate}}) if $params{translate}; return $mesh; diff --git a/resources/data/hints.ini b/resources/data/hints.ini index e7b1bb681..a79a8228a 100644 --- a/resources/data/hints.ini +++ b/resources/data/hints.ini @@ -48,6 +48,7 @@ # enabled_tags = ... # disabled_tags = ... # supported tags are: simple; advanced; expert; FFF; MMU; SLA; Windows; Linux; OSX; +# and all filament types: PLA; PET; ABS; ASA; FLEX; HIPS; EDGE; NGEN; NYLON; PVA; PC; PP; PEI; PEEK; PEKK; POM; PSU; PVDF; SCAFF; # Tags are case sensitive. # FFF is affirmative for both one or more extruder printers. # Algorithm shows hint only if ALL enabled tags are affirmative. (so never do enabled_tags = FFF; SLA;) diff --git a/resources/icons/exclamation_manifold.svg b/resources/icons/exclamation_manifold.svg new file mode 100644 index 000000000..cd8ba5954 --- /dev/null +++ b/resources/icons/exclamation_manifold.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/notification_info.svg b/resources/icons/notification_info.svg new file mode 100644 index 000000000..e562112b6 --- /dev/null +++ b/resources/icons/notification_info.svg @@ -0,0 +1,73 @@ + +image/svg+xml + + + + diff --git a/resources/icons/white/exclamation_manifold.svg b/resources/icons/white/exclamation_manifold.svg new file mode 100644 index 000000000..a18590167 --- /dev/null +++ b/resources/icons/white/exclamation_manifold.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + diff --git a/resources/localization/PrusaSlicer.pot b/resources/localization/PrusaSlicer.pot index 58ed3370e..0cd7076f7 100644 --- a/resources/localization/PrusaSlicer.pot +++ b/resources/localization/PrusaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-02-03 21:27+0100\n" +"POT-Creation-Date: 2021-10-05 16:27+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,58 +18,58 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:299 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 msgid "Portions copyright" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:135 src/slic3r/GUI/AboutDialog.cpp:263 +#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 msgid "Copyright" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:137 +#: src/slic3r/GUI/AboutDialog.cpp:141 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:206 +#: src/slic3r/GUI/AboutDialog.cpp:210 #, possible-c-format msgid "About %s" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:238 src/slic3r/GUI/AboutDialog.cpp:361 -#: src/slic3r/GUI/GUI_App.cpp:243 src/slic3r/GUI/MainFrame.cpp:151 +#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/GUI_App.cpp:255 msgid "Version" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:265 src/slic3r/GUI/GUI_App.cpp:248 +#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:261 msgid "is licensed under the" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:266 src/slic3r/GUI/GUI_App.cpp:248 +#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:261 msgid "GNU Affero General Public License, version 3" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:271 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " "numerous others." msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:304 +#: src/slic3r/GUI/AboutDialog.cpp:308 msgid "Copy Version Info" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:78 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:79 #, possible-c-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -77,228 +77,266 @@ msgid "" "and we would be glad if you reported it." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:85 +msgid "" +"Please save your project and restart PrusaSlicer. We would be glad if you " +"reported the issue." +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:204 +msgid "Slicing complete" +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:199 +msgid "Masked SLA file exported to %1%" +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:286 +msgid "Access violation" +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:288 +msgid "Illegal instruction" +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 +msgid "Divide by zero" +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:292 +msgid "Overflow" +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:294 +msgid "Underflow" +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:297 +msgid "Floating reserved operand" +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:300 +msgid "Stack overflow" +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:659 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:726 +msgid "Running post-processing scripts" +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:690 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:710 msgid "Unknown error occured during exporting G-code." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:168 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:695 msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " "card is write locked?\n" "Error message: %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:171 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:698 msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " "problem with target device, please try exporting again or using different " "device. The corrupted output G-code is at %1%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:174 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:701 msgid "" "Renaming of the G-code after copying to the selected destination folder has " "failed. Current path is %1%.tmp. Please try exporting again." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:177 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:704 msgid "" "Copying of the temporary G-code has finished but the original code at %1% " "couldn't be opened during copy check. The output G-code is at %2%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:707 msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " "be opened during copy check. The output G-code is at %1%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:187 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:536 -msgid "Running post-processing scripts" -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:189 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:715 msgid "G-code file exported to %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:194 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:243 -msgid "Slicing complete" -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:238 -msgid "Masked SLA file exported to %1%" -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:539 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:729 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:562 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:751 msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:93 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 src/slic3r/GUI/Plater.cpp:162 -#: src/slic3r/GUI/Tab.cpp:2550 +#: src/slic3r/GUI/BedShapeDialog.cpp:92 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:219 src/slic3r/GUI/Plater.cpp:171 +#: src/slic3r/GUI/Tab.cpp:2686 msgid "Size" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:94 +#: src/slic3r/GUI/BedShapeDialog.cpp:93 msgid "Origin" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:796 +#: src/slic3r/GUI/BedShapeDialog.cpp:94 src/libslic3r/PrintConfig.cpp:981 msgid "Diameter" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:110 +#: src/slic3r/GUI/BedShapeDialog.cpp:109 msgid "Size in X and Y of the rectangular plate." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:121 +#: src/slic3r/GUI/BedShapeDialog.cpp:120 msgid "" "Distance of the 0,0 G-code coordinate from the front left corner of the " "rectangle." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:242 -#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/ConfigWizard.cpp:1380 -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:88 -#: src/slic3r/GUI/GCodeViewer.cpp:3647 src/slic3r/GUI/GCodeViewer.cpp:3653 -#: src/slic3r/GUI/GCodeViewer.cpp:3661 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 +#: src/slic3r/GUI/BedShapeDialog.cpp:128 src/slic3r/GUI/ConfigWizard.cpp:258 +#: src/slic3r/GUI/ConfigWizard.cpp:1466 src/slic3r/GUI/ConfigWizard.cpp:1480 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:100 +#: src/slic3r/GUI/GCodeViewer.cpp:3448 src/slic3r/GUI/GCodeViewer.cpp:3454 +#: src/slic3r/GUI/GCodeViewer.cpp:3462 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:322 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:467 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:468 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:96 -#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:77 -#: src/libslic3r/PrintConfig.cpp:84 src/libslic3r/PrintConfig.cpp:95 -#: src/libslic3r/PrintConfig.cpp:135 src/libslic3r/PrintConfig.cpp:244 -#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:328 -#: src/libslic3r/PrintConfig.cpp:402 src/libslic3r/PrintConfig.cpp:410 -#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:590 -#: src/libslic3r/PrintConfig.cpp:601 src/libslic3r/PrintConfig.cpp:619 -#: src/libslic3r/PrintConfig.cpp:799 src/libslic3r/PrintConfig.cpp:1085 -#: src/libslic3r/PrintConfig.cpp:1094 src/libslic3r/PrintConfig.cpp:1347 -#: src/libslic3r/PrintConfig.cpp:1528 src/libslic3r/PrintConfig.cpp:1589 -#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1625 -#: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1693 -#: src/libslic3r/PrintConfig.cpp:1818 src/libslic3r/PrintConfig.cpp:1826 -#: src/libslic3r/PrintConfig.cpp:1867 src/libslic3r/PrintConfig.cpp:1875 -#: src/libslic3r/PrintConfig.cpp:1885 src/libslic3r/PrintConfig.cpp:1893 -#: src/libslic3r/PrintConfig.cpp:1901 src/libslic3r/PrintConfig.cpp:1964 -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2301 -#: src/libslic3r/PrintConfig.cpp:2335 src/libslic3r/PrintConfig.cpp:2464 -#: src/libslic3r/PrintConfig.cpp:2543 src/libslic3r/PrintConfig.cpp:2550 -#: src/libslic3r/PrintConfig.cpp:2557 src/libslic3r/PrintConfig.cpp:2587 -#: src/libslic3r/PrintConfig.cpp:2597 src/libslic3r/PrintConfig.cpp:2607 -#: src/libslic3r/PrintConfig.cpp:2767 src/libslic3r/PrintConfig.cpp:2801 -#: src/libslic3r/PrintConfig.cpp:2940 src/libslic3r/PrintConfig.cpp:2949 -#: src/libslic3r/PrintConfig.cpp:2958 src/libslic3r/PrintConfig.cpp:2968 -#: src/libslic3r/PrintConfig.cpp:3033 src/libslic3r/PrintConfig.cpp:3043 -#: src/libslic3r/PrintConfig.cpp:3055 src/libslic3r/PrintConfig.cpp:3075 -#: src/libslic3r/PrintConfig.cpp:3085 src/libslic3r/PrintConfig.cpp:3095 -#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3128 -#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3153 -#: src/libslic3r/PrintConfig.cpp:3166 src/libslic3r/PrintConfig.cpp:3211 -#: src/libslic3r/PrintConfig.cpp:3221 src/libslic3r/PrintConfig.cpp:3230 -#: src/libslic3r/PrintConfig.cpp:3240 src/libslic3r/PrintConfig.cpp:3256 -#: src/libslic3r/PrintConfig.cpp:3280 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:321 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:410 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:479 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 src/libslic3r/PrintConfig.cpp:240 +#: src/libslic3r/PrintConfig.cpp:257 src/libslic3r/PrintConfig.cpp:264 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:486 +#: src/libslic3r/PrintConfig.cpp:512 src/libslic3r/PrintConfig.cpp:587 +#: src/libslic3r/PrintConfig.cpp:595 src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:775 src/libslic3r/PrintConfig.cpp:786 +#: src/libslic3r/PrintConfig.cpp:804 src/libslic3r/PrintConfig.cpp:984 +#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1256 +#: src/libslic3r/PrintConfig.cpp:1265 src/libslic3r/PrintConfig.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:1730 src/libslic3r/PrintConfig.cpp:1791 +#: src/libslic3r/PrintConfig.cpp:1809 src/libslic3r/PrintConfig.cpp:1827 +#: src/libslic3r/PrintConfig.cpp:1888 src/libslic3r/PrintConfig.cpp:1898 +#: src/libslic3r/PrintConfig.cpp:2011 src/libslic3r/PrintConfig.cpp:2020 +#: src/libslic3r/PrintConfig.cpp:2039 src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2068 src/libslic3r/PrintConfig.cpp:2109 +#: src/libslic3r/PrintConfig.cpp:2117 src/libslic3r/PrintConfig.cpp:2127 +#: src/libslic3r/PrintConfig.cpp:2135 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2205 src/libslic3r/PrintConfig.cpp:2434 +#: src/libslic3r/PrintConfig.cpp:2503 src/libslic3r/PrintConfig.cpp:2520 +#: src/libslic3r/PrintConfig.cpp:2618 src/libslic3r/PrintConfig.cpp:2627 +#: src/libslic3r/PrintConfig.cpp:2677 src/libslic3r/PrintConfig.cpp:2827 +#: src/libslic3r/PrintConfig.cpp:2915 src/libslic3r/PrintConfig.cpp:2922 +#: src/libslic3r/PrintConfig.cpp:2929 src/libslic3r/PrintConfig.cpp:2943 +#: src/libslic3r/PrintConfig.cpp:2967 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2987 src/libslic3r/PrintConfig.cpp:3147 +#: src/libslic3r/PrintConfig.cpp:3181 src/libslic3r/PrintConfig.cpp:3320 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3413 +#: src/libslic3r/PrintConfig.cpp:3423 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3465 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3493 +#: src/libslic3r/PrintConfig.cpp:3508 src/libslic3r/PrintConfig.cpp:3522 +#: src/libslic3r/PrintConfig.cpp:3533 src/libslic3r/PrintConfig.cpp:3546 +#: src/libslic3r/PrintConfig.cpp:3591 src/libslic3r/PrintConfig.cpp:3601 +#: src/libslic3r/PrintConfig.cpp:3610 src/libslic3r/PrintConfig.cpp:3620 +#: src/libslic3r/PrintConfig.cpp:3636 src/libslic3r/PrintConfig.cpp:3660 msgid "mm" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:131 +#: src/slic3r/GUI/BedShapeDialog.cpp:130 msgid "" "Diameter of the print bed. It is assumed that origin (0,0) is located in the " "center." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:141 +#: src/slic3r/GUI/BedShapeDialog.cpp:140 msgid "Rectangular" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:142 +#: src/slic3r/GUI/BedShapeDialog.cpp:141 msgid "Circular" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:240 -#: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:358 +#: src/slic3r/GUI/BedShapeDialog.cpp:142 src/slic3r/GUI/GUI_Preview.cpp:251 +#: src/libslic3r/ExtrusionEntity.cpp:325 src/libslic3r/ExtrusionEntity.cpp:360 msgid "Custom" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:145 +#: src/slic3r/GUI/BedShapeDialog.cpp:144 msgid "Invalid" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2306 +#: src/slic3r/GUI/BedShapeDialog.cpp:155 src/slic3r/GUI/BedShapeDialog.cpp:225 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1682 msgid "Shape" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:243 +#: src/slic3r/GUI/BedShapeDialog.cpp:249 msgid "Load shape from STL..." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1826 +#: src/slic3r/GUI/BedShapeDialog.cpp:298 src/slic3r/GUI/GCodeViewer.cpp:3981 +#: src/slic3r/GUI/MainFrame.cpp:2146 msgid "Settings" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:315 +#: src/slic3r/GUI/BedShapeDialog.cpp:322 msgid "Texture" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405 +#: src/slic3r/GUI/BedShapeDialog.cpp:332 src/slic3r/GUI/BedShapeDialog.cpp:414 msgid "Load..." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413 -#: src/slic3r/GUI/Tab.cpp:3502 +#: src/slic3r/GUI/BedShapeDialog.cpp:341 src/slic3r/GUI/BedShapeDialog.cpp:422 +#: src/slic3r/GUI/Tab.cpp:3660 msgid "Remove" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446 +#: src/slic3r/GUI/BedShapeDialog.cpp:374 src/slic3r/GUI/BedShapeDialog.cpp:455 msgid "Not found:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:395 +#: src/slic3r/GUI/BedShapeDialog.cpp:404 msgid "Model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:563 +#: src/slic3r/GUI/BedShapeDialog.cpp:572 msgid "Choose an STL file to import bed shape from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:570 src/slic3r/GUI/BedShapeDialog.cpp:619 -#: src/slic3r/GUI/BedShapeDialog.cpp:642 +#: src/slic3r/GUI/BedShapeDialog.cpp:579 src/slic3r/GUI/BedShapeDialog.cpp:628 +#: src/slic3r/GUI/BedShapeDialog.cpp:651 msgid "Invalid file format." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:581 +#: src/slic3r/GUI/BedShapeDialog.cpp:590 msgid "Error! Invalid model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:589 +#: src/slic3r/GUI/BedShapeDialog.cpp:598 msgid "The selected file contains no geometry." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:593 +#: src/slic3r/GUI/BedShapeDialog.cpp:602 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:608 +#: src/slic3r/GUI/BedShapeDialog.cpp:617 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:631 +#: src/slic3r/GUI/BedShapeDialog.cpp:640 msgid "Choose an STL file to import bed model from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1325 +#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1386 msgid "Bed Shape" msgstr "" @@ -330,45 +368,49 @@ msgstr "" msgid "Finished" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:16 -msgid "Buttons And Text Colors Description" +#: src/slic3r/GUI/ButtonsDescription.cpp:36 +msgid "Revert color to default" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:36 src/slic3r/GUI/Preferences.cpp:517 +#: src/slic3r/GUI/ButtonsDescription.cpp:51 msgid "Value is the same as the system value" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:53 src/slic3r/GUI/Preferences.cpp:528 +#: src/slic3r/GUI/ButtonsDescription.cpp:52 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:48 +#: src/slic3r/GUI/ButtonsDescription.cpp:56 +msgid "Buttons And Text Colors Description" +msgstr "" + +#: src/slic3r/GUI/ConfigManipulation.cpp:49 msgid "" -"Zero layer height is not valid.\n" +"Layer height is not valid.\n" "\n" "The layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1387 -#: src/libslic3r/PrintConfig.cpp:73 +#: src/slic3r/GUI/ConfigManipulation.cpp:51 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1436 +#: src/libslic3r/PrintConfig.cpp:253 msgid "Layer height" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:60 +#: src/slic3r/GUI/ConfigManipulation.cpp:62 msgid "" -"Zero first layer height is not valid.\n" +"First layer height is not valid.\n" "\n" "The first layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:994 +#: src/slic3r/GUI/ConfigManipulation.cpp:64 src/libslic3r/PrintConfig.cpp:1188 msgid "First layer height" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:81 +#: src/slic3r/GUI/ConfigManipulation.cpp:84 #, possible-c-format msgid "" "The Spiral Vase mode requires:\n" @@ -380,15 +422,15 @@ msgid "" "- Detect thin walls disabled" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:89 +#: src/slic3r/GUI/ConfigManipulation.cpp:92 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:94 msgid "Spiral Vase" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:115 +#: src/slic3r/GUI/ConfigManipulation.cpp:124 msgid "" "The Wipe Tower currently supports the non-soluble supports only\n" "if they are printed with the current extruder without triggering a tool " @@ -397,74 +439,73 @@ msgid "" "to be set to 0)." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:119 +#: src/slic3r/GUI/ConfigManipulation.cpp:128 msgid "Shall I adjust those settings in order to enable the Wipe Tower?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:120 -#: src/slic3r/GUI/ConfigManipulation.cpp:140 +#: src/slic3r/GUI/ConfigManipulation.cpp:130 +#: src/slic3r/GUI/ConfigManipulation.cpp:151 msgid "Wipe Tower" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:136 +#: src/slic3r/GUI/ConfigManipulation.cpp:146 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers\n" "need to be synchronized with the object layers." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:139 +#: src/slic3r/GUI/ConfigManipulation.cpp:149 msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:159 +#: src/slic3r/GUI/ConfigManipulation.cpp:170 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:162 +#: src/slic3r/GUI/ConfigManipulation.cpp:173 msgid "Shall I adjust those settings for supports?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:163 +#: src/slic3r/GUI/ConfigManipulation.cpp:174 msgid "Support Generator" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:198 +#: src/slic3r/GUI/ConfigManipulation.cpp:201 msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:201 +#: src/slic3r/GUI/ConfigManipulation.cpp:204 msgid "Shall I switch to rectilinear fill pattern?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:202 -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93 -#: src/slic3r/GUI/GUI_ObjectList.cpp:682 src/slic3r/GUI/Plater.cpp:389 -#: src/slic3r/GUI/Tab.cpp:1444 src/slic3r/GUI/Tab.cpp:1446 -#: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:497 -#: src/libslic3r/PrintConfig.cpp:521 src/libslic3r/PrintConfig.cpp:873 -#: src/libslic3r/PrintConfig.cpp:887 src/libslic3r/PrintConfig.cpp:924 -#: src/libslic3r/PrintConfig.cpp:1165 src/libslic3r/PrintConfig.cpp:1175 -#: src/libslic3r/PrintConfig.cpp:1242 src/libslic3r/PrintConfig.cpp:1261 -#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:2017 -#: src/libslic3r/PrintConfig.cpp:2034 +#: src/slic3r/GUI/ConfigManipulation.cpp:206 +#: src/slic3r/GUI/GUI_Factories.cpp:55 src/slic3r/GUI/GUI_Factories.cpp:128 +#: src/slic3r/GUI/Plater.cpp:416 src/slic3r/GUI/Tab.cpp:1490 +#: src/slic3r/GUI/Tab.cpp:1492 src/libslic3r/PrintConfig.cpp:441 +#: src/libslic3r/PrintConfig.cpp:682 src/libslic3r/PrintConfig.cpp:706 +#: src/libslic3r/PrintConfig.cpp:1058 src/libslic3r/PrintConfig.cpp:1072 +#: src/libslic3r/PrintConfig.cpp:1109 src/libslic3r/PrintConfig.cpp:1345 +#: src/libslic3r/PrintConfig.cpp:1355 src/libslic3r/PrintConfig.cpp:1422 +#: src/libslic3r/PrintConfig.cpp:1441 src/libslic3r/PrintConfig.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:2266 src/libslic3r/PrintConfig.cpp:2283 msgid "Infill" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:322 +#: src/slic3r/GUI/ConfigManipulation.cpp:334 msgid "Head penetration should not be greater than the head width." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:324 +#: src/slic3r/GUI/ConfigManipulation.cpp:337 msgid "Invalid Head penetration" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:335 +#: src/slic3r/GUI/ConfigManipulation.cpp:348 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:337 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "" @@ -480,200 +521,221 @@ msgstr "" msgid "Before roll back" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:143 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:307 msgid "User" msgstr "" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:226 src/libslic3r/ExtrusionEntity.cpp:309 +#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:311 msgid "Unknown" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:44 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 msgid "Active" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 msgid "PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 src/libslic3r/Preset.cpp:1303 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1313 msgid "print" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:56 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 msgid "filaments" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1305 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 src/libslic3r/Preset.cpp:1315 msgid "SLA print" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 src/slic3r/GUI/Plater.cpp:693 -#: src/libslic3r/Preset.cpp:1306 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 +#: src/slic3r/GUI/ConfigWizard.cpp:749 src/slic3r/GUI/ConfigWizard.cpp:769 +#: src/slic3r/GUI/ConfigWizard.cpp:2673 src/slic3r/GUI/GUI.cpp:340 +#: src/slic3r/GUI/Plater.cpp:742 src/libslic3r/Preset.cpp:1316 msgid "SLA material" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:62 src/libslic3r/Preset.cpp:1307 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 src/libslic3r/Preset.cpp:1317 msgid "printer" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66 src/slic3r/GUI/Tab.cpp:1304 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 src/slic3r/GUI/Tab.cpp:1353 msgid "vendor" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 msgid "version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:76 msgid "min PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 msgid "max PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 msgid "model" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 msgid "variants" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:84 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:93 #, possible-c-format msgid "Incompatible with this %s" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:87 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 msgid "Activate" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:113 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:123 msgid "Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:242 +#: src/slic3r/GUI/ConfigWizard.cpp:258 msgid "nozzle" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:246 +#: src/slic3r/GUI/ConfigWizard.cpp:262 msgid "Alternate nozzles:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:310 +#: src/slic3r/GUI/ConfigWizard.cpp:326 msgid "All standard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:310 +#: src/slic3r/GUI/ConfigWizard.cpp:326 msgid "Standard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:311 src/slic3r/GUI/ConfigWizard.cpp:605 -#: src/slic3r/GUI/Tab.cpp:3583 src/slic3r/GUI/UnsavedChangesDialog.cpp:933 +#: src/slic3r/GUI/ConfigWizard.cpp:327 src/slic3r/GUI/ConfigWizard.cpp:645 +#: src/slic3r/GUI/Tab.cpp:3742 src/slic3r/GUI/UnsavedChangesDialog.cpp:1157 msgid "All" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:312 src/slic3r/GUI/ConfigWizard.cpp:606 -#: src/slic3r/GUI/DoubleSlider.cpp:1879 src/slic3r/GUI/Plater.cpp:361 -#: src/slic3r/GUI/Plater.cpp:504 src/libslic3r/PrintConfig.cpp:1045 +#: src/slic3r/GUI/ConfigWizard.cpp:328 src/slic3r/GUI/ConfigWizard.cpp:646 +#: src/slic3r/GUI/DoubleSlider.cpp:2010 src/slic3r/GUI/Plater.cpp:388 +#: src/slic3r/GUI/Plater.cpp:533 src/libslic3r/PrintConfig.cpp:1246 msgid "None" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:452 +#: src/slic3r/GUI/ConfigWizard.cpp:480 #, possible-c-format msgid "Welcome to the %s Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:454 +#: src/slic3r/GUI/ConfigWizard.cpp:482 #, possible-c-format msgid "Welcome to the %s Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:456 +#: src/slic3r/GUI/ConfigWizard.cpp:484 msgid "Welcome" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:458 +#: src/slic3r/GUI/ConfigWizard.cpp:486 #, possible-c-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " "a few settings and you will be ready to print." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:463 +#: src/slic3r/GUI/ConfigWizard.cpp:491 msgid "Remove user profiles (a snapshot will be taken beforehand)" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:506 +#: src/slic3r/GUI/ConfigWizard.cpp:494 +msgid "" +"Perform desktop integration (Sets this binary to be searchable by the " +"system)." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:546 #, possible-c-format msgid "%s Family" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:594 +#: src/slic3r/GUI/ConfigWizard.cpp:634 msgid "Printer:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:596 +#: src/slic3r/GUI/ConfigWizard.cpp:636 msgid "Vendor:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:597 +#: src/slic3r/GUI/ConfigWizard.cpp:637 msgid "Profile:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:669 src/slic3r/GUI/ConfigWizard.cpp:819 -#: src/slic3r/GUI/ConfigWizard.cpp:880 src/slic3r/GUI/ConfigWizard.cpp:1017 +#: src/slic3r/GUI/ConfigWizard.cpp:714 src/slic3r/GUI/ConfigWizard.cpp:882 +#: src/slic3r/GUI/ConfigWizard.cpp:942 src/slic3r/GUI/ConfigWizard.cpp:1078 msgid "(All)" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:698 +#: src/slic3r/GUI/ConfigWizard.cpp:746 msgid "" -"Filaments marked with * are not compatible with some installed " +"%1% marked with * are not compatible with some installed " "printers." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:701 -msgid "All installed printers are compatible with the selected filament." +#: src/slic3r/GUI/ConfigWizard.cpp:746 src/slic3r/GUI/ConfigWizard.cpp:2028 +#: src/slic3r/GUI/ConfigWizard.cpp:2681 src/slic3r/GUI/ConfigWizard.cpp:2853 +msgid "Filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:721 +#: src/slic3r/GUI/ConfigWizard.cpp:746 src/slic3r/GUI/ConfigWizard.cpp:2681 +msgid "SLA materials" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:749 +msgid "All installed printers are compatible with the selected %1%." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:749 src/slic3r/GUI/ConfigWizard.cpp:769 +#: src/libslic3r/Preset.cpp:1314 +msgid "filament" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:769 msgid "" -"Only the following installed printers are compatible with the selected " -"filament:" +"Only the following installed printers are compatible with the selected %1%:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1105 +#: src/slic3r/GUI/ConfigWizard.cpp:1165 msgid "Custom Printer Setup" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1105 +#: src/slic3r/GUI/ConfigWizard.cpp:1165 msgid "Custom Printer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1107 +#: src/slic3r/GUI/ConfigWizard.cpp:1167 msgid "Define a custom printer profile" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1109 +#: src/slic3r/GUI/ConfigWizard.cpp:1169 msgid "Custom profile name:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1134 +#: src/slic3r/GUI/ConfigWizard.cpp:1196 msgid "Automatic updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1134 +#: src/slic3r/GUI/ConfigWizard.cpp:1196 msgid "Updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1142 src/slic3r/GUI/Preferences.cpp:94 +#: src/slic3r/GUI/ConfigWizard.cpp:1204 src/slic3r/GUI/Preferences.cpp:112 msgid "Check for application updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1146 +#: src/slic3r/GUI/ConfigWizard.cpp:1208 #, possible-c-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -682,11 +744,11 @@ msgid "" "notification mechanisms, no automatic installation is done." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1152 src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/ConfigWizard.cpp:1214 src/slic3r/GUI/Preferences.cpp:145 msgid "Update built-in Presets automatically" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1156 +#: src/slic3r/GUI/ConfigWizard.cpp:1218 #, possible-c-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -695,30 +757,29 @@ msgid "" "startup." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1159 +#: src/slic3r/GUI/ConfigWizard.cpp:1221 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1164 +#: src/slic3r/GUI/ConfigWizard.cpp:1226 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1171 src/slic3r/GUI/GUI_ObjectList.cpp:1843 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4601 src/slic3r/GUI/Plater.cpp:3130 -#: src/slic3r/GUI/Plater.cpp:4022 src/slic3r/GUI/Plater.cpp:4053 +#: src/slic3r/GUI/ConfigWizard.cpp:1233 src/slic3r/GUI/GUI_Factories.cpp:720 +#: src/slic3r/GUI/Plater.cpp:3422 msgid "Reload from disk" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1174 +#: src/slic3r/GUI/ConfigWizard.cpp:1236 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1178 +#: src/slic3r/GUI/ConfigWizard.cpp:1240 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -726,23 +787,23 @@ msgid "" "using an open file dialog." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1188 +#: src/slic3r/GUI/ConfigWizard.cpp:1249 msgid "Files association" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1190 src/slic3r/GUI/Preferences.cpp:112 +#: src/slic3r/GUI/ConfigWizard.cpp:1251 src/slic3r/GUI/Preferences.cpp:129 msgid "Associate .3mf files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1191 src/slic3r/GUI/Preferences.cpp:119 +#: src/slic3r/GUI/ConfigWizard.cpp:1252 src/slic3r/GUI/Preferences.cpp:136 msgid "Associate .stl files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1202 +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "View mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1204 +#: src/slic3r/GUI/ConfigWizard.cpp:1264 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -751,241 +812,338 @@ msgid "" "fine-tuning, they are suitable for advanced and expert users, respectively." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1209 +#: src/slic3r/GUI/ConfigWizard.cpp:1269 msgid "Simple mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1210 +#: src/slic3r/GUI/ConfigWizard.cpp:1270 msgid "Advanced mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1211 +#: src/slic3r/GUI/ConfigWizard.cpp:1271 msgid "Expert mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1217 +#: src/slic3r/GUI/ConfigWizard.cpp:1277 msgid "The size of the object can be specified in inches" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1218 +#: src/slic3r/GUI/ConfigWizard.cpp:1278 msgid "Use inches" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1252 +#: src/slic3r/GUI/ConfigWizard.cpp:1312 msgid "Other Vendors" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1256 +#: src/slic3r/GUI/ConfigWizard.cpp:1316 #, possible-c-format msgid "Pick another vendor supported by %s" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 +#: src/slic3r/GUI/ConfigWizard.cpp:1347 msgid "Firmware Type" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 src/slic3r/GUI/Tab.cpp:2186 +#: src/slic3r/GUI/ConfigWizard.cpp:1347 src/slic3r/GUI/Tab.cpp:2290 msgid "Firmware" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1291 +#: src/slic3r/GUI/ConfigWizard.cpp:1351 msgid "Choose the type of firmware used by your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1325 +#: src/slic3r/GUI/ConfigWizard.cpp:1386 msgid "Bed Shape and Size" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1328 +#: src/slic3r/GUI/ConfigWizard.cpp:1389 msgid "Set the shape of your printer's bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1348 +#: src/slic3r/GUI/ConfigWizard.cpp:1423 src/slic3r/GUI/Field.cpp:255 +#: src/slic3r/GUI/Field.cpp:314 src/slic3r/GUI/Field.cpp:1554 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:429 +msgid "Invalid numeric input." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1447 msgid "Filament and Nozzle Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1348 +#: src/slic3r/GUI/ConfigWizard.cpp:1447 msgid "Print Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1362 +#: src/slic3r/GUI/ConfigWizard.cpp:1462 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1365 +#: src/slic3r/GUI/ConfigWizard.cpp:1465 msgid "Nozzle Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1375 +#: src/slic3r/GUI/ConfigWizard.cpp:1475 msgid "Enter the diameter of your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1376 +#: src/slic3r/GUI/ConfigWizard.cpp:1476 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1379 +#: src/slic3r/GUI/ConfigWizard.cpp:1479 msgid "Filament Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1413 +#: src/slic3r/GUI/ConfigWizard.cpp:1537 msgid "Nozzle and Bed Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1413 +#: src/slic3r/GUI/ConfigWizard.cpp:1537 msgid "Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1429 +#: src/slic3r/GUI/ConfigWizard.cpp:1553 msgid "Enter the temperature needed for extruding your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1430 +#: src/slic3r/GUI/ConfigWizard.cpp:1554 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1433 +#: src/slic3r/GUI/ConfigWizard.cpp:1557 msgid "Extrusion Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1434 src/slic3r/GUI/ConfigWizard.cpp:1448 -#: src/libslic3r/PrintConfig.cpp:202 src/libslic3r/PrintConfig.cpp:975 -#: src/libslic3r/PrintConfig.cpp:1019 src/libslic3r/PrintConfig.cpp:2383 +#: src/slic3r/GUI/ConfigWizard.cpp:1558 src/slic3r/GUI/ConfigWizard.cpp:1572 +#: src/libslic3r/PrintConfig.cpp:384 src/libslic3r/PrintConfig.cpp:1169 +#: src/libslic3r/PrintConfig.cpp:1221 src/libslic3r/PrintConfig.cpp:2739 msgid "°C" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1443 +#: src/slic3r/GUI/ConfigWizard.cpp:1567 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1444 +#: src/slic3r/GUI/ConfigWizard.cpp:1568 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1447 +#: src/slic3r/GUI/ConfigWizard.cpp:1571 msgid "Bed Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1907 src/slic3r/GUI/ConfigWizard.cpp:2580 -msgid "Filaments" -msgstr "" - -#: src/slic3r/GUI/ConfigWizard.cpp:1907 src/slic3r/GUI/ConfigWizard.cpp:2582 +#: src/slic3r/GUI/ConfigWizard.cpp:2028 src/slic3r/GUI/ConfigWizard.cpp:2855 msgid "SLA Materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1961 +#: src/slic3r/GUI/ConfigWizard.cpp:2082 msgid "FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1966 +#: src/slic3r/GUI/ConfigWizard.cpp:2087 msgid "SLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2272 src/slic3r/GUI/DoubleSlider.cpp:2265 -#: src/slic3r/GUI/DoubleSlider.cpp:2285 src/slic3r/GUI/GUI.cpp:250 +#: src/slic3r/GUI/ConfigWizard.cpp:2395 src/slic3r/GUI/DoubleSlider.cpp:2487 +#: src/slic3r/GUI/DoubleSlider.cpp:2508 src/slic3r/GUI/GUI.cpp:232 msgid "Notice" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2293 +#: src/slic3r/GUI/ConfigWizard.cpp:2416 msgid "The following FFF printer models have no filament selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2297 +#: src/slic3r/GUI/ConfigWizard.cpp:2420 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2311 +#: src/slic3r/GUI/ConfigWizard.cpp:2434 msgid "The following SLA printer models have no materials selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2315 +#: src/slic3r/GUI/ConfigWizard.cpp:2438 msgid "Do you want to select default SLA materials for these printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2543 +#: src/slic3r/GUI/ConfigWizard.cpp:2480 src/slic3r/GUI/GUI_App.cpp:2471 +msgid "Configuration is editing from ConfigWizard" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2523 +msgid "All user presets will be deleted." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2553 +msgid "New vendor was installed and one of its printer will be activated" +msgid_plural "" +"New vendors were installed and one of theirs printer will be activated" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2582 +msgid "Continue with applying configuration changes?" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2648 +msgid "A new Printer was installed and it will be activated." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2653 +msgid "Some Printers were uninstalled." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2673 +msgid "A new %1% was installed and it will be activated." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2673 src/slic3r/GUI/GCodeViewer.cpp:3972 +#: src/slic3r/GUI/GCodeViewer.cpp:3998 src/slic3r/GUI/GUI.cpp:339 +#: src/slic3r/GUI/Plater.cpp:740 src/slic3r/GUI/Tab.cpp:1894 +#: src/slic3r/GUI/Tab.cpp:1895 +msgid "Filament" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2681 +msgid "Some %1% were uninstalled." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2725 +msgid "Custom printer was installed and it will be activated." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2810 msgid "Select all standard printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2546 +#: src/slic3r/GUI/ConfigWizard.cpp:2813 msgid "< &Back" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2547 +#: src/slic3r/GUI/ConfigWizard.cpp:2814 msgid "&Next >" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2548 +#: src/slic3r/GUI/ConfigWizard.cpp:2815 msgid "&Finish" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2549 src/slic3r/GUI/FirmwareDialog.cpp:151 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:248 +#: src/slic3r/GUI/ConfigWizard.cpp:2816 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:490 +#: src/slic3r/GUI/FirmwareDialog.cpp:153 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:215 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:243 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:656 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:82 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:878 msgid "Cancel" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2562 +#: src/slic3r/GUI/ConfigWizard.cpp:2835 msgid "Prusa FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2565 +#: src/slic3r/GUI/ConfigWizard.cpp:2838 msgid "Prusa MSLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2580 +#: src/slic3r/GUI/ConfigWizard.cpp:2853 msgid "Filament Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2580 src/slic3r/GUI/ConfigWizard.cpp:2582 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4178 +#: src/slic3r/GUI/ConfigWizard.cpp:2853 src/slic3r/GUI/ConfigWizard.cpp:2855 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3771 msgid "Type:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2582 +#: src/slic3r/GUI/ConfigWizard.cpp:2855 msgid "SLA Material Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2699 +#: src/slic3r/GUI/ConfigWizard.cpp:2976 msgid "Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2700 +#: src/slic3r/GUI/ConfigWizard.cpp:2977 msgid "Configuration &Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2702 +#: src/slic3r/GUI/ConfigWizard.cpp:2979 msgid "Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2703 +#: src/slic3r/GUI/ConfigWizard.cpp:2980 msgid "Configuration &Wizard" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:97 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:232 +msgid "" +"Performing desktop integration failed - boost::filesystem::canonical did not " +"return appimage path." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:243 +msgid "Performing desktop integration failed - Could not find executable." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:378 +msgid "" +"Performing desktop integration failed - could not find applications " +"directory." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:419 +msgid "" +"Performing desktop integration failed - could not create Gcodeviewer desktop " +"file. PrusaSlicer desktop file was probably created successfully." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:459 +#: src/slic3r/GUI/GUI_App.cpp:1825 +msgid "Desktop Integration" +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:466 +msgid "" +"Desktop Integration sets this binary to be searchable by the system.\n" +"\n" +"Press \"Perform\" to proceed." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:480 +msgid "Perform" +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 +#: src/slic3r/GUI/GLCanvas3D.cpp:4675 src/slic3r/GUI/KBShortcutsDialog.cpp:97 +#: src/slic3r/GUI/MainFrame.cpp:1341 +msgid "Undo" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:101 msgid "Place bearings in slots and resume printing" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1244 +#: src/slic3r/GUI/DoubleSlider.cpp:1371 msgid "One layer mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1246 +#: src/slic3r/GUI/DoubleSlider.cpp:1373 msgid "Discard all custom changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1250 src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:1377 src/slic3r/GUI/DoubleSlider.cpp:2220 msgid "Jump to move" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1253 +#: src/slic3r/GUI/DoubleSlider.cpp:1380 #, possible-c-format msgid "" "Jump to height %s\n" @@ -993,48 +1151,59 @@ msgid "" "or Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1256 +#: src/slic3r/GUI/DoubleSlider.cpp:1383 #, possible-c-format msgid "" "Jump to height %s\n" "or Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1261 +#: src/slic3r/GUI/DoubleSlider.cpp:1388 msgid "Edit current color - Right click the colored slider segment" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1271 +#: src/slic3r/GUI/DoubleSlider.cpp:1390 +msgid "This is wipe tower layer" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1400 +msgid "" +"The sequential print is on.\n" +"It's impossible to apply any custom G-code for objects printing " +"sequentually.\n" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1404 msgid "Print mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1285 +#: src/slic3r/GUI/DoubleSlider.cpp:1418 msgid "Add extruder change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1287 +#: src/slic3r/GUI/DoubleSlider.cpp:1420 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1289 +#: src/slic3r/GUI/DoubleSlider.cpp:1422 msgid "Add color change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1290 +#: src/slic3r/GUI/DoubleSlider.cpp:1423 msgid "or press \"+\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1292 +#: src/slic3r/GUI/DoubleSlider.cpp:1425 msgid "Add another code - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1293 +#: src/slic3r/GUI/DoubleSlider.cpp:1426 msgid "Add another code - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1299 +#: src/slic3r/GUI/DoubleSlider.cpp:1432 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1042,326 +1211,351 @@ msgid "" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1308 +#: src/slic3r/GUI/DoubleSlider.cpp:1446 msgid "Color change (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1309 +#: src/slic3r/GUI/DoubleSlider.cpp:1447 msgid "Color change (\"%1%\") for Extruder %2%" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1311 +#: src/slic3r/GUI/DoubleSlider.cpp:1449 msgid "Pause print (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1313 +#: src/slic3r/GUI/DoubleSlider.cpp:1451 msgid "Custom template (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1315 +#: src/slic3r/GUI/DoubleSlider.cpp:1453 msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1322 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 msgid "Note" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1324 +#: src/slic3r/GUI/DoubleSlider.cpp:1462 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1327 +#: src/slic3r/GUI/DoubleSlider.cpp:1465 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1330 +#: src/slic3r/GUI/DoubleSlider.cpp:1468 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1333 +#: src/slic3r/GUI/DoubleSlider.cpp:1471 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1338 +#: src/slic3r/GUI/DoubleSlider.cpp:1476 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1340 +#: src/slic3r/GUI/DoubleSlider.cpp:1478 msgid "Edit tick mark - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1341 +#: src/slic3r/GUI/DoubleSlider.cpp:1479 msgid "Edit tick mark - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1437 src/slic3r/GUI/DoubleSlider.cpp:1471 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1882 +#: src/slic3r/GUI/DoubleSlider.cpp:1582 src/slic3r/GUI/DoubleSlider.cpp:1613 +#: src/slic3r/GUI/GUI_Factories.cpp:772 #, possible-c-format msgid "Extruder %d" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1438 src/slic3r/GUI/GUI_ObjectList.cpp:1883 +#: src/slic3r/GUI/DoubleSlider.cpp:1583 src/slic3r/GUI/GUI_Factories.cpp:773 msgid "active" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1447 +#: src/slic3r/GUI/DoubleSlider.cpp:1592 msgid "Switch code to Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1447 src/slic3r/GUI/GUI_ObjectList.cpp:1850 +#: src/slic3r/GUI/DoubleSlider.cpp:1592 src/slic3r/GUI/GUI_Factories.cpp:734 msgid "Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1448 +#: src/slic3r/GUI/DoubleSlider.cpp:1593 msgid "Change extruder (N/A)" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1450 +#: src/slic3r/GUI/DoubleSlider.cpp:1595 src/slic3r/GUI/GUI_Factories.cpp:781 msgid "Use another extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1472 +#: src/slic3r/GUI/DoubleSlider.cpp:1614 msgid "used" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1480 +#: src/slic3r/GUI/DoubleSlider.cpp:1622 msgid "Switch code to Color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1481 +#: src/slic3r/GUI/DoubleSlider.cpp:1623 msgid "Add color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1817 +#: src/slic3r/GUI/DoubleSlider.cpp:1948 msgid "Add color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1828 +#: src/slic3r/GUI/DoubleSlider.cpp:1959 msgid "Add pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1832 +#: src/slic3r/GUI/DoubleSlider.cpp:1963 msgid "Add custom template" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1835 +#: src/slic3r/GUI/DoubleSlider.cpp:1966 msgid "Add custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1853 +#: src/slic3r/GUI/DoubleSlider.cpp:1984 msgid "Edit color" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1854 +#: src/slic3r/GUI/DoubleSlider.cpp:1985 msgid "Edit pause print message" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1855 +#: src/slic3r/GUI/DoubleSlider.cpp:1986 msgid "Edit custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1861 +#: src/slic3r/GUI/DoubleSlider.cpp:1992 msgid "Delete color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1862 +#: src/slic3r/GUI/DoubleSlider.cpp:1993 msgid "Delete tool change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1863 +#: src/slic3r/GUI/DoubleSlider.cpp:1994 msgid "Delete pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1864 +#: src/slic3r/GUI/DoubleSlider.cpp:1995 msgid "Delete custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1874 src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:2005 src/slic3r/GUI/DoubleSlider.cpp:2220 msgid "Jump to height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1879 +#: src/slic3r/GUI/DoubleSlider.cpp:2010 msgid "Hide ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1883 +#: src/slic3r/GUI/DoubleSlider.cpp:2014 msgid "Show object height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1883 +#: src/slic3r/GUI/DoubleSlider.cpp:2014 msgid "Show object height on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1887 +#: src/slic3r/GUI/DoubleSlider.cpp:2018 msgid "Show estimated print time" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1887 +#: src/slic3r/GUI/DoubleSlider.cpp:2018 msgid "Show estimated print time on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1891 +#: src/slic3r/GUI/DoubleSlider.cpp:2022 msgid "Ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1891 +#: src/slic3r/GUI/DoubleSlider.cpp:2022 msgid "Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1896 +#: src/slic3r/GUI/DoubleSlider.cpp:2027 msgid "Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1982 +#: src/slic3r/GUI/DoubleSlider.cpp:2031 +msgid "Set auto color changes" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:2040 +msgid "This action will cause deletion of all ticks on vertical slider." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:2041 src/slic3r/GUI/Tab.cpp:1305 +msgid "" +"This action is not revertible.\n" +"Do you want to proceed?" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1124 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:640 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:670 +#: src/slic3r/GUI/WipeTowerDialog.cpp:58 src/slic3r/GUI/WipeTowerDialog.cpp:443 +msgid "Warning" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:2181 msgid "Enter custom G-code used on current layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1983 +#: src/slic3r/GUI/DoubleSlider.cpp:2182 msgid "Custom G-code on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1998 +#: src/slic3r/GUI/DoubleSlider.cpp:2203 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1999 +#: src/slic3r/GUI/DoubleSlider.cpp:2204 msgid "Message for pause print on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2219 msgid "Enter the move you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2219 msgid "Enter the height you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2259 +#: src/slic3r/GUI/DoubleSlider.cpp:2480 msgid "The last color change data was saved for a single extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2260 src/slic3r/GUI/DoubleSlider.cpp:2275 +#: src/slic3r/GUI/DoubleSlider.cpp:2481 src/slic3r/GUI/DoubleSlider.cpp:2497 msgid "The last color change data was saved for a multi extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2262 +#: src/slic3r/GUI/DoubleSlider.cpp:2483 msgid "Your current changes will delete all saved color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2263 src/slic3r/GUI/DoubleSlider.cpp:2283 +#: src/slic3r/GUI/DoubleSlider.cpp:2484 src/slic3r/GUI/DoubleSlider.cpp:2505 msgid "Are you sure you want to continue?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2276 +#: src/slic3r/GUI/DoubleSlider.cpp:2498 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" "or CANCEL to leave it unchanged." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2279 +#: src/slic3r/GUI/DoubleSlider.cpp:2501 msgid "Do you want to delete all saved tool changes?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2281 +#: src/slic3r/GUI/DoubleSlider.cpp:2503 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2282 +#: src/slic3r/GUI/DoubleSlider.cpp:2504 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" -#: src/slic3r/GUI/ExtraRenderers.cpp:296 src/slic3r/GUI/GUI_ObjectList.cpp:526 -#: src/slic3r/GUI/GUI_ObjectList.cpp:538 src/slic3r/GUI/GUI_ObjectList.cpp:1047 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4616 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4626 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4661 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:209 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:499 src/libslic3r/PrintConfig.cpp:577 +#: src/slic3r/GUI/ExtraRenderers.cpp:320 src/slic3r/GUI/GUI_ObjectList.cpp:520 +#: src/slic3r/GUI/GUI_ObjectList.cpp:532 src/slic3r/GUI/GUI_ObjectList.cpp:968 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4294 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:250 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:352 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:376 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:607 src/libslic3r/PrintConfig.cpp:762 msgid "default" msgstr "" -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:24 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:26 msgid "Set extruder sequence" msgstr "" -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:40 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:46 msgid "Set extruder change for every" msgstr "" -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:53 -#: src/libslic3r/PrintConfig.cpp:443 src/libslic3r/PrintConfig.cpp:1178 -#: src/libslic3r/PrintConfig.cpp:1807 src/libslic3r/PrintConfig.cpp:1972 -#: src/libslic3r/PrintConfig.cpp:2039 src/libslic3r/PrintConfig.cpp:2246 -#: src/libslic3r/PrintConfig.cpp:2292 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:60 +#: src/libslic3r/PrintConfig.cpp:628 src/libslic3r/PrintConfig.cpp:1358 +#: src/libslic3r/PrintConfig.cpp:2049 src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2288 src/libslic3r/PrintConfig.cpp:2538 +#: src/libslic3r/PrintConfig.cpp:2585 src/libslic3r/PrintConfig.cpp:2604 msgid "layers" msgstr "" -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:137 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:166 +msgid "If enabled, random sequence of the selected extruders will be used." +msgstr "" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:174 +msgid "If enabled, a repetition of the next random color will be allowed." +msgstr "" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:177 msgid "Set extruder(tool) sequence" msgstr "" -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:183 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:229 msgid "Remove extruder from sequence" msgstr "" -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:193 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:239 msgid "Add extruder to sequence" msgstr "" -#: src/slic3r/GUI/Field.cpp:197 +#: src/slic3r/GUI/Field.cpp:190 msgid "default value" msgstr "" -#: src/slic3r/GUI/Field.cpp:200 +#: src/slic3r/GUI/Field.cpp:193 msgid "parameter name" msgstr "" -#: src/slic3r/GUI/Field.cpp:211 src/slic3r/GUI/OptionsGroup.cpp:780 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:886 +#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/OptionsGroup.cpp:807 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1070 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1082 msgid "N/A" msgstr "" -#: src/slic3r/GUI/Field.cpp:233 +#: src/slic3r/GUI/Field.cpp:226 #, possible-c-format msgid "%s doesn't support percentage" msgstr "" -#: src/slic3r/GUI/Field.cpp:253 src/slic3r/GUI/Field.cpp:307 -#: src/slic3r/GUI/Field.cpp:1507 src/slic3r/GUI/GUI_ObjectLayers.cpp:413 -msgid "Invalid numeric input." -msgstr "" - -#: src/slic3r/GUI/Field.cpp:264 +#: src/slic3r/GUI/Field.cpp:266 #, possible-c-format msgid "" "Input value is out of range\n" "Are you sure that %s is a correct value and that you want to continue?" msgstr "" -#: src/slic3r/GUI/Field.cpp:266 src/slic3r/GUI/Field.cpp:326 +#: src/slic3r/GUI/Field.cpp:269 src/slic3r/GUI/Field.cpp:334 msgid "Parameter validation" msgstr "" -#: src/slic3r/GUI/Field.cpp:279 src/slic3r/GUI/Field.cpp:373 -#: src/slic3r/GUI/Field.cpp:1519 +#: src/slic3r/GUI/Field.cpp:282 src/slic3r/GUI/Field.cpp:381 +#: src/slic3r/GUI/Field.cpp:1566 msgid "Input value is out of range" msgstr "" -#: src/slic3r/GUI/Field.cpp:323 +#: src/slic3r/GUI/Field.cpp:330 #, possible-c-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1369,37 +1563,37 @@ msgid "" "or NO if you are sure that %s %s is a correct value." msgstr "" -#: src/slic3r/GUI/Field.cpp:381 +#: src/slic3r/GUI/Field.cpp:388 msgid "" "Invalid input format. Expected vector of dimensions in the following format: " "\"%1%\"" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:150 +#: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flash!" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:152 +#: src/slic3r/GUI/FirmwareDialog.cpp:154 msgid "Flashing in progress. Please do not disconnect the printer!" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:199 +#: src/slic3r/GUI/FirmwareDialog.cpp:201 msgid "Flashing failed" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:282 +#: src/slic3r/GUI/FirmwareDialog.cpp:284 msgid "Flashing succeeded!" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:283 +#: src/slic3r/GUI/FirmwareDialog.cpp:285 msgid "Flashing failed. Please see the avrdude log below." msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:284 +#: src/slic3r/GUI/FirmwareDialog.cpp:286 msgid "Flashing cancelled." msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:332 +#: src/slic3r/GUI/FirmwareDialog.cpp:334 #, possible-c-format msgid "" "This firmware hex file does not match the printer model.\n" @@ -1410,13 +1604,13 @@ msgid "" "Please only continue if you are sure this is the right thing to do." msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454 +#: src/slic3r/GUI/FirmwareDialog.cpp:421 src/slic3r/GUI/FirmwareDialog.cpp:456 #, possible-c-format msgid "" "Multiple %s devices found. Please only connect one at a time for flashing." msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:436 +#: src/slic3r/GUI/FirmwareDialog.cpp:438 #, possible-c-format msgid "" "The %s device was not found.\n" @@ -1424,1065 +1618,1339 @@ msgid "" "connector ..." msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:548 +#: src/slic3r/GUI/FirmwareDialog.cpp:550 #, possible-c-format msgid "The %s device could not have been found" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:645 +#: src/slic3r/GUI/FirmwareDialog.cpp:651 #, possible-c-format msgid "Error accessing port at %s: %s" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:647 +#: src/slic3r/GUI/FirmwareDialog.cpp:653 #, possible-c-format msgid "Error: %s" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:777 +#: src/slic3r/GUI/FirmwareDialog.cpp:788 msgid "Firmware flasher" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:802 +#: src/slic3r/GUI/FirmwareDialog.cpp:813 msgid "Firmware image:" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:805 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +#: src/slic3r/GUI/FirmwareDialog.cpp:816 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:372 msgid "Browse" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:807 +#: src/slic3r/GUI/FirmwareDialog.cpp:818 msgid "Serial port:" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:809 +#: src/slic3r/GUI/FirmwareDialog.cpp:820 msgid "Autodetected" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:810 +#: src/slic3r/GUI/FirmwareDialog.cpp:821 msgid "Rescan" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:817 +#: src/slic3r/GUI/FirmwareDialog.cpp:828 msgid "Progress:" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:820 +#: src/slic3r/GUI/FirmwareDialog.cpp:831 msgid "Status:" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:821 +#: src/slic3r/GUI/FirmwareDialog.cpp:832 msgid "Ready" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:841 +#: src/slic3r/GUI/FirmwareDialog.cpp:852 msgid "Advanced: Output log" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:852 -#: src/slic3r/GUI/Mouse3DController.cpp:551 -#: src/slic3r/GUI/PrintHostDialogs.cpp:200 +#: src/slic3r/GUI/FirmwareDialog.cpp:863 +#: src/slic3r/GUI/Mouse3DController.cpp:543 +#: src/slic3r/GUI/PrintHostDialogs.cpp:244 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:111 msgid "Close" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:902 +#: src/slic3r/GUI/FirmwareDialog.cpp:916 msgid "" "Are you sure you want to cancel firmware flashing?\n" "This could leave your printer in an unusable state!" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:903 +#: src/slic3r/GUI/FirmwareDialog.cpp:917 msgid "Confirmation" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:906 +#: src/slic3r/GUI/FirmwareDialog.cpp:920 msgid "Cancelling..." msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:289 +#: src/slic3r/GUI/GalleryDialog.cpp:69 +msgid "Shapes Gallery" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:76 +msgid "Select shape from the gallery" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:98 +msgid "Add to bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:99 +msgid "Add selected shape(s) to the bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:123 +msgid "Add" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:123 +msgid "Add one or more custom shapes" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:124 src/slic3r/GUI/GLCanvas3D.cpp:4466 +#: src/slic3r/GUI/GUI_Factories.cpp:444 src/slic3r/GUI/Tab.cpp:3660 +msgid "Delete" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:124 +msgid "Delete one or more custom shape. You can't delete system shapes" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:125 +msgid "Replace PNG" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:125 +msgid "Replace PNG for custom shape. You can't raplace PNG for system shape" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:395 +msgid "Choose one or more files (STL, OBJ):" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:435 +msgid "" +"It looks like selected %1%-file has an error or is destructed.\n" +"We can't load this file" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:446 +msgid "Choose one PNG file:" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:459 +msgid "Replacing of the PNG" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:524 src/slic3r/GUI/GalleryDialog.cpp:529 +msgid "Loading of the \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:267 msgid "Tool position" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1418 src/slic3r/GUI/GCodeViewer.cpp:1918 +#: src/slic3r/GUI/GCodeViewer.cpp:1539 msgid "Generating toolpaths" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1456 src/slic3r/GUI/GCodeViewer.cpp:2302 +#: src/slic3r/GUI/GCodeViewer.cpp:1610 msgid "Generating vertex buffer" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1719 src/slic3r/GUI/GCodeViewer.cpp:2390 +#: src/slic3r/GUI/GCodeViewer.cpp:2028 msgid "Generating index buffers" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3535 +#: src/slic3r/GUI/GCodeViewer.cpp:3318 msgid "Click to hide" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3535 +#: src/slic3r/GUI/GCodeViewer.cpp:3318 msgid "Click to show" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3647 +#: src/slic3r/GUI/GCodeViewer.cpp:3448 msgid "up to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3653 +#: src/slic3r/GUI/GCodeViewer.cpp:3454 msgid "above" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3661 +#: src/slic3r/GUI/GCodeViewer.cpp:3462 msgid "from" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3661 +#: src/slic3r/GUI/GCodeViewer.cpp:3462 msgid "to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GCodeViewer.cpp:3697 -#: src/slic3r/GUI/GUI_Preview.cpp:211 src/slic3r/GUI/GUI_Preview.cpp:536 -#: src/slic3r/GUI/GUI_Preview.cpp:945 -msgid "Feature type" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GCodeViewer.cpp:3697 -#: src/slic3r/GUI/RammingChart.cpp:76 -msgid "Time" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3697 +#: src/slic3r/GUI/GCodeViewer.cpp:3512 src/slic3r/GUI/GCodeViewer.cpp:3513 +#: src/slic3r/GUI/GCodeViewer.cpp:3562 msgid "Percentage" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3700 +#: src/slic3r/GUI/GCodeViewer.cpp:3523 src/slic3r/GUI/GCodeViewer.cpp:3562 +#: src/slic3r/GUI/GUI_Preview.cpp:216 src/slic3r/GUI/GUI_Preview.cpp:958 +msgid "Feature type" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3523 src/slic3r/GUI/GCodeViewer.cpp:3562 +#: src/slic3r/GUI/RammingChart.cpp:90 +msgid "Time" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3562 src/slic3r/GUI/GCodeViewer.cpp:3573 +#: src/slic3r/GUI/GCodeViewer.cpp:3834 +msgid "Used filament" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3565 msgid "Height (mm)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3701 +#: src/slic3r/GUI/GCodeViewer.cpp:3566 msgid "Width (mm)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3702 +#: src/slic3r/GUI/GCodeViewer.cpp:3567 msgid "Speed (mm/s)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3703 +#: src/slic3r/GUI/GCodeViewer.cpp:3568 msgid "Fan Speed (%)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3704 +#: src/slic3r/GUI/GCodeViewer.cpp:3569 +msgid "Temperature (°C)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3570 msgid "Volumetric flow rate (mm³/s)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3705 src/slic3r/GUI/GUI_Preview.cpp:217 -#: src/slic3r/GUI/GUI_Preview.cpp:323 src/slic3r/GUI/GUI_Preview.cpp:474 -#: src/slic3r/GUI/GUI_Preview.cpp:535 src/slic3r/GUI/GUI_Preview.cpp:881 -#: src/slic3r/GUI/GUI_Preview.cpp:945 +#: src/slic3r/GUI/GCodeViewer.cpp:3573 src/slic3r/GUI/GUI_Preview.cpp:223 +#: src/slic3r/GUI/GUI_Preview.cpp:958 msgid "Tool" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3706 src/slic3r/GUI/GUI_Preview.cpp:218 -#: src/slic3r/GUI/GUI_Preview.cpp:533 src/slic3r/GUI/GUI_Preview.cpp:944 +#: src/slic3r/GUI/GCodeViewer.cpp:3576 src/slic3r/GUI/GUI_Preview.cpp:224 +#: src/slic3r/GUI/GUI_Preview.cpp:957 msgid "Color Print" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3742 src/slic3r/GUI/GCodeViewer.cpp:3777 -#: src/slic3r/GUI/GCodeViewer.cpp:3782 src/slic3r/GUI/GUI_ObjectList.cpp:326 -#: src/slic3r/GUI/wxExtensions.cpp:519 src/libslic3r/PrintConfig.cpp:572 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/GCodeViewer.cpp:3660 +#: src/slic3r/GUI/GCodeViewer.cpp:3665 src/slic3r/GUI/GUI_ObjectList.cpp:312 +#: src/slic3r/GUI/wxExtensions.cpp:535 src/libslic3r/PrintConfig.cpp:757 msgid "Extruder" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3753 +#: src/slic3r/GUI/GCodeViewer.cpp:3637 msgid "Default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3777 +#: src/slic3r/GUI/GCodeViewer.cpp:3660 msgid "default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3872 src/slic3r/GUI/GCodeViewer.cpp:3918 +#: src/slic3r/GUI/GCodeViewer.cpp:3759 src/slic3r/GUI/GCodeViewer.cpp:3815 msgid "Color change" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3891 src/slic3r/GUI/GCodeViewer.cpp:3916 +#: src/slic3r/GUI/GCodeViewer.cpp:3778 src/slic3r/GUI/GCodeViewer.cpp:3813 msgid "Print" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3917 src/slic3r/GUI/GCodeViewer.cpp:3934 +#: src/slic3r/GUI/GCodeViewer.cpp:3814 src/slic3r/GUI/GCodeViewer.cpp:3848 msgid "Pause" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3922 src/slic3r/GUI/GCodeViewer.cpp:3925 +#: src/slic3r/GUI/GCodeViewer.cpp:3831 src/slic3r/GUI/GCodeViewer.cpp:3834 msgid "Event" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3922 src/slic3r/GUI/GCodeViewer.cpp:3925 +#: src/slic3r/GUI/GCodeViewer.cpp:3831 src/slic3r/GUI/GCodeViewer.cpp:3834 msgid "Remaining time" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3925 +#: src/slic3r/GUI/GCodeViewer.cpp:3831 src/slic3r/GUI/GCodeViewer.cpp:3834 msgid "Duration" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3960 src/slic3r/GUI/GUI_Preview.cpp:1026 -#: src/libslic3r/PrintConfig.cpp:2469 +#: src/slic3r/GUI/GCodeViewer.cpp:3877 src/slic3r/GUI/GUI_Preview.cpp:1049 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "Travel" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3963 +#: src/slic3r/GUI/GCodeViewer.cpp:3880 msgid "Movement" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3964 +#: src/slic3r/GUI/GCodeViewer.cpp:3881 msgid "Extrusion" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3965 src/slic3r/GUI/Tab.cpp:1708 -#: src/slic3r/GUI/Tab.cpp:2596 +#: src/slic3r/GUI/GCodeViewer.cpp:3882 src/slic3r/GUI/Tab.cpp:1794 +#: src/slic3r/GUI/Tab.cpp:2733 msgid "Retraction" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3982 src/slic3r/GUI/GCodeViewer.cpp:3985 -#: src/slic3r/GUI/GUI_Preview.cpp:1027 +#: src/slic3r/GUI/GCodeViewer.cpp:3899 src/slic3r/GUI/GCodeViewer.cpp:3902 +#: src/slic3r/GUI/GUI_Preview.cpp:1050 msgid "Wipe" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:4016 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/GUI_Preview.cpp:259 +#: src/slic3r/GUI/GCodeViewer.cpp:3938 src/slic3r/GUI/GUI_Preview.cpp:256 +#: src/slic3r/GUI/GUI_Preview.cpp:271 msgid "Options" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:4019 src/slic3r/GUI/GUI_Preview.cpp:1028 +#: src/slic3r/GUI/GCodeViewer.cpp:3941 src/slic3r/GUI/GUI_Preview.cpp:1051 msgid "Retractions" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:4020 src/slic3r/GUI/GUI_Preview.cpp:1029 +#: src/slic3r/GUI/GCodeViewer.cpp:3942 src/slic3r/GUI/GUI_Preview.cpp:1052 msgid "Deretractions" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:4021 src/slic3r/GUI/GUI_Preview.cpp:1030 +#: src/slic3r/GUI/GCodeViewer.cpp:3943 src/slic3r/GUI/GUI_Preview.cpp:1053 +msgid "Seams" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3944 src/slic3r/GUI/GUI_Preview.cpp:1054 msgid "Tool changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:4022 src/slic3r/GUI/GUI_Preview.cpp:1031 +#: src/slic3r/GUI/GCodeViewer.cpp:3945 src/slic3r/GUI/GUI_Preview.cpp:1055 msgid "Color changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:4023 src/slic3r/GUI/GUI_Preview.cpp:1032 +#: src/slic3r/GUI/GCodeViewer.cpp:3946 src/slic3r/GUI/GUI_Preview.cpp:1056 msgid "Print pauses" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:4024 src/slic3r/GUI/GUI_Preview.cpp:1033 +#: src/slic3r/GUI/GCodeViewer.cpp:3947 src/slic3r/GUI/GUI_Preview.cpp:1057 msgid "Custom G-codes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:4035 src/slic3r/GUI/GCodeViewer.cpp:4059 -#: src/slic3r/GUI/Plater.cpp:694 src/libslic3r/PrintConfig.cpp:117 +#: src/slic3r/GUI/GCodeViewer.cpp:3967 src/slic3r/GUI/GCodeViewer.cpp:3986 +#: src/slic3r/GUI/GUI.cpp:341 src/slic3r/GUI/Plater.cpp:743 +#: src/libslic3r/PrintConfig.cpp:289 msgid "Printer" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:4037 src/slic3r/GUI/GCodeViewer.cpp:4064 -#: src/slic3r/GUI/Plater.cpp:690 +#: src/slic3r/GUI/GCodeViewer.cpp:3969 src/slic3r/GUI/GCodeViewer.cpp:3991 +#: src/slic3r/GUI/GUI.cpp:337 src/slic3r/GUI/Plater.cpp:739 msgid "Print settings" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:4040 src/slic3r/GUI/GCodeViewer.cpp:4070 -#: src/slic3r/GUI/Plater.cpp:691 src/slic3r/GUI/Tab.cpp:1808 -#: src/slic3r/GUI/Tab.cpp:1809 -msgid "Filament" +#: src/slic3r/GUI/GCodeViewer.cpp:4011 +msgid "Estimated printing times" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:4095 src/slic3r/GUI/GCodeViewer.cpp:4100 -#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1143 -#: src/slic3r/GUI/Plater.cpp:1228 -msgid "Estimated printing time" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:4095 +#: src/slic3r/GUI/GCodeViewer.cpp:4030 msgid "Normal mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:4100 +#: src/slic3r/GUI/GCodeViewer.cpp:4031 msgid "Stealth mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:4128 +#: src/slic3r/GUI/GCodeViewer.cpp:4038 src/libslic3r/PrintConfig.cpp:1147 +#: src/libslic3r/PrintConfig.cpp:1165 src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1217 +msgid "First layer" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4039 +msgid "Total" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4069 msgid "Show stealth mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:4132 +#: src/slic3r/GUI/GCodeViewer.cpp:4073 msgid "Show normal mode" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:236 src/slic3r/GUI/GLCanvas3D.cpp:4619 +#: src/slic3r/GUI/GLCanvas3D.cpp:218 src/slic3r/GUI/GLCanvas3D.cpp:4613 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:53 msgid "Variable layer height" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:238 +#: src/slic3r/GUI/GLCanvas3D.cpp:220 msgid "Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:240 +#: src/slic3r/GUI/GLCanvas3D.cpp:222 msgid "Add detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:242 +#: src/slic3r/GUI/GLCanvas3D.cpp:224 msgid "Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:244 +#: src/slic3r/GUI/GLCanvas3D.cpp:226 msgid "Remove detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:246 +#: src/slic3r/GUI/GLCanvas3D.cpp:228 msgid "Shift + Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:230 msgid "Reset to base" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:250 +#: src/slic3r/GUI/GLCanvas3D.cpp:232 msgid "Shift + Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:252 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 msgid "Smoothing" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:254 +#: src/slic3r/GUI/GLCanvas3D.cpp:236 msgid "Mouse wheel:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:256 +#: src/slic3r/GUI/GLCanvas3D.cpp:238 msgid "Increase/decrease edit area" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:259 +#: src/slic3r/GUI/GLCanvas3D.cpp:241 msgid "Adaptive" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:265 +#: src/slic3r/GUI/GLCanvas3D.cpp:247 msgid "Quality / Speed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:250 msgid "Higher print quality versus higher print speed." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:279 +#: src/slic3r/GUI/GLCanvas3D.cpp:261 msgid "Smooth" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:285 src/libslic3r/PrintConfig.cpp:596 +#: src/slic3r/GUI/GLCanvas3D.cpp:267 src/libslic3r/PrintConfig.cpp:781 msgid "Radius" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:295 +#: src/slic3r/GUI/GLCanvas3D.cpp:277 msgid "Keep min" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:304 src/slic3r/GUI/GLCanvas3D.cpp:4055 +#: src/slic3r/GUI/GLCanvas3D.cpp:286 src/slic3r/GUI/GLCanvas3D.cpp:4033 msgid "Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:566 +#: src/slic3r/GUI/GLCanvas3D.cpp:552 msgid "Variable layer height - Manual edit" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:634 -msgid "An object outside the print area was detected." -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:635 -msgid "A toolpath outside the print area was detected." -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:636 -msgid "SLA supports outside the print area were detected." -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:637 -msgid "Some objects are not visible." -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:639 -msgid "" -"An object outside the print area was detected.\n" -"Resolve the current problem to continue slicing." -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:949 +#: src/slic3r/GUI/GLCanvas3D.cpp:667 msgid "Seq." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1455 +#: src/slic3r/GUI/GLCanvas3D.cpp:1259 msgid "Variable layer height - Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1463 +#: src/slic3r/GUI/GLCanvas3D.cpp:1267 msgid "Variable layer height - Adaptive" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1471 +#: src/slic3r/GUI/GLCanvas3D.cpp:1275 msgid "Variable layer height - Smooth all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1876 +#: src/slic3r/GUI/GLCanvas3D.cpp:1684 msgid "Mirror Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:2746 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520 +#: src/slic3r/GUI/GLCanvas3D.cpp:2541 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:560 msgid "Gizmo-Move" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:2832 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522 +#: src/slic3r/GUI/GLCanvas3D.cpp:2623 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 msgid "Gizmo-Rotate" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 +#: src/slic3r/GUI/GLCanvas3D.cpp:3223 msgid "Move Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3859 src/slic3r/GUI/GLCanvas3D.cpp:4580 +#: src/slic3r/GUI/GLCanvas3D.cpp:3743 src/slic3r/GUI/GLCanvas3D.cpp:4574 msgid "Switch to Settings" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4580 +#: src/slic3r/GUI/GLCanvas3D.cpp:3744 src/slic3r/GUI/GLCanvas3D.cpp:4574 msgid "Print Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3861 src/slic3r/GUI/GLCanvas3D.cpp:4581 +#: src/slic3r/GUI/GLCanvas3D.cpp:3745 src/slic3r/GUI/GLCanvas3D.cpp:4575 msgid "Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3861 src/slic3r/GUI/GLCanvas3D.cpp:4581 +#: src/slic3r/GUI/GLCanvas3D.cpp:3745 src/slic3r/GUI/GLCanvas3D.cpp:4575 msgid "Material Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3862 src/slic3r/GUI/GLCanvas3D.cpp:4582 +#: src/slic3r/GUI/GLCanvas3D.cpp:3746 src/slic3r/GUI/GLCanvas3D.cpp:4576 msgid "Printer Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3914 +#: src/slic3r/GUI/GLCanvas3D.cpp:3893 msgid "Undo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3914 +#: src/slic3r/GUI/GLCanvas3D.cpp:3893 msgid "Redo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3935 +#: src/slic3r/GUI/GLCanvas3D.cpp:3913 #, possible-c-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3935 +#: src/slic3r/GUI/GLCanvas3D.cpp:3913 #, possible-c-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3955 src/slic3r/GUI/GLCanvas3D.cpp:4598 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 src/slic3r/GUI/Search.cpp:348 +#: src/slic3r/GUI/GLCanvas3D.cpp:3933 src/slic3r/GUI/GLCanvas3D.cpp:4592 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/Search.cpp:423 msgid "Search" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3969 src/slic3r/GUI/GLCanvas3D.cpp:3977 -#: src/slic3r/GUI/Search.cpp:355 +#: src/slic3r/GUI/GLCanvas3D.cpp:3947 src/slic3r/GUI/GLCanvas3D.cpp:3955 +#: src/slic3r/GUI/Search.cpp:429 msgid "Enter a search term" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4008 +#: src/slic3r/GUI/GLCanvas3D.cpp:3986 msgid "Arrange options" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4038 +#: src/slic3r/GUI/GLCanvas3D.cpp:4016 msgid "Press %1%left mouse button to enter the exact value" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4040 +#: src/slic3r/GUI/GLCanvas3D.cpp:4018 msgid "Spacing" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4047 +#: src/slic3r/GUI/GLCanvas3D.cpp:4025 msgid "Enable rotations (slow)" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4065 src/slic3r/GUI/GLCanvas3D.cpp:4490 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Plater.cpp:1656 +#: src/slic3r/GUI/GLCanvas3D.cpp:4043 src/slic3r/GUI/GLCanvas3D.cpp:4484 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Plater.cpp:1543 msgid "Arrange" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4464 +#: src/slic3r/GUI/GLCanvas3D.cpp:4458 msgid "Add..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4472 src/slic3r/GUI/GUI_ObjectList.cpp:1896 -#: src/slic3r/GUI/Plater.cpp:4019 src/slic3r/GUI/Plater.cpp:4043 -#: src/slic3r/GUI/Tab.cpp:3502 -msgid "Delete" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4481 src/slic3r/GUI/KBShortcutsDialog.cpp:88 -#: src/slic3r/GUI/Plater.cpp:5130 +#: src/slic3r/GUI/GLCanvas3D.cpp:4475 src/slic3r/GUI/KBShortcutsDialog.cpp:96 +#: src/slic3r/GUI/Plater.cpp:5378 msgid "Delete all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/KBShortcutsDialog.cpp:121 +#: src/slic3r/GUI/GLCanvas3D.cpp:4484 src/slic3r/GUI/KBShortcutsDialog.cpp:133 msgid "Arrange selection" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4490 +#: src/slic3r/GUI/GLCanvas3D.cpp:4484 msgid "Click right mouse button to show arrangement options" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4512 +#: src/slic3r/GUI/GLCanvas3D.cpp:4506 msgid "Copy" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4521 +#: src/slic3r/GUI/GLCanvas3D.cpp:4515 msgid "Paste" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4533 src/slic3r/GUI/Plater.cpp:3878 -#: src/slic3r/GUI/Plater.cpp:3890 src/slic3r/GUI/Plater.cpp:4028 +#: src/slic3r/GUI/GLCanvas3D.cpp:4527 src/slic3r/GUI/GUI_Factories.cpp:1081 +#: src/slic3r/GUI/GUI_Factories.cpp:1105 src/slic3r/GUI/GUI_Factories.cpp:1116 msgid "Add instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4544 src/slic3r/GUI/Plater.cpp:4030 +#: src/slic3r/GUI/GLCanvas3D.cpp:4538 src/slic3r/GUI/GUI_Factories.cpp:1084 msgid "Remove instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4557 +#: src/slic3r/GUI/GLCanvas3D.cpp:4551 msgid "Split to objects" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4567 src/slic3r/GUI/GUI_ObjectList.cpp:1668 +#: src/slic3r/GUI/GLCanvas3D.cpp:4561 msgid "Split to parts" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4669 src/slic3r/GUI/KBShortcutsDialog.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1125 -msgid "Undo" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4669 src/slic3r/GUI/GLCanvas3D.cpp:4708 +#: src/slic3r/GUI/GLCanvas3D.cpp:4675 src/slic3r/GUI/GLCanvas3D.cpp:4714 msgid "Click right mouse button to open/close History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4692 +#: src/slic3r/GUI/GLCanvas3D.cpp:4698 msgid "Next Undo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/KBShortcutsDialog.cpp:90 -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/GLCanvas3D.cpp:4714 src/slic3r/GUI/KBShortcutsDialog.cpp:98 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Redo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4730 +#: src/slic3r/GUI/GLCanvas3D.cpp:4736 msgid "Next Redo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6354 +#: src/slic3r/GUI/GLCanvas3D.cpp:6358 +msgid "An object outside the print area was detected." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6359 +msgid "A toolpath outside the print area was detected." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6360 +msgid "SLA supports outside the print area were detected." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6361 +msgid "Some objects are not visible during editing." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6363 +msgid "" +"An object outside the print area was detected.\n" +"Resolve the current problem to continue slicing." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6437 msgid "Selection-Add from rectangle" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6373 +#: src/slic3r/GUI/GLCanvas3D.cpp:6452 msgid "Selection-Remove from rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 src/libslic3r/PrintConfig.cpp:3771 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4165 msgid "Cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:322 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:467 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:468 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:321 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:410 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:479 msgid "in" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:185 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 msgid "Keep upper part" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:186 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 msgid "Keep lower part" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:187 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:196 msgid "Rotate lower part upwards" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:192 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:201 msgid "Perform cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:32 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:49 msgid "Paint-on supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:41 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 msgid "Clipping of view" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 msgid "Reset direction" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:27 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 msgid "Brush size" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 msgid "Brush shape" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:29 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 msgid "Left mouse button" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 msgid "Enforce supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 msgid "Right mouse button" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:373 msgid "Block supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 msgid "Shift + Left mouse button" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 -#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:368 -#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:378 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:368 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:281 msgid "Remove selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 msgid "Remove all selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 msgid "Circle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1613 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:125 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 +#: src/slic3r/GUI/GUI_Factories.cpp:461 msgid "Sphere" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:129 -msgid "Autoset by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +msgid "Highlight by angle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118 -msgid "Reset selection" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:160 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 -msgid "Alt + Mouse wheel" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:178 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:159 -msgid "Paints all facets inside, regardless of their orientation." -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:192 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:173 -msgid "Ignores facets facing away from the camera." -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:203 -msgid "Ctrl + Mouse wheel" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233 -msgid "Autoset custom supports" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235 -msgid "Threshold:" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 msgid "Enforce" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245 -msgid "Block" +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:169 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:507 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:125 +msgid "Reset selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:295 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:196 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:441 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:475 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:151 +msgid "Alt + Mouse wheel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:214 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:398 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:168 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:228 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:412 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:182 +msgid "Ignores facets facing away from the camera." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:262 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:500 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:215 +msgid "Ctrl + Mouse wheel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:303 msgid "Block supports by angle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:296 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:304 msgid "Add supports by angle" msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:371 +msgid "Add supports" +msgstr "" + #: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 msgid "Place on face" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 msgid "Hollow this object" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 msgid "Preview hollowed and drilled model" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 msgid "Offset" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:57 msgid "Quality" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 -#: src/libslic3r/PrintConfig.cpp:3272 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "Closing distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 msgid "Hole diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 msgid "Hole depth" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 msgid "Remove selected holes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 msgid "Remove all holes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 msgid "Show supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:286 msgid "Add drainage hole" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:402 msgid "Delete drainage hole" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:605 msgid "Hollowing parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:682 msgid "Change drainage hole diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:776 msgid "Hollow and drill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:826 msgid "Move drainage hole" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:27 +msgid "" +"Your printer has more extruders than the multi-material painting gizmo " +"supports. For this reason, only the first %1% extruders will be able to be " +"used for painting." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:46 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:51 +msgid "Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +msgid "First color" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:120 +msgid "Second color" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:696 +msgid "Remove painted color" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 +msgid "Remove all painted areas" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +msgid "Pointer" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:128 +msgid "Tool type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:129 +msgid "Brush" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:130 +msgid "Smart fill" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:131 +msgid "Bucket fill" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:133 +msgid "Smart fill angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:342 +msgid "Paints facets according to the chosen painting brush." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:360 +msgid "" +"Paints neighboring facets whose relative angle is less or equal to set angle." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:378 +msgid "Paints neighboring facets that have the same color." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:426 +msgid "Paints only one facet." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:446 +msgid "Split triangles" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:451 +msgid "Split bigger facets into smaller ones while the object is painted." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:699 +msgid "Painted using: Extruder %1%" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:55 msgid "Move" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:461 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:508 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 -#: src/libslic3r/PrintConfig.cpp:3820 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:466 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:544 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 +#: src/libslic3r/PrintConfig.cpp:4219 msgid "Rotate" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:219 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:528 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:544 -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:505 +msgid "Optimize orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:517 +msgid "Choose goal" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:538 +msgid "Optimize" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:217 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:564 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:580 +#: src/libslic3r/PrintConfig.cpp:4234 msgid "Scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30 -#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:284 msgid "Enforce seam" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 -#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:286 msgid "Block seam" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:52 msgid "Seam painting" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:28 +msgid "Mesh name" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:29 +#: src/libslic3r/PrintConfig.cpp:1131 +msgid "Triangles" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:30 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4375 +#: src/slic3r/GUI/Tab.cpp:2753 +msgid "Preview" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:31 +msgid "Detail level" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:32 +msgid "Decimate ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:53 +msgid "Simplify" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:153 +msgid "Extra high" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:154 +msgid "High" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:155 +msgid "Medium" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:156 +msgid "Low" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 +msgid "Extra low" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:206 +#, possible-c-format +msgid "%d triangles" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:209 +msgid "Show wireframe" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:230 +msgid "Apply" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:249 +#, possible-c-format +msgid "Process %d / 100" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:288 +msgid "Model simplification has been canceled" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:295 +msgid "Simplify " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:372 +msgid "ERROR: Wait until Simplification ends or Cancel process." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 msgid "Head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 msgid "Lock supports under new islands" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 msgid "Remove selected points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 msgid "Remove all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 msgid "Apply changes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 msgid "Discard changes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 msgid "Minimal points distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 -#: src/libslic3r/PrintConfig.cpp:3102 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 +#: src/libslic3r/PrintConfig.cpp:3482 msgid "Support points density" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 msgid "Auto-generate points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 msgid "Manual editing" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:372 msgid "Add support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:513 msgid "Delete support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:693 msgid "Change point head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:761 msgid "Support parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:867 msgid "SLA Support Points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 -msgid "SLA gizmo turned on" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:888 msgid "Do you want to save your manually edited support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912 -msgid "Save changes?" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:889 +msgid "Save support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924 -msgid "SLA gizmo turned off" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:949 msgid "Move support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1042 msgid "Support points edit" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1122 msgid "Autogeneration will erase all manually edited points." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1123 msgid "Are you sure you want to do it?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:262 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:557 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:586 -#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366 -msgid "Warning" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 msgid "Autogenerate support points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1177 msgid "SLA gizmo keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1188 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1206 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1209 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 msgid "Left click" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1206 msgid "Add point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1207 msgid "Right click" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1207 msgid "Remove point" msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1208 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 msgid "Drag" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1208 msgid "Move point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1209 msgid "Add point to selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 msgid "Remove point from selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 msgid "Select by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 msgid "Deselect by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 msgid "Select all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 msgid "Mouse wheel" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 msgid "Move clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 msgid "Reset clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 msgid "Switch to editing mode" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:196 +msgid "" +"ERROR: Please close all manipulators available from the left toolbar first" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:561 msgid "Gizmo-Scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:630 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:673 msgid "Gizmo-Place on Face" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39 -msgid "Entering Paint-on supports" +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:1260 +msgid "" +"You are currently editing SLA support points. Please, apply or discard your " +"changes first." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40 -msgid "Entering Seam painting" +#: src/slic3r/GUI/GUI.cpp:207 +msgid "Internal error when changing value for %1%: %2%" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47 -msgid "Leaving Seam painting" +#: src/slic3r/GUI/GUI.cpp:292 +msgid "Undefined" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48 -msgid "Leaving Paint-on supports" +#: src/slic3r/GUI/GUI.cpp:317 +msgid "%1% was substituted with %2%" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371 -msgid "Add supports" +#: src/slic3r/GUI/GUI.cpp:326 +msgid "" +"Most likely the configuration was produced by a newer version of PrusaSlicer " +"or by some PrusaSlicer fork." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:247 +#: src/slic3r/GUI/GUI.cpp:327 +msgid "The following values were substituted:" +msgstr "" + +#: src/slic3r/GUI/GUI.cpp:328 +msgid "Review the substitutions and adjust them if needed." +msgstr "" + +#: src/slic3r/GUI/GUI.cpp:338 src/slic3r/GUI/Plater.cpp:741 +msgid "SLA print settings" +msgstr "" + +#: src/slic3r/GUI/GUI.cpp:342 src/slic3r/GUI/PhysicalPrinterDialog.cpp:157 +msgid "Physical Printer" +msgstr "" + +#: src/slic3r/GUI/GUI.cpp:355 +msgid "" +"Configuration bundle was loaded, however some configuration values were not " +"recognized." +msgstr "" + +#: src/slic3r/GUI/GUI.cpp:365 +msgid "" +"Configuration file \"%1%\" was loaded, however some configuration values " +"were not recognized." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:259 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:249 +#: src/slic3r/GUI/GUI_App.cpp:260 +msgid "Developed by Prusa Research." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:262 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:250 -msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles" +#: src/slic3r/GUI/GUI_App.cpp:263 +msgid "Artwork model by M Boyer" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:391 +#: src/slic3r/GUI/GUI_App.cpp:404 msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " "(according to XDG Base Directory Specification) to \n" @@ -2501,20 +2969,20 @@ msgid "" "What do you want to do now?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:399 +#: src/slic3r/GUI/GUI_App.cpp:412 #, possible-c-format msgid "%s - BREAKING CHANGE" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:401 +#: src/slic3r/GUI/GUI_App.cpp:414 msgid "Quit, I will move my data now" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:401 +#: src/slic3r/GUI/GUI_App.cpp:414 msgid "Start the application" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:589 +#: src/slic3r/GUI/GUI_App.cpp:604 #, possible-c-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -2524,11 +2992,11 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:592 +#: src/slic3r/GUI/GUI_App.cpp:607 msgid "Fatal error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:596 +#: src/slic3r/GUI/GUI_App.cpp:611 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -2537,261 +3005,677 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:599 +#: src/slic3r/GUI/GUI_App.cpp:614 msgid "Critical error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:619 +msgid "Internal error: %1%" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:778 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " "not be affected." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:732 +#: src/slic3r/GUI/GUI_App.cpp:784 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:787 +#: src/slic3r/GUI/GUI_App.cpp:847 #, possible-c-format msgid "" "%s\n" "Do you want to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:789 src/slic3r/GUI/UnsavedChangesDialog.cpp:665 +#: src/slic3r/GUI/GUI_App.cpp:849 src/slic3r/GUI/GUI_App.cpp:2647 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:888 msgid "Remember my choice" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:827 +#: src/slic3r/GUI/GUI_App.cpp:891 msgid "Loading configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:892 +#: src/slic3r/GUI/GUI_App.cpp:953 msgid "Preparing settings tabs" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1149 +#: src/slic3r/GUI/GUI_App.cpp:1304 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1153 +#: src/slic3r/GUI/GUI_App.cpp:1308 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" "Settings will be available in physical printers settings." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1155 +#: src/slic3r/GUI/GUI_App.cpp:1310 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" "Note: This name can be changed later from the physical printers settings" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1158 src/slic3r/GUI/PhysicalPrinterDialog.cpp:631 +#: src/slic3r/GUI/GUI_App.cpp:1314 src/slic3r/GUI/PhysicalPrinterDialog.cpp:717 msgid "Information" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1171 src/slic3r/GUI/GUI_App.cpp:1182 +#: src/slic3r/GUI/GUI_App.cpp:1327 src/slic3r/GUI/GUI_App.cpp:1338 msgid "Recreating" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1187 +#: src/slic3r/GUI/GUI_App.cpp:1341 msgid "Loading of current presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1192 +#: src/slic3r/GUI/GUI_App.cpp:1346 msgid "Loading of a mode view" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1269 +#: src/slic3r/GUI/GUI_App.cpp:1439 msgid "Choose one file (3MF/AMF):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1281 +#: src/slic3r/GUI/GUI_App.cpp:1451 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1293 +#: src/slic3r/GUI/GUI_App.cpp:1463 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1304 +#: src/slic3r/GUI/GUI_App.cpp:1474 msgid "Changing of an application language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1427 +#: src/slic3r/GUI/GUI_App.cpp:1613 msgid "Select the language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1427 +#: src/slic3r/GUI/GUI_App.cpp:1613 msgid "Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1576 +#: src/slic3r/GUI/GUI_App.cpp:1762 msgid "modified" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1625 +#: src/slic3r/GUI/GUI_App.cpp:1816 #, possible-c-format msgid "Run %s" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1629 +#: src/slic3r/GUI/GUI_App.cpp:1820 msgid "&Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1629 +#: src/slic3r/GUI/GUI_App.cpp:1820 msgid "Inspect / activate configuration snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1630 +#: src/slic3r/GUI/GUI_App.cpp:1821 msgid "Take Configuration &Snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1630 +#: src/slic3r/GUI/GUI_App.cpp:1821 msgid "Capture a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1631 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Check for updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1631 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Check for configuration updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1634 +#: src/slic3r/GUI/GUI_App.cpp:1829 msgid "&Preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1640 +#: src/slic3r/GUI/GUI_App.cpp:1835 msgid "Application preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1645 src/slic3r/GUI/wxExtensions.cpp:685 +#: src/slic3r/GUI/GUI_App.cpp:1840 src/slic3r/GUI/wxExtensions.cpp:706 msgid "Simple" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1645 +#: src/slic3r/GUI/GUI_App.cpp:1840 msgid "Simple View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1647 src/slic3r/GUI/wxExtensions.cpp:687 +#: src/slic3r/GUI/GUI_App.cpp:1842 src/slic3r/GUI/wxExtensions.cpp:708 msgctxt "Mode" msgid "Advanced" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1647 +#: src/slic3r/GUI/GUI_App.cpp:1842 msgid "Advanced View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1648 src/slic3r/GUI/wxExtensions.cpp:688 +#: src/slic3r/GUI/GUI_App.cpp:1843 src/slic3r/GUI/wxExtensions.cpp:709 msgid "Expert" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1648 +#: src/slic3r/GUI/GUI_App.cpp:1843 msgid "Expert View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1653 +#: src/slic3r/GUI/GUI_App.cpp:1848 msgid "Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1653 +#: src/slic3r/GUI/GUI_App.cpp:1848 #, possible-c-format msgid "%s View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1656 +#: src/slic3r/GUI/GUI_App.cpp:1851 msgid "&Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1659 +#: src/slic3r/GUI/GUI_App.cpp:1854 msgid "Flash printer &firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1659 +#: src/slic3r/GUI/GUI_App.cpp:1854 msgid "Upload a firmware image into an Arduino based printer" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1675 -msgid "Taking configuration snapshot" +#: src/slic3r/GUI/GUI_App.cpp:1874 +msgid "Taking a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1675 +#: src/slic3r/GUI/GUI_App.cpp:1875 +msgid "" +"Some presets are modified and the unsaved changes will not be captured by " +"the configuration snapshot." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1876 msgid "Snapshot name" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1704 +#: src/slic3r/GUI/GUI_App.cpp:1892 +msgid "Loading a configuration snapshot" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1901 +msgid "Continue to activate a configuration snapshot %1%?" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1915 msgid "Failed to activate configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1754 +#: src/slic3r/GUI/GUI_App.cpp:1934 +msgid "Restart application" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1968 msgid "Language selection" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1756 +#: src/slic3r/GUI/GUI_App.cpp:1971 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1758 +#: src/slic3r/GUI/GUI_App.cpp:1973 src/slic3r/GUI/Preferences.cpp:440 msgid "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1785 +#: src/slic3r/GUI/GUI_App.cpp:2000 msgid "&Configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1816 +#: src/slic3r/GUI/GUI_App.cpp:2117 src/slic3r/GUI/GUI_App.cpp:2178 msgid "The preset modifications are successfully saved" msgid_plural "The presets modifications are successfully saved" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_App.cpp:1838 +#: src/slic3r/GUI/GUI_App.cpp:2181 +msgid "For new project all modifications will be reseted" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2219 +msgid "Loading a new project while the current project is modified." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2222 +msgid "Project is loading" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2222 +msgid "Loading a new project while some presets are modified." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2241 msgid "The uploads are still ongoing" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1838 +#: src/slic3r/GUI/GUI_App.cpp:2241 msgid "Stop them and continue anyway?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1841 +#: src/slic3r/GUI/GUI_App.cpp:2245 msgid "Ongoing uploads" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2052 src/slic3r/GUI/Tab.cpp:3256 +#: src/slic3r/GUI/GUI_App.cpp:2446 msgid "It's impossible to print multi-part object(s) with SLA technology." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2053 -msgid "Please check and fix your object list." +#: src/slic3r/GUI/GUI_App.cpp:2447 src/slic3r/GUI/Jobs/SLAImportJob.cpp:224 +#: src/slic3r/GUI/Plater.cpp:2296 +msgid "Please check your object list before preset changing." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2054 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210 -#: src/slic3r/GUI/Plater.cpp:2367 src/slic3r/GUI/Tab.cpp:3258 -msgid "Attention!" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:2071 +#: src/slic3r/GUI/GUI_App.cpp:2496 msgid "Select a gcode file:" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:88 src/slic3r/GUI/GUI_Init.cpp:91 +#: src/slic3r/GUI/GUI_App.cpp:2646 +msgid "Should we open this hyperlink in your default browser?" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2646 +msgid "PrusaSlicer: Open hyperlink" +msgstr "" + +#: src/slic3r/GUI/GUI_Init.cpp:57 src/slic3r/GUI/GUI_Init.cpp:60 msgid "PrusaSlicer GUI initialization failed" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:91 +#: src/slic3r/GUI/GUI_Init.cpp:60 msgid "Fatal error, exception catched: %1%" msgstr "" +#: src/slic3r/GUI/GUI_Factories.cpp:54 src/slic3r/GUI/GUI_Factories.cpp:127 +#: src/libslic3r/PrintConfig.cpp:254 src/libslic3r/PrintConfig.cpp:371 +#: src/libslic3r/PrintConfig.cpp:413 src/libslic3r/PrintConfig.cpp:422 +#: src/libslic3r/PrintConfig.cpp:674 src/libslic3r/PrintConfig.cpp:740 +#: src/libslic3r/PrintConfig.cpp:748 src/libslic3r/PrintConfig.cpp:1189 +#: src/libslic3r/PrintConfig.cpp:1272 src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1878 src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:2166 src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2813 +#: src/libslic3r/PrintConfig.cpp:2822 +msgid "Layers and Perimeters" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 +#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1532 +#: src/slic3r/GUI/Tab.cpp:1534 src/libslic3r/ExtrusionEntity.cpp:322 +#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:2009 src/libslic3r/PrintConfig.cpp:2018 +#: src/libslic3r/PrintConfig.cpp:2027 src/libslic3r/PrintConfig.cpp:2037 +#: src/libslic3r/PrintConfig.cpp:2046 src/libslic3r/PrintConfig.cpp:2455 +#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2469 +#: src/libslic3r/PrintConfig.cpp:2481 src/libslic3r/PrintConfig.cpp:2491 +#: src/libslic3r/PrintConfig.cpp:2499 src/libslic3r/PrintConfig.cpp:2517 +#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2554 +#: src/libslic3r/PrintConfig.cpp:2566 src/libslic3r/PrintConfig.cpp:2583 +#: src/libslic3r/PrintConfig.cpp:2601 src/libslic3r/PrintConfig.cpp:2615 +#: src/libslic3r/PrintConfig.cpp:2625 src/libslic3r/PrintConfig.cpp:2634 +#: src/libslic3r/PrintConfig.cpp:2645 src/libslic3r/PrintConfig.cpp:2659 +#: src/libslic3r/PrintConfig.cpp:2675 src/libslic3r/PrintConfig.cpp:2683 +#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2707 src/libslic3r/PrintConfig.cpp:2715 +#: src/libslic3r/PrintConfig.cpp:2729 +msgid "Support material" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:59 src/slic3r/GUI/GUI_Factories.cpp:135 +#: src/libslic3r/PrintConfig.cpp:2949 src/libslic3r/PrintConfig.cpp:2957 +msgid "Wipe options" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:65 +msgid "Pad and Support" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/GUI_Preview.cpp:244 +#: src/slic3r/GUI/Tab.cpp:1500 src/libslic3r/ExtrusionEntity.cpp:318 +#: src/libslic3r/ExtrusionEntity.cpp:346 src/libslic3r/PrintConfig.cpp:1504 +#: src/libslic3r/PrintConfig.cpp:1510 src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1534 src/libslic3r/PrintConfig.cpp:1542 +#: src/libslic3r/PrintConfig.cpp:1544 +msgid "Ironing" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1238 +#: src/libslic3r/PrintConfig.cpp:1239 src/libslic3r/PrintConfig.cpp:1254 +#: src/libslic3r/PrintConfig.cpp:1263 +msgid "Fuzzy Skin" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/GUI_Preview.cpp:219 +#: src/slic3r/GUI/Tab.cpp:1566 src/libslic3r/PrintConfig.cpp:473 +#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:1279 +#: src/libslic3r/PrintConfig.cpp:1461 src/libslic3r/PrintConfig.cpp:1543 +#: src/libslic3r/PrintConfig.cpp:1934 src/libslic3r/PrintConfig.cpp:2254 +#: src/libslic3r/PrintConfig.cpp:2306 src/libslic3r/PrintConfig.cpp:2798 +msgid "Speed" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1605 +#: src/slic3r/GUI/Tab.cpp:2228 src/libslic3r/PrintConfig.cpp:758 +#: src/libslic3r/PrintConfig.cpp:1415 src/libslic3r/PrintConfig.cpp:1912 +#: src/libslic3r/PrintConfig.cpp:2275 src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2573 +msgid "Extruders" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:826 src/libslic3r/PrintConfig.cpp:1176 +#: src/libslic3r/PrintConfig.cpp:1423 src/libslic3r/PrintConfig.cpp:1921 +#: src/libslic3r/PrintConfig.cpp:2295 src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2786 +msgid "Extrusion Width" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1518 +#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:510 +msgid "Skirt and brim" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1478 +#: src/slic3r/GUI/Tab.cpp:1510 src/slic3r/GUI/Tab.cpp:1627 +#: src/slic3r/GUI/Tab.cpp:1631 src/slic3r/GUI/Tab.cpp:1955 +#: src/slic3r/GUI/Tab.cpp:2322 src/slic3r/GUI/Tab.cpp:4334 +#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:461 +#: src/libslic3r/PrintConfig.cpp:1366 src/libslic3r/PrintConfig.cpp:1450 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2441 src/libslic3r/PrintConfig.cpp:2973 +#: src/libslic3r/PrintConfig.cpp:3145 +msgid "Advanced" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:384 +#: src/slic3r/GUI/Tab.cpp:4268 src/slic3r/GUI/Tab.cpp:4269 +#: src/libslic3r/PrintConfig.cpp:3311 src/libslic3r/PrintConfig.cpp:3318 +#: src/libslic3r/PrintConfig.cpp:3327 src/libslic3r/PrintConfig.cpp:3336 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3411 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3443 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3462 +#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3483 +#: src/libslic3r/PrintConfig.cpp:3491 +msgid "Supports" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:529 +#: src/slic3r/GUI/Tab.cpp:4309 src/slic3r/GUI/Tab.cpp:4310 +#: src/slic3r/GUI/Tab.cpp:4382 src/libslic3r/PrintConfig.cpp:3499 +#: src/libslic3r/PrintConfig.cpp:3506 src/libslic3r/PrintConfig.cpp:3520 +#: src/libslic3r/PrintConfig.cpp:3531 src/libslic3r/PrintConfig.cpp:3541 +#: src/libslic3r/PrintConfig.cpp:3563 src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3581 src/libslic3r/PrintConfig.cpp:3588 +#: src/libslic3r/PrintConfig.cpp:3599 src/libslic3r/PrintConfig.cpp:3608 +#: src/libslic3r/PrintConfig.cpp:3617 +msgid "Pad" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4327 +#: src/slic3r/GUI/Tab.cpp:4328 src/libslic3r/SLA/Hollowing.cpp:72 +#: src/libslic3r/SLA/Hollowing.cpp:84 src/libslic3r/SLA/Hollowing.cpp:91 +#: src/libslic3r/SLA/Hollowing.cpp:100 src/libslic3r/PrintConfig.cpp:3627 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3653 +msgid "Hollowing" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:160 +msgid "Add part" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:161 +msgid "Add negative volume" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:162 +msgid "Add modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:163 +msgid "Add support blocker" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:164 +msgid "Add support enforcer" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:300 +msgid "Select showing settings" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:407 src/slic3r/GUI/GUI_Factories.cpp:412 +#: src/slic3r/GUI/GUI_Factories.cpp:550 src/slic3r/GUI/GUI_Factories.cpp:556 +#, possible-c-format +msgid "Quick Add Settings (%s)" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:444 +msgid "Remove the selected object" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:456 +msgid "Load" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:461 src/slic3r/GUI/GUI_Factories.cpp:497 +#: src/slic3r/GUI/GUI_Factories.cpp:501 +msgid "Box" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:461 +msgid "Cylinder" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:461 +msgid "Slab" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:471 +msgid "Gallery" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:520 +msgid "Height range Modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:529 +msgid "Add settings" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:620 +msgid "Change type" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:630 src/slic3r/GUI/GUI_Factories.cpp:642 +msgid "Set as a Separated Object" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:642 +msgid "Set as a Separated Objects" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:652 +msgid "Printable" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:680 +msgid "Rename" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:690 +msgid "Fix through the Netfabb" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:699 src/slic3r/GUI/Plater.cpp:3731 +msgid "Simplify model" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:709 +msgid "Export as STL" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:720 +msgid "Reload the selected volumes from disk" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:727 src/slic3r/GUI/Plater.cpp:3345 +#: src/slic3r/GUI/Plater.cpp:3371 +msgid "Replace with STL" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:727 +msgid "Replace the selected volume with new STL" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:734 +msgid "Set extruder for selected items" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:772 src/slic3r/Utils/Repetier.cpp:124 +#: src/slic3r/Utils/Repetier.cpp:203 src/libslic3r/PrintConfig.cpp:601 +#: src/libslic3r/PrintConfig.cpp:2667 +msgid "Default" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:789 +msgid "Scale to print volume" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:789 +msgid "Scale the selected object to fit the print volume" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:828 src/slic3r/GUI/Plater.cpp:5518 +msgid "Convert from imperial units" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:829 src/slic3r/GUI/Plater.cpp:5519 +msgid "Revert conversion from imperial units" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:830 src/slic3r/GUI/Plater.cpp:5520 +msgid "Convert from meters" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:831 src/slic3r/GUI/Plater.cpp:5520 +msgid "Revert conversion from meters" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:852 src/slic3r/GUI/GUI_ObjectList.cpp:2123 +#: src/libslic3r/PrintConfig.cpp:4210 +msgid "Merge" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:852 +msgid "Merge objects to the one multipart object" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:871 +msgid "Along X axis" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:871 +msgid "Mirror the selected object along the X axis" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:873 +msgid "Along Y axis" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:873 +msgid "Mirror the selected object along the Y axis" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:875 +msgid "Along Z axis" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:875 +msgid "Mirror the selected object along the Z axis" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:878 +msgid "Mirror" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:878 +msgid "Mirror the selected object" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:894 src/slic3r/GUI/GUI_ObjectList.cpp:1677 +msgid "Add Shape" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:930 +msgid "To objects" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:930 src/slic3r/GUI/GUI_Factories.cpp:951 +msgid "Split the selected object into individual objects" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:933 +msgid "To parts" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:933 src/slic3r/GUI/GUI_Factories.cpp:972 +msgid "Split the selected object into individual parts" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:937 src/slic3r/GUI/GUI_Factories.cpp:951 +#: src/slic3r/GUI/GUI_Factories.cpp:972 src/libslic3r/PrintConfig.cpp:4239 +msgid "Split" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:937 +msgid "Split the selected object" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1081 +msgid "Add one more instance of the selected object" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1084 +msgid "Remove one instance of the selected object" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1087 +msgid "Set number of instances" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1087 +msgid "Change the number of instances of the selected object" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1091 +msgid "Fill bed with instances" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1091 +msgid "Fill the remaining area of bed with instances of the selected object" +msgstr "" + #: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 msgid "Start at height" msgstr "" @@ -2800,522 +3684,322 @@ msgstr "" msgid "Stop at height" msgstr "" -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:161 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:160 msgid "Remove layer range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:165 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:164 msgid "Add layer range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92 -#: src/slic3r/GUI/GUI_ObjectList.cpp:681 src/libslic3r/PrintConfig.cpp:74 -#: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:231 -#: src/libslic3r/PrintConfig.cpp:240 src/libslic3r/PrintConfig.cpp:489 -#: src/libslic3r/PrintConfig.cpp:555 src/libslic3r/PrintConfig.cpp:563 -#: src/libslic3r/PrintConfig.cpp:995 src/libslic3r/PrintConfig.cpp:1308 -#: src/libslic3r/PrintConfig.cpp:1673 src/libslic3r/PrintConfig.cpp:1739 -#: src/libslic3r/PrintConfig.cpp:1924 src/libslic3r/PrintConfig.cpp:2391 -#: src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2459 -msgid "Layers and Perimeters" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95 -#: src/slic3r/GUI/GUI_ObjectList.cpp:684 src/slic3r/GUI/GUI_Preview.cpp:237 -#: src/slic3r/GUI/Tab.cpp:1486 src/slic3r/GUI/Tab.cpp:1488 -#: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:352 -#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:1804 -#: src/libslic3r/PrintConfig.cpp:2182 src/libslic3r/PrintConfig.cpp:2188 -#: src/libslic3r/PrintConfig.cpp:2196 src/libslic3r/PrintConfig.cpp:2208 -#: src/libslic3r/PrintConfig.cpp:2218 src/libslic3r/PrintConfig.cpp:2226 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2262 -#: src/libslic3r/PrintConfig.cpp:2274 src/libslic3r/PrintConfig.cpp:2290 -#: src/libslic3r/PrintConfig.cpp:2299 src/libslic3r/PrintConfig.cpp:2308 -#: src/libslic3r/PrintConfig.cpp:2319 src/libslic3r/PrintConfig.cpp:2333 -#: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2342 -#: src/libslic3r/PrintConfig.cpp:2351 src/libslic3r/PrintConfig.cpp:2359 -#: src/libslic3r/PrintConfig.cpp:2373 -msgid "Support material" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99 -#: src/slic3r/GUI/GUI_ObjectList.cpp:688 src/libslic3r/PrintConfig.cpp:2569 -#: src/libslic3r/PrintConfig.cpp:2577 -msgid "Wipe options" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:45 -msgid "Pad and Support" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:51 -msgid "Add part" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:52 -msgid "Add modifier" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:53 -msgid "Add support enforcer" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:54 -msgid "Add support blocker" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:683 -#: src/slic3r/GUI/GUI_Preview.cpp:233 src/slic3r/GUI/Tab.cpp:1454 -#: src/libslic3r/ExtrusionEntity.cpp:316 src/libslic3r/ExtrusionEntity.cpp:344 -#: src/libslic3r/PrintConfig.cpp:1315 src/libslic3r/PrintConfig.cpp:1321 -#: src/libslic3r/PrintConfig.cpp:1335 src/libslic3r/PrintConfig.cpp:1345 -#: src/libslic3r/PrintConfig.cpp:1353 src/libslic3r/PrintConfig.cpp:1355 -msgid "Ironing" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:685 -#: src/slic3r/GUI/GUI_Preview.cpp:214 src/slic3r/GUI/Tab.cpp:1512 -#: src/libslic3r/PrintConfig.cpp:291 src/libslic3r/PrintConfig.cpp:543 -#: src/libslic3r/PrintConfig.cpp:1101 src/libslic3r/PrintConfig.cpp:1281 -#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1729 -#: src/libslic3r/PrintConfig.cpp:2005 src/libslic3r/PrintConfig.cpp:2057 -#: src/libslic3r/PrintConfig.cpp:2435 -msgid "Speed" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:686 -#: src/slic3r/GUI/Tab.cpp:1548 src/slic3r/GUI/Tab.cpp:2126 -#: src/libslic3r/PrintConfig.cpp:573 src/libslic3r/PrintConfig.cpp:1235 -#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:2026 -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2281 -msgid "Extruders" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:687 -#: src/libslic3r/PrintConfig.cpp:532 src/libslic3r/PrintConfig.cpp:641 -#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:1243 -#: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:2046 -#: src/libslic3r/PrintConfig.cpp:2263 src/libslic3r/PrintConfig.cpp:2423 -msgid "Extrusion Width" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:689 -#: src/slic3r/GUI/Tab.cpp:1472 src/libslic3r/PrintConfig.cpp:301 -#: src/libslic3r/PrintConfig.cpp:310 src/libslic3r/PrintConfig.cpp:326 -msgid "Skirt and brim" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:691 -#: src/slic3r/GUI/Tab.cpp:1428 src/slic3r/GUI/Tab.cpp:1464 -#: src/slic3r/GUI/Tab.cpp:1569 src/slic3r/GUI/Tab.cpp:1572 -#: src/slic3r/GUI/Tab.cpp:1869 src/slic3r/GUI/Tab.cpp:2211 -#: src/slic3r/GUI/Tab.cpp:4132 src/libslic3r/PrintConfig.cpp:92 -#: src/libslic3r/PrintConfig.cpp:132 src/libslic3r/PrintConfig.cpp:279 -#: src/libslic3r/PrintConfig.cpp:1186 src/libslic3r/PrintConfig.cpp:1270 -#: src/libslic3r/PrintConfig.cpp:2593 src/libslic3r/PrintConfig.cpp:2765 -msgid "Advanced" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:693 -#: src/slic3r/GUI/Plater.cpp:357 src/slic3r/GUI/Tab.cpp:4066 -#: src/slic3r/GUI/Tab.cpp:4067 src/libslic3r/PrintConfig.cpp:2931 -#: src/libslic3r/PrintConfig.cpp:2938 src/libslic3r/PrintConfig.cpp:2947 -#: src/libslic3r/PrintConfig.cpp:2956 src/libslic3r/PrintConfig.cpp:2966 -#: src/libslic3r/PrintConfig.cpp:2976 src/libslic3r/PrintConfig.cpp:3013 -#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3031 -#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3050 -#: src/libslic3r/PrintConfig.cpp:3063 src/libslic3r/PrintConfig.cpp:3073 -#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 -#: src/libslic3r/PrintConfig.cpp:3103 src/libslic3r/PrintConfig.cpp:3111 -msgid "Supports" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:694 -#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:4107 -#: src/slic3r/GUI/Tab.cpp:4108 src/slic3r/GUI/Tab.cpp:4179 -#: src/libslic3r/PrintConfig.cpp:3119 src/libslic3r/PrintConfig.cpp:3126 -#: src/libslic3r/PrintConfig.cpp:3140 src/libslic3r/PrintConfig.cpp:3151 -#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3183 -#: src/libslic3r/PrintConfig.cpp:3194 src/libslic3r/PrintConfig.cpp:3201 -#: src/libslic3r/PrintConfig.cpp:3208 src/libslic3r/PrintConfig.cpp:3219 -#: src/libslic3r/PrintConfig.cpp:3228 src/libslic3r/PrintConfig.cpp:3237 -msgid "Pad" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4125 -#: src/slic3r/GUI/Tab.cpp:4126 src/libslic3r/SLA/Hollowing.cpp:45 -#: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66 -#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3247 -#: src/libslic3r/PrintConfig.cpp:3254 src/libslic3r/PrintConfig.cpp:3264 -#: src/libslic3r/PrintConfig.cpp:3273 -msgid "Hollowing" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:314 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:297 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:140 msgid "Name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:330 src/slic3r/GUI/GUI_ObjectList.cpp:471 +#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:465 msgid "Editing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:416 src/slic3r/GUI/Plater.cpp:1074 +#: src/slic3r/GUI/GUI_ObjectList.cpp:396 +msgid "No errors detected" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:405 #, possible-c-format msgid "Auto-repaired %1$d error" msgid_plural "Auto-repaired %1$d errors" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:423 src/slic3r/GUI/Plater.cpp:1079 +#: src/slic3r/GUI/GUI_ObjectList.cpp:409 #, possible-c-format msgid "%1$d degenerate facet" msgid_plural "%1$d degenerate facets" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:425 src/slic3r/GUI/Plater.cpp:1081 +#: src/slic3r/GUI/GUI_ObjectList.cpp:411 #, possible-c-format msgid "%1$d edge fixed" msgid_plural "%1$d edges fixed" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:427 src/slic3r/GUI/Plater.cpp:1083 +#: src/slic3r/GUI/GUI_ObjectList.cpp:413 #, possible-c-format msgid "%1$d facet removed" msgid_plural "%1$d facets removed" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:429 src/slic3r/GUI/Plater.cpp:1085 -#, possible-c-format -msgid "%1$d facet added" -msgid_plural "%1$d facets added" -msgstr[0] "" -msgstr[1] "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:431 src/slic3r/GUI/Plater.cpp:1087 +#: src/slic3r/GUI/GUI_ObjectList.cpp:415 #, possible-c-format msgid "%1$d facet reversed" msgid_plural "%1$d facets reversed" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:433 src/slic3r/GUI/Plater.cpp:1089 +#: src/slic3r/GUI/GUI_ObjectList.cpp:417 #, possible-c-format msgid "%1$d backwards edge" msgid_plural "%1$d backwards edges" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:420 +#, possible-c-format +msgid "Remaining %1$d open edge" +msgid_plural "Remaining %1$d open edges" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:422 +msgid "Remaning errors" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +#, possible-c-format +msgid "%1$d open edge" +msgid_plural "%1$d open edges" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:430 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:473 +#: src/slic3r/GUI/GUI_ObjectList.cpp:467 msgid "Right button click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:475 +#: src/slic3r/GUI/GUI_ObjectList.cpp:469 msgid "Click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:479 +#: src/slic3r/GUI/GUI_ObjectList.cpp:473 msgid "Right button click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:481 +#: src/slic3r/GUI/GUI_ObjectList.cpp:475 msgid "Click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:604 +#: src/slic3r/GUI/GUI_ObjectList.cpp:598 msgid "Change Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:619 +#: src/slic3r/GUI/GUI_ObjectList.cpp:613 msgid "Rename Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:619 +#: src/slic3r/GUI/GUI_ObjectList.cpp:613 msgid "Rename Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1265 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4406 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1231 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3987 msgid "Instances to Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1280 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1237 msgid "Volumes in Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1280 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1237 msgid "Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1356 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1711 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1717 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2099 -#, possible-c-format -msgid "Quick Add Settings (%s)" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 -msgid "Select showing settings" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1495 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1287 msgid "Add Settings for Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1496 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1288 msgid "Add Settings for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1497 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1289 msgid "Add Settings for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1567 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1328 msgid "Add Settings Bundle for Height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1568 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1329 msgid "Add Settings Bundle for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1569 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1330 msgid "Add Settings Bundle for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1608 -msgid "Load" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1613 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1645 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1649 -msgid "Box" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1613 -msgid "Cylinder" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1613 -msgid "Slab" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1681 -msgid "Height range Modifier" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1690 -msgid "Add settings" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1768 -msgid "Change type" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1778 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1790 -msgid "Set as a Separated Object" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1790 -msgid "Set as a Separated Objects" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1800 -msgid "Printable" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1815 -msgid "Rename" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 -msgid "Fix through the Netfabb" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1836 src/slic3r/GUI/Plater.cpp:4056 -msgid "Export as STL" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1843 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4601 src/slic3r/GUI/Plater.cpp:4022 -msgid "Reload the selected volumes from disk" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 -msgid "Set extruder for selected items" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1882 src/libslic3r/PrintConfig.cpp:416 -msgid "Default" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1902 -msgid "Scale to print volume" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1902 -msgid "Scale the selected object to fit the print volume" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1931 src/slic3r/GUI/Plater.cpp:5247 -msgid "Convert from imperial units" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1933 src/slic3r/GUI/Plater.cpp:5247 -msgid "Revert conversion from imperial units" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1962 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1970 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2650 src/libslic3r/PrintConfig.cpp:3811 -msgid "Merge" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1962 -msgid "Merge objects to the one multipart object" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1970 -msgid "Merge objects to the one single object" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2044 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2301 -msgid "Add Shape" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2129 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1399 msgid "Load Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2168 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1399 +msgid "Load Modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1437 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1496 src/slic3r/GUI/Plater.cpp:2251 +msgid "Loading" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1444 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1527 src/slic3r/GUI/Plater.cpp:2268 +msgid "Loading file" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1452 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1535 msgid "Error!" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2243 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1619 msgid "Add Generic Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2272 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1644 msgid "Generic" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2398 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1708 +msgid "Add Shape from Gallery" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1708 +msgid "Add Shapes from Gallery" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1816 +msgid "Remove paint-on supports" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1823 +msgid "Remove paint-on seam" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1830 +msgid "Remove Multi Material painting" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1836 +msgid "Shift objects to bed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1842 +msgid "Remove variable layer height" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1863 msgid "Delete Settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2422 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1887 msgid "Delete All Instances from Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1903 msgid "Delete Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2470 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1935 msgid "From Object List You can't delete the last solid part from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2474 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1939 msgid "Delete Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2489 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1962 msgid "Last instance of an object cannot be deleted." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 msgid "Delete Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2517 src/slic3r/GUI/Plater.cpp:2879 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1990 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2521 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1994 msgid "Split to Parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2657 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2130 msgid "Merged" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2741 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2215 msgid "Merge all parts to the one single object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2773 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2247 msgid "Add Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2927 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2416 msgid "Group manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2939 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2431 msgid "Object manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2952 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2464 msgid "Object Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2956 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2468 msgid "Part Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2961 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2473 msgid "Layer range Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2967 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2479 msgid "Part manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2973 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2485 msgid "Instance manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2492 msgid "Height ranges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2492 msgid "Settings for height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3166 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2728 msgid "Delete Selected Item" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3354 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2924 msgid "Delete Selected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3430 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3458 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3478 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3000 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3048 msgid "Add Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3524 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3094 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" "without violating the minimum layer height." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3528 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3098 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -3323,212 +4007,257 @@ msgid "" "is thinner than the minimum layer height allowed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3533 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3103 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3592 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3162 msgid "Edit Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3899 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3481 msgid "Selection-Remove from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3907 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3493 msgid "Selection-Add from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4042 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3630 msgid "Object or Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4043 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4176 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3770 msgid "Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3631 msgid "Layer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4045 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3633 msgid "Unsupported selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4046 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3634 #, possible-c-format msgid "You started your selection with %s Item." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4047 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3635 #, possible-c-format msgid "In this mode you can select only other %s Items%s" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4050 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3638 msgid "of a current Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4055 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4130 src/slic3r/GUI/Plater.cpp:143 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3643 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3718 src/slic3r/GUI/Plater.cpp:151 msgid "Info" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4171 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3765 msgid "You can't change a type of the last solid part of the object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4176 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3770 +msgid "Negative Volume" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3770 msgid "Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4176 -msgid "Support Enforcer" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:4176 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3770 msgid "Support Blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4178 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3770 +msgid "Support Enforcer" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3771 msgid "Select type of part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4183 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3776 msgid "Change Part Type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 msgid "Enter new name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 msgid "Renaming" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4444 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4571 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4025 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4256 #: src/slic3r/GUI/SavePresetDialog.cpp:101 #: src/slic3r/GUI/SavePresetDialog.cpp:109 msgid "The supplied name is not valid;" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4445 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4572 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4026 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4257 #: src/slic3r/GUI/SavePresetDialog.cpp:102 msgid "the following characters are not allowed:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4620 -msgid "Select extruder number:" +#: src/slic3r/GUI/GUI_ObjectList.cpp:4082 +msgid "Repairing model" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4621 -msgid "This extruder will be set for selected items" +#: src/slic3r/GUI/GUI_ObjectList.cpp:4111 +msgid "Fix through NetFabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4646 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4114 +msgid "Fixing through NetFabb" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4145 +msgid "Folowing model is repaired successfully" +msgid_plural "Folowing models are repaired successfully" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4151 +msgid "Folowing model repair failed" +msgid_plural "Folowing models repair failed" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4156 +msgid "Repairing was canceled" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4159 +msgid "Model Repair by the Netfabb service" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4279 msgid "Change Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4743 src/slic3r/GUI/Selection.cpp:1485 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +msgid "Set Printable group" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +msgid "Set Unprintable group" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4421 msgid "Set Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4743 src/slic3r/GUI/Selection.cpp:1485 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4421 msgid "Set Unprintable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4422 +msgid "Set Printable Instance" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4422 +msgid "Set Unprintable Instance" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:56 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:85 msgid "World coordinates" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:57 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:86 msgid "Local coordinates" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:73 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:61 msgid "Select coordinate space, in which the transformation will be performed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:144 src/libslic3r/GCode.cpp:537 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:142 src/libslic3r/GCode.cpp:522 msgid "Object name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:204 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:202 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:522 msgid "Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:205 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 -#: src/slic3r/GUI/Mouse3DController.cpp:486 -#: src/slic3r/GUI/Mouse3DController.cpp:507 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:203 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:523 +#: src/slic3r/GUI/Mouse3DController.cpp:478 +#: src/slic3r/GUI/Mouse3DController.cpp:499 msgid "Rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:252 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:251 #, possible-c-format msgid "Toggle %c axis mirroring" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:286 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:285 msgid "Set Mirror" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:326 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:338 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:325 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349 msgid "Drop to bed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:353 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:364 msgid "Reset rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:375 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:386 msgid "Reset Rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:390 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:401 msgid "Reset scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:404 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:415 msgid "Inches" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:488 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:524 msgid "Scale factors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:542 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 msgid "Translate" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:606 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:642 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:778 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:819 msgid "Set Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:809 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:850 msgid "Set Orientation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:874 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:915 msgid "Set Scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:906 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:948 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -3537,1680 +4266,1870 @@ msgid "" "once the rotation is embedded into the object coordinates." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:909 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:951 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:62 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:63 msgid "Additional Settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:98 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:99 msgid "Remove parameter" msgstr "" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:104 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:105 #, possible-c-format msgid "Delete Option %s" msgstr "" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:158 #, possible-c-format msgid "Change Option %s" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:209 +#: src/slic3r/GUI/GUI_Preview.cpp:210 msgid "View" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:212 src/libslic3r/PrintConfig.cpp:585 +#: src/slic3r/GUI/GUI_Preview.cpp:217 src/libslic3r/PrintConfig.cpp:770 msgid "Height" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:213 src/libslic3r/PrintConfig.cpp:2555 +#: src/slic3r/GUI/GUI_Preview.cpp:218 src/libslic3r/PrintConfig.cpp:2927 msgid "Width" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:215 src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/GUI_Preview.cpp:220 src/slic3r/GUI/Tab.cpp:1940 msgid "Fan speed" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:216 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:1915 +msgid "Temperature" +msgstr "" + +#: src/slic3r/GUI/GUI_Preview.cpp:222 msgid "Volumetric flow rate" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:221 +#: src/slic3r/GUI/GUI_Preview.cpp:227 msgid "Show" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:242 +#: src/slic3r/GUI/GUI_Preview.cpp:235 src/slic3r/GUI/GUI_Preview.cpp:253 msgid "Feature types" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/libslic3r/ExtrusionEntity.cpp:310 -#: src/libslic3r/ExtrusionEntity.cpp:332 +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:312 +#: src/libslic3r/ExtrusionEntity.cpp:334 msgid "Perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:228 src/libslic3r/ExtrusionEntity.cpp:311 -#: src/libslic3r/ExtrusionEntity.cpp:334 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:313 +#: src/libslic3r/ExtrusionEntity.cpp:336 msgid "External perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/ExtrusionEntity.cpp:312 -#: src/libslic3r/ExtrusionEntity.cpp:336 +#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/ExtrusionEntity.cpp:338 msgid "Overhang perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/ExtrusionEntity.cpp:313 -#: src/libslic3r/ExtrusionEntity.cpp:338 +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/ExtrusionEntity.cpp:340 msgid "Internal infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/ExtrusionEntity.cpp:314 -#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:2045 -#: src/libslic3r/PrintConfig.cpp:2056 +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:316 +#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2305 msgid "Solid infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/ExtrusionEntity.cpp:315 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2422 -#: src/libslic3r/PrintConfig.cpp:2434 +#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/PrintConfig.cpp:2785 +#: src/libslic3r/PrintConfig.cpp:2797 msgid "Top solid infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/ExtrusionEntity.cpp:317 -#: src/libslic3r/ExtrusionEntity.cpp:346 +#: src/slic3r/GUI/GUI_Preview.cpp:245 src/libslic3r/ExtrusionEntity.cpp:319 +#: src/libslic3r/ExtrusionEntity.cpp:348 msgid "Bridge infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/ExtrusionEntity.cpp:318 -#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:1100 +#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:320 +#: src/libslic3r/ExtrusionEntity.cpp:350 src/libslic3r/PrintConfig.cpp:1278 msgid "Gap fill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1474 -#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/ExtrusionEntity.cpp:350 -msgid "Skirt" +#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:321 +#: src/libslic3r/ExtrusionEntity.cpp:352 +msgid "Skirt/Brim" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:321 -#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2307 +#: src/slic3r/GUI/GUI_Preview.cpp:249 src/libslic3r/ExtrusionEntity.cpp:323 +#: src/libslic3r/ExtrusionEntity.cpp:356 src/libslic3r/PrintConfig.cpp:2633 msgid "Support material interface" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/slic3r/GUI/Tab.cpp:1559 -#: src/libslic3r/ExtrusionEntity.cpp:322 src/libslic3r/ExtrusionEntity.cpp:356 +#: src/slic3r/GUI/GUI_Preview.cpp:250 src/slic3r/GUI/Tab.cpp:1616 +#: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:358 msgid "Wipe tower" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1034 +#: src/slic3r/GUI/GUI_Preview.cpp:731 +msgid "NOTE:" +msgstr "" + +#: src/slic3r/GUI/GUI_Preview.cpp:731 +msgid "Sliced object looks like the sign" +msgstr "" + +#: src/slic3r/GUI/GUI_Preview.cpp:732 +msgid "Apply auto color change to print" +msgstr "" + +#: src/slic3r/GUI/GUI_Preview.cpp:1058 msgid "Shells" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1035 +#: src/slic3r/GUI/GUI_Preview.cpp:1059 msgid "Tool marker" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1036 +#: src/slic3r/GUI/GUI_Preview.cpp:1060 msgid "Legend/Estimated printing time" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:804 src/slic3r/GUI/Search.cpp:386 +#: src/slic3r/GUI/HintNotification.cpp:762 +#: src/slic3r/GUI/HintNotification.cpp:788 +#: src/slic3r/GUI/NotificationManager.cpp:399 +#: src/slic3r/GUI/NotificationManager.cpp:416 +msgid "More" +msgstr "" + +#: src/slic3r/GUI/HintNotification.cpp:903 +msgid "Open Preferences." +msgstr "" + +#: src/slic3r/GUI/HintNotification.cpp:995 +msgid "Open Documentation in web browser." +msgstr "" + +#: src/slic3r/GUI/ImGuiWrapper.cpp:848 src/slic3r/GUI/Search.cpp:467 msgid "Use for search" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:805 src/slic3r/GUI/Search.cpp:380 +#: src/slic3r/GUI/ImGuiWrapper.cpp:849 src/slic3r/GUI/Search.cpp:460 msgid "Category" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:807 src/slic3r/GUI/Search.cpp:382 +#: src/slic3r/GUI/ImGuiWrapper.cpp:851 src/slic3r/GUI/Search.cpp:462 msgid "Search in English" msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:153 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:170 msgid "Could not arrange model objects! Some geometries may be invalid." msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:162 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:179 msgid "Arranging" msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:191 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:203 msgid "Arranging canceled." msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:192 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:204 msgid "Arranging done." msgstr "" -#: src/slic3r/GUI/Jobs/Job.cpp:89 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:249 +#, possible-c-format +msgid "" +"Arrangement ignored the following objects which can't fit into a single " +"bed:\n" +"%s" +msgstr "" + +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:123 +msgid "Filling bed" +msgstr "" + +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:134 +msgid "Bed filling canceled." +msgstr "" + +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:135 +msgid "Bed filling done." +msgstr "" + +#: src/slic3r/GUI/Jobs/Job.cpp:108 msgid "ERROR: not enough resources to execute a new job." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41 +#: src/slic3r/GUI/Jobs/PlaterJob.cpp:13 +msgid "An unexpected error occured: " +msgstr "" + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 msgid "Searching for optimal orientation" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:77 msgid "Orientation search canceled." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:74 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:78 msgid "Orientation found." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:35 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:36 msgid "Choose SLA archive:" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:39 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:40 msgid "Import file" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:46 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 msgid "Import model and profile" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 msgid "Import profile only" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 msgid "Import model only" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:59 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 msgid "Accurate" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 msgid "Balanced" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:62 msgid "Quick" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:138 msgid "Importing SLA archive" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:159 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:156 +msgid "" +"The SLA archive doesn't contain any presets. Please activate some SLA " +"printer preset first before importing that SLA archive." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:162 msgid "Importing canceled." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:160 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:163 msgid "Importing done." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2365 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:210 +msgid "" +"The imported SLA archive did not contain any presets. The current SLA " +"presets were used as fallback." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:223 src/slic3r/GUI/Plater.cpp:2295 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2366 -#: src/slic3r/GUI/Tab.cpp:3257 -msgid "Please check your object list before preset changing." +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:225 src/slic3r/GUI/Plater.cpp:2297 +msgid "Attention!" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:17 src/slic3r/GUI/MainFrame.cpp:894 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1106 msgid "Keyboard Shortcuts" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:69 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 msgid "New project, clear plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:70 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:78 msgid "Open project STL/OBJ/AMF/3MF with config, clear plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:71 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 msgid "Save project (3mf)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:72 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 msgid "Save project as (3mf)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:73 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 msgid "(Re)slice" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:75 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 msgid "Import STL/OBJ/AMF/3MF without config, keep plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:76 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:84 msgid "Import Config from ini/amf/3mf/gcode" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 src/slic3r/GUI/Plater.cpp:767 -#: src/slic3r/GUI/Plater.cpp:6081 src/libslic3r/PrintConfig.cpp:3716 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:826 +#: src/slic3r/GUI/Plater.cpp:6415 src/libslic3r/PrintConfig.cpp:4110 msgid "Export G-code" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 src/slic3r/GUI/Plater.cpp:6082 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 src/slic3r/GUI/Plater.cpp:6416 msgid "Send G-code" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 msgid "Export config" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:82 src/slic3r/GUI/Plater.cpp:755 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 src/slic3r/GUI/Plater.cpp:809 msgid "Export to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 msgid "Eject SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 msgid "Select all objects" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 msgid "Deselect all" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:95 msgid "Delete selected" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 msgid "Copy to clipboard" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Paste from clipboard" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 msgid "Reload plater from disk" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 msgid "Select Plater Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:101 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Select Print Settings Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 msgid "Select Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 msgid "Select Printer Settings Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 msgid "Switch to 3D" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 msgid "Switch to Preview" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 -#: src/slic3r/GUI/PrintHostDialogs.cpp:176 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +#: src/slic3r/GUI/PrintHostDialogs.cpp:200 msgid "Print host upload queue" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/MainFrame.cpp:65 -#: src/slic3r/GUI/MainFrame.cpp:1191 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/MainFrame.cpp:75 +#: src/slic3r/GUI/MainFrame.cpp:1419 msgid "Open new instance" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Camera view" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Show/Hide object/instance labels" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 src/slic3r/GUI/Preferences.cpp:13 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:16 msgid "Preferences" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Show keyboard shortcuts list" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 msgid "Commands" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 msgid "Add Instance of the selected object" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Remove Instance of the selected object" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 msgid "Press to activate selection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 msgid "Press to activate deselection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 msgid "Arrow Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 msgid "Move selection 10 mm in positive Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Arrow Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 msgid "Move selection 10 mm in negative Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 #: src/slic3r/GUI/KBShortcutsDialog.cpp:246 msgid "Arrow Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 msgid "Move selection 10 mm in negative X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 #: src/slic3r/GUI/KBShortcutsDialog.cpp:247 msgid "Arrow Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Move selection 10 mm in positive X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Any arrow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Movement step set to 1 mm" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Movement in camera space" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "Page Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "Rotate selection 45 degrees CCW" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Page Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Rotate selection 45 degrees CW" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Gizmo move" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Gizmo scale" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Gizmo rotate" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 msgid "Gizmo cut" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Gizmo Place face on bed" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Gizmo SLA hollow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Gizmo SLA support points" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +msgid "Gizmo FDM paint-on supports" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +msgid "Gizmo FDM paint-on seam" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +msgid "Gizmo Multi Material painting" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Unselect gizmo or clear selection" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Change camera type (perspective, orthographic)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Zoom to Bed" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Zoom in" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Zoom out" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Switch between Editor/Preview" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Collapse/Expand the sidebar" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 src/slic3r/GUI/MainFrame.cpp:331 -#: src/slic3r/GUI/MainFrame.cpp:343 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "Minimize application" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 src/slic3r/GUI/MainFrame.cpp:284 +#: src/slic3r/GUI/MainFrame.cpp:328 src/slic3r/GUI/MainFrame.cpp:440 +#: src/slic3r/GUI/MainFrame.cpp:443 src/slic3r/GUI/MainFrame.cpp:465 +#: src/slic3r/GUI/MainFrame.cpp:468 msgid "Plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 msgid "Gizmo move: Press to snap by 1mm" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 msgid "Gizmo scale: Press to snap by 5%" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 msgid "Gizmo scale: Scale selection to fit print volume" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 msgid "Gizmo scale: Press to activate one direction scaling" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "Gizmos" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "" "The following shortcuts are applicable when the specified gizmo is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 src/slic3r/GUI/MainFrame.cpp:1244 -msgid "Open a G-code file" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 src/slic3r/GUI/MainFrame.cpp:1142 -#: src/slic3r/GUI/MainFrame.cpp:1146 src/slic3r/GUI/MainFrame.cpp:1249 -#: src/slic3r/GUI/MainFrame.cpp:1253 -msgid "Reload the plater from disk" -msgstr "" - #: src/slic3r/GUI/KBShortcutsDialog.cpp:196 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 -msgid "Vertical slider - Move active thumb Up" +msgid "Set selected items as Ptrintable/Unprintable" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:197 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 -msgid "Vertical slider - Move active thumb Down" +msgid "Set default extruder for the selected items" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:198 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 -msgid "Horizontal slider - Move active thumb Left" +msgid "Set extruder number for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 -msgid "Horizontal slider - Move active thumb Right" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 -msgid "On/Off one layer mode of the vertical slider" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1524 +msgid "Open a G-code file" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 -msgid "Show/Hide Legend and Estimated printing time" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1358 +#: src/slic3r/GUI/MainFrame.cpp:1362 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1533 +msgid "Reload the plater from disk" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 -msgid "Upper layer" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +msgid "Vertical slider - Move active thumb Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 -msgid "Lower layer" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 -msgid "Upper Layer" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:210 -msgid "Lower Layer" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 -msgid "Show/Hide Legend & Estimated printing time" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 src/slic3r/GUI/Plater.cpp:4221 -#: src/slic3r/GUI/Tab.cpp:2616 -msgid "Preview" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +msgid "Vertical slider - Move active thumb Down" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -msgid "Move active thumb Up" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +msgid "Horizontal slider - Move active thumb Left" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -msgid "Move active thumb Down" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 -msgid "Set upper thumb as active" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 -msgid "Set lower thumb as active" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 -msgid "Add color change marker for current layer" -msgstr "" - #: src/slic3r/GUI/KBShortcutsDialog.cpp:224 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 -msgid "Delete color change marker for current layer" +msgid "Horizontal slider - Move active thumb Right" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +msgid "On/Off one layer mode of the vertical slider" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Move current slider thumb Up" +msgid "Show/Hide Legend and Estimated printing time" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:227 -msgid "Move current slider thumb Down" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 -msgid "Set upper thumb to current slider thumb" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 -msgid "Set lower thumb to current slider thumb" +msgid "Show/Hide G-code window" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +msgid "Move active thumb Up" +msgstr "" + #: src/slic3r/GUI/KBShortcutsDialog.cpp:234 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +msgid "Move active thumb Down" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +msgid "Set upper thumb as active" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +msgid "Set lower thumb as active" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +msgid "Add color change marker for current layer" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +msgid "Delete color change marker for current layer" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 #: src/slic3r/GUI/KBShortcutsDialog.cpp:250 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:251 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Vertical Slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "" "The following shortcuts are applicable in G-code preview when the vertical " "slider is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 msgid "Move active thumb Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 msgid "Move active thumb Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 msgid "Set left thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Set right thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 -msgid "Move active slider thumb Left" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 -msgid "Move active slider thumb Right" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Horizontal Slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "" "The following shortcuts are applicable in G-code preview when the horizontal " "slider is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:276 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:278 msgid "Keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:65 src/slic3r/GUI/MainFrame.cpp:79 -#: src/slic3r/GUI/MainFrame.cpp:1191 +#: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 +#: src/slic3r/GUI/MainFrame.cpp:1419 msgid "Open a new PrusaSlicer instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:81 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:91 msgid "G-code preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:1091 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1307 msgid "Open G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:79 src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1540 msgid "Open PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:81 +#: src/slic3r/GUI/MainFrame.cpp:91 msgid "Open new G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:153 -msgid "" -"Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/" -"releases" +#: src/slic3r/GUI/MainFrame.cpp:225 +msgid "Closing PrusaSlicer. Current project is modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:510 +#: src/slic3r/GUI/MainFrame.cpp:232 +msgid "PrusaSlicer is closing" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:232 +msgid "Closing PrusaSlicer while some presets are modified." +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:285 src/slic3r/GUI/MainFrame.cpp:330 +#: src/slic3r/GUI/Tab.hpp:376 src/slic3r/GUI/Tab.hpp:493 +msgid "Print Settings" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:334 +#: src/slic3r/GUI/MainFrame.cpp:2102 src/slic3r/GUI/MainFrame.cpp:2103 +#: src/slic3r/GUI/Tab.hpp:478 +msgid "Material Settings" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:332 +#: src/slic3r/GUI/MainFrame.cpp:2102 src/slic3r/GUI/MainFrame.cpp:2103 +#: src/slic3r/GUI/Tab.hpp:405 +msgid "Filament Settings" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:287 src/slic3r/GUI/MainFrame.cpp:336 +#: src/slic3r/GUI/Tab.hpp:446 +msgid "Printer Settings" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:627 src/slic3r/GUI/Plater.cpp:1597 +#: src/slic3r/GUI/Plater.cpp:2656 +msgid "Untitled" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:650 msgid "based on Slic3r" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:866 +#: src/slic3r/GUI/MainFrame.cpp:1076 msgid "Prusa 3D &Drivers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:866 +#: src/slic3r/GUI/MainFrame.cpp:1076 msgid "Open the Prusa3D drivers download page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:868 +#: src/slic3r/GUI/MainFrame.cpp:1078 msgid "Software &Releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:868 +#: src/slic3r/GUI/MainFrame.cpp:1078 msgid "Open the software releases page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:874 +#: src/slic3r/GUI/MainFrame.cpp:1084 #, possible-c-format msgid "%s &Website" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:875 +#: src/slic3r/GUI/MainFrame.cpp:1085 #, possible-c-format msgid "Open the %s website in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:881 +#: src/slic3r/GUI/MainFrame.cpp:1091 msgid "System &Info" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:881 +#: src/slic3r/GUI/MainFrame.cpp:1091 msgid "Show system information" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:883 +#: src/slic3r/GUI/MainFrame.cpp:1093 msgid "Show &Configuration Folder" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:883 +#: src/slic3r/GUI/MainFrame.cpp:1093 msgid "Show user configuration folder (datadir)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:885 +#: src/slic3r/GUI/MainFrame.cpp:1095 msgid "Report an I&ssue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:885 +#: src/slic3r/GUI/MainFrame.cpp:1095 #, possible-c-format msgid "Report an issue on %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891 +#: src/slic3r/GUI/MainFrame.cpp:1098 src/slic3r/GUI/MainFrame.cpp:1101 #, possible-c-format msgid "&About %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891 +#: src/slic3r/GUI/MainFrame.cpp:1098 src/slic3r/GUI/MainFrame.cpp:1101 msgid "Show about dialog" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:894 +#: src/slic3r/GUI/MainFrame.cpp:1103 +msgid "Show Tip of the day" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1103 +msgid "" +"Opens Tip of the day notification in bottom right corner or shows another " +"tip if already opened." +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1106 msgid "Show the list of the keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:908 +#: src/slic3r/GUI/MainFrame.cpp:1120 msgid "Iso" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:908 +#: src/slic3r/GUI/MainFrame.cpp:1120 msgid "Iso View" msgstr "" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:912 src/libslic3r/PrintConfig.cpp:2449 -#: src/libslic3r/PrintConfig.cpp:2458 +#: src/slic3r/GUI/MainFrame.cpp:1124 src/libslic3r/PrintConfig.cpp:2812 +#: src/libslic3r/PrintConfig.cpp:2821 msgid "Top" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:912 +#: src/slic3r/GUI/MainFrame.cpp:1124 msgid "Top View" msgstr "" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:915 src/libslic3r/PrintConfig.cpp:230 -#: src/libslic3r/PrintConfig.cpp:239 +#: src/slic3r/GUI/MainFrame.cpp:1127 src/libslic3r/PrintConfig.cpp:412 +#: src/libslic3r/PrintConfig.cpp:421 msgid "Bottom" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:915 +#: src/slic3r/GUI/MainFrame.cpp:1127 msgid "Bottom View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:917 +#: src/slic3r/GUI/MainFrame.cpp:1129 msgid "Front" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:917 +#: src/slic3r/GUI/MainFrame.cpp:1129 msgid "Front View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:919 src/libslic3r/PrintConfig.cpp:1934 +#: src/slic3r/GUI/MainFrame.cpp:1131 src/libslic3r/PrintConfig.cpp:2176 msgid "Rear" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:919 +#: src/slic3r/GUI/MainFrame.cpp:1131 msgid "Rear View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:921 +#: src/slic3r/GUI/MainFrame.cpp:1133 msgid "Left" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:921 +#: src/slic3r/GUI/MainFrame.cpp:1133 msgid "Left View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:923 +#: src/slic3r/GUI/MainFrame.cpp:1135 msgid "Right" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:923 +#: src/slic3r/GUI/MainFrame.cpp:1135 msgid "Right View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:936 +#: src/slic3r/GUI/MainFrame.cpp:1148 msgid "&New Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:936 +#: src/slic3r/GUI/MainFrame.cpp:1148 msgid "Start a new project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:939 +#: src/slic3r/GUI/MainFrame.cpp:1151 msgid "&Open Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:939 +#: src/slic3r/GUI/MainFrame.cpp:1151 msgid "Open a project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:944 +#: src/slic3r/GUI/MainFrame.cpp:1156 msgid "Recent projects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:953 +#: src/slic3r/GUI/MainFrame.cpp:1168 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:953 src/slic3r/GUI/MainFrame.cpp:1343 -#: src/slic3r/GUI/PrintHostDialogs.cpp:274 +#: src/slic3r/GUI/MainFrame.cpp:1168 src/slic3r/GUI/MainFrame.cpp:1625 +#: src/slic3r/GUI/PrintHostDialogs.cpp:348 msgid "Error" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:978 +#: src/slic3r/GUI/MainFrame.cpp:1193 msgid "&Save Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:978 +#: src/slic3r/GUI/MainFrame.cpp:1193 msgid "Save current project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984 +#: src/slic3r/GUI/MainFrame.cpp:1197 src/slic3r/GUI/MainFrame.cpp:1199 msgid "Save Project &as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984 +#: src/slic3r/GUI/MainFrame.cpp:1197 src/slic3r/GUI/MainFrame.cpp:1199 msgid "Save current project file as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:992 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Import STL/OBJ/AM&F/3MF" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:992 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Load a model" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:996 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Import STL (imperial units)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:996 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Load an model saved with imperial units" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1000 -msgid "Import SL1 archive" +#: src/slic3r/GUI/MainFrame.cpp:1215 +msgid "Import SL1 / SL1S archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1000 -msgid "Load an SL1 archive" +#: src/slic3r/GUI/MainFrame.cpp:1215 +msgid "Load an SL1 / Sl1S archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1005 +#: src/slic3r/GUI/MainFrame.cpp:1220 msgid "Import &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1005 +#: src/slic3r/GUI/MainFrame.cpp:1220 msgid "Load exported configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1008 +#: src/slic3r/GUI/MainFrame.cpp:1223 msgid "Import Config from &project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1008 +#: src/slic3r/GUI/MainFrame.cpp:1223 msgid "Load configuration from project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1012 +#: src/slic3r/GUI/MainFrame.cpp:1227 msgid "Import Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1012 +#: src/slic3r/GUI/MainFrame.cpp:1227 msgid "Load presets from a bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1015 +#: src/slic3r/GUI/MainFrame.cpp:1230 msgid "&Import" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1018 src/slic3r/GUI/MainFrame.cpp:1305 +#: src/slic3r/GUI/MainFrame.cpp:1233 src/slic3r/GUI/MainFrame.cpp:1585 msgid "Export &G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1018 +#: src/slic3r/GUI/MainFrame.cpp:1233 msgid "Export current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1022 src/slic3r/GUI/MainFrame.cpp:1306 +#: src/slic3r/GUI/MainFrame.cpp:1237 src/slic3r/GUI/MainFrame.cpp:1586 msgid "S&end G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1022 +#: src/slic3r/GUI/MainFrame.cpp:1237 msgid "Send to print current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1026 +#: src/slic3r/GUI/MainFrame.cpp:1241 msgid "Export G-code to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1026 +#: src/slic3r/GUI/MainFrame.cpp:1241 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1030 +#: src/slic3r/GUI/MainFrame.cpp:1245 msgid "Export plate as &STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1030 +#: src/slic3r/GUI/MainFrame.cpp:1245 msgid "Export current plate as STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1033 +#: src/slic3r/GUI/MainFrame.cpp:1248 msgid "Export plate as STL &including supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1033 +#: src/slic3r/GUI/MainFrame.cpp:1248 msgid "Export current plate as STL including supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1036 -msgid "Export plate as &AMF" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:1036 -msgid "Export current plate as AMF" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1256 src/slic3r/GUI/MainFrame.cpp:1537 msgid "Export &toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1256 src/slic3r/GUI/MainFrame.cpp:1537 msgid "Export toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1044 +#: src/slic3r/GUI/MainFrame.cpp:1260 msgid "Export &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1044 +#: src/slic3r/GUI/MainFrame.cpp:1260 msgid "Export current configuration to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1047 +#: src/slic3r/GUI/MainFrame.cpp:1263 msgid "Export Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1047 +#: src/slic3r/GUI/MainFrame.cpp:1263 msgid "Export all presets to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1050 +#: src/slic3r/GUI/MainFrame.cpp:1266 msgid "Export Config Bundle With Physical Printers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1050 +#: src/slic3r/GUI/MainFrame.cpp:1266 msgid "Export all presets including physical printers to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1053 +#: src/slic3r/GUI/MainFrame.cpp:1269 msgid "&Export" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1055 +#: src/slic3r/GUI/MainFrame.cpp:1271 msgid "Ejec&t SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1055 +#: src/slic3r/GUI/MainFrame.cpp:1271 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1063 +#: src/slic3r/GUI/MainFrame.cpp:1279 msgid "Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1063 +#: src/slic3r/GUI/MainFrame.cpp:1279 msgid "Slice a file into a G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1069 +#: src/slic3r/GUI/MainFrame.cpp:1285 msgid "Quick Slice and Save As" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1069 +#: src/slic3r/GUI/MainFrame.cpp:1285 msgid "Slice a file into a G-code, save as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1291 msgid "Repeat Last Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1291 msgid "Repeat last quick slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1083 +#: src/slic3r/GUI/MainFrame.cpp:1299 msgid "(Re)Slice No&w" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1083 +#: src/slic3r/GUI/MainFrame.cpp:1299 msgid "Start new slicing process" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1087 +#: src/slic3r/GUI/MainFrame.cpp:1303 msgid "&Repair STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1087 +#: src/slic3r/GUI/MainFrame.cpp:1303 msgid "Automatically repair an STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1091 +#: src/slic3r/GUI/MainFrame.cpp:1307 msgid "&G-code preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1310 src/slic3r/GUI/MainFrame.cpp:1544 msgid "&Quit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1310 src/slic3r/GUI/MainFrame.cpp:1544 #, possible-c-format msgid "Quit %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1109 +#: src/slic3r/GUI/MainFrame.cpp:1325 msgid "&Select all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1110 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "Selects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1112 +#: src/slic3r/GUI/MainFrame.cpp:1328 msgid "D&eselect all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1113 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "Deselects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1116 +#: src/slic3r/GUI/MainFrame.cpp:1332 msgid "&Delete selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "Deletes the current selection" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1119 +#: src/slic3r/GUI/MainFrame.cpp:1335 msgid "Delete &all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1120 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Deletes all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1340 msgid "&Undo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1127 +#: src/slic3r/GUI/MainFrame.cpp:1343 msgid "&Redo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1348 msgid "&Copy" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1133 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "Copy selection to clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1135 +#: src/slic3r/GUI/MainFrame.cpp:1351 msgid "&Paste" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Paste clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1141 src/slic3r/GUI/MainFrame.cpp:1145 -#: src/slic3r/GUI/MainFrame.cpp:1248 src/slic3r/GUI/MainFrame.cpp:1252 +#: src/slic3r/GUI/MainFrame.cpp:1357 src/slic3r/GUI/MainFrame.cpp:1361 +#: src/slic3r/GUI/MainFrame.cpp:1528 src/slic3r/GUI/MainFrame.cpp:1532 msgid "Re&load from disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1151 +#: src/slic3r/GUI/MainFrame.cpp:1367 msgid "Searc&h" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Search in settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1160 +#: src/slic3r/GUI/MainFrame.cpp:1376 msgid "&Plater Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1160 +#: src/slic3r/GUI/MainFrame.cpp:1376 msgid "Show the plater" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1381 msgid "P&rint Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1381 msgid "Show the print settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1168 src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1384 src/slic3r/GUI/MainFrame.cpp:1588 msgid "&Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1168 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "Show the filament settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1172 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "Print&er Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1172 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "Show the printer settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1178 +#: src/slic3r/GUI/MainFrame.cpp:1394 msgid "3&D" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1178 +#: src/slic3r/GUI/MainFrame.cpp:1394 msgid "Show the 3D editing view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1181 +#: src/slic3r/GUI/MainFrame.cpp:1397 msgid "Pre&view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1181 +#: src/slic3r/GUI/MainFrame.cpp:1397 msgid "Show the 3D slices preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1187 +#: src/slic3r/GUI/MainFrame.cpp:1403 +msgid "Modify Shapes Gallery" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1403 +msgid "Open the dialog to modify shapes gallery" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1415 msgid "Print &Host Upload Queue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1187 +#: src/slic3r/GUI/MainFrame.cpp:1415 msgid "Display the Print Host Upload Queue window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1201 +#: src/slic3r/GUI/MainFrame.cpp:1423 +msgid "Compare presets" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "Show &labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1201 +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "Show object/instance labels in 3D scene" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1436 msgid "&Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1204 src/slic3r/GUI/Plater.cpp:2255 +#: src/slic3r/GUI/MainFrame.cpp:1436 src/slic3r/GUI/Plater.cpp:2178 msgid "Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 src/slic3r/GUI/MainFrame.cpp:1279 +#: src/slic3r/GUI/MainFrame.cpp:1441 +msgid "&Full screen" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1441 +msgid "Full screen" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1559 msgid "&File" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1457 msgid "&Edit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1218 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1219 src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1222 src/slic3r/GUI/MainFrame.cpp:1283 +#: src/slic3r/GUI/MainFrame.cpp:1462 src/slic3r/GUI/MainFrame.cpp:1563 msgid "&Help" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1244 +#: src/slic3r/GUI/MainFrame.cpp:1524 msgid "&Open G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1540 msgid "Open &PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1305 +#: src/slic3r/GUI/MainFrame.cpp:1585 msgid "E&xport" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1306 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "S&end to print" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1588 msgid "Mate&rial Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1331 +#: src/slic3r/GUI/MainFrame.cpp:1612 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1342 +#: src/slic3r/GUI/MainFrame.cpp:1624 msgid "No previously sliced file." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1631 msgid "Previously sliced file (" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1631 msgid ") not found." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "File Not Found" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1384 +#: src/slic3r/GUI/MainFrame.cpp:1667 #, possible-c-format msgid "Save %s file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1384 +#: src/slic3r/GUI/MainFrame.cpp:1667 msgid "SVG" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1384 +#: src/slic3r/GUI/MainFrame.cpp:1667 msgid "G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1396 +#: src/slic3r/GUI/MainFrame.cpp:1679 msgid "Save zip file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1405 src/slic3r/GUI/Plater.cpp:3023 -#: src/slic3r/GUI/Plater.cpp:5604 src/slic3r/GUI/Tab.cpp:1589 -#: src/slic3r/GUI/Tab.cpp:4133 +#: src/slic3r/GUI/MainFrame.cpp:1688 src/slic3r/GUI/Plater.cpp:3134 +#: src/slic3r/GUI/Plater.cpp:5928 src/slic3r/GUI/Tab.cpp:1648 +#: src/slic3r/GUI/Tab.cpp:4335 msgid "Slicing" msgstr "" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1407 +#: src/slic3r/GUI/MainFrame.cpp:1690 #, possible-c-format msgid "Processing %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1713 msgid "%1% was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1432 +#: src/slic3r/GUI/MainFrame.cpp:1716 msgid "Slicing Done!" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1447 +#: src/slic3r/GUI/MainFrame.cpp:1732 msgid "Select the STL file to repair:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1457 +#: src/slic3r/GUI/MainFrame.cpp:1742 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1469 +#: src/slic3r/GUI/MainFrame.cpp:1753 msgid "Your file was repaired." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1469 src/libslic3r/PrintConfig.cpp:3816 +#: src/slic3r/GUI/MainFrame.cpp:1753 src/libslic3r/PrintConfig.cpp:4215 msgid "Repair" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1483 +#: src/slic3r/GUI/MainFrame.cpp:1767 msgid "Save configuration as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1502 src/slic3r/GUI/MainFrame.cpp:1564 +#: src/slic3r/GUI/MainFrame.cpp:1784 +msgid "Loading of a configuration file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1786 src/slic3r/GUI/MainFrame.cpp:1851 msgid "Select configuration to load:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1815 +msgid "Exporting configuration bundle" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1816 +msgid "" +"Some presets are modified and the unsaved changes will not be exported into " +"configuration bundle." +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1825 msgid "Save presets bundle as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1848 +msgid "Loading of a configuration bundle" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1878 #, possible-c-format msgid "%d presets successfully imported." msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:461 +#: src/slic3r/GUI/Mouse3DController.cpp:453 msgid "3Dconnexion settings" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:472 +#: src/slic3r/GUI/Mouse3DController.cpp:464 msgid "Device:" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:477 +#: src/slic3r/GUI/Mouse3DController.cpp:469 msgid "Speed:" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:480 -#: src/slic3r/GUI/Mouse3DController.cpp:501 +#: src/slic3r/GUI/Mouse3DController.cpp:472 +#: src/slic3r/GUI/Mouse3DController.cpp:493 msgid "Translation" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:492 -#: src/slic3r/GUI/Mouse3DController.cpp:501 +#: src/slic3r/GUI/Mouse3DController.cpp:484 +#: src/slic3r/GUI/Mouse3DController.cpp:493 msgid "Zoom" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:498 +#: src/slic3r/GUI/Mouse3DController.cpp:490 msgid "Deadzone:" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:513 +#: src/slic3r/GUI/Mouse3DController.cpp:505 msgid "Options:" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:516 +#: src/slic3r/GUI/Mouse3DController.cpp:508 msgid "Swap Y/Z axes" msgstr "" -#: src/slic3r/GUI/MsgDialog.cpp:70 +#: src/slic3r/GUI/MsgDialog.cpp:148 #, possible-c-format msgid "%s error" msgstr "" -#: src/slic3r/GUI/MsgDialog.cpp:71 +#: src/slic3r/GUI/MsgDialog.cpp:149 #, possible-c-format msgid "%s has encountered an error" msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:471 +#: src/slic3r/GUI/MsgDialog.cpp:172 +#, possible-c-format +msgid "%s warning" +msgstr "" + +#: src/slic3r/GUI/MsgDialog.cpp:173 +#, possible-c-format +msgid "%s has a warning" +msgstr "" + +#: src/slic3r/GUI/MsgDialog.cpp:195 +#, possible-c-format +msgid "%s info" +msgstr "" + +#: src/slic3r/GUI/MsgDialog.cpp:218 +#, possible-c-format +msgid "%s information" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:36 msgid "3D Mouse disconnected." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:474 +#: src/slic3r/GUI/NotificationManager.cpp:37 msgid "Configuration update is available." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:474 +#: src/slic3r/GUI/NotificationManager.cpp:37 msgid "See more." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:481 +#: src/slic3r/GUI/NotificationManager.cpp:44 msgid "New version is available." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:481 +#: src/slic3r/GUI/NotificationManager.cpp:44 msgid "See Releases page." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:484 +#: src/slic3r/GUI/NotificationManager.cpp:47 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " "\"Printer Settings > Custom G-code\"" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:493 -#: src/slic3r/GUI/NotificationManager.cpp:503 -msgid "More" +#: src/slic3r/GUI/NotificationManager.cpp:50 +msgid "" +"No color change event was added to the print. The print does not look like a " +"sign." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:863 -#: src/slic3r/GUI/NotificationManager.cpp:1134 -msgid "Export G-Code." +#: src/slic3r/GUI/NotificationManager.cpp:52 +msgid "Desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:904 +#: src/slic3r/GUI/NotificationManager.cpp:54 +msgid "Desktop integration failed." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:56 +msgid "Undo desktop integration was successful." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:58 +msgid "Undo desktop integration failed." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:688 msgid "Open Folder." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:940 +#: src/slic3r/GUI/NotificationManager.cpp:725 msgid "Eject drive" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1053 +#: src/slic3r/GUI/NotificationManager.cpp:958 +msgid "ERROR" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:963 +msgid "CANCELED" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:968 +msgid "COMPLETED" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1010 +msgid "Cancel upload" +msgstr "" + #: src/slic3r/GUI/NotificationManager.cpp:1069 -#: src/slic3r/GUI/NotificationManager.cpp:1080 -msgid "ERROR:" +msgid " Object was loaded with " +msgid_plural " Objects were loaded with " +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/NotificationManager.cpp:1170 +#: src/slic3r/GUI/NotificationManager.cpp:1184 +msgid "Export G-Code." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1058 -#: src/slic3r/GUI/NotificationManager.cpp:1073 -#: src/slic3r/GUI/NotificationManager.cpp:1088 -msgid "WARNING:" -msgstr "" - -#: src/slic3r/GUI/NotificationManager.cpp:1137 -msgid "Slicing finished." +#: src/slic3r/GUI/NotificationManager.cpp:1170 +#: src/slic3r/GUI/NotificationManager.cpp:1184 +msgid "Export." msgstr "" #: src/slic3r/GUI/NotificationManager.cpp:1184 +msgid "Slicing finished." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1508 +#: src/slic3r/GUI/NotificationManager.cpp:1515 +#: src/slic3r/GUI/NotificationManager.cpp:1531 +#: src/slic3r/GUI/NotificationManager.cpp:1537 +#: src/slic3r/GUI/NotificationManager.cpp:1608 +msgid "ERROR:" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1520 +#: src/slic3r/GUI/NotificationManager.cpp:1547 +#: src/slic3r/GUI/NotificationManager.cpp:1555 +#: src/slic3r/GUI/NotificationManager.cpp:1566 src/slic3r/GUI/Plater.cpp:3001 +msgid "WARNING:" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1659 msgid "Exporting finished." msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:58 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:50 +msgid "Paint-on seam" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:52 +msgid "Sinking" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 msgid "Instances" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:62 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:225 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:98 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 #, possible-c-format msgid "Instance %d" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3980 -#: src/slic3r/GUI/Tab.cpp:4062 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4179 +#: src/slic3r/GUI/Tab.cpp:4264 msgid "Layers" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:96 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 msgid "Range" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:259 +#: src/slic3r/GUI/OpenGLManager.cpp:248 #, possible-c-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" "while OpenGL version %s, render %s, vendor %s was detected." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:262 +#: src/slic3r/GUI/OpenGLManager.cpp:251 msgid "You may need to update your graphics card driver." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:265 +#: src/slic3r/GUI/OpenGLManager.cpp:254 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " -"graphics by running prusa-slicer.exe with the --sw_renderer parameter." +"graphics by running prusa-slicer.exe with the --sw-renderer parameter." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:267 +#: src/slic3r/GUI/OpenGLManager.cpp:256 msgid "Unsupported OpenGL version" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:275 +#: src/slic3r/GUI/OpenGLManager.cpp:264 #, possible-c-format msgid "" "Unable to load the following shaders:\n" "%s" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:276 +#: src/slic3r/GUI/OpenGLManager.cpp:265 msgid "Error loading shaders" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:334 +#: src/slic3r/GUI/OptionsGroup.cpp:333 msgctxt "Layers" msgid "Top" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:334 +#: src/slic3r/GUI/OptionsGroup.cpp:333 msgctxt "Layers" msgid "Bottom" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:51 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:52 msgid "Delete this preset from this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:81 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83 msgid "This printer will be shown in the presets list as" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:155 -msgid "Physical Printer" -msgstr "" - -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:161 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:165 msgid "Type here the name of your printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:172 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:176 msgid "Descriptive name for the printer" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:176 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:180 msgid "Add preset for this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:205 src/slic3r/GUI/Tab.cpp:2078 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2179 msgid "Print Host upload" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:260 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:268 msgid "Connection to printers connected via the print host failed." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:302 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:310 msgid "Test" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:307 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:315 msgid "Could not get a valid Printer Host reference" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 msgid "Success!" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:337 msgid "Refresh Printers" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:356 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:366 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:374 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 msgid "Open CA certificate file" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:395 -#: src/libslic3r/PrintConfig.cpp:124 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:404 +#: src/libslic3r/PrintConfig.cpp:297 msgid "HTTPS CA File" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:396 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:405 #, possible-c-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " "or Keychain." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:397 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:406 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:543 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:625 msgid "The supplied name is empty. It can't be saved." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:547 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:629 msgid "You should change the name of your printer device." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:637 msgid "Printer with name \"%1%\" already exists." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:556 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:638 msgid "Replace?" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:582 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:665 msgid "" "Following printer preset is duplicated:%1%The above preset for printer \"%2%" "\" will be used just once." @@ -5220,675 +6139,633 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:630 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:715 msgid "It's not possible to delete the last related preset for the printer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:163 +#: src/slic3r/GUI/Plater.cpp:172 msgid "Volume" msgstr "" -#: src/slic3r/GUI/Plater.cpp:164 +#: src/slic3r/GUI/Plater.cpp:173 msgid "Facets" msgstr "" -#: src/slic3r/GUI/Plater.cpp:165 +#: src/slic3r/GUI/Plater.cpp:174 msgid "Materials" msgstr "" -#: src/slic3r/GUI/Plater.cpp:168 -msgid "Manifold" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:218 +#: src/slic3r/GUI/Plater.cpp:232 msgid "Sliced Info" msgstr "" -#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1159 +#: src/slic3r/GUI/Plater.cpp:252 src/slic3r/GUI/Plater.cpp:1234 msgid "Used Filament (m)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:238 src/slic3r/GUI/Plater.cpp:1171 +#: src/slic3r/GUI/Plater.cpp:253 src/slic3r/GUI/Plater.cpp:1246 msgid "Used Filament (mm³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:239 src/slic3r/GUI/Plater.cpp:1178 +#: src/slic3r/GUI/Plater.cpp:254 src/slic3r/GUI/Plater.cpp:1253 msgid "Used Filament (g)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:240 +#: src/slic3r/GUI/Plater.cpp:255 msgid "Used Material (unit)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:241 +#: src/slic3r/GUI/Plater.cpp:256 msgid "Cost (money)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:243 +#: src/slic3r/GUI/Plater.cpp:257 src/slic3r/GUI/Plater.cpp:1216 +#: src/slic3r/GUI/Plater.cpp:1303 +msgid "Estimated printing time" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:258 msgid "Number of tool changes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:360 +#: src/slic3r/GUI/Plater.cpp:387 msgid "Select what kind of support do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:362 src/libslic3r/PrintConfig.cpp:2217 -#: src/libslic3r/PrintConfig.cpp:3012 +#: src/slic3r/GUI/Plater.cpp:389 src/libslic3r/PrintConfig.cpp:2490 +#: src/libslic3r/PrintConfig.cpp:3392 msgid "Support on build plate only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:363 src/slic3r/GUI/Plater.cpp:489 +#: src/slic3r/GUI/Plater.cpp:390 src/slic3r/GUI/Plater.cpp:518 msgid "For support enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:364 +#: src/slic3r/GUI/Plater.cpp:391 msgid "Everywhere" msgstr "" -#: src/slic3r/GUI/Plater.cpp:396 src/slic3r/GUI/Tab.cpp:1481 +#: src/slic3r/GUI/Plater.cpp:423 src/slic3r/GUI/Tab.cpp:1527 msgid "Brim" msgstr "" -#: src/slic3r/GUI/Plater.cpp:398 +#: src/slic3r/GUI/Plater.cpp:425 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:406 +#: src/slic3r/GUI/Plater.cpp:433 msgid "Purging volumes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:503 +#: src/slic3r/GUI/Plater.cpp:532 msgid "Select what kind of pad do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:505 +#: src/slic3r/GUI/Plater.cpp:534 msgid "Below object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:506 +#: src/slic3r/GUI/Plater.cpp:535 msgid "Around object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:692 -msgid "SLA print settings" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:753 src/slic3r/GUI/Plater.cpp:6082 +#: src/slic3r/GUI/Plater.cpp:807 src/slic3r/GUI/Plater.cpp:6416 msgid "Send to printer" msgstr "" -#: src/slic3r/GUI/Plater.cpp:768 src/slic3r/GUI/Plater.cpp:3023 -#: src/slic3r/GUI/Plater.cpp:5607 +#: src/slic3r/GUI/Plater.cpp:827 src/slic3r/GUI/Plater.cpp:3134 +#: src/slic3r/GUI/Plater.cpp:5931 msgid "Slice now" msgstr "" -#: src/slic3r/GUI/Plater.cpp:923 +#: src/slic3r/GUI/Plater.cpp:993 msgid "Hold Shift to Slice & Export G-code" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1068 +#: src/slic3r/GUI/Plater.cpp:1165 msgid "%1% (%2$d shell)" msgid_plural "%1% (%2$d shells)" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:1097 -msgid "Yes" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1118 +#: src/slic3r/GUI/Plater.cpp:1191 msgid "Used Material (ml)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1121 +#: src/slic3r/GUI/Plater.cpp:1194 msgid "object" msgid_plural "objects" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:1121 +#: src/slic3r/GUI/Plater.cpp:1194 msgid "supports and pad" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1159 +#: src/slic3r/GUI/Plater.cpp:1234 msgid "Used Filament (in)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1161 src/slic3r/GUI/Plater.cpp:1214 +#: src/slic3r/GUI/Plater.cpp:1236 src/slic3r/GUI/Plater.cpp:1289 msgid "objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1161 src/slic3r/GUI/Plater.cpp:1214 +#: src/slic3r/GUI/Plater.cpp:1236 src/slic3r/GUI/Plater.cpp:1289 msgid "wipe tower" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1171 +#: src/slic3r/GUI/Plater.cpp:1246 msgid "Used Filament (in³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1197 +#: src/slic3r/GUI/Plater.cpp:1272 msgid "Filament at extruder %1%" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1203 +#: src/slic3r/GUI/Plater.cpp:1278 msgid "(including spool)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1212 src/libslic3r/PrintConfig.cpp:847 -#: src/libslic3r/PrintConfig.cpp:2827 src/libslic3r/PrintConfig.cpp:2828 +#: src/slic3r/GUI/Plater.cpp:1287 src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:3207 src/libslic3r/PrintConfig.cpp:3208 msgid "Cost" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1230 +#: src/slic3r/GUI/Plater.cpp:1305 msgid "normal mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1240 +#: src/slic3r/GUI/Plater.cpp:1312 msgid "stealth mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1411 src/slic3r/GUI/Plater.cpp:4942 -#, possible-c-format -msgid "%s - Drop project file" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1418 src/slic3r/GUI/Plater.cpp:4949 -msgid "Open as project" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1419 src/slic3r/GUI/Plater.cpp:4950 -msgid "Import geometry only" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1420 src/slic3r/GUI/Plater.cpp:4951 -msgid "Import config only" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1423 src/slic3r/GUI/Plater.cpp:4954 -msgid "Select an action to apply to the file" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1424 src/slic3r/GUI/Plater.cpp:4955 -msgid "Action" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1432 src/slic3r/GUI/Plater.cpp:4963 -msgid "Don't show again" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1477 src/slic3r/GUI/Plater.cpp:5000 -msgid "You can open only one .gcode file at a time." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1478 src/slic3r/GUI/Plater.cpp:5001 -msgid "Drag and drop G-code file" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1532 src/slic3r/GUI/Plater.cpp:4817 -#: src/slic3r/GUI/Plater.cpp:5055 -msgid "Import Object" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1554 src/slic3r/GUI/Plater.cpp:5081 -msgid "Load File" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1559 src/slic3r/GUI/Plater.cpp:5086 -msgid "Load Files" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1662 +#: src/slic3r/GUI/Plater.cpp:1549 msgid "Fill bed" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1668 +#: src/slic3r/GUI/Plater.cpp:1555 msgid "Optimize Rotation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1674 +#: src/slic3r/GUI/Plater.cpp:1561 msgid "Import SLA archive" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2137 +#: src/slic3r/GUI/Plater.cpp:1599 +msgid "Do you want to save the changes to \"%1%\"?" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2052 #, possible-c-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " "computer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2142 +#: src/slic3r/GUI/Plater.cpp:2057 #, possible-c-format msgid "Ejecting of device %s(%s) has failed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2161 +#: src/slic3r/GUI/Plater.cpp:2076 src/slic3r/GUI/Plater.cpp:4996 msgid "New Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2254 +#: src/slic3r/GUI/Plater.cpp:2177 msgid "Expand sidebar" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2327 -msgid "Loading" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2337 -msgid "Loading file" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2427 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:2355 msgid "" -"The object in file %s looks like saved in inches.\n" -"Should I consider it as a saved in inches and convert it?" +"The preset below was temporarily installed on active instance of PrusaSlicer" msgid_plural "" -"Some objects in file %s look like saved in inches.\n" -"Should I consider them as a saved in inches and convert them?" +"The presets below were temporarily installed on active instance of " +"PrusaSlicer" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2431 -msgid "The object appears to be saved in inches" +#: src/slic3r/GUI/Plater.cpp:2385 +msgid "Failed loading file \"%1%\" due to an invalid configuration." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2439 +#: src/slic3r/GUI/Plater.cpp:2408 +#, possible-c-format +msgid "" +"The dimensions of the object from file %s seem to be defined in meters.\n" +"The internal unit of PrusaSlicer are millimeters. Do you want to recalculate " +"the dimensions of the object?" +msgid_plural "" +"The dimensions of some objects from file %s seem to be defined in meters.\n" +"The internal unit of PrusaSlicer are millimeters. Do you want to recalculate " +"the dimensions of these objects?" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Plater.cpp:2412 src/slic3r/GUI/Plater.cpp:2423 +msgid "The object is too small" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2419 +#, possible-c-format +msgid "" +"The dimensions of the object from file %s seem to be defined in inches.\n" +"The internal unit of PrusaSlicer are millimeters. Do you want to recalculate " +"the dimensions of the object?" +msgid_plural "" +"The dimensions of some objects from file %s seem to be defined in inches.\n" +"The internal unit of PrusaSlicer are millimeters. Do you want to recalculate " +"the dimensions of these objects?" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Plater.cpp:2432 msgid "" "This file contains several objects positioned at multiple heights.\n" -"Instead of considering them as multiple objects, should I consider\n" -"this file as a single object having multiple parts?" +"Instead of considering them as multiple objects, should \n" +"should the file be loaded as a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2442 src/slic3r/GUI/Plater.cpp:2495 +#: src/slic3r/GUI/Plater.cpp:2435 src/slic3r/GUI/Plater.cpp:2490 msgid "Multi-part object detected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2449 +#: src/slic3r/GUI/Plater.cpp:2443 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2450 +#: src/slic3r/GUI/Plater.cpp:2444 msgid "Detected advanced data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2472 +#: src/slic3r/GUI/Plater.cpp:2464 #, possible-c-format msgid "" "You can't to add the object(s) from %s because of one or some of them " "is(are) multi-part" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2492 +#: src/slic3r/GUI/Plater.cpp:2487 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" "these files to represent a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2508 -msgid "Loaded" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2610 +#: src/slic3r/GUI/Plater.cpp:2606 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2611 +#: src/slic3r/GUI/Plater.cpp:2607 msgid "Object too large?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2673 +#: src/slic3r/GUI/Plater.cpp:2684 msgid "Export STL file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2680 +#: src/slic3r/GUI/Plater.cpp:2691 msgid "Export AMF file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2686 +#: src/slic3r/GUI/Plater.cpp:2697 msgid "Save file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2692 +#: src/slic3r/GUI/Plater.cpp:2703 msgid "Export OBJ file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2788 +#: src/slic3r/GUI/Plater.cpp:2800 msgid "Delete Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2811 +msgid "Delete All Objects" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2837 msgid "Reset Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2871 +#: src/slic3r/GUI/Plater.cpp:2918 msgid "" -"The selected object can't be split because it contains more than one volume/" -"material." +"The selected object couldn't be split because it contains only one solid " +"part." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2882 +#: src/slic3r/GUI/Plater.cpp:2925 +msgid "All non-solid parts (modifiers) were deleted" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2927 msgid "Split to Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3007 src/slic3r/GUI/Plater.cpp:3744 +#: src/slic3r/GUI/Plater.cpp:2983 +msgid "" +"An object has custom support enforcers which will not be used because " +"supports are disabled." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2985 +msgid "Enable supports for enforcers only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3115 src/slic3r/GUI/Plater.cpp:4078 msgid "Invalid data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3017 -msgid "Ready to slice" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3055 src/slic3r/GUI/PrintHostDialogs.cpp:275 -msgid "Cancelling" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3074 +#: src/slic3r/GUI/Plater.cpp:3185 msgid "Another export job is currently running." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3191 +#: src/slic3r/GUI/Plater.cpp:3243 src/slic3r/GUI/Plater.cpp:3350 +msgid "Replace from:" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3259 src/slic3r/GUI/Plater.cpp:3366 +msgid "Unable to replace with more than one volume" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3259 src/slic3r/GUI/Plater.cpp:3339 +#: src/slic3r/GUI/Plater.cpp:3366 +msgid "Error during replace" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3331 +msgid "Please select the file to replace" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3339 +msgid "File for the replace wasn't selected" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3501 msgid "Please select the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3226 -msgid "It is not allowed to change the file to reload" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3226 -msgid "Do you want to retry" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3244 -msgid "Reload from:" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3337 -msgid "Unable to reload:" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3342 -msgid "Error during reload" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3361 -msgid "Reload all from disk" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3388 -msgid "" -"ERROR: Please close all manipulators available from the left toolbar before " -"fixing the mesh." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3394 -msgid "Fix through NetFabb" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3411 -msgid "Custom supports and seams were removed after repairing the mesh." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3702 -msgid "There are active warnings concerning sliced models:" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3712 -msgid "generated warnings" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3752 src/slic3r/GUI/PrintHostDialogs.cpp:276 -msgid "Cancelled" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4019 src/slic3r/GUI/Plater.cpp:4043 -msgid "Remove the selected object" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4028 -msgid "Add one more instance of the selected object" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4030 -msgid "Remove one instance of the selected object" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4032 -msgid "Set number of instances" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4032 -msgid "Change the number of instances of the selected object" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4034 -msgid "Fill bed with instances" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4034 -msgid "Fill the remaining area of bed with instances of the selected object" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4053 -msgid "Reload the selected object from disk" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4056 -msgid "Export the selected object as STL file" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4086 -msgid "Along X axis" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4086 -msgid "Mirror the selected object along the X axis" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4088 -msgid "Along Y axis" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4088 -msgid "Mirror the selected object along the Y axis" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4090 -msgid "Along Z axis" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4090 -msgid "Mirror the selected object along the Z axis" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4093 -msgid "Mirror" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4093 -msgid "Mirror the selected object" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4105 -msgid "To objects" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4105 src/slic3r/GUI/Plater.cpp:4125 -msgid "Split the selected object into individual objects" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4107 -msgid "To parts" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4107 src/slic3r/GUI/Plater.cpp:4143 -msgid "Split the selected object into individual sub-parts" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4110 src/slic3r/GUI/Plater.cpp:4125 -#: src/slic3r/GUI/Plater.cpp:4143 src/libslic3r/PrintConfig.cpp:3840 -msgid "Split" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4110 -msgid "Split the selected object" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4132 -msgid "Optimize orientation" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4133 -msgid "Optimize the rotation of the object for better print results." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4213 -msgid "3D editor view" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4585 -msgid "" -"%1% printer was active at the time the target Undo / Redo snapshot was " -"taken. Switching to %1% printer requires reloading of %1% presets." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4789 -msgid "Load Project" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4821 -msgid "Import Objects" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4887 +#: src/slic3r/GUI/Plater.cpp:3533 src/slic3r/GUI/Plater.cpp:5122 msgid "The selected file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4887 +#: src/slic3r/GUI/Plater.cpp:3534 +msgid "differs from the original file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3534 +msgid "Do you want to replace it" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3541 +msgid "It is not allowed to change the file to reload" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3541 +msgid "Do you want to retry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3565 +msgid "Reload from:" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3667 +msgid "Unable to reload:" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3672 +msgid "Error during reload" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3690 +msgid "Reload all from disk" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3724 +msgid "" +"Processing model '@object_name' with more than 1M triangles could be slow. " +"It is highly recommend to reduce amount of triangles." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:4032 +msgid "There are active warnings concerning sliced models:" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:4043 +msgid "generated warnings" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:4367 +msgid "3D editor view" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:4782 +msgid "Undo / Redo is processing" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:4784 +msgid "" +"Switching the printer technology from %1% to %2%.\n" +"Some %1% presets were modified, which will be lost after switching the " +"printer technology." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:4980 +msgid "Creating a new project while the current project is modified." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:4983 +msgid "Creating a new project while some presets are modified." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:4984 +msgid "You can keep presets modifications to the new project or discard them" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:4985 +msgid "" +"You can keep presets modifications to the new project, discard them or save " +"changes as new presets.\n" +"Note, if changes will be saved than new project wouldn't keep them" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:4991 +msgid "New Project is creating" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5021 +msgid "Load Project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5047 src/slic3r/GUI/Plater.cpp:5306 +msgid "Import Object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5051 +msgid "Import Objects" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5122 msgid "does not contain valid gcode." msgstr "" -#: src/slic3r/GUI/Plater.cpp:4888 +#: src/slic3r/GUI/Plater.cpp:5123 msgid "Error while loading .gcode file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5130 +#: src/slic3r/GUI/Plater.cpp:5176 +#, possible-c-format +msgid "%s - Drop project file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5183 +msgid "Open as project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5184 +msgid "Import geometry only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5185 +msgid "Import config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5188 +msgid "Select an action to apply to the file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5193 +msgid "Action" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5209 +msgid "Don't show again" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5250 +msgid "You can open only one .gcode file at a time." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5251 +msgid "Drag and drop G-code file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5328 +msgid "Load File" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5333 +msgid "Load Files" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5378 msgid "All objects will be removed, continue?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5138 +#: src/slic3r/GUI/Plater.cpp:5389 msgid "Delete Selected Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5146 +#: src/slic3r/GUI/Plater.cpp:5397 msgid "Increase Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5180 +#: src/slic3r/GUI/Plater.cpp:5431 msgid "Decrease Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5211 +#: src/slic3r/GUI/Plater.cpp:5482 msgid "Enter the number of copies:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5212 +#: src/slic3r/GUI/Plater.cpp:5483 msgid "Copies of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5216 +#: src/slic3r/GUI/Plater.cpp:5487 #, possible-c-format msgid "Set numbers of copies to %d" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5282 +#: src/slic3r/GUI/Plater.cpp:5560 msgid "Cut by Plane" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5339 +#: src/slic3r/GUI/Plater.cpp:5620 msgid "Save G-code file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5339 -msgid "Save SL1 file as:" +#: src/slic3r/GUI/Plater.cpp:5620 +msgid "Save SL1 / SL1S file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5486 -#, possible-c-format -msgid "STL file exported to %s" +#: src/slic3r/GUI/Plater.cpp:5817 +msgid "" +"The plater is empty.\n" +"Confirm you want to save the project ?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5503 -#, possible-c-format -msgid "AMF file exported to %s" +#: src/slic3r/GUI/Plater.cpp:5817 +msgid "Save project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5506 -#, possible-c-format -msgid "Error exporting AMF file %s" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:5535 -#, possible-c-format -msgid "3MF file exported to %s" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:5540 -#, possible-c-format -msgid "Error exporting 3MF file %s" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:6081 +#: src/slic3r/GUI/Plater.cpp:6415 msgid "Export" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6178 +#: src/slic3r/GUI/Plater.cpp:6449 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"repairing the mesh." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:6563 msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:56 src/slic3r/GUI/Tab.cpp:2112 -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/Tab.cpp:2407 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1082 +#: src/slic3r/GUI/Preferences.cpp:74 src/slic3r/GUI/Tab.cpp:2214 +#: src/slic3r/GUI/Tab.cpp:2437 src/slic3r/GUI/Tab.cpp:2547 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1279 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1667 msgid "General" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:69 +#: src/slic3r/GUI/Preferences.cpp:87 msgid "Remember output directory" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:71 +#: src/slic3r/GUI/Preferences.cpp:89 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:77 +#: src/slic3r/GUI/Preferences.cpp:95 msgid "Auto-center parts" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:79 +#: src/slic3r/GUI/Preferences.cpp:97 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:85 +#: src/slic3r/GUI/Preferences.cpp:103 msgid "Background processing" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:87 +#: src/slic3r/GUI/Preferences.cpp:105 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." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:96 +#: src/slic3r/GUI/Preferences.cpp:114 msgid "" "If enabled, PrusaSlicer will check for the new versions of itself online. " "When a new version becomes available a notification is displayed at the next " @@ -5896,25 +6773,25 @@ msgid "" "notification mechanisms, no automatic installation is done." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:102 +#: src/slic3r/GUI/Preferences.cpp:120 msgid "Export sources full pathnames to 3mf and amf" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:104 +#: src/slic3r/GUI/Preferences.cpp:122 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:114 +#: src/slic3r/GUI/Preferences.cpp:131 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:138 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:147 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -5922,293 +6799,369 @@ msgid "" "startup." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:136 +#: src/slic3r/GUI/Preferences.cpp:152 msgid "Suppress \" - default - \" presets" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:138 +#: src/slic3r/GUI/Preferences.cpp:154 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:144 +#: src/slic3r/GUI/Preferences.cpp:160 msgid "Show incompatible print and filament presets" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:146 +#: src/slic3r/GUI/Preferences.cpp:162 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:152 +#: src/slic3r/GUI/Preferences.cpp:168 msgid "Show drop project dialog" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:154 +#: src/slic3r/GUI/Preferences.cpp:170 msgid "" "When checked, whenever dragging and dropping a project file on the " "application, shows a dialog asking to select the action to take on the file " "to load." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:161 src/slic3r/GUI/Preferences.cpp:165 +#: src/slic3r/GUI/Preferences.cpp:177 src/slic3r/GUI/Preferences.cpp:181 msgid "Allow just a single PrusaSlicer instance" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:163 +#: src/slic3r/GUI/Preferences.cpp:179 msgid "" "On OSX there is always only one instance of app running by default. However " "it is allowed to run multiple instances of same app from the command line. " "In such case this settings will allow only one instance." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:167 +#: src/slic3r/GUI/Preferences.cpp:183 msgid "" "If this is enabled, when starting PrusaSlicer and another instance of the " "same PrusaSlicer is already running, that instance will be reactivated " "instead." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:173 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:671 -msgid "Ask for unsaved changes when closing application" +#: src/slic3r/GUI/Preferences.cpp:189 +msgid "Ask for unsaved changes when closing application or loading new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:175 -msgid "When closing the application, always ask for unsaved changes" +#: src/slic3r/GUI/Preferences.cpp:191 +msgid "" +"Always ask for unsaved changes, when: \n" +"- Closing PrusaSlicer while some presets are modified,\n" +"- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:180 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:672 +#: src/slic3r/GUI/Preferences.cpp:198 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Ask for unsaved changes when selecting new preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:182 -msgid "Always ask for unsaved changes when selecting new preset" +#: src/slic3r/GUI/Preferences.cpp:200 +msgid "" +"Always ask for unsaved changes when selecting new preset or resetting a " +"preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:205 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:894 +msgid "Ask for unsaved changes when creating new project" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:207 +msgid "Always ask for unsaved changes when creating new project" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:214 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:216 msgid "" "If enabled, sets PrusaSlicer G-code Viewer as default application to open ." "gcode files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:201 +#: src/slic3r/GUI/Preferences.cpp:224 msgid "Use Retina resolution for the 3D scene" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:203 +#: src/slic3r/GUI/Preferences.cpp:226 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:211 src/slic3r/GUI/Preferences.cpp:213 +#: src/slic3r/GUI/Preferences.cpp:234 src/slic3r/GUI/Preferences.cpp:236 msgid "Show splash screen" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:220 +#: src/slic3r/GUI/Preferences.cpp:242 +msgid "Clear Undo / Redo stack on new project" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:244 +msgid "" +"Clear Undo / Redo stack on new project or when an existing project is loaded." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:250 msgid "Enable support for legacy 3DConnexion devices" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Preferences.cpp:252 msgid "" "If enabled, the legacy 3DConnexion devices settings dialog is available by " "pressing CTRL+M" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:232 +#: src/slic3r/GUI/Preferences.cpp:261 msgid "Camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:237 +#: src/slic3r/GUI/Preferences.cpp:266 msgid "Use perspective camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:239 +#: src/slic3r/GUI/Preferences.cpp:268 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:244 +#: src/slic3r/GUI/Preferences.cpp:273 msgid "Use free camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:246 +#: src/slic3r/GUI/Preferences.cpp:275 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:251 +#: src/slic3r/GUI/Preferences.cpp:280 msgid "Reverse direction of zoom with mouse wheel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:253 +#: src/slic3r/GUI/Preferences.cpp:282 msgid "If enabled, reverses the direction of zoom with mouse wheel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:261 +#: src/slic3r/GUI/Preferences.cpp:290 msgid "GUI" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:276 +#: src/slic3r/GUI/Preferences.cpp:305 msgid "Sequential slider applied only to top layer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:278 +#: src/slic3r/GUI/Preferences.cpp:307 msgid "" "If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." +"to gcode top layer.If disabled, changes made using the sequential slider, in " +"preview, apply to the whole gcode." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:285 +#: src/slic3r/GUI/Preferences.cpp:314 msgid "Show sidebar collapse/expand button" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:287 +#: src/slic3r/GUI/Preferences.cpp:316 msgid "" "If enabled, the button for the collapse sidebar will be appeared in top " "right corner of the 3D Scene" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:292 +#: src/slic3r/GUI/Preferences.cpp:321 msgid "Suppress to open hyperlink in browser" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:294 +#: src/slic3r/GUI/Preferences.cpp:323 msgid "" "If enabled, the descriptions of configuration parameters in settings tabs " "wouldn't work as hyperlinks. If disabled, the descriptions of configuration " "parameters in settings tabs will work as hyperlinks." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:300 +#: src/slic3r/GUI/Preferences.cpp:329 +msgid "Use colors for axes values in Manipulation panel" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:331 +msgid "" +"If enabled, the axes names and axes values will be colorized according to " +"the axes colors. If disabled, old UI will be used." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:337 +msgid "Order object volumes by types" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:339 +msgid "" +"If enabled, volumes will be always ordered inside the object. Correct order " +"is Model Part, Negative Volume, Modifier, Support Blocker and Support " +"Enforcer. If disabled, you can reorder Model Parts, Negative Volumes and " +"Modifiers. But one of the model parts have to be on the first place." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:346 +msgid "Use Dark color mode (experimental)" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:348 +msgid "" +"If enabled, UI will use Dark mode colors. If disabled, old UI will be used." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:354 +msgid "Set settings tabs as menu items (experimental)" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:356 +msgid "" +"If enabled, Settings Tabs will be placed as menu items. If disabled, old UI " +"will be used." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:363 +msgid "Show \"Tip of the day\" notification after start" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:365 +msgid "If enabled, useful hints are displayed at startup." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:370 msgid "Use custom size for toolbar icons" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:302 +#: src/slic3r/GUI/Preferences.cpp:372 msgid "If enabled, you can change size of toolbar icons manually." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:321 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "Render" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:326 +#: src/slic3r/GUI/Preferences.cpp:396 msgid "Use environment map" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:328 +#: src/slic3r/GUI/Preferences.cpp:398 msgid "If enabled, renders object using the environment map." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:353 -#, possible-c-format -msgid "You need to restart %s to make the changes effective." +#: src/slic3r/GUI/Preferences.cpp:436 +msgid "Changes for the critical options" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:432 +#: src/slic3r/GUI/Preferences.cpp:438 +msgid "" +"Changing fo some options will trigger application restart.\n" +"You will lose content of the plater." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:543 msgid "Icon size in a respect to the default size" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:447 +#: src/slic3r/GUI/Preferences.cpp:558 msgid "Select toolbar icon size in respect to the default one." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:478 +#: src/slic3r/GUI/Preferences.cpp:592 src/slic3r/GUI/Preferences.cpp:603 msgid "Old regular layout with the tab bar" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:479 +#: src/slic3r/GUI/Preferences.cpp:593 msgid "New layout, access via settings button in the top menu" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:480 +#: src/slic3r/GUI/Preferences.cpp:594 src/slic3r/GUI/Preferences.cpp:604 msgid "Settings in non-modal window" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:489 +#: src/slic3r/GUI/Preferences.cpp:612 msgid "Layout Options" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:510 +#: src/slic3r/GUI/Preferences.cpp:655 msgid "Text color Settings" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:224 -#: src/slic3r/GUI/PresetComboBoxes.cpp:262 -#: src/slic3r/GUI/PresetComboBoxes.cpp:788 -#: src/slic3r/GUI/PresetComboBoxes.cpp:838 -#: src/slic3r/GUI/PresetComboBoxes.cpp:963 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1007 +#: src/slic3r/GUI/PresetComboBoxes.cpp:249 +#: src/slic3r/GUI/PresetComboBoxes.cpp:287 +#: src/slic3r/GUI/PresetComboBoxes.cpp:778 +#: src/slic3r/GUI/PresetComboBoxes.cpp:828 +#: src/slic3r/GUI/PresetComboBoxes.cpp:968 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1012 msgid "System presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:266 -#: src/slic3r/GUI/PresetComboBoxes.cpp:842 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1011 +#: src/slic3r/GUI/PresetComboBoxes.cpp:291 +#: src/slic3r/GUI/PresetComboBoxes.cpp:832 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1016 msgid "User presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:277 +#: src/slic3r/GUI/PresetComboBoxes.cpp:302 msgid "Incompatible presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:312 +#: src/slic3r/GUI/PresetComboBoxes.cpp:337 msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:314 +#: src/slic3r/GUI/PresetComboBoxes.cpp:340 msgid "Delete Physical Printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:651 +#: src/slic3r/GUI/PresetComboBoxes.cpp:601 msgid "Click to edit preset" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:707 -#: src/slic3r/GUI/PresetComboBoxes.cpp:737 +#: src/slic3r/GUI/PresetComboBoxes.cpp:691 +#: src/slic3r/GUI/PresetComboBoxes.cpp:721 msgid "Add/Remove presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:712 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3004 +#: src/slic3r/GUI/PresetComboBoxes.cpp:696 +#: src/slic3r/GUI/PresetComboBoxes.cpp:726 src/slic3r/GUI/Tab.cpp:3168 msgid "Add physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:726 +#: src/slic3r/GUI/PresetComboBoxes.cpp:710 msgid "Edit preset" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3004 +#: src/slic3r/GUI/PresetComboBoxes.cpp:714 src/slic3r/GUI/Tab.cpp:3168 msgid "Edit physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:733 +#: src/slic3r/GUI/PresetComboBoxes.cpp:717 msgid "Delete physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:853 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1025 +#: src/slic3r/GUI/PresetComboBoxes.cpp:843 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1030 msgid "Physical printers" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:877 +#: src/slic3r/GUI/PresetComboBoxes.cpp:867 msgid "Add/Remove filaments" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:879 +#: src/slic3r/GUI/PresetComboBoxes.cpp:869 msgid "Add/Remove materials" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:881 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1049 +#: src/slic3r/GUI/PresetComboBoxes.cpp:871 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1054 msgid "Add/Remove printers" msgstr "" @@ -6253,207 +7206,225 @@ msgstr "" msgid "Fan will be turned off." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:159 +#: src/slic3r/GUI/PresetHints.cpp:164 msgid "external perimeters" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:168 +#: src/slic3r/GUI/PresetHints.cpp:165 msgid "perimeters" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:177 +#: src/slic3r/GUI/PresetHints.cpp:168 msgid "infill" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:187 +#: src/slic3r/GUI/PresetHints.cpp:170 msgid "solid infill" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:195 +#: src/slic3r/GUI/PresetHints.cpp:172 msgid "top solid infill" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:206 +#: src/slic3r/GUI/PresetHints.cpp:175 msgid "support" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:177 msgid "support interface" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:222 +#: src/slic3r/GUI/PresetHints.cpp:181 msgid "First layer volumetric" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:222 +#: src/slic3r/GUI/PresetHints.cpp:181 msgid "Bridging volumetric" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:222 +#: src/slic3r/GUI/PresetHints.cpp:181 msgid "Volumetric" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:223 +#: src/slic3r/GUI/PresetHints.cpp:182 msgid "flow rate is maximized" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:226 +#: src/slic3r/GUI/PresetHints.cpp:185 msgid "by the print profile maximum" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:227 +#: src/slic3r/GUI/PresetHints.cpp:186 msgid "when printing" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:228 +#: src/slic3r/GUI/PresetHints.cpp:187 msgid "with a volumetric rate" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:232 +#: src/slic3r/GUI/PresetHints.cpp:191 #, possible-c-format msgid "%3.2f mm³/s at filament speed %3.2f mm/s." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:250 +#: src/slic3r/GUI/PresetHints.cpp:209 msgid "" "Recommended object thin wall thickness: Not available due to invalid layer " "height." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:266 +#: src/slic3r/GUI/PresetHints.cpp:215 #, possible-c-format msgid "Recommended object thin wall thickness for layer height %.2f and" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:273 +#: src/slic3r/GUI/PresetHints.cpp:230 #, possible-c-format msgid "%d lines: %.2f mm" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:277 +#: src/slic3r/GUI/PresetHints.cpp:234 msgid "" "Recommended object thin wall thickness: Not available due to excessively " "small extrusion width." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:306 +#: src/slic3r/GUI/PresetHints.cpp:263 msgid "" "Top / bottom shell thickness hint: Not available due to invalid layer height." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:319 +#: src/slic3r/GUI/PresetHints.cpp:276 msgid "Top shell is %1% mm thick for layer height %2% mm." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:322 +#: src/slic3r/GUI/PresetHints.cpp:279 msgid "Minimum top shell thickness is %1% mm." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:325 +#: src/slic3r/GUI/PresetHints.cpp:282 msgid "Top is open." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:338 +#: src/slic3r/GUI/PresetHints.cpp:295 msgid "Bottom shell is %1% mm thick for layer height %2% mm." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:341 +#: src/slic3r/GUI/PresetHints.cpp:298 msgid "Minimum bottom shell thickness is %1% mm." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:344 +#: src/slic3r/GUI/PresetHints.cpp:301 msgid "Bottom is open." msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:35 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Send G-Code to printer host" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:35 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Upload to Printer Host with the following filename:" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:37 +#: src/slic3r/GUI/PrintHostDialogs.cpp:44 msgid "Start printing after upload" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:45 +#: src/slic3r/GUI/PrintHostDialogs.cpp:52 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:58 +#: src/slic3r/GUI/PrintHostDialogs.cpp:65 msgid "Group" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:187 +#: src/slic3r/GUI/PrintHostDialogs.cpp:97 +#, possible-c-format +msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:230 msgid "ID" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:188 +#: src/slic3r/GUI/PrintHostDialogs.cpp:231 msgid "Progress" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:189 +#: src/slic3r/GUI/PrintHostDialogs.cpp:232 msgid "Status" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:190 +#: src/slic3r/GUI/PrintHostDialogs.cpp:233 msgid "Host" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:191 +#: src/slic3r/GUI/PrintHostDialogs.cpp:234 +msgctxt "OfFile" +msgid "Size" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:235 msgid "Filename" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:192 +#: src/slic3r/GUI/PrintHostDialogs.cpp:236 msgid "Error Message" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:195 +#: src/slic3r/GUI/PrintHostDialogs.cpp:239 msgid "Cancel selected" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:197 +#: src/slic3r/GUI/PrintHostDialogs.cpp:241 msgid "Show error message" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:239 -#: src/slic3r/GUI/PrintHostDialogs.cpp:272 +#: src/slic3r/GUI/PrintHostDialogs.cpp:299 +#: src/slic3r/GUI/PrintHostDialogs.cpp:346 msgid "Enqueued" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:273 +#: src/slic3r/GUI/PrintHostDialogs.cpp:347 msgid "Uploading" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:277 +#: src/slic3r/GUI/PrintHostDialogs.cpp:349 +msgid "Cancelling" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:350 +msgid "Cancelled" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:351 msgid "Completed" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:315 +#: src/slic3r/GUI/PrintHostDialogs.cpp:399 msgid "Error uploading to print host:" msgstr "" -#: src/slic3r/GUI/RammingChart.cpp:23 +#: src/slic3r/GUI/RammingChart.cpp:29 msgid "NO RAMMING AT ALL" msgstr "" -#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 -#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:775 -#: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:2725 -#: src/libslic3r/PrintConfig.cpp:2734 src/libslic3r/PrintConfig.cpp:2844 -#: src/libslic3r/PrintConfig.cpp:2852 src/libslic3r/PrintConfig.cpp:2860 -#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2875 -#: src/libslic3r/PrintConfig.cpp:2883 +#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 +#: src/libslic3r/PrintConfig.cpp:916 src/libslic3r/PrintConfig.cpp:960 +#: src/libslic3r/PrintConfig.cpp:975 src/libslic3r/PrintConfig.cpp:3105 +#: src/libslic3r/PrintConfig.cpp:3114 src/libslic3r/PrintConfig.cpp:3224 +#: src/libslic3r/PrintConfig.cpp:3232 src/libslic3r/PrintConfig.cpp:3240 +#: src/libslic3r/PrintConfig.cpp:3247 src/libslic3r/PrintConfig.cpp:3255 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "s" msgstr "" -#: src/slic3r/GUI/RammingChart.cpp:81 +#: src/slic3r/GUI/RammingChart.cpp:95 msgid "Volumetric speed" msgstr "" -#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:688 -#: src/libslic3r/PrintConfig.cpp:1547 +#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:873 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "mm³/s" msgstr "" @@ -6513,416 +7484,502 @@ msgstr "" msgid "Save preset" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:220 +#: src/slic3r/GUI/SavePresetDialog.cpp:221 msgctxt "PresetName" msgid "Copy" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:278 +#: src/slic3r/GUI/SavePresetDialog.cpp:283 msgid "" "You have selected physical printer \"%1%\" \n" "with related printer preset \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:311 +#: src/slic3r/GUI/SavePresetDialog.cpp:322 msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:314 +#: src/slic3r/GUI/SavePresetDialog.cpp:325 msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:315 +#: src/slic3r/GUI/SavePresetDialog.cpp:326 msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:316 +#: src/slic3r/GUI/SavePresetDialog.cpp:327 msgid "Just switch to \"%1%\" preset" msgstr "" -#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2435 +#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:345 +#: src/slic3r/GUI/Tab.cpp:2575 msgid "Stealth" msgstr "" -#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2429 +#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:345 +#: src/slic3r/GUI/Tab.cpp:2569 msgid "Normal" msgstr "" -#: src/slic3r/GUI/Selection.cpp:172 +#: src/slic3r/GUI/Selection.cpp:166 msgid "Selection-Add" msgstr "" -#: src/slic3r/GUI/Selection.cpp:213 +#: src/slic3r/GUI/Selection.cpp:207 msgid "Selection-Remove" msgstr "" -#: src/slic3r/GUI/Selection.cpp:245 +#: src/slic3r/GUI/Selection.cpp:239 msgid "Selection-Add Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:264 +#: src/slic3r/GUI/Selection.cpp:258 msgid "Selection-Remove Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:282 +#: src/slic3r/GUI/Selection.cpp:276 msgid "Selection-Add Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:301 +#: src/slic3r/GUI/Selection.cpp:295 msgid "Selection-Remove Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:402 +#: src/slic3r/GUI/Selection.cpp:392 msgid "Selection-Add All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:428 +#: src/slic3r/GUI/Selection.cpp:417 msgid "Selection-Remove All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:960 +#: src/slic3r/GUI/Selection.cpp:952 msgid "Scale To Fit" msgstr "" -#: src/slic3r/GUI/Selection.cpp:1487 -msgid "Set Printable Instance" +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:103 +msgid "Data to send" msgstr "" -#: src/slic3r/GUI/Selection.cpp:1487 -msgid "Set Unprintable Instance" +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:453 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:526 +msgid "Send system info" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:83 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:485 +msgid "" +"This is the first time you are running %1%. We would like to ask you to send " +"some of your system information to us. This will only happen once and we " +"will not ask you to do this again (only after you upgrade to the next " +"version)." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:489 +msgid "" +"If we know your hardware, operating system, etc., it will greatly help us in " +"development and prioritization, because we will be able to focus our effort " +"more efficiently and spend time on features that are needed the most." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:492 +msgid "Is it safe?" +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:494 +msgid "" +"We do not send any personal information nor anything that would allow us to " +"identify you later. To detect duplicate entries, a unique number derived " +"from your system is sent, but the source information cannot be " +"reconstructed. Apart from that, only general data about your OS, hardware " +"and OpenGL installation are sent. PrusaSlicer is open source, if you want to " +"inspect the code actually performing the communication, see %1%." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:501 +msgid "Show verbatim data that will be sent" +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:524 +msgid "Ask me next time" +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:525 +msgid "Do not send anything" +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:600 +msgid "System info sent successfully. Thank you." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:603 +msgid "Sending system info failed! Status: %1%" +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:609 +msgid "Sending system info was cancelled." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:616 +msgid "Sending system info..." +msgstr "" + +#: src/slic3r/GUI/SysInfoDialog.cpp:84 msgid "System Information" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:164 +#: src/slic3r/GUI/SysInfoDialog.cpp:150 +msgid "Blacklisted libraries loaded into PrusaSlicer process:" +msgstr "" + +#: src/slic3r/GUI/SysInfoDialog.cpp:162 +msgid "Eigen vectorization supported:" +msgstr "" + +#: src/slic3r/GUI/SysInfoDialog.cpp:169 msgid "Copy to Clipboard" msgstr "" -#: src/slic3r/GUI/Tab.cpp:109 src/libslic3r/PrintConfig.cpp:346 +#: src/slic3r/GUI/Tab.cpp:114 src/libslic3r/PrintConfig.cpp:531 msgid "Compatible printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:110 +#: src/slic3r/GUI/Tab.cpp:115 msgid "Select the printers this profile is compatible with." msgstr "" -#: src/slic3r/GUI/Tab.cpp:115 src/libslic3r/PrintConfig.cpp:361 +#: src/slic3r/GUI/Tab.cpp:120 src/libslic3r/PrintConfig.cpp:546 msgid "Compatible print profiles" msgstr "" -#: src/slic3r/GUI/Tab.cpp:116 +#: src/slic3r/GUI/Tab.cpp:121 msgid "Select the print profiles this profile is compatible with." msgstr "" +#: src/slic3r/GUI/Tab.cpp:216 +msgid "Compare this preset with some another" +msgstr "" + #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:211 +#: src/slic3r/GUI/Tab.cpp:218 #, possible-c-format msgid "Save current %s" msgstr "" -#: src/slic3r/GUI/Tab.cpp:212 +#: src/slic3r/GUI/Tab.cpp:219 msgid "Delete this preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:216 +#: src/slic3r/GUI/Tab.cpp:223 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." msgstr "" -#: src/slic3r/GUI/Tab.cpp:220 +#: src/slic3r/GUI/Tab.cpp:227 msgid "Search in settings [%1%]" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1237 +#: src/slic3r/GUI/Tab.cpp:1285 msgid "Detach from system preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1250 +#: src/slic3r/GUI/Tab.cpp:1298 msgid "" "A copy of the current system preset will be created, which will be detached " "from the system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1251 +#: src/slic3r/GUI/Tab.cpp:1299 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1254 +#: src/slic3r/GUI/Tab.cpp:1302 msgid "Modifications to the current profile will be saved." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1257 -msgid "" -"This action is not revertable.\n" -"Do you want to proceed?" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1259 +#: src/slic3r/GUI/Tab.cpp:1308 msgid "Detach preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1285 +#: src/slic3r/GUI/Tab.cpp:1334 msgid "This is a default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1287 +#: src/slic3r/GUI/Tab.cpp:1336 msgid "This is a system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1289 +#: src/slic3r/GUI/Tab.cpp:1338 msgid "Current preset is inherited from the default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1293 +#: src/slic3r/GUI/Tab.cpp:1342 msgid "Current preset is inherited from" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1297 +#: src/slic3r/GUI/Tab.cpp:1346 msgid "It can't be deleted or modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1298 +#: src/slic3r/GUI/Tab.cpp:1347 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1299 +#: src/slic3r/GUI/Tab.cpp:1348 msgid "To do that please specify a new name for the preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1303 +#: src/slic3r/GUI/Tab.cpp:1352 msgid "Additional information:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1309 +#: src/slic3r/GUI/Tab.cpp:1358 msgid "printer model" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1317 +#: src/slic3r/GUI/Tab.cpp:1366 msgid "default print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1320 +#: src/slic3r/GUI/Tab.cpp:1369 msgid "default filament profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1334 +#: src/slic3r/GUI/Tab.cpp:1383 msgid "default SLA material profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1338 +#: src/slic3r/GUI/Tab.cpp:1387 msgid "default SLA print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1346 +#: src/slic3r/GUI/Tab.cpp:1395 msgid "full profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1347 +#: src/slic3r/GUI/Tab.cpp:1396 msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1385 src/slic3r/GUI/Tab.cpp:4060 +#: src/slic3r/GUI/Tab.cpp:1434 src/slic3r/GUI/Tab.cpp:4262 msgid "Layers and perimeters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1391 +#: src/slic3r/GUI/Tab.cpp:1440 msgid "Vertical shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1403 +#: src/slic3r/GUI/Tab.cpp:1452 msgid "Horizontal shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1404 src/libslic3r/PrintConfig.cpp:2069 +#: src/slic3r/GUI/Tab.cpp:1453 src/libslic3r/PrintConfig.cpp:2318 msgid "Solid layers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1409 +#: src/slic3r/GUI/Tab.cpp:1458 msgid "Minimum shell thickness" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1420 +#: src/slic3r/GUI/Tab.cpp:1469 msgid "Quality (slower slicing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1432 +#: src/slic3r/GUI/Tab.cpp:1483 msgid "Fuzzy skin (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1460 +#: src/slic3r/GUI/Tab.cpp:1506 msgid "Reducing printing time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1494 +#: src/slic3r/GUI/Tab.cpp:1520 src/libslic3r/ExtrusionEntity.cpp:352 +msgid "Skirt" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1542 msgid "Raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1498 +#: src/slic3r/GUI/Tab.cpp:1547 msgid "Options for support material and raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1513 +#: src/slic3r/GUI/Tab.cpp:1567 msgid "Speed for print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1526 +#: src/slic3r/GUI/Tab.cpp:1580 msgid "Speed for non-print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1529 +#: src/slic3r/GUI/Tab.cpp:1584 msgid "Modifiers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1532 +#: src/slic3r/GUI/Tab.cpp:1588 msgid "Acceleration control (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1539 +#: src/slic3r/GUI/Tab.cpp:1596 msgid "Autospeed (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1547 +#: src/slic3r/GUI/Tab.cpp:1604 msgid "Multiple Extruders" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1555 +#: src/slic3r/GUI/Tab.cpp:1612 msgid "Ooze prevention" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1573 +#: src/slic3r/GUI/Tab.cpp:1632 msgid "Extrusion width" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1583 +#: src/slic3r/GUI/Tab.cpp:1642 msgid "Overlap" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1586 +#: src/slic3r/GUI/Tab.cpp:1645 msgid "Flow" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1595 +#: src/slic3r/GUI/Tab.cpp:1655 msgid "Other" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1598 src/slic3r/GUI/Tab.cpp:4136 +#: src/slic3r/GUI/Tab.cpp:1658 src/slic3r/GUI/Tab.cpp:4339 msgid "Output options" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1599 +#: src/slic3r/GUI/Tab.cpp:1659 msgid "Sequential printing" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1601 +#: src/slic3r/GUI/Tab.cpp:1661 msgid "Extruder clearance" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1606 src/slic3r/GUI/Tab.cpp:4137 +#: src/slic3r/GUI/Tab.cpp:1666 src/slic3r/GUI/Tab.cpp:4340 msgid "Output file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1613 src/libslic3r/PrintConfig.cpp:1751 +#: src/slic3r/GUI/Tab.cpp:1673 src/libslic3r/PrintConfig.cpp:1956 msgid "Post-processing scripts" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1619 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:1941 src/slic3r/GUI/Tab.cpp:1942 -#: src/slic3r/GUI/Tab.cpp:2280 src/slic3r/GUI/Tab.cpp:2281 -#: src/slic3r/GUI/Tab.cpp:2356 src/slic3r/GUI/Tab.cpp:2357 -#: src/slic3r/GUI/Tab.cpp:4003 src/slic3r/GUI/Tab.cpp:4004 +#: src/slic3r/GUI/Tab.cpp:1679 src/slic3r/GUI/Tab.cpp:1680 +#: src/slic3r/GUI/Tab.cpp:2034 src/slic3r/GUI/Tab.cpp:2035 +#: src/slic3r/GUI/Tab.cpp:2418 src/slic3r/GUI/Tab.cpp:2419 +#: src/slic3r/GUI/Tab.cpp:2494 src/slic3r/GUI/Tab.cpp:2495 +#: src/slic3r/GUI/Tab.cpp:4202 src/slic3r/GUI/Tab.cpp:4203 msgid "Notes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1626 src/slic3r/GUI/Tab.cpp:1949 -#: src/slic3r/GUI/Tab.cpp:2287 src/slic3r/GUI/Tab.cpp:2363 -#: src/slic3r/GUI/Tab.cpp:4011 src/slic3r/GUI/Tab.cpp:4142 +#: src/slic3r/GUI/Tab.cpp:1686 src/slic3r/GUI/Tab.cpp:2042 +#: src/slic3r/GUI/Tab.cpp:2425 src/slic3r/GUI/Tab.cpp:2501 +#: src/slic3r/GUI/Tab.cpp:4210 src/slic3r/GUI/Tab.cpp:4345 msgid "Dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1627 src/slic3r/GUI/Tab.cpp:1950 -#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2364 -#: src/slic3r/GUI/Tab.cpp:4012 src/slic3r/GUI/Tab.cpp:4143 +#: src/slic3r/GUI/Tab.cpp:1687 src/slic3r/GUI/Tab.cpp:2043 +#: src/slic3r/GUI/Tab.cpp:2426 src/slic3r/GUI/Tab.cpp:2502 +#: src/slic3r/GUI/Tab.cpp:4211 src/slic3r/GUI/Tab.cpp:4346 msgid "Profile dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1707 +#: src/slic3r/GUI/Tab.cpp:1774 +#, possible-c-format +msgid "" +"The following line %s contains reserved keywords.\n" +"Please remove it, as it may cause problems in G-code visualization and " +"printing time estimation." +msgid_plural "" +"The following lines %s contain reserved keywords.\n" +"Please remove them, as they may cause problems in G-code visualization and " +"printing time estimation." +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Tab.cpp:1779 +msgid "Found reserved keywords in" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1793 msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1829 -msgid "Temperature" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1830 +#: src/slic3r/GUI/Tab.cpp:1916 msgid "Nozzle" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1835 +#: src/slic3r/GUI/Tab.cpp:1921 msgid "Bed" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1840 +#: src/slic3r/GUI/Tab.cpp:1926 msgid "Cooling" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1842 src/libslic3r/PrintConfig.cpp:1654 -#: src/libslic3r/PrintConfig.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:1928 src/libslic3r/PrintConfig.cpp:1859 +#: src/libslic3r/PrintConfig.cpp:2889 msgid "Enable" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1853 +#: src/slic3r/GUI/Tab.cpp:1939 msgid "Fan settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1864 +#: src/slic3r/GUI/Tab.cpp:1950 msgid "Cooling thresholds" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1870 +#: src/slic3r/GUI/Tab.cpp:1956 msgid "Filament properties" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1877 +#: src/slic3r/GUI/Tab.cpp:1963 msgid "Print speed override" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1887 +#: src/slic3r/GUI/Tab.cpp:1973 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1890 +#: src/slic3r/GUI/Tab.cpp:1976 msgid "Toolchange parameters with single extruder MM printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1903 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Ramming settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1926 src/slic3r/GUI/Tab.cpp:2219 -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2013 src/slic3r/GUI/Tab.cpp:2330 +#: src/slic3r/GUI/Tab.cpp:3884 src/libslic3r/GCode.cpp:704 +#: src/libslic3r/PrintConfig.cpp:2401 msgid "Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1927 src/slic3r/GUI/Tab.cpp:2220 -#: src/libslic3r/PrintConfig.cpp:2102 src/libslic3r/PrintConfig.cpp:2117 +#: src/slic3r/GUI/Tab.cpp:2014 src/slic3r/GUI/Tab.cpp:2331 +#: src/libslic3r/GCode.cpp:678 src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2366 msgid "Start G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1934 src/slic3r/GUI/Tab.cpp:2227 -#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:476 +#: src/slic3r/GUI/Tab.cpp:2024 src/slic3r/GUI/Tab.cpp:2341 +#: src/libslic3r/GCode.cpp:679 src/libslic3r/PrintConfig.cpp:651 +#: src/libslic3r/PrintConfig.cpp:661 msgid "End G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1984 +#: src/slic3r/GUI/Tab.cpp:2077 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2080 +#: src/slic3r/GUI/Tab.cpp:2181 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -6935,19 +7992,20 @@ msgid "" "physical_printer directory." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2113 src/slic3r/GUI/Tab.cpp:2300 +#: src/slic3r/GUI/Tab.cpp:2215 src/slic3r/GUI/Tab.cpp:2438 msgid "Size and coordinates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2122 src/slic3r/GUI/UnsavedChangesDialog.cpp:1082 +#: src/slic3r/GUI/Tab.cpp:2224 src/slic3r/GUI/UnsavedChangesDialog.cpp:1279 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1667 msgid "Capabilities" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2127 +#: src/slic3r/GUI/Tab.cpp:2229 msgid "Number of extruders of the printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2155 +#: src/slic3r/GUI/Tab.cpp:2258 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -6955,161 +8013,170 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2158 src/slic3r/GUI/Tab.cpp:2566 -#: src/libslic3r/PrintConfig.cpp:1623 +#: src/slic3r/GUI/Tab.cpp:2262 src/slic3r/GUI/Tab.cpp:2703 +#: src/libslic3r/PrintConfig.cpp:1825 msgid "Nozzle diameter" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2234 src/libslic3r/PrintConfig.cpp:209 +#: src/slic3r/GUI/Tab.cpp:2351 src/libslic3r/GCode.cpp:680 +#: src/libslic3r/PrintConfig.cpp:391 msgid "Before layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2241 src/libslic3r/PrintConfig.cpp:1362 +#: src/slic3r/GUI/Tab.cpp:2361 src/libslic3r/GCode.cpp:681 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "After layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2248 src/libslic3r/PrintConfig.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2371 src/libslic3r/GCode.cpp:682 +#: src/libslic3r/PrintConfig.cpp:2773 msgid "Tool change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/Tab.cpp:2381 src/libslic3r/GCode.cpp:683 msgid "Between objects G-code (for sequential printing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2262 +#: src/slic3r/GUI/Tab.cpp:2391 src/libslic3r/GCode.cpp:684 msgid "Color Change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2268 src/libslic3r/PrintConfig.cpp:2143 +#: src/slic3r/GUI/Tab.cpp:2400 src/libslic3r/GCode.cpp:685 +#: src/libslic3r/PrintConfig.cpp:2392 msgid "Pause Print G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2409 src/libslic3r/GCode.cpp:686 msgid "Template Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2307 +#: src/slic3r/GUI/Tab.cpp:2445 msgid "Display" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2322 +#: src/slic3r/GUI/Tab.cpp:2460 msgid "Tilt" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2323 +#: src/slic3r/GUI/Tab.cpp:2461 msgid "Tilt time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2329 src/slic3r/GUI/Tab.cpp:3987 +#: src/slic3r/GUI/Tab.cpp:2467 src/slic3r/GUI/Tab.cpp:4186 msgid "Corrections" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2346 src/slic3r/GUI/Tab.cpp:3983 +#: src/slic3r/GUI/Tab.cpp:2484 src/slic3r/GUI/Tab.cpp:4182 msgid "Exposure" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2405 src/slic3r/GUI/Tab.cpp:2499 -#: src/libslic3r/PrintConfig.cpp:1391 src/libslic3r/PrintConfig.cpp:1426 -#: src/libslic3r/PrintConfig.cpp:1443 src/libslic3r/PrintConfig.cpp:1460 -#: src/libslic3r/PrintConfig.cpp:1476 src/libslic3r/PrintConfig.cpp:1486 -#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1506 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:2630 +#: src/libslic3r/PrintConfig.cpp:1580 src/libslic3r/PrintConfig.cpp:1615 +#: src/libslic3r/PrintConfig.cpp:1632 src/libslic3r/PrintConfig.cpp:1649 +#: src/libslic3r/PrintConfig.cpp:1665 src/libslic3r/PrintConfig.cpp:1675 +#: src/libslic3r/PrintConfig.cpp:1685 src/libslic3r/PrintConfig.cpp:1698 +#: src/libslic3r/PrintConfig.cpp:1708 msgid "Machine limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2428 +#: src/slic3r/GUI/Tab.cpp:2568 msgid "Values in this column are for Normal mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2434 +#: src/slic3r/GUI/Tab.cpp:2574 msgid "Values in this column are for Stealth mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2443 +#: src/slic3r/GUI/Tab.cpp:2583 msgid "Maximum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2448 +#: src/slic3r/GUI/Tab.cpp:2588 msgid "Maximum accelerations" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2455 +#: src/slic3r/GUI/Tab.cpp:2597 msgid "Jerk limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2460 +#: src/slic3r/GUI/Tab.cpp:2602 msgid "Minimum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2524 src/slic3r/GUI/Tab.cpp:2532 +#: src/slic3r/GUI/Tab.cpp:2655 src/slic3r/GUI/Tab.cpp:2664 msgid "Single extruder MM setup" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2533 +#: src/slic3r/GUI/Tab.cpp:2665 msgid "Single extruder multimaterial parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2564 +#: src/slic3r/GUI/Tab.cpp:2700 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2588 +#: src/slic3r/GUI/Tab.cpp:2725 msgid "Layer height limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2593 +#: src/slic3r/GUI/Tab.cpp:2730 msgid "Position (for multi-extruder printers)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2599 +#: src/slic3r/GUI/Tab.cpp:2736 msgid "Only lift Z" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2612 +#: src/slic3r/GUI/Tab.cpp:2749 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2619 +#: src/slic3r/GUI/Tab.cpp:2756 msgid "Reset to Filament Color" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2797 +#: src/slic3r/GUI/Tab.cpp:2936 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" "Shall I disable it in order to enable Firmware Retraction?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2799 +#: src/slic3r/GUI/Tab.cpp:2938 msgid "Firmware Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3390 +#: src/slic3r/GUI/Tab.cpp:3239 +msgid "New printer preset is selecting" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3545 msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3453 +#: src/slic3r/GUI/Tab.cpp:3611 msgid "remove" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3453 +#: src/slic3r/GUI/Tab.cpp:3611 msgid "delete" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3462 +#: src/slic3r/GUI/Tab.cpp:3620 msgid "It's a last preset for this physical printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3467 +#: src/slic3r/GUI/Tab.cpp:3625 msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3479 +#: src/slic3r/GUI/Tab.cpp:3637 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -7117,14 +8184,14 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3484 +#: src/slic3r/GUI/Tab.cpp:3642 msgid "Note, that selected preset will be deleted from this printer too." msgid_plural "" "Note, that selected preset will be deleted from these printers too." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3489 +#: src/slic3r/GUI/Tab.cpp:3647 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -7134,7 +8201,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3494 +#: src/slic3r/GUI/Tab.cpp:3652 msgid "" "Note, that this printer will be deleted after deleting of the selected " "preset." @@ -7144,54 +8211,54 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3499 +#: src/slic3r/GUI/Tab.cpp:3657 msgid "Are you sure you want to %1% the selected preset?" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3504 +#: src/slic3r/GUI/Tab.cpp:3662 msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3585 src/slic3r/GUI/Tab.cpp:3657 +#: src/slic3r/GUI/Tab.cpp:3745 src/slic3r/GUI/Tab.cpp:3818 msgid "Set" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3721 +#: src/slic3r/GUI/Tab.cpp:3910 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:3913 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " "apply a different set of machine limits." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3917 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3939 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3941 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3754 +#: src/slic3r/GUI/Tab.cpp:3943 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3756 +#: src/slic3r/GUI/Tab.cpp:3945 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -7199,23 +8266,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3761 +#: src/slic3r/GUI/Tab.cpp:3950 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3763 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3766 +#: src/slic3r/GUI/Tab.cpp:3955 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3768 +#: src/slic3r/GUI/Tab.cpp:3957 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -7223,13 +8290,13 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3778 +#: src/slic3r/GUI/Tab.cpp:3967 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3780 +#: src/slic3r/GUI/Tab.cpp:3969 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -7237,17 +8304,17 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3783 +#: src/slic3r/GUI/Tab.cpp:3972 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3786 +#: src/slic3r/GUI/Tab.cpp:3975 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3788 +#: src/slic3r/GUI/Tab.cpp:3977 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" @@ -7255,197 +8322,258 @@ msgid "" "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3794 +#: src/slic3r/GUI/Tab.cpp:3983 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3795 +#: src/slic3r/GUI/Tab.cpp:3984 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" "Click to reset current value to the system (or default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3801 +#: src/slic3r/GUI/Tab.cpp:3990 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3802 +#: src/slic3r/GUI/Tab.cpp:3991 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" "Click to reset current value to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3946 src/slic3r/GUI/Tab.cpp:3948 +#: src/slic3r/GUI/Tab.cpp:4145 src/slic3r/GUI/Tab.cpp:4147 msgid "Material" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4070 +#: src/slic3r/GUI/Tab.cpp:4272 msgid "Support head" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4075 +#: src/slic3r/GUI/Tab.cpp:4277 msgid "Support pillar" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4098 +#: src/slic3r/GUI/Tab.cpp:4300 msgid "Connection of the support sticks and junctions" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4103 +#: src/slic3r/GUI/Tab.cpp:4305 msgid "Automatic generation" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4177 +#: src/slic3r/GUI/Tab.cpp:4380 msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" "To enable \"%1%\", please switch off \"%2%\"" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4179 src/libslic3r/PrintConfig.cpp:3091 +#: src/slic3r/GUI/Tab.cpp:4382 src/libslic3r/PrintConfig.cpp:3471 msgid "Object elevation" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4179 src/libslic3r/PrintConfig.cpp:3193 +#: src/slic3r/GUI/Tab.cpp:4382 src/libslic3r/PrintConfig.cpp:3573 msgid "Pad around object" msgstr "" -#: src/slic3r/GUI/Tab.hpp:370 src/slic3r/GUI/Tab.hpp:492 -msgid "Print Settings" -msgstr "" - -#: src/slic3r/GUI/Tab.hpp:401 -msgid "Filament Settings" -msgstr "" - -#: src/slic3r/GUI/Tab.hpp:442 -msgid "Printer Settings" -msgstr "" - -#: src/slic3r/GUI/Tab.hpp:476 -msgid "Material Settings" -msgstr "" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:149 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:158 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:857 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:153 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:162 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1050 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1103 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1118 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1133 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1148 msgid "Undef" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:537 -msgid "PrusaSlicer is closing: Unsaved Changes" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:771 +msgid "Unsaved Changes" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:554 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:789 msgid "Switching Presets: Unsaved Changes" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:620 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:831 msgid "Old Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:621 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:832 msgid "New Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:863 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:866 +msgid "Keep" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:863 msgid "Transfer" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:653 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:870 +msgid "Don't save" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:870 msgid "Discard" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:654 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:876 msgid "Save" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 +msgid "Ask for unsaved changes when ??closing application??" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 +msgid "" +"You will not be asked about the unsaved changes the next time you create new " +"project" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:898 +msgid "" +"You will not be asked about the unsaved changes the next time you switch a " +"preset" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +msgid "" +"You will not be asked about the unsaved changes the next time you: \n" +"- close the application,\n" +"- load project,\n" +"- process Undo / Redo with change of print technologie,\n" +"- take/load snapshot,\n" +"- load config file/bundle,\n" +"- export config_bundle" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:906 msgid "PrusaSlicer will remember your action." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:676 -msgid "" -"You will not be asked about the unsaved changes the next time you close " -"PrusaSlicer." -msgstr "" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:677 -msgid "" -"You will not be asked about the unsaved changes the next time you switch a " -"preset." -msgstr "" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:678 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:907 msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to be asked about unsaved changes again." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:680 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:909 msgid "PrusaSlicer: Don't ask me again" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:747 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:939 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:749 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 +msgid "All settings changes will not be saved" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 msgid "All settings changes will be discarded." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:944 msgid "Save the selected options." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:945 +msgid "Keep the selected settings." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:946 msgid "Transfer the selected settings to the newly selected preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:756 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:950 msgid "Save the selected options to preset \"%1%\"." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:757 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:951 msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1021 -msgid "The following presets were modified:" -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1218 +msgid "The following preset was modified" +msgid_plural "The following presets were modified" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1026 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1224 msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1030 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1228 msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1031 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1229 msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1077 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1275 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "Extruders count" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1199 -msgid "Old value" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1497 +msgid "Show all preset (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1200 -msgid "New value" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1512 +msgid "Left Preset Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1513 +msgid "Right Preset Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1558 +msgid "Compare Presets" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1558 +msgid "Compare %1% Presets" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1620 +msgid "One of the presets doesn't found" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1631 +msgid "Comparable printer presets has different printer technology" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1645 +msgid "Presets are the same" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1653 +msgid "" +"Presets are different.\n" +"Click this button to select the same as left preset for the right preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +msgid "Undef category" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +msgid "Undef group" msgstr "" #: src/slic3r/GUI/UpdateDialogs.cpp:38 @@ -7469,8 +8597,8 @@ msgstr "" msgid "Changelog && Download" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 -#: src/slic3r/GUI/UpdateDialogs.cpp:183 +#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:128 +#: src/slic3r/GUI/UpdateDialogs.cpp:194 msgid "Open changelog page" msgstr "" @@ -7482,15 +8610,26 @@ msgstr "" msgid "Don't notify about new releases any more" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 +msgid "Opening Configuration Wizard" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:277 msgid "Configuration update" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:89 -msgid "Configuration update is available" +#: src/slic3r/GUI/UpdateDialogs.cpp:90 +msgid "" +"PrusaSlicer is not using the newest configuration available.\n" +"Configuration Wizard may not offer the latest printers, filaments and SLA " +"materials to be installed. " msgstr "" #: src/slic3r/GUI/UpdateDialogs.cpp:92 +msgid "Configuration update is available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:95 msgid "" "Would you like to install it?\n" "\n" @@ -7500,20 +8639,24 @@ msgid "" "Updated configuration bundles:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 +#: src/slic3r/GUI/UpdateDialogs.cpp:116 src/slic3r/GUI/UpdateDialogs.cpp:184 msgid "Comment:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210 +#: src/slic3r/GUI/UpdateDialogs.cpp:136 +msgid "Install" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:159 src/slic3r/GUI/UpdateDialogs.cpp:221 #, possible-c-format msgid "%s incompatibility" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:148 +#: src/slic3r/GUI/UpdateDialogs.cpp:159 msgid "You must install a configuration update." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:151 +#: src/slic3r/GUI/UpdateDialogs.cpp:162 #, possible-c-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" @@ -7524,17 +8667,17 @@ msgid "" "Updated configuration bundles:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 +#: src/slic3r/GUI/UpdateDialogs.cpp:202 src/slic3r/GUI/UpdateDialogs.cpp:257 #, possible-c-format msgid "Exit %s" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:211 +#: src/slic3r/GUI/UpdateDialogs.cpp:222 #, possible-c-format msgid "%s configuration is incompatible" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#: src/slic3r/GUI/UpdateDialogs.cpp:227 #, possible-c-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -7547,20 +8690,20 @@ msgid "" "existing configuration before installing files compatible with this %s." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:236 #, possible-c-format msgid "This %s version: %s" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:230 +#: src/slic3r/GUI/UpdateDialogs.cpp:241 msgid "Incompatible bundles:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:249 +#: src/slic3r/GUI/UpdateDialogs.cpp:260 msgid "Re-configure" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:270 +#: src/slic3r/GUI/UpdateDialogs.cpp:281 #, possible-c-format msgid "" "%s now uses an updated configuration structure.\n" @@ -7576,28 +8719,28 @@ msgid "" "choose whether to enable automatic preset updates." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:287 +#: src/slic3r/GUI/UpdateDialogs.cpp:298 msgid "For more information please visit our wiki page:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:317 msgid "Configuration updates" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:317 msgid "No updates available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:309 +#: src/slic3r/GUI/UpdateDialogs.cpp:322 #, possible-c-format msgid "%s has no configuration updates available." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:15 +#: src/slic3r/GUI/WipeTowerDialog.cpp:21 msgid "Ramming customization" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:41 +#: src/slic3r/GUI/WipeTowerDialog.cpp:54 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 " @@ -7610,63 +8753,63 @@ msgid "" "jams, extruder wheel grinding into filament etc." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:83 +#: src/slic3r/GUI/WipeTowerDialog.cpp:114 msgid "Total ramming time" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:85 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 msgid "Total rammed volume" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:89 +#: src/slic3r/GUI/WipeTowerDialog.cpp:120 msgid "Ramming line width" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:91 +#: src/slic3r/GUI/WipeTowerDialog.cpp:122 msgid "Ramming line spacing" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:142 +#: src/slic3r/GUI/WipeTowerDialog.cpp:173 msgid "Wipe tower - Purging volume adjustment" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:254 +#: src/slic3r/GUI/WipeTowerDialog.cpp:299 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:255 +#: src/slic3r/GUI/WipeTowerDialog.cpp:300 msgid "Extruder changed to" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:263 +#: src/slic3r/GUI/WipeTowerDialog.cpp:308 msgid "unloaded" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:264 +#: src/slic3r/GUI/WipeTowerDialog.cpp:309 msgid "loaded" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:276 +#: src/slic3r/GUI/WipeTowerDialog.cpp:352 msgid "Tool #" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:285 +#: src/slic3r/GUI/WipeTowerDialog.cpp:361 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:286 +#: src/slic3r/GUI/WipeTowerDialog.cpp:362 msgid "Volume to purge (mm³) when the filament is being" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +#: src/slic3r/GUI/WipeTowerDialog.cpp:376 msgid "From" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:365 +#: src/slic3r/GUI/WipeTowerDialog.cpp:442 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -7674,25 +8817,26 @@ msgid "" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:377 +#: src/slic3r/GUI/WipeTowerDialog.cpp:454 msgid "Show simplified settings" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:377 +#: src/slic3r/GUI/WipeTowerDialog.cpp:454 msgid "Show advanced settings" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:627 +#: src/slic3r/GUI/wxExtensions.cpp:642 #, possible-c-format msgid "Switch to the %s mode" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:628 +#: src/slic3r/GUI/wxExtensions.cpp:643 #, possible-c-format msgid "Current mode is %s" msgstr "" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:69 +#: src/slic3r/Utils/Repetier.cpp:69 #, possible-c-format msgid "Mismatched type of print host: %s" msgstr "" @@ -7731,87 +8875,66 @@ msgstr "" msgid "Could not get resources to create a new connection" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:219 +#: src/slic3r/Utils/FixModelByWin10.cpp:221 #: src/slic3r/Utils/FixModelByWin10.cpp:359 msgid "Exporting source model" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:235 +#: src/slic3r/Utils/FixModelByWin10.cpp:237 msgid "Failed loading the input model." msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:242 +#: src/slic3r/Utils/FixModelByWin10.cpp:244 msgid "Repairing model by the Netfabb service" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:248 +#: src/slic3r/Utils/FixModelByWin10.cpp:250 msgid "Mesh repair failed." msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:251 -#: src/slic3r/Utils/FixModelByWin10.cpp:378 +#: src/slic3r/Utils/FixModelByWin10.cpp:253 +#: src/slic3r/Utils/FixModelByWin10.cpp:386 msgid "Loading repaired model" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:263 -#: src/slic3r/Utils/FixModelByWin10.cpp:270 -#: src/slic3r/Utils/FixModelByWin10.cpp:302 +#: src/slic3r/Utils/FixModelByWin10.cpp:265 +#: src/slic3r/Utils/FixModelByWin10.cpp:272 +#: src/slic3r/Utils/FixModelByWin10.cpp:304 msgid "Saving mesh into the 3MF container failed." msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:340 -msgid "Model fixing" -msgstr "" - -#: src/slic3r/Utils/FixModelByWin10.cpp:341 -msgid "Exporting model" -msgstr "" - -#: src/slic3r/Utils/FixModelByWin10.cpp:368 +#: src/slic3r/Utils/FixModelByWin10.cpp:376 msgid "Export of a temporary 3mf file failed" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:383 +#: src/slic3r/Utils/FixModelByWin10.cpp:392 msgid "Import of the repaired 3mf file failed" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:385 +#: src/slic3r/Utils/FixModelByWin10.cpp:394 msgid "Repaired 3MF file does not contain any object" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:387 +#: src/slic3r/Utils/FixModelByWin10.cpp:396 msgid "Repaired 3MF file contains more than one object" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:389 +#: src/slic3r/Utils/FixModelByWin10.cpp:398 msgid "Repaired 3MF file does not contain any volume" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:391 +#: src/slic3r/Utils/FixModelByWin10.cpp:400 msgid "Repaired 3MF file contains more than one volume" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:400 +#: src/slic3r/Utils/FixModelByWin10.cpp:410 msgid "Model repair finished" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:406 +#: src/slic3r/Utils/FixModelByWin10.cpp:416 msgid "Model repair canceled" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:423 -msgid "Model repaired successfully" -msgstr "" - -#: src/slic3r/Utils/FixModelByWin10.cpp:423 -#: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model Repair by the Netfabb service" -msgstr "" - -#: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed:" -msgstr "" - #: src/slic3r/Utils/FlashAir.cpp:58 msgid "Upload not enabled on FlashAir card." msgstr "" @@ -7830,37 +8953,64 @@ msgid "" "is required." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:83 +#: src/slic3r/Utils/OctoPrint.cpp:87 msgid "Connection to OctoPrint works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:89 +#: src/slic3r/Utils/OctoPrint.cpp:93 msgid "Could not connect to OctoPrint" msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:91 +#: src/slic3r/Utils/OctoPrint.cpp:95 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:185 -msgid "Connection to Prusa SL1 works correctly." +#: src/slic3r/Utils/OctoPrint.cpp:192 +msgid "Connection to Prusa SL1 / SL1S works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:191 +#: src/slic3r/Utils/OctoPrint.cpp:198 msgid "Could not connect to Prusa SLA" msgstr "" +#: src/slic3r/Utils/OctoPrint.cpp:236 +msgid "Connection to PrusaLink works correctly." +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:242 +msgid "Could not connect to PrusaLink" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:65 +msgid "Copying of file %1% to %2% failed: %3%" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:593 +#: src/slic3r/Utils/PresetUpdater.cpp:610 +msgid "Continue and install configuration updates?" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:725 +msgid "" +"Configuration Updates causes a lost of preset modification.\n" +"So, check unsaved changes and save them if necessary." +msgstr "" + #: src/slic3r/Utils/PresetUpdater.cpp:727 +msgid "Updater is processing" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:756 #, possible-c-format msgid "requires min. %s and max. %s" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:731 +#: src/slic3r/Utils/PresetUpdater.cpp:760 #, possible-c-format msgid "requires min. %s" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:734 +#: src/slic3r/Utils/PresetUpdater.cpp:763 #, possible-c-format msgid "requires max. %s" msgstr "" @@ -7891,31 +9041,82 @@ msgstr "" msgid "Open G-code file:" msgstr "" -#: src/libslic3r/GCode.cpp:518 -msgid "There is an object with no extrusions on the first layer." +#: src/slic3r/Utils/Repetier.cpp:84 +msgid "Connection to Repetier works correctly." msgstr "" -#: src/libslic3r/GCode.cpp:536 -msgid "Empty layers detected, the output would not be printable." +#: src/slic3r/Utils/Repetier.cpp:90 +msgid "Could not connect to Repetier" msgstr "" -#: src/libslic3r/GCode.cpp:537 -msgid "Print z" +#: src/slic3r/Utils/Repetier.cpp:92 +msgid "Note: Repetier version at least 0.90.0 is required." msgstr "" -#: src/libslic3r/GCode.cpp:538 +#: src/slic3r/Utils/Repetier.cpp:240 +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" + +#: src/slic3r/Utils/Repetier.cpp:247 +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#: src/slic3r/Utils/Repetier.cpp:260 +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#: src/libslic3r/GCode.cpp:521 +msgid "There is an object with no extrusions in the first layer." +msgstr "" + +#: src/libslic3r/GCode.cpp:540 +msgid "" +"Empty layer detected between heights %1% and %2%. Make sure the object is " +"printable." +msgstr "" + +#: src/libslic3r/GCode.cpp:543 +msgid "Object name: %1%" +msgstr "" + +#: src/libslic3r/GCode.cpp:544 msgid "" "This is usually caused by negligibly small extrusions or by a faulty model. " "Try to repair the model or change its orientation on the bed." msgstr "" -#: src/libslic3r/GCode.cpp:1274 +#: src/libslic3r/GCode.cpp:689 +msgid "Filament Start G-code" +msgstr "" + +#: src/libslic3r/GCode.cpp:696 +msgid "Filament End G-code" +msgstr "" + +#: src/libslic3r/GCode.cpp:735 +msgid "Found reserved keyword(s) into custom g-code:" +msgstr "" + +#: src/libslic3r/GCode.cpp:737 +msgid "" +"This may cause problems in g-code visualization and printing time estimation." +msgstr "" + +#: src/libslic3r/GCode.cpp:1391 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." msgstr "" -#: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:360 +#: src/libslic3r/ExtrusionEntity.cpp:326 src/libslic3r/ExtrusionEntity.cpp:362 msgid "Mixed" msgstr "" @@ -7924,13 +9125,31 @@ msgid "" "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1641 +#: src/libslic3r/Format/3mf.cpp:1715 msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" -#: src/libslic3r/Format/AMF.cpp:958 +#: src/libslic3r/Format/3mf.cpp:1726 +msgid "" +"The selected 3MF contains FDM supports painted object using a newer version " +"of PrusaSlicer and is not compatible." +msgstr "" + +#: src/libslic3r/Format/3mf.cpp:1730 +msgid "" +"The selected 3MF contains seam painted object using a newer version of " +"PrusaSlicer and is not compatible." +msgstr "" + +#: src/libslic3r/Format/3mf.cpp:1734 +msgid "" +"The selected 3MF contains multi-material painted object using a newer " +"version of PrusaSlicer and is not compatible." +msgstr "" + +#: src/libslic3r/Format/AMF.cpp:988 msgid "" "The selected amf file has been saved with a newer version of %1% and is not " "compatible." @@ -8060,117 +9279,113 @@ msgstr "" msgid "write calledback failed" msgstr "" -#: src/libslic3r/Preset.cpp:1304 -msgid "filament" -msgstr "" - -#: src/libslic3r/Print.cpp:1257 +#: src/libslic3r/Print.cpp:445 msgid "All objects are outside of the print volume." msgstr "" -#: src/libslic3r/Print.cpp:1260 +#: src/libslic3r/Print.cpp:448 msgid "The supplied settings will cause an empty print." msgstr "" -#: src/libslic3r/Print.cpp:1264 +#: src/libslic3r/Print.cpp:452 msgid "Some objects are too close; your extruder will collide with them." msgstr "" -#: src/libslic3r/Print.cpp:1266 +#: src/libslic3r/Print.cpp:454 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" -#: src/libslic3r/Print.cpp:1275 +#: src/libslic3r/Print.cpp:463 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " "\"complete_objects\"." msgstr "" -#: src/libslic3r/Print.cpp:1283 +#: src/libslic3r/Print.cpp:467 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "" -#: src/libslic3r/Print.cpp:1296 +#: src/libslic3r/Print.cpp:480 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." msgstr "" -#: src/libslic3r/Print.cpp:1302 +#: src/libslic3r/Print.cpp:486 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." msgstr "" -#: src/libslic3r/Print.cpp:1304 +#: src/libslic3r/Print.cpp:488 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." msgstr "" -#: src/libslic3r/Print.cpp:1306 +#: src/libslic3r/Print.cpp:490 msgid "Ooze prevention is currently not supported with the wipe tower enabled." msgstr "" -#: src/libslic3r/Print.cpp:1308 +#: src/libslic3r/Print.cpp:492 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" -#: src/libslic3r/Print.cpp:1310 +#: src/libslic3r/Print.cpp:494 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." msgstr "" -#: src/libslic3r/Print.cpp:1331 +#: src/libslic3r/Print.cpp:515 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" msgstr "" -#: src/libslic3r/Print.cpp:1333 +#: src/libslic3r/Print.cpp:517 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" msgstr "" -#: src/libslic3r/Print.cpp:1335 +#: src/libslic3r/Print.cpp:520 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" msgstr "" -#: src/libslic3r/Print.cpp:1337 +#: src/libslic3r/Print.cpp:522 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "" -#: src/libslic3r/Print.cpp:1379 +#: src/libslic3r/Print.cpp:535 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" msgstr "" -#: src/libslic3r/Print.cpp:1405 +#: src/libslic3r/Print.cpp:557 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" -#: src/libslic3r/Print.cpp:1418 +#: src/libslic3r/Print.cpp:570 msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:1421 +#: src/libslic3r/Print.cpp:573 msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:1432 +#: src/libslic3r/Print.cpp:584 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -8178,13 +9393,13 @@ msgid "" "same diameter." msgstr "" -#: src/libslic3r/Print.cpp:1440 +#: src/libslic3r/Print.cpp:592 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." msgstr "" -#: src/libslic3r/Print.cpp:1444 +#: src/libslic3r/Print.cpp:596 msgid "" "The Wipe Tower currently supports the non-soluble supports only if they are " "printed with the current extruder without triggering a tool change. (both " @@ -8192,197 +9407,205 @@ msgid "" "set to 0)." msgstr "" -#: src/libslic3r/Print.cpp:1466 +#: src/libslic3r/Print.cpp:632 msgid "First layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:1471 +#: src/libslic3r/Print.cpp:637 msgid "Layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:1630 +#: src/libslic3r/Print.cpp:791 msgid "Infilling layers" msgstr "" -#: src/libslic3r/Print.cpp:1656 -msgid "Generating skirt" +#: src/libslic3r/Print.cpp:813 +msgid "Generating skirt and brim" msgstr "" -#: src/libslic3r/Print.cpp:1665 -msgid "Generating brim" -msgstr "" - -#: src/libslic3r/Print.cpp:1691 +#: src/libslic3r/Print.cpp:861 msgid "Exporting G-code" msgstr "" -#: src/libslic3r/Print.cpp:1695 +#: src/libslic3r/Print.cpp:865 msgid "Generating G-code" msgstr "" -#: src/libslic3r/SLA/Pad.cpp:532 +#: src/libslic3r/SLA/Pad.cpp:533 msgid "Pad brim size is too small for the current configuration." msgstr "" -#: src/libslic3r/SLAPrint.cpp:630 +#: src/libslic3r/SLAPrint.cpp:628 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." msgstr "" -#: src/libslic3r/SLAPrint.cpp:642 +#: src/libslic3r/SLAPrint.cpp:640 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." msgstr "" -#: src/libslic3r/SLAPrint.cpp:648 +#: src/libslic3r/SLAPrint.cpp:646 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " "the 'Pad object gap' parameter to avoid this." msgstr "" -#: src/libslic3r/SLAPrint.cpp:663 +#: src/libslic3r/SLAPrint.cpp:661 msgid "Exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:670 +#: src/libslic3r/SLAPrint.cpp:668 msgid "Initial exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:786 +#: src/libslic3r/SLAPrint.cpp:784 msgid "Slicing done" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:44 +#: src/libslic3r/SLAPrintSteps.cpp:45 msgid "Hollowing model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:45 +#: src/libslic3r/SLAPrintSteps.cpp:46 msgid "Drilling holes into model." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:46 +#: src/libslic3r/SLAPrintSteps.cpp:47 msgid "Slicing model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359 +#: src/libslic3r/SLAPrintSteps.cpp:48 src/libslic3r/SLAPrintSteps.cpp:632 msgid "Generating support points" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:49 msgid "Generating support tree" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:50 msgid "Generating pad" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:50 +#: src/libslic3r/SLAPrintSteps.cpp:51 msgid "Slicing supports" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:65 +#: src/libslic3r/SLAPrintSteps.cpp:66 msgid "Merging slices and calculating statistics" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:66 +#: src/libslic3r/SLAPrintSteps.cpp:67 msgid "Rasterizing layers" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:192 +#: src/libslic3r/SLAPrintSteps.cpp:426 msgid "Too many overlapping holes." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:201 +#: src/libslic3r/SLAPrintSteps.cpp:433 +msgid "" +"Mesh to be hollowed is not suitable for hollowing (does not bound a volume)." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:441 +msgid "Unable to drill the current configuration of holes into the model." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:461 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:247 +#: src/libslic3r/SLAPrintSteps.cpp:467 +msgid "Failed to drill some holes into the model" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:511 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420 -#: src/libslic3r/SLAPrintSteps.cpp:459 +#: src/libslic3r/SLAPrintSteps.cpp:684 src/libslic3r/SLAPrintSteps.cpp:693 +#: src/libslic3r/SLAPrintSteps.cpp:731 msgid "Visualizing supports" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:451 +#: src/libslic3r/SLAPrintSteps.cpp:723 msgid "No pad can be generated for this model with the current configuration" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:619 +#: src/libslic3r/SLAPrintSteps.cpp:847 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." msgstr "" -#: src/libslic3r/PrintBase.cpp:77 +#: src/libslic3r/PrintBase.cpp:78 msgid "Failed processing of the output_filename_format template." msgstr "" -#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44 +#: src/libslic3r/PrintConfig.cpp:213 src/libslic3r/PrintConfig.cpp:214 msgid "Printer technology" msgstr "" -#: src/libslic3r/PrintConfig.cpp:51 +#: src/libslic3r/PrintConfig.cpp:221 msgid "Bed shape" msgstr "" -#: src/libslic3r/PrintConfig.cpp:56 +#: src/libslic3r/PrintConfig.cpp:226 msgid "Bed custom texture" msgstr "" -#: src/libslic3r/PrintConfig.cpp:61 +#: src/libslic3r/PrintConfig.cpp:231 msgid "Bed custom model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:66 +#: src/libslic3r/PrintConfig.cpp:236 +msgid "Elephant foot compensation" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:238 +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 "" + +#: src/libslic3r/PrintConfig.cpp:246 msgid "G-code thumbnails" msgstr "" -#: src/libslic3r/PrintConfig.cpp:67 +#: src/libslic3r/PrintConfig.cpp:247 msgid "" -"Picture sizes to be stored into a .gcode and .sl1 files, in the following " -"format: \"XxY, XxY, ...\"" +"Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " +"following format: \"XxY, XxY, ...\"" msgstr "" -#: src/libslic3r/PrintConfig.cpp:75 +#: src/libslic3r/PrintConfig.cpp:255 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 "" -#: src/libslic3r/PrintConfig.cpp:82 +#: src/libslic3r/PrintConfig.cpp:262 msgid "Max print height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:83 +#: src/libslic3r/PrintConfig.cpp:263 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." msgstr "" -#: src/libslic3r/PrintConfig.cpp:91 -msgid "Slice gap closing radius" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:93 -msgid "" -"Cracks smaller than 2x gap closing radius are being filled during the " -"triangle mesh slicing. The gap closing operation may reduce the final print " -"resolution, therefore it is advisable to keep the value reasonably low." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:101 +#: src/libslic3r/PrintConfig.cpp:271 msgid "Hostname, IP or URL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:102 +#: src/libslic3r/PrintConfig.cpp:272 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. Print host " @@ -8391,77 +9614,78 @@ msgid "" "password@your-octopi-address/" msgstr "" -#: src/libslic3r/PrintConfig.cpp:110 +#: src/libslic3r/PrintConfig.cpp:281 msgid "API Key / Password" msgstr "" -#: src/libslic3r/PrintConfig.cpp:111 +#: src/libslic3r/PrintConfig.cpp:282 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." msgstr "" -#: src/libslic3r/PrintConfig.cpp:118 +#: src/libslic3r/PrintConfig.cpp:290 msgid "Name of the printer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:125 +#: src/libslic3r/PrintConfig.cpp:298 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " "is used." msgstr "" -#: src/libslic3r/PrintConfig.cpp:131 -msgid "Elephant foot compensation" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:133 -msgid "" -"The first layer will be shrunk in the XY plane by the configured value to " -"compensate for the 1st layer squish aka an Elephant Foot effect." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:149 +#: src/libslic3r/PrintConfig.cpp:314 msgid "Password" msgstr "" -#: src/libslic3r/PrintConfig.cpp:155 -msgid "Printer preset name" +#: src/libslic3r/PrintConfig.cpp:322 +msgid "Ignore HTTPS certificate revocation checks" msgstr "" -#: src/libslic3r/PrintConfig.cpp:156 -msgid "Related printer preset name" +#: src/libslic3r/PrintConfig.cpp:323 +msgid "" +"Ignore HTTPS certificate revocation checks in case of missing or offline " +"distribution points. One may want to enable this option for self signed " +"certificates if connection fails." msgstr "" -#: src/libslic3r/PrintConfig.cpp:161 +#: src/libslic3r/PrintConfig.cpp:330 +msgid "Printer preset names" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:331 +msgid "Names of presets related to the physical printer" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:336 msgid "Authorization Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:166 +#: src/libslic3r/PrintConfig.cpp:341 msgid "API key" msgstr "" -#: src/libslic3r/PrintConfig.cpp:167 +#: src/libslic3r/PrintConfig.cpp:342 msgid "HTTP digest" msgstr "" -#: src/libslic3r/PrintConfig.cpp:180 +#: src/libslic3r/PrintConfig.cpp:362 msgid "Avoid crossing perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:181 +#: src/libslic3r/PrintConfig.cpp:363 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 "" -#: src/libslic3r/PrintConfig.cpp:188 +#: src/libslic3r/PrintConfig.cpp:370 msgid "Avoid crossing perimeters - Max detour length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:190 +#: src/libslic3r/PrintConfig.cpp:372 msgid "" "The maximum detour length for avoid crossing perimeters. If the detour is " "longer than this value, avoid crossing perimeters is not applied for this " @@ -8469,36 +9693,36 @@ msgid "" "as percentage (for example 50%) of a direct travel path." msgstr "" -#: src/libslic3r/PrintConfig.cpp:193 +#: src/libslic3r/PrintConfig.cpp:375 msgid "mm or % (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:381 src/libslic3r/PrintConfig.cpp:2736 msgid "Other layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:200 +#: src/libslic3r/PrintConfig.cpp:382 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:203 +#: src/libslic3r/PrintConfig.cpp:385 msgid "Bed temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:210 +#: src/libslic3r/PrintConfig.cpp:392 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 "" -#: src/libslic3r/PrintConfig.cpp:220 +#: src/libslic3r/PrintConfig.cpp:402 msgid "Between objects G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:221 +#: src/libslic3r/PrintConfig.cpp:403 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -8508,81 +9732,82 @@ msgid "" "S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:232 +#: src/libslic3r/PrintConfig.cpp:414 msgid "Number of solid layers to generate on bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:233 +#: src/libslic3r/PrintConfig.cpp:415 msgid "Bottom solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:241 +#: src/libslic3r/PrintConfig.cpp:423 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." msgstr "" -#: src/libslic3r/PrintConfig.cpp:243 +#: src/libslic3r/PrintConfig.cpp:425 msgid "Minimum bottom shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:431 msgid "Bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:250 +#: src/libslic3r/PrintConfig.cpp:432 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:252 src/libslic3r/PrintConfig.cpp:420 -#: src/libslic3r/PrintConfig.cpp:965 src/libslic3r/PrintConfig.cpp:1168 -#: src/libslic3r/PrintConfig.cpp:1449 src/libslic3r/PrintConfig.cpp:1498 -#: src/libslic3r/PrintConfig.cpp:1508 src/libslic3r/PrintConfig.cpp:1701 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:1150 src/libslic3r/PrintConfig.cpp:1159 +#: src/libslic3r/PrintConfig.cpp:1348 src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1689 src/libslic3r/PrintConfig.cpp:1700 +#: src/libslic3r/PrintConfig.cpp:1710 src/libslic3r/PrintConfig.cpp:1906 msgid "mm/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:258 +#: src/libslic3r/PrintConfig.cpp:440 msgid "Bridging angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:260 +#: src/libslic3r/PrintConfig.cpp:442 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 "" -#: src/libslic3r/PrintConfig.cpp:263 src/libslic3r/PrintConfig.cpp:877 -#: src/libslic3r/PrintConfig.cpp:1942 src/libslic3r/PrintConfig.cpp:1952 -#: src/libslic3r/PrintConfig.cpp:2210 src/libslic3r/PrintConfig.cpp:2365 -#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:3065 -#: src/libslic3r/PrintConfig.cpp:3186 +#: src/libslic3r/PrintConfig.cpp:445 src/libslic3r/PrintConfig.cpp:1062 +#: src/libslic3r/PrintConfig.cpp:2184 src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2483 src/libslic3r/PrintConfig.cpp:2721 +#: src/libslic3r/PrintConfig.cpp:2936 src/libslic3r/PrintConfig.cpp:3445 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "°" msgstr "" -#: src/libslic3r/PrintConfig.cpp:269 +#: src/libslic3r/PrintConfig.cpp:451 msgid "Bridges fan speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:270 +#: src/libslic3r/PrintConfig.cpp:452 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "" -#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:889 -#: src/libslic3r/PrintConfig.cpp:1337 src/libslic3r/PrintConfig.cpp:1516 -#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1834 -#: src/libslic3r/PrintConfig.cpp:2742 src/libslic3r/PrintConfig.cpp:2979 -#: src/libslic3r/PrintConfig.cpp:3105 +#: src/libslic3r/PrintConfig.cpp:453 src/libslic3r/PrintConfig.cpp:1074 +#: src/libslic3r/PrintConfig.cpp:1526 src/libslic3r/PrintConfig.cpp:1718 +#: src/libslic3r/PrintConfig.cpp:1781 src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2076 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3359 src/libslic3r/PrintConfig.cpp:3485 msgid "%" msgstr "" -#: src/libslic3r/PrintConfig.cpp:278 +#: src/libslic3r/PrintConfig.cpp:460 msgid "Bridge flow ratio" msgstr "" -#: src/libslic3r/PrintConfig.cpp:280 +#: src/libslic3r/PrintConfig.cpp:462 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -8590,118 +9815,121 @@ msgid "" "before tweaking this." msgstr "" -#: src/libslic3r/PrintConfig.cpp:290 +#: src/libslic3r/PrintConfig.cpp:472 msgid "Bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:292 +#: src/libslic3r/PrintConfig.cpp:474 msgid "Speed for printing bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:293 src/libslic3r/PrintConfig.cpp:696 -#: src/libslic3r/PrintConfig.cpp:704 src/libslic3r/PrintConfig.cpp:713 -#: src/libslic3r/PrintConfig.cpp:721 src/libslic3r/PrintConfig.cpp:748 -#: src/libslic3r/PrintConfig.cpp:767 src/libslic3r/PrintConfig.cpp:1104 -#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1356 -#: src/libslic3r/PrintConfig.cpp:1432 src/libslic3r/PrintConfig.cpp:1466 -#: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1488 -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1597 -#: src/libslic3r/PrintConfig.cpp:1731 src/libslic3r/PrintConfig.cpp:1909 -#: src/libslic3r/PrintConfig.cpp:1918 src/libslic3r/PrintConfig.cpp:2344 -#: src/libslic3r/PrintConfig.cpp:2471 +#: src/libslic3r/PrintConfig.cpp:475 src/libslic3r/PrintConfig.cpp:881 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:898 +#: src/libslic3r/PrintConfig.cpp:906 src/libslic3r/PrintConfig.cpp:933 +#: src/libslic3r/PrintConfig.cpp:952 src/libslic3r/PrintConfig.cpp:1282 +#: src/libslic3r/PrintConfig.cpp:1463 src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1621 src/libslic3r/PrintConfig.cpp:1655 +#: src/libslic3r/PrintConfig.cpp:1667 src/libslic3r/PrintConfig.cpp:1677 +#: src/libslic3r/PrintConfig.cpp:1740 src/libslic3r/PrintConfig.cpp:1799 +#: src/libslic3r/PrintConfig.cpp:1936 src/libslic3r/PrintConfig.cpp:2151 +#: src/libslic3r/PrintConfig.cpp:2160 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2834 src/libslic3r/PrintConfig.cpp:2844 msgid "mm/s" msgstr "" -#: src/libslic3r/PrintConfig.cpp:300 +#: src/libslic3r/PrintConfig.cpp:482 msgid "Brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:302 +#: src/libslic3r/PrintConfig.cpp:484 msgid "" "Horizontal width of the brim that will be printed around each object on the " -"first layer." +"first layer.When raft is used, no brim is generated (use " +"raft_first_layer_expansion)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:309 +#: src/libslic3r/PrintConfig.cpp:493 msgid "Brim type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:311 +#: src/libslic3r/PrintConfig.cpp:495 msgid "" "The places where the brim will be printed around each object on the first " "layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:317 +#: src/libslic3r/PrintConfig.cpp:501 msgid "No brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:318 +#: src/libslic3r/PrintConfig.cpp:502 msgid "Outer brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:319 +#: src/libslic3r/PrintConfig.cpp:503 msgid "Inner brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:320 +#: src/libslic3r/PrintConfig.cpp:504 msgid "Outer and inner brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:325 -msgid "Brim offset" +#: src/libslic3r/PrintConfig.cpp:509 +msgid "Brim separation gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:327 -msgid "The offset of the brim from the printed object." +#: src/libslic3r/PrintConfig.cpp:511 +msgid "" +"Offset of brim from the printed object. The offset is applied after the " +"elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:333 +#: src/libslic3r/PrintConfig.cpp:518 msgid "Clip multi-part objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:334 +#: src/libslic3r/PrintConfig.cpp:519 msgid "" "When printing multi-material objects, this settings will make Slic3r to clip " "the overlapping object parts one by the other (2nd part will be clipped by " "the 1st, 3rd part will be clipped by the 1st and 2nd etc)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:341 +#: src/libslic3r/PrintConfig.cpp:526 msgid "Colorprint height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:342 +#: src/libslic3r/PrintConfig.cpp:527 msgid "Heights at which a filament change is to occur." msgstr "" -#: src/libslic3r/PrintConfig.cpp:352 +#: src/libslic3r/PrintConfig.cpp:537 msgid "Compatible printers condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:353 +#: src/libslic3r/PrintConfig.cpp:538 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " "compatible with the active printer profile." msgstr "" -#: src/libslic3r/PrintConfig.cpp:367 +#: src/libslic3r/PrintConfig.cpp:552 msgid "Compatible print profiles condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:368 +#: src/libslic3r/PrintConfig.cpp:553 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " "compatible with the active print profile." msgstr "" -#: src/libslic3r/PrintConfig.cpp:385 +#: src/libslic3r/PrintConfig.cpp:570 msgid "Complete individual objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:386 +#: src/libslic3r/PrintConfig.cpp:571 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). " @@ -8709,97 +9937,97 @@ msgid "" "warn and prevent you from extruder collisions, but beware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:394 +#: src/libslic3r/PrintConfig.cpp:579 msgid "Enable auto cooling" msgstr "" -#: src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:580 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." msgstr "" -#: src/libslic3r/PrintConfig.cpp:400 +#: src/libslic3r/PrintConfig.cpp:585 msgid "Cooling tube position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:401 +#: src/libslic3r/PrintConfig.cpp:586 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:593 msgid "Cooling tube length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:409 +#: src/libslic3r/PrintConfig.cpp:594 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:417 +#: src/libslic3r/PrintConfig.cpp:602 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " "prevent resetting acceleration at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:611 msgid "Default filament profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:427 +#: src/libslic3r/PrintConfig.cpp:612 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " "activated." msgstr "" -#: src/libslic3r/PrintConfig.cpp:433 +#: src/libslic3r/PrintConfig.cpp:618 msgid "Default print profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2909 -#: src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:619 src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3300 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " "activated." msgstr "" -#: src/libslic3r/PrintConfig.cpp:440 +#: src/libslic3r/PrintConfig.cpp:625 msgid "Disable fan for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:441 +#: src/libslic3r/PrintConfig.cpp:626 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." msgstr "" -#: src/libslic3r/PrintConfig.cpp:450 +#: src/libslic3r/PrintConfig.cpp:635 msgid "Don't support bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:452 +#: src/libslic3r/PrintConfig.cpp:637 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" -#: src/libslic3r/PrintConfig.cpp:458 +#: src/libslic3r/PrintConfig.cpp:643 msgid "Distance between copies" msgstr "" -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:644 msgid "Distance used for the auto-arrange feature of the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:467 +#: src/libslic3r/PrintConfig.cpp:652 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." msgstr "" -#: src/libslic3r/PrintConfig.cpp:477 +#: src/libslic3r/PrintConfig.cpp:662 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -8808,70 +10036,72 @@ msgid "" "in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:488 +#: src/libslic3r/PrintConfig.cpp:673 msgid "Ensure vertical shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:490 +#: src/libslic3r/PrintConfig.cpp:675 msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell " "thickness (top+bottom solid layers)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:681 msgid "Top fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:498 +#: src/libslic3r/PrintConfig.cpp:683 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:508 src/libslic3r/PrintConfig.cpp:943 -#: src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:693 src/libslic3r/PrintConfig.cpp:1128 +#: src/libslic3r/PrintConfig.cpp:2651 src/libslic3r/PrintConfig.cpp:2668 msgid "Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:509 +#: src/libslic3r/PrintConfig.cpp:694 msgid "Monotonic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:510 src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:695 src/libslic3r/PrintConfig.cpp:1129 msgid "Aligned Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:511 src/libslic3r/PrintConfig.cpp:950 +#: src/libslic3r/PrintConfig.cpp:696 src/libslic3r/PrintConfig.cpp:1135 +#: src/libslic3r/PrintConfig.cpp:2669 msgid "Concentric" msgstr "" -#: src/libslic3r/PrintConfig.cpp:512 src/libslic3r/PrintConfig.cpp:954 +#: src/libslic3r/PrintConfig.cpp:697 src/libslic3r/PrintConfig.cpp:1139 msgid "Hilbert Curve" msgstr "" -#: src/libslic3r/PrintConfig.cpp:513 src/libslic3r/PrintConfig.cpp:955 +#: src/libslic3r/PrintConfig.cpp:698 src/libslic3r/PrintConfig.cpp:1140 msgid "Archimedean Chords" msgstr "" -#: src/libslic3r/PrintConfig.cpp:514 src/libslic3r/PrintConfig.cpp:956 +#: src/libslic3r/PrintConfig.cpp:699 src/libslic3r/PrintConfig.cpp:1141 msgid "Octagram Spiral" msgstr "" -#: src/libslic3r/PrintConfig.cpp:520 +#: src/libslic3r/PrintConfig.cpp:705 msgid "Bottom fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:522 +#: src/libslic3r/PrintConfig.cpp:707 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:531 src/libslic3r/PrintConfig.cpp:542 +#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:727 +#: src/libslic3r/PrintConfig.cpp:1247 msgid "External perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:533 +#: src/libslic3r/PrintConfig.cpp:718 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, " @@ -8879,43 +10109,44 @@ msgid "" "(for example 200%), it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:536 src/libslic3r/PrintConfig.cpp:646 -#: src/libslic3r/PrintConfig.cpp:987 src/libslic3r/PrintConfig.cpp:1000 -#: src/libslic3r/PrintConfig.cpp:1193 src/libslic3r/PrintConfig.cpp:1248 -#: src/libslic3r/PrintConfig.cpp:1274 src/libslic3r/PrintConfig.cpp:1721 -#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2199 -#: src/libslic3r/PrintConfig.cpp:2267 src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:721 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:1181 src/libslic3r/PrintConfig.cpp:1373 +#: src/libslic3r/PrintConfig.cpp:1428 src/libslic3r/PrintConfig.cpp:1454 +#: src/libslic3r/PrintConfig.cpp:1926 src/libslic3r/PrintConfig.cpp:2299 +#: src/libslic3r/PrintConfig.cpp:2472 src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2791 msgid "mm or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:544 +#: src/libslic3r/PrintConfig.cpp:729 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " "calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:1009 -#: src/libslic3r/PrintConfig.cpp:2009 src/libslic3r/PrintConfig.cpp:2061 -#: src/libslic3r/PrintConfig.cpp:2311 src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1201 +#: src/libslic3r/PrintConfig.cpp:1211 src/libslic3r/PrintConfig.cpp:2258 +#: src/libslic3r/PrintConfig.cpp:2310 src/libslic3r/PrintConfig.cpp:2637 +#: src/libslic3r/PrintConfig.cpp:2804 msgid "mm/s or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:554 +#: src/libslic3r/PrintConfig.cpp:739 msgid "External perimeters first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:556 +#: src/libslic3r/PrintConfig.cpp:741 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:562 +#: src/libslic3r/PrintConfig.cpp:747 msgid "Extra perimeters if needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:564 +#: src/libslic3r/PrintConfig.cpp:749 #, possible-c-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " @@ -8923,14 +10154,14 @@ msgid "" "is supported." msgstr "" -#: src/libslic3r/PrintConfig.cpp:574 +#: src/libslic3r/PrintConfig.cpp:759 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " "extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:586 +#: src/libslic3r/PrintConfig.cpp:771 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 " @@ -8938,26 +10169,26 @@ msgid "" "extruder can peek before colliding with other printed objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:597 +#: src/libslic3r/PrintConfig.cpp:782 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " "check for collisions and to display the graphical preview in the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:607 +#: src/libslic3r/PrintConfig.cpp:792 msgid "Extruder Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:608 src/libslic3r/PrintConfig.cpp:670 +#: src/libslic3r/PrintConfig.cpp:793 src/libslic3r/PrintConfig.cpp:855 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:799 msgid "Extruder offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:615 +#: src/libslic3r/PrintConfig.cpp:800 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 " @@ -8965,21 +10196,21 @@ msgid "" "coordinates (they will be subtracted from the XY coordinate)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:624 +#: src/libslic3r/PrintConfig.cpp:809 msgid "Extrusion axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:625 +#: src/libslic3r/PrintConfig.cpp:810 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:630 +#: src/libslic3r/PrintConfig.cpp:815 msgid "Extrusion multiplier" msgstr "" -#: src/libslic3r/PrintConfig.cpp:631 +#: src/libslic3r/PrintConfig.cpp:816 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. " @@ -8987,11 +10218,11 @@ msgid "" "more, check filament diameter and your firmware E steps." msgstr "" -#: src/libslic3r/PrintConfig.cpp:640 +#: src/libslic3r/PrintConfig.cpp:825 msgid "Default extrusion width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:827 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 " @@ -9000,123 +10231,123 @@ msgid "" "height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:653 +#: src/libslic3r/PrintConfig.cpp:838 msgid "Keep fan always on" msgstr "" -#: src/libslic3r/PrintConfig.cpp:654 +#: src/libslic3r/PrintConfig.cpp:839 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." msgstr "" -#: src/libslic3r/PrintConfig.cpp:659 +#: src/libslic3r/PrintConfig.cpp:844 msgid "Enable fan if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:845 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " "maximum speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1997 +#: src/libslic3r/PrintConfig.cpp:847 src/libslic3r/PrintConfig.cpp:2246 msgid "approximate seconds" msgstr "" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:854 msgid "Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:675 +#: src/libslic3r/PrintConfig.cpp:860 msgid "Filament notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:676 +#: src/libslic3r/PrintConfig.cpp:861 msgid "You can put your notes regarding the filament here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:684 src/libslic3r/PrintConfig.cpp:1544 +#: src/libslic3r/PrintConfig.cpp:869 src/libslic3r/PrintConfig.cpp:1746 msgid "Max volumetric speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:870 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " "speed. Set to zero for no limit." msgstr "" -#: src/libslic3r/PrintConfig.cpp:694 +#: src/libslic3r/PrintConfig.cpp:879 msgid "Loading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:695 +#: src/libslic3r/PrintConfig.cpp:880 msgid "Speed used for loading the filament on the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:702 +#: src/libslic3r/PrintConfig.cpp:887 msgid "Loading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:703 +#: src/libslic3r/PrintConfig.cpp:888 msgid "Speed used at the very beginning of loading phase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:710 +#: src/libslic3r/PrintConfig.cpp:895 msgid "Unloading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:711 +#: src/libslic3r/PrintConfig.cpp:896 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:719 +#: src/libslic3r/PrintConfig.cpp:904 msgid "Unloading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:720 +#: src/libslic3r/PrintConfig.cpp:905 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" -#: src/libslic3r/PrintConfig.cpp:727 +#: src/libslic3r/PrintConfig.cpp:912 msgid "Delay after unloading" msgstr "" -#: src/libslic3r/PrintConfig.cpp:728 +#: src/libslic3r/PrintConfig.cpp:913 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " "original dimensions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:737 +#: src/libslic3r/PrintConfig.cpp:922 msgid "Number of cooling moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:738 +#: src/libslic3r/PrintConfig.cpp:923 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:746 +#: src/libslic3r/PrintConfig.cpp:931 msgid "Speed of the first cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:747 +#: src/libslic3r/PrintConfig.cpp:932 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:754 +#: src/libslic3r/PrintConfig.cpp:939 msgid "Minimal purge on wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:940 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -9125,63 +10356,63 @@ msgid "" "to produce successive infill or sacrificial object extrusions reliably." msgstr "" -#: src/libslic3r/PrintConfig.cpp:759 +#: src/libslic3r/PrintConfig.cpp:944 msgid "mm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:765 +#: src/libslic3r/PrintConfig.cpp:950 msgid "Speed of the last cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:766 +#: src/libslic3r/PrintConfig.cpp:951 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:773 +#: src/libslic3r/PrintConfig.cpp:958 msgid "Filament load time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:774 +#: src/libslic3r/PrintConfig.cpp:959 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:781 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Ramming parameters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:782 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:973 msgid "Filament unload time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:789 +#: src/libslic3r/PrintConfig.cpp:974 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:982 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " "average." msgstr "" -#: src/libslic3r/PrintConfig.cpp:804 src/libslic3r/PrintConfig.cpp:2820 -#: src/libslic3r/PrintConfig.cpp:2821 +#: src/libslic3r/PrintConfig.cpp:989 src/libslic3r/PrintConfig.cpp:3200 +#: src/libslic3r/PrintConfig.cpp:3201 msgid "Density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:805 +#: src/libslic3r/PrintConfig.cpp:990 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 " @@ -9189,41 +10420,41 @@ msgid "" "displacement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:808 +#: src/libslic3r/PrintConfig.cpp:993 msgid "g/cm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:813 +#: src/libslic3r/PrintConfig.cpp:998 msgid "Filament type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:814 +#: src/libslic3r/PrintConfig.cpp:999 msgid "The filament material type for use in custom G-codes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:841 +#: src/libslic3r/PrintConfig.cpp:1026 msgid "Soluble material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:842 +#: src/libslic3r/PrintConfig.cpp:1027 msgid "Soluble material is most likely used for a soluble support." msgstr "" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:1033 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "" -#: src/libslic3r/PrintConfig.cpp:849 +#: src/libslic3r/PrintConfig.cpp:1034 msgid "money/kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:1039 msgid "Spool weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:855 +#: src/libslic3r/PrintConfig.cpp:1040 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -9231,103 +10462,105 @@ msgid "" "amount of filament on the spool is sufficient to finish the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:859 +#: src/libslic3r/PrintConfig.cpp:1044 msgid "g" msgstr "" -#: src/libslic3r/PrintConfig.cpp:868 src/libslic3r/PrintConfig.cpp:2904 +#: src/libslic3r/PrintConfig.cpp:1053 src/libslic3r/PrintConfig.cpp:3284 msgid "(Unknown)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:1057 msgid "Fill angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:874 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " "so this setting does not affect them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:886 +#: src/libslic3r/PrintConfig.cpp:1071 msgid "Fill density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:888 +#: src/libslic3r/PrintConfig.cpp:1073 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" -#: src/libslic3r/PrintConfig.cpp:923 +#: src/libslic3r/PrintConfig.cpp:1108 msgid "Fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:925 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "Fill pattern for general low-density infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:945 +#: src/libslic3r/PrintConfig.cpp:1130 src/libslic3r/PrintConfig.cpp:2700 msgid "Grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:946 -msgid "Triangles" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:947 +#: src/libslic3r/PrintConfig.cpp:1132 msgid "Stars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:948 +#: src/libslic3r/PrintConfig.cpp:1133 msgid "Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:949 +#: src/libslic3r/PrintConfig.cpp:1134 msgid "Line" msgstr "" -#: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:2327 +#: src/libslic3r/PrintConfig.cpp:1136 src/libslic3r/PrintConfig.cpp:2653 msgid "Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1137 msgid "3D Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:953 +#: src/libslic3r/PrintConfig.cpp:1138 msgid "Gyroid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:957 +#: src/libslic3r/PrintConfig.cpp:1142 msgid "Adaptive Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:1143 msgid "Support Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:962 src/libslic3r/PrintConfig.cpp:971 -#: src/libslic3r/PrintConfig.cpp:981 src/libslic3r/PrintConfig.cpp:1015 -msgid "First layer" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:963 +#: src/libslic3r/PrintConfig.cpp:1148 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:972 +#: src/libslic3r/PrintConfig.cpp:1156 +msgid "First object layer over raft interface" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1157 +msgid "" +"This is the acceleration your printer will use for first layer of object " +"above raft interface. Set zero to disable acceleration control for first " +"layer of object above raft interface." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1166 msgid "First layer bed temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:973 +#: src/libslic3r/PrintConfig.cpp:1167 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1177 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 " @@ -9335,41 +10568,52 @@ msgid "" "layer height. If set to zero, it will use the default extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:996 +#: src/libslic3r/PrintConfig.cpp:1190 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " -"plates. This can be expressed as an absolute value or as a percentage (for " -"example: 150%) over the default layer height." +"plates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1197 msgid "First layer speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1006 +#: src/libslic3r/PrintConfig.cpp:1198 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " "as a percentage (for example: 40%) it will scale the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1016 +#: src/libslic3r/PrintConfig.cpp:1207 +msgid "Speed of object first layer over raft interface" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1208 +msgid "" +"If expressed as absolute value in mm/s, this speed will be applied to all " +"the print moves of the first object layer above raft interface, regardless " +"of their type. If expressed as a percentage (for example: 40%) it will scale " +"the default speeds." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1218 msgid "First layer nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1017 +#: src/libslic3r/PrintConfig.cpp:1219 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " "commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1025 +#: src/libslic3r/PrintConfig.cpp:1227 msgid "Full fan speed at layer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1228 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -9378,62 +10622,55 @@ msgid "" "maximum allowed speed at layer \"disable_fan_first_layers\" + 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1036 -msgid "Fuzzy skin perimeter mode" +#: src/libslic3r/PrintConfig.cpp:1240 +msgid "Fuzzy skin type." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:1083 -#: src/libslic3r/PrintConfig.cpp:1092 -msgid "Fuzzy Skin" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:1038 -msgid "Fuzzy skin perimeter mode." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:1046 -msgid "External" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:1047 -msgid "External (skip first layer)" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:1048 +#: src/libslic3r/PrintConfig.cpp:1248 msgid "All perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1082 +#: src/libslic3r/PrintConfig.cpp:1253 msgid "Fuzzy skin thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1091 +#: src/libslic3r/PrintConfig.cpp:1262 msgid "Fuzzy skin point distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1102 +#: src/libslic3r/PrintConfig.cpp:1271 +msgid "Fill gaps" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1273 +msgid "" +"Enables filling of gaps between perimeters and between the inner most " +"perimeters and infill." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1280 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " "filling." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1110 +#: src/libslic3r/PrintConfig.cpp:1288 msgid "Verbose G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1289 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " "file could make your firmware slow down." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1118 +#: src/libslic3r/PrintConfig.cpp:1296 msgid "G-code flavor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1119 +#: src/libslic3r/PrintConfig.cpp:1297 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 " @@ -9441,15 +10678,15 @@ msgid "" "extrusion value at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1144 +#: src/libslic3r/PrintConfig.cpp:1324 msgid "No extrusion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1149 +#: src/libslic3r/PrintConfig.cpp:1329 msgid "Label objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1330 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -9457,42 +10694,42 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1157 +#: src/libslic3r/PrintConfig.cpp:1337 msgid "High extruder current on filament swap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1158 +#: src/libslic3r/PrintConfig.cpp:1338 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " "overcome resistance when loading a filament with an ugly shaped tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1166 +#: src/libslic3r/PrintConfig.cpp:1346 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1354 msgid "Combine infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1176 +#: src/libslic3r/PrintConfig.cpp:1356 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1359 msgid "Combine infill every n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1187 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -9505,19 +10742,19 @@ msgid "" "perimeters connected to a single infill line." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1382 msgid "0 (no open anchors)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1229 +#: src/libslic3r/PrintConfig.cpp:1387 src/libslic3r/PrintConfig.cpp:1409 msgid "1000 (unlimited)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1212 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "Maximum length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1214 +#: src/libslic3r/PrintConfig.cpp:1394 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -9529,19 +10766,19 @@ msgid "" "parameter. Set this parameter to zero to disable anchoring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1224 +#: src/libslic3r/PrintConfig.cpp:1404 msgid "0 (not anchored)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1234 +#: src/libslic3r/PrintConfig.cpp:1414 msgid "Infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1236 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "The extruder to use when printing infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1244 +#: src/libslic3r/PrintConfig.cpp:1424 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 " @@ -9550,32 +10787,32 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1254 +#: src/libslic3r/PrintConfig.cpp:1434 msgid "Infill before perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1255 +#: src/libslic3r/PrintConfig.cpp:1435 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1260 +#: src/libslic3r/PrintConfig.cpp:1440 msgid "Only infill where needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1262 +#: src/libslic3r/PrintConfig.cpp:1442 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " "the G-code generation due to the multiple checks involved." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1269 +#: src/libslic3r/PrintConfig.cpp:1449 msgid "Infill/perimeters overlap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1451 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -9583,71 +10820,84 @@ msgid "" "perimeter extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1282 +#: src/libslic3r/PrintConfig.cpp:1462 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1290 +#: src/libslic3r/PrintConfig.cpp:1470 msgid "Inherits profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/libslic3r/PrintConfig.cpp:1471 msgid "Name of the profile, from which this profile inherits." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1304 +#: src/libslic3r/PrintConfig.cpp:1484 msgid "Interface shells" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " "soluble support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1313 +#: src/libslic3r/PrintConfig.cpp:1493 +msgid "Maximum width of a segmented region" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1494 +msgid "Maximum width of a segmented region. Zero disables this feature." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1495 src/libslic3r/PrintConfig.cpp:2091 +#: src/libslic3r/PrintConfig.cpp:2100 +msgid "mm (zero to disable)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1502 msgid "Enable ironing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1314 +#: src/libslic3r/PrintConfig.cpp:1503 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1320 src/libslic3r/PrintConfig.cpp:1322 +#: src/libslic3r/PrintConfig.cpp:1509 src/libslic3r/PrintConfig.cpp:1511 msgid "Ironing Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1516 msgid "All top surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1328 +#: src/libslic3r/PrintConfig.cpp:1517 msgid "Topmost surface only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1329 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "All solid surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1334 +#: src/libslic3r/PrintConfig.cpp:1523 msgid "Flow rate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1525 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1533 msgid "Spacing between ironing passes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1346 +#: src/libslic3r/PrintConfig.cpp:1535 msgid "Distance between ironing lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1363 +#: src/libslic3r/PrintConfig.cpp:1552 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 " @@ -9655,11 +10905,11 @@ msgid "" "[layer_z]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1374 +#: src/libslic3r/PrintConfig.cpp:1563 msgid "Supports remaining times" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1375 +#: src/libslic3r/PrintConfig.cpp:1564 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -9667,175 +10917,187 @@ msgid "" "firmware supports M73 Qxx Sxx for the silent mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1572 msgid "Supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1573 msgid "The firmware supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1389 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "How to apply limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1579 msgid "Purpose of Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1392 +#: src/libslic3r/PrintConfig.cpp:1581 msgid "How to apply the Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1397 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Emit to G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1398 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Use for time estimate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1588 msgid "Ignore" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1422 +#: src/libslic3r/PrintConfig.cpp:1611 msgid "Maximum feedrate X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1423 +#: src/libslic3r/PrintConfig.cpp:1612 msgid "Maximum feedrate Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1424 +#: src/libslic3r/PrintConfig.cpp:1613 msgid "Maximum feedrate Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1425 +#: src/libslic3r/PrintConfig.cpp:1614 msgid "Maximum feedrate E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1617 msgid "Maximum feedrate of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1429 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "Maximum feedrate of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1430 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "Maximum feedrate of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1620 msgid "Maximum feedrate of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1628 msgid "Maximum acceleration X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1440 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "Maximum acceleration Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1441 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Maximum acceleration Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1442 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "Maximum acceleration E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1445 +#: src/libslic3r/PrintConfig.cpp:1634 msgid "Maximum acceleration of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1446 +#: src/libslic3r/PrintConfig.cpp:1635 msgid "Maximum acceleration of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1447 +#: src/libslic3r/PrintConfig.cpp:1636 msgid "Maximum acceleration of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1448 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Maximum acceleration of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1645 msgid "Maximum jerk X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1457 +#: src/libslic3r/PrintConfig.cpp:1646 msgid "Maximum jerk Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1458 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Maximum jerk Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1459 +#: src/libslic3r/PrintConfig.cpp:1648 msgid "Maximum jerk E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1462 +#: src/libslic3r/PrintConfig.cpp:1651 msgid "Maximum jerk of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1463 +#: src/libslic3r/PrintConfig.cpp:1652 msgid "Maximum jerk of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1464 +#: src/libslic3r/PrintConfig.cpp:1653 msgid "Maximum jerk of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1654 msgid "Maximum jerk of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1475 +#: src/libslic3r/PrintConfig.cpp:1664 msgid "Minimum feedrate when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1477 +#: src/libslic3r/PrintConfig.cpp:1666 msgid "Minimum feedrate when extruding (M205 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1485 +#: src/libslic3r/PrintConfig.cpp:1674 msgid "Minimum travel feedrate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1487 +#: src/libslic3r/PrintConfig.cpp:1676 msgid "Minimum travel feedrate (M205 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1495 +#: src/libslic3r/PrintConfig.cpp:1684 msgid "Maximum acceleration when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1497 -msgid "Maximum acceleration when extruding (M204 S)" +#: src/libslic3r/PrintConfig.cpp:1686 +msgid "" +"Maximum acceleration when extruding (M204 P)\n" +"\n" +"Marlin (legacy) firmware flavor will use this also as travel acceleration " +"(M204 T)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1505 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Maximum acceleration when retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1507 -msgid "Maximum acceleration when retracting (M204 T)" +#: src/libslic3r/PrintConfig.cpp:1699 +msgid "Maximum acceleration when retracting (M204 R)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1514 src/libslic3r/PrintConfig.cpp:1523 +#: src/libslic3r/PrintConfig.cpp:1707 +msgid "Maximum acceleration for travel moves" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1709 +msgid "Maximum acceleration for travel moves (M204 T)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1725 msgid "Max" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1717 msgid "This setting represents the maximum speed of your fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1726 #, possible-c-format msgid "" "This is the highest printable layer height for this extruder, used to cap " @@ -9844,28 +11106,28 @@ msgid "" "adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1534 +#: src/libslic3r/PrintConfig.cpp:1736 msgid "Max print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1737 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " "is used to set the highest print speed you want to allow." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1554 +#: src/libslic3r/PrintConfig.cpp:1756 msgid "Max volumetric slope positive" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1555 src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1757 src/libslic3r/PrintConfig.cpp:1768 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 " @@ -9873,95 +11135,95 @@ msgid "" "s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1559 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:1761 src/libslic3r/PrintConfig.cpp:1772 msgid "mm³/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1565 +#: src/libslic3r/PrintConfig.cpp:1767 msgid "Max volumetric slope negative" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1788 msgid "Min" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1780 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1587 +#: src/libslic3r/PrintConfig.cpp:1789 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " "0.1 mm." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1595 +#: src/libslic3r/PrintConfig.cpp:1797 msgid "Min print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1596 +#: src/libslic3r/PrintConfig.cpp:1798 msgid "Slic3r will not scale speed down below this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1603 +#: src/libslic3r/PrintConfig.cpp:1805 msgid "Minimal filament extrusion length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1806 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " "machines, this minimum applies to each extruder." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1613 +#: src/libslic3r/PrintConfig.cpp:1815 msgid "Configuration notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1614 +#: src/libslic3r/PrintConfig.cpp:1816 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1624 +#: src/libslic3r/PrintConfig.cpp:1826 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1629 +#: src/libslic3r/PrintConfig.cpp:1831 msgid "Host Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1630 +#: src/libslic3r/PrintConfig.cpp:1832 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1852 msgid "Only retract when crossing perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1853 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1655 +#: src/libslic3r/PrintConfig.cpp:1860 msgid "" "This option will drop the temperature of the inactive extruders to prevent " "oozing. It will enable a tall skirt automatically and move extruders outside " "such skirt when changing temperatures." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Output filename format" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -9969,31 +11231,31 @@ msgid "" "[input_filename], [input_filename_base]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1672 +#: src/libslic3r/PrintConfig.cpp:1877 msgid "Detect bridging perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1674 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1680 +#: src/libslic3r/PrintConfig.cpp:1885 msgid "Filament parking position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1681 +#: src/libslic3r/PrintConfig.cpp:1886 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1894 msgid "Extra loading distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1690 +#: src/libslic3r/PrintConfig.cpp:1895 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 " @@ -10001,27 +11263,27 @@ msgid "" "than unloading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1698 src/libslic3r/PrintConfig.cpp:1715 -#: src/libslic3r/PrintConfig.cpp:1728 src/libslic3r/PrintConfig.cpp:1738 +#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:1920 +#: src/libslic3r/PrintConfig.cpp:1933 src/libslic3r/PrintConfig.cpp:1943 msgid "Perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1699 +#: src/libslic3r/PrintConfig.cpp:1904 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1911 msgid "Perimeter extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1708 +#: src/libslic3r/PrintConfig.cpp:1913 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1717 +#: src/libslic3r/PrintConfig.cpp:1922 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 " @@ -10030,12 +11292,12 @@ msgid "" "it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1730 +#: src/libslic3r/PrintConfig.cpp:1935 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1740 +#: src/libslic3r/PrintConfig.cpp:1945 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 " @@ -10043,11 +11305,11 @@ msgid "" "Perimeters option is enabled." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1744 +#: src/libslic3r/PrintConfig.cpp:1949 msgid "(minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1752 +#: src/libslic3r/PrintConfig.cpp:1957 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. " @@ -10056,55 +11318,90 @@ msgid "" "environment variables." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1764 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "Printer type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1765 +#: src/libslic3r/PrintConfig.cpp:1970 msgid "Type of the printer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1770 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "Printer notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1771 +#: src/libslic3r/PrintConfig.cpp:1976 msgid "You can put your notes regarding the printer here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1779 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Printer vendor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1780 +#: src/libslic3r/PrintConfig.cpp:1985 msgid "Name of the printer vendor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1785 +#: src/libslic3r/PrintConfig.cpp:1990 msgid "Printer variant" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1786 +#: src/libslic3r/PrintConfig.cpp:1991 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1803 +#: src/libslic3r/PrintConfig.cpp:2008 +msgid "Raft contact Z distance" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2010 +msgid "" +"The vertical distance between object and raft. Ignored for soluble interface." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2017 +msgid "Raft expansion" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2019 +msgid "Expansion of the raft in XY plane for better stability." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2026 +msgid "First layer density" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2028 +msgid "Density of the first raft or support layer." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2036 +msgid "First layer expansion" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2038 +msgid "" +"Expansion of the first raft or support layer to improve adhesion to print " +"bed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2045 msgid "Raft layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1805 +#: src/libslic3r/PrintConfig.cpp:2047 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1813 +#: src/libslic3r/PrintConfig.cpp:2055 msgid "Resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1814 +#: src/libslic3r/PrintConfig.cpp:2056 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -10112,277 +11409,285 @@ msgid "" "simplification and use full resolution from input." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/libslic3r/PrintConfig.cpp:2066 msgid "Minimum travel after retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1825 +#: src/libslic3r/PrintConfig.cpp:2067 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "Retract amount before wipe" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1832 +#: src/libslic3r/PrintConfig.cpp:2074 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1839 +#: src/libslic3r/PrintConfig.cpp:2081 msgid "Retract on layer change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1840 +#: src/libslic3r/PrintConfig.cpp:2082 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1845 src/libslic3r/PrintConfig.cpp:1853 +#: src/libslic3r/PrintConfig.cpp:2087 src/libslic3r/PrintConfig.cpp:2095 msgid "Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1846 +#: src/libslic3r/PrintConfig.cpp:2088 msgid "Retraction Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1847 +#: src/libslic3r/PrintConfig.cpp:2089 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " "extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1849 src/libslic3r/PrintConfig.cpp:1858 -msgid "mm (zero to disable)" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:1854 +#: src/libslic3r/PrintConfig.cpp:2096 msgid "Retraction Length (Toolchange)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:2097 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " "enters the extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:2105 msgid "Lift Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " "the first extruder will be considered." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1871 +#: src/libslic3r/PrintConfig.cpp:2113 msgid "Above Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:2114 msgid "Only lift Z above" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:2115 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:2122 msgid "Below Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:2123 msgid "Only lift Z below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1882 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1890 src/libslic3r/PrintConfig.cpp:1898 +#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2140 msgid "Extra length on restart" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:2133 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1899 +#: src/libslic3r/PrintConfig.cpp:2141 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1906 src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:2148 src/libslic3r/PrintConfig.cpp:2149 msgid "Retraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1908 +#: src/libslic3r/PrintConfig.cpp:2150 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1914 src/libslic3r/PrintConfig.cpp:1915 +#: src/libslic3r/PrintConfig.cpp:2156 src/libslic3r/PrintConfig.cpp:2157 msgid "Deretraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1916 +#: src/libslic3r/PrintConfig.cpp:2158 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " "used." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1923 +#: src/libslic3r/PrintConfig.cpp:2165 msgid "Seam position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1925 +#: src/libslic3r/PrintConfig.cpp:2167 msgid "Position of perimeters starting points." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1931 +#: src/libslic3r/PrintConfig.cpp:2173 msgid "Random" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1932 +#: src/libslic3r/PrintConfig.cpp:2174 msgid "Nearest" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1933 +#: src/libslic3r/PrintConfig.cpp:2175 msgid "Aligned" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1941 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "Direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1943 +#: src/libslic3r/PrintConfig.cpp:2185 msgid "Preferred direction of the seam" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:2186 msgid "Seam preferred direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1951 +#: src/libslic3r/PrintConfig.cpp:2193 msgid "Jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1953 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "Seam preferred direction jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:2196 msgid "Preferred direction of the seam - jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1961 -msgid "Distance from object" +#: src/libslic3r/PrintConfig.cpp:2203 +msgid "Distance from brim/object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:2204 msgid "" -"Distance between skirt and object(s). Set this to zero to attach the skirt " -"to the object(s) and get a brim for better adhesion." +"Distance between skirt and brim (when draft shield is not used) or objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1969 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "Skirt height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1970 -msgid "" -"Height of skirt expressed in layers. Set this to a tall value to use skirt " -"as a shield against drafts." +#: src/libslic3r/PrintConfig.cpp:2211 +msgid "Height of skirt expressed in layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1977 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "Draft shield" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1978 +#: src/libslic3r/PrintConfig.cpp:2218 msgid "" -"If enabled, the skirt will be as tall as a highest printed object. This is " -"useful to protect an ABS or ASA print from warping and detaching from print " -"bed due to wind draft." +"With draft shield active, the skirt will be printed skirt_distance from the " +"object, possibly intersecting brim.\n" +"Enabled = skirt is as tall as the highest printed object.\n" +"Limited = skirt is as tall as specified by skirt_height.\n" +"This is useful to protect an ABS or ASA print from warping and detaching " +"from print bed due to wind draft." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1984 +#: src/libslic3r/PrintConfig.cpp:2226 +msgid "Disabled" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2227 +msgid "Limited" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2228 +msgid "Enabled" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2233 msgid "Loops (minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1985 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "Skirt Loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1986 +#: src/libslic3r/PrintConfig.cpp:2235 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " "this to zero to disable skirt completely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "Slow down if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1995 +#: src/libslic3r/PrintConfig.cpp:2244 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2004 +#: src/libslic3r/PrintConfig.cpp:2253 msgid "Small perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2006 +#: src/libslic3r/PrintConfig.cpp:2255 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " "be calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2016 +#: src/libslic3r/PrintConfig.cpp:2265 msgid "Solid infill threshold area" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2018 +#: src/libslic3r/PrintConfig.cpp:2267 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2019 +#: src/libslic3r/PrintConfig.cpp:2268 msgid "mm²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2025 +#: src/libslic3r/PrintConfig.cpp:2274 msgid "Solid infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:2276 msgid "The extruder to use when printing solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2033 +#: src/libslic3r/PrintConfig.cpp:2282 msgid "Solid infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2284 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 " @@ -10390,7 +11695,7 @@ msgid "" "according to nozzle diameter and layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2047 +#: src/libslic3r/PrintConfig.cpp:2296 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, " @@ -10398,26 +11703,26 @@ msgid "" "(for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2058 +#: src/libslic3r/PrintConfig.cpp:2307 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " "infill speed above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2319 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2076 src/libslic3r/PrintConfig.cpp:2077 +#: src/libslic3r/PrintConfig.cpp:2325 src/libslic3r/PrintConfig.cpp:2326 msgid "Minimum thickness of a top / bottom shell" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2083 +#: src/libslic3r/PrintConfig.cpp:2332 msgid "Spiral vase" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2084 +#: src/libslic3r/PrintConfig.cpp:2333 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, " @@ -10426,18 +11731,18 @@ msgid "" "when printing more than one single object." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2092 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Temperature variation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2093 +#: src/libslic3r/PrintConfig.cpp:2342 msgid "" "Temperature difference to be applied when an extruder is not active. Enables " "a full-height \"sacrificial\" skirt on which the nozzles are periodically " "wiped." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2352 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -10448,7 +11753,7 @@ msgid "" "put a \"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2118 +#: src/libslic3r/PrintConfig.cpp:2367 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -10461,45 +11766,45 @@ msgid "" "extruders, the gcode is processed in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2134 +#: src/libslic3r/PrintConfig.cpp:2383 msgid "Color change G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2135 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "This G-code will be used as a code for the color change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2144 +#: src/libslic3r/PrintConfig.cpp:2393 msgid "This G-code will be used as a code for the pause print" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2402 msgid "This G-code will be used as a custom code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2161 +#: src/libslic3r/PrintConfig.cpp:2410 msgid "Single Extruder Multi Material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2162 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "The printer multiplexes filaments into a single hot end." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2167 +#: src/libslic3r/PrintConfig.cpp:2416 msgid "Prime all printing extruders" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2168 +#: src/libslic3r/PrintConfig.cpp:2417 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2173 +#: src/libslic3r/PrintConfig.cpp:2422 msgid "No sparse layers (EXPERIMENTAL)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2174 +#: src/libslic3r/PrintConfig.cpp:2423 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -10507,75 +11812,135 @@ msgid "" "with the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2181 +#: src/libslic3r/PrintConfig.cpp:2430 +msgid "Slice gap closing radius" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2432 +msgid "" +"Cracks smaller than 2x gap closing radius are being filled during the " +"triangle mesh slicing. The gap closing operation may reduce the final print " +"resolution, therefore it is advisable to keep the value reasonably low." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2440 +msgid "Slicing Mode" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2442 +msgid "" +"Use \"Even / Odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " +"close all holes in the model." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2447 +msgid "Regular" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2448 +msgid "Even / Odd" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2449 +msgid "Close holes" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2454 msgid "Generate support material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2183 +#: src/libslic3r/PrintConfig.cpp:2456 msgid "Enable support material generation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2187 +#: src/libslic3r/PrintConfig.cpp:2460 msgid "Auto generated supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2189 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " "\"Support Enforcer\" volumes only." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2468 msgid "XY separation between an object and its support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2197 +#: src/libslic3r/PrintConfig.cpp:2470 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2207 +#: src/libslic3r/PrintConfig.cpp:2480 msgid "Pattern angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2209 +#: src/libslic3r/PrintConfig.cpp:2482 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2219 src/libslic3r/PrintConfig.cpp:3014 +#: src/libslic3r/PrintConfig.cpp:2492 src/libslic3r/PrintConfig.cpp:3394 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2225 -msgid "Contact Z distance" +#: src/libslic3r/PrintConfig.cpp:2498 +msgid "Top contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2227 +#: src/libslic3r/PrintConfig.cpp:2500 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " "first object layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2234 +#: src/libslic3r/PrintConfig.cpp:2508 msgid "0 (soluble)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2235 +#: src/libslic3r/PrintConfig.cpp:2509 +msgid "0.1 (detachable)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2510 msgid "0.2 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2240 +#: src/libslic3r/PrintConfig.cpp:2516 +msgid "Bottom contact Z distance" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2518 +msgid "" +"The vertical distance between the object top surface and the support " +"material interface. If set to zero, support_material_contact_distance will " +"be used for both top and bottom contact Z distances." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2608 +msgid "same as top" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2526 +msgid "0.1" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2527 +msgid "0.2" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Enforce support for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2242 +#: src/libslic3r/PrintConfig.cpp:2534 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -10583,21 +11948,21 @@ msgid "" "of objects having a very thin or poor footprint on the build plate." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2539 msgid "Enforce support for the first n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2253 +#: src/libslic3r/PrintConfig.cpp:2545 msgid "Support material/raft/skirt extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2547 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2264 +#: src/libslic3r/PrintConfig.cpp:2556 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, " @@ -10605,89 +11970,151 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2565 msgid "Interface loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2275 +#: src/libslic3r/PrintConfig.cpp:2567 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2280 +#: src/libslic3r/PrintConfig.cpp:2572 msgid "Support material/raft interface extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2282 +#: src/libslic3r/PrintConfig.cpp:2574 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2289 -msgid "Interface layers" +#: src/libslic3r/PrintConfig.cpp:2582 +msgid "Top interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:2584 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2298 +#: src/libslic3r/PrintConfig.cpp:2591 +msgid "0 (off)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2592 +msgid "1 (light)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2593 +msgid "2 (default)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2594 +msgid "3 (heavy)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2600 +msgid "Bottom interface layers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2602 +msgid "" +"Number of interface layers to insert between the object(s) and support " +"material. Set to -1 to use support_material_interface_layers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2614 +msgid "Closing radius" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2616 +msgid "" +"For snug supports, the support regions will be merged using morphological " +"closing operation. Gaps smaller than the closing radius will be filled in." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2624 msgid "Interface pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2300 +#: src/libslic3r/PrintConfig.cpp:2626 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " "speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2318 +#: src/libslic3r/PrintConfig.cpp:2644 msgid "Pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2320 +#: src/libslic3r/PrintConfig.cpp:2646 msgid "Pattern used to generate support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2652 msgid "Rectilinear grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Interface pattern" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2660 +msgid "" +"Pattern used to generate support material interface. Default pattern for non-" +"soluble support interface is Rectilinear, while default pattern for soluble " +"support interface is Concentric." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2674 msgid "Pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2334 +#: src/libslic3r/PrintConfig.cpp:2676 msgid "Spacing between support material lines." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2343 +#: src/libslic3r/PrintConfig.cpp:2685 msgid "Speed for printing support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2350 +#: src/libslic3r/PrintConfig.cpp:2692 +msgid "Style" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2694 +msgid "" +"Style and shape of the support towers. Projecting the supports into a " +"regular grid will create more stable supports, while snug support towers " +"will save material and reduce object scarring." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2701 +msgid "Snug" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2706 msgid "Synchronize with object layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2352 +#: src/libslic3r/PrintConfig.cpp:2708 msgid "" "Synchronize support layers with the object print layers. This is useful with " "multi-material printers, where the extruder switch is expensive." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2358 +#: src/libslic3r/PrintConfig.cpp:2714 msgid "Overhang threshold" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2360 +#: src/libslic3r/PrintConfig.cpp:2716 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -10696,57 +12123,65 @@ msgid "" "detection (recommended)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2728 msgid "With sheath around the support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2730 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2381 +#: src/libslic3r/PrintConfig.cpp:2737 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2384 +#: src/libslic3r/PrintConfig.cpp:2740 msgid "Nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2390 +#: src/libslic3r/PrintConfig.cpp:2746 +msgid "Thick bridges" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2748 +msgid "Print bridges with round extrusions." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2753 msgid "Detect thin walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2392 +#: src/libslic3r/PrintConfig.cpp:2755 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2398 +#: src/libslic3r/PrintConfig.cpp:2761 msgid "Threads" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2399 +#: src/libslic3r/PrintConfig.cpp:2762 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2411 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " -"for all PrusaSlicer settings as well as {previous_extruder} and " -"{next_extruder} can be used. When a tool-changing command which changes to " -"the correct extruder is included (such as T{next_extruder}), PrusaSlicer " +"for all PrusaSlicer settings as well as {toolchange_z}, {previous_extruder} " +"and {next_extruder} can be used. When a tool-changing command which changes " +"to the correct extruder is included (such as T{next_extruder}), PrusaSlicer " "will emit no other such command. It is therefore possible to script custom " "behaviour both before and after the toolchange." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2424 +#: src/libslic3r/PrintConfig.cpp:2787 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 " @@ -10755,7 +12190,7 @@ msgid "" "percentage (for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2436 +#: src/libslic3r/PrintConfig.cpp:2799 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 " @@ -10764,54 +12199,65 @@ msgid "" "for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2814 msgid "Number of solid layers to generate on top surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2452 +#: src/libslic3r/PrintConfig.cpp:2815 msgid "Top solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2460 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " "prevent pillowing effect when printing with variable layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2463 +#: src/libslic3r/PrintConfig.cpp:2826 msgid "Minimum top shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2470 +#: src/libslic3r/PrintConfig.cpp:2833 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2478 +#: src/libslic3r/PrintConfig.cpp:2841 +msgid "Z travel" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2842 +msgid "" +"Speed for movements along the Z axis.\n" +"When set to zero, the value is ignored and regular travel speed is used " +"instead." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2850 msgid "Use firmware retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2479 +#: src/libslic3r/PrintConfig.cpp:2851 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2485 +#: src/libslic3r/PrintConfig.cpp:2857 msgid "Use relative E distances" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2486 +#: src/libslic3r/PrintConfig.cpp:2858 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2864 msgid "Use volumetric E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2493 +#: src/libslic3r/PrintConfig.cpp:2865 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -10821,127 +12267,131 @@ msgid "" "only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2503 +#: src/libslic3r/PrintConfig.cpp:2875 msgid "Enable variable layer height feature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2504 +#: src/libslic3r/PrintConfig.cpp:2876 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2882 msgid "Wipe while retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2511 +#: src/libslic3r/PrintConfig.cpp:2883 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2518 +#: src/libslic3r/PrintConfig.cpp:2890 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2524 +#: src/libslic3r/PrintConfig.cpp:2896 msgid "Purging volumes - load/unload volumes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2525 +#: src/libslic3r/PrintConfig.cpp:2897 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " "volumes below." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2903 msgid "Purging volumes - matrix" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2532 +#: src/libslic3r/PrintConfig.cpp:2904 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2913 msgid "Position X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2542 +#: src/libslic3r/PrintConfig.cpp:2914 msgid "X coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2920 msgid "Position Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2549 +#: src/libslic3r/PrintConfig.cpp:2921 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2556 +#: src/libslic3r/PrintConfig.cpp:2928 msgid "Width of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2934 msgid "Wipe tower rotation angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2563 +#: src/libslic3r/PrintConfig.cpp:2935 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2570 +#: src/libslic3r/PrintConfig.cpp:2941 src/libslic3r/PrintConfig.cpp:2942 +msgid "Wipe tower brim width" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2950 msgid "Wipe into this object's infill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2571 +#: src/libslic3r/PrintConfig.cpp:2951 msgid "" -"Purging after toolchange will done inside this object's infills. This lowers " -"the amount of waste but may result in longer print time due to additional " -"travel moves." +"Purging after toolchange will be done inside this object's infills. This " +"lowers the amount of waste but may result in longer print time due to " +"additional travel moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2578 +#: src/libslic3r/PrintConfig.cpp:2958 msgid "Wipe into this object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2579 +#: src/libslic3r/PrintConfig.cpp:2959 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " "Colours of the objects will be mixed as a result." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2585 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Maximal bridging distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2586 +#: src/libslic3r/PrintConfig.cpp:2966 msgid "Maximal distance between supports on sparse infill sections." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2592 +#: src/libslic3r/PrintConfig.cpp:2972 msgid "XY Size Compensation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2594 +#: src/libslic3r/PrintConfig.cpp:2974 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" "tuning hole sizes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2602 +#: src/libslic3r/PrintConfig.cpp:2982 msgid "Z offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2603 +#: src/libslic3r/PrintConfig.cpp:2983 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 " @@ -10949,414 +12399,414 @@ msgid "" "print bed, set this to -0.3 (or fix your endstop)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2670 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Display width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2671 +#: src/libslic3r/PrintConfig.cpp:3051 msgid "Width of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:3056 msgid "Display height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2677 +#: src/libslic3r/PrintConfig.cpp:3057 msgid "Height of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:3062 msgid "Number of pixels in" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:3064 msgid "Number of pixels in X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2690 +#: src/libslic3r/PrintConfig.cpp:3070 msgid "Number of pixels in Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Display horizontal mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:3076 msgid "Mirror horizontally" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2697 +#: src/libslic3r/PrintConfig.cpp:3077 msgid "Enable horizontal mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "Display vertical mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2703 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "Mirror vertically" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:3084 msgid "Enable vertical mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2709 +#: src/libslic3r/PrintConfig.cpp:3089 msgid "Display orientation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2710 +#: src/libslic3r/PrintConfig.cpp:3090 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " "images will be rotated by 90 degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2716 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Landscape" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2717 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "Portrait" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2722 +#: src/libslic3r/PrintConfig.cpp:3102 msgid "Fast" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2723 +#: src/libslic3r/PrintConfig.cpp:3103 msgid "Fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2724 +#: src/libslic3r/PrintConfig.cpp:3104 msgid "Time of the fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2731 +#: src/libslic3r/PrintConfig.cpp:3111 msgid "Slow" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2732 +#: src/libslic3r/PrintConfig.cpp:3112 msgid "Slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2733 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Time of the slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2740 +#: src/libslic3r/PrintConfig.cpp:3120 msgid "Area fill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2741 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" "then a slow tilt will be used, otherwise - a fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2749 -#: src/libslic3r/PrintConfig.cpp:2750 +#: src/libslic3r/PrintConfig.cpp:3128 src/libslic3r/PrintConfig.cpp:3129 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "Printer scaling correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2756 src/libslic3r/PrintConfig.cpp:2757 +#: src/libslic3r/PrintConfig.cpp:3136 src/libslic3r/PrintConfig.cpp:3137 msgid "Printer absolute correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2758 +#: src/libslic3r/PrintConfig.cpp:3138 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2764 +#: src/libslic3r/PrintConfig.cpp:3144 msgid "Elephant foot minimum width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2766 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2773 src/libslic3r/PrintConfig.cpp:2774 +#: src/libslic3r/PrintConfig.cpp:3153 src/libslic3r/PrintConfig.cpp:3154 msgid "Printer gamma correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2775 +#: src/libslic3r/PrintConfig.cpp:3155 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " "behaviour eliminates antialiasing without losing holes in polygons." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:3167 src/libslic3r/PrintConfig.cpp:3168 msgid "SLA material type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2799 src/libslic3r/PrintConfig.cpp:2800 +#: src/libslic3r/PrintConfig.cpp:3179 src/libslic3r/PrintConfig.cpp:3180 msgid "Initial layer height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2806 src/libslic3r/PrintConfig.cpp:2807 +#: src/libslic3r/PrintConfig.cpp:3186 src/libslic3r/PrintConfig.cpp:3187 msgid "Bottle volume" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2808 +#: src/libslic3r/PrintConfig.cpp:3188 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2813 src/libslic3r/PrintConfig.cpp:2814 +#: src/libslic3r/PrintConfig.cpp:3193 src/libslic3r/PrintConfig.cpp:3194 msgid "Bottle weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2815 +#: src/libslic3r/PrintConfig.cpp:3195 msgid "kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2822 +#: src/libslic3r/PrintConfig.cpp:3202 msgid "g/ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2829 +#: src/libslic3r/PrintConfig.cpp:3209 msgid "money/bottle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2834 +#: src/libslic3r/PrintConfig.cpp:3214 msgid "Faded layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2835 +#: src/libslic3r/PrintConfig.cpp:3215 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2842 src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:3222 src/libslic3r/PrintConfig.cpp:3223 msgid "Minimum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2850 src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:3230 src/libslic3r/PrintConfig.cpp:3231 msgid "Maximum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:3238 src/libslic3r/PrintConfig.cpp:3239 msgid "Exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2865 src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:3245 src/libslic3r/PrintConfig.cpp:3246 msgid "Minimum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2873 src/libslic3r/PrintConfig.cpp:2874 +#: src/libslic3r/PrintConfig.cpp:3253 src/libslic3r/PrintConfig.cpp:3254 msgid "Maximum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2881 src/libslic3r/PrintConfig.cpp:2882 +#: src/libslic3r/PrintConfig.cpp:3261 src/libslic3r/PrintConfig.cpp:3262 msgid "Initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2888 src/libslic3r/PrintConfig.cpp:2889 +#: src/libslic3r/PrintConfig.cpp:3268 src/libslic3r/PrintConfig.cpp:3269 msgid "Correction for expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2895 +#: src/libslic3r/PrintConfig.cpp:3275 msgid "SLA print material notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2896 +#: src/libslic3r/PrintConfig.cpp:3276 msgid "You can put your notes regarding the SLA print material here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2908 src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:3288 src/libslic3r/PrintConfig.cpp:3299 msgid "Default SLA material profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3310 msgid "Generate supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2932 +#: src/libslic3r/PrintConfig.cpp:3312 msgid "Generate supports for the models" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2937 +#: src/libslic3r/PrintConfig.cpp:3317 msgid "Pinhead front diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2939 +#: src/libslic3r/PrintConfig.cpp:3319 msgid "Diameter of the pointing side of the head" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:3326 msgid "Head penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2948 +#: src/libslic3r/PrintConfig.cpp:3328 msgid "How much the pinhead has to penetrate the model surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3335 msgid "Pinhead width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2957 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Width from the back sphere center to the front sphere center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2965 +#: src/libslic3r/PrintConfig.cpp:3345 msgid "Pillar diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2967 +#: src/libslic3r/PrintConfig.cpp:3347 msgid "Diameter in mm of the support pillars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2975 +#: src/libslic3r/PrintConfig.cpp:3355 msgid "Small pillar diameter percent" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:3357 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2986 +#: src/libslic3r/PrintConfig.cpp:3366 msgid "Max bridges on a pillar" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2988 +#: src/libslic3r/PrintConfig.cpp:3368 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2996 +#: src/libslic3r/PrintConfig.cpp:3376 msgid "Pillar connection mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2997 +#: src/libslic3r/PrintConfig.cpp:3377 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " "the first two depending on the distance of the two pillars." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3005 +#: src/libslic3r/PrintConfig.cpp:3385 msgid "Zig-Zag" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3386 msgid "Cross" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3007 +#: src/libslic3r/PrintConfig.cpp:3387 msgid "Dynamic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3019 +#: src/libslic3r/PrintConfig.cpp:3399 msgid "Pillar widening factor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3021 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3030 +#: src/libslic3r/PrintConfig.cpp:3410 msgid "Support base diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3032 +#: src/libslic3r/PrintConfig.cpp:3412 msgid "Diameter in mm of the pillar base" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/libslic3r/PrintConfig.cpp:3420 msgid "Support base height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3042 +#: src/libslic3r/PrintConfig.cpp:3422 msgid "The height of the pillar base cone" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3049 +#: src/libslic3r/PrintConfig.cpp:3429 msgid "Support base safety distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3052 +#: src/libslic3r/PrintConfig.cpp:3432 msgid "" "The minimum distance of the pillar base from the model in mm. Makes sense in " "zero elevation mode where a gap according to this parameter is inserted " "between the model and the pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3442 msgid "Critical angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3444 msgid "The default angle for connecting support sticks and junctions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3072 +#: src/libslic3r/PrintConfig.cpp:3452 msgid "Max bridge length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3074 +#: src/libslic3r/PrintConfig.cpp:3454 msgid "The max length of a bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3461 msgid "Max pillar linking distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3083 +#: src/libslic3r/PrintConfig.cpp:3463 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3093 +#: src/libslic3r/PrintConfig.cpp:3473 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3484 msgid "This is a relative measure of support points density." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3110 +#: src/libslic3r/PrintConfig.cpp:3490 msgid "Minimal distance of the support points" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3492 msgid "No support points will be placed closer than this threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3118 +#: src/libslic3r/PrintConfig.cpp:3498 msgid "Use pad" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3500 msgid "Add a pad underneath the supported model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3505 msgid "Pad wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3127 +#: src/libslic3r/PrintConfig.cpp:3507 msgid "The thickness of the pad and its optional cavity walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3135 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "Pad wall height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3136 +#: src/libslic3r/PrintConfig.cpp:3516 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -11364,111 +12814,111 @@ msgid "" "difficult." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3149 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Pad brim size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3150 +#: src/libslic3r/PrintConfig.cpp:3530 msgid "How far should the pad extend around the contained geometry" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Max merge distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3162 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " "be. If theyare closer, they will get merged into one pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3182 +#: src/libslic3r/PrintConfig.cpp:3562 msgid "Pad wall slope" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3184 +#: src/libslic3r/PrintConfig.cpp:3564 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3195 +#: src/libslic3r/PrintConfig.cpp:3575 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3200 +#: src/libslic3r/PrintConfig.cpp:3580 msgid "Pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3202 +#: src/libslic3r/PrintConfig.cpp:3582 msgid "Force pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3207 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3209 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3218 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3220 +#: src/libslic3r/PrintConfig.cpp:3600 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3227 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3229 +#: src/libslic3r/PrintConfig.cpp:3609 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3236 +#: src/libslic3r/PrintConfig.cpp:3616 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3619 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3246 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Enable hollowing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3628 msgid "Hollow out a model to have an empty interior" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3255 +#: src/libslic3r/PrintConfig.cpp:3635 msgid "Minimum wall thickness of a hollowed model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "Accuracy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3645 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3655 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -11477,270 +12927,310 @@ msgid "" "most." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:4077 msgid "Export OBJ" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3684 +#: src/libslic3r/PrintConfig.cpp:4078 msgid "Export the model(s) as OBJ." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3695 +#: src/libslic3r/PrintConfig.cpp:4089 msgid "Export SLA" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:4090 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3701 +#: src/libslic3r/PrintConfig.cpp:4095 msgid "Export 3MF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:4096 msgid "Export the model(s) as 3MF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3706 +#: src/libslic3r/PrintConfig.cpp:4100 msgid "Export AMF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3707 +#: src/libslic3r/PrintConfig.cpp:4101 msgid "Export the model(s) as AMF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:4105 msgid "Export STL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3712 +#: src/libslic3r/PrintConfig.cpp:4106 msgid "Export the model(s) as STL." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3717 +#: src/libslic3r/PrintConfig.cpp:4111 msgid "Slice the model and export toolpaths as G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3722 +#: src/libslic3r/PrintConfig.cpp:4116 msgid "G-code viewer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3723 +#: src/libslic3r/PrintConfig.cpp:4117 msgid "Visualize an already sliced and saved G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3728 +#: src/libslic3r/PrintConfig.cpp:4122 msgid "Slice" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:4123 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3734 +#: src/libslic3r/PrintConfig.cpp:4128 msgid "Help" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3735 +#: src/libslic3r/PrintConfig.cpp:4129 msgid "Show this help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:4134 msgid "Help (FFF options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:4135 msgid "Show the full list of print/G-code configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:4139 msgid "Help (SLA options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:4140 msgid "Show the full list of SLA print configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3750 +#: src/libslic3r/PrintConfig.cpp:4144 msgid "Output Model Info" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3751 +#: src/libslic3r/PrintConfig.cpp:4145 msgid "Write information about the model to the console." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:4149 msgid "Save config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3756 +#: src/libslic3r/PrintConfig.cpp:4150 msgid "Save configuration to the specified file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3766 +#: src/libslic3r/PrintConfig.cpp:4160 msgid "Align XY" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3767 +#: src/libslic3r/PrintConfig.cpp:4161 msgid "Align the model to the given point." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3772 +#: src/libslic3r/PrintConfig.cpp:4166 msgid "Cut model at the given Z." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3793 +#: src/libslic3r/PrintConfig.cpp:4187 msgid "Center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3794 +#: src/libslic3r/PrintConfig.cpp:4188 msgid "Center the print around the given center." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3798 +#: src/libslic3r/PrintConfig.cpp:4192 msgid "Don't arrange" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3799 +#: src/libslic3r/PrintConfig.cpp:4193 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3802 +#: src/libslic3r/PrintConfig.cpp:4196 +msgid "Ensure on bed" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4197 +msgid "" +"Lift the object above the bed when it is partially below. Enabled by " +"default, use --no-ensure-on-bed to disable." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4201 msgid "Duplicate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3803 +#: src/libslic3r/PrintConfig.cpp:4202 msgid "Multiply copies by this factor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3807 +#: src/libslic3r/PrintConfig.cpp:4206 msgid "Duplicate by grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3808 +#: src/libslic3r/PrintConfig.cpp:4207 msgid "Multiply copies by creating a grid." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:4211 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3817 +#: src/libslic3r/PrintConfig.cpp:4216 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3821 +#: src/libslic3r/PrintConfig.cpp:4220 msgid "Rotation angle around the Z axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3825 +#: src/libslic3r/PrintConfig.cpp:4224 msgid "Rotate around X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3826 +#: src/libslic3r/PrintConfig.cpp:4225 msgid "Rotation angle around the X axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:4229 msgid "Rotate around Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:4230 msgid "Rotation angle around the Y axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3836 +#: src/libslic3r/PrintConfig.cpp:4235 msgid "Scaling factor or percentage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3841 +#: src/libslic3r/PrintConfig.cpp:4240 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3844 +#: src/libslic3r/PrintConfig.cpp:4243 msgid "Scale to Fit" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3845 +#: src/libslic3r/PrintConfig.cpp:4244 msgid "Scale to fit the given volume." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3854 +#: src/libslic3r/PrintConfig.cpp:4253 msgid "Ignore non-existent config files" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:4254 msgid "Do not fail if a file supplied to --load does not exist." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3858 +#: src/libslic3r/PrintConfig.cpp:4257 +msgid "" +"Forward-compatibility rule when loading configurations from config files and " +"project files (3MF, AMF)." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4258 +msgid "" +"This version of PrusaSlicer may not understand configurations produced by " +"newest PrusaSlicer versions. For example, newer PrusaSlicer may extend the " +"list of supported firmware flavors. One may decide to bail out or to " +"substitute an unknown value with a default silently or verbosely." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4265 +msgid "Bail out on unknown configuration values" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4266 +msgid "" +"Enable reading unknown configuration values by verbosely substituting them " +"with defaults." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4267 +msgid "" +"Enable reading unknown configuration values by silently substituting them " +"with defaults." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4271 msgid "Load config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3859 +#: src/libslic3r/PrintConfig.cpp:4272 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3862 +#: src/libslic3r/PrintConfig.cpp:4275 msgid "Output File" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3863 +#: src/libslic3r/PrintConfig.cpp:4276 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:4280 msgid "Single instance mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3868 +#: src/libslic3r/PrintConfig.cpp:4281 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " "the \"single_instance\" configuration value from application preferences." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3879 +#: src/libslic3r/PrintConfig.cpp:4292 msgid "Data directory" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3880 +#: src/libslic3r/PrintConfig.cpp:4293 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " "storage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:4296 msgid "Logging level" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3884 +#: src/libslic3r/PrintConfig.cpp:4297 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" "For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3890 +#: src/libslic3r/PrintConfig.cpp:4303 msgid "Render with a software renderer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:4304 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -11750,18 +13240,146 @@ msgstr "" msgid "Error with zip archive" msgstr "" -#: src/libslic3r/PrintObject.cpp:112 -msgid "Processing triangulated mesh" -msgstr "" - -#: src/libslic3r/PrintObject.cpp:157 +#: src/libslic3r/PrintObject.cpp:124 msgid "Generating perimeters" msgstr "" -#: src/libslic3r/PrintObject.cpp:260 +#: src/libslic3r/PrintObject.cpp:227 msgid "Preparing infill" msgstr "" -#: src/libslic3r/PrintObject.cpp:421 +#: src/libslic3r/PrintObject.cpp:389 msgid "Generating support material" msgstr "" + +#: resources/data/hints.ini: [hint:Fuzzy skin] +msgid "Fuzzy skin\nDid you know that you can create rough fibre-like texture on the sides of your models using theFuzzy skinfeature? You can also use modifiers to apply fuzzy-skin only to a portion of your model." +msgstr "" + +#: resources/data/hints.ini: [hint:Shapes gallery] +msgid "Shapes gallery\nDid you know that PrusaSlicer has a Shapes Gallery? You can use the included models as modifiers, negative volumes or as printable objects. Right-click the platter and selectAdd Shape - Gallery." +msgstr "" + +#: resources/data/hints.ini: [hint:Auto-arrange settings] +msgid "Auto-arrange settings\nDid you know that you can right-click theauto-arrange iconto adjust the size of the gap between objects and to allow automatic rotations?" +msgstr "" + +#: resources/data/hints.ini: [hint:Negative volume] +msgid "Negative volume\nDid you know that you can subtract one mesh from another using the Negative volume modifier? That way you can, for example, create easily resizable holes directly in PrusaSlicer. Read more in the documentation. (Requires Advanced or Expert mode.)" +msgstr "" + +#: resources/data/hints.ini: [hint:Simplify mesh] +msgid "Simplify mesh\nDid you know that you can reduce the number of triangles in a mesh using the Simplify mesh feature? Right-click the model and select Simplify model. Read more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Reload from disk] +msgid "Reload from disk\nDid you know that if you created a newer version of your model, you can simply reload it in PrusaSlicer? Right-click the model in the 3D view and choose Reload from disk. Read more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Hiding sidebar] +msgid "Hiding sidebar\nDid you know that you can hide the right sidebar using the shortcut Shift+Tab? You can also enable the icon for this from thePreferences." +msgstr "" + +#: resources/data/hints.ini: [hint:Perspective camera] +msgid "Perspective camera\nDid you know that you can use the K key to quickly switch between an orthographic and perspective camera?" +msgstr "" + +#: resources/data/hints.ini: [hint:Camera Views] +msgid "Camera Views\nDid you know that you can use the number keys 0-6 to quickly switch between predefined camera angles?" +msgstr "" + +#: resources/data/hints.ini: [hint:Place on face] +msgid "Place on face\nDid you know that you can quickly orient a model so that one of its faces sits on the print bed? Select thePlace on facefunction or press the F key." +msgstr "" + +#: resources/data/hints.ini: [hint:Set number of instances] +msgid "Set number of instances\nDid you know that you can right-click a model and set an exact number of instances instead of copy-pasting it several times?" +msgstr "" + +#: resources/data/hints.ini: [hint:Combine infill] +msgid "Combine infill\nDid you know that you can print the infill with a higher layer height compared to perimeters to save print time using the settingCombine infill every." +msgstr "" + +#: resources/data/hints.ini: [hint:Variable layer height] +msgid "Variable layer height\nDid you know that you can print different regions of your model with a different layer height and smooth the transitions between them? Try theVariable layer height tool.(Not available for SLA printers.)" +msgstr "" + +#: resources/data/hints.ini: [hint:Undo/redo history] +msgid "Undo/redo history\nDid you know that you can right-click theundo/redo arrowsto see the history of changes and to undo or redo several actions at once?" +msgstr "" + +#: resources/data/hints.ini: [hint:Different layer height for each model] +msgid "Different layer height for each model\nDid you know that you can print each model on the plater with a different layer height? Right-click the model in the 3D view, choose Layers and Perimeters and adjust the values in the right panel. Read more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Solid infill threshold area] +msgid "Solid infill threshold area\nDid you know that you can make parts of your model with a small cross-section be filled with solid infill automatically? Set theSolid infill threshold area.(Expert mode only.)" +msgstr "" + +#: resources/data/hints.ini: [hint:Search functionality] +msgid "Search functionality\nDid you know that you use theSearchtool to quickly find a specific PrusaSlicer setting? Or use the familiar shortcut Ctrl+F." +msgstr "" + +#: resources/data/hints.ini: [hint:Box selection] +msgid "Box selection\nDid you know that you can do a box selection with Shift+Mouse drag? You can also box-deselect objects with Alt+Mouse drag." +msgstr "" + +#: resources/data/hints.ini: [hint:Zoom on selected objects or on all objects if none selected] +msgid "Zoom on selected objects or on all objects if none selected\nDid you know that you can zoom in on selected objects by pressing the Z key? If none are selected, the camera will zoom on all objects in the scene." +msgstr "" + +#: resources/data/hints.ini: [hint:Printable toggle] +msgid "Printable toggle\nDid you know that you can disable the G-code generation for the selected model without having to move or delete it? Toggle the Printable property of a model from the Right-click context menu." +msgstr "" + +#: resources/data/hints.ini: [hint:Mirror] +msgid "Mirror\nDid you know that you can mirror the selected model to create a reversed version of it? Right-click the model, select Mirror and pick the mirror axis." +msgstr "" + +#: resources/data/hints.ini: [hint:PageUp / PageDown quick rotation by 45 degrees] +msgid "PageUp / PageDown quick rotation by 45 degrees\nDid you know that you can quickly rotate selected models by 45 degrees around the Z-axis clockwise or counter-clockwise by pressing Page Up or Page Down respectively?" +msgstr "" + +#: resources/data/hints.ini: [hint:Load config from G-code] +msgid "Load config from G-code\nDid you know that you can use File-Import Config to load print, filament and printer profiles from an existing G-code file? Similarly, you can use File-Import SL1 archive, which also lets you reconstruct 3D models from the voxel data." +msgstr "" + +#: resources/data/hints.ini: [hint:Ironing] +msgid "Ironing\nDid you know that you can smooth top surfaces of prints using Ironing? The nozzle will run a special second infill phase at the same layer to fill in holes and flatten any lifted plastic. Read more in the documentation. (Requires Advanced or Expert mode.)" +msgstr "" + +#: resources/data/hints.ini: [hint:Paint-on supports] +msgid "Paint-on supports\nDid you know that you can paint directly on the object and select areas, where supports should be enforced or blocked? Try thePaint-on supportsfeature. (Requires Advanced or Expert mode.)" +msgstr "" + +#: resources/data/hints.ini: [hint:Paint-on seam] +msgid "Paint-on seam\nDid you know that you can paint directly on the object and select where to place the start/endpoint of each perimeter loop? Try theSeam paintingfeature. (Requires Advanced or Expert mode.)" +msgstr "" + +#: resources/data/hints.ini: [hint:Insert Pause] +msgid "Insert Pause\nDid you know that you can schedule the print to pause at a specific layer? Right-click the layer slider in the Preview and select Add pause print (M601). This can be used to insert magnets, weights or nuts into your prints. Read more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Insert Custom G-code] +msgid "Insert Custom G-code\nDid you know that you can insert a custom G-code at a specific layer? Right-click the layer in the Preview and select Add custom G-code. With this function you can, for example, create a temperature tower. Read more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Configuration snapshots] +msgid "Configuration snapshots\nDid you know that roll back to a complete backup of all system and user profiles? You can view and move back and forth between snapshots using the Configuration - Configuration snapshots menu." +msgstr "" + +#: resources/data/hints.ini: [hint:Minimum wall thickness] +msgid "Minimum wall thickness\nDid you know that instead of the number of top and bottom layers, you can define theMinimum shell thicknessin millimeters? This feature is especially useful when using the variable layer height function." +msgstr "" + +#: resources/data/hints.ini: [hint:Settings in non-modal window] +msgid "Settings in non-modal window\nDid you know that you can open the Settings in a new non-modal window? This means you can have settings open on one screen and the G-code Preview on the other. Go to thePreferencesand select Settings in non-modal window." +msgstr "" + +#: resources/data/hints.ini: [hint:Adaptive infills] +msgid "Adaptive infills\nDid you know that you can use the Adaptive cubic and Support cubic infills to decrease the print time and lower the filament consumption? Read more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Fullscreen mode] +msgid "Fullscreen mode\nDid you know that you can switch PrusaSlicer to fullscreen mode? Use the F11 hotkey." +msgstr "" diff --git a/resources/localization/list.txt b/resources/localization/list.txt index a2618b44e..2634761dd 100644 --- a/resources/localization/list.txt +++ b/resources/localization/list.txt @@ -7,21 +7,25 @@ src/slic3r/GUI/ButtonsDescription.cpp src/slic3r/GUI/ConfigManipulation.cpp src/slic3r/GUI/ConfigSnapshotDialog.cpp src/slic3r/GUI/ConfigWizard.cpp +src/slic3r/GUI/DesktopIntegrationDialog.cpp src/slic3r/GUI/DoubleSlider.cpp src/slic3r/GUI/ExtraRenderers.cpp src/slic3r/GUI/ExtruderSequenceDialog.cpp src/slic3r/GUI/Field.cpp src/slic3r/GUI/FirmwareDialog.cpp +src/slic3r/GUI/GalleryDialog.cpp src/slic3r/GUI/GCodeViewer.cpp src/slic3r/GUI/GLCanvas3D.cpp src/slic3r/GUI/Gizmos/GLGizmoCut.cpp src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp src/slic3r/GUI/Gizmos/GLGizmoMove.cpp src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp src/slic3r/GUI/Gizmos/GLGizmoScale.cpp src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp +src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp src/slic3r/GUI/Gizmos/GLGizmosManager.cpp src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -34,9 +38,12 @@ src/slic3r/GUI/GUI_ObjectList.cpp src/slic3r/GUI/GUI_ObjectManipulation.cpp src/slic3r/GUI/GUI_ObjectSettings.cpp src/slic3r/GUI/GUI_Preview.cpp +src/slic3r/GUI/HintNotification.cpp src/slic3r/GUI/ImGuiWrapper.cpp src/slic3r/GUI/Jobs/ArrangeJob.cpp +src/slic3r/GUI/Jobs/FillBedJob.cpp src/slic3r/GUI/Jobs/Job.cpp +src/slic3r/GUI/Jobs/PlaterJob.cpp src/slic3r/GUI/Jobs/RotoptimizeJob.cpp src/slic3r/GUI/Jobs/SLAImportJob.cpp src/slic3r/GUI/KBShortcutsDialog.cpp @@ -59,6 +66,7 @@ src/slic3r/GUI/RammingChart.cpp src/slic3r/GUI/SavePresetDialog.cpp src/slic3r/GUI/Search.cpp src/slic3r/GUI/Selection.cpp +src/slic3r/GUI/SendSystemInfoDialog.cpp src/slic3r/GUI/SysInfoDialog.cpp src/slic3r/GUI/Tab.cpp src/slic3r/GUI/Tab.hpp @@ -74,6 +82,7 @@ src/slic3r/Utils/OctoPrint.cpp src/slic3r/Utils/PresetUpdater.cpp src/slic3r/Utils/Http.cpp src/slic3r/Utils/Process.cpp +src/slic3r/Utils/Repetier.cpp src/libslic3r/GCode.cpp src/libslic3r/ExtrusionEntity.cpp src/libslic3r/Flow.cpp diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index 8a34a9a11..ee3a57fe8 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,181 +1,184 @@ -min_slic3r_version = 2.4.0-alpha0 -1.4.0-alpha7 Updated brim_separation value. Updated Prusa MINI end g-code. Added Filamentworld filament profiles. -1.4.0-alpha6 Added nozzle priming after M600. Added nozzle diameter checks for 0.8 nozzle printer profiles. Updated FW version. Increased number of top solid infill layers (0.2 layer height). -1.4.0-alpha5 Added multiple add:north and Extrudr filament profiles. Updated support head settings (SL1S). -1.4.0-alpha4 Decreased Area Fill (SL1S). -1.4.0-alpha3 Updated SL1S tilt times. -1.4.0-alpha2 Updated Prusa MINI machine limits. -1.4.0-alpha1 Added new SL1S resin profiles. -1.4.0-alpha0 Bumped up config version. -1.3.0-alpha2 Added SL1S SPEED profiles. -1.3.0-alpha1 Added Prusament PCCF. Increased travel acceleration for Prusa MINI. Updated start g-code for Prusa MINI. Added multiple add:north and Extrudr filament profiles. Updated Z travel speed values. -1.3.0-alpha0 Disabled thick bridges, updated support settings. -min_slic3r_version = 2.3.2-alpha0 -1.3.1 Added multiple add:north and Extrudr filament profiles. Updated support head settings (SL1S). -1.3.0 Added SL1S SPEED profiles. -min_slic3r_version = 2.3.0-rc1 -1.2.8 Added multiple add:north and Extrudr filament profiles. -1.2.7 Updated "Prusament PC Blend Carbon Fiber" profile for Prusa MINI. -1.2.6 Added filament profile for "Prusament PC Blend Carbon Fiber". -1.2.5 Updated firmware version. Added filament profiles. Various improvements. -1.2.4 Updated cost/density values in filament settings. Various changes in print settings. -1.2.3 Updated firmware version. Updated end g-code in MMU2 printer profiles. -1.2.2 Added Prusament PVB filament profile. Added 0.8mm nozzle profiles. -1.2.1 Updated FW version for MK2.5 family printers. -1.2.0 Added full_fan_speed_layer value for PETG. Increased support interface spacing for 0.6mm nozzle profiles. Updated firmware version. -min_slic3r_version = 2.3.0-beta2 -1.2.0-beta1 Updated end g-code. Added full_fan_speed_layer values. -min_slic3r_version = 2.3.0-beta0 -1.2.0-beta0 Adjusted infill anchor limits. Added filament spool weights. -min_slic3r_version = 2.3.0-alpha4 -1.2.0-alpha1 Renamed MK3S and MINI printer profiles. Updated end g-code (MINI). Added new SLA materials and filament profiles. -1.2.0-alpha0 Added filament spool weights -min_slic3r_version = 2.2.0-alpha3 -1.1.14 Updated firmware version. -1.1.13 Updated firmware version. Updated end g-code in MMU2 printer profiles. -1.1.12 Added Prusament PVB filament profile. Added 0.8mm nozzle profiles. -1.1.11 Renamed MK3S and MINI printer profiles. Updated end g-code (MINI). Added new SLA materials and filament profiles. -1.1.10 Updated firmware version. -1.1.9 Updated K values in filament profiles (linear advance). Added new filament profiles and SLA materials. -1.1.8 Updated start/end g-code scripts for MK3 family printer profiles (reduced extruder motor current for some print profiles). Added new filament and SLA material profiles. -1.1.7 Updated end g-code for MMU2 Single printer profiles. Added/updated filament and SLA material profiles. -1.1.6 Updated firmware version for MK2.5/S and MK3/S. -1.1.5 Updated MMU1 specific retraction settings for Prusament PC Blend -1.1.4 Added Prusament PC Blend filament profile. -1.1.3 Added SLA material and filament profile -1.1.2 Added renamed_from fields for PETG filaments to indicate that they were renamed from PET. -1.1.1 Added Verbatim and Fiberlogy PETG filament profiles. Updated auto cooling settings for ABS. -1.1.1-beta Updated for PrusaSlicer 2.2.0-beta -1.1.1-alpha4 Extended list of default filaments to be installed, top/bottom_solid_min_thickness defined, infill_acceleration changed etc -1.1.1-alpha3 Print bed textures are now configurable from the Preset Bundle. Requires PrusaSlicer 2.2.0-alpha3 and newer. -# The following line (max_slic3r_version) forces the users of PrusaSlicer 2.2.0-alpha3 and newer to update the profiles to 1.1.1-alpha3 and newer, -# so they will see the print bed. -max_slic3r_version = 2.2.0-alpha2 -min_slic3r_version = 2.2.0-alpha0 -1.1.1-alpha2 Bumped up config version, so our in house customer will get updated profiles. -1.1.0 Filament aliases, Creality profiles and other goodies for PrusaSlicer 2.2.0-alpha0 -min_slic3r_version = 2.1.1-beta0 -1.0.12 Updated firmware version. -1.0.11 Updated firmware version. -1.0.10 Updated firmware version for MK2.5/S and MK3/S. -1.0.9 Updated firmware version for MK2.5/S and MK3/S. -1.0.8 Various changes in FFF profiles, new filaments/materials added. See changelog. -1.0.7 Updated layer height limits for MINI -1.0.6 Added Prusa MINI profiles -min_slic3r_version = 2.1.0-alpha0 -1.0.5 Added SLA materials -1.0.4 Updated firmware version and 0.25mm nozzle profiles -1.0.3 Added filament profiles -1.0.2 Added SLA materials -1.0.1 Updated MK3 firmware version check to 3.8.0, new soluble support profiles for 0.6mm nozzle diameter MMU2S printers. -1.0.0 Updated end G-code for the MMU2 profiles to lift the extruder at the end of print. Wipe tower bridging distance was made smaller for soluble supports. -1.0.0-beta1 Updated color for the ASA filaments to differ from the other filaments. Single extruder printers now have no extruder color assigned, obects and toolpaths will be colored with the color of the active filament. -1.0.0-beta0 Printer model checks in start G-codes, ASA filament profiles, limits on min / max SL1 exposition times -1.0.0-alpha2 Printer model and nozzle diameter check -1.0.0-alpha1 Added Prusament ASA profile -1.0.0-alpha0 Filament specific retract for PET and similar copolymers, and for FLEX -min_slic3r_version = 1.42.0-alpha6 -0.8.11 Updated firmware version. -0.8.10 Updated firmware version. -0.8.9 Updated firmware version for MK2.5/S and MK3/S. -0.8.8 Updated firmware version for MK2.5/S and MK3/S. -0.8.7 Updated firmware version -0.8.6 Updated firmware version for MK2.5/S and MK3/S -0.8.5 Updated SL1 printer and material settings -0.8.4 Added Prusament ASA profile -0.8.3 FW version and SL1 materials update -0.8.2 FFF and SL1 settings update -0.8.1 Output settings and SLA materials update -0.8.0 Updated for the PrusaSlicer 2.0.0 final release -0.8.0-rc2 Updated firmware versions for MK2.5/S and MK3/S -0.8.0-rc1 Updated SLA profiles -0.8.0-rc Updated for the PrusaSlicer 2.0.0-rc release -0.8.0-beta4 Updated SLA profiles -0.8.0-beta3 Updated SLA profiles -0.8.0-beta2 Updated SLA profiles -0.8.0-beta1 Updated SLA profiles -0.8.0-beta Updated SLA profiles -0.8.0-alpha9 Updated SLA and FFF profiles -0.8.0-alpha8 Updated SLA profiles -0.8.0-alpha7 Updated SLA profiles -0.8.0-alpha6 Updated SLA profiles -min_slic3r_version = 1.42.0-alpha -0.8.0-alpha Updated SLA profiles -0.4.0-alpha4 Updated SLA profiles -0.4.0-alpha3 Update of SLA profiles -0.4.0-alpha2 First SLA profiles -min_slic3r_version = 1.41.3-alpha -0.4.12 Updated firmware version for MK2.5/S and MK3/S. -0.4.11 Updated firmware version for MK2.5/S and MK3/S. -0.4.10 Updated firmware version -0.4.9 Updated firmware version for MK2.5/S and MK3/S -0.4.8 MK2.5/3/S FW update -0.4.7 MK2/S/MMU FW update -0.4.6 Updated firmware versions for MK2.5/S and MK3/S -0.4.5 Enabled remaining time support for MK2/S/MMU1 -0.4.4 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt -0.4.3 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt -0.4.2 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt -0.4.1 New MK2.5S and MK3S FW versions -0.4.0 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt -min_slic3r_version = 1.41.1 -0.3.11 Updated firmware version for MK2.5/S and MK3/S. -0.3.10 Updated firmware version -0.3.9 Updated firmware version for MK2.5/S and MK3/S -0.3.8 MK2.5/3/S FW update -0.3.7 MK2/S/MMU FW update -0.3.6 Updated firmware versions for MK2.5 and MK3 -0.3.5 New MK2.5 and MK3 FW versions -0.3.4 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt -0.3.3 Prusament PETG released -0.3.2 New MK2.5 and MK3 FW versions -0.3.1 New MK2.5 and MK3 FW versions -0.3.0 New MK2.5 and MK3 FW version -min_slic3r_version = 1.41.0-alpha -0.2.9 New MK2.5 and MK3 FW versions -0.2.8 New MK2.5 and MK3 FW version -min_slic3r_version = 1.41.1 -0.2.7 New MK2.5 and MK3 FW version -0.2.6 Added MMU2 MK2.5 settings -min_slic3r_version = 1.41.0-alpha -0.2.5 Prusament is out - added prusament settings -0.2.4 Added soluble support profiles for MMU2 -0.2.3 Added materials for MMU2 single mode, edited MK3 xy stealth feedrate limit -0.2.2 Edited MMU2 Single mode purge line -0.2.1 Added PET and BVOH settings for MMU2 -0.2.0-beta5 Fixed MMU1 ramming parameters -0.2.0-beta4 Added filament loading speed at start, increased minimal purge on wipe tower -0.2.0-beta3 Edited ramming parameters and filament cooling moves for MMU2 -0.2.0-beta2 Edited first layer speed and wipe tower position -0.2.0-beta Removed limit on the MK3MMU2 height, added legacy M204 S T format to the MK2 profiles -0.2.0-alpha8 Added filament_load/unload_time for the PLA/ABS MMU2 filament presets. -0.2.0-alpha7 Vojtech's fix the incorrect *MK3* references -0.2.0-alpha6 Jindra's way to fix the 0.2.0-alpha5 version -0.2.0-alpha5 Bumped up firmware versions for MK2.5/MK3 to 3.3.1, disabled priming areas for MK3MMU2 -0.2.0-alpha4 Extended the custom start/end G-codes of the MMU2.0 printers for no priming towers. -0.2.0-alpha3 Adjusted machine limits for time estimates, added filament density and cost -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 -min_slic3r_version = 1.40.0 -0.1.18 Updated firmware version -0.1.17 Updated firmware version for MK2.5/S and MK3/S -0.1.16 MK2.5/3/S FW update -0.1.15 MK2/S/MMU FW update -0.1.14 Updated firmware versions for MK2.5 and MK3 -0.1.13 New MK2.5 and MK3 FW versions -0.1.12 New MK2.5 and MK3 FW versions -0.1.11 fw version changed to 3.3.1 -0.1.10 MK3 jerk and acceleration update -0.1.9 edited support extrusion width for 0.25 and 0.6 nozzles -0.1.8 extrusion width for 0,25, 0.6 and variable layer height fixes -0.1.7 Fixed errors in 0.25mm and 0.6mm profiles -0.1.6 Split the MK2.5 profile from the MK2S -min_slic3r_version = 1.40.0-beta -0.1.5 fixed printer_variant fields for the i3 MK3 0.25 and 0.6mm nozzles -0.1.4 edited fw version, added z-raise after print -min_slic3r_version = 1.40.0-alpha -0.1.3 Fixed an incorrect position of the max_print_height parameter -0.1.2 Wipe tower changes -0.1.1 Minor print speed adjustments -0.1.0 Initial +min_slic3r_version = 2.4.0-alpha0 +1.4.0-alpha8 Added material profiles for Prusament Resin. Detect bridging perimeters enabled by default. +1.4.0-alpha7 Updated brim_separation value. Updated Prusa MINI end g-code. Added Filamentworld filament profiles. +1.4.0-alpha6 Added nozzle priming after M600. Added nozzle diameter checks for 0.8 nozzle printer profiles. Updated FW version. Increased number of top solid infill layers (0.2 layer height). +1.4.0-alpha5 Added multiple add:north and Extrudr filament profiles. Updated support head settings (SL1S). +1.4.0-alpha4 Decreased Area Fill (SL1S). +1.4.0-alpha3 Updated SL1S tilt times. +1.4.0-alpha2 Updated Prusa MINI machine limits. +1.4.0-alpha1 Added new SL1S resin profiles. +1.4.0-alpha0 Bumped up config version. +1.3.0-alpha2 Added SL1S SPEED profiles. +1.3.0-alpha1 Added Prusament PCCF. Increased travel acceleration for Prusa MINI. Updated start g-code for Prusa MINI. Added multiple add:north and Extrudr filament profiles. Updated Z travel speed values. +1.3.0-alpha0 Disabled thick bridges, updated support settings. +min_slic3r_version = 2.3.2-alpha0 +1.3.2 Added material profiles for Prusament Resin. +1.3.1 Added multiple add:north and Extrudr filament profiles. Updated support head settings (SL1S). +1.3.0 Added SL1S SPEED profiles. +min_slic3r_version = 2.3.0-rc1 +1.2.9 Added material profiles for Prusament Resin. +1.2.8 Added multiple add:north and Extrudr filament profiles. +1.2.7 Updated "Prusament PC Blend Carbon Fiber" profile for Prusa MINI. +1.2.6 Added filament profile for "Prusament PC Blend Carbon Fiber". +1.2.5 Updated firmware version. Added filament profiles. Various improvements. +1.2.4 Updated cost/density values in filament settings. Various changes in print settings. +1.2.3 Updated firmware version. Updated end g-code in MMU2 printer profiles. +1.2.2 Added Prusament PVB filament profile. Added 0.8mm nozzle profiles. +1.2.1 Updated FW version for MK2.5 family printers. +1.2.0 Added full_fan_speed_layer value for PETG. Increased support interface spacing for 0.6mm nozzle profiles. Updated firmware version. +min_slic3r_version = 2.3.0-beta2 +1.2.0-beta1 Updated end g-code. Added full_fan_speed_layer values. +min_slic3r_version = 2.3.0-beta0 +1.2.0-beta0 Adjusted infill anchor limits. Added filament spool weights. +min_slic3r_version = 2.3.0-alpha4 +1.2.0-alpha1 Renamed MK3S and MINI printer profiles. Updated end g-code (MINI). Added new SLA materials and filament profiles. +1.2.0-alpha0 Added filament spool weights +min_slic3r_version = 2.2.0-alpha3 +1.1.14 Updated firmware version. +1.1.13 Updated firmware version. Updated end g-code in MMU2 printer profiles. +1.1.12 Added Prusament PVB filament profile. Added 0.8mm nozzle profiles. +1.1.11 Renamed MK3S and MINI printer profiles. Updated end g-code (MINI). Added new SLA materials and filament profiles. +1.1.10 Updated firmware version. +1.1.9 Updated K values in filament profiles (linear advance). Added new filament profiles and SLA materials. +1.1.8 Updated start/end g-code scripts for MK3 family printer profiles (reduced extruder motor current for some print profiles). Added new filament and SLA material profiles. +1.1.7 Updated end g-code for MMU2 Single printer profiles. Added/updated filament and SLA material profiles. +1.1.6 Updated firmware version for MK2.5/S and MK3/S. +1.1.5 Updated MMU1 specific retraction settings for Prusament PC Blend +1.1.4 Added Prusament PC Blend filament profile. +1.1.3 Added SLA material and filament profile +1.1.2 Added renamed_from fields for PETG filaments to indicate that they were renamed from PET. +1.1.1 Added Verbatim and Fiberlogy PETG filament profiles. Updated auto cooling settings for ABS. +1.1.1-beta Updated for PrusaSlicer 2.2.0-beta +1.1.1-alpha4 Extended list of default filaments to be installed, top/bottom_solid_min_thickness defined, infill_acceleration changed etc +1.1.1-alpha3 Print bed textures are now configurable from the Preset Bundle. Requires PrusaSlicer 2.2.0-alpha3 and newer. +# The following line (max_slic3r_version) forces the users of PrusaSlicer 2.2.0-alpha3 and newer to update the profiles to 1.1.1-alpha3 and newer, +# so they will see the print bed. +max_slic3r_version = 2.2.0-alpha2 +min_slic3r_version = 2.2.0-alpha0 +1.1.1-alpha2 Bumped up config version, so our in house customer will get updated profiles. +1.1.0 Filament aliases, Creality profiles and other goodies for PrusaSlicer 2.2.0-alpha0 +min_slic3r_version = 2.1.1-beta0 +1.0.12 Updated firmware version. +1.0.11 Updated firmware version. +1.0.10 Updated firmware version for MK2.5/S and MK3/S. +1.0.9 Updated firmware version for MK2.5/S and MK3/S. +1.0.8 Various changes in FFF profiles, new filaments/materials added. See changelog. +1.0.7 Updated layer height limits for MINI +1.0.6 Added Prusa MINI profiles +min_slic3r_version = 2.1.0-alpha0 +1.0.5 Added SLA materials +1.0.4 Updated firmware version and 0.25mm nozzle profiles +1.0.3 Added filament profiles +1.0.2 Added SLA materials +1.0.1 Updated MK3 firmware version check to 3.8.0, new soluble support profiles for 0.6mm nozzle diameter MMU2S printers. +1.0.0 Updated end G-code for the MMU2 profiles to lift the extruder at the end of print. Wipe tower bridging distance was made smaller for soluble supports. +1.0.0-beta1 Updated color for the ASA filaments to differ from the other filaments. Single extruder printers now have no extruder color assigned, obects and toolpaths will be colored with the color of the active filament. +1.0.0-beta0 Printer model checks in start G-codes, ASA filament profiles, limits on min / max SL1 exposition times +1.0.0-alpha2 Printer model and nozzle diameter check +1.0.0-alpha1 Added Prusament ASA profile +1.0.0-alpha0 Filament specific retract for PET and similar copolymers, and for FLEX +min_slic3r_version = 1.42.0-alpha6 +0.8.11 Updated firmware version. +0.8.10 Updated firmware version. +0.8.9 Updated firmware version for MK2.5/S and MK3/S. +0.8.8 Updated firmware version for MK2.5/S and MK3/S. +0.8.7 Updated firmware version +0.8.6 Updated firmware version for MK2.5/S and MK3/S +0.8.5 Updated SL1 printer and material settings +0.8.4 Added Prusament ASA profile +0.8.3 FW version and SL1 materials update +0.8.2 FFF and SL1 settings update +0.8.1 Output settings and SLA materials update +0.8.0 Updated for the PrusaSlicer 2.0.0 final release +0.8.0-rc2 Updated firmware versions for MK2.5/S and MK3/S +0.8.0-rc1 Updated SLA profiles +0.8.0-rc Updated for the PrusaSlicer 2.0.0-rc release +0.8.0-beta4 Updated SLA profiles +0.8.0-beta3 Updated SLA profiles +0.8.0-beta2 Updated SLA profiles +0.8.0-beta1 Updated SLA profiles +0.8.0-beta Updated SLA profiles +0.8.0-alpha9 Updated SLA and FFF profiles +0.8.0-alpha8 Updated SLA profiles +0.8.0-alpha7 Updated SLA profiles +0.8.0-alpha6 Updated SLA profiles +min_slic3r_version = 1.42.0-alpha +0.8.0-alpha Updated SLA profiles +0.4.0-alpha4 Updated SLA profiles +0.4.0-alpha3 Update of SLA profiles +0.4.0-alpha2 First SLA profiles +min_slic3r_version = 1.41.3-alpha +0.4.12 Updated firmware version for MK2.5/S and MK3/S. +0.4.11 Updated firmware version for MK2.5/S and MK3/S. +0.4.10 Updated firmware version +0.4.9 Updated firmware version for MK2.5/S and MK3/S +0.4.8 MK2.5/3/S FW update +0.4.7 MK2/S/MMU FW update +0.4.6 Updated firmware versions for MK2.5/S and MK3/S +0.4.5 Enabled remaining time support for MK2/S/MMU1 +0.4.4 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt +0.4.3 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt +0.4.2 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt +0.4.1 New MK2.5S and MK3S FW versions +0.4.0 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt +min_slic3r_version = 1.41.1 +0.3.11 Updated firmware version for MK2.5/S and MK3/S. +0.3.10 Updated firmware version +0.3.9 Updated firmware version for MK2.5/S and MK3/S +0.3.8 MK2.5/3/S FW update +0.3.7 MK2/S/MMU FW update +0.3.6 Updated firmware versions for MK2.5 and MK3 +0.3.5 New MK2.5 and MK3 FW versions +0.3.4 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt +0.3.3 Prusament PETG released +0.3.2 New MK2.5 and MK3 FW versions +0.3.1 New MK2.5 and MK3 FW versions +0.3.0 New MK2.5 and MK3 FW version +min_slic3r_version = 1.41.0-alpha +0.2.9 New MK2.5 and MK3 FW versions +0.2.8 New MK2.5 and MK3 FW version +min_slic3r_version = 1.41.1 +0.2.7 New MK2.5 and MK3 FW version +0.2.6 Added MMU2 MK2.5 settings +min_slic3r_version = 1.41.0-alpha +0.2.5 Prusament is out - added prusament settings +0.2.4 Added soluble support profiles for MMU2 +0.2.3 Added materials for MMU2 single mode, edited MK3 xy stealth feedrate limit +0.2.2 Edited MMU2 Single mode purge line +0.2.1 Added PET and BVOH settings for MMU2 +0.2.0-beta5 Fixed MMU1 ramming parameters +0.2.0-beta4 Added filament loading speed at start, increased minimal purge on wipe tower +0.2.0-beta3 Edited ramming parameters and filament cooling moves for MMU2 +0.2.0-beta2 Edited first layer speed and wipe tower position +0.2.0-beta Removed limit on the MK3MMU2 height, added legacy M204 S T format to the MK2 profiles +0.2.0-alpha8 Added filament_load/unload_time for the PLA/ABS MMU2 filament presets. +0.2.0-alpha7 Vojtech's fix the incorrect *MK3* references +0.2.0-alpha6 Jindra's way to fix the 0.2.0-alpha5 version +0.2.0-alpha5 Bumped up firmware versions for MK2.5/MK3 to 3.3.1, disabled priming areas for MK3MMU2 +0.2.0-alpha4 Extended the custom start/end G-codes of the MMU2.0 printers for no priming towers. +0.2.0-alpha3 Adjusted machine limits for time estimates, added filament density and cost +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 +min_slic3r_version = 1.40.0 +0.1.18 Updated firmware version +0.1.17 Updated firmware version for MK2.5/S and MK3/S +0.1.16 MK2.5/3/S FW update +0.1.15 MK2/S/MMU FW update +0.1.14 Updated firmware versions for MK2.5 and MK3 +0.1.13 New MK2.5 and MK3 FW versions +0.1.12 New MK2.5 and MK3 FW versions +0.1.11 fw version changed to 3.3.1 +0.1.10 MK3 jerk and acceleration update +0.1.9 edited support extrusion width for 0.25 and 0.6 nozzles +0.1.8 extrusion width for 0,25, 0.6 and variable layer height fixes +0.1.7 Fixed errors in 0.25mm and 0.6mm profiles +0.1.6 Split the MK2.5 profile from the MK2S +min_slic3r_version = 1.40.0-beta +0.1.5 fixed printer_variant fields for the i3 MK3 0.25 and 0.6mm nozzles +0.1.4 edited fw version, added z-raise after print +min_slic3r_version = 1.40.0-alpha +0.1.3 Fixed an incorrect position of the max_print_height parameter +0.1.2 Wipe tower changes +0.1.1 Minor print speed adjustments +0.1.0 Initial diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index 47a3883b4..7d4ab7ccb 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 PrusaSlicer configuration to be downgraded. -config_version = 1.4.0-alpha7 +config_version = 1.4.0-alpha8 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/ changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -120,7 +120,7 @@ technology = SLA family = SL1 bed_model = sl1_bed.stl bed_texture = sl1.svg -default_materials = Prusa Orange Tough @0.05 +default_materials = Prusa Orange Tough @0.05; Prusament Resin Tough Prusa Orange @0.05 [printer_model:SL1S] name = Original Prusa SL1S SPEED @@ -129,7 +129,7 @@ technology = SLA family = SL1 bed_model = sl1s_bed.stl bed_texture = sl1s.svg -default_materials = Prusa Orange Tough @0.05 SL1S +default_materials = Prusa Orange Tough @0.05 SL1S; Prusament Resin Tough Prusa Orange @0.05 SL1S # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -181,7 +181,7 @@ max_volumetric_extrusion_rate_slope_positive = 0 max_volumetric_speed = 0 min_skirt_length = 4 notes = -overhangs = 0 +overhangs = 1 only_retract_when_crossing_perimeters = 0 ooze_prevention = 0 output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode @@ -395,6 +395,7 @@ top_solid_min_thickness = 1.2 bottom_solid_min_thickness = 0.8 single_extruder_multi_material_priming = 0 thick_bridges = 1 +overhangs = 0 [print:*soluble_support*] overhangs = 1 @@ -460,10 +461,10 @@ bridge_flow_ratio = 1 bridge_speed = 20 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 layer_height = 0.1 -perimeter_acceleration = 800 +perimeter_acceleration = 600 top_solid_layers = 9 support_material_contact_distance = 0.17 -raft_contact_distance = 0.17 +raft_contact_distance = 0.15 [print:*0.15mm*] inherits = *common* @@ -619,6 +620,7 @@ support_material_contact_distance = 0.1 raft_contact_distance = 0.2 top_solid_infill_speed = 40 thick_bridges = 1 +overhangs = 0 ## MMU1 specific [print:0.15mm OPTIMAL SOLUBLE FULL] @@ -704,7 +706,7 @@ small_perimeter_speed = 15 solid_infill_speed = 40 top_solid_infill_speed = 30 support_material_contact_distance = 0.08 -raft_contact_distance = 0.08 +raft_contact_distance = 0.07 ## MK2 - 0.6mm nozzle @@ -772,6 +774,7 @@ single_extruder_multi_material_priming = 0 inherits = 0.35mm FAST compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 single_extruder_multi_material_priming = 0 +overhangs = 0 ## MK2.5 - MMU2 specific @@ -1013,7 +1016,7 @@ compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and fill_pattern = grid fill_density = 20% support_material_contact_distance = 0.08 -raft_contact_distance = 0.08 +raft_contact_distance = 0.07 ## MK3 - 0.6mm nozzle @@ -1028,7 +1031,7 @@ perimeter_speed = 45 solid_infill_speed = 70 top_solid_infill_speed = 45 support_material_contact_distance = 0.22 -raft_contact_distance = 0.22 +raft_contact_distance = 0.2 bridge_flow_ratio = 1 [print:0.20mm DETAIL @0.6 nozzle MK3] @@ -1042,7 +1045,7 @@ perimeter_speed = 45 solid_infill_speed = 70 top_solid_infill_speed = 45 support_material_contact_distance = 0.22 -raft_contact_distance = 0.22 +raft_contact_distance = 0.2 bridge_flow_ratio = 1 [print:0.30mm QUALITY @0.6 nozzle MK3] @@ -1311,7 +1314,7 @@ compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and fill_pattern = grid fill_density = 20% support_material_contact_distance = 0.08 -raft_contact_distance = 0.08 +raft_contact_distance = 0.07 # MINI - 0.6mm nozzle @@ -4496,7 +4499,31 @@ initial_exposure_time = 35 material_type = Tough material_vendor = Monocure -## Prusa +## Prusa Polymers 0.025 + +[sla_material:Prusament Resin Tough Prusa Orange @0.025] +inherits = *common 0.025* +exposure_time = 5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Prusa Polymers + +[sla_material:Prusament Resin Tough Rich Black @0.025] +inherits = *common 0.025* +exposure_time = 5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Prusa Polymers + +[sla_material:Prusament Resin Tough Anthracite Grey @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Prusa Polymers + +## Prusa 0.025 + [sla_material:Prusa Orange Tough @0.025] inherits = *common 0.025* exposure_time = 6 @@ -5185,7 +5212,30 @@ initial_exposure_time = 35 material_type = Tough material_vendor = Zortrax -## Prusa +## Prusa Polymers 0.05 + +[sla_material:Prusament Resin Tough Prusa Orange @0.05] +inherits = *common 0.05* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Prusa Polymers + +[sla_material:Prusament Resin Tough Rich Black @0.05] +inherits = *common 0.05* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Prusa Polymers + +[sla_material:Prusament Resin Tough Anthracite Grey @0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Prusa Polymers + +## Prusa 0.05 [sla_material:Prusa Beige Tough @0.05] inherits = *common 0.05* @@ -5447,7 +5497,30 @@ initial_exposure_time = 50 material_type = Tough material_vendor = BlueCast -## Prusa +## Prusa Polymers 0.1 + +[sla_material:Prusament Resin Tough Prusa Orange @0.1] +inherits = *common 0.1* +exposure_time = 13 +initial_exposure_time = 45 +material_type = Tough +material_vendor = Prusa Polymers + +[sla_material:Prusament Resin Tough Rich Black @0.1] +inherits = *common 0.1* +exposure_time = 13 +initial_exposure_time = 45 +material_type = Tough +material_vendor = Prusa Polymers + +[sla_material:Prusament Resin Tough Anthracite Grey @0.1] +inherits = *common 0.1* +exposure_time = 14 +initial_exposure_time = 45 +material_type = Tough +material_vendor = Prusa Polymers + +## Prusa 0.1 [sla_material:Prusa Orange Tough @0.1] inherits = *common 0.1* @@ -5530,6 +5603,31 @@ material_vendor = Made for Prusa ## 0.025 SL1S +## Prusa Polymers 0.025 + +[sla_material:Prusament Resin Tough Prusa Orange @0.025 SL1S] +inherits = *0.025_sl1s* +exposure_time = 1.8 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Prusa Polymers + +[sla_material:Prusament Resin Tough Rich Black @0.025 SL1S] +inherits = *0.025_sl1s* +exposure_time = 1.8 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Prusa Polymers + +[sla_material:Prusament Resin Tough Anthracite Grey @0.025 SL1S] +inherits = *0.025_sl1s* +exposure_time = 2 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Prusa Polymers + +## Made for Prusa 0.025 + [sla_material:Prusa Orange Tough @0.025 SL1S] inherits = *0.025_sl1s* exposure_time = 1.8 @@ -5644,6 +5742,31 @@ material_vendor = Peopoly ## 0.05 SL1S +## Prusa Polymers 0.05 + +[sla_material:Prusament Resin Tough Prusa Orange @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Prusa Polymers + +[sla_material:Prusament Resin Tough Rich Black @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Prusa Polymers + +[sla_material:Prusament Resin Tough Anthracite Grey @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.4 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Prusa Polymers + +## Made for Prusa 0.05 + [sla_material:Prusa Orange Tough @0.05 SL1S] inherits = *0.05_sl1s* exposure_time = 2 @@ -5758,6 +5881,31 @@ material_vendor = Peopoly ## 0.1 SL1S +## Prusa Polymers 0.1 + +[sla_material:Prusament Resin Tough Prusa Orange @0.1 SL1S] +inherits = *0.1_sl1s* +exposure_time = 2.6 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Prusa Polymers + +[sla_material:Prusament Resin Tough Rich Black @0.1 SL1S] +inherits = *0.1_sl1s* +exposure_time = 2.6 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Prusa Polymers + +[sla_material:Prusament Resin Tough Anthracite Grey @0.1 SL1S] +inherits = *0.1_sl1s* +exposure_time = 3 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Prusa Polymers + +## Made for Prusa 0.1 + [sla_material:Prusa Orange Tough @0.1 SL1S] inherits = *0.1_sl1s* exposure_time = 2.6 @@ -6573,7 +6721,7 @@ nozzle_diameter = 0.6 max_layer_height = 0.40 min_layer_height = 0.15 default_print_profile = 0.30mm QUALITY @0.6 nozzle MINI -retract_length = 3.5 +retract_length = 3.2 retract_before_travel = 1.5 [printer:Original Prusa MINI & MINI+ 0.8 nozzle] diff --git a/resources/shaders/gouraud_light_instanced.vs b/resources/shaders/gouraud_light_instanced.vs index 997b6a2bf..a42f8e9a4 100644 --- a/resources/shaders/gouraud_light_instanced.vs +++ b/resources/shaders/gouraud_light_instanced.vs @@ -34,9 +34,7 @@ void main() float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - float width = 1.5 * i_scales.x; - float height = 1.5 * i_scales.y; - vec4 world_position = vec4(v_position * vec3(vec2(width), height) + i_offset - vec3(0.0, 0.0, 0.5 * i_scales.y), 1.0); + vec4 world_position = vec4(v_position * vec3(vec2(1.5 * i_scales.x), 1.5 * i_scales.y) + i_offset - vec3(0.0, 0.0, 0.5 * i_scales.y), 1.0); vec3 eye_position = (gl_ModelViewMatrix * world_position).xyz; intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); diff --git a/sandboxes/aabb-evaluation/aabb-evaluation.cpp b/sandboxes/aabb-evaluation/aabb-evaluation.cpp index 9ec7451e5..1019ecf28 100644 --- a/sandboxes/aabb-evaluation/aabb-evaluation.cpp +++ b/sandboxes/aabb-evaluation/aabb-evaluation.cpp @@ -212,8 +212,7 @@ int main(const int argc, const char *argv[]) return -1; } - mesh.repair(); - if (mesh.facets_count() == 0) { + if (mesh.empty()) { std::cerr << "Error loading " << argv[1] << " . It is empty." << std::endl; return -1; } diff --git a/sandboxes/meshboolean/MeshBoolean.cpp b/sandboxes/meshboolean/MeshBoolean.cpp index 392d90707..c8649888f 100644 --- a/sandboxes/meshboolean/MeshBoolean.cpp +++ b/sandboxes/meshboolean/MeshBoolean.cpp @@ -24,7 +24,6 @@ int main(const int argc, const char * argv[]) TriangleMesh input; input.ReadSTLFile(argv[1]); - input.repair(); Benchmark bench; diff --git a/sandboxes/opencsg/Engine.cpp b/sandboxes/opencsg/Engine.cpp index f110b23c5..e64a47132 100644 --- a/sandboxes/opencsg/Engine.cpp +++ b/sandboxes/opencsg/Engine.cpp @@ -65,7 +65,7 @@ void CSGDisplay::render_scene() glFlush(); } -void Scene::set_print(uqptr &&print) +void Scene::set_print(std::unique_ptr &&print) { m_print = std::move(print); @@ -85,7 +85,7 @@ void CSGDisplay::SceneCache::clear() primitives.clear(); } -shptr CSGDisplay::SceneCache::add_mesh(const TriangleMesh &mesh) +std::shared_ptr CSGDisplay::SceneCache::add_mesh(const TriangleMesh &mesh) { auto p = std::make_shared(); p->load_mesh(mesh); @@ -94,7 +94,7 @@ shptr CSGDisplay::SceneCache::add_mesh(const TriangleMesh &mesh) return p; } -shptr CSGDisplay::SceneCache::add_mesh(const TriangleMesh &mesh, +std::shared_ptr CSGDisplay::SceneCache::add_mesh(const TriangleMesh &mesh, OpenCSG::Operation o, unsigned c) { @@ -145,7 +145,7 @@ void IndexedVertexArray::load_mesh(const TriangleMesh &mesh) this->vertices_and_normals_interleaved.reserve(this->vertices_and_normals_interleaved.size() + 3 * 3 * 2 * mesh.facets_count()); int vertices_count = 0; - for (size_t i = 0; i < mesh.stl.stats.number_of_facets; ++i) { + for (size_t i = 0; i < mesh.facets_count(); ++i) { const stl_facet &facet = mesh.stl.facet_start[i]; for (int j = 0; j < 3; ++j) this->push_geometry(facet.vertex[j](0), facet.vertex[j](1), facet.vertex[j](2), facet.normal(0), facet.normal(1), facet.normal(2)); @@ -409,7 +409,6 @@ void CSGDisplay::on_scene_updated(const Scene &scene) interior.transform(po->trafo().inverse()); mshinst.merge(interior); - mshinst.require_shared_vertices(); mi->transform_mesh(&mshinst); @@ -417,14 +416,12 @@ void CSGDisplay::on_scene_updated(const Scene &scene) auto center = bb.center().cast(); mshinst.translate(-center); - mshinst.require_shared_vertices(); m_scene_cache.add_mesh(mshinst, OpenCSG::Intersection, m_csgsettings.get_convexity()); } for (const sla::DrainHole &holept : holedata) { TriangleMesh holemesh = sla::to_triangle_mesh(holept.to_mesh()); - holemesh.require_shared_vertices(); m_scene_cache.add_mesh(holemesh, OpenCSG::Subtraction, 1); } } diff --git a/sandboxes/opencsg/Engine.hpp b/sandboxes/opencsg/Engine.hpp index fc76c1b31..114268ddc 100644 --- a/sandboxes/opencsg/Engine.hpp +++ b/sandboxes/opencsg/Engine.hpp @@ -17,11 +17,6 @@ class SLAPrint; namespace GL { -// Simple shorthands for smart pointers -template using shptr = std::shared_ptr; -template using uqptr = std::unique_ptr; -template using wkptr = std::weak_ptr; - template> using vector = std::vector; // remove empty weak pointers from a vector @@ -61,7 +56,7 @@ public: }; private: - vector> m_listeners; + vector> m_listeners; public: virtual ~MouseInput() = default; @@ -95,7 +90,7 @@ public: call(&Listener::on_moved_to, m_listeners, x, y); } - void add_listener(shptr listener) + void add_listener(std::shared_ptr listener) { m_listeners.emplace_back(listener); cleanup(m_listeners); @@ -322,7 +317,7 @@ public: // The scene is a wrapper around SLAPrint which holds the data to be visualized. class Scene { - uqptr m_print; + std::unique_ptr m_print; public: // Subscribers will be notified if the model is changed. This might be a @@ -340,19 +335,19 @@ public: Scene(); ~Scene(); - void set_print(uqptr &&print); + void set_print(std::unique_ptr &&print); const SLAPrint * get_print() const { return m_print.get(); } BoundingBoxf3 get_bounding_box() const; - void add_listener(shptr listener) + void add_listener(std::shared_ptr listener) { m_listeners.emplace_back(listener); cleanup(m_listeners); } private: - vector> m_listeners; + vector> m_listeners; }; // The basic Display. This is almost just an interface but will do all the @@ -366,20 +361,20 @@ protected: Vec2i m_size; bool m_initialized = false; - shptr m_camera; + std::shared_ptr m_camera; FpsCounter m_fps_counter; public: - explicit Display(shptr camera = nullptr) + explicit Display(std::shared_ptr camera = nullptr) : m_camera(camera ? camera : std::make_shared()) {} ~Display() override; - shptr get_camera() const { return m_camera; } - shptr get_camera() { return m_camera; } - void set_camera(shptr cam) { m_camera = cam; } + std::shared_ptr get_camera() const { return m_camera; } + std::shared_ptr get_camera() { return m_camera; } + void set_camera(std::shared_ptr cam) { m_camera = cam; } virtual void swap_buffers() = 0; virtual void set_active(long width, long height); @@ -410,14 +405,14 @@ protected: // Cache the renderable primitives. These will be fetched when the scene // is modified. struct SceneCache { - vector> primitives; + vector> primitives; vector primitives_free; vector primitives_csg; void clear(); - shptr add_mesh(const TriangleMesh &mesh); - shptr add_mesh(const TriangleMesh &mesh, + std::shared_ptr add_mesh(const TriangleMesh &mesh); + std::shared_ptr add_mesh(const TriangleMesh &mesh, OpenCSG::Operation op, unsigned covexity); } m_scene_cache; @@ -446,13 +441,13 @@ class Controller : public std::enable_shared_from_this, Vec2i m_mouse_pos, m_mouse_pos_rprev, m_mouse_pos_lprev; bool m_left_btn = false, m_right_btn = false; - shptr m_scene; - vector> m_displays; + std::shared_ptr m_scene; + vector> m_displays; // Call a method of Camera on all the cameras of the attached displays template void call_cameras(F &&f, Args&&... args) { - for (wkptr &l : m_displays) + for (std::weak_ptr &l : m_displays) if (auto disp = l.lock()) if (auto cam = disp->get_camera()) (cam.get()->*f)(std::forward(args)...); } @@ -460,7 +455,7 @@ class Controller : public std::enable_shared_from_this, public: // Set the scene that will be controlled. - void set_scene(shptr scene) + void set_scene(std::shared_ptr scene) { m_scene = scene; m_scene->add_listener(shared_from_this()); @@ -468,7 +463,7 @@ public: const Scene * get_scene() const { return m_scene.get(); } - void add_display(shptr disp) + void add_display(std::shared_ptr disp) { m_displays.emplace_back(disp); cleanup(m_displays); diff --git a/sandboxes/opencsg/ShaderCSGDisplay.cpp b/sandboxes/opencsg/ShaderCSGDisplay.cpp index 8ceb234be..2413bad5b 100644 --- a/sandboxes/opencsg/ShaderCSGDisplay.cpp +++ b/sandboxes/opencsg/ShaderCSGDisplay.cpp @@ -43,7 +43,6 @@ void ShaderCSGDisplay::on_scene_updated(const Scene &scene) interior.transform(po->trafo().inverse()); mshinst.merge(interior); - mshinst.require_shared_vertices(); mi->transform_mesh(&mshinst); @@ -51,15 +50,11 @@ void ShaderCSGDisplay::on_scene_updated(const Scene &scene) auto center = bb.center().cast(); mshinst.translate(-center); - mshinst.require_shared_vertices(); add_mesh(mshinst); } - for (const sla::DrainHole &holept : holedata) { - TriangleMesh holemesh = sla::to_triangle_mesh(holept.to_mesh()); - holemesh.require_shared_vertices(); - add_mesh(holemesh); - } + for (const sla::DrainHole &holept : holedata) + add_mesh(sla::to_triangle_mesh(holept.to_mesh())); } repaint(); diff --git a/sandboxes/opencsg/ShaderCSGDisplay.hpp b/sandboxes/opencsg/ShaderCSGDisplay.hpp index bf0c3a424..0e2c763df 100644 --- a/sandboxes/opencsg/ShaderCSGDisplay.hpp +++ b/sandboxes/opencsg/ShaderCSGDisplay.hpp @@ -12,7 +12,7 @@ class CSGVolume: public Volume class ShaderCSGDisplay: public Display { protected: - vector> m_volumes; + vector> m_volumes; void add_mesh(const TriangleMesh &mesh); public: diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index f5fb12493..f0627b974 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -34,7 +34,7 @@ using namespace Slic3r::GL; class Renderer { protected: wxGLCanvas *m_canvas; - shptr m_context; + std::shared_ptr m_context; public: Renderer(wxGLCanvas *c): m_canvas{c} { @@ -86,16 +86,16 @@ public: class Canvas: public wxGLCanvas { // One display is active at a time, the OCSGRenderer by default. - shptr m_display; + std::shared_ptr m_display; public: template Canvas(Args &&...args): wxGLCanvas(std::forward(args)...) {} - shptr get_display() const { return m_display; } + std::shared_ptr get_display() const { return m_display; } - void set_display(shptr d) { m_display = d; } + void set_display(std::shared_ptr d) { m_display = d; } }; // Enumerate possible mouse events, we will record them. @@ -197,14 +197,14 @@ public: class MyFrame: public wxFrame { // Instantiate the 3D engine. - shptr m_scene; // Model - shptr m_canvas; // Views store - shptr m_ocsgdisplay; // View - shptr m_shadercsg_display; // Another view - shptr m_ctl; // Controller + std::shared_ptr m_scene; // Model + std::shared_ptr m_canvas; // Views store + std::shared_ptr m_ocsgdisplay; // View + std::shared_ptr m_shadercsg_display; // Another view + std::shared_ptr m_ctl; // Controller // Add a status bar with progress indication. - shptr m_stbar; + std::shared_ptr m_stbar; RecorderMouseInput m_mouse; @@ -237,7 +237,7 @@ class MyFrame: public wxFrame } }; - uqptr m_ui_job; + std::unique_ptr m_ui_job; // To keep track of the running average of measured fps values. double m_fps_avg = 0.; diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index 3490b8183..0da5e7380 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -397,7 +397,7 @@ int CLI::run(int argc, char **argv) TriangleMesh mesh = model.mesh(); mesh.repair(); - TriangleMeshPtrs meshes = mesh.cut_by_grid(m_config.option("cut_grid")->value); + std::vector meshes = mesh.cut_by_grid(m_config.option("cut_grid")->value); size_t i = 0; for (TriangleMesh* m : meshes) { Model out; diff --git a/src/admesh/connect.cpp b/src/admesh/connect.cpp index e5491b1aa..8c3ab154a 100644 --- a/src/admesh/connect.cpp +++ b/src/admesh/connect.cpp @@ -239,6 +239,7 @@ private: return edge_a.facet_number != edge_b.facet_number && edge_a == edge_b; } + // Connect edge_a with edge_b, update edge connection statistics. static void record_neighbors(stl_file *stl, const HashEdge &edge_a, const HashEdge &edge_b) { // Facet a's neighbor is facet b @@ -249,7 +250,7 @@ private: stl->neighbors_start[edge_b.facet_number].neighbor[edge_b.which_edge % 3] = edge_a.facet_number; /* sets the .neighbor part */ stl->neighbors_start[edge_b.facet_number].which_vertex_not[edge_b.which_edge % 3] = (edge_a.which_edge + 2) % 3; /* sets the .which_vertex_not part */ - if (((edge_a.which_edge < 3) && (edge_b.which_edge < 3)) || ((edge_a.which_edge > 2) && (edge_b.which_edge > 2))) { + if ((edge_a.which_edge < 3 && edge_b.which_edge < 3) || (edge_a.which_edge > 2 && edge_b.which_edge > 2)) { // These facets are oriented in opposite directions, their normals are probably messed up. stl->neighbors_start[edge_a.facet_number].which_vertex_not[edge_a.which_edge % 3] += 3; stl->neighbors_start[edge_b.facet_number].which_vertex_not[edge_b.which_edge % 3] += 3; @@ -479,12 +480,13 @@ void stl_check_facets_exact(stl_file *stl) void stl_check_facets_nearby(stl_file *stl, float tolerance) { - if ( (stl->stats.connected_facets_1_edge == stl->stats.number_of_facets) - && (stl->stats.connected_facets_2_edge == stl->stats.number_of_facets) - && (stl->stats.connected_facets_3_edge == stl->stats.number_of_facets)) { + assert(stl->stats.connected_facets_3_edge <= stl->stats.connected_facets_2_edge); + assert(stl->stats.connected_facets_2_edge <= stl->stats.connected_facets_1_edge); + assert(stl->stats.connected_facets_1_edge <= stl->stats.number_of_facets); + + if (stl->stats.connected_facets_3_edge == stl->stats.number_of_facets) // No need to check any further. All facets are connected. return; - } HashTableEdges hash_table(stl->stats.number_of_facets); for (uint32_t i = 0; i < stl->stats.number_of_facets; ++ i) { @@ -514,22 +516,12 @@ void stl_remove_unconnected_facets(stl_file *stl) /* Update list of connected edges */ stl_neighbors &neighbors = stl->neighbors_start[facet_number]; // Update statistics on unconnected triangle edges. - switch ((neighbors.neighbor[0] == -1) + (neighbors.neighbor[1] == -1) + (neighbors.neighbor[2] == -1)) { - case 0: // Facet has 3 neighbors - -- stl->stats.connected_facets_3_edge; - -- stl->stats.connected_facets_2_edge; - -- stl->stats.connected_facets_1_edge; - break; - case 1: // Facet has 2 neighbors - -- stl->stats.connected_facets_2_edge; - -- stl->stats.connected_facets_1_edge; - break; - case 2: // Facet has 1 neighbor - -- stl->stats.connected_facets_1_edge; - case 3: // Facet has 0 neighbors - break; - default: - assert(false); + switch (neighbors.num_neighbors()) { + case 3: -- stl->stats.connected_facets_3_edge; // fall through + case 2: -- stl->stats.connected_facets_2_edge; // fall through + case 1: -- stl->stats.connected_facets_1_edge; // fall through + case 0: break; + default: assert(false); } if (facet_number < int(-- stl->stats.number_of_facets)) { @@ -555,20 +547,14 @@ void stl_remove_unconnected_facets(stl_file *stl) auto remove_degenerate = [stl, remove_facet](int facet) { - // Update statistics on face connectivity. - auto stl_update_connects_remove_1 = [stl](int facet_num) { - //FIXME when decreasing 3_edge, should I increase 2_edge etc? - switch ((stl->neighbors_start[facet_num].neighbor[0] == -1) + (stl->neighbors_start[facet_num].neighbor[1] == -1) + (stl->neighbors_start[facet_num].neighbor[2] == -1)) { - case 0: // Facet has 3 neighbors - -- stl->stats.connected_facets_3_edge; break; - case 1: // Facet has 2 neighbors - -- stl->stats.connected_facets_2_edge; break; - case 2: // Facet has 1 neighbor - -- stl->stats.connected_facets_1_edge; break; - case 3: // Facet has 0 neighbors - break; - default: - assert(false); + // Update statistics on face connectivity after one edge was disconnected on the facet "facet_num". + auto update_connects_remove_1 = [stl](int facet_num) { + switch (stl->neighbors_start[facet_num].num_neighbors()) { + case 0: assert(false); break; + case 1: -- stl->stats.connected_facets_1_edge; break; + case 2: -- stl->stats.connected_facets_2_edge; break; + case 3: -- stl->stats.connected_facets_3_edge; break; + default: assert(false); } }; @@ -604,9 +590,9 @@ void stl_remove_unconnected_facets(stl_file *stl) // Update statistics on edge connectivity. if ((neighbor[0] == -1) && (neighbor[1] != -1)) - stl_update_connects_remove_1(neighbor[1]); + update_connects_remove_1(neighbor[1]); if ((neighbor[1] == -1) && (neighbor[0] != -1)) - stl_update_connects_remove_1(neighbor[0]); + update_connects_remove_1(neighbor[0]); if (neighbor[0] >= 0) { if (neighbor[1] >= 0) { @@ -634,7 +620,7 @@ void stl_remove_unconnected_facets(stl_file *stl) stl->neighbors_start[neighbor[1]].which_vertex_not[(vnot[1] + 1) % 3] = vnot[0]; } if (neighbor[2] >= 0) { - stl_update_connects_remove_1(neighbor[2]); + update_connects_remove_1(neighbor[2]); stl->neighbors_start[neighbor[2]].neighbor[(vnot[2] + 1) % 3] = -1; } @@ -652,11 +638,9 @@ void stl_remove_unconnected_facets(stl_file *stl) ++ i; if (stl->stats.connected_facets_1_edge < (int)stl->stats.number_of_facets) { - // remove completely unconnected facets + // There are some faces with no connected edge at all. Remove completely unconnected facets. for (uint32_t i = 0; i < stl->stats.number_of_facets;) - if (stl->neighbors_start[i].neighbor[0] == -1 && - stl->neighbors_start[i].neighbor[1] == -1 && - stl->neighbors_start[i].neighbor[2] == -1) { + if (stl->neighbors_start[i].num_neighbors() == 0) { // This facet is completely unconnected. Remove it. remove_facet(i); assert(stl_validate(stl)); diff --git a/src/admesh/stl.h b/src/admesh/stl.h index 1ca75c95d..8c30a6ae5 100644 --- a/src/admesh/stl.h +++ b/src/admesh/stl.h @@ -79,8 +79,7 @@ struct stl_neighbors { which_vertex_not[1] = -1; which_vertex_not[2] = -1; } - int num_neighbors_missing() const { return (this->neighbor[0] == -1) + (this->neighbor[1] == -1) + (this->neighbor[2] == -1); } - int num_neighbors() const { return 3 - this->num_neighbors_missing(); } + int num_neighbors() const { return 3 - ((this->neighbor[0] == -1) + (this->neighbor[1] == -1) + (this->neighbor[2] == -1)); } // Index of a neighbor facet. int neighbor[3]; @@ -92,28 +91,44 @@ struct stl_stats { stl_stats() { memset(&header, 0, 81); } char header[81]; stl_type type = (stl_type)0; + // Should always match the number of facets stored inside stl_file::facet_start. uint32_t number_of_facets = 0; + // Bounding box. stl_vertex max = stl_vertex::Zero(); stl_vertex min = stl_vertex::Zero(); stl_vertex size = stl_vertex::Zero(); float bounding_diameter = 0.f; float shortest_edge = 0.f; + // After repair, the volume shall always be positive. float volume = -1.f; + // Number of face edges connected to another face. + // Don't use this statistics after repair, use the connected_facets_1/2/3_edge instead! int connected_edges = 0; + // Faces with >=1, >=2 and 3 edges connected to another face. int connected_facets_1_edge = 0; int connected_facets_2_edge = 0; int connected_facets_3_edge = 0; + // Faces with 1, 2 and 3 open edges after exact chaining, but before repair. int facets_w_1_bad_edge = 0; int facets_w_2_bad_edge = 0; int facets_w_3_bad_edge = 0; + // Number of faces read form an STL file. int original_num_facets = 0; + // Number of edges connected one to another by snapping their end vertices. int edges_fixed = 0; + // Number of faces removed because they were degenerated. int degenerate_facets = 0; + // Total number of facets removed: Degenerate faces and unconnected faces. int facets_removed = 0; + // Number of faces added by hole filling. int facets_added = 0; + // Number of faces reversed because of negative volume or because one patch was connected to another patch with incompatible normals. int facets_reversed = 0; + // Number of incompatible edges remaining after the patches were connected together and possibly their normals flipped. int backwards_edges = 0; + // Number of triangles, which were flipped during the fixing process. int normals_fixed = 0; + // Number of connected triangle patches. int number_of_parts = 0; void clear() { *this = stl_stats(); } @@ -135,13 +150,11 @@ struct stl_file { std::vector facet_start; std::vector neighbors_start; // Statistics - stl_stats stats; + stl_stats stats; }; struct indexed_triangle_set { - indexed_triangle_set() {} - void clear() { indices.clear(); vertices.clear(); } size_t memsize() const { @@ -149,9 +162,7 @@ struct indexed_triangle_set } std::vector indices; - std::vector vertices; - //FIXME add normals once we get rid of the stl_file from TriangleMesh completely. - //std::vector normals + std::vector vertices; bool empty() const { return indices.empty() || vertices.empty(); } }; @@ -244,9 +255,15 @@ inline void stl_transform(stl_file *stl, const Eigen::Matrix +inline void its_translate(indexed_triangle_set &its, const V v) +{ + for (stl_vertex &v_dst : its.vertices) + v_dst += v; +} template -extern void its_transform(indexed_triangle_set &its, T *trafo3x4) +inline void its_transform(indexed_triangle_set &its, T *trafo3x4) { for (stl_vertex &v_dst : its.vertices) { stl_vertex v_src = v_dst; diff --git a/src/admesh/stl_io.cpp b/src/admesh/stl_io.cpp index ddf377c78..26f5dc321 100644 --- a/src/admesh/stl_io.cpp +++ b/src/admesh/stl_io.cpp @@ -205,11 +205,12 @@ bool stl_write_quad_object(stl_file *stl, char *file) fprintf(fp, "CQUAD\n"); for (uint32_t i = 0; i < stl->stats.number_of_facets; ++ i) { - switch (stl->neighbors_start[i].num_neighbors_missing()) { - case 0: color = connect_color; break; - case 1: color = uncon_1_color; break; - case 2: color = uncon_2_color; break; - default: color = uncon_3_color; + switch (stl->neighbors_start[i].num_neighbors()) { + case 0: + default: color = uncon_3_color; break; + case 1: color = uncon_2_color; break; + case 2: color = uncon_1_color; break; + case 3: color = connect_color; break; } fprintf(fp, "%f %f %f %1.1f %1.1f %1.1f 1\n", stl->facet_start[i].vertex[0](0), stl->facet_start[i].vertex[0](1), stl->facet_start[i].vertex[0](2), color(0), color(1), color(2)); fprintf(fp, "%f %f %f %1.1f %1.1f %1.1f 1\n", stl->facet_start[i].vertex[1](0), stl->facet_start[i].vertex[1](1), stl->facet_start[i].vertex[1](2), color(0), color(1), color(2)); diff --git a/src/imgui/imconfig.h b/src/imgui/imconfig.h index 713499a1b..c5627f16b 100644 --- a/src/imgui/imconfig.h +++ b/src/imgui/imconfig.h @@ -149,10 +149,11 @@ namespace ImGui const wchar_t CustomSupportsMarker = 0x1D; const wchar_t CustomSeamMarker = 0x1E; const wchar_t MmuSegmentationMarker = 0x1F; + // Do not forget use following letters only in wstring const wchar_t DocumentationButton = 0x2600; const wchar_t DocumentationHoverButton = 0x2601; const wchar_t ClippyMarker = 0x2602; - + const wchar_t InfoMarker = 0x2603; // void MyFunction(const char* name, const MyMatrix44& v); } diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 80024da1d..8999387f1 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -140,11 +140,17 @@ void AppConfig::set_defaults() if (get("default_action_on_select_preset").empty()) set("default_action_on_select_preset", "none"); // , "transfer", "discard" or "save" + if (get("default_action_on_new_project").empty()) + set("default_action_on_new_project", "none"); // , "keep(transfer)", "discard" or "save" + if (get("color_mapinulation_panel").empty()) set("color_mapinulation_panel", "0"); if (get("order_volumes").empty()) set("order_volumes", "1"); + + if (get("clear_undo_redo_stack_on_new_project").empty()) + set("clear_undo_redo_stack_on_new_project", "1"); } else { #ifdef _WIN32 diff --git a/src/libslic3r/BlacklistedLibraryCheck.cpp b/src/libslic3r/BlacklistedLibraryCheck.cpp index 76f675c70..938f54249 100644 --- a/src/libslic3r/BlacklistedLibraryCheck.cpp +++ b/src/libslic3r/BlacklistedLibraryCheck.cpp @@ -12,7 +12,7 @@ namespace Slic3r { #ifdef WIN32 //only dll name with .dll suffix - currently case sensitive -const std::vector BlacklistedLibraryCheck::blacklist({ L"NahimicOSD.dll", L"SS2OSD.dll" }); +const std::vector BlacklistedLibraryCheck::blacklist({ L"NahimicOSD.dll", L"SS2OSD.dll", L"amhook.dll", L"AMHook.dll" }); bool BlacklistedLibraryCheck::get_blacklisted(std::vector& names) { diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 4539efc8d..e4db50624 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -80,8 +80,6 @@ add_library(libslic3r STATIC Format/OBJ.hpp Format/objparser.cpp Format/objparser.hpp - Format/PRUS.cpp - Format/PRUS.hpp Format/STL.cpp Format/STL.hpp Format/SL1.hpp diff --git a/src/libslic3r/ClipperUtils.cpp b/src/libslic3r/ClipperUtils.cpp index 8a4dfc03c..e8f87a6e3 100644 --- a/src/libslic3r/ClipperUtils.cpp +++ b/src/libslic3r/ClipperUtils.cpp @@ -126,6 +126,45 @@ ExPolygons ClipperPaths_to_Slic3rExPolygons(const ClipperLib::Paths &input) return PolyTreeToExPolygons(std::move(polytree)); } +#if 0 +// Global test. +bool has_duplicate_points(const ClipperLib::PolyTree &polytree) +{ + struct Helper { + static void collect_points_recursive(const ClipperLib::PolyNode &polynode, ClipperLib::Path &out) { + // For each hole of the current expolygon: + out.insert(out.end(), polynode.Contour.begin(), polynode.Contour.end()); + for (int i = 0; i < polynode.ChildCount(); ++ i) + collect_points_recursive(*polynode.Childs[i], out); + } + }; + ClipperLib::Path pts; + for (int i = 0; i < polytree.ChildCount(); ++ i) + Helper::collect_points_recursive(*polytree.Childs[i], pts); + return has_duplicate_points(std::move(pts)); +} +#else +// Local test inside each of the contours. +bool has_duplicate_points(const ClipperLib::PolyTree &polytree) +{ + struct Helper { + static bool has_duplicate_points_recursive(const ClipperLib::PolyNode &polynode) { + if (has_duplicate_points(polynode.Contour)) + return true; + for (int i = 0; i < polynode.ChildCount(); ++ i) + if (has_duplicate_points_recursive(*polynode.Childs[i])) + return true; + return false; + } + }; + ClipperLib::Path pts; + for (int i = 0; i < polytree.ChildCount(); ++ i) + if (Helper::has_duplicate_points_recursive(*polytree.Childs[i])) + return true; + return false; +} +#endif + // Offset outside by 10um, one by one. template static ClipperLib::Paths safety_offset(PathsProvider &&paths) @@ -467,6 +506,8 @@ Slic3r::Polygons diff(const Slic3r::ExPolygons &subject, const Slic3r::Polygons { return _clipper(ClipperLib::ctDifference, ClipperUtils::ExPolygonsProvider(subject), ClipperUtils::PolygonsProvider(clip), do_safety_offset); } Slic3r::Polygons diff(const Slic3r::ExPolygons &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset) { return _clipper(ClipperLib::ctDifference, ClipperUtils::ExPolygonsProvider(subject), ClipperUtils::ExPolygonsProvider(clip), do_safety_offset); } +Slic3r::Polygons intersection(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset) + { return _clipper(ClipperLib::ctIntersection, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::SinglePathProvider(clip.points), do_safety_offset); } Slic3r::Polygons intersection(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset) { return _clipper(ClipperLib::ctIntersection, ClipperUtils::PolygonsProvider(subject), ClipperUtils::PolygonsProvider(clip), do_safety_offset); } Slic3r::Polygons intersection(const Slic3r::ExPolygon &subject, const Slic3r::ExPolygon &clip, ApplySafetyOffset do_safety_offset) @@ -496,6 +537,8 @@ Slic3r::ExPolygons diff_ex(const Slic3r::Polygons &subject, const Slic3r::Surfac { return _clipper_ex(ClipperLib::ctDifference, ClipperUtils::PolygonsProvider(subject), ClipperUtils::SurfacesProvider(clip), do_safety_offset); } Slic3r::ExPolygons diff_ex(const Slic3r::Polygons &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset) { return _clipper_ex(ClipperLib::ctDifference, ClipperUtils::PolygonsProvider(subject), ClipperUtils::ExPolygonsProvider(clip), do_safety_offset); } +Slic3r::ExPolygons diff_ex(const Slic3r::ExPolygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset) + { return _clipper_ex(ClipperLib::ctDifference, ClipperUtils::ExPolygonProvider(subject), ClipperUtils::SinglePathProvider(clip.points), do_safety_offset); } Slic3r::ExPolygons diff_ex(const Slic3r::ExPolygon &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset) { return _clipper_ex(ClipperLib::ctDifference, ClipperUtils::ExPolygonProvider(subject), ClipperUtils::PolygonsProvider(clip), do_safety_offset); } Slic3r::ExPolygons diff_ex(const Slic3r::ExPolygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset) @@ -610,12 +653,18 @@ Polylines _clipper_pl_closed(ClipperLib::ClipType clipType, PathProvider1 &&subj Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::Polygons &clip) { return _clipper_pl_open(ClipperLib::ctDifference, ClipperUtils::PolylinesProvider(subject), ClipperUtils::PolygonsProvider(clip)); } +Slic3r::Polylines diff_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygon &clip) + { return _clipper_pl_open(ClipperLib::ctDifference, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::ExPolygonProvider(clip)); } Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygon &clip) { return _clipper_pl_open(ClipperLib::ctDifference, ClipperUtils::PolylinesProvider(subject), ClipperUtils::ExPolygonProvider(clip)); } Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygons &clip) { return _clipper_pl_open(ClipperLib::ctDifference, ClipperUtils::PolylinesProvider(subject), ClipperUtils::ExPolygonsProvider(clip)); } Slic3r::Polylines diff_pl(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip) { return _clipper_pl_closed(ClipperLib::ctDifference, ClipperUtils::PolygonsProvider(subject), ClipperUtils::PolygonsProvider(clip)); } +Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::Polygon &clip) + { return _clipper_pl_open(ClipperLib::ctIntersection, ClipperUtils::PolylinesProvider(subject), ClipperUtils::SinglePathProvider(clip.points)); } +Slic3r::Polylines intersection_pl(const Slic3r::Polyline &subject, const Slic3r::Polygons &clip) + { return _clipper_pl_open(ClipperLib::ctIntersection, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::PolygonsProvider(clip)); } Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::Polygons &clip) { return _clipper_pl_open(ClipperLib::ctIntersection, ClipperUtils::PolylinesProvider(subject), ClipperUtils::PolygonsProvider(clip)); } Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygons &clip) @@ -637,7 +686,9 @@ Lines _clipper_ln(ClipperLib::ClipType clipType, const Lines &subject, const Pol // convert Polylines to Lines Lines retval; for (Polylines::const_iterator polyline = polylines.begin(); polyline != polylines.end(); ++polyline) - retval.emplace_back(polyline->operator Line()); + if (polyline->size() >= 2) + //FIXME It may happen, that Clipper produced a polyline with more than 2 collinear points by clipping a single line with polygons. It is a very rare issue, but it happens, see GH #6933. + retval.push_back({ polyline->front(), polyline->back() }); return retval; } diff --git a/src/libslic3r/ClipperUtils.hpp b/src/libslic3r/ClipperUtils.hpp index c4e014a74..f49d922c1 100644 --- a/src/libslic3r/ClipperUtils.hpp +++ b/src/libslic3r/ClipperUtils.hpp @@ -303,6 +303,7 @@ Slic3r::ExPolygons diff_ex(const Slic3r::Polygons &subject, const Slic3r::Polygo Slic3r::ExPolygons diff_ex(const Slic3r::Polygons &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::ExPolygons diff_ex(const Slic3r::Polygons &subject, const Slic3r::Surfaces &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::ExPolygons diff_ex(const Slic3r::Polygon &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); +Slic3r::ExPolygons diff_ex(const Slic3r::ExPolygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::ExPolygons diff_ex(const Slic3r::ExPolygon &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::ExPolygons diff_ex(const Slic3r::ExPolygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::ExPolygons diff_ex(const Slic3r::ExPolygons &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); @@ -312,6 +313,7 @@ Slic3r::ExPolygons diff_ex(const Slic3r::ExPolygons &subject, const Slic3r::Surf Slic3r::ExPolygons diff_ex(const Slic3r::Surfaces &subject, const Slic3r::Surfaces &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::ExPolygons diff_ex(const Slic3r::SurfacesPtr &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::Polygons &clip); +Slic3r::Polylines diff_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygon &clip); Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygon &clip); Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygons &clip); Slic3r::Polylines diff_pl(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip); @@ -322,6 +324,7 @@ inline Slic3r::Lines diff_ln(const Slic3r::Lines &subject, const Slic3r::Polygon } // Safety offset is applied to the clipping polygons only. +Slic3r::Polygons intersection(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polygons intersection(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polygons intersection(const Slic3r::ExPolygon &subject, const Slic3r::ExPolygon &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polygons intersection(const Slic3r::ExPolygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); @@ -337,6 +340,8 @@ Slic3r::ExPolygons intersection_ex(const Slic3r::Surfaces &subject, const Slic3r Slic3r::ExPolygons intersection_ex(const Slic3r::Surfaces &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::ExPolygons intersection_ex(const Slic3r::Surfaces &subject, const Slic3r::Surfaces &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::ExPolygons intersection_ex(const Slic3r::SurfacesPtr &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); +Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::Polygon &clip); +Slic3r::Polylines intersection_pl(const Slic3r::Polyline &subject, const Slic3r::Polygons &clip); Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::Polygons &clip); Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygons &clip); Slic3r::Polylines intersection_pl(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip); diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index ab58a43aa..2d4780d0e 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -740,7 +740,11 @@ ConfigSubstitutions ConfigBase::load(const boost::property_tree::ptree &tree, Fo } // Load the config keys from the given string. -static inline size_t load_from_gcode_string_legacy(ConfigBase &config, const char *str, ConfigSubstitutionContext &substitutions) +#if ENABLE_FIX_SUPERSLICER_GCODE_IMPORT +size_t ConfigBase::load_from_gcode_string_legacy(ConfigBase& config, const char* str, ConfigSubstitutionContext& substitutions) +#else +static inline size_t load_from_gcode_string_legacy(ConfigBase& config, const char* str, ConfigSubstitutionContext& substitutions) +#endif // ENABLE_FIX_SUPERSLICER_GCODE_IMPORT { if (str == nullptr) return 0; diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index 6439e4632..dd121c90a 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -2015,6 +2015,10 @@ public: // Set all the nullable values to nils. void null_nullables(); +#if ENABLE_FIX_SUPERSLICER_GCODE_IMPORT + static size_t load_from_gcode_string_legacy(ConfigBase& config, const char* str, ConfigSubstitutionContext& substitutions); +#endif // ENABLE_FIX_SUPERSLICER_GCODE_IMPORT + private: // Set a configuration value from a string. bool set_deserialize_raw(const t_config_option_key& opt_key_src, const std::string& value, ConfigSubstitutionContext& substitutions, bool append); diff --git a/src/libslic3r/ExPolygon.cpp b/src/libslic3r/ExPolygon.cpp index 506ba8cb6..bfe0479fe 100644 --- a/src/libslic3r/ExPolygon.cpp +++ b/src/libslic3r/ExPolygon.cpp @@ -92,7 +92,7 @@ bool ExPolygon::contains(const Line &line) const bool ExPolygon::contains(const Polyline &polyline) const { - return diff_pl((Polylines)polyline, *this).empty(); + return diff_pl(polyline, *this).empty(); } bool ExPolygon::contains(const Polylines &polylines) const @@ -114,10 +114,11 @@ bool ExPolygon::contains(const Polylines &polylines) const bool ExPolygon::contains(const Point &point) const { - if (!this->contour.contains(point)) return false; - for (Polygons::const_iterator it = this->holes.begin(); it != this->holes.end(); ++it) { - if (it->contains(point)) return false; - } + if (! this->contour.contains(point)) + return false; + for (const Polygon &hole : this->holes) + if (hole.contains(point)) + return false; return true; } @@ -367,6 +368,57 @@ extern std::vector get_extents_vector(const ExPolygons &polygons) return out; } +bool has_duplicate_points(const ExPolygon &expoly) +{ +#if 1 + // Check globally. + size_t cnt = expoly.contour.points.size(); + for (const Polygon &hole : expoly.holes) + cnt += hole.points.size(); + std::vector allpts; + allpts.reserve(cnt); + allpts.insert(allpts.begin(), expoly.contour.points.begin(), expoly.contour.points.end()); + for (const Polygon &hole : expoly.holes) + allpts.insert(allpts.end(), hole.points.begin(), hole.points.end()); + return has_duplicate_points(std::move(allpts)); +#else + // Check per contour. + if (has_duplicate_points(expoly.contour)) + return true; + for (const Polygon &hole : expoly.holes) + if (has_duplicate_points(hole)) + return true; + return false; +#endif +} + +bool has_duplicate_points(const ExPolygons &expolys) +{ +#if 1 + // Check globally. + size_t cnt = 0; + for (const ExPolygon &expoly : expolys) { + cnt += expoly.contour.points.size(); + for (const Polygon &hole : expoly.holes) + cnt += hole.points.size(); + } + std::vector allpts; + allpts.reserve(cnt); + for (const ExPolygon &expoly : expolys) { + allpts.insert(allpts.begin(), expoly.contour.points.begin(), expoly.contour.points.end()); + for (const Polygon &hole : expoly.holes) + allpts.insert(allpts.end(), hole.points.begin(), hole.points.end()); + } + return has_duplicate_points(std::move(allpts)); +#else + // Check per contour. + for (const ExPolygon &expoly : expolys) + if (has_duplicate_points(expoly)) + return true; + return false; +#endif +} + bool remove_sticks(ExPolygon &poly) { return remove_sticks(poly.contour) || remove_sticks(poly.holes); diff --git a/src/libslic3r/ExPolygon.hpp b/src/libslic3r/ExPolygon.hpp index 4e28fc6ec..3d094f965 100644 --- a/src/libslic3r/ExPolygon.hpp +++ b/src/libslic3r/ExPolygon.hpp @@ -353,20 +353,24 @@ inline ExPolygons expolygons_simplify(const ExPolygons &expolys, double toleranc return out; } -extern BoundingBox get_extents(const ExPolygon &expolygon); -extern BoundingBox get_extents(const ExPolygons &expolygons); -extern BoundingBox get_extents_rotated(const ExPolygon &poly, double angle); -extern BoundingBox get_extents_rotated(const ExPolygons &polygons, double angle); -extern std::vector get_extents_vector(const ExPolygons &polygons); +BoundingBox get_extents(const ExPolygon &expolygon); +BoundingBox get_extents(const ExPolygons &expolygons); +BoundingBox get_extents_rotated(const ExPolygon &poly, double angle); +BoundingBox get_extents_rotated(const ExPolygons &polygons, double angle); +std::vector get_extents_vector(const ExPolygons &polygons); -extern bool remove_sticks(ExPolygon &poly); -extern void keep_largest_contour_only(ExPolygons &polygons); +// Test for duplicate points. The points are copied, sorted and checked for duplicates globally. +bool has_duplicate_points(const ExPolygon &expoly); +bool has_duplicate_points(const ExPolygons &expolys); + +bool remove_sticks(ExPolygon &poly); +void keep_largest_contour_only(ExPolygons &polygons); inline double area(const ExPolygon &poly) { return poly.area(); } inline double area(const ExPolygons &polys) { double s = 0.; for (auto &p : polys) s += p.area(); return s; } // Removes all expolygons smaller than min_area and also removes all holes smaller than min_area -extern bool remove_small_and_small_holes(ExPolygons &expolygons, double min_area); +bool remove_small_and_small_holes(ExPolygons &expolygons, double min_area); } // namespace Slic3r diff --git a/src/libslic3r/Fill/FillAdaptive.cpp b/src/libslic3r/Fill/FillAdaptive.cpp index 3eabc6106..29b343db0 100644 --- a/src/libslic3r/Fill/FillAdaptive.cpp +++ b/src/libslic3r/Fill/FillAdaptive.cpp @@ -928,7 +928,9 @@ static Polylines connect_lines_using_hooks(Polylines &&lines, const ExPolygon &b Linef l { { bg::get<0, 0>(seg), bg::get<0, 1>(seg) }, { bg::get<1, 0>(seg), bg::get<1, 1>(seg) } }; assert(line_alg::distance_to_squared(l, Vec2d(pt.cast())) > 1000 * 1000); #endif // NDEBUG - } else if (((Line)pl).distance_to_squared(pt) <= 1000 * 1000) + } else if (pl.size() >= 2 && + //FIXME Hoping that pl is really a line, trimmed by a polygon using ClipperUtils. Sometimes Clipper leaves some additional collinear points on the polyline, let's hope it is all right. + Line{ pl.front(), pl.back() }.distance_to_squared(pt) <= 1000 * 1000) out = closest.front().second; } return out; diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 544886a0f..acf250eaa 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -6,6 +6,7 @@ #include "../GCode.hpp" #include "../Geometry.hpp" #include "../GCode/ThumbnailData.hpp" +#include "../Semver.hpp" #include "../Time.hpp" #include "../I18N.hpp" @@ -21,6 +22,7 @@ #include #include #include +#include #include #include @@ -34,6 +36,8 @@ namespace pt = boost::property_tree; #include "TextConfigurationSerialization.hpp" +#include + // Slightly faster than sprintf("%.9g"), but there is an issue with the karma floating point formatter, // https://github.com/boostorg/spirit/pull/586 // where the exported string is one digit shorter than it should be to guarantee lossless round trip. @@ -133,6 +137,13 @@ static constexpr const char* SOURCE_OFFSET_Z_KEY = "source_offset_z"; static constexpr const char* SOURCE_IN_INCHES = "source_in_inches"; static constexpr const char* SOURCE_IN_METERS = "source_in_meters"; +static constexpr const char* MESH_STAT_EDGES_FIXED = "edges_fixed"; +static constexpr const char* MESH_STAT_DEGENERATED_FACETS = "degenerate_facets"; +static constexpr const char* MESH_STAT_FACETS_REMOVED = "facets_removed"; +static constexpr const char* MESH_STAT_FACETS_RESERVED = "facets_reversed"; +static constexpr const char* MESH_STAT_BACKWARDS_EDGES = "backwards_edges"; + + const unsigned int VALID_OBJECT_TYPES_COUNT = 1; const char* VALID_OBJECT_TYPES[] = { @@ -175,14 +186,18 @@ std::string get_attribute_value_string(const char** attributes, unsigned int att float get_attribute_value_float(const char** attributes, unsigned int attributes_size, const char* attribute_key) { - const char* text = get_attribute_value_charptr(attributes, attributes_size, attribute_key); - return (text != nullptr) ? (float)::atof(text) : 0.0f; + float value = 0.0f; + if (const char *text = get_attribute_value_charptr(attributes, attributes_size, attribute_key); text != nullptr) + fast_float::from_chars(text, text + strlen(text), value); + return value; } int get_attribute_value_int(const char** attributes, unsigned int attributes_size, const char* attribute_key) { - const char* text = get_attribute_value_charptr(attributes, attributes_size, attribute_key); - return (text != nullptr) ? ::atoi(text) : 0; + int value = 0; + if (const char *text = get_attribute_value_charptr(attributes, attributes_size, attribute_key); text != nullptr) + boost::spirit::qi::parse(text, text + strlen(text), boost::spirit::qi::int_, value); + return value; } bool get_attribute_value_bool(const char** attributes, unsigned int attributes_size, const char* attribute_key) @@ -301,8 +316,8 @@ namespace Slic3r { struct Geometry { - std::vector vertices; - std::vector triangles; + std::vector vertices; + std::vector triangles; std::vector custom_supports; std::vector custom_seam; std::vector mmu_segmentation; @@ -378,6 +393,7 @@ namespace Slic3r { unsigned int first_triangle_id; unsigned int last_triangle_id; MetadataList metadata; + RepairedMeshErrors mesh_stats; VolumeMetadata(unsigned int first_triangle_id, unsigned int last_triangle_id) : first_triangle_id(first_triangle_id) @@ -407,6 +423,8 @@ namespace Slic3r { unsigned int m_version; bool m_check_version; + // Semantic version of PrusaSlicer, that generated this 3MF. + boost::optional m_prusaslicer_generator_version; unsigned int m_fdm_supports_painting_version = 0; unsigned int m_seam_painting_version = 0; unsigned int m_mm_painting_version = 0; @@ -524,7 +542,9 @@ namespace Slic3r { bool _handle_end_config_object(); bool _handle_start_config_volume(const char** attributes, unsigned int num_attributes); + bool _handle_start_config_volume_mesh(const char** attributes, unsigned int num_attributes); bool _handle_end_config_volume(); + bool _handle_end_config_volume_mesh(); bool _handle_start_config_metadata(const char** attributes, unsigned int num_attributes); bool _handle_end_config_metadata(); @@ -716,7 +736,7 @@ namespace Slic3r { } // use the geometry to create the volumes in the new model objects - ObjectMetadata::VolumeMetadataList volumes(1, { 0, (unsigned int)geometry->triangles.size() / 3 - 1 }); + ObjectMetadata::VolumeMetadataList volumes(1, { 0, (unsigned int)geometry->triangles.size() - 1 }); // for each instance after the 1st, create a new model object containing only that instance // and copy into it the geometry @@ -789,7 +809,7 @@ namespace Slic3r { // config data not found, this model was not saved using slic3r pe // add the entire geometry as the single volume to generate - volumes.emplace_back(0, (int)obj_geometry->second.triangles.size() / 3 - 1); + volumes.emplace_back(0, (int)obj_geometry->second.triangles.size() - 1); // select as volumes volumes_ptr = &volumes; @@ -1384,6 +1404,8 @@ namespace Slic3r { res = _handle_start_config_object(attributes, num_attributes); else if (::strcmp(VOLUME_TAG, name) == 0) res = _handle_start_config_volume(attributes, num_attributes); + else if (::strcmp(MESH_TAG, name) == 0) + res = _handle_start_config_volume_mesh(attributes, num_attributes); else if (::strcmp(METADATA_TAG, name) == 0) res = _handle_start_config_metadata(attributes, num_attributes); @@ -1404,6 +1426,8 @@ namespace Slic3r { res = _handle_end_config_object(); else if (::strcmp(VOLUME_TAG, name) == 0) res = _handle_end_config_volume(); + else if (::strcmp(MESH_TAG, name) == 0) + res = _handle_end_config_volume_mesh(); else if (::strcmp(METADATA_TAG, name) == 0) res = _handle_end_config_metadata(); @@ -1555,9 +1579,10 @@ namespace Slic3r { { // appends the vertex coordinates // missing values are set equal to ZERO - m_curr_object.geometry.vertices.push_back(m_unit_factor * get_attribute_value_float(attributes, num_attributes, X_ATTR)); - m_curr_object.geometry.vertices.push_back(m_unit_factor * get_attribute_value_float(attributes, num_attributes, Y_ATTR)); - m_curr_object.geometry.vertices.push_back(m_unit_factor * get_attribute_value_float(attributes, num_attributes, Z_ATTR)); + m_curr_object.geometry.vertices.emplace_back( + m_unit_factor * get_attribute_value_float(attributes, num_attributes, X_ATTR), + m_unit_factor * get_attribute_value_float(attributes, num_attributes, Y_ATTR), + m_unit_factor * get_attribute_value_float(attributes, num_attributes, Z_ATTR)); return true; } @@ -1591,9 +1616,10 @@ namespace Slic3r { // appends the triangle's vertices indices // missing values are set equal to ZERO - m_curr_object.geometry.triangles.push_back((unsigned int)get_attribute_value_int(attributes, num_attributes, V1_ATTR)); - m_curr_object.geometry.triangles.push_back((unsigned int)get_attribute_value_int(attributes, num_attributes, V2_ATTR)); - m_curr_object.geometry.triangles.push_back((unsigned int)get_attribute_value_int(attributes, num_attributes, V3_ATTR)); + m_curr_object.geometry.triangles.emplace_back( + get_attribute_value_int(attributes, num_attributes, V1_ATTR), + get_attribute_value_int(attributes, num_attributes, V2_ATTR), + get_attribute_value_int(attributes, num_attributes, V3_ATTR)); m_curr_object.geometry.custom_supports.push_back(get_attribute_value_string(attributes, num_attributes, CUSTOM_SUPPORTS_ATTR)); m_curr_object.geometry.custom_seam.push_back(get_attribute_value_string(attributes, num_attributes, CUSTOM_SEAM_ATTR)); @@ -1706,21 +1732,20 @@ namespace Slic3r { const std::string msg = (boost::format(_(L("The selected 3mf file has been saved with a newer version of %1% and is not compatible."))) % std::string(SLIC3R_APP_NAME)).str(); throw version_error(msg); } - } - - if (m_curr_metadata_name == SLIC3RPE_FDM_SUPPORTS_PAINTING_VERSION) { + } else if (m_curr_metadata_name == "Application") { + // Generator application of the 3MF. + // SLIC3R_APP_KEY - SLIC3R_VERSION + if (boost::starts_with(m_curr_characters, "PrusaSlicer-")) + m_prusaslicer_generator_version = Semver::parse(m_curr_characters.substr(12)); + } else if (m_curr_metadata_name == SLIC3RPE_FDM_SUPPORTS_PAINTING_VERSION) { m_fdm_supports_painting_version = (unsigned int) atoi(m_curr_characters.c_str()); check_painting_version(m_fdm_supports_painting_version, FDM_SUPPORTS_PAINTING_VERSION, _(L("The selected 3MF contains FDM supports painted object using a newer version of PrusaSlicer and is not compatible."))); - } - - if (m_curr_metadata_name == SLIC3RPE_SEAM_PAINTING_VERSION) { + } else if (m_curr_metadata_name == SLIC3RPE_SEAM_PAINTING_VERSION) { m_seam_painting_version = (unsigned int) atoi(m_curr_characters.c_str()); check_painting_version(m_seam_painting_version, SEAM_PAINTING_VERSION, _(L("The selected 3MF contains seam painted object using a newer version of PrusaSlicer and is not compatible."))); - } - - if (m_curr_metadata_name == SLIC3RPE_MM_PAINTING_VERSION) { + } else if (m_curr_metadata_name == SLIC3RPE_MM_PAINTING_VERSION) { m_mm_painting_version = (unsigned int) atoi(m_curr_characters.c_str()); check_painting_version(m_mm_painting_version, MM_PAINTING_VERSION, _(L("The selected 3MF contains multi-material painted object using a newer version of PrusaSlicer and is not compatible."))); @@ -1837,12 +1862,43 @@ namespace Slic3r { return true; } + bool _3MF_Importer::_handle_start_config_volume_mesh(const char** attributes, unsigned int num_attributes) + { + IdToMetadataMap::iterator object = m_objects_metadata.find(m_curr_config.object_id); + if (object == m_objects_metadata.end()) { + add_error("Cannot assign volume mesh to a valid object"); + return false; + } + if (object->second.volumes.empty()) { + add_error("Cannot assign mesh to a valid olume"); + return false; + } + + ObjectMetadata::VolumeMetadata& volume = object->second.volumes.back(); + + int edges_fixed = get_attribute_value_int(attributes, num_attributes, MESH_STAT_EDGES_FIXED ); + int degenerate_facets = get_attribute_value_int(attributes, num_attributes, MESH_STAT_DEGENERATED_FACETS); + int facets_removed = get_attribute_value_int(attributes, num_attributes, MESH_STAT_FACETS_REMOVED ); + int facets_reversed = get_attribute_value_int(attributes, num_attributes, MESH_STAT_FACETS_RESERVED ); + int backwards_edges = get_attribute_value_int(attributes, num_attributes, MESH_STAT_BACKWARDS_EDGES ); + + volume.mesh_stats = { edges_fixed, degenerate_facets, facets_removed, facets_reversed, backwards_edges }; + + return true; + } + bool _3MF_Importer::_handle_end_config_volume() { // do nothing return true; } + bool _3MF_Importer::_handle_end_config_volume_mesh() + { + // do nothing + return true; + } + bool _3MF_Importer::_handle_start_config_metadata(const char** attributes, unsigned int num_attributes) { IdToMetadataMap::iterator object = m_objects_metadata.find(m_curr_config.object_id); @@ -1882,7 +1938,7 @@ namespace Slic3r { return false; } - unsigned int geo_tri_count = (unsigned int)geometry.triangles.size() / 3; + unsigned int geo_tri_count = (unsigned int)geometry.triangles.size(); unsigned int renamed_volumes_count = 0; for (const ObjectMetadata::VolumeMetadata& volume_data : volumes) { @@ -1893,77 +1949,78 @@ namespace Slic3r { Transform3d volume_matrix_to_object = Transform3d::Identity(); bool has_transform = false; -#if ENABLE_FIX_MIRRORED_VOLUMES_3MF_IMPORT_EXPORT - bool is_left_handed = false; -#endif // ENABLE_FIX_MIRRORED_VOLUMES_3MF_IMPORT_EXPORT // extract the volume transformation from the volume's metadata, if present for (const Metadata& metadata : volume_data.metadata) { if (metadata.key == MATRIX_KEY) { volume_matrix_to_object = Slic3r::Geometry::transform3d_from_string(metadata.value); has_transform = ! volume_matrix_to_object.isApprox(Transform3d::Identity(), 1e-10); -#if ENABLE_FIX_MIRRORED_VOLUMES_3MF_IMPORT_EXPORT - is_left_handed = Slic3r::Geometry::Transformation(volume_matrix_to_object).is_left_handed(); -#endif // ENABLE_FIX_MIRRORED_VOLUMES_3MF_IMPORT_EXPORT break; } } // splits volume out of imported geometry - TriangleMesh triangle_mesh; - stl_file &stl = triangle_mesh.stl; - unsigned int triangles_count = volume_data.last_triangle_id - volume_data.first_triangle_id + 1; - stl.stats.type = inmemory; - stl.stats.number_of_facets = (uint32_t)triangles_count; - stl.stats.original_num_facets = (int)stl.stats.number_of_facets; - stl_allocate(&stl); - - unsigned int src_start_id = volume_data.first_triangle_id * 3; - - for (unsigned int i = 0; i < triangles_count; ++i) { - unsigned int ii = i * 3; - stl_facet& facet = stl.facet_start[i]; - for (unsigned int v = 0; v < 3; ++v) { - unsigned int tri_id = geometry.triangles[src_start_id + ii + v] * 3; - if (tri_id + 2 >= geometry.vertices.size()) { - add_error("Malformed triangle mesh"); - return false; - } - facet.vertex[v] = Vec3f(geometry.vertices[tri_id + 0], geometry.vertices[tri_id + 1], geometry.vertices[tri_id + 2]); - } + indexed_triangle_set its; + its.indices.assign(geometry.triangles.begin() + volume_data.first_triangle_id, geometry.triangles.begin() + volume_data.last_triangle_id + 1); + const size_t triangles_count = its.indices.size(); + if (triangles_count == 0) { + add_error("An empty triangle mesh found"); + return false; } - stl_get_size(&stl); - triangle_mesh.repair(); + { + int min_id = its.indices.front()[0]; + int max_id = min_id; + for (const Vec3i& face : its.indices) { + for (const int tri_id : face) { + if (tri_id < 0 || tri_id >= int(geometry.vertices.size())) { + add_error("Found invalid vertex id"); + return false; + } + min_id = std::min(min_id, tri_id); + max_id = std::max(max_id, tri_id); + } + } + its.vertices.assign(geometry.vertices.begin() + min_id, geometry.vertices.begin() + max_id + 1); -#if ENABLE_FIX_MIRRORED_VOLUMES_3MF_IMPORT_EXPORT - // PrusaSlicer older than 2.4.0 saved mirrored volumes with reversed winding of the triangles - // This caused the call to TriangleMesh::repair() to reverse all the facets because the calculated volume was negative - if (is_left_handed && stl.stats.facets_reversed > 0 && stl.stats.facets_reversed == stl.stats.original_num_facets) - stl.stats.facets_reversed = 0; -#endif // ENABLE_FIX_MIRRORED_VOLUMES_3MF_IMPORT_EXPORT + // rebase indices to the current vertices list + for (Vec3i& face : its.indices) + for (int& tri_id : face) + tri_id -= min_id; + } + + if (m_prusaslicer_generator_version && + *m_prusaslicer_generator_version >= *Semver::parse("2.4.0-alpha1") && + *m_prusaslicer_generator_version < *Semver::parse("2.4.0-alpha3")) + // PrusaSlicer 2.4.0-alpha2 contained a bug, where all vertices of a single object were saved for each volume the object contained. + // Remove the vertices, that are not referenced by any face. + its_compactify_vertices(its, true); + + TriangleMesh triangle_mesh(std::move(its), volume_data.mesh_stats); if (m_version == 0) { // if the 3mf was not produced by PrusaSlicer and there is only one instance, // bake the transformation into the geometry to allow the reload from disk command // to work properly if (object.instances.size() == 1) { - triangle_mesh.transform(object.instances.front()->get_transformation().get_matrix()); + triangle_mesh.transform(object.instances.front()->get_transformation().get_matrix(), false); object.instances.front()->set_transformation(Slic3r::Geometry::Transformation()); + //FIXME do the mesh fixing? } } + if (triangle_mesh.volume() < 0) + triangle_mesh.flip_triangles(); ModelVolume* volume = object.add_volume(std::move(triangle_mesh)); // stores the volume matrix taken from the metadata, if present if (has_transform) volume->source.transform = Slic3r::Geometry::Transformation(volume_matrix_to_object); - volume->calculate_convex_hull(); // recreate custom supports, seam and mmu segmentation from previously loaded attribute volume->supported_facets.reserve(triangles_count); volume->seam_facets.reserve(triangles_count); volume->mmu_segmentation_facets.reserve(triangles_count); - for (unsigned i=0; imesh().repaired) - throw Slic3r::FileIOError("store_3mf() requires repair()"); - if (!volume->mesh().has_shared_vertices()) - throw Slic3r::FileIOError("store_3mf() requires shared vertices"); - volumes_offsets.insert({ volume, Offsets(vertices_count) }); const indexed_triangle_set &its = volume->mesh().its; @@ -2586,10 +2638,7 @@ namespace Slic3r { if (volume == nullptr) continue; -#if ENABLE_FIX_MIRRORED_VOLUMES_3MF_IMPORT_EXPORT bool is_left_handed = volume->is_left_handed(); -#endif // ENABLE_FIX_MIRRORED_VOLUMES_3MF_IMPORT_EXPORT - VolumeToOffsetsMap::iterator volume_it = volumes_offsets.find(volume); assert(volume_it != volumes_offsets.end()); @@ -2604,7 +2653,6 @@ namespace Slic3r { { const Vec3i &idx = its.indices[i]; char *ptr = buf; -#if ENABLE_FIX_MIRRORED_VOLUMES_3MF_IMPORT_EXPORT boost::spirit::karma::generate(ptr, boost::spirit::lit(" <") << TRIANGLE_TAG << " v1=\"" << boost::spirit::int_ << "\" v2=\"" << boost::spirit::int_ << @@ -2612,15 +2660,6 @@ namespace Slic3r { idx[is_left_handed ? 2 : 0] + volume_it->second.first_vertex_id, idx[1] + volume_it->second.first_vertex_id, idx[is_left_handed ? 0 : 2] + volume_it->second.first_vertex_id); -#else - boost::spirit::karma::generate(ptr, boost::spirit::lit(" <") << TRIANGLE_TAG << - " v1=\"" << boost::spirit::int_ << - "\" v2=\"" << boost::spirit::int_ << - "\" v3=\"" << boost::spirit::int_ << "\"", - idx[0] + volume_it->second.first_vertex_id, - idx[1] + volume_it->second.first_vertex_id, - idx[2] + volume_it->second.first_vertex_id); -#endif // ENABLE_FIX_MIRRORED_VOLUMES_3MF_IMPORT_EXPORT *ptr = '\0'; output_buffer += buf; } @@ -2998,9 +3037,10 @@ namespace Slic3r { } // stores volume's config data - for (const std::string& key : volume->config.keys()) - add_metadata(stream, 3, MetadataType::volume, key, volume->config.opt_serialize(key)); - + for (const std::string& key : volume->config.keys()) { + stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << key << "\" " << VALUE_ATTR << "=\"" << volume->config.opt_serialize(key) << "\"/>\n"; + } + stream << " \n"; } } diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp index 35b3e0cf4..bcc5c8b4a 100644 --- a/src/libslic3r/Format/AMF.cpp +++ b/src/libslic3r/Format/AMF.cpp @@ -244,11 +244,11 @@ struct AMFParserContext // Map from obect name to object idx & instances. std::map m_object_instances_map; // Vertices parsed for the current m_object. - std::vector m_object_vertices; + std::vector m_object_vertices; // Current volume allocated for an amf/object/mesh/volume subtree. ModelVolume *m_volume { nullptr }; // Faces collected for the current m_volume. - std::vector m_volume_facets; + std::vector m_volume_facets; // Transformation matrix of a volume mesh from its coordinate system to Object's coordinate system. Transform3d m_volume_transform; // Current material allocated for an amf/metadata subtree. @@ -598,9 +598,7 @@ void AMFParserContext::endElement(const char * /* name */) case NODE_TYPE_VERTEX: assert(m_object); // Parse the vertex data - m_object_vertices.emplace_back((float)atof(m_value[0].c_str())); - m_object_vertices.emplace_back((float)atof(m_value[1].c_str())); - m_object_vertices.emplace_back((float)atof(m_value[2].c_str())); + m_object_vertices.emplace_back(float(atof(m_value[0].c_str())), float(atof(m_value[1].c_str())), float(atof(m_value[2].c_str()))); m_value[0].clear(); m_value[1].clear(); m_value[2].clear(); @@ -609,9 +607,7 @@ void AMFParserContext::endElement(const char * /* name */) // Faces of the current volume: case NODE_TYPE_TRIANGLE: assert(m_object && m_volume); - m_volume_facets.emplace_back(atoi(m_value[0].c_str())); - m_volume_facets.emplace_back(atoi(m_value[1].c_str())); - m_volume_facets.emplace_back(atoi(m_value[2].c_str())); + m_volume_facets.emplace_back(atoi(m_value[0].c_str()), atoi(m_value[1].c_str()), atoi(m_value[2].c_str())); m_value[0].clear(); m_value[1].clear(); m_value[2].clear(); @@ -621,39 +617,46 @@ void AMFParserContext::endElement(const char * /* name */) case NODE_TYPE_VOLUME: { assert(m_object && m_volume); - TriangleMesh mesh; - stl_file &stl = mesh.stl; - stl.stats.type = inmemory; - stl.stats.number_of_facets = int(m_volume_facets.size() / 3); - stl.stats.original_num_facets = stl.stats.number_of_facets; - stl_allocate(&stl); + if (m_volume_facets.empty()) { + this->stop("An empty triangle mesh found"); + return; + } - bool has_transform = ! m_volume_transform.isApprox(Transform3d::Identity(), 1e-10); - for (size_t i = 0; i < m_volume_facets.size();) { - stl_facet &facet = stl.facet_start[i/3]; - for (unsigned int v = 0; v < 3; ++v) - { - unsigned int tri_id = m_volume_facets[i++] * 3; - if (tri_id < 0 || tri_id + 2 >= m_object_vertices.size()) { - this->stop("Malformed triangle mesh"); - return; - } - facet.vertex[v] = Vec3f(m_object_vertices[tri_id + 0], m_object_vertices[tri_id + 1], m_object_vertices[tri_id + 2]); - } - } - stl_get_size(&stl); - mesh.repair(); - m_volume->set_mesh(std::move(mesh)); - // stores the volume matrix taken from the metadata, if present - if (has_transform) - m_volume->source.transform = Slic3r::Geometry::Transformation(m_volume_transform); - if (m_volume->source.input_file.empty() && (m_volume->type() == ModelVolumeType::MODEL_PART)) { + // Verify validity of face indices, find the vertex span. + int min_id = m_volume_facets.front()[0]; + int max_id = min_id; + for (const Vec3i& face : m_volume_facets) { + for (const int tri_id : face) { + if (tri_id < 0 || tri_id >= int(m_object_vertices.size())) { + this->stop("Malformed triangle mesh"); + return; + } + min_id = std::min(min_id, tri_id); + max_id = std::max(max_id, tri_id); + } + } + + // rebase indices to the current vertices list + for (Vec3i &face : m_volume_facets) + face -= Vec3i(min_id, min_id, min_id); + + indexed_triangle_set its { std::move(m_volume_facets), { m_object_vertices.begin() + min_id, m_object_vertices.begin() + max_id + 1 } }; + its_compactify_vertices(its); + if (its_volume(its) < 0) + its_flip_triangles(its); + m_volume->set_mesh(std::move(its)); + } + + // stores the volume matrix taken from the metadata, if present + if (bool has_transform = !m_volume_transform.isApprox(Transform3d::Identity(), 1e-10); has_transform) + m_volume->source.transform = Slic3r::Geometry::Transformation(m_volume_transform); + + if (m_volume->source.input_file.empty() && (m_volume->type() == ModelVolumeType::MODEL_PART)) { m_volume->source.object_idx = (int)m_model.objects.size() - 1; m_volume->source.volume_idx = (int)m_model.objects.back()->volumes.size() - 1; m_volume->center_geometry_after_creation(); - } - else + } else // pass false if the mesh offset has been already taken from the data m_volume->center_geometry_after_creation(m_volume->source.input_file.empty()); @@ -1187,10 +1190,6 @@ bool store_amf(const char* path, Model* model, const DynamicPrintConfig* config, int num_vertices = 0; for (ModelVolume *volume : object->volumes) { vertices_offsets.push_back(num_vertices); - if (! volume->mesh().repaired) - throw Slic3r::FileIOError("store_amf() requires repair()"); - if (! volume->mesh().has_shared_vertices()) - throw Slic3r::FileIOError("store_amf() requires shared vertices"); const indexed_triangle_set &its = volume->mesh().its; const Transform3d& matrix = volume->get_matrix(); for (size_t i = 0; i < its.vertices.size(); ++i) { diff --git a/src/libslic3r/Format/OBJ.cpp b/src/libslic3r/Format/OBJ.cpp index cb7eb4549..3b05bb574 100644 --- a/src/libslic3r/Format/OBJ.cpp +++ b/src/libslic3r/Format/OBJ.cpp @@ -19,7 +19,8 @@ namespace Slic3r { bool load_obj(const char *path, TriangleMesh *meshptr) { - if(meshptr == nullptr) return false; + if (meshptr == nullptr) + return false; // Parse the OBJ file. ObjParser::ObjData data; @@ -31,84 +32,69 @@ bool load_obj(const char *path, TriangleMesh *meshptr) // Count the faces and verify, that all faces are triangular. size_t num_faces = 0; size_t num_quads = 0; - for (size_t i = 0; i < data.vertices.size(); ) { + for (size_t i = 0; i < data.vertices.size(); ++ i) { + // Find the end of face. size_t j = i; for (; j < data.vertices.size() && data.vertices[j].coordIdx != -1; ++ j) ; - if (i == j) - continue; - size_t face_vertices = j - i; - if (face_vertices != 3 && face_vertices != 4) { - // Non-triangular and non-quad faces are not supported as of now. - return false; + if (size_t num_face_vertices = j - i; num_face_vertices > 0) { + if (num_face_vertices > 4) { + // Non-triangular and non-quad faces are not supported as of now. + BOOST_LOG_TRIVIAL(error) << "load_obj: failed to parse " << path << ". The file contains polygons with more than 4 vertices."; + return false; + } else if (num_face_vertices < 3) { + // Non-triangular and non-quad faces are not supported as of now. + BOOST_LOG_TRIVIAL(error) << "load_obj: failed to parse " << path << ". The file contains polygons with less than 2 vertices."; + return false; + } + if (num_face_vertices == 4) + ++ num_quads; + ++ num_faces; + i = j; } - if (face_vertices == 4) - ++ num_quads; - ++ num_faces; - i = j + 1; } - // Convert ObjData into STL. - TriangleMesh &mesh = *meshptr; - stl_file &stl = mesh.stl; - stl.stats.type = inmemory; - stl.stats.number_of_facets = uint32_t(num_faces + num_quads); - stl.stats.original_num_facets = int(num_faces + num_quads); - // stl_allocate clears all the allocated data to zero, all normals are set to zeros as well. - stl_allocate(&stl); - size_t i_face = 0; - for (size_t i = 0; i < data.vertices.size(); ++ i) { - if (data.vertices[i].coordIdx == -1) - continue; - stl_facet &facet = stl.facet_start[i_face ++]; - size_t num_normals = 0; - stl_normal normal(stl_normal::Zero()); - for (unsigned int v = 0; v < 3; ++ v) { - const ObjParser::ObjVertex &vertex = data.vertices[i++]; - memcpy(facet.vertex[v].data(), &data.coordinates[vertex.coordIdx*4], 3 * sizeof(float)); - if (vertex.normalIdx != -1) { - normal(0) += data.normals[vertex.normalIdx*3]; - normal(1) += data.normals[vertex.normalIdx*3+1]; - normal(2) += data.normals[vertex.normalIdx*3+2]; - ++ num_normals; - } - } - // Result of obj_parseline() call is not checked, thus not all vertices are necessarily finalized with coord_Idx == -1. - if (i < data.vertices.size() && data.vertices[i].coordIdx != -1) { - // This is a quad. Produce the other triangle. - stl_facet &facet2 = stl.facet_start[i_face++]; - facet2.vertex[0] = facet.vertex[0]; - facet2.vertex[1] = facet.vertex[2]; - const ObjParser::ObjVertex &vertex = data.vertices[i++]; - memcpy(facet2.vertex[2].data(), &data.coordinates[vertex.coordIdx * 4], 3 * sizeof(float)); - if (vertex.normalIdx != -1) { - normal(0) += data.normals[vertex.normalIdx*3]; - normal(1) += data.normals[vertex.normalIdx*3+1]; - normal(2) += data.normals[vertex.normalIdx*3+2]; - ++ num_normals; - } - if (num_normals == 4) { - // Normalize an average normal of a quad. - float len = facet.normal.norm(); - if (len > EPSILON) { - normal /= len; - facet.normal = normal; - facet2.normal = normal; - } - } - } else if (num_normals == 3) { - // Normalize an average normal of a triangle. - float len = facet.normal.norm(); - if (len > EPSILON) - facet.normal = normal / len; - } + // Convert ObjData into indexed triangle set. + indexed_triangle_set its; + size_t num_vertices = data.coordinates.size() / 4; + its.vertices.reserve(num_vertices); + its.indices.reserve(num_faces + num_quads); + for (size_t i = 0; i < num_vertices; ++ i) { + size_t j = i << 2; + its.vertices.emplace_back(data.coordinates[j], data.coordinates[j + 1], data.coordinates[j + 2]); } - stl_get_size(&stl); - mesh.repair(); - if (mesh.facets_count() == 0) { + int indices[4]; + for (size_t i = 0; i < data.vertices.size();) + if (data.vertices[i].coordIdx == -1) + ++ i; + else { + int cnt = 0; + while (i < data.vertices.size()) + if (const ObjParser::ObjVertex &vertex = data.vertices[i ++]; vertex.coordIdx == -1) { + break; + } else { + assert(cnt < 4); + if (vertex.coordIdx < 0 || vertex.coordIdx >= int(its.vertices.size())) { + BOOST_LOG_TRIVIAL(error) << "load_obj: failed to parse " << path << ". The file contains invalid vertex index."; + return false; + } + indices[cnt ++] = vertex.coordIdx; + } + if (cnt) { + assert(cnt == 3 || cnt == 4); + // Insert one or two faces (triangulate a quad). + its.indices.emplace_back(indices[0], indices[1], indices[2]); + if (cnt == 4) + its.indices.emplace_back(indices[0], indices[2], indices[3]); + } + } + + *meshptr = TriangleMesh(std::move(its)); + if (meshptr->empty()) { BOOST_LOG_TRIVIAL(error) << "load_obj: This OBJ file couldn't be read because it's empty. " << path; return false; } - + if (meshptr->volume() < 0) + meshptr->flip_triangles(); return true; } diff --git a/src/libslic3r/Format/PRUS.cpp b/src/libslic3r/Format/PRUS.cpp deleted file mode 100644 index 586fbafb5..000000000 --- a/src/libslic3r/Format/PRUS.cpp +++ /dev/null @@ -1,333 +0,0 @@ -#include -#include - -#include - -#include "miniz_extension.hpp" - -#include - -#include "../libslic3r.h" -#include "../Model.hpp" - -#include "PRUS.hpp" - -#if 0 -// Enable debugging and assert in this file. -#define DEBUG -#define _DEBUG -#undef NDEBUG -#endif - -#include - -namespace Slic3r -{ - -struct StlHeader -{ - char comment[80]; - uint32_t nTriangles; -}; - -static_assert(sizeof(StlHeader) == 84, "StlHeader size not correct"); - -// Buffered line reader to a string buffer. -class LineReader -{ -public: - LineReader(std::vector &data) : m_buffer(data), m_pos(0), m_len((int)data.size()) {} - - const char* next_line() { - // Skip empty lines. - while (m_pos < m_len && (m_buffer[m_pos] == '\r' || m_buffer[m_pos] == '\n')) - ++ m_pos; - if (m_pos == m_len) { - // End of file. - return nullptr; - } - // The buffer is nonempty and it does not start with end of lines. Find the first end of line. - int end = m_pos + 1; - while (end < m_len && m_buffer[end] != '\r' && m_buffer[end] != '\n') - ++ end; - char *ptr_out = m_buffer.data() + m_pos; - m_pos = end + 1; - m_buffer[end] = 0; - return ptr_out; - } - - int next_line_scanf(const char *format, ...) - { - const char *line = next_line(); - if (line == nullptr) - return -1; - int result; - va_list arglist; - va_start(arglist, format); - result = vsscanf(line, format, arglist); - va_end(arglist); - return result; - } - -private: - std::vector &m_buffer; - int m_pos; - int m_len; -}; - -static void extract_model_from_archive( - // name of the model file - const char *name, - // path to the archive - const char *path, - // content of scene.xml - const std::vector &scene_xml_data, - // loaded data of this STL - std::vector &data, - // Model, to which the newly loaded objects will be added - Model *model, - // To map multiple STLs into a single model object for multi-material prints. - std::map &group_to_model_object) -{ - // Find the model entry in the XML data. - char model_name_tag[1024]; - sprintf(model_name_tag, "", name); - const char *model_xml = strstr(scene_xml_data.data(), model_name_tag); - const char *zero_tag = ""; - const char *zero_xml = strstr(scene_xml_data.data(), zero_tag); - Vec3d instance_rotation = Vec3d::Zero(); - Vec3d instance_scaling_factor = Vec3d::Ones(); - Vec3d instance_offset = Vec3d::Zero(); - bool trafo_set = false; - unsigned int group_id = (unsigned int)-1; - unsigned int extruder_id = (unsigned int)-1; - ModelObject *model_object = nullptr; - if (model_xml != nullptr) { - model_xml += strlen(model_name_tag); - const char *position_tag = ""; - const char *position_xml = strstr(model_xml, position_tag); - const char *rotation_tag = ""; - const char *rotation_xml = strstr(model_xml, rotation_tag); - const char *scale_tag = ""; - const char *scale_xml = strstr(model_xml, scale_tag); - float position[3], rotation[3], scale[3], zero[3]; - if (position_xml != nullptr && rotation_xml != nullptr && scale_xml != nullptr && zero_xml != nullptr && - sscanf(position_xml+strlen(position_tag), - "[%f, %f, %f]", position, position+1, position+2) == 3 && - sscanf(rotation_xml+strlen(rotation_tag), - "[%f, %f, %f]", rotation, rotation+1, rotation+2) == 3 && - sscanf(scale_xml+strlen(scale_tag), - "[%f, %f, %f]", scale, scale+1, scale+2) == 3 && - sscanf(zero_xml+strlen(zero_tag), - "[%f, %f, %f]", zero, zero+1, zero+2) == 3) { - instance_scaling_factor = Vec3d((double)scale[0], (double)scale[1], (double)scale[2]); - instance_rotation = Vec3d(-(double)rotation[0], -(double)rotation[1], -(double)rotation[2]); - instance_offset = Vec3d((double)(position[0] - zero[0]), (double)(position[1] - zero[1]), (double)(position[2] - zero[2])); - trafo_set = true; - } - const char *group_tag = ""; - const char *group_xml = strstr(model_xml, group_tag); - const char *extruder_tag = ""; - const char *extruder_xml = strstr(model_xml, extruder_tag); - if (group_xml != nullptr) { - int group = atoi(group_xml + strlen(group_tag)); - if (group > 0) { - group_id = group; - auto it = group_to_model_object.find(group_id); - if (it != group_to_model_object.end()) - model_object = it->second; - } - } - if (extruder_xml != nullptr) { - int e = atoi(extruder_xml + strlen(extruder_tag)); - if (e > 0) - extruder_id = e; - } - } - if (! trafo_set) - throw Slic3r::FileIOError(std::string("Archive ") + path + " does not contain a valid entry in scene.xml for " + name); - - // Extract the STL. - StlHeader header; - TriangleMesh mesh; - bool mesh_valid = false; - bool stl_ascii = false; - if (data.size() > sizeof(StlHeader)) { - memcpy((char*)&header, data.data(), sizeof(StlHeader)); - if (strncmp(header.comment, "solid ", 6) == 0) - stl_ascii = true; - else { - // Header has been extracted. Now read the faces. - stl_file &stl = mesh.stl; - stl.stats.type = inmemory; - stl.stats.number_of_facets = header.nTriangles; - stl.stats.original_num_facets = header.nTriangles; - stl_allocate(&stl); - if (header.nTriangles > 0 && data.size() == 50 * header.nTriangles + sizeof(StlHeader)) { - memcpy((char*)stl.facet_start.data(), data.data() + sizeof(StlHeader), 50 * header.nTriangles); - if (sizeof(stl_facet) > SIZEOF_STL_FACET) { - // The stl.facet_start is not packed tightly. Unpack the array of stl_facets. - unsigned char *data = (unsigned char*)stl.facet_start.data(); - for (size_t i = header.nTriangles - 1; i > 0; -- i) - memmove(data + i * sizeof(stl_facet), data + i * SIZEOF_STL_FACET, SIZEOF_STL_FACET); - } - // All the faces have been read. - stl_get_size(&stl); - mesh.repair(); - if (std::abs(stl.stats.min(2)) < EPSILON) - stl.stats.min(2) = 0.; - // Add a mesh to a model. - if (mesh.facets_count() > 0) - mesh_valid = true; - } - } - } else - stl_ascii = true; - - if (stl_ascii) { - // Try to parse ASCII STL. - char normal_buf[3][32]; - stl_facet facet; - std::vector facets; - LineReader line_reader(data); - std::string solid_name; - facet.extra[0] = facet.extra[1] = 0; - for (;;) { - const char *line = line_reader.next_line(); - if (line == nullptr) - // End of file. - break; - if (strncmp(line, "solid", 5) == 0) { - // Opening the "solid" block. - if (! solid_name.empty()) { - // Error, solid block is already open. - facets.clear(); - break; - } - solid_name = line + 5; - if (solid_name.empty()) - solid_name = "unknown"; - continue; - } - if (strncmp(line, "endsolid", 8) == 0) { - // Closing the "solid" block. - if (solid_name.empty()) { - // Error, no solid block is open. - facets.clear(); - break; - } - solid_name.clear(); - continue; - } - // Line has to start with the word solid. - int res_normal = sscanf(line, " facet normal %31s %31s %31s", normal_buf[0], normal_buf[1], normal_buf[2]); - assert(res_normal == 3); - int res_outer_loop = line_reader.next_line_scanf(" outer loop"); - assert(res_outer_loop == 0); - int res_vertex1 = line_reader.next_line_scanf(" vertex %f %f %f", &facet.vertex[0](0), &facet.vertex[0](1), &facet.vertex[0](2)); - assert(res_vertex1 == 3); - int res_vertex2 = line_reader.next_line_scanf(" vertex %f %f %f", &facet.vertex[1](0), &facet.vertex[1](1), &facet.vertex[1](2)); - assert(res_vertex2 == 3); - int res_vertex3 = line_reader.next_line_scanf(" vertex %f %f %f", &facet.vertex[2](0), &facet.vertex[2](1), &facet.vertex[2](2)); - assert(res_vertex3 == 3); - int res_endloop = line_reader.next_line_scanf(" endloop"); - assert(res_endloop == 0); - int res_endfacet = line_reader.next_line_scanf(" endfacet"); - if (res_normal != 3 || res_outer_loop != 0 || res_vertex1 != 3 || res_vertex2 != 3 || res_vertex3 != 3 || res_endloop != 0 || res_endfacet != 0) { - // perror("Something is syntactically very wrong with this ASCII STL!"); - facets.clear(); - break; - } - // The facet normal has been parsed as a single string as to workaround for not a numbers in the normal definition. - if (sscanf(normal_buf[0], "%f", &facet.normal(0)) != 1 || - sscanf(normal_buf[1], "%f", &facet.normal(1)) != 1 || - sscanf(normal_buf[2], "%f", &facet.normal(2)) != 1) { - // Normal was mangled. Maybe denormals or "not a number" were stored? - // Just reset the normal and silently ignore it. - facet.normal = stl_normal::Zero(); - } - facets.emplace_back(facet); - } - if (! facets.empty() && solid_name.empty()) { - stl_file &stl = mesh.stl; - stl.stats.type = inmemory; - stl.stats.number_of_facets = (uint32_t)facets.size(); - stl.stats.original_num_facets = (int)facets.size(); - stl_allocate(&stl); - memcpy((void*)stl.facet_start.data(), facets.data(), facets.size() * 50); - stl_get_size(&stl); - mesh.repair(); - // Add a mesh to a model. - if (mesh.facets_count() > 0) - mesh_valid = true; - } - } - - if (! mesh_valid) - throw Slic3r::FileIOError(std::string("Archive ") + path + " does not contain a valid mesh for " + name); - - // Add this mesh to the model. - ModelVolume *volume = nullptr; - if (model_object == nullptr) { - // This is a first mesh of a group. Create a new object & volume. - model_object = model->add_object(name, path, std::move(mesh)); - volume = model_object->volumes.front(); - ModelInstance *instance = model_object->add_instance(); - instance->set_rotation(instance_rotation); - instance->set_scaling_factor(instance_scaling_factor); - instance->set_offset(instance_offset); - if (group_id != (unsigned int)(-1)) - group_to_model_object[group_id] = model_object; - } else { - // This is not the 1st mesh of a group. Add it to the ModelObject. - volume = model_object->add_volume(std::move(mesh)); - volume->name = name; - } - // Set the extruder to the volume. - if (extruder_id != (unsigned int)-1) - volume->config.set("extruder", int(extruder_id)); -} - -// Load a PrusaControl project file into a provided model. -bool load_prus(const char *path, Model *model) -{ - mz_zip_archive archive; - mz_zip_zero_struct(&archive); - - size_t n_models_initial = model->objects.size(); - mz_bool res = MZ_FALSE; - try { - if (!open_zip_reader(&archive, path)) - throw Slic3r::FileIOError(std::string("Unable to init zip reader for ") + path); - std::vector scene_xml_data; - // For grouping multiple STLs into a single ModelObject for multi-material prints. - std::map group_to_model_object; - mz_uint num_entries = mz_zip_reader_get_num_files(&archive); - for (mz_uint i = 0; i < num_entries; ++ i) { - mz_zip_archive_file_stat stat; - if (! mz_zip_reader_file_stat(&archive, i, &stat)) - continue; - std::vector buffer; - buffer.assign((size_t)stat.m_uncomp_size, 0); - res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (char*)buffer.data(), (size_t)stat.m_uncomp_size, 0); - if (res == MZ_FALSE) - throw Slic3r::FileIOError(std::string("Error while extracting a file from ") + path); - if (strcmp(stat.m_filename, "scene.xml") == 0) { - if (! scene_xml_data.empty()) - throw Slic3r::FileIOError(std::string("Multiple scene.xml were found in the archive.") + path); - scene_xml_data = std::move(buffer); - } else if (boost::iends_with(stat.m_filename, ".stl")) { - // May throw std::exception - extract_model_from_archive(stat.m_filename, path, scene_xml_data, buffer, model, group_to_model_object); - } - } - } catch (std::exception &ex) { - close_zip_reader(&archive); - throw ex; - } - - close_zip_reader(&archive); - return model->objects.size() > n_models_initial; -} - -}; // namespace Slic3r diff --git a/src/libslic3r/Format/PRUS.hpp b/src/libslic3r/Format/PRUS.hpp deleted file mode 100644 index be5c5c61a..000000000 --- a/src/libslic3r/Format/PRUS.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#define slic3r_Format_PRUS_hpp_ - -namespace Slic3r { - -class TriangleMesh; -class Model; - -// Load a PrusaControl project file into a provided model. -extern bool load_prus(const char *path, Model *model); - -}; // namespace Slic3r diff --git a/src/libslic3r/Format/SL1.cpp b/src/libslic3r/Format/SL1.cpp index e2ef801f2..c4b8f030f 100644 --- a/src/libslic3r/Format/SL1.cpp +++ b/src/libslic3r/Format/SL1.cpp @@ -203,7 +203,7 @@ RasterParams get_raster_params(const DynamicPrintConfig &cfg) if (!opt_disp_cols || !opt_disp_rows || !opt_disp_w || !opt_disp_h || !opt_mirror_x || !opt_mirror_y || !opt_orient) - throw Slic3r::FileIOError("Invalid SL1 / SL1S file"); + throw MissingProfileError("Invalid SL1 / SL1S file"); RasterParams rstp; @@ -229,7 +229,7 @@ SliceParams get_slice_params(const DynamicPrintConfig &cfg) auto *opt_init_layerh = cfg.option("initial_layer_height"); if (!opt_layerh || !opt_init_layerh) - throw Slic3r::FileIOError("Invalid SL1 / SL1S file"); + throw MissingProfileError("Invalid SL1 / SL1S file"); return SliceParams{opt_layerh->getFloat(), opt_init_layerh->getFloat()}; } @@ -293,24 +293,34 @@ ConfigSubstitutions import_sla_archive(const std::string &zipfname, DynamicPrint return out.load(arch.profile, ForwardCompatibilitySubstitutionRule::Enable); } +// If the profile is missing from the archive (older PS versions did not have +// it), profile_out's initial value will be used as fallback. profile_out will be empty on +// function return if the archive did not contain any profile. ConfigSubstitutions import_sla_archive( const std::string & zipfname, Vec2i windowsize, indexed_triangle_set & out, - DynamicPrintConfig & profile, + DynamicPrintConfig & profile_out, std::function progr) { // Ensure minimum window size for marching squares windowsize.x() = std::max(2, windowsize.x()); windowsize.y() = std::max(2, windowsize.y()); - ArchiveData arch = extract_sla_archive(zipfname, "thumbnail"); - ConfigSubstitutions config_substitutions = profile.load(arch.profile, ForwardCompatibilitySubstitutionRule::Enable); + std::string exclude_entries{"thumbnail"}; + ArchiveData arch = extract_sla_archive(zipfname, exclude_entries); + DynamicPrintConfig profile_in, profile_use; + ConfigSubstitutions config_substitutions = profile_in.load(arch.profile, ForwardCompatibilitySubstitutionRule::Enable); - RasterParams rstp = get_raster_params(profile); + // If the archive contains an empty profile, use the one that was passed as output argument + // then replace it with the readed profile to report that it was empty. + profile_use = profile_in.empty() ? profile_out : profile_in; + profile_out = profile_in; + + RasterParams rstp = get_raster_params(profile_use); rstp.win = {windowsize.y(), windowsize.x()}; - SliceParams slicp = get_slice_params(profile); + SliceParams slicp = get_slice_params(profile_use); std::vector slices = extract_slices_from_sla_archive(arch, rstp, progr); @@ -413,7 +423,7 @@ void fill_slicerconf(ConfMap &m, const SLAPrint &print) } // namespace -uqptr SL1Archive::create_raster() const +std::unique_ptr SL1Archive::create_raster() const { sla::RasterBase::Resolution res; sla::RasterBase::PixelDim pxdim; diff --git a/src/libslic3r/Format/SL1.hpp b/src/libslic3r/Format/SL1.hpp index 2c7e1edc1..46a82e1b8 100644 --- a/src/libslic3r/Format/SL1.hpp +++ b/src/libslic3r/Format/SL1.hpp @@ -8,11 +8,11 @@ namespace Slic3r { -class SL1Archive: public SLAPrinter { +class SL1Archive: public SLAArchive { SLAPrinterConfig m_cfg; protected: - uqptr create_raster() const override; + std::unique_ptr create_raster() const override; sla::RasterEncoder get_encoder() const override; public: @@ -57,6 +57,8 @@ inline ConfigSubstitutions import_sla_archive( return import_sla_archive(zipfname, windowsize, out, profile, progr); } +class MissingProfileError : public RuntimeError { using RuntimeError::RuntimeError; }; + } // namespace Slic3r::sla #endif // ARCHIVETRAITS_HPP diff --git a/src/libslic3r/Format/STL.cpp b/src/libslic3r/Format/STL.cpp index 932906fe0..2f2c9ec7f 100644 --- a/src/libslic3r/Format/STL.cpp +++ b/src/libslic3r/Format/STL.cpp @@ -21,8 +21,7 @@ bool load_stl(const char *path, Model *model, const char *object_name_in) // die "Failed to open $file\n" if !-e $path; return false; } - mesh.repair(); - if (mesh.facets_count() == 0) { + if (mesh.empty()) { // die "This STL file couldn't be read because it's empty.\n" return false; } diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index cebc9136f..ff0a7c027 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -784,7 +784,8 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessor::Result* re } BOOST_LOG_TRIVIAL(debug) << "Start processing gcode, " << log_memory_info(); - m_processor.finalize(); + // Post-process the G-code to update time stamps. + m_processor.finalize(true); // DoExport::update_print_estimated_times_stats(m_processor, print->m_print_statistics); DoExport::update_print_estimated_stats(m_processor, m_writer.extruders(), print->m_print_statistics); if (result != nullptr) { @@ -1842,11 +1843,7 @@ namespace ProcessLayer assert(m600_extruder_before_layer >= 0); // Color Change or Tool Change as Color Change. // add tag for processor -#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER gcode += ";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Color_Change) + ",T" + std::to_string(m600_extruder_before_layer) + "," + custom_gcode->color + "\n"; -#else - gcode += ";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Color_Change) + ",T" + std::to_string(m600_extruder_before_layer) + "\n"; -#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER if (!single_extruder_printer && m600_extruder_before_layer >= 0 && first_extruder_id != (unsigned)m600_extruder_before_layer // && !MMU1 diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index d16cfb9cf..9c90535c4 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -2,6 +2,7 @@ #include "libslic3r/Utils.hpp" #include "libslic3r/Print.hpp" #include "libslic3r/LocalesUtils.hpp" +#include "libslic3r/format.hpp" #include "GCodeProcessor.hpp" #include @@ -27,9 +28,7 @@ static const float DEFAULT_TOOLPATH_HEIGHT = 0.2f; static const float INCHES_TO_MM = 25.4f; static const float MMMIN_TO_MMSEC = 1.0f / 60.0f; static const float DEFAULT_ACCELERATION = 1500.0f; // Prusa Firmware 1_75mm_MK2 -#if ENABLE_RETRACT_ACCELERATION static const float DEFAULT_RETRACT_ACCELERATION = 1500.0f; // Prusa Firmware 1_75mm_MK2 -#endif // ENABLE_RETRACT_ACCELERATION static const float DEFAULT_TRAVEL_ACCELERATION = 1250.0f; static const size_t MIN_EXTRUDERS_COUNT = 5; @@ -184,10 +183,8 @@ void GCodeProcessor::TimeMachine::reset() enabled = false; acceleration = 0.0f; max_acceleration = 0.0f; -#if ENABLE_RETRACT_ACCELERATION retract_acceleration = 0.0f; max_retract_acceleration = 0.0f; -#endif // ENABLE_RETRACT_ACCELERATION travel_acceleration = 0.0f; max_travel_acceleration = 0.0f; extrude_factor_override_percentage = 1.0f; @@ -347,18 +344,6 @@ void GCodeProcessor::TimeProcessor::reset() machines[static_cast(PrintEstimatedStatistics::ETimeMode::Normal)].enabled = true; } -struct FilePtr { - FilePtr(FILE *f) : f(f) {} - ~FilePtr() { this->close(); } - void close() { - if (this->f) { - ::fclose(this->f); - this->f = nullptr; - } - } - FILE* f = nullptr; -}; - void GCodeProcessor::TimeProcessor::post_process(const std::string& filename, std::vector& moves, std::vector& lines_ends) { FilePtr in{ boost::nowide::fopen(filename.c_str(), "rb") }; @@ -740,9 +725,7 @@ void GCodeProcessor::Result::reset() { extruder_colors = std::vector(); filament_diameters = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DIAMETER); filament_densities = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DENSITY); -#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER custom_gcode_per_print_z = std::vector(); -#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER time = 0; } #else @@ -756,18 +739,19 @@ void GCodeProcessor::Result::reset() { extruder_colors = std::vector(); filament_diameters = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DIAMETER); filament_densities = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DENSITY); -#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER custom_gcode_per_print_z = std::vector(); -#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER } #endif // ENABLE_GCODE_VIEWER_STATISTICS const std::vector> GCodeProcessor::Producers = { - { EProducer::PrusaSlicer, "PrusaSlicer" }, - { EProducer::Slic3rPE, "Slic3r Prusa Edition" }, - { EProducer::Slic3r, "Slic3r" }, + { EProducer::PrusaSlicer, "generated by PrusaSlicer" }, + { EProducer::Slic3rPE, "generated by Slic3r Prusa Edition" }, + { EProducer::Slic3r, "generated by Slic3r" }, +#if ENABLE_FIX_SUPERSLICER_GCODE_IMPORT + { EProducer::SuperSlicer, "generated by SuperSlicer" }, +#endif // ENABLE_FIX_SUPERSLICER_GCODE_IMPORT { EProducer::Cura, "Cura_SteamEngine" }, - { EProducer::Simplify3D, "Simplify3D" }, + { EProducer::Simplify3D, "G-Code generated by Simplify3D(R)" }, { EProducer::CraftWare, "CraftWare" }, { EProducer::ideaMaker, "ideaMaker" }, { EProducer::KissSlicer, "KISSlicer" } @@ -849,26 +833,16 @@ void GCodeProcessor::apply_config(const PrintConfig& config) m_result.extruders_count = extruders_count; m_extruder_offsets.resize(extruders_count); - for (size_t i = 0; i < extruders_count; ++i) { - Vec2f offset = config.extruder_offset.get_at(i).cast(); - m_extruder_offsets[i] = { offset(0), offset(1), 0.0f }; - } - m_extruder_colors.resize(extruders_count); - for (size_t i = 0; i < extruders_count; ++i) { - m_extruder_colors[i] = static_cast(i); - } - + m_result.filament_diameters.resize(extruders_count); + m_result.filament_densities.resize(extruders_count); m_extruder_temps.resize(extruders_count); - m_result.filament_diameters.resize(config.filament_diameter.values.size()); - for (size_t i = 0; i < config.filament_diameter.values.size(); ++i) { - m_result.filament_diameters[i] = static_cast(config.filament_diameter.values[i]); - } - - m_result.filament_densities.resize(config.filament_density.values.size()); - for (size_t i = 0; i < config.filament_density.values.size(); ++i) { - m_result.filament_densities[i] = static_cast(config.filament_density.values[i]); + for (size_t i = 0; i < extruders_count; ++ i) { + m_extruder_offsets[i] = to_3d(config.extruder_offset.get_at(i).cast().eval(), 0.f); + m_extruder_colors[i] = static_cast(i); + m_result.filament_diameters[i] = static_cast(config.filament_diameter.get_at(i)); + m_result.filament_densities[i] = static_cast(config.filament_density.get_at(i)); } if ((m_flavor == gcfMarlinLegacy || m_flavor == gcfMarlinFirmware) && config.machine_limits_usage.value != MachineLimitsUsage::Ignore) { @@ -895,11 +869,9 @@ void GCodeProcessor::apply_config(const PrintConfig& config) float max_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_extruding, i); m_time_processor.machines[i].max_acceleration = max_acceleration; m_time_processor.machines[i].acceleration = (max_acceleration > 0.0f) ? max_acceleration : DEFAULT_ACCELERATION; -#if ENABLE_RETRACT_ACCELERATION float max_retract_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i); m_time_processor.machines[i].max_retract_acceleration = max_retract_acceleration; m_time_processor.machines[i].retract_acceleration = (max_retract_acceleration > 0.0f) ? max_retract_acceleration : DEFAULT_RETRACT_ACCELERATION; -#endif // ENABLE_RETRACT_ACCELERATION float max_travel_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_travel, i); m_time_processor.machines[i].max_travel_acceleration = max_travel_acceleration; m_time_processor.machines[i].travel_acceleration = (max_travel_acceleration > 0.0f) ? max_travel_acceleration : DEFAULT_TRAVEL_ACCELERATION; @@ -1117,11 +1089,9 @@ void GCodeProcessor::apply_config(const DynamicPrintConfig& config) float max_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_extruding, i); m_time_processor.machines[i].max_acceleration = max_acceleration; m_time_processor.machines[i].acceleration = (max_acceleration > 0.0f) ? max_acceleration : DEFAULT_ACCELERATION; -#if ENABLE_RETRACT_ACCELERATION float max_retract_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i); m_time_processor.machines[i].max_retract_acceleration = max_retract_acceleration; m_time_processor.machines[i].retract_acceleration = (max_retract_acceleration > 0.0f) ? max_retract_acceleration : DEFAULT_RETRACT_ACCELERATION; -#endif // ENABLE_RETRACT_ACCELERATION float max_travel_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_travel, i); m_time_processor.machines[i].max_travel_acceleration = max_travel_acceleration; m_time_processor.machines[i].travel_acceleration = (max_travel_acceleration > 0.0f) ? max_travel_acceleration : DEFAULT_TRAVEL_ACCELERATION; @@ -1200,9 +1170,7 @@ void GCodeProcessor::reset() m_result.id = ++s_result_id; m_use_volumetric_e = false; -#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER m_last_default_color_id = 0; -#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER #if ENABLE_FIX_PREVIEW_OPTIONS_Z m_options_z_corrector.reset(); @@ -1215,6 +1183,18 @@ void GCodeProcessor::reset() #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING } +static inline const char* skip_whitespaces(const char *begin, const char *end) { + for (; begin != end && (*begin == ' ' || *begin == '\t'); ++ begin); + return begin; +} + +static inline const char* remove_eols(const char *begin, const char *end) { + for (; begin != end && (*(end - 1) == '\r' || *(end - 1) == '\n'); -- end); + return end; +} + +// Load a G-code into a stand-alone G-code viewer. +// throws CanceledException through print->throw_if_canceled() (sent by the caller as callback). void GCodeProcessor::process_file(const std::string& filename, std::function cancel_callback) { CNumericLocalesSetter locales_setter; @@ -1226,14 +1206,16 @@ void GCodeProcessor::process_file(const std::string& filename, std::function 1 && detect_producer(comment)) + m_parser.parse_file_raw(filename, [this](GCodeReader& reader, const char *begin, const char *end) { + begin = skip_whitespaces(begin, end); + if (begin != end && *begin == ';') { + // Comment. + begin = skip_whitespaces(++ begin, end); + end = remove_eols(begin, end); + if (begin != end && detect_producer(std::string_view(begin, end - begin))) m_parser.quit_parsing(); } - }); + }); m_parser.reset(); // if the gcode was produced by PrusaSlicer, @@ -1249,6 +1231,10 @@ void GCodeProcessor::process_file(const std::string& filename, std::functionprocess_gcode_line(line, true); }); - this->finalize(); + // Don't post-process the G-code to update time stamps. + this->finalize(false); } void GCodeProcessor::initialize(const std::string& filename) @@ -1293,7 +1280,7 @@ void GCodeProcessor::process_buffer(const std::string &buffer) }); } -void GCodeProcessor::finalize() +void GCodeProcessor::finalize(bool post_process) { // update width/height of wipe moves for (MoveVertex& move : m_result.moves) { @@ -1323,7 +1310,8 @@ void GCodeProcessor::finalize() m_width_compare.output(); #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING - m_time_processor.post_process(m_result.filename, m_result.moves, m_result.lines_ends); + if (post_process) + m_time_processor.post_process(m_result.filename, m_result.moves, m_result.lines_ends); #if ENABLE_GCODE_VIEWER_STATISTICS m_result.time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - m_start_time).count(); #endif // ENABLE_GCODE_VIEWER_STATISTICS @@ -1380,6 +1368,41 @@ std::vector> GCodeProcessor::get_roles_time(Prin return ret; } +#if ENABLE_FIX_SUPERSLICER_GCODE_IMPORT +ConfigSubstitutions load_from_superslicer_gcode_file(const std::string& filename, DynamicPrintConfig& config, ForwardCompatibilitySubstitutionRule compatibility_rule) +{ + // for reference, see: ConfigBase::load_from_gcode_file() + + boost::nowide::ifstream ifs(filename); + + auto header_end_pos = ifs.tellg(); + ConfigSubstitutionContext substitutions_ctxt(compatibility_rule); + size_t key_value_pairs = 0; + + ifs.seekg(0, ifs.end); + auto file_length = ifs.tellg(); + auto data_length = std::min(65535, file_length - header_end_pos); + ifs.seekg(file_length - data_length, ifs.beg); + std::vector data(size_t(data_length) + 1, 0); + ifs.read(data.data(), data_length); + ifs.close(); + key_value_pairs = ConfigBase::load_from_gcode_string_legacy(config, data.data(), substitutions_ctxt); + + if (key_value_pairs < 80) + throw Slic3r::RuntimeError(format("Suspiciously low number of configuration values extracted from %1%: %2%", filename, key_value_pairs)); + + return std::move(substitutions_ctxt.substitutions); +} + +void GCodeProcessor::apply_config_superslicer(const std::string& filename) +{ + DynamicPrintConfig config; + config.apply(FullPrintConfig::defaults()); + load_from_superslicer_gcode_file(filename, config, ForwardCompatibilitySubstitutionRule::EnableSilent); + apply_config(config); +} +#endif // ENABLE_FIX_SUPERSLICER_GCODE_IMPORT + std::vector GCodeProcessor::get_layers_time(PrintEstimatedStatistics::ETimeMode mode) const { return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? @@ -1398,9 +1421,11 @@ void GCodeProcessor::apply_config_simplify3d(const std::string& filename) }; BedSize bed_size; + bool producer_detected = false; - m_parser.parse_file(filename, [this, &bed_size](GCodeReader& reader, const GCodeReader::GCodeLine& line) { - auto extract_double = [](const std::string& cmt, const std::string& key, double& out) { + m_parser.parse_file_raw(filename, [this, &bed_size, &producer_detected](GCodeReader& reader, const char* begin, const char* end) { + + auto extract_double = [](const std::string_view cmt, const std::string& key, double& out) { size_t pos = cmt.find(key); if (pos != cmt.npos) { pos = cmt.find(',', pos); @@ -1412,12 +1437,12 @@ void GCodeProcessor::apply_config_simplify3d(const std::string& filename) return false; }; - auto extract_floats = [](const std::string& cmt, const std::string& key, std::vector& out) { + auto extract_floats = [](const std::string_view cmt, const std::string& key, std::vector& out) { size_t pos = cmt.find(key); if (pos != cmt.npos) { pos = cmt.find(',', pos); if (pos != cmt.npos) { - std::string data_str = cmt.substr(pos + 1); + const std::string_view data_str = cmt.substr(pos + 1); std::vector values_str; boost::split(values_str, data_str, boost::is_any_of("|,"), boost::token_compress_on); for (const std::string& s : values_str) { @@ -1428,28 +1453,40 @@ void GCodeProcessor::apply_config_simplify3d(const std::string& filename) } return false; }; - - const std::string& comment = line.raw(); - if (comment.length() > 2 && comment.front() == ';') { - if (bed_size.x == 0.0 && comment.find("strokeXoverride") != comment.npos) - extract_double(comment, "strokeXoverride", bed_size.x); - else if (bed_size.y == 0.0 && comment.find("strokeYoverride") != comment.npos) - extract_double(comment, "strokeYoverride", bed_size.y); - else if (comment.find("filamentDiameters") != comment.npos) { - m_result.filament_diameters.clear(); - extract_floats(comment, "filamentDiameters", m_result.filament_diameters); - } - else if (comment.find("filamentDensities") != comment.npos) { - m_result.filament_densities.clear(); - extract_floats(comment, "filamentDensities", m_result.filament_densities); - } - else if (comment.find("extruderDiameter") != comment.npos) { - std::vector extruder_diameters; - extract_floats(comment, "extruderDiameter", extruder_diameters); - m_result.extruders_count = extruder_diameters.size(); + + begin = skip_whitespaces(begin, end); + end = remove_eols(begin, end); + if (begin != end) { + if (*begin == ';') { + // Comment. + begin = skip_whitespaces(++ begin, end); + if (begin != end) { + std::string_view comment(begin, end - begin); + if (producer_detected) { + if (bed_size.x == 0.0 && comment.find("strokeXoverride") != comment.npos) + extract_double(comment, "strokeXoverride", bed_size.x); + else if (bed_size.y == 0.0 && comment.find("strokeYoverride") != comment.npos) + extract_double(comment, "strokeYoverride", bed_size.y); + else if (comment.find("filamentDiameters") != comment.npos) { + m_result.filament_diameters.clear(); + extract_floats(comment, "filamentDiameters", m_result.filament_diameters); + } else if (comment.find("filamentDensities") != comment.npos) { + m_result.filament_densities.clear(); + extract_floats(comment, "filamentDensities", m_result.filament_densities); + } else if (comment.find("extruderDiameter") != comment.npos) { + std::vector extruder_diameters; + extract_floats(comment, "extruderDiameter", extruder_diameters); + m_result.extruders_count = extruder_diameters.size(); + } + } else if (boost::starts_with(comment, "G-Code generated by Simplify3D(R)")) + producer_detected = true; + } + } else { + // Some non-empty G-code line detected, stop parsing config comments. + reader.quit_parsing(); } } - }); + }); if (m_result.extruders_count == 0) m_result.extruders_count = std::max(1, std::min(m_result.filament_diameters.size(), m_result.filament_densities.size())); @@ -1741,7 +1778,6 @@ void GCodeProcessor::process_tags(const std::string_view comment, bool producers // color change tag if (boost::starts_with(comment, reserved_tag(ETags::Color_Change))) { unsigned char extruder_id = 0; -#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER static std::vector Default_Colors = { "#0B2C7A", // { 0.043f, 0.173f, 0.478f }, // bluish "#1C8891", // { 0.110f, 0.533f, 0.569f }, @@ -1790,16 +1826,6 @@ void GCodeProcessor::process_tags(const std::string_view comment, bool producers if (m_last_default_color_id == Default_Colors.size()) m_last_default_color_id = 0; } -#else - if (boost::starts_with(comment.substr(reserved_tag(ETags::Color_Change).size()), ",T")) { - int eid; - if (!parse_number(comment.substr(reserved_tag(ETags::Color_Change).size() + 2), eid) || eid < 0 || eid > 255) { - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Color_Change (" << comment << ")."; - return; - } - extruder_id = static_cast(eid); - } -#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER if (extruder_id < m_extruder_colors.size()) m_extruder_colors[extruder_id] = static_cast(m_extruder_offsets.size()) + m_cp_color.counter; // color_change position in list of color for preview @@ -1810,7 +1836,6 @@ void GCodeProcessor::process_tags(const std::string_view comment, bool producers if (m_extruder_id == extruder_id) { m_cp_color.current = m_extruder_colors[extruder_id]; store_move_vertex(EMoveType::Color_change); -#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER CustomGCode::Item item = { static_cast(m_end_position[2]), CustomGCode::ColorChange, extruder_id + 1, color, "" }; m_result.custom_gcode_per_print_z.emplace_back(item); #if ENABLE_FIX_PREVIEW_OPTIONS_Z @@ -1818,27 +1843,19 @@ void GCodeProcessor::process_tags(const std::string_view comment, bool producers #endif // ENABLE_FIX_PREVIEW_OPTIONS_Z process_custom_gcode_time(CustomGCode::ColorChange); process_filaments(CustomGCode::ColorChange); -#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER } -#if !ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER - process_custom_gcode_time(CustomGCode::ColorChange); - process_filaments(CustomGCode::ColorChange); -#endif // !ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER - return; } // pause print tag if (comment == reserved_tag(ETags::Pause_Print)) { store_move_vertex(EMoveType::Pause_Print); -#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER CustomGCode::Item item = { static_cast(m_end_position[2]), CustomGCode::PausePrint, m_extruder_id + 1, "", "" }; m_result.custom_gcode_per_print_z.emplace_back(item); #if ENABLE_FIX_PREVIEW_OPTIONS_Z m_options_z_corrector.set(); #endif // ENABLE_FIX_PREVIEW_OPTIONS_Z -#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER process_custom_gcode_time(CustomGCode::PausePrint); return; } @@ -1846,13 +1863,11 @@ void GCodeProcessor::process_tags(const std::string_view comment, bool producers // custom code tag if (comment == reserved_tag(ETags::Custom_Code)) { store_move_vertex(EMoveType::Custom_GCode); -#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER CustomGCode::Item item = { static_cast(m_end_position[2]), CustomGCode::Custom, m_extruder_id + 1, "", "" }; m_result.custom_gcode_per_print_z.emplace_back(item); #if ENABLE_FIX_PREVIEW_OPTIONS_Z m_options_z_corrector.set(); #endif // ENABLE_FIX_PREVIEW_OPTIONS_Z -#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER return; } @@ -1878,6 +1893,9 @@ bool GCodeProcessor::process_producers_tags(const std::string_view comment) { case EProducer::Slic3rPE: case EProducer::Slic3r: +#if ENABLE_FIX_SUPERSLICER_GCODE_IMPORT + case EProducer::SuperSlicer: +#endif // ENABLE_FIX_SUPERSLICER_GCODE_IMPORT case EProducer::PrusaSlicer: { return process_prusaslicer_tags(comment); } case EProducer::Cura: { return process_cura_tags(comment); } case EProducer::Simplify3D: { return process_simplify3d_tags(comment); } @@ -2707,15 +2725,15 @@ void GCodeProcessor::process_G28(const GCodeReader::GCodeLine& line) std::string_view cmd = line.cmd(); std::string new_line_raw = { cmd.data(), cmd.size() }; bool found = false; - if (line.has_x()) { + if (line.has('X')) { new_line_raw += " X0"; found = true; } - if (line.has_y()) { + if (line.has('Y')) { new_line_raw += " Y0"; found = true; } - if (line.has_z()) { + if (line.has('Z')) { new_line_raw += " Z0"; found = true; } @@ -2843,6 +2861,8 @@ void GCodeProcessor::process_M109(const GCodeReader::GCodeLine& line) else m_extruder_temps[m_extruder_id] = new_temp; } + else if (line.has_value('S', new_temp)) + m_extruder_temps[m_extruder_id] = new_temp; } void GCodeProcessor::process_M132(const GCodeReader::GCodeLine& line) @@ -2851,16 +2871,16 @@ void GCodeProcessor::process_M132(const GCodeReader::GCodeLine& line) // see: https://github.com/makerbot/s3g/blob/master/doc/GCodeProtocol.md // Using this command to reset the axis origin to zero helps in fixing: https://github.com/prusa3d/PrusaSlicer/issues/3082 - if (line.has_x()) + if (line.has('X')) m_origin[X] = 0.0f; - if (line.has_y()) + if (line.has('Y')) m_origin[Y] = 0.0f; - if (line.has_z()) + if (line.has('Z')) m_origin[Z] = 0.0f; - if (line.has_e()) + if (line.has('E')) m_origin[E] = 0.0f; } @@ -2943,22 +2963,14 @@ void GCodeProcessor::process_M204(const GCodeReader::GCodeLine& line) set_acceleration(static_cast(i), value); set_travel_acceleration(static_cast(i), value); if (line.has_value('T', value)) -#if ENABLE_RETRACT_ACCELERATION set_retract_acceleration(static_cast(i), value); -#else - set_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i, value); -#endif // ENABLE_RETRACT_ACCELERATION } else { // New acceleration format, compatible with the upstream Marlin. if (line.has_value('P', value)) set_acceleration(static_cast(i), value); if (line.has_value('R', value)) -#if ENABLE_RETRACT_ACCELERATION set_retract_acceleration(static_cast(i), value); -#else - set_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i, value); -#endif // ENABLE_RETRACT_ACCELERATION if (line.has_value('T', value)) // Interpret the T value as the travel acceleration in the new Marlin format. set_travel_acceleration(static_cast(i), value); @@ -3029,7 +3041,7 @@ void GCodeProcessor::process_M402(const GCodeReader::GCodeLine& line) // https://github.com/repetier/Repetier-Firmware/blob/master/src/ArduinoAVR/Repetier/Printer.cpp // void Printer::GoToMemoryPosition(bool x, bool y, bool z, bool e, float feed) - bool has_xyz = !(line.has_x() || line.has_y() || line.has_z()); + bool has_xyz = !(line.has('X') || line.has('Y') || line.has('Z')); float p = FLT_MAX; for (unsigned char a = X; a <= Z; ++a) { @@ -3216,20 +3228,12 @@ float GCodeProcessor::get_axis_max_jerk(PrintEstimatedStatistics::ETimeMode mode } } -#if ENABLE_RETRACT_ACCELERATION float GCodeProcessor::get_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode) const { size_t id = static_cast(mode); return (id < m_time_processor.machines.size()) ? m_time_processor.machines[id].retract_acceleration : DEFAULT_RETRACT_ACCELERATION; } -#else -float GCodeProcessor::get_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode) const -{ - return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, static_cast(mode)); -} -#endif // ENABLE_RETRACT_ACCELERATION -#if ENABLE_RETRACT_ACCELERATION void GCodeProcessor::set_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value) { size_t id = static_cast(mode); @@ -3239,7 +3243,6 @@ void GCodeProcessor::set_retract_acceleration(PrintEstimatedStatistics::ETimeMod std::min(value, m_time_processor.machines[id].max_retract_acceleration); } } -#endif // ENABLE_RETRACT_ACCELERATION float GCodeProcessor::get_acceleration(PrintEstimatedStatistics::ETimeMode mode) const { diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 040f7432a..fce888233 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -242,11 +242,9 @@ namespace Slic3r { float acceleration; // mm/s^2 // hard limit for the acceleration, to which the firmware will clamp. float max_acceleration; // mm/s^2 -#if ENABLE_RETRACT_ACCELERATION float retract_acceleration; // mm/s^2 // hard limit for the acceleration, to which the firmware will clamp. float max_retract_acceleration; // mm/s^2 -#endif // ENABLE_RETRACT_ACCELERATION float travel_acceleration; // mm/s^2 // hard limit for the travel acceleration, to which the firmware will clamp. float max_travel_acceleration; // mm/s^2 @@ -359,9 +357,7 @@ namespace Slic3r { std::vector filament_diameters; std::vector filament_densities; PrintEstimatedStatistics print_statistics; -#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER std::vector custom_gcode_per_print_z; -#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER #if ENABLE_GCODE_VIEWER_STATISTICS int64_t time{ 0 }; @@ -536,9 +532,7 @@ namespace Slic3r { #if ENABLE_FIX_PREVIEW_OPTIONS_Z OptionsZCorrector m_options_z_corrector; #endif // ENABLE_FIX_PREVIEW_OPTIONS_Z -#if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER size_t m_last_default_color_id; -#endif // ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER #if ENABLE_GCODE_VIEWER_STATISTICS std::chrono::time_point m_start_time; #endif // ENABLE_GCODE_VIEWER_STATISTICS @@ -549,6 +543,9 @@ namespace Slic3r { PrusaSlicer, Slic3rPE, Slic3r, +#if ENABLE_FIX_SUPERSLICER_GCODE_IMPORT + SuperSlicer, +#endif // ENABLE_FIX_SUPERSLICER_GCODE_IMPORT Cura, Simplify3D, CraftWare, @@ -585,14 +582,14 @@ namespace Slic3r { const Result& get_result() const { return m_result; } Result&& extract_result() { return std::move(m_result); } - // Process the gcode contained in the file with the given filename + // Load a G-code into a stand-alone G-code viewer. // throws CanceledException through print->throw_if_canceled() (sent by the caller as callback). void process_file(const std::string& filename, std::function cancel_callback = nullptr); // Streaming interface, for processing G-codes just generated by PrusaSlicer in a pipelined fashion. void initialize(const std::string& filename); void process_buffer(const std::string& buffer); - void finalize(); + void finalize(bool post_process); float get_time(PrintEstimatedStatistics::ETimeMode mode) const; std::string get_time_dhm(PrintEstimatedStatistics::ETimeMode mode) const; @@ -605,6 +602,9 @@ namespace Slic3r { private: void apply_config(const DynamicPrintConfig& config); void apply_config_simplify3d(const std::string& filename); +#if ENABLE_FIX_SUPERSLICER_GCODE_IMPORT + void apply_config_superslicer(const std::string& filename); +#endif // ENABLE_FIX_SUPERSLICER_GCODE_IMPORT void process_gcode_line(const GCodeReader::GCodeLine& line, bool producers_enabled); // Process tags embedded into comments @@ -724,9 +724,7 @@ namespace Slic3r { float get_axis_max_acceleration(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const; float get_axis_max_jerk(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const; float get_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode) const; -#if ENABLE_RETRACT_ACCELERATION void set_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value); -#endif // ENABLE_RETRACT_ACCELERATION float get_acceleration(PrintEstimatedStatistics::ETimeMode mode) const; void set_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value); float get_travel_acceleration(PrintEstimatedStatistics::ETimeMode mode) const; diff --git a/src/libslic3r/GCodeReader.cpp b/src/libslic3r/GCodeReader.cpp index 61ab10f22..7b106463a 100644 --- a/src/libslic3r/GCodeReader.cpp +++ b/src/libslic3r/GCodeReader.cpp @@ -2,9 +2,11 @@ #include #include #include +#include #include #include #include +#include "Utils.hpp" #include "LocalesUtils.hpp" @@ -126,44 +128,92 @@ void GCodeReader::update_coordinates(GCodeLine &gline, std::pair +bool GCodeReader::parse_file_raw_internal(const std::string &filename, ParseLineCallback parse_line_callback, LineEndCallback line_end_callback) { - boost::nowide::ifstream f(file); - f.sync_with_stdio(false); + FilePtr in{ boost::nowide::fopen(filename.c_str(), "rb") }; + + // Read the input stream 64kB at a time, extract lines and process them. std::vector buffer(65536 * 10, 0); - std::string line; + // Line buffer. + std::string gcode_line; + size_t file_pos = 0; m_parsing = true; - GCodeLine gline; - while (m_parsing && ! f.eof()) { - f.read(buffer.data(), buffer.size()); - if (! f.eof() && ! f.good()) - // Reading the input file failed. + for (;;) { + size_t cnt_read = ::fread(buffer.data(), 1, buffer.size(), in.f); + if (::ferror(in.f)) return false; + bool eof = cnt_read == 0; auto it = buffer.begin(); - auto it_bufend = buffer.begin() + f.gcount(); - while (it != it_bufend) { - bool eol = false; + auto it_bufend = buffer.begin() + cnt_read; + while (it != it_bufend || (eof && ! gcode_line.empty())) { + // Find end of line. + bool eol = false; auto it_end = it; - for (; it_end != it_bufend && ! (eol = *it_end == '\r' || *it_end == '\n'); ++ it_end) ; - eol |= f.eof() && it_end == it_bufend; + for (; it_end != it_bufend && ! (eol = *it_end == '\r' || *it_end == '\n'); ++ it_end) + if (*it_end == '\n') + line_end_callback((it_end - buffer.begin()) + 1); + // End of line is indicated also if end of file was reached. + eol |= eof && it_end == it_bufend; if (eol) { - gline.reset(); - if (line.empty()) - this->parse_line(&(*it), &(*it_end), gline, callback); + if (gcode_line.empty()) + parse_line_callback(&(*it), &(*it_end)); else { - line.insert(line.end(), it, it_end); - this->parse_line(line.c_str(), line.c_str() + line.size(), gline, callback); - line.clear(); + gcode_line.insert(gcode_line.end(), it, it_end); + parse_line_callback(gcode_line.c_str(), gcode_line.c_str() + gcode_line.size()); + gcode_line.clear(); } + if (! m_parsing) + // The callback wishes to exit. + return true; } else - line.insert(line.end(), it, it_end); - // Skip all the empty lines. - for (it = it_end; it != it_bufend && (*it == '\r' || *it == '\n'); ++ it) ; + gcode_line.insert(gcode_line.end(), it, it_end); + // Skip EOL. + it = it_end; + if (it != it_bufend && *it == '\r') + ++ it; + if (it != it_bufend && *it == '\n') { + line_end_callback((it - buffer.begin()) + 1); + ++ it; + } } + if (eof) + break; + file_pos += cnt_read; } return true; } +template +bool GCodeReader::parse_file_internal(const std::string &filename, ParseLineCallback parse_line_callback, LineEndCallback line_end_callback) +{ + GCodeLine gline; + return this->parse_file_raw_internal(filename, + [this, &gline, parse_line_callback](const char *begin, const char *end) { + gline.reset(); + this->parse_line(begin, end, gline, parse_line_callback); + }, + line_end_callback); +} + +bool GCodeReader::parse_file(const std::string &file, callback_t callback) +{ + return this->parse_file_internal(file, callback, [](size_t){}); +} + +bool GCodeReader::parse_file(const std::string &file, callback_t callback, std::vector &lines_ends) +{ + lines_ends.clear(); + return this->parse_file_internal(file, callback, [&lines_ends](size_t file_pos){ lines_ends.emplace_back(file_pos); }); +} + +bool GCodeReader::parse_file_raw(const std::string &filename, raw_line_callback_t line_callback) +{ + return this->parse_file_raw_internal(filename, + [this, line_callback](const char *begin, const char *end) { line_callback(*this, begin, end); }, + [](size_t){}); +} + bool GCodeReader::GCodeLine::has(char axis) const { const char *c = m_raw.c_str(); diff --git a/src/libslic3r/GCodeReader.hpp b/src/libslic3r/GCodeReader.hpp index 15376c0fc..0ab268139 100644 --- a/src/libslic3r/GCodeReader.hpp +++ b/src/libslic3r/GCodeReader.hpp @@ -76,6 +76,7 @@ public: }; typedef std::function callback_t; + typedef std::function raw_line_callback_t; GCodeReader() : m_verbose(false), m_extrusion_axis('E') { this->reset(); } void reset() { memset(m_position, 0, sizeof(m_position)); } @@ -114,6 +115,13 @@ public: // Returns false if reading the file failed. bool parse_file(const std::string &file, callback_t callback); + // Collect positions of line ends in the binary G-code to be used by the G-code viewer when memory mapping and displaying section of G-code + // as an overlay in the 3D scene. + bool parse_file(const std::string &file, callback_t callback, std::vector &lines_ends); + // Just read the G-code file line by line, calls callback (const char *begin, const char *end). Returns false if reading the file failed. + bool parse_file_raw(const std::string &file, raw_line_callback_t callback); + + // To be called by the callback to stop parsing. void quit_parsing() { m_parsing = false; } float& x() { return m_position[X]; } @@ -132,6 +140,11 @@ public: // void set_extrusion_axis(char axis) { m_extrusion_axis = axis; } private: + template + bool parse_file_raw_internal(const std::string &filename, ParseLineCallback parse_line_callback, LineEndCallback line_end_callback); + template + bool parse_file_internal(const std::string &filename, ParseLineCallback parse_line_callback, LineEndCallback line_end_callback); + const char* parse_line_internal(const char *ptr, const char *end, GCodeLine &gline, std::pair &command); void update_coordinates(GCodeLine &gline, std::pair &command); @@ -154,6 +167,7 @@ private: char m_extrusion_axis; float m_position[NUM_AXES]; bool m_verbose; + // To be set by the callback to stop parsing. bool m_parsing{ false }; }; diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index eb45e95c1..f57e25406 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -1,7 +1,6 @@ #include "GCodeWriter.hpp" #include "CustomGCode.hpp" #include -#include #include #include #include @@ -11,15 +10,8 @@ #include #endif -#define XYZF_EXPORT_DIGITS 3 -#define E_EXPORT_DIGITS 5 - #define FLAVOR_IS(val) this->config.gcode_flavor == val #define FLAVOR_IS_NOT(val) this->config.gcode_flavor != val -#define COMMENT(comment) if (this->config.gcode_comments && !comment.empty()) gcode << " ; " << comment; -#define PRECISION(val, precision) std::fixed << std::setprecision(precision) << (val) -#define XYZF_NUM(val) PRECISION(val, XYZF_EXPORT_DIGITS) -#define E_NUM(val) PRECISION(val, E_EXPORT_DIGITS) namespace Slic3r { @@ -261,115 +253,12 @@ std::string GCodeWriter::toolchange(unsigned int extruder_id) return gcode.str(); } -class G1Writer { -private: - static constexpr const size_t buflen = 256; - char buf[buflen]; - char *buf_end; - std::to_chars_result ptr_err; - -public: - G1Writer() { - this->buf[0] = 'G'; - this->buf[1] = '1'; - this->buf_end = this->buf + buflen; - this->ptr_err.ptr = this->buf + 2; - } - - void emit_axis(const char axis, const double v, size_t digits) { - assert(digits <= 6); - static constexpr const std::array pow_10{1, 10, 100, 1000, 10000, 100000, 1000000}; - *ptr_err.ptr++ = ' '; *ptr_err.ptr++ = axis; - - char *base_ptr = this->ptr_err.ptr; - auto v_int = int64_t(std::round(v * pow_10[digits])); - // Older stdlib on macOS doesn't support std::from_chars at all, so it is used boost::spirit::karma::generate instead of it. - // That is a little bit slower than std::to_chars but not much. -#ifdef __APPLE__ - boost::spirit::karma::generate(this->ptr_err.ptr, boost::spirit::karma::int_generator(), v_int); -#else - // this->buf_end minus 1 because we need space for adding the extra decimal point. - this->ptr_err = std::to_chars(this->ptr_err.ptr, this->buf_end - 1, v_int); -#endif - size_t writen_digits = (this->ptr_err.ptr - base_ptr) - (v_int < 0 ? 1 : 0); - if (writen_digits < digits) { - // Number is smaller than 10^digits, so that we will pad it with zeros. - size_t remaining_digits = digits - writen_digits; - // Move all newly inserted chars by remaining_digits to allocate space for padding with zeros. - for (char *from_ptr = this->ptr_err.ptr - 1, *to_ptr = from_ptr + remaining_digits; from_ptr >= this->ptr_err.ptr - writen_digits; --to_ptr, --from_ptr) - *to_ptr = *from_ptr; - - memset(this->ptr_err.ptr - writen_digits, '0', remaining_digits); - this->ptr_err.ptr += remaining_digits; - } - - // Move all newly inserted chars by one to allocate space for a decimal point. - for (char *to_ptr = this->ptr_err.ptr, *from_ptr = to_ptr - 1; from_ptr >= this->ptr_err.ptr - digits; --to_ptr, --from_ptr) - *to_ptr = *from_ptr; - - *(this->ptr_err.ptr - digits) = '.'; - for (size_t i = 0; i < digits; ++i) { - if (*this->ptr_err.ptr != '0') - break; - this->ptr_err.ptr--; - } - if (*this->ptr_err.ptr == '.') - this->ptr_err.ptr--; - if ((this->ptr_err.ptr + 1) == base_ptr || *this->ptr_err.ptr == '-') - *(++this->ptr_err.ptr) = '0'; - this->ptr_err.ptr++; - } - - void emit_xy(const Vec2d &point) { - this->emit_axis('X', point.x(), XYZF_EXPORT_DIGITS); - this->emit_axis('Y', point.y(), XYZF_EXPORT_DIGITS); - } - - void emit_xyz(const Vec3d &point) { - this->emit_axis('X', point.x(), XYZF_EXPORT_DIGITS); - this->emit_axis('Y', point.y(), XYZF_EXPORT_DIGITS); - this->emit_z(point.z()); - } - - void emit_z(const double z) { - this->emit_axis('Z', z, XYZF_EXPORT_DIGITS); - } - - void emit_e(const std::string &axis, double v) { - if (! axis.empty()) { - // not gcfNoExtrusion - this->emit_axis(axis[0], v, E_EXPORT_DIGITS); - } - } - - void emit_f(double speed) { - this->emit_axis('F', speed, XYZF_EXPORT_DIGITS); - } - - void emit_string(const std::string &s) { - strncpy(ptr_err.ptr, s.c_str(), s.size()); - ptr_err.ptr += s.size(); - } - - void emit_comment(bool allow_comments, const std::string &comment) { - if (allow_comments && ! comment.empty()) { - *ptr_err.ptr ++ = ' '; *ptr_err.ptr ++ = ';'; *ptr_err.ptr ++ = ' '; - this->emit_string(comment); - } - } - - std::string string() { - *ptr_err.ptr ++ = '\n'; - return std::string(this->buf, ptr_err.ptr - buf); - } -}; - std::string GCodeWriter::set_speed(double F, const std::string &comment, const std::string &cooling_marker) const { assert(F > 0.); assert(F < 100000.); - G1Writer w; + GCodeG1Formatter w; w.emit_f(F); w.emit_comment(this->config.gcode_comments, comment); w.emit_string(cooling_marker); @@ -381,7 +270,7 @@ std::string GCodeWriter::travel_to_xy(const Vec2d &point, const std::string &com m_pos(0) = point(0); m_pos(1) = point(1); - G1Writer w; + GCodeG1Formatter w; w.emit_xy(point); w.emit_f(this->config.travel_speed.value * 60.0); w.emit_comment(this->config.gcode_comments, comment); @@ -414,7 +303,7 @@ std::string GCodeWriter::travel_to_xyz(const Vec3d &point, const std::string &co m_lifted = 0; m_pos = point; - G1Writer w; + GCodeG1Formatter w; w.emit_xyz(point); w.emit_f(this->config.travel_speed.value * 60.0); w.emit_comment(this->config.gcode_comments, comment); @@ -448,7 +337,7 @@ std::string GCodeWriter::_travel_to_z(double z, const std::string &comment) if (speed == 0.) speed = this->config.travel_speed.value; - G1Writer w; + GCodeG1Formatter w; w.emit_z(z); w.emit_f(speed * 60.0); w.emit_comment(this->config.gcode_comments, comment); @@ -473,7 +362,7 @@ std::string GCodeWriter::extrude_to_xy(const Vec2d &point, double dE, const std: m_pos(1) = point(1); m_extruder->extrude(dE); - G1Writer w; + GCodeG1Formatter w; w.emit_xy(point); w.emit_e(m_extrusion_axis, m_extruder->E()); w.emit_comment(this->config.gcode_comments, comment); @@ -486,7 +375,7 @@ std::string GCodeWriter::extrude_to_xyz(const Vec3d &point, double dE, const std m_lifted = 0; m_extruder->extrude(dE); - G1Writer w; + GCodeG1Formatter w; w.emit_xyz(point); w.emit_e(m_extrusion_axis, m_extruder->E()); w.emit_comment(this->config.gcode_comments, comment); @@ -517,12 +406,11 @@ std::string GCodeWriter::retract_for_toolchange(bool before_wipe) std::string GCodeWriter::_retract(double length, double restart_extra, const std::string &comment) { - std::ostringstream gcode; - /* If firmware retraction is enabled, we use a fake value of 1 since we ignore the actual configured retract_length which might be 0, in which case the retraction logic gets skipped. */ - if (this->config.use_firmware_retraction) length = 1; + if (this->config.use_firmware_retraction) + length = 1; // If we use volumetric E values we turn lengths into volumes */ if (this->config.use_volumetric_e) { @@ -532,52 +420,48 @@ std::string GCodeWriter::_retract(double length, double restart_extra, const std restart_extra = restart_extra * area; } - double dE = m_extruder->retract(length, restart_extra); - if (dE != 0) { + + std::string gcode; + if (double dE = m_extruder->retract(length, restart_extra); dE != 0) { if (this->config.use_firmware_retraction) { - if (FLAVOR_IS(gcfMachinekit)) - gcode << "G22 ; retract\n"; - else - gcode << "G10 ; retract\n"; + gcode = FLAVOR_IS(gcfMachinekit) ? "G22 ; retract\n" : "G10 ; retract\n"; } else if (! m_extrusion_axis.empty()) { - gcode << "G1 " << m_extrusion_axis << E_NUM(m_extruder->E()) - << " F" << XYZF_NUM(m_extruder->retract_speed() * 60.); - COMMENT(comment); - gcode << "\n"; + GCodeG1Formatter w; + w.emit_e(m_extrusion_axis, m_extruder->E()); + w.emit_f(m_extruder->retract_speed() * 60.); + w.emit_comment(this->config.gcode_comments, comment); + gcode = w.string(); } } if (FLAVOR_IS(gcfMakerWare)) - gcode << "M103 ; extruder off\n"; - - return gcode.str(); + gcode += "M103 ; extruder off\n"; + + return gcode; } std::string GCodeWriter::unretract() { - std::ostringstream gcode; + std::string gcode; if (FLAVOR_IS(gcfMakerWare)) - gcode << "M101 ; extruder on\n"; + gcode = "M101 ; extruder on\n"; - double dE = m_extruder->unretract(); - if (dE != 0) { + if (double dE = m_extruder->unretract(); dE != 0) { if (this->config.use_firmware_retraction) { - if (FLAVOR_IS(gcfMachinekit)) - gcode << "G23 ; unretract\n"; - else - gcode << "G11 ; unretract\n"; - gcode << this->reset_e(); + gcode += FLAVOR_IS(gcfMachinekit) ? "G23 ; unretract\n" : "G11 ; unretract\n"; + gcode += this->reset_e(); } else if (! m_extrusion_axis.empty()) { // use G1 instead of G0 because G0 will blend the restart with the previous travel move - gcode << "G1 " << m_extrusion_axis << E_NUM(m_extruder->E()) - << " F" << XYZF_NUM(m_extruder->deretract_speed() * 60.); - if (this->config.gcode_comments) gcode << " ; unretract"; - gcode << "\n"; + GCodeG1Formatter w; + w.emit_e(m_extrusion_axis, m_extruder->E()); + w.emit_f(m_extruder->deretract_speed() * 60.); + w.emit_comment(this->config.gcode_comments, " ; unretract"); + gcode += w.string(); } } - return gcode.str(); + return gcode; } /* If this method is called more than once before calling unlift(), @@ -649,4 +533,49 @@ std::string GCodeWriter::set_fan(unsigned int speed) const return GCodeWriter::set_fan(this->config.gcode_flavor, this->config.gcode_comments, speed); } + +void GCodeFormatter::emit_axis(const char axis, const double v, size_t digits) { + assert(digits <= 6); + static constexpr const std::array pow_10{1, 10, 100, 1000, 10000, 100000, 1000000}; + *ptr_err.ptr++ = ' '; *ptr_err.ptr++ = axis; + + char *base_ptr = this->ptr_err.ptr; + auto v_int = int64_t(std::round(v * pow_10[digits])); + // Older stdlib on macOS doesn't support std::from_chars at all, so it is used boost::spirit::karma::generate instead of it. + // That is a little bit slower than std::to_chars but not much. +#ifdef __APPLE__ + boost::spirit::karma::generate(this->ptr_err.ptr, boost::spirit::karma::int_generator(), v_int); +#else + // this->buf_end minus 1 because we need space for adding the extra decimal point. + this->ptr_err = std::to_chars(this->ptr_err.ptr, this->buf_end - 1, v_int); +#endif + size_t writen_digits = (this->ptr_err.ptr - base_ptr) - (v_int < 0 ? 1 : 0); + if (writen_digits < digits) { + // Number is smaller than 10^digits, so that we will pad it with zeros. + size_t remaining_digits = digits - writen_digits; + // Move all newly inserted chars by remaining_digits to allocate space for padding with zeros. + for (char *from_ptr = this->ptr_err.ptr - 1, *to_ptr = from_ptr + remaining_digits; from_ptr >= this->ptr_err.ptr - writen_digits; --to_ptr, --from_ptr) + *to_ptr = *from_ptr; + + memset(this->ptr_err.ptr - writen_digits, '0', remaining_digits); + this->ptr_err.ptr += remaining_digits; + } + + // Move all newly inserted chars by one to allocate space for a decimal point. + for (char *to_ptr = this->ptr_err.ptr, *from_ptr = to_ptr - 1; from_ptr >= this->ptr_err.ptr - digits; --to_ptr, --from_ptr) + *to_ptr = *from_ptr; + + *(this->ptr_err.ptr - digits) = '.'; + for (size_t i = 0; i < digits; ++i) { + if (*this->ptr_err.ptr != '0') + break; + this->ptr_err.ptr--; + } + if (*this->ptr_err.ptr == '.') + this->ptr_err.ptr--; + if ((this->ptr_err.ptr + 1) == base_ptr || *this->ptr_err.ptr == '-') + *(++this->ptr_err.ptr) = '0'; + this->ptr_err.ptr++; } + +} // namespace Slic3r diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index dd602ca80..6e2c08d3b 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -3,6 +3,7 @@ #include "libslic3r.h" #include +#include #include "Extruder.hpp" #include "Point.hpp" #include "PrintConfig.hpp" @@ -93,6 +94,84 @@ private: std::string _retract(double length, double restart_extra, const std::string &comment); }; +class GCodeFormatter { +public: + GCodeFormatter() { + this->buf_end = buf + buflen; + this->ptr_err.ptr = this->buf; + } + + GCodeFormatter(const GCodeFormatter&) = delete; + GCodeFormatter& operator=(const GCodeFormatter&) = delete; + + static constexpr const int XYZF_EXPORT_DIGITS = 3; + static constexpr const int E_EXPORT_DIGITS = 5; + + void emit_axis(const char axis, const double v, size_t digits); + + void emit_xy(const Vec2d &point) { + this->emit_axis('X', point.x(), XYZF_EXPORT_DIGITS); + this->emit_axis('Y', point.y(), XYZF_EXPORT_DIGITS); + } + + void emit_xyz(const Vec3d &point) { + this->emit_axis('X', point.x(), XYZF_EXPORT_DIGITS); + this->emit_axis('Y', point.y(), XYZF_EXPORT_DIGITS); + this->emit_z(point.z()); + } + + void emit_z(const double z) { + this->emit_axis('Z', z, XYZF_EXPORT_DIGITS); + } + + void emit_e(const std::string &axis, double v) { + if (! axis.empty()) { + // not gcfNoExtrusion + this->emit_axis(axis[0], v, E_EXPORT_DIGITS); + } + } + + void emit_f(double speed) { + this->emit_axis('F', speed, XYZF_EXPORT_DIGITS); + } + + void emit_string(const std::string &s) { + strncpy(ptr_err.ptr, s.c_str(), s.size()); + ptr_err.ptr += s.size(); + } + + void emit_comment(bool allow_comments, const std::string &comment) { + if (allow_comments && ! comment.empty()) { + *ptr_err.ptr ++ = ' '; *ptr_err.ptr ++ = ';'; *ptr_err.ptr ++ = ' '; + this->emit_string(comment); + } + } + + std::string string() { + *ptr_err.ptr ++ = '\n'; + return std::string(this->buf, ptr_err.ptr - buf); + } + +protected: + static constexpr const size_t buflen = 256; + char buf[buflen]; + char* buf_end; + std::to_chars_result ptr_err; +}; + +class GCodeG1Formatter : public GCodeFormatter { +public: + GCodeG1Formatter() { + this->buf[0] = 'G'; + this->buf[1] = '1'; + this->buf_end = buf + buflen; + this->ptr_err.ptr = this->buf + 2; + } + + GCodeG1Formatter(const GCodeG1Formatter&) = delete; + GCodeG1Formatter& operator=(const GCodeG1Formatter&) = delete; +}; + } /* namespace Slic3r */ #endif /* slic3r_GCodeWriter_hpp_ */ diff --git a/src/libslic3r/Geometry.cpp b/src/libslic3r/Geometry.cpp index 321443204..420ab473f 100644 --- a/src/libslic3r/Geometry.cpp +++ b/src/libslic3r/Geometry.cpp @@ -20,6 +20,12 @@ #include #include +#if defined(_MSC_VER) && defined(__clang__) +#define BOOST_NO_CXX17_HDR_STRING_VIEW +#endif + +#include + #ifdef SLIC3R_DEBUG #include "SVG.hpp" #endif @@ -1543,4 +1549,205 @@ double rotation_diff_z(const Vec3d &rot_xyz_from, const Vec3d &rot_xyz_to) return (axis.z() < 0) ? -angle : angle; } -} } +namespace rotcalip { + +using int256_t = boost::multiprecision::int256_t; +using int128_t = boost::multiprecision::int128_t; + +template +inline Scalar magnsq(const Point &p) +{ + return Scalar(p.x()) * p.x() + Scalar(p.y()) * p.y(); +} + +template +inline Scalar dot(const Point &a, const Point &b) +{ + return Scalar(a.x()) * b.x() + Scalar(a.y()) * b.y(); +} + +template +inline Scalar dotperp(const Point &a, const Point &b) +{ + return Scalar(a.x()) * b.y() - Scalar(a.y()) * b.x(); +} + +using boost::multiprecision::abs; + +// Compares the angle enclosed by vectors dir and dirA (alpha) with the angle +// enclosed by -dir and dirB (beta). Returns -1 if alpha is less than beta, 0 +// if they are equal and 1 if alpha is greater than beta. Note that dir is +// reversed for beta, because it represents the opposite side of a caliper. +int cmp_angles(const Point &dir, const Point &dirA, const Point &dirB) { + int128_t dotA = dot(dir, dirA); + int128_t dotB = dot(-dir, dirB); + int256_t dcosa = int256_t(magnsq(dirB)) * int256_t(abs(dotA)) * dotA; + int256_t dcosb = int256_t(magnsq(dirA)) * int256_t(abs(dotB)) * dotB; + int256_t diff = dcosa - dcosb; + + return diff > 0? -1 : (diff < 0 ? 1 : 0); +} + +// A helper class to navigate on a polygon. Given a vertex index, one can +// get the edge belonging to that vertex, the coordinates of the vertex, the +// next and previous edges. Stuff that is needed in the rotating calipers algo. +class Idx +{ + size_t m_idx; + const Polygon *m_poly; +public: + explicit Idx(const Polygon &p): m_idx{0}, m_poly{&p} {} + explicit Idx(size_t idx, const Polygon &p): m_idx{idx}, m_poly{&p} {} + + size_t idx() const { return m_idx; } + void set_idx(size_t i) { m_idx = i; } + size_t next() const { return (m_idx + 1) % m_poly->size(); } + size_t inc() { return m_idx = (m_idx + 1) % m_poly->size(); } + Point prev_dir() const { + return pt() - (*m_poly)[(m_idx + m_poly->size() - 1) % m_poly->size()]; + } + + const Point &pt() const { return (*m_poly)[m_idx]; } + const Point dir() const { return (*m_poly)[next()] - pt(); } + const Point next_dir() const + { + return (*m_poly)[(m_idx + 2) % m_poly->size()] - (*m_poly)[next()]; + } + const Polygon &poly() const { return *m_poly; } +}; + +enum class AntipodalVisitMode { Full, EdgesOnly }; + +// Visit all antipodal pairs starting from the initial ia, ib pair which +// has to be a valid antipodal pair (not checked). fn is called for every +// antipodal pair encountered including the initial one. +// The callback Fn has a signiture of bool(size_t i, size_t j, const Point &dir) +// where i,j are the vertex indices of the antipodal pair and dir is the +// direction of the calipers touching the i vertex. +template +void visit_antipodals (Idx& ia, Idx &ib, Fn &&fn) +{ + // Set current caliper direction to be the lower edge angle from X axis + int cmp = cmp_angles(ia.prev_dir(), ia.dir(), ib.dir()); + Idx *current = cmp <= 0 ? &ia : &ib, *other = cmp <= 0 ? &ib : &ia; + Idx *initial = current; + bool visitor_continue = true; + + size_t start = initial->idx(); + bool finished = false; + + while (visitor_continue && !finished) { + Point current_dir_a = current == &ia ? current->dir() : -current->dir(); + visitor_continue = fn(ia.idx(), ib.idx(), current_dir_a); + + // Parallel edges encountered. An additional pair of antipodals + // can be yielded. + if constexpr (mode == AntipodalVisitMode::Full) + if (cmp == 0 && visitor_continue) { + visitor_continue = fn(current == &ia ? ia.idx() : ia.next(), + current == &ib ? ib.idx() : ib.next(), + current_dir_a); + } + + cmp = cmp_angles(current->dir(), current->next_dir(), other->dir()); + + current->inc(); + if (cmp > 0) { + std::swap(current, other); + } + + if (initial->idx() == start) finished = true; + } +} + +} // namespace rotcalip + +bool intersects(const Polygon &A, const Polygon &B) +{ + using namespace rotcalip; + + // Establish starting antipodals as extremes in XY plane. Use the + // easily obtainable bounding boxes to check if A and B is disjoint + // and return false if the are. + struct BB + { + size_t xmin = 0, xmax = 0, ymin = 0, ymax = 0; + const Polygon &P; + static bool cmpy(const Point &l, const Point &u) + { + return l.y() < u.y() || (l.y() == u.y() && l.x() < u.x()); + } + + BB(const Polygon &poly): P{poly} + { + for (size_t i = 0; i < P.size(); ++i) { + if (P[i] < P[xmin]) xmin = i; + if (P[xmax] < P[i]) xmax = i; + if (cmpy(P[i], P[ymin])) ymin = i; + if (cmpy(P[ymax], P[i])) ymax = i; + } + } + }; + + BB bA{A}, bB{B}; + BoundingBox bbA{{A[bA.xmin].x(), A[bA.ymin].y()}, {A[bA.xmax].x(), A[bA.ymax].y()}}; + BoundingBox bbB{{B[bB.xmin].x(), B[bB.ymin].y()}, {B[bB.xmax].x(), B[bB.ymax].y()}}; + +// if (!bbA.overlap(bbB)) +// return false; + + // Establish starting antipodals as extreme vertex pairs in X or Y direction + // which reside on different polygons. If no such pair is found, the two + // polygons are certainly not disjoint. + Idx imin{bA.xmin, A}, imax{bB.xmax, B}; + if (B[bB.xmin] < imin.pt()) imin = Idx{bB.xmin, B}; + if (imax.pt() < A[bA.xmax]) imax = Idx{bA.xmax, A}; + if (&imin.poly() == &imax.poly()) { + imin = Idx{bA.ymin, A}; + imax = Idx{bB.ymax, B}; + if (B[bB.ymin] < imin.pt()) imin = Idx{bB.ymin, B}; + if (imax.pt() < A[bA.ymax]) imax = Idx{bA.ymax, A}; + } + + if (&imin.poly() == &imax.poly()) + return true; + + bool found_divisor = false; + visit_antipodals( + imin, imax, + [&imin, &imax, &found_divisor](size_t ia, size_t ib, const Point &dir) { + // std::cout << "A" << ia << " B" << ib << " dir " << + // dir.x() << " " << dir.y() << std::endl; + const Polygon &A = imin.poly(), &B = imax.poly(); + + Point ref_a = A[(ia + 2) % A.size()], ref_b = B[(ib + 2) % B.size()]; + + bool is_left_a = dotperp( dir, ref_a - A[ia]) > 0; + bool is_left_b = dotperp(-dir, ref_b - B[ib]) > 0; + + // If both reference points are on the left (or right) of their + // respective support lines and the opposite support line is to + // the right (or left), the divisor line is found. We only test + // the reference point, as by definition, if that is on one side, + // all the other points must be on the same side of a support + // line. If the support lines are collinear, the polygons must be + // on the same side of their respective support lines. + + auto d = dotperp(dir, B[ib] - A[ia]); + if (d == 0) { + // The caliper lines are collinear, not just parallel + found_divisor = (is_left_a && is_left_b) || (!is_left_a && !is_left_b); + } else if (d > 0) { // B is to the left of (A, A+1) + found_divisor = !is_left_a && !is_left_b; + } else { // B is to the right of (A, A+1) + found_divisor = is_left_a && is_left_b; + } + + return !found_divisor; + }); + + // Intersects if the divisor was not found + return !found_divisor; +} + +}} // namespace Slic3r::Geometry diff --git a/src/libslic3r/Geometry.hpp b/src/libslic3r/Geometry.hpp index c6af515c8..505ff3d96 100644 --- a/src/libslic3r/Geometry.hpp +++ b/src/libslic3r/Geometry.hpp @@ -532,6 +532,10 @@ inline bool is_rotation_ninety_degrees(const Vec3d &rotation) return is_rotation_ninety_degrees(rotation.x()) && is_rotation_ninety_degrees(rotation.y()) && is_rotation_ninety_degrees(rotation.z()); } +// Returns true if the intersection of the two convex polygons A and B +// is not an empty set. +bool intersects(const Polygon &A, const Polygon &B); + } } // namespace Slicer::Geometry #endif diff --git a/src/libslic3r/LocalesUtils.cpp b/src/libslic3r/LocalesUtils.cpp index 64ab700ed..d32107233 100644 --- a/src/libslic3r/LocalesUtils.cpp +++ b/src/libslic3r/LocalesUtils.cpp @@ -1,7 +1,13 @@ #include "LocalesUtils.hpp" +#ifdef _WIN32 + #include +#endif #include +#include + + namespace Slic3r { @@ -11,15 +17,15 @@ CNumericLocalesSetter::CNumericLocalesSetter() _configthreadlocale(_ENABLE_PER_THREAD_LOCALE); m_orig_numeric_locale = std::setlocale(LC_NUMERIC, nullptr); std::setlocale(LC_NUMERIC, "C"); -#elif __linux__ +#elif __APPLE__ + m_original_locale = uselocale((locale_t)0); + m_new_locale = newlocale(LC_NUMERIC_MASK, "C", m_original_locale); + uselocale(m_new_locale); +#else // linux / BSD m_original_locale = uselocale((locale_t)0); m_new_locale = duplocale(m_original_locale); m_new_locale = newlocale(LC_NUMERIC_MASK, "C", m_new_locale); uselocale(m_new_locale); -#else // APPLE - m_original_locale = uselocale((locale_t)0); - m_new_locale = newlocale(LC_NUMERIC_MASK, "C", m_original_locale); - uselocale(m_new_locale); #endif } @@ -45,28 +51,37 @@ bool is_decimal_separator_point() } -double string_to_double_decimal_point(const std::string& str, size_t* pos /* = nullptr*/) +double string_to_double_decimal_point(const std::string_view str, size_t* pos /* = nullptr*/) { double out; - std::istringstream stream(str); - if (! (stream >> out)) - throw std::invalid_argument("string_to_double_decimal_point conversion failed."); - if (pos) { - if (stream.eof()) - *pos = str.size(); - else - *pos = stream.tellg(); - } + size_t p = fast_float::from_chars(str.data(), str.data() + str.size(), out).ptr - str.data(); + if (pos) + *pos = p; return out; } std::string float_to_string_decimal_point(double value, int precision/* = -1*/) { + // Our Windows build server fully supports C++17 std::to_chars. Let's use it. + // Other platforms are behind, fall back to slow stringstreams for now. +#ifdef _WIN32 + constexpr size_t SIZE = 20; + char out[SIZE] = ""; + std::to_chars_result res; + if (precision >=0) + res = std::to_chars(out, out+SIZE, value, std::chars_format::fixed, precision); + else + res = std::to_chars(out, out+SIZE, value, std::chars_format::general, 6); + if (res.ec == std::errc::value_too_large) + throw std::invalid_argument("float_to_string_decimal_point conversion failed."); + return std::string(out, res.ptr - out); +#else std::stringstream buf; if (precision >= 0) buf << std::fixed << std::setprecision(precision); buf << value; return buf.str(); +#endif } diff --git a/src/libslic3r/LocalesUtils.hpp b/src/libslic3r/LocalesUtils.hpp index 113cfa04b..f63c3572f 100644 --- a/src/libslic3r/LocalesUtils.hpp +++ b/src/libslic3r/LocalesUtils.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #ifdef __APPLE__ #include @@ -40,7 +41,7 @@ bool is_decimal_separator_point(); // (We use user C locales and "C" C++ locales in most of the code.) std::string float_to_string_decimal_point(double value, int precision = -1); //std::string float_to_string_decimal_point(float value, int precision = -1); -double string_to_double_decimal_point(const std::string& str, size_t* pos = nullptr); +double string_to_double_decimal_point(const std::string_view str, size_t* pos = nullptr); } // namespace Slic3r diff --git a/src/libslic3r/MeshBoolean.cpp b/src/libslic3r/MeshBoolean.cpp index a59165946..25250e234 100644 --- a/src/libslic3r/MeshBoolean.cpp +++ b/src/libslic3r/MeshBoolean.cpp @@ -29,18 +29,17 @@ TriangleMesh eigen_to_triangle_mesh(const EigenMesh &emesh) { auto &VC = emesh.first; auto &FC = emesh.second; - Pointf3s points(size_t(VC.rows())); - std::vector facets(size_t(FC.rows())); + indexed_triangle_set its; + its.vertices.reserve(size_t(VC.rows())); + its.indices.reserve(size_t(FC.rows())); for (Eigen::Index i = 0; i < VC.rows(); ++i) - points[size_t(i)] = VC.row(i); + its.vertices.emplace_back(VC.row(i).cast()); for (Eigen::Index i = 0; i < FC.rows(); ++i) - facets[size_t(i)] = FC.row(i); + its.indices.emplace_back(FC.row(i)); - TriangleMesh out{points, facets}; - out.require_shared_vertices(); - return out; + return TriangleMesh { std::move(its) }; } EigenMesh triangle_mesh_to_eigen(const TriangleMesh &mesh) @@ -131,28 +130,27 @@ void triangle_mesh_to_cgal(const std::vector & V, out.add_face(VI(f(0)), VI(f(1)), VI(f(2))); } -inline Vec3d to_vec3d(const _EpicMesh::Point &v) +inline Vec3f to_vec3f(const _EpicMesh::Point& v) { - return {v.x(), v.y(), v.z()}; + return { float(v.x()), float(v.y()), float(v.z()) }; } -inline Vec3d to_vec3d(const _EpecMesh::Point &v) +inline Vec3f to_vec3f(const _EpecMesh::Point& v) { CGAL::Cartesian_converter cvt; auto iv = cvt(v); - return {iv.x(), iv.y(), iv.z()}; + return { float(iv.x()), float(iv.y()), float(iv.z()) }; } template TriangleMesh cgal_to_triangle_mesh(const _Mesh &cgalmesh) { - Pointf3s points; - std::vector facets; - points.reserve(cgalmesh.num_vertices()); - facets.reserve(cgalmesh.num_faces()); + indexed_triangle_set its; + its.vertices.reserve(cgalmesh.num_vertices()); + its.indices.reserve(cgalmesh.num_faces()); for (auto &vi : cgalmesh.vertices()) { auto &v = cgalmesh.point(vi); // Don't ask... - points.emplace_back(to_vec3d(v)); + its.vertices.emplace_back(to_vec3f(v)); } for (auto &face : cgalmesh.faces()) { @@ -166,12 +164,10 @@ template TriangleMesh cgal_to_triangle_mesh(const _Mesh &cgalmesh) } if (i == 3) - facets.emplace_back(facet); + its.indices.emplace_back(facet); } - TriangleMesh out{points, facets}; - out.repair(); - return out; + return TriangleMesh(std::move(its)); } std::unique_ptr diff --git a/src/libslic3r/MeshSplitImpl.hpp b/src/libslic3r/MeshSplitImpl.hpp index 7233ac40d..c9df648fb 100644 --- a/src/libslic3r/MeshSplitImpl.hpp +++ b/src/libslic3r/MeshSplitImpl.hpp @@ -28,65 +28,84 @@ template<> struct ItsWithNeighborsIndex_ { } }; -// Visit all unvisited neighboring facets that are reachable from the first unvisited facet, -// and return them. +// Discover connected patches of facets one by one. template -std::vector its_find_unvisited_neighbors( - const indexed_triangle_set &its, - const NeighborIndex & neighbor_index, - std::vector & visited) -{ - using stack_el = size_t; - - auto facestack = reserve_vector(its.indices.size()); - auto push = [&facestack] (const stack_el &s) { facestack.emplace_back(s); }; - auto pop = [&facestack] () -> stack_el { - stack_el ret = facestack.back(); - facestack.pop_back(); - return ret; - }; - - // find the next unvisited facet and push the index - auto facet = std::find(visited.begin(), visited.end(), false); - std::vector ret; - - if (facet != visited.end()) { - ret.reserve(its.indices.size()); - auto idx = size_t(facet - visited.begin()); - push(idx); - ret.emplace_back(idx); - visited[idx] = true; +struct NeighborVisitor { + NeighborVisitor(const indexed_triangle_set &its, const NeighborIndex &neighbor_index) : + its(its), neighbor_index(neighbor_index) { + m_visited.assign(its.indices.size(), false); + m_facestack.reserve(its.indices.size()); + } + NeighborVisitor(const indexed_triangle_set &its, NeighborIndex &&aneighbor_index) : + its(its), neighbor_index(m_neighbor_index_data), m_neighbor_index_data(std::move(aneighbor_index)) { + m_visited.assign(its.indices.size(), false); + m_facestack.reserve(its.indices.size()); } - while (!facestack.empty()) { - size_t facet_idx = pop(); - const auto &neighbors = neighbor_index[facet_idx]; - for (auto neighbor_idx : neighbors) { - if (size_t(neighbor_idx) < visited.size() && !visited[size_t(neighbor_idx)]) { - visited[size_t(neighbor_idx)] = true; - push(stack_el(neighbor_idx)); - ret.emplace_back(size_t(neighbor_idx)); + template + void visit(Visitor visitor) + { + // find the next unvisited facet and push the index + auto facet = std::find(m_visited.begin() + m_seed, m_visited.end(), false); + m_seed = facet - m_visited.begin(); + + if (facet != m_visited.end()) { + // Skip this element in the next round. + auto idx = m_seed ++; + if (! visitor(idx)) + return; + this->push(idx); + m_visited[idx] = true; + while (! m_facestack.empty()) { + size_t facet_idx = this->pop(); + for (auto neighbor_idx : neighbor_index[facet_idx]) { + assert(neighbor_idx < int(m_visited.size())); + if (neighbor_idx >= 0 && !m_visited[neighbor_idx]) { + if (! visitor(size_t(neighbor_idx))) + return; + m_visited[neighbor_idx] = true; + this->push(stack_el(neighbor_idx)); + } + } } } } - return ret; -} + const indexed_triangle_set &its; + const NeighborIndex &neighbor_index; + +private: + // If initialized with &&neighbor_index, take the ownership of the data. + const NeighborIndex m_neighbor_index_data; + + std::vector m_visited; + + using stack_el = size_t; + std::vector m_facestack; + void push(const stack_el &s) { m_facestack.emplace_back(s); } + stack_el pop() { stack_el ret = m_facestack.back(); m_facestack.pop_back(); return ret; } + + // Last face visited. + size_t m_seed { 0 }; +}; } // namespace meshsplit_detail +// Funky wrapper for timinig of its_split() using various neighbor index creating methods, see sandboxes/its_neighbor_index/main.cpp template struct ItsNeighborsWrapper { using Index = IndexT; - const indexed_triangle_set *its; - IndexT index; + const indexed_triangle_set &its; + const IndexT &index_ref; + const IndexT index; - ItsNeighborsWrapper(const indexed_triangle_set &m, IndexT &&idx) - : its{&m}, index{std::move(idx)} - {} + // Keeping a reference to index, the caller is responsible for keeping the index alive. + ItsNeighborsWrapper(const indexed_triangle_set &its, const IndexT &index) : its{its}, index_ref{index} {} + // Taking ownership of the index. + ItsNeighborsWrapper(const indexed_triangle_set &its, IndexT &&aindex) : its{its}, index_ref{index}, index(std::move(aindex)) {} - const auto& get_its() const noexcept { return *its; } - const auto& get_index() const noexcept { return index; } + const auto& get_its() const noexcept { return its; } + const auto& get_index() const noexcept { return index_ref; } }; // Splits a mesh into multiple meshes when possible. @@ -97,20 +116,19 @@ void its_split(const Its &m, OutputIt out_it) const indexed_triangle_set &its = ItsWithNeighborsIndex_::get_its(m); - std::vector visited(its.indices.size(), false); - struct VertexConv { size_t part_id = std::numeric_limits::max(); size_t vertex_image; }; std::vector vidx_conv(its.vertices.size()); - const auto& neighbor_index = ItsWithNeighborsIndex_::get_index(m); - + meshsplit_detail::NeighborVisitor visitor(its, meshsplit_detail::ItsWithNeighborsIndex_::get_index(m)); + + std::vector facets; for (size_t part_id = 0;; ++part_id) { - std::vector facets = - its_find_unvisited_neighbors(its, neighbor_index, visited); - + // Collect all faces of the next patch. + facets.clear(); + visitor.visit([&facets](size_t idx) { facets.emplace_back(idx); return true; }); if (facets.empty()) break; @@ -150,17 +168,34 @@ std::vector its_split(const Its &its) return ret; } -template bool its_is_splittable(const Its &m) +template +bool its_is_splittable(const Its &m) { - using namespace meshsplit_detail; - const indexed_triangle_set &its = ItsWithNeighborsIndex_::get_its(m); - const auto& neighbor_index = ItsWithNeighborsIndex_::get_index(m); + meshsplit_detail::NeighborVisitor visitor(meshsplit_detail::ItsWithNeighborsIndex_::get_its(m), meshsplit_detail::ItsWithNeighborsIndex_::get_index(m)); + bool has_some = false; + bool has_some2 = false; + // Traverse the 1st patch fully. + visitor.visit([&has_some](size_t idx) { has_some = true; return true; }); + if (has_some) + // Just check whether there is any face of the 2nd patch. + visitor.visit([&has_some2](size_t idx) { has_some2 = true; return false; }); + return has_some && has_some2; +} - std::vector visited(its.indices.size(), false); - its_find_unvisited_neighbors(its, neighbor_index, visited); - auto faces = its_find_unvisited_neighbors(its, neighbor_index, visited); - - return !faces.empty(); +template +size_t its_number_of_patches(const Its &m) +{ + meshsplit_detail::NeighborVisitor visitor(meshsplit_detail::ItsWithNeighborsIndex_::get_its(m), meshsplit_detail::ItsWithNeighborsIndex_::get_index(m)); + size_t num_patches = 0; + for (;;) { + bool has_some = false; + // Traverse the 1st patch fully. + visitor.visit([&has_some](size_t idx) { has_some = true; return true; }); + if (! has_some) + break; + ++ num_patches; + } + return num_patches; } template diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index fb6ab5635..8659e6961 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -9,7 +9,6 @@ #include "Format/AMF.hpp" #include "Format/OBJ.hpp" -#include "Format/PRUS.hpp" #include "Format/STL.hpp" #include "Format/3mf.hpp" @@ -118,8 +117,6 @@ Model Model::read_from_file(const std::string& input_file, DynamicPrintConfig* c else if (boost::algorithm::iends_with(input_file, ".3mf")) //FIXME options & LoadAttribute::CheckVersion ? result = load_3mf(input_file.c_str(), *config, *config_substitutions, &model, false); - else if (boost::algorithm::iends_with(input_file, ".prusa")) - result = load_prus(input_file.c_str(), &model); else throw Slic3r::RuntimeError("Unknown file format. Input file must have .stl, .obj, .amf(.xml) or .prusa extension."); @@ -478,10 +475,10 @@ bool Model::looks_like_imperial_units() const void Model::convert_from_imperial_units(bool only_small_volumes) { - static constexpr const double in_to_mm = 25.4; + static constexpr const float in_to_mm = 25.4f; for (ModelObject* obj : this->objects) if (! only_small_volumes || obj->get_object_stl_stats().volume < volume_threshold_inches) { - obj->scale_mesh_after_creation(Vec3d(in_to_mm, in_to_mm, in_to_mm)); + obj->scale_mesh_after_creation(in_to_mm); for (ModelVolume* v : obj->volumes) { assert(! v->source.is_converted_from_meters); v->source.is_converted_from_inches = true; @@ -508,7 +505,7 @@ void Model::convert_from_meters(bool only_small_volumes) static constexpr const double m_to_mm = 1000; for (ModelObject* obj : this->objects) if (! only_small_volumes || obj->get_object_stl_stats().volume < volume_threshold_meters) { - obj->scale_mesh_after_creation(Vec3d(m_to_mm, m_to_mm, m_to_mm)); + obj->scale_mesh_after_creation(m_to_mm); for (ModelVolume* v : obj->volumes) { assert(! v->source.is_converted_from_inches); v->source.is_converted_from_meters = true; @@ -1065,11 +1062,11 @@ void ModelObject::mirror(Axis axis) } // This method could only be called before the meshes of this ModelVolumes are not shared! -void ModelObject::scale_mesh_after_creation(const Vec3d &versor) +void ModelObject::scale_mesh_after_creation(const float scale) { for (ModelVolume *v : this->volumes) { - v->scale_geometry_after_creation(versor); - v->set_offset(versor.cwiseProduct(v->get_offset())); + v->scale_geometry_after_creation(scale); + v->set_offset(Vec3d(scale, scale, scale).cwiseProduct(v->get_offset())); } this->invalidate_bounding_box(); } @@ -1080,9 +1077,8 @@ void ModelObject::convert_units(ModelObjectPtrs& new_objects, ConversionType con ModelObject* new_object = new_clone(*this); - double koef = conv_type == ConversionType::CONV_FROM_INCH ? 25.4 : conv_type == ConversionType::CONV_TO_INCH ? 0.0393700787 : - conv_type == ConversionType::CONV_FROM_METER ? 1000 : conv_type == ConversionType::CONV_TO_METER ? 0.001 : 1; - const Vec3d versor = Vec3d(koef, koef, koef); + float koef = conv_type == ConversionType::CONV_FROM_INCH ? 25.4f : conv_type == ConversionType::CONV_TO_INCH ? 0.0393700787f : + conv_type == ConversionType::CONV_FROM_METER ? 1000.f : conv_type == ConversionType::CONV_TO_METER ? 0.001f : 1.f; new_object->set_model(nullptr); new_object->sla_support_points.clear(); @@ -1095,7 +1091,6 @@ void ModelObject::convert_units(ModelObjectPtrs& new_objects, ConversionType con for (ModelVolume* volume : volumes) { if (!volume->mesh().empty()) { TriangleMesh mesh(volume->mesh()); - mesh.require_shared_vertices(); ModelVolume* vol = new_object->add_volume(mesh); vol->name = volume->name; @@ -1121,8 +1116,8 @@ void ModelObject::convert_units(ModelObjectPtrs& new_objects, ConversionType con if (//vol->source.is_converted_from_inches != from_imperial && (volume_idxs.empty() || std::find(volume_idxs.begin(), volume_idxs.end(), vol_idx) != volume_idxs.end())) { - vol->scale_geometry_after_creation(versor); - vol->set_offset(versor.cwiseProduct(volume->get_offset())); + vol->scale_geometry_after_creation(koef); + vol->set_offset(Vec3d(koef, koef, koef).cwiseProduct(volume->get_offset())); if (conv_type == ConversionType::CONV_FROM_INCH || conv_type == ConversionType::CONV_TO_INCH) vol->source.is_converted_from_inches = conv_type == ConversionType::CONV_FROM_INCH; if (conv_type == ConversionType::CONV_FROM_METER || conv_type == ConversionType::CONV_TO_METER) @@ -1154,7 +1149,7 @@ size_t ModelObject::facets_count() const size_t num = 0; for (const ModelVolume *v : this->volumes) if (v->is_model_part()) - num += v->mesh().stl.stats.number_of_facets; + num += v->mesh().facets_count(); return num; } @@ -1167,14 +1162,6 @@ size_t ModelObject::parts_count() const return num; } -bool ModelObject::needed_repair() const -{ - for (const ModelVolume *v : this->volumes) - if (v->is_model_part() && v->mesh().needed_repair()) - return true; - return false; -} - ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, ModelObjectCutAttributes attributes) { if (! attributes.has(ModelObjectCutAttribute::KeepUpper) && ! attributes.has(ModelObjectCutAttribute::KeepLower)) @@ -1256,21 +1243,14 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, ModelObjectCutAttr TriangleMesh upper_mesh, lower_mesh; { indexed_triangle_set upper_its, lower_its; - mesh.require_shared_vertices(); cut_mesh(mesh.its, float(z), &upper_its, &lower_its); - if (attributes.has(ModelObjectCutAttribute::KeepUpper)) { + if (attributes.has(ModelObjectCutAttribute::KeepUpper)) upper_mesh = TriangleMesh(upper_its); - upper_mesh.repair(); - upper_mesh.reset_repair_stats(); - } - if (attributes.has(ModelObjectCutAttribute::KeepLower)) { + if (attributes.has(ModelObjectCutAttribute::KeepLower)) lower_mesh = TriangleMesh(lower_its); - lower_mesh.repair(); - lower_mesh.reset_repair_stats(); - } } - if (attributes.has(ModelObjectCutAttribute::KeepUpper) && upper_mesh.facets_count() > 0) { + if (attributes.has(ModelObjectCutAttribute::KeepUpper) && ! upper_mesh.empty()) { ModelVolume* vol = upper->add_volume(upper_mesh); vol->name = volume->name; // Don't copy the config's ID. @@ -1279,7 +1259,7 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, ModelObjectCutAttr assert(vol->config.id() != volume->config.id()); vol->set_material(volume->material_id(), *volume->material()); } - if (attributes.has(ModelObjectCutAttribute::KeepLower) && lower_mesh.facets_count() > 0) { + if (attributes.has(ModelObjectCutAttribute::KeepLower) && ! lower_mesh.empty()) { ModelVolume* vol = lower->add_volume(lower_mesh); vol->name = volume->name; // Don't copy the config's ID. @@ -1349,24 +1329,22 @@ void ModelObject::split(ModelObjectPtrs* new_objects) if (volume->type() != ModelVolumeType::MODEL_PART) continue; - TriangleMeshPtrs meshptrs = volume->mesh().split(); + std::vector meshes = volume->mesh().split(); size_t counter = 1; - for (TriangleMesh* mesh : meshptrs) { - + for (TriangleMesh &mesh : meshes) { // FIXME: crashes if not satisfied - if (mesh->facets_count() < 3) continue; - - mesh->repair(); + if (mesh.facets_count() < 3) + continue; // XXX: this seems to be the only real usage of m_model, maybe refactor this so that it's not needed? ModelObject* new_object = m_model->add_object(); - if (meshptrs.size() == 1) { + if (meshes.size() == 1) { new_object->name = volume->name; // Don't copy the config's ID. new_object->config.assign_config(this->config.size() > 0 ? this->config : volume->config); } else { - new_object->name = this->name + (meshptrs.size() > 1 ? "_" + std::to_string(counter++) : ""); + new_object->name = this->name + (meshes.size() > 1 ? "_" + std::to_string(counter++) : ""); // Don't copy the config's ID. new_object->config.assign_config(this->config); } @@ -1375,7 +1353,7 @@ void ModelObject::split(ModelObjectPtrs* new_objects) new_object->instances.reserve(this->instances.size()); for (const ModelInstance* model_instance : this->instances) new_object->add_instance(*model_instance); - ModelVolume* new_vol = new_object->add_volume(*volume, std::move(*mesh)); + ModelVolume* new_vol = new_object->add_volume(*volume, std::move(mesh)); for (ModelInstance* model_instance : new_object->instances) { @@ -1387,7 +1365,6 @@ void ModelObject::split(ModelObjectPtrs* new_objects) // reset the source to disable reload from disk new_vol->source = ModelVolume::Source(); new_objects->emplace_back(new_object); - delete mesh; } } } @@ -1405,7 +1382,6 @@ void ModelObject::merge() for (ModelVolume* volume : volumes) if (!volume->mesh().empty()) mesh.merge(volume->mesh()); - mesh.repair(); this->clear_volumes(); ModelVolume* vol = this->add_volume(mesh); @@ -1508,9 +1484,9 @@ double ModelObject::get_instance_min_z(size_t instance_idx) const const Transform3d mv = mi * v->get_matrix(); const TriangleMesh& hull = v->get_convex_hull(); - for (const stl_facet &facet : hull.stl.facet_start) + for (const stl_triangle_vertex_indices& facet : hull.its.indices) for (int i = 0; i < 3; ++ i) - min_z = std::min(min_z, (mv * facet.vertex[i].cast()).z()); + min_z = std::min(min_z, (mv * hull.its.vertices[facet[i]].cast()).z()); } return min_z + inst->get_offset(Z); @@ -1529,9 +1505,9 @@ double ModelObject::get_instance_max_z(size_t instance_idx) const const Transform3d mv = mi * v->get_matrix(); const TriangleMesh& hull = v->get_convex_hull(); - for (const stl_facet& facet : hull.stl.facet_start) + for (const stl_triangle_vertex_indices& facet : hull.its.indices) for (int i = 0; i < 3; ++i) - max_z = std::max(max_z, (mv * facet.vertex[i].cast()).z()); + max_z = std::max(max_z, (mv * hull.its.vertices[facet[i]].cast()).z()); } return max_z + inst->get_offset(Z); @@ -1572,7 +1548,6 @@ void ModelObject::print_info() const boost::nowide::cout << "[" << boost::filesystem::path(this->input_file).filename().string() << "]" << endl; TriangleMesh mesh = this->raw_mesh(); - mesh.check_topology(); BoundingBoxf3 bb = mesh.bounding_box(); Vec3d size = bb.size(); cout << "size_x = " << size(0) << endl; @@ -1584,27 +1559,27 @@ void ModelObject::print_info() const cout << "max_x = " << bb.max(0) << endl; cout << "max_y = " << bb.max(1) << endl; cout << "max_z = " << bb.max(2) << endl; - cout << "number_of_facets = " << mesh.stl.stats.number_of_facets << endl; - cout << "manifold = " << (mesh.is_manifold() ? "yes" : "no") << endl; + cout << "number_of_facets = " << mesh.facets_count() << endl; + + cout << "manifold = " << (mesh.stats().manifold() ? "yes" : "no") << endl; + if (! mesh.stats().manifold()) + cout << "open_edges = " << mesh.stats().open_edges << endl; - mesh.repair(); // this calculates number_of_parts - if (mesh.needed_repair()) { - mesh.repair(); - if (mesh.stl.stats.degenerate_facets > 0) - cout << "degenerate_facets = " << mesh.stl.stats.degenerate_facets << endl; - if (mesh.stl.stats.edges_fixed > 0) - cout << "edges_fixed = " << mesh.stl.stats.edges_fixed << endl; - if (mesh.stl.stats.facets_removed > 0) - cout << "facets_removed = " << mesh.stl.stats.facets_removed << endl; - if (mesh.stl.stats.facets_added > 0) - cout << "facets_added = " << mesh.stl.stats.facets_added << endl; - if (mesh.stl.stats.facets_reversed > 0) - cout << "facets_reversed = " << mesh.stl.stats.facets_reversed << endl; - if (mesh.stl.stats.backwards_edges > 0) - cout << "backwards_edges = " << mesh.stl.stats.backwards_edges << endl; + if (mesh.stats().repaired()) { + const RepairedMeshErrors& stats = mesh.stats().repaired_errors; + if (stats.degenerate_facets > 0) + cout << "degenerate_facets = " << stats.degenerate_facets << endl; + if (stats.edges_fixed > 0) + cout << "edges_fixed = " << stats.edges_fixed << endl; + if (stats.facets_removed > 0) + cout << "facets_removed = " << stats.facets_removed << endl; + if (stats.facets_reversed > 0) + cout << "facets_reversed = " << stats.facets_reversed << endl; + if (stats.backwards_edges > 0) + cout << "backwards_edges = " << stats.backwards_edges << endl; } - cout << "number_of_parts = " << mesh.stl.stats.number_of_parts << endl; - cout << "volume = " << mesh.volume() << endl; + cout << "number_of_parts = " << mesh.stats().number_of_parts << endl; + cout << "volume = " << mesh.volume() << endl; } std::string ModelObject::get_export_filename() const @@ -1627,26 +1602,22 @@ std::string ModelObject::get_export_filename() const return ret; } -stl_stats ModelObject::get_object_stl_stats() const +TriangleMeshStats ModelObject::get_object_stl_stats() const { if (this->volumes.size() == 1) - return this->volumes[0]->mesh().stl.stats; + return this->volumes[0]->mesh().stats(); - stl_stats full_stats; + TriangleMeshStats full_stats; full_stats.volume = 0.f; // fill full_stats from all objet's meshes for (ModelVolume* volume : this->volumes) { - const stl_stats& stats = volume->mesh().stl.stats; + const TriangleMeshStats& stats = volume->mesh().stats(); // initialize full_stats (for repaired errors) - full_stats.degenerate_facets += stats.degenerate_facets; - full_stats.edges_fixed += stats.edges_fixed; - full_stats.facets_removed += stats.facets_removed; - full_stats.facets_added += stats.facets_added; - full_stats.facets_reversed += stats.facets_reversed; - full_stats.backwards_edges += stats.backwards_edges; + full_stats.open_edges += stats.open_edges; + full_stats.repaired_errors.merge(stats.repaired_errors); // another used satistics value if (volume->is_model_part()) { @@ -1658,15 +1629,15 @@ stl_stats ModelObject::get_object_stl_stats() const return full_stats; } -int ModelObject::get_mesh_errors_count(const int vol_idx /*= -1*/) const +int ModelObject::get_repaired_errors_count(const int vol_idx /*= -1*/) const { if (vol_idx >= 0) - return this->volumes[vol_idx]->get_mesh_errors_count(); + return this->volumes[vol_idx]->get_repaired_errors_count(); - const stl_stats& stats = get_object_stl_stats(); + const RepairedMeshErrors& stats = get_object_stl_stats().repaired_errors; return stats.degenerate_facets + stats.edges_fixed + stats.facets_removed + - stats.facets_added + stats.facets_reversed + stats.backwards_edges; + stats.facets_reversed + stats.backwards_edges; } void ModelVolume::set_material_id(t_model_material_id material_id) @@ -1730,14 +1701,15 @@ void ModelVolume::center_geometry_after_creation(bool update_source_offset) void ModelVolume::calculate_convex_hull() { m_convex_hull = std::make_shared(this->mesh().convex_hull_3d()); + assert(m_convex_hull.get()); } -int ModelVolume::get_mesh_errors_count() const +int ModelVolume::get_repaired_errors_count() const { - const stl_stats& stats = this->mesh().stl.stats; + const RepairedMeshErrors &stats = this->mesh().stats().repaired_errors; return stats.degenerate_facets + stats.edges_fixed + stats.facets_removed + - stats.facets_added + stats.facets_reversed + stats.backwards_edges; + stats.facets_reversed + stats.backwards_edges; } const TriangleMesh& ModelVolume::get_convex_hull() const @@ -1785,11 +1757,9 @@ std::string ModelVolume::type_to_string(const ModelVolumeType t) // This is useful to assign different materials to different volumes of an object. size_t ModelVolume::split(unsigned int max_extruders) { - TriangleMeshPtrs meshptrs = this->mesh().split(); - if (meshptrs.size() <= 1) { - delete meshptrs.front(); + std::vector meshes = this->mesh().split(); + if (meshes.size() <= 1) return 1; - } size_t idx = 0; size_t ivolume = std::find(this->object->volumes.begin(), this->object->volumes.end(), this) - this->object->volumes.begin(); @@ -1798,15 +1768,14 @@ size_t ModelVolume::split(unsigned int max_extruders) unsigned int extruder_counter = 0; Vec3d offset = this->get_offset(); - for (TriangleMesh *mesh : meshptrs) { - mesh->repair(); - if (mesh->empty()) + for (TriangleMesh &mesh : meshes) { + if (mesh.empty()) // Repair may have removed unconnected triangles, thus emptying the mesh. continue; if (idx == 0) { - this->set_mesh(std::move(*mesh)); + this->set_mesh(std::move(mesh)); this->calculate_convex_hull(); // Assign a new unique ID, so that a new GLVolume will be generated. this->set_new_unique_id(); @@ -1814,7 +1783,7 @@ size_t ModelVolume::split(unsigned int max_extruders) this->source = ModelVolume::Source(); } else - this->object->volumes.insert(this->object->volumes.begin() + (++ivolume), new ModelVolume(object, *this, std::move(*mesh))); + this->object->volumes.insert(this->object->volumes.begin() + (++ivolume), new ModelVolume(object, *this, std::move(mesh))); this->object->volumes[ivolume]->set_offset(Vec3d::Zero()); this->object->volumes[ivolume]->center_geometry_after_creation(); @@ -1822,7 +1791,6 @@ size_t ModelVolume::split(unsigned int max_extruders) this->object->volumes[ivolume]->name = name + "_" + std::to_string(idx + 1); this->object->volumes[ivolume]->config.set("extruder", auto_extruder_id(max_extruders, extruder_counter)); this->object->volumes[ivolume]->m_is_splittable = 0; - delete mesh; ++ idx; } @@ -1891,7 +1859,7 @@ void ModelVolume::mirror(Axis axis) } // This method could only be called before the meshes of this ModelVolumes are not shared! -void ModelVolume::scale_geometry_after_creation(const Vec3d& versor) +void ModelVolume::scale_geometry_after_creation(const Vec3f& versor) { const_cast(m_mesh.get())->scale(versor); const_cast(m_convex_hull.get())->scale(versor); @@ -1924,8 +1892,7 @@ void ModelVolume::transform_this_mesh(const Matrix3d &matrix, bool fix_left_hand void ModelVolume::convert_from_imperial_units() { assert(! this->source.is_converted_from_meters); - double in_to_mm = 25.4; - this->scale_geometry_after_creation(Vec3d(in_to_mm, in_to_mm, in_to_mm)); + this->scale_geometry_after_creation(25.4f); this->set_offset(Vec3d(0, 0, 0)); this->source.is_converted_from_inches = true; } @@ -1933,8 +1900,7 @@ void ModelVolume::convert_from_imperial_units() void ModelVolume::convert_from_meters() { assert(! this->source.is_converted_from_inches); - double m_to_mm = 1000; - this->scale_geometry_after_creation(Vec3d(m_to_mm, m_to_mm, m_to_mm)); + this->scale_geometry_after_creation(1000.f); this->set_offset(Vec3d(0, 0, 0)); this->source.is_converted_from_meters = true; } diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 4dd3a534e..efbf84cd4 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -339,13 +339,12 @@ public: void mirror(Axis axis); // This method could only be called before the meshes of this ModelVolumes are not shared! - void scale_mesh_after_creation(const Vec3d& versor); + void scale_mesh_after_creation(const float scale); void convert_units(ModelObjectPtrs&new_objects, ConversionType conv_type, std::vector volume_idxs); size_t materials_count() const; size_t facets_count() const; size_t parts_count() const; - bool needed_repair() const; ModelObjectPtrs cut(size_t instance, coordf_t z, ModelObjectCutAttributes attributes); void split(ModelObjectPtrs* new_objects); void merge(); @@ -369,9 +368,9 @@ public: std::string get_export_filename() const; // Get full stl statistics for all object's meshes - stl_stats get_object_stl_stats() const; + TriangleMeshStats get_object_stl_stats() const; // Get count of errors in the mesh( or all object's meshes, if volume index isn't defined) - int get_mesh_errors_count(const int vol_idx = -1) const; + int get_repaired_errors_count(const int vol_idx = -1) const; private: friend class Model; @@ -613,6 +612,8 @@ public: const TriangleMesh& mesh() const { return *m_mesh.get(); } void set_mesh(const TriangleMesh &mesh) { m_mesh = std::make_shared(mesh); } void set_mesh(TriangleMesh &&mesh) { m_mesh = std::make_shared(std::move(mesh)); } + void set_mesh(const indexed_triangle_set &mesh) { m_mesh = std::make_shared(mesh); } + void set_mesh(indexed_triangle_set &&mesh) { m_mesh = std::make_shared(std::move(mesh)); } void set_mesh(std::shared_ptr &mesh) { m_mesh = mesh; } void set_mesh(std::unique_ptr &&mesh) { m_mesh = std::move(mesh); } void reset_mesh() { m_mesh = std::make_shared(); } @@ -667,7 +668,8 @@ public: void mirror(Axis axis); // This method could only be called before the meshes of this ModelVolumes are not shared! - void scale_geometry_after_creation(const Vec3d& versor); + void scale_geometry_after_creation(const Vec3f &versor); + void scale_geometry_after_creation(const float scale) { this->scale_geometry_after_creation(Vec3f(scale, scale, scale)); } // Translates the mesh and the convex hull so that the origin of their vertices is in the center of this volume's bounding box. // Attention! This method may only be called just after ModelVolume creation! It must not be called once the TriangleMesh of this ModelVolume is shared! @@ -677,7 +679,7 @@ public: const TriangleMesh& get_convex_hull() const; std::shared_ptr get_convex_hull_shared_ptr() const { return m_convex_hull; } // Get count of errors in the mesh - int get_mesh_errors_count() const; + int get_repaired_errors_count() const; // Helpers for loading / storing into AMF / 3MF files. static ModelVolumeType type_from_string(const std::string &s); @@ -771,7 +773,7 @@ private: assert(this->id() != this->supported_facets.id()); assert(this->id() != this->seam_facets.id()); assert(this->id() != this->mmu_segmentation_facets.id()); - if (mesh.stl.stats.number_of_facets > 1) + if (mesh.facets_count() > 1) calculate_convex_hull(); } ModelVolume(ModelObject *object, TriangleMesh &&mesh, TriangleMesh &&convex_hull, ModelVolumeType type = ModelVolumeType::MODEL_PART) : @@ -830,7 +832,7 @@ private: assert(this->config.id() == other.config.id()); this->set_material_id(other.material_id()); this->config.set_new_unique_id(); - if (mesh.stl.stats.number_of_facets > 1) + if (mesh.facets_count() > 1) calculate_convex_hull(); assert(this->config.id().valid()); assert(this->config.id() != other.config.id()); diff --git a/src/libslic3r/MultiPoint.hpp b/src/libslic3r/MultiPoint.hpp index 46b47832a..935348279 100644 --- a/src/libslic3r/MultiPoint.hpp +++ b/src/libslic3r/MultiPoint.hpp @@ -33,7 +33,9 @@ public: void rotate(double angle, const Point ¢er); void reverse() { std::reverse(this->points.begin(), this->points.end()); } - const Point& first_point() const { return this->points.front(); } + const Point& front() const { return this->points.front(); } + const Point& back() const { return this->points.back(); } + const Point& first_point() const { return this->front(); } virtual const Point& last_point() const = 0; virtual Lines lines() const = 0; size_t size() const { return points.size(); } diff --git a/src/libslic3r/Platform.cpp b/src/libslic3r/Platform.cpp index 4aa72c95f..338752112 100644 --- a/src/libslic3r/Platform.cpp +++ b/src/libslic3r/Platform.cpp @@ -105,4 +105,42 @@ PlatformFlavor platform_flavor() return s_platform_flavor; } + + +std::string platform_to_string(Platform platform) +{ + switch (platform) { + case Platform::Uninitialized: return "Unitialized"; + case Platform::Unknown : return "Unknown"; + case Platform::Windows : return "Windows"; + case Platform::OSX : return "OSX"; + case Platform::Linux : return "Linux"; + case Platform::BSDUnix : return "BSDUnix"; + } + assert(false); + return ""; +} + + + +std::string platform_flavor_to_string(PlatformFlavor pf) +{ + switch (pf) { + case PlatformFlavor::Uninitialized : return "Unitialized"; + case PlatformFlavor::Unknown : return "Unknown"; + case PlatformFlavor::Generic : return "Generic"; + case PlatformFlavor::GenericLinux : return "GenericLinux"; + case PlatformFlavor::LinuxOnChromium : return "LinuxOnChromium"; + case PlatformFlavor::WSL : return "WSL"; + case PlatformFlavor::WSL2 : return "WSL2"; + case PlatformFlavor::OpenBSD : return "OpenBSD"; + case PlatformFlavor::GenericOSX : return "GenericOSX"; + case PlatformFlavor::OSXOnX86 : return "OSXOnX86"; + case PlatformFlavor::OSXOnArm : return "OSXOnArm"; + } + assert(false); + return ""; +} + + } // namespace Slic3r diff --git a/src/libslic3r/Platform.hpp b/src/libslic3r/Platform.hpp index 1b4d74c02..6db8ba880 100644 --- a/src/libslic3r/Platform.hpp +++ b/src/libslic3r/Platform.hpp @@ -1,6 +1,8 @@ #ifndef SLIC3R_Platform_HPP #define SLIC3R_Platform_HPP +#include + namespace Slic3r { enum class Platform @@ -16,24 +18,16 @@ enum class Platform enum class PlatformFlavor { Uninitialized, - Unknown, - // For Windows and OSX, until we need to be more specific. - Generic, - // For Platform::Linux - GenericLinux, - LinuxOnChromium, - // Microsoft's Windows on Linux (Linux kernel simulated on NTFS kernel) - WSL, - // Microsoft's Windows on Linux, version 2 (virtual machine) - WSL2, - // For Platform::BSDUnix - OpenBSD, - // For Platform::OSX - GenericOSX, - // For Apple's on Intel X86 CPU - OSXOnX86, - // For Apple's on Arm CPU - OSXOnArm, + Unknown, + Generic, // For Windows and OSX, until we need to be more specific. + GenericLinux, // For Platform::Linux + LinuxOnChromium, // For Platform::Linux + WSL, // Microsoft's Windows on Linux (Linux kernel simulated on NTFS kernel) + WSL2, // Microsoft's Windows on Linux, version 2 (virtual machine) + OpenBSD, // For Platform::BSDUnix + GenericOSX, // For Platform::OSX + OSXOnX86, // For Apple's on Intel X86 CPU + OSXOnArm, // For Apple's on Arm CPU }; // To be called on program start-up. @@ -42,6 +36,9 @@ void detect_platform(); Platform platform(); PlatformFlavor platform_flavor(); +std::string platform_to_string(Platform platform); +std::string platform_flavor_to_string(PlatformFlavor pf); + } // namespace Slic3r #endif // SLIC3R_Platform_HPP diff --git a/src/libslic3r/Point.cpp b/src/libslic3r/Point.cpp index 7f351d259..b1f3a74bb 100644 --- a/src/libslic3r/Point.cpp +++ b/src/libslic3r/Point.cpp @@ -179,6 +179,15 @@ Point Point::projection_onto(const Line &line) const return ((line.a - *this).cast().squaredNorm() < (line.b - *this).cast().squaredNorm()) ? line.a : line.b; } +bool has_duplicate_points(std::vector &&pts) +{ + std::sort(pts.begin(), pts.end()); + for (size_t i = 1; i < pts.size(); ++ i) + if (pts[i - 1] == pts[i]) + return true; + return false; +} + BoundingBox get_extents(const Points &pts) { return BoundingBox(pts); diff --git a/src/libslic3r/Point.hpp b/src/libslic3r/Point.hpp index 20726270d..499ab073d 100644 --- a/src/libslic3r/Point.hpp +++ b/src/libslic3r/Point.hpp @@ -211,8 +211,34 @@ inline Point lerp(const Point &a, const Point &b, double t) return ((1. - t) * a.cast() + t * b.cast()).cast(); } -extern BoundingBox get_extents(const Points &pts); -extern BoundingBox get_extents(const std::vector &pts); +BoundingBox get_extents(const Points &pts); +BoundingBox get_extents(const std::vector &pts); + +// Test for duplicate points in a vector of points. +// The points are copied, sorted and checked for duplicates globally. +bool has_duplicate_points(std::vector &&pts); +inline bool has_duplicate_points(const std::vector &pts) +{ + std::vector cpy = pts; + return has_duplicate_points(std::move(cpy)); +} + +// Test for duplicate points in a vector of points. +// Only successive points are checked for equality. +inline bool has_duplicate_successive_points(const std::vector &pts) +{ + for (size_t i = 1; i < pts.size(); ++ i) + if (pts[i - 1] == pts[i]) + return true; + return false; +} + +// Test for duplicate points in a vector of points. +// Only successive points are checked for equality. Additionally, first and last points are compared for equality. +inline bool has_duplicate_successive_points_closed(const std::vector &pts) +{ + return has_duplicate_successive_points(pts) || (pts.size() >= 2 && pts.front() == pts.back()); +} namespace int128 { // Exact orientation predicate, @@ -418,7 +444,7 @@ template> inline constexpr Tout unscaled(const Tin &v) noexcept { - return Tout(v * Tout(SCALING_FACTOR)); + return Tout(v) * Tout(SCALING_FACTOR); } // Unscaling for Eigen vectors. Input base type can be arithmetic, output base @@ -432,7 +458,7 @@ template unscaled(const Eigen::Matrix &v) noexcept { - return v.template cast() * SCALING_FACTOR; + return v.template cast() * Tout(SCALING_FACTOR); } // Align a coordinate to a grid. The coordinate may be negative, diff --git a/src/libslic3r/Polygon.cpp b/src/libslic3r/Polygon.cpp index 5b180afca..42a6cc209 100644 --- a/src/libslic3r/Polygon.cpp +++ b/src/libslic3r/Polygon.cpp @@ -334,6 +334,27 @@ extern std::vector get_extents_vector(const Polygons &polygons) return out; } +bool has_duplicate_points(const Polygons &polys) +{ +#if 1 + // Check globally. + size_t cnt = 0; + for (const Polygon &poly : polys) + cnt += poly.points.size(); + std::vector allpts; + allpts.reserve(cnt); + for (const Polygon &poly : polys) + allpts.insert(allpts.end(), poly.points.begin(), poly.points.end()); + return has_duplicate_points(std::move(allpts)); +#else + // Check per contour. + for (const Polygon &poly : polys) + if (has_duplicate_points(poly)) + return true; + return false; +#endif +} + static inline bool is_stick(const Point &p1, const Point &p2, const Point &p3) { Point v1 = p2 - p1; diff --git a/src/libslic3r/Polygon.hpp b/src/libslic3r/Polygon.hpp index c808851c3..913ab3f6e 100644 --- a/src/libslic3r/Polygon.hpp +++ b/src/libslic3r/Polygon.hpp @@ -18,11 +18,6 @@ using ConstPolygonPtrs = std::vector; class Polygon : public MultiPoint { public: - explicit operator Polygons() const { Polygons pp; pp.push_back(*this); return pp; } - explicit operator Polyline() const { return this->split_at_first_point(); } - Point& operator[](Points::size_type idx) { return this->points[idx]; } - const Point& operator[](Points::size_type idx) const { return this->points[idx]; } - Polygon() = default; virtual ~Polygon() = default; explicit Polygon(const Points &points) : MultiPoint(points) {} @@ -39,6 +34,9 @@ public: Polygon& operator=(const Polygon &other) { points = other.points; return *this; } Polygon& operator=(Polygon &&other) { points = std::move(other.points); return *this; } + Point& operator[](Points::size_type idx) { return this->points[idx]; } + const Point& operator[](Points::size_type idx) const { return this->points[idx]; } + // last point == first point for polygons const Point& last_point() const override { return this->points.front(); } @@ -80,11 +78,16 @@ public: inline bool operator==(const Polygon &lhs, const Polygon &rhs) { return lhs.points == rhs.points; } inline bool operator!=(const Polygon &lhs, const Polygon &rhs) { return lhs.points != rhs.points; } -extern BoundingBox get_extents(const Polygon &poly); -extern BoundingBox get_extents(const Polygons &polygons); -extern BoundingBox get_extents_rotated(const Polygon &poly, double angle); -extern BoundingBox get_extents_rotated(const Polygons &polygons, double angle); -extern std::vector get_extents_vector(const Polygons &polygons); +BoundingBox get_extents(const Polygon &poly); +BoundingBox get_extents(const Polygons &polygons); +BoundingBox get_extents_rotated(const Polygon &poly, double angle); +BoundingBox get_extents_rotated(const Polygons &polygons, double angle); +std::vector get_extents_vector(const Polygons &polygons); + +// Test for duplicate points. The points are copied, sorted and checked for duplicates globally. +inline bool has_duplicate_points(Polygon &&poly) { return has_duplicate_points(std::move(poly.points)); } +inline bool has_duplicate_points(const Polygon &poly) { return has_duplicate_points(poly.points); } +bool has_duplicate_points(const Polygons &polys); inline double total_length(const Polygons &polylines) { double total = 0; @@ -104,19 +107,19 @@ inline double area(const Polygons &polys) } // Remove sticks (tentacles with zero area) from the polygon. -extern bool remove_sticks(Polygon &poly); -extern bool remove_sticks(Polygons &polys); +bool remove_sticks(Polygon &poly); +bool remove_sticks(Polygons &polys); // Remove polygons with less than 3 edges. -extern bool remove_degenerate(Polygons &polys); -extern bool remove_small(Polygons &polys, double min_area); -extern void remove_collinear(Polygon &poly); -extern void remove_collinear(Polygons &polys); +bool remove_degenerate(Polygons &polys); +bool remove_small(Polygons &polys, double min_area); +void remove_collinear(Polygon &poly); +void remove_collinear(Polygons &polys); // Append a vector of polygons at the end of another vector of polygons. -inline void polygons_append(Polygons &dst, const Polygons &src) { dst.insert(dst.end(), src.begin(), src.end()); } +inline void polygons_append(Polygons &dst, const Polygons &src) { dst.insert(dst.end(), src.begin(), src.end()); } -inline void polygons_append(Polygons &dst, Polygons &&src) +inline void polygons_append(Polygons &dst, Polygons &&src) { if (dst.empty()) { dst = std::move(src); diff --git a/src/libslic3r/Polyline.cpp b/src/libslic3r/Polyline.cpp index 68c40fc20..1255d5473 100644 --- a/src/libslic3r/Polyline.cpp +++ b/src/libslic3r/Polyline.cpp @@ -10,20 +10,6 @@ namespace Slic3r { -Polyline::operator Polylines() const -{ - Polylines polylines; - polylines.push_back(*this); - return polylines; -} - -Polyline::operator Line() const -{ - if (this->points.size() > 2) - throw Slic3r::InvalidArgument("Can't convert polyline with more than two points to a line"); - return Line(this->points.front(), this->points.back()); -} - const Point& Polyline::leftmost_point() const { const Point *p = &this->points.front(); diff --git a/src/libslic3r/Polyline.hpp b/src/libslic3r/Polyline.hpp index 758fc38cd..31e0b88d3 100644 --- a/src/libslic3r/Polyline.hpp +++ b/src/libslic3r/Polyline.hpp @@ -59,13 +59,11 @@ public: src.points.clear(); } } - - explicit operator Polylines() const; - explicit operator Line() const; + const Point& last_point() const override { return this->points.back(); } - const Point& leftmost_point() const; Lines lines() const override; + void clip_end(double distance); void clip_start(double distance); void extend_end(double distance); diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index f5c8235ed..09cd38468 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -1097,14 +1097,6 @@ size_t PresetCollection::update_compatible_internal(const PresetWithVendorProfil return m_idx_selected; } -// Save the preset under a new name. If the name is different from the old one, -// a new preset is stored into the list of presets. -// All presets are marked as not modified and the new preset is activated. -//void PresetCollection::save_current_preset(const std::string &new_name); - -// Delete the current preset, activate the first visible preset. -//void PresetCollection::delete_current_preset(); - // Update a dirty flag of the current preset // Return true if the dirty flag changed. bool PresetCollection::update_dirty() diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index cb9f04e45..feaf0cac7 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -500,13 +500,15 @@ void PresetBundle::load_selections(AppConfig &config, const PresetPreferences& p // Only run this code if just a filament / SLA material was installed by Config Wizard for an active Printer. auto printer_technology = printers.get_selected_preset().printer_technology(); if (printer_technology == ptFFF && ! preferred_selection.filament.empty()) { - if (auto it = filaments.find_preset_internal(preferred_selection.filament); it != filaments.end() && it->is_visible) { - filaments.select_preset_by_name_strict(preferred_selection.filament); + std::string preferred_preset_name = get_preset_name_by_alias(Preset::Type::TYPE_FILAMENT, preferred_selection.filament); + if (auto it = filaments.find_preset_internal(preferred_preset_name); it != filaments.end() && it->is_visible) { + filaments.select_preset_by_name_strict(preferred_preset_name); this->filament_presets.front() = filaments.get_selected_preset_name(); } } else if (printer_technology == ptSLA && ! preferred_selection.sla_material.empty()) { - if (auto it = sla_materials.find_preset_internal(preferred_selection.sla_material); it != sla_materials.end() && it->is_visible) - sla_materials.select_preset_by_name_strict(preferred_selection.sla_material); + std::string preferred_preset_name = get_preset_name_by_alias(Preset::Type::TYPE_SLA_MATERIAL, preferred_selection.sla_material); + if (auto it = sla_materials.find_preset_internal(preferred_preset_name); it != sla_materials.end() && it->is_visible) + sla_materials.select_preset_by_name_strict(preferred_preset_name); } } diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index c22599e38..e5e49fb47 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -143,7 +143,7 @@ public: const std::string& get_preset_name_by_alias(const Preset::Type& preset_type, const std::string& alias) const; - // Save current preset of a required type under a new name. If the name is different from the old one, + // Save current preset of a provided type under a new name. If the name is different from the old one, // Unselected option would be reverted to the beginning values void save_changes_for_preset(const std::string& new_name, Preset::Type type, const std::vector& unselected_options); diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 06052a62f..b33e8bda2 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -397,7 +397,7 @@ bool Print::sequential_print_horizontal_clearance_valid(const Print& print, Poly convex_hull.translate(instance.shift - print_object->center_offset()); // if output needed, collect indices (inside convex_hulls_other) of intersecting hulls for (size_t i = 0; i < convex_hulls_other.size(); ++i) { - if (!intersection((Polygons)convex_hulls_other[i], (Polygons)convex_hull).empty()) { + if (! intersection(convex_hulls_other[i], convex_hull).empty()) { if (polygons == nullptr) return false; else { @@ -434,6 +434,8 @@ static inline bool sequential_print_vertical_clearance_valid(const Print &print) return it == print_instances_ordered.end() || (*it)->print_object->height() <= scale_(print.config().extruder_clearance_height.value); } + + // Precondition: Print::validate() requires the Print::apply() to be called its invocation. std::string Print::validate(std::string* warning) const { @@ -526,42 +528,11 @@ std::string Print::validate(std::string* warning) const } if (has_custom_layering) { - const std::vector &layer_height_profile_tallest = layer_height_profiles[tallest_object_idx]; for (size_t idx_object = 0; idx_object < m_objects.size(); ++ idx_object) { if (idx_object == tallest_object_idx) continue; - const std::vector &layer_height_profile = layer_height_profiles[idx_object]; - - // The comparison of the profiles is not just about element-wise equality, some layers may not be - // explicitely included. Always remember z and height of last reference layer that in the vector - // and compare to that. In case some layers are in the vectors multiple times, only the last entry is - // taken into account and compared. - size_t i = 0; // index into tested profile - size_t j = 0; // index into reference profile - coordf_t ref_z = -1.; - coordf_t next_ref_z = layer_height_profile_tallest[0]; - coordf_t ref_height = -1.; - while (i < layer_height_profile.size()) { - coordf_t this_z = layer_height_profile[i]; - // find the last entry with this z - while (i+2 < layer_height_profile.size() && layer_height_profile[i+2] == this_z) - i += 2; - - coordf_t this_height = layer_height_profile[i+1]; - if (ref_height < -1. || next_ref_z < this_z + EPSILON) { - ref_z = next_ref_z; - do { // one layer can be in the vector several times - ref_height = layer_height_profile_tallest[j+1]; - if (j+2 >= layer_height_profile_tallest.size()) - break; - j += 2; - next_ref_z = layer_height_profile_tallest[j]; - } while (ref_z == next_ref_z); - } - if (std::abs(this_height - ref_height) > EPSILON) - return L("The Wipe tower is only supported if all objects have the same variable layer height"); - i += 2; - } + if (layer_height_profiles[idx_object] != layer_height_profiles[tallest_object_idx]) + return L("The Wipe tower is only supported if all objects have the same variable layer height"); } } } @@ -812,7 +783,7 @@ void Print::auto_assign_extruders(ModelObject* model_object) const // Slicing process, running at a background thread. void Print::process() { - name_tbb_thread_pool_threads(); + name_tbb_thread_pool_threads_set_locale(); BOOST_LOG_TRIVIAL(info) << "Starting the slicing process." << log_memory_info(); for (PrintObject *obj : m_objects) diff --git a/src/libslic3r/PrintApply.cpp b/src/libslic3r/PrintApply.cpp index 10960c535..0f70cf3cc 100644 --- a/src/libslic3r/PrintApply.cpp +++ b/src/libslic3r/PrintApply.cpp @@ -1300,8 +1300,10 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ num_extruders, painting_extruders, *print_object_regions, - [&print_object, &update_apply_status](const PrintRegionConfig &old_config, const PrintRegionConfig &new_config, const t_config_option_keys &diff_keys) { - update_apply_status(print_object.invalidate_state_by_config_options(old_config, new_config, diff_keys)); + [it_print_object, it_print_object_end, &update_apply_status](const PrintRegionConfig &old_config, const PrintRegionConfig &new_config, const t_config_option_keys &diff_keys) { + for (auto it = it_print_object; it != it_print_object_end; ++it) + if ((*it)->m_shared_regions != nullptr) + update_apply_status((*it)->invalidate_state_by_config_options(old_config, new_config, diff_keys)); })) { // Regions are valid, just keep them. } else { diff --git a/src/libslic3r/PrintBase.cpp b/src/libslic3r/PrintBase.cpp index c4b6b7cce..7de74035b 100644 --- a/src/libslic3r/PrintBase.cpp +++ b/src/libslic3r/PrintBase.cpp @@ -60,6 +60,7 @@ std::string PrintBase::output_filename(const std::string &format, const std::str DynamicConfig cfg; if (config_override != nullptr) cfg = *config_override; + cfg.set_key_value("version", new ConfigOptionString(std::string(SLIC3R_VERSION))); PlaceholderParser::update_timestamp(cfg); this->update_object_placeholders(cfg, default_ext); if (! filename_base.empty()) { diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index d9a4f2670..f49eddf3e 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -397,22 +397,6 @@ void PrintObject::generate_support_material() if (layer->empty()) throw Slic3r::SlicingError("Levitating objects cannot be printed without supports."); #endif - - // Do we have custom support data that would not be used? - // Notify the user in that case. - if (! this->has_support()) { - for (const ModelVolume* mv : this->model_object()->volumes) { - bool has_enforcers = mv->is_support_enforcer() || - (mv->is_model_part() && mv->supported_facets.has_facets(*mv, EnforcerBlockerType::ENFORCER)); - if (has_enforcers) { - this->active_step_add_warning(PrintStateBase::WarningLevel::CRITICAL, - L("An object has custom support enforcers which will not be used " - "because supports are off. Consider turning them on.") + "\n" + - (L("Object name")) + ": " + this->model_object()->name); - break; - } - } - } } this->set_done(posSupportMaterial); } @@ -1447,7 +1431,7 @@ void PrintObject::bridge_over_infill() Polygons to_bridge_pp = internal_solid; // iterate through lower layers spanned by bridge_flow - double bottom_z = layer->print_z - bridge_flow.height(); + double bottom_z = layer->print_z - bridge_flow.height() - EPSILON; for (int i = int(layer_it - m_layers.begin()) - 1; i >= 0; --i) { const Layer* lower_layer = m_layers[i]; diff --git a/src/libslic3r/PrintObjectSlice.cpp b/src/libslic3r/PrintObjectSlice.cpp index 1d61be85b..7db0de626 100644 --- a/src/libslic3r/PrintObjectSlice.cpp +++ b/src/libslic3r/PrintObjectSlice.cpp @@ -39,23 +39,6 @@ LayerPtrs new_layers( return out; } -//FIXME The admesh repair function may break the face connectivity, rather refresh it here as the slicing code relies on it. -// This function will go away once we get rid of admesh from ModelVolume. -static indexed_triangle_set get_mesh_its_fix_mesh_connectivity(TriangleMesh mesh) -{ - assert(mesh.repaired && mesh.has_shared_vertices()); - if (mesh.stl.stats.number_of_facets > 0) { - assert(mesh.repaired && mesh.has_shared_vertices()); - auto nr_degenerated = mesh.stl.stats.degenerate_facets; - stl_check_facets_exact(&mesh.stl); - if (nr_degenerated != mesh.stl.stats.degenerate_facets) - // stl_check_facets_exact() removed some newly degenerated faces. Some faces could become degenerate after some mesh transformation. - stl_generate_shared_vertices(&mesh.stl, mesh.its); - } else - mesh.its.clear(); - return std::move(mesh.its); -} - // Slice single triangle mesh. static std::vector slice_volume( const ModelVolume &volume, @@ -65,7 +48,7 @@ static std::vector slice_volume( { std::vector layers; if (! zs.empty()) { - indexed_triangle_set its = get_mesh_its_fix_mesh_connectivity(volume.mesh()); + indexed_triangle_set its = volume.mesh().its; if (its.indices.size() > 0) { MeshSlicingParamsEx params2 { params }; params2.trafo = params2.trafo * volume.get_matrix(); diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index 55dae9430..9cac7f63b 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -286,8 +286,6 @@ void cut_drainholes(std::vector & obj_slices, if (mesh.empty()) return; - mesh.require_shared_vertices(); - std::vector hole_slices = slice_mesh_ex(mesh.its, slicegrid, closing_radius, thr); if (obj_slices.size() != hole_slices.size()) @@ -316,7 +314,6 @@ void hollow_mesh(TriangleMesh &mesh, const Interior &interior, int flags) remove_inside_triangles(mesh, interior); mesh.merge(TriangleMesh{interior.mesh}); - mesh.require_shared_vertices(); } // Get the distance of p to the interior's zero iso_surface. Interior should @@ -557,8 +554,7 @@ void remove_inside_triangles(TriangleMesh &mesh, const Interior &interior, new_faces = {}; mesh = TriangleMesh{mesh.its}; - mesh.repaired = true; - mesh.require_shared_vertices(); + //FIXME do we want to repair the mesh? Are there duplicate vertices or flipped triangles? } }} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/Pad.cpp b/src/libslic3r/SLA/Pad.cpp index 8d995b59e..1e5de5158 100644 --- a/src/libslic3r/SLA/Pad.cpp +++ b/src/libslic3r/SLA/Pad.cpp @@ -370,7 +370,7 @@ bool add_cavity(indexed_triangle_set &pad, if (inner_base.empty() || middle_base.empty()) { logerr(); return false; } - ExPolygons pdiff = diff_ex((Polygons)top_poly, (Polygons)middle_base.contour); + ExPolygons pdiff = diff_ex(top_poly, middle_base.contour); if (pdiff.size() != 1) { logerr(); return false; } diff --git a/src/libslic3r/SLA/RasterBase.hpp b/src/libslic3r/SLA/RasterBase.hpp index 1cd688ccb..1eba360e3 100644 --- a/src/libslic3r/SLA/RasterBase.hpp +++ b/src/libslic3r/SLA/RasterBase.hpp @@ -13,10 +13,6 @@ namespace Slic3r { -template using uqptr = std::unique_ptr; -template using shptr = std::shared_ptr; -template using wkptr = std::weak_ptr; - namespace sla { // Raw byte buffer paired with its size. Suitable for compressed image data. @@ -112,7 +108,7 @@ struct PPMRasterEncoder { std::ostream& operator<<(std::ostream &stream, const EncodedRaster &bytes); // If gamma is zero, thresholding will be performed which disables AA. -uqptr create_raster_grayscale_aa( +std::unique_ptr create_raster_grayscale_aa( const RasterBase::Resolution &res, const RasterBase::PixelDim & pxdim, double gamma = 1.0, diff --git a/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp b/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp index 20804193e..3ad7d62b1 100644 --- a/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp +++ b/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp @@ -33,7 +33,6 @@ inline void reproject_points_and_holes(ModelObject *object) if (!object || (!has_holes && !has_sppoints)) return; TriangleMesh rmsh = object->raw_mesh(); - rmsh.require_shared_vertices(); IndexedMesh emesh{rmsh}; if (has_sppoints) diff --git a/src/libslic3r/SLA/Rotfinder.cpp b/src/libslic3r/SLA/Rotfinder.cpp index 5486741f2..196646dc9 100644 --- a/src/libslic3r/SLA/Rotfinder.cpp +++ b/src/libslic3r/SLA/Rotfinder.cpp @@ -205,7 +205,6 @@ inline bool is_on_floor(const SLAPrintObjectConfig &cfg) std::vector get_chull_rotations(const TriangleMesh &mesh, size_t max_count) { TriangleMesh chull = mesh.convex_hull_3d(); - chull.require_shared_vertices(); double chull2d_area = chull.convex_hull().area(); double area_threshold = chull2d_area / (scaled(1e3) * scaled(1.)); @@ -299,7 +298,6 @@ struct RotfinderBoilerplate { static TriangleMesh get_mesh_to_rotate(const ModelObject &mo) { TriangleMesh mesh = mo.raw_mesh(); - mesh.require_shared_vertices(); ModelInstance *mi = mo.instances[0]; auto rotation = Vec3d::Zero(); @@ -437,7 +435,6 @@ Vec2d find_min_z_height_rotation(const ModelObject &mo, RotfinderBoilerplate<1000> bp{mo, params}; TriangleMesh chull = bp.mesh.convex_hull_3d(); - chull.require_shared_vertices(); auto inputs = reserve_vector(chull.its.indices.size()); auto rotcmp = [](const XYRotation &r1, const XYRotation &r2) { double xdiff = r1[X] - r2[X], ydiff = r1[Y] - r2[Y]; diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 0b9dde122..004f7d555 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -670,7 +670,7 @@ std::string SLAPrint::validate(std::string*) const return ""; } -void SLAPrint::set_printer(SLAPrinter *arch) +void SLAPrint::set_printer(SLAArchive *arch) { invalidate_step(slapsRasterize); m_printer = arch; @@ -693,7 +693,7 @@ void SLAPrint::process() if (m_objects.empty()) return; - name_tbb_thread_pool_threads(); + name_tbb_thread_pool_threads_set_locale(); // Assumption: at this point the print objects should be populated only with // the model objects we have to process and the instances are also filtered @@ -896,7 +896,6 @@ SLAPrintObject::SLAPrintObject(SLAPrint *print, ModelObject *model_object) obj = m_model_object->raw_mesh(); if (!obj.empty()) { obj.transform(m_trafo); - obj.require_shared_vertices(); } }) {} @@ -1048,15 +1047,15 @@ Vec3d SLAPrint::relative_correction() const Vec3d corr(1., 1., 1.); if(printer_config().relative_correction.values.size() >= 2) { - corr(X) = printer_config().relative_correction.values[0]; - corr(Y) = printer_config().relative_correction.values[0]; - corr(Z) = printer_config().relative_correction.values.back(); + corr.x() = printer_config().relative_correction.values[0]; + corr.y() = corr.x(); + corr.z() = printer_config().relative_correction.values[1]; } if(material_config().material_correction.values.size() >= 2) { - corr(X) *= material_config().material_correction.values[0]; - corr(Y) *= material_config().material_correction.values[0]; - corr(Z) *= material_config().material_correction.values.back(); + corr.x() *= material_config().material_correction.values[0]; + corr.y() = corr.x(); + corr.z() *= material_config().material_correction.values[1]; } return corr; diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 0cd80f20b..833146985 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -323,7 +323,6 @@ private: { support_tree_ptr = sla::SupportTree::create(*this, ctl); tree_mesh = TriangleMesh{support_tree_ptr->retrieve_mesh(sla::MeshType::Support)}; - tree_mesh.require_shared_vertices(); return support_tree_ptr; } @@ -388,15 +387,15 @@ struct SLAPrintStatistics } }; -class SLAPrinter { +class SLAArchive { protected: std::vector m_layers; - virtual uqptr create_raster() const = 0; + virtual std::unique_ptr create_raster() const = 0; virtual sla::RasterEncoder get_encoder() const = 0; public: - virtual ~SLAPrinter() = default; + virtual ~SLAArchive() = default; virtual void apply(const SLAPrinterConfig &cfg) = 0; @@ -527,7 +526,7 @@ public: // TODO: use this structure for the preview in the future. const std::vector& print_layers() const { return m_printer_input; } - void set_printer(SLAPrinter *archiver); + void set_printer(SLAArchive *archiver); private: @@ -549,7 +548,7 @@ private: std::vector m_printer_input; // The archive object which collects the raster images after slicing - SLAPrinter *m_printer = nullptr; + SLAArchive *m_printer = nullptr; // Estimated print time, material consumed. SLAPrintStatistics m_print_statistics; diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 4b377d9f1..adec5735a 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -526,7 +526,6 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po) } auto thr = [this]() { m_print->throw_if_canceled(); }; auto &slice_grid = po.m_model_height_levels; - assert(mesh.has_shared_vertices()); po.m_model_slices = slice_mesh_ex(mesh.its, slice_grid, params, thr); sla::Interior *interior = po.m_hollowing_data ? diff --git a/src/libslic3r/SimplifyMesh.hpp b/src/libslic3r/SimplifyMesh.hpp index fb3e73d04..23eb343d1 100644 --- a/src/libslic3r/SimplifyMesh.hpp +++ b/src/libslic3r/SimplifyMesh.hpp @@ -14,10 +14,8 @@ void simplify_mesh(indexed_triangle_set &); template void simplify_mesh(TriangleMesh &m, Args &&...a) { - m.require_shared_vertices(); simplify_mesh(m.its, std::forward(a)...); - m = TriangleMesh{m.its}; - m.require_shared_vertices(); + m = TriangleMesh{ std::move(m.its) }; } } // namespace Slic3r diff --git a/src/libslic3r/SlicingAdaptive.cpp b/src/libslic3r/SlicingAdaptive.cpp index 9b9b48f88..30ff67bba 100644 --- a/src/libslic3r/SlicingAdaptive.cpp +++ b/src/libslic3r/SlicingAdaptive.cpp @@ -35,13 +35,6 @@ legend("tan(a) as cura - topographic lines distance limit", "sqrt(tan(a)) as Pru namespace Slic3r { -static inline std::pair face_z_span(const stl_facet &f) -{ - return std::pair( - std::min(std::min(f.vertex[0](2), f.vertex[1](2)), f.vertex[2](2)), - std::max(std::max(f.vertex[0](2), f.vertex[1](2)), f.vertex[2](2))); -} - // By Florens Waserfall aka @platch: // This constant essentially describes the volumetric error at the surface which is induced // by stacking "elliptic" extrusion threads. It is empirically determined by @@ -88,10 +81,15 @@ void SlicingAdaptive::prepare(const ModelObject &object) mesh.transform(first_instance.get_matrix(), first_instance.is_left_handed()); // 1) Collect faces from mesh. - m_faces.reserve(mesh.stl.stats.number_of_facets); - for (const stl_facet &face : mesh.stl.facet_start) { - Vec3f n = face.normal.normalized(); - m_faces.emplace_back(FaceZ({ face_z_span(face), std::abs(n.z()), std::sqrt(n.x() * n.x() + n.y() * n.y()) })); + m_faces.reserve(mesh.facets_count()); + for (stl_triangle_vertex_indices face : mesh.its.indices) { + stl_vertex vertex[3] = { mesh.its.vertices[face[0]], mesh.its.vertices[face[1]], mesh.its.vertices[face[2]] }; + stl_vertex n = face_normal_normalized(vertex); + std::pair face_z_span { + std::min(std::min(vertex[0].z(), vertex[1].z()), vertex[2].z()), + std::max(std::max(vertex[0].z(), vertex[1].z()), vertex[2].z()) + }; + m_faces.emplace_back(FaceZ({ face_z_span, std::abs(n.z()), std::sqrt(n.x() * n.x() + n.y() * n.y()) })); } // 2) Sort faces lexicographically by their Z span. diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp index 1b66bcc53..2099cbf73 100644 --- a/src/libslic3r/SupportMaterial.cpp +++ b/src/libslic3r/SupportMaterial.cpp @@ -502,7 +502,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // If raft is to be generated, the 1st top_contact layer will contain the 1st object layer silhouette with holes filled. // There is also a 1st intermediate layer containing bases of support columns. // Inflate the bases of the support columns and create the raft base under the object. - MyLayersPtr raft_layers = this->generate_raft_base(object, top_contacts, interface_layers, intermediate_layers, base_interface_layers, layer_storage); + MyLayersPtr raft_layers = this->generate_raft_base(object, top_contacts, interface_layers, base_interface_layers, intermediate_layers, layer_storage); #ifdef SLIC3R_DEBUG for (const MyLayer *l : interface_layers) @@ -721,9 +721,9 @@ public: #ifdef SUPPORT_USE_AGG_RASTERIZER m_bbox = bbox; // Oversample the grid to avoid leaking of supports through or around the object walls. - int oversampling = std::min(8, int(scale_(m_support_spacing) / (scale_(params.extrusion_width) + 100))); - m_pixel_size = scale_(m_support_spacing / oversampling); - assert(scale_(params.extrusion_width) + 20 < m_pixel_size); + int extrusion_width_scaled = scale_(params.extrusion_width); + int oversampling = std::clamp(int(scale_(m_support_spacing) / (extrusion_width_scaled + 100)), 1, 8); + m_pixel_size = std::max(extrusion_width_scaled + 21, scale_(m_support_spacing / oversampling)); // Add one empty column / row boundaries. m_bbox.offset(m_pixel_size); // Grid size fitting the support polygons plus one pixel boundary around the polygons. @@ -1599,7 +1599,8 @@ static inline std::tuple detect_overhangs( static inline std::pair new_contact_layer( const PrintConfig &print_config, const PrintObjectConfig &object_config, - const SlicingParameters &slicing_params, + const SlicingParameters &slicing_params, + const coordf_t support_layer_height_min, const Layer &layer, std::deque &layer_storage, tbb::spin_mutex &layer_storage_mutex) @@ -1629,7 +1630,8 @@ static inline std::pair 1 ? slicing_params.raft_interface_top_z + support_layer_height_min + EPSILON : slicing_params.first_print_layer_height - EPSILON; + if (print_z < min_print_z) { // This contact layer is below the first layer height, therefore not printable. Don't support this surface. return std::pair(nullptr, nullptr); } else if (print_z < slicing_params.first_print_layer_height + EPSILON) { @@ -1650,7 +1652,7 @@ static inline std::pairregion().bridging_height_avg(print_config); bridging_height /= coordf_t(layer.regions().size()); coordf_t bridging_print_z = layer.print_z - bridging_height - slicing_params.gap_support_object; - if (bridging_print_z >= slicing_params.first_print_layer_height - EPSILON) { + if (bridging_print_z >= min_print_z) { // Not below the first layer height means this layer is printable. if (print_z < slicing_params.first_print_layer_height + EPSILON) { // Align the layer with the 1st layer height. @@ -1664,8 +1666,7 @@ static inline std::pairbottom_z = 0; bridging_layer->height = slicing_params.first_print_layer_height; - } - else { + } else { // Don't know the height yet. bridging_layer->bottom_z = bridging_print_z; bridging_layer->height = 0; @@ -1917,7 +1918,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_ // Now apply the contact areas to the layer where they need to be made. if (! contact_polygons.empty()) { - auto [new_layer, bridging_layer] = new_contact_layer(*m_print_config, *m_object_config, m_slicing_params, layer, layer_storage, layer_storage_mutex); + auto [new_layer, bridging_layer] = new_contact_layer(*m_print_config, *m_object_config, m_slicing_params, m_support_params.support_layer_height_min, layer, layer_storage, layer_storage_mutex); if (new_layer) { fill_contact_layer(*new_layer, layer_id, m_slicing_params, *m_object_config, slices_margin, overhang_polygons, contact_polygons, enforcer_polygons, lower_layer_polygons, @@ -2054,21 +2055,21 @@ static inline PrintObjectSupportMaterial::MyLayer* detect_bottom_contacts( // Trim the already created base layers above the current layer intersecting with the new bottom contacts layer. //FIXME Maybe this is no more needed, as the overlapping base layers are trimmed by the bottom layers at the final stage? touching = offset(touching, float(SCALED_EPSILON)); - for (int layer_id_above = layer_id + 1; layer_id_above < int(object.total_layer_count()); ++layer_id_above) { + for (int layer_id_above = layer_id + 1; layer_id_above < int(object.total_layer_count()); ++ layer_id_above) { const Layer &layer_above = *object.layers()[layer_id_above]; if (layer_above.print_z > layer_new.print_z - EPSILON) break; - if (! layer_support_areas[layer_id_above].empty()) { + if (Polygons &above = layer_support_areas[layer_id_above]; ! above.empty()) { #ifdef SLIC3R_DEBUG SVG::export_expolygons(debug_out_path("support-support-areas-raw-before-trimming-%d-with-%f-%lf.svg", iRun, layer.print_z, layer_above.print_z), - { { { union_ex(touching) }, { "touching", "blue", 0.5f } }, - { { union_safety_offset_ex(layer_support_areas[layer_id_above]) }, { "above", "red", "black", "", scaled(0.1f), 0.5f } } }); + { { { union_ex(touching) }, { "touching", "blue", 0.5f } }, + { { union_safety_offset_ex(above) }, { "above", "red", "black", "", scaled(0.1f), 0.5f } } }); #endif /* SLIC3R_DEBUG */ - layer_support_areas[layer_id_above] = diff(layer_support_areas[layer_id_above], touching); + above = diff(above, touching); #ifdef SLIC3R_DEBUG Slic3r::SVG::export_expolygons( debug_out_path("support-support-areas-raw-after-trimming-%d-with-%f-%lf.svg", iRun, layer.print_z, layer_above.print_z), - union_ex(layer_support_areas[layer_id_above])); + union_ex(above)); #endif /* SLIC3R_DEBUG */ } } @@ -2600,8 +2601,6 @@ void PrintObjectSupportMaterial::generate_base_layers( // No top contacts -> no intermediate layers will be produced. return; - // coordf_t fillet_radius_scaled = scale_(m_object_config->support_material_spacing); - BOOST_LOG_TRIVIAL(debug) << "PrintObjectSupportMaterial::generate_base_layers() in parallel - start"; tbb::parallel_for( tbb::blocked_range(0, intermediate_layers.size()), @@ -2623,10 +2622,9 @@ void PrintObjectSupportMaterial::generate_base_layers( // New polygons for layer_intermediate. Polygons polygons_new; - // Use the precomputed layer_support_areas. - idx_object_layer_above = std::max(0, idx_lower_or_equal(object.layers().begin(), object.layers().end(), idx_object_layer_above, - [&layer_intermediate](const Layer *layer){ return layer->print_z <= layer_intermediate.print_z + EPSILON; })); - polygons_new = layer_support_areas[idx_object_layer_above]; + // Use the precomputed layer_support_areas. "idx_object_layer_above": above means above since the last iteration, not above after this call. + idx_object_layer_above = idx_lower_or_equal(object.layers().begin(), object.layers().end(), idx_object_layer_above, + [&layer_intermediate](const Layer* layer) { return layer->print_z <= layer_intermediate.print_z + EPSILON; }); // Polygons to trim polygons_new. Polygons polygons_trimming; @@ -2641,7 +2639,7 @@ void PrintObjectSupportMaterial::generate_base_layers( idx_top_contact_above = idx_lower_or_equal(top_contacts, idx_top_contact_above, [&layer_intermediate](const MyLayer *layer){ return layer->bottom_z <= layer_intermediate.print_z - EPSILON; }); // Collect all the top_contact layer intersecting with this layer. - for ( int idx_top_contact_overlapping = idx_top_contact_above; idx_top_contact_overlapping >= 0; -- idx_top_contact_overlapping) { + for (int idx_top_contact_overlapping = idx_top_contact_above; idx_top_contact_overlapping >= 0; -- idx_top_contact_overlapping) { MyLayer &layer_top_overlapping = *top_contacts[idx_top_contact_overlapping]; if (layer_top_overlapping.print_z < layer_intermediate.bottom_z + EPSILON) break; @@ -2652,6 +2650,22 @@ void PrintObjectSupportMaterial::generate_base_layers( polygons_append(polygons_trimming, layer_top_overlapping.polygons); } + if (idx_object_layer_above < 0) { + // layer_support_areas are synchronized with object layers and they contain projections of the contact layers above them. + // This intermediate layer is not above any object layer, thus there is no information in layer_support_areas about + // towers supporting contact layers intersecting the first object layer. Project these contact layers now. + polygons_new = layer_support_areas.front(); + double first_layer_z = object.layers().front()->print_z; + for (int i = idx_top_contact_above + 1; i < int(top_contacts.size()); ++ i) { + MyLayer &contacts = *top_contacts[i]; + if (contacts.print_z > first_layer_z + EPSILON) + break; + assert(contacts.bottom_z > layer_intermediate.print_z - EPSILON); + polygons_append(polygons_new, contacts.polygons); + } + } else + polygons_new = layer_support_areas[idx_object_layer_above]; + // Trimming the base layer with any overlapping bottom layer. // Following cases are recognized: // 1) bottom.bottom_z >= base.top_z -> No overlap, no trimming needed. @@ -2696,6 +2710,7 @@ void PrintObjectSupportMaterial::generate_base_layers( layer_intermediate.layer_type = sltBase; #if 0 + // coordf_t fillet_radius_scaled = scale_(m_object_config->support_material_spacing); // Fillet the base polygons and trim them again with the top, interface and contact layers. $base->{$i} = diff( offset2( @@ -3338,7 +3353,7 @@ void LoopInterfaceProcessor::generate(MyLayerExtruded &top_contact_layer, const Polygon &contour = (i_contour == 0) ? it_contact_expoly->contour : it_contact_expoly->holes[i_contour - 1]; const Point *seg_current_pt = nullptr; coordf_t seg_current_t = 0.; - if (! intersection_pl((Polylines)contour.split_at_first_point(), overhang_with_margin).empty()) { + if (! intersection_pl(contour.split_at_first_point(), overhang_with_margin).empty()) { // The contour is below the overhang at least to some extent. //FIXME ideally one would place the circles below the overhang only. // Walk around the contour and place circles so their centers are not closer than circle_distance from each other. @@ -3784,7 +3799,7 @@ void PrintObjectSupportMaterial::generate_toolpaths( // Prepare fillers. SupportMaterialPattern support_pattern = m_object_config->support_material_pattern; bool with_sheath = m_object_config->support_material_with_sheath; - InfillPattern infill_pattern = (support_pattern == smpHoneycomb ? ipHoneycomb : ipSupportBase); + InfillPattern infill_pattern = support_pattern == smpHoneycomb ? ipHoneycomb : (support_density < 1.05 ? ipRectilinear : ipSupportBase); std::vector angles; angles.push_back(base_angle); diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index ac92ecd10..350f6aedc 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -41,16 +41,8 @@ //==================== #define ENABLE_2_4_0_ALPHA1 1 -// Enable delayed rendering of transparent volumes -#define ENABLE_DELAYED_TRANSPARENT_VOLUMES_RENDERING (1 && ENABLE_2_4_0_ALPHA1) -// Enable the fix of importing color print view from gcode files into GCodeViewer -#define ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER (1 && ENABLE_2_4_0_ALPHA1) -// Enable drawing contours, at cut level, for sinking volumes -#define ENABLE_SINKING_CONTOURS (1 && ENABLE_2_4_0_ALPHA1) // Enable implementation of retract acceleration in gcode processor #define ENABLE_RETRACT_ACCELERATION (1 && ENABLE_2_4_0_ALPHA1) -// Enable the fix for exporting and importing to/from 3mf file of mirrored volumes -#define ENABLE_FIX_MIRRORED_VOLUMES_3MF_IMPORT_EXPORT (1 && ENABLE_2_4_0_ALPHA1) // Enable rendering seams (and other options) in preview using models #define ENABLE_SEAMS_USING_MODELS (1 && ENABLE_2_4_0_ALPHA1) // Enable save and save as commands to be enabled also when the plater is empty and allow to load empty projects @@ -65,7 +57,20 @@ // Enable rendering seams (and other options) in preview using batched models on systems not supporting OpenGL 3.3 #define ENABLE_SEAMS_USING_BATCHED_MODELS (1 && ENABLE_SEAMS_USING_MODELS && ENABLE_2_4_0_ALPHA2) // Enable fixing the z position of color change, pause print and custom gcode markers in preview -#define ENABLE_FIX_PREVIEW_OPTIONS_Z (1 && ENABLE_SEAMS_USING_MODELS && ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER && ENABLE_2_4_0_ALPHA2) +#define ENABLE_FIX_PREVIEW_OPTIONS_Z (1 && ENABLE_SEAMS_USING_MODELS && ENABLE_2_4_0_ALPHA2) +// Enable replacing a missing file during reload from disk command +#define ENABLE_RELOAD_FROM_DISK_REPLACE_FILE (1 && ENABLE_2_4_0_ALPHA2) +// Enable fixing the synchronization of seams with the horizontal slider in preview +#define ENABLE_FIX_SEAMS_SYNCH (1 && ENABLE_2_4_0_ALPHA2) + + +//==================== +// 2.4.0.alpha3 techs +//==================== +#define ENABLE_2_4_0_ALPHA3 1 + +// Enable fixing loading of gcode files generated with SuperSlicer in GCodeViewer +#define ENABLE_FIX_SUPERSLICER_GCODE_IMPORT (1 && ENABLE_2_4_0_ALPHA3) #endif // _prusaslicer_technologies_h_ diff --git a/src/libslic3r/Thread.cpp b/src/libslic3r/Thread.cpp index 25c29d273..106da4a78 100644 --- a/src/libslic3r/Thread.cpp +++ b/src/libslic3r/Thread.cpp @@ -188,7 +188,8 @@ std::optional get_current_thread_name() #endif // _WIN32 // Spawn (n - 1) worker threads on Intel TBB thread pool and name them by an index and a system thread ID. -void name_tbb_thread_pool_threads() +// Also it sets locale of the worker threads to "C" for the G-code generator to produce "." as a decimal separator. +void name_tbb_thread_pool_threads_set_locale() { static bool initialized = false; if (initialized) @@ -233,6 +234,21 @@ void name_tbb_thread_pool_threads() std::ostringstream name; name << "slic3r_tbb_" << range.begin(); set_current_thread_name(name.str().c_str()); + // Set locales of the worker thread to "C". +#ifdef _WIN32 + _configthreadlocale(_ENABLE_PER_THREAD_LOCALE); + std::setlocale(LC_ALL, "C"); +#else + // We are leaking some memory here, because the newlocale() produced memory will never be released. + // This is not a problem though, as there will be a maximum one worker thread created per physical thread. + uselocale(newlocale( +#ifdef __APPLE__ + LC_ALL_MASK +#else // some Unix / Linux / BSD + LC_ALL +#endif + , "C", nullptr)); +#endif } }); } diff --git a/src/libslic3r/Thread.hpp b/src/libslic3r/Thread.hpp index a86123796..9afe13b42 100644 --- a/src/libslic3r/Thread.hpp +++ b/src/libslic3r/Thread.hpp @@ -33,7 +33,8 @@ std::optional get_current_thread_name(); // To be called somewhere before the TBB threads are spinned for the first time, to // give them names recognizible in the debugger. -void name_tbb_thread_pool_threads(); +// Also it sets locale of the worker threads to "C" for the G-code generator to produce "." as a decimal separator. +void name_tbb_thread_pool_threads_set_locale(); template inline boost::thread create_thread(boost::thread::attributes &attrs, Fn &&fn) diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp index fa8f8bce6..bb3c9fc5c 100644 --- a/src/libslic3r/TriangleMesh.cpp +++ b/src/libslic3r/TriangleMesh.cpp @@ -7,6 +7,7 @@ #include "Point.hpp" #include "Execution/ExecutionTBB.hpp" #include "Execution/ExecutionSeq.hpp" +#include "Utils.hpp" #include #include @@ -21,6 +22,8 @@ #include #include +#include +#include #include #include @@ -29,74 +32,52 @@ namespace Slic3r { -TriangleMesh::TriangleMesh(const Pointf3s &points, const std::vector &facets) : repaired(false) +static void update_bounding_box(const indexed_triangle_set &its, TriangleMeshStats &out) { - stl_file &stl = this->stl; - stl.stats.type = inmemory; - - // count facets and allocate memory - stl.stats.number_of_facets = (uint32_t)facets.size(); - stl.stats.original_num_facets = stl.stats.number_of_facets; - stl_allocate(&stl); - - for (uint32_t i = 0; i < stl.stats.number_of_facets; ++ i) { - stl_facet facet; - facet.vertex[0] = points[facets[i](0)].cast(); - facet.vertex[1] = points[facets[i](1)].cast(); - facet.vertex[2] = points[facets[i](2)].cast(); - facet.extra[0] = 0; - facet.extra[1] = 0; - - stl_normal normal; - stl_calculate_normal(normal, &facet); - stl_normalize_vector(normal); - facet.normal = normal; - - stl.facet_start[i] = facet; - } - stl_get_size(&stl); + BoundingBoxf3 bbox = Slic3r::bounding_box(its); + out.min = bbox.min.cast(); + out.max = bbox.max.cast(); + out.size = out.max - out.min; } -TriangleMesh::TriangleMesh(const indexed_triangle_set &M) : repaired(false) +static void fill_initial_stats(const indexed_triangle_set &its, TriangleMeshStats &out) { - stl.stats.type = inmemory; - - // count facets and allocate memory - stl.stats.number_of_facets = uint32_t(M.indices.size()); - stl.stats.original_num_facets = int(stl.stats.number_of_facets); - stl_allocate(&stl); - - for (uint32_t i = 0; i < stl.stats.number_of_facets; ++ i) { - stl_facet facet; - facet.vertex[0] = M.vertices[size_t(M.indices[i](0))]; - facet.vertex[1] = M.vertices[size_t(M.indices[i](1))]; - facet.vertex[2] = M.vertices[size_t(M.indices[i](2))]; - facet.extra[0] = 0; - facet.extra[1] = 0; - - stl_normal normal; - stl_calculate_normal(normal, &facet); - stl_normalize_vector(normal); - facet.normal = normal; - - stl.facet_start[i] = facet; - } - - stl_get_size(&stl); + out.number_of_facets = its.indices.size(); + out.volume = its_volume(its); + update_bounding_box(its, out); + + const std::vector face_neighbors = its_face_neighbors(its); + out.number_of_parts = its_number_of_patches(its, face_neighbors); + out.open_edges = its_num_open_edges(face_neighbors); +} + +TriangleMesh::TriangleMesh(const std::vector &vertices, const std::vector &faces) : its { faces, vertices } +{ + fill_initial_stats(this->its, m_stats); +} + +TriangleMesh::TriangleMesh(std::vector &&vertices, const std::vector &&faces) : its { std::move(faces), std::move(vertices) } +{ + fill_initial_stats(this->its, m_stats); +} + +TriangleMesh::TriangleMesh(const indexed_triangle_set &its) : its(its) +{ + fill_initial_stats(this->its, m_stats); +} + +TriangleMesh::TriangleMesh(indexed_triangle_set &&its, const RepairedMeshErrors& errors/* = RepairedMeshErrors()*/) : its(std::move(its)) +{ + m_stats.repaired_errors = errors; + fill_initial_stats(this->its, m_stats); } // #define SLIC3R_TRACE_REPAIR -void TriangleMesh::repair(bool update_shared_vertices) +static void trianglemesh_repair_on_import(stl_file &stl) { - if (this->repaired) { - if (update_shared_vertices) - this->require_shared_vertices(); - return; - } - // admesh fails when repairing empty meshes - if (this->stl.stats.number_of_facets == 0) + if (stl.stats.number_of_facets == 0) return; BOOST_LOG_TRIVIAL(debug) << "TriangleMesh::repair() started"; @@ -105,9 +86,9 @@ void TriangleMesh::repair(bool update_shared_vertices) #ifdef SLIC3R_TRACE_REPAIR BOOST_LOG_TRIVIAL(trace) << "\tstl_check_faces_exact"; #endif /* SLIC3R_TRACE_REPAIR */ - assert(stl_validate(&this->stl)); + assert(stl_validate(&stl)); stl_check_facets_exact(&stl); - assert(stl_validate(&this->stl)); + assert(stl_validate(&stl)); stl.stats.facets_w_1_bad_edge = (stl.stats.connected_facets_2_edge - stl.stats.connected_facets_3_edge); stl.stats.facets_w_2_bad_edge = (stl.stats.connected_facets_1_edge - stl.stats.connected_facets_2_edge); stl.stats.facets_w_3_bad_edge = (stl.stats.number_of_facets - stl.stats.connected_facets_1_edge); @@ -117,9 +98,11 @@ void TriangleMesh::repair(bool update_shared_vertices) float tolerance = (float)stl.stats.shortest_edge; float increment = (float)stl.stats.bounding_diameter / 10000.0f; int iterations = 2; - if (stl.stats.connected_facets_3_edge < (int)stl.stats.number_of_facets) { - for (int i = 0; i < iterations; i++) { - if (stl.stats.connected_facets_3_edge < (int)stl.stats.number_of_facets) { + if (stl.stats.connected_facets_3_edge < int(stl.stats.number_of_facets)) { + // Not a manifold, some triangles have unconnected edges. + for (int i = 0; i < iterations; ++ i) { + if (stl.stats.connected_facets_3_edge < int(stl.stats.number_of_facets)) { + // Still not a manifold, some triangles have unconnected edges. //printf("Checking nearby. Tolerance= %f Iteration=%d of %d...", tolerance, i + 1, iterations); #ifdef SLIC3R_TRACE_REPAIR BOOST_LOG_TRIVIAL(trace) << "\tstl_check_faces_nearby"; @@ -133,7 +116,7 @@ void TriangleMesh::repair(bool update_shared_vertices) } } } - assert(stl_validate(&this->stl)); + assert(stl_validate(&stl)); // remove_unconnected if (stl.stats.connected_facets_3_edge < (int)stl.stats.number_of_facets) { @@ -141,7 +124,7 @@ void TriangleMesh::repair(bool update_shared_vertices) BOOST_LOG_TRIVIAL(trace) << "\tstl_remove_unconnected_facets"; #endif /* SLIC3R_TRACE_REPAIR */ stl_remove_unconnected_facets(&stl); - assert(stl_validate(&this->stl)); + assert(stl_validate(&stl)); } // fill_holes @@ -162,93 +145,83 @@ void TriangleMesh::repair(bool update_shared_vertices) BOOST_LOG_TRIVIAL(trace) << "\tstl_fix_normal_directions"; #endif /* SLIC3R_TRACE_REPAIR */ stl_fix_normal_directions(&stl); - assert(stl_validate(&this->stl)); + assert(stl_validate(&stl)); // normal_values #ifdef SLIC3R_TRACE_REPAIR BOOST_LOG_TRIVIAL(trace) << "\tstl_fix_normal_values"; #endif /* SLIC3R_TRACE_REPAIR */ stl_fix_normal_values(&stl); - assert(stl_validate(&this->stl)); + assert(stl_validate(&stl)); // always calculate the volume and reverse all normals if volume is negative #ifdef SLIC3R_TRACE_REPAIR BOOST_LOG_TRIVIAL(trace) << "\tstl_calculate_volume"; #endif /* SLIC3R_TRACE_REPAIR */ + // If the volume is negative, all the facets are flipped and added to stats.facets_reversed. stl_calculate_volume(&stl); - assert(stl_validate(&this->stl)); + assert(stl_validate(&stl)); // neighbors #ifdef SLIC3R_TRACE_REPAIR BOOST_LOG_TRIVIAL(trace) << "\tstl_verify_neighbors"; #endif /* SLIC3R_TRACE_REPAIR */ stl_verify_neighbors(&stl); - assert(stl_validate(&this->stl)); + assert(stl_validate(&stl)); - this->repaired = true; + //FIXME The admesh repair function may break the face connectivity, rather refresh it here as the slicing code relies on it. + if (auto nr_degenerated = stl.stats.degenerate_facets; stl.stats.number_of_facets > 0 && nr_degenerated > 0) + stl_check_facets_exact(&stl); BOOST_LOG_TRIVIAL(debug) << "TriangleMesh::repair() finished"; +} - // This call should be quite cheap, a lot of code requires the indexed_triangle_set data structure, - // and it is risky to generate such a structure once the meshes are shared. Do it now. - this->its.clear(); - if (update_shared_vertices) - this->require_shared_vertices(); +bool TriangleMesh::ReadSTLFile(const char* input_file, bool repair) +{ + stl_file stl; + if (! stl_open(&stl, input_file)) + return false; + if (repair) + trianglemesh_repair_on_import(stl); + + m_stats.number_of_facets = stl.stats.number_of_facets; + m_stats.min = stl.stats.min; + m_stats.max = stl.stats.max; + m_stats.size = stl.stats.size; + m_stats.volume = stl.stats.volume; + + auto facets_w_1_bad_edge = stl.stats.connected_facets_2_edge - stl.stats.connected_facets_3_edge; + auto facets_w_2_bad_edge = stl.stats.connected_facets_1_edge - stl.stats.connected_facets_2_edge; + auto facets_w_3_bad_edge = stl.stats.number_of_facets - stl.stats.connected_facets_1_edge; + m_stats.open_edges = stl.stats.backwards_edges + facets_w_1_bad_edge + facets_w_2_bad_edge * 2 + facets_w_3_bad_edge * 3; + + m_stats.repaired_errors = { stl.stats.edges_fixed, + stl.stats.degenerate_facets, + stl.stats.facets_removed, + stl.stats.facets_reversed, + stl.stats.backwards_edges }; + + m_stats.number_of_parts = stl.stats.number_of_parts; + + stl_generate_shared_vertices(&stl, this->its); + return true; +} + +bool TriangleMesh::write_ascii(const char* output_file) +{ + return its_write_stl_ascii(output_file, "", this->its); +} + +bool TriangleMesh::write_binary(const char* output_file) +{ + return its_write_stl_binary(output_file, "", this->its); } float TriangleMesh::volume() { - if (this->stl.stats.volume == -1) - stl_calculate_volume(&this->stl); - return this->stl.stats.volume; -} - -void TriangleMesh::check_topology() -{ - // checking exact - stl_check_facets_exact(&stl); - stl.stats.facets_w_1_bad_edge = (stl.stats.connected_facets_2_edge - stl.stats.connected_facets_3_edge); - stl.stats.facets_w_2_bad_edge = (stl.stats.connected_facets_1_edge - stl.stats.connected_facets_2_edge); - stl.stats.facets_w_3_bad_edge = (stl.stats.number_of_facets - stl.stats.connected_facets_1_edge); - - // checking nearby - //int last_edges_fixed = 0; - float tolerance = stl.stats.shortest_edge; - float increment = stl.stats.bounding_diameter / 10000.0; - int iterations = 2; - if (stl.stats.connected_facets_3_edge < (int)stl.stats.number_of_facets) { - for (int i = 0; i < iterations; i++) { - if (stl.stats.connected_facets_3_edge < (int)stl.stats.number_of_facets) { - //printf("Checking nearby. Tolerance= %f Iteration=%d of %d...", tolerance, i + 1, iterations); - stl_check_facets_nearby(&stl, tolerance); - //printf(" Fixed %d edges.\n", stl.stats.edges_fixed - last_edges_fixed); - //last_edges_fixed = stl.stats.edges_fixed; - tolerance += increment; - } else { - break; - } - } - } -} - -void TriangleMesh::reset_repair_stats() { - this->stl.stats.degenerate_facets = 0; - this->stl.stats.edges_fixed = 0; - this->stl.stats.facets_removed = 0; - this->stl.stats.facets_added = 0; - this->stl.stats.facets_reversed = 0; - this->stl.stats.backwards_edges = 0; - this->stl.stats.normals_fixed = 0; -} - -bool TriangleMesh::needed_repair() const -{ - return this->stl.stats.degenerate_facets > 0 - || this->stl.stats.edges_fixed > 0 - || this->stl.stats.facets_removed > 0 - || this->stl.stats.facets_added > 0 - || this->stl.stats.facets_reversed > 0 - || this->stl.stats.backwards_edges > 0; + if (m_stats.volume == -1) + m_stats.volume = its_volume(this->its); + return m_stats.volume; } void TriangleMesh::WriteOBJFile(const char* output_file) const @@ -258,133 +231,142 @@ void TriangleMesh::WriteOBJFile(const char* output_file) const void TriangleMesh::scale(float factor) { - stl_scale(&(this->stl), factor); - for (stl_vertex& v : this->its.vertices) - v *= factor; + this->scale(Vec3f(factor, factor, factor)); } -void TriangleMesh::scale(const Vec3d &versor) +void TriangleMesh::scale(const Vec3f &versor) { - stl_scale_versor(&this->stl, versor.cast()); - for (stl_vertex& v : this->its.vertices) { - v.x() *= versor.x(); - v.y() *= versor.y(); - v.z() *= versor.z(); + // Scale extents. + auto s = versor.array(); + m_stats.min.array() *= s; + m_stats.max.array() *= s; + // Scale size. + m_stats.size.array() *= s; + // Scale volume. + if (m_stats.volume > 0.0) + m_stats.volume *= s(0) * s(1) * s(2); + if (versor.x() == versor.y() && versor.x() == versor.z()) { + float s = versor.x(); + for (stl_vertex &v : this->its.vertices) + v *= s; + } else { + for (stl_vertex &v : this->its.vertices) { + v.x() *= versor.x(); + v.y() *= versor.y(); + v.z() *= versor.z(); + } + } +} + +void TriangleMesh::translate(const Vec3f &displacement) +{ + if (displacement.x() != 0.f || displacement.y() != 0.f || displacement.z() != 0.f) { + for (stl_vertex& v : this->its.vertices) + v += displacement; + m_stats.min += displacement; + m_stats.max += displacement; } } void TriangleMesh::translate(float x, float y, float z) { - if (x == 0.f && y == 0.f && z == 0.f) - return; - stl_translate_relative(&(this->stl), x, y, z); - stl_vertex shift(x, y, z); - for (stl_vertex& v : this->its.vertices) - v += shift; -} - -void TriangleMesh::translate(const Vec3f &displacement) -{ - translate(displacement(0), displacement(1), displacement(2)); + this->translate(Vec3f(x, y, z)); } void TriangleMesh::rotate(float angle, const Axis &axis) { - if (angle == 0.f) - return; - - // admesh uses degrees - angle = Slic3r::Geometry::rad2deg(angle); - - if (axis == X) { - stl_rotate_x(&this->stl, angle); - its_rotate_x(this->its, angle); - } else if (axis == Y) { - stl_rotate_y(&this->stl, angle); - its_rotate_y(this->its, angle); - } else if (axis == Z) { - stl_rotate_z(&this->stl, angle); - its_rotate_z(this->its, angle); + if (angle != 0.f) { + angle = Slic3r::Geometry::rad2deg(angle); + switch (axis) { + case X: its_rotate_x(this->its, angle); break; + case Y: its_rotate_y(this->its, angle); break; + case Z: its_rotate_z(this->its, angle); break; + default: assert(false); return; + } + update_bounding_box(this->its, this->m_stats); } } void TriangleMesh::rotate(float angle, const Vec3d& axis) { - if (angle == 0.f) - return; - - Vec3d axis_norm = axis.normalized(); - Transform3d m = Transform3d::Identity(); - m.rotate(Eigen::AngleAxisd(angle, axis_norm)); - stl_transform(&stl, m); - its_transform(its, m); + if (angle != 0.f) { + Vec3d axis_norm = axis.normalized(); + Transform3d m = Transform3d::Identity(); + m.rotate(Eigen::AngleAxisd(angle, axis_norm)); + its_transform(its, m); + update_bounding_box(this->its, this->m_stats); + } } -void TriangleMesh::mirror(const Axis &axis) +void TriangleMesh::mirror(const Axis axis) { - if (axis == X) { - stl_mirror_yz(&this->stl); + switch (axis) { + case X: + for (stl_vertex &v : its.vertices) + v.x() *= -1.f; + break; + case Y: + for (stl_vertex& v : this->its.vertices) + v.y() *= -1.0; + break; + case Z: for (stl_vertex &v : this->its.vertices) - v(0) *= -1.0; - } else if (axis == Y) { - stl_mirror_xz(&this->stl); - for (stl_vertex &v : this->its.vertices) - v(1) *= -1.0; - } else if (axis == Z) { - stl_mirror_xy(&this->stl); - for (stl_vertex &v : this->its.vertices) - v(2) *= -1.0; - } + v.z() *= -1.0; + break; + default: + assert(false); + return; + }; + its_flip_triangles(this->its); + int iaxis = int(axis); + std::swap(m_stats.min[iaxis], m_stats.max[iaxis]); + m_stats.min[iaxis] *= -1.0; + m_stats.max[iaxis] *= -1.0; } void TriangleMesh::transform(const Transform3d& t, bool fix_left_handed) { - stl_transform(&stl, t); its_transform(its, t); - if (fix_left_handed && t.matrix().block(0, 0, 3, 3).determinant() < 0.) { - // Left handed transformation is being applied. It is a good idea to flip the faces and their normals. - // As for the assert: the repair function would fix the normals, reversing would - // break them again. The caller should provide a mesh that does not need repair. - // The repair call is left here so things don't break more than they were. - assert(this->repaired); - this->repair(false); - stl_reverse_all_facets(&stl); - this->its.clear(); - this->require_shared_vertices(); + double det = t.matrix().block(0, 0, 3, 3).determinant(); + if (fix_left_handed && det < 0.) { + its_flip_triangles(its); + det = -det; } + m_stats.volume *= det; + update_bounding_box(this->its, this->m_stats); } void TriangleMesh::transform(const Matrix3d& m, bool fix_left_handed) { - stl_transform(&stl, m); its_transform(its, m); - if (fix_left_handed && m.determinant() < 0.) { - // See comments in function above. - assert(this->repaired); - this->repair(false); - stl_reverse_all_facets(&stl); - this->its.clear(); - this->require_shared_vertices(); + double det = m.block(0, 0, 3, 3).determinant(); + if (fix_left_handed && det < 0.) { + its_flip_triangles(its); + det = -det; } + m_stats.volume *= det; + update_bounding_box(this->its, this->m_stats); +} + +void TriangleMesh::flip_triangles() +{ + its_flip_triangles(its); + m_stats.volume = - m_stats.volume; } void TriangleMesh::align_to_origin() { - this->translate( - - this->stl.stats.min(0), - - this->stl.stats.min(1), - - this->stl.stats.min(2)); + this->translate(- m_stats.min(0), - m_stats.min(1), - m_stats.min(2)); } void TriangleMesh::rotate(double angle, Point* center) { - if (angle == 0.) - return; - Vec2f c = center->cast(); - this->translate(-c(0), -c(1), 0); - stl_rotate_z(&this->stl, (float)angle); - its_rotate_z(this->its, (float)angle); - this->translate(c(0), c(1), 0); + if (angle != 0.) { + Vec2f c = center->cast(); + this->translate(-c(0), -c(1), 0); + its_rotate_z(this->its, (float)angle); + this->translate(c(0), c(1), 0); + } } /** @@ -392,145 +374,36 @@ void TriangleMesh::rotate(double angle, Point* center) */ bool TriangleMesh::is_splittable() const { - std::vector visited; - find_unvisited_neighbors(visited); - - // Try finding an unvisited facet. If there are none, the mesh is not splittable. - auto it = std::find(visited.begin(), visited.end(), false); - return it != visited.end(); + return its_is_splittable(this->its); } -/** - * Visit all unvisited neighboring facets that are reachable from the first unvisited facet, - * and return them. - * - * @param facet_visited A reference to a vector of booleans. Contains whether or not a - * facet with the same index has been visited. - * @return A deque with all newly visited facets. - */ -std::deque TriangleMesh::find_unvisited_neighbors(std::vector &facet_visited) const +std::vector TriangleMesh::split() const { - // Make sure we're not operating on a broken mesh. - if (!this->repaired) - throw Slic3r::RuntimeError("find_unvisited_neighbors() requires repair()"); + std::vector itss = its_split(this->its); + std::vector out; + out.reserve(itss.size()); + for (indexed_triangle_set &m : itss) { + // The TriangleMesh constructor shall fill in the mesh statistics including volume. + out.emplace_back(std::move(m)); + if (TriangleMesh &triangle_mesh = out.back(); triangle_mesh.volume() < 0) + // Some source mesh parts may be incorrectly oriented. Correct them. + triangle_mesh.flip_triangles(); - // If the visited list is empty, populate it with false for every facet. - if (facet_visited.empty()) - facet_visited = std::vector(this->stl.stats.number_of_facets, false); - - // Find the first unvisited facet. - std::queue facet_queue; - std::deque facets; - auto facet = std::find(facet_visited.begin(), facet_visited.end(), false); - if (facet != facet_visited.end()) { - uint32_t idx = uint32_t(facet - facet_visited.begin()); - facet_queue.push(idx); - facet_visited[idx] = true; - facets.emplace_back(idx); } - - // Traverse all reachable neighbors and mark them as visited. - while (! facet_queue.empty()) { - uint32_t facet_idx = facet_queue.front(); - facet_queue.pop(); - for (int neighbor_idx : this->stl.neighbors_start[facet_idx].neighbor) - if (neighbor_idx != -1 && ! facet_visited[neighbor_idx]) { - facet_queue.push(uint32_t(neighbor_idx)); - facet_visited[neighbor_idx] = true; - facets.emplace_back(uint32_t(neighbor_idx)); - } - } - - return facets; -} - -/** - * Splits a mesh into multiple meshes when possible. - * - * @return A TriangleMeshPtrs with the newly created meshes. - */ -TriangleMeshPtrs TriangleMesh::split() const -{ - struct MeshAdder { - TriangleMeshPtrs &meshes; - MeshAdder(TriangleMeshPtrs &ptrs): meshes{ptrs} {} - void operator=(const indexed_triangle_set &its) - { - meshes.emplace_back(new TriangleMesh(its)); - } - }; - - TriangleMeshPtrs meshes; - if (has_shared_vertices()) { - its_split(its, MeshAdder{meshes}); - } else { - // Loop while we have remaining facets. - std::vector facet_visited; - for (;;) { - std::deque facets = find_unvisited_neighbors(facet_visited); - if (facets.empty()) - break; - - // Create a new mesh for the part that was just split off. - TriangleMesh* mesh = new TriangleMesh; - meshes.emplace_back(mesh); - mesh->stl.stats.type = inmemory; - mesh->stl.stats.number_of_facets = (uint32_t)facets.size(); - mesh->stl.stats.original_num_facets = mesh->stl.stats.number_of_facets; - stl_allocate(&mesh->stl); - - // Assign the facets to the new mesh. - bool first = true; - for (auto facet = facets.begin(); facet != facets.end(); ++ facet) { - mesh->stl.facet_start[facet - facets.begin()] = this->stl.facet_start[*facet]; - stl_facet_stats(&mesh->stl, this->stl.facet_start[*facet], first); - } - } - } - - return meshes; + return out; } void TriangleMesh::merge(const TriangleMesh &mesh) { - // reset stats and metadata - int number_of_facets = this->stl.stats.number_of_facets; - this->its.clear(); - this->repaired = false; - - // update facet count and allocate more memory - this->stl.stats.number_of_facets = number_of_facets + mesh.stl.stats.number_of_facets; - this->stl.stats.original_num_facets = this->stl.stats.number_of_facets; - stl_reallocate(&this->stl); - - // copy facets - for (uint32_t i = 0; i < mesh.stl.stats.number_of_facets; ++ i) - this->stl.facet_start[number_of_facets + i] = mesh.stl.facet_start[i]; - - // update size - stl_get_size(&this->stl); + its_merge(this->its, mesh.its); + m_stats = m_stats.merge(mesh.m_stats); } // Calculate projection of the mesh into the XY plane, in scaled coordinates. //FIXME This could be extremely slow! Use it for tiny meshes only! ExPolygons TriangleMesh::horizontal_projection() const { - ClipperLib::Paths paths; - Polygon p; - p.points.assign(3, Point()); - auto delta = scaled(0.01); - std::vector deltas { delta, delta, delta }; - paths.reserve(this->stl.stats.number_of_facets); - for (const stl_facet &facet : this->stl.facet_start) { - p.points[0] = Point::new_scale(facet.vertex[0](0), facet.vertex[0](1)); - p.points[1] = Point::new_scale(facet.vertex[1](0), facet.vertex[1](1)); - p.points[2] = Point::new_scale(facet.vertex[2](0), facet.vertex[2](1)); - p.make_counter_clockwise(); - paths.emplace_back(mittered_offset_path_scaled(p.points, deltas, 3.)); - } - - // the offset factor was tuned using groovemount.stl - return ClipperPaths_to_Slic3rExPolygons(paths); + return union_ex(project_mesh(this->its, Transform3d::Identity(), []() {})); } // 2D convex hull of a 3D mesh projected into the Z=0 plane. @@ -549,24 +422,16 @@ BoundingBoxf3 TriangleMesh::bounding_box() const { BoundingBoxf3 bb; bb.defined = true; - bb.min = this->stl.stats.min.cast(); - bb.max = this->stl.stats.max.cast(); + bb.min = m_stats.min.cast(); + bb.max = m_stats.max.cast(); return bb; } BoundingBoxf3 TriangleMesh::transformed_bounding_box(const Transform3d &trafo) const { BoundingBoxf3 bbox; - if (this->its.vertices.empty()) { - // Using the STL faces. - for (const stl_facet &facet : this->stl.facet_start) - for (size_t j = 0; j < 3; ++ j) - bbox.merge(trafo * facet.vertex[j].cast()); - } else { - // Using the shared vertices should be a bit quicker than using the STL faces. - for (const stl_vertex &v : this->its.vertices) - bbox.merge(trafo * v.cast()); - } + for (const stl_vertex &v : this->its.vertices) + bbox.merge(trafo * v.cast()); return bbox; } @@ -578,26 +443,16 @@ TriangleMesh TriangleMesh::convex_hull_3d() const std::vector src_vertices; try { - if (this->has_shared_vertices()) { #if REALfloat - qhull.runQhull("", 3, (int)this->its.vertices.size(), (const realT*)(this->its.vertices.front().data()), "Qt"); + qhull.runQhull("", 3, (int)this->its.vertices.size(), (const realT*)(this->its.vertices.front().data()), "Qt"); #else - src_vertices.reserve(this->its.vertices.size() * 3); - // We will now fill the vector with input points for computation: - for (const stl_vertex &v : this->its.vertices) - for (int i = 0; i < 3; ++ i) - src_vertices.emplace_back(v(i)); - qhull.runQhull("", 3, (int)src_vertices.size() / 3, src_vertices.data(), "Qt"); + src_vertices.reserve(this->its.vertices.size() * 3); + // We will now fill the vector with input points for computation: + for (const stl_vertex &v : this->its.vertices) + for (int i = 0; i < 3; ++ i) + src_vertices.emplace_back(v(i)); + qhull.runQhull("", 3, (int)src_vertices.size() / 3, src_vertices.data(), "Qt"); #endif - } else { - src_vertices.reserve(this->stl.facet_start.size() * 9); - // We will now fill the vector with input points for computation: - for (const stl_facet &f : this->stl.facet_start) - for (int i = 0; i < 3; ++ i) - for (int j = 0; j < 3; ++ j) - src_vertices.emplace_back(f.vertex[i](j)); - qhull.runQhull("", 3, (int)src_vertices.size() / 3, src_vertices.data(), "Qt"); - } } catch (...) { @@ -606,84 +461,77 @@ TriangleMesh TriangleMesh::convex_hull_3d() const } // Let's collect results: - Pointf3s dst_vertices; - std::vector facets; - auto facet_list = qhull.facetList().toStdVector(); - for (const orgQhull::QhullFacet& facet : facet_list) - { // iterate through facets - orgQhull::QhullVertexSet vertices = facet.vertices(); - for (int i = 0; i < 3; ++i) - { // iterate through facet's vertices - - orgQhull::QhullPoint p = vertices[i].point(); - const auto* coords = p.coordinates(); - dst_vertices.emplace_back(coords[0], coords[1], coords[2]); + std::vector dst_vertices; + std::vector dst_facets; + // Map of QHull's vertex ID to our own vertex ID (pointing to dst_vertices). + std::vector map_dst_vertices; +#ifndef NDEBUG + Vec3f centroid = Vec3f::Zero(); + for (const stl_vertex& pt : this->its.vertices) + centroid += pt; + centroid /= float(this->its.vertices.size()); +#endif // NDEBUG + for (const orgQhull::QhullFacet facet : qhull.facetList()) { + // Collect face vertices first, allocate unique vertices in dst_vertices based on QHull's vertex ID. + Vec3i indices; + int cnt = 0; + for (const orgQhull::QhullVertex vertex : facet.vertices()) { + int id = vertex.id(); + assert(id >= 0); + if (id >= int(map_dst_vertices.size())) + map_dst_vertices.resize(next_highest_power_of_2(size_t(id + 1)), -1); + if (int i = map_dst_vertices[id]; i == -1) { + // Allocate a new vertex. + i = int(dst_vertices.size()); + map_dst_vertices[id] = i; + orgQhull::QhullPoint pt(vertex.point()); + dst_vertices.emplace_back(pt[0], pt[1], pt[2]); + indices[cnt] = i; + } else { + // Reuse existing vertex. + indices[cnt] = i; + } + if (cnt ++ == 3) + break; + } + assert(cnt == 3); + if (cnt == 3) { + // QHull sorts vertices of a face lexicographically by their IDs, not by face normals. + // Calculate face normal based on the order of vertices. + Vec3f n = (dst_vertices[indices(1)] - dst_vertices[indices(0)]).cross(dst_vertices[indices(2)] - dst_vertices[indices(1)]); + auto *n2 = facet.getBaseT()->normal; + auto d = n.x() * n2[0] + n.y() * n2[1] + n.z() * n2[2]; +#ifndef NDEBUG + Vec3f n3 = (dst_vertices[indices(0)] - centroid); + auto d3 = n.dot(n3); + assert((d < 0.f) == (d3 < 0.f)); +#endif // NDEBUG + // Get the face normal from QHull. + if (d < 0.f) + // Fix face orientation. + std::swap(indices[1], indices[2]); + dst_facets.emplace_back(indices); } - unsigned int size = (unsigned int)dst_vertices.size(); - facets.emplace_back(size - 3, size - 2, size - 1); } - TriangleMesh output_mesh(dst_vertices, facets); - output_mesh.repair(); - return output_mesh; + TriangleMesh mesh{ std::move(dst_vertices), std::move(dst_facets) }; + assert(mesh.stats().manifold()); + return mesh; } std::vector TriangleMesh::slice(const std::vector &z) const { // convert doubles to floats std::vector z_f(z.begin(), z.end()); - assert(this->has_shared_vertices()); return slice_mesh_ex(this->its, z_f, 0.0004f); } -void TriangleMesh::require_shared_vertices() -{ - BOOST_LOG_TRIVIAL(trace) << "TriangleMeshSlicer::require_shared_vertices - start"; - assert(stl_validate(&this->stl)); - if (! this->repaired) - this->repair(); - if (this->its.vertices.empty()) { - BOOST_LOG_TRIVIAL(trace) << "TriangleMeshSlicer::require_shared_vertices - stl_generate_shared_vertices"; - stl_generate_shared_vertices(&this->stl, this->its); - } - assert(stl_validate(&this->stl, this->its)); - BOOST_LOG_TRIVIAL(trace) << "TriangleMeshSlicer::require_shared_vertices - end"; -} - size_t TriangleMesh::memsize() const { - size_t memsize = 8 + this->stl.memsize() + this->its.memsize(); + size_t memsize = 8 + this->its.memsize() + sizeof(this->m_stats); return memsize; } -// Release optional data from the mesh if the object is on the Undo / Redo stack only. Returns the amount of memory released. -size_t TriangleMesh::release_optional() -{ - size_t memsize_released = sizeof(stl_neighbors) * this->stl.neighbors_start.size() + this->its.memsize(); - // The indexed triangle set may be recalculated using the stl_generate_shared_vertices() function. - this->its.clear(); - // The neighbors structure may be recalculated using the stl_check_facets_exact() function. - this->stl.neighbors_start.clear(); - return memsize_released; -} - -// Restore optional data possibly released by release_optional(). -void TriangleMesh::restore_optional() -{ - if (! this->stl.facet_start.empty()) { - // Save the old stats before calling stl_check_faces_exact, as it may modify the statistics. - stl_stats stats = this->stl.stats; - if (this->stl.neighbors_start.empty()) { - stl_reallocate(&this->stl); - stl_check_facets_exact(&this->stl); - } - if (this->its.vertices.empty()) - stl_generate_shared_vertices(&this->stl, this->its); - // Restore the old statistics. - this->stl.stats = stats; - } -} - // Create a mapping from triangle edge into face. struct EdgeToFace { // Index of the 1st vertex of the triangle edge. vertex_low <= vertex_high. @@ -1059,21 +907,32 @@ Polygon its_convex_hull_2d_above(const indexed_triangle_set &its, const Transfor indexed_triangle_set its_make_cube(double xd, double yd, double zd) { auto x = float(xd), y = float(yd), z = float(zd); - indexed_triangle_set mesh; - mesh.vertices = {{x, y, 0}, {x, 0, 0}, {0, 0, 0}, {0, y, 0}, - {x, y, z}, {0, y, z}, {0, 0, z}, {x, 0, z}}; - mesh.indices = {{0, 1, 2}, {0, 2, 3}, {4, 5, 6}, {4, 6, 7}, - {0, 4, 7}, {0, 7, 1}, {1, 7, 6}, {1, 6, 2}, - {2, 6, 5}, {2, 5, 3}, {4, 0, 3}, {4, 3, 5}}; - - return mesh; + return { + { {0, 1, 2}, {0, 2, 3}, {4, 5, 6}, {4, 6, 7}, + {0, 4, 7}, {0, 7, 1}, {1, 7, 6}, {1, 6, 2}, + {2, 6, 5}, {2, 5, 3}, {4, 0, 3}, {4, 3, 5} }, + { {x, y, 0}, {x, 0, 0}, {0, 0, 0}, {0, y, 0}, + {x, y, z}, {0, y, z}, {0, 0, z}, {x, 0, z} } + }; } -TriangleMesh make_cube(double x, double y, double z) +indexed_triangle_set its_make_prism(float width, float length, float height) { - TriangleMesh mesh(its_make_cube(x, y, z)); - mesh.repair(); - return mesh; + // We need two upward facing triangles + float x = width / 2.f, y = length / 2.f; + return { + { + {0, 1, 2}, // side 1 + {4, 3, 5}, // side 2 + {1, 4, 2}, {2, 4, 5}, // roof 1 + {0, 2, 5}, {0, 5, 3}, // roof 2 + {3, 4, 1}, {3, 1, 0} // bottom + }, + { + {-x, -y, 0.f}, {x, -y, 0.f}, {0.f, -y, height}, + {-x, y, 0.f}, {x, y, 0.f}, {0.f, y, height}, + } + }; } // Generate the mesh for a cylinder and return it, using @@ -1121,23 +980,17 @@ indexed_triangle_set its_make_cylinder(double r, double h, double fa) return mesh; } -TriangleMesh make_cylinder(double r, double h, double fa) +indexed_triangle_set its_make_cone(double r, double h, double fa) { - TriangleMesh mesh{its_make_cylinder(r, h, fa)}; - mesh.repair(); + indexed_triangle_set mesh; + auto& vertices = mesh.vertices; + auto& facets = mesh.indices; + vertices.reserve(3 + 2 * size_t(2 * PI / fa)); - return mesh; -} + // base center and top vertex + vertices.emplace_back(Vec3f::Zero()); + vertices.emplace_back(Vec3f(0., 0., h)); - -TriangleMesh make_cone(double r, double h, double fa) -{ - Pointf3s vertices; - std::vector facets; - vertices.reserve(3+size_t(2*PI/fa)); - vertices.reserve(3+2*size_t(2*PI/fa)); - - vertices = { Vec3d::Zero(), Vec3d(0., 0., h) }; // base center and top vertex size_t i = 0; for (double angle=0; angle<2*PI; angle+=fa) { vertices.emplace_back(r*std::cos(angle), r*std::sin(angle), 0.); @@ -1150,11 +1003,27 @@ TriangleMesh make_cone(double r, double h, double fa) facets.emplace_back(0, 2, i+1); // close the shape facets.emplace_back(1, i+1, 2); - TriangleMesh mesh(std::move(vertices), std::move(facets)); - mesh.repair(); return mesh; } +indexed_triangle_set its_make_pyramid(float base, float height) +{ + float a = base / 2.f; + return { + { + {0, 1, 2}, + {0, 2, 3}, + {0, 1, 4}, + {1, 2, 4}, + {2, 3, 4}, + {3, 0, 4} + }, + { + {-a, -a, 0}, {a, -a, 0}, {a, a, 0}, + {-a, a, 0}, {0.f, 0.f, height} + } + }; +} // Generates mesh for a sphere centered about the origin, using the generated angle // to determine the granularity. @@ -1214,12 +1083,10 @@ indexed_triangle_set its_make_sphere(double radius, double fa) return mesh; } -TriangleMesh make_sphere(double radius, double fa) +void its_reverse_all_facets(indexed_triangle_set &its) { - TriangleMesh mesh(its_make_sphere(radius, fa)); - mesh.repair(); - - return mesh; + for (stl_triangle_vertex_indices &face : its.indices) + std::swap(face[0], face[1]); } void its_merge(indexed_triangle_set &A, const indexed_triangle_set &B) @@ -1295,10 +1162,40 @@ std::vector its_split(const indexed_triangle_set &its) return its_split<>(its); } +// Number of disconnected patches (faces are connected if they share an edge, shared edge defined with 2 shared vertex indices). +bool its_number_of_patches(const indexed_triangle_set &its) +{ + return its_number_of_patches<>(its); +} +bool its_number_of_patches(const indexed_triangle_set &its, const std::vector &face_neighbors) +{ + return its_number_of_patches<>(ItsNeighborsWrapper{ its, face_neighbors }); +} + +// Same as its_number_of_patches(its) > 1, but faster. bool its_is_splittable(const indexed_triangle_set &its) { return its_is_splittable<>(its); } +bool its_is_splittable(const indexed_triangle_set &its, const std::vector &face_neighbors) +{ + return its_is_splittable<>(ItsNeighborsWrapper{ its, face_neighbors }); +} + +size_t its_num_open_edges(const std::vector &face_neighbors) +{ + size_t num_open_edges = 0; + for (Vec3i neighbors : face_neighbors) + for (int n : neighbors) + if (n < 0) + ++ num_open_edges; + return num_open_edges; +} + +size_t its_num_open_edges(const indexed_triangle_set &its) +{ + return its_num_open_edges(its_face_neighbors(its)); +} void VertexFaceIndex::create(const indexed_triangle_set &its) { @@ -1335,4 +1232,88 @@ std::vector its_face_neighbors_par(const indexed_triangle_set &its) return create_face_neighbors_index(ex_tbb, its); } +std::vector its_face_normals(const indexed_triangle_set &its) +{ + std::vector normals; + normals.reserve(its.indices.size()); + for (stl_triangle_vertex_indices face : its.indices) + normals.push_back(its_face_normal(its, face)); + return normals; +} + +#if BOOST_ENDIAN_LITTLE_BYTE +static inline void big_endian_reverse_quads(char*, size_t) {} +#else // BOOST_ENDIAN_LITTLE_BYTE +static inline void big_endian_reverse_quads(char *buf, size_t cnt) +{ + for (size_t i = 0; i < cnt; i += 4) { + std::swap(buf[i], buf[i+3]); + std::swap(buf[i+1], buf[i+2]); + } +} +#endif // BOOST_ENDIAN_LITTLE_BYTE + +bool its_write_stl_ascii(const char *file, const char *label, const std::vector &indices, const std::vector &vertices) +{ + FILE *fp = boost::nowide::fopen(file, "w"); + if (fp == nullptr) { + BOOST_LOG_TRIVIAL(error) << "its_write_stl_ascii: Couldn't open " << file << " for writing"; + return false; + } + + fprintf(fp, "solid %s\n", label); + + for (const stl_triangle_vertex_indices& face : indices) { + Vec3f vertex[3] = { vertices[face(0)], vertices[face(1)], vertices[face(2)] }; + Vec3f normal = (vertex[1] - vertex[0]).cross(vertex[2] - vertex[1]).normalized(); + fprintf(fp, " facet normal % .8E % .8E % .8E\n", normal(0), normal(1), normal(2)); + fprintf(fp, " outer loop\n"); + fprintf(fp, " vertex % .8E % .8E % .8E\n", vertex[0](0), vertex[0](1), vertex[0](2)); + fprintf(fp, " vertex % .8E % .8E % .8E\n", vertex[1](0), vertex[1](1), vertex[1](2)); + fprintf(fp, " vertex % .8E % .8E % .8E\n", vertex[2](0), vertex[2](1), vertex[2](2)); + fprintf(fp, " endloop\n"); + fprintf(fp, " endfacet\n"); + } + + fprintf(fp, "endsolid %s\n", label); + fclose(fp); + return true; +} + +bool its_write_stl_binary(const char *file, const char *label, const std::vector &indices, const std::vector &vertices) +{ + FILE *fp = boost::nowide::fopen(file, "wb"); + if (fp == nullptr) { + BOOST_LOG_TRIVIAL(error) << "its_write_stl_binary: Couldn't open " << file << " for writing"; + return false; + } + + { + static constexpr const int header_size = 80; + std::vector header(header_size, 0); + if (int header_len = std::min((label == nullptr) ? 0 : int(strlen(label)), header_size); header_len > 0) + ::memcpy(header.data(), label, header_len); + ::fwrite(header.data(), header_size, 1, fp); + } + + uint32_t nfaces = indices.size(); + big_endian_reverse_quads(reinterpret_cast(&nfaces), 4); + ::fwrite(&nfaces, 4, 1, fp); + + stl_facet f; + f.extra[0] = 0; + f.extra[1] = 0; + for (const stl_triangle_vertex_indices& face : indices) { + f.vertex[0] = vertices[face(0)]; + f.vertex[1] = vertices[face(1)]; + f.vertex[2] = vertices[face(2)]; + f.normal = (f.vertex[1] - f.vertex[0]).cross(f.vertex[2] - f.vertex[1]).normalized(); + big_endian_reverse_quads(reinterpret_cast(&f), 48); + fwrite(&f, 50, 1, fp); + } + + fclose(fp); + return true; +} + } // namespace Slic3r diff --git a/src/libslic3r/TriangleMesh.hpp b/src/libslic3r/TriangleMesh.hpp index c463af5a2..5223631c0 100644 --- a/src/libslic3r/TriangleMesh.hpp +++ b/src/libslic3r/TriangleMesh.hpp @@ -15,25 +15,91 @@ namespace Slic3r { class TriangleMesh; class TriangleMeshSlicer; -typedef std::vector TriangleMeshPtrs; + +struct RepairedMeshErrors { + // How many edges were united by merging their end points with some other end points in epsilon neighborhood? + int edges_fixed = 0; + // How many degenerate faces were removed? + int degenerate_facets = 0; + // How many faces were removed during fixing? Includes degenerate_faces and disconnected faces. + int facets_removed = 0; + // New faces could only be created with stl_fill_holes() and we ditched stl_fill_holes(), because mostly it does more harm than good. + //int facets_added = 0; + // How many facets were revesed? Faces are reversed by admesh while it connects patches of triangles togeter and a flipped triangle is encountered. + // Also the facets are reversed when a negative volume is corrected by flipping all facets. + int facets_reversed = 0; + // Edges shared by two triangles, oriented incorrectly. + int backwards_edges = 0; + + void clear() { *this = RepairedMeshErrors(); } + + void merge(const RepairedMeshErrors& rhs) { + this->edges_fixed += rhs.edges_fixed; + this->degenerate_facets += rhs.degenerate_facets; + this->facets_removed += rhs.facets_removed; + this->facets_reversed += rhs.facets_reversed; + this->backwards_edges += rhs.backwards_edges; + } + + bool repaired() const { return degenerate_facets > 0 || edges_fixed > 0 || facets_removed > 0 || facets_reversed > 0 || backwards_edges > 0; } +}; + +struct TriangleMeshStats { + // Mesh metrics. + uint32_t number_of_facets = 0; + stl_vertex max = stl_vertex::Zero(); + stl_vertex min = stl_vertex::Zero(); + stl_vertex size = stl_vertex::Zero(); + float volume = -1.f; + int number_of_parts = 0; + + // Mesh errors, remaining. + int open_edges = 0; + + // Mesh errors, fixed. + RepairedMeshErrors repaired_errors; + + void clear() { *this = TriangleMeshStats(); } + + TriangleMeshStats merge(const TriangleMeshStats &rhs) const { + if (this->number_of_facets == 0) + return rhs; + else if (rhs.number_of_facets == 0) + return *this; + else { + TriangleMeshStats out; + out.number_of_facets = this->number_of_facets + rhs.number_of_facets; + out.min = this->min.cwiseMin(rhs.min); + out.max = this->max.cwiseMax(rhs.max); + out.size = out.max - out.min; + out.number_of_parts = this->number_of_parts + rhs.number_of_parts; + out.open_edges = this->open_edges + rhs.open_edges; + out.volume = this->volume + rhs.volume; + out.repaired_errors.merge(rhs.repaired_errors); + return out; + } + } + + bool manifold() const { return open_edges == 0; } + bool repaired() const { return repaired_errors.repaired(); } +}; class TriangleMesh { public: - TriangleMesh() : repaired(false) {} - TriangleMesh(const Pointf3s &points, const std::vector &facets); + TriangleMesh() = default; + TriangleMesh(const std::vector &vertices, const std::vector &faces); + TriangleMesh(std::vector &&vertices, const std::vector &&faces); explicit TriangleMesh(const indexed_triangle_set &M); - void clear() { this->stl.clear(); this->its.clear(); this->repaired = false; } - bool ReadSTLFile(const char* input_file) { return stl_open(&stl, input_file); } - bool write_ascii(const char* output_file) { return stl_write_ascii(&this->stl, output_file, ""); } - bool write_binary(const char* output_file) { return stl_write_binary(&this->stl, output_file, ""); } - void repair(bool update_shared_vertices = true); + explicit TriangleMesh(indexed_triangle_set &&M, const RepairedMeshErrors& repaired_errors = RepairedMeshErrors()); + void clear() { this->its.clear(); this->m_stats.clear(); } + bool ReadSTLFile(const char* input_file, bool repair = true); + bool write_ascii(const char* output_file); + bool write_binary(const char* output_file); float volume(); - void check_topology(); - bool is_manifold() const { return this->stl.stats.connected_facets_3_edge == (int)this->stl.stats.number_of_facets; } void WriteOBJFile(const char* output_file) const; void scale(float factor); - void scale(const Vec3d &versor); + void scale(const Vec3f &versor); void translate(float x, float y, float z); void translate(const Vec3f &displacement); void rotate(float angle, const Axis &axis); @@ -41,51 +107,52 @@ public: void rotate_x(float angle) { this->rotate(angle, X); } void rotate_y(float angle) { this->rotate(angle, Y); } void rotate_z(float angle) { this->rotate(angle, Z); } - void mirror(const Axis &axis); + void mirror(const Axis axis); void mirror_x() { this->mirror(X); } void mirror_y() { this->mirror(Y); } void mirror_z() { this->mirror(Z); } void transform(const Transform3d& t, bool fix_left_handed = false); void transform(const Matrix3d& t, bool fix_left_handed = false); + // Flip triangles, negate volume. + void flip_triangles(); void align_to_origin(); void rotate(double angle, Point* center); - TriangleMeshPtrs split() const; + std::vector split() const; void merge(const TriangleMesh &mesh); ExPolygons horizontal_projection() const; - const float* first_vertex() const { return this->stl.facet_start.empty() ? nullptr : &this->stl.facet_start.front().vertex[0](0); } // 2D convex hull of a 3D mesh projected into the Z=0 plane. Polygon convex_hull(); BoundingBoxf3 bounding_box() const; // Returns the bbox of this TriangleMesh transformed by the given transformation BoundingBoxf3 transformed_bounding_box(const Transform3d &trafo) const; // Return the size of the mesh in coordinates. - Vec3d size() const { return stl.stats.size.cast(); } + Vec3d size() const { return m_stats.size.cast(); } /// Return the center of the related bounding box. Vec3d center() const { return this->bounding_box().center(); } // Returns the convex hull of this TriangleMesh TriangleMesh convex_hull_3d() const; // Slice this mesh at the provided Z levels and return the vector std::vector slice(const std::vector& z) const; - void reset_repair_stats(); - bool needed_repair() const; - void require_shared_vertices(); - bool has_shared_vertices() const { return ! this->its.vertices.empty(); } - size_t facets_count() const { return this->stl.stats.number_of_facets; } + size_t facets_count() const { assert(m_stats.number_of_facets == this->its.indices.size()); return m_stats.number_of_facets; } bool empty() const { return this->facets_count() == 0; } - bool is_splittable() const; + bool repaired() const; + bool is_splittable() const; // Estimate of the memory occupied by this structure, important for keeping an eye on the Undo / Redo stack allocation. size_t memsize() const; - // Release optional data from the mesh if the object is on the Undo / Redo stack only. Returns the amount of memory released. - size_t release_optional(); - // Restore optional data possibly released by release_optional(). - void restore_optional(); - stl_file stl; + // Used by the Undo / Redo stack, legacy interface. As of now there is nothing cached at TriangleMesh, + // but we may decide to cache some data in the future (for example normals), thus we keep the interface in place. + // Release optional data from the mesh if the object is on the Undo / Redo stack only. Returns the amount of memory released. + size_t release_optional() { return 0; } + // Restore optional data possibly released by release_optional(). + void restore_optional() {} + + const TriangleMeshStats& stats() const { return m_stats; } + indexed_triangle_set its; - bool repaired; private: - std::deque find_unvisited_neighbors(std::vector &facet_visited) const; + TriangleMeshStats m_stats; }; // Index of face indices incident with a vertex index. @@ -145,8 +212,18 @@ bool its_store_triangle(const indexed_triangle_set &its, const char *obj_filenam bool its_store_triangles(const indexed_triangle_set &its, const char *obj_filename, const std::vector& triangles); std::vector its_split(const indexed_triangle_set &its); +std::vector its_split(const indexed_triangle_set &its, std::vector &face_neighbors); +// Number of disconnected patches (faces are connected if they share an edge, shared edge defined with 2 shared vertex indices). +bool its_number_of_patches(const indexed_triangle_set &its); +bool its_number_of_patches(const indexed_triangle_set &its, const std::vector &face_neighbors); +// Same as its_number_of_patches(its) > 1, but faster. bool its_is_splittable(const indexed_triangle_set &its); +bool its_is_splittable(const indexed_triangle_set &its, const std::vector &face_neighbors); + +// Calculate number of unconnected face edges. There should be no unconnected edge in a manifold mesh. +size_t its_num_open_edges(const indexed_triangle_set &its); +size_t its_num_open_edges(const std::vector &face_neighbors); // Shrink the vectors of its.vertices and its.faces to a minimum size by reallocating the two vectors. void its_shrink_to_fit(indexed_triangle_set &its); @@ -205,16 +282,32 @@ void its_merge(indexed_triangle_set &A, const indexed_triangle_set &B); void its_merge(indexed_triangle_set &A, const std::vector &triangles); void its_merge(indexed_triangle_set &A, const Pointf3s &triangles); -indexed_triangle_set its_make_cube(double x, double y, double z); -TriangleMesh make_cube(double x, double y, double z); +std::vector its_face_normals(const indexed_triangle_set &its); +inline Vec3f face_normal(const stl_vertex vertex[3]) { return (vertex[1] - vertex[0]).cross(vertex[2] - vertex[1]).normalized(); } +inline Vec3f face_normal_normalized(const stl_vertex vertex[3]) { return face_normal(vertex).normalized(); } +inline Vec3f its_face_normal(const indexed_triangle_set &its, const stl_triangle_vertex_indices face) + { const stl_vertex vertices[3] { its.vertices[face[0]], its.vertices[face[1]], its.vertices[face[2]] }; return face_normal_normalized(vertices); } +inline Vec3f its_face_normal(const indexed_triangle_set &its, const int face_idx) + { return its_face_normal(its, its.indices[face_idx]); } -// Generate a TriangleMesh of a cylinder -indexed_triangle_set its_make_cylinder(double r, double h, double fa=(2*PI/360)); -TriangleMesh make_cylinder(double r, double h, double fa=(2*PI/360)); +indexed_triangle_set its_make_cube(double x, double y, double z); +indexed_triangle_set its_make_prism(float width, float length, float height); +indexed_triangle_set its_make_cylinder(double r, double h, double fa=(2*PI/360)); +indexed_triangle_set its_make_cone(double r, double h, double fa=(2*PI/360)); +indexed_triangle_set its_make_pyramid(float base, float height); +indexed_triangle_set its_make_sphere(double radius, double fa); -indexed_triangle_set its_make_sphere(double rho, double fa=(2*PI/360)); -TriangleMesh make_cone(double r, double h, double fa=(2*PI/360)); -TriangleMesh make_sphere(double rho, double fa=(2*PI/360)); +inline TriangleMesh make_cube(double x, double y, double z) { return TriangleMesh(its_make_cube(x, y, z)); } +inline TriangleMesh make_prism(float width, float length, float height) { return TriangleMesh(its_make_prism(width, length, height)); } +inline TriangleMesh make_cylinder(double r, double h, double fa=(2*PI/360)) { return TriangleMesh{its_make_cylinder(r, h, fa)}; } +inline TriangleMesh make_cone(double r, double h, double fa=(2*PI/360)) { return TriangleMesh(its_make_cone(r, h, fa)); } +inline TriangleMesh make_pyramid(float base, float height) { return TriangleMesh(its_make_pyramid(base, height)); } +inline TriangleMesh make_sphere(double rho, double fa=(2*PI/360)) { return TriangleMesh(its_make_sphere(rho, fa)); } + +bool its_write_stl_ascii(const char *file, const char *label, const std::vector &indices, const std::vector &vertices); +inline bool its_write_stl_ascii(const char *file, const char *label, const indexed_triangle_set &its) { return its_write_stl_ascii(file, label, its.indices, its.vertices); } +bool its_write_stl_binary(const char *file, const char *label, const std::vector &indices, const std::vector &vertices); +inline bool its_write_stl_binary(const char *file, const char *label, const indexed_triangle_set &its) { return its_write_stl_binary(file, label, its.indices, its.vertices); } inline BoundingBoxf3 bounding_box(const TriangleMesh &m) { return m.bounding_box(); } inline BoundingBoxf3 bounding_box(const indexed_triangle_set& its) @@ -239,18 +332,12 @@ inline BoundingBoxf3 bounding_box(const indexed_triangle_set& its) namespace cereal { template struct specialize {}; template void load(Archive &archive, Slic3r::TriangleMesh &mesh) { - stl_file &stl = mesh.stl; - stl.stats.type = inmemory; - archive(stl.stats.number_of_facets, stl.stats.original_num_facets); - stl_allocate(&stl); - archive.loadBinary((char*)stl.facet_start.data(), stl.facet_start.size() * 50); - stl_get_size(&stl); - mesh.repair(); + archive.loadBinary(reinterpret_cast(const_cast(&mesh.stats())), sizeof(Slic3r::TriangleMeshStats)); + archive(mesh.its.indices, mesh.its.vertices); } template void save(Archive &archive, const Slic3r::TriangleMesh &mesh) { - const stl_file& stl = mesh.stl; - archive(stl.stats.number_of_facets, stl.stats.original_num_facets); - archive.saveBinary((char*)stl.facet_start.data(), stl.facet_start.size() * 50); + archive.saveBinary(reinterpret_cast(&mesh.stats()), sizeof(Slic3r::TriangleMeshStats)); + archive(mesh.its.indices, mesh.its.vertices); } } diff --git a/src/libslic3r/TriangleMeshSlicer.cpp b/src/libslic3r/TriangleMeshSlicer.cpp index aa2763968..d3c9a49b5 100644 --- a/src/libslic3r/TriangleMeshSlicer.cpp +++ b/src/libslic3r/TriangleMeshSlicer.cpp @@ -1967,7 +1967,8 @@ static void triangulate_slice( int num_original_vertices, // Z height of the slice. float z, - bool triangulate) + bool triangulate, + bool normals_down) { sort_remove_duplicates(slice_vertices); @@ -1988,7 +1989,7 @@ static void triangulate_slice( std::vector map_duplicate_vertex(int(its.vertices.size()) - num_original_vertices, -1); int i = 0; int k = 0; - for (; i < int(map_vertex_to_index.size()); ++ i) { + for (; i < int(map_vertex_to_index.size());) { map_vertex_to_index[k ++] = map_vertex_to_index[i]; const Vec2f &ipos = map_vertex_to_index[i].first; const int iidx = map_vertex_to_index[i].second; @@ -2003,6 +2004,7 @@ static void triangulate_slice( // map to the first vertex map_duplicate_vertex[jidx - num_original_vertices] = iidx; } + i = j; } map_vertex_to_index.erase(map_vertex_to_index.begin() + k, map_vertex_to_index.end()); for (stl_triangle_vertex_indices &f : its.indices) @@ -2013,7 +2015,7 @@ static void triangulate_slice( if (triangulate) { size_t idx_vertex_new_first = its.vertices.size(); - Pointf3s triangles = triangulate_expolygons_3d(make_expolygons_simple(lines), z, true); + Pointf3s triangles = triangulate_expolygons_3d(make_expolygons_simple(lines), z, normals_down); for (size_t i = 0; i < triangles.size(); ) { stl_triangle_vertex_indices facet; for (size_t j = 0; j < 3; ++ j) { @@ -2049,6 +2051,33 @@ static void triangulate_slice( // its_remove_degenerate_faces(its); } +void project_mesh( + const indexed_triangle_set &mesh, + const Transform3d &trafo, + Polygons *out_top, + Polygons *out_bottom, + std::function throw_on_cancel) +{ + std::vector top, bottom; + std::vector zs { -1e10, 1e10 }; + slice_mesh_slabs(mesh, zs, trafo, out_top ? &top : nullptr, out_bottom ? &bottom : nullptr, throw_on_cancel); + if (out_top) + *out_top = std::move(top.front()); + if (out_bottom) + *out_bottom = std::move(bottom.back()); +} + +Polygons project_mesh( + const indexed_triangle_set &mesh, + const Transform3d &trafo, + std::function throw_on_cancel) +{ + std::vector top, bottom; + std::vector zs { -1e10, 1e10 }; + slice_mesh_slabs(mesh, zs, trafo, &top, &bottom, throw_on_cancel); + return union_(top.front(), bottom.back()); +} + void cut_mesh(const indexed_triangle_set &mesh, float z, indexed_triangle_set *upper, indexed_triangle_set *lower, bool triangulate_caps) { assert(upper || lower); @@ -2069,6 +2098,10 @@ void cut_mesh(const indexed_triangle_set &mesh, float z, indexed_triangle_set *u lower->indices.reserve(mesh.indices.size()); } +#ifndef NDEBUG + size_t num_open_edges_old = triangulate_caps ? its_num_open_edges(mesh) : 0; +#endif // NDEBUG + // To triangulate the caps after slicing. IntersectionLines upper_lines, lower_lines; std::vector upper_slice_vertices, lower_slice_vertices; @@ -2135,13 +2168,14 @@ void cut_mesh(const indexed_triangle_set &mesh, float z, indexed_triangle_set *u // get vertices starting from the isolated one int iv = isolated_vertex; stl_vertex v0v1, v2v0; - assert(facets_edge_ids[facet_idx](iv) == line.edge_a_id ||facets_edge_ids[facet_idx](iv) == line.edge_b_id); + assert(facets_edge_ids[facet_idx](iv) == line.edge_a_id || facets_edge_ids[facet_idx](iv) == line.edge_b_id); if (facets_edge_ids[facet_idx](iv) == line.edge_a_id) { - v0v1 = to_3d(unscaled(line.a), z); - v2v0 = to_3d(unscaled(line.b), z); + // Unscale to doubles first, then to floats to reach the same accuracy as triangulate_expolygons_2d(). + v0v1 = to_3d(unscaled(line.a).cast().eval(), z); + v2v0 = to_3d(unscaled(line.b).cast().eval(), z); } else { - v0v1 = to_3d(unscaled(line.b), z); - v2v0 = to_3d(unscaled(line.a), z); + v0v1 = to_3d(unscaled(line.b).cast().eval(), z); + v2v0 = to_3d(unscaled(line.a).cast().eval(), z); } const stl_vertex &v0 = vertices[iv]; const int iv0 = facet[iv]; @@ -2195,11 +2229,25 @@ void cut_mesh(const indexed_triangle_set &mesh, float z, indexed_triangle_set *u } } - if (upper != nullptr) - triangulate_slice(*upper, upper_lines, upper_slice_vertices, int(mesh.vertices.size()), z, triangulate_caps); + if (upper != nullptr) { + triangulate_slice(*upper, upper_lines, upper_slice_vertices, int(mesh.vertices.size()), z, triangulate_caps, NORMALS_DOWN); +#ifndef NDEBUG + if (triangulate_caps) { + size_t num_open_edges_new = its_num_open_edges(*upper); + assert(num_open_edges_new <= num_open_edges_old); + } +#endif // NDEBUG + } - if (lower != nullptr) - triangulate_slice(*lower, lower_lines, lower_slice_vertices, int(mesh.vertices.size()), z, triangulate_caps); + if (lower != nullptr) { + triangulate_slice(*lower, lower_lines, lower_slice_vertices, int(mesh.vertices.size()), z, triangulate_caps, NORMALS_UP); +#ifndef NDEBUG + if (triangulate_caps) { + size_t num_open_edges_new = its_num_open_edges(*lower); + assert(num_open_edges_new <= num_open_edges_old); + } +#endif // NDEBUG + } } -} +} // namespace Slic3r diff --git a/src/libslic3r/TriangleMeshSlicer.hpp b/src/libslic3r/TriangleMeshSlicer.hpp index 7ea7ac3a9..5e08b58e7 100644 --- a/src/libslic3r/TriangleMeshSlicer.hpp +++ b/src/libslic3r/TriangleMeshSlicer.hpp @@ -98,7 +98,21 @@ void slice_mesh_slabs( std::vector *out_bottom, std::function throw_on_cancel); -void cut_mesh( +// Project mesh upwards pointing surfaces / downwards pointing surfaces into 2D polygons. +void project_mesh( + const indexed_triangle_set &mesh, + const Transform3d &trafo, + Polygons *out_top, + Polygons *out_bottom, + std::function throw_on_cancel); + +// Project mesh into 2D polygons. +Polygons project_mesh( + const indexed_triangle_set &mesh, + const Transform3d &trafo, + std::function throw_on_cancel); + +void cut_mesh( const indexed_triangle_set &mesh, float z, indexed_triangle_set *upper, diff --git a/src/libslic3r/TriangleSelector.cpp b/src/libslic3r/TriangleSelector.cpp index 6178bcec8..987ef1c0a 100644 --- a/src/libslic3r/TriangleSelector.cpp +++ b/src/libslic3r/TriangleSelector.cpp @@ -9,16 +9,6 @@ namespace Slic3r { -static inline Vec3i root_neighbors(const TriangleMesh &mesh, int triangle_id) -{ - Vec3i neighbors; - const stl_neighbors& neighbors_src = mesh.stl.neighbors_start[triangle_id]; - for (int i = 0; i < 3; ++i) - // Refuse a neighbor with a flipped normal. - neighbors(i) = neighbors_src.neighbor[i]; - return neighbors; -} - #ifndef NDEBUG bool TriangleSelector::verify_triangle_midpoints(const Triangle &tr) const { @@ -129,7 +119,7 @@ int TriangleSelector::select_unsplit_triangle(const Vec3f &hit, int facet_idx) c if (!m_triangles[facet_idx].valid()) return -1; - Vec3i neighbors = root_neighbors(*m_mesh, facet_idx); + Vec3i neighbors = m_neighbors[facet_idx]; assert(this->verify_triangle_neighbors(m_triangles[facet_idx], neighbors)); return this->select_unsplit_triangle(hit, facet_idx, neighbors); } @@ -167,7 +157,7 @@ void TriangleSelector::select_patch(const Vec3f& hit, int facet_start, if (! visited[facet]) { if (select_triangle(facet, new_state, triangle_splitting)) { // add neighboring facets to list to be proccessed later - for (int neighbor_idx : m_mesh->stl.neighbors_start[facet].neighbor) { + for (int neighbor_idx : m_neighbors[facet]) { if (neighbor_idx >=0 && (m_cursor.type == SPHERE || faces_camera(neighbor_idx))) facets_to_check.push_back(neighbor_idx); } @@ -213,12 +203,12 @@ void TriangleSelector::seed_fill_select_triangles(const Vec3f &hit, int facet_st if (current_facet < m_orig_size_indices) // Propagate over the original triangles. - for (int neighbor_idx : m_mesh->stl.neighbors_start[current_facet].neighbor) { + for (int neighbor_idx : m_neighbors[current_facet]) { assert(neighbor_idx >= -1); if (neighbor_idx >= 0 && !visited[neighbor_idx]) { // Check if neighbour_facet_idx is satisfies angle in seed_fill_angle and append it to facet_queue if it do. - const Vec3f &n1 = m_mesh->stl.facet_start[m_triangles[neighbor_idx].source_triangle].normal; - const Vec3f &n2 = m_mesh->stl.facet_start[m_triangles[current_facet].source_triangle].normal; + const Vec3f &n1 = m_face_normals[m_triangles[neighbor_idx].source_triangle]; + const Vec3f &n2 = m_face_normals[m_triangles[current_facet].source_triangle]; if (std::clamp(n1.dot(n2), 0.f, 1.f) >= facet_angle_limit) facet_queue.push(neighbor_idx); } @@ -261,7 +251,7 @@ std::pair, std::vector> TriangleSelector::precompute_a std::vector neighbors(m_triangles.size(), Vec3i(-1, -1, -1)); std::vector neighbors_propagated(m_triangles.size(), Vec3i(-1, -1, -1)); for (int facet_idx = 0; facet_idx < this->m_orig_size_indices; ++facet_idx) { - neighbors[facet_idx] = root_neighbors(*m_mesh, facet_idx); + neighbors[facet_idx] = m_neighbors[facet_idx]; neighbors_propagated[facet_idx] = neighbors[facet_idx]; assert(this->verify_triangle_neighbors(m_triangles[facet_idx], neighbors[facet_idx])); if (m_triangles[facet_idx].is_split()) @@ -403,7 +393,7 @@ bool TriangleSelector::select_triangle(int facet_idx, EnforcerBlockerType type, if (! m_triangles[facet_idx].valid()) return false; - Vec3i neighbors = root_neighbors(*m_mesh, facet_idx); + Vec3i neighbors = m_neighbors[facet_idx]; assert(this->verify_triangle_neighbors(m_triangles[facet_idx], neighbors)); if (! select_triangle_recursive(facet_idx, neighbors, type, triangle_splitting)) @@ -906,14 +896,10 @@ bool TriangleSelector::is_pointer_in_triangle(int facet_idx) const bool TriangleSelector::faces_camera(int facet) const { assert(facet < m_orig_size_indices); - // The normal is cached in mesh->stl, use it. - Vec3f normal = m_mesh->stl.facet_start[facet].normal; - - if (! m_cursor.uniform_scaling) { - // Transform the normal into world coords. - normal = m_cursor.trafo_normal * normal; - } - return (normal.dot(m_cursor.dir) < 0.); + Vec3f n = m_face_normals[facet]; + if (! m_cursor.uniform_scaling) + n = m_cursor.trafo_normal * n; + return n.dot(m_cursor.dir) < 0.; } @@ -1094,7 +1080,7 @@ void TriangleSelector::garbage_collect() } TriangleSelector::TriangleSelector(const TriangleMesh& mesh) - : m_mesh{&mesh} + : m_mesh{mesh}, m_neighbors(its_face_neighbors(mesh.its)), m_face_normals(its_face_normals(mesh.its)) { reset(); } @@ -1107,16 +1093,17 @@ void TriangleSelector::reset() m_invalid_triangles = 0; m_free_triangles_head = -1; m_free_vertices_head = -1; - m_vertices.reserve(m_mesh->its.vertices.size()); - for (const stl_vertex& vert : m_mesh->its.vertices) + m_vertices.reserve(m_mesh.its.vertices.size()); + for (const stl_vertex& vert : m_mesh.its.vertices) m_vertices.emplace_back(vert); - m_triangles.reserve(m_mesh->its.indices.size()); - for (size_t i = 0; i < m_mesh->its.indices.size(); ++i) { - const stl_triangle_vertex_indices &ind = m_mesh->its.indices[i]; + m_triangles.reserve(m_mesh.its.indices.size()); + for (size_t i = 0; i < m_mesh.its.indices.size(); ++i) { + const stl_triangle_vertex_indices &ind = m_mesh.its.indices[i]; push_triangle(ind[0], ind[1], ind[2], int(i)); } m_orig_size_vertices = int(m_vertices.size()); m_orig_size_indices = int(m_triangles.size()); + } @@ -1286,7 +1273,7 @@ indexed_triangle_set TriangleSelector::get_facets_strict(EnforcerBlockerType sta } for (int itriangle = 0; itriangle < m_orig_size_indices; ++ itriangle) - this->get_facets_strict_recursive(m_triangles[itriangle], root_neighbors(*m_mesh, itriangle), state, out.indices); + this->get_facets_strict_recursive(m_triangles[itriangle], m_neighbors[itriangle], state, out.indices); for (auto &triangle : out.indices) for (int i = 0; i < 3; ++ i) @@ -1398,7 +1385,7 @@ void TriangleSelector::get_facets_split_by_tjoints(const Vec3i &vertices, const std::vector TriangleSelector::get_seed_fill_contour() const { std::vector edges_out; for (int facet_idx = 0; facet_idx < this->m_orig_size_indices; ++facet_idx) { - const Vec3i neighbors = root_neighbors(*m_mesh, facet_idx); + const Vec3i neighbors = m_neighbors[facet_idx]; assert(this->verify_triangle_neighbors(m_triangles[facet_idx], neighbors)); this->get_seed_fill_contour_recursive(facet_idx, neighbors, neighbors, edges_out); } @@ -1522,10 +1509,10 @@ void TriangleSelector::deserialize(const std::pairits.indices.size(), data.second.size() / 4)); + m_triangles.reserve(std::max(m_mesh.its.indices.size(), data.second.size() / 4)); // Number of triangles is twice the number of vertices on a large manifold mesh of genus zero. // Here the triangles count account for both the nodes and leaves, thus the following line may overestimate. - m_vertices.reserve(std::max(m_mesh->its.vertices.size(), m_triangles.size() / 2)); + m_vertices.reserve(std::max(m_mesh.its.vertices.size(), m_triangles.size() / 2)); // Vector to store all parents that have offsprings. struct ProcessingInfo { @@ -1565,7 +1552,7 @@ void TriangleSelector::deserialize(const std::pair m_vertices; std::vector m_triangles; - const TriangleMesh* m_mesh; + const TriangleMesh &m_mesh; + const std::vector m_neighbors; + const std::vector m_face_normals; // Number of invalid triangles (to trigger garbage collection). int m_invalid_triangles; diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp index a01e63166..cfb4cfa92 100644 --- a/src/libslic3r/Utils.hpp +++ b/src/libslic3r/Utils.hpp @@ -255,6 +255,19 @@ template struct IsTriviallyCopyable { static constexpr bool value = template struct IsTriviallyCopyable : public std::is_trivially_copyable {}; #endif +// A very lightweight ROII wrapper around C FILE. +// The old C file API is much faster than C++ streams, thus they are recommended for processing large / huge files. +struct FilePtr { + FilePtr(FILE *f) : f(f) {} + ~FilePtr() { this->close(); } + void close() { + if (this->f) { + ::fclose(this->f); + this->f = nullptr; + } + } + FILE* f = nullptr; +}; class ScopeGuard { diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index 50ac64aa4..f73eb5c8f 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -889,7 +889,7 @@ std::string string_printf(const char *format, ...) std::string header_slic3r_generated() { - return std::string("generated by " SLIC3R_APP_NAME " " SLIC3R_VERSION " on " ) + Utils::utc_timestamp(); + return std::string("generated by PrusaSlicer " SLIC3R_VERSION " on " ) + Utils::utc_timestamp(); } std::string header_gcodeviewer_generated() @@ -906,6 +906,7 @@ unsigned get_current_pid() #endif } +//FIXME this has potentially O(n^2) time complexity! std::string xml_escape(std::string text, bool is_marked/* = false*/) { std::string::size_type pos = 0; diff --git a/src/platform/msw/PrusaSlicer-gcodeviewer.rc.in b/src/platform/msw/PrusaSlicer-gcodeviewer.rc.in index eed737cb7..518f6b7b6 100644 --- a/src/platform/msw/PrusaSlicer-gcodeviewer.rc.in +++ b/src/platform/msw/PrusaSlicer-gcodeviewer.rc.in @@ -12,7 +12,7 @@ PRODUCTVERSION @SLIC3R_RC_VERSION@ VALUE "ProductName", "@SLIC3R_APP_NAME@ G-code Viewer" VALUE "ProductVersion", "@SLIC3R_BUILD_ID@" VALUE "InternalName", "@SLIC3R_APP_NAME@ G-code Viewer" - VALUE "LegalCopyright", "Copyright \251 2016-2020 Prusa Research, \251 2011-2018 Alessandro Ranellucci" + VALUE "LegalCopyright", "Copyright \251 2016-2021 Prusa Research, \251 2011-2018 Alessandro Ranellucci" VALUE "OriginalFilename", "prusa-gcodeviewer.exe" } } diff --git a/src/platform/msw/PrusaSlicer.rc.in b/src/platform/msw/PrusaSlicer.rc.in index a4520c6d7..d7f860204 100644 --- a/src/platform/msw/PrusaSlicer.rc.in +++ b/src/platform/msw/PrusaSlicer.rc.in @@ -12,7 +12,7 @@ PRODUCTVERSION @SLIC3R_RC_VERSION@ VALUE "ProductName", "@SLIC3R_APP_NAME@" VALUE "ProductVersion", "@SLIC3R_BUILD_ID@" VALUE "InternalName", "@SLIC3R_APP_NAME@" - VALUE "LegalCopyright", "Copyright \251 2016-2020 Prusa Research, \251 2011-2018 Alessandro Ranellucci" + VALUE "LegalCopyright", "Copyright \251 2016-2021 Prusa Research, \251 2011-2018 Alessandro Ranellucci" VALUE "OriginalFilename", "prusa-slicer.exe" } } diff --git a/src/platform/osx/Info.plist.in b/src/platform/osx/Info.plist.in index 46858bb29..f1de1d24b 100644 --- a/src/platform/osx/Info.plist.in +++ b/src/platform/osx/Info.plist.in @@ -5,7 +5,7 @@ CFBundleExecutable @SLIC3R_APP_KEY@ CFBundleGetInfoString - @SLIC3R_APP_NAME@ Copyright (C) 2011-2019 Alessandro Ranellucci, (C) 2016-2020 Prusa Reseach + @SLIC3R_APP_NAME@ Copyright (C) 2011-2019 Alessandro Ranellucci, (C) 2016-2021 Prusa Reseach CFBundleIconFile PrusaSlicer.icns CFBundleName diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index f95930701..a0a6eeb79 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -143,6 +143,8 @@ set(SLIC3R_GUI_SOURCES GUI/RammingChart.hpp GUI/RemovableDriveManager.cpp GUI/RemovableDriveManager.hpp + GUI/SendSystemInfoDialog.cpp + GUI/SendSystemInfoDialog.hpp GUI/BonjourDialog.cpp GUI/BonjourDialog.hpp GUI/ButtonsDescription.cpp @@ -181,6 +183,8 @@ set(SLIC3R_GUI_SOURCES GUI/Jobs/SLAImportJob.hpp GUI/Jobs/SLAImportJob.cpp GUI/Jobs/ProgressIndicator.hpp + GUI/Jobs/NotificationProgressIndicator.hpp + GUI/Jobs/NotificationProgressIndicator.cpp GUI/ProgressStatusBar.hpp GUI/ProgressStatusBar.cpp GUI/Mouse3DController.cpp diff --git a/src/slic3r/GUI/2DBed.cpp b/src/slic3r/GUI/2DBed.cpp index e184b43fc..e7c2cbe54 100644 --- a/src/slic3r/GUI/2DBed.cpp +++ b/src/slic3r/GUI/2DBed.cpp @@ -92,7 +92,7 @@ void Bed_2D::repaint(const std::vector& shape) for (auto y = bb.min(1) - fmod(bb.min(1), step) + step; y < bb.max(1); y += step) { polylines.push_back(Polyline::new_scale({ Vec2d(bb.min(0), y), Vec2d(bb.max(0), y) })); } - polylines = intersection_pl(polylines, (Polygons)bed_polygon); + polylines = intersection_pl(polylines, bed_polygon); dc.SetPen(wxPen(wxColour(230, 230, 230), 1, wxPENSTYLE_SOLID)); for (auto pl : polylines) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 4dd4eb5df..fd2e529d3 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -9,9 +9,7 @@ #include "3DScene.hpp" #include "GLShader.hpp" #include "GUI_App.hpp" -#if ENABLE_ENVIRONMENT_MAP || ENABLE_SINKING_CONTOURS #include "Plater.hpp" -#endif // ENABLE_ENVIRONMENT_MAP || ENABLE_SINKING_CONTOURS #include "libslic3r/ExtrusionEntity.hpp" #include "libslic3r/ExtrusionEntityCollection.hpp" @@ -25,9 +23,7 @@ #include "libslic3r/AppConfig.hpp" #include "libslic3r/PresetBundle.hpp" #include "libslic3r/ClipperUtils.hpp" -#if ENABLE_SINKING_CONTOURS #include "libslic3r/Tesselate.hpp" -#endif // ENABLE_SINKING_CONTOURS #include #include @@ -158,22 +154,27 @@ void GLIndexedVertexArray::load_mesh_full_shading(const TriangleMesh& mesh) } else { #endif // ENABLE_SMOOTH_NORMALS - this->vertices_and_normals_interleaved.reserve(this->vertices_and_normals_interleaved.size() + 3 * 3 * 2 * mesh.facets_count()); - - unsigned int vertices_count = 0; - for (int i = 0; i < (int)mesh.stl.stats.number_of_facets; ++i) { - const stl_facet& facet = mesh.stl.facet_start[i]; - for (int j = 0; j < 3; ++j) - this->push_geometry(facet.vertex[j](0), facet.vertex[j](1), facet.vertex[j](2), facet.normal(0), facet.normal(1), facet.normal(2)); - - this->push_triangle(vertices_count, vertices_count + 1, vertices_count + 2); - vertices_count += 3; - } + this->load_its_flat_shading(mesh.its); #if ENABLE_SMOOTH_NORMALS } #endif // ENABLE_SMOOTH_NORMALS } +void GLIndexedVertexArray::load_its_flat_shading(const indexed_triangle_set &its) +{ + this->vertices_and_normals_interleaved.reserve(this->vertices_and_normals_interleaved.size() + 3 * 3 * 2 * its.indices.size()); + unsigned int vertices_count = 0; + for (int i = 0; i < int(its.indices.size()); ++ i) { + stl_triangle_vertex_indices face = its.indices[i]; + stl_vertex vertex[3] = { its.vertices[face[0]], its.vertices[face[1]], its.vertices[face[2]] }; + stl_vertex n = face_normal_normalized(vertex); + for (int j = 0; j < 3; ++j) + this->push_geometry(vertex[j](0), vertex[j](1), vertex[j](2), n(0), n(1), n(2)); + this->push_triangle(vertices_count, vertices_count + 1, vertices_count + 2); + vertices_count += 3; + } +} + void GLIndexedVertexArray::finalize_geometry(bool opengl_initialized) { assert(this->vertices_and_normals_interleaved_VBO_id == 0); @@ -288,7 +289,6 @@ void GLIndexedVertexArray::render( glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } -#if ENABLE_SINKING_CONTOURS const float GLVolume::SinkingContours::HalfWidth = 0.25f; void GLVolume::SinkingContours::render() @@ -313,7 +313,6 @@ void GLVolume::SinkingContours::update() m_shift = Vec3d::Zero(); const TriangleMesh& mesh = model.objects[object_idx]->volumes[m_parent.volume_idx()]->mesh(); - assert(mesh.has_shared_vertices()); m_model.reset(); GUI::GLModel::InitializationData init_data; @@ -356,7 +355,6 @@ void GLVolume::SinkingContours::update() else m_model.reset(); } -#endif // ENABLE_SINKING_CONTOURS const std::array GLVolume::SELECTED_COLOR = { 0.0f, 1.0f, 0.0f, 1.0f }; const std::array GLVolume::HOVER_SELECT_COLOR = { 0.4f, 0.9f, 0.1f, 1.0f }; @@ -375,12 +373,8 @@ const std::array, 4> GLVolume::MODEL_COLOR = { { } }; GLVolume::GLVolume(float r, float g, float b, float a) - : m_transformed_bounding_box_dirty(true) - , m_sla_shift_z(0.0) - , m_transformed_convex_hull_bounding_box_dirty(true) -#if ENABLE_SINKING_CONTOURS + : m_sla_shift_z(0.0) , m_sinking_contours(*this) -#endif // ENABLE_SINKING_CONTOURS // geometry_id == 0 -> invalid , geometry_id(std::pair(0, 0)) , extruder_id(0) @@ -398,9 +392,7 @@ GLVolume::GLVolume(float r, float g, float b, float a) , force_transparent(false) , force_native_color(false) , force_neutral_color(false) -#if ENABLE_SINKING_CONTOURS , force_sinking_contours(false) -#endif // ENABLE_SINKING_CONTOURS , tverts_range(0, size_t(-1)) , qverts_range(0, size_t(-1)) { @@ -505,32 +497,27 @@ bool GLVolume::is_left_handed() const const BoundingBoxf3& GLVolume::transformed_bounding_box() const { - const BoundingBoxf3& box = bounding_box(); - assert(box.defined || box.min(0) >= box.max(0) || box.min(1) >= box.max(1) || box.min(2) >= box.max(2)); - - BoundingBoxf3* transformed_bounding_box = const_cast(&m_transformed_bounding_box); - bool* transformed_bounding_box_dirty = const_cast(&m_transformed_bounding_box_dirty); - if (*transformed_bounding_box_dirty) { - *transformed_bounding_box = box.transformed(world_matrix()); - *transformed_bounding_box_dirty = false; + if (!m_transformed_bounding_box.has_value()) { + const BoundingBoxf3& box = bounding_box(); + assert(box.defined || box.min.x() >= box.max.x() || box.min.y() >= box.max.y() || box.min.z() >= box.max.z()); + std::optional* trans_box = const_cast*>(&m_transformed_bounding_box); + *trans_box = box.transformed(world_matrix()); } - return *transformed_bounding_box; + return *m_transformed_bounding_box; } const BoundingBoxf3& GLVolume::transformed_convex_hull_bounding_box() const { - BoundingBoxf3* transformed_convex_hull_bounding_box = const_cast(&m_transformed_convex_hull_bounding_box); - bool* transformed_convex_hull_bounding_box_dirty = const_cast(&m_transformed_convex_hull_bounding_box_dirty); - if (*transformed_convex_hull_bounding_box_dirty) { - *transformed_convex_hull_bounding_box = this->transformed_convex_hull_bounding_box(world_matrix()); - *transformed_convex_hull_bounding_box_dirty = false; + if (!m_transformed_convex_hull_bounding_box.has_value()) { + std::optional* trans_box = const_cast*>(&m_transformed_convex_hull_bounding_box); + *trans_box = transformed_convex_hull_bounding_box(world_matrix()); } - return *transformed_convex_hull_bounding_box; + return *m_transformed_convex_hull_bounding_box; } BoundingBoxf3 GLVolume::transformed_convex_hull_bounding_box(const Transform3d &trafo) const { - return (m_convex_hull && m_convex_hull->stl.stats.number_of_facets > 0) ? + return (m_convex_hull && ! m_convex_hull->empty()) ? m_convex_hull->transformed_bounding_box(trafo) : bounding_box().transformed(trafo); } @@ -604,12 +591,10 @@ bool GLVolume::is_below_printbed() const return transformed_convex_hull_bounding_box().max.z() < 0.0; } -#if ENABLE_SINKING_CONTOURS void GLVolume::render_sinking_contours() { m_sinking_contours.render(); } -#endif // ENABLE_SINKING_CONTOURS std::vector GLVolumeCollection::load_object( const ModelObject *model_object, @@ -732,21 +717,20 @@ int GLVolumeCollection::load_wipe_tower_preview( float min_width = 30.f; // We'll now create the box with jagged edge. y-coordinates of the pre-generated model // are shifted so that the front edge has y=0 and centerline of the back edge has y=depth: - Pointf3s points; - std::vector facets; float out_points_idx[][3] = { { 0, -depth, 0 }, { 0, 0, 0 }, { 38.453f, 0, 0 }, { 61.547f, 0, 0 }, { 100.0f, 0, 0 }, { 100.0f, -depth, 0 }, { 55.7735f, -10.0f, 0 }, { 44.2265f, 10.0f, 0 }, { 38.453f, 0, 1 }, { 0, 0, 1 }, { 0, -depth, 1 }, { 100.0f, -depth, 1 }, { 100.0f, 0, 1 }, { 61.547f, 0, 1 }, { 55.7735f, -10.0f, 1 }, { 44.2265f, 10.0f, 1 } }; - int out_facets_idx[][3] = { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 5, 0 }, { 3, 5, 6 }, { 6, 2, 7 }, { 6, 0, 2 }, { 8, 9, 10 }, { 11, 12, 13 }, { 10, 11, 14 }, { 14, 11, 13 }, { 15, 8, 14 }, - {8, 10, 14}, {3, 12, 4}, {3, 13, 12}, {6, 13, 3}, {6, 14, 13}, {7, 14, 6}, {7, 15, 14}, {2, 15, 7}, {2, 8, 15}, {1, 8, 2}, {1, 9, 8}, - {0, 9, 1}, {0, 10, 9}, {5, 10, 0}, {5, 11, 10}, {4, 11, 5}, {4, 12, 11} }; + static constexpr const int out_facets_idx[][3] = { + { 0, 1, 2 }, { 3, 4, 5 }, { 6, 5, 0 }, { 3, 5, 6 }, { 6, 2, 7 }, { 6, 0, 2 }, { 8, 9, 10 }, { 11, 12, 13 }, { 10, 11, 14 }, { 14, 11, 13 }, { 15, 8, 14 }, + { 8, 10, 14 }, { 3, 12, 4 }, { 3, 13, 12 }, { 6, 13, 3 }, { 6, 14, 13 }, { 7, 14, 6 }, { 7, 15, 14 }, { 2, 15, 7 }, { 2, 8, 15 }, { 1, 8, 2 }, { 1, 9, 8 }, + { 0, 9, 1 }, { 0, 10, 9 }, { 5, 10, 0 }, { 5, 11, 10 }, { 4, 11, 5 }, { 4, 12, 11 } }; + indexed_triangle_set its; for (int i = 0; i < 16; ++i) - points.emplace_back(out_points_idx[i][0] / (100.f / min_width), - out_points_idx[i][1] + depth, out_points_idx[i][2]); - for (int i = 0; i < 28; ++i) - facets.emplace_back(out_facets_idx[i][0], - out_facets_idx[i][1], - out_facets_idx[i][2]); - TriangleMesh tooth_mesh(points, facets); + its.vertices.emplace_back(out_points_idx[i][0] / (100.f / min_width), + out_points_idx[i][1] + depth, out_points_idx[i][2]); + its.indices.reserve(28); + for (const int *face : out_facets_idx) + its.indices.emplace_back(face); + TriangleMesh tooth_mesh(std::move(its)); // We have the mesh ready. It has one tooth and width of min_width. We will now // append several of these together until we are close to the required width @@ -757,7 +741,7 @@ int GLVolumeCollection::load_wipe_tower_preview( tooth_mesh.translate(min_width, 0.f, 0.f); } - mesh.scale(Vec3d(width / (n * min_width), 1.f, height)); // Scaling to proper width + mesh.scale(Vec3f(width / (n * min_width), 1.f, height)); // Scaling to proper width } else mesh = make_cube(width, depth, height); @@ -769,7 +753,7 @@ int GLVolumeCollection::load_wipe_tower_preview( volumes.emplace_back(new GLVolume(color)); GLVolume& v = *volumes.back(); - v.indexed_vertex_array.load_mesh(mesh); + v.indexed_vertex_array.load_mesh(mesh); v.indexed_vertex_array.finalize_geometry(opengl_initialized); v.set_volume_offset(Vec3d(pos_x, pos_y, 0.0)); v.set_volume_rotation(Vec3d(0., 0., (M_PI / 180.) * rotation_angle)); @@ -833,11 +817,9 @@ GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCo void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disable_cullface, const Transform3d& view_matrix, std::function filter_func) const { -#if ENABLE_SINKING_CONTOURS GLVolumeWithIdAndZList to_render = volumes_to_render(volumes, type, view_matrix, filter_func); if (to_render.empty()) return; -#endif // ENABLE_SINKING_CONTOURS GLShaderProgram* shader = GUI::wxGetApp().get_current_shader(); if (shader == nullptr) @@ -852,7 +834,6 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab if (disable_cullface) glsafe(::glDisable(GL_CULL_FACE)); -#if ENABLE_SINKING_CONTOURS for (GLVolumeWithIdAndZ& volume : to_render) { volume.first->set_render_color(); @@ -902,7 +883,7 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); } - if (m_show_sinking_contours) + if (m_show_sinking_contours) { for (GLVolumeWithIdAndZ& volume : to_render) { // render sinking contours of hovered/displaced volumes if (volume.first->is_sinking() && !volume.first->is_below_printbed() && @@ -914,48 +895,8 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab shader->start_using(); } } -#else - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); - - shader->set_uniform("print_box.min", m_print_box_min, 3); - shader->set_uniform("print_box.max", m_print_box_max, 3); - shader->set_uniform("z_range", m_z_range, 2); - shader->set_uniform("clipping_plane", m_clipping_plane, 4); - shader->set_uniform("slope.normal_z", m_slope.normal_z); - -#if ENABLE_ENVIRONMENT_MAP - unsigned int environment_texture_id = GUI::wxGetApp().plater()->get_environment_texture_id(); - bool use_environment_texture = environment_texture_id > 0 && GUI::wxGetApp().app_config->get("use_environment_map") == "1"; - shader->set_uniform("use_environment_tex", use_environment_texture); - if (use_environment_texture) - glsafe(::glBindTexture(GL_TEXTURE_2D, environment_texture_id)); -#endif // ENABLE_ENVIRONMENT_MAP - glcheck(); - - GLVolumeWithIdAndZList to_render = volumes_to_render(this->volumes, type, view_matrix, filter_func); - for (GLVolumeWithIdAndZ& volume : to_render) { - volume.first->set_render_color(); - shader->set_uniform("uniform_color", volume.first->render_color); - shader->set_uniform("print_box.actived", volume.first->shader_outside_printer_detection_enabled); - shader->set_uniform("print_box.volume_world_matrix", volume.first->world_matrix()); - shader->set_uniform("slope.actived", m_slope.active && !volume.first->is_modifier && !volume.first->is_wipe_tower); - shader->set_uniform("slope.volume_world_normal_matrix", static_cast(volume.first->world_matrix().matrix().block(0, 0, 3, 3).inverse().transpose().cast())); - volume.first->render(); } -#if ENABLE_ENVIRONMENT_MAP - if (use_environment_texture) - glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); -#endif // ENABLE_ENVIRONMENT_MAP - - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); -#endif // ENABLE_SINKING_CONTOURS - if (disable_cullface) glsafe(::glEnable(GL_CULL_FACE)); diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 1a85cc41e..78b9a96d9 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -8,11 +8,10 @@ #include "libslic3r/Utils.hpp" #include "libslic3r/Geometry.hpp" -#if ENABLE_SINKING_CONTOURS #include "GLModel.hpp" -#endif // ENABLE_SINKING_CONTOURS #include +#include #define HAS_GLSAFE #ifdef HAS_GLSAFE @@ -128,6 +127,8 @@ public: void load_mesh(const TriangleMesh& mesh) { this->load_mesh_full_shading(mesh); } #endif // ENABLE_SMOOTH_NORMALS + void load_its_flat_shading(const indexed_triangle_set &its); + inline bool has_VBOs() const { return vertices_and_normals_interleaved_VBO_id != 0; } inline void reserve(size_t sz) { @@ -258,9 +259,7 @@ public: enum EHoverState : unsigned char { HS_None, -#if ENABLE_SINKING_CONTOURS HS_Hover, -#endif // ENABLE_SINKING_CONTOURS HS_Select, HS_Deselect }; @@ -275,17 +274,12 @@ private: // Shift in z required by sla supports+pad double m_sla_shift_z; // Bounding box of this volume, in unscaled coordinates. - BoundingBoxf3 m_transformed_bounding_box; - // Whether or not is needed to recalculate the transformed bounding box. - bool m_transformed_bounding_box_dirty; + std::optional m_transformed_bounding_box; // Convex hull of the volume, if any. std::shared_ptr m_convex_hull; // Bounding box of this volume, in unscaled coordinates. - BoundingBoxf3 m_transformed_convex_hull_bounding_box; - // Whether or not is needed to recalculate the transformed convex hull bounding box. - bool m_transformed_convex_hull_bounding_box_dirty; + std::optional m_transformed_convex_hull_bounding_box; -#if ENABLE_SINKING_CONTOURS class SinkingContours { static const float HalfWidth; @@ -303,7 +297,6 @@ private: }; SinkingContours m_sinking_contours; -#endif // ENABLE_SINKING_CONTOURS public: // Color of the triangles / quads held by this volume. @@ -365,10 +358,8 @@ public: bool force_native_color : 1; // Whether or not render this volume in neutral bool force_neutral_color : 1; -#if ENABLE_SINKING_CONTOURS // Whether or not to force rendering of sinking contours bool force_sinking_contours : 1; -#endif // ENABLE_SINKING_CONTOURS }; // Is mouse or rectangle selection over this object to select/deselect it ? @@ -490,16 +481,14 @@ public: void finalize_geometry(bool opengl_initialized) { this->indexed_vertex_array.finalize_geometry(opengl_initialized); } void release_geometry() { this->indexed_vertex_array.release_geometry(); } - void set_bounding_boxes_as_dirty() { m_transformed_bounding_box_dirty = true; m_transformed_convex_hull_bounding_box_dirty = true; } + void set_bounding_boxes_as_dirty() { m_transformed_bounding_box.reset(); m_transformed_convex_hull_bounding_box.reset(); } bool is_sla_support() const; bool is_sla_pad() const; bool is_sinking() const; bool is_below_printbed() const; -#if ENABLE_SINKING_CONTOURS void render_sinking_contours(); -#endif // ENABLE_SINKING_CONTOURS // Return an estimate of the memory consumed by this class. size_t cpu_memory_used() const { diff --git a/src/slic3r/GUI/AboutDialog.cpp b/src/slic3r/GUI/AboutDialog.cpp index 2aae9270d..a6b99a08b 100644 --- a/src/slic3r/GUI/AboutDialog.cpp +++ b/src/slic3r/GUI/AboutDialog.cpp @@ -275,7 +275,7 @@ AboutDialog::AboutDialog() "" "" "" - "%4% © 2016-2020 Prusa Research.
" + "%4% © 2016-2021 Prusa Research.
" "%5% © 2011-2018 Alessandro Ranellucci.
" "Slic3r %6% " "%7%." diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.cpp b/src/slic3r/GUI/BackgroundSlicingProcess.cpp index b4de4a509..e93f32b03 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.cpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.cpp @@ -209,8 +209,8 @@ void BackgroundSlicingProcess::process_sla() void BackgroundSlicingProcess::thread_proc() { - set_current_thread_name("slic3r_BgSlcPcs"); - name_tbb_thread_pool_threads(); + set_current_thread_name("slic3r_BgSlcPcs"); + name_tbb_thread_pool_threads_set_locale(); assert(m_print != nullptr); assert(m_print == m_fff_print || m_print == m_sla_print); diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index 3f388f485..4d50e1490 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -30,6 +30,8 @@ #include "libslic3r/Platform.hpp" #include "libslic3r/Utils.hpp" #include "libslic3r/Config.hpp" +#include "libslic3r/libslic3r.h" +#include "libslic3r/Model.hpp" #include "GUI.hpp" #include "GUI_App.hpp" #include "GUI_Utils.hpp" @@ -40,7 +42,7 @@ #include "slic3r/Utils/PresetUpdater.hpp" #include "format.hpp" #include "MsgDialog.hpp" -#include "libslic3r/libslic3r.h" +#include "UnsavedChangesDialog.hpp" #if defined(__linux__) && defined(__WXGTK3__) #define wxLinux_gtk3 true @@ -741,10 +743,10 @@ void PageMaterials::set_compatible_printers_html_window(const std::vector* are not compatible with some installed printers."); + wxString first_line = format_wxstr(_L("%1% marked with * are not compatible with some installed printers."), materials->technology == T_FFF ? _L("Filaments") : _L("SLA materials")); wxString text; if (all_printers) { - wxString second_line = _L("All installed printers are compatible with the selected filament."); + wxString second_line = format_wxstr(_L("All installed printers are compatible with the selected %1%."), materials->technology == T_FFF ? _L("filament") : _L("SLA material")); text = wxString::Format( "" "