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