diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8adea28c3..9f869be44 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -321,7 +321,7 @@ include_directories(${GLEW_INCLUDE_DIRS})
# l10n
set(L10N_DIR "${SLIC3R_RESOURCES_DIR}/localization")
add_custom_target(pot
- COMMAND xgettext --keyword=L --from-code=UTF-8 --debug
+ COMMAND xgettext --keyword=L --add-comments=TRN --from-code=UTF-8 --debug
-f "${L10N_DIR}/list.txt"
-o "${L10N_DIR}/Slic3rPE.pot"
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
diff --git a/doc/How to build - Mac OS.md b/doc/How to build - Mac OS.md
index 670e9fd87..5af755564 100644
--- a/doc/How to build - Mac OS.md
+++ b/doc/How to build - Mac OS.md
@@ -61,3 +61,10 @@ Please note that the `CMAKE_OSX_DEPLOYMENT_TARGET` and `CMAKE_OSX_SYSROOT` optio
on both the dependencies bundle as well as Slic3r PE itself.
Official Mac Slic3r builds are currently built against SDK 10.9 to ensure compatibility with older Macs.
+
+_Warning:_ XCode may be set such that it rejects SDKs bellow some version (silently, more or less).
+This is set in the property list file
+
+ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Info.plist
+
+To remove the limitation, simply delete the key `MinimumSDKVersion` from that file.
diff --git a/doc/Localization_guide.md b/doc/Localization_guide.md
index 656f225ef..3394d2958 100644
--- a/doc/Localization_guide.md
+++ b/doc/Localization_guide.md
@@ -46,7 +46,7 @@ https://github.com/prusa3d/Slic3r/tree/master/resources/localization/list.txt.
2. Create template file(*.POT) with GNUgettext command:
```
- xgettext --keyword=L --from-code=UTF-8 --debug -o Slic3rPE.pot -f list.txt
+ xgettext --keyword=L --add-comments=TRN --from-code=UTF-8 --debug -o Slic3rPE.pot -f list.txt
```
Use flag `--from-code=UTF-8` to specify that the source strings are in UTF-8 encoding
diff --git a/resources/icons/layers.svg b/resources/icons/layers.svg
index da5dec21d..cd71fab3a 100644
--- a/resources/icons/layers.svg
+++ b/resources/icons/layers.svg
@@ -5,13 +5,13 @@
-
+
-
+
-
+
@@ -20,7 +20,7 @@
-
+
diff --git a/resources/localization/Slic3rPE.pot b/resources/localization/Slic3rPE.pot
index 5daef34f0..c65ea69d4 100644
--- a/resources/localization/Slic3rPE.pot
+++ b/resources/localization/Slic3rPE.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-04-09 14:34+0200\n"
+"POT-Creation-Date: 2019-04-18 10:07+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,7 +18,8 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
#: src/slic3r/GUI/AboutDialog.cpp:35
-msgid "About Slic3r"
+#, possible-c-format
+msgid "About %s"
msgstr ""
#: src/slic3r/GUI/AboutDialog.cpp:64 src/slic3r/GUI/MainFrame.cpp:52
@@ -35,7 +36,7 @@ msgstr ""
#: src/slic3r/GUI/BedShapeDialog.cpp:55
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:118 src/slic3r/GUI/Plater.cpp:136
-#: src/slic3r/GUI/Tab.cpp:2185
+#: src/slic3r/GUI/Tab.cpp:2186
msgid "Size"
msgstr ""
@@ -58,7 +59,7 @@ msgid "Circular"
msgstr ""
#: src/slic3r/GUI/BedShapeDialog.cpp:70 src/slic3r/GUI/ConfigWizard.cpp:111
-#: src/slic3r/GUI/ConfigWizard.cpp:544 src/slic3r/GUI/ConfigWizard.cpp:558
+#: src/slic3r/GUI/ConfigWizard.cpp:547 src/slic3r/GUI/ConfigWizard.cpp:561
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:115
#: src/slic3r/GUI/RammingChart.cpp:81 src/slic3r/GUI/WipeTowerDialog.cpp:84
#: src/libslic3r/PrintConfig.cpp:59 src/libslic3r/PrintConfig.cpp:66
@@ -78,14 +79,14 @@ msgstr ""
#: src/libslic3r/PrintConfig.cpp:1931 src/libslic3r/PrintConfig.cpp:2123
#: src/libslic3r/PrintConfig.cpp:2130 src/libslic3r/PrintConfig.cpp:2137
#: src/libslic3r/PrintConfig.cpp:2167 src/libslic3r/PrintConfig.cpp:2177
-#: src/libslic3r/PrintConfig.cpp:2187 src/libslic3r/PrintConfig.cpp:2293
-#: src/libslic3r/PrintConfig.cpp:2368 src/libslic3r/PrintConfig.cpp:2377
-#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2396
-#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2450
-#: src/libslic3r/PrintConfig.cpp:2469 src/libslic3r/PrintConfig.cpp:2479
-#: src/libslic3r/PrintConfig.cpp:2488 src/libslic3r/PrintConfig.cpp:2506
-#: src/libslic3r/PrintConfig.cpp:2521 src/libslic3r/PrintConfig.cpp:2532
-#: src/libslic3r/PrintConfig.cpp:2545 src/libslic3r/PrintConfig.cpp:2555
+#: src/libslic3r/PrintConfig.cpp:2187 src/libslic3r/PrintConfig.cpp:2295
+#: src/libslic3r/PrintConfig.cpp:2370 src/libslic3r/PrintConfig.cpp:2379
+#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2398
+#: src/libslic3r/PrintConfig.cpp:2442 src/libslic3r/PrintConfig.cpp:2452
+#: src/libslic3r/PrintConfig.cpp:2471 src/libslic3r/PrintConfig.cpp:2481
+#: src/libslic3r/PrintConfig.cpp:2490 src/libslic3r/PrintConfig.cpp:2508
+#: src/libslic3r/PrintConfig.cpp:2523 src/libslic3r/PrintConfig.cpp:2537
+#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2560
msgid "mm"
msgstr ""
@@ -116,7 +117,7 @@ msgstr ""
msgid "Choose a file to import bed shape from (STL/OBJ/AMF/3MF/PRUSA):"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:1252
+#: src/slic3r/GUI/BedShapeDialog.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:1320
msgid "Error! "
msgstr ""
@@ -129,7 +130,7 @@ msgid ""
"The selected file contains several disjoint areas. This is not supported."
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.hpp:44 src/slic3r/GUI/ConfigWizard.cpp:507
+#: src/slic3r/GUI/BedShapeDialog.hpp:44 src/slic3r/GUI/ConfigWizard.cpp:510
msgid "Bed Shape"
msgstr ""
@@ -203,7 +204,7 @@ msgstr ""
msgid "slic3r version"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 src/slic3r/GUI/Preset.cpp:1250
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 src/slic3r/GUI/Preset.cpp:1252
msgid "print"
msgstr ""
@@ -211,7 +212,7 @@ msgstr ""
msgid "filaments"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 src/slic3r/GUI/Preset.cpp:1254
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 src/slic3r/GUI/Preset.cpp:1256
msgid "printer"
msgstr ""
@@ -263,25 +264,25 @@ msgstr ""
msgid "All standard"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:182 src/slic3r/GUI/Tab.cpp:2909
+#: src/slic3r/GUI/ConfigWizard.cpp:182 src/slic3r/GUI/Tab.cpp:2910
msgid "All"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:183 src/slic3r/GUI/Plater.cpp:414
+#: src/slic3r/GUI/ConfigWizard.cpp:183 src/slic3r/GUI/Plater.cpp:413
#: src/libslic3r/GCode/PreviewData.cpp:162
msgid "None"
msgstr ""
#: src/slic3r/GUI/ConfigWizard.cpp:284
#, possible-c-format
-msgid "Welcome to the Slic3r %s"
+msgid "Welcome to the %s %s"
msgstr ""
#: src/slic3r/GUI/ConfigWizard.cpp:284
msgid "Welcome"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:288 src/slic3r/GUI/GUI_App.cpp:600
+#: src/slic3r/GUI/ConfigWizard.cpp:288 src/slic3r/GUI/GUI_App.cpp:632
#, possible-c-format
msgid "Run %s"
msgstr ""
@@ -289,62 +290,63 @@ msgstr ""
#: src/slic3r/GUI/ConfigWizard.cpp:290
#, possible-c-format
msgid ""
-"Hello, welcome to Slic3r Prusa Edition! This %s helps you with the initial "
-"configuration; just a few settings and you will be ready to print."
+"Hello, welcome to %s! This %s helps you with the initial configuration; just "
+"a few settings and you will be ready to print."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:294
+#: src/slic3r/GUI/ConfigWizard.cpp:295
msgid ""
"Remove user profiles - install from scratch (a snapshot will be taken "
"beforehand)"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:325
+#: src/slic3r/GUI/ConfigWizard.cpp:326
#, possible-c-format
msgid "%s Family"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:362
+#: src/slic3r/GUI/ConfigWizard.cpp:363
msgid "Custom Printer Setup"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:362
+#: src/slic3r/GUI/ConfigWizard.cpp:363
msgid "Custom Printer"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:364
+#: src/slic3r/GUI/ConfigWizard.cpp:365
msgid "Define a custom printer profile"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:366
+#: src/slic3r/GUI/ConfigWizard.cpp:367
msgid "Custom profile name:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:390
+#: src/slic3r/GUI/ConfigWizard.cpp:391
msgid "Automatic updates"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:390
+#: src/slic3r/GUI/ConfigWizard.cpp:391
msgid "Updates"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:398 src/slic3r/GUI/Preferences.cpp:59
+#: src/slic3r/GUI/ConfigWizard.cpp:399 src/slic3r/GUI/Preferences.cpp:59
msgid "Check for application updates"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:401 src/slic3r/GUI/Preferences.cpp:61
+#: src/slic3r/GUI/ConfigWizard.cpp:402
+#, possible-c-format
msgid ""
-"If enabled, Slic3r checks for new versions of Slic3r PE online. When a new "
-"version becomes available a notification is displayed at the next "
-"application startup (never during program usage). This is only a "
-"notification mechanisms, no automatic installation is done."
+"If enabled, Slic3r checks for new versions of %s online. When a new version "
+"becomes available, a notification is displayed at the next application "
+"startup (never during program usage). This is only a notification "
+"mechanisms, no automatic installation is done."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:405 src/slic3r/GUI/Preferences.cpp:67
+#: src/slic3r/GUI/ConfigWizard.cpp:408 src/slic3r/GUI/Preferences.cpp:67
msgid "Update built-in Presets automatically"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:408 src/slic3r/GUI/Preferences.cpp:69
+#: src/slic3r/GUI/ConfigWizard.cpp:411 src/slic3r/GUI/Preferences.cpp:69
msgid ""
"If enabled, Slic3r downloads updates of built-in system presets in the "
"background. These updates are downloaded into a separate temporary location. "
@@ -352,184 +354,185 @@ msgid ""
"startup."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:409
+#: src/slic3r/GUI/ConfigWizard.cpp:412
msgid ""
"Updates are never applied without user's consent and never overwrite user's "
"customized settings."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:414
+#: src/slic3r/GUI/ConfigWizard.cpp:417
msgid ""
"Additionally a backup snapshot of the whole configuration is created before "
"an update is applied."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:421
+#: src/slic3r/GUI/ConfigWizard.cpp:424
msgid "Other Vendors"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:423
-msgid "Pick another vendor supported by Slic3r PE:"
+#: src/slic3r/GUI/ConfigWizard.cpp:426
+#, possible-c-format
+msgid "Pick another vendor supported by %s:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:469
+#: src/slic3r/GUI/ConfigWizard.cpp:472
msgid "Firmware Type"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:469 src/slic3r/GUI/Tab.cpp:1870
+#: src/slic3r/GUI/ConfigWizard.cpp:472 src/slic3r/GUI/Tab.cpp:1870
msgid "Firmware"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:473
+#: src/slic3r/GUI/ConfigWizard.cpp:476
msgid "Choose the type of firmware used by your printer."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:507
+#: src/slic3r/GUI/ConfigWizard.cpp:510
msgid "Bed Shape and Size"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:510
+#: src/slic3r/GUI/ConfigWizard.cpp:513
msgid "Set the shape of your printer's bed."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:524
+#: src/slic3r/GUI/ConfigWizard.cpp:527
msgid "Filament and Nozzle Diameters"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:524
+#: src/slic3r/GUI/ConfigWizard.cpp:527
msgid "Print Diameters"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:540
+#: src/slic3r/GUI/ConfigWizard.cpp:543
msgid "Enter the diameter of your printer's hot end nozzle."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:543
+#: src/slic3r/GUI/ConfigWizard.cpp:546
msgid "Nozzle Diameter:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:553
+#: src/slic3r/GUI/ConfigWizard.cpp:556
msgid "Enter the diameter of your filament."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:554
+#: src/slic3r/GUI/ConfigWizard.cpp:557
msgid ""
"Good precision is required, so use a caliper and do multiple measurements "
"along the filament, then compute the average."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:557
+#: src/slic3r/GUI/ConfigWizard.cpp:560
msgid "Filament Diameter:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:575
+#: src/slic3r/GUI/ConfigWizard.cpp:578
msgid "Extruder and Bed Temperatures"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:575
+#: src/slic3r/GUI/ConfigWizard.cpp:578
msgid "Temperatures"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:591
+#: src/slic3r/GUI/ConfigWizard.cpp:594
msgid "Enter the temperature needed for extruding your filament."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:592
+#: src/slic3r/GUI/ConfigWizard.cpp:595
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:595
+#: src/slic3r/GUI/ConfigWizard.cpp:598
msgid "Extrusion Temperature:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:596 src/slic3r/GUI/ConfigWizard.cpp:610
+#: src/slic3r/GUI/ConfigWizard.cpp:599 src/slic3r/GUI/ConfigWizard.cpp:613
msgid "°C"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:605
+#: src/slic3r/GUI/ConfigWizard.cpp:608
msgid ""
"Enter the bed temperature needed for getting your filament to stick to your "
"heated bed."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:606
+#: src/slic3r/GUI/ConfigWizard.cpp:609
msgid ""
"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have "
"no heated bed."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:609
+#: src/slic3r/GUI/ConfigWizard.cpp:612
msgid "Bed Temperature:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1001
+#: src/slic3r/GUI/ConfigWizard.cpp:1017
msgid "Select all standard printers"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1004
+#: src/slic3r/GUI/ConfigWizard.cpp:1020
msgid "< &Back"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1005
+#: src/slic3r/GUI/ConfigWizard.cpp:1021
msgid "&Next >"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1006
+#: src/slic3r/GUI/ConfigWizard.cpp:1022
msgid "&Finish"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1007 src/slic3r/GUI/FirmwareDialog.cpp:142
+#: src/slic3r/GUI/ConfigWizard.cpp:1023 src/slic3r/GUI/FirmwareDialog.cpp:142
#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:37
#: src/slic3r/GUI/ProgressStatusBar.cpp:28
msgid "Cancel"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1021
+#: src/slic3r/GUI/ConfigWizard.cpp:1037
msgid "Prusa FFF Technology Printers"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1024
+#: src/slic3r/GUI/ConfigWizard.cpp:1040
msgid "Prusa MSLA Technology Printers"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1111
+#: src/slic3r/GUI/ConfigWizard.cpp:1127
msgid "Configuration Wizard"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1112
+#: src/slic3r/GUI/ConfigWizard.cpp:1128
msgid "Configuration &Wizard"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1114
+#: src/slic3r/GUI/ConfigWizard.cpp:1130
msgid "Configuration Assistant"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1115
+#: src/slic3r/GUI/ConfigWizard.cpp:1131
msgid "Configuration &Assistant"
msgstr ""
-#: src/slic3r/GUI/Field.cpp:112
+#: src/slic3r/GUI/Field.cpp:111
msgid "default value"
msgstr ""
-#: src/slic3r/GUI/Field.cpp:115
+#: src/slic3r/GUI/Field.cpp:114
msgid "parameter name"
msgstr ""
-#: src/slic3r/GUI/Field.cpp:143
+#: src/slic3r/GUI/Field.cpp:142
#, possible-c-format
msgid "%s doesn't support percentage"
msgstr ""
-#: src/slic3r/GUI/Field.cpp:157 src/slic3r/GUI/Field.cpp:180
+#: src/slic3r/GUI/Field.cpp:156 src/slic3r/GUI/Field.cpp:179
msgid "Invalid numeric input."
msgstr ""
-#: src/slic3r/GUI/Field.cpp:162
+#: src/slic3r/GUI/Field.cpp:161
msgid "Input value is out of range"
msgstr ""
-#: src/slic3r/GUI/Field.cpp:188
+#: src/slic3r/GUI/Field.cpp:187
#, possible-c-format
msgid ""
"Do you mean %d%% instead of %d %s?\n"
@@ -537,7 +540,7 @@ msgid ""
"or NO if you are sure that %d %s is a correct value."
msgstr ""
-#: src/slic3r/GUI/Field.cpp:191
+#: src/slic3r/GUI/Field.cpp:190
msgid "Parameter validation"
msgstr ""
@@ -660,19 +663,19 @@ msgstr ""
msgid "Cancelling..."
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:709
+#: src/slic3r/GUI/GLCanvas3D.cpp:714
msgid "Detected object outside print volume"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:710
+#: src/slic3r/GUI/GLCanvas3D.cpp:715
msgid "Detected toolpath outside print volume"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:711
+#: src/slic3r/GUI/GLCanvas3D.cpp:716
msgid "Some objects are not visible when editing supports"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:713
+#: src/slic3r/GUI/GLCanvas3D.cpp:718
msgid ""
"Detected object outside print volume\n"
"Resolve a clash to continue slicing/export process correctly"
@@ -696,7 +699,7 @@ msgstr ""
msgid "Cut [C]"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3006
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3011
msgid "Cut"
msgstr ""
@@ -716,11 +719,11 @@ msgstr ""
msgid "Move [M]"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:176
+#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177
msgid "Position (mm)"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:176
+#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177
msgid "Displacement (mm)"
msgstr ""
@@ -740,84 +743,104 @@ msgstr ""
msgid "Scale (%)"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:597
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:882
msgid "Left mouse click - add point"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:598
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:883
msgid "Right mouse click - remove point"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:599
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:884
msgid "Shift + Left (+ drag) - select point(s)"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:606
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:891
msgid "Head diameter: "
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:618
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:903
msgid "Lock supports under new islands"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:622
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:907
msgid "Remove selected points"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:679
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:964
msgid "Remove all points"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:916
msgid "Apply changes"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:636
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:921
msgid "Discard changes"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:644
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:929
msgid "Minimal points distance: "
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:655
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:940
msgid "Support points density: "
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:669
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:954
msgid "Auto-generate points [A]"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:675
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:960
msgid "Manual editing [M]"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:738
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:969
+msgid "No points (will be autogenerated)"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:970
+msgid "Autogenerated points (no modifications)"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:971
+msgid "User-modified points"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:972
+msgid "Generation in progress..."
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:980
+msgid "Reset direction [R] "
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1039
msgid "SLA Support Points [L]"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:767
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1066
msgid "Do you want to save your manually edited support points ?\n"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:768
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1067
msgid "Save changes?"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
msgid ""
"Autogeneration will erase all manually edited points.\n"
"\n"
"Are you sure you want to do it?\n"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:899 src/slic3r/GUI/GUI.cpp:288
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 src/slic3r/GUI/GUI.cpp:288
#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328
msgid "Warning"
msgstr ""
-#: src/slic3r/GUI/GUI.cpp:147 src/slic3r/GUI/Tab.cpp:2720
+#: src/slic3r/GUI/GUI.cpp:147 src/slic3r/GUI/Tab.cpp:2721
msgid "It's impossible to print multi-part object(s) with SLA technology."
msgstr ""
@@ -825,8 +848,8 @@ msgstr ""
msgid "Please check and fix your object list."
msgstr ""
-#: src/slic3r/GUI/GUI.cpp:149 src/slic3r/GUI/GUI_App.cpp:679
-#: src/slic3r/GUI/Tab.cpp:2722
+#: src/slic3r/GUI/GUI.cpp:149 src/slic3r/GUI/GUI_App.cpp:711
+#: src/slic3r/GUI/Tab.cpp:2723
msgid "Attention!"
msgstr ""
@@ -834,159 +857,159 @@ msgstr ""
msgid "Notice"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:318
+#: src/slic3r/GUI/GUI_App.cpp:352
msgid "Changing of an application language"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:326 src/slic3r/GUI/GUI_App.cpp:335
+#: src/slic3r/GUI/GUI_App.cpp:360 src/slic3r/GUI/GUI_App.cpp:369
msgid "Recreating"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:339
-msgid "Loading of a current presets"
+#: src/slic3r/GUI/GUI_App.cpp:373
+msgid "Loading of current presets"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:347
+#: src/slic3r/GUI/GUI_App.cpp:381
msgid "Loading of a mode view"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:429
+#: src/slic3r/GUI/GUI_App.cpp:463
msgid "Choose one file (3MF):"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:441
+#: src/slic3r/GUI/GUI_App.cpp:475
msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:454
+#: src/slic3r/GUI/GUI_App.cpp:488
msgid "Array of language names and identifiers should have the same size."
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:464
+#: src/slic3r/GUI/GUI_App.cpp:498
msgid "Select the language"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:464
+#: src/slic3r/GUI/GUI_App.cpp:498
msgid "Language"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:534 src/slic3r/GUI/GUI_ObjectList.cpp:1067
+#: src/slic3r/GUI/GUI_App.cpp:568 src/slic3r/GUI/GUI_ObjectList.cpp:1135
#: src/libslic3r/PrintConfig.cpp:298
msgid "Default"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:603
+#: src/slic3r/GUI/GUI_App.cpp:635
msgid "&Configuration Snapshots"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:603
+#: src/slic3r/GUI/GUI_App.cpp:635
msgid "Inspect / activate configuration snapshots"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:604
+#: src/slic3r/GUI/GUI_App.cpp:636
msgid "Take Configuration &Snapshot"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:604
+#: src/slic3r/GUI/GUI_App.cpp:636
msgid "Capture a configuration snapshot"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:607
+#: src/slic3r/GUI/GUI_App.cpp:639
msgid "&Preferences"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:613
+#: src/slic3r/GUI/GUI_App.cpp:645
msgid "Application preferences"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:616 src/slic3r/GUI/wxExtensions.cpp:2446
+#: src/slic3r/GUI/GUI_App.cpp:648 src/slic3r/GUI/wxExtensions.cpp:2457
msgid "Simple"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:616
+#: src/slic3r/GUI/GUI_App.cpp:648
msgid "Simple View Mode"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:617 src/slic3r/GUI/GUI_ObjectList.cpp:73
+#: src/slic3r/GUI/GUI_App.cpp:649 src/slic3r/GUI/GUI_ObjectList.cpp:76
#: src/slic3r/GUI/Tab.cpp:977 src/slic3r/GUI/Tab.cpp:992
#: src/slic3r/GUI/Tab.cpp:1090 src/slic3r/GUI/Tab.cpp:1093
#: src/slic3r/GUI/Tab.cpp:1466 src/slic3r/GUI/Tab.cpp:1890
-#: src/slic3r/GUI/Tab.cpp:3347 src/slic3r/GUI/wxExtensions.cpp:2447
+#: src/slic3r/GUI/Tab.cpp:3349 src/slic3r/GUI/wxExtensions.cpp:2458
#: src/libslic3r/PrintConfig.cpp:72 src/libslic3r/PrintConfig.cpp:186
#: src/libslic3r/PrintConfig.cpp:349 src/libslic3r/PrintConfig.cpp:987
#: src/libslic3r/PrintConfig.cpp:2173
msgid "Advanced"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:617
+#: src/slic3r/GUI/GUI_App.cpp:649
msgid "Advanced View Mode"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:618 src/slic3r/GUI/wxExtensions.cpp:2448
+#: src/slic3r/GUI/GUI_App.cpp:650 src/slic3r/GUI/wxExtensions.cpp:2459
msgid "Expert"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:618
+#: src/slic3r/GUI/GUI_App.cpp:650
msgid "Expert View Mode"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:623
+#: src/slic3r/GUI/GUI_App.cpp:655
msgid "Mode"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:623
+#: src/slic3r/GUI/GUI_App.cpp:655
msgid "Slic3r View Mode"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:625
+#: src/slic3r/GUI/GUI_App.cpp:657
msgid "Change Application &Language"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:627
+#: src/slic3r/GUI/GUI_App.cpp:659
msgid "Flash printer &firmware"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:627
+#: src/slic3r/GUI/GUI_App.cpp:659
msgid "Upload a firmware image into an Arduino based printer"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:639
+#: src/slic3r/GUI/GUI_App.cpp:671
msgid "Taking configuration snapshot"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:639
+#: src/slic3r/GUI/GUI_App.cpp:671
msgid "Snapshot name"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:676
+#: src/slic3r/GUI/GUI_App.cpp:708
msgid "Application will be restarted after language change."
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:677
+#: src/slic3r/GUI/GUI_App.cpp:709
msgid "3D-Scene will be cleaned."
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:678
+#: src/slic3r/GUI/GUI_App.cpp:710
msgid "Please, check your changes before."
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:706
+#: src/slic3r/GUI/GUI_App.cpp:738
msgid "&Configuration"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:726
+#: src/slic3r/GUI/GUI_App.cpp:758
msgid "You have unsaved changes "
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:726
+#: src/slic3r/GUI/GUI_App.cpp:758
msgid ". Discard changes and continue anyway?"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:727
+#: src/slic3r/GUI/GUI_App.cpp:759
msgid "Unsaved Presets"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:28 src/slic3r/GUI/GUI_ObjectList.cpp:65
+#: src/slic3r/GUI/GUI_ObjectList.cpp:28 src/slic3r/GUI/GUI_ObjectList.cpp:68
#: src/libslic3r/PrintConfig.cpp:56 src/libslic3r/PrintConfig.cpp:149
#: src/libslic3r/PrintConfig.cpp:380 src/libslic3r/PrintConfig.cpp:437
#: src/libslic3r/PrintConfig.cpp:445 src/libslic3r/PrintConfig.cpp:841
@@ -996,8 +1019,8 @@ msgstr ""
msgid "Layers and Perimeters"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:29 src/slic3r/GUI/GUI_ObjectList.cpp:66
-#: src/slic3r/GUI/Plater.cpp:431 src/slic3r/GUI/Tab.cpp:981
+#: src/slic3r/GUI/GUI_ObjectList.cpp:29 src/slic3r/GUI/GUI_ObjectList.cpp:69
+#: src/slic3r/GUI/Plater.cpp:430 src/slic3r/GUI/Tab.cpp:981
#: src/slic3r/GUI/Tab.cpp:982 src/slic3r/GUI/Tab.cpp:1311
#: src/libslic3r/PrintConfig.cpp:166 src/libslic3r/PrintConfig.cpp:388
#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:742
@@ -1008,7 +1031,7 @@ msgstr ""
msgid "Infill"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:67
+#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:70
#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1010
#: src/slic3r/GUI/Tab.cpp:1011 src/libslic3r/PrintConfig.cpp:333
#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1779
@@ -1025,7 +1048,7 @@ msgstr ""
msgid "Support material"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:33 src/slic3r/GUI/GUI_ObjectList.cpp:69
+#: src/slic3r/GUI/GUI_ObjectList.cpp:33 src/slic3r/GUI/GUI_ObjectList.cpp:72
#: src/slic3r/GUI/Tab.cpp:1070 src/slic3r/GUI/Tab.cpp:1794
#: src/libslic3r/PrintConfig.cpp:455 src/libslic3r/PrintConfig.cpp:953
#: src/libslic3r/PrintConfig.cpp:1339 src/libslic3r/PrintConfig.cpp:1667
@@ -1038,7 +1061,7 @@ msgstr ""
msgid "Pad and Support"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:68 src/slic3r/GUI/GUI_Preview.cpp:215
+#: src/slic3r/GUI/GUI_ObjectList.cpp:71 src/slic3r/GUI/GUI_Preview.cpp:215
#: src/slic3r/GUI/Tab.cpp:1035 src/libslic3r/PrintConfig.cpp:198
#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:870
#: src/libslic3r/PrintConfig.cpp:998 src/libslic3r/PrintConfig.cpp:1360
@@ -1047,7 +1070,7 @@ msgstr ""
msgid "Speed"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:70 src/libslic3r/PrintConfig.cpp:415
+#: src/slic3r/GUI/GUI_ObjectList.cpp:73 src/libslic3r/PrintConfig.cpp:415
#: src/libslic3r/PrintConfig.cpp:522 src/libslic3r/PrintConfig.cpp:829
#: src/libslic3r/PrintConfig.cpp:961 src/libslic3r/PrintConfig.cpp:1348
#: src/libslic3r/PrintConfig.cpp:1687 src/libslic3r/PrintConfig.cpp:1860
@@ -1055,279 +1078,280 @@ msgstr ""
msgid "Extrusion Width"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:75 src/slic3r/GUI/Plater.cpp:410
-#: src/slic3r/GUI/Tab.cpp:3309 src/slic3r/GUI/Tab.cpp:3310
-#: src/libslic3r/PrintConfig.cpp:2359 src/libslic3r/PrintConfig.cpp:2366
-#: src/libslic3r/PrintConfig.cpp:2375 src/libslic3r/PrintConfig.cpp:2384
-#: src/libslic3r/PrintConfig.cpp:2394 src/libslic3r/PrintConfig.cpp:2420
-#: src/libslic3r/PrintConfig.cpp:2427 src/libslic3r/PrintConfig.cpp:2438
-#: src/libslic3r/PrintConfig.cpp:2448 src/libslic3r/PrintConfig.cpp:2457
-#: src/libslic3r/PrintConfig.cpp:2467 src/libslic3r/PrintConfig.cpp:2476
-#: src/libslic3r/PrintConfig.cpp:2486 src/libslic3r/PrintConfig.cpp:2496
-#: src/libslic3r/PrintConfig.cpp:2504
+#: src/slic3r/GUI/GUI_ObjectList.cpp:78 src/slic3r/GUI/Plater.cpp:409
+#: src/slic3r/GUI/Tab.cpp:3311 src/slic3r/GUI/Tab.cpp:3312
+#: src/libslic3r/PrintConfig.cpp:2361 src/libslic3r/PrintConfig.cpp:2368
+#: src/libslic3r/PrintConfig.cpp:2377 src/libslic3r/PrintConfig.cpp:2386
+#: src/libslic3r/PrintConfig.cpp:2396 src/libslic3r/PrintConfig.cpp:2422
+#: src/libslic3r/PrintConfig.cpp:2429 src/libslic3r/PrintConfig.cpp:2440
+#: src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2459
+#: src/libslic3r/PrintConfig.cpp:2469 src/libslic3r/PrintConfig.cpp:2478
+#: src/libslic3r/PrintConfig.cpp:2488 src/libslic3r/PrintConfig.cpp:2498
+#: src/libslic3r/PrintConfig.cpp:2506
msgid "Supports"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:76 src/slic3r/GUI/Tab.cpp:3337
-#: src/slic3r/GUI/Tab.cpp:3338 src/libslic3r/PrintConfig.cpp:2512
-#: src/libslic3r/PrintConfig.cpp:2519 src/libslic3r/PrintConfig.cpp:2530
-#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:2553
-#: src/libslic3r/PrintConfig.cpp:2562
+#: src/slic3r/GUI/GUI_ObjectList.cpp:79 src/slic3r/GUI/Tab.cpp:3339
+#: src/slic3r/GUI/Tab.cpp:3340 src/libslic3r/PrintConfig.cpp:2514
+#: src/libslic3r/PrintConfig.cpp:2521 src/libslic3r/PrintConfig.cpp:2535
+#: src/libslic3r/PrintConfig.cpp:2545 src/libslic3r/PrintConfig.cpp:2558
+#: src/libslic3r/PrintConfig.cpp:2567
msgid "Pad"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:173
+#: src/slic3r/GUI/GUI_ObjectList.cpp:176
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:45
msgid "Name"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:201
+#: src/slic3r/GUI/GUI_ObjectList.cpp:204
msgid "Right button click the icon to change the object settings"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:209
+#: src/slic3r/GUI/GUI_ObjectList.cpp:212
#, possible-c-format
msgid "Auto-repaired (%d errors):\n"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:212
+#: src/slic3r/GUI/GUI_ObjectList.cpp:215
msgid "degenerate facets"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:213
+#: src/slic3r/GUI/GUI_ObjectList.cpp:216
msgid "edges fixed"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:214
+#: src/slic3r/GUI/GUI_ObjectList.cpp:217
msgid "facets removed"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:215
+#: src/slic3r/GUI/GUI_ObjectList.cpp:218
msgid "facets added"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:216
+#: src/slic3r/GUI/GUI_ObjectList.cpp:219
msgid "facets reversed"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:217
+#: src/slic3r/GUI/GUI_ObjectList.cpp:220
msgid "backwards edges"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:231
+#: src/slic3r/GUI/GUI_ObjectList.cpp:234
msgid "Right button click the icon to fix STL through Netfabb"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1430
+#: src/slic3r/GUI/GUI_ObjectList.cpp:281 src/slic3r/GUI/Tab.cpp:1430
#: src/libslic3r/PrintConfig.cpp:454
msgid "Extruder"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:683 src/slic3r/GUI/GUI_ObjectList.cpp:963
-#: src/slic3r/GUI/GUI_ObjectList.cpp:969 src/slic3r/GUI/GUI_ObjectList.cpp:1199
+#: src/slic3r/GUI/GUI_ObjectList.cpp:751 src/slic3r/GUI/GUI_ObjectList.cpp:1031
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1037
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1267
#, possible-c-format
msgid "Quick Add Settings (%s)"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:746
+#: src/slic3r/GUI/GUI_ObjectList.cpp:814
msgid "Select showing settings"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:874
+#: src/slic3r/GUI/GUI_ObjectList.cpp:942
msgid "Load"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:879 src/slic3r/GUI/GUI_ObjectList.cpp:911
-#: src/slic3r/GUI/GUI_ObjectList.cpp:914
+#: src/slic3r/GUI/GUI_ObjectList.cpp:947 src/slic3r/GUI/GUI_ObjectList.cpp:979
+#: src/slic3r/GUI/GUI_ObjectList.cpp:982
msgid "Box"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:879
+#: src/slic3r/GUI/GUI_ObjectList.cpp:947
msgid "Cylinder"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:879
+#: src/slic3r/GUI/GUI_ObjectList.cpp:947
msgid "Sphere"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:879
+#: src/slic3r/GUI/GUI_ObjectList.cpp:947
msgid "Slab"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:890 src/slic3r/GUI/GUI_ObjectList.cpp:906
+#: src/slic3r/GUI/GUI_ObjectList.cpp:958 src/slic3r/GUI/GUI_ObjectList.cpp:974
msgid "Add part"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:891
+#: src/slic3r/GUI/GUI_ObjectList.cpp:959
msgid "Add modifier"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:892 src/slic3r/GUI/GUI_ObjectList.cpp:910
+#: src/slic3r/GUI/GUI_ObjectList.cpp:960 src/slic3r/GUI/GUI_ObjectList.cpp:978
msgid "Add support enforcer"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:893 src/slic3r/GUI/GUI_ObjectList.cpp:913
+#: src/slic3r/GUI/GUI_ObjectList.cpp:961 src/slic3r/GUI/GUI_ObjectList.cpp:981
msgid "Add support blocker"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:934
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1002
msgid "Split to parts"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:942
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1010
msgid "Add settings"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1009
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1077
msgid "Change type"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1016
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1153
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1084
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1221
msgid "Set as a Separated Object"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1024
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1092
msgid "Rename"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1034
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1102
msgid "Fix through the Netfabb"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1041 src/slic3r/GUI/Plater.cpp:2861
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1109 src/slic3r/GUI/Plater.cpp:2883
msgid "Export as STL"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1048
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1116
msgid "Change extruder"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1073
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1141
msgid "Select new extruder for the object/part"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1079 src/slic3r/GUI/Plater.cpp:2825
-#: src/slic3r/GUI/Plater.cpp:2843 src/slic3r/GUI/Tab.cpp:2860
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1147 src/slic3r/GUI/Plater.cpp:2847
+#: src/slic3r/GUI/Plater.cpp:2865 src/slic3r/GUI/Tab.cpp:2861
msgid "Delete"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1153
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1221
msgid "Set as a Separated Objects"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1374
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1442
msgid "Generic"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1516
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1582
msgid "You can't delete the last solid part from object."
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1533
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1599
msgid "You can't delete the last intance from object."
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1560 src/slic3r/GUI/Plater.cpp:2219
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1626 src/slic3r/GUI/Plater.cpp:2235
msgid ""
"The selected object couldn't be split because it contains only one part."
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1676
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1742
msgid "Group manipulation"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1688
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1754
msgid "Object manipulation"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1698
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1764
msgid "Object Settings to modify"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1702
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1768
msgid "Part Settings to modify"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1711
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1777
msgid "Part manipulation"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1717
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1783
msgid "Instance manipulation"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2240
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2307
msgid "Object or Instance"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2240
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2307
msgid "Part"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2242
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2309
msgid "Unsupported selection"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2243
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2310
#, possible-c-format
msgid "You started your selection with %s Item."
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2244
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2311
#, possible-c-format
msgid "In this mode you can select only other %s Items%s"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2247
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2314
msgid "of a current Object"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2252
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2325 src/slic3r/GUI/Plater.cpp:117
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2319
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2392 src/slic3r/GUI/Plater.cpp:117
msgid "Info"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2366
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2433
msgid "You can't change a type of the last solid part of the object."
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2373
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2440
msgid "Select type of part"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2538
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2605
msgid "Enter new name"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2538
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2605
msgid "Renaming"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2554
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2632 src/slic3r/GUI/Tab.cpp:3191
-#: src/slic3r/GUI/Tab.cpp:3195
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2621
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2699 src/slic3r/GUI/Tab.cpp:3192
+#: src/slic3r/GUI/Tab.cpp:3196
msgid "The supplied name is not valid;"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2555
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2633 src/slic3r/GUI/Tab.cpp:3192
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2622
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2700 src/slic3r/GUI/Tab.cpp:3193
msgid "the following characters are not allowed:"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2653
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2720
msgid "Set extruder for selected items"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2654
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2721
msgid "Select extruder number for selected objects and/or parts"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2667
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2734
msgid "Select extruder number:"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2668
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2735
msgid "This extruder will be set for selected items"
msgstr ""
@@ -1352,7 +1376,7 @@ msgstr ""
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:117
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221
-#: src/libslic3r/PrintConfig.cpp:3070
+#: src/libslic3r/PrintConfig.cpp:3075
msgid "Scale"
msgstr ""
@@ -1362,7 +1386,7 @@ msgstr ""
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:200
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:220
-#: src/libslic3r/PrintConfig.cpp:3055
+#: src/libslic3r/PrintConfig.cpp:3060
msgid "Rotate"
msgstr ""
@@ -1480,8 +1504,8 @@ msgstr ""
msgid "Shells"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:13
-msgid "Slic3r Prusa Edition - Keyboard Shortcuts"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:491
+msgid "Keyboard Shortcuts"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:100
@@ -1496,8 +1520,8 @@ msgstr ""
msgid "Load Config from .ini/amf/3mf/gcode"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 src/slic3r/GUI/Plater.cpp:725
-#: src/slic3r/GUI/Plater.cpp:3673 src/libslic3r/PrintConfig.cpp:2957
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 src/slic3r/GUI/Plater.cpp:724
+#: src/slic3r/GUI/Plater.cpp:3704 src/libslic3r/PrintConfig.cpp:2962
msgid "Export G-code"
msgstr ""
@@ -1599,127 +1623,135 @@ msgid "Delete All"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
-msgid "Gizmo move"
+msgid "Copy to clipboard"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:135
-msgid "Gizmo scale"
+msgid "Paste from clipboard"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
-msgid "Gizmo rotate"
+msgid "Gizmo move"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
-msgid "Gizmo cut"
+msgid "Gizmo scale"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
-msgid "Gizmo Place face on bed"
+msgid "Gizmo rotate"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:139
-msgid "Gizmo SLA support points"
+msgid "Gizmo cut"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
-#, no-c-format
+msgid "Gizmo Place face on bed"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
+msgid "Gizmo SLA support points"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:142
+#, possible-c-format
msgid ""
"Press to snap by 5% in Gizmo scale\n"
"or by 1mm in Gizmo move"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:143
msgid ""
"Press to scale or rotate selected objects\n"
"around their own center"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:142
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:144
msgid "Zoom to Bed"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:143
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:145
msgid "Zoom to all objects in scene, if none selected"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:144
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:146
msgid "Zoom to selected object"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:145
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:147
msgid "Zoom in"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:146
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:148
msgid "Zoom out"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:147
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:149
msgid "Unselect gizmo, keep object selection"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:149
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:151
msgid "Plater Shortcuts"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
msgid "Arrow Up"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
msgid "Upper Layer"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
msgid "Arrow Down"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
msgid "Lower Layer"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
msgid "Preview Shortcuts"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
-msgid "Move current slider thump Up"
-msgstr ""
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
-msgid "Move current slider thump Down"
-msgstr ""
-
#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
-msgid "Arrow Left"
-msgstr ""
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
-msgid "Set upper thumb to current slider thumb"
+msgid "Move current slider thumb Up"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
-msgid "Arrow Right"
-msgstr ""
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
-msgid "Set lower thumb to current slider thumb"
+msgid "Move current slider thumb Down"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
-msgid "Add color change marker for current layer"
+msgid "Arrow Left"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "Set upper thumb to current slider thumb"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
-msgid "Delete color change marker for current layer"
+msgid "Arrow Right"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+msgid "Set lower thumb to current slider thumb"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:181
+msgid "Add color change marker for current layer"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
+msgid "Delete color change marker for current layer"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:184
msgid "Layers Slider Shortcuts"
msgstr ""
@@ -1904,311 +1936,315 @@ msgstr ""
msgid "Deletes all objects"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:392
+#: src/slic3r/GUI/MainFrame.cpp:384
+msgid "&Copy"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:384
+msgid "Copy selection to clipboard"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:386
+msgid "&Paste"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:386
+msgid "Paste clipboard"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:401
msgid "&Plater Tab"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:392
+#: src/slic3r/GUI/MainFrame.cpp:401
msgid "Show the plater"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:399
+#: src/slic3r/GUI/MainFrame.cpp:408
msgid "P&rint Settings Tab"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:399
+#: src/slic3r/GUI/MainFrame.cpp:408
msgid "Show the print settings"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:401
+#: src/slic3r/GUI/MainFrame.cpp:410
msgid "&Filament Settings Tab"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:401
+#: src/slic3r/GUI/MainFrame.cpp:410
msgid "Show the filament settings"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:403
+#: src/slic3r/GUI/MainFrame.cpp:412
msgid "Print&er Settings Tab"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:403
+#: src/slic3r/GUI/MainFrame.cpp:412
msgid "Show the printer settings"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:407
+#: src/slic3r/GUI/MainFrame.cpp:416
msgid "3&D"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:407
+#: src/slic3r/GUI/MainFrame.cpp:416
msgid "Show the 3D editing view"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:409
+#: src/slic3r/GUI/MainFrame.cpp:418
msgid "Pre&view"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:409
+#: src/slic3r/GUI/MainFrame.cpp:418
msgid "Show the 3D slices preview"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:430
+#: src/slic3r/GUI/MainFrame.cpp:439
msgid "Print &Host Upload Queue"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:430
+#: src/slic3r/GUI/MainFrame.cpp:439
msgid "Display the Print Host Upload Queue window"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:439
+#: src/slic3r/GUI/MainFrame.cpp:448
msgid "Iso"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:439
+#: src/slic3r/GUI/MainFrame.cpp:448
msgid "Iso View"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:441
+#: src/slic3r/GUI/MainFrame.cpp:450 src/libslic3r/PrintConfig.cpp:2041
msgid "Top"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2041
-msgctxt "Layers"
-msgid "Top"
-msgstr ""
-
-#: src/slic3r/GUI/MainFrame.cpp:441
+#: src/slic3r/GUI/MainFrame.cpp:450
msgid "Top View"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:442
+#: src/slic3r/GUI/MainFrame.cpp:451 src/libslic3r/PrintConfig.cpp:148
msgid "Bottom"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:148
-msgctxt "Layers"
-msgid "Bottom"
-msgstr ""
-
-#: src/slic3r/GUI/MainFrame.cpp:442
+#: src/slic3r/GUI/MainFrame.cpp:451
msgid "Bottom View"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:443
+#: src/slic3r/GUI/MainFrame.cpp:452
msgid "Front"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:443
+#: src/slic3r/GUI/MainFrame.cpp:452
msgid "Front View"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:444 src/libslic3r/PrintConfig.cpp:1561
+#: src/slic3r/GUI/MainFrame.cpp:453 src/libslic3r/PrintConfig.cpp:1561
msgid "Rear"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:444
+#: src/slic3r/GUI/MainFrame.cpp:453
msgid "Rear View"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:445
+#: src/slic3r/GUI/MainFrame.cpp:454
msgid "Left"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:445
+#: src/slic3r/GUI/MainFrame.cpp:454
msgid "Left View"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:446
+#: src/slic3r/GUI/MainFrame.cpp:455
msgid "Right"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:446
+#: src/slic3r/GUI/MainFrame.cpp:455
msgid "Right View"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:460
+#: src/slic3r/GUI/MainFrame.cpp:469
msgid "Prusa 3D &Drivers"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:460
+#: src/slic3r/GUI/MainFrame.cpp:469
msgid "Open the Prusa3D drivers download page in your browser"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:462
+#: src/slic3r/GUI/MainFrame.cpp:471
msgid "Prusa Edition &Releases"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:462
+#: src/slic3r/GUI/MainFrame.cpp:471
msgid "Open the Prusa Edition releases page in your browser"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:468
+#: src/slic3r/GUI/MainFrame.cpp:477
msgid "Slic3r &Website"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:468
+#: src/slic3r/GUI/MainFrame.cpp:477
msgid "Open the Slic3r website in your browser"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:470
+#: src/slic3r/GUI/MainFrame.cpp:479
msgid "Slic3r &Manual"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:470
+#: src/slic3r/GUI/MainFrame.cpp:479
msgid "Open the Slic3r manual in your browser"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:473
+#: src/slic3r/GUI/MainFrame.cpp:482
msgid "System &Info"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:473
+#: src/slic3r/GUI/MainFrame.cpp:482
msgid "Show system information"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:475
+#: src/slic3r/GUI/MainFrame.cpp:484
msgid "Show &Configuration Folder"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:475
+#: src/slic3r/GUI/MainFrame.cpp:484
msgid "Show user configuration folder (datadir)"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:477
+#: src/slic3r/GUI/MainFrame.cpp:486
msgid "Report an I&ssue"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:477
-msgid "Report an issue on the Slic3r Prusa Edition"
+#: src/slic3r/GUI/MainFrame.cpp:486
+#, possible-c-format
+msgid "Report an issue on %s"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:479
-msgid "&About Slic3r"
+#: src/slic3r/GUI/MainFrame.cpp:488
+#, possible-c-format
+msgid "&About %s"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:479
+#: src/slic3r/GUI/MainFrame.cpp:488
msgid "Show about dialog"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:482
-msgid "Keyboard Shortcuts"
-msgstr ""
-
-#: src/slic3r/GUI/MainFrame.cpp:482
+#: src/slic3r/GUI/MainFrame.cpp:491
msgid "Show the list of the keyboard shortcuts"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:490
+#: src/slic3r/GUI/MainFrame.cpp:499
msgid "&File"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:491
+#: src/slic3r/GUI/MainFrame.cpp:500
msgid "&Edit"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:501
msgid "&Window"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:493
+#: src/slic3r/GUI/MainFrame.cpp:502
msgid "&View"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:496
+#: src/slic3r/GUI/MainFrame.cpp:505
msgid "&Help"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:524
+#: src/slic3r/GUI/MainFrame.cpp:533
msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:538
+#: src/slic3r/GUI/MainFrame.cpp:547
msgid "No previously sliced file."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:539 src/slic3r/GUI/PrintHostDialogs.cpp:219
+#: src/slic3r/GUI/MainFrame.cpp:548 src/slic3r/GUI/PrintHostDialogs.cpp:219
msgid "Error"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:544
+#: src/slic3r/GUI/MainFrame.cpp:553
msgid "Previously sliced file ("
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:544
+#: src/slic3r/GUI/MainFrame.cpp:553
msgid ") not found."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:545
+#: src/slic3r/GUI/MainFrame.cpp:554
msgid "File Not Found"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:580 src/slic3r/GUI/Tab.cpp:3152
+#: src/slic3r/GUI/MainFrame.cpp:589 src/slic3r/GUI/Tab.cpp:3153
msgid "Save "
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:580
+#: src/slic3r/GUI/MainFrame.cpp:589
msgid "SVG"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:580
+#: src/slic3r/GUI/MainFrame.cpp:589
msgid "G-code"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:580
+#: src/slic3r/GUI/MainFrame.cpp:589
msgid " file as:"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:595
+#: src/slic3r/GUI/MainFrame.cpp:604
msgid "Save zip file as:"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:607 src/slic3r/GUI/Plater.cpp:2352
-#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Tab.cpp:1110
-#: src/slic3r/GUI/Tab.cpp:3348
+#: src/slic3r/GUI/MainFrame.cpp:616 src/slic3r/GUI/Plater.cpp:2368
+#: src/slic3r/GUI/Plater.cpp:3498 src/slic3r/GUI/Tab.cpp:1110
+#: src/slic3r/GUI/Tab.cpp:3350
msgid "Slicing"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:607
+#: src/slic3r/GUI/MainFrame.cpp:616
msgid "Processing "
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:630
+#: src/slic3r/GUI/MainFrame.cpp:639
msgid " was successfully sliced."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:632
+#: src/slic3r/GUI/MainFrame.cpp:641
msgid "Slicing Done!"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:647
+#: src/slic3r/GUI/MainFrame.cpp:656
msgid "Select the STL file to repair:"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:661
+#: src/slic3r/GUI/MainFrame.cpp:669
msgid "Save OBJ file (less prone to coordinate errors than STL) as:"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:676
+#: src/slic3r/GUI/MainFrame.cpp:684
msgid "Your file was repaired."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:676 src/libslic3r/PrintConfig.cpp:3051
+#: src/slic3r/GUI/MainFrame.cpp:684 src/libslic3r/PrintConfig.cpp:3056
msgid "Repair"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:690
+#: src/slic3r/GUI/MainFrame.cpp:698
msgid "Save configuration as:"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:710 src/slic3r/GUI/MainFrame.cpp:774
+#: src/slic3r/GUI/MainFrame.cpp:718 src/slic3r/GUI/MainFrame.cpp:782
msgid "Select configuration to load:"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:747
+#: src/slic3r/GUI/MainFrame.cpp:755
msgid "Save presets bundle as:"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:798
+#: src/slic3r/GUI/MainFrame.cpp:806
#, possible-c-format
msgid "%d presets successfully imported."
msgstr ""
@@ -2237,98 +2273,98 @@ msgstr ""
msgid "Manifold"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:188
+#: src/slic3r/GUI/Plater.cpp:187
msgid "Sliced Info"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:207 src/slic3r/GUI/Plater.cpp:998
+#: src/slic3r/GUI/Plater.cpp:206 src/slic3r/GUI/Plater.cpp:998
msgid "Used Filament (m)"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:208
+#: src/slic3r/GUI/Plater.cpp:207
msgid "Used Filament (mm³)"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:209
+#: src/slic3r/GUI/Plater.cpp:208
msgid "Used Filament (g)"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:210
+#: src/slic3r/GUI/Plater.cpp:209
msgid "Used Material (unit)"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:211 src/slic3r/GUI/Plater.cpp:1013
+#: src/slic3r/GUI/Plater.cpp:210 src/slic3r/GUI/Plater.cpp:1013
#: src/libslic3r/PrintConfig.cpp:716
msgid "Cost"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:212 src/slic3r/GUI/Plater.cpp:985
+#: src/slic3r/GUI/Plater.cpp:211 src/slic3r/GUI/Plater.cpp:985
#: src/slic3r/GUI/Plater.cpp:1027
msgid "Estimated printing time"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:213
+#: src/slic3r/GUI/Plater.cpp:212
msgid "Number of tool changes"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:290
+#: src/slic3r/GUI/Plater.cpp:289
msgid "Click to edit preset"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:413
+#: src/slic3r/GUI/Plater.cpp:412
msgid "Select what kind of support do you need"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:415 src/libslic3r/PrintConfig.cpp:1814
-#: src/libslic3r/PrintConfig.cpp:2419
+#: src/slic3r/GUI/Plater.cpp:414 src/libslic3r/PrintConfig.cpp:1814
+#: src/libslic3r/PrintConfig.cpp:2421
msgid "Support on build plate only"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:416
+#: src/slic3r/GUI/Plater.cpp:415
msgid "Everywhere"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:438 src/slic3r/GUI/Tab.cpp:1007
+#: src/slic3r/GUI/Plater.cpp:437 src/slic3r/GUI/Tab.cpp:1007
msgid "Brim"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:440
+#: src/slic3r/GUI/Plater.cpp:439
msgid ""
"This flag enables the brim that will be printed around each object on the "
"first layer."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:448
+#: src/slic3r/GUI/Plater.cpp:447
msgid "Purging volumes"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:673
+#: src/slic3r/GUI/Plater.cpp:672
msgid "Print settings"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:674 src/slic3r/GUI/Tab.cpp:1421
+#: src/slic3r/GUI/Plater.cpp:673 src/slic3r/GUI/Tab.cpp:1421
#: src/slic3r/GUI/Tab.cpp:1422
msgid "Filament"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:675 src/slic3r/GUI/Preset.cpp:1252
+#: src/slic3r/GUI/Plater.cpp:674 src/slic3r/GUI/Preset.cpp:1254
msgid "SLA print"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:676 src/slic3r/GUI/Preset.cpp:1253
+#: src/slic3r/GUI/Plater.cpp:675 src/slic3r/GUI/Preset.cpp:1255
msgid "SLA material"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:677
+#: src/slic3r/GUI/Plater.cpp:676
msgid "Printer"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:707 src/slic3r/GUI/Plater.cpp:3674
+#: src/slic3r/GUI/Plater.cpp:706 src/slic3r/GUI/Plater.cpp:3705
msgid "Send to printer"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:727 src/slic3r/GUI/Plater.cpp:2352
-#: src/slic3r/GUI/Plater.cpp:3470
+#: src/slic3r/GUI/Plater.cpp:726 src/slic3r/GUI/Plater.cpp:2368
+#: src/slic3r/GUI/Plater.cpp:3501
msgid "Slice now"
msgstr ""
@@ -2385,278 +2421,278 @@ msgstr ""
msgid "silent mode"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1544
+#: src/slic3r/GUI/Plater.cpp:1546
msgid "Loading"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1554
+#: src/slic3r/GUI/Plater.cpp:1556
#, possible-c-format
msgid "Processing input file %s\n"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1612
+#: src/slic3r/GUI/Plater.cpp:1614
msgid ""
"This file contains several objects positioned at multiple heights. Instead "
"of considering them as multiple objects, should I consider\n"
"this file as a single object having multiple parts?\n"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1615 src/slic3r/GUI/Plater.cpp:1707
+#: src/slic3r/GUI/Plater.cpp:1617 src/slic3r/GUI/Plater.cpp:1725
msgid "Multi-part object detected"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1650
+#: src/slic3r/GUI/Plater.cpp:1668
msgid ""
-"This file cannot be loaded in simple mode. Do you want to switch to expert "
-"mode?\n"
+"This file cannot be loaded in a simple mode. Do you want to switch to an "
+"advanced mode?\n"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1651
+#: src/slic3r/GUI/Plater.cpp:1669
msgid "Detected advanced data"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1684
+#: src/slic3r/GUI/Plater.cpp:1702
#, 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:1704
+#: src/slic3r/GUI/Plater.cpp:1722
msgid ""
"Multiple objects were loaded for a multi-material printer.\n"
"Instead of considering them as multiple objects, should I consider\n"
"these files to represent a single object having multiple parts?\n"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1720
+#: src/slic3r/GUI/Plater.cpp:1738
msgid "Loaded"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1812
+#: src/slic3r/GUI/Plater.cpp:1830
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:1813
+#: src/slic3r/GUI/Plater.cpp:1831
msgid "Object too large?"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1863
+#: src/slic3r/GUI/Plater.cpp:1881
msgid "Export STL file:"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1870
+#: src/slic3r/GUI/Plater.cpp:1888
msgid "Export AMF file:"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1876
+#: src/slic3r/GUI/Plater.cpp:1894
msgid "Save file as:"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2042
+#: src/slic3r/GUI/Plater.cpp:2059
msgid "Arranging canceled"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2045
+#: src/slic3r/GUI/Plater.cpp:2062
msgid "Arranging"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2079
+#: src/slic3r/GUI/Plater.cpp:2096
msgid "Could not arrange model objects! Some geometries may be invalid."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2083
+#: src/slic3r/GUI/Plater.cpp:2100
msgid "Arranging done."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2124
+#: src/slic3r/GUI/Plater.cpp:2141
msgid "Orientation search canceled"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2129
+#: src/slic3r/GUI/Plater.cpp:2146
msgid "Searching for optimal orientation"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2190
+#: src/slic3r/GUI/Plater.cpp:2207
msgid "Orientation found."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2211
+#: src/slic3r/GUI/Plater.cpp:2227
msgid ""
"The selected object can't be split because it contains more than one volume/"
"material."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2337
+#: src/slic3r/GUI/Plater.cpp:2353
msgid "Invalid data"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2346
+#: src/slic3r/GUI/Plater.cpp:2362
msgid "Ready to slice"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2379 src/slic3r/GUI/PrintHostDialogs.cpp:220
+#: src/slic3r/GUI/Plater.cpp:2400 src/slic3r/GUI/PrintHostDialogs.cpp:220
msgid "Cancelling"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2396
+#: src/slic3r/GUI/Plater.cpp:2417
msgid "Another export job is currently running."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2656
+#: src/slic3r/GUI/Plater.cpp:2678
msgid "Export failed"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2661 src/slic3r/GUI/PrintHostDialogs.cpp:221
+#: src/slic3r/GUI/Plater.cpp:2683 src/slic3r/GUI/PrintHostDialogs.cpp:221
msgid "Cancelled"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2747 src/slic3r/GUI/Plater.cpp:2759
-#: src/slic3r/GUI/Plater.cpp:2831
+#: src/slic3r/GUI/Plater.cpp:2769 src/slic3r/GUI/Plater.cpp:2781
+#: src/slic3r/GUI/Plater.cpp:2853
msgid "Increase copies"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2825 src/slic3r/GUI/Plater.cpp:2843
+#: src/slic3r/GUI/Plater.cpp:2847 src/slic3r/GUI/Plater.cpp:2865
msgid "Remove the selected object"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2831
+#: src/slic3r/GUI/Plater.cpp:2853
msgid "Place one more copy of the selected object"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2833
+#: src/slic3r/GUI/Plater.cpp:2855
msgid "Decrease copies"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2833
+#: src/slic3r/GUI/Plater.cpp:2855
msgid "Remove one copy of the selected object"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2835
+#: src/slic3r/GUI/Plater.cpp:2857
msgid "Set number of copies"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2835
+#: src/slic3r/GUI/Plater.cpp:2857
msgid "Change the number of copies of the selected object"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2858
+#: src/slic3r/GUI/Plater.cpp:2880
msgid "Reload from Disk"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2858
+#: src/slic3r/GUI/Plater.cpp:2880
msgid "Reload the selected file from Disk"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2861
+#: src/slic3r/GUI/Plater.cpp:2883
msgid "Export the selected object as STL file"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2873
+#: src/slic3r/GUI/Plater.cpp:2895
msgid "Along X axis"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2873
+#: src/slic3r/GUI/Plater.cpp:2895
msgid "Mirror the selected object along the X axis"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2875
+#: src/slic3r/GUI/Plater.cpp:2897
msgid "Along Y axis"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2875
+#: src/slic3r/GUI/Plater.cpp:2897
msgid "Mirror the selected object along the Y axis"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2877
+#: src/slic3r/GUI/Plater.cpp:2899
msgid "Along Z axis"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2877
+#: src/slic3r/GUI/Plater.cpp:2899
msgid "Mirror the selected object along the Z axis"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2880
+#: src/slic3r/GUI/Plater.cpp:2902
msgid "Mirror"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2880
+#: src/slic3r/GUI/Plater.cpp:2902
msgid "Mirror the selected object"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2898
+#: src/slic3r/GUI/Plater.cpp:2920
msgid "To objects"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2898 src/slic3r/GUI/Plater.cpp:2920
+#: src/slic3r/GUI/Plater.cpp:2920 src/slic3r/GUI/Plater.cpp:2942
msgid "Split the selected object into individual objects"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2900
+#: src/slic3r/GUI/Plater.cpp:2922
msgid "To parts"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2900 src/slic3r/GUI/Plater.cpp:2940
+#: src/slic3r/GUI/Plater.cpp:2922 src/slic3r/GUI/Plater.cpp:2962
msgid "Split the selected object into individual sub-parts"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2903 src/slic3r/GUI/Plater.cpp:2920
-#: src/slic3r/GUI/Plater.cpp:2940 src/libslic3r/PrintConfig.cpp:3075
+#: src/slic3r/GUI/Plater.cpp:2925 src/slic3r/GUI/Plater.cpp:2942
+#: src/slic3r/GUI/Plater.cpp:2962 src/libslic3r/PrintConfig.cpp:3080
msgid "Split"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2903
+#: src/slic3r/GUI/Plater.cpp:2925
msgid "Split the selected object"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2926
+#: src/slic3r/GUI/Plater.cpp:2948
msgid "Optimize orientation"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2926
+#: src/slic3r/GUI/Plater.cpp:2948
msgid "Optimize the rotation of the object for better print results."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3342
+#: src/slic3r/GUI/Plater.cpp:3373
msgid "Save G-code file as:"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3342
+#: src/slic3r/GUI/Plater.cpp:3373
msgid "Save SL1 file as:"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3397
+#: src/slic3r/GUI/Plater.cpp:3428
#, possible-c-format
msgid "STL file exported to %s"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3413
+#: src/slic3r/GUI/Plater.cpp:3444
#, possible-c-format
msgid "AMF file exported to %s"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3416
+#: src/slic3r/GUI/Plater.cpp:3447
#, possible-c-format
msgid "Error exporting AMF file %s"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3442
+#: src/slic3r/GUI/Plater.cpp:3473
#, possible-c-format
msgid "3MF file exported to %s"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3445
+#: src/slic3r/GUI/Plater.cpp:3476
#, possible-c-format
msgid "Error exporting 3MF file %s"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3673
+#: src/slic3r/GUI/Plater.cpp:3704
msgid "Export"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3674
+#: src/slic3r/GUI/Plater.cpp:3705
msgid "Send G-code"
msgstr ""
@@ -2695,6 +2731,10 @@ msgid ""
"loaded in order to save time when exporting G-code."
msgstr ""
+#: src/slic3r/GUI/Preferences.cpp:61
+msgid "If enabled, Slic3r checks for new versions of "
+msgstr ""
+
#: src/slic3r/GUI/Preferences.cpp:74
msgid "Suppress \" - default - \" presets"
msgstr ""
@@ -2744,22 +2784,22 @@ msgstr ""
msgid "modified"
msgstr ""
-#: src/slic3r/GUI/Preset.cpp:918 src/slic3r/GUI/Preset.cpp:958
-#: src/slic3r/GUI/Preset.cpp:1011 src/slic3r/GUI/Preset.cpp:1043
-#: src/slic3r/GUI/PresetBundle.cpp:1484 src/slic3r/GUI/PresetBundle.cpp:1537
+#: src/slic3r/GUI/Preset.cpp:920 src/slic3r/GUI/Preset.cpp:960
+#: src/slic3r/GUI/Preset.cpp:1013 src/slic3r/GUI/Preset.cpp:1045
+#: src/slic3r/GUI/PresetBundle.cpp:1470 src/slic3r/GUI/PresetBundle.cpp:1523
msgid "System presets"
msgstr ""
-#: src/slic3r/GUI/Preset.cpp:962 src/slic3r/GUI/Preset.cpp:1047
-#: src/slic3r/GUI/PresetBundle.cpp:1542
+#: src/slic3r/GUI/Preset.cpp:964 src/slic3r/GUI/Preset.cpp:1049
+#: src/slic3r/GUI/PresetBundle.cpp:1528
msgid "User presets"
msgstr ""
-#: src/slic3r/GUI/Preset.cpp:991 src/slic3r/GUI/Tab.cpp:247
+#: src/slic3r/GUI/Preset.cpp:993 src/slic3r/GUI/Tab.cpp:247
msgid "Add a new printer"
msgstr ""
-#: src/slic3r/GUI/Preset.cpp:1251
+#: src/slic3r/GUI/Preset.cpp:1253
msgid "filament"
msgstr ""
@@ -2942,7 +2982,7 @@ msgstr ""
#: src/slic3r/GUI/WipeTowerDialog.cpp:82 src/libslic3r/PrintConfig.cpp:611
#: src/libslic3r/PrintConfig.cpp:655 src/libslic3r/PrintConfig.cpp:670
#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2250
-#: src/libslic3r/PrintConfig.cpp:2308 src/libslic3r/PrintConfig.cpp:2315
+#: src/libslic3r/PrintConfig.cpp:2310 src/libslic3r/PrintConfig.cpp:2317
msgid "s"
msgstr ""
@@ -2951,7 +2991,7 @@ msgid "Volumetric speed"
msgstr ""
#: src/slic3r/GUI/SysInfoDialog.cpp:44
-msgid "Slic3r Prusa Edition - System Information"
+msgid "System Information"
msgstr ""
#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:228
@@ -3033,7 +3073,7 @@ msgstr ""
msgid "default SLA print profile"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:948 src/slic3r/GUI/Tab.cpp:3303
+#: src/slic3r/GUI/Tab.cpp:948 src/slic3r/GUI/Tab.cpp:3305
msgid "Layers and perimeters"
msgstr ""
@@ -3117,7 +3157,7 @@ msgstr ""
msgid "Other"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1119 src/slic3r/GUI/Tab.cpp:3351
+#: src/slic3r/GUI/Tab.cpp:1119 src/slic3r/GUI/Tab.cpp:3353
msgid "Output options"
msgstr ""
@@ -3129,7 +3169,7 @@ msgstr ""
msgid "Extruder clearance (mm)"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1131 src/slic3r/GUI/Tab.cpp:3352
+#: src/slic3r/GUI/Tab.cpp:1131 src/slic3r/GUI/Tab.cpp:3354
msgid "Output file"
msgstr ""
@@ -3140,25 +3180,25 @@ msgstr ""
#: src/slic3r/GUI/Tab.cpp:1144 src/slic3r/GUI/Tab.cpp:1145
#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1528
#: src/slic3r/GUI/Tab.cpp:1935 src/slic3r/GUI/Tab.cpp:1936
-#: src/slic3r/GUI/Tab.cpp:2027 src/slic3r/GUI/Tab.cpp:2028
-#: src/slic3r/GUI/Tab.cpp:3240 src/slic3r/GUI/Tab.cpp:3241
+#: src/slic3r/GUI/Tab.cpp:2028 src/slic3r/GUI/Tab.cpp:2029
+#: src/slic3r/GUI/Tab.cpp:3242 src/slic3r/GUI/Tab.cpp:3243
msgid "Notes"
msgstr ""
#: src/slic3r/GUI/Tab.cpp:1151 src/slic3r/GUI/Tab.cpp:1535
-#: src/slic3r/GUI/Tab.cpp:1942 src/slic3r/GUI/Tab.cpp:2034
-#: src/slic3r/GUI/Tab.cpp:3248 src/slic3r/GUI/Tab.cpp:3357
+#: src/slic3r/GUI/Tab.cpp:1942 src/slic3r/GUI/Tab.cpp:2035
+#: src/slic3r/GUI/Tab.cpp:3250 src/slic3r/GUI/Tab.cpp:3359
msgid "Dependencies"
msgstr ""
#: src/slic3r/GUI/Tab.cpp:1152 src/slic3r/GUI/Tab.cpp:1536
-#: src/slic3r/GUI/Tab.cpp:1943 src/slic3r/GUI/Tab.cpp:2035
-#: src/slic3r/GUI/Tab.cpp:3249 src/slic3r/GUI/Tab.cpp:3358
+#: src/slic3r/GUI/Tab.cpp:1943 src/slic3r/GUI/Tab.cpp:2036
+#: src/slic3r/GUI/Tab.cpp:3251 src/slic3r/GUI/Tab.cpp:3360
msgid "Profile dependencies"
msgstr ""
#: src/slic3r/GUI/Tab.cpp:1198
-#, no-c-format
+#, possible-c-format
msgid ""
"The Spiral Vase mode requires:\n"
"- one perimeter\n"
@@ -3214,7 +3254,7 @@ msgid "The "
msgstr ""
#: src/slic3r/GUI/Tab.cpp:1309
-#, no-c-format
+#, possible-c-format
msgid ""
" infill pattern is not supposed to work at 100% density.\n"
"\n"
@@ -3324,7 +3364,7 @@ msgid "Size and coordinates"
msgstr ""
#: src/slic3r/GUI/Tab.cpp:1767 src/slic3r/GUI/Tab.cpp:1968
-#: src/slic3r/GUI/Tab.cpp:2911
+#: src/slic3r/GUI/Tab.cpp:2912
msgid " Set "
msgstr ""
@@ -3356,7 +3396,7 @@ msgstr ""
msgid "Connection failed."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1867 src/slic3r/GUI/Tab.cpp:2022
+#: src/slic3r/GUI/Tab.cpp:1867 src/slic3r/GUI/Tab.cpp:2023
msgid "Print Host upload"
msgstr ""
@@ -3388,11 +3428,11 @@ msgstr ""
msgid "Tilt time"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2008 src/slic3r/GUI/Tab.cpp:3223
+#: src/slic3r/GUI/Tab.cpp:2008 src/slic3r/GUI/Tab.cpp:3224
msgid "Corrections"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2074 src/slic3r/GUI/Tab.cpp:2136
+#: src/slic3r/GUI/Tab.cpp:2075 src/slic3r/GUI/Tab.cpp:2137
#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1086
#: src/libslic3r/PrintConfig.cpp:1096 src/libslic3r/PrintConfig.cpp:1109
#: src/libslic3r/PrintConfig.cpp:1120 src/libslic3r/PrintConfig.cpp:1131
@@ -3400,173 +3440,173 @@ msgstr ""
msgid "Machine limits"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2088
+#: src/slic3r/GUI/Tab.cpp:2089
msgid "Values in this column are for Full Power mode"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2089
+#: src/slic3r/GUI/Tab.cpp:2090
msgid "Full Power"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2094
+#: src/slic3r/GUI/Tab.cpp:2095
msgid "Values in this column are for Silent mode"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2095
+#: src/slic3r/GUI/Tab.cpp:2096
msgid "Silent"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2103
+#: src/slic3r/GUI/Tab.cpp:2104
msgid "Maximum feedrates"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2108
+#: src/slic3r/GUI/Tab.cpp:2109
msgid "Maximum accelerations"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2115
+#: src/slic3r/GUI/Tab.cpp:2116
msgid "Jerk limits"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2120
+#: src/slic3r/GUI/Tab.cpp:2121
msgid "Minimum feedrates"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2158 src/slic3r/GUI/Tab.cpp:2166
+#: src/slic3r/GUI/Tab.cpp:2159 src/slic3r/GUI/Tab.cpp:2167
msgid "Single extruder MM setup"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2167
+#: src/slic3r/GUI/Tab.cpp:2168
msgid "Single extruder multimaterial parameters"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2181 src/libslic3r/GCode/PreviewData.cpp:475
+#: src/slic3r/GUI/Tab.cpp:2182 src/libslic3r/GCode/PreviewData.cpp:475
#, possible-c-format
msgid "Extruder %d"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2188
+#: src/slic3r/GUI/Tab.cpp:2189
msgid "Layer height limits"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2193
+#: src/slic3r/GUI/Tab.cpp:2194
msgid "Position (for multi-extruder printers)"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2196
+#: src/slic3r/GUI/Tab.cpp:2197
msgid "Retraction"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2199
+#: src/slic3r/GUI/Tab.cpp:2200
msgid "Only lift Z"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2212
+#: src/slic3r/GUI/Tab.cpp:2213
msgid ""
"Retraction when tool is disabled (advanced settings for multi-extruder "
"setups)"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2216
+#: src/slic3r/GUI/Tab.cpp:2217
msgid "Preview"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2352
+#: src/slic3r/GUI/Tab.cpp:2353
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:2354
+#: src/slic3r/GUI/Tab.cpp:2355
msgid "Firmware Retraction"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2681
-#, possible-c-format
-msgid "Default preset (%s)"
-msgstr ""
-
#: src/slic3r/GUI/Tab.cpp:2682
#, possible-c-format
+msgid "Default preset (%s)"
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:2683
+#, possible-c-format
msgid "Preset (%s)"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2699
+#: src/slic3r/GUI/Tab.cpp:2700
msgid "has the following unsaved changes:"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2702
+#: src/slic3r/GUI/Tab.cpp:2703
msgid "is not compatible with printer"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2703
+#: src/slic3r/GUI/Tab.cpp:2704
msgid "is not compatible with print profile"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2705
+#: src/slic3r/GUI/Tab.cpp:2706
msgid "and it has the following unsaved changes:"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2708
+#: src/slic3r/GUI/Tab.cpp:2709
msgid "Discard changes and continue anyway?"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2709
+#: src/slic3r/GUI/Tab.cpp:2710
msgid "Unsaved Changes"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2721
+#: src/slic3r/GUI/Tab.cpp:2722
msgid "Please check your object list before preset changing."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2801
+#: src/slic3r/GUI/Tab.cpp:2802
msgid "Copy"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2823
+#: src/slic3r/GUI/Tab.cpp:2824
msgid "The supplied name is empty. It can't be saved."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2828
+#: src/slic3r/GUI/Tab.cpp:2829
msgid "Cannot overwrite a system profile."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2832
+#: src/slic3r/GUI/Tab.cpp:2833
msgid "Cannot overwrite an external profile."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2858
+#: src/slic3r/GUI/Tab.cpp:2859
msgid "remove"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2858
+#: src/slic3r/GUI/Tab.cpp:2859
msgid "delete"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2859
+#: src/slic3r/GUI/Tab.cpp:2860
msgid "Are you sure you want to "
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2859
+#: src/slic3r/GUI/Tab.cpp:2860
msgid " the selected preset?"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2860
+#: src/slic3r/GUI/Tab.cpp:2861
msgid "Remove"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2861
+#: src/slic3r/GUI/Tab.cpp:2862
msgid " Preset"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2989
+#: src/slic3r/GUI/Tab.cpp:2990
msgid ""
"LOCKED LOCK;indicates that the settings are the same as the system values "
"for the current option group"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2992
+#: src/slic3r/GUI/Tab.cpp:2993
msgid ""
"UNLOCKED LOCK;indicates that some settings were changed and are not equal to "
"the system values for the current option group.\n"
@@ -3574,13 +3614,13 @@ msgid ""
"to the system values."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2998
+#: src/slic3r/GUI/Tab.cpp:2999
msgid ""
"WHITE BULLET;for the left button: \tindicates a non-system preset,\n"
"for the right button: \tindicates that the settings hasn't been modified."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3002
+#: src/slic3r/GUI/Tab.cpp:3003
msgid ""
"BACK ARROW;indicates that the settings were changed and are not equal to the "
"last saved preset for the current option group.\n"
@@ -3588,30 +3628,30 @@ msgid ""
"to the last saved preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3028
+#: src/slic3r/GUI/Tab.cpp:3029
msgid ""
"LOCKED LOCK icon indicates that the settings are the same as the system "
"values for the current option group"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3030
+#: src/slic3r/GUI/Tab.cpp:3031
msgid ""
"UNLOCKED LOCK icon indicates that some settings were changed and are not "
"equal to the system values for the current option group.\n"
"Click to reset all settings for current option group to the system values."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3033
+#: src/slic3r/GUI/Tab.cpp:3034
msgid "WHITE BULLET icon indicates a non system preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3036
+#: src/slic3r/GUI/Tab.cpp:3037
msgid ""
"WHITE BULLET icon indicates that the settings are the same as in the last "
"saved preset for the current option group."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3038
+#: src/slic3r/GUI/Tab.cpp:3039
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"
@@ -3619,84 +3659,84 @@ msgid ""
"preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3044
+#: src/slic3r/GUI/Tab.cpp:3045
msgid ""
"LOCKED LOCK icon indicates that the value is the same as the system value."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3045
+#: src/slic3r/GUI/Tab.cpp:3046
msgid ""
"UNLOCKED LOCK icon indicates that the value was changed and is not equal to "
"the system value.\n"
"Click to reset current value to the system value."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3051
+#: src/slic3r/GUI/Tab.cpp:3052
msgid ""
"WHITE BULLET icon indicates that the value is the same as in the last saved "
"preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3052
+#: src/slic3r/GUI/Tab.cpp:3053
msgid ""
"BACK ARROW icon indicates that the value was changed and is not equal to the "
"last saved preset.\n"
"Click to reset current value to the last saved preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3152
+#: src/slic3r/GUI/Tab.cpp:3153
msgid " as:"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3196
+#: src/slic3r/GUI/Tab.cpp:3197
msgid "the following postfix are not allowed:"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3200
+#: src/slic3r/GUI/Tab.cpp:3201
msgid "The supplied name is not available."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3213
+#: src/slic3r/GUI/Tab.cpp:3214
msgid "Material"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3215 src/slic3r/GUI/Tab.cpp:3305
+#: src/slic3r/GUI/Tab.cpp:3216 src/slic3r/GUI/Tab.cpp:3307
msgid "Layers"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3219
+#: src/slic3r/GUI/Tab.cpp:3220
msgid "Exposure"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3313
+#: src/slic3r/GUI/Tab.cpp:3315
msgid "Support head"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3318
+#: src/slic3r/GUI/Tab.cpp:3320
msgid "Support pillar"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3328
+#: src/slic3r/GUI/Tab.cpp:3330
msgid "Connection of the support sticks and junctions"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3333
+#: src/slic3r/GUI/Tab.cpp:3335
msgid "Automatic generation"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3395
+#: src/slic3r/GUI/Tab.cpp:3397
msgid "Head penetration should not be greater than the head width."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3396
+#: src/slic3r/GUI/Tab.cpp:3398
msgid "Invalid Head penetration"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3408
+#: src/slic3r/GUI/Tab.cpp:3410
msgid "Pinhead diameter should be smaller than the pillar diameter."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3409
+#: src/slic3r/GUI/Tab.cpp:3411
msgid "Invalid pinhead diameter"
msgstr ""
@@ -3720,39 +3760,40 @@ msgstr ""
msgid "Save preset"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:29
+#: src/slic3r/GUI/UpdateDialogs.cpp:30
msgid "Update available"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:29
-msgid "New version of Slic3r PE is available"
+#: src/slic3r/GUI/UpdateDialogs.cpp:30
+#, possible-c-format
+msgid "New version of %s is available"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:36
+#: src/slic3r/GUI/UpdateDialogs.cpp:37
msgid "To download, follow the link below."
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:44
+#: src/slic3r/GUI/UpdateDialogs.cpp:45
msgid "Current version:"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:46
+#: src/slic3r/GUI/UpdateDialogs.cpp:47
msgid "New version:"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:54
+#: src/slic3r/GUI/UpdateDialogs.cpp:55
msgid "Don't notify about new releases any more"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:72 src/slic3r/GUI/UpdateDialogs.cpp:164
+#: src/slic3r/GUI/UpdateDialogs.cpp:73 src/slic3r/GUI/UpdateDialogs.cpp:167
msgid "Configuration update"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:72
+#: src/slic3r/GUI/UpdateDialogs.cpp:73
msgid "Configuration update is available"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:75
+#: src/slic3r/GUI/UpdateDialogs.cpp:76
msgid ""
"Would you like to install it?\n"
"\n"
@@ -3762,47 +3803,48 @@ msgid ""
"Updated configuration bundles:"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:111
+#: src/slic3r/GUI/UpdateDialogs.cpp:112
msgid "Slic3r incompatibility"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:111
+#: src/slic3r/GUI/UpdateDialogs.cpp:112
msgid "Slic3r configuration is incompatible"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:114
+#: src/slic3r/GUI/UpdateDialogs.cpp:117
+#, possible-c-format
msgid ""
-"This version of Slic3r PE is not compatible with currently installed "
-"configuration bundles.\n"
-"This probably happened as a result of running an older Slic3r PE after using "
-"a newer one.\n"
+"This version of %s is not compatible with currently installed configuration "
+"bundles.\n"
+"This probably happened as a result of running an older %s after using a "
+"newer one.\n"
"\n"
"You may either exit Slic3r and try again with a newer version, or you may re-"
"run the initial configuration. Doing so will create a backup snapshot of the "
"existing configuration before installing files compatible with this Slic3r.\n"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:123
+#: src/slic3r/GUI/UpdateDialogs.cpp:126
#, possible-c-format
-msgid "This Slic3r PE version: %s"
+msgid "This %s version: %s"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:128
+#: src/slic3r/GUI/UpdateDialogs.cpp:131
msgid "Incompatible bundles:"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:144
+#: src/slic3r/GUI/UpdateDialogs.cpp:147
msgid "Exit Slic3r"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:147
+#: src/slic3r/GUI/UpdateDialogs.cpp:150
msgid "Re-configure"
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:168
+#: src/slic3r/GUI/UpdateDialogs.cpp:171
#, possible-c-format
msgid ""
-"Slic3r PE now uses an updated configuration structure.\n"
+"%s now uses an updated configuration structure.\n"
"\n"
"So called 'System presets' have been introduced, which hold the built-in "
"default settings for various printers. These System presets cannot be "
@@ -3815,7 +3857,7 @@ msgid ""
"choose whether to enable automatic preset updates."
msgstr ""
-#: src/slic3r/GUI/UpdateDialogs.cpp:184
+#: src/slic3r/GUI/UpdateDialogs.cpp:187
msgid "For more information please visit our wiki page:"
msgstr ""
@@ -3908,12 +3950,12 @@ msgstr ""
msgid "Show advanced settings"
msgstr ""
-#: src/slic3r/GUI/wxExtensions.cpp:2398
+#: src/slic3r/GUI/wxExtensions.cpp:2409
#, possible-c-format
msgid "Switch to the %s mode"
msgstr ""
-#: src/slic3r/GUI/wxExtensions.cpp:2399
+#: src/slic3r/GUI/wxExtensions.cpp:2410
#, possible-c-format
msgid "Current mode is %s"
msgstr ""
@@ -4187,46 +4229,6 @@ msgstr ""
msgid "Error with zip archive"
msgstr ""
-#: src/libslic3r/SLA/SLASupportTree.cpp:2153
-msgid "Starting"
-msgstr ""
-
-#: src/libslic3r/SLA/SLASupportTree.cpp:2154
-msgid "Filtering"
-msgstr ""
-
-#: src/libslic3r/SLA/SLASupportTree.cpp:2155
-msgid "Generate pinheads"
-msgstr ""
-
-#: src/libslic3r/SLA/SLASupportTree.cpp:2156
-msgid "Classification"
-msgstr ""
-
-#: src/libslic3r/SLA/SLASupportTree.cpp:2157
-msgid "Routing to ground"
-msgstr ""
-
-#: src/libslic3r/SLA/SLASupportTree.cpp:2158
-msgid "Routing supports to model surface"
-msgstr ""
-
-#: src/libslic3r/SLA/SLASupportTree.cpp:2159
-msgid "Cascading pillars"
-msgstr ""
-
-#: src/libslic3r/SLA/SLASupportTree.cpp:2160
-msgid "Processing small holes"
-msgstr ""
-
-#: src/libslic3r/SLA/SLASupportTree.cpp:2161
-msgid "Done"
-msgstr ""
-
-#: src/libslic3r/SLA/SLASupportTree.cpp:2162
-msgid "Abort"
-msgstr ""
-
#: src/libslic3r/Print.cpp:1136
msgid "All objects are outside of the print volume."
msgstr ""
@@ -4307,7 +4309,7 @@ msgid ""
"One or more object were assigned an extruder that the printer does not have."
msgstr ""
-#: src/libslic3r/Print.cpp:1297
+#: src/libslic3r/Print.cpp:1298
msgid ""
"Printing with multiple extruders of differing nozzle diameters. If support "
"is to be printed with the current extruder (support_material_extruder == 0 "
@@ -4315,13 +4317,13 @@ msgid ""
"same diameter."
msgstr ""
-#: src/libslic3r/Print.cpp:1305
+#: src/libslic3r/Print.cpp:1306
msgid ""
"For the Wipe Tower to work with the soluble supports, the support layers "
"need to be synchronized with the object layers."
msgstr ""
-#: src/libslic3r/Print.cpp:1309
+#: src/libslic3r/Print.cpp:1310
msgid ""
"The Wipe Tower currently supports the non-soluble supports only if they are "
"printed with the current extruder without triggering a tool change. (both "
@@ -4329,15 +4331,15 @@ msgid ""
"set to 0)."
msgstr ""
-#: src/libslic3r/Print.cpp:1316
+#: src/libslic3r/Print.cpp:1317
msgid "first_layer_height"
msgstr ""
-#: src/libslic3r/Print.cpp:1331
+#: src/libslic3r/Print.cpp:1332
msgid "First layer height can't be greater than nozzle diameter"
msgstr ""
-#: src/libslic3r/Print.cpp:1335
+#: src/libslic3r/Print.cpp:1336
msgid "Layer height can't be greater than nozzle diameter"
msgstr ""
@@ -4345,7 +4347,7 @@ msgstr ""
msgid "Slicing model"
msgstr ""
-#: src/libslic3r/SLAPrint.cpp:56 src/libslic3r/SLAPrint.cpp:801
+#: src/libslic3r/SLAPrint.cpp:56 src/libslic3r/SLAPrint.cpp:804
msgid "Generating support points"
msgstr ""
@@ -4369,26 +4371,27 @@ msgstr ""
msgid "Rasterizing layers"
msgstr ""
-#: src/libslic3r/SLAPrint.cpp:605
+#: src/libslic3r/SLAPrint.cpp:606
msgid ""
"Cannot proceed without support points! Add support points or disable support "
"generation."
msgstr ""
-#: src/libslic3r/SLAPrint.cpp:617
+#: src/libslic3r/SLAPrint.cpp:618
msgid "Elevation is too low for object."
msgstr ""
-#: src/libslic3r/SLAPrint.cpp:699
+#. TRN To be shown at the status bar on SLA slicing error.
+#: src/libslic3r/SLAPrint.cpp:701
msgid "Slicing had to be stopped due to an internal error."
msgstr ""
-#: src/libslic3r/SLAPrint.cpp:849 src/libslic3r/SLAPrint.cpp:859
-#: src/libslic3r/SLAPrint.cpp:907
+#: src/libslic3r/SLAPrint.cpp:852 src/libslic3r/SLAPrint.cpp:862
+#: src/libslic3r/SLAPrint.cpp:910
msgid "Visualizing supports"
msgstr ""
-#: src/libslic3r/SLAPrint.cpp:1449
+#: src/libslic3r/SLAPrint.cpp:1452
msgid "Slicing done"
msgstr ""
@@ -4536,7 +4539,7 @@ msgstr ""
#: src/libslic3r/PrintConfig.cpp:170 src/libslic3r/PrintConfig.cpp:732
#: src/libslic3r/PrintConfig.cpp:1569 src/libslic3r/PrintConfig.cpp:1579
#: src/libslic3r/PrintConfig.cpp:1807 src/libslic3r/PrintConfig.cpp:1961
-#: src/libslic3r/PrintConfig.cpp:2459
+#: src/libslic3r/PrintConfig.cpp:2461
msgid "°"
msgstr ""
@@ -4551,7 +4554,7 @@ msgstr ""
#: src/libslic3r/PrintConfig.cpp:178 src/libslic3r/PrintConfig.cpp:744
#: src/libslic3r/PrintConfig.cpp:1153 src/libslic3r/PrintConfig.cpp:1216
#: src/libslic3r/PrintConfig.cpp:1461 src/libslic3r/PrintConfig.cpp:2258
-#: src/libslic3r/PrintConfig.cpp:2498
+#: src/libslic3r/PrintConfig.cpp:2500
msgid "%"
msgstr ""
@@ -4699,8 +4702,8 @@ msgstr ""
msgid "Default print profile"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:316 src/libslic3r/PrintConfig.cpp:2337
-#: src/libslic3r/PrintConfig.cpp:2348
+#: src/libslic3r/PrintConfig.cpp:316 src/libslic3r/PrintConfig.cpp:2339
+#: src/libslic3r/PrintConfig.cpp:2350
msgid ""
"Default print profile associated with the current printer profile. On "
"selection of the current printer profile, this print profile will be "
@@ -4864,7 +4867,7 @@ msgid "Extra perimeters if needed"
msgstr ""
#: src/libslic3r/PrintConfig.cpp:446
-#, no-c-format
+#, possible-c-format
msgid ""
"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r "
"keeps adding perimeters, until more than 70% of the loop immediately above "
@@ -5512,7 +5515,7 @@ msgid "This setting represents the maximum speed of your fan."
msgstr ""
#: src/libslic3r/PrintConfig.cpp:1161
-#, no-c-format
+#, possible-c-format
msgid ""
"This is the highest printable layer height for this extruder, used to cap "
"the variable layer height and support layer height. Maximum recommended "
@@ -6195,7 +6198,7 @@ msgid ""
"plane."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1816 src/libslic3r/PrintConfig.cpp:2421
+#: src/libslic3r/PrintConfig.cpp:1816 src/libslic3r/PrintConfig.cpp:2423
msgid ""
"Only create support if it lies on a build plate. Don't create support on a "
"print."
@@ -6531,7 +6534,7 @@ msgstr ""
msgid "Wipe tower rotation angle with respect to x-axis "
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2144 src/libslic3r/PrintConfig.cpp:2565
+#: src/libslic3r/PrintConfig.cpp:2144 src/libslic3r/PrintConfig.cpp:2570
msgid "degrees"
msgstr ""
@@ -6690,478 +6693,495 @@ msgid "Printer gamma correction"
msgstr ""
#: src/libslic3r/PrintConfig.cpp:2282
-msgid "This will apply a gamm correction to the rasterized 2D polygons."
+msgid ""
+"This will apply a gamma correction to the rasterized 2D polygons. A gamma "
+"value of zero means thresholding with the threshold in the middle. This "
+"behaviour eliminates antialiasing without losing holes in polygons."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2291 src/libslic3r/PrintConfig.cpp:2292
+#: src/libslic3r/PrintConfig.cpp:2293 src/libslic3r/PrintConfig.cpp:2294
msgid "Initial layer height"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2298
+#: src/libslic3r/PrintConfig.cpp:2300
msgid "Faded layers"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2299
+#: src/libslic3r/PrintConfig.cpp:2301
msgid ""
"Number of the layers needed for the exposure time fade from initial exposure "
"time to the exposure time"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2306 src/libslic3r/PrintConfig.cpp:2307
+#: src/libslic3r/PrintConfig.cpp:2308 src/libslic3r/PrintConfig.cpp:2309
msgid "Exposure time"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2313 src/libslic3r/PrintConfig.cpp:2314
+#: src/libslic3r/PrintConfig.cpp:2315 src/libslic3r/PrintConfig.cpp:2316
msgid "Initial exposure time"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2320 src/libslic3r/PrintConfig.cpp:2321
+#: src/libslic3r/PrintConfig.cpp:2322 src/libslic3r/PrintConfig.cpp:2323
msgid "Correction for expansion"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2327
+#: src/libslic3r/PrintConfig.cpp:2329
msgid "SLA print material notes"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2328
+#: src/libslic3r/PrintConfig.cpp:2330
msgid "You can put your notes regarding the SLA print material here."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2336 src/libslic3r/PrintConfig.cpp:2347
+#: src/libslic3r/PrintConfig.cpp:2338 src/libslic3r/PrintConfig.cpp:2349
msgid "Default SLA material profile"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2358
+#: src/libslic3r/PrintConfig.cpp:2360
msgid "Generate supports"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2360
+#: src/libslic3r/PrintConfig.cpp:2362
msgid "Generate supports for the models"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2365
+#: src/libslic3r/PrintConfig.cpp:2367
msgid "Support head front diameter"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2367
+#: src/libslic3r/PrintConfig.cpp:2369
msgid "Diameter of the pointing side of the head"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2374
+#: src/libslic3r/PrintConfig.cpp:2376
msgid "Support head penetration"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2376
+#: src/libslic3r/PrintConfig.cpp:2378
msgid "How much the pinhead has to penetrate the model surface"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2383
+#: src/libslic3r/PrintConfig.cpp:2385
msgid "Support head width"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2385
+#: src/libslic3r/PrintConfig.cpp:2387
msgid "Width from the back sphere center to the front sphere center"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2393
+#: src/libslic3r/PrintConfig.cpp:2395
msgid "Support pillar diameter"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2395
+#: src/libslic3r/PrintConfig.cpp:2397
msgid "Diameter in mm of the support pillars"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2403
+#: src/libslic3r/PrintConfig.cpp:2405
msgid "Support pillar connection mode"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2404
+#: src/libslic3r/PrintConfig.cpp:2406
msgid ""
"Controls the bridge type between two neigboring pillars. Can be zig-zag, "
"cross (double zig-zag) or dynamic which will automatically switch between "
"the first two depending on the distance of the two pillars."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2412
+#: src/libslic3r/PrintConfig.cpp:2414
msgid "Zig-Zag"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2413
+#: src/libslic3r/PrintConfig.cpp:2415
msgid "Cross"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2414
+#: src/libslic3r/PrintConfig.cpp:2416
msgid "Dynamic"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2426
+#: src/libslic3r/PrintConfig.cpp:2428
msgid "Pillar widening factor"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2428
+#: src/libslic3r/PrintConfig.cpp:2430
msgid ""
"Merging bridges or pillars into another pillars can increase the radius. "
"Zero means no increase, one means full increase."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2437
+#: src/libslic3r/PrintConfig.cpp:2439
msgid "Support base diameter"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2439
+#: src/libslic3r/PrintConfig.cpp:2441
msgid "Diameter in mm of the pillar base"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2447
+#: src/libslic3r/PrintConfig.cpp:2449
msgid "Support base height"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2449
+#: src/libslic3r/PrintConfig.cpp:2451
msgid "The height of the pillar base cone"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2456
+#: src/libslic3r/PrintConfig.cpp:2458
msgid "Critical angle"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2458
+#: src/libslic3r/PrintConfig.cpp:2460
msgid "The default angle for connecting support sticks and junctions."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2466
+#: src/libslic3r/PrintConfig.cpp:2468
msgid "Max bridge length"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2468
+#: src/libslic3r/PrintConfig.cpp:2470
msgid "The max length of a bridge"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2475
+#: src/libslic3r/PrintConfig.cpp:2477
msgid "Max pillar linking distance"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2477
+#: src/libslic3r/PrintConfig.cpp:2479
msgid ""
"The max distance of two pillars to get linked with each other. A zero value "
"will prohibit pillar cascading."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2485
+#: src/libslic3r/PrintConfig.cpp:2487
msgid "Object elevation"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2487
+#: src/libslic3r/PrintConfig.cpp:2489
msgid "How much the supports should lift up the supported object."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2495
+#: src/libslic3r/PrintConfig.cpp:2497
msgid "Support points density"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2497
+#: src/libslic3r/PrintConfig.cpp:2499
msgid "This is a relative measure of support points density."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2503
+#: src/libslic3r/PrintConfig.cpp:2505
msgid "Minimal distance of the support points"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2505
+#: src/libslic3r/PrintConfig.cpp:2507
msgid "No support points will be placed closer than this threshold."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2511
+#: src/libslic3r/PrintConfig.cpp:2513
msgid "Use pad"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2513
+#: src/libslic3r/PrintConfig.cpp:2515
msgid "Add a pad underneath the supported model"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2518
+#: src/libslic3r/PrintConfig.cpp:2520
msgid "Pad wall thickness"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2520
+#: src/libslic3r/PrintConfig.cpp:2522
msgid "The thickness of the pad and its optional cavity walls."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2528
+#: src/libslic3r/PrintConfig.cpp:2530
msgid "Pad wall height"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2529
-msgid "Defines the cavity depth. Set to zero to disable the cavity."
+#: src/libslic3r/PrintConfig.cpp:2531
+msgid ""
+"Defines the pad cavity depth. Set to zero to disable the cavity. Be careful "
+"when enabling this feature, as some resins may produce an extreme suction "
+"effect inside the cavity, which makes pealing the print off the vat foil "
+"difficult."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2539
+#: src/libslic3r/PrintConfig.cpp:2544
msgid "Max merge distance"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2541
+#: src/libslic3r/PrintConfig.cpp:2546
msgid ""
"Some objects can get along with a few smaller pads instead of a single big "
"one. This parameter defines how far the center of two smaller pads should "
"be. If theyare closer, they will get merged into one pad."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2552
+#: src/libslic3r/PrintConfig.cpp:2557
msgid "Pad edge radius"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2561
+#: src/libslic3r/PrintConfig.cpp:2566
msgid "Pad wall slope"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2563
+#: src/libslic3r/PrintConfig.cpp:2568
msgid ""
"The slope of the pad wall relative to the bed plane. 90 degrees means "
"straight walls."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2924
+#: src/libslic3r/PrintConfig.cpp:2929
msgid "Export SVG"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2925
+#: src/libslic3r/PrintConfig.cpp:2930
msgid "Export the model(s) as OBJ."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2936
+#: src/libslic3r/PrintConfig.cpp:2941
msgid "Export SLA"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2937
+#: src/libslic3r/PrintConfig.cpp:2942
msgid "Slice the model and export SLA printing layers as PNG."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2942
+#: src/libslic3r/PrintConfig.cpp:2947
msgid "Export 3MF"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2943
+#: src/libslic3r/PrintConfig.cpp:2948
msgid "Export the model(s) as 3MF."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2947
+#: src/libslic3r/PrintConfig.cpp:2952
msgid "Export AMF"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2948
+#: src/libslic3r/PrintConfig.cpp:2953
msgid "Export the model(s) as AMF."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2952
+#: src/libslic3r/PrintConfig.cpp:2957
msgid "Export STL"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2953
+#: src/libslic3r/PrintConfig.cpp:2958
msgid "Export the model(s) as STL."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2958
+#: src/libslic3r/PrintConfig.cpp:2963
msgid "Slice the model and export toolpaths as G-code."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2963
+#: src/libslic3r/PrintConfig.cpp:2968
msgid "Slice"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2964
+#: src/libslic3r/PrintConfig.cpp:2969
msgid ""
"Slice the model as FFF or SLA based on the printer_technology configuration "
"value."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2969
+#: src/libslic3r/PrintConfig.cpp:2974
msgid "Help"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2970
+#: src/libslic3r/PrintConfig.cpp:2975
msgid "Show this help."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2975
+#: src/libslic3r/PrintConfig.cpp:2980
msgid "Help (FFF options)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2976
+#: src/libslic3r/PrintConfig.cpp:2981
msgid "Show the full list of print/G-code configuration options."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2980
+#: src/libslic3r/PrintConfig.cpp:2985
msgid "Help (SLA options)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2981
+#: src/libslic3r/PrintConfig.cpp:2986
msgid "Show the full list of SLA print configuration options."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2985
+#: src/libslic3r/PrintConfig.cpp:2990
msgid "Output Model Info"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2986
+#: src/libslic3r/PrintConfig.cpp:2991
msgid "Write information about the model to the console."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2990
+#: src/libslic3r/PrintConfig.cpp:2995
msgid "Save config file"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2991
+#: src/libslic3r/PrintConfig.cpp:2996
msgid "Save configuration to the specified file."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3001
+#: src/libslic3r/PrintConfig.cpp:3006
msgid "Align XY"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3002
+#: src/libslic3r/PrintConfig.cpp:3007
msgid "Align the model to the given point."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3007
+#: src/libslic3r/PrintConfig.cpp:3012
msgid "Cut model at the given Z."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3028
+#: src/libslic3r/PrintConfig.cpp:3033
msgid "Center"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3029
+#: src/libslic3r/PrintConfig.cpp:3034
msgid "Center the print around the given center."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3033
+#: src/libslic3r/PrintConfig.cpp:3038
msgid "Don't arrange"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3034
+#: src/libslic3r/PrintConfig.cpp:3039
msgid ""
"Do not rearrange the given models before merging and keep their original XY "
"coordinates."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3037
+#: src/libslic3r/PrintConfig.cpp:3042
msgid "Duplicate"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3038
+#: src/libslic3r/PrintConfig.cpp:3043
msgid "Multiply copies by this factor."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3042
+#: src/libslic3r/PrintConfig.cpp:3047
msgid "Duplicate by grid"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3043
+#: src/libslic3r/PrintConfig.cpp:3048
msgid "Multiply copies by creating a grid."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3046
+#: src/libslic3r/PrintConfig.cpp:3051
msgid "Merge"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3047
+#: src/libslic3r/PrintConfig.cpp:3052
msgid ""
"Arrange the supplied models in a plate and merge them in a single model in "
"order to perform actions once."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3052
+#: src/libslic3r/PrintConfig.cpp:3057
msgid ""
"Try to repair any non-manifold meshes (this option is implicitly added "
"whenever we need to slice the model to perform the requested action)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3056
+#: src/libslic3r/PrintConfig.cpp:3061
msgid "Rotation angle around the Z axis in degrees."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3060
+#: src/libslic3r/PrintConfig.cpp:3065
msgid "Rotate around X"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3061
+#: src/libslic3r/PrintConfig.cpp:3066
msgid "Rotation angle around the X axis in degrees."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3065
+#: src/libslic3r/PrintConfig.cpp:3070
msgid "Rotate around Y"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3066
+#: src/libslic3r/PrintConfig.cpp:3071
msgid "Rotation angle around the Y axis in degrees."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3071
+#: src/libslic3r/PrintConfig.cpp:3076
msgid "Scaling factor or percentage."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3076
+#: src/libslic3r/PrintConfig.cpp:3081
msgid ""
"Detect unconnected parts in the given model(s) and split them into separate "
"objects."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3079
+#: src/libslic3r/PrintConfig.cpp:3084
msgid "Scale to Fit"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3080
+#: src/libslic3r/PrintConfig.cpp:3085
msgid "Scale to fit the given volume."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3089
+#: src/libslic3r/PrintConfig.cpp:3094
msgid "Ignore non-existent config files"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3090
+#: src/libslic3r/PrintConfig.cpp:3095
msgid "Do not fail if a file supplied to --load does not exist."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3093
+#: src/libslic3r/PrintConfig.cpp:3098
msgid "Load config file"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3094
+#: src/libslic3r/PrintConfig.cpp:3099
msgid ""
"Load configuration from the specified file. It can be used more than once to "
"load options from multiple files."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3097
+#: src/libslic3r/PrintConfig.cpp:3102
msgid "Output File"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3098
+#: src/libslic3r/PrintConfig.cpp:3103
msgid ""
"The file where the output will be written (if not specified, it will be "
"based on the input file)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3108
+#: src/libslic3r/PrintConfig.cpp:3113
msgid "Data directory"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3109
+#: src/libslic3r/PrintConfig.cpp:3114
msgid ""
"Load and store settings at the given directory. This is useful for "
"maintaining different profiles or including configurations from a network "
"storage."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3112
+#: src/libslic3r/PrintConfig.cpp:3117
msgid "Logging level"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3113
+#: src/libslic3r/PrintConfig.cpp:3118
msgid ""
"Messages with severity lower or eqal to the loglevel will be printed out. 0:"
"trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal"
msgstr ""
+#: src/libslic3r/PrintConfig.cpp:3123
+msgid "Render with a software renderer"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3124
+msgid ""
+"Render with a software renderer. The bundled MESA software renderer is "
+"loaded instead of the default OpenGL driver."
+msgstr ""
+
#: src/libslic3r/GCode/PreviewData.cpp:176
msgid "Mixed"
msgstr ""
diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp
index dc017f737..c06d19cb9 100644
--- a/src/libslic3r/GCode.cpp
+++ b/src/libslic3r/GCode.cpp
@@ -173,7 +173,7 @@ std::string WipeTowerIntegration::append_tcr(GCode &gcodegen, const WipeTower::T
// Toolchangeresult.gcode assumes the wipe tower corner is at the origin
// We want to rotate and shift all extrusions (gcode postprocessing) and starting and ending position
- float alpha = m_wipe_tower_rotation/180.f * M_PI;
+ float alpha = m_wipe_tower_rotation/180.f * float(M_PI);
WipeTower::xy start_pos = tcr.start_pos;
WipeTower::xy end_pos = tcr.end_pos;
start_pos.rotate(alpha);
@@ -519,43 +519,43 @@ void GCode::_do_export(Print &print, FILE *file)
// this->print_machine_envelope(file, print);
// shall be adjusted as well to produce a G-code block compatible with the particular firmware flavor.
if (print.config().gcode_flavor.value == gcfMarlin) {
- m_normal_time_estimator.set_max_acceleration(print.config().machine_max_acceleration_extruding.values[0]);
- m_normal_time_estimator.set_retract_acceleration(print.config().machine_max_acceleration_retracting.values[0]);
- m_normal_time_estimator.set_minimum_feedrate(print.config().machine_min_extruding_rate.values[0]);
- m_normal_time_estimator.set_minimum_travel_feedrate(print.config().machine_min_travel_rate.values[0]);
- m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::X, print.config().machine_max_acceleration_x.values[0]);
- m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Y, print.config().machine_max_acceleration_y.values[0]);
- m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Z, print.config().machine_max_acceleration_z.values[0]);
- m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::E, print.config().machine_max_acceleration_e.values[0]);
- m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::X, print.config().machine_max_feedrate_x.values[0]);
- m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Y, print.config().machine_max_feedrate_y.values[0]);
- m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Z, print.config().machine_max_feedrate_z.values[0]);
- m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::E, print.config().machine_max_feedrate_e.values[0]);
- m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::X, print.config().machine_max_jerk_x.values[0]);
- m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Y, print.config().machine_max_jerk_y.values[0]);
- m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Z, print.config().machine_max_jerk_z.values[0]);
- m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::E, print.config().machine_max_jerk_e.values[0]);
+ m_normal_time_estimator.set_max_acceleration((float)print.config().machine_max_acceleration_extruding.values[0]);
+ m_normal_time_estimator.set_retract_acceleration((float)print.config().machine_max_acceleration_retracting.values[0]);
+ m_normal_time_estimator.set_minimum_feedrate((float)print.config().machine_min_extruding_rate.values[0]);
+ m_normal_time_estimator.set_minimum_travel_feedrate((float)print.config().machine_min_travel_rate.values[0]);
+ m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::X, (float)print.config().machine_max_acceleration_x.values[0]);
+ m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Y, (float)print.config().machine_max_acceleration_y.values[0]);
+ m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Z, (float)print.config().machine_max_acceleration_z.values[0]);
+ m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::E, (float)print.config().machine_max_acceleration_e.values[0]);
+ m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::X, (float)print.config().machine_max_feedrate_x.values[0]);
+ m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Y, (float)print.config().machine_max_feedrate_y.values[0]);
+ m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Z, (float)print.config().machine_max_feedrate_z.values[0]);
+ m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::E, (float)print.config().machine_max_feedrate_e.values[0]);
+ m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::X, (float)print.config().machine_max_jerk_x.values[0]);
+ m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Y, (float)print.config().machine_max_jerk_y.values[0]);
+ m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Z, (float)print.config().machine_max_jerk_z.values[0]);
+ m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::E, (float)print.config().machine_max_jerk_e.values[0]);
if (m_silent_time_estimator_enabled)
{
m_silent_time_estimator.reset();
m_silent_time_estimator.set_dialect(print.config().gcode_flavor);
- m_silent_time_estimator.set_max_acceleration(print.config().machine_max_acceleration_extruding.values[1]);
- m_silent_time_estimator.set_retract_acceleration(print.config().machine_max_acceleration_retracting.values[1]);
- m_silent_time_estimator.set_minimum_feedrate(print.config().machine_min_extruding_rate.values[1]);
- m_silent_time_estimator.set_minimum_travel_feedrate(print.config().machine_min_travel_rate.values[1]);
- m_silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::X, print.config().machine_max_acceleration_x.values[1]);
- m_silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Y, print.config().machine_max_acceleration_y.values[1]);
- m_silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Z, print.config().machine_max_acceleration_z.values[1]);
- m_silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::E, print.config().machine_max_acceleration_e.values[1]);
- m_silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::X, print.config().machine_max_feedrate_x.values[1]);
- m_silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Y, print.config().machine_max_feedrate_y.values[1]);
- m_silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Z, print.config().machine_max_feedrate_z.values[1]);
- m_silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::E, print.config().machine_max_feedrate_e.values[1]);
- m_silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::X, print.config().machine_max_jerk_x.values[1]);
- m_silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Y, print.config().machine_max_jerk_y.values[1]);
- m_silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Z, print.config().machine_max_jerk_z.values[1]);
- m_silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::E, print.config().machine_max_jerk_e.values[1]);
+ m_silent_time_estimator.set_max_acceleration((float)print.config().machine_max_acceleration_extruding.values[1]);
+ m_silent_time_estimator.set_retract_acceleration((float)print.config().machine_max_acceleration_retracting.values[1]);
+ m_silent_time_estimator.set_minimum_feedrate((float)print.config().machine_min_extruding_rate.values[1]);
+ m_silent_time_estimator.set_minimum_travel_feedrate((float)print.config().machine_min_travel_rate.values[1]);
+ m_silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::X, (float)print.config().machine_max_acceleration_x.values[1]);
+ m_silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Y, (float)print.config().machine_max_acceleration_y.values[1]);
+ m_silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Z, (float)print.config().machine_max_acceleration_z.values[1]);
+ m_silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::E, (float)print.config().machine_max_acceleration_e.values[1]);
+ m_silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::X, (float)print.config().machine_max_feedrate_x.values[1]);
+ m_silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Y, (float)print.config().machine_max_feedrate_y.values[1]);
+ m_silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Z, (float)print.config().machine_max_feedrate_z.values[1]);
+ m_silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::E, (float)print.config().machine_max_feedrate_e.values[1]);
+ m_silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::X, (float)print.config().machine_max_jerk_x.values[1]);
+ m_silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Y, (float)print.config().machine_max_jerk_y.values[1]);
+ m_silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Z, (float)print.config().machine_max_jerk_z.values[1]);
+ m_silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::E, (float)print.config().machine_max_jerk_e.values[1]);
if (print.config().single_extruder_multi_material) {
// As of now the fields are shown at the UI dialog in the same combo box as the ramming values, so they
// are considered to be active for the single extruder multi-material printers only.
@@ -1054,26 +1054,54 @@ void GCode::_do_export(Print &print, FILE *file)
print.m_print_statistics.clear();
print.m_print_statistics.estimated_normal_print_time = m_normal_time_estimator.get_time_dhms();
print.m_print_statistics.estimated_silent_print_time = m_silent_time_estimator_enabled ? m_silent_time_estimator.get_time_dhms() : "N/A";
- for (const Extruder &extruder : m_writer.extruders()) {
- double used_filament = extruder.used_filament() + (has_wipe_tower ? print.wipe_tower_data().used_filament[extruder.id()] : 0.f);
- double extruded_volume = extruder.extruded_volume() + (has_wipe_tower ? print.wipe_tower_data().used_filament[extruder.id()] * 2.4052f : 0.f); // assumes 1.75mm filament diameter
- double filament_weight = extruded_volume * extruder.filament_density() * 0.001;
- double filament_cost = filament_weight * extruder.filament_cost() * 0.001;
- print.m_print_statistics.filament_stats.insert(std::pair(extruder.id(), (float)used_filament));
- _write_format(file, "; filament used = %.1lfmm (%.1lfcm3)\n", used_filament, extruded_volume * 0.001);
- if (filament_weight > 0.) {
- print.m_print_statistics.total_weight = print.m_print_statistics.total_weight + filament_weight;
- _write_format(file, "; filament used = %.1lf\n", filament_weight);
- if (filament_cost > 0.) {
- print.m_print_statistics.total_cost = print.m_print_statistics.total_cost + filament_cost;
- _write_format(file, "; filament cost = %.1lf\n", filament_cost);
+ std::vector extruders = m_writer.extruders();
+ if (! extruders.empty()) {
+ std::pair out_filament_used_mm ("; filament used [mm] = ", 0);
+ std::pair out_filament_used_cm3("; filament used [cm3] = ", 0);
+ std::pair out_filament_used_g ("; filament used [g] = ", 0);
+ std::pair out_filament_cost ("; filament cost = ", 0);
+ for (const Extruder &extruder : extruders) {
+ double used_filament = extruder.used_filament() + (has_wipe_tower ? print.wipe_tower_data().used_filament[extruder.id()] : 0.f);
+ double extruded_volume = extruder.extruded_volume() + (has_wipe_tower ? print.wipe_tower_data().used_filament[extruder.id()] * 2.4052f : 0.f); // assumes 1.75mm filament diameter
+ double filament_weight = extruded_volume * extruder.filament_density() * 0.001;
+ double filament_cost = filament_weight * extruder.filament_cost() * 0.001;
+ auto append = [&extruder, &extruders](std::pair &dst, const char *tmpl, double value) {
+ while (dst.second < extruder.id()) {
+ // Fill in the non-printing extruders with zeros.
+ dst.first += (dst.second > 0) ? ", 0" : "0";
+ ++ dst.second;
+ }
+ if (dst.second > 0)
+ dst.first += ", ";
+ char buf[64];
+ sprintf(buf, tmpl, value);
+ dst.first += buf;
+ ++ dst.second;
+ };
+ print.m_print_statistics.filament_stats.insert(std::pair(extruder.id(), (float)used_filament));
+ append(out_filament_used_mm, "%.1lf", used_filament);
+ append(out_filament_used_cm3, "%.1lf", extruded_volume * 0.001);
+ if (filament_weight > 0.) {
+ print.m_print_statistics.total_weight = print.m_print_statistics.total_weight + filament_weight;
+ append(out_filament_used_g, "%.1lf", filament_weight);
+ if (filament_cost > 0.) {
+ print.m_print_statistics.total_cost = print.m_print_statistics.total_cost + filament_cost;
+ append(out_filament_cost, "%.1lf", filament_cost);
+ }
}
+ print.m_print_statistics.total_used_filament += used_filament;
+ print.m_print_statistics.total_extruded_volume += extruded_volume;
+ print.m_print_statistics.total_wipe_tower_filament += has_wipe_tower ? used_filament - extruder.used_filament() : 0.;
+ print.m_print_statistics.total_wipe_tower_cost += has_wipe_tower ? (extruded_volume - extruder.extruded_volume())* extruder.filament_density() * 0.001 * extruder.filament_cost() * 0.001 : 0.;
}
- print.m_print_statistics.total_used_filament += used_filament;
- print.m_print_statistics.total_extruded_volume += extruded_volume;
- print.m_print_statistics.total_wipe_tower_filament += has_wipe_tower ? used_filament - extruder.used_filament() : 0.;
- print.m_print_statistics.total_wipe_tower_cost += has_wipe_tower ? (extruded_volume - extruder.extruded_volume())* extruder.filament_density() * 0.001 * extruder.filament_cost() * 0.001 : 0.;
+ _writeln(file, out_filament_used_mm.first);
+ _writeln(file, out_filament_used_cm3.first);
+ if (out_filament_used_g.second)
+ _writeln(file, out_filament_used_g.first);
+ if (out_filament_cost.second)
+ _writeln(file, out_filament_cost.first);
}
+ _write_format(file, "; total filament used [g] = %.1lf\n", print.m_print_statistics.total_weight);
_write_format(file, "; total filament cost = %.1lf\n", print.m_print_statistics.total_cost);
_write_format(file, "; estimated printing time (normal mode) = %s\n", m_normal_time_estimator.get_time_dhms().c_str());
if (m_silent_time_estimator_enabled)
@@ -1528,7 +1556,7 @@ void GCode::process_layer(
std::max(region.config().perimeter_extruder.value - 1, 0);
// Let's recover vector of extruder overrides:
- const ExtruderPerCopy* entity_overrides = const_cast(layer_tools).wiping_extrusions().get_extruder_overrides(fill, correct_extruder_id, layer_to_print.object()->copies().size());
+ const ExtruderPerCopy* entity_overrides = const_cast(layer_tools).wiping_extrusions().get_extruder_overrides(fill, correct_extruder_id, (int)layer_to_print.object()->copies().size());
// Now we must add this extrusion into the by_extruder map, once for each extruder that will print it:
for (unsigned int extruder : layer_tools.extruders)
diff --git a/src/libslic3r/GCode/WipeTowerPrusaMM.hpp b/src/libslic3r/GCode/WipeTowerPrusaMM.hpp
index 3f904a483..2b5fa2241 100644
--- a/src/libslic3r/GCode/WipeTowerPrusaMM.hpp
+++ b/src/libslic3r/GCode/WipeTowerPrusaMM.hpp
@@ -197,7 +197,7 @@ private:
const bool m_peters_wipe_tower = false; // sparse wipe tower inspired by Peter's post processor - not finished yet
- const float Filament_Area = M_PI * 1.75f * 1.75f / 4.f; // filament area in mm^2
+ const float Filament_Area = float(M_PI * 1.75f * 1.75f / 4.f); // filament area in mm^2
const float Width_To_Nozzle_Ratio = 1.25f; // desired line width (oval) in multiples of nozzle diameter - may not be actually neccessary to adjust
const float WT_EPSILON = 1e-3f;
@@ -224,8 +224,8 @@ private:
bool m_retain_speed_override = true;
bool m_adhesion = true;
- float m_perimeter_width = 0.4 * Width_To_Nozzle_Ratio; // Width of an extrusion line, also a perimeter spacing for 100% infill.
- float m_extrusion_flow = 0.038; //0.029f;// Extrusion flow is derived from m_perimeter_width, layer height and filament diameter.
+ float m_perimeter_width = 0.4f * Width_To_Nozzle_Ratio; // Width of an extrusion line, also a perimeter spacing for 100% infill.
+ float m_extrusion_flow = 0.038f; //0.029f;// Extrusion flow is derived from m_perimeter_width, layer height and filament diameter.
struct FilamentParameters {
@@ -269,12 +269,12 @@ private:
{
if ( layer_height < 0 )
return m_extrusion_flow;
- return layer_height * ( m_perimeter_width - layer_height * (1-M_PI/4.f)) / Filament_Area;
+ return layer_height * ( m_perimeter_width - layer_height * (1.f-float(M_PI)/4.f)) / Filament_Area;
}
// Calculates length of extrusion line to extrude given volume
float volume_to_length(float volume, float line_width, float layer_height) const {
- return std::max(0., volume / (layer_height * (line_width - layer_height * (1. - M_PI / 4.))));
+ return std::max(0.f, volume / (layer_height * (line_width - layer_height * (1.f - float(M_PI) / 4.f))));
}
// Calculates depth for all layers and propagates them downwards
diff --git a/src/libslic3r/GCodeTimeEstimator.cpp b/src/libslic3r/GCodeTimeEstimator.cpp
index 4b4e9f587..60d7a4cdf 100644
--- a/src/libslic3r/GCodeTimeEstimator.cpp
+++ b/src/libslic3r/GCodeTimeEstimator.cpp
@@ -38,7 +38,6 @@ static const std::string MOVE_TYPE_STR[Slic3r::GCodeTimeEstimator::Block::Num_Ty
#endif // ENABLE_MOVE_STATS
namespace Slic3r {
-
void GCodeTimeEstimator::Feedrates::reset()
{
feedrate = 0.0f;
@@ -695,6 +694,8 @@ namespace Slic3r {
set_axis_position(X, 0.0f);
set_axis_position(Y, 0.0f);
set_axis_position(Z, 0.0f);
+ if (get_e_local_positioning_type() == Absolute)
+ set_axis_position(E, 0.0f);
set_additional_time(0.0f);
@@ -715,7 +716,6 @@ namespace Slic3r {
_blocks.clear();
}
-
void GCodeTimeEstimator::_calculate_time()
{
PROFILE_FUNC();
diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp
index 6b16855e8..37e1f4a1b 100644
--- a/src/libslic3r/Model.cpp
+++ b/src/libslic3r/Model.cpp
@@ -943,7 +943,7 @@ BoundingBoxf3 ModelObject::instance_bounding_box(size_t instance_idx, bool dont_
// Calculate 2D convex hull of of a projection of the transformed printable volumes into the XY plane.
// This method is cheap in that it does not make any unnecessary copy of the volume meshes.
// This method is used by the auto arrange function.
-Polygon ModelObject::convex_hull_2d(const Transform3d &trafo_instance)
+Polygon ModelObject::convex_hull_2d(const Transform3d &trafo_instance) const
{
Points pts;
for (const ModelVolume *v : this->volumes)
@@ -1189,6 +1189,7 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b
volume->mesh.transform(instance_matrix * volume_matrix, true);
// Perform cut
+ volume->mesh.require_shared_vertices(); // TriangleMeshSlicer needs this
TriangleMeshSlicer tms(&volume->mesh);
tms.cut(float(z), &upper_mesh, &lower_mesh);
diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp
index 1234102e0..80187d259 100644
--- a/src/libslic3r/Model.hpp
+++ b/src/libslic3r/Model.hpp
@@ -234,7 +234,7 @@ public:
// Calculate 2D convex hull of of a projection of the transformed printable volumes into the XY plane.
// This method is cheap in that it does not make any unnecessary copy of the volume meshes.
// This method is used by the auto arrange function.
- Polygon convex_hull_2d(const Transform3d &trafo_instance);
+ Polygon convex_hull_2d(const Transform3d &trafo_instance) const;
#if ENABLE_VOLUMES_CENTERING_FIXES
void center_around_origin(bool include_modifiers = true);
diff --git a/src/libslic3r/ModelArrange.cpp b/src/libslic3r/ModelArrange.cpp
index 54627ba86..50901da3a 100644
--- a/src/libslic3r/ModelArrange.cpp
+++ b/src/libslic3r/ModelArrange.cpp
@@ -1,5 +1,6 @@
#include "ModelArrange.hpp"
#include "Model.hpp"
+#include "Geometry.hpp"
#include "SVG.hpp"
#include
@@ -551,7 +552,7 @@ ShapeData2D projectModelFromTop(const Slic3r::Model &model) {
ret.reserve(s);
for(ModelObject* objptr : model.objects) {
- if(objptr) {
+ if (! objptr->instances.empty()) {
// TODO export the exact 2D projection. Cannot do it as libnest2d
// does not support concave shapes (yet).
@@ -572,23 +573,23 @@ ShapeData2D projectModelFromTop(const Slic3r::Model &model) {
clpath = Slic3rMultiPoint_to_ClipperPath(p);
}
+ Vec3d rotation0 = objptr->instances.front()->get_rotation();
+ rotation0(2) = 0.;
for(ModelInstance* objinst : objptr->instances) {
- if(objinst) {
- ClipperLib::Polygon pn;
- pn.Contour = clpath;
+ ClipperLib::Polygon pn;
+ pn.Contour = clpath;
- // Efficient conversion to item.
- Item item(std::move(pn));
+ // Efficient conversion to item.
+ Item item(std::move(pn));
- // Invalid geometries would throw exceptions when arranging
- if(item.vertexCount() > 3) {
- item.rotation(objinst->get_rotation(Z));
- item.translation({
- ClipperLib::cInt(objinst->get_offset(X)/SCALING_FACTOR),
- ClipperLib::cInt(objinst->get_offset(Y)/SCALING_FACTOR)
- });
- ret.emplace_back(objinst, item);
- }
+ // Invalid geometries would throw exceptions when arranging
+ if(item.vertexCount() > 3) {
+ item.rotation(float(Geometry::rotation_diff_z(rotation0, objinst->get_rotation()))),
+ item.translation({
+ ClipperLib::cInt(objinst->get_offset(X)/SCALING_FACTOR),
+ ClipperLib::cInt(objinst->get_offset(Y)/SCALING_FACTOR)
+ });
+ ret.emplace_back(objinst, item);
}
}
}
diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp
index c13f0bc2a..0637ba7f0 100644
--- a/src/libslic3r/Print.cpp
+++ b/src/libslic3r/Print.cpp
@@ -1139,31 +1139,29 @@ std::string Print::validate() const
// Check horizontal clearance.
{
Polygons convex_hulls_other;
- for (const PrintObject *object : m_objects) {
+ for (const PrintObject *print_object : m_objects) {
+ assert(! print_object->model_object()->instances.empty());
+ assert(! print_object->copies().empty());
// Get convex hull of all meshes assigned to this print object.
- Polygon convex_hull;
- {
- Polygons mesh_convex_hulls;
- for (const std::vector &volumes : object->region_volumes)
- for (int volume_id : volumes)
- mesh_convex_hulls.emplace_back(object->model_object()->volumes[volume_id]->mesh.convex_hull());
- // make a single convex hull for all of them
- convex_hull = Slic3r::Geometry::convex_hull(mesh_convex_hulls);
- }
- // Apply the same transformations we apply to the actual meshes when slicing them.
- object->model_object()->instances.front()->transform_polygon(&convex_hull);
+ ModelInstance *model_instance0 = print_object->model_object()->instances.front();
+ Vec3d rotation = model_instance0->get_rotation();
+ rotation.z() = 0.;
+ // Calculate the convex hull of a printable object centered around X=0,Y=0.
// Grow convex hull with the clearance margin.
// FIXME: Arrangement has different parameters for offsetting (jtMiter, limit 2)
// which causes that the warning will be showed after arrangement with the
// appropriate object distance. Even if I set this to jtMiter the warning still shows up.
- convex_hull = offset(convex_hull, scale_(m_config.extruder_clearance_radius.value)/2, jtRound, scale_(0.1)).front();
+ Polygon convex_hull0 = offset(
+ print_object->model_object()->convex_hull_2d(
+ Geometry::assemble_transform(Vec3d::Zero(), rotation, model_instance0->get_scaling_factor(), model_instance0->get_mirror())),
+ scale_(m_config.extruder_clearance_radius.value) / 2., jtRound, scale_(0.1)).front();
// Now we check that no instance of convex_hull intersects any of the previously checked object instances.
- for (const Point © : object->m_copies) {
- Polygon p = convex_hull;
- p.translate(copy);
- if (! intersection(convex_hulls_other, p).empty())
+ for (const Point © : print_object->m_copies) {
+ Polygon convex_hull = convex_hull0;
+ convex_hull.translate(copy);
+ if (! intersection(convex_hulls_other, convex_hull).empty())
return L("Some objects are too close; your extruder will collide with them.");
- polygons_append(convex_hulls_other, p);
+ polygons_append(convex_hulls_other, convex_hull);
}
}
}
diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp
index 9fd7787b1..dfa783927 100644
--- a/src/libslic3r/PrintConfig.cpp
+++ b/src/libslic3r/PrintConfig.cpp
@@ -2926,7 +2926,7 @@ CLIActionsConfigDef::CLIActionsConfigDef()
// Actions:
def = this->add("export_obj", coBool);
- def->label = L("Export SVG");
+ def->label = L("Export OBJ");
def->tooltip = L("Export the model(s) as OBJ.");
def->default_value = new ConfigOptionBool(false);
diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp
index 0b51f36ec..bb03d1e9d 100644
--- a/src/libslic3r/PrintObject.cpp
+++ b/src/libslic3r/PrintObject.cpp
@@ -1813,6 +1813,7 @@ std::vector PrintObject::_slice_volumes(const std::vector &z,
TriangleMeshSlicer mslicer;
const Print *print = this->print();
auto callback = TriangleMeshSlicer::throw_on_cancel_callback_type([print](){print->throw_if_canceled();});
+ mesh.require_shared_vertices(); // TriangleMeshSlicer needs this
mslicer.init(&mesh, callback);
mslicer.slice(z, float(m_config.slice_closing_radius.value), &layers, callback);
m_print->throw_if_canceled();
@@ -1840,6 +1841,7 @@ std::vector PrintObject::_slice_volume(const std::vector &z,
TriangleMeshSlicer mslicer;
const Print *print = this->print();
auto callback = TriangleMeshSlicer::throw_on_cancel_callback_type([print](){print->throw_if_canceled();});
+ mesh.require_shared_vertices(); // TriangleMeshSlicer needs this
mslicer.init(&mesh, callback);
mslicer.slice(z, float(m_config.slice_closing_radius.value), &layers, callback);
m_print->throw_if_canceled();
diff --git a/src/libslic3r/SLA/SLABasePool.cpp b/src/libslic3r/SLA/SLABasePool.cpp
index 2aabaa590..94b6c7d9b 100644
--- a/src/libslic3r/SLA/SLABasePool.cpp
+++ b/src/libslic3r/SLA/SLABasePool.cpp
@@ -552,6 +552,7 @@ void base_plate(const TriangleMesh &mesh, ExPolygons &output, float h,
float layerh, ThrowOnCancel thrfn)
{
TriangleMesh m = mesh;
+ m.require_shared_vertices(); // TriangleMeshSlicer needs this
TriangleMeshSlicer slicer(&m);
auto bb = mesh.bounding_box();
diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp
index bb0e5e007..75f9b0140 100644
--- a/src/libslic3r/SLA/SLASupportTree.cpp
+++ b/src/libslic3r/SLA/SLASupportTree.cpp
@@ -817,6 +817,10 @@ public:
meshcache = mesh(merged);
+ // The mesh will be passed by const-pointer to TriangleMeshSlicer,
+ // which will need this.
+ meshcache.require_shared_vertices();
+
// TODO: Is this necessary?
//meshcache.repair();
@@ -2231,6 +2235,7 @@ SlicedSupports SLASupportTree::slice(float layerh, float init_layerh) const
TriangleMesh fullmesh = m_impl->merged_mesh();
fullmesh.merge(get_pad());
+ fullmesh.require_shared_vertices(); // TriangleMeshSlicer needs this
TriangleMeshSlicer slicer(&fullmesh);
SlicedSupports ret;
slicer.slice(heights, 0.f, &ret, get().ctl().cancelfn);
@@ -2243,6 +2248,7 @@ SlicedSupports SLASupportTree::slice(const std::vector &heights,
{
TriangleMesh fullmesh = m_impl->merged_mesh();
fullmesh.merge(get_pad());
+ fullmesh.require_shared_vertices(); // TriangleMeshSlicer needs this
TriangleMeshSlicer slicer(&fullmesh);
SlicedSupports ret;
slicer.slice(heights, cr, &ret, get().ctl().cancelfn);
diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp
index e5a574463..284073ca4 100644
--- a/src/libslic3r/SLAPrint.cpp
+++ b/src/libslic3r/SLAPrint.cpp
@@ -598,8 +598,9 @@ std::string SLAPrint::validate() const
for(SLAPrintObject * po : m_objects) {
const ModelObject *mo = po->model_object();
+ bool supports_en = po->config().supports_enable.getBool();
- if(po->config().supports_enable.getBool() &&
+ if(supports_en &&
mo->sla_points_status == sla::PointsStatus::UserModified &&
mo->sla_support_points.empty())
return L("Cannot proceed without support points! "
@@ -613,7 +614,7 @@ std::string SLAPrint::validate() const
2 * cfg.head_back_radius_mm -
cfg.head_penetration_mm;
- if(pinhead_width > cfg.object_elevation_mm)
+ if(supports_en && pinhead_width > cfg.object_elevation_mm)
return L("Elevation is too low for object.");
}
@@ -696,6 +697,7 @@ void SLAPrint::process()
po.closest_slice_record(po.m_slice_index, float(bb3d.min(Z)));
if(slindex_it == po.m_slice_index.end())
+ //TRN To be shown at the status bar on SLA slicing error.
throw std::runtime_error(L("Slicing had to be stopped "
"due to an internal error."));
@@ -706,6 +708,7 @@ void SLAPrint::process()
po.m_model_height_levels.emplace_back(it->slice_level());
}
+ mesh.require_shared_vertices(); // TriangleMeshSlicer needs this
TriangleMeshSlicer slicer(&mesh);
po.m_model_slices.clear();
diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp
index c1847fcd8..fde35ca1e 100644
--- a/src/libslic3r/SupportMaterial.cpp
+++ b/src/libslic3r/SupportMaterial.cpp
@@ -160,17 +160,13 @@ PrintObjectSupportMaterial::PrintObjectSupportMaterial(const PrintObject *object
m_support_material_interface_flow = m_support_material_flow;
}
+ // Evaluate the XY gap between the object outer perimeters and the support structures.
// Evaluate the XY gap between the object outer perimeters and the support structures.
coordf_t external_perimeter_width = 0.;
- for (size_t region_id = 0; region_id < object->region_volumes.size(); ++ region_id) {
- if (! object->region_volumes[region_id].empty()) {
- const PrintRegionConfig &config = object->print()->get_region(region_id)->config();
- coordf_t width = config.external_perimeter_extrusion_width.get_abs_value(slicing_params.layer_height);
- if (width <= 0.)
- width = m_print_config->nozzle_diameter.get_at(config.perimeter_extruder-1);
- external_perimeter_width = std::max(external_perimeter_width, width);
- }
- }
+ for (size_t region_id = 0; region_id < object->region_volumes.size(); ++ region_id)
+ if (! object->region_volumes[region_id].empty())
+ external_perimeter_width = std::max(external_perimeter_width,
+ (coordf_t)object->print()->get_region(region_id)->flow(frExternalPerimeter, slicing_params.layer_height, false, false, -1, *object).width);
m_gap_xy = m_object_config->support_material_xy_spacing.get_abs_value(external_perimeter_width);
m_can_merge_support_regions = m_object_config->support_material_extruder.value == m_object_config->support_material_interface_extruder.value;
diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp
index 2d603661d..f449ac2b4 100644
--- a/src/libslic3r/TriangleMesh.cpp
+++ b/src/libslic3r/TriangleMesh.cpp
@@ -607,10 +607,12 @@ void TriangleMesh::require_shared_vertices()
BOOST_LOG_TRIVIAL(trace) << "TriangleMeshSlicer::require_shared_vertices - end";
}
-void TriangleMeshSlicer::init(TriangleMesh *_mesh, throw_on_cancel_callback_type throw_on_cancel)
+void TriangleMeshSlicer::init(const TriangleMesh *_mesh, throw_on_cancel_callback_type throw_on_cancel)
{
mesh = _mesh;
- _mesh->require_shared_vertices();
+ if (! mesh->has_shared_vertices())
+ throw std::invalid_argument("TriangleMeshSlicer was passed a mesh without shared vertices.");
+
throw_on_cancel();
facets_edges.assign(_mesh->stl.stats.number_of_facets * 3, -1);
v_scaled_shared.assign(_mesh->stl.v_shared, _mesh->stl.v_shared + _mesh->stl.stats.shared_vertices);
diff --git a/src/libslic3r/TriangleMesh.hpp b/src/libslic3r/TriangleMesh.hpp
index 4bf5ce039..60ddcca08 100644
--- a/src/libslic3r/TriangleMesh.hpp
+++ b/src/libslic3r/TriangleMesh.hpp
@@ -67,18 +67,17 @@ public:
TriangleMesh convex_hull_3d() const;
void reset_repair_stats();
bool needed_repair() const;
+ void require_shared_vertices();
+ bool has_shared_vertices() const { return stl.v_shared != NULL; }
size_t facets_count() const { return this->stl.stats.number_of_facets; }
bool empty() const { return this->facets_count() == 0; }
-
bool is_splittable() const;
stl_file stl;
bool repaired;
-
+
private:
- void require_shared_vertices();
std::deque find_unvisited_neighbors(std::vector &facet_visited) const;
- friend class TriangleMeshSlicer;
};
enum FacetEdgeType {
@@ -159,9 +158,8 @@ class TriangleMeshSlicer
public:
typedef std::function throw_on_cancel_callback_type;
TriangleMeshSlicer() : mesh(nullptr) {}
- // Not quite nice, but the constructor and init() methods require non-const mesh pointer to be able to call mesh->require_shared_vertices()
- TriangleMeshSlicer(TriangleMesh* mesh) { this->init(mesh, [](){}); }
- void init(TriangleMesh *mesh, throw_on_cancel_callback_type throw_on_cancel);
+ TriangleMeshSlicer(const TriangleMesh* mesh) { this->init(mesh, [](){}); }
+ void init(const TriangleMesh *mesh, throw_on_cancel_callback_type throw_on_cancel);
void slice(const std::vector &z, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const;
void slice(const std::vector &z, const float closing_radius, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const;
enum FacetSliceType {
diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp
index dfd72b7a9..21ec3d307 100644
--- a/src/libslic3r/Utils.hpp
+++ b/src/libslic3r/Utils.hpp
@@ -88,7 +88,7 @@ std::string string_printf(const char *format, ...);
extern std::string timestamp_str();
// Standard "generated by Slic3r version xxx timestamp xxx" header string,
// to be placed at the top of Slic3r generated files.
-inline std::string header_slic3r_generated() { return std::string("generated by " SLIC3R_FORK_NAME " " SLIC3R_VERSION " " ) + timestamp_str(); }
+inline std::string header_slic3r_generated() { return std::string("generated by " SLIC3R_APP_NAME " " SLIC3R_VERSION " " ) + timestamp_str(); }
// getpid platform wrapper
extern unsigned get_current_pid();
diff --git a/src/libslic3r/libslic3r_version.h.in b/src/libslic3r/libslic3r_version.h.in
index 2259b2302..7c4a4b294 100644
--- a/src/libslic3r/libslic3r_version.h.in
+++ b/src/libslic3r/libslic3r_version.h.in
@@ -1,7 +1,8 @@
#ifndef __SLIC3R_VERSION_H
#define __SLIC3R_VERSION_H
-#define SLIC3R_FORK_NAME "@SLIC3R_FORK_NAME@"
+#define SLIC3R_APP_NAME "@SLIC3R_APP_NAME@"
+#define SLIC3R_APP_KEY "@SLIC3R_APP_KEY@"
#define SLIC3R_VERSION "@SLIC3R_VERSION@"
#define SLIC3R_BUILD "@SLIC3R_BUILD@"
diff --git a/src/platform/msw/slic3r.rc.in b/src/platform/msw/slic3r.rc.in
index 493f9f752..970683e58 100644
--- a/src/platform/msw/slic3r.rc.in
+++ b/src/platform/msw/slic3r.rc.in
@@ -7,12 +7,12 @@ PRODUCTVERSION @SLIC3R_RC_VERSION@
BLOCK "040904E4"
{
VALUE "CompanyName", "Prusa Research"
- VALUE "FileDescription", "Slic3r Prusa Edition"
+ VALUE "FileDescription", "@SLIC3R_APP_NAME@"
VALUE "FileVersion", "@SLIC3R_BUILD_ID@"
- VALUE "ProductName", "Slic3r Prusa Edition"
+ VALUE "ProductName", "@SLIC3R_APP_NAME@"
VALUE "ProductVersion", "@SLIC3R_BUILD_ID@"
- VALUE "InternalName", "Slic3r Prusa Edition"
- VALUE "LegalCopyright", "Copyright \251 2011-2017 Alessandro Ranelucci, \251 2016 Prusa Research"
+ VALUE "InternalName", "@SLIC3R_APP_NAME@"
+ VALUE "LegalCopyright", "Copyright \251 2011-2019 Alessandro Ranelucci, \251 2016-2019 Prusa Research"
VALUE "OriginalFilename", "slic3r.exe"
}
}
diff --git a/src/platform/osx/Info.plist.in b/src/platform/osx/Info.plist.in
index 35958acde..9314bdaab 100644
--- a/src/platform/osx/Info.plist.in
+++ b/src/platform/osx/Info.plist.in
@@ -3,15 +3,15 @@
CFBundleExecutable
- Slic3r
+ @SLIC3R_APP_KEY@
CFBundleGetInfoString
- Slic3r Copyright (C) 2011-2017 Alessandro Ranellucci, (C) 2016-2018 Prusa Reseach
+ @SLIC3R_APP_NAME@ Copyright (C) 2011-2019 Alessandro Ranellucci, (C) 2016-2019 Prusa Reseach
CFBundleIconFile
Slic3r.icns
CFBundleName
- Slic3r
+ @SLIC3R_APP_KEY@
CFBundleShortVersionString
- Slic3r @SLIC3R_BUILD_ID@
+ @SLIC3R_APP_NAME@ @SLIC3R_BUILD_ID@
CFBundleIdentifier
com.prusa3d.slic3r/
CFBundleInfoDictionaryVersion
diff --git a/src/slic3r.cpp b/src/slic3r.cpp
index ff87b3f6d..c3e69a189 100644
--- a/src/slic3r.cpp
+++ b/src/slic3r.cpp
@@ -568,7 +568,7 @@ bool CLI::setup(int argc, char **argv)
void CLI::print_help(bool include_print_options, PrinterTechnology printer_technology) const
{
boost::nowide::cout
- << "Slic3r Prusa Edition " << SLIC3R_BUILD
+ << SLIC3R_APP_NAME << " " << SLIC3R_BUILD
#ifdef SLIC3R_GUI
<< " (with GUI support)"
#else /* SLIC3R_GUI */
diff --git a/src/slic3r/GUI/AboutDialog.cpp b/src/slic3r/GUI/AboutDialog.cpp
index 44d1972bc..b2b025880 100644
--- a/src/slic3r/GUI/AboutDialog.cpp
+++ b/src/slic3r/GUI/AboutDialog.cpp
@@ -32,7 +32,7 @@ void AboutDialogLogo::onRepaint(wxEvent &event)
}
AboutDialog::AboutDialog()
- : DPIDialog(NULL, wxID_ANY, _(L("About Slic3r")), wxDefaultPosition,
+ : DPIDialog(NULL, wxID_ANY, wxString::Format(_(L("About %s")), SLIC3R_APP_NAME), wxDefaultPosition,
wxDefaultSize, /*wxCAPTION*/wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
{
SetFont(wxGetApp().normal_font());
@@ -55,7 +55,7 @@ AboutDialog::AboutDialog()
// title
{
- wxStaticText* title = new wxStaticText(this, wxID_ANY, "Slic3r Prusa Edition", wxDefaultPosition, wxDefaultSize);
+ wxStaticText* title = new wxStaticText(this, wxID_ANY, SLIC3R_APP_NAME, wxDefaultPosition, wxDefaultSize);
wxFont title_font = GUI::wxGetApp().bold_font();// wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
// title_font.SetWeight(wxFONTWEIGHT_BOLD);
title_font.SetFamily(wxFONTFAMILY_ROMAN);
diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.cpp b/src/slic3r/GUI/BackgroundSlicingProcess.cpp
index c6a73864d..e5135ef43 100644
--- a/src/slic3r/GUI/BackgroundSlicingProcess.cpp
+++ b/src/slic3r/GUI/BackgroundSlicingProcess.cpp
@@ -16,6 +16,7 @@
#include "libslic3r/Utils.hpp"
#include "libslic3r/GCode/PostProcessor.hpp"
#include "libslic3r/GCode/PreviewData.hpp"
+#include "libslic3r/libslic3r.h"
#include
#include
@@ -390,7 +391,7 @@ void BackgroundSlicingProcess::prepare_upload()
// Generate a unique temp path to which the gcode/zip file is copied/exported
boost::filesystem::path source_path = boost::filesystem::temp_directory_path()
- / boost::filesystem::unique_path(".Slic3rPE.upload.%%%%-%%%%-%%%%-%%%%");
+ / boost::filesystem::unique_path("." SLIC3R_APP_KEY ".upload.%%%%-%%%%-%%%%-%%%%");
if (m_print == m_fff_print) {
m_print->set_status(95, "Running post-processing scripts");
diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp
index 30ccc1ba5..db116a5dd 100644
--- a/src/slic3r/GUI/BitmapCache.cpp
+++ b/src/slic3r/GUI/BitmapCache.cpp
@@ -261,9 +261,6 @@ wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_
wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency)
{
- width = width * 0.1f * Slic3r::GUI::wxGetApp().em_unit() + 0.5f;
- height = height * 0.1f * Slic3r::GUI::wxGetApp().em_unit() + 0.5f;
-
wxImage image(width, height);
image.InitAlpha();
unsigned char* imgdata = image.GetData();
diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp
index 641f1cb72..263c5646d 100644
--- a/src/slic3r/GUI/ConfigWizard.cpp
+++ b/src/slic3r/GUI/ConfigWizard.cpp
@@ -281,13 +281,14 @@ void ConfigWizardPage::append_spacer(int space)
// Wizard pages
PageWelcome::PageWelcome(ConfigWizard *parent)
- : ConfigWizardPage(parent, wxString::Format(_(L("Welcome to the Slic3r %s")), ConfigWizard::name()), _(L("Welcome")))
+ : ConfigWizardPage(parent, wxString::Format(_(L("Welcome to the %s %s")), SLIC3R_APP_NAME, ConfigWizard::name()), _(L("Welcome")))
, cbox_reset(nullptr)
{
if (wizard_p()->run_reason == ConfigWizard::RR_DATA_EMPTY) {
wxString::Format(_(L("Run %s")), ConfigWizard::name());
append_text(wxString::Format(
- _(L("Hello, welcome to Slic3r Prusa Edition! This %s helps you with the initial configuration; just a few settings and you will be ready to print.")),
+ _(L("Hello, welcome to %s! This %s helps you with the initial configuration; just a few settings and you will be ready to print.")),
+ SLIC3R_APP_NAME,
ConfigWizard::name())
);
} else {
@@ -398,7 +399,9 @@ PageUpdate::PageUpdate(ConfigWizard *parent)
auto *box_slic3r = new wxCheckBox(this, wxID_ANY, _(L("Check for application updates")));
box_slic3r->SetValue(app_config->get("version_check") == "1");
append(box_slic3r);
- append_text(_(L("If enabled, Slic3r checks for new versions of Slic3r PE online. When a new version becomes available a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done.")));
+ append_text(wxString::Format(_(L("If enabled, Slic3r checks for new versions of %s online. When a new version becomes available, "
+ "a notification is displayed at the next application startup (never during program usage). "
+ "This is only a notification mechanisms, no automatic installation is done.")), SLIC3R_APP_NAME));
append_spacer(VERTICAL_SPACING);
@@ -420,7 +423,7 @@ PageUpdate::PageUpdate(ConfigWizard *parent)
PageVendors::PageVendors(ConfigWizard *parent)
: ConfigWizardPage(parent, _(L("Other Vendors")), _(L("Other Vendors")))
{
- append_text(_(L("Pick another vendor supported by Slic3r PE:")));
+ append_text(wxString::Format(_(L("Pick another vendor supported by %s:")), SLIC3R_APP_NAME));
auto boldfont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
boldfont.SetWeight(wxFONTWEIGHT_BOLD);
@@ -779,6 +782,8 @@ void ConfigWizardIndex::on_paint(wxPaintEvent & evt)
const int yoff_text = bullet_h > em_h ? (bullet_h - em_h) / 2 : 0;
const int yinc = item_height();
+ int index_width = 0;
+
unsigned y = 0;
for (size_t i = 0; i < items.size(); i++) {
const Item& item = items[i];
@@ -796,8 +801,18 @@ void ConfigWizardIndex::on_paint(wxPaintEvent & evt)
else if (i < item_active) { dc.DrawBitmap(bullet_black.bmp(), x, y + yoff_icon, false); }
else if (i > item_active) { dc.DrawBitmap(bullet_white.bmp(), x, y + yoff_icon, false); }
- dc.DrawText(item.label, x + bullet_w + em/2, y + yoff_text);
+ x += + bullet_w + em/2;
+ const auto text_size = dc.GetTextExtent(item.label);
+ dc.DrawText(item.label, x, y + yoff_text);
+
y += yinc;
+ index_width = std::max(index_width, (int)x + text_size.x);
+ }
+
+ if (GetMinSize().x < index_width) {
+ CallAfter([this, index_width]() {
+ SetMinSize(wxSize(index_width, GetMinSize().y));
+ });
}
}
diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp
index c4f0a3a91..cfae43027 100644
--- a/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/src/slic3r/GUI/GLCanvas3D.cpp
@@ -1486,6 +1486,8 @@ void GLCanvas3D::enable_layers_editing(bool enable)
if (v->is_modifier)
v->force_transparent = enable;
}
+
+ set_as_dirty();
}
void GLCanvas3D::enable_legend_texture(bool enable)
@@ -1654,7 +1656,7 @@ void GLCanvas3D::render()
#endif // !ENABLE_SVG_ICONS
_render_toolbar();
_render_view_toolbar();
- if (m_layers_editing.last_object_id >= 0)
+ if ((m_layers_editing.last_object_id >= 0) && (m_layers_editing.object_max_z() > 0.0f))
m_layers_editing.render_overlay(*this);
wxGetApp().imgui()->render();
@@ -2254,6 +2256,22 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
#endif /* __APPLE__ */
post_event(SimpleEvent(EVT_GLCANVAS_SELECT_ALL));
break;
+#ifdef __APPLE__
+ case 'c':
+ case 'C':
+#else /* __APPLE__ */
+ case WXK_CONTROL_C:
+#endif /* __APPLE__ */
+ post_event(SimpleEvent(EVT_GLTOOLBAR_COPY));
+ break;
+#ifdef __APPLE__
+ case 'v':
+ case 'V':
+#else /* __APPLE__ */
+ case WXK_CONTROL_V:
+#endif /* __APPLE__ */
+ post_event(SimpleEvent(EVT_GLTOOLBAR_PASTE));
+ break;
#ifdef __APPLE__
case WXK_BACK: // the low cost Apple solutions are not equipped with a Delete key, use Backspace instead.
#else /* __APPLE__ */
@@ -2372,6 +2390,10 @@ void GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt)
}
}
+ // Inform gizmos about the event so they have the opportunity to react.
+ if (m_gizmos.on_mouse_wheel(evt, *this))
+ return;
+
// Calculate the zoom delta and apply it to the current zoom factor
float zoom = (float)evt.GetWheelRotation() / (float)evt.GetWheelDelta();
set_camera_zoom(zoom);
@@ -2596,7 +2618,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
m_selection.remove(m_hover_volume_id);
else
{
- m_selection.add(m_hover_volume_id, !ctrl_down);
+ m_selection.add(m_hover_volume_id, !ctrl_down, true);
m_mouse.drag.move_requires_threshold = !already_selected;
if (already_selected)
m_mouse.set_move_start_threshold_position_2D_as_invalid();
@@ -3676,8 +3698,8 @@ void GLCanvas3D::_render_objects() const
m_volumes.set_clipping_plane(m_camera_clipping_plane.get_data());
m_shader.start_using();
- if (m_picking_enabled && m_layers_editing.is_enabled() && m_layers_editing.last_object_id != -1) {
- int object_id = m_layers_editing.last_object_id;
+ if (m_picking_enabled && !m_gizmos.is_dragging() && m_layers_editing.is_enabled() && (m_layers_editing.last_object_id != -1) && (m_layers_editing.object_max_z() > 0.0f)) {
+ int object_id = m_layers_editing.last_object_id;
m_volumes.render_VBOs(GLVolumeCollection::Opaque, false, m_camera.get_view_matrix(), [object_id](const GLVolume &volume) {
// Which volume to paint without the layer height profile shader?
return volume.is_active && (volume.is_modifier || volume.composite_id.object_id != object_id);
diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp
index 42385bd63..154b4475f 100644
--- a/src/slic3r/GUI/GUI_App.cpp
+++ b/src/slic3r/GUI/GUI_App.cpp
@@ -34,7 +34,7 @@
#include "../Utils/PresetUpdater.hpp"
#include "../Utils/PrintHost.hpp"
-#include "ConfigWizard_private.hpp"
+#include "ConfigWizard.hpp"
#include "slic3r/Config/Snapshot.hpp"
#include "ConfigSnapshotDialog.hpp"
#include "FirmwareDialog.hpp"
@@ -149,8 +149,8 @@ bool GUI_App::on_init_inner()
wxCHECK_MSG(wxDirExists(resources_dir), false,
wxString::Format("Resources path does not exist or is not a directory: %s", resources_dir));
- SetAppName("Slic3rPE-beta");
- SetAppDisplayName("Slic3r Prusa Edition");
+ SetAppName(SLIC3R_APP_KEY "-beta");
+ SetAppDisplayName(SLIC3R_APP_NAME);
// Enable this to get the default Win32 COMCTRL32 behavior of static boxes.
// wxSystemOptions::SetOption("msw.staticbox.optimized-paint", 0);
@@ -230,7 +230,7 @@ bool GUI_App::on_init_inner()
// and after MainFrame is created & shown.
// The extra CallAfter() is needed because of Mac, where this is the only way
// to popup a modal dialog on start without screwing combo boxes.
- // This is ugly but I honestly found not better way to do it.
+ // This is ugly but I honestly found no better way to do it.
// Neither wxShowEvent nor wxWindowCreateEvent work reliably.
static bool once = true;
if (once) {
@@ -381,7 +381,7 @@ void GUI_App::recreate_GUI()
topwindow->Destroy();
}
- dlg.Update(80, _(L("Loading of a current presets")) + dots);
+ dlg.Update(80, _(L("Loading of current presets")) + dots);
m_printhost_job_queue.reset(new PrintHostJobQueue(mainframe->printhost_queue_dlg()));
@@ -513,7 +513,7 @@ bool GUI_App::select_language( wxArrayString & names,
m_wxLocale = new wxLocale;
m_wxLocale->Init(identifiers[index]);
m_wxLocale->AddCatalogLookupPathPrefix(from_u8(localization_dir()));
- m_wxLocale->AddCatalog(/*GetAppName()*/"Slic3rPE");
+ m_wxLocale->AddCatalog("Slic3rPE");
//FIXME This is a temporary workaround, the correct solution is to switch to "C" locale during file import / export only.
wxSetlocale(LC_NUMERIC, "C");
Preset::update_suffix_modified();
@@ -542,7 +542,7 @@ bool GUI_App::load_language()
m_wxLocale = new wxLocale;
m_wxLocale->Init(identifiers[i]);
m_wxLocale->AddCatalogLookupPathPrefix(from_u8(localization_dir()));
- m_wxLocale->AddCatalog(/*GetAppName()*/"Slic3rPE");
+ m_wxLocale->AddCatalog("Slic3rPE");
//FIXME This is a temporary workaround, the correct solution is to switch to "C" locale during file import / export only.
wxSetlocale(LC_NUMERIC, "C");
Preset::update_suffix_modified();
@@ -586,9 +586,7 @@ void GUI_App::get_installed_languages(wxArrayString & names, wxArrayLong & ident
if (langinfo != NULL)
{
auto full_file_name = dir.GetName() + wxFileName::GetPathSeparator() +
- filename + wxFileName::GetPathSeparator() +
- /*GetAppName()*/"Slic3rPE" +
- wxT(".mo");
+ filename + wxFileName::GetPathSeparator() + "Slic3rPE" + wxT(".mo");
if (wxFileExists(full_file_name))
{
names.Add(langinfo->Description);
diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp
index 0a3984d9e..0f3c7cb79 100644
--- a/src/slic3r/GUI/GUI_ObjectList.cpp
+++ b/src/slic3r/GUI/GUI_ObjectList.cpp
@@ -543,12 +543,13 @@ void ObjectList::paste_objects_into_list(const std::vector& object_idxs)
for (const size_t object : object_idxs)
{
add_object_to_list(object);
- m_parts_changed = true;
- parts_changed(object);
-
items.Add(m_objects_model->GetItemById(object));
}
+ m_parts_changed = true;
+ wxGetApp().plater()->changed_objects(object_idxs);
+ m_parts_changed = false;
+
select_items(items);
#ifndef __WXOSX__ //#ifdef __WXMSW__ // #ys_FIXME
selection_changed();
@@ -644,6 +645,10 @@ void ObjectList::key_event(wxKeyEvent& event)
}
else if (wxGetKeyState(wxKeyCode('A')) && wxGetKeyState(WXK_CONTROL/*WXK_SHIFT*/))
select_item_all_children();
+ else if (wxGetKeyState(wxKeyCode('C')) && wxGetKeyState(WXK_CONTROL))
+ wxPostEvent((wxEvtHandler*)wxGetApp().plater()->canvas3D()->get_wxglcanvas(), SimpleEvent(EVT_GLTOOLBAR_COPY));
+ else if (wxGetKeyState(wxKeyCode('V')) && wxGetKeyState(WXK_CONTROL))
+ wxPostEvent((wxEvtHandler*)wxGetApp().plater()->canvas3D()->get_wxglcanvas(), SimpleEvent(EVT_GLTOOLBAR_PASTE));
else
event.Skip();
}
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp
index 6bf43955f..42be32041 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp
@@ -16,7 +16,7 @@
namespace Slic3r {
namespace GUI {
-const float GLGizmoBase::Grabber::SizeFactor = 0.025f;
+ const float GLGizmoBase::Grabber::SizeFactor = 0.05f;
const float GLGizmoBase::Grabber::MinHalfSize = 1.5f;
const float GLGizmoBase::Grabber::DraggingScaleFactor = 1.25f;
@@ -53,7 +53,7 @@ float GLGizmoBase::Grabber::get_half_size(float size) const
float GLGizmoBase::Grabber::get_dragging_half_size(float size) const
{
- return std::max(size * SizeFactor * DraggingScaleFactor, MinHalfSize);
+ return get_half_size(size) * DraggingScaleFactor;
}
void GLGizmoBase::Grabber::render(float size, const float* render_color, bool use_lighting) const
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp
index 7cc5b6485..346bf5b06 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp
@@ -150,7 +150,8 @@ void GLGizmoMove3D::on_render(const Selection& selection) const
glsafe(::glEnd());
// draw grabber
- m_grabbers[m_hover_id].render(true, box.max_size());
+ float mean_size = (float)((box.size()(0) + box.size()(1) + box.size()(2)) / 3.0);
+ m_grabbers[m_hover_id].render(true, mean_size);
render_grabber_extension((Axis)m_hover_id, box, false);
}
}
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
index aa88f9dd5..ab3f7eb46 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
@@ -51,6 +51,9 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S
return;
}
+ if (m_model_object != model_object)
+ m_print_object_idx = -1;
+
m_model_object = model_object;
m_active_instance = selection.get_instance_idx();
@@ -89,54 +92,113 @@ void GLGizmoSlaSupports::on_render(const Selection& selection) const
glsafe(::glEnable(GL_BLEND));
glsafe(::glEnable(GL_DEPTH_TEST));
- // we'll recover current look direction from the modelview matrix (in world coords):
- Eigen::Matrix modelview_matrix;
- ::glGetDoublev(GL_MODELVIEW_MATRIX, modelview_matrix.data());
- Vec3d direction_to_camera(modelview_matrix.data()[2], modelview_matrix.data()[6], modelview_matrix.data()[10]);
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, direction_to_camera, false);
+ render_points(selection, false);
render_selection_rectangle();
- render_clipping_plane(selection, direction_to_camera);
+ render_clipping_plane(selection);
glsafe(::glDisable(GL_BLEND));
}
-void GLGizmoSlaSupports::render_clipping_plane(const Selection& selection, const Vec3d& direction_to_camera) const
+void GLGizmoSlaSupports::render_clipping_plane(const Selection& selection) const
{
if (m_clipping_plane_distance == 0.f)
return;
+ if (m_clipping_plane_normal == Vec3d::Zero())
+ reset_clipping_plane_normal();
+
+ const Vec3d& direction_to_camera = m_clipping_plane_normal;
+
+ // First cache instance transformation to be used later.
const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin());
Transform3f instance_matrix = vol->get_instance_transformation().get_matrix().cast();
Transform3f instance_matrix_no_translation_no_scaling = vol->get_instance_transformation().get_matrix(true,false,true).cast();
Vec3f scaling = vol->get_instance_scaling_factor().cast();
+ Vec3d instance_offset = vol->get_instance_offset();
+ // Calculate distance from mesh origin to the clipping plane (in mesh coordinates).
Vec3f up_noscale = instance_matrix_no_translation_no_scaling.inverse() * direction_to_camera.cast();
Vec3f up = Vec3f(up_noscale(0)*scaling(0), up_noscale(1)*scaling(1), up_noscale(2)*scaling(2));
float height_mesh = (m_active_instance_bb_radius - m_clipping_plane_distance * 2*m_active_instance_bb_radius) * (up_noscale.norm()/up.norm());
- if (m_clipping_plane_distance != m_old_clipping_plane_distance
- || m_old_direction_to_camera != direction_to_camera) {
+ // Get transformation of the supports and calculate how far from its origin the clipping plane is.
+ Transform3d supports_trafo = Transform3d::Identity();
+ supports_trafo = supports_trafo.rotate(Eigen::AngleAxisd(vol->get_instance_rotation()(2), Vec3d::UnitZ()));
+ Vec3f up_supports = (supports_trafo.inverse() * direction_to_camera).cast();
+ supports_trafo = supports_trafo.pretranslate(Vec3d(instance_offset(0), instance_offset(1), vol->get_sla_shift_z()));
+ // Instance and supports origin do not coincide, so the following is quite messy:
+ float height_supports = height_mesh * (up.norm() / up_supports.norm()) + instance_offset(2) * (direction_to_camera(2) / direction_to_camera.norm());
- std::vector list_of_expolys;
+ // In case either of these was recently changed, the cached triangulated ExPolygons are invalid now.
+ // We are gonna recalculate them both for the object and for the support structures.
+ if (m_clipping_plane_distance != m_old_clipping_plane_distance
+ || m_old_clipping_plane_normal != direction_to_camera) {
+
+ m_old_clipping_plane_normal = direction_to_camera;
+ m_old_clipping_plane_distance = m_clipping_plane_distance;
+
+ // Now initialize the TMS for the object, perform the cut and save the result.
if (! m_tms) {
m_tms.reset(new TriangleMeshSlicer);
- m_tms->init(const_cast(&m_mesh), [](){});
+ m_tms->init(m_mesh, [](){});
}
-
+ std::vector list_of_expolys;
m_tms->set_up_direction(up);
m_tms->slice(std::vector{height_mesh}, 0.f, &list_of_expolys, [](){});
m_triangles = triangulate_expolygons_2f(list_of_expolys[0]);
- m_old_direction_to_camera = direction_to_camera;
- m_old_clipping_plane_distance = m_clipping_plane_distance;
+
+
+ // 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_print_object_idx < 0 || (int)m_parent.sla_print()->objects().size() != m_print_objects_count) {
+ m_print_objects_count = m_parent.sla_print()->objects().size();
+ m_print_object_idx = -1;
+ for (const SLAPrintObject* po : m_parent.sla_print()->objects()) {
+ ++m_print_object_idx;
+ if (po->model_object()->id() == m_model_object->id())
+ break;
+ }
+ }
+ if (m_print_object_idx >= 0) {
+ const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_print_object_idx];
+
+ if (print_object->is_step_done(slaposSupportTree)) {
+ // 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_supports_tms || (int)timestamp != m_old_timestamp) {
+ // The timestamp has changed - stash the mesh and initialize the TMS.
+ m_supports_mesh = &print_object->support_mesh();
+ m_supports_tms.reset(new TriangleMeshSlicer);
+ // The mesh should already have the shared vertices calculated.
+ m_supports_tms->init(m_supports_mesh, [](){});
+ m_old_timestamp = timestamp;
+ }
+
+ // The TMS is initialized - let's do the cutting:
+ list_of_expolys.clear();
+ m_supports_tms->set_up_direction(up_supports);
+ m_supports_tms->slice(std::vector{height_supports}, 0.f, &list_of_expolys, [](){});
+ m_supports_triangles = triangulate_expolygons_2f(list_of_expolys[0]);
+ }
+ else {
+ // The supports are not valid. We better dump the cached data.
+ m_supports_tms.reset();
+ m_supports_triangles.clear();
+ }
+ }
}
+ // At this point we have the triangulated cuts for both the object and supports - let's render.
if (! m_triangles.empty()) {
::glPushMatrix();
::glTranslated(0.0, 0.0, m_z_shift);
@@ -145,12 +207,30 @@ void GLGizmoSlaSupports::render_clipping_plane(const Selection& selection, const
q.setFromTwoVectors(Vec3f::UnitZ(), up);
Eigen::AngleAxisf aa(q);
::glRotatef(aa.angle() * (180./M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2));
- ::glTranslatef(0.f, 0.f, -0.001f); // to make sure the cut is safely beyond the near clipping plane
- ::glColor3f(1.0f, 0.37f, 0.0f);
- ::glBegin(GL_TRIANGLES);
+ ::glTranslatef(0.f, 0.f, 0.01f); // to make sure the cut does not intersect the structure itself
::glColor3f(1.0f, 0.37f, 0.0f);
+ ::glBegin(GL_TRIANGLES);
for (const Vec2f& point : m_triangles)
::glVertex3f(point(0), point(1), height_mesh);
+
+ ::glEnd();
+ ::glPopMatrix();
+ }
+
+ if (! m_supports_triangles.empty() && !m_editing_mode) {
+ // The supports are hidden in the editing mode, so it makes no sense to render the cuts.
+ ::glPushMatrix();
+ ::glMultMatrixd(supports_trafo.data());
+ Eigen::Quaternionf q;
+ q.setFromTwoVectors(Vec3f::UnitZ(), up_supports);
+ Eigen::AngleAxisf aa(q);
+ ::glRotatef(aa.angle() * (180./M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2));
+ ::glTranslatef(0.f, 0.f, 0.01f);
+ ::glColor3f(1.0f, 0.f, 0.37f);
+ ::glBegin(GL_TRIANGLES);
+ for (const Vec2f& point : m_supports_triangles)
+ ::glVertex3f(point(0), point(1), height_supports);
+
::glEnd();
::glPopMatrix();
}
@@ -206,16 +286,10 @@ void GLGizmoSlaSupports::render_selection_rectangle() const
void GLGizmoSlaSupports::on_render_for_picking(const Selection& selection) const
{
glsafe(::glEnable(GL_DEPTH_TEST));
-
- // we'll recover current look direction from the modelview matrix (in world coords):
- Eigen::Matrix modelview_matrix;
- ::glGetDoublev(GL_MODELVIEW_MATRIX, modelview_matrix.data());
- Vec3d direction_to_camera(modelview_matrix.data()[2], modelview_matrix.data()[6], modelview_matrix.data()[10]);
-
- render_points(selection, direction_to_camera, true);
+ render_points(selection, true);
}
-void GLGizmoSlaSupports::render_points(const Selection& selection, const Vec3d& direction_to_camera, bool picking) const
+void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const
{
if (!picking)
glsafe(::glEnable(GL_LIGHTING));
@@ -234,7 +308,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, const Vec3d&
const sla::SupportPoint& support_point = m_editing_mode_cache[i].support_point;
const bool& point_selected = m_editing_mode_cache[i].selected;
- if (is_point_clipped(support_point.pos.cast(), direction_to_camera))
+ if (is_point_clipped(support_point.pos.cast()))
continue;
// First decide about the color of the point.
@@ -308,8 +382,10 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, const Vec3d&
-bool GLGizmoSlaSupports::is_point_clipped(const Vec3d& point, const Vec3d& direction_to_camera) const
+bool GLGizmoSlaSupports::is_point_clipped(const Vec3d& point) const
{
+ const Vec3d& direction_to_camera = m_clipping_plane_normal;
+
if (m_clipping_plane_distance == 0.f)
return false;
@@ -332,9 +408,12 @@ void GLGizmoSlaSupports::update_mesh()
wxBusyCursor wait;
Eigen::MatrixXf& V = m_V;
Eigen::MatrixXi& F = m_F;
+ // We rely on SLA model object having a single volume,
+ // this way we can use that mesh directly.
// This mesh does not account for the possible Z up SLA offset.
- m_mesh = m_model_object->raw_mesh();
- const stl_file& stl = m_mesh.stl;
+ m_mesh = &m_model_object->volumes.front()->mesh;
+ const_cast(m_mesh)->require_shared_vertices(); // TriangleMeshSlicer needs this
+ const stl_file& stl = m_mesh->stl;
V.resize(3 * stl.stats.number_of_facets, 3);
F.resize(stl.stats.number_of_facets, 3);
for (unsigned int i=0; i GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse
const Selection& selection = m_parent.get_selection();
const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin());
- // we'll recover current look direction from the modelview matrix (in world coords):
- Vec3d direction_to_camera(modelview_matrix.data()[2], modelview_matrix.data()[6], modelview_matrix.data()[10]);
-
point1(2) -= m_z_shift;
point2(2) -= m_z_shift;
@@ -405,7 +481,7 @@ std::pair GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse
a = (m_V.row(m_F(fid, 1)) - m_V.row(m_F(fid, 0)));
b = (m_V.row(m_F(fid, 2)) - m_V.row(m_F(fid, 0)));
result = bc(0) * m_V.row(m_F(fid, 0)) + bc(1) * m_V.row(m_F(fid, 1)) + bc(2)*m_V.row(m_F(fid, 2));
- if (m_clipping_plane_distance == 0.f || !is_point_clipped(result.cast(), direction_to_camera))
+ if (m_clipping_plane_distance == 0.f || !is_point_clipped(result.cast()))
break;
}
@@ -510,7 +586,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous
::gluProject((GLdouble)pos(0), (GLdouble)pos(1), (GLdouble)pos(2), (GLdouble*)modelview_matrix.data(), (GLdouble*)projection_matrix.data(), (GLint*)viewport.data(), &out_x, &out_y, &out_z);
out_y = m_canvas_height - out_y;
- if (rectangle.contains(Point(out_x, out_y)) && !is_point_clipped(support_point.pos.cast(), direction_to_camera.cast())) {
+ if (rectangle.contains(Point(out_x, out_y)) && !is_point_clipped(support_point.pos.cast())) {
bool is_obscured = false;
// Cast a ray in the direction of the camera and look for intersection with the mesh:
std::vector hits;
@@ -534,7 +610,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous
Vec3f bc = Vec3f(1-hit.u-hit.v, hit.u, hit.v); // barycentric coordinates of the hit
Vec3f hit_pos = bc(0) * m_V.row(m_F(fid, 0)) + bc(1) * m_V.row(m_F(fid, 1)) + bc(2)*m_V.row(m_F(fid, 2));
- if (is_point_clipped(hit_pos.cast(), direction_to_camera.cast())) {
+ if (is_point_clipped(hit_pos.cast())) {
hits.erase(hits.begin()+j);
--j;
}
@@ -626,6 +702,23 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous
}
}
+ if (action == SLAGizmoEventType::MouseWheelUp && control_down) {
+ m_clipping_plane_distance = std::min(1.f, m_clipping_plane_distance + 0.01f);
+ m_parent.set_as_dirty();
+ return true;
+ }
+
+ if (action == SLAGizmoEventType::MouseWheelDown && control_down) {
+ m_clipping_plane_distance = std::max(0.f, m_clipping_plane_distance - 0.01f);
+ m_parent.set_as_dirty();
+ return true;
+ }
+
+ if (action == SLAGizmoEventType::ResetClippingPlane) {
+ reset_clipping_plane_normal();
+ return true;
+ }
+
return false;
}
@@ -709,11 +802,12 @@ ClippingPlane GLGizmoSlaSupports::get_sla_clipping_plane() const
if (!m_model_object || m_state == Off)
return ClippingPlane::ClipsNothing();
- Eigen::Matrix modelview_matrix;
- ::glGetDoublev(GL_MODELVIEW_MATRIX, modelview_matrix.data());
-
+ //Eigen::Matrix modelview_matrix;
+ //::glGetDoublev(GL_MODELVIEW_MATRIX, modelview_matrix.data());
// we'll recover current look direction from the modelview matrix (in world coords):
- Vec3d direction_to_camera(modelview_matrix.data()[2], modelview_matrix.data()[6], modelview_matrix.data()[10]);
+ //Vec3d direction_to_camera(modelview_matrix.data()[2], modelview_matrix.data()[6], modelview_matrix.data()[10]);
+
+ const Vec3d& direction_to_camera = m_clipping_plane_normal;
float dist = direction_to_camera.dot(m_model_object->instances[m_active_instance]->get_offset() + Vec3d(0., 0., m_z_shift));
return ClippingPlane(-direction_to_camera.normalized(),(dist - (-m_active_instance_bb_radius) - m_clipping_plane_distance * 2*m_active_instance_bb_radius));
@@ -872,18 +966,27 @@ RENDER_AGAIN:
m_imgui->text("");
- m_imgui->text(m_model_object->sla_points_status == sla::PointsStatus::None ? "No points (will be autogenerated)" :
- (m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated ? "Autogenerated points (no modifications)" :
- (m_model_object->sla_points_status == sla::PointsStatus::UserModified ? "User-modified points" :
- (m_model_object->sla_points_status == sla::PointsStatus::Generating ? "Generation in progress..." : "UNKNOWN STATUS"))));
+ m_imgui->text(m_model_object->sla_points_status == sla::PointsStatus::None ? _(L("No points (will be autogenerated)")) :
+ (m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated ? _(L("Autogenerated points (no modifications)")) :
+ (m_model_object->sla_points_status == sla::PointsStatus::UserModified ? _(L("User-modified points")) :
+ (m_model_object->sla_points_status == sla::PointsStatus::Generating ? _(L("Generation in progress...")) : "UNKNOWN STATUS"))));
}
// Following is rendered in both editing and non-editing mode:
- m_imgui->text("Clipping of view: ");
- ImGui::SameLine();
+ if (m_clipping_plane_distance == 0.f)
+ m_imgui->text("Clipping of view: ");
+ else {
+ if (m_imgui->button(_(L("Reset direction [R] ")))) {
+ wxGetApp().CallAfter([this](){
+ reset_clipping_plane_normal();
+ });
+ }
+ }
+
+ ImGui::SameLine(140.f);
ImGui::PushItemWidth(150.0f);
- bool value_changed = ImGui::SliderFloat(" ", &m_clipping_plane_distance, 0.f, 1.f, "%.2f");
+ ImGui::SliderFloat(" ", &m_clipping_plane_distance, 0.f, 1.f, "%.2f");
m_imgui->end();
@@ -972,12 +1075,12 @@ void GLGizmoSlaSupports::on_set_state()
m_editing_mode = false; // so it is not active next time the gizmo opens
m_editing_mode_cache.clear();
m_clipping_plane_distance = 0.f;
- // Release copy of the mesh, triangle slicer and the AABB spatial search structure.
- m_mesh.clear();
+ // Release triangle mesh slicer and the AABB spatial search structure.
m_AABB.deinit();
m_V = Eigen::MatrixXf();
m_F = Eigen::MatrixXi();
- m_tms.reset(nullptr);
+ m_tms.reset();
+ m_supports_tms.reset();
});
}
m_old_state = m_state;
@@ -1126,5 +1229,17 @@ void GLGizmoSlaSupports::switch_to_editing_mode()
m_editing_mode = true;
}
+
+
+void GLGizmoSlaSupports::reset_clipping_plane_normal() const
+{
+ Eigen::Matrix modelview_matrix;
+ ::glGetDoublev(GL_MODELVIEW_MATRIX, modelview_matrix.data());
+ m_clipping_plane_normal = Vec3d(modelview_matrix.data()[2], modelview_matrix.data()[6], modelview_matrix.data()[10]);
+ m_parent.set_as_dirty();
+}
+
+
+
} // namespace GUI
} // namespace Slic3r
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp
index c74559e2f..982f6c95d 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp
@@ -36,8 +36,13 @@ private:
Eigen::MatrixXf m_V; // vertices
Eigen::MatrixXi m_F; // facets indices
igl::AABB m_AABB;
- TriangleMesh m_mesh;
+ const TriangleMesh* m_mesh;
+ mutable const TriangleMesh* m_supports_mesh;
mutable std::vector m_triangles;
+ mutable std::vector m_supports_triangles;
+ mutable int m_old_timestamp = -1;
+ mutable int m_print_object_idx = -1;
+ mutable int m_print_objects_count = -1;
class CacheEntry {
public:
@@ -68,8 +73,8 @@ private:
virtual void on_render_for_picking(const Selection& selection) const;
void render_selection_rectangle() const;
- void render_points(const Selection& selection, const Vec3d& direction_to_camera, bool picking = false) const;
- void render_clipping_plane(const Selection& selection, const Vec3d& direction_to_camera) const;
+ void render_points(const Selection& selection, bool picking = false) const;
+ void render_clipping_plane(const Selection& selection) const;
bool is_mesh_update_necessary() const;
void update_mesh();
void update_cache_entry_normal(unsigned int i) const;
@@ -79,11 +84,11 @@ private:
bool m_old_editing_state = false; // To keep track of whether the user toggled between the modes (needed for imgui refreshes).
float m_new_point_head_diameter; // Size of a new point.
float m_minimal_point_distance = 20.f;
- float m_density = 100.f;
mutable std::vector m_editing_mode_cache; // a support point and whether it is currently selected
float m_clipping_plane_distance = 0.f;
mutable float m_old_clipping_plane_distance = 0.f;
- mutable Vec3d m_old_direction_to_camera;
+ mutable Vec3d m_old_clipping_plane_normal;
+ mutable Vec3d m_clipping_plane_normal = Vec3d::Zero();
enum SelectionRectangleStatus {
srOff = 0,
@@ -101,10 +106,11 @@ private:
int m_canvas_height;
mutable std::unique_ptr m_tms;
+ mutable std::unique_ptr m_supports_tms;
std::vector get_config_options(const std::vector& keys) const;
- bool is_point_clipped(const Vec3d& point, const Vec3d& direction_to_camera) const;
- void find_intersecting_facets(const igl::AABB* aabb, const Vec3f& normal, double offset, std::vector& out) const;
+ bool is_point_clipped(const Vec3d& point) const;
+ //void find_intersecting_facets(const igl::AABB* aabb, const Vec3f& normal, double offset, std::vector& out) const;
// Methods that do the model_object and editing cache synchronization,
// editing mode selection, etc:
@@ -120,6 +126,7 @@ private:
void get_data_from_backend();
void auto_generate();
void switch_to_editing_mode();
+ void reset_clipping_plane_normal() const;
protected:
void on_set_state() override;
diff --git a/src/slic3r/GUI/Gizmos/GLGizmos.hpp b/src/slic3r/GUI/Gizmos/GLGizmos.hpp
index 95c5754c1..2e98899be 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmos.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmos.hpp
@@ -14,7 +14,10 @@ enum class SLAGizmoEventType {
ApplyChanges,
DiscardChanges,
AutomaticGeneration,
- ManualEditing
+ ManualEditing,
+ MouseWheelUp,
+ MouseWheelDown,
+ ResetClippingPlane
};
#include "slic3r/GUI/Gizmos/GLGizmoMove.hpp"
diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp
index cb2d6faed..5e37e42ad 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp
@@ -520,6 +520,23 @@ void GLGizmosManager::render_overlay(const GLCanvas3D& canvas, const Selection&
glsafe(::glPopMatrix());
}
+
+
+bool GLGizmosManager::on_mouse_wheel(wxMouseEvent& evt, GLCanvas3D& canvas)
+{
+ bool processed = false;
+
+ if (m_current == SlaSupports) {
+ 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;
+ }
+
+ return processed;
+}
+
+
+
bool GLGizmosManager::on_mouse(wxMouseEvent& evt, GLCanvas3D& canvas)
{
Point pos(evt.GetX(), evt.GetY());
@@ -761,6 +778,16 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt, GLCanvas3D& canvas)
break;
}
+
+ case 'r' :
+ case 'R' :
+ {
+ if ((m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::ResetClippingPlane))
+ processed = true;
+
+ break;
+ }
+
#ifdef __APPLE__
case WXK_BACK: // the low cost Apple solutions are not equipped with a Delete key, use Backspace instead.
#else /* __APPLE__ */
@@ -794,7 +821,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt, GLCanvas3D& canvas)
}
}
- if (!processed)
+ if (!processed && !evt.HasModifiers())
{
if (handle_shortcut(keyCode, canvas.get_selection()))
{
diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp
index f7a1a980e..a04ced5fa 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp
@@ -157,6 +157,7 @@ public:
const std::string& get_tooltip() const { return m_tooltip; }
bool on_mouse(wxMouseEvent& evt, GLCanvas3D& canvas);
+ bool on_mouse_wheel(wxMouseEvent& evt, GLCanvas3D& canvas);
bool on_char(wxKeyEvent& evt, GLCanvas3D& canvas);
bool on_key(wxKeyEvent& evt, GLCanvas3D& canvas);
diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp
index 63f331b92..9a4561f07 100644
--- a/src/slic3r/GUI/KBShortcutsDialog.cpp
+++ b/src/slic3r/GUI/KBShortcutsDialog.cpp
@@ -10,7 +10,7 @@ namespace Slic3r {
namespace GUI {
KBShortcutsDialog::KBShortcutsDialog()
- : DPIDialog(NULL, wxID_ANY, _(L("Slic3r Prusa Edition - Keyboard Shortcuts")),
+ : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("Keyboard Shortcuts")),
wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
{
SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
@@ -136,6 +136,8 @@ void KBShortcutsDialog::fill_shortcuts()
plater_shortcuts.push_back(Shortcut(ctrl+"A", L("Select All objects")));
plater_shortcuts.push_back(Shortcut("Del", L("Delete selected")));
plater_shortcuts.push_back(Shortcut(ctrl+"Del", L("Delete All")));
+ plater_shortcuts.push_back(Shortcut(ctrl+"C", L("Copy to clipboard")));
+ plater_shortcuts.push_back(Shortcut(ctrl+"V", L("Paste from clipboard")));
plater_shortcuts.push_back(Shortcut("M", L("Gizmo move")));
plater_shortcuts.push_back(Shortcut("S", L("Gizmo scale")));
plater_shortcuts.push_back(Shortcut("R", L("Gizmo rotate")));
@@ -177,8 +179,8 @@ void KBShortcutsDialog::fill_shortcuts()
Shortcuts layers_slider_shortcuts;
layers_slider_shortcuts.reserve(6);
- layers_slider_shortcuts.push_back(Shortcut(L("Arrow Up"), L("Move current slider thump Up")));
- layers_slider_shortcuts.push_back(Shortcut(L("Arrow Down"), L("Move current slider thump Down")));
+ layers_slider_shortcuts.push_back(Shortcut(L("Arrow Up"), L("Move current slider thumb Up")));
+ layers_slider_shortcuts.push_back(Shortcut(L("Arrow Down"), L("Move current slider thumb Down")));
layers_slider_shortcuts.push_back(Shortcut(L("Arrow Left"), L("Set upper thumb to current slider thumb")));
layers_slider_shortcuts.push_back(Shortcut(L("Arrow Right"),L("Set lower thumb to current slider thumb")));
layers_slider_shortcuts.push_back(Shortcut("+", L("Add color change marker for current layer")));
diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp
index ac4284c12..302ab5a02 100644
--- a/src/slic3r/GUI/MainFrame.cpp
+++ b/src/slic3r/GUI/MainFrame.cpp
@@ -403,9 +403,9 @@ void MainFrame::init_menubar()
editMenu->AppendSeparator();
- wxMenuItem* item_copy = append_menu_item(editMenu, wxID_ANY, _(L("&Copy")) + "\tCtrl+C", _(L("Copy selection to clipboard")),
+ wxMenuItem* item_copy = append_menu_item(editMenu, wxID_ANY, _(L("&Copy")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "C", _(L("Copy selection to clipboard")),
[this](wxCommandEvent&) { m_plater->copy_selection_to_clipboard(); }, "copy_menu");
- wxMenuItem* item_paste = append_menu_item(editMenu, wxID_ANY, _(L("&Paste")) + "\tCtrl+V", _(L("Paste clipboard")),
+ wxMenuItem* item_paste = append_menu_item(editMenu, wxID_ANY, _(L("&Paste")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "V", _(L("Paste clipboard")),
[this](wxCommandEvent&) { m_plater->paste_from_clipboard(); }, "paste_menu");
Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_select()); }, item_select_all->GetId());
@@ -505,9 +505,9 @@ void MainFrame::init_menubar()
[this](wxCommandEvent&) { wxGetApp().system_info(); });
append_menu_item(helpMenu, wxID_ANY, _(L("Show &Configuration Folder")), _(L("Show user configuration folder (datadir)")),
[this](wxCommandEvent&) { Slic3r::GUI::desktop_open_datadir_folder(); });
- append_menu_item(helpMenu, wxID_ANY, _(L("Report an I&ssue")), _(L("Report an issue on the Slic3r Prusa Edition")),
+ append_menu_item(helpMenu, wxID_ANY, _(L("Report an I&ssue")), wxString::Format(_(L("Report an issue on %s")), SLIC3R_APP_NAME),
[this](wxCommandEvent&) { wxLaunchDefaultBrowser("http://github.com/prusa3d/slic3r/issues/new"); });
- append_menu_item(helpMenu, wxID_ANY, _(L("&About Slic3r")), _(L("Show about dialog")),
+ append_menu_item(helpMenu, wxID_ANY, wxString::Format(_(L("&About %s")), SLIC3R_APP_NAME), _(L("Show about dialog")),
[this](wxCommandEvent&) { Slic3r::GUI::about(); });
helpMenu->AppendSeparator();
append_menu_item(helpMenu, wxID_ANY, _(L("Keyboard Shortcuts")) + sep + "&?", _(L("Show the list of the keyboard shortcuts")),
@@ -776,7 +776,7 @@ void MainFrame::export_configbundle()
// Ask user for a file name.
auto dlg = new wxFileDialog(this, _(L("Save presets bundle as:")),
!m_last_config.IsEmpty() ? get_dir_name(m_last_config) : wxGetApp().app_config->get_last_dir(),
- "Slic3r_config_bundle.ini",
+ SLIC3R_APP_KEY "_config_bundle.ini",
file_wildcards(FT_INI), wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
wxString file;
if (dlg->ShowModal() == wxID_OK)
diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp
index 93fbe263b..377c547e2 100644
--- a/src/slic3r/GUI/Plater.cpp
+++ b/src/slic3r/GUI/Plater.cpp
@@ -280,7 +280,7 @@ wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 *
cfg.set_key_value("extruder_colour", colors);
wxGetApp().get_tab(Preset::TYPE_PRINTER)->load_config(cfg);
- wxGetApp().preset_bundle->update_platter_filament_ui(extruder_idx, this);
+ wxGetApp().preset_bundle->update_platter_filament_ui(extruder_idx, this, wxGetApp().em_unit());
wxGetApp().plater()->on_config_change(cfg);
}
dialog->Destroy();
@@ -813,7 +813,7 @@ void Sidebar::update_all_preset_comboboxes()
// update the dirty flags.
if (print_tech == ptFFF) {
for (size_t i = 0; i < p->combos_filament.size(); ++i)
- preset_bundle.update_platter_filament_ui(i, p->combos_filament[i]);
+ preset_bundle.update_platter_filament_ui(i, p->combos_filament[i], wxGetApp().em_unit());
}
p->show_preset_comboboxes();
}
@@ -837,7 +837,7 @@ void Sidebar::update_presets(Preset::Type preset_type)
}
for (size_t i = 0; i < filament_cnt; i++) {
- preset_bundle.update_platter_filament_ui(i, p->combos_filament[i]);
+ preset_bundle.update_platter_filament_ui(i, p->combos_filament[i], wxGetApp().em_unit());
}
break;
@@ -872,7 +872,7 @@ void Sidebar::update_presets(Preset::Type preset_type)
// // update the dirty flags.
// if (print_tech == ptFFF) {
// for (size_t i = 0; i < p->combos_filament.size(); ++ i)
-// preset_bundle.update_platter_filament_ui(i, p->combos_filament[i]);
+// preset_bundle.update_platter_filament_ui(i, p->combos_filament[i], wxGetApp().em_unit());
// }
// p->show_preset_comboboxes();
update_all_preset_comboboxes();
@@ -1239,8 +1239,8 @@ struct Plater::priv
wxString project_filename;
BackgroundSlicingProcess background_process;
- std::atomic arranging;
- std::atomic rotoptimizing;
+ bool arranging;
+ bool rotoptimizing;
bool delayed_scene_refresh;
std::string delayed_error_message;
@@ -1403,8 +1403,8 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
, view_toolbar(GLToolbar::Radio)
#endif // ENABLE_SVG_ICONS
{
- arranging.store(false);
- rotoptimizing.store(false);
+ arranging = false;
+ rotoptimizing = false;
background_process.set_fff_print(&fff_print);
background_process.set_sla_print(&sla_print);
background_process.set_gcode_preview_data(&gcode_preview_data);
@@ -1703,6 +1703,14 @@ std::vector Plater::priv::load_files(const std::vector& input_
break;
}
+ // is there any advanced config data ?
+ auto opt_keys = model_object->config.keys();
+ if (!opt_keys.empty() && !((opt_keys.size() == 1) && (opt_keys[0] == "extruder")))
+ {
+ advanced = true;
+ break;
+ }
+
// is there any modifier ?
for (const ModelVolume* model_volume : model_object->volumes)
{
@@ -1711,6 +1719,14 @@ std::vector Plater::priv::load_files(const std::vector& input_
advanced = true;
break;
}
+
+ // is there any advanced config data ?
+ opt_keys = model_volume->config.keys();
+ if (!opt_keys.empty() && !((opt_keys.size() == 1) && (opt_keys[0] == "extruder")))
+ {
+ advanced = true;
+ break;
+ }
}
if (advanced)
@@ -2079,15 +2095,14 @@ void Plater::priv::mirror(Axis axis)
void Plater::priv::arrange()
{
- // don't do anything if currently arranging. Then this is a re-entrance
- if(arranging.load()) return;
-
- // Guard the arrange process
- arranging.store(true);
+ if (arranging) { return; }
+ arranging = true;
+ Slic3r::ScopeGuard arranging_guard([this]() { arranging = false; });
wxBusyCursor wait;
this->background_process.stop();
+
unsigned count = 0;
for(auto obj : model.objects) count += obj->instances.size();
@@ -2103,14 +2118,14 @@ void Plater::priv::arrange()
statusbar()->set_progress(count - st);
statusbar()->set_status_text(msg);
- // ok, this is dangerous, but we are protected by the atomic flag
+ // ok, this is dangerous, but we are protected by the flag
// 'arranging' and the arrange button is also disabled.
// This call is needed for the cancel button to work.
wxYieldIfNeeded();
};
statusbar()->set_cancel_callback([this, statusfn](){
- arranging.store(false);
+ arranging = false;
statusfn(0, L("Arranging canceled"));
});
@@ -2146,7 +2161,7 @@ void Plater::priv::arrange()
hint,
false, // create many piles not just one pile
[statusfn](unsigned st) { statusfn(st, arrangestr); },
- [this] () { return !arranging.load(); });
+ [this] () { return !arranging; });
} catch(std::exception& /*e*/) {
GUI::show_error(this->q, L("Could not arrange model objects! "
"Some geometries may be invalid."));
@@ -2155,7 +2170,6 @@ void Plater::priv::arrange()
statusfn(0, L("Arranging done."));
statusbar()->set_range(prev_range);
statusbar()->set_cancel_callback(); // remove cancel button
- arranging.store(false);
// Do a full refresh of scene tree, including regenerating all the GLVolumes.
//FIXME The update function shall just reload the modified matrices.
@@ -2170,11 +2184,12 @@ void Plater::priv::sla_optimize_rotation() {
// running we should probably disable explicit slicing and background
// processing
- if(rotoptimizing.load()) return;
- rotoptimizing.store(true);
+ if (rotoptimizing) { return; }
+ rotoptimizing = true;
+ Slic3r::ScopeGuard rotoptimizing_guard([this]() { rotoptimizing = false; });
int obj_idx = get_selected_object_idx();
- if(obj_idx < 0) { rotoptimizing.store(false); return; }
+ if (obj_idx < 0) { return; }
ModelObject * o = model.objects[size_t(obj_idx)];
@@ -2192,14 +2207,14 @@ void Plater::priv::sla_optimize_rotation() {
};
statusbar()->set_cancel_callback([this, stfn](){
- rotoptimizing.store(false);
+ rotoptimizing = false;
stfn(0, L("Orientation search canceled"));
});
auto r = sla::find_best_rotation(
*o, .005f,
[stfn](unsigned s) { stfn(s, L("Searching for optimal orientation")); },
- [this](){ return !rotoptimizing.load(); }
+ [this](){ return !rotoptimizing; }
);
const auto *bed_shape_opt = config->opt("bed_shape");
@@ -2212,7 +2227,7 @@ void Plater::priv::sla_optimize_rotation() {
double mindist = 6.0; // FIXME
double offs = mindist / 2.0 - EPSILON;
- if(rotoptimizing.load()) // wasn't canceled
+ if(rotoptimizing) // wasn't canceled
for(ModelInstance * oi : o->instances) {
oi->set_rotation({r[X], r[Y], r[Z]});
@@ -2262,7 +2277,6 @@ void Plater::priv::sla_optimize_rotation() {
stfn(0, L("Orientation found."));
statusbar()->set_range(prev_range);
statusbar()->set_cancel_callback();
- rotoptimizing.store(false);
update(true);
}
@@ -2440,6 +2454,11 @@ unsigned int Plater::priv::update_background_process(bool force_validation)
// Restart background processing thread based on a bitmask of UpdateBackgroundProcessReturnState.
bool Plater::priv::restart_background_process(unsigned int state)
{
+ if (arranging || rotoptimizing) {
+ // Avoid a race condition
+ return false;
+ }
+
if ( ! this->background_process.empty() &&
(state & priv::UPDATE_BACKGROUND_PROCESS_INVALID) == 0 &&
( ((state & UPDATE_BACKGROUND_PROCESS_FORCE_RESTART) != 0 && ! this->background_process.finished()) ||
@@ -2650,7 +2669,7 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt)
// TODO: ?
if (preset_type == Preset::TYPE_FILAMENT && sidebar->is_multifilament()) {
// Only update the platter UI for the 2nd and other filaments.
- wxGetApp().preset_bundle->update_platter_filament_ui(idx, combo);
+ wxGetApp().preset_bundle->update_platter_filament_ui(idx, combo, wxGetApp().em_unit());
}
else {
wxWindowUpdateLocker noUpdates(sidebar->presets_panel());
@@ -2666,6 +2685,11 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt)
void Plater::priv::on_slicing_update(SlicingStatusEvent &evt)
{
if (evt.status.percent >= -1) {
+ if (arranging || rotoptimizing) {
+ // Avoid a race condition
+ return;
+ }
+
this->statusbar()->set_progress(evt.status.percent);
this->statusbar()->set_status_text(_(L(evt.status.text)) + wxString::FromUTF8("…"));
}
@@ -3123,12 +3147,20 @@ bool Plater::priv::can_delete_all() const
bool Plater::priv::can_increase_instances() const
{
+ if (arranging || rotoptimizing) {
+ return false;
+ }
+
int obj_idx = get_selected_object_idx();
return (0 <= obj_idx) && (obj_idx < (int)model.objects.size());
}
bool Plater::priv::can_decrease_instances() const
{
+ if (arranging || rotoptimizing) {
+ return false;
+ }
+
int obj_idx = get_selected_object_idx();
return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()) && (model.objects[obj_idx]->instances.size() > 1);
}
@@ -3145,7 +3177,7 @@ bool Plater::priv::can_split_to_volumes() const
bool Plater::priv::can_arrange() const
{
- return !model.objects.empty() && !arranging.load();
+ return !model.objects.empty() && !arranging;
}
bool Plater::priv::can_layers_editing() const
@@ -3286,9 +3318,9 @@ void Plater::remove_selected()
void Plater::increase_instances(size_t num)
{
+ if (! can_increase_instances()) { return; }
+
int obj_idx = p->get_selected_object_idx();
- if (obj_idx == -1)
- return;
ModelObject* model_object = p->model.objects[obj_idx];
ModelInstance* model_instance = model_object->instances.back();
@@ -3320,9 +3352,9 @@ void Plater::increase_instances(size_t num)
void Plater::decrease_instances(size_t num)
{
+ if (! can_decrease_instances()) { return; }
+
int obj_idx = p->get_selected_object_idx();
- if (obj_idx == -1)
- return;
ModelObject* model_object = p->model.objects[obj_idx];
if (model_object->instances.size() > num) {
@@ -3618,7 +3650,7 @@ void Plater::on_extruders_change(int num_extruders)
choices.push_back(choice);
// initialize selection
- wxGetApp().preset_bundle->update_platter_filament_ui(i, choice);
+ wxGetApp().preset_bundle->update_platter_filament_ui(i, choice, wxGetApp().em_unit());
++i;
}
@@ -3768,6 +3800,36 @@ void Plater::changed_object(int obj_idx)
this->p->schedule_background_process();
}
+void Plater::changed_objects(const std::vector& object_idxs)
+{
+ if (object_idxs.empty())
+ return;
+
+ auto list = wxGetApp().obj_list();
+ wxASSERT(list != nullptr);
+ if (list == nullptr)
+ return;
+
+ if (list->is_parts_changed()) {
+ for (int obj_idx : object_idxs)
+ {
+ if (obj_idx < p->model.objects.size())
+ // recenter and re - align to Z = 0
+ p->model.objects[obj_idx]->ensure_on_bed();
+ }
+ if (this->p->printer_technology == ptSLA) {
+ // Update the SLAPrint from the current Model, so that the reload_scene()
+ // pulls the correct data, update the 3D scene.
+ this->p->update_restart_background_process(true, false);
+ }
+ else
+ p->view3D->reload_scene(false);
+ }
+
+ // update print
+ this->p->schedule_background_process();
+}
+
void Plater::schedule_background_process()
{
this->p->schedule_background_process();
diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp
index c40e4c309..d2ae72f62 100644
--- a/src/slic3r/GUI/Plater.hpp
+++ b/src/slic3r/GUI/Plater.hpp
@@ -167,6 +167,7 @@ public:
void reslice();
void reslice_SLA_supports(const ModelObject &object);
void changed_object(int obj_idx);
+ void changed_objects(const std::vector& object_idxs);
void schedule_background_process();
void fix_through_netfabb(const int obj_idx, const int vol_idx = -1);
void send_gcode();
diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp
index 62bcb9d9b..12d96624c 100644
--- a/src/slic3r/GUI/Preferences.cpp
+++ b/src/slic3r/GUI/Preferences.cpp
@@ -60,7 +60,7 @@ void PreferencesDialog::build()
// Please keep in sync with ConfigWizard
def.label = L("Check for application updates");
def.type = coBool;
- def.tooltip = L("If enabled, Slic3r checks for new versions of Slic3r PE online. When a new version becomes available a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done.");
+ def.tooltip = L("If enabled, Slic3r checks for new versions of " SLIC3R_APP_NAME " online. When a new version becomes available a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done.");
def.default_value = new ConfigOptionBool(app_config->get("version_check") == "1");
option = Option (def, "version_check");
m_optgroup->append_single_option_line(option);
diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp
index 7927006b2..7de8c99aa 100644
--- a/src/slic3r/GUI/PresetBundle.cpp
+++ b/src/slic3r/GUI/PresetBundle.cpp
@@ -1451,7 +1451,7 @@ void PresetBundle::load_default_preset_bitmaps(wxWindow *window)
this->load_compatible_bitmaps(window);
}
-void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui)
+void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui, const int em/* = 10*/)
{
if (ui == nullptr || this->printers.get_edited_preset().printer_technology() == ptSLA ||
this->filament_presets.size() <= idx_extruder )
@@ -1476,6 +1476,18 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::Pr
wxString selected_str = "";
if (!this->filaments().front().is_visible)
ui->set_label_marker(ui->Append(PresetCollection::separator(L("System presets")), wxNullBitmap));
+
+ /* It's supposed that standard size of an icon is 16px*16px for 100% scaled display.
+ * So set sizes for solid_colored icons used for filament preset
+ * and scale then in respect to em_unit value
+ */
+ const float scale_f = em * 0.1f;
+ const int icon_height = 16 * scale_f + 0.5f;
+ const int normal_icon_width = 16 * scale_f + 0.5f;
+ const int space_icon_width = 2 * scale_f + 0.5f;
+ const int wide_icon_width = 24 * scale_f + 0.5f;
+ const int thin_icon_width = 8 * scale_f + 0.5f;
+
for (int i = this->filaments().front().is_visible ? 0 : 1; i < int(this->filaments().size()); ++i) {
const Preset &preset = this->filaments.preset(i);
bool selected = this->filament_presets[idx_extruder] == preset.name;
@@ -1499,17 +1511,17 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::Pr
std::vector bmps;
if (wide_icons)
// Paint a red flag for incompatible presets.
- bmps.emplace_back(preset.is_compatible ? m_bitmapCache->mkclear(16, 16) : *m_bitmapIncompatible);
+ bmps.emplace_back(preset.is_compatible ? m_bitmapCache->mkclear(normal_icon_width, icon_height) : *m_bitmapIncompatible);
// Paint the color bars.
parse_color(filament_rgb, rgb);
- bmps.emplace_back(m_bitmapCache->mksolid(single_bar ? 24 : 16, 16, rgb));
+ bmps.emplace_back(m_bitmapCache->mksolid(single_bar ? wide_icon_width : normal_icon_width, icon_height, rgb));
if (! single_bar) {
parse_color(extruder_rgb, rgb);
- bmps.emplace_back(m_bitmapCache->mksolid(8, 16, rgb));
+ bmps.emplace_back(m_bitmapCache->mksolid(thin_icon_width, icon_height, rgb));
}
// Paint a lock at the system presets.
- bmps.emplace_back(m_bitmapCache->mkclear(2, 16));
- bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmapLock : m_bitmapCache->mkclear(16, 16));
+ bmps.emplace_back(m_bitmapCache->mkclear(space_icon_width, icon_height));
+ bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmapLock : m_bitmapCache->mkclear(normal_icon_width, icon_height));
// (preset.is_dirty ? *m_bitmapLockOpen : *m_bitmapLock) : m_bitmapCache->mkclear(16, 16));
bitmap = m_bitmapCache->insert(bitmap_key, bmps);
}
diff --git a/src/slic3r/GUI/PresetBundle.hpp b/src/slic3r/GUI/PresetBundle.hpp
index 069ebd784..2309ceecd 100644
--- a/src/slic3r/GUI/PresetBundle.hpp
+++ b/src/slic3r/GUI/PresetBundle.hpp
@@ -107,7 +107,7 @@ public:
void export_configbundle(const std::string &path, bool export_system_settings = false);
// Update a filament selection combo box on the platter for an idx_extruder.
- void update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui);
+ void update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui, const int em = 10);
// Enable / disable the "- default -" preset.
void set_default_suppressed(bool default_suppressed);
diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp
index 957c04d69..e014851ab 100644
--- a/src/slic3r/GUI/Selection.cpp
+++ b/src/slic3r/GUI/Selection.cpp
@@ -99,7 +99,7 @@ void Selection::set_model(Model* model)
update_valid();
}
-void Selection::add(unsigned int volume_idx, bool as_single_selection)
+void Selection::add(unsigned int volume_idx, bool as_single_selection, bool check_for_already_contained)
{
if (!m_valid || ((unsigned int)m_volumes->size() <= volume_idx))
return;
@@ -110,7 +110,7 @@ void Selection::add(unsigned int volume_idx, bool as_single_selection)
return;
bool keep_instance_mode = (m_mode == Instance) && !as_single_selection;
- bool already_contained = contains_volume(volume_idx);
+ bool already_contained = check_for_already_contained && contains_volume(volume_idx);
// resets the current list if needed
bool needs_reset = as_single_selection && !already_contained;
diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp
index a8b0c06dc..87c919680 100644
--- a/src/slic3r/GUI/Selection.hpp
+++ b/src/slic3r/GUI/Selection.hpp
@@ -210,7 +210,7 @@ public:
EMode get_mode() const { return m_mode; }
void set_mode(EMode mode) { m_mode = mode; }
- void add(unsigned int volume_idx, bool as_single_selection = true);
+ void add(unsigned int volume_idx, bool as_single_selection = true, bool check_for_already_contained = false);
void remove(unsigned int volume_idx);
void add_object(unsigned int object_idx, bool as_single_selection = true);
diff --git a/src/slic3r/GUI/SysInfoDialog.cpp b/src/slic3r/GUI/SysInfoDialog.cpp
index 0067e6438..471ba5486 100644
--- a/src/slic3r/GUI/SysInfoDialog.cpp
+++ b/src/slic3r/GUI/SysInfoDialog.cpp
@@ -22,7 +22,7 @@ std::string get_main_info(bool format_as_html)
std::string line_end = format_as_html ? "
" : "\n";
if (!format_as_html)
- out << b_start << SLIC3R_FORK_NAME << b_end << line_end;
+ out << b_start << SLIC3R_APP_NAME << b_end << line_end;
out << b_start << "Version: " << b_end << SLIC3R_VERSION << line_end;
out << b_start << "Build: " << b_end << SLIC3R_BUILD << line_end;
out << line_end;
@@ -41,7 +41,7 @@ std::string get_main_info(bool format_as_html)
}
SysInfoDialog::SysInfoDialog()
- : DPIDialog(NULL, wxID_ANY, _(L("Slic3r Prusa Edition - System Information")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
+ : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("System Information")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
{
wxColour bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
SetBackgroundColour(bgr_clr);
@@ -64,7 +64,7 @@ SysInfoDialog::SysInfoDialog()
// title
{
- wxStaticText* title = new wxStaticText(this, wxID_ANY, SLIC3R_FORK_NAME, wxDefaultPosition, wxDefaultSize);
+ wxStaticText* title = new wxStaticText(this, wxID_ANY, SLIC3R_APP_NAME, wxDefaultPosition, wxDefaultSize);
wxFont title_font = wxGetApp().bold_font();//wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
// title_font.SetWeight(wxFONTWEIGHT_BOLD);
title_font.SetFamily(wxFONTFAMILY_ROMAN);
diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp
index dccdf3ecd..99288488c 100644
--- a/src/slic3r/GUI/UpdateDialogs.cpp
+++ b/src/slic3r/GUI/UpdateDialogs.cpp
@@ -27,7 +27,7 @@ static const std::string CONFIG_UPDATE_WIKI_URL("https://github.com/prusa3d/Slic
// MsgUpdateSlic3r
MsgUpdateSlic3r::MsgUpdateSlic3r(const Semver &ver_current, const Semver &ver_online) :
- MsgDialog(nullptr, _(L("Update available")), _(L("New version of Slic3r PE is available"))),
+ MsgDialog(nullptr, _(L("Update available")), wxString::Format(_(L("New version of %s is available")), SLIC3R_APP_NAME)),
ver_current(ver_current),
ver_online(ver_online)
{
@@ -113,17 +113,17 @@ MsgDataIncompatible::MsgDataIncompatible(const std::unordered_mapSetBitmap(create_scaled_bitmap(this, "Slic3r_192px_grayscale.png", 192));
- auto *text = new wxStaticText(this, wxID_ANY, _(L(
- "This version of Slic3r PE is not compatible with currently installed configuration bundles.\n"
- "This probably happened as a result of running an older Slic3r PE after using a newer one.\n\n"
+ auto *text = new wxStaticText(this, wxID_ANY, wxString::Format(_(L(
+ "This version of %s is not compatible with currently installed configuration bundles.\n"
+ "This probably happened as a result of running an older %s after using a newer one.\n\n"
"You may either exit Slic3r and try again with a newer version, or you may re-run the initial configuration. "
"Doing so will create a backup snapshot of the existing configuration before installing files compatible with this Slic3r.\n"
- )));
+ )), SLIC3R_APP_NAME, SLIC3R_APP_NAME));
text->Wrap(CONTENT_WIDTH * wxGetApp().em_unit());
content_sizer->Add(text);
- auto *text2 = new wxStaticText(this, wxID_ANY, wxString::Format(_(L("This Slic3r PE version: %s")), SLIC3R_VERSION));
+ auto *text2 = new wxStaticText(this, wxID_ANY, wxString::Format(_(L("This %s version: %s")), SLIC3R_APP_NAME, SLIC3R_VERSION));
text2->Wrap(CONTENT_WIDTH * wxGetApp().em_unit());
content_sizer->Add(text2);
content_sizer->AddSpacer(VERT_SPACING);
@@ -168,7 +168,7 @@ MsgDataLegacy::MsgDataLegacy() :
{
auto *text = new wxStaticText(this, wxID_ANY, wxString::Format(
_(L(
- "Slic3r PE now uses an updated configuration structure.\n\n"
+ "%s now uses an updated configuration structure.\n\n"
"So called 'System presets' have been introduced, which hold the built-in default settings for various "
"printers. These System presets cannot be modified, instead, users now may create their "
@@ -178,7 +178,7 @@ MsgDataLegacy::MsgDataLegacy() :
"Please proceed with the %s that follows to set up the new presets "
"and to choose whether to enable automatic preset updates."
)),
- ConfigWizard::name()
+ SLIC3R_APP_NAME, ConfigWizard::name()
));
text->Wrap(CONTENT_WIDTH * wxGetApp().em_unit());
content_sizer->Add(text);
diff --git a/src/slic3r/Utils/Http.cpp b/src/slic3r/Utils/Http.cpp
index 02bbc087e..79c4ecfa9 100644
--- a/src/slic3r/Utils/Http.cpp
+++ b/src/slic3r/Utils/Http.cpp
@@ -88,7 +88,7 @@ Http::priv::priv(const std::string &url)
set_timeout_connect(DEFAULT_TIMEOUT_CONNECT);
::curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); // curl makes a copy internally
- ::curl_easy_setopt(curl, CURLOPT_USERAGENT, SLIC3R_FORK_NAME "/" SLIC3R_VERSION);
+ ::curl_easy_setopt(curl, CURLOPT_USERAGENT, SLIC3R_APP_NAME "/" SLIC3R_VERSION);
::curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, &error_buffer.front());
}
@@ -228,6 +228,7 @@ std::string Http::priv::body_size_error()
void Http::priv::http_perform()
{
::curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+ ::curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL);
::curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writecb);
::curl_easy_setopt(curl, CURLOPT_WRITEDATA, static_cast(this));
::curl_easy_setopt(curl, CURLOPT_READFUNCTION, form_file_read_cb);
diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp
index 6924f86de..1128df29c 100644
--- a/src/slic3r/Utils/PresetUpdater.cpp
+++ b/src/slic3r/Utils/PresetUpdater.cpp
@@ -208,7 +208,7 @@ void PresetUpdater::priv::sync_version() const
{
if (! enabled_version_check) { return; }
- BOOST_LOG_TRIVIAL(info) << boost::format("Downloading Slic3rPE online version from: `%1%`") % version_check_url;
+ BOOST_LOG_TRIVIAL(info) << boost::format("Downloading %1% online version from: `%2%`") % SLIC3R_APP_NAME % version_check_url;
Http::get(version_check_url)
.size_limit(SLIC3R_VERSION_BODY_MAX)
@@ -224,7 +224,7 @@ void PresetUpdater::priv::sync_version() const
})
.on_complete([&](std::string body, unsigned /* http_status */) {
boost::trim(body);
- BOOST_LOG_TRIVIAL(info) << boost::format("Got Slic3rPE online version: `%1%`. Sending to GUI thread...") % body;
+ BOOST_LOG_TRIVIAL(info) << boost::format("Got %1% online version: `%2%`. Sending to GUI thread...") % SLIC3R_APP_NAME % body;
wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_VERSION_ONLINE);
evt->SetString(GUI::from_u8(body));
diff --git a/version.inc b/version.inc
index 6a3f00e00..cbb2d1ab0 100644
--- a/version.inc
+++ b/version.inc
@@ -1,7 +1,8 @@
# Included by CMakeLists, edited by the build script
# (the version numbers are generated by the build script from the git current label)
-set(SLIC3R_FORK_NAME "Slic3r Prusa Edition")
+set(SLIC3R_APP_NAME "Slic3r Prusa Edition")
+set(SLIC3R_APP_KEY "Slic3rPE")
set(SLIC3R_VERSION "1.42.0-beta2")
set(SLIC3R_BUILD "${SLIC3R_VERSION}+UNKNOWN")
set(SLIC3R_BUILD_ID "${SLIC3R_BUILD_ID}")
diff --git a/xs/xsp/TriangleMesh.xsp b/xs/xsp/TriangleMesh.xsp
index edfb4a198..e519f9210 100644
--- a/xs/xsp/TriangleMesh.xsp
+++ b/xs/xsp/TriangleMesh.xsp
@@ -180,6 +180,8 @@ SV*
TriangleMesh::slice(z)
std::vector z
CODE:
+ THIS->require_shared_vertices(); // TriangleMeshSlicer needs this
+
// convert doubles to floats
std::vector z_f = cast(z);
@@ -210,6 +212,7 @@ TriangleMesh::cut(z, upper, lower)
TriangleMesh* upper;
TriangleMesh* lower;
CODE:
+ THIS->require_shared_vertices(); // TriangleMeshSlicer needs this
TriangleMeshSlicer mslicer(THIS);
mslicer.cut(z, upper, lower);
diff --git a/xs/xsp/XS.xsp b/xs/xsp/XS.xsp
index 04969a7f9..e6f252ca8 100644
--- a/xs/xsp/XS.xsp
+++ b/xs/xsp/XS.xsp
@@ -32,7 +32,7 @@ DEBUG_OUT_PATH_PREFIX()
SV*
FORK_NAME()
CODE:
- RETVAL = newSVpv(SLIC3R_FORK_NAME, 0);
+ RETVAL = newSVpv(SLIC3R_APP_NAME, 0);
OUTPUT: RETVAL
void