diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index ecf8a9177..2bc74fd82 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,13 +1,13 @@ -Did you encounter an issue with using Slic3r? Fear not! This guide will help you to write a good bug report in just a few, simple steps. +Did you encounter an issue with using PrusaSlicer? Fear not! This guide will help you to write a good bug report in just a few, simple steps. -There is a good chance that the issue, you have encountered, is already reported. Please check the [list of reported issues](https://github.com/alexrj/Slic3r/issues) before creating a new issue report. If you find an existing issue report, feel free to add further information to that report. +There is a good chance that the issue, you have encountered, is already reported. Please check the [list of reported issues](https://github.com/prusa3d/PrusaSlicer/issues) before creating a new issue report. If you find an existing issue report, feel free to add further information to that report. -If possible, please include the following information when [reporting an issue](https://github.com/alexrj/Slic3r/issues/new): -* Slic3r version (See the about dialog for the version number. If running from git, please include the git commit ID from `git rev-parse HEAD` also.) +If possible, please include the following information when [reporting an issue](https://github.com/prusa3d/PrusaSlicer/issues/new): +* PrusaSlicer version (See the about dialog for the version number. If running from git, please include the git commit ID from `git rev-parse HEAD` also.) * Operating system type + version * Steps to reproduce the issue, including: * Command line parameters used, if any - * Slic3r configuration file (Use ``Export Config...`` from the ``File`` menu - please don't export a bundle) + * PrusaSlicer configuration file (Use ``Export Config...`` from the ``File`` menu - please don't export a bundle) * Expected result * Actual result * Any error messages @@ -17,5 +17,5 @@ If possible, please include the following information when [reporting an issue]( Please make sure only to include one issue per report. If you encounter multiple, unrelated issues, please report them as such. -Simon Tatham has written an excellent on article on [How to Report Bugs Effectively](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html) which is well worth reading, although it is not specific to Slic3r. +Simon Tatham has written an excellent on article on [How to Report Bugs Effectively](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html) which is well worth reading, although it is not specific to PrusaSlicer. diff --git a/resources/localization/PrusaSlicer.pot b/resources/localization/PrusaSlicer.pot index 6e72e438c..aef39c253 100644 --- a/resources/localization/PrusaSlicer.pot +++ b/resources/localization/PrusaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-03-16 13:41+0100\n" +"POT-Creation-Date: 2020-04-16 11:29+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,109 +18,109 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/slic3r/GUI/AboutDialog.cpp:41 src/slic3r/GUI/AboutDialog.cpp:294 +#: src/slic3r/GUI/AboutDialog.cpp:42 src/slic3r/GUI/AboutDialog.cpp:295 msgid "Portions copyright" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:129 src/slic3r/GUI/AboutDialog.cpp:258 +#: src/slic3r/GUI/AboutDialog.cpp:130 src/slic3r/GUI/AboutDialog.cpp:259 msgid "Copyright" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:131 +#: src/slic3r/GUI/AboutDialog.cpp:132 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:201 +#: src/slic3r/GUI/AboutDialog.cpp:202 #, possible-c-format msgid "About %s" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:233 src/slic3r/GUI/MainFrame.cpp:69 +#: src/slic3r/GUI/AboutDialog.cpp:234 src/slic3r/GUI/MainFrame.cpp:70 msgid "Version" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:260 +#: src/slic3r/GUI/AboutDialog.cpp:261 msgid "is licensed under the" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:261 +#: src/slic3r/GUI/AboutDialog.cpp:262 msgid "GNU Affero General Public License, version 3" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:263 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:263 +#: src/slic3r/GUI/AboutDialog.cpp:264 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/AppConfig.cpp:114 +#: src/slic3r/GUI/AppConfig.cpp:110 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/BackgroundSlicingProcess.cpp:108 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:101 msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " "card is write locked?" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:111 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:104 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:114 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:107 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:117 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:110 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:120 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:113 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:127 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:479 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:120 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:468 msgid "Running post-processing scripts" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:129 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:122 msgid "G-code file exported to %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:133 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:126 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:172 msgid "Slicing complete" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:179 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:168 msgid "Masked SLA file exported to %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:221 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:210 #, possible-c-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -128,15 +128,15 @@ msgid "" "and we would be glad if you reported it." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:481 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:470 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:506 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:493 msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2067 +#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2073 msgid "Shape" msgstr "" @@ -144,36 +144,36 @@ msgstr "" msgid "Rectangular" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:77 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:160 -#: src/slic3r/GUI/Tab.cpp:2309 +#: src/slic3r/GUI/BedShapeDialog.cpp:79 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:162 +#: src/slic3r/GUI/Tab.cpp:2319 msgid "Size" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:78 +#: src/slic3r/GUI/BedShapeDialog.cpp:80 msgid "Size in X and Y of the rectangular plate." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:84 +#: src/slic3r/GUI/BedShapeDialog.cpp:88 msgid "Origin" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:85 +#: src/slic3r/GUI/BedShapeDialog.cpp:89 msgid "" "Distance of the 0,0 G-code coordinate from the front left corner of the " "rectangle." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:89 +#: src/slic3r/GUI/BedShapeDialog.cpp:93 msgid "Circular" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/slic3r/GUI/ConfigWizard.cpp:233 +#: src/slic3r/GUI/BedShapeDialog.cpp:96 src/slic3r/GUI/ConfigWizard.cpp:233 #: src/slic3r/GUI/ConfigWizard.cpp:985 src/slic3r/GUI/ConfigWizard.cpp:999 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:142 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:96 #: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75 #: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:91 #: src/libslic3r/PrintConfig.cpp:122 src/libslic3r/PrintConfig.cpp:188 @@ -208,77 +208,77 @@ msgstr "" msgid "mm" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709 +#: src/slic3r/GUI/BedShapeDialog.cpp:97 src/libslic3r/PrintConfig.cpp:709 msgid "Diameter" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:94 +#: src/slic3r/GUI/BedShapeDialog.cpp:98 msgid "" "Diameter of the print bed. It is assumed that origin (0,0) is located in the " "center." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249 +#: src/slic3r/GUI/BedShapeDialog.cpp:102 src/slic3r/GUI/GUI_Preview.cpp:308 #: src/libslic3r/ExtrusionEntity.cpp:322 msgid "Custom" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:102 +#: src/slic3r/GUI/BedShapeDialog.cpp:106 msgid "Load shape from STL..." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:155 +#: src/slic3r/GUI/BedShapeDialog.cpp:159 msgid "Settings" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:172 +#: src/slic3r/GUI/BedShapeDialog.cpp:176 msgid "Texture" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261 +#: src/slic3r/GUI/BedShapeDialog.cpp:186 src/slic3r/GUI/BedShapeDialog.cpp:265 msgid "Load..." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269 -#: src/slic3r/GUI/Tab.cpp:3145 +#: src/slic3r/GUI/BedShapeDialog.cpp:194 src/slic3r/GUI/BedShapeDialog.cpp:273 +#: src/slic3r/GUI/Tab.cpp:3155 msgid "Remove" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302 +#: src/slic3r/GUI/BedShapeDialog.cpp:227 src/slic3r/GUI/BedShapeDialog.cpp:306 msgid "Not found:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:251 +#: src/slic3r/GUI/BedShapeDialog.cpp:255 msgid "Model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:487 +#: src/slic3r/GUI/BedShapeDialog.cpp:491 msgid "Choose an STL file to import bed shape from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543 -#: src/slic3r/GUI/BedShapeDialog.cpp:566 +#: src/slic3r/GUI/BedShapeDialog.cpp:498 src/slic3r/GUI/BedShapeDialog.cpp:547 +#: src/slic3r/GUI/BedShapeDialog.cpp:570 msgid "Invalid file format." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:505 +#: src/slic3r/GUI/BedShapeDialog.cpp:509 msgid "Error! Invalid model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:513 +#: src/slic3r/GUI/BedShapeDialog.cpp:517 msgid "The selected file contains no geometry." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:517 +#: src/slic3r/GUI/BedShapeDialog.cpp:521 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:532 +#: src/slic3r/GUI/BedShapeDialog.cpp:536 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:555 +#: src/slic3r/GUI/BedShapeDialog.cpp:559 msgid "Choose an STL file to import bed model from:" msgstr "" @@ -336,7 +336,7 @@ msgid "" msgstr "" #: src/slic3r/GUI/ConfigManipulation.cpp:49 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1109 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1116 #: src/libslic3r/PrintConfig.cpp:71 msgid "Layer height" msgstr "" @@ -424,8 +424,8 @@ msgstr "" #: src/slic3r/GUI/ConfigManipulation.cpp:211 #: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:96 -#: src/slic3r/GUI/GUI_ObjectList.cpp:612 src/slic3r/GUI/Plater.cpp:532 -#: src/slic3r/GUI/Tab.cpp:1151 src/slic3r/GUI/Tab.cpp:1152 +#: src/slic3r/GUI/GUI_ObjectList.cpp:618 src/slic3r/GUI/Plater.cpp:534 +#: src/slic3r/GUI/Tab.cpp:1158 src/slic3r/GUI/Tab.cpp:1159 #: src/libslic3r/PrintConfig.cpp:203 src/libslic3r/PrintConfig.cpp:416 #: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:776 #: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:827 @@ -480,7 +480,7 @@ msgstr "" msgid "PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1562 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1563 msgid "print" msgstr "" @@ -488,11 +488,11 @@ msgstr "" msgid "filaments" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1566 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1567 msgid "printer" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:1027 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:1034 msgid "vendor" msgstr "" @@ -546,12 +546,12 @@ msgid "Standard" msgstr "" #: src/slic3r/GUI/ConfigWizard.cpp:305 src/slic3r/GUI/ConfigWizard.cpp:588 -#: src/slic3r/GUI/Tab.cpp:3204 +#: src/slic3r/GUI/Tab.cpp:3214 msgid "All" msgstr "" #: src/slic3r/GUI/ConfigWizard.cpp:306 src/slic3r/GUI/ConfigWizard.cpp:589 -#: src/slic3r/GUI/Plater.cpp:504 src/slic3r/GUI/Plater.cpp:644 +#: src/slic3r/GUI/Plater.cpp:506 src/slic3r/GUI/Plater.cpp:646 #: src/libslic3r/ExtrusionEntity.cpp:309 msgid "None" msgstr "" @@ -660,9 +660,9 @@ msgid "" "an update is applied." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:813 src/slic3r/GUI/GUI_ObjectList.cpp:1672 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4025 src/slic3r/GUI/Plater.cpp:3292 -#: src/slic3r/GUI/Plater.cpp:4001 src/slic3r/GUI/Plater.cpp:4030 +#: src/slic3r/GUI/ConfigWizard.cpp:813 src/slic3r/GUI/GUI_ObjectList.cpp:1678 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4040 src/slic3r/GUI/Plater.cpp:3225 +#: src/slic3r/GUI/Plater.cpp:3938 src/slic3r/GUI/Plater.cpp:3967 msgid "Reload from disk" msgstr "" @@ -717,7 +717,7 @@ msgstr "" msgid "Firmware Type" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:906 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/ConfigWizard.cpp:906 src/slic3r/GUI/Tab.cpp:1980 msgid "Firmware" msgstr "" @@ -819,8 +819,8 @@ msgstr "" msgid "SLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1810 src/slic3r/GUI/DoubleSlider.cpp:1905 -#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:246 +#: src/slic3r/GUI/ConfigWizard.cpp:1810 src/slic3r/GUI/DoubleSlider.cpp:1907 +#: src/slic3r/GUI/DoubleSlider.cpp:1928 src/slic3r/GUI/GUI.cpp:246 msgid "Notice" msgstr "" @@ -873,7 +873,7 @@ msgstr "" msgid "Filament Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 src/slic3r/GUI/GUI_ObjectList.cpp:3622 +#: src/slic3r/GUI/ConfigWizard.cpp:2097 src/slic3r/GUI/GUI_ObjectList.cpp:3637 msgid "Type:" msgstr "" @@ -901,63 +901,63 @@ msgstr "" msgid "Configuration &Wizard" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:79 +#: src/slic3r/GUI/DoubleSlider.cpp:81 msgid "Place bearings in slots and resume printing" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:950 +#: src/slic3r/GUI/DoubleSlider.cpp:952 msgid "One layer mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:952 +#: src/slic3r/GUI/DoubleSlider.cpp:954 msgid "Discard all custom changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:955 +#: src/slic3r/GUI/DoubleSlider.cpp:957 #, possible-c-format msgid "Jump to height %s or Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529 -#: src/slic3r/GUI/DoubleSlider.cpp:1651 +#: src/slic3r/GUI/DoubleSlider.cpp:959 src/slic3r/GUI/DoubleSlider.cpp:1531 +#: src/slic3r/GUI/DoubleSlider.cpp:1653 msgid "Jump to height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:960 +#: src/slic3r/GUI/DoubleSlider.cpp:962 msgid "Edit current color - Right click the colored slider segment" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:970 +#: src/slic3r/GUI/DoubleSlider.cpp:972 msgid "Print mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:984 +#: src/slic3r/GUI/DoubleSlider.cpp:986 msgid "Add extruder change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:986 +#: src/slic3r/GUI/DoubleSlider.cpp:988 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:988 +#: src/slic3r/GUI/DoubleSlider.cpp:990 msgid "Add color change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:989 +#: src/slic3r/GUI/DoubleSlider.cpp:991 msgid "or press \"+\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:991 +#: src/slic3r/GUI/DoubleSlider.cpp:993 msgid "Add another code - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:992 +#: src/slic3r/GUI/DoubleSlider.cpp:994 msgid "Add another code - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:998 +#: src/slic3r/GUI/DoubleSlider.cpp:1000 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -965,200 +965,200 @@ msgid "" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1005 +#: src/slic3r/GUI/DoubleSlider.cpp:1009 msgid "Color change (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1006 +#: src/slic3r/GUI/DoubleSlider.cpp:1010 msgid "Color change (\"%1%\") for Extruder %2%" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1009 +#: src/slic3r/GUI/DoubleSlider.cpp:1012 msgid "Pause print (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1011 +#: src/slic3r/GUI/DoubleSlider.cpp:1014 msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1019 +#: src/slic3r/GUI/DoubleSlider.cpp:1021 msgid "Note" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1021 +#: src/slic3r/GUI/DoubleSlider.cpp:1023 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:1024 +#: src/slic3r/GUI/DoubleSlider.cpp:1026 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:1027 +#: src/slic3r/GUI/DoubleSlider.cpp:1029 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:1030 +#: src/slic3r/GUI/DoubleSlider.cpp:1032 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:1035 +#: src/slic3r/GUI/DoubleSlider.cpp:1037 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1037 +#: src/slic3r/GUI/DoubleSlider.cpp:1039 msgid "Edit tick mark - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1038 +#: src/slic3r/GUI/DoubleSlider.cpp:1040 msgid "Edit tick mark - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1134 src/slic3r/GUI/DoubleSlider.cpp:1170 -#: src/slic3r/GUI/GLCanvas3D.cpp:977 src/slic3r/GUI/GUI_ObjectList.cpp:1712 -#: src/slic3r/GUI/Tab.cpp:2305 src/libslic3r/GCode/PreviewData.cpp:445 +#: src/slic3r/GUI/DoubleSlider.cpp:1136 src/slic3r/GUI/DoubleSlider.cpp:1172 +#: src/slic3r/GUI/GLCanvas3D.cpp:996 src/slic3r/GUI/GUI_ObjectList.cpp:1718 +#: src/slic3r/GUI/Tab.cpp:2315 src/libslic3r/GCode/PreviewData.cpp:446 #, possible-c-format msgid "Extruder %d" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1713 +#: src/slic3r/GUI/DoubleSlider.cpp:1137 src/slic3r/GUI/GUI_ObjectList.cpp:1719 msgid "active" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1144 +#: src/slic3r/GUI/DoubleSlider.cpp:1146 msgid "Switch code to Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1144 src/slic3r/GUI/GUI_ObjectList.cpp:1679 +#: src/slic3r/GUI/DoubleSlider.cpp:1146 src/slic3r/GUI/GUI_ObjectList.cpp:1685 msgid "Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1145 +#: src/slic3r/GUI/DoubleSlider.cpp:1147 msgid "Change extruder (N/A)" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1147 +#: src/slic3r/GUI/DoubleSlider.cpp:1149 msgid "Use another extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1171 +#: src/slic3r/GUI/DoubleSlider.cpp:1173 msgid "used" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1179 +#: src/slic3r/GUI/DoubleSlider.cpp:1181 msgid "Switch code to Color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1180 +#: src/slic3r/GUI/DoubleSlider.cpp:1182 msgid "Add color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1477 +#: src/slic3r/GUI/DoubleSlider.cpp:1479 msgid "Add color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1487 +#: src/slic3r/GUI/DoubleSlider.cpp:1489 msgid "Add pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1490 +#: src/slic3r/GUI/DoubleSlider.cpp:1492 msgid "Add custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1508 +#: src/slic3r/GUI/DoubleSlider.cpp:1510 msgid "Edit color" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1509 +#: src/slic3r/GUI/DoubleSlider.cpp:1511 msgid "Edit pause print message" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1510 +#: src/slic3r/GUI/DoubleSlider.cpp:1512 msgid "Edit custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1516 +#: src/slic3r/GUI/DoubleSlider.cpp:1518 msgid "Delete color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1517 +#: src/slic3r/GUI/DoubleSlider.cpp:1519 msgid "Delete tool change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1518 +#: src/slic3r/GUI/DoubleSlider.cpp:1520 msgid "Delete pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1519 +#: src/slic3r/GUI/DoubleSlider.cpp:1521 msgid "Delete custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1532 +#: src/slic3r/GUI/DoubleSlider.cpp:1534 msgid "Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1618 +#: src/slic3r/GUI/DoubleSlider.cpp:1620 msgid "Enter custom G-code used on current layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1619 +#: src/slic3r/GUI/DoubleSlider.cpp:1621 msgid "Custom G-code on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1634 +#: src/slic3r/GUI/DoubleSlider.cpp:1636 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1635 +#: src/slic3r/GUI/DoubleSlider.cpp:1637 msgid "Message for pause print on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1650 +#: src/slic3r/GUI/DoubleSlider.cpp:1652 msgid "Enter the height you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1899 +#: src/slic3r/GUI/DoubleSlider.cpp:1901 msgid "The last color change data was saved for a single extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1900 src/slic3r/GUI/DoubleSlider.cpp:1916 +#: src/slic3r/GUI/DoubleSlider.cpp:1902 src/slic3r/GUI/DoubleSlider.cpp:1918 msgid "The last color change data was saved for a multi extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1902 +#: src/slic3r/GUI/DoubleSlider.cpp:1904 msgid "Your current changes will delete all saved color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924 +#: src/slic3r/GUI/DoubleSlider.cpp:1905 src/slic3r/GUI/DoubleSlider.cpp:1926 msgid "Are you sure you want to continue?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1917 +#: src/slic3r/GUI/DoubleSlider.cpp:1919 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:1920 +#: src/slic3r/GUI/DoubleSlider.cpp:1922 msgid "Do you want to delete all saved tool changes?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1922 +#: src/slic3r/GUI/DoubleSlider.cpp:1924 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:1923 +#: src/slic3r/GUI/DoubleSlider.cpp:1925 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" @@ -1208,11 +1208,11 @@ msgid "%s doesn't support percentage" msgstr "" #: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:383 +#: src/slic3r/GUI/Field.cpp:1298 src/slic3r/GUI/GUI_ObjectLayers.cpp:383 msgid "Invalid numeric input." msgstr "" -#: src/slic3r/GUI/Field.cpp:204 +#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/Field.cpp:1310 msgid "Input value is out of range" msgstr "" @@ -1300,8 +1300,8 @@ msgstr "" msgid "Firmware image:" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1706 -#: src/slic3r/GUI/Tab.cpp:1768 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1716 +#: src/slic3r/GUI/Tab.cpp:1778 msgid "Browse" msgstr "" @@ -1334,7 +1334,7 @@ msgid "Advanced: Output log" msgstr "" #: src/slic3r/GUI/FirmwareDialog.cpp:852 -#: src/slic3r/GUI/Mouse3DController.cpp:355 +#: src/slic3r/GUI/Mouse3DController.cpp:371 #: src/slic3r/GUI/PrintHostDialogs.cpp:161 msgid "Close" msgstr "" @@ -1353,390 +1353,409 @@ msgstr "" msgid "Cancelling..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4596 +#: src/slic3r/GUI/GLCanvas3D.cpp:238 src/slic3r/GUI/GLCanvas3D.cpp:4962 msgid "Variable layer height" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:237 +#: src/slic3r/GUI/GLCanvas3D.cpp:241 msgid "Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:240 +#: src/slic3r/GUI/GLCanvas3D.cpp:244 msgid "Add detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:247 msgid "Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:246 +#: src/slic3r/GUI/GLCanvas3D.cpp:250 msgid "Remove detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:249 +#: src/slic3r/GUI/GLCanvas3D.cpp:253 msgid "Shift + Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:252 +#: src/slic3r/GUI/GLCanvas3D.cpp:256 msgid "Reset to base" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:255 +#: src/slic3r/GUI/GLCanvas3D.cpp:259 msgid "Shift + Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:258 +#: src/slic3r/GUI/GLCanvas3D.cpp:262 msgid "Smoothing" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:261 +#: src/slic3r/GUI/GLCanvas3D.cpp:265 msgid "Mouse wheel:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:264 +#: src/slic3r/GUI/GLCanvas3D.cpp:268 msgid "Increase/decrease edit area" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:267 +#: src/slic3r/GUI/GLCanvas3D.cpp:271 msgid "Adaptive" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:273 +#: src/slic3r/GUI/GLCanvas3D.cpp:277 msgid "Quality / Speed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:277 +#: src/slic3r/GUI/GLCanvas3D.cpp:281 msgid "Higher print quality versus higher print speed." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:288 +#: src/slic3r/GUI/GLCanvas3D.cpp:292 msgid "Smooth" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511 +#: src/slic3r/GUI/GLCanvas3D.cpp:298 src/libslic3r/PrintConfig.cpp:511 msgid "Radius" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:304 +#: src/slic3r/GUI/GLCanvas3D.cpp:308 msgid "Keep min" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:313 +#: src/slic3r/GUI/GLCanvas3D.cpp:317 msgid "Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:599 +#: src/slic3r/GUI/GLCanvas3D.cpp:607 msgid "Variable layer height - Manual edit" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:685 +#: src/slic3r/GUI/GLCanvas3D.cpp:693 msgid "An object outside the print area was detected" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:686 +#: src/slic3r/GUI/GLCanvas3D.cpp:694 msgid "A toolpath outside the print area was detected" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:687 +#: src/slic3r/GUI/GLCanvas3D.cpp:695 msgid "SLA supports outside the print area were detected" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:688 +#: src/slic3r/GUI/GLCanvas3D.cpp:696 msgid "Some objects are not visible" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:690 +#: src/slic3r/GUI/GLCanvas3D.cpp:698 msgid "" "An object outside the print area was detected\n" "Resolve the current problem to continue slicing" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:904 src/slic3r/GUI/GLCanvas3D.cpp:933 +#: src/slic3r/GUI/GLCanvas3D.cpp:923 src/slic3r/GUI/GLCanvas3D.cpp:952 msgid "Default print color" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:934 src/slic3r/GUI/GLCanvas3D.cpp:943 -#: src/slic3r/GUI/GLCanvas3D.cpp:982 +#: src/slic3r/GUI/GLCanvas3D.cpp:953 src/slic3r/GUI/GLCanvas3D.cpp:962 +#: src/slic3r/GUI/GLCanvas3D.cpp:1001 msgid "Pause print or custom G-code" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:955 +#: src/slic3r/GUI/GLCanvas3D.cpp:974 #, possible-c-format msgid "up to %.2f mm" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:959 +#: src/slic3r/GUI/GLCanvas3D.cpp:978 #, possible-c-format msgid "above %.2f mm" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:963 +#: src/slic3r/GUI/GLCanvas3D.cpp:982 #, possible-c-format msgid "%.2f - %.2f mm" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:995 +#: src/slic3r/GUI/GLCanvas3D.cpp:1014 #, possible-c-format msgid "Color change for Extruder %d at %.2f mm" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1305 +#: src/slic3r/GUI/GLCanvas3D.cpp:1332 msgid "Seq." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1701 +#: src/slic3r/GUI/GLCanvas3D.cpp:1439 +msgid "canvas_tooltip" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1466 +msgid "Slope visualization" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1468 +msgid "Facets' normal angle range (degrees)" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1495 src/slic3r/GUI/GUI_ObjectList.cpp:1718 +#: src/libslic3r/PrintConfig.cpp:335 +msgid "Default" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1880 msgid "Variable layer height - Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1709 +#: src/slic3r/GUI/GLCanvas3D.cpp:1888 msgid "Variable layer height - Adaptive" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1717 +#: src/slic3r/GUI/GLCanvas3D.cpp:1896 msgid "Variable layer height - Smooth all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:2053 +#: src/slic3r/GUI/GLCanvas3D.cpp:2332 msgid "Mirror Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:2921 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:570 +#: src/slic3r/GUI/GLCanvas3D.cpp:3224 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:519 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:746 msgid "Gizmo-Move" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3001 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:572 +#: src/slic3r/GUI/GLCanvas3D.cpp:3308 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:748 msgid "Gizmo-Rotate" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3529 +#: src/slic3r/GUI/GLCanvas3D.cpp:3880 msgid "Move Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4070 +#: src/slic3r/GUI/GLCanvas3D.cpp:4425 msgid "Undo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4070 +#: src/slic3r/GUI/GLCanvas3D.cpp:4425 msgid "Redo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4088 +#: src/slic3r/GUI/GLCanvas3D.cpp:4446 #, possible-c-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4088 +#: src/slic3r/GUI/GLCanvas3D.cpp:4446 #, possible-c-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4490 +#: src/slic3r/GUI/GLCanvas3D.cpp:4856 msgid "Add..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4498 src/slic3r/GUI/GUI_ObjectList.cpp:1726 -#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4020 -#: src/slic3r/GUI/Tab.cpp:3145 +#: src/slic3r/GUI/GLCanvas3D.cpp:4864 src/slic3r/GUI/GUI_ObjectList.cpp:1732 +#: src/slic3r/GUI/Plater.cpp:3935 src/slic3r/GUI/Plater.cpp:3957 +#: src/slic3r/GUI/Tab.cpp:3155 msgid "Delete" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4507 src/slic3r/GUI/KBShortcutsDialog.cpp:131 -#: src/slic3r/GUI/Plater.cpp:4740 +#: src/slic3r/GUI/GLCanvas3D.cpp:4873 src/slic3r/GUI/KBShortcutsDialog.cpp:131 +#: src/slic3r/GUI/Plater.cpp:4705 msgid "Delete all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4516 src/slic3r/GUI/KBShortcutsDialog.cpp:157 -#: src/slic3r/GUI/Plater.cpp:2816 +#: src/slic3r/GUI/GLCanvas3D.cpp:4882 src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/Plater.cpp:2815 msgid "Arrange" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4516 src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/GLCanvas3D.cpp:4882 src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Arrange selection" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4894 msgid "Copy" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4537 +#: src/slic3r/GUI/GLCanvas3D.cpp:4903 msgid "Paste" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4549 src/slic3r/GUI/Plater.cpp:3855 -#: src/slic3r/GUI/Plater.cpp:3867 src/slic3r/GUI/Plater.cpp:4007 +#: src/slic3r/GUI/GLCanvas3D.cpp:4915 src/slic3r/GUI/Plater.cpp:3794 +#: src/slic3r/GUI/Plater.cpp:3806 src/slic3r/GUI/Plater.cpp:3944 msgid "Add instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/Plater.cpp:4009 +#: src/slic3r/GUI/GLCanvas3D.cpp:4926 src/slic3r/GUI/Plater.cpp:3946 msgid "Remove instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4573 +#: src/slic3r/GUI/GLCanvas3D.cpp:4939 msgid "Split to objects" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4583 src/slic3r/GUI/GUI_ObjectList.cpp:1495 +#: src/slic3r/GUI/GLCanvas3D.cpp:4949 src/slic3r/GUI/GUI_ObjectList.cpp:1501 msgid "Split to parts" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:132 -#: src/slic3r/GUI/MainFrame.cpp:662 +#: src/slic3r/GUI/GLCanvas3D.cpp:5013 src/slic3r/GUI/KBShortcutsDialog.cpp:132 +#: src/slic3r/GUI/MainFrame.cpp:717 msgid "Undo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/GLCanvas3D.cpp:4680 -msgid "Click right mouse button to open History" +#: src/slic3r/GUI/GLCanvas3D.cpp:5013 src/slic3r/GUI/GLCanvas3D.cpp:5052 +msgid "Click right mouse button to open/close History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4664 +#: src/slic3r/GUI/GLCanvas3D.cpp:5036 msgid "Next Undo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4680 src/slic3r/GUI/KBShortcutsDialog.cpp:133 -#: src/slic3r/GUI/MainFrame.cpp:665 +#: src/slic3r/GUI/GLCanvas3D.cpp:5052 src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/MainFrame.cpp:720 msgid "Redo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4696 +#: src/slic3r/GUI/GLCanvas3D.cpp:5074 msgid "Next Redo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6609 +#: src/slic3r/GUI/GLCanvas3D.cpp:7064 msgid "Selection-Add from rectangle" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6628 +#: src/slic3r/GUI/GLCanvas3D.cpp:7083 msgid "Selection-Remove from rectangle" msgstr "" -#: src/slic3r/GUI/GLCanvas3DManager.cpp:306 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:365 #, possible-c-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" "while OpenGL version %s, render %s, vendor %s was detected." msgstr "" -#: src/slic3r/GUI/GLCanvas3DManager.cpp:309 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:368 msgid "You may need to update your graphics card driver." msgstr "" -#: src/slic3r/GUI/GLCanvas3DManager.cpp:312 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:371 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw_renderer parameter." msgstr "" -#: src/slic3r/GUI/GLCanvas3DManager.cpp:314 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:373 msgid "Unsupported OpenGL version" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3424 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:145 src/libslic3r/PrintConfig.cpp:3424 msgid "Cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169 msgid "Keep upper part" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 msgid "Keep lower part" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:171 msgid "Rotate lower part upwards" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:176 msgid "Perform cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 msgid "Place on face" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 msgid "Hollow this object" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 msgid "Preview hollowed and drilled model" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 msgid "Offset" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 msgid "Quality" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 #: src/libslic3r/PrintConfig.cpp:2951 msgid "Closing distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 msgid "Hole diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 msgid "Hole depth" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 msgid "Remove selected holes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 msgid "Remove all holes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 msgid "Clipping of view" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 msgid "Reset direction" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 msgid "Show supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:423 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:307 msgid "Add drainage hole" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:541 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:428 msgid "Delete drainage hole" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:815 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:628 msgid "Hollowing parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:887 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:699 msgid "Change drainage hole diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:979 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:791 msgid "Hollow and drill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1061 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:846 msgid "Move drainage hole" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64 msgid "Move" msgstr "" @@ -1748,7 +1767,7 @@ msgstr "" msgid "Rotate" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518 @@ -1756,194 +1775,195 @@ msgstr "" msgid "Scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 msgid "Head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 msgid "Lock supports under new islands" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1361 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 msgid "Remove selected points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 msgid "Remove all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 msgid "Apply changes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 msgid "Discard changes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 msgid "Minimal points distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 #: src/libslic3r/PrintConfig.cpp:2781 msgid "Support points density" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 msgid "Auto-generate points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 msgid "Manual editing" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:484 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:373 msgid "Add support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:621 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:513 msgid "Delete support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:810 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:693 msgid "Change point head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:878 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:761 msgid "Support parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:986 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:868 msgid "SLA Support Points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1007 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:893 msgid "SLA gizmo turned on" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1035 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:909 msgid "Do you want to save your manually edited support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1036 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:910 msgid "Save changes?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:922 msgid "SLA gizmo turned off" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1087 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:953 msgid "Move support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1046 msgid "Support points edit" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1258 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1125 msgid "Autogeneration will erase all manually edited points." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1259 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1126 msgid "Are you sure you want to do it?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 src/slic3r/GUI/GUI.cpp:258 -#: src/slic3r/GUI/Tab.cpp:3075 src/slic3r/GUI/WipeTowerDialog.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/Tab.cpp:3085 src/slic3r/GUI/WipeTowerDialog.cpp:45 #: src/slic3r/GUI/WipeTowerDialog.cpp:366 msgid "Warning" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 msgid "Autogenerate support points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1324 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1179 msgid "SLA gizmo keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1335 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1190 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1357 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1208 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 msgid "Left click" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1208 msgid "Add point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1209 msgid "Right click" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1209 msgid "Remove point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1358 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1359 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 msgid "Drag" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 msgid "Move point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 msgid "Add point to selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1357 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 msgid "Remove point from selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1358 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 msgid "Select by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1359 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 msgid "Deselect by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1360 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 msgid "Select all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1362 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 msgid "Mouse wheel" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1362 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 msgid "Move clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 msgid "Reset clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 msgid "Switch to editing mode" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:497 -msgid "Gizmo-Place on Face" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:747 msgid "Gizmo-Scale" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:184 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:662 +msgid "Gizmo-Place on Face" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:234 #, possible-c-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -1953,184 +1973,177 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:187 +#: src/slic3r/GUI/GUI_App.cpp:237 msgid "Fatal error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:487 +#: src/slic3r/GUI/GUI_App.cpp:554 msgid "Changing of an application language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:490 src/slic3r/GUI/GUI_App.cpp:498 +#: src/slic3r/GUI/GUI_App.cpp:557 src/slic3r/GUI/GUI_App.cpp:565 msgid "Recreating" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:503 +#: src/slic3r/GUI/GUI_App.cpp:570 msgid "Loading of current presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:508 +#: src/slic3r/GUI/GUI_App.cpp:575 msgid "Loading of a mode view" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:587 +#: src/slic3r/GUI/GUI_App.cpp:654 msgid "Choose one file (3MF/AMF):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:599 +#: src/slic3r/GUI/GUI_App.cpp:672 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:660 +#: src/slic3r/GUI/GUI_App.cpp:733 msgid "Select the language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:660 +#: src/slic3r/GUI/GUI_App.cpp:733 msgid "Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:828 +#: src/slic3r/GUI/GUI_App.cpp:911 #, possible-c-format msgid "Run %s" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:831 +#: src/slic3r/GUI/GUI_App.cpp:914 msgid "&Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:831 +#: src/slic3r/GUI/GUI_App.cpp:914 msgid "Inspect / activate configuration snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:832 +#: src/slic3r/GUI/GUI_App.cpp:915 msgid "Take Configuration &Snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:832 +#: src/slic3r/GUI/GUI_App.cpp:915 msgid "Capture a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:833 +#: src/slic3r/GUI/GUI_App.cpp:916 msgid "Check for updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:833 +#: src/slic3r/GUI/GUI_App.cpp:916 msgid "Check for configuration updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:835 +#: src/slic3r/GUI/GUI_App.cpp:918 msgid "&Preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:841 +#: src/slic3r/GUI/GUI_App.cpp:924 msgid "Application preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:844 src/slic3r/GUI/wxExtensions.cpp:756 +#: src/slic3r/GUI/GUI_App.cpp:927 src/slic3r/GUI/wxExtensions.cpp:756 msgid "Simple" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:844 +#: src/slic3r/GUI/GUI_App.cpp:927 msgid "Simple View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:845 src/slic3r/GUI/GUI_ObjectList.cpp:104 -#: src/slic3r/GUI/GUI_ObjectList.cpp:620 src/slic3r/GUI/Tab.cpp:1147 -#: src/slic3r/GUI/Tab.cpp:1162 src/slic3r/GUI/Tab.cpp:1262 -#: src/slic3r/GUI/Tab.cpp:1265 src/slic3r/GUI/Tab.cpp:1526 -#: src/slic3r/GUI/Tab.cpp:1990 src/slic3r/GUI/Tab.cpp:3720 -#: src/slic3r/GUI/wxExtensions.cpp:757 src/libslic3r/PrintConfig.cpp:88 -#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:223 -#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:2283 -#: src/libslic3r/PrintConfig.cpp:2455 +#: src/slic3r/GUI/GUI_App.cpp:929 src/slic3r/GUI/wxExtensions.cpp:758 +msgctxt "Mode" msgid "Advanced" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:845 +#: src/slic3r/GUI/GUI_App.cpp:929 msgid "Advanced View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:846 src/slic3r/GUI/wxExtensions.cpp:758 +#: src/slic3r/GUI/GUI_App.cpp:930 src/slic3r/GUI/wxExtensions.cpp:759 msgid "Expert" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:846 +#: src/slic3r/GUI/GUI_App.cpp:930 msgid "Expert View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:851 +#: src/slic3r/GUI/GUI_App.cpp:935 msgid "Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:851 +#: src/slic3r/GUI/GUI_App.cpp:935 #, possible-c-format msgid "%s View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:853 +#: src/slic3r/GUI/GUI_App.cpp:937 msgid "&Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:855 +#: src/slic3r/GUI/GUI_App.cpp:939 msgid "Flash printer &firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:855 +#: src/slic3r/GUI/GUI_App.cpp:939 msgid "Upload a firmware image into an Arduino based printer" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:870 +#: src/slic3r/GUI/GUI_App.cpp:954 msgid "Taking configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:870 +#: src/slic3r/GUI/GUI_App.cpp:954 msgid "Snapshot name" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:917 +#: src/slic3r/GUI/GUI_App.cpp:1001 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:919 +#: src/slic3r/GUI/GUI_App.cpp:1003 msgid "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:920 +#: src/slic3r/GUI/GUI_App.cpp:1004 msgid "Language selection" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:944 +#: src/slic3r/GUI/GUI_App.cpp:1028 msgid "&Configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:968 +#: src/slic3r/GUI/GUI_App.cpp:1052 msgid "The presets on the following tabs were modified" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:968 src/slic3r/GUI/Tab.cpp:2935 +#: src/slic3r/GUI/GUI_App.cpp:1052 src/slic3r/GUI/Tab.cpp:2945 msgid "Discard changes and continue anyway?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:971 +#: src/slic3r/GUI/GUI_App.cpp:1055 msgid "Unsaved Presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1120 src/slic3r/GUI/Tab.cpp:2947 +#: src/slic3r/GUI/GUI_App.cpp:1204 src/slic3r/GUI/Tab.cpp:2957 msgid "It's impossible to print multi-part object(s) with SLA technology." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1121 +#: src/slic3r/GUI/GUI_App.cpp:1205 msgid "Please check and fix your object list." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1122 src/slic3r/GUI/Plater.cpp:2375 -#: src/slic3r/GUI/Tab.cpp:2949 +#: src/slic3r/GUI/GUI_App.cpp:1206 src/slic3r/GUI/Plater.cpp:2377 +#: src/slic3r/GUI/Tab.cpp:2959 msgid "Attention!" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1139 +#: src/slic3r/GUI/GUI_App.cpp:1223 msgid "Select a gcode file:" msgstr "" @@ -2151,7 +2164,7 @@ msgid "Add layer range" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:95 -#: src/slic3r/GUI/GUI_ObjectList.cpp:611 src/libslic3r/PrintConfig.cpp:72 +#: src/slic3r/GUI/GUI_ObjectList.cpp:617 src/libslic3r/PrintConfig.cpp:72 #: src/libslic3r/PrintConfig.cpp:175 src/libslic3r/PrintConfig.cpp:184 #: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470 #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:890 @@ -2163,8 +2176,8 @@ msgid "Layers and Perimeters" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:97 -#: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/slic3r/GUI/GUI_Preview.cpp:246 -#: src/slic3r/GUI/Tab.cpp:1181 src/slic3r/GUI/Tab.cpp:1182 +#: src/slic3r/GUI/GUI_ObjectList.cpp:619 src/slic3r/GUI/GUI_Preview.cpp:305 +#: src/slic3r/GUI/Tab.cpp:1188 src/slic3r/GUI/Tab.cpp:1189 #: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:370 #: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1873 #: src/libslic3r/PrintConfig.cpp:1879 src/libslic3r/PrintConfig.cpp:1887 @@ -2180,7 +2193,7 @@ msgid "Support material" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:101 -#: src/slic3r/GUI/GUI_ObjectList.cpp:617 src/libslic3r/PrintConfig.cpp:2259 +#: src/slic3r/GUI/GUI_ObjectList.cpp:623 src/libslic3r/PrintConfig.cpp:2259 #: src/libslic3r/PrintConfig.cpp:2267 msgid "Wipe options" msgstr "" @@ -2205,8 +2218,8 @@ msgstr "" msgid "Add support blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:614 -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/Tab.cpp:1206 +#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:620 +#: src/slic3r/GUI/GUI_Preview.cpp:283 src/slic3r/GUI/Tab.cpp:1213 #: src/libslic3r/PrintConfig.cpp:235 src/libslic3r/PrintConfig.cpp:458 #: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1048 #: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1668 @@ -2215,15 +2228,15 @@ msgstr "" msgid "Speed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:615 -#: src/slic3r/GUI/Tab.cpp:1241 src/slic3r/GUI/Tab.cpp:1861 +#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:621 +#: src/slic3r/GUI/Tab.cpp:1248 src/slic3r/GUI/Tab.cpp:1871 #: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1002 #: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1744 #: src/libslic3r/PrintConfig.cpp:1945 src/libslic3r/PrintConfig.cpp:1972 msgid "Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:622 #: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555 #: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:1010 #: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1764 @@ -2231,9 +2244,20 @@ msgstr "" msgid "Extrusion Width" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/GUI_ObjectList.cpp:622 -#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:3661 -#: src/slic3r/GUI/Tab.cpp:3662 src/libslic3r/PrintConfig.cpp:2621 +#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:626 +#: src/slic3r/GUI/Tab.cpp:1154 src/slic3r/GUI/Tab.cpp:1169 +#: src/slic3r/GUI/Tab.cpp:1269 src/slic3r/GUI/Tab.cpp:1272 +#: src/slic3r/GUI/Tab.cpp:1536 src/slic3r/GUI/Tab.cpp:2000 +#: src/slic3r/GUI/Tab.cpp:3730 src/libslic3r/PrintConfig.cpp:88 +#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:223 +#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2455 +msgid "Advanced" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/GUI_ObjectList.cpp:628 +#: src/slic3r/GUI/Plater.cpp:502 src/slic3r/GUI/Tab.cpp:3671 +#: src/slic3r/GUI/Tab.cpp:3672 src/libslic3r/PrintConfig.cpp:2621 #: src/libslic3r/PrintConfig.cpp:2628 src/libslic3r/PrintConfig.cpp:2637 #: src/libslic3r/PrintConfig.cpp:2646 src/libslic3r/PrintConfig.cpp:2656 #: src/libslic3r/PrintConfig.cpp:2692 src/libslic3r/PrintConfig.cpp:2699 @@ -2245,9 +2269,9 @@ msgstr "" msgid "Supports" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:107 src/slic3r/GUI/GUI_ObjectList.cpp:623 -#: src/slic3r/GUI/Plater.cpp:640 src/slic3r/GUI/Tab.cpp:3695 -#: src/slic3r/GUI/Tab.cpp:3696 src/libslic3r/PrintConfig.cpp:2798 +#: src/slic3r/GUI/GUI_ObjectList.cpp:107 src/slic3r/GUI/GUI_ObjectList.cpp:629 +#: src/slic3r/GUI/Plater.cpp:642 src/slic3r/GUI/Tab.cpp:3705 +#: src/slic3r/GUI/Tab.cpp:3706 src/libslic3r/PrintConfig.cpp:2798 #: src/libslic3r/PrintConfig.cpp:2805 src/libslic3r/PrintConfig.cpp:2819 #: src/libslic3r/PrintConfig.cpp:2830 src/libslic3r/PrintConfig.cpp:2840 #: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 @@ -2257,8 +2281,8 @@ msgstr "" msgid "Pad" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:108 src/slic3r/GUI/Tab.cpp:3713 -#: src/slic3r/GUI/Tab.cpp:3714 src/libslic3r/SLA/Hollowing.cpp:46 +#: src/slic3r/GUI/GUI_ObjectList.cpp:108 src/slic3r/GUI/Tab.cpp:3723 +#: src/slic3r/GUI/Tab.cpp:3724 src/libslic3r/SLA/Hollowing.cpp:46 #: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67 #: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2926 #: src/libslic3r/PrintConfig.cpp:2933 src/libslic3r/PrintConfig.cpp:2943 @@ -2266,343 +2290,339 @@ msgstr "" msgid "Hollowing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:275 +#: src/slic3r/GUI/GUI_ObjectList.cpp:282 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 msgid "Name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:283 src/slic3r/GUI/Tab.cpp:1490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:290 src/slic3r/GUI/Tab.cpp:1500 #: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487 msgid "Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:287 src/slic3r/GUI/GUI_ObjectList.cpp:400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:294 src/slic3r/GUI/GUI_ObjectList.cpp:407 msgid "Editing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:345 +#: src/slic3r/GUI/GUI_ObjectList.cpp:352 #, possible-c-format msgid "Auto-repaired (%d errors):" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:352 +#: src/slic3r/GUI/GUI_ObjectList.cpp:359 msgid "degenerate facets" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:353 +#: src/slic3r/GUI/GUI_ObjectList.cpp:360 msgid "edges fixed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:354 +#: src/slic3r/GUI/GUI_ObjectList.cpp:361 msgid "facets removed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:355 +#: src/slic3r/GUI/GUI_ObjectList.cpp:362 msgid "facets added" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:356 +#: src/slic3r/GUI/GUI_ObjectList.cpp:363 msgid "facets reversed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:357 +#: src/slic3r/GUI/GUI_ObjectList.cpp:364 msgid "backwards edges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:365 +#: src/slic3r/GUI/GUI_ObjectList.cpp:372 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:402 +#: src/slic3r/GUI/GUI_ObjectList.cpp:409 msgid "Right button click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:404 +#: src/slic3r/GUI/GUI_ObjectList.cpp:411 msgid "Click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:408 +#: src/slic3r/GUI/GUI_ObjectList.cpp:415 msgid "Right button click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:410 +#: src/slic3r/GUI/GUI_ObjectList.cpp:417 msgid "Click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:455 src/slic3r/GUI/GUI_ObjectList.cpp:467 -#: src/slic3r/GUI/GUI_ObjectList.cpp:925 src/slic3r/GUI/GUI_ObjectList.cpp:4036 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4046 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4081 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:200 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:257 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:282 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:490 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:1753 +#: src/slic3r/GUI/GUI_ObjectList.cpp:462 src/slic3r/GUI/GUI_ObjectList.cpp:474 +#: src/slic3r/GUI/GUI_ObjectList.cpp:931 src/slic3r/GUI/GUI_ObjectList.cpp:4051 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4061 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4096 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:202 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:284 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:492 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:1755 msgid "default" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:534 +#: src/slic3r/GUI/GUI_ObjectList.cpp:540 msgid "Change Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:555 msgid "Rename Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:555 msgid "Rename Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1099 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3850 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1105 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3865 msgid "Instances to Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1114 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1120 msgid "Volumes in Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1114 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1120 msgid "Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1190 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1538 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1196 #: src/slic3r/GUI/GUI_ObjectList.cpp:1544 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1857 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1550 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1863 #, possible-c-format msgid "Quick Add Settings (%s)" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1273 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1279 msgid "Select showing settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1322 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1328 msgid "Add Settings for Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1323 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1329 msgid "Add Settings for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1324 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1330 msgid "Add Settings for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1394 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1400 msgid "Add Settings Bundle for Height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1395 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1401 msgid "Add Settings Bundle for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1396 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1402 msgid "Add Settings Bundle for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1435 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1441 msgid "Load" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1472 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1476 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1478 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1482 msgid "Box" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 msgid "Cylinder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 msgid "Sphere" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 msgid "Slab" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1508 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1514 msgid "Height range Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1517 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1523 msgid "Add settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1597 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1603 msgid "Change type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1607 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1619 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1613 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Set as a Separated Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1619 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Set as a Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1629 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1635 msgid "Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1644 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1650 msgid "Rename" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1655 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1661 msgid "Fix through the Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1665 src/slic3r/GUI/Plater.cpp:4033 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1671 src/slic3r/GUI/Plater.cpp:3970 msgid "Export as STL" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1672 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4025 src/slic3r/GUI/Plater.cpp:4001 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1678 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4040 src/slic3r/GUI/Plater.cpp:3938 msgid "Reload the selected volumes from disk" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1679 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1685 msgid "Set extruder for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1712 src/libslic3r/PrintConfig.cpp:335 -msgid "Default" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1732 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1738 msgid "Scale to print volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1732 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1738 msgid "Scale the selected object to fit the print volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1801 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2059 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1807 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2065 msgid "Add Shape" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1887 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1893 msgid "Load Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1926 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1932 msgid "Error!" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2001 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2007 msgid "Add Generic Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2030 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2036 msgid "Generic" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2148 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2250 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2154 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2256 msgid "Last instance of an object cannot be deleted." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2160 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2166 msgid "Delete Settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2184 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2190 msgid "Delete All Instances from Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2200 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2206 msgid "Delete Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2231 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 msgid "From Object List You can't delete the last solid part from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2235 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2241 msgid "Delete Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2254 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2260 msgid "Delete Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2278 src/slic3r/GUI/Plater.cpp:3045 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2284 src/slic3r/GUI/Plater.cpp:2978 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2282 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2288 msgid "Split to Parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2336 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2342 msgid "Add Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2462 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2468 msgid "Group manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2474 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2480 msgid "Object manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2487 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2493 msgid "Object Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2491 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 msgid "Part Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2496 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2502 msgid "Layer range Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2502 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2508 msgid "Part manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2508 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 msgid "Instance manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2515 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2521 msgid "Height ranges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2515 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2521 msgid "Settings for height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2701 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2707 msgid "Delete Selected Item" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2838 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2844 msgid "Delete Selected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2914 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2942 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2962 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2920 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2948 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2968 msgid "Add Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3014 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:3012 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3018 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -2610,120 +2630,120 @@ msgid "" "is thinner than the minimum layer height allowed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3017 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3023 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:3070 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3082 msgid "Edit Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3360 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3375 msgid "Selection-Remove from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3368 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3383 msgid "Selection-Add from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3501 msgid "Object or Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3487 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3620 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3502 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3635 msgid "Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3487 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3502 msgid "Layer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3489 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3504 msgid "Unsupported selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3505 #, possible-c-format msgid "You started your selection with %s Item." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3491 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3506 #, possible-c-format msgid "In this mode you can select only other %s Items%s" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3494 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3509 msgid "of a current Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3499 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3574 src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3589 src/slic3r/GUI/Plater.cpp:143 msgid "Info" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3615 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3630 msgid "You can't change a type of the last solid part of the object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3620 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3635 msgid "Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3620 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3635 msgid "Support Enforcer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3620 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3635 msgid "Support Blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3622 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3637 msgid "Select type of part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3627 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3642 msgid "Change Part Type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3887 msgid "Enter new name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3887 msgid "Renaming" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3888 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3995 src/slic3r/GUI/Tab.cpp:3519 -#: src/slic3r/GUI/Tab.cpp:3523 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3903 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4010 src/slic3r/GUI/Tab.cpp:3529 +#: src/slic3r/GUI/Tab.cpp:3533 msgid "The supplied name is not valid;" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3889 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3996 src/slic3r/GUI/Tab.cpp:3520 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3904 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4011 src/slic3r/GUI/Tab.cpp:3530 msgid "the following characters are not allowed:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4040 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4055 msgid "Select extruder number:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4041 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4056 msgid "This extruder will be set for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4066 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4081 msgid "Change Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4163 src/slic3r/GUI/Selection.cpp:1475 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4178 src/slic3r/GUI/Selection.cpp:1481 msgid "Set Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4163 src/slic3r/GUI/Selection.cpp:1475 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4178 src/slic3r/GUI/Selection.cpp:1481 msgid "Set Unprintable" msgstr "" @@ -2741,7 +2761,7 @@ msgstr "" msgid "Select coordinate space, in which the transformation will be performed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:641 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638 msgid "Object name" msgstr "" @@ -2752,8 +2772,8 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458 -#: src/slic3r/GUI/Mouse3DController.cpp:290 -#: src/slic3r/GUI/Mouse3DController.cpp:313 +#: src/slic3r/GUI/Mouse3DController.cpp:295 +#: src/slic3r/GUI/Mouse3DController.cpp:318 msgid "Rotation" msgstr "" @@ -2842,117 +2862,117 @@ msgstr "" msgid "Change Option %s" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:218 +#: src/slic3r/GUI/GUI_Preview.cpp:277 msgid "View" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/GUI_Preview.cpp:575 -#: src/libslic3r/GCode/PreviewData.cpp:345 +#: src/slic3r/GUI/GUI_Preview.cpp:280 src/slic3r/GUI/GUI_Preview.cpp:641 +#: src/libslic3r/GCode/PreviewData.cpp:346 msgid "Feature type" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:500 +#: src/slic3r/GUI/GUI_Preview.cpp:281 src/libslic3r/PrintConfig.cpp:500 msgid "Height" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2245 +#: src/slic3r/GUI/GUI_Preview.cpp:282 src/libslic3r/PrintConfig.cpp:2245 msgid "Width" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1513 +#: src/slic3r/GUI/GUI_Preview.cpp:284 src/slic3r/GUI/Tab.cpp:1523 msgid "Fan speed" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:226 +#: src/slic3r/GUI/GUI_Preview.cpp:285 msgid "Volumetric flow rate" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:335 -#: src/slic3r/GUI/GUI_Preview.cpp:519 src/slic3r/GUI/GUI_Preview.cpp:574 -#: src/slic3r/GUI/GUI_Preview.cpp:835 src/libslic3r/GCode/PreviewData.cpp:357 +#: src/slic3r/GUI/GUI_Preview.cpp:286 src/slic3r/GUI/GUI_Preview.cpp:401 +#: src/slic3r/GUI/GUI_Preview.cpp:585 src/slic3r/GUI/GUI_Preview.cpp:640 +#: src/slic3r/GUI/GUI_Preview.cpp:901 src/libslic3r/GCode/PreviewData.cpp:358 msgid "Tool" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:572 -#: src/libslic3r/GCode/PreviewData.cpp:359 +#: src/slic3r/GUI/GUI_Preview.cpp:287 src/slic3r/GUI/GUI_Preview.cpp:638 +#: src/libslic3r/GCode/PreviewData.cpp:360 msgid "Color Print" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:231 +#: src/slic3r/GUI/GUI_Preview.cpp:290 msgid "Show" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235 +#: src/slic3r/GUI/GUI_Preview.cpp:293 src/slic3r/GUI/GUI_Preview.cpp:294 msgid "Feature types" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:310 +#: src/slic3r/GUI/GUI_Preview.cpp:296 src/libslic3r/ExtrusionEntity.cpp:310 msgid "Perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311 +#: src/slic3r/GUI/GUI_Preview.cpp:297 src/libslic3r/ExtrusionEntity.cpp:311 msgid "External perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312 +#: src/slic3r/GUI/GUI_Preview.cpp:298 src/libslic3r/ExtrusionEntity.cpp:312 msgid "Overhang perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313 +#: src/slic3r/GUI/GUI_Preview.cpp:299 src/libslic3r/ExtrusionEntity.cpp:313 msgid "Internal infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/slic3r/GUI/GUI_Preview.cpp:300 src/libslic3r/ExtrusionEntity.cpp:314 #: src/libslic3r/PrintConfig.cpp:1763 src/libslic3r/PrintConfig.cpp:1774 msgid "Solid infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/slic3r/GUI/GUI_Preview.cpp:301 src/libslic3r/ExtrusionEntity.cpp:315 #: src/libslic3r/PrintConfig.cpp:2112 src/libslic3r/PrintConfig.cpp:2124 msgid "Top solid infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316 +#: src/slic3r/GUI/GUI_Preview.cpp:302 src/libslic3r/ExtrusionEntity.cpp:316 msgid "Bridge infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/slic3r/GUI/GUI_Preview.cpp:303 src/libslic3r/ExtrusionEntity.cpp:317 #: src/libslic3r/PrintConfig.cpp:918 msgid "Gap fill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1171 +#: src/slic3r/GUI/GUI_Preview.cpp:304 src/slic3r/GUI/Tab.cpp:1178 #: src/libslic3r/ExtrusionEntity.cpp:318 msgid "Skirt" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320 +#: src/slic3r/GUI/GUI_Preview.cpp:306 src/libslic3r/ExtrusionEntity.cpp:320 #: src/libslic3r/PrintConfig.cpp:1998 msgid "Support material interface" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1252 +#: src/slic3r/GUI/GUI_Preview.cpp:307 src/slic3r/GUI/Tab.cpp:1259 #: src/libslic3r/ExtrusionEntity.cpp:321 msgid "Wipe tower" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2159 +#: src/slic3r/GUI/GUI_Preview.cpp:312 src/libslic3r/PrintConfig.cpp:2159 msgid "Travel" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:254 +#: src/slic3r/GUI/GUI_Preview.cpp:313 msgid "Retractions" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:255 +#: src/slic3r/GUI/GUI_Preview.cpp:314 msgid "Unretractions" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:256 +#: src/slic3r/GUI/GUI_Preview.cpp:315 msgid "Shells" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:257 +#: src/slic3r/GUI/GUI_Preview.cpp:316 msgid "Legend" msgstr "" @@ -2960,7 +2980,7 @@ msgstr "" msgid "ERROR: not enough resources to execute a new job." msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:789 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:855 msgid "Keyboard Shortcuts" msgstr "" @@ -2996,12 +3016,12 @@ msgstr "" msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:896 -#: src/slic3r/GUI/Plater.cpp:5562 src/libslic3r/PrintConfig.cpp:3375 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:898 +#: src/slic3r/GUI/Plater.cpp:5531 src/libslic3r/PrintConfig.cpp:3375 msgid "Export G-code" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5532 msgid "Send G-code" msgstr "" @@ -3009,7 +3029,7 @@ msgstr "" msgid "Export config" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 src/slic3r/GUI/Plater.cpp:885 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 src/slic3r/GUI/Plater.cpp:887 msgid "Export to SD card / Flash drive" msgstr "" @@ -3078,876 +3098,896 @@ msgstr "" msgid "Show/Hide object/instance labels" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 src/slic3r/GUI/Preferences.cpp:10 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +msgid "Turn On/Off facets' slope rendering" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 src/slic3r/GUI/Preferences.cpp:10 msgid "Preferences" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Show keyboard shortcuts list" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Commands" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Add Instance of the selected object" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Remove Instance of the selected object" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Press to activate selection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 msgid "Press to activate deselection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:214 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Arrow Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Move selection 10 mm in positive Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:210 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 msgid "Arrow Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Move selection 10 mm in negative Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 msgid "Arrow Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Move selection 10 mm in negative X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 msgid "Arrow Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "Move selection 10 mm in positive X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Any arrow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Movement step set to 1 mm" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Movement in camera space" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Page Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Rotate selection 45 degrees CCW" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Page Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Rotate selection 45 degrees CW" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 msgid "Gizmo move" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Gizmo scale" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 msgid "Gizmo rotate" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 msgid "Gizmo cut" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 msgid "Gizmo Place face on bed" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Gizmo SLA hollow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 msgid "Gizmo SLA support points" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Unselect gizmo or clear selection" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 msgid "Change camera type (perspective, orthographic)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 msgid "Zoom to Bed" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 msgid "Zoom in" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 msgid "Zoom out" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:256 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 src/slic3r/GUI/MainFrame.cpp:311 msgid "Plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 #, possible-c-format msgid "" "Press to snap by 5% in Gizmo scale\n" "or to snap by 1mm in Gizmo move" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 msgid "" "Scale selection to fit print volume\n" "in Gizmo scale" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Press to activate one direction scaling in Gizmo scale" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 msgid "" "Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\n" "selected objects around their own center" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 msgid "Gizmos" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 msgid "Upper Layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:210 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:212 msgid "Lower Layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 msgid "Show/Hide Legend" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/Plater.cpp:4172 -#: src/slic3r/GUI/Tab.cpp:2375 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 src/slic3r/GUI/Plater.cpp:4129 +#: src/slic3r/GUI/Tab.cpp:2385 msgid "Preview" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:214 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Move current slider thumb Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 msgid "Move current slider thumb Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 msgid "Set upper thumb to current slider thumb" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 msgid "Set lower thumb to current slider thumb" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 msgid "Add color change marker for current layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 msgid "Delete color change marker for current layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 msgid "Layers Slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 msgid "Keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:71 +#: src/slic3r/GUI/MainFrame.cpp:72 msgid "" " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" "releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:226 +#: src/slic3r/GUI/MainFrame.cpp:281 msgid "based on Slic3r" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:533 msgid "&New Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:533 msgid "Start a new project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:481 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "&Open Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:481 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "Open a project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:486 +#: src/slic3r/GUI/MainFrame.cpp:541 msgid "Recent projects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:495 +#: src/slic3r/GUI/MainFrame.cpp:550 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:495 src/slic3r/GUI/MainFrame.cpp:866 +#: src/slic3r/GUI/MainFrame.cpp:550 src/slic3r/GUI/MainFrame.cpp:932 #: src/slic3r/GUI/PrintHostDialogs.cpp:231 msgid "Error" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:520 +#: src/slic3r/GUI/MainFrame.cpp:575 msgid "&Save Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:520 +#: src/slic3r/GUI/MainFrame.cpp:575 msgid "Save current project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:524 src/slic3r/GUI/MainFrame.cpp:526 +#: src/slic3r/GUI/MainFrame.cpp:579 src/slic3r/GUI/MainFrame.cpp:581 msgid "Save Project &as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:524 src/slic3r/GUI/MainFrame.cpp:526 +#: src/slic3r/GUI/MainFrame.cpp:579 src/slic3r/GUI/MainFrame.cpp:581 msgid "Save current project file as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:534 +#: src/slic3r/GUI/MainFrame.cpp:589 msgid "Import STL/OBJ/AM&F/3MF" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:534 +#: src/slic3r/GUI/MainFrame.cpp:589 msgid "Load a model" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:538 +#: src/slic3r/GUI/MainFrame.cpp:593 msgid "Import &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:538 +#: src/slic3r/GUI/MainFrame.cpp:593 msgid "Load exported configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:541 +#: src/slic3r/GUI/MainFrame.cpp:596 msgid "Import Config from &project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:541 +#: src/slic3r/GUI/MainFrame.cpp:596 msgid "Load configuration from project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:545 +#: src/slic3r/GUI/MainFrame.cpp:600 msgid "Import Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:545 +#: src/slic3r/GUI/MainFrame.cpp:600 msgid "Load presets from a bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:548 +#: src/slic3r/GUI/MainFrame.cpp:603 msgid "&Import" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:551 src/slic3r/GUI/MainFrame.cpp:830 +#: src/slic3r/GUI/MainFrame.cpp:606 src/slic3r/GUI/MainFrame.cpp:896 msgid "Export &G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:551 +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "Export current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:555 src/slic3r/GUI/MainFrame.cpp:831 +#: src/slic3r/GUI/MainFrame.cpp:610 src/slic3r/GUI/MainFrame.cpp:897 msgid "S&end G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:555 +#: src/slic3r/GUI/MainFrame.cpp:610 msgid "Send to print current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "Export G-code to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:563 +#: src/slic3r/GUI/MainFrame.cpp:618 msgid "Export plate as &STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:563 +#: src/slic3r/GUI/MainFrame.cpp:618 msgid "Export current plate as STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:566 +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Export plate as STL &including supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:566 +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Export current plate as STL including supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:569 +#: src/slic3r/GUI/MainFrame.cpp:624 msgid "Export plate as &AMF" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:569 +#: src/slic3r/GUI/MainFrame.cpp:624 msgid "Export current plate as AMF" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:573 +#: src/slic3r/GUI/MainFrame.cpp:628 msgid "Export &toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:573 +#: src/slic3r/GUI/MainFrame.cpp:628 msgid "Export toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:577 +#: src/slic3r/GUI/MainFrame.cpp:632 msgid "Export &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:577 +#: src/slic3r/GUI/MainFrame.cpp:632 msgid "Export current configuration to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:580 +#: src/slic3r/GUI/MainFrame.cpp:635 msgid "Export Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:580 +#: src/slic3r/GUI/MainFrame.cpp:635 msgid "Export all presets to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:583 +#: src/slic3r/GUI/MainFrame.cpp:638 msgid "&Export" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:585 +#: src/slic3r/GUI/MainFrame.cpp:640 msgid "Ejec&t SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:585 +#: src/slic3r/GUI/MainFrame.cpp:640 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:593 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:593 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Slice a file into a G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:599 +#: src/slic3r/GUI/MainFrame.cpp:654 msgid "Quick Slice and Save As" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:599 +#: src/slic3r/GUI/MainFrame.cpp:654 msgid "Slice a file into a G-code, save as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:605 +#: src/slic3r/GUI/MainFrame.cpp:660 msgid "Repeat Last Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:605 +#: src/slic3r/GUI/MainFrame.cpp:660 msgid "Repeat last quick slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:613 +#: src/slic3r/GUI/MainFrame.cpp:668 msgid "(Re)Slice No&w" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:613 +#: src/slic3r/GUI/MainFrame.cpp:668 msgid "Start new slicing process" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:617 +#: src/slic3r/GUI/MainFrame.cpp:672 msgid "&Repair STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:617 +#: src/slic3r/GUI/MainFrame.cpp:672 msgid "Automatically repair an STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:621 +#: src/slic3r/GUI/MainFrame.cpp:676 msgid "&Quit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:621 +#: src/slic3r/GUI/MainFrame.cpp:676 #, possible-c-format msgid "Quit %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:646 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "&Select all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:647 +#: src/slic3r/GUI/MainFrame.cpp:702 msgid "Selects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:649 +#: src/slic3r/GUI/MainFrame.cpp:704 msgid "D&eselect all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:650 +#: src/slic3r/GUI/MainFrame.cpp:705 msgid "Deselects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:653 +#: src/slic3r/GUI/MainFrame.cpp:708 msgid "&Delete selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:654 +#: src/slic3r/GUI/MainFrame.cpp:709 msgid "Deletes the current selection" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:656 +#: src/slic3r/GUI/MainFrame.cpp:711 msgid "Delete &all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:657 +#: src/slic3r/GUI/MainFrame.cpp:712 msgid "Deletes all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:661 +#: src/slic3r/GUI/MainFrame.cpp:716 msgid "&Undo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:664 +#: src/slic3r/GUI/MainFrame.cpp:719 msgid "&Redo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:669 +#: src/slic3r/GUI/MainFrame.cpp:724 msgid "&Copy" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:670 +#: src/slic3r/GUI/MainFrame.cpp:725 msgid "Copy selection to clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:672 +#: src/slic3r/GUI/MainFrame.cpp:727 msgid "&Paste" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:673 +#: src/slic3r/GUI/MainFrame.cpp:728 msgid "Paste clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:677 +#: src/slic3r/GUI/MainFrame.cpp:732 msgid "Re&load from disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:678 +#: src/slic3r/GUI/MainFrame.cpp:733 msgid "Reload the plater from disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:687 +#: src/slic3r/GUI/MainFrame.cpp:742 msgid "&Plater Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:687 +#: src/slic3r/GUI/MainFrame.cpp:742 msgid "Show the plater" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:695 +#: src/slic3r/GUI/MainFrame.cpp:750 msgid "P&rint Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:695 +#: src/slic3r/GUI/MainFrame.cpp:750 msgid "Show the print settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:698 src/slic3r/GUI/MainFrame.cpp:833 +#: src/slic3r/GUI/MainFrame.cpp:753 src/slic3r/GUI/MainFrame.cpp:899 msgid "&Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:698 +#: src/slic3r/GUI/MainFrame.cpp:753 msgid "Show the filament settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:702 +#: src/slic3r/GUI/MainFrame.cpp:757 msgid "Print&er Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:702 +#: src/slic3r/GUI/MainFrame.cpp:757 msgid "Show the printer settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:707 +#: src/slic3r/GUI/MainFrame.cpp:762 msgid "3&D" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:707 +#: src/slic3r/GUI/MainFrame.cpp:762 msgid "Show the 3D editing view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:710 +#: src/slic3r/GUI/MainFrame.cpp:765 msgid "Pre&view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:710 +#: src/slic3r/GUI/MainFrame.cpp:765 msgid "Show the 3D slices preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:729 +#: src/slic3r/GUI/MainFrame.cpp:784 msgid "Print &Host Upload Queue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:729 +#: src/slic3r/GUI/MainFrame.cpp:784 msgid "Display the Print Host Upload Queue window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:739 +#: src/slic3r/GUI/MainFrame.cpp:794 msgid "Iso" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:739 +#: src/slic3r/GUI/MainFrame.cpp:794 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:743 src/libslic3r/PrintConfig.cpp:2139 +#: src/slic3r/GUI/MainFrame.cpp:798 src/libslic3r/PrintConfig.cpp:2139 #: src/libslic3r/PrintConfig.cpp:2148 msgid "Top" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:743 +#: src/slic3r/GUI/MainFrame.cpp:798 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:746 src/libslic3r/PrintConfig.cpp:174 +#: src/slic3r/GUI/MainFrame.cpp:801 src/libslic3r/PrintConfig.cpp:174 #: src/libslic3r/PrintConfig.cpp:183 msgid "Bottom" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:746 +#: src/slic3r/GUI/MainFrame.cpp:801 msgid "Bottom View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:748 +#: src/slic3r/GUI/MainFrame.cpp:803 msgid "Front" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:748 +#: src/slic3r/GUI/MainFrame.cpp:803 msgid "Front View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:750 src/libslic3r/PrintConfig.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:805 src/libslic3r/PrintConfig.cpp:1632 msgid "Rear" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:750 +#: src/slic3r/GUI/MainFrame.cpp:805 msgid "Rear View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:752 +#: src/slic3r/GUI/MainFrame.cpp:807 msgid "Left" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:752 +#: src/slic3r/GUI/MainFrame.cpp:807 msgid "Left View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:754 +#: src/slic3r/GUI/MainFrame.cpp:809 msgid "Right" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:754 +#: src/slic3r/GUI/MainFrame.cpp:809 msgid "Right View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:757 +#: src/slic3r/GUI/MainFrame.cpp:814 src/slic3r/GUI/MainFrame.cpp:822 msgid "Show &labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:757 +#: src/slic3r/GUI/MainFrame.cpp:814 src/slic3r/GUI/MainFrame.cpp:822 msgid "Show object/instance labels in 3D scene" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:765 +#: src/slic3r/GUI/MainFrame.cpp:817 +msgid "Show &slope" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:817 +msgid "Objects coloring using faces' slope" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:820 +msgid "&Options" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:831 msgid "Prusa 3D &Drivers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:765 +#: src/slic3r/GUI/MainFrame.cpp:831 msgid "Open the Prusa3D drivers download page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:767 +#: src/slic3r/GUI/MainFrame.cpp:833 msgid "Software &Releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:767 +#: src/slic3r/GUI/MainFrame.cpp:833 msgid "Open the software releases page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:773 +#: src/slic3r/GUI/MainFrame.cpp:839 #, possible-c-format msgid "%s &Website" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:774 +#: src/slic3r/GUI/MainFrame.cpp:840 #, possible-c-format msgid "Open the %s website in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:780 +#: src/slic3r/GUI/MainFrame.cpp:846 msgid "System &Info" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:780 +#: src/slic3r/GUI/MainFrame.cpp:846 msgid "Show system information" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:782 +#: src/slic3r/GUI/MainFrame.cpp:848 msgid "Show &Configuration Folder" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:782 +#: src/slic3r/GUI/MainFrame.cpp:848 msgid "Show user configuration folder (datadir)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:784 +#: src/slic3r/GUI/MainFrame.cpp:850 msgid "Report an I&ssue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:784 +#: src/slic3r/GUI/MainFrame.cpp:850 #, possible-c-format msgid "Report an issue on %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:786 +#: src/slic3r/GUI/MainFrame.cpp:852 #, possible-c-format msgid "&About %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:786 +#: src/slic3r/GUI/MainFrame.cpp:852 msgid "Show about dialog" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:789 +#: src/slic3r/GUI/MainFrame.cpp:855 msgid "Show the list of the keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:802 +#: src/slic3r/GUI/MainFrame.cpp:868 msgid "&File" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:803 +#: src/slic3r/GUI/MainFrame.cpp:869 msgid "&Edit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:804 +#: src/slic3r/GUI/MainFrame.cpp:870 msgid "&Window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:805 +#: src/slic3r/GUI/MainFrame.cpp:871 msgid "&View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:808 +#: src/slic3r/GUI/MainFrame.cpp:874 msgid "&Help" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:830 +#: src/slic3r/GUI/MainFrame.cpp:896 msgid "E&xport" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:831 +#: src/slic3r/GUI/MainFrame.cpp:897 msgid "S&end to print" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:833 +#: src/slic3r/GUI/MainFrame.cpp:899 msgid "Mate&rial Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:854 +#: src/slic3r/GUI/MainFrame.cpp:920 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:865 +#: src/slic3r/GUI/MainFrame.cpp:931 msgid "No previously sliced file." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:871 +#: src/slic3r/GUI/MainFrame.cpp:937 msgid "Previously sliced file (" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:871 +#: src/slic3r/GUI/MainFrame.cpp:937 msgid ") not found." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:872 +#: src/slic3r/GUI/MainFrame.cpp:938 msgid "File Not Found" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:907 +#: src/slic3r/GUI/MainFrame.cpp:973 #, possible-c-format msgid "Save %s file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:907 +#: src/slic3r/GUI/MainFrame.cpp:973 msgid "SVG" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:907 +#: src/slic3r/GUI/MainFrame.cpp:973 msgid "G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:919 +#: src/slic3r/GUI/MainFrame.cpp:985 msgid "Save zip file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/Plater.cpp:3188 -#: src/slic3r/GUI/Plater.cpp:5165 src/slic3r/GUI/Tab.cpp:1282 -#: src/slic3r/GUI/Tab.cpp:3721 +#: src/slic3r/GUI/MainFrame.cpp:994 src/slic3r/GUI/Plater.cpp:3121 +#: src/slic3r/GUI/Plater.cpp:5122 src/slic3r/GUI/Tab.cpp:1289 +#: src/slic3r/GUI/Tab.cpp:3731 msgid "Slicing" msgstr "" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:930 +#: src/slic3r/GUI/MainFrame.cpp:996 #, possible-c-format msgid "Processing %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:953 +#: src/slic3r/GUI/MainFrame.cpp:1019 msgid " was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:955 +#: src/slic3r/GUI/MainFrame.cpp:1021 msgid "Slicing Done!" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:970 +#: src/slic3r/GUI/MainFrame.cpp:1036 msgid "Select the STL file to repair:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:980 +#: src/slic3r/GUI/MainFrame.cpp:1046 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:992 +#: src/slic3r/GUI/MainFrame.cpp:1058 msgid "Your file was repaired." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:992 src/libslic3r/PrintConfig.cpp:3469 +#: src/slic3r/GUI/MainFrame.cpp:1058 src/libslic3r/PrintConfig.cpp:3469 msgid "Repair" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1006 +#: src/slic3r/GUI/MainFrame.cpp:1072 msgid "Save configuration as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1025 src/slic3r/GUI/MainFrame.cpp:1087 +#: src/slic3r/GUI/MainFrame.cpp:1091 src/slic3r/GUI/MainFrame.cpp:1153 msgid "Select configuration to load:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1061 +#: src/slic3r/GUI/MainFrame.cpp:1127 msgid "Save presets bundle as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1108 +#: src/slic3r/GUI/MainFrame.cpp:1174 #, possible-c-format msgid "%d presets successfully imported." msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:258 +#: src/slic3r/GUI/Mouse3DController.cpp:263 msgid "3Dconnexion settings" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:273 +#: src/slic3r/GUI/Mouse3DController.cpp:278 msgid "Device:" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:280 +#: src/slic3r/GUI/Mouse3DController.cpp:285 msgid "Speed:" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:284 -#: src/slic3r/GUI/Mouse3DController.cpp:307 +#: src/slic3r/GUI/Mouse3DController.cpp:289 +#: src/slic3r/GUI/Mouse3DController.cpp:312 msgid "Translation" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:296 -#: src/slic3r/GUI/Mouse3DController.cpp:307 +#: src/slic3r/GUI/Mouse3DController.cpp:301 +#: src/slic3r/GUI/Mouse3DController.cpp:312 msgid "Zoom" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:303 +#: src/slic3r/GUI/Mouse3DController.cpp:308 msgid "Deadzone:" msgstr "" +#: src/slic3r/GUI/Mouse3DController.cpp:325 +msgid "Options:" +msgstr "" + #: src/slic3r/GUI/MsgDialog.cpp:73 #, possible-c-format msgid "%s error" @@ -3958,22 +3998,22 @@ msgstr "" msgid "%s has encountered an error" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:56 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:58 msgid "Instances" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:60 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:216 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:62 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:218 #, possible-c-format msgid "Instance %d" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3575 -#: src/slic3r/GUI/Tab.cpp:3657 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3585 +#: src/slic3r/GUI/Tab.cpp:3667 msgid "Layers" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:96 msgid "Range" msgstr "" @@ -3987,625 +4027,605 @@ msgctxt "Layers" msgid "Bottom" msgstr "" -#: src/slic3r/GUI/Plater.cpp:161 +#: src/slic3r/GUI/Plater.cpp:163 msgid "Volume" msgstr "" -#: src/slic3r/GUI/Plater.cpp:162 +#: src/slic3r/GUI/Plater.cpp:164 msgid "Facets" msgstr "" -#: src/slic3r/GUI/Plater.cpp:163 +#: src/slic3r/GUI/Plater.cpp:165 msgid "Materials" msgstr "" -#: src/slic3r/GUI/Plater.cpp:166 +#: src/slic3r/GUI/Plater.cpp:168 msgid "Manifold" msgstr "" -#: src/slic3r/GUI/Plater.cpp:216 +#: src/slic3r/GUI/Plater.cpp:218 msgid "Sliced Info" msgstr "" -#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1234 +#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1236 msgid "Used Filament (m)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:236 +#: src/slic3r/GUI/Plater.cpp:238 msgid "Used Filament (mm³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:237 +#: src/slic3r/GUI/Plater.cpp:239 msgid "Used Filament (g)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:238 +#: src/slic3r/GUI/Plater.cpp:240 msgid "Used Material (unit)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:239 +#: src/slic3r/GUI/Plater.cpp:241 msgid "Cost (money)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1221 -#: src/slic3r/GUI/Plater.cpp:1263 +#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1223 +#: src/slic3r/GUI/Plater.cpp:1265 msgid "Estimated printing time" msgstr "" -#: src/slic3r/GUI/Plater.cpp:241 +#: src/slic3r/GUI/Plater.cpp:243 msgid "Number of tool changes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:348 +#: src/slic3r/GUI/Plater.cpp:350 msgid "Click to edit preset" msgstr "" -#: src/slic3r/GUI/Plater.cpp:503 +#: src/slic3r/GUI/Plater.cpp:505 msgid "Select what kind of support do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:505 src/libslic3r/PrintConfig.cpp:1908 +#: src/slic3r/GUI/Plater.cpp:507 src/libslic3r/PrintConfig.cpp:1908 #: src/libslic3r/PrintConfig.cpp:2691 msgid "Support on build plate only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:506 src/slic3r/GUI/Plater.cpp:629 +#: src/slic3r/GUI/Plater.cpp:508 src/slic3r/GUI/Plater.cpp:631 msgid "For support enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:507 +#: src/slic3r/GUI/Plater.cpp:509 msgid "Everywhere" msgstr "" -#: src/slic3r/GUI/Plater.cpp:539 src/slic3r/GUI/Tab.cpp:1178 +#: src/slic3r/GUI/Plater.cpp:541 src/slic3r/GUI/Tab.cpp:1185 msgid "Brim" msgstr "" -#: src/slic3r/GUI/Plater.cpp:541 +#: src/slic3r/GUI/Plater.cpp:543 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:549 +#: src/slic3r/GUI/Plater.cpp:551 msgid "Purging volumes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:643 +#: src/slic3r/GUI/Plater.cpp:645 msgid "Select what kind of pad do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:645 +#: src/slic3r/GUI/Plater.cpp:647 msgid "Below object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:646 +#: src/slic3r/GUI/Plater.cpp:648 msgid "Around object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:820 +#: src/slic3r/GUI/Plater.cpp:822 msgid "Print settings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:821 src/slic3r/GUI/Tab.cpp:1481 -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Plater.cpp:823 src/slic3r/GUI/Tab.cpp:1491 +#: src/slic3r/GUI/Tab.cpp:1492 msgid "Filament" msgstr "" -#: src/slic3r/GUI/Plater.cpp:822 +#: src/slic3r/GUI/Plater.cpp:824 msgid "SLA print settings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:823 src/slic3r/GUI/Preset.cpp:1565 +#: src/slic3r/GUI/Plater.cpp:825 src/slic3r/GUI/Preset.cpp:1566 msgid "SLA material" msgstr "" -#: src/slic3r/GUI/Plater.cpp:824 +#: src/slic3r/GUI/Plater.cpp:826 msgid "Printer" msgstr "" -#: src/slic3r/GUI/Plater.cpp:883 src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/Plater.cpp:885 src/slic3r/GUI/Plater.cpp:5532 msgid "Send to printer" msgstr "" -#: src/slic3r/GUI/Plater.cpp:884 +#: src/slic3r/GUI/Plater.cpp:886 msgid "Remove device" msgstr "" -#: src/slic3r/GUI/Plater.cpp:897 src/slic3r/GUI/Plater.cpp:3188 -#: src/slic3r/GUI/Plater.cpp:5168 +#: src/slic3r/GUI/Plater.cpp:899 src/slic3r/GUI/Plater.cpp:3121 +#: src/slic3r/GUI/Plater.cpp:5125 msgid "Slice now" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1047 +#: src/slic3r/GUI/Plater.cpp:1049 msgid "Hold Shift to Slice & Export G-code" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1157 +#: src/slic3r/GUI/Plater.cpp:1159 #, possible-c-format msgid "%d (%d shells)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1162 +#: src/slic3r/GUI/Plater.cpp:1164 #, possible-c-format msgid "Auto-repaired (%d errors)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1165 +#: src/slic3r/GUI/Plater.cpp:1167 #, possible-c-format msgid "" "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " "facets reversed, %d backwards edges" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1175 +#: src/slic3r/GUI/Plater.cpp:1177 msgid "Yes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1196 +#: src/slic3r/GUI/Plater.cpp:1198 msgid "Used Material (ml)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1199 +#: src/slic3r/GUI/Plater.cpp:1201 msgid "object(s)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1199 +#: src/slic3r/GUI/Plater.cpp:1201 msgid "supports and pad" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1236 src/slic3r/GUI/Plater.cpp:1250 +#: src/slic3r/GUI/Plater.cpp:1238 src/slic3r/GUI/Plater.cpp:1252 msgid "objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1236 src/slic3r/GUI/Plater.cpp:1250 +#: src/slic3r/GUI/Plater.cpp:1238 src/slic3r/GUI/Plater.cpp:1252 msgid "wipe tower" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1248 src/libslic3r/PrintConfig.cpp:760 +#: src/slic3r/GUI/Plater.cpp:1250 src/libslic3r/PrintConfig.cpp:760 #: src/libslic3r/PrintConfig.cpp:2517 src/libslic3r/PrintConfig.cpp:2518 msgid "Cost" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1265 src/libslic3r/PrintConfig.cpp:582 +#: src/slic3r/GUI/Plater.cpp:1267 src/libslic3r/PrintConfig.cpp:582 msgid "Color" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1266 +#: src/slic3r/GUI/Plater.cpp:1268 msgid "Pause" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1291 +#: src/slic3r/GUI/Plater.cpp:1293 msgid "normal mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1296 +#: src/slic3r/GUI/Plater.cpp:1298 msgid "stealth mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1400 +#: src/slic3r/GUI/Plater.cpp:1402 msgid "Load File" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1404 +#: src/slic3r/GUI/Plater.cpp:1406 msgid "Load Files" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2205 +#: src/slic3r/GUI/Plater.cpp:2207 #, possible-c-format msgid "" "Unmounting successful. The device %s(%s) can now be safely removed from the " "computer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2208 +#: src/slic3r/GUI/Plater.cpp:2210 #, possible-c-format msgid "Ejecting of device %s(%s) has failed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2221 +#: src/slic3r/GUI/Plater.cpp:2223 msgid "New Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2335 +#: src/slic3r/GUI/Plater.cpp:2337 msgid "Loading" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2345 +#: src/slic3r/GUI/Plater.cpp:2347 #, possible-c-format msgid "Processing input file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2373 +#: src/slic3r/GUI/Plater.cpp:2375 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2374 src/slic3r/GUI/Tab.cpp:2948 +#: src/slic3r/GUI/Plater.cpp:2376 src/slic3r/GUI/Tab.cpp:2958 msgid "Please check your object list before preset changing." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2419 +#: src/slic3r/GUI/Plater.cpp:2421 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should I consider\n" "this file as a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2422 src/slic3r/GUI/Plater.cpp:2475 +#: src/slic3r/GUI/Plater.cpp:2424 src/slic3r/GUI/Plater.cpp:2477 msgid "Multi-part object detected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2429 +#: src/slic3r/GUI/Plater.cpp:2431 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:2430 +#: src/slic3r/GUI/Plater.cpp:2432 msgid "Detected advanced data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2452 +#: src/slic3r/GUI/Plater.cpp:2454 #, 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:2472 +#: src/slic3r/GUI/Plater.cpp:2474 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:2488 +#: src/slic3r/GUI/Plater.cpp:2490 msgid "Loaded" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2590 +#: src/slic3r/GUI/Plater.cpp:2592 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:2591 +#: src/slic3r/GUI/Plater.cpp:2593 msgid "Object too large?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2653 +#: src/slic3r/GUI/Plater.cpp:2655 msgid "Export STL file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2660 +#: src/slic3r/GUI/Plater.cpp:2662 msgid "Export AMF file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2666 +#: src/slic3r/GUI/Plater.cpp:2668 msgid "Save file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2672 +#: src/slic3r/GUI/Plater.cpp:2674 msgid "Export OBJ file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2774 +#: src/slic3r/GUI/Plater.cpp:2773 msgid "Delete Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2785 +#: src/slic3r/GUI/Plater.cpp:2784 msgid "Reset Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2822 -msgid "Hollow" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2829 +#: src/slic3r/GUI/Plater.cpp:2823 msgid "Optimize Rotation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2875 +#: src/slic3r/GUI/Plater.cpp:2869 msgid "Arranging" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2902 +#: src/slic3r/GUI/Plater.cpp:2896 msgid "Could not arrange model objects! Some geometries may be invalid." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2908 +#: src/slic3r/GUI/Plater.cpp:2902 msgid "Arranging canceled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2909 +#: src/slic3r/GUI/Plater.cpp:2903 msgid "Arranging done." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2925 +#: src/slic3r/GUI/Plater.cpp:2919 msgid "Searching for optimal orientation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2958 +#: src/slic3r/GUI/Plater.cpp:2952 msgid "Orientation search canceled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2959 +#: src/slic3r/GUI/Plater.cpp:2953 msgid "Orientation found." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2989 -msgid "Indexing hollowed object" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2993 -msgid "Hollowing cancelled." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2994 -msgid "Hollowing done." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2996 -msgid "Hollowing failed." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3037 +#: src/slic3r/GUI/Plater.cpp:2970 msgid "" "The selected object can't be split because it contains more than one volume/" "material." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3048 +#: src/slic3r/GUI/Plater.cpp:2981 msgid "Split to Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3173 +#: src/slic3r/GUI/Plater.cpp:3106 msgid "Invalid data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3182 +#: src/slic3r/GUI/Plater.cpp:3115 msgid "Ready to slice" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3220 src/slic3r/GUI/PrintHostDialogs.cpp:232 +#: src/slic3r/GUI/Plater.cpp:3153 src/slic3r/GUI/PrintHostDialogs.cpp:232 msgid "Cancelling" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3237 +#: src/slic3r/GUI/Plater.cpp:3170 msgid "Another export job is currently running." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3353 +#: src/slic3r/GUI/Plater.cpp:3286 msgid "Please select the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3388 +#: src/slic3r/GUI/Plater.cpp:3321 msgid "It is not allowed to change the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3388 +#: src/slic3r/GUI/Plater.cpp:3321 msgid "Do you want to retry" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3406 +#: src/slic3r/GUI/Plater.cpp:3339 msgid "Reload from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3495 +#: src/slic3r/GUI/Plater.cpp:3428 msgid "Unable to reload:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3500 +#: src/slic3r/GUI/Plater.cpp:3433 msgid "Error during reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3519 +#: src/slic3r/GUI/Plater.cpp:3452 msgid "Reload all from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3540 +#: src/slic3r/GUI/Plater.cpp:3473 msgid "Fix Throught NetFabb" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3731 +#: src/slic3r/GUI/Plater.cpp:3672 msgid "Export failed" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3741 src/slic3r/GUI/PrintHostDialogs.cpp:233 +#: src/slic3r/GUI/Plater.cpp:3682 src/slic3r/GUI/PrintHostDialogs.cpp:233 msgid "Cancelled" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4020 +#: src/slic3r/GUI/Plater.cpp:3935 src/slic3r/GUI/Plater.cpp:3957 msgid "Remove the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4007 +#: src/slic3r/GUI/Plater.cpp:3944 msgid "Add one more instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4009 +#: src/slic3r/GUI/Plater.cpp:3946 msgid "Remove one instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4011 +#: src/slic3r/GUI/Plater.cpp:3948 msgid "Set number of instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4011 +#: src/slic3r/GUI/Plater.cpp:3948 msgid "Change the number of instances of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4030 +#: src/slic3r/GUI/Plater.cpp:3967 msgid "Reload the selected object from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4033 +#: src/slic3r/GUI/Plater.cpp:3970 msgid "Export the selected object as STL file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4062 +#: src/slic3r/GUI/Plater.cpp:3999 msgid "Along X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4062 +#: src/slic3r/GUI/Plater.cpp:3999 msgid "Mirror the selected object along the X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4064 +#: src/slic3r/GUI/Plater.cpp:4001 msgid "Along Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4064 +#: src/slic3r/GUI/Plater.cpp:4001 msgid "Mirror the selected object along the Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4066 +#: src/slic3r/GUI/Plater.cpp:4003 msgid "Along Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4066 +#: src/slic3r/GUI/Plater.cpp:4003 msgid "Mirror the selected object along the Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4069 +#: src/slic3r/GUI/Plater.cpp:4006 msgid "Mirror" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4069 +#: src/slic3r/GUI/Plater.cpp:4006 msgid "Mirror the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4081 +#: src/slic3r/GUI/Plater.cpp:4018 msgid "To objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4081 src/slic3r/GUI/Plater.cpp:4101 +#: src/slic3r/GUI/Plater.cpp:4018 src/slic3r/GUI/Plater.cpp:4038 msgid "Split the selected object into individual objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4083 +#: src/slic3r/GUI/Plater.cpp:4020 msgid "To parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4083 src/slic3r/GUI/Plater.cpp:4115 +#: src/slic3r/GUI/Plater.cpp:4020 src/slic3r/GUI/Plater.cpp:4052 msgid "Split the selected object into individual sub-parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4086 src/slic3r/GUI/Plater.cpp:4101 -#: src/slic3r/GUI/Plater.cpp:4115 src/libslic3r/PrintConfig.cpp:3493 +#: src/slic3r/GUI/Plater.cpp:4023 src/slic3r/GUI/Plater.cpp:4038 +#: src/slic3r/GUI/Plater.cpp:4052 src/libslic3r/PrintConfig.cpp:3493 msgid "Split" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4086 +#: src/slic3r/GUI/Plater.cpp:4023 msgid "Split the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4107 +#: src/slic3r/GUI/Plater.cpp:4044 msgid "Optimize orientation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4107 +#: src/slic3r/GUI/Plater.cpp:4044 msgid "Optimize the rotation of the object for better print results." msgstr "" -#: src/slic3r/GUI/Plater.cpp:4164 +#: src/slic3r/GUI/Plater.cpp:4121 msgid "3D editor view" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4471 +#: src/slic3r/GUI/Plater.cpp:4428 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:4646 +#: src/slic3r/GUI/Plater.cpp:4604 msgid "Load Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4674 +#: src/slic3r/GUI/Plater.cpp:4632 msgid "Import Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4678 +#: src/slic3r/GUI/Plater.cpp:4636 msgid "Import Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4740 +#: src/slic3r/GUI/Plater.cpp:4705 msgid "All objects will be removed, continue?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4748 +#: src/slic3r/GUI/Plater.cpp:4713 msgid "Delete Selected Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4756 +#: src/slic3r/GUI/Plater.cpp:4721 msgid "Increase Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4791 +#: src/slic3r/GUI/Plater.cpp:4756 msgid "Decrease Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4822 +#: src/slic3r/GUI/Plater.cpp:4787 msgid "Enter the number of copies:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4823 +#: src/slic3r/GUI/Plater.cpp:4788 msgid "Copies of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4827 +#: src/slic3r/GUI/Plater.cpp:4792 #, possible-c-format msgid "Set numbers of copies to %d" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4857 +#: src/slic3r/GUI/Plater.cpp:4822 msgid "Cut by Plane" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4908 +#: src/slic3r/GUI/Plater.cpp:4873 msgid "Save G-code file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4908 +#: src/slic3r/GUI/Plater.cpp:4873 msgid "Save SL1 file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5043 +#: src/slic3r/GUI/Plater.cpp:5008 #, possible-c-format msgid "STL file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5060 +#: src/slic3r/GUI/Plater.cpp:5025 #, possible-c-format msgid "AMF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5063 +#: src/slic3r/GUI/Plater.cpp:5028 #, possible-c-format msgid "Error exporting AMF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5096 +#: src/slic3r/GUI/Plater.cpp:5057 #, possible-c-format msgid "3MF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5101 +#: src/slic3r/GUI/Plater.cpp:5062 #, possible-c-format msgid "Error exporting 3MF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5562 +#: src/slic3r/GUI/Plater.cpp:5531 msgid "Export" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5648 +#: src/slic3r/GUI/Plater.cpp:5617 msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1847 -#: src/slic3r/GUI/Tab.cpp:2059 +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1857 +#: src/slic3r/GUI/Tab.cpp:2069 msgid "General" msgstr "" @@ -4745,30 +4765,30 @@ msgstr "" msgid "modified" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1150 src/slic3r/GUI/Preset.cpp:1205 -#: src/slic3r/GUI/Preset.cpp:1283 src/slic3r/GUI/Preset.cpp:1325 +#: src/slic3r/GUI/Preset.cpp:1151 src/slic3r/GUI/Preset.cpp:1206 +#: src/slic3r/GUI/Preset.cpp:1284 src/slic3r/GUI/Preset.cpp:1326 #: src/slic3r/GUI/PresetBundle.cpp:1599 src/slic3r/GUI/PresetBundle.cpp:1697 msgid "System presets" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1209 src/slic3r/GUI/Preset.cpp:1329 +#: src/slic3r/GUI/Preset.cpp:1210 src/slic3r/GUI/Preset.cpp:1330 #: src/slic3r/GUI/PresetBundle.cpp:1702 msgid "User presets" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1242 +#: src/slic3r/GUI/Preset.cpp:1243 msgid "Add/Remove materials" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1244 +#: src/slic3r/GUI/Preset.cpp:1245 msgid "Add/Remove printers" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1563 +#: src/slic3r/GUI/Preset.cpp:1564 msgid "filament" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1564 +#: src/slic3r/GUI/Preset.cpp:1565 msgid "SLA print" msgstr "" @@ -5049,15 +5069,15 @@ msgstr "" msgid "Selection-Remove All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:940 +#: src/slic3r/GUI/Selection.cpp:946 msgid "Scale To Fit" msgstr "" -#: src/slic3r/GUI/Selection.cpp:1477 +#: src/slic3r/GUI/Selection.cpp:1483 msgid "Set Printable Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:1477 +#: src/slic3r/GUI/Selection.cpp:1483 msgid "Set Unprintable Instance" msgstr "" @@ -5065,388 +5085,388 @@ msgstr "" msgid "System Information" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:154 +#: src/slic3r/GUI/SysInfoDialog.cpp:158 msgid "Copy to Clipboard" msgstr "" -#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265 +#: src/slic3r/GUI/Tab.cpp:51 src/libslic3r/PrintConfig.cpp:265 msgid "Compatible printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:51 +#: src/slic3r/GUI/Tab.cpp:52 msgid "Select the printers this profile is compatible with." msgstr "" -#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280 +#: src/slic3r/GUI/Tab.cpp:57 src/libslic3r/PrintConfig.cpp:280 msgid "Compatible print profiles" msgstr "" -#: src/slic3r/GUI/Tab.cpp:57 +#: src/slic3r/GUI/Tab.cpp:58 msgid "Select the print profiles this profile is compatible with." msgstr "" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:133 +#: src/slic3r/GUI/Tab.cpp:134 #, possible-c-format msgid "Save current %s" msgstr "" -#: src/slic3r/GUI/Tab.cpp:134 +#: src/slic3r/GUI/Tab.cpp:135 msgid "Delete this preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:139 +#: src/slic3r/GUI/Tab.cpp:140 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." msgstr "" -#: src/slic3r/GUI/Tab.cpp:241 +#: src/slic3r/GUI/Tab.cpp:248 msgid "Add a new printer" msgstr "" -#: src/slic3r/GUI/Tab.cpp:963 +#: src/slic3r/GUI/Tab.cpp:970 msgid "Detach from system preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:975 +#: src/slic3r/GUI/Tab.cpp:982 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:976 +#: src/slic3r/GUI/Tab.cpp:983 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:979 +#: src/slic3r/GUI/Tab.cpp:986 msgid "Modifications to the current profile will be saved." msgstr "" -#: src/slic3r/GUI/Tab.cpp:982 +#: src/slic3r/GUI/Tab.cpp:989 msgid "" "This action is not revertable.\n" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:984 +#: src/slic3r/GUI/Tab.cpp:991 msgid "Detach preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1010 +#: src/slic3r/GUI/Tab.cpp:1017 msgid "This is a default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1012 +#: src/slic3r/GUI/Tab.cpp:1019 msgid "This is a system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1014 +#: src/slic3r/GUI/Tab.cpp:1021 msgid "Current preset is inherited from the default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1016 +#: src/slic3r/GUI/Tab.cpp:1023 msgid "Current preset is inherited from" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1020 +#: src/slic3r/GUI/Tab.cpp:1027 msgid "It can't be deleted or modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1021 +#: src/slic3r/GUI/Tab.cpp:1028 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1022 +#: src/slic3r/GUI/Tab.cpp:1029 msgid "To do that please specify a new name for the preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1026 +#: src/slic3r/GUI/Tab.cpp:1033 msgid "Additional information:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1032 +#: src/slic3r/GUI/Tab.cpp:1039 msgid "printer model" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1040 +#: src/slic3r/GUI/Tab.cpp:1047 msgid "default print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1043 +#: src/slic3r/GUI/Tab.cpp:1050 msgid "default filament profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1057 +#: src/slic3r/GUI/Tab.cpp:1064 msgid "default SLA material profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1061 +#: src/slic3r/GUI/Tab.cpp:1068 msgid "default SLA print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1069 +#: src/slic3r/GUI/Tab.cpp:1076 msgid "full profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1070 +#: src/slic3r/GUI/Tab.cpp:1077 msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1108 src/slic3r/GUI/Tab.cpp:3655 +#: src/slic3r/GUI/Tab.cpp:1115 src/slic3r/GUI/Tab.cpp:3665 msgid "Layers and perimeters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1113 +#: src/slic3r/GUI/Tab.cpp:1120 msgid "Vertical shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1124 +#: src/slic3r/GUI/Tab.cpp:1131 msgid "Horizontal shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1125 src/libslic3r/PrintConfig.cpp:1787 +#: src/slic3r/GUI/Tab.cpp:1132 src/libslic3r/PrintConfig.cpp:1787 msgid "Solid layers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1129 +#: src/slic3r/GUI/Tab.cpp:1136 msgid "Minimum shell thickness" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1140 +#: src/slic3r/GUI/Tab.cpp:1147 msgid "Quality (slower slicing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1158 +#: src/slic3r/GUI/Tab.cpp:1165 msgid "Reducing printing time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1170 +#: src/slic3r/GUI/Tab.cpp:1177 msgid "Skirt and brim" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1188 +#: src/slic3r/GUI/Tab.cpp:1195 msgid "Raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1192 +#: src/slic3r/GUI/Tab.cpp:1199 msgid "Options for support material and raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1207 +#: src/slic3r/GUI/Tab.cpp:1214 msgid "Speed for print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1219 +#: src/slic3r/GUI/Tab.cpp:1226 msgid "Speed for non-print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1222 +#: src/slic3r/GUI/Tab.cpp:1229 msgid "Modifiers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1225 +#: src/slic3r/GUI/Tab.cpp:1232 msgid "Acceleration control (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1232 +#: src/slic3r/GUI/Tab.cpp:1239 msgid "Autospeed (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1240 +#: src/slic3r/GUI/Tab.cpp:1247 msgid "Multiple Extruders" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1248 +#: src/slic3r/GUI/Tab.cpp:1255 msgid "Ooze prevention" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1266 +#: src/slic3r/GUI/Tab.cpp:1273 msgid "Extrusion width" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1276 +#: src/slic3r/GUI/Tab.cpp:1283 msgid "Overlap" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1279 +#: src/slic3r/GUI/Tab.cpp:1286 msgid "Flow" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1288 +#: src/slic3r/GUI/Tab.cpp:1295 msgid "Other" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1291 src/slic3r/GUI/Tab.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:1298 src/slic3r/GUI/Tab.cpp:3734 msgid "Output options" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1292 +#: src/slic3r/GUI/Tab.cpp:1299 msgid "Sequential printing" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1294 +#: src/slic3r/GUI/Tab.cpp:1301 msgid "Extruder clearance (mm)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1299 src/slic3r/GUI/Tab.cpp:3725 +#: src/slic3r/GUI/Tab.cpp:1306 src/slic3r/GUI/Tab.cpp:3735 msgid "Output file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1306 src/libslic3r/PrintConfig.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1313 src/libslic3r/PrintConfig.cpp:1453 msgid "Post-processing scripts" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1312 src/slic3r/GUI/Tab.cpp:1313 -#: src/slic3r/GUI/Tab.cpp:1596 src/slic3r/GUI/Tab.cpp:1597 -#: src/slic3r/GUI/Tab.cpp:2035 src/slic3r/GUI/Tab.cpp:2036 -#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:3598 src/slic3r/GUI/Tab.cpp:3599 +#: src/slic3r/GUI/Tab.cpp:1319 src/slic3r/GUI/Tab.cpp:1320 +#: src/slic3r/GUI/Tab.cpp:1606 src/slic3r/GUI/Tab.cpp:1607 +#: src/slic3r/GUI/Tab.cpp:2045 src/slic3r/GUI/Tab.cpp:2046 +#: src/slic3r/GUI/Tab.cpp:2127 src/slic3r/GUI/Tab.cpp:2128 +#: src/slic3r/GUI/Tab.cpp:3608 src/slic3r/GUI/Tab.cpp:3609 msgid "Notes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1319 src/slic3r/GUI/Tab.cpp:1604 -#: src/slic3r/GUI/Tab.cpp:2042 src/slic3r/GUI/Tab.cpp:2124 -#: src/slic3r/GUI/Tab.cpp:3606 src/slic3r/GUI/Tab.cpp:3730 +#: src/slic3r/GUI/Tab.cpp:1326 src/slic3r/GUI/Tab.cpp:1614 +#: src/slic3r/GUI/Tab.cpp:2052 src/slic3r/GUI/Tab.cpp:2134 +#: src/slic3r/GUI/Tab.cpp:3616 src/slic3r/GUI/Tab.cpp:3740 msgid "Dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1320 src/slic3r/GUI/Tab.cpp:1605 -#: src/slic3r/GUI/Tab.cpp:2043 src/slic3r/GUI/Tab.cpp:2125 -#: src/slic3r/GUI/Tab.cpp:3607 src/slic3r/GUI/Tab.cpp:3731 +#: src/slic3r/GUI/Tab.cpp:1327 src/slic3r/GUI/Tab.cpp:1615 +#: src/slic3r/GUI/Tab.cpp:2053 src/slic3r/GUI/Tab.cpp:2135 +#: src/slic3r/GUI/Tab.cpp:3617 src/slic3r/GUI/Tab.cpp:3741 msgid "Profile dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1379 src/slic3r/GUI/Tab.cpp:1434 +#: src/slic3r/GUI/Tab.cpp:1389 src/slic3r/GUI/Tab.cpp:1444 msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1380 src/slic3r/GUI/Tab.cpp:1439 -#: src/slic3r/GUI/Tab.cpp:2355 +#: src/slic3r/GUI/Tab.cpp:1390 src/slic3r/GUI/Tab.cpp:1449 +#: src/slic3r/GUI/Tab.cpp:2365 msgid "Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1489 src/libslic3r/PrintConfig.cpp:2074 +#: src/slic3r/GUI/Tab.cpp:1499 src/libslic3r/PrintConfig.cpp:2074 msgid "Temperature" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1495 +#: src/slic3r/GUI/Tab.cpp:1505 msgid "Bed" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1500 +#: src/slic3r/GUI/Tab.cpp:1510 msgid "Cooling" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1501 src/libslic3r/PrintConfig.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1511 src/libslic3r/PrintConfig.cpp:1355 #: src/libslic3r/PrintConfig.cpp:2207 msgid "Enable" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1512 +#: src/slic3r/GUI/Tab.cpp:1522 msgid "Fan settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1521 +#: src/slic3r/GUI/Tab.cpp:1531 msgid "Cooling thresholds" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1527 +#: src/slic3r/GUI/Tab.cpp:1537 msgid "Filament properties" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1534 +#: src/slic3r/GUI/Tab.cpp:1544 msgid "Print speed override" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1544 +#: src/slic3r/GUI/Tab.cpp:1554 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1547 +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Toolchange parameters with single extruder MM printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1561 +#: src/slic3r/GUI/Tab.cpp:1571 msgid "Ramming settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1583 src/slic3r/GUI/Tab.cpp:1998 +#: src/slic3r/GUI/Tab.cpp:1593 src/slic3r/GUI/Tab.cpp:2008 msgid "Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1584 src/slic3r/GUI/Tab.cpp:1999 +#: src/slic3r/GUI/Tab.cpp:1594 src/slic3r/GUI/Tab.cpp:2009 #: src/libslic3r/PrintConfig.cpp:1820 src/libslic3r/PrintConfig.cpp:1835 msgid "Start G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1590 src/slic3r/GUI/Tab.cpp:2005 +#: src/slic3r/GUI/Tab.cpp:1600 src/slic3r/GUI/Tab.cpp:2015 #: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395 msgid "End G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1639 +#: src/slic3r/GUI/Tab.cpp:1649 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1725 src/slic3r/GUI/Tab.cpp:1938 +#: src/slic3r/GUI/Tab.cpp:1735 src/slic3r/GUI/Tab.cpp:1948 msgid "Test" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1734 +#: src/slic3r/GUI/Tab.cpp:1744 msgid "Could not get a valid Printer Host reference" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1740 src/slic3r/GUI/Tab.cpp:1951 +#: src/slic3r/GUI/Tab.cpp:1750 src/slic3r/GUI/Tab.cpp:1961 msgid "Success!" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1760 +#: src/slic3r/GUI/Tab.cpp:1770 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1775 +#: src/slic3r/GUI/Tab.cpp:1785 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1776 +#: src/slic3r/GUI/Tab.cpp:1786 msgid "Open CA certificate file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1803 src/libslic3r/PrintConfig.cpp:111 +#: src/slic3r/GUI/Tab.cpp:1813 src/libslic3r/PrintConfig.cpp:111 msgid "HTTPS CA File" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1804 +#: src/slic3r/GUI/Tab.cpp:1814 #, possible-c-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " "or Keychain." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1805 +#: src/slic3r/GUI/Tab.cpp:1815 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1848 src/slic3r/GUI/Tab.cpp:2060 +#: src/slic3r/GUI/Tab.cpp:1858 src/slic3r/GUI/Tab.cpp:2070 msgid "Size and coordinates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1857 +#: src/slic3r/GUI/Tab.cpp:1867 msgid "Capabilities" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1862 +#: src/slic3r/GUI/Tab.cpp:1872 msgid "Number of extruders of the printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1890 +#: src/slic3r/GUI/Tab.cpp:1900 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -5454,72 +5474,72 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1893 src/slic3r/GUI/Tab.cpp:2325 +#: src/slic3r/GUI/Tab.cpp:1903 src/slic3r/GUI/Tab.cpp:2335 #: src/libslic3r/PrintConfig.cpp:1326 msgid "Nozzle diameter" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1923 +#: src/slic3r/GUI/Tab.cpp:1933 msgid "USB/Serial connection" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1924 src/libslic3r/PrintConfig.cpp:1661 +#: src/slic3r/GUI/Tab.cpp:1934 src/libslic3r/PrintConfig.cpp:1661 msgid "Serial port" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1929 +#: src/slic3r/GUI/Tab.cpp:1939 msgid "Rescan serial ports" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1951 +#: src/slic3r/GUI/Tab.cpp:1961 msgid "Connection to printer works correctly." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1954 +#: src/slic3r/GUI/Tab.cpp:1964 msgid "Connection failed." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:2112 +#: src/slic3r/GUI/Tab.cpp:1977 src/slic3r/GUI/Tab.cpp:2122 msgid "Print Host upload" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2011 src/libslic3r/PrintConfig.cpp:153 +#: src/slic3r/GUI/Tab.cpp:2021 src/libslic3r/PrintConfig.cpp:153 msgid "Before layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2017 src/libslic3r/PrintConfig.cpp:1080 +#: src/slic3r/GUI/Tab.cpp:2027 src/libslic3r/PrintConfig.cpp:1080 msgid "After layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2023 src/libslic3r/PrintConfig.cpp:2100 +#: src/slic3r/GUI/Tab.cpp:2033 src/libslic3r/PrintConfig.cpp:2100 msgid "Tool change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2029 +#: src/slic3r/GUI/Tab.cpp:2039 msgid "Between objects G-code (for sequential printing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2067 +#: src/slic3r/GUI/Tab.cpp:2077 msgid "Display" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2082 +#: src/slic3r/GUI/Tab.cpp:2092 msgid "Tilt" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2083 +#: src/slic3r/GUI/Tab.cpp:2093 msgid "Tilt time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:3582 +#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:3592 msgid "Corrections" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2106 src/slic3r/GUI/Tab.cpp:3578 +#: src/slic3r/GUI/Tab.cpp:2116 src/slic3r/GUI/Tab.cpp:3588 msgid "Exposure" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2173 src/slic3r/GUI/Tab.cpp:2258 +#: src/slic3r/GUI/Tab.cpp:2183 src/slic3r/GUI/Tab.cpp:2268 #: src/libslic3r/PrintConfig.cpp:1129 src/libslic3r/PrintConfig.cpp:1146 #: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1179 #: src/libslic3r/PrintConfig.cpp:1189 src/libslic3r/PrintConfig.cpp:1199 @@ -5527,183 +5547,183 @@ msgstr "" msgid "Machine limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2187 +#: src/slic3r/GUI/Tab.cpp:2197 msgid "Values in this column are for Normal mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2188 +#: src/slic3r/GUI/Tab.cpp:2198 msgid "Normal" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2193 +#: src/slic3r/GUI/Tab.cpp:2203 msgid "Values in this column are for Stealth mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2194 +#: src/slic3r/GUI/Tab.cpp:2204 msgid "Stealth" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2202 +#: src/slic3r/GUI/Tab.cpp:2212 msgid "Maximum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2207 +#: src/slic3r/GUI/Tab.cpp:2217 msgid "Maximum accelerations" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2214 +#: src/slic3r/GUI/Tab.cpp:2224 msgid "Jerk limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2219 +#: src/slic3r/GUI/Tab.cpp:2229 msgid "Minimum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2283 src/slic3r/GUI/Tab.cpp:2291 +#: src/slic3r/GUI/Tab.cpp:2293 src/slic3r/GUI/Tab.cpp:2301 msgid "Single extruder MM setup" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2292 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Single extruder multimaterial parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2323 +#: src/slic3r/GUI/Tab.cpp:2333 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:2347 +#: src/slic3r/GUI/Tab.cpp:2357 msgid "Layer height limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2352 +#: src/slic3r/GUI/Tab.cpp:2362 msgid "Position (for multi-extruder printers)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2358 +#: src/slic3r/GUI/Tab.cpp:2368 msgid "Only lift Z" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2371 +#: src/slic3r/GUI/Tab.cpp:2381 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2379 +#: src/slic3r/GUI/Tab.cpp:2389 msgid "Reset to Filament Color" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2560 +#: src/slic3r/GUI/Tab.cpp:2570 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:2562 +#: src/slic3r/GUI/Tab.cpp:2572 msgid "Firmware Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2908 +#: src/slic3r/GUI/Tab.cpp:2918 #, possible-c-format msgid "Default preset (%s)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2909 +#: src/slic3r/GUI/Tab.cpp:2919 #, possible-c-format msgid "Preset (%s)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2926 +#: src/slic3r/GUI/Tab.cpp:2936 msgid "has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2929 +#: src/slic3r/GUI/Tab.cpp:2939 msgid "is not compatible with printer" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2930 +#: src/slic3r/GUI/Tab.cpp:2940 msgid "is not compatible with print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2932 +#: src/slic3r/GUI/Tab.cpp:2942 msgid "and it has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2936 +#: src/slic3r/GUI/Tab.cpp:2946 msgid "Unsaved Changes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3030 +#: src/slic3r/GUI/Tab.cpp:3040 msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3030 +#: src/slic3r/GUI/Tab.cpp:3040 msgctxt "PresetName" msgid "Copy" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3059 +#: src/slic3r/GUI/Tab.cpp:3069 msgid "The supplied name is empty. It can't be saved." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3064 +#: src/slic3r/GUI/Tab.cpp:3074 msgid "Cannot overwrite a system profile." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3068 +#: src/slic3r/GUI/Tab.cpp:3078 msgid "Cannot overwrite an external profile." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3073 +#: src/slic3r/GUI/Tab.cpp:3083 msgid "Preset with name \"%1%\" already exists." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3074 +#: src/slic3r/GUI/Tab.cpp:3084 msgid "Replace?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3142 +#: src/slic3r/GUI/Tab.cpp:3152 msgid "remove" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3142 +#: src/slic3r/GUI/Tab.cpp:3152 msgid "delete" msgstr "" #. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:3144 +#: src/slic3r/GUI/Tab.cpp:3154 msgid "Are you sure you want to %1% the selected preset?" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3147 +#: src/slic3r/GUI/Tab.cpp:3157 msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3206 src/slic3r/GUI/Tab.cpp:3276 +#: src/slic3r/GUI/Tab.cpp:3216 src/slic3r/GUI/Tab.cpp:3286 msgid "Set" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3315 +#: src/slic3r/GUI/Tab.cpp:3325 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3317 +#: src/slic3r/GUI/Tab.cpp:3327 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:3319 +#: src/slic3r/GUI/Tab.cpp:3329 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3321 +#: src/slic3r/GUI/Tab.cpp:3331 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -5711,23 +5731,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3326 +#: src/slic3r/GUI/Tab.cpp:3336 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3328 +#: src/slic3r/GUI/Tab.cpp:3338 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:3331 +#: src/slic3r/GUI/Tab.cpp:3341 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3333 +#: src/slic3r/GUI/Tab.cpp:3343 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -5735,13 +5755,13 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3343 +#: src/slic3r/GUI/Tab.cpp:3353 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:3345 +#: src/slic3r/GUI/Tab.cpp:3355 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" @@ -5749,17 +5769,17 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3348 +#: src/slic3r/GUI/Tab.cpp:3358 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3351 +#: src/slic3r/GUI/Tab.cpp:3361 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:3353 +#: src/slic3r/GUI/Tab.cpp:3363 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" @@ -5767,26 +5787,26 @@ msgid "" "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3359 +#: src/slic3r/GUI/Tab.cpp:3369 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3360 +#: src/slic3r/GUI/Tab.cpp:3370 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:3366 +#: src/slic3r/GUI/Tab.cpp:3376 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3367 +#: src/slic3r/GUI/Tab.cpp:3377 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -5794,36 +5814,36 @@ msgid "" msgstr "" #. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3480 +#: src/slic3r/GUI/Tab.cpp:3490 #, possible-c-format msgid "Save %s as:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3524 +#: src/slic3r/GUI/Tab.cpp:3534 msgid "the following suffix is not allowed:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3528 +#: src/slic3r/GUI/Tab.cpp:3538 msgid "The supplied name is not available." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3541 src/slic3r/GUI/Tab.cpp:3543 +#: src/slic3r/GUI/Tab.cpp:3551 src/slic3r/GUI/Tab.cpp:3553 msgid "Material" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3665 +#: src/slic3r/GUI/Tab.cpp:3675 msgid "Support head" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3670 +#: src/slic3r/GUI/Tab.cpp:3680 msgid "Support pillar" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3686 +#: src/slic3r/GUI/Tab.cpp:3696 msgid "Connection of the support sticks and junctions" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3691 +#: src/slic3r/GUI/Tab.cpp:3701 msgid "Automatic generation" msgstr "" @@ -6249,7 +6269,7 @@ msgstr "" msgid "Could not connect to Prusa SLA" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:705 +#: src/slic3r/Utils/PresetUpdater.cpp:706 #, possible-c-format msgid "requires min. %s and max. %s" msgstr "" @@ -6396,15 +6416,15 @@ msgstr "" msgid "Error with zip archive" msgstr "" -#: src/libslic3r/GCode.cpp:640 +#: src/libslic3r/GCode.cpp:637 msgid "Empty layers detected, the output would not be printable." msgstr "" -#: src/libslic3r/GCode.cpp:641 +#: src/libslic3r/GCode.cpp:638 msgid "Print z" msgstr "" -#: src/libslic3r/GCode.cpp:642 +#: src/libslic3r/GCode.cpp:639 msgid "" "This is usually caused by negligibly small extrusions or by a faulty model. " "Try to repair the model or change its orientation on the bed." @@ -6419,7 +6439,7 @@ msgid "" "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1630 +#: src/libslic3r/Format/3mf.cpp:1626 msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." @@ -6576,11 +6596,11 @@ msgstr "" msgid "Generating brim" msgstr "" -#: src/libslic3r/Print.cpp:1637 +#: src/libslic3r/Print.cpp:1633 msgid "Exporting G-code" msgstr "" -#: src/libslic3r/Print.cpp:1641 +#: src/libslic3r/Print.cpp:1637 msgid "Generating G-code" msgstr "" @@ -9809,22 +9829,22 @@ msgstr "" msgid "Generating support material" msgstr "" -#: src/libslic3r/GCode/PreviewData.cpp:347 +#: src/libslic3r/GCode/PreviewData.cpp:348 msgid "Height (mm)" msgstr "" -#: src/libslic3r/GCode/PreviewData.cpp:349 +#: src/libslic3r/GCode/PreviewData.cpp:350 msgid "Width (mm)" msgstr "" -#: src/libslic3r/GCode/PreviewData.cpp:351 +#: src/libslic3r/GCode/PreviewData.cpp:352 msgid "Speed (mm/s)" msgstr "" -#: src/libslic3r/GCode/PreviewData.cpp:353 +#: src/libslic3r/GCode/PreviewData.cpp:354 msgid "Fan Speed (%)" msgstr "" -#: src/libslic3r/GCode/PreviewData.cpp:355 +#: src/libslic3r/GCode/PreviewData.cpp:356 msgid "Volumetric flow rate (mm³/s)" msgstr "" diff --git a/resources/localization/fr/PrusaSlicer.mo b/resources/localization/fr/PrusaSlicer.mo index b01197c78..5a4620fca 100644 Binary files a/resources/localization/fr/PrusaSlicer.mo and b/resources/localization/fr/PrusaSlicer.mo differ diff --git a/resources/localization/fr/PrusaSlicer_fr.po b/resources/localization/fr/PrusaSlicer_fr.po index 4bed90017..e6b8515f3 100644 --- a/resources/localization/fr/PrusaSlicer_fr.po +++ b/resources/localization/fr/PrusaSlicer_fr.po @@ -6360,7 +6360,7 @@ msgstr "Redimensionner" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459 msgid "Scale factors" -msgstr "Facteurs de redimensionnement" +msgstr "Échelle" #: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "" diff --git a/resources/localization/ko/PrusaSlicer.mo b/resources/localization/ko/PrusaSlicer.mo index a1e06abab..fa7a62e6e 100644 Binary files a/resources/localization/ko/PrusaSlicer.mo and b/resources/localization/ko/PrusaSlicer.mo differ diff --git a/resources/localization/ko/PrusaSlicer_ko_KR.po b/resources/localization/ko/PrusaSlicer_ko_KR.po index db96beba5..804e21141 100644 --- a/resources/localization/ko/PrusaSlicer_ko_KR.po +++ b/resources/localization/ko/PrusaSlicer_ko_KR.po @@ -429,7 +429,7 @@ msgstr "서포트 생성" #: src/slic3r/GUI/ConfigManipulation.cpp:200 msgid "The %1% infill pattern is not supposed to work at 100%% density." -msgstr "%1% 채우기 패턴은 100% 밀도로 작동하도록 되어 있지 않습니다." +msgstr "%1% 채우기 패턴은 100%% 밀도로 작동하도록 되어 있지 않습니다." #: src/slic3r/GUI/ConfigManipulation.cpp:202 msgid "Shall I switch to rectilinear fill pattern?" diff --git a/resources/profiles/BIBO.ini b/resources/profiles/BIBO.ini index 8247a34a7..4a10de3cb 100644 --- a/resources/profiles/BIBO.ini +++ b/resources/profiles/BIBO.ini @@ -31,17 +31,18 @@ avoid_crossing_perimeters = 0 bottom_fill_pattern = rectilinear bridge_angle = 0 bridge_flow_ratio = 0.95 -bridge_speed = 25 +bridge_speed = 20 brim_width = 0 clip_multipart_objects = 1 -compatible_printers = +compatible_printers = complete_objects = 0 dont_support_bridges = 1 elefant_foot_compensation = 0 ensure_vertical_shell_thickness = 1 external_fill_pattern = rectilinear external_perimeters_first = 0 -external_perimeter_extrusion_width = 0.45 +external_perimeter_extrusion_width = 0.40 +external_perimeter_speed = 25 extra_perimeters = 0 extruder_clearance_height = 12 extruder_clearance_radius = 45 @@ -52,14 +53,14 @@ fill_pattern = grid first_layer_extrusion_width = 0.42 first_layer_height = 0.2 first_layer_speed = 20 -gap_fill_speed = 30 +gap_fill_speed = 15 gcode_comments = 0 infill_every_layers = 1 infill_extruder = 1 infill_extrusion_width = 0.45 infill_first = 0 infill_only_where_needed = 0 -infill_overlap = 25% +infill_overlap = 20% interface_shells = 0 max_print_speed = 60 max_volumetric_extrusion_rate_slope_negative = 0 @@ -83,7 +84,7 @@ single_extruder_multi_material_priming = 0 skirts = 3 skirt_distance = 2 skirt_height = 1 -small_perimeter_speed = 25 +small_perimeter_speed = 15 solid_infill_below_area = 0 solid_infill_every_layers = 0 solid_infill_extruder = 1 @@ -92,7 +93,7 @@ spiral_vase = 0 standby_temperature_delta = -5 support_material = 0 support_material_extruder = 0 -support_material_extrusion_width = 0.4 +support_material_extrusion_width = 0.40 support_material_interface_extruder = 0 support_material_angle = 0 support_material_buildplate_only = 0 @@ -110,8 +111,8 @@ support_material_threshold = 45 support_material_with_sheath = 0 support_material_xy_spacing = 60% thin_walls = 0 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 40 +top_infill_extrusion_width = 0.40 +top_solid_infill_speed = 20 travel_speed = 130 wipe_tower = 0 wipe_tower_bridging = 10 @@ -194,7 +195,7 @@ top_solid_layers = 7 [print:*0.15mm*] inherits = *common* -external_perimeter_speed = 40 +external_perimeter_speed = 25 infill_acceleration = 1100 infill_speed = 50 layer_height = 0.15 @@ -242,7 +243,7 @@ top_solid_layers = 4 inherits = *common* bottom_solid_layers = 4 bridge_flow_ratio = 0.95 -external_perimeter_speed = 40 +external_perimeter_speed = 25 infill_acceleration = 1100 infill_speed = 60 layer_height = 0.3 @@ -334,7 +335,7 @@ inherits = *0.30mm* # alias = 0.30mm ULTRADRAFT bottom_solid_layers = 3 bridge_speed = 30 -external_perimeter_speed = 35 +external_perimeter_speed = 30 infill_acceleration = 1100 infill_speed = 55 max_print_speed = 60 diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 93006cc56..c8d8d9bfb 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -22,6 +22,12 @@ bed_model = ender3_bed.stl bed_texture = ender3.svg default_materials = Generic PLA @ENDER3; Generic PETG @ENDER3; Generic ABS @ENDER3; Prusament PLA @ENDER3; Prusament PETG @ENDER3 +[printer_model:ENDER2] +name = Creality Ender-2 +variants = 0.4 +technology = FFF +default_materials = Generic PLA @ENDER3; Generic PETG @ENDER3; Generic ABS @ENDER3; Prusament PLA @ENDER3; Prusament PETG @ENDER3 + # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -423,3 +429,9 @@ default_print_profile = 0.20mm NORMAL default_filament_profile = Creality PLA start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y10 F3000\nG1 Z0.28 F240\nG92 E0.0\nG1 Y190 E15.0 F1500.0 ; intro line\nG1 X2.3 F5000\nG1 Y10 E30 F1200.0 ; intro line\nG92 E0.0 end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)} F600{endif} ; Move print head up\nG1 X0 Y200 F3000 ; present print\nM84 X Y E ; disable motors + +[printer:Creality ENDER-2] +inherits = Creality ENDER-3 +bed_shape = 0x0,150x0,150x150,0x150 +printer_model = ENDER2 +max_print_height = 200 diff --git a/resources/profiles/Creality/ENDER2_thumbnail.png b/resources/profiles/Creality/ENDER2_thumbnail.png new file mode 100644 index 000000000..45fb9bfe7 Binary files /dev/null and b/resources/profiles/Creality/ENDER2_thumbnail.png differ diff --git a/resources/shaders/gouraud.vs b/resources/shaders/gouraud.vs index 17cc764e2..2644d48e4 100644 --- a/resources/shaders/gouraud.vs +++ b/resources/shaders/gouraud.vs @@ -62,18 +62,12 @@ void main() float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - intensity.y = 0.0; - - if (NdotL > 0.0) - { - vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz; - intensity.y += LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); - } + vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); // Perform the same lighting calculation for the 2nd light source (no specular applied). NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); - if (NdotL > 0.0) - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; // compute deltas for out of print volume detection (world coordinates) if (print_box.actived) diff --git a/resources/shaders/variable_layer_height.vs b/resources/shaders/variable_layer_height.vs index 5dd697063..0e966b081 100644 --- a/resources/shaders/variable_layer_height.vs +++ b/resources/shaders/variable_layer_height.vs @@ -32,19 +32,13 @@ void main() float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - intensity.y = 0.0; - - if (NdotL > 0.0) - { - vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz; - intensity.y += LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); - } + vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); // Perform the same lighting calculation for the 2nd light source (no specular) NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); - if (NdotL > 0.0) - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; // Scaled to widths of the Z texture. if (object_max_z > 0.0) diff --git a/src/libslic3r/SLA/Common.cpp b/src/libslic3r/SLA/Common.cpp index 9945ed7fa..b57039ad1 100644 --- a/src/libslic3r/SLA/Common.cpp +++ b/src/libslic3r/SLA/Common.cpp @@ -303,8 +303,10 @@ EigenMesh3D::query_ray_hit(const Vec3d &s, const Vec3d &dir) const ret.m_t = double(hit.t); ret.m_dir = dir; ret.m_source = s; - if(!std::isinf(hit.t) && !std::isnan(hit.t)) + if(!std::isinf(hit.t) && !std::isnan(hit.t)) { ret.m_normal = this->normal_by_face_id(hit.id); + ret.m_face_id = hit.id; + } return ret; } @@ -340,8 +342,10 @@ EigenMesh3D::query_ray_hits(const Vec3d &s, const Vec3d &dir) const outs.back().m_t = double(hit.t); outs.back().m_dir = dir; outs.back().m_source = s; - if(!std::isinf(hit.t) && !std::isnan(hit.t)) + if(!std::isinf(hit.t) && !std::isnan(hit.t)) { outs.back().m_normal = this->normal_by_face_id(hit.id); + outs.back().m_face_id = hit.id; + } } return outs; diff --git a/src/libslic3r/SLA/EigenMesh3D.hpp b/src/libslic3r/SLA/EigenMesh3D.hpp index bcf94ec16..014a57e82 100644 --- a/src/libslic3r/SLA/EigenMesh3D.hpp +++ b/src/libslic3r/SLA/EigenMesh3D.hpp @@ -55,6 +55,7 @@ public: class hit_result { // m_t holds a distance from m_source to the intersection. double m_t = infty(); + int m_face_id = -1; const EigenMesh3D *m_mesh = nullptr; Vec3d m_dir; Vec3d m_source; @@ -74,6 +75,7 @@ public: inline const Vec3d& direction() const { return m_dir; } inline const Vec3d& source() const { return m_source; } inline Vec3d position() const { return m_source + m_dir * m_t; } + inline int face() const { return m_face_id; } inline bool is_valid() const { return m_mesh != nullptr; } inline bool is_hit() const { return !std::isinf(m_t); } diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index f5f5f6eb6..26f8de674 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -31,9 +31,10 @@ set(SLIC3R_GUI_SOURCES GUI/GLCanvas3DManager.cpp GUI/Selection.hpp GUI/Selection.cpp - GUI/Gizmos/GLGizmos.hpp GUI/Gizmos/GLGizmosManager.cpp GUI/Gizmos/GLGizmosManager.hpp + GUI/Gizmos/GLGizmosCommon.cpp + GUI/Gizmos/GLGizmosCommon.hpp GUI/Gizmos/GLGizmoBase.cpp GUI/Gizmos/GLGizmoBase.hpp GUI/Gizmos/GLGizmoMove.cpp @@ -44,6 +45,8 @@ set(SLIC3R_GUI_SOURCES GUI/Gizmos/GLGizmoScale.hpp GUI/Gizmos/GLGizmoSlaSupports.cpp GUI/Gizmos/GLGizmoSlaSupports.hpp + GUI/Gizmos/GLGizmoFdmSupports.cpp + GUI/Gizmos/GLGizmoFdmSupports.hpp GUI/Gizmos/GLGizmoFlatten.cpp GUI/Gizmos/GLGizmoFlatten.hpp GUI/Gizmos/GLGizmoCut.cpp diff --git a/src/slic3r/GUI/AppConfig.hpp b/src/slic3r/GUI/AppConfig.hpp index 346d42b21..1e90d32e0 100644 --- a/src/slic3r/GUI/AppConfig.hpp +++ b/src/slic3r/GUI/AppConfig.hpp @@ -60,7 +60,7 @@ public: boost::trim_all(key_trimmed); assert(key_trimmed == key); assert(! key_trimmed.empty()); -#endif _NDEBUG +#endif // _NDEBUG std::string &old = m_storage[section][key]; if (old != value) { old = value; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 9f3c9653c..8d01d2c56 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1,5 +1,4 @@ #include "libslic3r/libslic3r.h" -#include "slic3r/GUI/Gizmos/GLGizmos.hpp" #include "GLCanvas3D.hpp" #include "admesh/stl.h" @@ -1770,10 +1769,15 @@ void GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObje void GLCanvas3D::toggle_model_objects_visibility(bool visible, const ModelObject* mo, int instance_idx) { for (GLVolume* vol : m_volumes.volumes) { - if ((mo == nullptr || m_model->objects[vol->composite_id.object_id] == mo) - && (instance_idx == -1 || vol->composite_id.instance_id == instance_idx)) { - vol->is_active = visible; - vol->force_native_color = (instance_idx != -1); + if (vol->composite_id.object_id == 1000) { // wipe tower + vol->is_active = (visible && mo == nullptr); + } + else { + if ((mo == nullptr || m_model->objects[vol->composite_id.object_id] == mo) + && (instance_idx == -1 || vol->composite_id.instance_id == instance_idx)) { + vol->is_active = visible; + vol->force_native_color = (instance_idx != -1); + } } } if (visible && !mo) @@ -5259,7 +5263,7 @@ void GLCanvas3D::_picking_pass() const glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); - m_camera_clipping_plane = m_gizmos.get_sla_clipping_plane(); + m_camera_clipping_plane = m_gizmos.get_clipping_plane(); if (m_camera_clipping_plane.is_active()) { ::glClipPlane(GL_CLIP_PLANE0, (GLdouble*)m_camera_clipping_plane.get_data()); ::glEnable(GL_CLIP_PLANE0); @@ -5428,7 +5432,7 @@ void GLCanvas3D::_render_objects() const glsafe(::glEnable(GL_DEPTH_TEST)); - m_camera_clipping_plane = m_gizmos.get_sla_clipping_plane(); + m_camera_clipping_plane = m_gizmos.get_clipping_plane(); if (m_picking_enabled) { diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 234847bc4..794226520 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -925,7 +925,8 @@ void GUI_App::add_config_menu(wxMenuBar *menu) local_menu->AppendSeparator(); auto mode_menu = new wxMenu(); mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeSimple, _(L("Simple")), _(L("Simple View Mode"))); - mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeAdvanced, _(L("Advanced")), _(L("Advanced View Mode"))); +// mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeAdvanced, _(L("Advanced")), _(L("Advanced View Mode"))); + mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeAdvanced, _CTX(L_CONTEXT("Advanced", "Mode"), "Mode"), _L("Advanced View Mode")); mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeExpert, _(L("Expert")), _(L("Expert View Mode"))); Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { if(get_mode() == comSimple) evt.Check(true); }, config_id_base + ConfigMenuModeSimple); Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { if(get_mode() == comAdvanced) evt.Check(true); }, config_id_base + ConfigMenuModeAdvanced); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 0d19a86af..8a2b71976 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -32,6 +32,8 @@ static const float CONSTRAINED_COLOR[4] = { 0.5f, 0.5f, 0.5f, 1.0f }; class ImGuiWrapper; class GLCanvas3D; class ClippingPlane; +enum class CommonGizmosDataID; +class CommonGizmosDataPool; class GLGizmoBase { @@ -101,6 +103,7 @@ protected: ImGuiWrapper* m_imgui; bool m_first_input_window_render; mutable std::string m_tooltip; + CommonGizmosDataPool* m_c; public: GLGizmoBase(GLCanvas3D& parent, @@ -128,6 +131,8 @@ public: bool is_activable() const { return on_is_activable(); } bool is_selectable() const { return on_is_selectable(); } + CommonGizmosDataID get_requirements() const { return on_get_requirements(); } + void set_common_data_pool(CommonGizmosDataPool* ptr) { m_c = ptr; } unsigned int get_sprite_id() const { return m_sprite_id; } @@ -161,6 +166,7 @@ protected: virtual void on_set_hover_id() {} virtual bool on_is_activable() const { return true; } virtual bool on_is_selectable() const { return true; } + virtual CommonGizmosDataID on_get_requirements() const { return CommonGizmosDataID(0); } virtual void on_enable_grabber(unsigned int id) {} virtual void on_disable_grabber(unsigned int id) {} virtual void on_start_dragging() {} diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp new file mode 100644 index 000000000..7086f3c8d --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp @@ -0,0 +1,629 @@ +// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. +#include "GLGizmoFdmSupports.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" + +#include + +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/PresetBundle.hpp" +#include "slic3r/GUI/Camera.hpp" + + + +namespace Slic3r { +namespace GUI { + +GLGizmoFdmSupports::GLGizmoFdmSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) + , m_quadric(nullptr) +{ + m_clipping_plane.reset(new ClippingPlane()); + m_quadric = ::gluNewQuadric(); + if (m_quadric != nullptr) + // using GLU_FILL does not work when the instance's transformation + // contains mirroring (normals are reverted) + ::gluQuadricDrawStyle(m_quadric, GLU_FILL); +} + +GLGizmoFdmSupports::~GLGizmoFdmSupports() +{ + if (m_quadric != nullptr) + ::gluDeleteQuadric(m_quadric); +} + +bool GLGizmoFdmSupports::on_init() +{ + m_shortcut_key = WXK_CONTROL_L; + + m_desc["clipping_of_view"] = _L("Clipping of view") + ": "; + m_desc["reset_direction"] = _L("Reset direction"); + m_desc["cursor_size"] = _L("Cursor size") + ": "; + m_desc["enforce_caption"] = _L("Left mouse button") + ": "; + m_desc["enforce"] = _L("Enforce supports"); + m_desc["block_caption"] = _L("Right mouse button") + " "; + m_desc["block"] = _L("Block supports"); + m_desc["remove_caption"] = _L("Shift + Left mouse button") + ": "; + m_desc["remove"] = _L("Remove selection"); + + return true; +} + +void GLGizmoFdmSupports::set_fdm_support_data(ModelObject* model_object, const Selection& selection) +{ + const ModelObject* mo = m_c->selection_info() ? m_c->selection_info()->model_object() : nullptr; + if (! mo) + return; + + if (mo && selection.is_from_single_instance() + && (mo != m_old_mo || mo->volumes.size() != m_old_volumes_size)) + { + update_mesh(); + m_old_mo = mo; + m_old_volumes_size = mo->volumes.size(); + } +} + + + +void GLGizmoFdmSupports::on_render() const +{ + const Selection& selection = m_parent.get_selection(); + + glsafe(::glEnable(GL_BLEND)); + glsafe(::glEnable(GL_DEPTH_TEST)); + + render_triangles(selection); + m_c->object_clipper()->render_cut(); + render_cursor_circle(); + + glsafe(::glDisable(GL_BLEND)); +} + +void GLGizmoFdmSupports::render_triangles(const Selection& selection) const +{ + const ModelObject* mo = m_c->selection_info()->model_object(); + + glsafe(::glEnable(GL_POLYGON_OFFSET_FILL)); + ScopeGuard offset_fill_guard([]() { glsafe(::glDisable(GL_POLYGON_OFFSET_FILL)); } ); + glsafe(::glPolygonOffset(-1.0, 1.0)); + + int mesh_id = -1; + for (const ModelVolume* mv : mo->volumes) { + if (! mv->is_model_part()) + continue; + + ++mesh_id; + + const Transform3d trafo_matrix = + mo->instances[selection.get_instance_idx()]->get_transformation().get_matrix() * + mv->get_matrix(); + + glsafe(::glPushMatrix()); + glsafe(::glMultMatrixd(trafo_matrix.data())); + glsafe(::glColor4f(0.2f, 0.2f, 1.0f, 0.5f)); + m_ivas[mesh_id][0].render(); + glsafe(::glColor4f(1.f, 0.2f, 0.2f, 0.5f)); + m_ivas[mesh_id][1].render(); + glsafe(::glPopMatrix()); + } +} + + +void GLGizmoFdmSupports::render_cursor_circle() const +{ + const Camera& camera = wxGetApp().plater()->get_camera(); + float zoom = (float)camera.get_zoom(); + float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + + Size cnv_size = m_parent.get_canvas_size(); + float cnv_half_width = 0.5f * (float)cnv_size.get_width(); + float cnv_half_height = 0.5f * (float)cnv_size.get_height(); + if ((cnv_half_width == 0.0f) || (cnv_half_height == 0.0f)) + return; + Vec2d mouse_pos(m_parent.get_local_mouse_position()(0), m_parent.get_local_mouse_position()(1)); + Vec2d center(mouse_pos(0) - cnv_half_width, cnv_half_height - mouse_pos(1)); + center = center * inv_zoom; + + glsafe(::glLineWidth(1.5f)); + float color[3]; + color[0] = 0.f; + color[1] = 1.f; + color[2] = 0.3f; + glsafe(::glColor3fv(color)); + glsafe(::glDisable(GL_DEPTH_TEST)); + + glsafe(::glPushMatrix()); + glsafe(::glLoadIdentity()); + // ensure that the circle is renderered inside the frustrum + glsafe(::glTranslated(0.0, 0.0, -(camera.get_near_z() + 0.5))); + // ensure that the overlay fits the frustrum near z plane + double gui_scale = camera.get_gui_scale(); + glsafe(::glScaled(gui_scale, gui_scale, 1.0)); + + glsafe(::glPushAttrib(GL_ENABLE_BIT)); + glsafe(::glLineStipple(4, 0xAAAA)); + glsafe(::glEnable(GL_LINE_STIPPLE)); + + ::glBegin(GL_LINE_LOOP); + for (double angle=0; angle<2*M_PI; angle+=M_PI/20.) + ::glVertex2f(GLfloat(center.x()+m_cursor_radius*cos(angle)), GLfloat(center.y()+m_cursor_radius*sin(angle))); + glsafe(::glEnd()); + + glsafe(::glPopAttrib()); + glsafe(::glPopMatrix()); +} + + +void GLGizmoFdmSupports::on_render_for_picking() const +{ + +} + + + +void GLGizmoFdmSupports::update_mesh() +{ + wxBusyCursor wait; + + const ModelObject* mo = m_c->selection_info()->model_object(); + size_t num_of_volumes = 0; + for (const ModelVolume* mv : mo->volumes) + if (mv->is_model_part()) + ++num_of_volumes; + + m_selected_facets.resize(num_of_volumes); + m_neighbors.resize(num_of_volumes); + m_ivas.clear(); + m_ivas.resize(num_of_volumes); + + int volume_id = -1; + for (const ModelVolume* mv : mo->volumes) { + if (! mv->is_model_part()) + continue; + + ++volume_id; + + // This mesh does not account for the possible Z up SLA offset. + const TriangleMesh* mesh = &mv->mesh(); + + m_selected_facets[volume_id].assign(mesh->its.indices.size(), SelType::NONE); + m_neighbors[volume_id].resize(3 * mesh->its.indices.size()); + + // Prepare vector of vertex_index - facet_index pairs to quickly find adjacent facets + for (size_t i=0; iits.indices.size(); ++i) { + const stl_triangle_vertex_indices& ind = mesh->its.indices[i]; + m_neighbors[volume_id][3*i] = std::make_pair(ind(0), i); + m_neighbors[volume_id][3*i+1] = std::make_pair(ind(1), i); + m_neighbors[volume_id][3*i+2] = std::make_pair(ind(2), i); + } + std::sort(m_neighbors[volume_id].begin(), m_neighbors[volume_id].end()); + } +} + + + + +bool operator<(const GLGizmoFdmSupports::NeighborData& a, const GLGizmoFdmSupports::NeighborData& b) { + return a.first < b.first; +} + + +// Following function is called from GLCanvas3D to inform the gizmo about a mouse/keyboard event. +// The gizmo has an opportunity to react - if it does, it should return true so that the Canvas3D is +// aware that the event was reacted to and stops trying to make different sense of it. If the gizmo +// concludes that the event was not intended for it, it should return false. +bool GLGizmoFdmSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down) +{ + if (action == SLAGizmoEventType::MouseWheelUp + || action == SLAGizmoEventType::MouseWheelDown) { + if (control_down) { + double pos = m_c->object_clipper()->get_position(); + pos = action == SLAGizmoEventType::MouseWheelDown + ? std::max(0., pos - 0.01) + : std::min(1., pos + 0.01); + m_c->object_clipper()->set_position(pos, true); + return true; + } + else if (alt_down) { + m_cursor_radius = action == SLAGizmoEventType::MouseWheelDown + ? std::max(m_cursor_radius - CursorRadiusStep, CursorRadiusMin) + : std::min(m_cursor_radius + CursorRadiusStep, CursorRadiusMax); + m_parent.set_as_dirty(); + return true; + } + } + + if (action == SLAGizmoEventType::ResetClippingPlane) { + m_c->object_clipper()->set_position(-1., false); + return true; + } + + if (action == SLAGizmoEventType::LeftDown + || action == SLAGizmoEventType::RightDown + || (action == SLAGizmoEventType::Dragging && m_button_down != Button::None)) { + + SelType new_state = SelType::NONE; + if (! shift_down) { + if (action == SLAGizmoEventType::Dragging) + new_state = m_button_down == Button::Left + ? SelType::ENFORCER + : SelType::BLOCKER; + else + new_state = action == SLAGizmoEventType::LeftDown + ? SelType::ENFORCER + : SelType::BLOCKER; + } + + const Camera& camera = wxGetApp().plater()->get_camera(); + const Selection& selection = m_parent.get_selection(); + const ModelObject* mo = m_c->selection_info()->model_object(); + const ModelInstance* mi = mo->instances[selection.get_instance_idx()]; + const Transform3d& instance_trafo = mi->get_transformation().get_matrix(); + + std::vector>> hit_positions_and_facet_ids; + bool some_mesh_was_hit = false; + + Vec3f normal = Vec3f::Zero(); + Vec3f hit = Vec3f::Zero(); + size_t facet = 0; + Vec3f closest_hit = Vec3f::Zero(); + double closest_hit_squared_distance = std::numeric_limits::max(); + size_t closest_facet = 0; + size_t closest_hit_mesh_id = size_t(-1); + + // Transformations of individual meshes + std::vector trafo_matrices; + + int mesh_id = -1; + // Cast a ray on all meshes, pick the closest hit and save it for the respective mesh + for (const ModelVolume* mv : mo->volumes) { + if (! mv->is_model_part()) + continue; + + ++mesh_id; + + trafo_matrices.push_back(instance_trafo * mv->get_matrix()); + hit_positions_and_facet_ids.push_back(std::vector>()); + + if (m_c->raycaster()->raycasters()[mesh_id]->unproject_on_mesh( + mouse_position, + trafo_matrices[mesh_id], + camera, + hit, + normal, + m_clipping_plane.get(), + &facet)) + { + // Is this hit the closest to the camera so far? + double hit_squared_distance = (camera.get_position()-trafo_matrices[mesh_id]*hit.cast()).squaredNorm(); + if (hit_squared_distance < closest_hit_squared_distance) { + closest_hit_squared_distance = hit_squared_distance; + closest_facet = facet; + closest_hit_mesh_id = mesh_id; + closest_hit = hit; + } + } + } + // We now know where the ray hit, let's save it and cast another ray + if (closest_hit_mesh_id != size_t(-1)) // only if there is at least one hit + hit_positions_and_facet_ids[closest_hit_mesh_id].emplace_back(closest_hit, closest_facet); + + + // Now propagate the hits + mesh_id = -1; + for (const ModelVolume* mv : mo->volumes) { + + if (! mv->is_model_part()) + continue; + + ++mesh_id; + bool update_both = false; + + const Transform3d& trafo_matrix = trafo_matrices[mesh_id]; + + // Calculate how far can a point be from the line (in mesh coords). + // FIXME: The scaling of the mesh can be non-uniform. + const Vec3d sf = Geometry::Transformation(trafo_matrix).get_scaling_factor(); + const float avg_scaling = (sf(0) + sf(1) + sf(2))/3.; + const float limit = pow(m_cursor_radius/avg_scaling , 2.f); + + // For all hits on this mesh... + for (const std::pair& hit_and_facet : hit_positions_and_facet_ids[mesh_id]) { + some_mesh_was_hit = true; + const TriangleMesh* mesh = &mv->mesh(); + std::vector& neighbors = m_neighbors[mesh_id]; + + // Calculate direction from camera to the hit (in mesh coords): + Vec3f dir = ((trafo_matrix.inverse() * camera.get_position()).cast() - hit_and_facet.first).normalized(); + + // A lambda to calculate distance from the centerline: + auto squared_distance_from_line = [&hit_and_facet, &dir](const Vec3f point) -> float { + Vec3f diff = hit_and_facet.first - point; + return (diff - diff.dot(dir) * dir).squaredNorm(); + }; + + // A lambda to determine whether this facet is potentionally visible (still can be obscured) + auto faces_camera = [&dir](const ModelVolume* mv, const size_t& facet) -> bool { + return (mv->mesh().stl.facet_start[facet].normal.dot(dir) > 0.); + }; + // Now start with the facet the pointer points to and check all adjacent facets. neighbors vector stores + // pairs of vertex_idx - facet_idx and is sorted with respect to the former. Neighboring facet index can be + // quickly found by finding a vertex in the list and read the respective facet ids. + std::vector facets_to_select{hit_and_facet.second}; + NeighborData vertex = std::make_pair(0, 0); + std::vector visited(m_selected_facets[mesh_id].size(), false); // keep track of facets we already processed + size_t facet_idx = 0; // index into facets_to_select + auto it = neighbors.end(); + while (facet_idx < facets_to_select.size()) { + size_t facet = facets_to_select[facet_idx]; + if (! visited[facet]) { + // check all three vertices and in case they're close enough, find the remaining facets + // and add them to the list to be proccessed later + for (size_t i=0; i<3; ++i) { + vertex.first = mesh->its.indices[facet](i); // vertex index + float dist = squared_distance_from_line(mesh->its.vertices[vertex.first]); + if (dist < limit) { + it = std::lower_bound(neighbors.begin(), neighbors.end(), vertex); + while (it != neighbors.end() && it->first == vertex.first) { + if (it->second != facet && faces_camera(mv, it->second)) + facets_to_select.push_back(it->second); + ++it; + } + } + } + visited[facet] = true; + } + ++facet_idx; + } + + // Now just select all facets that passed. + for (size_t next_facet : facets_to_select) { + SelType& facet = m_selected_facets[mesh_id][next_facet]; + + if (facet != new_state && facet != SelType::NONE) { + // this triangle is currently in the other VBA. + // Both VBAs need to be refreshed. + update_both = true; + } + facet = new_state; + } + } + + update_vertex_buffers(mv, mesh_id, + new_state == SelType::ENFORCER || update_both, + new_state == SelType::BLOCKER || update_both + ); + } + + if (some_mesh_was_hit) + { + if (m_button_down == Button::None) + m_button_down = ((action == SLAGizmoEventType::LeftDown) ? Button::Left : Button::Right); + // Force rendering. In case the user is dragging, the queue can be + // flooded by wxEVT_MOVING event and rendering would be skipped. + m_parent.render(); + return true; + } + if (action == SLAGizmoEventType::Dragging && m_button_down != Button::None) { + // Same as above. We don't want the cursor to freeze when we + // leave the mesh while painting. + m_parent.render(); + return true; + } + } + + if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::RightUp) + && m_button_down != Button::None) { + m_button_down = Button::None; + return true; + } + + return false; +} + + +void GLGizmoFdmSupports::update_vertex_buffers(const ModelVolume* mv, + int mesh_id, + bool update_enforcers, + bool update_blockers) +{ + const TriangleMesh* mesh = &mv->mesh(); + + for (SelType type : {SelType::ENFORCER, SelType::BLOCKER}) { + if ((type == SelType::ENFORCER && ! update_enforcers) + || (type == SelType::BLOCKER && ! update_blockers)) + continue; + + GLIndexedVertexArray& iva = m_ivas[mesh_id][type==SelType::ENFORCER ? 0 : 1]; + iva.release_geometry(); + size_t triangle_cnt=0; + for (size_t facet_idx=0; facet_idxits.vertices[mesh->its.indices[facet_idx](i)].cast(), + MeshRaycaster::get_triangle_normal(mesh->its, facet_idx).cast()); + iva.push_triangle(3*triangle_cnt, 3*triangle_cnt+1, 3*triangle_cnt+2); + ++triangle_cnt; + } + iva.finalize_geometry(true); + } +} + + +void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_limit) +{ + if (! m_c->selection_info()->model_object()) + return; + + const float approx_height = m_imgui->scaled(18.0f); + y = std::min(y, bottom_limit - approx_height); + m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); + m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); + + // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that: + const float clipping_slider_left = std::max(m_imgui->calc_text_size(m_desc.at("clipping_of_view")).x, m_imgui->calc_text_size(m_desc.at("reset_direction")).x) + m_imgui->scaled(1.5f); + const float cursor_slider_left = m_imgui->calc_text_size(m_desc.at("cursor_size")).x + m_imgui->scaled(1.f); + const float minimal_slider_width = m_imgui->scaled(4.f); + + float caption_max = 0.f; + float total_text_max = 0.; + for (const std::string& t : {"enforce", "block", "remove"}) { + caption_max = std::max(caption_max, m_imgui->calc_text_size(m_desc.at(t+"_caption")).x); + total_text_max = std::max(total_text_max, caption_max + m_imgui->calc_text_size(m_desc.at(t)).x); + } + caption_max += m_imgui->scaled(1.f); + total_text_max += m_imgui->scaled(1.f); + + float window_width = minimal_slider_width + std::max(cursor_slider_left, clipping_slider_left); + window_width = std::max(window_width, total_text_max); + + auto draw_text_with_caption = [this, &caption_max](const wxString& caption, const wxString& text) { + static const ImVec4 ORANGE(1.0f, 0.49f, 0.22f, 1.0f); + ImGui::PushStyleColor(ImGuiCol_Text, ORANGE); + m_imgui->text(caption); + ImGui::PopStyleColor(); + ImGui::SameLine(caption_max); + m_imgui->text(text); + }; + + for (const std::string& t : {"enforce", "block", "remove"}) + draw_text_with_caption(m_desc.at(t + "_caption"), m_desc.at(t)); + + m_imgui->text(""); + + const float max_tooltip_width = ImGui::GetFontSize() * 20.0f; + + m_imgui->text(m_desc.at("cursor_size")); + ImGui::SameLine(clipping_slider_left); + ImGui::PushItemWidth(window_width - clipping_slider_left); + ImGui::SliderFloat(" ", &m_cursor_radius, CursorRadiusMin, CursorRadiusMax, "%.2f"); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(max_tooltip_width); + ImGui::TextUnformatted(_L("Alt + Mouse wheel").ToUTF8().data()); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } + + ImGui::Separator(); + if (m_c->object_clipper()->get_position() == 0.f) + m_imgui->text(m_desc.at("clipping_of_view")); + else { + if (m_imgui->button(m_desc.at("reset_direction"))) { + wxGetApp().CallAfter([this](){ + m_c->object_clipper()->set_position(-1., false); + }); + } + } + + ImGui::SameLine(clipping_slider_left); + ImGui::PushItemWidth(window_width - clipping_slider_left); + float clp_dist = m_c->object_clipper()->get_position(); + if (ImGui::SliderFloat(" ", &clp_dist, 0.f, 1.f, "%.2f")) + m_c->object_clipper()->set_position(clp_dist, true); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(max_tooltip_width); + ImGui::TextUnformatted(_L("Ctrl + Mouse wheel").ToUTF8().data()); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } + + + + m_imgui->end(); +} + +bool GLGizmoFdmSupports::on_is_activable() const +{ + const Selection& selection = m_parent.get_selection(); + + if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptFFF + || !selection.is_single_full_instance()) + return false; + + // Check that none of the selected volumes is outside. Only SLA auxiliaries (supports) are allowed outside. + const Selection::IndicesList& list = selection.get_volume_idxs(); + for (const auto& idx : list) + if (selection.get_volume(idx)->is_outside) + return false; + + return true; +} + +bool GLGizmoFdmSupports::on_is_selectable() const +{ + return (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptFFF ); +} + +std::string GLGizmoFdmSupports::on_get_name() const +{ + return (_(L("FDM Support Editing")) + " [L]").ToUTF8().data(); +} + + +CommonGizmosDataID GLGizmoFdmSupports::on_get_requirements() const +{ + return CommonGizmosDataID( + int(CommonGizmosDataID::SelectionInfo) + | int(CommonGizmosDataID::InstancesHider) + | int(CommonGizmosDataID::Raycaster) + | int(CommonGizmosDataID::HollowedMesh) + | int(CommonGizmosDataID::ObjectClipper) + | int(CommonGizmosDataID::SupportsClipper)); +} + + +void GLGizmoFdmSupports::on_set_state() +{ + if (m_state == m_old_state) + return; + + if (m_state == On && m_old_state != On) { // the gizmo was just turned on + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("FDM gizmo turned on"))); + } + if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off + // we are actually shutting down + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("FDM gizmo turned off"))); + m_old_mo = nullptr; + m_ivas.clear(); + m_neighbors.clear(); + m_selected_facets.clear(); + } + m_old_state = m_state; +} + + + +void GLGizmoFdmSupports::on_start_dragging() +{ + +} + + +void GLGizmoFdmSupports::on_stop_dragging() +{ + +} + + + +void GLGizmoFdmSupports::on_load(cereal::BinaryInputArchive& ar) +{ + +} + + + +void GLGizmoFdmSupports::on_save(cereal::BinaryOutputArchive& ar) const +{ + +} + + + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp new file mode 100644 index 000000000..d80721fbf --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp @@ -0,0 +1,100 @@ +#ifndef slic3r_GLGizmoFdmSupports_hpp_ +#define slic3r_GLGizmoFdmSupports_hpp_ + +#include "GLGizmoBase.hpp" + +#include "slic3r/GUI/3DScene.hpp" + +#include + + +namespace Slic3r { +namespace GUI { + +enum class SLAGizmoEventType : unsigned char; + +class GLGizmoFdmSupports : public GLGizmoBase +{ +private: + const ModelObject* m_old_mo = nullptr; + size_t m_old_volumes_size = 0; + + GLUquadricObj* m_quadric; + + float m_cursor_radius = 2.f; + static constexpr float CursorRadiusMin = 0.f; + static constexpr float CursorRadiusMax = 8.f; + static constexpr float CursorRadiusStep = 0.2f; + + enum class SelType : int8_t { + NONE, + ENFORCER, + BLOCKER + }; + + // For each model-part volume, store a list of statuses of + // individual facets (one of the enum values above). + std::vector> m_selected_facets; + + // Store two vertex buffer arrays (for enforcers/blockers) + // for each model-part volume. + std::vector> m_ivas; + + void update_vertex_buffers(const ModelVolume* mv, + int mesh_id, + bool update_enforcers, + bool update_blockers); + +public: + GLGizmoFdmSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); + ~GLGizmoFdmSupports() override; + void set_fdm_support_data(ModelObject* model_object, const Selection& selection); + bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); + using NeighborData = std::pair; + + +private: + bool on_init() override; + void on_render() const override; + void on_render_for_picking() const override; + + void render_triangles(const Selection& selection) const; + void render_cursor_circle() const; + void update_mesh(); + + float m_clipping_plane_distance = 0.f; + std::unique_ptr m_clipping_plane; + + // This map holds all translated description texts, so they can be easily referenced during layout calculations + // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect. + std::map m_desc; + + enum class Button { + None, + Left, + Right + }; + + Button m_button_down = Button::None; + EState m_old_state = Off; // to be able to see that the gizmo has just been closed (see on_set_state) + + std::vector> m_neighbors; // pairs of vertex_index - facet_index for each mesh + +protected: + void on_set_state() override; + void on_start_dragging() override; + void on_stop_dragging() override; + void on_render_input_window(float x, float y, float bottom_limit) override; + std::string on_get_name() const override; + bool on_is_activable() const override; + bool on_is_selectable() const override; + void on_load(cereal::BinaryInputArchive& ar) override; + void on_save(cereal::BinaryOutputArchive& ar) const override; + CommonGizmosDataID on_get_requirements() const override; +}; + + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GLGizmoFdmSupports_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp index 9fae8893a..7f33916cd 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -2,6 +2,7 @@ #include "GLGizmoFlatten.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" #include @@ -26,20 +27,15 @@ bool GLGizmoFlatten::on_init() void GLGizmoFlatten::on_set_state() { - // m_model_object pointer can be invalid (for instance because of undo/redo action), - // we should recover it from the object id - m_model_object = nullptr; - for (const auto mo : wxGetApp().model().objects) { - if (mo->id() == m_model_object_id) { - m_model_object = mo; - break; - } - } - if (m_state == On && is_plane_update_necessary()) update_planes(); } +CommonGizmosDataID GLGizmoFlatten::on_get_requirements() const +{ + return CommonGizmosDataID::SelectionInfo; +} + std::string GLGizmoFlatten::on_get_name() const { return (_(L("Place on face")) + " [F]").ToUTF8().data(); @@ -132,18 +128,17 @@ void GLGizmoFlatten::on_render_for_picking() const void GLGizmoFlatten::set_flattening_data(const ModelObject* model_object) { m_starting_center = Vec3d::Zero(); - if (m_model_object != model_object) { + if (model_object != m_old_model_object) { m_planes.clear(); m_planes_valid = false; } - m_model_object = model_object; - m_model_object_id = model_object ? model_object->id() : 0; } void GLGizmoFlatten::update_planes() { + const ModelObject* mo = m_c->selection_info()->model_object(); TriangleMesh ch; - for (const ModelVolume* vol : m_model_object->volumes) + for (const ModelVolume* vol : mo->volumes) { if (vol->type() != ModelVolumeType::MODEL_PART) continue; @@ -153,7 +148,7 @@ void GLGizmoFlatten::update_planes() } ch = ch.convex_hull_3d(); m_planes.clear(); - const Transform3d& inst_matrix = m_model_object->instances.front()->get_matrix(true); + const Transform3d& inst_matrix = mo->instances.front()->get_matrix(true); // Following constants are used for discarding too small polygons. const float minimal_area = 5.f; // in square mm (world coordinates) @@ -331,12 +326,13 @@ void GLGizmoFlatten::update_planes() // Planes are finished - let's save what we calculated it from: m_volumes_matrices.clear(); m_volumes_types.clear(); - for (const ModelVolume* vol : m_model_object->volumes) { + for (const ModelVolume* vol : mo->volumes) { m_volumes_matrices.push_back(vol->get_matrix()); m_volumes_types.push_back(vol->type()); } - m_first_instance_scale = m_model_object->instances.front()->get_scaling_factor(); - m_first_instance_mirror = m_model_object->instances.front()->get_mirror(); + m_first_instance_scale = mo->instances.front()->get_scaling_factor(); + m_first_instance_mirror = mo->instances.front()->get_mirror(); + m_old_model_object = mo; m_planes_valid = true; } @@ -344,20 +340,22 @@ void GLGizmoFlatten::update_planes() bool GLGizmoFlatten::is_plane_update_necessary() const { - if (m_state != On || !m_model_object || m_model_object->instances.empty()) + const ModelObject* mo = m_c->selection_info()->model_object(); + if (m_state != On || ! mo || mo->instances.empty()) return false; - if (! m_planes_valid || m_model_object->volumes.size() != m_volumes_matrices.size()) + if (! m_planes_valid || mo != m_old_model_object + || mo->volumes.size() != m_volumes_matrices.size()) return true; // We want to recalculate when the scale changes - some planes could (dis)appear. - if (! m_model_object->instances.front()->get_scaling_factor().isApprox(m_first_instance_scale) - || ! m_model_object->instances.front()->get_mirror().isApprox(m_first_instance_mirror)) + if (! mo->instances.front()->get_scaling_factor().isApprox(m_first_instance_scale) + || ! mo->instances.front()->get_mirror().isApprox(m_first_instance_mirror)) return true; - for (unsigned int i=0; i < m_model_object->volumes.size(); ++i) - if (! m_model_object->volumes[i]->get_matrix().isApprox(m_volumes_matrices[i]) - || m_model_object->volumes[i]->type() != m_volumes_types[i]) + for (unsigned int i=0; i < mo->volumes.size(); ++i) + if (! mo->volumes[i]->get_matrix().isApprox(m_volumes_matrices[i]) + || mo->volumes[i]->type() != m_volumes_types[i]) return true; return false; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp index 9cd2ab6bb..05b4ae4cd 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp @@ -30,8 +30,7 @@ private: std::vector m_planes; bool m_planes_valid = false; mutable Vec3d m_starting_center; - const ModelObject* m_model_object = nullptr; - ObjectID m_model_object_id = 0; + const ModelObject* m_old_model_object = nullptr; std::vector instances_matrices; void update_planes(); @@ -51,6 +50,7 @@ protected: virtual void on_render() const override; virtual void on_render_for_picking() const override; virtual void on_set_state() override; + virtual CommonGizmosDataID on_get_requirements() const override; }; } // namespace GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 51e6d7458..d2f668dab 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -1,21 +1,15 @@ #include "GLGizmoHollow.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/Camera.hpp" -#include "slic3r/GUI/Gizmos/GLGizmos.hpp" +#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" #include #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GUI_ObjectSettings.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp" -#include "slic3r/GUI/MeshUtils.hpp" #include "slic3r/GUI/Plater.hpp" -#if ENABLE_NON_STATIC_CANVAS_MANAGER -#include "slic3r/GUI/Camera.hpp" -#endif // ENABLE_NON_STATIC_CANVAS_MANAGER #include "slic3r/GUI/PresetBundle.hpp" -#include "libslic3r/SLAPrint.hpp" -#include "libslic3r/TriangleMesh.hpp" namespace Slic3r { @@ -59,32 +53,14 @@ bool GLGizmoHollow::on_init() void GLGizmoHollow::set_sla_support_data(ModelObject*, const Selection&) { - if (m_c->recent_update) { + if (! m_c->selection_info()) + return; - if (m_state == On) - m_c->build_AABB_if_needed(); - - update_clipping_plane(m_c->m_clipping_plane_was_moved); - - // This is a temporary and not very nice hack, to make sure that - // if the cp was moved by the data returned by backend, it will - // remember its direction. FIXME: Refactor this mess and make - // the clipping plane itself part of the shared data. - if (! m_c->m_clipping_plane_was_moved && m_c->m_clipping_plane_distance == 0.25f) - m_c->m_clipping_plane_was_moved = true; - - - if (m_c->m_model_object) { - reload_cache(); - if (m_c->has_drilled_mesh()) - m_holes_in_drilled_mesh = m_c->m_model_object->sla_drain_holes; - } - } - - if (m_state == On) { - m_parent.toggle_model_objects_visibility(false); - m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); - m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance); + const ModelObject* mo = m_c->selection_info()->model_object(); + if (mo) { + reload_cache(); + if (m_c->hollowed_mesh() && m_c->hollowed_mesh()->get_hollowed_mesh()) + m_holes_in_drilled_mesh = mo->sla_drain_holes; } } @@ -93,12 +69,12 @@ void GLGizmoHollow::set_sla_support_data(ModelObject*, const Selection&) void GLGizmoHollow::on_render() const { const Selection& selection = m_parent.get_selection(); + const CommonGizmosDataObjects::SelectionInfo* sel_info = m_c->selection_info(); // If current m_c->m_model_object does not match selection, ask GLCanvas3D to turn us off if (m_state == On - && (m_c->m_model_object != selection.get_model()->objects[selection.get_object_idx()] - || m_c->m_active_instance != selection.get_instance_idx() - || m_c->m_model_object_id != m_c->m_model_object->id())) { + && (sel_info->model_object() != selection.get_model()->objects[selection.get_object_idx()] + || sel_info->get_active_instance() != selection.get_instance_idx())) { m_parent.post_event(SimpleEvent(EVT_GLCANVAS_RESETGIZMOS)); return; } @@ -106,92 +82,17 @@ void GLGizmoHollow::on_render() const glsafe(::glEnable(GL_BLEND)); glsafe(::glEnable(GL_DEPTH_TEST)); - m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); - if (m_quadric != nullptr && selection.is_from_single_instance()) render_points(selection, false); m_selection_rectangle.render(m_parent); - render_clipping_plane(selection); + m_c->object_clipper()->render_cut(); + m_c->supports_clipper()->render_cut(); glsafe(::glDisable(GL_BLEND)); } - -void GLGizmoHollow::render_clipping_plane(const Selection& selection) const -{ - if (m_c->m_clipping_plane_distance == 0.f) - return; - - // Get transformation of the instance - const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); - Geometry::Transformation trafo = vol->get_instance_transformation(); - trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); - - // Get transformation of supports - Geometry::Transformation supports_trafo; - supports_trafo.set_offset(Vec3d(trafo.get_offset()(0), trafo.get_offset()(1), vol->get_sla_shift_z())); - supports_trafo.set_rotation(Vec3d(0., 0., trafo.get_rotation()(2))); - // I don't know why, but following seems to be correct. - supports_trafo.set_mirror(Vec3d(trafo.get_mirror()(0) * trafo.get_mirror()(1) * trafo.get_mirror()(2), - 1, - 1.)); - - // Now initialize the TMS for the object, perform the cut and save the result. - if (! m_c->m_object_clipper) { - m_c->m_object_clipper.reset(new MeshClipper); - m_c->m_object_clipper->set_mesh(*m_c->mesh()); - } - m_c->m_object_clipper->set_plane(*m_c->m_clipping_plane); - m_c->m_object_clipper->set_transformation(trafo); - - if (m_c->m_print_object_idx >= 0) { - const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_c->m_print_object_idx]; - - if (print_object->is_step_done(slaposSupportTree) && !print_object->get_mesh(slaposSupportTree).empty()) { - // If the supports are already calculated, save the timestamp of the respective step - // so we can later tell they were recalculated. - size_t timestamp = print_object->step_state_with_timestamp(slaposSupportTree).timestamp; - - if (! m_c->m_supports_clipper || (int)timestamp != m_c->m_old_timestamp) { - // The timestamp has changed. - m_c->m_supports_clipper.reset(new MeshClipper); - // The mesh should already have the shared vertices calculated. - m_c->m_supports_clipper->set_mesh(print_object->support_mesh()); - m_c->m_old_timestamp = timestamp; - } - m_c->m_supports_clipper->set_plane(*m_c->m_clipping_plane); - m_c->m_supports_clipper->set_transformation(supports_trafo); - } - else - // The supports are not valid. We better dump the cached data. - m_c->m_supports_clipper.reset(); - } - - // At this point we have the triangulated cuts for both the object and supports - let's render. - if (! m_c->m_object_clipper->get_triangles().empty()) { - ::glPushMatrix(); - ::glColor3f(1.0f, 0.37f, 0.0f); - ::glBegin(GL_TRIANGLES); - for (const Vec3f& point : m_c->m_object_clipper->get_triangles()) - ::glVertex3f(point(0), point(1), point(2)); - ::glEnd(); - ::glPopMatrix(); - } - - if (m_show_supports && m_c->m_supports_clipper && ! m_c->m_supports_clipper->get_triangles().empty()) { - ::glPushMatrix(); - ::glColor3f(1.0f, 0.f, 0.37f); - ::glBegin(GL_TRIANGLES); - for (const Vec3f& point : m_c->m_supports_clipper->get_triangles()) - ::glVertex3f(point(0), point(1), point(2)); - ::glEnd(); - ::glPopMatrix(); - } -} - - void GLGizmoHollow::on_render_for_picking() const { const Selection& selection = m_parent.get_selection(); @@ -213,17 +114,18 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix(); glsafe(::glPushMatrix()); - glsafe(::glTranslated(0.0, 0.0, m_z_shift)); + glsafe(::glTranslated(0.0, 0.0, m_c->selection_info()->get_sla_shift())); glsafe(::glMultMatrixd(instance_matrix.data())); float render_color[4]; - size_t cache_size = m_c->m_model_object->sla_drain_holes.size(); + const sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; + size_t cache_size = drain_holes.size(); for (size_t i = 0; i < cache_size; ++i) { - const sla::DrainHole& drain_hole = m_c->m_model_object->sla_drain_holes[i]; + const sla::DrainHole& drain_hole = drain_holes[i]; const bool& point_selected = m_selected[i]; - if (is_mesh_point_clipped((drain_hole.pos+m_c->HoleStickOutLength*drain_hole.normal).cast())) + if (is_mesh_point_clipped((drain_hole.pos+HoleStickOutLength*drain_hole.normal).cast())) continue; // First decide about the color of the point. @@ -261,7 +163,6 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons glFrontFace(GL_CW); // Matrices set, we can render the point mark now. - Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); Eigen::AngleAxisd aa(q); @@ -297,12 +198,17 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const { - if (m_c->m_clipping_plane_distance == 0.f) + if (m_c->object_clipper()->get_position() == 0.) return false; - Vec3d transformed_point = m_c->m_model_object->instances[m_c->m_active_instance]->get_transformation().get_matrix() * point; - transformed_point(2) += m_z_shift; - return m_c->m_clipping_plane->is_point_clipped(transformed_point); + auto sel_info = m_c->selection_info(); + int active_inst = m_c->selection_info()->get_active_instance(); + const ModelInstance* mi = sel_info->model_object()->instances[active_inst]; + const Transform3d& trafo = mi->get_transformation().get_matrix(); + + Vec3d transformed_point = trafo * point; + transformed_point(2) += sel_info->get_sla_shift(); + return m_c->object_clipper()->get_clipping_plane()->is_point_clipped(transformed_point); } @@ -311,7 +217,7 @@ bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const // Return false if no intersection was found, true otherwise. bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal) { - if (! m_c->m_mesh_raycaster) + if (! m_c->raycaster()->raycaster()) return false; #if ENABLE_NON_STATIC_CANVAS_MANAGER @@ -322,20 +228,23 @@ bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pairget_instance_transformation(); - trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift())); + + double clp_dist = m_c->object_clipper()->get_position(); + const ClippingPlane* clp = m_c->object_clipper()->get_clipping_plane(); // The raycaster query Vec3f hit; Vec3f normal; - if (m_c->m_mesh_raycaster->unproject_on_mesh( + if (m_c->raycaster()->raycaster()->unproject_on_mesh( mouse_pos, trafo.get_matrix(), camera, hit, normal, - m_c->m_clipping_plane_distance != 0.f ? m_c->m_clipping_plane.get() : nullptr)) + clp_dist != 0. ? clp : nullptr)) { - if (m_c->has_drilled_mesh()) { + if (m_c->hollowed_mesh() && m_c->hollowed_mesh()->get_hollowed_mesh()) { // in this case the raycaster sees the hollowed and drilled mesh. // if the point lies on the surface created by the hole, we want // to ignore it. @@ -362,6 +271,10 @@ bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pairselection_info()->model_object(); + int active_inst = m_c->selection_info()->get_active_instance(); + + // left down with shift - show the selection rectangle: if (action == SLAGizmoEventType::LeftDown && (shift_down || alt_down || control_down)) { if (m_hover_id == -1) { @@ -393,15 +306,15 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos if (unproject_on_mesh(mouse_position, pos_and_normal)) { // we got an intersection Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add drainage hole"))); - Vec3d scaling = m_c->m_model_object->instances[m_c->m_active_instance]->get_scaling_factor(); + Vec3d scaling = mo->instances[active_inst]->get_scaling_factor(); Vec3f normal_transformed(pos_and_normal.second(0)/scaling(0), pos_and_normal.second(1)/scaling(1), pos_and_normal.second(2)/scaling(2)); - m_c->m_model_object->sla_drain_holes.emplace_back(pos_and_normal.first + m_c->HoleStickOutLength * pos_and_normal.second/* normal_transformed.normalized()*/, + mo->sla_drain_holes.emplace_back(pos_and_normal.first + HoleStickOutLength * pos_and_normal.second/* normal_transformed.normalized()*/, -pos_and_normal.second, m_new_hole_radius, m_new_hole_height); m_selected.push_back(false); - assert(m_selected.size() == m_c->m_model_object->sla_drain_holes.size()); + assert(m_selected.size() == mo->sla_drain_holes.size()); m_parent.set_as_dirty(); m_wait_for_up_event = true; } @@ -420,11 +333,11 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state(); // First collect positions of all the points in world coordinates. - Geometry::Transformation trafo = m_c->m_model_object->instances[m_c->m_active_instance]->get_transformation(); - trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + Geometry::Transformation trafo = mo->instances[active_inst]->get_transformation(); + trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift())); std::vector points; - for (unsigned int i=0; im_model_object->sla_drain_holes.size(); ++i) - points.push_back(trafo.get_matrix() * m_c->m_model_object->sla_drain_holes[i].pos.cast()); + for (unsigned int i=0; isla_drain_holes.size(); ++i) + points.push_back(trafo.get_matrix() * mo->sla_drain_holes[i].pos.cast()); // Now ask the rectangle which of the points are inside. std::vector points_inside; @@ -433,11 +346,9 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos points_inside.push_back(points[idx].cast()); // Only select/deselect points that are actually visible -#if ENABLE_NON_STATIC_CANVAS_MANAGER - for (size_t idx : m_c->m_mesh_raycaster->get_unobscured_idxs(trafo, wxGetApp().plater()->get_camera(), points_inside, m_c->m_clipping_plane.get())) -#else - for (size_t idx : m_c->m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_c->m_clipping_plane.get())) -#endif // ENABLE_NON_STATIC_CANVAS_MANAGER + for (size_t idx : m_c->raycaster()->raycaster()->get_unobscured_idxs( + trafo, wxGetApp().plater()->get_camera(), points_inside, + m_c->object_clipper()->get_clipping_plane())) { if (rectangle_status == GLSelectionRectangle::Deselect) unselect_point(points_idxs[idx]); @@ -491,20 +402,21 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos } if (action == SLAGizmoEventType::MouseWheelUp && control_down) { - m_c->m_clipping_plane_distance = std::min(1.f, m_c->m_clipping_plane_distance + 0.01f); - update_clipping_plane(m_c->m_clipping_plane_was_moved); - m_c->m_clipping_plane_was_moved = true; + double pos = m_c->object_clipper()->get_position(); + pos = std::min(1., pos + 0.01); + m_c->object_clipper()->set_position(pos, true); return true; } if (action == SLAGizmoEventType::MouseWheelDown && control_down) { - m_c->m_clipping_plane_distance = std::max(0.f, m_c->m_clipping_plane_distance - 0.01f); - update_clipping_plane(true); + double pos = m_c->object_clipper()->get_position(); + pos = std::max(0., pos - 0.01); + m_c->object_clipper()->set_position(pos, true); return true; } if (action == SLAGizmoEventType::ResetClippingPlane) { - update_clipping_plane(); + m_c->object_clipper()->set_position(-1., false); return true; } @@ -514,11 +426,12 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos void GLGizmoHollow::delete_selected_points() { Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Delete drainage hole"))); + sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; - for (unsigned int idx=0; idxm_model_object->sla_drain_holes.size(); ++idx) { + for (unsigned int idx=0; idxm_model_object->sla_drain_holes.erase(m_c->m_model_object->sla_drain_holes.begin() + (idx--)); + drain_holes.erase(drain_holes.begin() + (idx--)); } } @@ -527,12 +440,14 @@ void GLGizmoHollow::delete_selected_points() void GLGizmoHollow::on_update(const UpdateData& data) { + sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; + if (m_hover_id != -1) { std::pair pos_and_normal; if (! unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) return; - m_c->m_model_object->sla_drain_holes[m_hover_id].pos = pos_and_normal.first + m_c->HoleStickOutLength * pos_and_normal.second; - m_c->m_model_object->sla_drain_holes[m_hover_id].normal = -pos_and_normal.second; + drain_holes[m_hover_id].pos = pos_and_normal.first + HoleStickOutLength * pos_and_normal.second; + drain_holes[m_hover_id].normal = -pos_and_normal.second; } } @@ -540,19 +455,22 @@ void GLGizmoHollow::on_update(const UpdateData& data) void GLGizmoHollow::hollow_mesh(bool postpone_error_messages) { wxGetApp().CallAfter([this, postpone_error_messages]() { - wxGetApp().plater()->reslice_SLA_hollowing(*m_c->m_model_object, postpone_error_messages); + wxGetApp().plater()->reslice_SLA_hollowing( + *m_c->selection_info()->model_object(), postpone_error_messages); }); } -std::vector> GLGizmoHollow::get_config_options(const std::vector& keys) const +std::vector> +GLGizmoHollow::get_config_options(const std::vector& keys) const { std::vector> out; + const ModelObject* mo = m_c->selection_info()->model_object(); - if (!m_c->m_model_object) + if (! mo) return out; - const DynamicPrintConfig& object_cfg = m_c->m_model_object->config; + const DynamicPrintConfig& object_cfg = mo->config; const DynamicPrintConfig& print_cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; std::unique_ptr default_cfg = nullptr; @@ -573,18 +491,10 @@ std::vector> GLGizmoHollo } -ClippingPlane GLGizmoHollow::get_sla_clipping_plane() const -{ - if (!m_c->m_model_object || m_state == Off || m_c->m_clipping_plane_distance == 0.f) - return ClippingPlane::ClipsNothing(); - else - return ClippingPlane(-m_c->m_clipping_plane->get_normal(), m_c->m_clipping_plane->get_data()[3]); -} - - void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) { - if (! m_c->m_model_object) + ModelObject* mo = m_c->selection_info()->model_object(); + if (! mo) return; bool first_run = true; // This is a hack to redraw the button when all points are removed, @@ -650,7 +560,7 @@ RENDER_AGAIN: auto opts = get_config_options({"hollowing_enable"}); m_enable_hollowing = static_cast(opts[0].first)->value; if (m_imgui->checkbox(m_desc["enable"], m_enable_hollowing)) { - m_c->m_model_object->config.opt("hollowing_enable", true)->value = m_enable_hollowing; + mo->config.opt("hollowing_enable", true)->value = m_enable_hollowing; wxGetApp().obj_list()->update_and_show_object_settings_item(); config_changed = true; } @@ -712,14 +622,14 @@ RENDER_AGAIN: } if (slider_edited || slider_released) { if (slider_released) { - m_c->m_model_object->config.opt("hollowing_min_thickness", true)->value = m_offset_stash; - m_c->m_model_object->config.opt("hollowing_quality", true)->value = m_quality_stash; - m_c->m_model_object->config.opt("hollowing_closing_distance", true)->value = m_closing_d_stash; + mo->config.opt("hollowing_min_thickness", true)->value = m_offset_stash; + mo->config.opt("hollowing_quality", true)->value = m_quality_stash; + mo->config.opt("hollowing_closing_distance", true)->value = m_closing_d_stash; Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Hollowing parameter change"))); } - m_c->m_model_object->config.opt("hollowing_min_thickness", true)->value = offset; - m_c->m_model_object->config.opt("hollowing_quality", true)->value = quality; - m_c->m_model_object->config.opt("hollowing_closing_distance", true)->value = closing_d; + mo->config.opt("hollowing_min_thickness", true)->value = offset; + mo->config.opt("hollowing_quality", true)->value = quality; + mo->config.opt("hollowing_closing_distance", true)->value = closing_d; if (slider_released) { wxGetApp().obj_list()->update_and_show_object_settings_item(); config_changed = true; @@ -750,9 +660,9 @@ RENDER_AGAIN: m_imgui->text(m_desc["hole_depth"]); ImGui::SameLine(diameter_slider_left); - m_new_hole_height -= m_c->HoleStickOutLength; + m_new_hole_height -= HoleStickOutLength; ImGui::SliderFloat(" ", &m_new_hole_height, 0.f, 10.f, "%.1f mm"); - m_new_hole_height += m_c->HoleStickOutLength; + m_new_hole_height += HoleStickOutLength; clicked |= ImGui::IsItemClicked(); edited |= ImGui::IsItemEdited(); @@ -764,19 +674,19 @@ RENDER_AGAIN: // - take correct undo/redo snapshot after the user is done with moving the slider if (! m_selection_empty) { if (clicked) { - m_holes_stash = m_c->m_model_object->sla_drain_holes; + m_holes_stash = mo->sla_drain_holes; } if (edited) { for (size_t idx=0; idxm_model_object->sla_drain_holes[idx].radius = m_new_hole_radius; - m_c->m_model_object->sla_drain_holes[idx].height = m_new_hole_height; + mo->sla_drain_holes[idx].radius = m_new_hole_radius; + mo->sla_drain_holes[idx].height = m_new_hole_height; } } if (deactivated) { // momentarily restore the old value to take snapshot - sla::DrainHoles new_holes = m_c->m_model_object->sla_drain_holes; - m_c->m_model_object->sla_drain_holes = m_holes_stash; + sla::DrainHoles new_holes = mo->sla_drain_holes; + mo->sla_drain_holes = m_holes_stash; float backup_rad = m_new_hole_radius; float backup_hei = m_new_hole_height; for (size_t i=0; im_model_object->sla_drain_holes = new_holes; + mo->sla_drain_holes = new_holes; } } @@ -797,33 +707,33 @@ RENDER_AGAIN: remove_selected = m_imgui->button(m_desc.at("remove_selected")); m_imgui->disabled_end(); - m_imgui->disabled_begin(m_c->m_model_object->sla_drain_holes.empty()); + m_imgui->disabled_begin(mo->sla_drain_holes.empty()); remove_all = m_imgui->button(m_desc.at("remove_all")); m_imgui->disabled_end(); // Following is rendered in both editing and non-editing mode: // m_imgui->text(""); ImGui::Separator(); - if (m_c->m_clipping_plane_distance == 0.f) + if (m_c->object_clipper()->get_position() == 0.f) m_imgui->text(m_desc.at("clipping_of_view")); else { if (m_imgui->button(m_desc.at("reset_direction"))) { wxGetApp().CallAfter([this](){ - update_clipping_plane(); + m_c->object_clipper()->set_position(-1., false); }); } } ImGui::SameLine(clipping_slider_left); ImGui::PushItemWidth(window_width - clipping_slider_left); - if (ImGui::SliderFloat(" ", &m_c->m_clipping_plane_distance, 0.f, 1.f, "%.2f")) { - update_clipping_plane(m_c->m_clipping_plane_was_moved); - m_c->m_clipping_plane_was_moved = true; - } + float clp_dist = m_c->object_clipper()->get_position(); + if (ImGui::SliderFloat(" ", &clp_dist, 0.f, 1.f, "%.2f")) + m_c->object_clipper()->set_position(clp_dist, true); // make sure supports are shown/hidden as appropriate - if (m_imgui->checkbox(m_desc["show_supports"], m_show_supports)) { - m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance); + bool show_sups = m_c->instances_hider()->are_supports_shown(); + if (m_imgui->checkbox(m_desc["show_supports"], show_sups)) { + m_c->instances_hider()->show_supports(show_sups); force_refresh = true; } @@ -882,54 +792,30 @@ std::string GLGizmoHollow::on_get_name() const } +CommonGizmosDataID GLGizmoHollow::on_get_requirements() const +{ + return CommonGizmosDataID( + int(CommonGizmosDataID::SelectionInfo) + | int(CommonGizmosDataID::InstancesHider) + | int(CommonGizmosDataID::Raycaster) + | int(CommonGizmosDataID::HollowedMesh) + | int(CommonGizmosDataID::ObjectClipper) + | int(CommonGizmosDataID::SupportsClipper)); +} + void GLGizmoHollow::on_set_state() { - // m_c->m_model_object pointer can be invalid (for instance because of undo/redo action), - // we should recover it from the object id - m_c->m_model_object = nullptr; - for (const auto mo : wxGetApp().model().objects) { - if (mo->id() == m_c->m_model_object_id) { - m_c->m_model_object = mo; - break; - } - } - if (m_state == m_old_state) return; if (m_state == On && m_old_state != On) { // the gizmo was just turned on - //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on"))); - //m_c->update_from_backend(m_parent, m_c->m_model_object); - m_c->unstash_clipping_plane(); - update_clipping_plane(m_c->m_clipping_plane_was_moved); - - m_c->build_AABB_if_needed(); - // we'll now reload support points: - if (m_c->m_model_object) + if (m_c->selection_info()->model_object()) reload_cache(); - - m_parent.toggle_model_objects_visibility(false); - if (m_c->m_model_object) { - m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); - m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance); - } } - if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off - //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned off"))); + if (m_state == Off && m_old_state != Off) // the gizmo was just turned Off m_parent.post_event(SimpleEvent(EVT_GLCANVAS_FORCE_UPDATE)); - m_parent.toggle_model_objects_visibility(true); - m_c->stash_clipping_plane(); - m_c->m_clipping_plane_distance = 0.f; - update_clipping_plane(true); - // Release clippers and the AABB raycaster. - m_c->m_object_clipper.reset(); - m_c->m_supports_clipper.reset(); - //m_c->m_mesh_raycaster.reset(); - //m_c->m_cavity_mesh.reset(); - //m_c->m_volume_with_cavity.reset(); - } m_old_state = m_state; } @@ -940,7 +826,7 @@ void GLGizmoHollow::on_start_dragging() if (m_hover_id != -1) { select_point(NoPoints); select_point(m_hover_id); - m_hole_before_drag = m_c->m_model_object->sla_drain_holes[m_hover_id].pos; + m_hole_before_drag = m_c->selection_info()->model_object()->sla_drain_holes[m_hover_id].pos; } else m_hole_before_drag = Vec3f::Zero(); @@ -949,15 +835,16 @@ void GLGizmoHollow::on_start_dragging() void GLGizmoHollow::on_stop_dragging() { + sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; if (m_hover_id != -1) { - Vec3f backup = m_c->m_model_object->sla_drain_holes[m_hover_id].pos; + Vec3f backup = drain_holes[m_hover_id].pos; if (m_hole_before_drag != Vec3f::Zero() // some point was touched && backup != m_hole_before_drag) // and it was moved, not just selected { - m_c->m_model_object->sla_drain_holes[m_hover_id].pos = m_hole_before_drag; + drain_holes[m_hover_id].pos = m_hole_before_drag; Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Move drainage hole"))); - m_c->m_model_object->sla_drain_holes[m_hover_id].pos = backup; + drain_holes[m_hover_id].pos = backup; } } m_hole_before_drag = Vec3f::Zero(); @@ -967,10 +854,7 @@ void GLGizmoHollow::on_stop_dragging() void GLGizmoHollow::on_load(cereal::BinaryInputArchive& ar) { - ar(m_c->m_clipping_plane_distance, - *m_c->m_clipping_plane, - m_c->m_model_object_id, - m_new_hole_radius, + ar(m_new_hole_radius, m_new_hole_height, m_selected, m_selection_empty @@ -981,10 +865,7 @@ void GLGizmoHollow::on_load(cereal::BinaryInputArchive& ar) void GLGizmoHollow::on_save(cereal::BinaryOutputArchive& ar) const { - ar(m_c->m_clipping_plane_distance, - *m_c->m_clipping_plane, - m_c->m_model_object_id, - m_new_hole_radius, + ar(m_new_hole_radius, m_new_hole_height, m_selected, m_selection_empty @@ -995,13 +876,15 @@ void GLGizmoHollow::on_save(cereal::BinaryOutputArchive& ar) const void GLGizmoHollow::select_point(int i) { + const sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; + if (i == AllPoints || i == NoPoints) { m_selected.assign(m_selected.size(), i == AllPoints); m_selection_empty = (i == NoPoints); if (i == AllPoints) { - m_new_hole_radius = m_c->m_model_object->sla_drain_holes[0].radius; - m_new_hole_height = m_c->m_model_object->sla_drain_holes[0].height; + m_new_hole_radius = drain_holes[0].radius; + m_new_hole_height = drain_holes[0].height; } } else { @@ -1009,8 +892,8 @@ void GLGizmoHollow::select_point(int i) m_selected.push_back(false); m_selected[i] = true; m_selection_empty = false; - m_new_hole_radius = m_c->m_model_object->sla_drain_holes[i].radius; - m_new_hole_height = m_c->m_model_object->sla_drain_holes[i].height; + m_new_hole_radius = drain_holes[i].radius; + m_new_hole_height = drain_holes[i].height; } } @@ -1030,31 +913,13 @@ void GLGizmoHollow::unselect_point(int i) void GLGizmoHollow::reload_cache() { m_selected.clear(); - m_selected.assign(m_c->m_model_object->sla_drain_holes.size(), false); -} - -void GLGizmoHollow::update_clipping_plane(bool keep_normal) const -{ - if (! m_c->m_model_object) - return; -#if ENABLE_NON_STATIC_CANVAS_MANAGER - Vec3d normal = (keep_normal && m_c->m_clipping_plane->get_normal() != Vec3d::Zero() ? - m_c->m_clipping_plane->get_normal() : -wxGetApp().plater()->get_camera().get_dir_forward()); -#else - Vec3d normal = (keep_normal && m_c->m_clipping_plane->get_normal() != Vec3d::Zero() ? - m_c->m_clipping_plane->get_normal() : -m_parent.get_camera().get_dir_forward()); -#endif // ENABLE_NON_STATIC_CANVAS_MANAGER - - const Vec3d& center = m_c->m_model_object->instances[m_c->m_active_instance]->get_offset() + Vec3d(0., 0., m_z_shift); - float dist = normal.dot(center); - *m_c->m_clipping_plane = ClippingPlane(normal, (dist - (-m_c->m_active_instance_bb_radius) - m_c->m_clipping_plane_distance * 2*m_c->m_active_instance_bb_radius)); - m_parent.set_as_dirty(); + m_selected.assign(m_c->selection_info()->model_object()->sla_drain_holes.size(), false); } void GLGizmoHollow::on_set_hover_id() { - if (int(m_c->m_model_object->sla_drain_holes.size()) <= m_hover_id) + if (int(m_c->selection_info()->model_object()->sla_drain_holes.size()) <= m_hover_id) m_hover_id = -1; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 3aafcbf55..3ee83c345 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -13,16 +13,11 @@ namespace Slic3r { namespace GUI { -class ClippingPlane; -class MeshClipper; -class MeshRaycaster; -class CommonGizmosData; enum class SLAGizmoEventType : unsigned char; class GLGizmoHollow : public GLGizmoBase { private: - mutable double m_z_shift = 0.; bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal); GLUquadricObj* m_quadric; @@ -33,12 +28,10 @@ public: ~GLGizmoHollow() override; void set_sla_support_data(ModelObject* model_object, const Selection& selection); bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); - void delete_selected_points(); - ClippingPlane get_sla_clipping_plane() const; - - bool is_selection_rectangle_dragging() const { return m_selection_rectangle.is_dragging(); } - void update_clipping_plane(bool keep_normal = false) const; - void set_common_data_ptr(CommonGizmosData* ptr) { m_c = ptr; } + void delete_selected_points(); + bool is_selection_rectangle_dragging() const { + return m_selection_rectangle.is_dragging(); + } private: bool on_init() override; @@ -47,11 +40,10 @@ private: void on_render_for_picking() const override; void render_points(const Selection& selection, bool picking = false) const; - void render_clipping_plane(const Selection& selection) const; void hollow_mesh(bool postpone_error_messages = false); bool unsaved_changes() const; - bool m_show_supports = true; + // bool m_show_supports = true; float m_new_hole_radius = 2.f; // Size of a new hole. float m_new_hole_height = 6.f; mutable std::vector m_selected; // which holes are currently selected @@ -67,10 +59,6 @@ private: sla::DrainHoles m_holes_in_drilled_mesh; sla::DrainHoles m_holes_stash; - - CommonGizmosData* m_c = nullptr; - - //std::unique_ptr m_clipping_plane; // This map holds all translated description texts, so they can be easily referenced during layout calculations // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect. @@ -101,6 +89,7 @@ protected: void on_start_dragging() override; void on_stop_dragging() override; void on_render_input_window(float x, float y, float bottom_limit) override; + virtual CommonGizmosDataID on_get_requirements() const override; std::string on_get_name() const override; bool on_is_activable() const override; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 064302c02..496568d51 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -2,7 +2,7 @@ #include "GLGizmoSlaSupports.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/Camera.hpp" -#include "slic3r/GUI/Gizmos/GLGizmos.hpp" +#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" #include @@ -14,10 +14,6 @@ #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/GUI_ObjectSettings.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp" -#if ENABLE_NON_STATIC_CANVAS_MANAGER -#include "slic3r/GUI/Camera.hpp" -#endif // ENABLE_NON_STATIC_CANVAS_MANAGER -#include "slic3r/GUI/MeshUtils.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/PresetBundle.hpp" #include "libslic3r/SLAPrint.hpp" @@ -29,7 +25,6 @@ namespace GUI { GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) : GLGizmoBase(parent, icon_filename, sprite_id) , m_quadric(nullptr) - , m_its(nullptr) { m_quadric = ::gluNewQuadric(); if (m_quadric != nullptr) @@ -66,26 +61,21 @@ bool GLGizmoSlaSupports::on_init() void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const Selection& selection) { - if (m_c->recent_update) { - if (m_state == On) - m_c->build_AABB_if_needed(); + if (! m_c->selection_info()) + return; - update_clipping_plane(m_c->m_clipping_plane_was_moved); + ModelObject* mo = m_c->selection_info()->model_object(); + if (mo != m_old_mo) { disable_editing_mode(); - if (m_c->m_model_object) + if (mo) reload_cache(); - } - - if (m_state == On) { - m_parent.toggle_model_objects_visibility(false); - m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); - m_parent.toggle_sla_auxiliaries_visibility(! m_editing_mode, m_c->m_model_object, m_c->m_active_instance); + m_old_mo = mo; } // If we triggered autogeneration before, check backend and fetch results if they are there - if (m_c->m_model_object) { - if (m_c->m_model_object->sla_points_status == sla::PointsStatus::Generating) + if (mo) { + if (mo->sla_points_status == sla::PointsStatus::Generating) get_data_from_backend(); } } @@ -94,13 +84,13 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S void GLGizmoSlaSupports::on_render() const { + ModelObject* mo = m_c->selection_info()->model_object(); const Selection& selection = m_parent.get_selection(); // If current m_c->m_model_object does not match selection, ask GLCanvas3D to turn us off if (m_state == On - && (m_c->m_model_object != selection.get_model()->objects[selection.get_object_idx()] - || m_c->m_active_instance != selection.get_instance_idx() - || m_c->m_model_object_id != m_c->m_model_object->id())) { + && (mo != selection.get_model()->objects[selection.get_object_idx()] + || m_c->selection_info()->get_active_instance() != selection.get_instance_idx())) { m_parent.post_event(SimpleEvent(EVT_GLCANVAS_RESETGIZMOS)); return; } @@ -108,113 +98,20 @@ void GLGizmoSlaSupports::on_render() const glsafe(::glEnable(GL_BLEND)); glsafe(::glEnable(GL_DEPTH_TEST)); - m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); - if (m_quadric != nullptr && selection.is_from_single_instance()) render_points(selection, false); m_selection_rectangle.render(m_parent); - render_clipping_plane(selection); + m_c->object_clipper()->render_cut(); + m_c->supports_clipper()->render_cut(); glsafe(::glDisable(GL_BLEND)); } - -void GLGizmoSlaSupports::render_clipping_plane(const Selection& selection) const -{ - if (m_c->m_clipping_plane_distance == 0.f || m_c->m_mesh->empty()) - return; - - // Get transformation of the instance - const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); - Geometry::Transformation trafo = vol->get_instance_transformation(); - trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); - - // Get transformation of supports - Geometry::Transformation supports_trafo; - supports_trafo.set_offset(Vec3d(trafo.get_offset()(0), trafo.get_offset()(1), vol->get_sla_shift_z())); - supports_trafo.set_rotation(Vec3d(0., 0., trafo.get_rotation()(2))); - // I don't know why, but following seems to be correct. - supports_trafo.set_mirror(Vec3d(trafo.get_mirror()(0) * trafo.get_mirror()(1) * trafo.get_mirror()(2), - 1, - 1.)); - - // Now initialize the TMS for the object, perform the cut and save the result. - if (! m_c->m_object_clipper) { - m_c->m_object_clipper.reset(new MeshClipper); - m_c->m_object_clipper->set_mesh(*m_c->mesh()); - } - m_c->m_object_clipper->set_plane(*m_c->m_clipping_plane); - m_c->m_object_clipper->set_transformation(trafo); - - - // Next, ask the backend if supports are already calculated. If so, we are gonna cut them too. - // First we need a pointer to the respective SLAPrintObject. The index into objects vector is - // cached so we don't have todo it on each render. We only search for the po if needed: - if (m_c->m_print_object_idx < 0 || (int)m_parent.sla_print()->objects().size() != m_c->m_print_objects_count) { - m_c->m_print_objects_count = m_parent.sla_print()->objects().size(); - m_c->m_print_object_idx = -1; - for (const SLAPrintObject* po : m_parent.sla_print()->objects()) { - ++m_c->m_print_object_idx; - if (po->model_object()->id() == m_c->m_model_object->id()) - break; - } - } - if (m_c->m_print_object_idx >= 0) { - const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_c->m_print_object_idx]; - - if (print_object->is_step_done(slaposSupportTree) && !print_object->get_mesh(slaposSupportTree).empty()) { - // If the supports are already calculated, save the timestamp of the respective step - // so we can later tell they were recalculated. - size_t timestamp = print_object->step_state_with_timestamp(slaposSupportTree).timestamp; - - if (! m_c->m_supports_clipper || (int)timestamp != m_c->m_old_timestamp) { - // The timestamp has changed. - m_c->m_supports_clipper.reset(new MeshClipper); - // The mesh should already have the shared vertices calculated. - m_c->m_supports_clipper->set_mesh(print_object->support_mesh()); - m_c->m_old_timestamp = timestamp; - } - m_c->m_supports_clipper->set_plane(*m_c->m_clipping_plane); - m_c->m_supports_clipper->set_transformation(supports_trafo); - } - else - // The supports are not valid. We better dump the cached data. - m_c->m_supports_clipper.reset(); - } - - // At this point we have the triangulated cuts for both the object and supports - let's render. - if (! m_c->m_object_clipper->get_triangles().empty()) { - ::glPushMatrix(); - ::glColor3f(1.0f, 0.37f, 0.0f); - ::glBegin(GL_TRIANGLES); - for (const Vec3f& point : m_c->m_object_clipper->get_triangles()) - ::glVertex3f(point(0), point(1), point(2)); - ::glEnd(); - ::glPopMatrix(); - } - - if (m_c->m_supports_clipper && ! m_c->m_supports_clipper->get_triangles().empty() && !m_editing_mode) { - // The supports are hidden in the editing mode, so it makes no sense to render the cuts. - ::glPushMatrix(); - ::glColor3f(1.0f, 0.f, 0.37f); - ::glBegin(GL_TRIANGLES); - for (const Vec3f& point : m_c->m_supports_clipper->get_triangles()) - ::glVertex3f(point(0), point(1), point(2)); - ::glEnd(); - ::glPopMatrix(); - } -} - - void GLGizmoSlaSupports::on_render_for_picking() const { const Selection& selection = m_parent.get_selection(); -#if ENABLE_RENDER_PICKING_PASS - m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); -#endif - glsafe(::glEnable(GL_DEPTH_TEST)); render_points(selection, true); } @@ -227,9 +124,10 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix(); + float z_shift = m_c->selection_info()->get_sla_shift(); glsafe(::glPushMatrix()); - glsafe(::glTranslated(0.0, 0.0, m_z_shift)); + glsafe(::glTranslated(0.0, 0.0, z_shift)); glsafe(::glMultMatrixd(instance_matrix.data())); float render_color[4]; @@ -285,7 +183,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) if (m_editing_mode) { // in case the normal is not yet cached, find and cache it if (m_editing_cache[i].normal == Vec3f::Zero()) - m_c->m_mesh_raycaster->get_closest_point(m_editing_cache[i].support_point.pos, &m_editing_cache[i].normal); + m_c->raycaster()->raycaster()->get_closest_point(m_editing_cache[i].support_point.pos, &m_editing_cache[i].normal); Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); @@ -315,14 +213,15 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) } // Now render the drain holes: - if (! m_c->has_drilled_mesh()) { + //if (! m_c->has_drilled_mesh()) { + if (! m_c->hollowed_mesh()->get_hollowed_mesh()) { render_color[0] = 0.7f; render_color[1] = 0.7f; render_color[2] = 0.7f; render_color[3] = 0.7f; glsafe(::glColor4fv(render_color)); - for (const sla::DrainHole& drain_hole : m_c->m_model_object->sla_drain_holes) { - if (is_mesh_point_clipped((drain_hole.pos+m_c->HoleStickOutLength*drain_hole.normal).cast())) + for (const sla::DrainHole& drain_hole : m_c->selection_info()->model_object()->sla_drain_holes) { + if (is_mesh_point_clipped((drain_hole.pos+HoleStickOutLength*drain_hole.normal).cast())) continue; // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. @@ -365,12 +264,17 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) bool GLGizmoSlaSupports::is_mesh_point_clipped(const Vec3d& point) const { - if (m_c->m_clipping_plane_distance == 0.f) + if (m_c->object_clipper()->get_position() == 0.) return false; - Vec3d transformed_point = m_c->m_model_object->instances[m_c->m_active_instance]->get_transformation().get_matrix() * point; - transformed_point(2) += m_z_shift; - return m_c->m_clipping_plane->is_point_clipped(transformed_point); + auto sel_info = m_c->selection_info(); + int active_inst = m_c->selection_info()->get_active_instance(); + const ModelInstance* mi = sel_info->model_object()->instances[active_inst]; + const Transform3d& trafo = mi->get_transformation().get_matrix(); + + Vec3d transformed_point = trafo * point; + transformed_point(2) += sel_info->get_sla_shift(); + return m_c->object_clipper()->get_clipping_plane()->is_point_clipped(transformed_point); } @@ -379,37 +283,37 @@ bool GLGizmoSlaSupports::is_mesh_point_clipped(const Vec3d& point) const // Return false if no intersection was found, true otherwise. bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal) { - if (! m_c->m_mesh_raycaster) + if (! m_c->raycaster()->raycaster()) return false; -#if ENABLE_NON_STATIC_CANVAS_MANAGER const Camera& camera = wxGetApp().plater()->get_camera(); -#else - const Camera& camera = m_parent.get_camera(); -#endif // ENABLE_NON_STATIC_CANVAS_MANAGER const Selection& selection = m_parent.get_selection(); const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); Geometry::Transformation trafo = volume->get_instance_transformation(); - trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift())); + + double clp_dist = m_c->object_clipper()->get_position(); + const ClippingPlane* clp = m_c->object_clipper()->get_clipping_plane(); // The raycaster query Vec3f hit; Vec3f normal; - if (m_c->m_mesh_raycaster->unproject_on_mesh( + if (m_c->raycaster()->raycaster()->unproject_on_mesh( mouse_pos, trafo.get_matrix(), camera, hit, normal, - m_c->m_clipping_plane_distance != 0.f ? m_c->m_clipping_plane.get() : nullptr)) + clp_dist != 0. ? clp : nullptr)) { // Check whether the hit is in a hole bool in_hole = false; // In case the hollowed and drilled mesh is available, we can allow // placing points in holes, because they should never end up // on surface that's been drilled away. - if (! m_c->has_drilled_mesh()) { - for (const sla::DrainHole& hole : m_c->m_model_object->sla_drain_holes) { + if (! m_c->hollowed_mesh()->get_hollowed_mesh()) { + sla::DrainHoles drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; + for (const sla::DrainHole& hole : drain_holes) { if (hole.is_inside(hit)) { in_hole = true; break; @@ -432,6 +336,9 @@ bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pairselection_info()->model_object(); + int active_inst = m_c->selection_info()->get_active_instance(); + if (m_editing_mode) { // left down with shift - show the selection rectangle: @@ -483,8 +390,8 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state(); // First collect positions of all the points in world coordinates. - Geometry::Transformation trafo = m_c->m_model_object->instances[m_c->m_active_instance]->get_transformation(); - trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + Geometry::Transformation trafo = mo->instances[active_inst]->get_transformation(); + trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift())); std::vector points; for (unsigned int i=0; i()); @@ -496,11 +403,9 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous points_inside.push_back(points[idx].cast()); // Only select/deselect points that are actually visible -#if ENABLE_NON_STATIC_CANVAS_MANAGER - for (size_t idx : m_c->m_mesh_raycaster->get_unobscured_idxs(trafo, wxGetApp().plater()->get_camera(), points_inside, m_c->m_clipping_plane.get())) -#else - for (size_t idx : m_c->m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_c->m_clipping_plane.get())) -#endif // ENABLE_NON_STATIC_CANVAS_MANAGER + for (size_t idx : m_c->raycaster()->raycaster()->get_unobscured_idxs( + trafo, wxGetApp().plater()->get_camera(), points_inside, + m_c->object_clipper()->get_clipping_plane())) { if (rectangle_status == GLSelectionRectangle::Deselect) unselect_point(points_idxs[idx]); @@ -577,20 +482,21 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous } if (action == SLAGizmoEventType::MouseWheelUp && control_down) { - m_c->m_clipping_plane_distance = std::min(1.f, m_c->m_clipping_plane_distance + 0.01f); - update_clipping_plane(m_c->m_clipping_plane_was_moved); - m_c->m_clipping_plane_was_moved = true; + double pos = m_c->object_clipper()->get_position(); + pos = std::min(1., pos + 0.01); + m_c->object_clipper()->set_position(pos, true); return true; } if (action == SLAGizmoEventType::MouseWheelDown && control_down) { - m_c->m_clipping_plane_distance = std::max(0.f, m_c->m_clipping_plane_distance - 0.01f); - update_clipping_plane(true); + double pos = m_c->object_clipper()->get_position(); + pos = std::max(0., pos - 0.01); + m_c->object_clipper()->set_position(pos, true); return true; } if (action == SLAGizmoEventType::ResetClippingPlane) { - update_clipping_plane(); + m_c->object_clipper()->set_position(-1., false); return true; } @@ -634,11 +540,12 @@ void GLGizmoSlaSupports::on_update(const UpdateData& data) std::vector GLGizmoSlaSupports::get_config_options(const std::vector& keys) const { std::vector out; + const ModelObject* mo = m_c->selection_info()->model_object(); - if (!m_c->m_model_object) + if (! mo) return out; - const DynamicPrintConfig& object_cfg = m_c->m_model_object->config; + const DynamicPrintConfig& object_cfg = mo->config; const DynamicPrintConfig& print_cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; std::unique_ptr default_cfg = nullptr; @@ -659,14 +566,6 @@ std::vector GLGizmoSlaSupports::get_config_options(const st } -ClippingPlane GLGizmoSlaSupports::get_sla_clipping_plane() const -{ - if (!m_c->m_model_object || m_state == Off || m_c->m_clipping_plane_distance == 0.f) - return ClippingPlane::ClipsNothing(); - else - return ClippingPlane(-m_c->m_clipping_plane->get_normal(), m_c->m_clipping_plane->get_data()[3]); -} - /* void GLGizmoSlaSupports::find_intersecting_facets(const igl::AABB* aabb, const Vec3f& normal, double offset, std::vector& idxs) const @@ -714,7 +613,9 @@ void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_l static float last_y = 0.0f; static float last_h = 0.0f; - if (! m_c->m_model_object) + ModelObject* mo = m_c->selection_info()->model_object(); + + if (! mo) return; bool first_run = true; // This is a hack to redraw the button when all points are removed, @@ -851,15 +752,15 @@ RENDER_AGAIN: m_density_stash = density; } if (slider_edited) { - m_c->m_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; - m_c->m_model_object->config.opt("support_points_density_relative", true)->value = (int)density; + mo->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; + mo->config.opt("support_points_density_relative", true)->value = (int)density; } if (slider_released) { - m_c->m_model_object->config.opt("support_points_minimal_distance", true)->value = m_minimal_point_distance_stash; - m_c->m_model_object->config.opt("support_points_density_relative", true)->value = (int)m_density_stash; + mo->config.opt("support_points_minimal_distance", true)->value = m_minimal_point_distance_stash; + mo->config.opt("support_points_density_relative", true)->value = (int)m_density_stash; Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Support parameter change"))); - m_c->m_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; - m_c->m_model_object->config.opt("support_points_density_relative", true)->value = (int)density; + mo->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; + mo->config.opt("support_points_density_relative", true)->value = (int)density; wxGetApp().obj_list()->update_and_show_object_settings_item(); } @@ -886,7 +787,7 @@ RENDER_AGAIN: // Following is rendered in both editing and non-editing mode: ImGui::Separator(); - if (m_c->m_clipping_plane_distance == 0.f) + if (m_c->object_clipper()->get_position() == 0.f) { ImGui::AlignTextToFramePadding(); m_imgui->text(m_desc.at("clipping_of_view")); @@ -894,17 +795,16 @@ RENDER_AGAIN: else { if (m_imgui->button(m_desc.at("reset_direction"))) { wxGetApp().CallAfter([this](){ - update_clipping_plane(); + m_c->object_clipper()->set_position(-1., false); }); } } ImGui::SameLine(clipping_slider_left); ImGui::PushItemWidth(window_width - clipping_slider_left); - if (ImGui::SliderFloat(" ", &m_c->m_clipping_plane_distance, 0.f, 1.f, "%.2f")) { - update_clipping_plane(m_c->m_clipping_plane_was_moved); - m_c->m_clipping_plane_was_moved = true; - } + float clp_dist = m_c->object_clipper()->get_position(); + if (ImGui::SliderFloat(" ", &clp_dist, 0.f, 1.f, "%.2f")) + m_c->object_clipper()->set_position(clp_dist, true); if (m_imgui->button("?")) { @@ -969,18 +869,22 @@ std::string GLGizmoSlaSupports::on_get_name() const } +CommonGizmosDataID GLGizmoSlaSupports::on_get_requirements() const +{ + return CommonGizmosDataID( + int(CommonGizmosDataID::SelectionInfo) + | int(CommonGizmosDataID::InstancesHider) + | int(CommonGizmosDataID::Raycaster) + | int(CommonGizmosDataID::HollowedMesh) + | int(CommonGizmosDataID::ObjectClipper) + | int(CommonGizmosDataID::SupportsClipper)); +} + + void GLGizmoSlaSupports::on_set_state() { - // m_c->m_model_object pointer can be invalid (for instance because of undo/redo action), - // we should recover it from the object id - m_c->m_model_object = nullptr; - for (const auto mo : wxGetApp().model().objects) { - if (mo->id() == m_c->m_model_object_id) { - m_c->m_model_object = mo; - break; - } - } + const ModelObject* mo = m_c->selection_info()->model_object(); if (m_state == m_old_state) return; @@ -988,28 +892,16 @@ void GLGizmoSlaSupports::on_set_state() if (m_state == On && m_old_state != On) { // the gizmo was just turned on Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on"))); - m_c->unstash_clipping_plane(); - update_clipping_plane(m_c->m_clipping_plane_was_moved); - - m_c->build_AABB_if_needed(); - - // we'll now reload support points: - if (m_c->m_model_object) + if (mo) reload_cache(); - m_parent.toggle_model_objects_visibility(false); - if (m_c->m_model_object) { - m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); - m_parent.toggle_sla_auxiliaries_visibility(! m_editing_mode, m_c->m_model_object, m_c->m_active_instance); - } - // Set default head diameter from config. const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; m_new_point_head_diameter = static_cast(cfg.option("support_head_front_diameter"))->value; } if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off - bool will_ask = m_c->m_model_object && m_editing_mode && unsaved_changes(); + bool will_ask = mo && m_editing_mode && unsaved_changes(); if (will_ask) { wxGetApp().CallAfter([this]() { // Following is called through CallAfter, because otherwise there was a problem @@ -1028,16 +920,8 @@ void GLGizmoSlaSupports::on_set_state() // we are actually shutting down disable_editing_mode(); // so it is not active next time the gizmo opens Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned off"))); - m_parent.toggle_model_objects_visibility(true); m_normal_cache.clear(); - m_c->stash_clipping_plane(); - m_c->m_clipping_plane_distance = 0.f; - update_clipping_plane(true); - // Release clippers and the AABB raycaster. - m_its = nullptr; - m_c->m_object_clipper.reset(); - m_c->m_supports_clipper.reset(); - //m_c->m_mesh_raycaster.reset(); + } } m_old_state = m_state; @@ -1077,10 +961,7 @@ void GLGizmoSlaSupports::on_stop_dragging() void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar) { - ar(m_c->m_clipping_plane_distance, - *m_c->m_clipping_plane, - m_c->m_model_object_id, - m_new_point_head_diameter, + ar(m_new_point_head_diameter, m_normal_cache, m_editing_cache, m_selection_empty @@ -1091,10 +972,7 @@ void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar) void GLGizmoSlaSupports::on_save(cereal::BinaryOutputArchive& ar) const { - ar(m_c->m_clipping_plane_distance, - *m_c->m_clipping_plane, - m_c->m_model_object_id, - m_new_point_head_diameter, + ar(m_new_point_head_diameter, m_normal_cache, m_editing_cache, m_selection_empty @@ -1171,9 +1049,10 @@ void GLGizmoSlaSupports::editing_mode_apply_changes() for (const CacheEntry& ce : m_editing_cache) m_normal_cache.push_back(ce.support_point); - m_c->m_model_object->sla_points_status = sla::PointsStatus::UserModified; - m_c->m_model_object->sla_support_points.clear(); - m_c->m_model_object->sla_support_points = m_normal_cache; + ModelObject* mo = m_c->selection_info()->model_object(); + mo->sla_points_status = sla::PointsStatus::UserModified; + mo->sla_support_points.clear(); + mo->sla_support_points = m_normal_cache; reslice_SLA_supports(); } @@ -1183,23 +1062,25 @@ void GLGizmoSlaSupports::editing_mode_apply_changes() void GLGizmoSlaSupports::reload_cache() { + const ModelObject* mo = m_c->selection_info()->model_object(); m_normal_cache.clear(); - if (m_c->m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated || m_c->m_model_object->sla_points_status == sla::PointsStatus::Generating) + if (mo->sla_points_status == sla::PointsStatus::AutoGenerated || mo->sla_points_status == sla::PointsStatus::Generating) get_data_from_backend(); else - for (const sla::SupportPoint& point : m_c->m_model_object->sla_support_points) + for (const sla::SupportPoint& point : mo->sla_support_points) m_normal_cache.emplace_back(point); } bool GLGizmoSlaSupports::has_backend_supports() const { - if (! m_c->m_model_object) + const ModelObject* mo = m_c->selection_info()->model_object(); + if (! mo) return false; // find SlaPrintObject with this ID for (const SLAPrintObject* po : m_parent.sla_print()->objects()) { - if (po->model_object()->id() == m_c->m_model_object->id()) + if (po->model_object()->id() == mo->id()) return po->is_step_done(slaposSupportPoints); } return false; @@ -1207,24 +1088,28 @@ bool GLGizmoSlaSupports::has_backend_supports() const void GLGizmoSlaSupports::reslice_SLA_supports(bool postpone_error_messages) const { - wxGetApp().CallAfter([this, postpone_error_messages]() { wxGetApp().plater()->reslice_SLA_supports(*m_c->m_model_object, postpone_error_messages); }); + wxGetApp().CallAfter([this, postpone_error_messages]() { + wxGetApp().plater()->reslice_SLA_supports( + *m_c->selection_info()->model_object(), postpone_error_messages); + }); } void GLGizmoSlaSupports::get_data_from_backend() { if (! has_backend_supports()) return; + ModelObject* mo = m_c->selection_info()->model_object(); // find the respective SLAPrintObject, we need a pointer to it for (const SLAPrintObject* po : m_parent.sla_print()->objects()) { - if (po->model_object()->id() == m_c->m_model_object->id()) { + if (po->model_object()->id() == mo->id()) { m_normal_cache.clear(); const std::vector& points = po->get_support_points(); auto mat = po->trafo().inverse().cast(); for (unsigned int i=0; im_model_object->sla_points_status = sla::PointsStatus::AutoGenerated; + mo->sla_points_status = sla::PointsStatus::AutoGenerated; break; } } @@ -1241,10 +1126,12 @@ void GLGizmoSlaSupports::auto_generate() _(L("Are you sure you want to do it?")) + "\n", _(L("Warning")), wxICON_WARNING | wxYES | wxNO); - if (m_c->m_model_object->sla_points_status != sla::PointsStatus::UserModified || m_normal_cache.empty() || dlg.ShowModal() == wxID_YES) { + ModelObject* mo = m_c->selection_info()->model_object(); + + if (mo->sla_points_status != sla::PointsStatus::UserModified || m_normal_cache.empty() || dlg.ShowModal() == wxID_YES) { Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Autogenerate support points"))); wxGetApp().CallAfter([this]() { reslice_SLA_supports(); }); - m_c->m_model_object->sla_points_status = sla::PointsStatus::Generating; + mo->sla_points_status = sla::PointsStatus::Generating; } } @@ -1259,7 +1146,7 @@ void GLGizmoSlaSupports::switch_to_editing_mode() m_editing_cache.emplace_back(sp); select_point(NoPoints); - m_parent.toggle_sla_auxiliaries_visibility(false, m_c->m_model_object, m_c->m_active_instance); + m_c->instances_hider()->show_supports(false); m_parent.set_as_dirty(); } @@ -1269,7 +1156,7 @@ void GLGizmoSlaSupports::disable_editing_mode() if (m_editing_mode) { m_editing_mode = false; wxGetApp().plater()->leave_gizmos_stack(); - m_parent.toggle_sla_auxiliaries_visibility(true, m_c->m_model_object, m_c->m_active_instance); + m_c->instances_hider()->show_supports(true); m_parent.set_as_dirty(); } } @@ -1288,26 +1175,6 @@ bool GLGizmoSlaSupports::unsaved_changes() const return false; } - -void GLGizmoSlaSupports::update_clipping_plane(bool keep_normal) const -{ - if (! m_c->m_model_object) - return; - -#if ENABLE_NON_STATIC_CANVAS_MANAGER - Vec3d normal = (keep_normal && m_c->m_clipping_plane->get_normal() != Vec3d::Zero() ? - m_c->m_clipping_plane->get_normal() : -wxGetApp().plater()->get_camera().get_dir_forward()); -#else - Vec3d normal = (keep_normal && m_c->m_clipping_plane->get_normal() != Vec3d::Zero() ? - m_c->m_clipping_plane->get_normal() : -m_parent.get_camera().get_dir_forward()); -#endif // ENABLE_NON_STATIC_CANVAS_MANAGER - - const Vec3d& center = m_c->m_model_object->instances[m_c->m_active_instance]->get_offset() + Vec3d(0., 0., m_z_shift); - float dist = normal.dot(center); - *m_c->m_clipping_plane = ClippingPlane(normal, (dist - (-m_c->m_active_instance_bb_radius) - m_c->m_clipping_plane_distance * 2*m_c->m_active_instance_bb_radius)); - m_parent.set_as_dirty(); -} - SlaGizmoHelpDialog::SlaGizmoHelpDialog() : wxDialog(nullptr, wxID_ANY, _(L("SLA gizmo keyboard shortcuts")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index bd48ecd65..917d22a98 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -13,34 +13,17 @@ namespace Slic3r { namespace GUI { -class ClippingPlane; -class MeshClipper; -class MeshRaycaster; -class CommonGizmosData; enum class SLAGizmoEventType : unsigned char; class GLGizmoSlaSupports : public GLGizmoBase { private: - //ModelObject* m_model_object = nullptr; - //ObjectID m_model_object_id = 0; - //int m_active_instance = -1; - //float m_active_instance_bb_radius; // to cache the bb - mutable double m_z_shift = 0.f; + bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal); const float RenderPointScale = 1.f; GLUquadricObj* m_quadric; - typedef Eigen::Map> MapMatrixXfUnaligned; - typedef Eigen::Map> MapMatrixXiUnaligned; - - //std::unique_ptr m_mesh_raycaster; - //const TriangleMesh* m_mesh; - const indexed_triangle_set* m_its; - //mutable int m_old_timestamp = -1; - //mutable int m_print_object_idx = -1; - //mutable int m_print_objects_count = -1; class CacheEntry { public: @@ -75,14 +58,12 @@ public: void set_sla_support_data(ModelObject* model_object, const Selection& selection); bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); void delete_selected_points(bool force = false); - ClippingPlane get_sla_clipping_plane() const; + //ClippingPlane get_sla_clipping_plane() const; bool is_in_editing_mode() const { return m_editing_mode; } bool is_selection_rectangle_dragging() const { return m_selection_rectangle.is_dragging(); } bool has_backend_supports() const; void reslice_SLA_supports(bool postpone_error_messages = false) const; - void update_clipping_plane(bool keep_normal = false) const; - void set_common_data_ptr(CommonGizmosData* ptr) { m_c = ptr; } private: bool on_init() override; @@ -90,9 +71,7 @@ private: void on_render() const override; void on_render_for_picking() const override; - //void render_selection_rectangle() const; void render_points(const Selection& selection, bool picking = false) const; - void render_clipping_plane(const Selection& selection) const; bool unsaved_changes() const; bool m_lock_unique_islands = false; @@ -104,8 +83,7 @@ private: float m_density_stash = 0.f; // and again mutable std::vector m_editing_cache; // a support point and whether it is currently selected std::vector m_normal_cache; // to restore after discarding changes or undo/redo - - //std::unique_ptr m_clipping_plane; + const ModelObject* m_old_mo = nullptr; // This map holds all translated description texts, so they can be easily referenced during layout calculations // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect. @@ -117,11 +95,6 @@ private: bool m_selection_empty = true; EState m_old_state = Off; // to be able to see that the gizmo has just been closed (see on_set_state) - CommonGizmosData* m_c = nullptr; - - //mutable std::unique_ptr m_object_clipper; - //mutable std::unique_ptr m_supports_clipper; - std::vector get_config_options(const std::vector& keys) const; bool is_mesh_point_clipped(const Vec3d& point) const; bool is_point_in_hole(const Vec3f& pt) const; @@ -142,7 +115,6 @@ private: void auto_generate(); void switch_to_editing_mode(); void disable_editing_mode(); - void reset_clipping_plane_normal() const; protected: void on_set_state() override; @@ -159,6 +131,7 @@ protected: std::string on_get_name() const override; bool on_is_activable() const override; bool on_is_selectable() const override; + virtual CommonGizmosDataID on_get_requirements() const override; void on_load(cereal::BinaryInputArchive& ar) override; void on_save(cereal::BinaryOutputArchive& ar) const override; }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmos.hpp b/src/slic3r/GUI/Gizmos/GLGizmos.hpp index 9f97c42b4..e8e73959c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmos.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmos.hpp @@ -31,6 +31,7 @@ enum class SLAGizmoEventType : unsigned char { #include "slic3r/GUI/Gizmos/GLGizmoRotate.hpp" #include "slic3r/GUI/Gizmos/GLGizmoFlatten.hpp" #include "slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp" #include "slic3r/GUI/Gizmos/GLGizmoCut.hpp" #include "slic3r/GUI/Gizmos/GLGizmoHollow.hpp" diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp new file mode 100644 index 000000000..32a6de42b --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp @@ -0,0 +1,473 @@ +#include "GLGizmosCommon.hpp" + +#include + +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "libslic3r/SLAPrint.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Camera.hpp" + +#include + +namespace Slic3r { +namespace GUI { + +using namespace CommonGizmosDataObjects; + +CommonGizmosDataPool::CommonGizmosDataPool(GLCanvas3D* canvas) + : m_canvas(canvas) +{ + using c = CommonGizmosDataID; + m_data[c::SelectionInfo].reset( new SelectionInfo(this)); + m_data[c::InstancesHider].reset( new InstancesHider(this)); + m_data[c::HollowedMesh].reset( new HollowedMesh(this)); + m_data[c::Raycaster].reset( new Raycaster(this)); + m_data[c::ObjectClipper].reset( new ObjectClipper(this)); + m_data[c::SupportsClipper].reset( new SupportsClipper(this)); + +} + +void CommonGizmosDataPool::update(CommonGizmosDataID required) +{ + assert(check_dependencies(required)); + for (auto& [id, data] : m_data) { + if (int(required) & int(CommonGizmosDataID(id))) + data->update(); + else + if (data->is_valid()) + data->release(); + + } +} + + +SelectionInfo* CommonGizmosDataPool::selection_info() const +{ + SelectionInfo* sel_info = dynamic_cast(m_data.at(CommonGizmosDataID::SelectionInfo).get()); + assert(sel_info); + return sel_info->is_valid() ? sel_info : nullptr; +} + + +InstancesHider* CommonGizmosDataPool::instances_hider() const +{ + InstancesHider* inst_hider = dynamic_cast(m_data.at(CommonGizmosDataID::InstancesHider).get()); + assert(inst_hider); + return inst_hider->is_valid() ? inst_hider : nullptr; +} + +HollowedMesh* CommonGizmosDataPool::hollowed_mesh() const +{ + HollowedMesh* hol_mesh = dynamic_cast(m_data.at(CommonGizmosDataID::HollowedMesh).get()); + assert(hol_mesh); + return hol_mesh->is_valid() ? hol_mesh : nullptr; +} + +Raycaster* CommonGizmosDataPool::raycaster() const +{ + Raycaster* rc = dynamic_cast(m_data.at(CommonGizmosDataID::Raycaster).get()); + assert(rc); + return rc->is_valid() ? rc : nullptr; +} + +ObjectClipper* CommonGizmosDataPool::object_clipper() const +{ + ObjectClipper* oc = dynamic_cast(m_data.at(CommonGizmosDataID::ObjectClipper).get()); + // ObjectClipper is used from outside the gizmos to report current clipping plane. + // This function can be called when oc is nullptr. + return (oc && oc->is_valid()) ? oc : nullptr; +} + +SupportsClipper* CommonGizmosDataPool::supports_clipper() const +{ + SupportsClipper* sc = dynamic_cast(m_data.at(CommonGizmosDataID::SupportsClipper).get()); + assert(sc); + return sc->is_valid() ? sc : nullptr; +} + +#ifndef NDEBUG +// Check the required resources one by one and return true if all +// dependencies are met. +bool CommonGizmosDataPool::check_dependencies(CommonGizmosDataID required) const +{ + // This should iterate over currently required data. Each of them should + // be asked about its dependencies and it must check that all dependencies + // are also in required and before the current one. + for (auto& [id, data] : m_data) { + // in case we don't use this, the deps are irrelevant + if (! (int(required) & int(CommonGizmosDataID(id)))) + continue; + + + CommonGizmosDataID deps = data->get_dependencies(); + assert(int(deps) == (int(deps) & int(required))); + } + + + return true; +} +#endif // NDEBUG + + + + +void SelectionInfo::on_update() +{ + const Selection& selection = get_pool()->get_canvas()->get_selection(); + if (selection.is_single_full_instance()) { + m_model_object = selection.get_model()->objects[selection.get_object_idx()]; + m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); + } + else + m_model_object = nullptr; +} + +void SelectionInfo::on_release() +{ + m_model_object = nullptr; +} + +int SelectionInfo::get_active_instance() const +{ + const Selection& selection = get_pool()->get_canvas()->get_selection(); + return selection.get_instance_idx(); +} + + + + + +void InstancesHider::on_update() +{ + const ModelObject* mo = get_pool()->selection_info()->model_object(); + int active_inst = get_pool()->selection_info()->get_active_instance(); + GLCanvas3D* canvas = get_pool()->get_canvas(); + + if (mo && active_inst != -1) { + canvas->toggle_model_objects_visibility(false); + canvas->toggle_model_objects_visibility(true, mo, active_inst); + canvas->toggle_sla_auxiliaries_visibility(m_show_supports, mo, active_inst); + } + else + canvas->toggle_model_objects_visibility(true); +} + +void InstancesHider::on_release() +{ + get_pool()->get_canvas()->toggle_model_objects_visibility(true); +} + +void InstancesHider::show_supports(bool show) { + if (m_show_supports != show) { + m_show_supports = show; + on_update(); + } +} + + + +void HollowedMesh::on_update() +{ + const ModelObject* mo = get_pool()->selection_info()->model_object(); + if (! mo) + return; + + const GLCanvas3D* canvas = get_pool()->get_canvas(); + const PrintObjects& print_objects = canvas->sla_print()->objects(); + const SLAPrintObject* print_object = m_print_object_idx != -1 + ? print_objects[m_print_object_idx] + : nullptr; + + // Find the respective SLAPrintObject. + if (m_print_object_idx < 0 || m_print_objects_count != int(print_objects.size())) { + m_print_objects_count = print_objects.size(); + m_print_object_idx = -1; + for (const SLAPrintObject* po : print_objects) { + ++m_print_object_idx; + if (po->model_object()->id() == mo->id()) { + print_object = po; + break; + } + } + } + + // If there is a valid SLAPrintObject, check state of Hollowing step. + if (print_object) { + if (print_object->is_step_done(slaposDrillHoles) && print_object->has_mesh(slaposDrillHoles)) { + size_t timestamp = print_object->step_state_with_timestamp(slaposDrillHoles).timestamp; + if (timestamp > m_old_hollowing_timestamp) { + const TriangleMesh& backend_mesh = print_object->get_mesh_to_print(); + if (! backend_mesh.empty()) { + m_hollowed_mesh_transformed.reset(new TriangleMesh(backend_mesh)); + Transform3d trafo_inv = canvas->sla_print()->sla_trafo(*mo).inverse(); + m_hollowed_mesh_transformed->transform(trafo_inv); + m_old_hollowing_timestamp = timestamp; + } + else + m_hollowed_mesh_transformed.reset(nullptr); + } + } + else + m_hollowed_mesh_transformed.reset(nullptr); + } +} + + +void HollowedMesh::on_release() +{ + m_hollowed_mesh_transformed.reset(); + m_old_hollowing_timestamp = 0; + m_print_object_idx = -1; +} + + +const TriangleMesh* HollowedMesh::get_hollowed_mesh() const +{ + return m_hollowed_mesh_transformed.get(); +} + + + + + +void Raycaster::on_update() +{ + wxBusyCursor wait; + const ModelObject* mo = get_pool()->selection_info()->model_object(); + + if (! mo) + return; + + std::vector meshes; + const std::vector& mvs = mo->volumes; + if (mvs.size() == 1) { + assert(mvs.front()->is_model_part()); + const HollowedMesh* hollowed_mesh_tracker = get_pool()->hollowed_mesh(); + if (hollowed_mesh_tracker && hollowed_mesh_tracker->get_hollowed_mesh()) + meshes.push_back(hollowed_mesh_tracker->get_hollowed_mesh()); + } + if (meshes.empty()) { + for (const ModelVolume* mv : mvs) { + if (mv->is_model_part()) + meshes.push_back(&mv->mesh()); + } + } + + if (meshes != m_old_meshes) { + m_raycasters.clear(); + for (const TriangleMesh* mesh : meshes) + m_raycasters.emplace_back(new MeshRaycaster(*mesh)); + m_old_meshes = meshes; + } +} + +void Raycaster::on_release() +{ + m_raycasters.clear(); + m_old_meshes.clear(); +} + +std::vector Raycaster::raycasters() const +{ + std::vector mrcs; + for (const auto& raycaster_unique_ptr : m_raycasters) + mrcs.push_back(raycaster_unique_ptr.get()); + return mrcs; +} + + + + + +void ObjectClipper::on_update() +{ + const ModelObject* mo = get_pool()->selection_info()->model_object(); + if (! mo) + return; + + // which mesh should be cut? + std::vector meshes; + bool has_hollowed = get_pool()->hollowed_mesh() && get_pool()->hollowed_mesh()->get_hollowed_mesh(); + if (has_hollowed) + meshes.push_back(get_pool()->hollowed_mesh()->get_hollowed_mesh()); + + if (meshes.empty()) { + for (const ModelVolume* mv : mo->volumes) + if (mv->is_model_part()) + meshes.push_back(&mv->mesh()); + } + + if (meshes != m_old_meshes) { + m_clippers.clear(); + for (const TriangleMesh* mesh : meshes) { + m_clippers.emplace_back(new MeshClipper); + m_clippers.back()->set_mesh(*mesh); + } + m_old_meshes = meshes; + m_active_inst_bb_radius = + mo->instance_bounding_box(get_pool()->selection_info()->get_active_instance()).radius(); + //if (has_hollowed && m_clp_ratio != 0.) + // m_clp_ratio = 0.25; + } +} + + +void ObjectClipper::on_release() +{ + m_clippers.clear(); + m_old_meshes.clear(); + m_clp.reset(); + m_clp_ratio = 0.; + +} + +void ObjectClipper::render_cut() const +{ + if (m_clp_ratio == 0.) + return; + const SelectionInfo* sel_info = get_pool()->selection_info(); + const ModelObject* mo = sel_info->model_object(); + Geometry::Transformation inst_trafo = mo->instances[sel_info->get_active_instance()]->get_transformation(); + + size_t clipper_id = 0; + for (const ModelVolume* mv : mo->volumes) { + if (! mv->is_model_part()) + continue; + + Geometry::Transformation vol_trafo = mv->get_transformation(); + Geometry::Transformation trafo = inst_trafo * vol_trafo; + trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., sel_info->get_sla_shift())); + + auto& clipper = m_clippers[clipper_id]; + clipper->set_plane(*m_clp); + clipper->set_transformation(trafo); + + if (! clipper->get_triangles().empty()) { + ::glPushMatrix(); + ::glColor3f(1.0f, 0.37f, 0.0f); + ::glBegin(GL_TRIANGLES); + for (const Vec3f& point : clipper->get_triangles()) + ::glVertex3f(point(0), point(1), point(2)); + ::glEnd(); + ::glPopMatrix(); + } + ++clipper_id; + } +} + + +void ObjectClipper::set_position(double pos, bool keep_normal) +{ + const ModelObject* mo = get_pool()->selection_info()->model_object(); + int active_inst = get_pool()->selection_info()->get_active_instance(); + double z_shift = get_pool()->selection_info()->get_sla_shift(); + + Vec3d normal = (keep_normal && m_clp) ? m_clp->get_normal() : -wxGetApp().plater()->get_camera().get_dir_forward(); + const Vec3d& center = mo->instances[active_inst]->get_offset() + Vec3d(0., 0., z_shift); + float dist = normal.dot(center); + + if (pos < 0.) + pos = m_clp_ratio; + + m_clp_ratio = pos; + m_clp.reset(new ClippingPlane(normal, (dist - (-m_active_inst_bb_radius) - m_clp_ratio * 2*m_active_inst_bb_radius))); + get_pool()->get_canvas()->set_as_dirty(); +} + + + +void SupportsClipper::on_update() +{ + const ModelObject* mo = get_pool()->selection_info()->model_object(); + if (! mo) + return; + + const GLCanvas3D* canvas = get_pool()->get_canvas(); + const PrintObjects& print_objects = canvas->sla_print()->objects(); + const SLAPrintObject* print_object = m_print_object_idx != -1 + ? print_objects[m_print_object_idx] + : nullptr; + + // Find the respective SLAPrintObject. + if (m_print_object_idx < 0 || m_print_objects_count != int(print_objects.size())) { + m_print_objects_count = print_objects.size(); + m_print_object_idx = -1; + for (const SLAPrintObject* po : print_objects) { + ++m_print_object_idx; + if (po->model_object()->id() == mo->id()) { + print_object = po; + break; + } + } + } + + if (print_object + && print_object->is_step_done(slaposSupportTree) + && ! print_object->support_mesh().empty()) + { + // If the supports are already calculated, save the timestamp of the respective step + // so we can later tell they were recalculated. + size_t timestamp = print_object->step_state_with_timestamp(slaposSupportTree).timestamp; + if (! m_clipper || timestamp != m_old_timestamp) { + // The timestamp has changed. + m_clipper.reset(new MeshClipper); + // The mesh should already have the shared vertices calculated. + m_clipper->set_mesh(print_object->support_mesh()); + m_old_timestamp = timestamp; + } + } + else + // The supports are not valid. We better dump the cached data. + m_clipper.reset(); +} + + +void SupportsClipper::on_release() +{ + m_clipper.reset(); + m_old_timestamp = 0; + m_print_object_idx = -1; +} + +void SupportsClipper::render_cut() const +{ + const CommonGizmosDataObjects::ObjectClipper* ocl = get_pool()->object_clipper(); + if (ocl->get_position() == 0. + || ! get_pool()->instances_hider()->are_supports_shown() + || ! m_clipper) + return; + + const SelectionInfo* sel_info = get_pool()->selection_info(); + const ModelObject* mo = sel_info->model_object(); + Geometry::Transformation inst_trafo = mo->instances[sel_info->get_active_instance()]->get_transformation(); + //Geometry::Transformation vol_trafo = mo->volumes.front()->get_transformation(); + Geometry::Transformation trafo = inst_trafo;// * vol_trafo; + trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., sel_info->get_sla_shift())); + + + // Get transformation of supports + Geometry::Transformation supports_trafo = trafo; + supports_trafo.set_offset(Vec3d(trafo.get_offset()(0), trafo.get_offset()(1), sel_info->get_sla_shift())); + supports_trafo.set_rotation(Vec3d(0., 0., trafo.get_rotation()(2))); + // I don't know why, but following seems to be correct. + supports_trafo.set_mirror(Vec3d(trafo.get_mirror()(0) * trafo.get_mirror()(1) * trafo.get_mirror()(2), + 1, + 1.)); + + m_clipper->set_plane(*ocl->get_clipping_plane()); + m_clipper->set_transformation(supports_trafo); + + if (! m_clipper->get_triangles().empty()) { + ::glPushMatrix(); + ::glColor3f(1.0f, 0.f, 0.37f); + ::glBegin(GL_TRIANGLES); + for (const Vec3f& point : m_clipper->get_triangles()) + ::glVertex3f(point(0), point(1), point(2)); + ::glEnd(); + ::glPopMatrix(); + } +} + + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp new file mode 100644 index 000000000..31c473bac --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp @@ -0,0 +1,309 @@ +#ifndef slic3r_GUI_GLGizmosCommon_hpp_ +#define slic3r_GUI_GLGizmosCommon_hpp_ + +#include +#include + +#include "slic3r/GUI/MeshUtils.hpp" + +namespace Slic3r { + +class ModelObject; + + +namespace GUI { + +class GLCanvas3D; + +static constexpr float HoleStickOutLength = 1.f; + +enum class SLAGizmoEventType : unsigned char { + LeftDown = 1, + LeftUp, + RightDown, + RightUp, + Dragging, + Delete, + SelectAll, + ShiftUp, + AltUp, + ApplyChanges, + DiscardChanges, + AutomaticGeneration, + ManualEditing, + MouseWheelUp, + MouseWheelDown, + ResetClippingPlane +}; + + + +class CommonGizmosDataBase; +namespace CommonGizmosDataObjects { + class SelectionInfo; + class InstancesHider; + class HollowedMesh; + class Raycaster; + class ObjectClipper; + class SupportsClipper; +} + +// Some of the gizmos use the same data that need to be updated ocassionally. +// It is also desirable that the data are not recalculated when the gizmos +// are just switched, but on the other hand, they should be released when +// they are not in use by any gizmo anymore. + +// Enumeration of various data types that the data pool can contain. +// Each gizmo can tell which of the data it wants to use through +// on_get_requirements() method. +enum class CommonGizmosDataID { + None = 0, + SelectionInfo = 1 << 0, + InstancesHider = 1 << 1, + HollowedMesh = 1 << 2, + Raycaster = 1 << 3, + ObjectClipper = 1 << 4, + SupportsClipper = 1 << 5, + +}; + + +// Following class holds pointers to the common data objects and triggers +// their updating/releasing. There is just one object of this type (managed +// by GLGizmoManager, the gizmos keep a pointer to it. +class CommonGizmosDataPool { +public: + CommonGizmosDataPool(GLCanvas3D* canvas); + + // Update all resources and release what is not used. + // Accepts a bitmask of currently required resources. + void update(CommonGizmosDataID required); + + // Getters for the data that need to be accessed from the gizmos directly. + CommonGizmosDataObjects::SelectionInfo* selection_info() const; + CommonGizmosDataObjects::InstancesHider* instances_hider() const; + CommonGizmosDataObjects::HollowedMesh* hollowed_mesh() const; + CommonGizmosDataObjects::Raycaster* raycaster() const; + CommonGizmosDataObjects::ObjectClipper* object_clipper() const; + CommonGizmosDataObjects::SupportsClipper* supports_clipper() const; + + + GLCanvas3D* get_canvas() const { return m_canvas; } + +private: + std::map> m_data; + GLCanvas3D* m_canvas; + +#ifndef NDEBUG + bool check_dependencies(CommonGizmosDataID required) const; +#endif +}; + + + + + +// Base class for a wrapper object managing a single resource. +// Each of the enum values above (safe None) will have an object of this kind. +class CommonGizmosDataBase { +public: + // Pass a backpointer to the pool, so the individual + // objects can communicate with one another. + explicit CommonGizmosDataBase(CommonGizmosDataPool* cgdp) + : m_common{cgdp} {} + virtual ~CommonGizmosDataBase() {} + + // Update the resource. + void update() { on_update(); m_is_valid = true; } + + // Release any data that are stored internally. + void release() { on_release(); m_is_valid = false; } + + // Returns whether the resource is currently maintained. + bool is_valid() const { return m_is_valid; } + +#ifndef NDEBUG + // Return a bitmask of all resources that this one relies on. + // The dependent resource must have higher ID than the one + // it depends on. + virtual CommonGizmosDataID get_dependencies() const { return CommonGizmosDataID::None; } +#endif // NDEBUG + +protected: + virtual void on_release() = 0; + virtual void on_update() = 0; + CommonGizmosDataPool* get_pool() const { return m_common; } + + +private: + bool m_is_valid = false; + CommonGizmosDataPool* m_common = nullptr; +}; + + + +// The specializations of the CommonGizmosDataBase class live in this +// namespace to avoid clashes in GUI namespace. +namespace CommonGizmosDataObjects +{ + +class SelectionInfo : public CommonGizmosDataBase +{ +public: + explicit SelectionInfo(CommonGizmosDataPool* cgdp) + : CommonGizmosDataBase(cgdp) {} + + ModelObject* model_object() const { return m_model_object; } + int get_active_instance() const; + float get_sla_shift() const { return m_z_shift; } + +protected: + void on_update() override; + void on_release() override; + +private: + ModelObject* m_model_object = nullptr; + int m_active_inst = -1; + float m_z_shift = 0.f; +}; + + + +class InstancesHider : public CommonGizmosDataBase +{ +public: + explicit InstancesHider(CommonGizmosDataPool* cgdp) + : CommonGizmosDataBase(cgdp) {} +#ifndef NDEBUG + CommonGizmosDataID get_dependencies() const override { return CommonGizmosDataID::SelectionInfo; } +#endif // NDEBUG + + void show_supports(bool show); + bool are_supports_shown() const { return m_show_supports; } + +protected: + void on_update() override; + void on_release() override; + +private: + bool m_show_supports = false; +}; + + + +class HollowedMesh : public CommonGizmosDataBase +{ +public: + explicit HollowedMesh(CommonGizmosDataPool* cgdp) + : CommonGizmosDataBase(cgdp) {} +#ifndef NDEBUG + CommonGizmosDataID get_dependencies() const override { return CommonGizmosDataID::SelectionInfo; } +#endif // NDEBUG + + const TriangleMesh* get_hollowed_mesh() const; + +protected: + void on_update() override; + void on_release() override; + +private: + std::unique_ptr m_hollowed_mesh_transformed; + size_t m_old_hollowing_timestamp = 0; + int m_print_object_idx = -1; + int m_print_objects_count = 0; +}; + + + +class Raycaster : public CommonGizmosDataBase +{ +public: + explicit Raycaster(CommonGizmosDataPool* cgdp) + : CommonGizmosDataBase(cgdp) {} +#ifndef NDEBUG + CommonGizmosDataID get_dependencies() const override { return CommonGizmosDataID::SelectionInfo; } +#endif // NDEBUG + + const MeshRaycaster* raycaster() const { assert(m_raycasters.size() == 1); return m_raycasters.front().get(); } + std::vector raycasters() const; + +protected: + void on_update() override; + void on_release() override; + +private: + std::vector> m_raycasters; + std::vector m_old_meshes; +}; + + + +class ObjectClipper : public CommonGizmosDataBase +{ +public: + explicit ObjectClipper(CommonGizmosDataPool* cgdp) + : CommonGizmosDataBase(cgdp) {} +#ifndef NDEBUG + CommonGizmosDataID get_dependencies() const override { return CommonGizmosDataID::SelectionInfo; } +#endif // NDEBUG + + void set_position(double pos, bool keep_normal); + double get_position() const { return m_clp_ratio; } + ClippingPlane* get_clipping_plane() const { return m_clp.get(); } + void render_cut() const; + + +protected: + void on_update() override; + void on_release() override; + +private: + std::vector m_old_meshes; + std::vector> m_clippers; + std::unique_ptr m_clp; + double m_clp_ratio = 0.; + double m_active_inst_bb_radius = 0.; +}; + + + +class SupportsClipper : public CommonGizmosDataBase +{ +public: + explicit SupportsClipper(CommonGizmosDataPool* cgdp) + : CommonGizmosDataBase(cgdp) {} +#ifndef NDEBUG + CommonGizmosDataID get_dependencies() const override { + return CommonGizmosDataID( + int(CommonGizmosDataID::SelectionInfo) + | int(CommonGizmosDataID::ObjectClipper) + ); + } +#endif // NDEBUG + + void render_cut() const; + + +protected: + void on_update() override; + void on_release() override; + +private: + size_t m_old_timestamp = 0; + int m_print_object_idx = -1; + int m_print_objects_count = 0; + std::unique_ptr m_clipper; +}; + +} // namespace CommonGizmosDataObjects + + + + + + +} // namespace GUI +} // namespace Slic3r + + +#endif // slic3r_GUI_GLGizmosCommon_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 379bd48d1..685e49d36 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -9,10 +9,15 @@ #include "slic3r/GUI/GUI_ObjectManipulation.hpp" #include "slic3r/GUI/PresetBundle.hpp" #include "slic3r/Utils/UndoRedo.hpp" -#include "libslic3r/SLAPrint.hpp" -#include "slic3r/GUI/MeshUtils.hpp" -#include "slic3r/GUI/Gizmos/GLGizmos.hpp" -#include "slic3r/GUI/Camera.hpp" + +#include "slic3r/GUI/Gizmos/GLGizmoMove.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoScale.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoRotate.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoFlatten.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoCut.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoHollow.hpp" #include @@ -97,16 +102,16 @@ bool GLGizmosManager::init() m_gizmos.emplace_back(new GLGizmoCut(m_parent, "cut.svg", 4)); m_gizmos.emplace_back(new GLGizmoHollow(m_parent, "hollow.svg", 5)); m_gizmos.emplace_back(new GLGizmoSlaSupports(m_parent, "sla_supports.svg", 6)); + m_gizmos.emplace_back(new GLGizmoFdmSupports(m_parent, "sla_supports.svg", 7)); - m_common_gizmos_data.reset(new CommonGizmosData()); - dynamic_cast(m_gizmos[Hollow].get())->set_common_data_ptr(m_common_gizmos_data.get()); - dynamic_cast(m_gizmos[SlaSupports].get())->set_common_data_ptr(m_common_gizmos_data.get()); + m_common_gizmos_data.reset(new CommonGizmosDataPool(&m_parent)); for (auto& gizmo : m_gizmos) { if (! gizmo->init()) { m_gizmos.clear(); return false; } + gizmo->set_common_data_pool(m_common_gizmos_data.get()); } m_current = Undefined; @@ -198,6 +203,10 @@ void GLGizmosManager::update_data() enable_grabber(Scale, i, enable_scale_xyz); } + m_common_gizmos_data->update(get_current() + ? get_current()->get_requirements() + : CommonGizmosDataID(0)); + if (selection.is_single_full_instance()) { // all volumes in the selection belongs to the same instance, any of them contains the needed data, so we take the first @@ -207,6 +216,7 @@ void GLGizmosManager::update_data() ModelObject* model_object = selection.get_model()->objects[selection.get_object_idx()]; set_flattening_data(model_object); set_sla_support_data(model_object); + set_fdm_support_data(model_object); } else if (selection.is_single_volume() || selection.is_single_modifier()) { @@ -215,6 +225,7 @@ void GLGizmosManager::update_data() set_rotation(Vec3d::Zero()); set_flattening_data(nullptr); set_sla_support_data(nullptr); + set_fdm_support_data(nullptr); } else if (is_wipe_tower) { @@ -223,6 +234,7 @@ void GLGizmosManager::update_data() set_rotation(Vec3d(0., 0., (M_PI/180.) * dynamic_cast(config.option("wipe_tower_rotation_angle"))->value)); set_flattening_data(nullptr); set_sla_support_data(nullptr); + set_fdm_support_data(nullptr); } else { @@ -230,6 +242,7 @@ void GLGizmosManager::update_data() set_rotation(Vec3d::Zero()); set_flattening_data(selection.is_from_single_object() ? selection.get_model()->objects[selection.get_object_idx()] : nullptr); set_sla_support_data(selection.is_from_single_instance() ? selection.get_model()->objects[selection.get_object_idx()] : nullptr); + set_fdm_support_data(selection.is_from_single_instance() ? selection.get_model()->objects[selection.get_object_idx()] : nullptr); } } @@ -358,15 +371,27 @@ void GLGizmosManager::set_sla_support_data(ModelObject* model_object) || wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA) return; - m_common_gizmos_data->update_from_backend(m_parent, model_object); + /*m_common_gizmos_data->update_from_backend(m_parent, model_object); auto* gizmo_supports = dynamic_cast(m_gizmos[SlaSupports].get()); - auto* gizmo_hollow = dynamic_cast(m_gizmos[Hollow].get()); + // note: sla support gizmo takes care of updating the common data. // following lines are thus dependent - gizmo_supports->set_sla_support_data(model_object, m_parent.get_selection()); + //gizmo_supports->set_sla_support_data(model_object, m_parent.get_selection()); + */ + auto* gizmo_hollow = dynamic_cast(m_gizmos[Hollow].get()); + auto* gizmo_supports = dynamic_cast(m_gizmos[SlaSupports].get()); gizmo_hollow->set_sla_support_data(model_object, m_parent.get_selection()); + gizmo_supports->set_sla_support_data(model_object, m_parent.get_selection()); +} + +void GLGizmosManager::set_fdm_support_data(ModelObject* model_object) +{ + if (!m_enabled || m_gizmos.empty()) + return; + + dynamic_cast(m_gizmos[FdmSupports].get())->set_fdm_support_data(model_object, m_parent.get_selection()); } // Returns true if the gizmo used the event to do something, false otherwise. @@ -377,20 +402,24 @@ bool GLGizmosManager::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_p if (m_current == SlaSupports) return dynamic_cast(m_gizmos[SlaSupports].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); - if (m_current == Hollow) + else if (m_current == Hollow) return dynamic_cast(m_gizmos[Hollow].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); - return false; + else if (m_current == FdmSupports) + return dynamic_cast(m_gizmos[FdmSupports].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); + else + return false; } -ClippingPlane GLGizmosManager::get_sla_clipping_plane() const +ClippingPlane GLGizmosManager::get_clipping_plane() const { - if (!m_enabled || (m_current != SlaSupports && m_current != Hollow) || m_gizmos.empty()) + if (! m_common_gizmos_data + || ! m_common_gizmos_data->object_clipper() + || m_common_gizmos_data->object_clipper()->get_position() == 0.) return ClippingPlane::ClipsNothing(); - - if (m_current == SlaSupports) - return dynamic_cast(m_gizmos[SlaSupports].get())->get_sla_clipping_plane(); - else - return dynamic_cast(m_gizmos[Hollow].get())->get_sla_clipping_plane(); + else { + const ClippingPlane& clp = *m_common_gizmos_data->object_clipper()->get_clipping_plane(); + return ClippingPlane(-clp.get_normal(), clp.get_data()[3]); + } } bool GLGizmosManager::wants_reslice_supports_on_undo() const @@ -410,6 +439,7 @@ void GLGizmosManager::render_current_gizmo() const void GLGizmosManager::render_current_gizmo_for_picking_pass() const { if (! m_enabled || m_current == Undefined) + return; m_gizmos[m_current]->render_for_picking(); @@ -439,7 +469,7 @@ bool GLGizmosManager::on_mouse_wheel(wxMouseEvent& evt) { bool processed = false; - if (m_current == SlaSupports || m_current == Hollow) { + if (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports) { float rot = (float)evt.GetWheelRotation() / (float)evt.GetWheelDelta(); if (gizmo_event((rot > 0.f ? SLAGizmoEventType::MouseWheelUp : SLAGizmoEventType::MouseWheelDown), Vec2d::Zero(), evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) processed = true; @@ -529,8 +559,8 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) processed = true; m_mouse_capture.right = false; } - else - return false; +// else +// return false; } #if ENABLE_GIZMO_TOOLBAR_DRAGGING_FIX else if (evt.Dragging() && !is_dragging()) @@ -618,7 +648,8 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) if (evt.LeftDown()) { - if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) + if ((m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports) + && gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) // the gizmo got the event and took some action, there is no need to do anything more processed = true; else if (!selection.is_empty() && grabber_contains_mouse()) { @@ -636,17 +667,25 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) processed = true; } } - else if (evt.RightDown() && (selected_object_idx != -1) && (m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::RightDown)) + else if (evt.RightDown() && (selected_object_idx != -1) && (m_current == SlaSupports || m_current == Hollow) + && gizmo_event(SLAGizmoEventType::RightDown, mouse_pos)) { // we need to set the following right up as processed to avoid showing the context menu if the user release the mouse over the object pending_right_up = true; // event was taken care of by the SlaSupports gizmo processed = true; } + else if (evt.RightDown() && (selected_object_idx != -1) && m_current == FdmSupports + && gizmo_event(SLAGizmoEventType::RightDown, mouse_pos)) + { + // event was taken care of by the FdmSupports gizmo + processed = true; + } else if (evt.Dragging() && (m_parent.get_move_volume_id() != -1) && (m_current == SlaSupports || m_current == Hollow)) // don't allow dragging objects with the Sla gizmo on processed = true; - else if (evt.Dragging() && (m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) + else if (evt.Dragging() && (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports ) + && gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) { // the gizmo got the event and took some action, no need to do anything more here m_parent.set_as_dirty(); @@ -723,9 +762,9 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) processed = true; } #endif // !ENABLE_CANVAS_TOOLTIP_USING_IMGUI - else if (evt.LeftUp() && (m_current == SlaSupports || m_current == Hollow) && !m_parent.is_mouse_dragging()) + else if (evt.LeftUp() && (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports) && !m_parent.is_mouse_dragging()) { - // in case SLA gizmo is selected, we just pass the LeftUp event and stop processing - neither + // in case SLA/FDM gizmo is selected, we just pass the LeftUp event and stop processing - neither // object moving or selecting is suppressed in that case gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown()); processed = true; @@ -735,6 +774,11 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) // to avoid to loose the selection when user clicks an the white faces of a different object while the Flatten gizmo is active processed = true; } + else if (evt.RightUp() && m_current == FdmSupports && !m_parent.is_mouse_dragging()) + { + gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown()); + processed = true; + } } else { @@ -824,7 +868,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) case 'r' : case 'R' : { - if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::ResetClippingPlane)) + if ((m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports) && gizmo_event(SLAGizmoEventType::ResetClippingPlane)) processed = true; break; @@ -1188,10 +1232,13 @@ void GLGizmosManager::activate_gizmo(EType type) return; // gizmo refused to be turned off, do nothing. } + m_current = type; + m_common_gizmos_data->update(get_current() + ? get_current()->get_requirements() + : CommonGizmosDataID(0)); + if (type != Undefined) m_gizmos[type]->set_state(GLGizmoBase::On); - - m_current = type; } @@ -1204,135 +1251,5 @@ bool GLGizmosManager::grabber_contains_mouse() const return (curr != nullptr) ? (curr->get_hover_id() != -1) : false; } - - -CommonGizmosData::CommonGizmosData() -{ - m_clipping_plane.reset(new ClippingPlane(Vec3d::Zero(), 0.)); -} - - - -bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* model_object) -{ - recent_update = false; - bool object_changed = false; - - if (m_model_object != model_object - || (model_object && m_model_object_id != model_object->id())) { - m_model_object = model_object; - m_print_object_idx = -1; - m_mesh_raycaster.reset(); - m_object_clipper.reset(); - m_supports_clipper.reset(); - m_old_mesh = nullptr; - m_mesh = nullptr; - m_backend_mesh_transformed.clear(); - - object_changed = true; - recent_update = true; - } - - if (m_model_object) { - int active_inst = canvas.get_selection().get_instance_idx(); - if (m_active_instance != active_inst) { - m_active_instance = active_inst; - m_active_instance_bb_radius = m_model_object->instance_bounding_box(m_active_instance).radius(); - recent_update = true; - } - } - - - if (! m_model_object || ! canvas.get_selection().is_from_single_instance()) - return false; - - int old_po_idx = m_print_object_idx; - - // First we need a pointer to the respective SLAPrintObject. The index into objects vector is - // cached so we don't have todo it on each render. We only search for the po if needed: - if (m_print_object_idx < 0 || (int)canvas.sla_print()->objects().size() != m_print_objects_count) { - m_print_objects_count = canvas.sla_print()->objects().size(); - m_print_object_idx = -1; - for (const SLAPrintObject* po : canvas.sla_print()->objects()) { - ++m_print_object_idx; - if (po->model_object()->id() == m_model_object->id()) - break; - } - } - - bool mesh_exchanged = false; - m_mesh = nullptr; - // Load either the model_object mesh, or one provided by the backend - // This mesh does not account for the possible Z up SLA offset. - // The backend mesh needs to be transformed and because a pointer to it is - // saved, a copy is stored as a member (FIXME) - if (m_print_object_idx >=0) { - const SLAPrintObject* po = canvas.sla_print()->objects()[m_print_object_idx]; - if (po->is_step_done(slaposDrillHoles)) { - m_backend_mesh_transformed = po->get_mesh_to_print(); - m_backend_mesh_transformed.transform(canvas.sla_print()->sla_trafo(*m_model_object).inverse()); - m_mesh = &m_backend_mesh_transformed; - m_has_drilled_mesh = true; - mesh_exchanged = true; - } - } - - if (! m_mesh) { - m_mesh = &m_model_object->volumes.front()->mesh(); - m_backend_mesh_transformed.clear(); - m_has_drilled_mesh = false; - } - - m_model_object_id = m_model_object->id(); - - if (m_mesh != m_old_mesh) { - // Update clipping plane position. - float new_clp_pos = m_clipping_plane_distance; - if (object_changed) { - new_clp_pos = 0.f; - m_clipping_plane_was_moved = false; - } else { - // After we got a drilled mesh, move the cp to 25%. This only applies when - // the hollowing gizmo is active and hollowing is enabled - if (m_clipping_plane_distance == 0.f && mesh_exchanged && m_has_drilled_mesh) { - const DynamicPrintConfig& cfg = - (m_model_object && m_model_object->config.has("hollowing_enable")) - ? m_model_object->config - : wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; - - if (cfg.has("hollowing_enable") && cfg.opt_bool("hollowing_enable") - && canvas.get_gizmos_manager().get_current_type() == GLGizmosManager::Hollow) { - new_clp_pos = 0.25f; - m_clipping_plane_was_moved = false; // so it uses current camera direction - } - } - } - m_clipping_plane_distance = new_clp_pos; - m_clipping_plane_distance_stash = new_clp_pos; - - m_schedule_aabb_calculation = true; - recent_update = true; - return true; - } - if (! recent_update) - recent_update = m_print_object_idx < 0 && old_po_idx >= 0; - - return recent_update; -} - - -void CommonGizmosData::build_AABB_if_needed() -{ - if (! m_schedule_aabb_calculation) - return; - - wxBusyCursor wait; - m_mesh_raycaster.reset(new MeshRaycaster(*m_mesh)); - m_object_clipper.reset(); - m_supports_clipper.reset(); - m_old_mesh = m_mesh; - m_schedule_aabb_calculation = false; -} - } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 7ae1fa661..478774718 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -3,8 +3,8 @@ #include "slic3r/GUI/GLTexture.hpp" #include "slic3r/GUI/GLToolbar.hpp" -#include "libslic3r/ObjectID.hpp" #include "slic3r/GUI/Gizmos/GLGizmoBase.hpp" +#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" #include @@ -19,7 +19,7 @@ namespace GUI { class GLCanvas3D; class ClippingPlane; enum class SLAGizmoEventType : unsigned char; -class CommonGizmosData; +class CommonGizmosDataPool; class Rect { @@ -64,6 +64,7 @@ public: Cut, Hollow, SlaSupports, + FdmSupports, Undefined }; @@ -115,7 +116,8 @@ private: MouseCapture m_mouse_capture; std::string m_tooltip; bool m_serializing; - std::unique_ptr m_common_gizmos_data; + //std::unique_ptr m_common_gizmos_data; + std::unique_ptr m_common_gizmos_data; public: explicit GLGizmosManager(GLCanvas3D& parent); @@ -197,8 +199,11 @@ public: void set_flattening_data(const ModelObject* model_object); void set_sla_support_data(ModelObject* model_object); + + void set_fdm_support_data(ModelObject* model_object); + bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position = Vec2d::Zero(), bool shift_down = false, bool alt_down = false, bool control_down = false); - ClippingPlane get_sla_clipping_plane() const; + ClippingPlane get_clipping_plane() const; bool wants_reslice_supports_on_undo() const; void render_current_gizmo() const; @@ -231,63 +236,6 @@ private: -class MeshRaycaster; -class MeshClipper; - -// This class is only for sharing SLA related data between SLA gizmos -// and its synchronization with backend data. It should not be misused -// for anything else. -class CommonGizmosData { -public: - CommonGizmosData(); - const TriangleMesh* mesh() const { - return (! m_mesh ? nullptr : m_mesh); //(m_cavity_mesh ? m_cavity_mesh.get() : m_mesh)); - } - - bool update_from_backend(GLCanvas3D& canvas, ModelObject* model_object); - bool recent_update = false; - static constexpr float HoleStickOutLength = 1.f; - - ModelObject* m_model_object = nullptr; - const TriangleMesh* m_mesh; - std::unique_ptr m_mesh_raycaster; - std::unique_ptr m_object_clipper; - std::unique_ptr m_supports_clipper; - - //std::unique_ptr m_cavity_mesh; - //std::unique_ptr m_volume_with_cavity; - - int m_active_instance = -1; - float m_active_instance_bb_radius = 0; - ObjectID m_model_object_id = 0; - int m_print_object_idx = -1; - int m_print_objects_count = -1; - int m_old_timestamp = -1; - - float m_clipping_plane_distance = 0.f; - std::unique_ptr m_clipping_plane; - bool m_clipping_plane_was_moved = false; - - void stash_clipping_plane() { - m_clipping_plane_distance_stash = m_clipping_plane_distance; - } - - void unstash_clipping_plane() { - m_clipping_plane_distance = m_clipping_plane_distance_stash; - } - - bool has_drilled_mesh() const { return m_has_drilled_mesh; } - - void build_AABB_if_needed(); - -private: - const TriangleMesh* m_old_mesh; - TriangleMesh m_backend_mesh_transformed; - float m_clipping_plane_distance_stash = 0.f; - bool m_has_drilled_mesh = false; - bool m_schedule_aabb_calculation = false; -}; - } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 37b6efd87..6c4f5e49d 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -85,19 +85,25 @@ void MeshClipper::recalculate_triangles() tr = m_trafo.get_matrix().cast() * tr; m_triangles3d.clear(); - m_triangles3d.reserve(m_triangles2d.size()); - for (const Vec2f& pt : m_triangles2d) { - m_triangles3d.push_back(Vec3f(pt(0), pt(1), height_mesh+0.001f)); - m_triangles3d.back() = tr * m_triangles3d.back(); - } + m_triangles3d.reserve(m_triangles2d.size()); + for (const Vec2f& pt : m_triangles2d) { + m_triangles3d.push_back(Vec3f(pt(0), pt(1), height_mesh+0.001f)); + m_triangles3d.back() = tr * m_triangles3d.back(); + } m_triangles_valid = true; } +Vec3f MeshRaycaster::get_triangle_normal(const indexed_triangle_set& its, size_t facet_idx) +{ + Vec3f a(its.vertices[its.indices[facet_idx](1)] - its.vertices[its.indices[facet_idx](0)]); + Vec3f b(its.vertices[its.indices[facet_idx](2)] - its.vertices[its.indices[facet_idx](0)]); + return Vec3f(a.cross(b)).normalized(); +} -bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, - Vec3f& position, Vec3f& normal, const ClippingPlane* clipping_plane) const +void MeshRaycaster::line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, + Vec3d& point, Vec3d& direction) const { const std::array& viewport = camera.get_viewport(); const Transform3d& model_mat = camera.get_view_matrix(); @@ -112,7 +118,21 @@ bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& pt1 = inv * pt1; pt2 = inv * pt2; - std::vector hits = m_emesh.query_ray_hits(pt1, pt2-pt1); + point = pt1; + direction = pt2-pt1; +} + + +bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, + Vec3f& position, Vec3f& normal, const ClippingPlane* clipping_plane, + size_t* facet_idx) const +{ + Vec3d point; + Vec3d direction; + line_from_mouse_pos(mouse_pos, trafo, camera, point, direction); + + std::vector hits = m_emesh.query_ray_hits(point, direction); + if (hits.empty()) return false; // no intersection found @@ -134,6 +154,10 @@ bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& // Now stuff the points in the provided vector and calculate normals if asked about them: position = hits[i].position().cast(); normal = hits[i].normal().cast(); + + if (facet_idx) + *facet_idx = hits[i].face(); + return true; } diff --git a/src/slic3r/GUI/MeshUtils.hpp b/src/slic3r/GUI/MeshUtils.hpp index b4ad03011..92f444f55 100644 --- a/src/slic3r/GUI/MeshUtils.hpp +++ b/src/slic3r/GUI/MeshUtils.hpp @@ -4,6 +4,8 @@ #include "libslic3r/Point.hpp" #include "libslic3r/Geometry.hpp" #include "libslic3r/SLA/EigenMesh3D.hpp" +#include "admesh/stl.h" + #include @@ -26,10 +28,7 @@ class ClippingPlane public: ClippingPlane() { - m_data[0] = 0.0; - m_data[1] = 0.0; - m_data[2] = 1.0; - m_data[3] = 0.0; + *this = ClipsNothing(); } ClippingPlane(const Vec3d& direction, double offset) @@ -111,6 +110,9 @@ public: : m_emesh(mesh) {} + void line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, + Vec3d& point, Vec3d& direction) const; + // Given a mouse position, this returns true in case it is on the mesh. bool unproject_on_mesh( const Vec2d& mouse_pos, @@ -118,7 +120,8 @@ public: const Camera& camera, // current camera position Vec3f& position, // where to save the positibon of the hit (mesh coords) Vec3f& normal, // normal of the triangle that was hit - const ClippingPlane* clipping_plane = nullptr // clipping plane (if active) + const ClippingPlane* clipping_plane = nullptr, // clipping plane (if active) + size_t* facet_idx = nullptr // index of the facet hit ) const; // Given a vector of points in woorld coordinates, this returns vector @@ -134,8 +137,11 @@ public: // Given a point in world coords, the method returns closest point on the mesh. // The output is in mesh coords. // normal* can be used to also get normal of the respective triangle. + Vec3f get_closest_point(const Vec3f& point, Vec3f* normal = nullptr) const; + static Vec3f get_triangle_normal(const indexed_triangle_set& its, size_t facet_idx); + private: sla::EigenMesh3D m_emesh; }; diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index c9f1de168..b3f279196 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -754,7 +754,8 @@ ModeSizer::ModeSizer(wxWindow *parent, int hgap/* = 0*/) : std::vector < std::pair < wxString, std::string >> buttons = { {_(L("Simple")), "mode_simple"}, - {_(L("Advanced")), "mode_advanced"}, +// {_(L("Advanced")), "mode_advanced"}, + {_CTX(L_CONTEXT("Advanced", "Mode"), "Mode"), "mode_advanced"}, {_(L("Expert")), "mode_expert"}, };