Fixed conflicts after merge with master
|
@ -409,7 +409,7 @@ find_package(cereal REQUIRED)
|
||||||
# l10n
|
# l10n
|
||||||
set(L10N_DIR "${SLIC3R_RESOURCES_DIR}/localization")
|
set(L10N_DIR "${SLIC3R_RESOURCES_DIR}/localization")
|
||||||
add_custom_target(gettext_make_pot
|
add_custom_target(gettext_make_pot
|
||||||
COMMAND xgettext --keyword=L --keyword=L_CONTEXT:1,2c --keyword=_L_PLURAL:1,2 --add-comments=TRN --from-code=UTF-8 --debug
|
COMMAND xgettext --keyword=L --keyword=_L --keyword=_u8L --keyword=L_CONTEXT:1,2c --keyword=_L_PLURAL:1,2 --add-comments=TRN --from-code=UTF-8 --debug
|
||||||
-f "${L10N_DIR}/list.txt"
|
-f "${L10N_DIR}/list.txt"
|
||||||
-o "${L10N_DIR}/PrusaSlicer.pot"
|
-o "${L10N_DIR}/PrusaSlicer.pot"
|
||||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||||
|
|
Before Width: | Height: | Size: 61 KiB |
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2020-03-11 15:15+0100\n"
|
"POT-Creation-Date: 2020-03-12 13:09+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -71,56 +71,56 @@ msgid ""
|
||||||
"not be affected."
|
"not be affected."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:109
|
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:108
|
||||||
msgid ""
|
msgid ""
|
||||||
"Copying of the temporary G-code to the output G-code failed. Maybe the SD "
|
"Copying of the temporary G-code to the output G-code failed. Maybe the SD "
|
||||||
"card is write locked?"
|
"card is write locked?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112
|
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:111
|
||||||
msgid ""
|
msgid ""
|
||||||
"Copying of the temporary G-code to the output G-code failed. There might be "
|
"Copying of the temporary G-code to the output G-code failed. There might be "
|
||||||
"problem with target device, please try exporting again or using different "
|
"problem with target device, please try exporting again or using different "
|
||||||
"device. The corrupted output G-code is at %1%.tmp."
|
"device. The corrupted output G-code is at %1%.tmp."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115
|
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:114
|
||||||
msgid ""
|
msgid ""
|
||||||
"Renaming of the G-code after copying to the selected destination folder has "
|
"Renaming of the G-code after copying to the selected destination folder has "
|
||||||
"failed. Current path is %1%.tmp. Please try exporting again."
|
"failed. Current path is %1%.tmp. Please try exporting again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:118
|
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:117
|
||||||
msgid ""
|
msgid ""
|
||||||
"Copying of the temporary G-code has finished but the original code at %1% "
|
"Copying of the temporary G-code has finished but the original code at %1% "
|
||||||
"couldn't be opened during copy check. The output G-code is at %2%.tmp."
|
"couldn't be opened during copy check. The output G-code is at %2%.tmp."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121
|
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:120
|
||||||
msgid ""
|
msgid ""
|
||||||
"Copying of the temporary G-code has finished but the exported code couldn't "
|
"Copying of the temporary G-code has finished but the exported code couldn't "
|
||||||
"be opened during copy check. The output G-code is at %1%.tmp."
|
"be opened during copy check. The output G-code is at %1%.tmp."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128
|
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:127
|
||||||
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478
|
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:479
|
||||||
msgid "Running post-processing scripts"
|
msgid "Running post-processing scripts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:130
|
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:129
|
||||||
msgid "G-code file exported to %1%"
|
msgid "G-code file exported to %1%"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134
|
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:133
|
||||||
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184
|
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183
|
||||||
msgid "Slicing complete"
|
msgid "Slicing complete"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180
|
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:179
|
||||||
msgid "Masked SLA file exported to %1%"
|
msgid "Masked SLA file exported to %1%"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:222
|
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:221
|
||||||
#, possible-c-format
|
#, possible-c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"%s has encountered an error. It was likely caused by running out of memory. "
|
"%s has encountered an error. It was likely caused by running out of memory. "
|
||||||
|
@ -128,11 +128,11 @@ msgid ""
|
||||||
"and we would be glad if you reported it."
|
"and we would be glad if you reported it."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:480
|
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:481
|
||||||
msgid "Copying of the temporary G-code to the output G-code failed"
|
msgid "Copying of the temporary G-code to the output G-code failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505
|
#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:506
|
||||||
msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue"
|
msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -480,7 +480,7 @@ msgstr ""
|
||||||
msgid "PrusaSlicer version"
|
msgid "PrusaSlicer version"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1551
|
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1554
|
||||||
msgid "print"
|
msgid "print"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -488,7 +488,7 @@ msgstr ""
|
||||||
msgid "filaments"
|
msgid "filaments"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1555
|
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1558
|
||||||
msgid "printer"
|
msgid "printer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -663,8 +663,8 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:813 src/slic3r/GUI/GUI_ObjectList.cpp:1680
|
#: src/slic3r/GUI/ConfigWizard.cpp:813 src/slic3r/GUI/GUI_ObjectList.cpp:1680
|
||||||
#: src/slic3r/GUI/GUI_ObjectList.cpp:3984 src/slic3r/GUI/Plater.cpp:3282
|
#: src/slic3r/GUI/GUI_ObjectList.cpp:3984 src/slic3r/GUI/Plater.cpp:3288
|
||||||
#: src/slic3r/GUI/Plater.cpp:3986 src/slic3r/GUI/Plater.cpp:4015
|
#: src/slic3r/GUI/Plater.cpp:3992 src/slic3r/GUI/Plater.cpp:4021
|
||||||
msgid "Reload from disk"
|
msgid "Reload from disk"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -805,11 +805,11 @@ msgstr ""
|
||||||
msgid "Bed Temperature:"
|
msgid "Bed Temperature:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:1486 src/slic3r/GUI/ConfigWizard.cpp:2028
|
#: src/slic3r/GUI/ConfigWizard.cpp:1486 src/slic3r/GUI/ConfigWizard.cpp:2029
|
||||||
msgid "Filaments"
|
msgid "Filaments"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:1486 src/slic3r/GUI/ConfigWizard.cpp:2030
|
#: src/slic3r/GUI/ConfigWizard.cpp:1486 src/slic3r/GUI/ConfigWizard.cpp:2031
|
||||||
msgid "SLA Materials"
|
msgid "SLA Materials"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -842,64 +842,64 @@ msgstr ""
|
||||||
msgid "Do you want to automatic select default materials?"
|
msgid "Do you want to automatic select default materials?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:1991
|
#: src/slic3r/GUI/ConfigWizard.cpp:1992
|
||||||
msgid "Select all standard printers"
|
msgid "Select all standard printers"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:1994
|
#: src/slic3r/GUI/ConfigWizard.cpp:1995
|
||||||
msgid "< &Back"
|
msgid "< &Back"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:1995
|
#: src/slic3r/GUI/ConfigWizard.cpp:1996
|
||||||
msgid "&Next >"
|
msgid "&Next >"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:1996
|
#: src/slic3r/GUI/ConfigWizard.cpp:1997
|
||||||
msgid "&Finish"
|
msgid "&Finish"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:1997 src/slic3r/GUI/FirmwareDialog.cpp:151
|
#: src/slic3r/GUI/ConfigWizard.cpp:1998 src/slic3r/GUI/FirmwareDialog.cpp:151
|
||||||
#: src/slic3r/GUI/ProgressStatusBar.cpp:26
|
#: src/slic3r/GUI/ProgressStatusBar.cpp:26
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:2010
|
#: src/slic3r/GUI/ConfigWizard.cpp:2011
|
||||||
msgid "Prusa FFF Technology Printers"
|
msgid "Prusa FFF Technology Printers"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:2013
|
#: src/slic3r/GUI/ConfigWizard.cpp:2014
|
||||||
msgid "Prusa MSLA Technology Printers"
|
msgid "Prusa MSLA Technology Printers"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:2028
|
#: src/slic3r/GUI/ConfigWizard.cpp:2029
|
||||||
msgid "Filament Profiles Selection"
|
msgid "Filament Profiles Selection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:2028 src/slic3r/GUI/GUI_ObjectList.cpp:3581
|
#: src/slic3r/GUI/ConfigWizard.cpp:2029 src/slic3r/GUI/GUI_ObjectList.cpp:3581
|
||||||
msgid "Type:"
|
msgid "Type:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:2030
|
#: src/slic3r/GUI/ConfigWizard.cpp:2031
|
||||||
msgid "SLA Material Profiles Selection"
|
msgid "SLA Material Profiles Selection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:2030
|
#: src/slic3r/GUI/ConfigWizard.cpp:2031
|
||||||
msgid "Layer height:"
|
msgid "Layer height:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:2124
|
#: src/slic3r/GUI/ConfigWizard.cpp:2125
|
||||||
msgid "Configuration Assistant"
|
msgid "Configuration Assistant"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:2125
|
#: src/slic3r/GUI/ConfigWizard.cpp:2126
|
||||||
msgid "Configuration &Assistant"
|
msgid "Configuration &Assistant"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:2127
|
#: src/slic3r/GUI/ConfigWizard.cpp:2128
|
||||||
msgid "Configuration Wizard"
|
msgid "Configuration Wizard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:2128
|
#: src/slic3r/GUI/ConfigWizard.cpp:2129
|
||||||
msgid "Configuration &Wizard"
|
msgid "Configuration &Wizard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1543,18 +1543,18 @@ msgid "Add..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/GLCanvas3D.cpp:4474 src/slic3r/GUI/GUI_ObjectList.cpp:1734
|
#: src/slic3r/GUI/GLCanvas3D.cpp:4474 src/slic3r/GUI/GUI_ObjectList.cpp:1734
|
||||||
#: src/slic3r/GUI/Plater.cpp:3983 src/slic3r/GUI/Plater.cpp:4005
|
#: src/slic3r/GUI/Plater.cpp:3989 src/slic3r/GUI/Plater.cpp:4011
|
||||||
#: src/slic3r/GUI/Tab.cpp:3144
|
#: src/slic3r/GUI/Tab.cpp:3144
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/GLCanvas3D.cpp:4483 src/slic3r/GUI/KBShortcutsDialog.cpp:131
|
#: src/slic3r/GUI/GLCanvas3D.cpp:4483 src/slic3r/GUI/KBShortcutsDialog.cpp:131
|
||||||
#: src/slic3r/GUI/Plater.cpp:4725
|
#: src/slic3r/GUI/Plater.cpp:4731
|
||||||
msgid "Delete all"
|
msgid "Delete all"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/GLCanvas3D.cpp:4492 src/slic3r/GUI/KBShortcutsDialog.cpp:159
|
#: src/slic3r/GUI/GLCanvas3D.cpp:4492 src/slic3r/GUI/KBShortcutsDialog.cpp:159
|
||||||
#: src/slic3r/GUI/Plater.cpp:2806
|
#: src/slic3r/GUI/Plater.cpp:2812
|
||||||
msgid "Arrange"
|
msgid "Arrange"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1570,12 +1570,12 @@ msgstr ""
|
||||||
msgid "Paste"
|
msgid "Paste"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/GLCanvas3D.cpp:4525 src/slic3r/GUI/Plater.cpp:3840
|
#: src/slic3r/GUI/GLCanvas3D.cpp:4525 src/slic3r/GUI/Plater.cpp:3846
|
||||||
#: src/slic3r/GUI/Plater.cpp:3852 src/slic3r/GUI/Plater.cpp:3992
|
#: src/slic3r/GUI/Plater.cpp:3858 src/slic3r/GUI/Plater.cpp:3998
|
||||||
msgid "Add instance"
|
msgid "Add instance"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/GLCanvas3D.cpp:4536 src/slic3r/GUI/Plater.cpp:3994
|
#: src/slic3r/GUI/GLCanvas3D.cpp:4536 src/slic3r/GUI/Plater.cpp:4000
|
||||||
msgid "Remove instance"
|
msgid "Remove instance"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1609,11 +1609,11 @@ msgstr ""
|
||||||
msgid "Next Redo action: %1%"
|
msgid "Next Redo action: %1%"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/GLCanvas3D.cpp:6586
|
#: src/slic3r/GUI/GLCanvas3D.cpp:6588
|
||||||
msgid "Selection-Add from rectangle"
|
msgid "Selection-Add from rectangle"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/GLCanvas3D.cpp:6605
|
#: src/slic3r/GUI/GLCanvas3D.cpp:6607
|
||||||
msgid "Selection-Remove from rectangle"
|
msgid "Selection-Remove from rectangle"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2127,7 +2127,7 @@ msgstr ""
|
||||||
msgid "Please check and fix your object list."
|
msgid "Please check and fix your object list."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/GUI_App.cpp:1073 src/slic3r/GUI/Plater.cpp:2365
|
#: src/slic3r/GUI/GUI_App.cpp:1073 src/slic3r/GUI/Plater.cpp:2371
|
||||||
#: src/slic3r/GUI/Tab.cpp:2948
|
#: src/slic3r/GUI/Tab.cpp:2948
|
||||||
msgid "Attention!"
|
msgid "Attention!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2459,12 +2459,12 @@ msgstr ""
|
||||||
msgid "Fix through the Netfabb"
|
msgid "Fix through the Netfabb"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/GUI_ObjectList.cpp:1673 src/slic3r/GUI/Plater.cpp:4018
|
#: src/slic3r/GUI/GUI_ObjectList.cpp:1673 src/slic3r/GUI/Plater.cpp:4024
|
||||||
msgid "Export as STL"
|
msgid "Export as STL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/GUI_ObjectList.cpp:1680
|
#: src/slic3r/GUI/GUI_ObjectList.cpp:1680
|
||||||
#: src/slic3r/GUI/GUI_ObjectList.cpp:3984 src/slic3r/GUI/Plater.cpp:3986
|
#: src/slic3r/GUI/GUI_ObjectList.cpp:3984 src/slic3r/GUI/Plater.cpp:3992
|
||||||
msgid "Reload the selected volumes from disk"
|
msgid "Reload the selected volumes from disk"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2534,7 +2534,7 @@ msgstr ""
|
||||||
msgid "Delete Instance"
|
msgid "Delete Instance"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/GUI_ObjectList.cpp:2286 src/slic3r/GUI/Plater.cpp:3035
|
#: src/slic3r/GUI/GUI_ObjectList.cpp:2286 src/slic3r/GUI/Plater.cpp:3041
|
||||||
msgid ""
|
msgid ""
|
||||||
"The selected object couldn't be split because it contains only one part."
|
"The selected object couldn't be split because it contains only one part."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2978,11 +2978,11 @@ msgid "Load Config from ini/amf/3mf/gcode and merge"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:896
|
#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:896
|
||||||
#: src/slic3r/GUI/Plater.cpp:5546 src/libslic3r/PrintConfig.cpp:3363
|
#: src/slic3r/GUI/Plater.cpp:5553 src/libslic3r/PrintConfig.cpp:3363
|
||||||
msgid "Export G-code"
|
msgid "Export G-code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5547
|
#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5554
|
||||||
msgid "Send G-code"
|
msgid "Send G-code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -3263,7 +3263,7 @@ msgstr ""
|
||||||
msgid "Show/Hide Legend"
|
msgid "Show/Hide Legend"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/Plater.cpp:4157
|
#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/Plater.cpp:4163
|
||||||
#: src/slic3r/GUI/Tab.cpp:2374
|
#: src/slic3r/GUI/Tab.cpp:2374
|
||||||
msgid "Preview"
|
msgid "Preview"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -3850,8 +3850,8 @@ msgstr ""
|
||||||
msgid "Save zip file as:"
|
msgid "Save zip file as:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:894 src/slic3r/GUI/Plater.cpp:3178
|
#: src/slic3r/GUI/MainFrame.cpp:894 src/slic3r/GUI/Plater.cpp:3184
|
||||||
#: src/slic3r/GUI/Plater.cpp:5150 src/slic3r/GUI/Tab.cpp:1281
|
#: src/slic3r/GUI/Plater.cpp:5156 src/slic3r/GUI/Tab.cpp:1281
|
||||||
#: src/slic3r/GUI/Tab.cpp:3720
|
#: src/slic3r/GUI/Tab.cpp:3720
|
||||||
msgid "Slicing"
|
msgid "Slicing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -4077,7 +4077,7 @@ msgstr ""
|
||||||
msgid "SLA print settings"
|
msgid "SLA print settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:823 src/slic3r/GUI/Preset.cpp:1554
|
#: src/slic3r/GUI/Plater.cpp:823 src/slic3r/GUI/Preset.cpp:1557
|
||||||
msgid "SLA material"
|
msgid "SLA material"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -4085,7 +4085,7 @@ msgstr ""
|
||||||
msgid "Printer"
|
msgid "Printer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:883 src/slic3r/GUI/Plater.cpp:5547
|
#: src/slic3r/GUI/Plater.cpp:883 src/slic3r/GUI/Plater.cpp:5554
|
||||||
msgid "Send to printer"
|
msgid "Send to printer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -4093,8 +4093,8 @@ msgstr ""
|
||||||
msgid "Remove device"
|
msgid "Remove device"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:897 src/slic3r/GUI/Plater.cpp:3178
|
#: src/slic3r/GUI/Plater.cpp:897 src/slic3r/GUI/Plater.cpp:3184
|
||||||
#: src/slic3r/GUI/Plater.cpp:5153
|
#: src/slic3r/GUI/Plater.cpp:5159
|
||||||
msgid "Slice now"
|
msgid "Slice now"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -4172,411 +4172,416 @@ msgstr ""
|
||||||
msgid "Load Files"
|
msgid "Load Files"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2196
|
#: src/slic3r/GUI/Plater.cpp:2199
|
||||||
#, possible-c-format
|
#, possible-c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Unmounting successful. The device %s(%s) can now be safely removed from the "
|
"Unmounting successful. The device %s(%s) can now be safely removed from the "
|
||||||
"computer."
|
"computer."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2204
|
#: src/slic3r/GUI/Plater.cpp:2202
|
||||||
|
#, possible-c-format
|
||||||
|
msgid "Ejecting of device %s(%s) has failed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Plater.cpp:2210
|
||||||
msgid "New Project"
|
msgid "New Project"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2325
|
#: src/slic3r/GUI/Plater.cpp:2331
|
||||||
msgid "Loading"
|
msgid "Loading"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2335
|
#: src/slic3r/GUI/Plater.cpp:2341
|
||||||
#, possible-c-format
|
#, possible-c-format
|
||||||
msgid "Processing input file %s"
|
msgid "Processing input file %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2363
|
#: src/slic3r/GUI/Plater.cpp:2369
|
||||||
msgid "You cannot load SLA project with a multi-part object on the bed"
|
msgid "You cannot load SLA project with a multi-part object on the bed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2364 src/slic3r/GUI/Tab.cpp:2947
|
#: src/slic3r/GUI/Plater.cpp:2370 src/slic3r/GUI/Tab.cpp:2947
|
||||||
msgid "Please check your object list before preset changing."
|
msgid "Please check your object list before preset changing."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2409
|
#: src/slic3r/GUI/Plater.cpp:2415
|
||||||
msgid ""
|
msgid ""
|
||||||
"This file contains several objects positioned at multiple heights.\n"
|
"This file contains several objects positioned at multiple heights.\n"
|
||||||
"Instead of considering them as multiple objects, should I consider\n"
|
"Instead of considering them as multiple objects, should I consider\n"
|
||||||
"this file as a single object having multiple parts?"
|
"this file as a single object having multiple parts?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2412 src/slic3r/GUI/Plater.cpp:2465
|
#: src/slic3r/GUI/Plater.cpp:2418 src/slic3r/GUI/Plater.cpp:2471
|
||||||
msgid "Multi-part object detected"
|
msgid "Multi-part object detected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2419
|
#: src/slic3r/GUI/Plater.cpp:2425
|
||||||
msgid ""
|
msgid ""
|
||||||
"This file cannot be loaded in a simple mode. Do you want to switch to an "
|
"This file cannot be loaded in a simple mode. Do you want to switch to an "
|
||||||
"advanced mode?"
|
"advanced mode?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2420
|
#: src/slic3r/GUI/Plater.cpp:2426
|
||||||
msgid "Detected advanced data"
|
msgid "Detected advanced data"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2442
|
#: src/slic3r/GUI/Plater.cpp:2448
|
||||||
#, possible-c-format
|
#, possible-c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"You can't to add the object(s) from %s because of one or some of them "
|
"You can't to add the object(s) from %s because of one or some of them "
|
||||||
"is(are) multi-part"
|
"is(are) multi-part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2462
|
#: src/slic3r/GUI/Plater.cpp:2468
|
||||||
msgid ""
|
msgid ""
|
||||||
"Multiple objects were loaded for a multi-material printer.\n"
|
"Multiple objects were loaded for a multi-material printer.\n"
|
||||||
"Instead of considering them as multiple objects, should I consider\n"
|
"Instead of considering them as multiple objects, should I consider\n"
|
||||||
"these files to represent a single object having multiple parts?"
|
"these files to represent a single object having multiple parts?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2478
|
#: src/slic3r/GUI/Plater.cpp:2484
|
||||||
msgid "Loaded"
|
msgid "Loaded"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2580
|
#: src/slic3r/GUI/Plater.cpp:2586
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your object appears to be too large, so it was automatically scaled down to "
|
"Your object appears to be too large, so it was automatically scaled down to "
|
||||||
"fit your print bed."
|
"fit your print bed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2581
|
#: src/slic3r/GUI/Plater.cpp:2587
|
||||||
msgid "Object too large?"
|
msgid "Object too large?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2643
|
#: src/slic3r/GUI/Plater.cpp:2649
|
||||||
msgid "Export STL file:"
|
msgid "Export STL file:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2650
|
#: src/slic3r/GUI/Plater.cpp:2656
|
||||||
msgid "Export AMF file:"
|
msgid "Export AMF file:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2656
|
#: src/slic3r/GUI/Plater.cpp:2662
|
||||||
msgid "Save file as:"
|
msgid "Save file as:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2662
|
#: src/slic3r/GUI/Plater.cpp:2668
|
||||||
msgid "Export OBJ file:"
|
msgid "Export OBJ file:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2764
|
#: src/slic3r/GUI/Plater.cpp:2770
|
||||||
msgid "Delete Object"
|
msgid "Delete Object"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2775
|
#: src/slic3r/GUI/Plater.cpp:2781
|
||||||
msgid "Reset Project"
|
msgid "Reset Project"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2812
|
#: src/slic3r/GUI/Plater.cpp:2818
|
||||||
msgid "Hollow"
|
msgid "Hollow"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2819
|
#: src/slic3r/GUI/Plater.cpp:2825
|
||||||
msgid "Optimize Rotation"
|
msgid "Optimize Rotation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2865
|
#: src/slic3r/GUI/Plater.cpp:2871
|
||||||
msgid "Arranging"
|
msgid "Arranging"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2892
|
#: src/slic3r/GUI/Plater.cpp:2898
|
||||||
msgid "Could not arrange model objects! Some geometries may be invalid."
|
msgid "Could not arrange model objects! Some geometries may be invalid."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2898
|
#: src/slic3r/GUI/Plater.cpp:2904
|
||||||
msgid "Arranging canceled."
|
msgid "Arranging canceled."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2899
|
#: src/slic3r/GUI/Plater.cpp:2905
|
||||||
msgid "Arranging done."
|
msgid "Arranging done."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2915
|
#: src/slic3r/GUI/Plater.cpp:2921
|
||||||
msgid "Searching for optimal orientation"
|
msgid "Searching for optimal orientation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2948
|
#: src/slic3r/GUI/Plater.cpp:2954
|
||||||
msgid "Orientation search canceled."
|
msgid "Orientation search canceled."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2949
|
#: src/slic3r/GUI/Plater.cpp:2955
|
||||||
msgid "Orientation found."
|
msgid "Orientation found."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2979
|
#: src/slic3r/GUI/Plater.cpp:2985
|
||||||
msgid "Indexing hollowed object"
|
msgid "Indexing hollowed object"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2983
|
#: src/slic3r/GUI/Plater.cpp:2989
|
||||||
msgid "Hollowing cancelled."
|
msgid "Hollowing cancelled."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2984
|
#: src/slic3r/GUI/Plater.cpp:2990
|
||||||
msgid "Hollowing done."
|
msgid "Hollowing done."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:2986
|
#: src/slic3r/GUI/Plater.cpp:2992
|
||||||
msgid "Hollowing failed."
|
msgid "Hollowing failed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3027
|
#: src/slic3r/GUI/Plater.cpp:3033
|
||||||
msgid ""
|
msgid ""
|
||||||
"The selected object can't be split because it contains more than one volume/"
|
"The selected object can't be split because it contains more than one volume/"
|
||||||
"material."
|
"material."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3038
|
#: src/slic3r/GUI/Plater.cpp:3044
|
||||||
msgid "Split to Objects"
|
msgid "Split to Objects"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3163
|
#: src/slic3r/GUI/Plater.cpp:3169
|
||||||
msgid "Invalid data"
|
msgid "Invalid data"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3172
|
#: src/slic3r/GUI/Plater.cpp:3178
|
||||||
msgid "Ready to slice"
|
msgid "Ready to slice"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3210 src/slic3r/GUI/PrintHostDialogs.cpp:232
|
#: src/slic3r/GUI/Plater.cpp:3216 src/slic3r/GUI/PrintHostDialogs.cpp:232
|
||||||
msgid "Cancelling"
|
msgid "Cancelling"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3227
|
#: src/slic3r/GUI/Plater.cpp:3233
|
||||||
msgid "Another export job is currently running."
|
msgid "Another export job is currently running."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3343
|
#: src/slic3r/GUI/Plater.cpp:3349
|
||||||
msgid "Please select the file to reload"
|
msgid "Please select the file to reload"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3378
|
#: src/slic3r/GUI/Plater.cpp:3384
|
||||||
msgid "It is not allowed to change the file to reload"
|
msgid "It is not allowed to change the file to reload"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3378
|
#: src/slic3r/GUI/Plater.cpp:3384
|
||||||
msgid "Do you want to retry"
|
msgid "Do you want to retry"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3396
|
#: src/slic3r/GUI/Plater.cpp:3402
|
||||||
msgid "Reload from:"
|
msgid "Reload from:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3485
|
#: src/slic3r/GUI/Plater.cpp:3491
|
||||||
msgid "Unable to reload:"
|
msgid "Unable to reload:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3490
|
#: src/slic3r/GUI/Plater.cpp:3496
|
||||||
msgid "Error during reload"
|
msgid "Error during reload"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3509
|
#: src/slic3r/GUI/Plater.cpp:3515
|
||||||
msgid "Reload all from disk"
|
msgid "Reload all from disk"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3530
|
#: src/slic3r/GUI/Plater.cpp:3536
|
||||||
msgid "Fix Throught NetFabb"
|
msgid "Fix Throught NetFabb"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3721
|
#: src/slic3r/GUI/Plater.cpp:3727
|
||||||
msgid "Export failed"
|
msgid "Export failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3726 src/slic3r/GUI/PrintHostDialogs.cpp:233
|
#: src/slic3r/GUI/Plater.cpp:3732 src/slic3r/GUI/PrintHostDialogs.cpp:233
|
||||||
msgid "Cancelled"
|
msgid "Cancelled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3983 src/slic3r/GUI/Plater.cpp:4005
|
#: src/slic3r/GUI/Plater.cpp:3989 src/slic3r/GUI/Plater.cpp:4011
|
||||||
msgid "Remove the selected object"
|
msgid "Remove the selected object"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3992
|
#: src/slic3r/GUI/Plater.cpp:3998
|
||||||
msgid "Add one more instance of the selected object"
|
msgid "Add one more instance of the selected object"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3994
|
#: src/slic3r/GUI/Plater.cpp:4000
|
||||||
msgid "Remove one instance of the selected object"
|
msgid "Remove one instance of the selected object"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3996
|
#: src/slic3r/GUI/Plater.cpp:4002
|
||||||
msgid "Set number of instances"
|
msgid "Set number of instances"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:3996
|
#: src/slic3r/GUI/Plater.cpp:4002
|
||||||
msgid "Change the number of instances of the selected object"
|
msgid "Change the number of instances of the selected object"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4015
|
#: src/slic3r/GUI/Plater.cpp:4021
|
||||||
msgid "Reload the selected object from disk"
|
msgid "Reload the selected object from disk"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4018
|
#: src/slic3r/GUI/Plater.cpp:4024
|
||||||
msgid "Export the selected object as STL file"
|
msgid "Export the selected object as STL file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4047
|
#: src/slic3r/GUI/Plater.cpp:4053
|
||||||
msgid "Along X axis"
|
msgid "Along X axis"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4047
|
#: src/slic3r/GUI/Plater.cpp:4053
|
||||||
msgid "Mirror the selected object along the X axis"
|
msgid "Mirror the selected object along the X axis"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4049
|
#: src/slic3r/GUI/Plater.cpp:4055
|
||||||
msgid "Along Y axis"
|
msgid "Along Y axis"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4049
|
#: src/slic3r/GUI/Plater.cpp:4055
|
||||||
msgid "Mirror the selected object along the Y axis"
|
msgid "Mirror the selected object along the Y axis"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4051
|
#: src/slic3r/GUI/Plater.cpp:4057
|
||||||
msgid "Along Z axis"
|
msgid "Along Z axis"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4051
|
#: src/slic3r/GUI/Plater.cpp:4057
|
||||||
msgid "Mirror the selected object along the Z axis"
|
msgid "Mirror the selected object along the Z axis"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4054
|
#: src/slic3r/GUI/Plater.cpp:4060
|
||||||
msgid "Mirror"
|
msgid "Mirror"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4054
|
#: src/slic3r/GUI/Plater.cpp:4060
|
||||||
msgid "Mirror the selected object"
|
msgid "Mirror the selected object"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4066
|
#: src/slic3r/GUI/Plater.cpp:4072
|
||||||
msgid "To objects"
|
msgid "To objects"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4066 src/slic3r/GUI/Plater.cpp:4086
|
#: src/slic3r/GUI/Plater.cpp:4072 src/slic3r/GUI/Plater.cpp:4092
|
||||||
msgid "Split the selected object into individual objects"
|
msgid "Split the selected object into individual objects"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4068
|
#: src/slic3r/GUI/Plater.cpp:4074
|
||||||
msgid "To parts"
|
msgid "To parts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4068 src/slic3r/GUI/Plater.cpp:4100
|
#: src/slic3r/GUI/Plater.cpp:4074 src/slic3r/GUI/Plater.cpp:4106
|
||||||
msgid "Split the selected object into individual sub-parts"
|
msgid "Split the selected object into individual sub-parts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4071 src/slic3r/GUI/Plater.cpp:4086
|
#: src/slic3r/GUI/Plater.cpp:4077 src/slic3r/GUI/Plater.cpp:4092
|
||||||
#: src/slic3r/GUI/Plater.cpp:4100 src/libslic3r/PrintConfig.cpp:3481
|
#: src/slic3r/GUI/Plater.cpp:4106 src/libslic3r/PrintConfig.cpp:3481
|
||||||
msgid "Split"
|
msgid "Split"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4071
|
#: src/slic3r/GUI/Plater.cpp:4077
|
||||||
msgid "Split the selected object"
|
msgid "Split the selected object"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4092
|
#: src/slic3r/GUI/Plater.cpp:4098
|
||||||
msgid "Optimize orientation"
|
msgid "Optimize orientation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4092
|
#: src/slic3r/GUI/Plater.cpp:4098
|
||||||
msgid "Optimize the rotation of the object for better print results."
|
msgid "Optimize the rotation of the object for better print results."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4149
|
#: src/slic3r/GUI/Plater.cpp:4155
|
||||||
msgid "3D editor view"
|
msgid "3D editor view"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4456
|
#: src/slic3r/GUI/Plater.cpp:4462
|
||||||
msgid ""
|
msgid ""
|
||||||
"%1% printer was active at the time the target Undo / Redo snapshot was "
|
"%1% printer was active at the time the target Undo / Redo snapshot was "
|
||||||
"taken. Switching to %1% printer requires reloading of %1% presets."
|
"taken. Switching to %1% printer requires reloading of %1% presets."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4631
|
#: src/slic3r/GUI/Plater.cpp:4637
|
||||||
msgid "Load Project"
|
msgid "Load Project"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4659
|
#: src/slic3r/GUI/Plater.cpp:4665
|
||||||
msgid "Import Object"
|
msgid "Import Object"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4663
|
#: src/slic3r/GUI/Plater.cpp:4669
|
||||||
msgid "Import Objects"
|
msgid "Import Objects"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4725
|
#: src/slic3r/GUI/Plater.cpp:4731
|
||||||
msgid "All objects will be removed, continue?"
|
msgid "All objects will be removed, continue?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4733
|
#: src/slic3r/GUI/Plater.cpp:4739
|
||||||
msgid "Delete Selected Objects"
|
msgid "Delete Selected Objects"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4741
|
#: src/slic3r/GUI/Plater.cpp:4747
|
||||||
msgid "Increase Instances"
|
msgid "Increase Instances"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4776
|
#: src/slic3r/GUI/Plater.cpp:4782
|
||||||
msgid "Decrease Instances"
|
msgid "Decrease Instances"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4807
|
#: src/slic3r/GUI/Plater.cpp:4813
|
||||||
msgid "Enter the number of copies:"
|
msgid "Enter the number of copies:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4808
|
#: src/slic3r/GUI/Plater.cpp:4814
|
||||||
msgid "Copies of the selected object"
|
msgid "Copies of the selected object"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4812
|
#: src/slic3r/GUI/Plater.cpp:4818
|
||||||
#, possible-c-format
|
#, possible-c-format
|
||||||
msgid "Set numbers of copies to %d"
|
msgid "Set numbers of copies to %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4842
|
#: src/slic3r/GUI/Plater.cpp:4848
|
||||||
msgid "Cut by Plane"
|
msgid "Cut by Plane"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4893
|
#: src/slic3r/GUI/Plater.cpp:4899
|
||||||
msgid "Save G-code file as:"
|
msgid "Save G-code file as:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:4893
|
#: src/slic3r/GUI/Plater.cpp:4899
|
||||||
msgid "Save SL1 file as:"
|
msgid "Save SL1 file as:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:5028
|
#: src/slic3r/GUI/Plater.cpp:5034
|
||||||
#, possible-c-format
|
#, possible-c-format
|
||||||
msgid "STL file exported to %s"
|
msgid "STL file exported to %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:5045
|
#: src/slic3r/GUI/Plater.cpp:5051
|
||||||
#, possible-c-format
|
#, possible-c-format
|
||||||
msgid "AMF file exported to %s"
|
msgid "AMF file exported to %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:5048
|
#: src/slic3r/GUI/Plater.cpp:5054
|
||||||
#, possible-c-format
|
#, possible-c-format
|
||||||
msgid "Error exporting AMF file %s"
|
msgid "Error exporting AMF file %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:5081
|
#: src/slic3r/GUI/Plater.cpp:5087
|
||||||
#, possible-c-format
|
#, possible-c-format
|
||||||
msgid "3MF file exported to %s"
|
msgid "3MF file exported to %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:5086
|
#: src/slic3r/GUI/Plater.cpp:5092
|
||||||
#, possible-c-format
|
#, possible-c-format
|
||||||
msgid "Error exporting 3MF file %s"
|
msgid "Error exporting 3MF file %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:5546
|
#: src/slic3r/GUI/Plater.cpp:5553
|
||||||
msgid "Export"
|
msgid "Export"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Plater.cpp:5632
|
#: src/slic3r/GUI/Plater.cpp:5639
|
||||||
msgid "Paste From Clipboard"
|
msgid "Paste From Clipboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -4717,34 +4722,34 @@ msgstr ""
|
||||||
msgid "Select toolbar icon size in respect to the default one."
|
msgid "Select toolbar icon size in respect to the default one."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preset.cpp:247
|
#: src/slic3r/GUI/Preset.cpp:250
|
||||||
msgid "modified"
|
msgid "modified"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preset.cpp:1139 src/slic3r/GUI/Preset.cpp:1194
|
#: src/slic3r/GUI/Preset.cpp:1142 src/slic3r/GUI/Preset.cpp:1197
|
||||||
#: src/slic3r/GUI/Preset.cpp:1272 src/slic3r/GUI/Preset.cpp:1314
|
#: src/slic3r/GUI/Preset.cpp:1275 src/slic3r/GUI/Preset.cpp:1317
|
||||||
#: src/slic3r/GUI/PresetBundle.cpp:1591 src/slic3r/GUI/PresetBundle.cpp:1689
|
#: src/slic3r/GUI/PresetBundle.cpp:1591 src/slic3r/GUI/PresetBundle.cpp:1689
|
||||||
msgid "System presets"
|
msgid "System presets"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preset.cpp:1198 src/slic3r/GUI/Preset.cpp:1318
|
#: src/slic3r/GUI/Preset.cpp:1201 src/slic3r/GUI/Preset.cpp:1321
|
||||||
#: src/slic3r/GUI/PresetBundle.cpp:1694
|
#: src/slic3r/GUI/PresetBundle.cpp:1694
|
||||||
msgid "User presets"
|
msgid "User presets"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preset.cpp:1231
|
#: src/slic3r/GUI/Preset.cpp:1234
|
||||||
msgid "Add/Remove materials"
|
msgid "Add/Remove materials"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preset.cpp:1233
|
#: src/slic3r/GUI/Preset.cpp:1236
|
||||||
msgid "Add/Remove printers"
|
msgid "Add/Remove printers"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preset.cpp:1552
|
#: src/slic3r/GUI/Preset.cpp:1555
|
||||||
msgid "filament"
|
msgid "filament"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preset.cpp:1553
|
#: src/slic3r/GUI/Preset.cpp:1556
|
||||||
msgid "SLA print"
|
msgid "SLA print"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
@ -337,6 +337,10 @@ msgstr "Logický výraz může používat konfigurační hodnoty aktivního prof
|
||||||
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
|
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
|
||||||
msgstr "Logický výraz může používat konfigurační hodnoty aktivního profilu tiskárny. Pokud je tento logický výraz pravdivý, potom je tento profil považován za kompatibilní s aktivním profilem tiskárny."
|
msgstr "Logický výraz může používat konfigurační hodnoty aktivního profilu tiskárny. Pokud je tento logický výraz pravdivý, potom je tento profil považován za kompatibilní s aktivním profilem tiskárny."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:975
|
||||||
|
msgid "A copy of the current system preset will be created, which will be detached from the system preset."
|
||||||
|
msgstr "Bude vytvořena oddělená kopie aktuálního systémového přednastavení."
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:1034
|
#: src/slic3r/GUI/ConfigWizard.cpp:1034
|
||||||
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
|
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
|
||||||
msgstr "Obecným pravidlem je 160 až 230 °C pro PLA a 215 až 250 °C pro ABS."
|
msgstr "Obecným pravidlem je 160 až 230 °C pro PLA a 215 až 250 °C pro ABS."
|
||||||
|
@ -1569,15 +1573,6 @@ msgstr "Aktuální nastavení je zděděné od"
|
||||||
msgid "Current preset is inherited from the default preset."
|
msgid "Current preset is inherited from the default preset."
|
||||||
msgstr "Aktuální nastavení je zděděno z výchozího nastavení."
|
msgstr "Aktuální nastavení je zděděno z výchozího nastavení."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:960
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Current preset is inherited from:\n"
|
|
||||||
"\t%s"
|
|
||||||
msgstr ""
|
|
||||||
"Aktuální nastavení je zděděné od:\n"
|
|
||||||
"%s"
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/UpdateDialogs.cpp:43
|
#: src/slic3r/GUI/UpdateDialogs.cpp:43
|
||||||
msgid "Current version:"
|
msgid "Current version:"
|
||||||
msgstr "Aktuální verze:"
|
msgstr "Aktuální verze:"
|
||||||
|
@ -1877,6 +1872,18 @@ msgstr "Odznačit obdélníkovým výběrem myši"
|
||||||
msgid "Deselects all objects"
|
msgid "Deselects all objects"
|
||||||
msgstr "Odznačit všechny objekty"
|
msgstr "Odznačit všechny objekty"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:963
|
||||||
|
msgid "Detach from system preset"
|
||||||
|
msgstr "Oddělit od systémového přednastavení"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:984
|
||||||
|
msgid "Detach preset"
|
||||||
|
msgstr "Oddělení přednastavení"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:3029
|
||||||
|
msgid "Detached"
|
||||||
|
msgstr "Odpojeno"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:1373
|
#: src/libslic3r/PrintConfig.cpp:1373
|
||||||
msgid "Detect bridging perimeters"
|
msgid "Detect bridging perimeters"
|
||||||
msgstr "Detekovat perimetry přemostění"
|
msgstr "Detekovat perimetry přemostění"
|
||||||
|
@ -2152,6 +2159,11 @@ msgstr "Vysunout SD kartu / Flash disk"
|
||||||
msgid "Eject SD card / Flash drive after the G-code was exported to it."
|
msgid "Eject SD card / Flash drive after the G-code was exported to it."
|
||||||
msgstr "Vysunout SD kartu / Flash disk po vyexportování G-codu."
|
msgstr "Vysunout SD kartu / Flash disk po vyexportování G-codu."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Plater.cpp:2202
|
||||||
|
#, c-format
|
||||||
|
msgid "Ejecting of device %s(%s) has failed."
|
||||||
|
msgstr "Vysunutí zařízení %s(%s) se nezdařilo."
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:118
|
#: src/libslic3r/PrintConfig.cpp:118
|
||||||
msgid "Elephant foot compensation"
|
msgid "Elephant foot compensation"
|
||||||
msgstr "Kompenzace rozplácnutí první vrstvy"
|
msgstr "Kompenzace rozplácnutí první vrstvy"
|
||||||
|
@ -2971,15 +2983,6 @@ msgstr "Pro více informací prosím navštivte naší wiki stránku:"
|
||||||
msgid "For support enforcers only"
|
msgid "For support enforcers only"
|
||||||
msgstr "Pouze pro vynucené podpěry"
|
msgstr "Pouze pro vynucené podpěry"
|
||||||
|
|
||||||
#. TRN Description for "WHITE BULLET"
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:3265
|
|
||||||
msgid ""
|
|
||||||
"for the left button: \tindicates a non-system (or non-default) preset,\n"
|
|
||||||
"for the right button: \tindicates that the settings hasn't been modified."
|
|
||||||
msgstr ""
|
|
||||||
"na levé straně: indikuje nesystémové (jiné než výchozí) přednastavení,\n"
|
|
||||||
"na pravé straně: indikuje, že nastavení nebylo změněno."
|
|
||||||
|
|
||||||
#. TRN Description for "WHITE BULLET"
|
#. TRN Description for "WHITE BULLET"
|
||||||
#: src/slic3r/GUI/Tab.cpp:3267
|
#: src/slic3r/GUI/Tab.cpp:3267
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3401,16 +3404,6 @@ msgstr "Soubor HTTPS CA"
|
||||||
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
|
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
|
||||||
msgstr "Soubor HTTPS CA je volitelný. Je nutný pouze pokud použijte HTTPS certifikát s vlastním podpisem."
|
msgstr "Soubor HTTPS CA je volitelný. Je nutný pouze pokud použijte HTTPS certifikát s vlastním podpisem."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:1757
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"HTTPS CA File:\n"
|
|
||||||
" \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n"
|
|
||||||
" \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain."
|
|
||||||
msgstr ""
|
|
||||||
"Soubor HTTPS CA:\n"
|
|
||||||
"V tomto systému používá %s certifikáty HTTPS ze systému Certificate Store nebo Keychain. Chcete-li použít vlastní soubor CA, importujte soubor CA do Certificate Store / Keychain."
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preferences.cpp:222
|
#: src/slic3r/GUI/Preferences.cpp:222
|
||||||
msgid "Icon size in a respect to the default size"
|
msgid "Icon size in a respect to the default size"
|
||||||
msgstr "Velikost ikon vůči výchozí velikosti"
|
msgstr "Velikost ikon vůči výchozí velikosti"
|
||||||
|
@ -4627,6 +4620,10 @@ msgstr "Oprava modelu byla dokončena"
|
||||||
msgid "Model repaired successfully"
|
msgid "Model repaired successfully"
|
||||||
msgstr "Model byl úspěšně opraven"
|
msgstr "Model byl úspěšně opraven"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:979
|
||||||
|
msgid "Modifications to the current profile will be saved."
|
||||||
|
msgstr "Úpravy aktuálního profilu budou uloženy."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preset.cpp:247
|
#: src/slic3r/GUI/Preset.cpp:247
|
||||||
msgid "modified"
|
msgid "modified"
|
||||||
msgstr "upraveno"
|
msgstr "upraveno"
|
||||||
|
@ -5425,10 +5422,10 @@ msgstr "Přednastavení (%s)"
|
||||||
msgid "Preset with name \"%1%\" already exists."
|
msgid "Preset with name \"%1%\" already exists."
|
||||||
msgstr "Přednastavení s názvem \"%1%\" již existuje."
|
msgstr "Přednastavení s názvem \"%1%\" již existuje."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:3045
|
#: src/slic3r/GUI/Tab.cpp:3029
|
||||||
msgctxt "PresetName"
|
msgctxt "PresetName"
|
||||||
msgid "%1% - Copy"
|
msgid "Copy"
|
||||||
msgstr "%1% - Kopie"
|
msgstr "Kopie"
|
||||||
|
|
||||||
#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
|
#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
|
||||||
msgid "Press to activate deselection rectangle"
|
msgid "Press to activate deselection rectangle"
|
||||||
|
@ -6468,16 +6465,6 @@ msgstr "Vyberte, jaký typ podložky potřebujete"
|
||||||
msgid "Select what kind of support do you need"
|
msgid "Select what kind of support do you need"
|
||||||
msgstr "Vyberte typ podpěr, které potřebujete"
|
msgstr "Vyberte typ podpěr, které potřebujete"
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
|
||||||
msgid ""
|
|
||||||
"Select YES if you want to delete all saved tool changes, \n"
|
|
||||||
"\tNO if you want all tool changes switch to color changes, \n"
|
|
||||||
"\tor CANCEL to leave it unchanged."
|
|
||||||
msgstr ""
|
|
||||||
"Vyberte ANO, pokud chcete odstranit všechny uložené změny nástroje,\n"
|
|
||||||
"NE, pokud chcete, aby se všechny změny nástroje přepnout na změny barev,\n"
|
|
||||||
"nebo ZRUŠIT pro ponechání beze změny."
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
||||||
msgid ""
|
msgid ""
|
||||||
"Select YES if you want to delete all saved tool changes, \n"
|
"Select YES if you want to delete all saved tool changes, \n"
|
||||||
|
@ -7641,6 +7628,10 @@ msgid ""
|
||||||
"If the device is connected, please press the Reset button next to the USB connector ..."
|
"If the device is connected, please press the Reset button next to the USB connector ..."
|
||||||
msgstr "Zařízení %s nebylo nalezeno. Pokud je zařízení připojeno, stiskněte tlačítko Reset vedle USB konektoru ..."
|
msgstr "Zařízení %s nebylo nalezeno. Pokud je zařízení připojeno, stiskněte tlačítko Reset vedle USB konektoru ..."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:976
|
||||||
|
msgid "The current custom preset will be detached from the parent system preset."
|
||||||
|
msgstr "Aktuální vlastní přednastavení bude odděleno od rodičovského systémového přednastavení."
|
||||||
|
|
||||||
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
|
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
|
||||||
msgid ""
|
msgid ""
|
||||||
"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
|
"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
|
||||||
|
@ -7795,18 +7786,14 @@ msgstr "Vybraný objekt nemůže být rozdělen, protože obsahuje více než je
|
||||||
msgid "The selected object couldn't be split because it contains only one part."
|
msgid "The selected object couldn't be split because it contains only one part."
|
||||||
msgstr "Vybraný objekt nemůže být rozdělen, protože obsahuje pouze jednu část."
|
msgstr "Vybraný objekt nemůže být rozdělen, protože obsahuje pouze jednu část."
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:432
|
#: src/slic3r/GUI/MainFrame.cpp:461
|
||||||
msgid ""
|
msgid ""
|
||||||
"The selected project is no longer available.\n"
|
"The selected project is no longer available.\n"
|
||||||
"Do you want to remove it from the recent projects list ?"
|
"Do you want to remove it from the recent projects list?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Vybraný projekt již není k dispozici.\n"
|
"Vybraný projekt již není k dispozici.\n"
|
||||||
"Chcete ho odstranit ze seznamu posledních projektů?"
|
"Chcete ho odstranit ze seznamu posledních projektů?"
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:422
|
|
||||||
msgid "The selected project is no more available"
|
|
||||||
msgstr "Vybraný projekt již není dostupný"
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:998
|
#: src/slic3r/GUI/DoubleSlider.cpp:998
|
||||||
msgid ""
|
msgid ""
|
||||||
"The sequential print is on.\n"
|
"The sequential print is on.\n"
|
||||||
|
@ -7982,6 +7969,14 @@ msgstr ""
|
||||||
msgid "This %s version: %s"
|
msgid "This %s version: %s"
|
||||||
msgstr "Tento %s verze: %s"
|
msgstr "Tento %s verze: %s"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:982
|
||||||
|
msgid ""
|
||||||
|
"This action is not revertable.\n"
|
||||||
|
"Do you want to proceed?"
|
||||||
|
msgstr ""
|
||||||
|
"Tato akce je nevratná.\n"
|
||||||
|
"Chcete pokračovat?"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:165
|
#: src/libslic3r/PrintConfig.cpp:165
|
||||||
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
|
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
|
||||||
msgstr "Tento kód je vložen mezi objekty, pokud je použit sekvenční tisk. Ve výchozím nastavení je resetován extruder a tisková podložka pomocí non-wait (nečekacím) příkazem; nicméně pokud jsou příkazy M104, M109, 140 nebo M190 detekovány v tomto vlastním kódu, Slic3r nebude přidávat teplotní příkazy. Můžete přidávat zástupné proměnné pro veškeré nastavení Slic3ru, takže můžete vložit příkaz “M109 S[first_layer_temperature]” kamkoliv chcete."
|
msgstr "Tento kód je vložen mezi objekty, pokud je použit sekvenční tisk. Ve výchozím nastavení je resetován extruder a tisková podložka pomocí non-wait (nečekacím) příkazem; nicméně pokud jsou příkazy M104, M109, 140 nebo M190 detekovány v tomto vlastním kódu, Slic3r nebude přidávat teplotní příkazy. Můžete přidávat zástupné proměnné pro veškeré nastavení Slic3ru, takže můžete vložit příkaz “M109 S[first_layer_temperature]” kamkoliv chcete."
|
||||||
|
@ -8149,10 +8144,6 @@ msgstr "Toto je největší možná výška vrstvy pro tento extruder, který se
|
||||||
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
|
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
|
||||||
msgstr "Nejmenší tisknutelná výška vrstvy pro tento extruder. Omezuje rozlišení pro výšku proměnné vrstvy. Typické hodnoty jsou mezi 0,05 mm a 0,1 mm."
|
msgstr "Nejmenší tisknutelná výška vrstvy pro tento extruder. Omezuje rozlišení pro výšku proměnné vrstvy. Typické hodnoty jsou mezi 0,05 mm a 0,1 mm."
|
||||||
|
|
||||||
#: src/libslic3r/GCode.cpp:639
|
|
||||||
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
|
||||||
msgstr "To je obvykle způsobeno zanedbatelně malým množstvím extrudovaného materiálu nebo chybným modelem. Zkuste model opravit nebo změnit jeho orientaci na podložce."
|
|
||||||
|
|
||||||
#: src/libslic3r/GCode.cpp:639
|
#: src/libslic3r/GCode.cpp:639
|
||||||
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
||||||
msgstr "To je obvykle způsobeno zanedbatelně malým množstvím extrudovaného materiálu nebo chybným modelem. Zkuste model opravit nebo změnit jeho orientaci na podložce."
|
msgstr "To je obvykle způsobeno zanedbatelně malým množstvím extrudovaného materiálu nebo chybným modelem. Zkuste model opravit nebo změnit jeho orientaci na podložce."
|
||||||
|
|
|
@ -337,6 +337,10 @@ msgstr "Ein boolescher Ausdruck, der die Konfigurationswerte eines aktiven Druck
|
||||||
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
|
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
|
||||||
msgstr "Ein boolescher Ausdruck, der die Konfigurationswerte eines aktiven Druckerprofils verwendet. Wenn dieser Ausdruck als wahr bewertet wird, wird dieses Profil als kompatibel mit dem aktiven Druckerprofil angesehen."
|
msgstr "Ein boolescher Ausdruck, der die Konfigurationswerte eines aktiven Druckerprofils verwendet. Wenn dieser Ausdruck als wahr bewertet wird, wird dieses Profil als kompatibel mit dem aktiven Druckerprofil angesehen."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:975
|
||||||
|
msgid "A copy of the current system preset will be created, which will be detached from the system preset."
|
||||||
|
msgstr "Es wird eine Kopie der aktuellen Systemvoreinstellung erstellt, die von der Systemvoreinstellung gelöst wird."
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:1034
|
#: src/slic3r/GUI/ConfigWizard.cpp:1034
|
||||||
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
|
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
|
||||||
msgstr "Ein Daumenwert ist 160 bis 230 °C für PLA, und 215 bis 250 °C für ABS."
|
msgstr "Ein Daumenwert ist 160 bis 230 °C für PLA, und 215 bis 250 °C für ABS."
|
||||||
|
@ -1565,15 +1569,6 @@ msgstr "Aktuelle Voreinstellung ist abgeleitet von"
|
||||||
msgid "Current preset is inherited from the default preset."
|
msgid "Current preset is inherited from the default preset."
|
||||||
msgstr "Aktuelle Voreinstellung ist abgeleitet von der Standardvoreinstellung."
|
msgstr "Aktuelle Voreinstellung ist abgeleitet von der Standardvoreinstellung."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:960
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Current preset is inherited from:\n"
|
|
||||||
"\t%s"
|
|
||||||
msgstr ""
|
|
||||||
"Aktuelle Voreinstellung ist abgeleitet von:\n"
|
|
||||||
"%s"
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/UpdateDialogs.cpp:43
|
#: src/slic3r/GUI/UpdateDialogs.cpp:43
|
||||||
msgid "Current version:"
|
msgid "Current version:"
|
||||||
msgstr "Aktuelle Version:"
|
msgstr "Aktuelle Version:"
|
||||||
|
@ -1873,6 +1868,18 @@ msgstr "Abwahl über Rechteck"
|
||||||
msgid "Deselects all objects"
|
msgid "Deselects all objects"
|
||||||
msgstr "Alle Objekte abwählen"
|
msgstr "Alle Objekte abwählen"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:963
|
||||||
|
msgid "Detach from system preset"
|
||||||
|
msgstr "Lösen von der Systemvoreinstellung"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:984
|
||||||
|
msgid "Detach preset"
|
||||||
|
msgstr "Lösen der Voreinstellugen"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:3029
|
||||||
|
msgid "Detached"
|
||||||
|
msgstr "Losgelöst"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:1373
|
#: src/libslic3r/PrintConfig.cpp:1373
|
||||||
msgid "Detect bridging perimeters"
|
msgid "Detect bridging perimeters"
|
||||||
msgstr "Umfangbrücken entdecken"
|
msgstr "Umfangbrücken entdecken"
|
||||||
|
@ -2136,6 +2143,23 @@ msgstr "Häkchen bearbeiten - Rechtsklick"
|
||||||
msgid "Editing"
|
msgid "Editing"
|
||||||
msgstr "Bearbeitung"
|
msgstr "Bearbeitung"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:547
|
||||||
|
msgid "Ejec&t SD card / Flash drive"
|
||||||
|
msgstr "SD-Kar&te/Flash-Laufwerk auswerfen"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
|
||||||
|
msgid "Eject SD card / Flash drive"
|
||||||
|
msgstr "SD-Karte/Flash-Laufwerk auswerfen"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:547
|
||||||
|
msgid "Eject SD card / Flash drive after the G-code was exported to it."
|
||||||
|
msgstr "SD-Karte / Flash-Laufwerk auswerfen, nachdem der G-Code dorthin exportiert wurde."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Plater.cpp:2202
|
||||||
|
#, c-format
|
||||||
|
msgid "Ejecting of device %s(%s) has failed."
|
||||||
|
msgstr "Das Auswerfen von Gerät %s(%s) ist fehlgeschlagen."
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:118
|
#: src/libslic3r/PrintConfig.cpp:118
|
||||||
msgid "Elephant foot compensation"
|
msgid "Elephant foot compensation"
|
||||||
msgstr "Elefantenfußkompensation"
|
msgstr "Elefantenfußkompensation"
|
||||||
|
@ -2426,6 +2450,10 @@ msgstr "Exportiere die aktuelle Plattenbelegung als AMF"
|
||||||
msgid "Export current plate as G-code"
|
msgid "Export current plate as G-code"
|
||||||
msgstr "Exportiere die aktuelle Plattenbelegung als G-Code"
|
msgstr "Exportiere die aktuelle Plattenbelegung als G-Code"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:521
|
||||||
|
msgid "Export current plate as G-code to SD card / Flash drive"
|
||||||
|
msgstr "Aktuelle Druckplatte als G-Code auf SD-Karte/Flash-Laufwerk exportieren"
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:486
|
#: src/slic3r/GUI/MainFrame.cpp:486
|
||||||
msgid "Export current plate as STL"
|
msgid "Export current plate as STL"
|
||||||
msgstr "Exportiere die aktuelle Plattenbelegung als STL"
|
msgstr "Exportiere die aktuelle Plattenbelegung als STL"
|
||||||
|
@ -2447,6 +2475,10 @@ msgstr "Exportieren Sie die vollständigen Pfadnamen der Modelle und Teilequelle
|
||||||
msgid "Export G-code"
|
msgid "Export G-code"
|
||||||
msgstr "Export G-Code"
|
msgstr "Export G-Code"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:521
|
||||||
|
msgid "Export G-code to SD card / Flash drive"
|
||||||
|
msgstr "G-Code auf SD-Karte/Flash-Laufwerk exportieren"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:3320
|
#: src/libslic3r/PrintConfig.cpp:3320
|
||||||
msgid "Export OBJ"
|
msgid "Export OBJ"
|
||||||
msgstr "Exportiere OBJ"
|
msgstr "Exportiere OBJ"
|
||||||
|
@ -2947,15 +2979,6 @@ msgstr "Für weitere Informationen besuchen Sie bitte unsere Wiki-Seite:"
|
||||||
msgid "For support enforcers only"
|
msgid "For support enforcers only"
|
||||||
msgstr "Nur für Stützverstärker"
|
msgstr "Nur für Stützverstärker"
|
||||||
|
|
||||||
#. TRN Description for "WHITE BULLET"
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:3265
|
|
||||||
msgid ""
|
|
||||||
"for the left button: \tindicates a non-system (or non-default) preset,\n"
|
|
||||||
"for the right button: \tindicates that the settings hasn't been modified."
|
|
||||||
msgstr ""
|
|
||||||
"Beim linken Knopf: zeigt eine Nicht-System- (oder Nicht-Standard-) Einstellung an.\n"
|
|
||||||
"Beim rechten Knopf: zeigt an, dass die Einstellung nicht geändert wurde."
|
|
||||||
|
|
||||||
#. TRN Description for "WHITE BULLET"
|
#. TRN Description for "WHITE BULLET"
|
||||||
#: src/slic3r/GUI/Tab.cpp:3267
|
#: src/slic3r/GUI/Tab.cpp:3267
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3373,16 +3396,6 @@ msgstr "HTTPS CA Datei"
|
||||||
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
|
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
|
||||||
msgstr "HTTPS-CA-Datei ist optional. Sie wird nur benötigt, wenn Sie HTTPS mit einem selbstsignierten Zertifikat verwenden."
|
msgstr "HTTPS-CA-Datei ist optional. Sie wird nur benötigt, wenn Sie HTTPS mit einem selbstsignierten Zertifikat verwenden."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:1757
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"HTTPS CA File:\n"
|
|
||||||
" \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n"
|
|
||||||
" \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain."
|
|
||||||
msgstr ""
|
|
||||||
"HTTPS CA-Datei:\n"
|
|
||||||
"Auf diesem System verwendet %s HTTPS-Zertifikate aus dem System Zertifikatsspeicher oder Schlüsselbund. Um eine benutzerdefinierte CA-Datei zu verwenden, importieren Sie bitte Ihre CA-Datei in den Zertifikatsspeicher / Schlüsselbund."
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preferences.cpp:222
|
#: src/slic3r/GUI/Preferences.cpp:222
|
||||||
msgid "Icon size in a respect to the default size"
|
msgid "Icon size in a respect to the default size"
|
||||||
msgstr "Symbolgröße in Bezug auf die Standardgröße"
|
msgstr "Symbolgröße in Bezug auf die Standardgröße"
|
||||||
|
@ -4599,6 +4612,10 @@ msgstr "Modellreparatur beendet"
|
||||||
msgid "Model repaired successfully"
|
msgid "Model repaired successfully"
|
||||||
msgstr "Modellreparatur erfolgreich"
|
msgstr "Modellreparatur erfolgreich"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:979
|
||||||
|
msgid "Modifications to the current profile will be saved."
|
||||||
|
msgstr "Änderungen am aktuellen Profil werden gespeichert."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preset.cpp:247
|
#: src/slic3r/GUI/Preset.cpp:247
|
||||||
msgid "modified"
|
msgid "modified"
|
||||||
msgstr "geändert"
|
msgstr "geändert"
|
||||||
|
@ -5397,10 +5414,10 @@ msgstr "Voreinstellung (%s)"
|
||||||
msgid "Preset with name \"%1%\" already exists."
|
msgid "Preset with name \"%1%\" already exists."
|
||||||
msgstr "Eine Voreinstellung mit dem Namen \"%1%\" existiert bereits."
|
msgstr "Eine Voreinstellung mit dem Namen \"%1%\" existiert bereits."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:3045
|
#: src/slic3r/GUI/Tab.cpp:3029
|
||||||
msgctxt "PresetName"
|
msgctxt "PresetName"
|
||||||
msgid "%1% - Copy"
|
msgid "Copy"
|
||||||
msgstr "%1% - Kopieren"
|
msgstr "Kopieren"
|
||||||
|
|
||||||
#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
|
#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
|
||||||
msgid "Press to activate deselection rectangle"
|
msgid "Press to activate deselection rectangle"
|
||||||
|
@ -6437,16 +6454,6 @@ msgstr "Wählen Sie aus, welche Art von Grundschicht Sie benötigen"
|
||||||
msgid "Select what kind of support do you need"
|
msgid "Select what kind of support do you need"
|
||||||
msgstr "Wählen Sie aus, welche Art von Unterstützung Sie benötigen"
|
msgstr "Wählen Sie aus, welche Art von Unterstützung Sie benötigen"
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
|
||||||
msgid ""
|
|
||||||
"Select YES if you want to delete all saved tool changes, \n"
|
|
||||||
"\tNO if you want all tool changes switch to color changes, \n"
|
|
||||||
"\tor CANCEL to leave it unchanged."
|
|
||||||
msgstr ""
|
|
||||||
"Wählen Sie JA, wenn Sie alle gespeicherten Werkzeugänderungen löschen möchten, \n"
|
|
||||||
"NEIN, wenn Sie möchten, dass alle Werkzeugänderungen auf Farbwechsel umgestellt werden, \n"
|
|
||||||
"oder ABBRECHEN, um sie unverändert zu lassen."
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
||||||
msgid ""
|
msgid ""
|
||||||
"Select YES if you want to delete all saved tool changes, \n"
|
"Select YES if you want to delete all saved tool changes, \n"
|
||||||
|
@ -7612,6 +7619,10 @@ msgstr ""
|
||||||
"Das %s-Gerät wurde nicht gefunden.\n"
|
"Das %s-Gerät wurde nicht gefunden.\n"
|
||||||
"Wenn das Gerät angeschlossen ist, drücken Sie bitte die Reset-Taste neben dem USB-Anschluss...."
|
"Wenn das Gerät angeschlossen ist, drücken Sie bitte die Reset-Taste neben dem USB-Anschluss...."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:976
|
||||||
|
msgid "The current custom preset will be detached from the parent system preset."
|
||||||
|
msgstr "Die aktuelle benutzerdefinierte Voreinstellung wird von der Voreinstellung des übergeordneten Systems gelöst."
|
||||||
|
|
||||||
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
|
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
|
||||||
msgid ""
|
msgid ""
|
||||||
"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
|
"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
|
||||||
|
@ -7769,17 +7780,13 @@ msgstr "Das ausgewählte Objekt konnte nicht getrennt werden, weil es aus mehr a
|
||||||
msgid "The selected object couldn't be split because it contains only one part."
|
msgid "The selected object couldn't be split because it contains only one part."
|
||||||
msgstr "Das ausgewählte Objekt konnte nicht getrennt werden, da es nur aus einem Teil besteht."
|
msgstr "Das ausgewählte Objekt konnte nicht getrennt werden, da es nur aus einem Teil besteht."
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:432
|
#: src/slic3r/GUI/MainFrame.cpp:461
|
||||||
msgid ""
|
msgid ""
|
||||||
"The selected project is no longer available.\n"
|
"The selected project is no longer available.\n"
|
||||||
"Do you want to remove it from the recent projects list ?"
|
"Do you want to remove it from the recent projects list?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Das ausgewählte Projekt ist nicht mehr verfügbar.\n"
|
"Das ausgewählte Projekt ist nicht mehr verfügbar.\n"
|
||||||
"Wollen Sie es aus der Liste der letzten Projekte entfernen ?"
|
"Wollen Sie es aus der Liste der letzten Projekte entfernen?"
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:422
|
|
||||||
msgid "The selected project is no more available"
|
|
||||||
msgstr "Das ausgewählte Projekt ist nicht mehr verfügbar"
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:998
|
#: src/slic3r/GUI/DoubleSlider.cpp:998
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -7952,6 +7959,14 @@ msgstr ""
|
||||||
msgid "This %s version: %s"
|
msgid "This %s version: %s"
|
||||||
msgstr "Diese %s Version: %s"
|
msgstr "Diese %s Version: %s"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:982
|
||||||
|
msgid ""
|
||||||
|
"This action is not revertable.\n"
|
||||||
|
"Do you want to proceed?"
|
||||||
|
msgstr ""
|
||||||
|
"Diese Aktion ist nicht umkehrbar.\n"
|
||||||
|
"Wollen Sie fortfahren?"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:165
|
#: src/libslic3r/PrintConfig.cpp:165
|
||||||
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
|
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
|
||||||
msgstr "Dieser Code wird beim sequentiellen Drucken zwischen Objekten eingefügt. Standardmäßig werden Extruder- und Betttemperatur mit dem Befehl, der nicht auf die Änderung wartet, zurückgesetzt. Wenn jedoch M104, M109, M140 oder M190 in diesem benutzerdefinierten Code erkannt werden, fügt Slic3r keine Temperaturbefehle hinzu. Beachten Sie, dass Sie Platzhaltervariablen für alle PrusaSlicer-Einstellungen verwenden können, so dass Sie einen \"M109 S[first_layer_temperature]\"-Befehl an beliebiger Stelle platzieren können."
|
msgstr "Dieser Code wird beim sequentiellen Drucken zwischen Objekten eingefügt. Standardmäßig werden Extruder- und Betttemperatur mit dem Befehl, der nicht auf die Änderung wartet, zurückgesetzt. Wenn jedoch M104, M109, M140 oder M190 in diesem benutzerdefinierten Code erkannt werden, fügt Slic3r keine Temperaturbefehle hinzu. Beachten Sie, dass Sie Platzhaltervariablen für alle PrusaSlicer-Einstellungen verwenden können, so dass Sie einen \"M109 S[first_layer_temperature]\"-Befehl an beliebiger Stelle platzieren können."
|
||||||
|
@ -8117,10 +8132,6 @@ msgstr "Dies ist die höchste druckbare Schichthöhe für diesen Extruder, mit d
|
||||||
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
|
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
|
||||||
msgstr "Dies ist die niedrigste druckbare Schichthöhe für diesen Extruder und begrenzt die Auflösung bei variabler Schichthöhe. Typische Werte liegen zwischen 0,05 mm und 0,1 mm."
|
msgstr "Dies ist die niedrigste druckbare Schichthöhe für diesen Extruder und begrenzt die Auflösung bei variabler Schichthöhe. Typische Werte liegen zwischen 0,05 mm und 0,1 mm."
|
||||||
|
|
||||||
#: src/libslic3r/GCode.cpp:639
|
|
||||||
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
|
||||||
msgstr "Dies wird in der Regel durch vernachlässigbar kleine Extrusionen oder durch ein fehlerhaftes Modell verursacht. Versuchen Sie, das Modell zu reparieren oder seine Ausrichtung auf dem Druckbett zu ändern."
|
|
||||||
|
|
||||||
#: src/libslic3r/GCode.cpp:639
|
#: src/libslic3r/GCode.cpp:639
|
||||||
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
||||||
msgstr "Dies wird in der Regel durch vernachlässigbar kleine Extrusionen oder durch ein fehlerhaftes Modell verursacht. Versuchen Sie, das Modell zu reparieren oder seine Ausrichtung auf dem Druckbett zu ändern."
|
msgstr "Dies wird in der Regel durch vernachlässigbar kleine Extrusionen oder durch ein fehlerhaftes Modell verursacht. Versuchen Sie, das Modell zu reparieren oder seine Ausrichtung auf dem Druckbett zu ändern."
|
||||||
|
|
BIN
resources/localization/en/PrusaSlicer.mo
Normal file
155
resources/localization/en/PrusaSlicer_en.po
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Language: en\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
"Project-Id-Version: \n"
|
||||||
|
"POT-Creation-Date: \n"
|
||||||
|
"PO-Revision-Date: \n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"X-Generator: Poedit 2.3\n"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/UpdateDialogs.cpp:71
|
||||||
|
msgid "Don't notify about new releases any more"
|
||||||
|
msgstr "Don't notify about new releases anymore"
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:287
|
||||||
|
msgid "A boolean expression using the configuration values of an active print profile. If this expression evaluates to true, this profile is considered compatible with the active print profile."
|
||||||
|
msgstr "A Boolean expression using the configuration values of an active print profile. If this expression evaluates to true, this profile is considered compatible with the active print profile."
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:272
|
||||||
|
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
|
||||||
|
msgstr "A Boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:409
|
||||||
|
msgid "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)."
|
||||||
|
msgstr "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top + bottom solid layers)."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/ConfigWizard.cpp:791
|
||||||
|
msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied."
|
||||||
|
msgstr "Additionally, a backup snapshot of the whole configuration is created before an update is applied."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268
|
||||||
|
msgid "Autogeneration will erase all manually edited points."
|
||||||
|
msgstr "Auto Generation will erase all manually edited points."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:1171
|
||||||
|
msgid "Autospeed (advanced)"
|
||||||
|
msgstr "Auto Speed (advanced)"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22
|
||||||
|
msgid "Before roll back"
|
||||||
|
msgstr "Before rollback"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/ButtonsDescription.cpp:16
|
||||||
|
msgid "Buttons And Text Colors Description"
|
||||||
|
msgstr "Buttons and Text Colors Description"
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:791
|
||||||
|
msgid "Density of internal infill, expressed in the range 0% - 100%."
|
||||||
|
msgstr "Density of internal infill, expressed in the range 0 % - 100 %."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/ConfigWizard.cpp:773
|
||||||
|
#, c-format
|
||||||
|
msgid "If enabled, %s checks for new application versions 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 "If enabled, %s checks for new application versions 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 mechanism, no automatic installation is done."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/ConfigWizard.cpp:783
|
||||||
|
#, c-format
|
||||||
|
msgid "If enabled, %s downloads updates of built-in system presets in the background.These updates are downloaded into a separate temporary location.When a new preset version becomes available it is offered at application startup."
|
||||||
|
msgstr "If enabled, %s downloads updates of built-in system presets in the background. These updates are downloaded into a separate temporary location. When a new preset version becomes available it is offered at application startup."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Preferences.cpp:66
|
||||||
|
msgid "If enabled, PrusaSlicer will check for the new versions of itself online. When a new version becomes available a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done."
|
||||||
|
msgstr "If enabled, PrusaSlicer will check for the new versions of itself online. When a new version becomes available a notification is displayed at the next application startup (never during program usage). This is only a notification mechanism, no automatic installation is done."
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:1858
|
||||||
|
msgid "If enabled, the wipe tower will not be printed on layers with no toolchanges. On layers with a toolchange, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no collision with the print."
|
||||||
|
msgstr "If enabled, the wipe tower will not be printed on layers with no tool changes. On layers with a tool change, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no collision with the print."
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:2262
|
||||||
|
msgid "Object will be used to purge the nozzle after a toolchange to save material that would otherwise end up in the wipe tower and decrease print time. Colours of the objects will be mixed as a result."
|
||||||
|
msgstr "Object will be used to purge the nozzle after a tool change to save material that would otherwise end up in the wipe tower and decrease print time. Colours of the objects will be mixed as a result."
|
||||||
|
|
||||||
|
#: src/libslic3r/Print.cpp:1365
|
||||||
|
msgid "One or more object were assigned an extruder that the printer does not have."
|
||||||
|
msgstr "One or more objects were assigned an extruder that the printer does not have."
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:2254
|
||||||
|
msgid "Purging after toolchange will done inside this object's infills. This lowers the amount of waste but may result in longer print time due to additional travel moves."
|
||||||
|
msgstr "Purging after tool change will done inside this object's infills. This lowers the amount of waste but may result in longer print time due to additional travel moves."
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:1552
|
||||||
|
msgid "Retraction Length (Toolchange)"
|
||||||
|
msgstr "Retraction Length (Tool change)"
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:556
|
||||||
|
msgid "Set this to a non-zero value to allow a manual extrusion width. If left to zero, Slic3r derives extrusion widths from the nozzle diameter (see the tooltips for perimeter extrusion width, infill extrusion width etc). If expressed as percentage (for example: 230%), it will be computed over layer height."
|
||||||
|
msgstr "Set this to a non-zero value to allow a manual extrusion width. If left to zero, Slic3r derives extrusion widths from the nozzle diameter (see the tooltips for perimeter extrusion width, infill extrusion width etc.). If expressed as percentage (for example: 230%), it will be computed over layer height."
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:2824
|
||||||
|
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 "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 they are closer, they will get merged into one pad."
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:624
|
||||||
|
msgid "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)."
|
||||||
|
msgstr "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)."
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:2044
|
||||||
|
msgid "Support material will not be generated for overhangs whose slope angle (90° = vertical) is above the given threshold. In other words, this value represent the most horizontal slope (measured from the horizontal plane) that you can print without support material. Set to zero for automatic detection (recommended)."
|
||||||
|
msgstr "Support material will not be generated for overhangs whose slope angle (90° = vertical) is above the given threshold. In other words, this value represents the most horizontal slope (measured from the horizontal plane) that you can print without support material. Set to zero for automatic detection (recommended)."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/DoubleSlider.cpp:998
|
||||||
|
msgid ""
|
||||||
|
"The sequential print is on.\n"
|
||||||
|
"It's impossible to apply any custom G-code for objects printing sequentually.\n"
|
||||||
|
"This code won't be processed during G-code generation."
|
||||||
|
msgstr ""
|
||||||
|
"The sequential print is on.\n"
|
||||||
|
"It's impossible to apply any custom G-code for objects printing sequentially.\n"
|
||||||
|
"This code won't be processed during G-code generation."
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:2094
|
||||||
|
msgid "This custom code is inserted before every toolchange. Placeholder variables for all PrusaSlicer settings as well as {previous_extruder} and {next_extruder} can be used. When a tool-changing command which changes to the correct extruder is included (such as T{next_extruder}), PrusaSlicer will emit no other such command. It is therefore possible to script custom behaviour both before and after the toolchange."
|
||||||
|
msgstr "This custom code is inserted before every tool change. Placeholder variables for all PrusaSlicer settings as well as {previous_extruder} and {next_extruder} can be used. When a tool-changing command which changes to the correct extruder is included (such as T{next_extruder}), PrusaSlicer will emit no other such command. It is therefore possible to script custom behaviour both before and after the tool change."
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:396
|
||||||
|
msgid "This end procedure is inserted at the end of the output file, before the printer end gcode (and before any toolchange from this filament in case of multimaterial printers). Note that you can use placeholder variables for all PrusaSlicer settings. If you have multiple extruders, the gcode is processed in extruder order."
|
||||||
|
msgstr "This end procedure is inserted at the end of the output file, before the printer end gcode (and before any tool change from this filament in case of multimaterial printers). Note that you can use placeholder variables for all PrusaSlicer settings. If you have multiple extruders, the gcode is processed in extruder order."
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:2215
|
||||||
|
msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools."
|
||||||
|
msgstr "This matrix describes volumes (in cubic millimetres) required to purge the new filament on the wipe tower for any given pair of tools."
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:1829
|
||||||
|
msgid "This start procedure is inserted at the beginning, after any printer start gcode (and after any toolchange to this filament in case of multi-material printers). This is used to override settings for a specific filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all PrusaSlicer settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want. If you have multiple extruders, the gcode is processed in extruder order."
|
||||||
|
msgstr "This start procedure is inserted at the beginning, after any printer start gcode (and after any tool change to this filament in case of multi-material printers). This is used to override settings for a specific filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all PrusaSlicer settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want. If you have multiple extruders, the gcode is processed in extruder order."
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:641
|
||||||
|
msgid "Time to wait after the filament is unloaded. May help to get reliable toolchanges with flexible materials that may need more time to shrink to original dimensions."
|
||||||
|
msgstr "Time to wait after the filament is unloaded. May help to get reliable tool changes with flexible materials that may need more time to shrink to original dimensions."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:1491
|
||||||
|
msgid "Toolchange parameters with single extruder MM printers"
|
||||||
|
msgstr "Toolchange parameters with single extruder MM printers"
|
||||||
|
|
||||||
|
#: src/slic3r/Utils/Duet.cpp:82 src/slic3r/Utils/Duet.cpp:137
|
||||||
|
#: src/slic3r/Utils/FlashAir.cpp:119 src/slic3r/Utils/FlashAir.cpp:140
|
||||||
|
#: src/slic3r/Utils/FlashAir.cpp:156
|
||||||
|
msgid "Unknown error occured"
|
||||||
|
msgstr "Unknown error occurred"
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:253
|
||||||
|
msgid "When printing multi-material objects, this settings will make Slic3r to clip the overlapping object parts one by the other (2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)."
|
||||||
|
msgstr "When printing multi-material objects, this settings will make Slic3r to clip the overlapping object parts one by the other (2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc.)."
|
||||||
|
|
||||||
|
#: src/libslic3r/PrintConfig.cpp:1391
|
||||||
|
msgid "When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is shorter than unloading."
|
||||||
|
msgstr "When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is shorter than unloading."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:3285
|
||||||
|
msgid "WHITE BULLET icon indicates a non system (or non default) preset."
|
||||||
|
msgstr "WHITE BULLET icon indicates a non-system (or non-default) preset."
|
|
@ -337,6 +337,10 @@ msgstr "Une expression booléenne utilisant les valeurs de configuration d'un pr
|
||||||
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
|
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
|
||||||
msgstr "Une expression booléenne utilisant les valeurs de configuration d'un profil d'imprimante actif. Si cette expression est évaluée comme vraie, ce profil est considéré comme compatible avec le profil d'imprimante actif."
|
msgstr "Une expression booléenne utilisant les valeurs de configuration d'un profil d'imprimante actif. Si cette expression est évaluée comme vraie, ce profil est considéré comme compatible avec le profil d'imprimante actif."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:975
|
||||||
|
msgid "A copy of the current system preset will be created, which will be detached from the system preset."
|
||||||
|
msgstr "Une copie du préréglage système actuel sera créé, et il sera détaché du préréglage système."
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:1034
|
#: src/slic3r/GUI/ConfigWizard.cpp:1034
|
||||||
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
|
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
|
||||||
msgstr "La règle générale est 160 à 230 °C pour le PLA et 215 à 250 °C pour l'ABS."
|
msgstr "La règle générale est 160 à 230 °C pour le PLA et 215 à 250 °C pour l'ABS."
|
||||||
|
@ -1569,15 +1573,6 @@ msgstr "Le préréglage actuel est hérité de"
|
||||||
msgid "Current preset is inherited from the default preset."
|
msgid "Current preset is inherited from the default preset."
|
||||||
msgstr "Le préréglage actuel est hérité du préréglage par défaut."
|
msgstr "Le préréglage actuel est hérité du préréglage par défaut."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:960
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Current preset is inherited from:\n"
|
|
||||||
"\t%s"
|
|
||||||
msgstr ""
|
|
||||||
"Le préréglage actuel est hérité de :\n"
|
|
||||||
"%s"
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/UpdateDialogs.cpp:43
|
#: src/slic3r/GUI/UpdateDialogs.cpp:43
|
||||||
msgid "Current version:"
|
msgid "Current version:"
|
||||||
msgstr "Version actuelle :"
|
msgstr "Version actuelle :"
|
||||||
|
@ -1877,6 +1872,18 @@ msgstr "Désélectionner par rectangle"
|
||||||
msgid "Deselects all objects"
|
msgid "Deselects all objects"
|
||||||
msgstr "Désélectionner tous les objets"
|
msgstr "Désélectionner tous les objets"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:963
|
||||||
|
msgid "Detach from system preset"
|
||||||
|
msgstr "Détacher du préréglage système"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:984
|
||||||
|
msgid "Detach preset"
|
||||||
|
msgstr "Détacher le préréglage"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:3029
|
||||||
|
msgid "Detached"
|
||||||
|
msgstr "Détaché"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:1373
|
#: src/libslic3r/PrintConfig.cpp:1373
|
||||||
msgid "Detect bridging perimeters"
|
msgid "Detect bridging perimeters"
|
||||||
msgstr "Détecter les périmètres faisant des ponts"
|
msgstr "Détecter les périmètres faisant des ponts"
|
||||||
|
@ -2140,6 +2147,23 @@ msgstr "Modifier la coche - Clic droit"
|
||||||
msgid "Editing"
|
msgid "Editing"
|
||||||
msgstr "Édition"
|
msgstr "Édition"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:547
|
||||||
|
msgid "Ejec&t SD card / Flash drive"
|
||||||
|
msgstr "Éjec&ter la carte SD / la clef USB"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
|
||||||
|
msgid "Eject SD card / Flash drive"
|
||||||
|
msgstr "Éjecter la carte SD / la clef USB"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:547
|
||||||
|
msgid "Eject SD card / Flash drive after the G-code was exported to it."
|
||||||
|
msgstr "Éjecter la carte SD / la clef USB une fois que la G-code y a été exporté."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Plater.cpp:2202
|
||||||
|
#, c-format
|
||||||
|
msgid "Ejecting of device %s(%s) has failed."
|
||||||
|
msgstr "L'éjection de l'appareil %s(%s) a échoué."
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:118
|
#: src/libslic3r/PrintConfig.cpp:118
|
||||||
msgid "Elephant foot compensation"
|
msgid "Elephant foot compensation"
|
||||||
msgstr "Compensation de l'effet patte d'éléphant"
|
msgstr "Compensation de l'effet patte d'éléphant"
|
||||||
|
@ -2430,6 +2454,10 @@ msgstr "Exporter le plateau courant en AMF"
|
||||||
msgid "Export current plate as G-code"
|
msgid "Export current plate as G-code"
|
||||||
msgstr "Exporter le plateau courant en G-code"
|
msgstr "Exporter le plateau courant en G-code"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:521
|
||||||
|
msgid "Export current plate as G-code to SD card / Flash drive"
|
||||||
|
msgstr "Exporter le plateau actuel en tant que G-code vers la carte SD / la clef USB"
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:486
|
#: src/slic3r/GUI/MainFrame.cpp:486
|
||||||
msgid "Export current plate as STL"
|
msgid "Export current plate as STL"
|
||||||
msgstr "Exporter le plateau courant en STL"
|
msgstr "Exporter le plateau courant en STL"
|
||||||
|
@ -2451,6 +2479,10 @@ msgstr "Exportez les chemins d'accès complets des modèles et des sources de pi
|
||||||
msgid "Export G-code"
|
msgid "Export G-code"
|
||||||
msgstr "Exporter le G-code"
|
msgstr "Exporter le G-code"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:521
|
||||||
|
msgid "Export G-code to SD card / Flash drive"
|
||||||
|
msgstr "Exporter le G-code vers la carte SD / la clef USB"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:3320
|
#: src/libslic3r/PrintConfig.cpp:3320
|
||||||
msgid "Export OBJ"
|
msgid "Export OBJ"
|
||||||
msgstr "Exporter OBJ"
|
msgstr "Exporter OBJ"
|
||||||
|
@ -2951,15 +2983,6 @@ msgstr "Pour plus d'informations, merci de visiter notre page wiki :"
|
||||||
msgid "For support enforcers only"
|
msgid "For support enforcers only"
|
||||||
msgstr "Seulement pour les générateur de supports"
|
msgstr "Seulement pour les générateur de supports"
|
||||||
|
|
||||||
#. TRN Description for "WHITE BULLET"
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:3265
|
|
||||||
msgid ""
|
|
||||||
"for the left button: \tindicates a non-system (or non-default) preset,\n"
|
|
||||||
"for the right button: \tindicates that the settings hasn't been modified."
|
|
||||||
msgstr ""
|
|
||||||
"pour le bouton gauche : indique un préréglage non-système (ou non par défaut),\n"
|
|
||||||
"pour le bouton droit : indique que le réglage n'a pas été modifié."
|
|
||||||
|
|
||||||
#. TRN Description for "WHITE BULLET"
|
#. TRN Description for "WHITE BULLET"
|
||||||
#: src/slic3r/GUI/Tab.cpp:3267
|
#: src/slic3r/GUI/Tab.cpp:3267
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3381,17 +3404,6 @@ msgstr "HTTPS CA Fichier"
|
||||||
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
|
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
|
||||||
msgstr "Le fichier HTTPS CA est optionnel. Il est uniquement requis si vous utilisez le HTTPS avec un certificat auto-signé."
|
msgstr "Le fichier HTTPS CA est optionnel. Il est uniquement requis si vous utilisez le HTTPS avec un certificat auto-signé."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:1757
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"HTTPS CA File:\n"
|
|
||||||
" \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n"
|
|
||||||
" \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain."
|
|
||||||
msgstr ""
|
|
||||||
"Fichier HTTPS CA :\n"
|
|
||||||
"\tDans ce système, %s utilise des certificats HTTPS issus du système Magasin de Certificats ou Trousseau.\n"
|
|
||||||
"\tPour utiliser un fichier CA personnalisé, veuillez importer votre fichier CA dans le Magasin de Certificats / Trousseau."
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preferences.cpp:222
|
#: src/slic3r/GUI/Preferences.cpp:222
|
||||||
msgid "Icon size in a respect to the default size"
|
msgid "Icon size in a respect to the default size"
|
||||||
msgstr "Taille de l'icône par rapport à la taille par défaut"
|
msgstr "Taille de l'icône par rapport à la taille par défaut"
|
||||||
|
@ -4608,6 +4620,10 @@ msgstr "Réparation du modèle terminée"
|
||||||
msgid "Model repaired successfully"
|
msgid "Model repaired successfully"
|
||||||
msgstr "Réparation du modèle réussie"
|
msgstr "Réparation du modèle réussie"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:979
|
||||||
|
msgid "Modifications to the current profile will be saved."
|
||||||
|
msgstr "Les modifications du profil actuel vont être sauvegardées."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preset.cpp:247
|
#: src/slic3r/GUI/Preset.cpp:247
|
||||||
msgid "modified"
|
msgid "modified"
|
||||||
msgstr "modifié"
|
msgstr "modifié"
|
||||||
|
@ -5406,10 +5422,10 @@ msgstr "Préréglage (%s)"
|
||||||
msgid "Preset with name \"%1%\" already exists."
|
msgid "Preset with name \"%1%\" already exists."
|
||||||
msgstr "Un préréglage avec le nom \"%1%\" existe déjà."
|
msgstr "Un préréglage avec le nom \"%1%\" existe déjà."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:3045
|
#: src/slic3r/GUI/Tab.cpp:3029
|
||||||
msgctxt "PresetName"
|
msgctxt "PresetName"
|
||||||
msgid "%1% - Copy"
|
msgid "Copy"
|
||||||
msgstr "%1% - Copie"
|
msgstr "Copie"
|
||||||
|
|
||||||
#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
|
#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
|
||||||
msgid "Press to activate deselection rectangle"
|
msgid "Press to activate deselection rectangle"
|
||||||
|
@ -6452,16 +6468,6 @@ msgstr "Choisissez le type de socle dont vous avez besoin"
|
||||||
msgid "Select what kind of support do you need"
|
msgid "Select what kind of support do you need"
|
||||||
msgstr "Choisissez le type de support dont vous avez besoin"
|
msgstr "Choisissez le type de support dont vous avez besoin"
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
|
||||||
msgid ""
|
|
||||||
"Select YES if you want to delete all saved tool changes, \n"
|
|
||||||
"\tNO if you want all tool changes switch to color changes, \n"
|
|
||||||
"\tor CANCEL to leave it unchanged."
|
|
||||||
msgstr ""
|
|
||||||
"Sélectionnez OUI si vous souhaitez supprimer tous les changements d'outil enregistrées, \n"
|
|
||||||
"NON si vous souhaitez que tous les changements d'outil soient remplacés par des modifications de couleur, \n"
|
|
||||||
"ou ANNULER pour ne pas les modifier."
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
||||||
msgid ""
|
msgid ""
|
||||||
"Select YES if you want to delete all saved tool changes, \n"
|
"Select YES if you want to delete all saved tool changes, \n"
|
||||||
|
@ -7626,6 +7632,10 @@ msgstr ""
|
||||||
"L'équipement %s n'a pas été trouvé.\n"
|
"L'équipement %s n'a pas été trouvé.\n"
|
||||||
"Si l'équipement est connecté, veuillez appuyer sur le bouton Reset à côté du connecteur USB ..."
|
"Si l'équipement est connecté, veuillez appuyer sur le bouton Reset à côté du connecteur USB ..."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:976
|
||||||
|
msgid "The current custom preset will be detached from the parent system preset."
|
||||||
|
msgstr "Le préréglage personnalisé actuel sera détaché du préréglage système parent."
|
||||||
|
|
||||||
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
|
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
|
||||||
msgid ""
|
msgid ""
|
||||||
"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
|
"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
|
||||||
|
@ -7780,17 +7790,13 @@ msgstr "L'objet sélectionné ne peut être scindé car il contient plus d'un vo
|
||||||
msgid "The selected object couldn't be split because it contains only one part."
|
msgid "The selected object couldn't be split because it contains only one part."
|
||||||
msgstr "L'objet sélectionné n'a pu être scindé car il ne contient qu'une seule pièce."
|
msgstr "L'objet sélectionné n'a pu être scindé car il ne contient qu'une seule pièce."
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:432
|
#: src/slic3r/GUI/MainFrame.cpp:461
|
||||||
msgid ""
|
msgid ""
|
||||||
"The selected project is no longer available.\n"
|
"The selected project is no longer available.\n"
|
||||||
"Do you want to remove it from the recent projects list ?"
|
"Do you want to remove it from the recent projects list?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Le projet sélectionné n'est plus disponible.\n"
|
"Le projet sélectionné n'est plus disponible.\n"
|
||||||
"Voulez-vous le retirer de la liste des projets récents ?"
|
"Voulez-vous le retirer de la liste des projets récents?"
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:422
|
|
||||||
msgid "The selected project is no more available"
|
|
||||||
msgstr "Le projet sélectionné n'est plus disponible"
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:998
|
#: src/slic3r/GUI/DoubleSlider.cpp:998
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -7964,6 +7970,14 @@ msgstr ""
|
||||||
msgid "This %s version: %s"
|
msgid "This %s version: %s"
|
||||||
msgstr "Version de ce %s : %s"
|
msgstr "Version de ce %s : %s"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:982
|
||||||
|
msgid ""
|
||||||
|
"This action is not revertable.\n"
|
||||||
|
"Do you want to proceed?"
|
||||||
|
msgstr ""
|
||||||
|
"Cette action n'est pas réversible.\n"
|
||||||
|
"Voulez-vous continuer ?"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:165
|
#: src/libslic3r/PrintConfig.cpp:165
|
||||||
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
|
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
|
||||||
msgstr "Ce code est inséré entre des objets lorsque vous utilisez l'impression séquentielle. Par défaut la température de l'extrudeur et du plateau est réinitialisée et utilise la commande sans-attente ; toutefois si des commandes M104, M109, M140 ou M190 sont détectées dans ce code personnalisé, Slic3r n'ajoutera pas de commandes de température. Notez que vous pouvez utiliser des variables génériques pour tous les réglages de Slic3r, donc vous pouvez entrer une commande \"M109S[first_layer_temperature]\" où vous le souhaitez."
|
msgstr "Ce code est inséré entre des objets lorsque vous utilisez l'impression séquentielle. Par défaut la température de l'extrudeur et du plateau est réinitialisée et utilise la commande sans-attente ; toutefois si des commandes M104, M109, M140 ou M190 sont détectées dans ce code personnalisé, Slic3r n'ajoutera pas de commandes de température. Notez que vous pouvez utiliser des variables génériques pour tous les réglages de Slic3r, donc vous pouvez entrer une commande \"M109S[first_layer_temperature]\" où vous le souhaitez."
|
||||||
|
@ -8131,10 +8145,6 @@ msgstr "Ceci est la hauteur de couche imprimable maximum pour cet extrudeur, uti
|
||||||
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
|
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
|
||||||
msgstr "Cette valeur est la hauteur de couche imprimable minimum pour cet extrudeur et elle limite la résolution pour la hauteur de couche variable. Les valeurs type se situent entre 0.05 mm et 0.1 mm."
|
msgstr "Cette valeur est la hauteur de couche imprimable minimum pour cet extrudeur et elle limite la résolution pour la hauteur de couche variable. Les valeurs type se situent entre 0.05 mm et 0.1 mm."
|
||||||
|
|
||||||
#: src/libslic3r/GCode.cpp:639
|
|
||||||
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
|
||||||
msgstr "Ceci est généralement provoqué par de petites extrusions négligeables ou par un modèle défectueux. Essayez de réparer le modèle ou de changer son orientation sur le lit."
|
|
||||||
|
|
||||||
#: src/libslic3r/GCode.cpp:639
|
#: src/libslic3r/GCode.cpp:639
|
||||||
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
||||||
msgstr "Ceci est généralement provoqué par de petites extrusions négligeables ou par un modèle défectueux. Essayez de réparer le modèle ou de changer son orientation sur le lit."
|
msgstr "Ceci est généralement provoqué par de petites extrusions négligeables ou par un modèle défectueux. Essayez de réparer le modèle ou de changer son orientation sur le lit."
|
||||||
|
|
|
@ -337,6 +337,10 @@ msgstr "Un'espressione booleana che usa i valori di configurazione di un profilo
|
||||||
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
|
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
|
||||||
msgstr "Un'espressione booleana che usa i valori di configurazione di un profilo stampante attivo. Se questa espressione produce un risultato vero, questo profilo si considera compatibile con il profilo stampante attivo."
|
msgstr "Un'espressione booleana che usa i valori di configurazione di un profilo stampante attivo. Se questa espressione produce un risultato vero, questo profilo si considera compatibile con il profilo stampante attivo."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:975
|
||||||
|
msgid "A copy of the current system preset will be created, which will be detached from the system preset."
|
||||||
|
msgstr "Verrà creata una copia del preset di sistema corrente, e verrà distaccata dal preset di sistema."
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:1034
|
#: src/slic3r/GUI/ConfigWizard.cpp:1034
|
||||||
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
|
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
|
||||||
msgstr "Una regola generale è da 160 a 230°C per il PLA, e da 215 a 250°C per l'ABS."
|
msgstr "Una regola generale è da 160 a 230°C per il PLA, e da 215 a 250°C per l'ABS."
|
||||||
|
@ -1569,15 +1573,6 @@ msgstr "Il preset corrente è ereditato da"
|
||||||
msgid "Current preset is inherited from the default preset."
|
msgid "Current preset is inherited from the default preset."
|
||||||
msgstr "Il preset attuale è stato ereditato dal preset predefinito."
|
msgstr "Il preset attuale è stato ereditato dal preset predefinito."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:960
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Current preset is inherited from:\n"
|
|
||||||
"\t%s"
|
|
||||||
msgstr ""
|
|
||||||
"Il preset corrente è ereditato da:\n"
|
|
||||||
"%s"
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/UpdateDialogs.cpp:43
|
#: src/slic3r/GUI/UpdateDialogs.cpp:43
|
||||||
msgid "Current version:"
|
msgid "Current version:"
|
||||||
msgstr "Versione corrente:"
|
msgstr "Versione corrente:"
|
||||||
|
@ -1877,6 +1872,18 @@ msgstr "Deseleziona con rettangolo"
|
||||||
msgid "Deselects all objects"
|
msgid "Deselects all objects"
|
||||||
msgstr "Deseleziona tutti gli oggetti"
|
msgstr "Deseleziona tutti gli oggetti"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:963
|
||||||
|
msgid "Detach from system preset"
|
||||||
|
msgstr "Distacco dal preset di sistema"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:984
|
||||||
|
msgid "Detach preset"
|
||||||
|
msgstr "Preset distacco"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:3029
|
||||||
|
msgid "Detached"
|
||||||
|
msgstr "Distaccato"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:1373
|
#: src/libslic3r/PrintConfig.cpp:1373
|
||||||
msgid "Detect bridging perimeters"
|
msgid "Detect bridging perimeters"
|
||||||
msgstr "Rileva perimetri ponte (bridge)"
|
msgstr "Rileva perimetri ponte (bridge)"
|
||||||
|
@ -2140,6 +2147,23 @@ msgstr "Modifica segno di spunta - Clic destro"
|
||||||
msgid "Editing"
|
msgid "Editing"
|
||||||
msgstr "Editing"
|
msgstr "Editing"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:547
|
||||||
|
msgid "Ejec&t SD card / Flash drive"
|
||||||
|
msgstr "(&t) Espelli Scheda SD / Memoria flash"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
|
||||||
|
msgid "Eject SD card / Flash drive"
|
||||||
|
msgstr "Espelli scheda SD / Memoria flash"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:547
|
||||||
|
msgid "Eject SD card / Flash drive after the G-code was exported to it."
|
||||||
|
msgstr "Espelli scheda SD / Memoria flash dopo l'esportazione del G-code in essa."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Plater.cpp:2202
|
||||||
|
#, c-format
|
||||||
|
msgid "Ejecting of device %s(%s) has failed."
|
||||||
|
msgstr "Espulsione del dispositivo %s(%s) non riuscita."
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:118
|
#: src/libslic3r/PrintConfig.cpp:118
|
||||||
msgid "Elephant foot compensation"
|
msgid "Elephant foot compensation"
|
||||||
msgstr "Compensazione zampa d'elefante"
|
msgstr "Compensazione zampa d'elefante"
|
||||||
|
@ -2430,6 +2454,10 @@ msgstr "Esporta il piano corrente come AMF"
|
||||||
msgid "Export current plate as G-code"
|
msgid "Export current plate as G-code"
|
||||||
msgstr "Esporta il piano corrente come G-code"
|
msgstr "Esporta il piano corrente come G-code"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:521
|
||||||
|
msgid "Export current plate as G-code to SD card / Flash drive"
|
||||||
|
msgstr "Esporta il piano corrente come G-code su scheda SD / Memoria flash"
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:486
|
#: src/slic3r/GUI/MainFrame.cpp:486
|
||||||
msgid "Export current plate as STL"
|
msgid "Export current plate as STL"
|
||||||
msgstr "Esporta il piano corrente come STL"
|
msgstr "Esporta il piano corrente come STL"
|
||||||
|
@ -2451,6 +2479,10 @@ msgstr "Esporta il percorso completo dei modelli e fonti delle parti nei file 3m
|
||||||
msgid "Export G-code"
|
msgid "Export G-code"
|
||||||
msgstr "Esporta G-code"
|
msgstr "Esporta G-code"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:521
|
||||||
|
msgid "Export G-code to SD card / Flash drive"
|
||||||
|
msgstr "Esporta G-code su Scheda SD / Memoria flash"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:3320
|
#: src/libslic3r/PrintConfig.cpp:3320
|
||||||
msgid "Export OBJ"
|
msgid "Export OBJ"
|
||||||
msgstr "Esporta OBJ"
|
msgstr "Esporta OBJ"
|
||||||
|
@ -2951,15 +2983,6 @@ msgstr "Per maggiori informazioni visita la nostra pagina wiki:"
|
||||||
msgid "For support enforcers only"
|
msgid "For support enforcers only"
|
||||||
msgstr "Solo per rinforzi supporto"
|
msgstr "Solo per rinforzi supporto"
|
||||||
|
|
||||||
#. TRN Description for "WHITE BULLET"
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:3265
|
|
||||||
msgid ""
|
|
||||||
"for the left button: \tindicates a non-system (or non-default) preset,\n"
|
|
||||||
"for the right button: \tindicates that the settings hasn't been modified."
|
|
||||||
msgstr ""
|
|
||||||
"per il tasto sinistro: indica un preset non di sistema (o non-predefinito),\n"
|
|
||||||
"per il tasto destro: indica che le impostazioni non sono state modificate."
|
|
||||||
|
|
||||||
#. TRN Description for "WHITE BULLET"
|
#. TRN Description for "WHITE BULLET"
|
||||||
#: src/slic3r/GUI/Tab.cpp:3267
|
#: src/slic3r/GUI/Tab.cpp:3267
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3375,17 +3398,6 @@ msgstr "File HTTPS CA"
|
||||||
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
|
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
|
||||||
msgstr "File HTTPS CA opzionale. È necessario solo se si intende usare un HTTPS con certificato autofirmato."
|
msgstr "File HTTPS CA opzionale. È necessario solo se si intende usare un HTTPS con certificato autofirmato."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:1757
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"HTTPS CA File:\n"
|
|
||||||
" \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n"
|
|
||||||
" \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain."
|
|
||||||
msgstr ""
|
|
||||||
"File HTTPS CA:\n"
|
|
||||||
"Su questo sistema, %s utilizza certificati HTTPS provenienti dal sistema Certificate Store o da Keychain.\n"
|
|
||||||
"Per utilizzare un file CA personalizzato, importa il tuo file CA sul Certificate Store / Keychain."
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preferences.cpp:222
|
#: src/slic3r/GUI/Preferences.cpp:222
|
||||||
msgid "Icon size in a respect to the default size"
|
msgid "Icon size in a respect to the default size"
|
||||||
msgstr "Dimensioni icona rispetto alla dimensione predefinita"
|
msgstr "Dimensioni icona rispetto alla dimensione predefinita"
|
||||||
|
@ -4170,7 +4182,7 @@ msgstr "Distanza massima bridging"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:2269
|
#: src/libslic3r/PrintConfig.cpp:2269
|
||||||
msgid "Maximal distance between supports on sparse infill sections."
|
msgid "Maximal distance between supports on sparse infill sections."
|
||||||
msgstr "Distanza massima tra supporti in sezioni a scarso riempimento."
|
msgstr "Distanza massima tra supporti in sezioni a riempimento sparso."
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:1145
|
#: src/libslic3r/PrintConfig.cpp:1145
|
||||||
msgid "Maximum acceleration E"
|
msgid "Maximum acceleration E"
|
||||||
|
@ -4602,6 +4614,10 @@ msgstr "Riparazione modello terminata"
|
||||||
msgid "Model repaired successfully"
|
msgid "Model repaired successfully"
|
||||||
msgstr "Modello riparato con successo"
|
msgstr "Modello riparato con successo"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:979
|
||||||
|
msgid "Modifications to the current profile will be saved."
|
||||||
|
msgstr "Verranno salvate le modifiche al profilo attuale."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preset.cpp:247
|
#: src/slic3r/GUI/Preset.cpp:247
|
||||||
msgid "modified"
|
msgid "modified"
|
||||||
msgstr "modificato"
|
msgstr "modificato"
|
||||||
|
@ -4792,7 +4808,7 @@ msgstr "NESSUN RAMMING"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:1857
|
#: src/libslic3r/PrintConfig.cpp:1857
|
||||||
msgid "No sparse layers (EXPERIMENTAL)"
|
msgid "No sparse layers (EXPERIMENTAL)"
|
||||||
msgstr "Nessun layer rado (SPERIMENTALE)"
|
msgstr "Nessun layer sparso (SPERIMENTALE)"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:2774
|
#: src/libslic3r/PrintConfig.cpp:2774
|
||||||
msgid "No support points will be placed closer than this threshold."
|
msgid "No support points will be placed closer than this threshold."
|
||||||
|
@ -5399,10 +5415,10 @@ msgstr "Preset (%s)"
|
||||||
msgid "Preset with name \"%1%\" already exists."
|
msgid "Preset with name \"%1%\" already exists."
|
||||||
msgstr "Preset con il nome \"%1%\" già esistente."
|
msgstr "Preset con il nome \"%1%\" già esistente."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:3045
|
#: src/slic3r/GUI/Tab.cpp:3029
|
||||||
msgctxt "PresetName"
|
msgctxt "PresetName"
|
||||||
msgid "%1% - Copy"
|
msgid "Copy"
|
||||||
msgstr "%1% - Copia"
|
msgstr "Copia"
|
||||||
|
|
||||||
#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
|
#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
|
||||||
msgid "Press to activate deselection rectangle"
|
msgid "Press to activate deselection rectangle"
|
||||||
|
@ -6441,16 +6457,6 @@ msgstr "Seleziona il tipo di Pad richiesto"
|
||||||
msgid "Select what kind of support do you need"
|
msgid "Select what kind of support do you need"
|
||||||
msgstr "Seleziona il tipo di supporto richiesto"
|
msgstr "Seleziona il tipo di supporto richiesto"
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
|
||||||
msgid ""
|
|
||||||
"Select YES if you want to delete all saved tool changes, \n"
|
|
||||||
"\tNO if you want all tool changes switch to color changes, \n"
|
|
||||||
"\tor CANCEL to leave it unchanged."
|
|
||||||
msgstr ""
|
|
||||||
"Seleziona SI se vuoi cancellare tutti i cambi attrezzo salvati,\n"
|
|
||||||
"NO se vuoi che tutti i cambi attrezzo passino a cambi colore,\n"
|
|
||||||
"o ANNULLA per lasciarlo invariato."
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
||||||
msgid ""
|
msgid ""
|
||||||
"Select YES if you want to delete all saved tool changes, \n"
|
"Select YES if you want to delete all saved tool changes, \n"
|
||||||
|
@ -7616,6 +7622,10 @@ msgstr ""
|
||||||
"Il dispositivo %s non è stato trovato.\n"
|
"Il dispositivo %s non è stato trovato.\n"
|
||||||
"Se il dispositivo è connesso, premi il pulsante Reset vicino al connettore USB ..."
|
"Se il dispositivo è connesso, premi il pulsante Reset vicino al connettore USB ..."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:976
|
||||||
|
msgid "The current custom preset will be detached from the parent system preset."
|
||||||
|
msgstr "Il preset personalizzato corrente sarà staccato dal preset del sistema padre."
|
||||||
|
|
||||||
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
|
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
|
||||||
msgid ""
|
msgid ""
|
||||||
"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
|
"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
|
||||||
|
@ -7772,18 +7782,14 @@ msgstr "L'oggetto selezionato non può essere diviso perché contiene più di un
|
||||||
msgid "The selected object couldn't be split because it contains only one part."
|
msgid "The selected object couldn't be split because it contains only one part."
|
||||||
msgstr "L'oggetto selezionato non può essere diviso perché contiene solo una parte."
|
msgstr "L'oggetto selezionato non può essere diviso perché contiene solo una parte."
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:432
|
#: src/slic3r/GUI/MainFrame.cpp:461
|
||||||
msgid ""
|
msgid ""
|
||||||
"The selected project is no longer available.\n"
|
"The selected project is no longer available.\n"
|
||||||
"Do you want to remove it from the recent projects list ?"
|
"Do you want to remove it from the recent projects list?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Il progetto selezionato non è più disponibile.\n"
|
"Il progetto selezionato non è più disponibile.\n"
|
||||||
"Vuoi rimuoverlo dall'elenco dei progetti recenti?"
|
"Vuoi rimuoverlo dall'elenco dei progetti recenti?"
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:422
|
|
||||||
msgid "The selected project is no more available"
|
|
||||||
msgstr "Il progetto selezionato non è più disponibile"
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:998
|
#: src/slic3r/GUI/DoubleSlider.cpp:998
|
||||||
msgid ""
|
msgid ""
|
||||||
"The sequential print is on.\n"
|
"The sequential print is on.\n"
|
||||||
|
@ -7953,6 +7959,14 @@ msgstr ""
|
||||||
msgid "This %s version: %s"
|
msgid "This %s version: %s"
|
||||||
msgstr "%s versione: %s"
|
msgstr "%s versione: %s"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:982
|
||||||
|
msgid ""
|
||||||
|
"This action is not revertable.\n"
|
||||||
|
"Do you want to proceed?"
|
||||||
|
msgstr ""
|
||||||
|
"Questa azione non è reversibile.\n"
|
||||||
|
"Vuoi continuare?"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:165
|
#: src/libslic3r/PrintConfig.cpp:165
|
||||||
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
|
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
|
||||||
msgstr "Questo codice è inserito tra gli oggetti quando si utilizza una stampa sequenziale. Come predefinito, la temperatura di estrusione e del piano sono resettate con il comando non-attesa; in ogni caso se nel codice personalizzato vengono rilevati i comandi M104,M109,M140 o M190, Slic3r non aggiungerà i comandi di temperatura. Si fa presente che puoi usare variabili sostitutive per tutte le impostazioni di Slic3r, quindi puoi inserire un comando \"M109 S[first_layer_temperature]\" quando preferisci."
|
msgstr "Questo codice è inserito tra gli oggetti quando si utilizza una stampa sequenziale. Come predefinito, la temperatura di estrusione e del piano sono resettate con il comando non-attesa; in ogni caso se nel codice personalizzato vengono rilevati i comandi M104,M109,M140 o M190, Slic3r non aggiungerà i comandi di temperatura. Si fa presente che puoi usare variabili sostitutive per tutte le impostazioni di Slic3r, quindi puoi inserire un comando \"M109 S[first_layer_temperature]\" quando preferisci."
|
||||||
|
@ -8120,10 +8134,6 @@ msgstr "Questa è la massima altezza layer stampabile per questo estrusore, usat
|
||||||
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
|
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
|
||||||
msgstr "Questa è l'altezza minima stampabile per questo estrusore e limita la risoluzione per l'altezza variabile dei layer. Valori tipici sono compresi tra 0.05 mm e 0.1 mm."
|
msgstr "Questa è l'altezza minima stampabile per questo estrusore e limita la risoluzione per l'altezza variabile dei layer. Valori tipici sono compresi tra 0.05 mm e 0.1 mm."
|
||||||
|
|
||||||
#: src/libslic3r/GCode.cpp:639
|
|
||||||
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
|
||||||
msgstr "Questo solitamente è causato da estrusioni molto piccole o da un modello difettoso. Provare a riparare il modello o cambiare il suo orientamento sul piano."
|
|
||||||
|
|
||||||
#: src/libslic3r/GCode.cpp:639
|
#: src/libslic3r/GCode.cpp:639
|
||||||
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
||||||
msgstr "Questo solitamente è causato da estrusioni molto piccole o da un modello difettoso. Provare a riparare il modello o cambiare il suo orientamento sul piano."
|
msgstr "Questo solitamente è causato da estrusioni molto piccole o da un modello difettoso. Provare a riparare il modello o cambiare il suo orientamento sul piano."
|
||||||
|
|
|
@ -331,6 +331,10 @@ msgstr "アクティブなプリントプロファイルの構成値を使用す
|
||||||
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
|
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
|
||||||
msgstr "アクティブなプリンタープロファイルの構成値を使った論理式です。 この論理式が真の場合、このプロファイルはアクティブなプリンタープロファイルと互換性があると見なされます。"
|
msgstr "アクティブなプリンタープロファイルの構成値を使った論理式です。 この論理式が真の場合、このプロファイルはアクティブなプリンタープロファイルと互換性があると見なされます。"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:975
|
||||||
|
msgid "A copy of the current system preset will be created, which will be detached from the system preset."
|
||||||
|
msgstr "現在のシステムプリセットからコピーを作成し、システムプリセットから切り離します。"
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:1034
|
#: src/slic3r/GUI/ConfigWizard.cpp:1034
|
||||||
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
|
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
|
||||||
msgstr "一般的には、PLAは160〜230℃、ABSは215〜250℃です。"
|
msgstr "一般的には、PLAは160〜230℃、ABSは215〜250℃です。"
|
||||||
|
@ -1561,13 +1565,6 @@ msgstr "現在のプリセット継承元"
|
||||||
msgid "Current preset is inherited from the default preset."
|
msgid "Current preset is inherited from the default preset."
|
||||||
msgstr "現在の設定はデフォルト設定から継承されます。"
|
msgstr "現在の設定はデフォルト設定から継承されます。"
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:960
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Current preset is inherited from:\n"
|
|
||||||
"\t%s"
|
|
||||||
msgstr "現在のプリセット継承元:%s"
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/UpdateDialogs.cpp:43
|
#: src/slic3r/GUI/UpdateDialogs.cpp:43
|
||||||
msgid "Current version:"
|
msgid "Current version:"
|
||||||
msgstr "現在のバージョン:"
|
msgstr "現在のバージョン:"
|
||||||
|
@ -1867,6 +1864,18 @@ msgstr "方形で選択解除"
|
||||||
msgid "Deselects all objects"
|
msgid "Deselects all objects"
|
||||||
msgstr "全てのオブジェクトの選択解除"
|
msgstr "全てのオブジェクトの選択解除"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:963
|
||||||
|
msgid "Detach from system preset"
|
||||||
|
msgstr "システムプリセットから取り外す"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:984
|
||||||
|
msgid "Detach preset"
|
||||||
|
msgstr "プリセットを切り離す"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:3029
|
||||||
|
msgid "Detached"
|
||||||
|
msgstr "取り外しました"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:1373
|
#: src/libslic3r/PrintConfig.cpp:1373
|
||||||
msgid "Detect bridging perimeters"
|
msgid "Detect bridging perimeters"
|
||||||
msgstr "ブリッジ外周の検出"
|
msgstr "ブリッジ外周の検出"
|
||||||
|
@ -2127,6 +2136,23 @@ msgstr "マーカーの編集-マウスの右ボタン"
|
||||||
msgid "Editing"
|
msgid "Editing"
|
||||||
msgstr "編集中"
|
msgstr "編集中"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:547
|
||||||
|
msgid "Ejec&t SD card / Flash drive"
|
||||||
|
msgstr "SDカード/USBメモリーを取り出す(&t)"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
|
||||||
|
msgid "Eject SD card / Flash drive"
|
||||||
|
msgstr "SDカード/USBメモリーを取り出す"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:547
|
||||||
|
msgid "Eject SD card / Flash drive after the G-code was exported to it."
|
||||||
|
msgstr "Gコードをエクスポートした後に、SDカード/USBメモリーを取り出します。"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Plater.cpp:2202
|
||||||
|
#, c-format
|
||||||
|
msgid "Ejecting of device %s(%s) has failed."
|
||||||
|
msgstr "デバイス %s(%s) の取り出しに失敗しました。"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:118
|
#: src/libslic3r/PrintConfig.cpp:118
|
||||||
msgid "Elephant foot compensation"
|
msgid "Elephant foot compensation"
|
||||||
msgstr "最初の層の広がり補正"
|
msgstr "最初の層の広がり補正"
|
||||||
|
@ -2417,6 +2443,10 @@ msgstr "現在のプレートをAMFとしてエクスポート"
|
||||||
msgid "Export current plate as G-code"
|
msgid "Export current plate as G-code"
|
||||||
msgstr "現在のプレートをGコードとしてエクスポート"
|
msgstr "現在のプレートをGコードとしてエクスポート"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:521
|
||||||
|
msgid "Export current plate as G-code to SD card / Flash drive"
|
||||||
|
msgstr "現在のプレートをGコードとしてSDカード/USBメモリーにエクスポート"
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:486
|
#: src/slic3r/GUI/MainFrame.cpp:486
|
||||||
msgid "Export current plate as STL"
|
msgid "Export current plate as STL"
|
||||||
msgstr "現在のプレートをSTLとしてエクスポート"
|
msgstr "現在のプレートをSTLとしてエクスポート"
|
||||||
|
@ -2438,6 +2468,10 @@ msgstr "モデルのフルパス名とパーツソースを3mfおよびamfファ
|
||||||
msgid "Export G-code"
|
msgid "Export G-code"
|
||||||
msgstr "Gコードのエクスポート"
|
msgstr "Gコードのエクスポート"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:521
|
||||||
|
msgid "Export G-code to SD card / Flash drive"
|
||||||
|
msgstr "GコードをSDカード/USBメモリーにエクスポート"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:3320
|
#: src/libslic3r/PrintConfig.cpp:3320
|
||||||
msgid "Export OBJ"
|
msgid "Export OBJ"
|
||||||
msgstr "OBJのエクスポート"
|
msgstr "OBJのエクスポート"
|
||||||
|
@ -2938,13 +2972,6 @@ msgstr "詳細については、Wikiページをご覧ください:"
|
||||||
msgid "For support enforcers only"
|
msgid "For support enforcers only"
|
||||||
msgstr "強制サポートのみ"
|
msgstr "強制サポートのみ"
|
||||||
|
|
||||||
#. TRN Description for "WHITE BULLET"
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:3265
|
|
||||||
msgid ""
|
|
||||||
"for the left button: \tindicates a non-system (or non-default) preset,\n"
|
|
||||||
"for the right button: \tindicates that the settings hasn't been modified."
|
|
||||||
msgstr "左ボタンの場合:システム(デフォルト)プリセットでないことを示し、右側ボタンの場合:設定が変更されていないことを示します。"
|
|
||||||
|
|
||||||
#. TRN Description for "WHITE BULLET"
|
#. TRN Description for "WHITE BULLET"
|
||||||
#: src/slic3r/GUI/Tab.cpp:3267
|
#: src/slic3r/GUI/Tab.cpp:3267
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3362,17 +3389,6 @@ msgstr "HTTPS CAファイル"
|
||||||
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
|
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
|
||||||
msgstr "HTTPS CAファイルはオプションです。 HTTPSを自己署名証明書で使用する場合にのみ必要です。"
|
msgstr "HTTPS CAファイルはオプションです。 HTTPSを自己署名証明書で使用する場合にのみ必要です。"
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:1757
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"HTTPS CA File:\n"
|
|
||||||
" \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n"
|
|
||||||
" \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain."
|
|
||||||
msgstr ""
|
|
||||||
"HTTPS CAファイル:\n"
|
|
||||||
" このシステムでは、%sはシステムの証明書ストアまたはキーチェーンからのHTTPS証明書を使用します。\n"
|
|
||||||
" カスタムCAファイルを使用するには、CAファイルを証明書ストア/キーチェーンにインポートしてください。"
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preferences.cpp:222
|
#: src/slic3r/GUI/Preferences.cpp:222
|
||||||
msgid "Icon size in a respect to the default size"
|
msgid "Icon size in a respect to the default size"
|
||||||
msgstr "デフォルトのサイズと相対的なアイコンのサイズ"
|
msgstr "デフォルトのサイズと相対的なアイコンのサイズ"
|
||||||
|
@ -4572,6 +4588,10 @@ msgstr "モデル修正完了"
|
||||||
msgid "Model repaired successfully"
|
msgid "Model repaired successfully"
|
||||||
msgstr "モデルの修復完了"
|
msgstr "モデルの修復完了"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:979
|
||||||
|
msgid "Modifications to the current profile will be saved."
|
||||||
|
msgstr "現在のプロファイルの編集が保存されます。"
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preset.cpp:247
|
#: src/slic3r/GUI/Preset.cpp:247
|
||||||
msgid "modified"
|
msgid "modified"
|
||||||
msgstr "変更あり"
|
msgstr "変更あり"
|
||||||
|
@ -5370,10 +5390,10 @@ msgstr "プリセット(%s)"
|
||||||
msgid "Preset with name \"%1%\" already exists."
|
msgid "Preset with name \"%1%\" already exists."
|
||||||
msgstr "\"%1%\"というプリセット名は既に存在します。"
|
msgstr "\"%1%\"というプリセット名は既に存在します。"
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:3045
|
#: src/slic3r/GUI/Tab.cpp:3029
|
||||||
msgctxt "PresetName"
|
msgctxt "PresetName"
|
||||||
msgid "%1% - Copy"
|
msgid "Copy"
|
||||||
msgstr "%1% - コピー"
|
msgstr "コピー"
|
||||||
|
|
||||||
#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
|
#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
|
||||||
msgid "Press to activate deselection rectangle"
|
msgid "Press to activate deselection rectangle"
|
||||||
|
@ -6409,16 +6429,6 @@ msgstr "必要なパッドの種類を選択してください"
|
||||||
msgid "Select what kind of support do you need"
|
msgid "Select what kind of support do you need"
|
||||||
msgstr "必要なサポートの種類を選択してください"
|
msgstr "必要なサポートの種類を選択してください"
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
|
||||||
msgid ""
|
|
||||||
"Select YES if you want to delete all saved tool changes, \n"
|
|
||||||
"\tNO if you want all tool changes switch to color changes, \n"
|
|
||||||
"\tor CANCEL to leave it unchanged."
|
|
||||||
msgstr ""
|
|
||||||
"保存したツールの変更をすべて削除する場合は、「はい」を選択します。\n"
|
|
||||||
"すべてのツールの変更を色の変更に切り替えたい場合は「いいえ」、\n"
|
|
||||||
"または「キャンセル」で変更せずにそのままにします"
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
||||||
msgid ""
|
msgid ""
|
||||||
"Select YES if you want to delete all saved tool changes, \n"
|
"Select YES if you want to delete all saved tool changes, \n"
|
||||||
|
@ -7579,6 +7589,10 @@ msgstr ""
|
||||||
"%sデバイスが見つかりませんでした。\n"
|
"%sデバイスが見つかりませんでした。\n"
|
||||||
"デバイスが接続されている場合は、USBコネクタの横にあるリセットボタンを押してください..."
|
"デバイスが接続されている場合は、USBコネクタの横にあるリセットボタンを押してください..."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:976
|
||||||
|
msgid "The current custom preset will be detached from the parent system preset."
|
||||||
|
msgstr "現在のカスタムプリセットは、親システムプリセットから切り離されます。"
|
||||||
|
|
||||||
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
|
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
|
||||||
msgid ""
|
msgid ""
|
||||||
"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
|
"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
|
||||||
|
@ -7734,18 +7748,14 @@ msgstr "選択したオブジェクトには複数のボリューム/マテリ
|
||||||
msgid "The selected object couldn't be split because it contains only one part."
|
msgid "The selected object couldn't be split because it contains only one part."
|
||||||
msgstr "選択したオブジェクトには、1つのパーツしか含まれていないため、分割できませんでした。"
|
msgstr "選択したオブジェクトには、1つのパーツしか含まれていないため、分割できませんでした。"
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:432
|
#: src/slic3r/GUI/MainFrame.cpp:461
|
||||||
msgid ""
|
msgid ""
|
||||||
"The selected project is no longer available.\n"
|
"The selected project is no longer available.\n"
|
||||||
"Do you want to remove it from the recent projects list ?"
|
"Do you want to remove it from the recent projects list?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"選択したプロジェクトは使用できなくなりました。\n"
|
"選択したプロジェクトは使用できなくなりました。\n"
|
||||||
"最近のプロジェクトリストから削除しますか?"
|
"最近のプロジェクトリストから削除しますか?"
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:422
|
|
||||||
msgid "The selected project is no more available"
|
|
||||||
msgstr "選択したプロジェクトはもう利用できません"
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:998
|
#: src/slic3r/GUI/DoubleSlider.cpp:998
|
||||||
msgid ""
|
msgid ""
|
||||||
"The sequential print is on.\n"
|
"The sequential print is on.\n"
|
||||||
|
@ -7914,6 +7924,14 @@ msgstr ""
|
||||||
msgid "This %s version: %s"
|
msgid "This %s version: %s"
|
||||||
msgstr "この%sのバージョン: %s"
|
msgstr "この%sのバージョン: %s"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:982
|
||||||
|
msgid ""
|
||||||
|
"This action is not revertable.\n"
|
||||||
|
"Do you want to proceed?"
|
||||||
|
msgstr ""
|
||||||
|
"この操作は元に戻せません。\n"
|
||||||
|
"続行しますか?"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:165
|
#: src/libslic3r/PrintConfig.cpp:165
|
||||||
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
|
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
|
||||||
msgstr "このコードは、オブジェクト別の順次プリンティングを使用するとき、オブジェクト間に挿入されます。 デフォルトでは、エクストルーダーとベッドの温度は非待機コマンドを使用します(M104/M140)。 ただし、このカスタムコードでM104、M109、M140またはM190が記述された場合、Slic3rは温度コマンドを追加しません。 すべてのSlic3r代替変数を使用できるため、「M109 S [first_layer_temperature]」コマンドを必要な場所に記述できます。"
|
msgstr "このコードは、オブジェクト別の順次プリンティングを使用するとき、オブジェクト間に挿入されます。 デフォルトでは、エクストルーダーとベッドの温度は非待機コマンドを使用します(M104/M140)。 ただし、このカスタムコードでM104、M109、M140またはM190が記述された場合、Slic3rは温度コマンドを追加しません。 すべてのSlic3r代替変数を使用できるため、「M109 S [first_layer_temperature]」コマンドを必要な場所に記述できます。"
|
||||||
|
@ -8082,10 +8100,6 @@ msgstr "これは、このエクストルーダーの最大プリント可能レ
|
||||||
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
|
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
|
||||||
msgstr "このエクストルーダーの最小プリント可能なレイヤー高さ。 可変レイヤー高の解像度を制限します。一般的な値は0.05mmと0.1mmの間です。"
|
msgstr "このエクストルーダーの最小プリント可能なレイヤー高さ。 可変レイヤー高の解像度を制限します。一般的な値は0.05mmと0.1mmの間です。"
|
||||||
|
|
||||||
#: src/libslic3r/GCode.cpp:639
|
|
||||||
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
|
||||||
msgstr "これは通常、無視できるほど少量の押出量またはモデルの欠陥が原因です。 ベッド上のモデルの修復または向きを再配置してみてください。"
|
|
||||||
|
|
||||||
#: src/libslic3r/GCode.cpp:639
|
#: src/libslic3r/GCode.cpp:639
|
||||||
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
||||||
msgstr "これは通常、無視できるほど少量の押出量またはモデルの欠陥が原因です。 ベッド上のモデルの修復または向きを再配置してみてください。"
|
msgstr "これは通常、無視できるほど少量の押出量またはモデルの欠陥が原因です。 ベッド上のモデルの修復または向きを再配置してみてください。"
|
||||||
|
|
|
@ -337,6 +337,10 @@ msgstr "Wyrażenie logiczne (Boole'owskie) używające wartości konfiguracji ak
|
||||||
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
|
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
|
||||||
msgstr "Wyrażenie logiczne (Boole'owskie) używające wartości konfiguracji aktywnego profilu drukarki. Jeśli to wyrażenie jest prawdziwe to znaczy, że aktywny profil jest kompatybilny z drukarką."
|
msgstr "Wyrażenie logiczne (Boole'owskie) używające wartości konfiguracji aktywnego profilu drukarki. Jeśli to wyrażenie jest prawdziwe to znaczy, że aktywny profil jest kompatybilny z drukarką."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:975
|
||||||
|
msgid "A copy of the current system preset will be created, which will be detached from the system preset."
|
||||||
|
msgstr "Zostanie utworzona kopia obecnego zestawu ustawień i odłączona od ustawień systemowych."
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigWizard.cpp:1034
|
#: src/slic3r/GUI/ConfigWizard.cpp:1034
|
||||||
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
|
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
|
||||||
msgstr "Generalną zasadą jest 160 do 230 °C dla PLA i 215 do 250 °C dla ABS."
|
msgstr "Generalną zasadą jest 160 do 230 °C dla PLA i 215 do 250 °C dla ABS."
|
||||||
|
@ -1569,15 +1573,6 @@ msgstr "Obecny zestaw ustawień jest dziedziczony z"
|
||||||
msgid "Current preset is inherited from the default preset."
|
msgid "Current preset is inherited from the default preset."
|
||||||
msgstr "Obecny zestaw ustawień jest dziedziczony z zestawu domyślnego."
|
msgstr "Obecny zestaw ustawień jest dziedziczony z zestawu domyślnego."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:960
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Current preset is inherited from:\n"
|
|
||||||
"\t%s"
|
|
||||||
msgstr ""
|
|
||||||
"Obecny zestaw ustawień jest dziedziczony z:\n"
|
|
||||||
"%s"
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/UpdateDialogs.cpp:43
|
#: src/slic3r/GUI/UpdateDialogs.cpp:43
|
||||||
msgid "Current version:"
|
msgid "Current version:"
|
||||||
msgstr "Obecna wersja:"
|
msgstr "Obecna wersja:"
|
||||||
|
@ -1877,6 +1872,18 @@ msgstr "Odznaczenie prostokątem"
|
||||||
msgid "Deselects all objects"
|
msgid "Deselects all objects"
|
||||||
msgstr "Odznacza wszystkie modele"
|
msgstr "Odznacza wszystkie modele"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:963
|
||||||
|
msgid "Detach from system preset"
|
||||||
|
msgstr "Odłącz od ustawień systemowych"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:984
|
||||||
|
msgid "Detach preset"
|
||||||
|
msgstr "Odłącz zestaw ustawień"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:3029
|
||||||
|
msgid "Detached"
|
||||||
|
msgstr "Odłączono"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:1373
|
#: src/libslic3r/PrintConfig.cpp:1373
|
||||||
msgid "Detect bridging perimeters"
|
msgid "Detect bridging perimeters"
|
||||||
msgstr "Wykrywanie mostów przy obrysach"
|
msgstr "Wykrywanie mostów przy obrysach"
|
||||||
|
@ -2140,6 +2147,23 @@ msgstr "Edytuj zaznaczenie - kliknij prawym przyciskiem"
|
||||||
msgid "Editing"
|
msgid "Editing"
|
||||||
msgstr "Edytowanie"
|
msgstr "Edytowanie"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:547
|
||||||
|
msgid "Ejec&t SD card / Flash drive"
|
||||||
|
msgstr "Wysuń kar&tę SD / pamięć flash"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
|
||||||
|
msgid "Eject SD card / Flash drive"
|
||||||
|
msgstr "Wysuń kartę SD / pamięć flash"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:547
|
||||||
|
msgid "Eject SD card / Flash drive after the G-code was exported to it."
|
||||||
|
msgstr "Wysuń kartę SD / pamięć flash po wyeksportowaniu na nią G-code."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Plater.cpp:2202
|
||||||
|
#, c-format
|
||||||
|
msgid "Ejecting of device %s(%s) has failed."
|
||||||
|
msgstr "Wysuwanie urządzenia %s(%s) nie powiodło się."
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:118
|
#: src/libslic3r/PrintConfig.cpp:118
|
||||||
msgid "Elephant foot compensation"
|
msgid "Elephant foot compensation"
|
||||||
msgstr "Kompensacja \"stopy słonia\""
|
msgstr "Kompensacja \"stopy słonia\""
|
||||||
|
@ -2430,6 +2454,10 @@ msgstr "Eksport zawartości stołu jako AMF"
|
||||||
msgid "Export current plate as G-code"
|
msgid "Export current plate as G-code"
|
||||||
msgstr "Eksport zawartości stołu jako G-code"
|
msgstr "Eksport zawartości stołu jako G-code"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:521
|
||||||
|
msgid "Export current plate as G-code to SD card / Flash drive"
|
||||||
|
msgstr "Eksport zawartości stołu jako G-gode na kartę SD / pamięć flash"
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:486
|
#: src/slic3r/GUI/MainFrame.cpp:486
|
||||||
msgid "Export current plate as STL"
|
msgid "Export current plate as STL"
|
||||||
msgstr "Eksport zawartości stołu jako STL"
|
msgstr "Eksport zawartości stołu jako STL"
|
||||||
|
@ -2451,6 +2479,10 @@ msgstr "Eksport pełnych ścieżek źródłowych modeli i części do plików 3M
|
||||||
msgid "Export G-code"
|
msgid "Export G-code"
|
||||||
msgstr "Eksport G-code"
|
msgstr "Eksport G-code"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/MainFrame.cpp:521
|
||||||
|
msgid "Export G-code to SD card / Flash drive"
|
||||||
|
msgstr "Eksport G-gode na kartę SD / pamięć flash"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:3320
|
#: src/libslic3r/PrintConfig.cpp:3320
|
||||||
msgid "Export OBJ"
|
msgid "Export OBJ"
|
||||||
msgstr "Eksport OBJ"
|
msgstr "Eksport OBJ"
|
||||||
|
@ -2951,15 +2983,6 @@ msgstr "Aby uzyskać więcej informacji odwiedź naszą wiki:"
|
||||||
msgid "For support enforcers only"
|
msgid "For support enforcers only"
|
||||||
msgstr "Tylko dla wymuszania podpór"
|
msgstr "Tylko dla wymuszania podpór"
|
||||||
|
|
||||||
#. TRN Description for "WHITE BULLET"
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:3265
|
|
||||||
msgid ""
|
|
||||||
"for the left button: \tindicates a non-system (or non-default) preset,\n"
|
|
||||||
"for the right button: \tindicates that the settings hasn't been modified."
|
|
||||||
msgstr ""
|
|
||||||
"dla lewego przycisku: wskazuje na niesystemowy (lub inny niż domyślny) zestaw ustawień,\n"
|
|
||||||
"dla prawego przycisku: wskazuje, że ustawienia nie zostały zmodyfikowane."
|
|
||||||
|
|
||||||
#. TRN Description for "WHITE BULLET"
|
#. TRN Description for "WHITE BULLET"
|
||||||
#: src/slic3r/GUI/Tab.cpp:3267
|
#: src/slic3r/GUI/Tab.cpp:3267
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3377,16 +3400,6 @@ msgstr "Plik certyfikatu HTTPS CA"
|
||||||
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
|
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
|
||||||
msgstr "Plik HTTPS CA jest opcjonalny. Jest potrzebny jedynie w sytuacji, gdy używasz HTTPS z certyfikatem samopodpisanym."
|
msgstr "Plik HTTPS CA jest opcjonalny. Jest potrzebny jedynie w sytuacji, gdy używasz HTTPS z certyfikatem samopodpisanym."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:1757
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"HTTPS CA File:\n"
|
|
||||||
" \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n"
|
|
||||||
" \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain."
|
|
||||||
msgstr ""
|
|
||||||
"Plik certyfikatu HTTPS:\n"
|
|
||||||
"W tym systemie, %s używa certyfikatu HTTPS z magazynu systemowego (Certificate Store) lub Keychain. Aby użyć własnego certyfikatu, zaimportuj plik do Certificate Store / Keychain."
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preferences.cpp:222
|
#: src/slic3r/GUI/Preferences.cpp:222
|
||||||
msgid "Icon size in a respect to the default size"
|
msgid "Icon size in a respect to the default size"
|
||||||
msgstr "Rozmiar ikon w odniesieniu do domyślnego"
|
msgstr "Rozmiar ikon w odniesieniu do domyślnego"
|
||||||
|
@ -4603,6 +4616,10 @@ msgstr "Ukończono naprawę modelu"
|
||||||
msgid "Model repaired successfully"
|
msgid "Model repaired successfully"
|
||||||
msgstr "Model naprawiono pomyślnie"
|
msgstr "Model naprawiono pomyślnie"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:979
|
||||||
|
msgid "Modifications to the current profile will be saved."
|
||||||
|
msgstr "Modyfikacje zostaną zapisane na obecnym profilu."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Preset.cpp:247
|
#: src/slic3r/GUI/Preset.cpp:247
|
||||||
msgid "modified"
|
msgid "modified"
|
||||||
msgstr "zmodyfikowano"
|
msgstr "zmodyfikowano"
|
||||||
|
@ -5400,10 +5417,10 @@ msgstr "Zestaw ustawień (%s)"
|
||||||
msgid "Preset with name \"%1%\" already exists."
|
msgid "Preset with name \"%1%\" already exists."
|
||||||
msgstr "Zestaw ustawień o nazwie \"%1%\" już istnieje."
|
msgstr "Zestaw ustawień o nazwie \"%1%\" już istnieje."
|
||||||
|
|
||||||
#: src/slic3r/GUI/Tab.cpp:3045
|
#: src/slic3r/GUI/Tab.cpp:3029
|
||||||
msgctxt "PresetName"
|
msgctxt "PresetName"
|
||||||
msgid "%1% - Copy"
|
msgid "Copy"
|
||||||
msgstr "%1% - Kopia"
|
msgstr "Kopia"
|
||||||
|
|
||||||
#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
|
#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
|
||||||
msgid "Press to activate deselection rectangle"
|
msgid "Press to activate deselection rectangle"
|
||||||
|
@ -6446,16 +6463,6 @@ msgstr "Wybierz rodzaj wymaganej podkładki"
|
||||||
msgid "Select what kind of support do you need"
|
msgid "Select what kind of support do you need"
|
||||||
msgstr "Wybierz rodzaj potrzebnych podpór"
|
msgstr "Wybierz rodzaj potrzebnych podpór"
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
|
||||||
msgid ""
|
|
||||||
"Select YES if you want to delete all saved tool changes, \n"
|
|
||||||
"\tNO if you want all tool changes switch to color changes, \n"
|
|
||||||
"\tor CANCEL to leave it unchanged."
|
|
||||||
msgstr ""
|
|
||||||
"Wybierz TAK, jeśli chcesz usunąć wszystkie zapisane zmiany narzędzi,\n"
|
|
||||||
"NIE, jeśli chcesz przełączyć zmiany narzędzi na zmiany koloru lub\n"
|
|
||||||
"ANULUJ, aby pozostawić bez zmian."
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
#: src/slic3r/GUI/DoubleSlider.cpp:1917
|
||||||
msgid ""
|
msgid ""
|
||||||
"Select YES if you want to delete all saved tool changes, \n"
|
"Select YES if you want to delete all saved tool changes, \n"
|
||||||
|
@ -7618,6 +7625,10 @@ msgstr ""
|
||||||
"Nie znaleziono urządzenia %s .\n"
|
"Nie znaleziono urządzenia %s .\n"
|
||||||
"Jeśli urządzenie jest podłączone, to naciśnij przycisk Reset obok złącza USB ..."
|
"Jeśli urządzenie jest podłączone, to naciśnij przycisk Reset obok złącza USB ..."
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:976
|
||||||
|
msgid "The current custom preset will be detached from the parent system preset."
|
||||||
|
msgstr "Obecny niestandardowy zestaw ustawień zostanie odłączony od dziedziczącego zestawu systemowego."
|
||||||
|
|
||||||
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
|
#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
|
||||||
msgid ""
|
msgid ""
|
||||||
"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
|
"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
|
||||||
|
@ -7774,18 +7785,14 @@ msgstr "Wybrany model nie może być podzielony ponieważ składa się z więcej
|
||||||
msgid "The selected object couldn't be split because it contains only one part."
|
msgid "The selected object couldn't be split because it contains only one part."
|
||||||
msgstr "Wybrany model nie może być rozdzielony ponieważ zawiera tylko jedną część."
|
msgstr "Wybrany model nie może być rozdzielony ponieważ zawiera tylko jedną część."
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:432
|
#: src/slic3r/GUI/MainFrame.cpp:461
|
||||||
msgid ""
|
msgid ""
|
||||||
"The selected project is no longer available.\n"
|
"The selected project is no longer available.\n"
|
||||||
"Do you want to remove it from the recent projects list ?"
|
"Do you want to remove it from the recent projects list?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Wybrany obiekt nie jest już dostępny.\n"
|
"Wybrany obiekt nie jest już dostępny.\n"
|
||||||
"Czy chcesz usunąć go z listy niedawno używanych projektów?"
|
"Czy chcesz usunąć go z listy niedawno używanych projektów?"
|
||||||
|
|
||||||
#: src/slic3r/GUI/MainFrame.cpp:422
|
|
||||||
msgid "The selected project is no more available"
|
|
||||||
msgstr "Wybrany projekt nie jest dostępny"
|
|
||||||
|
|
||||||
#: src/slic3r/GUI/DoubleSlider.cpp:998
|
#: src/slic3r/GUI/DoubleSlider.cpp:998
|
||||||
msgid ""
|
msgid ""
|
||||||
"The sequential print is on.\n"
|
"The sequential print is on.\n"
|
||||||
|
@ -7955,6 +7962,14 @@ msgstr ""
|
||||||
msgid "This %s version: %s"
|
msgid "This %s version: %s"
|
||||||
msgstr "%s wersja: %s"
|
msgstr "%s wersja: %s"
|
||||||
|
|
||||||
|
#: src/slic3r/GUI/Tab.cpp:982
|
||||||
|
msgid ""
|
||||||
|
"This action is not revertable.\n"
|
||||||
|
"Do you want to proceed?"
|
||||||
|
msgstr ""
|
||||||
|
"Tej czynności nie można odwrócić.\n"
|
||||||
|
"Czy chcesz kontynuować?"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:165
|
#: src/libslic3r/PrintConfig.cpp:165
|
||||||
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
|
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
|
||||||
msgstr "Ten kod jest wykonywany pomiędzy drukiem poszczególnych modeli w trybie druku sekwencyjnego. Domyślnie przy komendzie non-wait temperatury dyszy i stołu są resetowane; jednakże jeśli przy tej opcji zostaną użyte komendy M104, M109, M140 lub M190 to Slic3r nie doda własnych komend do kontroli temperatury. Pamiętaj, że możesz używać zmiennych typu placeholder, więc np. komendę \"M109 S[first_layer_temperature]\" (temperatura pierwszej warstwy) możesz umieścić gdzie chcesz."
|
msgstr "Ten kod jest wykonywany pomiędzy drukiem poszczególnych modeli w trybie druku sekwencyjnego. Domyślnie przy komendzie non-wait temperatury dyszy i stołu są resetowane; jednakże jeśli przy tej opcji zostaną użyte komendy M104, M109, M140 lub M190 to Slic3r nie doda własnych komend do kontroli temperatury. Pamiętaj, że możesz używać zmiennych typu placeholder, więc np. komendę \"M109 S[first_layer_temperature]\" (temperatura pierwszej warstwy) możesz umieścić gdzie chcesz."
|
||||||
|
@ -8123,10 +8138,6 @@ msgstr "To jest najwyższa możliwa do wydrukowania wysokość warstwy dla tego
|
||||||
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
|
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
|
||||||
msgstr "To jest najniższa możliwa do wydrukowania wysokość warstwy dla tego ekstrudera i jednocześnie dolny limit dla funkcji zmiennej wysokości warstwy. Zazwyczaj jest to 0.05 lub 0.1 mm."
|
msgstr "To jest najniższa możliwa do wydrukowania wysokość warstwy dla tego ekstrudera i jednocześnie dolny limit dla funkcji zmiennej wysokości warstwy. Zazwyczaj jest to 0.05 lub 0.1 mm."
|
||||||
|
|
||||||
#: src/libslic3r/GCode.cpp:639
|
|
||||||
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
|
||||||
msgstr "Dzieje się to zazwyczaj z powodu zbyt małych odcinków ekstruzji (są one pomijane) lub uszkodzenia modelu. Spróbuj naprawić model lub zmienić jego orientację na stole."
|
|
||||||
|
|
||||||
#: src/libslic3r/GCode.cpp:639
|
#: src/libslic3r/GCode.cpp:639
|
||||||
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
|
||||||
msgstr "Dzieje się to zazwyczaj z powodu zbyt małych odcinków ekstruzji (są one pomijane) lub uszkodzenia modelu. Spróbuj naprawić model lub zmienić jego orientację na stole."
|
msgstr "Dzieje się to zazwyczaj z powodu zbyt małych odcinków ekstruzji (są one pomijane) lub uszkodzenia modelu. Spróbuj naprawić model lub zmienić jego orientację na stole."
|
||||||
|
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
BIN
resources/profiles/BIBO/BIBO2_thumbnail.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
resources/profiles/Creality/ENDER3_thumbnail.png
Normal file
After Width: | Height: | Size: 58 KiB |
2
resources/profiles/LulzBot.idx
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
min_slic3r_version = 2.2.0-alpha3
|
||||||
|
0.0.1 Initial version
|
|
@ -2,9 +2,9 @@
|
||||||
|
|
||||||
[vendor]
|
[vendor]
|
||||||
# Vendor name will be shown by the Config Wizard.
|
# Vendor name will be shown by the Config Wizard.
|
||||||
name = Lulzbot
|
name = LulzBot
|
||||||
config_version = 0.0.1
|
config_version = 0.0.1
|
||||||
config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Lulzbot/
|
config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/LulzBot/
|
||||||
|
|
||||||
[printer_model:MINI_AERO]
|
[printer_model:MINI_AERO]
|
||||||
name = Mini Aero
|
name = Mini Aero
|
BIN
resources/profiles/LulzBot/MINI_AERO_thumbnail.png
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
resources/profiles/LulzBot/TAZ6_AERO_thumbnail.png
Normal file
After Width: | Height: | Size: 62 KiB |
|
@ -1,4 +1,5 @@
|
||||||
min_slic3r_version = 2.2.0-alpha3
|
min_slic3r_version = 2.2.0-alpha3
|
||||||
|
1.1.2 Added renamed_from fields for PETG filaments to indicate that they were renamed from PET.
|
||||||
1.1.1 Added Verbatim and Fiberlogy PETG filament profiles. Updated auto cooling settings for ABS.
|
1.1.1 Added Verbatim and Fiberlogy PETG filament profiles. Updated auto cooling settings for ABS.
|
||||||
1.1.1-beta Updated for PrusaSlicer 2.2.0-beta
|
1.1.1-beta Updated for PrusaSlicer 2.2.0-beta
|
||||||
1.1.1-alpha4 Extended list of default filaments to be installed, top/bottom_solid_min_thickness defined, infill_acceleration changed etc
|
1.1.1-alpha4 Extended list of default filaments to be installed, top/bottom_solid_min_thickness defined, infill_acceleration changed etc
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
name = Prusa Research
|
name = Prusa Research
|
||||||
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
||||||
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
||||||
config_version = 1.1.1
|
config_version = 1.1.2
|
||||||
# Where to get the updates from?
|
# Where to get the updates from?
|
||||||
config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/
|
config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/
|
||||||
changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1%
|
changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1%
|
||||||
|
@ -148,7 +148,7 @@ external_fill_pattern = rectilinear
|
||||||
external_perimeters_first = 0
|
external_perimeters_first = 0
|
||||||
external_perimeter_extrusion_width = 0.45
|
external_perimeter_extrusion_width = 0.45
|
||||||
extra_perimeters = 0
|
extra_perimeters = 0
|
||||||
extruder_clearance_height = 25
|
extruder_clearance_height = 20
|
||||||
extruder_clearance_radius = 45
|
extruder_clearance_radius = 45
|
||||||
extrusion_width = 0.45
|
extrusion_width = 0.45
|
||||||
fill_angle = 45
|
fill_angle = 45
|
||||||
|
@ -1874,6 +1874,7 @@ filament_density = 1.04
|
||||||
|
|
||||||
[filament:Generic PETG]
|
[filament:Generic PETG]
|
||||||
inherits = *PET*
|
inherits = *PET*
|
||||||
|
renamed_from = "Generic PET"
|
||||||
filament_vendor = Generic
|
filament_vendor = Generic
|
||||||
filament_cost = 27.82
|
filament_cost = 27.82
|
||||||
filament_density = 1.27
|
filament_density = 1.27
|
||||||
|
@ -2076,6 +2077,7 @@ temperature = 230
|
||||||
|
|
||||||
[filament:Prusa PETG]
|
[filament:Prusa PETG]
|
||||||
inherits = *PET*
|
inherits = *PET*
|
||||||
|
renamed_from = "Prusa PET"
|
||||||
filament_vendor = Made for Prusa
|
filament_vendor = Made for Prusa
|
||||||
filament_cost = 27.82
|
filament_cost = 27.82
|
||||||
filament_density = 1.27
|
filament_density = 1.27
|
||||||
|
@ -2107,6 +2109,7 @@ compatible_printers_condition = nozzle_diameter[0]!=0.6 and printer_model!="MK2S
|
||||||
|
|
||||||
[filament:Prusa PETG @0.6 nozzle]
|
[filament:Prusa PETG @0.6 nozzle]
|
||||||
inherits = *PET06*
|
inherits = *PET06*
|
||||||
|
renamed_from = "Prusa PET 0.6 nozzle"; "Prusa PETG 0.6 nozzle"
|
||||||
filament_vendor = Made for Prusa
|
filament_vendor = Made for Prusa
|
||||||
filament_cost = 27.82
|
filament_cost = 27.82
|
||||||
filament_density = 1.27
|
filament_density = 1.27
|
||||||
|
@ -2172,6 +2175,7 @@ filament_max_volumetric_speed = 13
|
||||||
|
|
||||||
[filament:Generic PETG @MMU2]
|
[filament:Generic PETG @MMU2]
|
||||||
inherits = *PET MMU2*
|
inherits = *PET MMU2*
|
||||||
|
renamed_from = "Generic PET MMU2"; "Generic PETG MMU2"
|
||||||
filament_vendor = Generic
|
filament_vendor = Generic
|
||||||
|
|
||||||
[filament:Plasty Mladec PETG @MMU2]
|
[filament:Plasty Mladec PETG @MMU2]
|
||||||
|
@ -2180,6 +2184,7 @@ filament_vendor = Plasty Mladec
|
||||||
|
|
||||||
[filament:Prusa PETG @MMU2]
|
[filament:Prusa PETG @MMU2]
|
||||||
inherits = *PET MMU2*
|
inherits = *PET MMU2*
|
||||||
|
renamed_from = "Prusa PET MMU2"; "Prusa PETG MMU2"
|
||||||
filament_vendor = Made for Prusa
|
filament_vendor = Made for Prusa
|
||||||
|
|
||||||
[filament:Prusament PETG @MMU2]
|
[filament:Prusament PETG @MMU2]
|
||||||
|
@ -2189,10 +2194,12 @@ filament_vendor = Prusa Polymers
|
||||||
|
|
||||||
[filament:Generic PETG @MMU2 0.6 nozzle]
|
[filament:Generic PETG @MMU2 0.6 nozzle]
|
||||||
inherits = *PET MMU2 06*
|
inherits = *PET MMU2 06*
|
||||||
|
renamed_from = "Generic PET MMU2 0.6 nozzle"; "Generic PETG MMU2 0.6 nozzle"
|
||||||
filament_vendor = Generic
|
filament_vendor = Generic
|
||||||
|
|
||||||
[filament:Prusa PETG @MMU2 0.6 nozzle]
|
[filament:Prusa PETG @MMU2 0.6 nozzle]
|
||||||
inherits = *PET MMU2 06*
|
inherits = *PET MMU2 06*
|
||||||
|
renamed_from = "Prusa PET MMU2 0.6 nozzle"; "Prusa PETG MMU2 0.6 nozzle"
|
||||||
filament_vendor = Made for Prusa
|
filament_vendor = Made for Prusa
|
||||||
|
|
||||||
[filament:Prusament PETG @MMU2 0.6 nozzle]
|
[filament:Prusament PETG @MMU2 0.6 nozzle]
|
||||||
|
@ -2525,6 +2532,7 @@ temperature = 275
|
||||||
|
|
||||||
[filament:Generic PETG @MMU1]
|
[filament:Generic PETG @MMU1]
|
||||||
inherits = *PETMMU1*
|
inherits = *PETMMU1*
|
||||||
|
renamed_from = "Generic PET MMU1"; "Generic PETG MMU1"
|
||||||
filament_vendor = Generic
|
filament_vendor = Generic
|
||||||
filament_cost = 27.82
|
filament_cost = 27.82
|
||||||
filament_density = 1.27
|
filament_density = 1.27
|
||||||
|
@ -2549,6 +2557,7 @@ filament_density = 1.27
|
||||||
|
|
||||||
[filament:Prusa PETG @MMU1]
|
[filament:Prusa PETG @MMU1]
|
||||||
inherits = *PETMMU1*
|
inherits = *PETMMU1*
|
||||||
|
renamed_from = "Prusa PET MMU1"; "Prusa PETG MMU1"
|
||||||
filament_vendor = Made for Prusa
|
filament_vendor = Made for Prusa
|
||||||
filament_cost = 27.82
|
filament_cost = 27.82
|
||||||
filament_density = 1.27
|
filament_density = 1.27
|
||||||
|
@ -2602,6 +2611,7 @@ compatible_printers_condition = printer_model=="MK2SMM"
|
||||||
|
|
||||||
[filament:Generic PETG @MINI]
|
[filament:Generic PETG @MINI]
|
||||||
inherits = Generic PETG; *PETMINI*
|
inherits = Generic PETG; *PETMINI*
|
||||||
|
renamed_from = "Generic PET MINI"; "Generic PETG MINI"
|
||||||
filament_vendor = Generic
|
filament_vendor = Generic
|
||||||
filament_cost = 27.82
|
filament_cost = 27.82
|
||||||
filament_density = 1.27
|
filament_density = 1.27
|
||||||
|
@ -2702,6 +2712,7 @@ filament_cost = 24.99
|
||||||
|
|
||||||
[filament:Generic PETG @0.6 nozzle MINI]
|
[filament:Generic PETG @0.6 nozzle MINI]
|
||||||
inherits = Generic PETG; *PETMINI06*
|
inherits = Generic PETG; *PETMINI06*
|
||||||
|
renamed_from = "Generic PET 0.6 nozzle MINI"; "Generic PETG 0.6 nozzle MINI"
|
||||||
|
|
||||||
[filament:Plasty Mladec PETG @0.6 nozzle MINI]
|
[filament:Plasty Mladec PETG @0.6 nozzle MINI]
|
||||||
inherits = Generic PETG; *PETMINI06*
|
inherits = Generic PETG; *PETMINI06*
|
||||||
|
@ -2983,6 +2994,7 @@ filament_type = EDGE
|
||||||
|
|
||||||
[filament:Prusa PETG @MINI]
|
[filament:Prusa PETG @MINI]
|
||||||
inherits = *PETMINI*
|
inherits = *PETMINI*
|
||||||
|
renamed_from = "Prusa PET MINI"; "Prusa PETG MINI"
|
||||||
filament_vendor = Made for Prusa
|
filament_vendor = Made for Prusa
|
||||||
filament_cost = 27.82
|
filament_cost = 27.82
|
||||||
filament_density = 1.27
|
filament_density = 1.27
|
||||||
|
@ -2990,6 +3002,7 @@ compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.
|
||||||
|
|
||||||
[filament:Prusa PETG @0.6 nozzle MINI]
|
[filament:Prusa PETG @0.6 nozzle MINI]
|
||||||
inherits = *PETMINI06*
|
inherits = *PETMINI06*
|
||||||
|
renamed_from = "Prusa PET 0.6 nozzle MINI"; "Prusa PETG 0.6 nozzle MINI"
|
||||||
filament_vendor = Made for Prusa
|
filament_vendor = Made for Prusa
|
||||||
filament_cost = 27.82
|
filament_cost = 27.82
|
||||||
filament_density = 1.27
|
filament_density = 1.27
|
||||||
|
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
|
@ -278,6 +278,8 @@ template<class RawShape> class EdgeCache {
|
||||||
|
|
||||||
inline Vertex coords(const ContourCache& cache, double distance) const {
|
inline Vertex coords(const ContourCache& cache, double distance) const {
|
||||||
assert(distance >= .0 && distance <= 1.0);
|
assert(distance >= .0 && distance <= 1.0);
|
||||||
|
if (cache.distances.empty() || cache.emap.empty()) return Vertex{};
|
||||||
|
if (distance > 1.0) distance = std::fmod(distance, 1.0);
|
||||||
|
|
||||||
// distance is from 0.0 to 1.0, we scale it up to the full length of
|
// distance is from 0.0 to 1.0, we scale it up to the full length of
|
||||||
// the circumference
|
// the circumference
|
||||||
|
|
|
@ -114,7 +114,7 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
|
||||||
if (surface.surface_type == stInternalVoid)
|
if (surface.surface_type == stInternalVoid)
|
||||||
has_internal_voids = true;
|
has_internal_voids = true;
|
||||||
else {
|
else {
|
||||||
FlowRole extrusion_role = (surface.surface_type == stTop) ? frTopSolidInfill : (surface.is_solid() ? frSolidInfill : frInfill);
|
FlowRole extrusion_role = surface.is_top() ? frTopSolidInfill : (surface.is_solid() ? frSolidInfill : frInfill);
|
||||||
bool is_bridge = layer.id() > 0 && surface.is_bridge();
|
bool is_bridge = layer.id() > 0 && surface.is_bridge();
|
||||||
params.extruder = layerm.region()->extruder(extrusion_role);
|
params.extruder = layerm.region()->extruder(extrusion_role);
|
||||||
params.pattern = layerm.region()->config().fill_pattern.value;
|
params.pattern = layerm.region()->config().fill_pattern.value;
|
||||||
|
@ -132,7 +132,7 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
|
||||||
is_bridge ?
|
is_bridge ?
|
||||||
erBridgeInfill :
|
erBridgeInfill :
|
||||||
(surface.is_solid() ?
|
(surface.is_solid() ?
|
||||||
((surface.surface_type == stTop) ? erTopSolidInfill : erSolidInfill) :
|
(surface.is_top() ? erTopSolidInfill : erSolidInfill) :
|
||||||
erInternalInfill);
|
erInternalInfill);
|
||||||
params.bridge_angle = float(surface.bridge_angle);
|
params.bridge_angle = float(surface.bridge_angle);
|
||||||
params.angle = float(Geometry::deg2rad(layerm.region()->config().fill_angle.value));
|
params.angle = float(Geometry::deg2rad(layerm.region()->config().fill_angle.value));
|
||||||
|
|
|
@ -470,7 +470,7 @@ void GCodeAnalyzer::_processM106(const GCodeReader::GCodeLine& line)
|
||||||
// The absence of P means the print cooling fan, so ignore anything else.
|
// The absence of P means the print cooling fan, so ignore anything else.
|
||||||
float new_fan_speed;
|
float new_fan_speed;
|
||||||
if (line.has_value('S', new_fan_speed))
|
if (line.has_value('S', new_fan_speed))
|
||||||
_set_fan_speed((100.0f / 256.0f) * new_fan_speed);
|
_set_fan_speed((100.0f / 255.0f) * new_fan_speed);
|
||||||
else
|
else
|
||||||
_set_fan_speed(100.0f);
|
_set_fan_speed(100.0f);
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,7 +117,7 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly
|
||||||
// Voids are sparse infills if infill rate is zero.
|
// Voids are sparse infills if infill rate is zero.
|
||||||
Polygons voids;
|
Polygons voids;
|
||||||
for (const Surface &surface : this->fill_surfaces.surfaces) {
|
for (const Surface &surface : this->fill_surfaces.surfaces) {
|
||||||
if (surface.surface_type == stTop) {
|
if (surface.is_top()) {
|
||||||
// Collect the top surfaces, inflate them and trim them by the bottom surfaces.
|
// Collect the top surfaces, inflate them and trim them by the bottom surfaces.
|
||||||
// This gives the priority to bottom surfaces.
|
// This gives the priority to bottom surfaces.
|
||||||
surfaces_append(top, offset_ex(surface.expolygon, margin, EXTERNAL_SURFACES_OFFSET_PARAMETERS), surface);
|
surfaces_append(top, offset_ex(surface.expolygon, margin, EXTERNAL_SURFACES_OFFSET_PARAMETERS), surface);
|
||||||
|
@ -313,7 +313,7 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly
|
||||||
s2.clear();
|
s2.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (s1.surface_type == stTop)
|
if (s1.is_top())
|
||||||
// Trim the top surfaces by the bottom surfaces. This gives the priority to the bottom surfaces.
|
// Trim the top surfaces by the bottom surfaces. This gives the priority to the bottom surfaces.
|
||||||
polys = diff(polys, bottom_polygons);
|
polys = diff(polys, bottom_polygons);
|
||||||
surfaces_append(
|
surfaces_append(
|
||||||
|
|
|
@ -161,6 +161,7 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option
|
||||||
} else if (
|
} else if (
|
||||||
opt_key == "skirts"
|
opt_key == "skirts"
|
||||||
|| opt_key == "skirt_height"
|
|| opt_key == "skirt_height"
|
||||||
|
|| opt_key == "draft_shield"
|
||||||
|| opt_key == "skirt_distance"
|
|| opt_key == "skirt_distance"
|
||||||
|| opt_key == "min_skirt_length"
|
|| opt_key == "min_skirt_length"
|
||||||
|| opt_key == "ooze_prevention"
|
|| opt_key == "ooze_prevention"
|
||||||
|
@ -1146,14 +1147,12 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
|
||||||
|
|
||||||
bool Print::has_infinite_skirt() const
|
bool Print::has_infinite_skirt() const
|
||||||
{
|
{
|
||||||
return (m_config.skirt_height == -1 && m_config.skirts > 0)
|
return (m_config.draft_shield && m_config.skirts > 0) || (m_config.ooze_prevention && this->extruders().size() > 1);
|
||||||
|| (m_config.ooze_prevention && this->extruders().size() > 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Print::has_skirt() const
|
bool Print::has_skirt() const
|
||||||
{
|
{
|
||||||
return (m_config.skirt_height > 0 && m_config.skirts > 0)
|
return (m_config.skirt_height > 0 && m_config.skirts > 0) || this->has_infinite_skirt();
|
||||||
|| this->has_infinite_skirt();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool sequential_print_horizontal_clearance_valid(const Print &print)
|
static inline bool sequential_print_horizontal_clearance_valid(const Print &print)
|
||||||
|
|
|
@ -1691,6 +1691,13 @@ void PrintConfigDef::init_fff_params()
|
||||||
def->mode = comAdvanced;
|
def->mode = comAdvanced;
|
||||||
def->set_default_value(new ConfigOptionInt(1));
|
def->set_default_value(new ConfigOptionInt(1));
|
||||||
|
|
||||||
|
def = this->add("draft_shield", coBool);
|
||||||
|
def->label = L("Draft shield");
|
||||||
|
def->tooltip = L("If enabled, the skirt will be as tall as a highest printed object. "
|
||||||
|
"This is useful to protect an ABS or ASA print from warping and detaching from print bed due to wind draft.");
|
||||||
|
def->mode = comAdvanced;
|
||||||
|
def->set_default_value(new ConfigOptionBool(false));
|
||||||
|
|
||||||
def = this->add("skirts", coInt);
|
def = this->add("skirts", coInt);
|
||||||
def->label = L("Loops (minimum)");
|
def->label = L("Loops (minimum)");
|
||||||
def->full_label = L("Skirt Loops");
|
def->full_label = L("Skirt Loops");
|
||||||
|
@ -2998,6 +3005,11 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va
|
||||||
} else if (opt_key == "support_material_pattern" && value == "pillars") {
|
} else if (opt_key == "support_material_pattern" && value == "pillars") {
|
||||||
// Slic3r PE does not support the pillars. They never worked well.
|
// Slic3r PE does not support the pillars. They never worked well.
|
||||||
value = "rectilinear";
|
value = "rectilinear";
|
||||||
|
} else if (opt_key == "skirt_height" && value == "-1") {
|
||||||
|
// PrusaSlicer no more accepts skirt_height == -1 to print a draft shield to the top of the highest object.
|
||||||
|
// A new "draft_shield" boolean config value is used instead.
|
||||||
|
opt_key = "draft_shield";
|
||||||
|
value = "1";
|
||||||
} else if (opt_key == "octoprint_host") {
|
} else if (opt_key == "octoprint_host") {
|
||||||
opt_key = "print_host";
|
opt_key = "print_host";
|
||||||
} else if (opt_key == "octoprint_cafile") {
|
} else if (opt_key == "octoprint_cafile") {
|
||||||
|
@ -3206,7 +3218,7 @@ std::string FullPrintConfig::validate()
|
||||||
return "Invalid value for --infill-every-layers";
|
return "Invalid value for --infill-every-layers";
|
||||||
|
|
||||||
// --skirt-height
|
// --skirt-height
|
||||||
if (this->skirt_height < -1) // -1 means as tall as the object
|
if (this->skirt_height < 0)
|
||||||
return "Invalid value for --skirt-height";
|
return "Invalid value for --skirt-height";
|
||||||
|
|
||||||
// --bridge-flow-ratio
|
// --bridge-flow-ratio
|
||||||
|
|
|
@ -800,6 +800,7 @@ public:
|
||||||
ConfigOptionBools retract_layer_change;
|
ConfigOptionBools retract_layer_change;
|
||||||
ConfigOptionFloat skirt_distance;
|
ConfigOptionFloat skirt_distance;
|
||||||
ConfigOptionInt skirt_height;
|
ConfigOptionInt skirt_height;
|
||||||
|
ConfigOptionBool draft_shield;
|
||||||
ConfigOptionInt skirts;
|
ConfigOptionInt skirts;
|
||||||
ConfigOptionInts slowdown_below_layer_time;
|
ConfigOptionInts slowdown_below_layer_time;
|
||||||
ConfigOptionBool spiral_vase;
|
ConfigOptionBool spiral_vase;
|
||||||
|
@ -872,6 +873,7 @@ protected:
|
||||||
OPT_PTR(retract_layer_change);
|
OPT_PTR(retract_layer_change);
|
||||||
OPT_PTR(skirt_distance);
|
OPT_PTR(skirt_distance);
|
||||||
OPT_PTR(skirt_height);
|
OPT_PTR(skirt_height);
|
||||||
|
OPT_PTR(draft_shield);
|
||||||
OPT_PTR(skirts);
|
OPT_PTR(skirts);
|
||||||
OPT_PTR(slowdown_below_layer_time);
|
OPT_PTR(slowdown_below_layer_time);
|
||||||
OPT_PTR(spiral_vase);
|
OPT_PTR(spiral_vase);
|
||||||
|
|
|
@ -817,11 +817,12 @@ void PrintObject::detect_surfaces_type()
|
||||||
m_layers[idx_layer]->m_regions[idx_region]->slices.surfaces = std::move(surfaces_new[idx_layer]);
|
m_layers[idx_layer]->m_regions[idx_region]->slices.surfaces = std::move(surfaces_new[idx_layer]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spiral_vase && num_layers > 1) {
|
if (spiral_vase) {
|
||||||
// Turn the last bottom layer infill to a top infill, so it will be extruded with a proper pattern.
|
if (num_layers > 1)
|
||||||
Surfaces &surfaces = m_layers[num_layers - 1]->m_regions[idx_region]->slices.surfaces;
|
// Turn the last bottom layer infill to a top infill, so it will be extruded with a proper pattern.
|
||||||
for (Surface &surface : surfaces)
|
m_layers[num_layers - 1]->m_regions[idx_region]->slices.set_type(stTop);
|
||||||
surface.surface_type = stTop;
|
for (size_t i = num_layers; i < m_layers.size(); ++ i)
|
||||||
|
m_layers[i]->m_regions[idx_region]->slices.set_type(stInternal);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(debug) << "Detecting solid surfaces for region " << idx_region << " - clipping in parallel - start";
|
BOOST_LOG_TRIVIAL(debug) << "Detecting solid surfaces for region " << idx_region << " - clipping in parallel - start";
|
||||||
|
|
|
@ -34,6 +34,10 @@ public:
|
||||||
void remove_type(const SurfaceType type);
|
void remove_type(const SurfaceType type);
|
||||||
void remove_types(const SurfaceType *types, int ntypes);
|
void remove_types(const SurfaceType *types, int ntypes);
|
||||||
void filter_by_type(SurfaceType type, Polygons* polygons);
|
void filter_by_type(SurfaceType type, Polygons* polygons);
|
||||||
|
void set_type(SurfaceType type) {
|
||||||
|
for (Surface &surface : this->surfaces)
|
||||||
|
surface.surface_type = type;
|
||||||
|
}
|
||||||
|
|
||||||
void clear() { surfaces.clear(); }
|
void clear() { surfaces.clear(); }
|
||||||
bool empty() const { return surfaces.empty(); }
|
bool empty() const { return surfaces.empty(); }
|
||||||
|
|
|
@ -42,9 +42,9 @@
|
||||||
#define ENABLE_THUMBNAIL_GENERATOR_DEBUG (0 && ENABLE_THUMBNAIL_GENERATOR)
|
#define ENABLE_THUMBNAIL_GENERATOR_DEBUG (0 && ENABLE_THUMBNAIL_GENERATOR)
|
||||||
|
|
||||||
|
|
||||||
//==================
|
//================
|
||||||
// 2.2.0.rc1 techs
|
// 2.2.0.rc1 techs
|
||||||
//==================
|
//================
|
||||||
#define ENABLE_2_2_0_RC1 1
|
#define ENABLE_2_2_0_RC1 1
|
||||||
|
|
||||||
// Enable hack to remove crash when closing on OSX 10.9.5
|
// Enable hack to remove crash when closing on OSX 10.9.5
|
||||||
|
@ -56,6 +56,10 @@
|
||||||
//============
|
//============
|
||||||
#define ENABLE_2_2_0 1
|
#define ENABLE_2_2_0 1
|
||||||
|
|
||||||
|
// Enable automatic switch to constrained camera when manipulating the scene using regular mouse
|
||||||
|
// while 3D mouse is connected and free camera is not selected
|
||||||
|
#define ENABLE_AUTO_CONSTRAINED_CAMERA (1 && ENABLE_2_2_0)
|
||||||
|
|
||||||
// Enable rendering of objects colored by facets' slope
|
// Enable rendering of objects colored by facets' slope
|
||||||
#define ENABLE_SLOPE_RENDERING (1 && ENABLE_2_2_0)
|
#define ENABLE_SLOPE_RENDERING (1 && ENABLE_2_2_0)
|
||||||
|
|
||||||
|
|
|
@ -101,8 +101,7 @@ void BackgroundSlicingProcess::process_fff()
|
||||||
//FIXME localize the messages
|
//FIXME localize the messages
|
||||||
// Perform the final post-processing of the export path by applying the print statistics over the file name.
|
// Perform the final post-processing of the export path by applying the print statistics over the file name.
|
||||||
std::string export_path = m_fff_print->print_statistics().finalize_output_path(m_export_path);
|
std::string export_path = m_fff_print->print_statistics().finalize_output_path(m_export_path);
|
||||||
bool with_check = GUI::wxGetApp().removable_drive_manager()->is_path_on_removable_drive(export_path);
|
int copy_ret_val = copy_file(m_temp_output_path, export_path, m_export_path_on_removable_media);
|
||||||
int copy_ret_val = copy_file(m_temp_output_path, export_path, with_check);
|
|
||||||
switch (copy_ret_val) {
|
switch (copy_ret_val) {
|
||||||
case SUCCESS: break; // no error
|
case SUCCESS: break; // no error
|
||||||
case FAIL_COPY_FILE:
|
case FAIL_COPY_FILE:
|
||||||
|
@ -402,7 +401,7 @@ void BackgroundSlicingProcess::set_task(const PrintBase::TaskParams ¶ms)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the output path of the G-code.
|
// Set the output path of the G-code.
|
||||||
void BackgroundSlicingProcess::schedule_export(const std::string &path)
|
void BackgroundSlicingProcess::schedule_export(const std::string &path, bool export_path_on_removable_media)
|
||||||
{
|
{
|
||||||
assert(m_export_path.empty());
|
assert(m_export_path.empty());
|
||||||
if (! m_export_path.empty())
|
if (! m_export_path.empty())
|
||||||
|
@ -412,6 +411,7 @@ void BackgroundSlicingProcess::schedule_export(const std::string &path)
|
||||||
tbb::mutex::scoped_lock lock(m_print->state_mutex());
|
tbb::mutex::scoped_lock lock(m_print->state_mutex());
|
||||||
this->invalidate_step(bspsGCodeFinalize);
|
this->invalidate_step(bspsGCodeFinalize);
|
||||||
m_export_path = path;
|
m_export_path = path;
|
||||||
|
m_export_path_on_removable_media = export_path_on_removable_media;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BackgroundSlicingProcess::schedule_upload(Slic3r::PrintHostJob upload_job)
|
void BackgroundSlicingProcess::schedule_upload(Slic3r::PrintHostJob upload_job)
|
||||||
|
@ -432,6 +432,7 @@ void BackgroundSlicingProcess::reset_export()
|
||||||
assert(! this->running());
|
assert(! this->running());
|
||||||
if (! this->running()) {
|
if (! this->running()) {
|
||||||
m_export_path.clear();
|
m_export_path.clear();
|
||||||
|
m_export_path_on_removable_media = false;
|
||||||
// invalidate_step expects the mutex to be locked.
|
// invalidate_step expects the mutex to be locked.
|
||||||
tbb::mutex::scoped_lock lock(m_print->state_mutex());
|
tbb::mutex::scoped_lock lock(m_print->state_mutex());
|
||||||
this->invalidate_step(bspsGCodeFinalize);
|
this->invalidate_step(bspsGCodeFinalize);
|
||||||
|
|
|
@ -98,7 +98,7 @@ public:
|
||||||
|
|
||||||
// Set the export path of the G-code.
|
// Set the export path of the G-code.
|
||||||
// Once the path is set, the G-code
|
// Once the path is set, the G-code
|
||||||
void schedule_export(const std::string &path);
|
void schedule_export(const std::string &path, bool export_path_on_removable_media);
|
||||||
// Set print host upload job data to be enqueued to the PrintHostJobQueue
|
// Set print host upload job data to be enqueued to the PrintHostJobQueue
|
||||||
// after current print slicing is complete
|
// after current print slicing is complete
|
||||||
void schedule_upload(Slic3r::PrintHostJob upload_job);
|
void schedule_upload(Slic3r::PrintHostJob upload_job);
|
||||||
|
@ -157,13 +157,14 @@ private:
|
||||||
GCodePreviewData *m_gcode_preview_data = nullptr;
|
GCodePreviewData *m_gcode_preview_data = nullptr;
|
||||||
#if ENABLE_THUMBNAIL_GENERATOR
|
#if ENABLE_THUMBNAIL_GENERATOR
|
||||||
// Callback function, used to write thumbnails into gcode.
|
// Callback function, used to write thumbnails into gcode.
|
||||||
ThumbnailsGeneratorCallback m_thumbnail_cb = nullptr;
|
ThumbnailsGeneratorCallback m_thumbnail_cb = nullptr;
|
||||||
#endif // ENABLE_THUMBNAIL_GENERATOR
|
#endif // ENABLE_THUMBNAIL_GENERATOR
|
||||||
// Temporary G-code, there is one defined for the BackgroundSlicingProcess, differentiated from the other processes by a process ID.
|
// Temporary G-code, there is one defined for the BackgroundSlicingProcess, differentiated from the other processes by a process ID.
|
||||||
std::string m_temp_output_path;
|
std::string m_temp_output_path;
|
||||||
// Output path provided by the user. The output path may be set even if the slicing is running,
|
// Output path provided by the user. The output path may be set even if the slicing is running,
|
||||||
// but once set, it cannot be re-set.
|
// but once set, it cannot be re-set.
|
||||||
std::string m_export_path;
|
std::string m_export_path;
|
||||||
|
bool m_export_path_on_removable_media = false;
|
||||||
// Print host upload job to schedule after slicing is complete, used by schedule_upload(),
|
// Print host upload job to schedule after slicing is complete, used by schedule_upload(),
|
||||||
// empty by default (ie. no upload to schedule)
|
// empty by default (ie. no upload to schedule)
|
||||||
PrintHostJob m_upload_job;
|
PrintHostJob m_upload_job;
|
||||||
|
|
|
@ -268,8 +268,9 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config)
|
||||||
"bridge_acceleration", "first_layer_acceleration" })
|
"bridge_acceleration", "first_layer_acceleration" })
|
||||||
toggle_field(el, have_default_acceleration);
|
toggle_field(el, have_default_acceleration);
|
||||||
|
|
||||||
bool have_skirt = config->opt_int("skirts") > 0 || config->opt_float("min_skirt_length") > 0;
|
bool have_skirt = config->opt_int("skirts") > 0;
|
||||||
for (auto el : { "skirt_distance", "skirt_height" })
|
toggle_field("skirt_height", have_skirt && !config->opt_bool("draft_shield"));
|
||||||
|
for (auto el : { "skirt_distance", "draft_shield", "min_skirt_length" })
|
||||||
toggle_field(el, have_skirt);
|
toggle_field(el, have_skirt);
|
||||||
|
|
||||||
bool have_brim = config->opt_float("brim_width") > 0;
|
bool have_brim = config->opt_float("brim_width") > 0;
|
||||||
|
|
|
@ -188,7 +188,7 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt
|
||||||
|
|
||||||
wxBitmap bitmap;
|
wxBitmap bitmap;
|
||||||
int bitmap_width = 0;
|
int bitmap_width = 0;
|
||||||
const wxString bitmap_file = GUI::from_u8(Slic3r::var((boost::format("printers/%1%_%2%.png") % vendor.id % model.id).str()));
|
const wxString bitmap_file = GUI::from_u8(Slic3r::resources_dir() + "/profiles/" + vendor.id + "/" + model.id + "_thumbnail.png");
|
||||||
if (wxFileExists(bitmap_file)) {
|
if (wxFileExists(bitmap_file)) {
|
||||||
bitmap.LoadFile(bitmap_file, wxBITMAP_TYPE_PNG);
|
bitmap.LoadFile(bitmap_file, wxBITMAP_TYPE_PNG);
|
||||||
bitmap_width = bitmap.GetWidth();
|
bitmap_width = bitmap.GetWidth();
|
||||||
|
@ -450,7 +450,7 @@ PageWelcome::PageWelcome(ConfigWizard *parent)
|
||||||
% _utf8(ConfigWizard::name())).str())
|
% _utf8(ConfigWizard::name())).str())
|
||||||
))
|
))
|
||||||
, cbox_reset(append(
|
, cbox_reset(append(
|
||||||
new wxCheckBox(this, wxID_ANY, _(L("Remove user profiles - install from scratch (a snapshot will be taken beforehand)")))
|
new wxCheckBox(this, wxID_ANY, _(L("Remove user profiles (a snapshot will be taken beforehand)")))
|
||||||
))
|
))
|
||||||
{
|
{
|
||||||
welcome_text->Hide();
|
welcome_text->Hide();
|
||||||
|
@ -1473,12 +1473,41 @@ void ConfigWizard::priv::load_vendors()
|
||||||
pair.second.preset_bundle->load_installed_printers(appconfig_new);
|
pair.second.preset_bundle->load_installed_printers(appconfig_new);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (app_config->has_section(AppConfig::SECTION_FILAMENTS)) {
|
// Copy installed filaments and SLA material names from app_config to appconfig_new
|
||||||
appconfig_new.set_section(AppConfig::SECTION_FILAMENTS, app_config->get_section(AppConfig::SECTION_FILAMENTS));
|
// while resolving current names of profiles, which were renamed in the meantime.
|
||||||
}
|
for (PrinterTechnology technology : { ptFFF, ptSLA }) {
|
||||||
if (app_config->has_section(AppConfig::SECTION_MATERIALS)) {
|
const std::string §ion_name = (technology == ptFFF) ? AppConfig::SECTION_FILAMENTS : AppConfig::SECTION_MATERIALS;
|
||||||
appconfig_new.set_section(AppConfig::SECTION_MATERIALS, app_config->get_section(AppConfig::SECTION_MATERIALS));
|
std::map<std::string, std::string> section_new;
|
||||||
}
|
if (app_config->has_section(section_name)) {
|
||||||
|
const std::map<std::string, std::string> §ion_old = app_config->get_section(section_name);
|
||||||
|
for (const std::pair<std::string, std::string> &material_name_and_installed : section_old)
|
||||||
|
if (material_name_and_installed.second == "1") {
|
||||||
|
// Material is installed. Resolve it in bundles.
|
||||||
|
size_t num_found = 0;
|
||||||
|
const std::string &material_name = material_name_and_installed.first;
|
||||||
|
for (auto &bundle : bundles) {
|
||||||
|
const PresetCollection &materials = bundle.second.preset_bundle->materials(technology);
|
||||||
|
const Preset *preset = materials.find_preset(material_name);
|
||||||
|
if (preset == nullptr) {
|
||||||
|
// Not found. Maybe the material preset is there, bu it was was renamed?
|
||||||
|
const std::string *new_name = materials.get_preset_name_renamed(material_name);
|
||||||
|
if (new_name != nullptr)
|
||||||
|
preset = materials.find_preset(*new_name);
|
||||||
|
}
|
||||||
|
if (preset != nullptr) {
|
||||||
|
// Materal preset was found, mark it as installed.
|
||||||
|
section_new[preset->name] = "1";
|
||||||
|
++ num_found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (num_found == 0)
|
||||||
|
BOOST_LOG_TRIVIAL(error) << boost::format("Profile %1% was not found in installed vendor Preset Bundles.") % material_name;
|
||||||
|
else if (num_found > 1)
|
||||||
|
BOOST_LOG_TRIVIAL(error) << boost::format("Profile %1% was found in %2% vendor Preset Bundles.") % material_name % num_found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
appconfig_new.set_section(section_name, section_new);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigWizard::priv::add_page(ConfigWizardPage *page)
|
void ConfigWizard::priv::add_page(ConfigWizardPage *page)
|
||||||
|
@ -1642,9 +1671,9 @@ void ConfigWizard::priv::on_printer_pick(PagePrinters *page, const PrinterPicker
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if at list one printer is selected but there in no one selected material,
|
// When a printer model is picked, but there is no material installed compatible with this printer model,
|
||||||
// select materials which is default for selected printer(s)
|
// install default materials for selected printer model silently.
|
||||||
select_default_materials_if_needed(pair.second.vendor_profile, page->technology, evt.model_id);
|
check_and_install_missing_materials(page->technology, evt.model_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (page->technology & T_FFF) {
|
if (page->technology & T_FFF) {
|
||||||
|
@ -1654,41 +1683,26 @@ void ConfigWizard::priv::on_printer_pick(PagePrinters *page, const PrinterPicker
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigWizard::priv::select_default_materials_for_printer_model(const std::vector<VendorProfile::PrinterModel>& models, Technology technology, const std::string& model_id)
|
void ConfigWizard::priv::select_default_materials_for_printer_model(const VendorProfile::PrinterModel &printer_model, Technology technology)
|
||||||
{
|
{
|
||||||
PageMaterials* page_materials = technology & T_FFF ? page_filaments : page_sla_materials;
|
PageMaterials* page_materials = technology & T_FFF ? page_filaments : page_sla_materials;
|
||||||
|
for (const std::string& material : printer_model.default_materials)
|
||||||
auto it = std::find_if(models.begin(), models.end(), [model_id](VendorProfile::PrinterModel model) {return model_id == model.id; });
|
appconfig_new.set(page_materials->materials->appconfig_section(), material, "1");
|
||||||
if (it != models.end())
|
|
||||||
for (const std::string& material : it->default_materials)
|
|
||||||
appconfig_new.set(page_materials->materials->appconfig_section(), material, "1");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigWizard::priv::select_default_materials_if_needed(VendorProfile* vendor_profile, Technology technology, const std::string& model_id)
|
void ConfigWizard::priv::select_default_materials_for_printer_models(Technology technology, const std::set<const VendorProfile::PrinterModel*> &printer_models)
|
||||||
{
|
{
|
||||||
if ((technology & T_FFF && !any_fff_selected) ||
|
PageMaterials *page_materials = technology & T_FFF ? page_filaments : page_sla_materials;
|
||||||
(technology & T_SLA && !any_sla_selected) ||
|
const std::string &appconfig_section = page_materials->materials->appconfig_section();
|
||||||
check_materials_in_config(technology, false))
|
|
||||||
return;
|
|
||||||
|
|
||||||
select_default_materials_for_printer_model(vendor_profile->models, technology, model_id);
|
auto select_default_materials_for_printer_page = [this, appconfig_section, printer_models](PagePrinters *page_printers, Technology technology)
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigWizard::priv::selected_default_materials(Technology technology)
|
|
||||||
{
|
|
||||||
auto select_default_materials_for_printer_page = [this](PagePrinters * page_printers, Technology technology)
|
|
||||||
{
|
{
|
||||||
std::set<std::string> selected_models = page_printers->get_selected_models();
|
const std::string vendor_id = page_printers->get_vendor_id();
|
||||||
const std::string vendor_id = page_printers->get_vendor_id();
|
|
||||||
|
|
||||||
for (auto& pair : bundles)
|
for (auto& pair : bundles)
|
||||||
{
|
if (pair.first == vendor_id)
|
||||||
if (pair.first != vendor_id)
|
for (const VendorProfile::PrinterModel *printer_model : printer_models)
|
||||||
continue;
|
for (const std::string &material : printer_model->default_materials)
|
||||||
|
appconfig_new.set(appconfig_section, material, "1");
|
||||||
for (const std::string& model_id : selected_models)
|
|
||||||
select_default_materials_for_printer_model(pair.second.vendor_profile->models, technology, model_id);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
PagePrinters* page_printers = technology & T_FFF ? page_fff : page_msla;
|
PagePrinters* page_printers = technology & T_FFF ? page_fff : page_msla;
|
||||||
|
@ -1702,7 +1716,7 @@ void ConfigWizard::priv::selected_default_materials(Technology technology)
|
||||||
}
|
}
|
||||||
|
|
||||||
update_materials(technology);
|
update_materials(technology);
|
||||||
(technology& T_FFF ? page_filaments : page_sla_materials)->reload_presets();
|
((technology & T_FFF) ? page_filaments : page_sla_materials)->reload_presets();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigWizard::priv::on_3rdparty_install(const VendorProfile *vendor, bool install)
|
void ConfigWizard::priv::on_3rdparty_install(const VendorProfile *vendor, bool install)
|
||||||
|
@ -1743,51 +1757,105 @@ bool ConfigWizard::priv::on_bnt_finish()
|
||||||
// theres no need to check that filament is selected if we have only custom printer
|
// theres no need to check that filament is selected if we have only custom printer
|
||||||
if (custom_printer_selected && !any_fff_selected && !any_sla_selected) return true;
|
if (custom_printer_selected && !any_fff_selected && !any_sla_selected) return true;
|
||||||
// check, that there is selected at least one filament/material
|
// check, that there is selected at least one filament/material
|
||||||
return check_materials_in_config(T_ANY);
|
return check_and_install_missing_materials(T_ANY);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ConfigWizard::priv::check_materials_in_config(Technology technology, bool show_info_msg)
|
// This allmighty method verifies, whether there is at least a single compatible filament or SLA material installed
|
||||||
|
// for each Printer preset of each Printer Model installed.
|
||||||
|
//
|
||||||
|
// In case only_for_model_id is set, then the test is done for that particular printer model only, and the default materials are installed silently.
|
||||||
|
// Otherwise the user is quieried whether to install the missing default materials or not.
|
||||||
|
//
|
||||||
|
// Return true if the tested Printer Models already had materials installed.
|
||||||
|
// Return false if there were some Printer Models with missing materials, independent from whether the defaults were installed for these
|
||||||
|
// respective Printer Models or not.
|
||||||
|
bool ConfigWizard::priv::check_and_install_missing_materials(Technology technology, const std::string &only_for_model_id)
|
||||||
{
|
{
|
||||||
const auto exist_preset = [this](const std::string& section, const Materials& materials)
|
// Walk over all installed Printer presets and verify whether there is a filament or SLA material profile installed at the same PresetBundle,
|
||||||
|
// which is compatible with it.
|
||||||
|
const auto printer_models_missing_materials = [this, only_for_model_id](PrinterTechnology technology, const std::string §ion)
|
||||||
{
|
{
|
||||||
if (appconfig_new.has_section(section) &&
|
const std::map<std::string, std::string> &appconfig_presets = appconfig_new.has_section(section) ? appconfig_new.get_section(section) : std::map<std::string, std::string>();
|
||||||
!appconfig_new.get_section(section).empty())
|
std::set<const VendorProfile::PrinterModel*> printer_models_without_material;
|
||||||
{
|
for (const auto &pair : bundles) {
|
||||||
const std::map<std::string, std::string>& appconfig_presets = appconfig_new.get_section(section);
|
const PresetCollection &materials = pair.second.preset_bundle->materials(technology);
|
||||||
for (const auto& preset : appconfig_presets)
|
for (const auto &printer : pair.second.preset_bundle->printers) {
|
||||||
if (materials.exist_preset(preset.first))
|
if (printer.is_visible && printer.printer_technology() == technology) {
|
||||||
return true;
|
const VendorProfile::PrinterModel *printer_model = PresetUtils::system_printer_model(printer);
|
||||||
|
assert(printer_model != nullptr);
|
||||||
|
if ((only_for_model_id.empty() || only_for_model_id == printer_model->id) &&
|
||||||
|
printer_models_without_material.find(printer_model) == printer_models_without_material.end()) {
|
||||||
|
bool has_material = false;
|
||||||
|
for (const std::pair<std::string, std::string> &preset : appconfig_presets) {
|
||||||
|
if (preset.second == "1") {
|
||||||
|
const Preset *material = materials.find_preset(preset.first, false);
|
||||||
|
if (material != nullptr && is_compatible_with_printer(PresetWithVendorProfile(*material, nullptr), PresetWithVendorProfile(printer, nullptr))) {
|
||||||
|
has_material = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (! has_material)
|
||||||
|
printer_models_without_material.insert(printer_model);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
assert(printer_models_without_material.empty() || only_for_model_id.empty() || only_for_model_id == (*printer_models_without_material.begin())->id);
|
||||||
|
return printer_models_without_material;
|
||||||
};
|
};
|
||||||
|
|
||||||
const auto ask_and_selected_default_materials = [this](wxString message, Technology technology)
|
const auto ask_and_select_default_materials = [this](const wxString &message, const std::set<const VendorProfile::PrinterModel*> &printer_models, Technology technology)
|
||||||
{
|
{
|
||||||
wxMessageDialog msg(q, message, _(L("Notice")), wxYES_NO);
|
wxMessageDialog msg(q, message, _(L("Notice")), wxYES_NO);
|
||||||
if (msg.ShowModal() == wxID_YES)
|
if (msg.ShowModal() == wxID_YES)
|
||||||
selected_default_materials(technology);
|
select_default_materials_for_printer_models(technology, printer_models);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (any_fff_selected && technology & T_FFF && !exist_preset(AppConfig::SECTION_FILAMENTS, filaments))
|
const auto printer_model_list = [](const std::set<const VendorProfile::PrinterModel*> &printer_models) -> wxString {
|
||||||
{
|
wxString out;
|
||||||
if (show_info_msg)
|
for (const VendorProfile::PrinterModel *printer_model : printer_models) {
|
||||||
{
|
out += "\t\t";
|
||||||
wxString message = _(L("You have to select at least one filament for selected printers")) + "\n\n\t" +
|
out += from_u8(printer_model->name);
|
||||||
_(L("Do you want to automatic select default filaments?"));
|
out += "\n";
|
||||||
ask_and_selected_default_materials(message, T_FFF);
|
}
|
||||||
|
return out;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (any_fff_selected && (technology & T_FFF)) {
|
||||||
|
std::set<const VendorProfile::PrinterModel*> printer_models_without_material = printer_models_missing_materials(ptFFF, AppConfig::SECTION_FILAMENTS);
|
||||||
|
if (! printer_models_without_material.empty()) {
|
||||||
|
if (only_for_model_id.empty())
|
||||||
|
ask_and_select_default_materials(
|
||||||
|
_L("The following FFF printer models have no filament selected:") +
|
||||||
|
"\n\n\t" +
|
||||||
|
printer_model_list(printer_models_without_material) +
|
||||||
|
"\n\n\t" +
|
||||||
|
_L("Do you want to select default filaments for these FFF printer models?"),
|
||||||
|
printer_models_without_material,
|
||||||
|
T_FFF);
|
||||||
|
else
|
||||||
|
select_default_materials_for_printer_model(**printer_models_without_material.begin(), T_FFF);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (any_sla_selected && technology & T_SLA && !exist_preset(AppConfig::SECTION_MATERIALS, sla_materials))
|
if (any_sla_selected && (technology & T_SLA)) {
|
||||||
{
|
std::set<const VendorProfile::PrinterModel*> printer_models_without_material = printer_models_missing_materials(ptSLA, AppConfig::SECTION_MATERIALS);
|
||||||
if (show_info_msg)
|
if (! printer_models_without_material.empty()) {
|
||||||
{
|
if (only_for_model_id.empty())
|
||||||
wxString message = _(L("You have to select at least one material for selected printers")) + "\n\n\t" +
|
ask_and_select_default_materials(
|
||||||
_(L("Do you want to automatic select default materials?"));
|
_L("The following SLA printer models have no materials selected:") +
|
||||||
ask_and_selected_default_materials(message, T_SLA);
|
"\n\n\t" +
|
||||||
}
|
printer_model_list(printer_models_without_material) +
|
||||||
return false;
|
"\n\n\t" +
|
||||||
|
_L("Do you want to select default SLA materials for these printer models?"),
|
||||||
|
printer_models_without_material,
|
||||||
|
T_SLA);
|
||||||
|
else
|
||||||
|
select_default_materials_for_printer_model(**printer_models_without_material.begin(), T_SLA);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -2062,8 +2130,11 @@ ConfigWizard::ConfigWizard(wxWindow *parent)
|
||||||
{
|
{
|
||||||
// check, that there is selected at least one filament/material
|
// check, that there is selected at least one filament/material
|
||||||
ConfigWizardPage* active_page = this->p->index->active_page();
|
ConfigWizardPage* active_page = this->p->index->active_page();
|
||||||
if ( (active_page == p->page_filaments || active_page == p->page_sla_materials)
|
if (// Leaving the filaments or SLA materials page and
|
||||||
&& !p->check_materials_in_config(dynamic_cast<PageMaterials*>(active_page)->materials->technology))
|
(active_page == p->page_filaments || active_page == p->page_sla_materials) &&
|
||||||
|
// some Printer models had no filament or SLA material selected.
|
||||||
|
! p->check_and_install_missing_materials(dynamic_cast<PageMaterials*>(active_page)->materials->technology))
|
||||||
|
// In that case don't leave the page and the function above queried the user whether to install default materials.
|
||||||
return;
|
return;
|
||||||
this->p->index->go_next();
|
this->p->index->go_next();
|
||||||
});
|
});
|
||||||
|
|
|
@ -82,14 +82,6 @@ struct Materials
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool exist_preset(const std::string& preset_name) const
|
|
||||||
{
|
|
||||||
for (const Preset* preset : presets)
|
|
||||||
if (preset->name == preset_name)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const std::string UNKNOWN;
|
static const std::string UNKNOWN;
|
||||||
static const std::string& get_filament_type(const Preset *preset);
|
static const std::string& get_filament_type(const Preset *preset);
|
||||||
static const std::string& get_filament_vendor(const Preset *preset);
|
static const std::string& get_filament_vendor(const Preset *preset);
|
||||||
|
@ -503,17 +495,12 @@ struct ConfigWizard::priv
|
||||||
|
|
||||||
void on_custom_setup(const bool custom_wanted);
|
void on_custom_setup(const bool custom_wanted);
|
||||||
void on_printer_pick(PagePrinters *page, const PrinterPickerEvent &evt);
|
void on_printer_pick(PagePrinters *page, const PrinterPickerEvent &evt);
|
||||||
void select_default_materials_for_printer_model(const std::vector<VendorProfile::PrinterModel> &models,
|
void select_default_materials_for_printer_model(const VendorProfile::PrinterModel &printer_model, Technology technology);
|
||||||
Technology technology,
|
void select_default_materials_for_printer_models(Technology technology, const std::set<const VendorProfile::PrinterModel*> &printer_models);
|
||||||
const std::string & model_id);
|
|
||||||
void select_default_materials_if_needed(VendorProfile* vendor_profile,
|
|
||||||
Technology technology,
|
|
||||||
const std::string &model_id);
|
|
||||||
void selected_default_materials(Technology technology);
|
|
||||||
void on_3rdparty_install(const VendorProfile *vendor, bool install);
|
void on_3rdparty_install(const VendorProfile *vendor, bool install);
|
||||||
|
|
||||||
bool on_bnt_finish();
|
bool on_bnt_finish();
|
||||||
bool check_materials_in_config(Technology technology, bool show_info_msg = true);
|
bool check_and_install_missing_materials(Technology technology, const std::string &only_for_model_id = std::string());
|
||||||
void apply_config(AppConfig *app_config, PresetBundle *preset_bundle, const PresetUpdater *updater);
|
void apply_config(AppConfig *app_config, PresetBundle *preset_bundle, const PresetUpdater *updater);
|
||||||
// #ys_FIXME_alise
|
// #ys_FIXME_alise
|
||||||
void update_presets_in_config(const std::string& section, const std::string& alias_key, bool add);
|
void update_presets_in_config(const std::string& section, const std::string& alias_key, bool add);
|
||||||
|
|
|
@ -663,7 +663,7 @@ void GLCanvas3D::WarningTexture::activate(WarningTexture::Warning warning, bool
|
||||||
if (it != m_warnings.end()) // this warning is already set to be shown
|
if (it != m_warnings.end()) // this warning is already set to be shown
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_warnings.push_back(warning);
|
m_warnings.emplace_back(warning);
|
||||||
std::sort(m_warnings.begin(), m_warnings.end());
|
std::sort(m_warnings.begin(), m_warnings.end());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1289,7 +1289,7 @@ void GLCanvas3D::Labels::render(const std::vector<const ModelInstance*>& sorted_
|
||||||
if (model_object->instances.size() > 1)
|
if (model_object->instances.size() > 1)
|
||||||
owner.label += " (" + std::to_string(inst_idx + 1) + ")";
|
owner.label += " (" + std::to_string(inst_idx + 1) + ")";
|
||||||
owner.selected = volume->selected;
|
owner.selected = volume->selected;
|
||||||
owners.push_back(owner);
|
owners.emplace_back(owner);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2093,7 +2093,7 @@ std::vector<int> GLCanvas3D::load_object(const ModelObject& model_object, int ob
|
||||||
{
|
{
|
||||||
for (unsigned int i = 0; i < model_object.instances.size(); ++i)
|
for (unsigned int i = 0; i < model_object.instances.size(); ++i)
|
||||||
{
|
{
|
||||||
instance_idxs.push_back(i);
|
instance_idxs.emplace_back(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return m_volumes.load_object(&model_object, obj_idx, instance_idxs, m_color_by, m_initialized);
|
return m_volumes.load_object(&model_object, obj_idx, instance_idxs, m_color_by, m_initialized);
|
||||||
|
@ -2533,9 +2533,9 @@ static void load_gcode_retractions(const GCodePreviewData::Retraction& retractio
|
||||||
|
|
||||||
for (const GCodePreviewData::Retraction::Position& position : copy)
|
for (const GCodePreviewData::Retraction::Position& position : copy)
|
||||||
{
|
{
|
||||||
volume->print_zs.push_back(unscale<double>(position.position(2)));
|
volume->print_zs.emplace_back(unscale<double>(position.position(2)));
|
||||||
volume->offsets.push_back(volume->indexed_vertex_array.quad_indices.size());
|
volume->offsets.emplace_back(volume->indexed_vertex_array.quad_indices.size());
|
||||||
volume->offsets.push_back(volume->indexed_vertex_array.triangle_indices.size());
|
volume->offsets.emplace_back(volume->indexed_vertex_array.triangle_indices.size());
|
||||||
|
|
||||||
_3DScene::point3_to_verts(position.position, position.width, position.height, *volume);
|
_3DScene::point3_to_verts(position.position, position.width, position.height, *volume);
|
||||||
|
|
||||||
|
@ -3541,11 +3541,26 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
||||||
if (m_hover_volume_idxs.empty() && m_mouse.is_start_position_3D_defined())
|
if (m_hover_volume_idxs.empty() && m_mouse.is_start_position_3D_defined())
|
||||||
{
|
{
|
||||||
const Vec3d rot = (Vec3d(pos.x(), pos.y(), 0.) - m_mouse.drag.start_position_3D) * (PI * TRACKBALLSIZE / 180.);
|
const Vec3d rot = (Vec3d(pos.x(), pos.y(), 0.) - m_mouse.drag.start_position_3D) * (PI * TRACKBALLSIZE / 180.);
|
||||||
|
#if ENABLE_AUTO_CONSTRAINED_CAMERA
|
||||||
|
if (wxGetApp().app_config->get("use_free_camera") == "1")
|
||||||
|
// Virtual track ball (similar to the 3DConnexion mouse).
|
||||||
|
m_camera.rotate_local_around_target(Vec3d(rot.y(), rot.x(), 0.));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Forces camera right vector to be parallel to XY plane in case it has been misaligned using the 3D mouse free rotation.
|
||||||
|
// It is cheaper to call this function right away instead of testing wxGetApp().plater()->get_mouse3d_controller().connected(),
|
||||||
|
// which checks an atomics (flushes CPU caches).
|
||||||
|
// See GH issue #3816.
|
||||||
|
m_camera.recover_from_free_camera();
|
||||||
|
m_camera.rotate_on_sphere(rot.x(), rot.y(), wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA);
|
||||||
|
}
|
||||||
|
#else
|
||||||
if (wxGetApp().plater()->get_mouse3d_controller().connected() || (wxGetApp().app_config->get("use_free_camera") == "1"))
|
if (wxGetApp().plater()->get_mouse3d_controller().connected() || (wxGetApp().app_config->get("use_free_camera") == "1"))
|
||||||
// Virtual track ball (similar to the 3DConnexion mouse).
|
// Virtual track ball (similar to the 3DConnexion mouse).
|
||||||
m_camera.rotate_local_around_target(Vec3d(rot.y(), rot.x(), 0.));
|
m_camera.rotate_local_around_target(Vec3d(rot.y(), rot.x(), 0.));
|
||||||
else
|
else
|
||||||
m_camera.rotate_on_sphere(rot.x(), rot.y(), wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA);
|
m_camera.rotate_on_sphere(rot.x(), rot.y(), wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA);
|
||||||
|
#endif // ENABLE_AUTO_CONSTRAINED_CAMERA
|
||||||
|
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
}
|
}
|
||||||
|
@ -3560,6 +3575,15 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
||||||
float z = 0.0f;
|
float z = 0.0f;
|
||||||
const Vec3d& cur_pos = _mouse_to_3d(pos, &z);
|
const Vec3d& cur_pos = _mouse_to_3d(pos, &z);
|
||||||
Vec3d orig = _mouse_to_3d(m_mouse.drag.start_position_2D, &z);
|
Vec3d orig = _mouse_to_3d(m_mouse.drag.start_position_2D, &z);
|
||||||
|
#if ENABLE_AUTO_CONSTRAINED_CAMERA
|
||||||
|
if (wxGetApp().app_config->get("use_free_camera") != "1")
|
||||||
|
// Forces camera right vector to be parallel to XY plane in case it has been misaligned using the 3D mouse free rotation.
|
||||||
|
// It is cheaper to call this function right away instead of testing wxGetApp().plater()->get_mouse3d_controller().connected(),
|
||||||
|
// which checks an atomics (flushes CPU caches).
|
||||||
|
// See GH issue #3816.
|
||||||
|
m_camera.recover_from_free_camera();
|
||||||
|
#endif // ENABLE_AUTO_CONSTRAINED_CAMERA
|
||||||
|
|
||||||
m_camera.set_target(m_camera.get_target() + orig - cur_pos);
|
m_camera.set_target(m_camera.get_target() + orig - cur_pos);
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
}
|
}
|
||||||
|
@ -4184,7 +4208,7 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, bool
|
||||||
if (!vol->is_modifier && !vol->is_wipe_tower && (!parts_only || (vol->composite_id.volume_id >= 0)))
|
if (!vol->is_modifier && !vol->is_wipe_tower && (!parts_only || (vol->composite_id.volume_id >= 0)))
|
||||||
{
|
{
|
||||||
if (!printable_only || is_visible(*vol))
|
if (!printable_only || is_visible(*vol))
|
||||||
visible_volumes.push_back(vol);
|
visible_volumes.emplace_back(vol);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4888,7 +4912,7 @@ void GLCanvas3D::_picking_pass() const
|
||||||
}
|
}
|
||||||
if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size()))
|
if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size()))
|
||||||
{
|
{
|
||||||
m_hover_volume_idxs.push_back(volume_id);
|
m_hover_volume_idxs.emplace_back(volume_id);
|
||||||
m_gizmos.set_hover_id(-1);
|
m_gizmos.set_hover_id(-1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -5132,7 +5156,7 @@ void GLCanvas3D::_render_overlays() const
|
||||||
if (sequential_print) {
|
if (sequential_print) {
|
||||||
for (ModelObject* model_object : m_model->objects)
|
for (ModelObject* model_object : m_model->objects)
|
||||||
for (ModelInstance* model_instance : model_object->instances) {
|
for (ModelInstance* model_instance : model_object->instances) {
|
||||||
sorted_instances.push_back(model_instance);
|
sorted_instances.emplace_back(model_instance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_labels.render(sorted_instances);
|
m_labels.render(sorted_instances);
|
||||||
|
@ -5594,29 +5618,26 @@ void GLCanvas3D::_load_print_toolpaths()
|
||||||
if ((skirt_height == 0) && (print->config().brim_width.value > 0))
|
if ((skirt_height == 0) && (print->config().brim_width.value > 0))
|
||||||
skirt_height = 1;
|
skirt_height = 1;
|
||||||
|
|
||||||
// get first skirt_height layers (maybe this should be moved to a PrintObject method?)
|
// Get first skirt_height layers.
|
||||||
const PrintObject* object0 = print->objects().front();
|
//FIXME This code is fishy. It may not work for multiple objects with different layering due to variable layer height feature.
|
||||||
|
// This is not critical as this is just an initial preview.
|
||||||
|
const PrintObject* highest_object = *std::max_element(print->objects().begin(), print->objects().end(), [](auto l, auto r){ return l->layers().size() < r->layers().size(); });
|
||||||
std::vector<float> print_zs;
|
std::vector<float> print_zs;
|
||||||
print_zs.reserve(skirt_height * 2);
|
print_zs.reserve(skirt_height * 2);
|
||||||
for (size_t i = 0; i < std::min(skirt_height, object0->layers().size()); ++i)
|
for (size_t i = 0; i < std::min(skirt_height, highest_object->layers().size()); ++ i)
|
||||||
{
|
print_zs.emplace_back(float(highest_object->layers()[i]->print_z));
|
||||||
print_zs.push_back(float(object0->layers()[i]->print_z));
|
// Only add skirt for the raft layers.
|
||||||
}
|
for (size_t i = 0; i < std::min(skirt_height, std::min(highest_object->slicing_parameters().raft_layers(), highest_object->support_layers().size())); ++ i)
|
||||||
//FIXME why there are support layers?
|
print_zs.emplace_back(float(highest_object->support_layers()[i]->print_z));
|
||||||
for (size_t i = 0; i < std::min(skirt_height, object0->support_layers().size()); ++i)
|
|
||||||
{
|
|
||||||
print_zs.push_back(float(object0->support_layers()[i]->print_z));
|
|
||||||
}
|
|
||||||
sort_remove_duplicates(print_zs);
|
sort_remove_duplicates(print_zs);
|
||||||
if (print_zs.size() > skirt_height)
|
skirt_height = std::min(skirt_height, print_zs.size());
|
||||||
print_zs.erase(print_zs.begin() + skirt_height, print_zs.end());
|
print_zs.erase(print_zs.begin() + skirt_height, print_zs.end());
|
||||||
|
|
||||||
|
|
||||||
GLVolume *volume = m_volumes.new_toolpath_volume(color, VERTEX_BUFFER_RESERVE_SIZE);
|
GLVolume *volume = m_volumes.new_toolpath_volume(color, VERTEX_BUFFER_RESERVE_SIZE);
|
||||||
for (size_t i = 0; i < skirt_height; ++i) {
|
for (size_t i = 0; i < skirt_height; ++ i) {
|
||||||
volume->print_zs.push_back(print_zs[i]);
|
volume->print_zs.emplace_back(print_zs[i]);
|
||||||
volume->offsets.push_back(volume->indexed_vertex_array.quad_indices.size());
|
volume->offsets.emplace_back(volume->indexed_vertex_array.quad_indices.size());
|
||||||
volume->offsets.push_back(volume->indexed_vertex_array.triangle_indices.size());
|
volume->offsets.emplace_back(volume->indexed_vertex_array.triangle_indices.size());
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
_3DScene::extrusionentity_to_verts(print->brim(), print_zs[i], Point(0, 0), *volume);
|
_3DScene::extrusionentity_to_verts(print->brim(), print_zs[i], Point(0, 0), *volume);
|
||||||
_3DScene::extrusionentity_to_verts(print->skirt(), print_zs[i], Point(0, 0), *volume);
|
_3DScene::extrusionentity_to_verts(print->skirt(), print_zs[i], Point(0, 0), *volume);
|
||||||
|
@ -5782,10 +5803,10 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c
|
||||||
}
|
}
|
||||||
if (ctxt.has_perimeters || ctxt.has_infill)
|
if (ctxt.has_perimeters || ctxt.has_infill)
|
||||||
for (const Layer *layer : print_object.layers())
|
for (const Layer *layer : print_object.layers())
|
||||||
ctxt.layers.push_back(layer);
|
ctxt.layers.emplace_back(layer);
|
||||||
if (ctxt.has_support)
|
if (ctxt.has_support)
|
||||||
for (const Layer *layer : print_object.support_layers())
|
for (const Layer *layer : print_object.support_layers())
|
||||||
ctxt.layers.push_back(layer);
|
ctxt.layers.emplace_back(layer);
|
||||||
std::sort(ctxt.layers.begin(), ctxt.layers.end(), [](const Layer *l1, const Layer *l2) { return l1->print_z < l2->print_z; });
|
std::sort(ctxt.layers.begin(), ctxt.layers.end(), [](const Layer *l1, const Layer *l2) { return l1->print_z < l2->print_z; });
|
||||||
|
|
||||||
// Maximum size of an allocation block: 32MB / sizeof(float)
|
// Maximum size of an allocation block: 32MB / sizeof(float)
|
||||||
|
@ -5854,9 +5875,9 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c
|
||||||
|
|
||||||
for (GLVolume *vol : vols)
|
for (GLVolume *vol : vols)
|
||||||
if (vol->print_zs.empty() || vol->print_zs.back() != layer->print_z) {
|
if (vol->print_zs.empty() || vol->print_zs.back() != layer->print_z) {
|
||||||
vol->print_zs.push_back(layer->print_z);
|
vol->print_zs.emplace_back(layer->print_z);
|
||||||
vol->offsets.push_back(vol->indexed_vertex_array.quad_indices.size());
|
vol->offsets.emplace_back(vol->indexed_vertex_array.quad_indices.size());
|
||||||
vol->offsets.push_back(vol->indexed_vertex_array.triangle_indices.size());
|
vol->offsets.emplace_back(vol->indexed_vertex_array.triangle_indices.size());
|
||||||
}
|
}
|
||||||
for (const PrintInstance &instance : *ctxt.shifted_copies) {
|
for (const PrintInstance &instance : *ctxt.shifted_copies) {
|
||||||
const Point © = instance.shift;
|
const Point © = instance.shift;
|
||||||
|
@ -6012,9 +6033,9 @@ void GLCanvas3D::_load_wipe_tower_toolpaths(const std::vector<std::string>& str_
|
||||||
for (size_t i = 0; i < vols.size(); ++i) {
|
for (size_t i = 0; i < vols.size(); ++i) {
|
||||||
GLVolume &vol = *vols[i];
|
GLVolume &vol = *vols[i];
|
||||||
if (vol.print_zs.empty() || vol.print_zs.back() != layer.front().print_z) {
|
if (vol.print_zs.empty() || vol.print_zs.back() != layer.front().print_z) {
|
||||||
vol.print_zs.push_back(layer.front().print_z);
|
vol.print_zs.emplace_back(layer.front().print_z);
|
||||||
vol.offsets.push_back(vol.indexed_vertex_array.quad_indices.size());
|
vol.offsets.emplace_back(vol.indexed_vertex_array.quad_indices.size());
|
||||||
vol.offsets.push_back(vol.indexed_vertex_array.triangle_indices.size());
|
vol.offsets.emplace_back(vol.indexed_vertex_array.triangle_indices.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const WipeTower::ToolChangeResult &extrusions : layer) {
|
for (const WipeTower::ToolChangeResult &extrusions : layer) {
|
||||||
|
@ -6227,9 +6248,9 @@ void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_dat
|
||||||
assert(it_filter != filters.end() && key.first == it_filter->first);
|
assert(it_filter != filters.end() && key.first == it_filter->first);
|
||||||
|
|
||||||
GLVolume& vol = *it_filter->second;
|
GLVolume& vol = *it_filter->second;
|
||||||
vol.print_zs.push_back(layer.z);
|
vol.print_zs.emplace_back(layer.z);
|
||||||
vol.offsets.push_back(vol.indexed_vertex_array.quad_indices.size());
|
vol.offsets.emplace_back(vol.indexed_vertex_array.quad_indices.size());
|
||||||
vol.offsets.push_back(vol.indexed_vertex_array.triangle_indices.size());
|
vol.offsets.emplace_back(vol.indexed_vertex_array.triangle_indices.size());
|
||||||
|
|
||||||
_3DScene::extrusionentity_to_verts(path.polyline, path.width, path.height, layer.z, vol);
|
_3DScene::extrusionentity_to_verts(path.polyline, path.width, path.height, layer.z, vol);
|
||||||
}
|
}
|
||||||
|
@ -6301,9 +6322,9 @@ inline void travel_paths_internal(
|
||||||
assert(it != by_type.end() && it->first == func_value(polyline));
|
assert(it != by_type.end() && it->first == func_value(polyline));
|
||||||
|
|
||||||
GLVolume& vol = *it->second;
|
GLVolume& vol = *it->second;
|
||||||
vol.print_zs.push_back(unscale<double>(polyline.polyline.bounding_box().min(2)));
|
vol.print_zs.emplace_back(unscale<double>(polyline.polyline.bounding_box().min(2)));
|
||||||
vol.offsets.push_back(vol.indexed_vertex_array.quad_indices.size());
|
vol.offsets.emplace_back(vol.indexed_vertex_array.quad_indices.size());
|
||||||
vol.offsets.push_back(vol.indexed_vertex_array.triangle_indices.size());
|
vol.offsets.emplace_back(vol.indexed_vertex_array.triangle_indices.size());
|
||||||
|
|
||||||
_3DScene::polyline3_to_verts(polyline.polyline, preview_data.travel.width, preview_data.travel.height, vol);
|
_3DScene::polyline3_to_verts(polyline.polyline, preview_data.travel.width, preview_data.travel.height, vol);
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
#include <boost/log/trivial.hpp>
|
#include <boost/log/trivial.hpp>
|
||||||
|
#include <boost/nowide/convert.hpp>
|
||||||
|
|
||||||
#include <wx/stdpaths.h>
|
#include <wx/stdpaths.h>
|
||||||
#include <wx/imagpng.h>
|
#include <wx/imagpng.h>
|
||||||
|
@ -50,6 +51,7 @@
|
||||||
|
|
||||||
#ifdef __WXMSW__
|
#ifdef __WXMSW__
|
||||||
#include <Shlobj.h>
|
#include <Shlobj.h>
|
||||||
|
#include <dbt.h>
|
||||||
#endif // __WXMSW__
|
#endif // __WXMSW__
|
||||||
|
|
||||||
#if ENABLE_THUMBNAIL_GENERATOR_DEBUG
|
#if ENABLE_THUMBNAIL_GENERATOR_DEBUG
|
||||||
|
@ -60,6 +62,7 @@
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
|
class MainFrame;
|
||||||
|
|
||||||
wxString file_wildcards(FileType file_type, const std::string &custom_extension)
|
wxString file_wildcards(FileType file_type, const std::string &custom_extension)
|
||||||
{
|
{
|
||||||
|
@ -96,9 +99,9 @@ wxString file_wildcards(FileType file_type, const std::string &custom_extension)
|
||||||
|
|
||||||
static std::string libslic3r_translate_callback(const char *s) { return wxGetTranslation(wxString(s, wxConvUTF8)).utf8_str().data(); }
|
static std::string libslic3r_translate_callback(const char *s) { return wxGetTranslation(wxString(s, wxConvUTF8)).utf8_str().data(); }
|
||||||
|
|
||||||
static void register_dpi_event()
|
|
||||||
{
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
static void register_win32_dpi_event()
|
||||||
|
{
|
||||||
enum { WM_DPICHANGED_ = 0x02e0 };
|
enum { WM_DPICHANGED_ = 0x02e0 };
|
||||||
|
|
||||||
wxWindow::MSWRegisterMessageHandler(WM_DPICHANGED_, [](wxWindow *win, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) {
|
wxWindow::MSWRegisterMessageHandler(WM_DPICHANGED_, [](wxWindow *win, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) {
|
||||||
|
@ -111,9 +114,52 @@ static void register_dpi_event()
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GUID GUID_DEVINTERFACE_HID = { 0x4D1E55B2, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 };
|
||||||
|
|
||||||
|
static void register_win32_device_notification_event()
|
||||||
|
{
|
||||||
|
enum { WM_DPICHANGED_ = 0x02e0 };
|
||||||
|
|
||||||
|
wxWindow::MSWRegisterMessageHandler(WM_DEVICECHANGE, [](wxWindow *win, WXUINT /* nMsg */, WXWPARAM wParam, WXLPARAM lParam) {
|
||||||
|
// Some messages are sent to top level windows by default, some messages are sent to only registered windows, and we explictely register on MainFrame only.
|
||||||
|
auto main_frame = dynamic_cast<MainFrame*>(win);
|
||||||
|
auto plater = (main_frame == nullptr) ? nullptr : main_frame->plater();
|
||||||
|
if (plater == nullptr)
|
||||||
|
// Maybe some other top level window like a dialog or maybe a pop-up menu?
|
||||||
|
return true;
|
||||||
|
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
|
||||||
|
switch (wParam) {
|
||||||
|
case DBT_DEVICEARRIVAL:
|
||||||
|
if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
|
||||||
|
plater->GetEventHandler()->AddPendingEvent(VolumeAttachedEvent(EVT_VOLUME_ATTACHED));
|
||||||
|
else if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) {
|
||||||
|
PDEV_BROADCAST_DEVICEINTERFACE lpdbi = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb;
|
||||||
|
// if (lpdbi->dbcc_classguid == GUID_DEVINTERFACE_VOLUME) {
|
||||||
|
// printf("DBT_DEVICEARRIVAL %d - Media has arrived: %ws\n", msg_count, lpdbi->dbcc_name);
|
||||||
|
if (lpdbi->dbcc_classguid == GUID_DEVINTERFACE_HID)
|
||||||
|
plater->GetEventHandler()->AddPendingEvent(HIDDeviceAttachedEvent(EVT_HID_DEVICE_ATTACHED, boost::nowide::narrow(lpdbi->dbcc_name)));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DBT_DEVICEREMOVECOMPLETE:
|
||||||
|
if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
|
||||||
|
plater->GetEventHandler()->AddPendingEvent(VolumeDetachedEvent(EVT_VOLUME_DETACHED));
|
||||||
|
else if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) {
|
||||||
|
PDEV_BROADCAST_DEVICEINTERFACE lpdbi = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb;
|
||||||
|
// if (lpdbi->dbcc_classguid == GUID_DEVINTERFACE_VOLUME)
|
||||||
|
// printf("DBT_DEVICEARRIVAL %d - Media was removed: %ws\n", msg_count, lpdbi->dbcc_name);
|
||||||
|
if (lpdbi->dbcc_classguid == GUID_DEVINTERFACE_HID)
|
||||||
|
plater->GetEventHandler()->AddPendingEvent(HIDDeviceDetachedEvent(EVT_HID_DEVICE_DETACHED, boost::nowide::narrow(lpdbi->dbcc_name)));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
#endif // WIN32
|
||||||
|
|
||||||
static void generic_exception_handle()
|
static void generic_exception_handle()
|
||||||
{
|
{
|
||||||
|
@ -248,7 +294,10 @@ bool GUI_App::on_init_inner()
|
||||||
show_error(nullptr, ex.what());
|
show_error(nullptr, ex.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
register_dpi_event();
|
#ifdef WIN32
|
||||||
|
register_win32_dpi_event();
|
||||||
|
register_win32_device_notification_event();
|
||||||
|
#endif // WIN32
|
||||||
|
|
||||||
// Let the libslic3r know the callback, which will translate messages on demand.
|
// Let the libslic3r know the callback, which will translate messages on demand.
|
||||||
Slic3r::I18N::set_translate_callback(libslic3r_translate_callback);
|
Slic3r::I18N::set_translate_callback(libslic3r_translate_callback);
|
||||||
|
|
|
@ -156,8 +156,11 @@ void ObjectLayers::create_layers_list()
|
||||||
const t_layer_height_range& range = layer.first;
|
const t_layer_height_range& range = layer.first;
|
||||||
auto del_btn = new PlusMinusButton(m_parent, m_bmp_delete, range);
|
auto del_btn = new PlusMinusButton(m_parent, m_bmp_delete, range);
|
||||||
del_btn->SetToolTip(_(L("Remove layer range")));
|
del_btn->SetToolTip(_(L("Remove layer range")));
|
||||||
|
|
||||||
auto add_btn = new PlusMinusButton(m_parent, m_bmp_add, range);
|
auto add_btn = new PlusMinusButton(m_parent, m_bmp_add, range);
|
||||||
add_btn->SetToolTip(_(L("Add layer range")));
|
wxString tooltip = wxGetApp().obj_list()->can_add_new_range_after_current(range);
|
||||||
|
add_btn->SetToolTip(tooltip.IsEmpty() ? _(L("Add layer range")) : tooltip);
|
||||||
|
add_btn->Enable(tooltip.IsEmpty());
|
||||||
|
|
||||||
auto sizer = create_layer(range, del_btn, add_btn);
|
auto sizer = create_layer(range, del_btn, add_btn);
|
||||||
sizer->Add(del_btn, 0, wxRIGHT | wxLEFT, em_unit(m_parent));
|
sizer->Add(del_btn, 0, wxRIGHT | wxLEFT, em_unit(m_parent));
|
||||||
|
|
|
@ -118,7 +118,7 @@ ObjectList::ObjectList(wxWindow* parent) :
|
||||||
// detect the current mouse position here, to pass it to list_manipulation() method
|
// detect the current mouse position here, to pass it to list_manipulation() method
|
||||||
// if we detect it later, the user may have moved the mouse pointer while calculations are performed, and this would mess-up the HitTest() call performed into list_manipulation()
|
// if we detect it later, the user may have moved the mouse pointer while calculations are performed, and this would mess-up the HitTest() call performed into list_manipulation()
|
||||||
// see: https://github.com/prusa3d/PrusaSlicer/issues/3802
|
// see: https://github.com/prusa3d/PrusaSlicer/issues/3802
|
||||||
const wxPoint mouse_pos = get_mouse_position_in_control();
|
const wxPoint mouse_pos = this->get_mouse_position_in_control();
|
||||||
|
|
||||||
#ifndef __APPLE__
|
#ifndef __APPLE__
|
||||||
// On Windows and Linux, forces a kill focus emulation on the object manipulator fields because this event handler is called
|
// On Windows and Linux, forces a kill focus emulation on the object manipulator fields because this event handler is called
|
||||||
|
@ -155,7 +155,7 @@ ObjectList::ObjectList(wxWindow* parent) :
|
||||||
// Workaround for entering the column editing mode on Windows. Simulate keyboard enter when another column of the active line is selected.
|
// Workaround for entering the column editing mode on Windows. Simulate keyboard enter when another column of the active line is selected.
|
||||||
wxDataViewItem item;
|
wxDataViewItem item;
|
||||||
wxDataViewColumn *col;
|
wxDataViewColumn *col;
|
||||||
this->HitTest(get_mouse_position_in_control(), item, col);
|
this->HitTest(this->get_mouse_position_in_control(), item, col);
|
||||||
new_selected_column = (col == nullptr) ? -1 : (int)col->GetModelColumn();
|
new_selected_column = (col == nullptr) ? -1 : (int)col->GetModelColumn();
|
||||||
if (new_selected_item == m_last_selected_item && m_last_selected_column != -1 && m_last_selected_column != new_selected_column) {
|
if (new_selected_item == m_last_selected_item && m_last_selected_column != -1 && m_last_selected_column != new_selected_column) {
|
||||||
// Mouse clicked on another column of the active row. Simulate keyboard enter to enter the editing mode of the current column.
|
// Mouse clicked on another column of the active row. Simulate keyboard enter to enter the editing mode of the current column.
|
||||||
|
@ -171,7 +171,7 @@ ObjectList::ObjectList(wxWindow* parent) :
|
||||||
|
|
||||||
selection_changed();
|
selection_changed();
|
||||||
#ifndef __WXMSW__
|
#ifndef __WXMSW__
|
||||||
set_tooltip_for_item(get_mouse_position_in_control());
|
set_tooltip_for_item(this->get_mouse_position_in_control());
|
||||||
#endif //__WXMSW__
|
#endif //__WXMSW__
|
||||||
|
|
||||||
#ifndef __WXOSX__
|
#ifndef __WXOSX__
|
||||||
|
@ -211,7 +211,7 @@ ObjectList::ObjectList(wxWindow* parent) :
|
||||||
|
|
||||||
#ifdef __WXMSW__
|
#ifdef __WXMSW__
|
||||||
GetMainWindow()->Bind(wxEVT_MOTION, [this](wxMouseEvent& event) {
|
GetMainWindow()->Bind(wxEVT_MOTION, [this](wxMouseEvent& event) {
|
||||||
set_tooltip_for_item(get_mouse_position_in_control());
|
set_tooltip_for_item(this->get_mouse_position_in_control());
|
||||||
event.Skip();
|
event.Skip();
|
||||||
});
|
});
|
||||||
#endif //__WXMSW__
|
#endif //__WXMSW__
|
||||||
|
@ -419,14 +419,6 @@ void ObjectList::set_tooltip_for_item(const wxPoint& pt)
|
||||||
GetMainWindow()->SetToolTip(tooltip);
|
GetMainWindow()->SetToolTip(tooltip);
|
||||||
}
|
}
|
||||||
|
|
||||||
wxPoint ObjectList::get_mouse_position_in_control()
|
|
||||||
{
|
|
||||||
const wxPoint& pt = wxGetMousePosition();
|
|
||||||
// wxWindow* win = GetMainWindow();
|
|
||||||
// wxPoint screen_pos = win->GetScreenPosition();
|
|
||||||
return wxPoint(pt.x - /*win->*/GetScreenPosition().x, pt.y - /*win->*/GetScreenPosition().y);
|
|
||||||
}
|
|
||||||
|
|
||||||
int ObjectList::get_selected_obj_idx() const
|
int ObjectList::get_selected_obj_idx() const
|
||||||
{
|
{
|
||||||
if (GetSelectedItemsCount() == 1)
|
if (GetSelectedItemsCount() == 1)
|
||||||
|
@ -792,13 +784,7 @@ void ObjectList::OnChar(wxKeyEvent& event)
|
||||||
void ObjectList::OnContextMenu(wxDataViewEvent& evt)
|
void ObjectList::OnContextMenu(wxDataViewEvent& evt)
|
||||||
{
|
{
|
||||||
// The mouse position returned by get_mouse_position_in_control() here is the one at the time the mouse button is released (mouse up event)
|
// The mouse position returned by get_mouse_position_in_control() here is the one at the time the mouse button is released (mouse up event)
|
||||||
wxPoint mouse_pos = get_mouse_position_in_control();
|
wxPoint mouse_pos = this->get_mouse_position_in_control();
|
||||||
|
|
||||||
// We check if the mouse down event was over the "Editing" column, if not, we change the mouse position so that the following call to list_simulation() does not show any context menu
|
|
||||||
// see: https://github.com/prusa3d/PrusaSlicer/issues/3802
|
|
||||||
wxDataViewColumn* column = evt.GetDataViewColumn();
|
|
||||||
if (column == nullptr || column->GetTitle() != _("Editing"))
|
|
||||||
mouse_pos.x = 0;
|
|
||||||
|
|
||||||
// Do not show the context menu if the user pressed the right mouse button on the 3D scene and released it on the objects list
|
// Do not show the context menu if the user pressed the right mouse button on the 3D scene and released it on the objects list
|
||||||
GLCanvas3D* canvas = wxGetApp().plater()->canvas3D();
|
GLCanvas3D* canvas = wxGetApp().plater()->canvas3D();
|
||||||
|
@ -811,6 +797,12 @@ void ObjectList::OnContextMenu(wxDataViewEvent& evt)
|
||||||
|
|
||||||
void ObjectList::list_manipulation(const wxPoint& mouse_pos, bool evt_context_menu/* = false*/)
|
void ObjectList::list_manipulation(const wxPoint& mouse_pos, bool evt_context_menu/* = false*/)
|
||||||
{
|
{
|
||||||
|
// Interesting fact: when mouse_pos.x < 0, HitTest(mouse_pos, item, col) returns item = null, but column = last column.
|
||||||
|
// So, when mouse was moved to scene immediately after clicking in ObjectList, in the scene will be shown context menu for the Editing column.
|
||||||
|
// see: https://github.com/prusa3d/PrusaSlicer/issues/3802
|
||||||
|
if (mouse_pos.x < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
wxDataViewItem item;
|
wxDataViewItem item;
|
||||||
wxDataViewColumn* col = nullptr;
|
wxDataViewColumn* col = nullptr;
|
||||||
HitTest(mouse_pos, item, col);
|
HitTest(mouse_pos, item, col);
|
||||||
|
@ -925,7 +917,7 @@ void ObjectList::extruder_editing()
|
||||||
|
|
||||||
const int column_width = GetColumn(colExtruder)->GetWidth() + wxSystemSettings::GetMetric(wxSYS_VSCROLL_X) + 5;
|
const int column_width = GetColumn(colExtruder)->GetWidth() + wxSystemSettings::GetMetric(wxSYS_VSCROLL_X) + 5;
|
||||||
|
|
||||||
wxPoint pos = get_mouse_position_in_control();
|
wxPoint pos = this->get_mouse_position_in_control();
|
||||||
wxSize size = wxSize(column_width, -1);
|
wxSize size = wxSize(column_width, -1);
|
||||||
pos.x = GetColumn(colName)->GetWidth() + GetColumn(colPrint)->GetWidth() + 5;
|
pos.x = GetColumn(colName)->GetWidth() + GetColumn(colPrint)->GetWidth() + 5;
|
||||||
pos.y -= GetTextExtent("m").y;
|
pos.y -= GetTextExtent("m").y;
|
||||||
|
@ -2880,13 +2872,13 @@ void ObjectList::del_layer_range(const t_layer_height_range& range)
|
||||||
static double get_min_layer_height(const int extruder_idx)
|
static double get_min_layer_height(const int extruder_idx)
|
||||||
{
|
{
|
||||||
const DynamicPrintConfig& config = wxGetApp().preset_bundle->printers.get_edited_preset().config;
|
const DynamicPrintConfig& config = wxGetApp().preset_bundle->printers.get_edited_preset().config;
|
||||||
return config.opt_float("min_layer_height", extruder_idx <= 0 ? 0 : extruder_idx-1);
|
return config.opt_float("min_layer_height", std::max(0, extruder_idx - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
static double get_max_layer_height(const int extruder_idx)
|
static double get_max_layer_height(const int extruder_idx)
|
||||||
{
|
{
|
||||||
const DynamicPrintConfig& config = wxGetApp().preset_bundle->printers.get_edited_preset().config;
|
const DynamicPrintConfig& config = wxGetApp().preset_bundle->printers.get_edited_preset().config;
|
||||||
int extruder_idx_zero_based = extruder_idx <= 0 ? 0 : extruder_idx-1;
|
int extruder_idx_zero_based = std::max(0, extruder_idx - 1);
|
||||||
double max_layer_height = config.opt_float("max_layer_height", extruder_idx_zero_based);
|
double max_layer_height = config.opt_float("max_layer_height", extruder_idx_zero_based);
|
||||||
|
|
||||||
// In case max_layer_height is set to zero, it should default to 75 % of nozzle diameter:
|
// In case max_layer_height is set to zero, it should default to 75 % of nozzle diameter:
|
||||||
|
@ -2896,9 +2888,11 @@ static double get_max_layer_height(const int extruder_idx)
|
||||||
return max_layer_height;
|
return max_layer_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// When editing this function, please synchronize the conditions with can_add_new_range_after_current().
|
||||||
void ObjectList::add_layer_range_after_current(const t_layer_height_range current_range)
|
void ObjectList::add_layer_range_after_current(const t_layer_height_range current_range)
|
||||||
{
|
{
|
||||||
const int obj_idx = get_selected_obj_idx();
|
const int obj_idx = get_selected_obj_idx();
|
||||||
|
assert(obj_idx >= 0);
|
||||||
if (obj_idx < 0)
|
if (obj_idx < 0)
|
||||||
// This should not happen.
|
// This should not happen.
|
||||||
return;
|
return;
|
||||||
|
@ -2932,12 +2926,18 @@ void ObjectList::add_layer_range_after_current(const t_layer_height_range curren
|
||||||
{
|
{
|
||||||
if (current_range.second == next_range.first)
|
if (current_range.second == next_range.first)
|
||||||
{
|
{
|
||||||
// Splitting the currnet layer heigth range to two.
|
// Splitting the next layer height range to two.
|
||||||
const auto old_config = ranges.at(next_range);
|
const auto old_config = ranges.at(next_range);
|
||||||
const coordf_t delta = (next_range.second - next_range.first);
|
const coordf_t delta = next_range.second - next_range.first;
|
||||||
if (delta >= get_min_layer_height(old_config.opt_int("extruder"))/*0.05f*/) {
|
// Layer height of the current layer.
|
||||||
const coordf_t midl_layer = next_range.first + 0.5 * delta;
|
const coordf_t old_min_layer_height = get_min_layer_height(old_config.opt_int("extruder"));
|
||||||
t_layer_height_range new_range = { midl_layer, next_range.second };
|
// Layer height of the layer to be inserted.
|
||||||
|
const coordf_t new_min_layer_height = get_min_layer_height(0);
|
||||||
|
if (delta >= old_min_layer_height + new_min_layer_height - EPSILON) {
|
||||||
|
const coordf_t middle_layer_z = (new_min_layer_height > 0.5 * delta) ?
|
||||||
|
next_range.second - new_min_layer_height :
|
||||||
|
next_range.first + std::max(old_min_layer_height, 0.5 * delta);
|
||||||
|
t_layer_height_range new_range = { middle_layer_z, next_range.second };
|
||||||
|
|
||||||
Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add Height Range")));
|
Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add Height Range")));
|
||||||
changed = true;
|
changed = true;
|
||||||
|
@ -2951,12 +2951,12 @@ void ObjectList::add_layer_range_after_current(const t_layer_height_range curren
|
||||||
ranges[new_range] = old_config;
|
ranges[new_range] = old_config;
|
||||||
add_layer_item(new_range, layers_item, layer_idx);
|
add_layer_item(new_range, layers_item, layer_idx);
|
||||||
|
|
||||||
new_range = { current_range.second, midl_layer };
|
new_range = { current_range.second, middle_layer_z };
|
||||||
ranges[new_range] = get_default_layer_config(obj_idx);
|
ranges[new_range] = get_default_layer_config(obj_idx);
|
||||||
add_layer_item(new_range, layers_item, layer_idx);
|
add_layer_item(new_range, layers_item, layer_idx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (next_range.first - current_range.second >= get_min_layer_height(0) - EPSILON)
|
||||||
{
|
{
|
||||||
// Filling in a gap between the current and a new layer height range with a new one.
|
// Filling in a gap between the current and a new layer height range with a new one.
|
||||||
take_snapshot(_(L("Add Height Range")));
|
take_snapshot(_(L("Add Height Range")));
|
||||||
|
@ -2978,6 +2978,49 @@ void ObjectList::add_layer_range_after_current(const t_layer_height_range curren
|
||||||
select_item(layers_item);
|
select_item(layers_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returning an empty string means that the layer could be added after the current layer.
|
||||||
|
// Otherwise an error tooltip is returned.
|
||||||
|
// When editing this function, please synchronize the conditions with add_layer_range_after_current().
|
||||||
|
wxString ObjectList::can_add_new_range_after_current(const t_layer_height_range current_range)
|
||||||
|
{
|
||||||
|
const int obj_idx = get_selected_obj_idx();
|
||||||
|
assert(obj_idx >= 0);
|
||||||
|
if (obj_idx < 0)
|
||||||
|
// This should not happen.
|
||||||
|
return "ObjectList assert";
|
||||||
|
|
||||||
|
t_layer_config_ranges& ranges = object(obj_idx)->layer_config_ranges;
|
||||||
|
auto it_range = ranges.find(current_range);
|
||||||
|
assert(it_range != ranges.end());
|
||||||
|
if (it_range == ranges.end())
|
||||||
|
// This shoudl not happen.
|
||||||
|
return "ObjectList assert";
|
||||||
|
|
||||||
|
auto it_next_range = it_range;
|
||||||
|
if (++ it_next_range == ranges.end())
|
||||||
|
// Adding a layer after the last layer is always possible.
|
||||||
|
return "";
|
||||||
|
|
||||||
|
if (const std::pair<coordf_t, coordf_t>& next_range = it_next_range->first; current_range.second <= next_range.first)
|
||||||
|
{
|
||||||
|
if (current_range.second == next_range.first) {
|
||||||
|
if (next_range.second - next_range.first < get_min_layer_height(it_next_range->second.opt_int("extruder")) + get_min_layer_height(0) - EPSILON)
|
||||||
|
return _(L("Cannot insert a new layer range after the current layer range.\n"
|
||||||
|
"The next layer range is too thin to be split to two\n"
|
||||||
|
"without violating the minimum layer height."));
|
||||||
|
} else if (next_range.first - current_range.second < get_min_layer_height(0) - EPSILON) {
|
||||||
|
return _(L("Cannot insert a new layer range between the current and the next layer range.\n"
|
||||||
|
"The gap between the current layer range and the next layer range\n"
|
||||||
|
"is thinner than the minimum layer height allowed."));
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
return _(L("Cannot insert a new layer range after the current layer range.\n"
|
||||||
|
"Current layer range overlaps with the next layer range."));
|
||||||
|
|
||||||
|
// All right, new layer height range could be inserted.
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
void ObjectList::add_layer_item(const t_layer_height_range& range,
|
void ObjectList::add_layer_item(const t_layer_height_range& range,
|
||||||
const wxDataViewItem layers_item,
|
const wxDataViewItem layers_item,
|
||||||
const int layer_idx /* = -1*/)
|
const int layer_idx /* = -1*/)
|
||||||
|
@ -3048,12 +3091,10 @@ bool ObjectList::edit_layer_range(const t_layer_height_range& range, const t_lay
|
||||||
add_layer_item(r.first, root_item);
|
add_layer_item(r.first, root_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dont_update_ui)
|
if (!dont_update_ui)
|
||||||
return true;
|
select_item(sel_type&itLayer ? m_objects_model->GetItemByLayerRange(obj_idx, new_range) : root_item);
|
||||||
|
|
||||||
select_item(sel_type&itLayer ? m_objects_model->GetItemByLayerRange(obj_idx, new_range) : root_item);
|
|
||||||
Expand(root_item);
|
Expand(root_item);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -284,7 +284,7 @@ public:
|
||||||
bool selected_instances_of_same_object();
|
bool selected_instances_of_same_object();
|
||||||
bool can_split_instances();
|
bool can_split_instances();
|
||||||
|
|
||||||
wxPoint get_mouse_position_in_control();
|
wxPoint get_mouse_position_in_control() const { return wxGetMousePosition() - this->GetScreenPosition(); }
|
||||||
wxBoxSizer* get_sizer() {return m_sizer;}
|
wxBoxSizer* get_sizer() {return m_sizer;}
|
||||||
int get_selected_obj_idx() const;
|
int get_selected_obj_idx() const;
|
||||||
DynamicPrintConfig& get_item_config(const wxDataViewItem& item) const;
|
DynamicPrintConfig& get_item_config(const wxDataViewItem& item) const;
|
||||||
|
@ -327,6 +327,7 @@ public:
|
||||||
// may have been postponed from the "kill focus" event of a text field, if the focus was lost for the "add layer" button.
|
// may have been postponed from the "kill focus" event of a text field, if the focus was lost for the "add layer" button.
|
||||||
// Rather providing the range by a value than by a reference, so that the memory referenced cannot be invalidated.
|
// Rather providing the range by a value than by a reference, so that the memory referenced cannot be invalidated.
|
||||||
void add_layer_range_after_current(const t_layer_height_range current_range);
|
void add_layer_range_after_current(const t_layer_height_range current_range);
|
||||||
|
wxString can_add_new_range_after_current( t_layer_height_range current_range);
|
||||||
void add_layer_item (const t_layer_height_range& range,
|
void add_layer_item (const t_layer_height_range& range,
|
||||||
const wxDataViewItem layers_item,
|
const wxDataViewItem layers_item,
|
||||||
const int layer_idx = -1);
|
const int layer_idx = -1);
|
||||||
|
|
|
@ -21,6 +21,12 @@
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
wxDEFINE_EVENT(EVT_HID_DEVICE_ATTACHED, HIDDeviceAttachedEvent);
|
||||||
|
wxDEFINE_EVENT(EVT_HID_DEVICE_DETACHED, HIDDeviceDetachedEvent);
|
||||||
|
wxDEFINE_EVENT(EVT_VOLUME_ATTACHED, VolumeAttachedEvent);
|
||||||
|
wxDEFINE_EVENT(EVT_VOLUME_DETACHED, VolumeDetachedEvent);
|
||||||
|
#endif // _WIN32
|
||||||
|
|
||||||
wxTopLevelWindow* find_toplevel_parent(wxWindow *window)
|
wxTopLevelWindow* find_toplevel_parent(wxWindow *window)
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
#include <wx/debug.h>
|
#include <wx/debug.h>
|
||||||
#include <wx/settings.h>
|
#include <wx/settings.h>
|
||||||
|
|
||||||
|
#include "Event.hpp"
|
||||||
|
|
||||||
class wxCheckBox;
|
class wxCheckBox;
|
||||||
class wxTopLevelWindow;
|
class wxTopLevelWindow;
|
||||||
class wxRect;
|
class wxRect;
|
||||||
|
@ -26,6 +28,19 @@ class wxRect;
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
// USB HID attach / detach events from Windows OS.
|
||||||
|
using HIDDeviceAttachedEvent = Event<std::string>;
|
||||||
|
using HIDDeviceDetachedEvent = Event<std::string>;
|
||||||
|
wxDECLARE_EVENT(EVT_HID_DEVICE_ATTACHED, HIDDeviceAttachedEvent);
|
||||||
|
wxDECLARE_EVENT(EVT_HID_DEVICE_DETACHED, HIDDeviceDetachedEvent);
|
||||||
|
|
||||||
|
// Disk aka Volume attach / detach events from Windows OS.
|
||||||
|
using VolumeAttachedEvent = SimpleEvent;
|
||||||
|
using VolumeDetachedEvent = SimpleEvent;
|
||||||
|
wxDECLARE_EVENT(EVT_VOLUME_ATTACHED, VolumeAttachedEvent);
|
||||||
|
wxDECLARE_EVENT(EVT_VOLUME_DETACHED, VolumeDetachedEvent);
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
wxTopLevelWindow* find_toplevel_parent(wxWindow *window);
|
wxTopLevelWindow* find_toplevel_parent(wxWindow *window);
|
||||||
|
|
||||||
|
|
|
@ -225,7 +225,7 @@ void GLGizmosManager::update_data()
|
||||||
set_scale(Vec3d::Ones());
|
set_scale(Vec3d::Ones());
|
||||||
set_rotation(Vec3d::Zero());
|
set_rotation(Vec3d::Zero());
|
||||||
set_flattening_data(selection.is_from_single_object() ? selection.get_model()->objects[selection.get_object_idx()] : nullptr);
|
set_flattening_data(selection.is_from_single_object() ? selection.get_model()->objects[selection.get_object_idx()] : nullptr);
|
||||||
set_sla_support_data(nullptr);
|
set_sla_support_data(selection.is_from_single_instance() ? selection.get_model()->objects[selection.get_object_idx()] : nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
#ifndef _
|
#ifndef _
|
||||||
#define _(s) Slic3r::GUI::I18N::translate((s))
|
#define _(s) Slic3r::GUI::I18N::translate((s))
|
||||||
|
#define _L(s) Slic3r::GUI::I18N::translate((s))
|
||||||
#define _utf8(s) Slic3r::GUI::I18N::translate_utf8((s))
|
#define _utf8(s) Slic3r::GUI::I18N::translate_utf8((s))
|
||||||
|
#define _u8L(s) Slic3r::GUI::I18N::translate_utf8((s))
|
||||||
#endif /* _ */
|
#endif /* _ */
|
||||||
|
|
||||||
#ifndef _CTX
|
#ifndef _CTX
|
||||||
#define _CTX(s, ctx) Slic3r::GUI::I18N::translate((s), (ctx))
|
#define _CTX(s, ctx) Slic3r::GUI::I18N::translate((s), (ctx))
|
||||||
#define _CTX_utf8(s, ctx) Slic3r::GUI::I18N::translate_utf8((s), (ctx))
|
#define _CTX_utf8(s, ctx) Slic3r::GUI::I18N::translate_utf8((s), (ctx))
|
||||||
#endif /* _ */
|
#endif /* _ */
|
||||||
|
|
||||||
|
|
|
@ -144,9 +144,7 @@ void KBShortcutsDialog::fill_shortcuts()
|
||||||
{ ctrl + "J", L("Print host upload queue") },
|
{ ctrl + "J", L("Print host upload queue") },
|
||||||
// View
|
// View
|
||||||
{ "0-6", L("Camera view") },
|
{ "0-6", L("Camera view") },
|
||||||
#if ENABLE_SHOW_SCENE_LABELS
|
|
||||||
{ "E", L("Show/Hide object/instance labels") },
|
{ "E", L("Show/Hide object/instance labels") },
|
||||||
#endif // ENABLE_SHOW_SCENE_LABELS
|
|
||||||
#if ENABLE_SLOPE_RENDERING
|
#if ENABLE_SLOPE_RENDERING
|
||||||
{ "D", L("Turn On/Off facets' slope rendering") },
|
{ "D", L("Turn On/Off facets' slope rendering") },
|
||||||
#endif // ENABLE_SLOPE_RENDERING
|
#endif // ENABLE_SLOPE_RENDERING
|
||||||
|
|
|
@ -31,6 +31,10 @@
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include "GUI_App.hpp"
|
#include "GUI_App.hpp"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <dbt.h>
|
||||||
|
#endif // _WIN32
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
|
@ -104,6 +108,31 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S
|
||||||
update_title();
|
update_title();
|
||||||
|
|
||||||
// declare events
|
// declare events
|
||||||
|
Bind(wxEVT_CREATE, [this](wxWindowCreateEvent& event) {
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
//static GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED };
|
||||||
|
//static GUID GUID_DEVINTERFACE_DISK = { 0x53f56307, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b };
|
||||||
|
//static GUID GUID_DEVINTERFACE_VOLUME = { 0x71a27cdd, 0x812a, 0x11d0, 0xbe, 0xc7, 0x08, 0x00, 0x2b, 0xe2, 0x09, 0x2f };
|
||||||
|
static GUID GUID_DEVINTERFACE_HID = { 0x4D1E55B2, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 };
|
||||||
|
|
||||||
|
// Register USB HID (Human Interface Devices) notifications to trigger the 3DConnexion enumeration.
|
||||||
|
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter = { 0 };
|
||||||
|
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
|
||||||
|
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
|
||||||
|
NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_HID;
|
||||||
|
m_hDeviceNotify = ::RegisterDeviceNotification(this->GetHWND(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
|
||||||
|
|
||||||
|
// or register for file handle change?
|
||||||
|
// DEV_BROADCAST_HANDLE NotificationFilter = { 0 };
|
||||||
|
// NotificationFilter.dbch_size = sizeof(DEV_BROADCAST_HANDLE);
|
||||||
|
// NotificationFilter.dbch_devicetype = DBT_DEVTYP_HANDLE;
|
||||||
|
#endif // _WIN32
|
||||||
|
|
||||||
|
// propagate event
|
||||||
|
event.Skip();
|
||||||
|
});
|
||||||
|
|
||||||
Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent& event) {
|
Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent& event) {
|
||||||
if (event.CanVeto() && !wxGetApp().check_unsaved_changes()) {
|
if (event.CanVeto() && !wxGetApp().check_unsaved_changes()) {
|
||||||
event.Veto();
|
event.Veto();
|
||||||
|
@ -131,6 +160,11 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S
|
||||||
// Called when closing the application and when switching the application language.
|
// Called when closing the application and when switching the application language.
|
||||||
void MainFrame::shutdown()
|
void MainFrame::shutdown()
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
::UnregisterDeviceNotification(HDEVNOTIFY(m_hDeviceNotify));
|
||||||
|
m_hDeviceNotify = nullptr;
|
||||||
|
#endif // _WIN32
|
||||||
|
|
||||||
if (m_plater)
|
if (m_plater)
|
||||||
m_plater->stop_jobs();
|
m_plater->stop_jobs();
|
||||||
|
|
||||||
|
|
|
@ -141,6 +141,10 @@ public:
|
||||||
wxNotebook* m_tabpanel { nullptr };
|
wxNotebook* m_tabpanel { nullptr };
|
||||||
wxProgressDialog* m_progress_dialog { nullptr };
|
wxProgressDialog* m_progress_dialog { nullptr };
|
||||||
std::shared_ptr<ProgressStatusBar> m_statusbar;
|
std::shared_ptr<ProgressStatusBar> m_statusbar;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
void* m_hDeviceNotify { nullptr };
|
||||||
|
#endif // _WIN32
|
||||||
};
|
};
|
||||||
|
|
||||||
} // GUI
|
} // GUI
|
||||||
|
|
|
@ -99,6 +99,25 @@ void Mouse3DController::State::append_button(unsigned int id, size_t /* input_qu
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
// Called by Win32 HID enumeration callback.
|
||||||
|
void Mouse3DController::device_attached(const std::string &device)
|
||||||
|
{
|
||||||
|
int vid = 0;
|
||||||
|
int pid = 0;
|
||||||
|
if (sscanf(device.c_str(), "\\\\?\\HID#VID_%x&PID_%x&", &vid, &pid) == 2) {
|
||||||
|
// BOOST_LOG_TRIVIAL(trace) << boost::format("Mouse3DController::device_attached(VID_%04xxPID_%04x)") % vid % pid;
|
||||||
|
// BOOST_LOG_TRIVIAL(trace) << "Mouse3DController::device_attached: " << device;
|
||||||
|
if (std::find(_3DCONNEXION_VENDORS.begin(), _3DCONNEXION_VENDORS.end(), vid) != _3DCONNEXION_VENDORS.end()) {
|
||||||
|
// Signal the worker thread to wake up and enumerate HID devices, if not connected at the moment.
|
||||||
|
// The message may come multiple times per each USB device. For example, some USB wireless dongles register as multiple HID sockets
|
||||||
|
// for multiple devices to connect to.
|
||||||
|
// Never mind, enumeration will be performed until connected.
|
||||||
|
m_wakeup = true;
|
||||||
|
m_stop_condition.notify_all();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Filter out mouse scroll events produced by the 3DConnexion driver.
|
// Filter out mouse scroll events produced by the 3DConnexion driver.
|
||||||
bool Mouse3DController::State::process_mouse_wheel()
|
bool Mouse3DController::State::process_mouse_wheel()
|
||||||
{
|
{
|
||||||
|
@ -388,9 +407,13 @@ void Mouse3DController::disconnected()
|
||||||
m_params_by_device[m_device_str] = m_params_ui;
|
m_params_by_device[m_device_str] = m_params_ui;
|
||||||
m_device_str.clear();
|
m_device_str.clear();
|
||||||
m_connected = false;
|
m_connected = false;
|
||||||
wxGetApp().plater()->get_camera().recover_from_free_camera();
|
wxGetApp().plater()->CallAfter([]() {
|
||||||
wxGetApp().plater()->set_current_canvas_as_dirty();
|
Plater *plater = wxGetApp().plater();
|
||||||
wxWakeUpIdle();
|
if (plater != nullptr) {
|
||||||
|
plater->get_camera().recover_from_free_camera();
|
||||||
|
plater->set_current_canvas_as_dirty();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -486,6 +509,11 @@ void Mouse3DController::run()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
// Enumerate once just after thread start.
|
||||||
|
m_wakeup = true;
|
||||||
|
#endif // _WIN32
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
{
|
{
|
||||||
tbb::mutex::scoped_lock lock(m_params_ui_mutex);
|
tbb::mutex::scoped_lock lock(m_params_ui_mutex);
|
||||||
|
@ -518,7 +546,13 @@ bool Mouse3DController::connect_device()
|
||||||
{
|
{
|
||||||
// Wait for 2 seconds, but cancellable by m_stop.
|
// Wait for 2 seconds, but cancellable by m_stop.
|
||||||
std::unique_lock<std::mutex> lock(m_stop_condition_mutex);
|
std::unique_lock<std::mutex> lock(m_stop_condition_mutex);
|
||||||
m_stop_condition.wait_for(lock, std::chrono::seconds(2), [this]{ return this->m_stop; });
|
#ifdef _WIN32
|
||||||
|
// Wait indifinetely for the stop signal.
|
||||||
|
m_stop_condition.wait(lock, [this]{ return m_stop || m_wakeup; });
|
||||||
|
m_wakeup = false;
|
||||||
|
#else
|
||||||
|
m_stop_condition.wait_for(lock, std::chrono::seconds(2), [this]{ return m_stop; });
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_stop)
|
if (m_stop)
|
||||||
|
@ -528,10 +562,14 @@ bool Mouse3DController::connect_device()
|
||||||
hid_device_info* devices = hid_enumerate(0, 0);
|
hid_device_info* devices = hid_enumerate(0, 0);
|
||||||
if (devices == nullptr)
|
if (devices == nullptr)
|
||||||
{
|
{
|
||||||
BOOST_LOG_TRIVIAL(error) << "Unable to enumerate HID devices";
|
BOOST_LOG_TRIVIAL(trace) << "Mouse3DController::connect_device() - no HID device enumerated.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
BOOST_LOG_TRIVIAL(trace) << "Mouse3DController::connect_device() - enumerating HID devices.";
|
||||||
|
#endif // _WIN32
|
||||||
|
|
||||||
// Searches for 1st connected 3Dconnexion device
|
// Searches for 1st connected 3Dconnexion device
|
||||||
struct DeviceData
|
struct DeviceData
|
||||||
{
|
{
|
||||||
|
@ -785,9 +823,17 @@ void Mouse3DController::disconnect_device()
|
||||||
}
|
}
|
||||||
m_device_str.clear();
|
m_device_str.clear();
|
||||||
m_connected = false;
|
m_connected = false;
|
||||||
wxGetApp().plater()->get_camera().recover_from_free_camera();
|
#ifdef _WIN32
|
||||||
wxGetApp().plater()->set_current_canvas_as_dirty();
|
// Enumerate once immediately after disconnect.
|
||||||
wxWakeUpIdle();
|
m_wakeup = true;
|
||||||
|
#endif // _WIN32
|
||||||
|
wxGetApp().plater()->CallAfter([]() {
|
||||||
|
Plater *plater = wxGetApp().plater();
|
||||||
|
if (plater != nullptr) {
|
||||||
|
plater->get_camera().recover_from_free_camera();
|
||||||
|
plater->set_current_canvas_as_dirty();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -148,6 +148,9 @@ class Mouse3DController
|
||||||
hid_device* m_device { nullptr };
|
hid_device* m_device { nullptr };
|
||||||
// Using m_stop_condition_mutex to synchronize m_stop.
|
// Using m_stop_condition_mutex to synchronize m_stop.
|
||||||
bool m_stop { false };
|
bool m_stop { false };
|
||||||
|
#ifdef _WIN32
|
||||||
|
std::atomic<bool> m_wakeup { false };
|
||||||
|
#endif /* _WIN32 */
|
||||||
// Mutex and condition variable for sleeping during the detection of 3DConnexion devices by polling while allowing
|
// Mutex and condition variable for sleeping during the detection of 3DConnexion devices by polling while allowing
|
||||||
// cancellation before the end of the polling interval.
|
// cancellation before the end of the polling interval.
|
||||||
std::mutex m_stop_condition_mutex;
|
std::mutex m_stop_condition_mutex;
|
||||||
|
@ -185,6 +188,9 @@ public:
|
||||||
#endif // __APPLE__
|
#endif // __APPLE__
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
// Called by Win32 HID enumeration callback.
|
||||||
|
void device_attached(const std::string &device);
|
||||||
|
|
||||||
// On Windows, the 3DConnexion driver sends out mouse wheel rotation events to an active application
|
// On Windows, the 3DConnexion driver sends out mouse wheel rotation events to an active application
|
||||||
// if the application does not register at the driver. This is a workaround to ignore these superfluous
|
// if the application does not register at the driver. This is a workaround to ignore these superfluous
|
||||||
// mouse wheel events.
|
// mouse wheel events.
|
||||||
|
|
|
@ -1936,7 +1936,7 @@ struct Plater::priv
|
||||||
GUI::show_error(this->q, msg);
|
GUI::show_error(this->q, msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void export_gcode(fs::path output_path, PrintHostJob upload_job);
|
void export_gcode(fs::path output_path, bool output_path_on_removable_media, PrintHostJob upload_job);
|
||||||
void reload_from_disk();
|
void reload_from_disk();
|
||||||
void reload_all_from_disk();
|
void reload_all_from_disk();
|
||||||
void fix_through_netfabb(const int obj_idx, const int vol_idx = -1);
|
void fix_through_netfabb(const int obj_idx, const int vol_idx = -1);
|
||||||
|
@ -2195,17 +2195,34 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
|
||||||
// Load the 3DConnexion device database.
|
// Load the 3DConnexion device database.
|
||||||
mouse3d_controller.load_config(*wxGetApp().app_config);
|
mouse3d_controller.load_config(*wxGetApp().app_config);
|
||||||
// Start the background thread to detect and connect to a HID device (Windows and Linux).
|
// Start the background thread to detect and connect to a HID device (Windows and Linux).
|
||||||
// Connect to a 3DConnextion driver (OSX).
|
// Connect to a 3DConnextion driver (OSX).
|
||||||
mouse3d_controller.init();
|
mouse3d_controller.init();
|
||||||
|
#ifdef _WIN32
|
||||||
|
// Register an USB HID (Human Interface Device) attach event. evt contains Win32 path to the USB device containing VID, PID and other info.
|
||||||
|
// This event wakes up the Mouse3DController's background thread to enumerate HID devices, if the VID of the callback event
|
||||||
|
// is one of the 3D Mouse vendors (3DConnexion or Logitech).
|
||||||
|
this->q->Bind(EVT_HID_DEVICE_ATTACHED, [this](HIDDeviceAttachedEvent &evt) {
|
||||||
|
mouse3d_controller.device_attached(evt.data);
|
||||||
|
});
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
this->q->Bind(EVT_REMOVABLE_DRIVE_EJECTED, [this](RemovableDriveEjectEvent &evt) {
|
this->q->Bind(EVT_REMOVABLE_DRIVE_EJECTED, [this](RemovableDriveEjectEvent &evt) {
|
||||||
this->show_action_buttons(this->ready_to_slice);
|
if (evt.data.second) {
|
||||||
Slic3r::GUI::show_info(this->q, (boost::format(_utf8(L("Unmounting successful. The device %s(%s) can now be safely removed from the computer.")))
|
this->show_action_buttons(this->ready_to_slice);
|
||||||
% evt.data.name % evt.data.path).str());
|
Slic3r::GUI::show_info(this->q, (boost::format(_utf8(L("Unmounting successful. The device %s(%s) can now be safely removed from the computer.")))
|
||||||
|
% evt.data.first.name % evt.data.first.path).str());
|
||||||
|
} else
|
||||||
|
Slic3r::GUI::show_info(this->q, (boost::format(_utf8(L("Ejecting of device %s(%s) has failed.")))
|
||||||
|
% evt.data.first.name % evt.data.first.path).str());
|
||||||
});
|
});
|
||||||
this->q->Bind(EVT_REMOVABLE_DRIVES_CHANGED, [this](RemovableDrivesChangedEvent &) { this->show_action_buttons(this->ready_to_slice); });
|
this->q->Bind(EVT_REMOVABLE_DRIVES_CHANGED, [this](RemovableDrivesChangedEvent &) { this->show_action_buttons(this->ready_to_slice); });
|
||||||
// Start the background thread and register this window as a target for update events.
|
// Start the background thread and register this window as a target for update events.
|
||||||
wxGetApp().removable_drive_manager()->init(this->q);
|
wxGetApp().removable_drive_manager()->init(this->q);
|
||||||
|
#ifdef _WIN32
|
||||||
|
// Trigger enumeration of removable media on Win32 notification.
|
||||||
|
this->q->Bind(EVT_VOLUME_ATTACHED, [this](VolumeAttachedEvent &evt) { wxGetApp().removable_drive_manager()->volumes_changed(); });
|
||||||
|
this->q->Bind(EVT_VOLUME_DETACHED, [this](VolumeDetachedEvent &evt) { wxGetApp().removable_drive_manager()->volumes_changed(); });
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
// Initialize the Undo / Redo stack with a first snapshot.
|
// Initialize the Undo / Redo stack with a first snapshot.
|
||||||
this->take_snapshot(_(L("New Project")));
|
this->take_snapshot(_(L("New Project")));
|
||||||
|
@ -2275,13 +2292,6 @@ void Plater::priv::reset_all_gizmos()
|
||||||
// Update the UI based on the current preferences.
|
// Update the UI based on the current preferences.
|
||||||
void Plater::priv::update_ui_from_settings()
|
void Plater::priv::update_ui_from_settings()
|
||||||
{
|
{
|
||||||
// TODO: (?)
|
|
||||||
// my ($self) = @_;
|
|
||||||
// if (defined($self->{btn_reslice}) && $self->{buttons_sizer}->IsShown($self->{btn_reslice}) != (! wxTheApp->{app_config}->get("background_processing"))) {
|
|
||||||
// $self->{buttons_sizer}->Show($self->{btn_reslice}, ! wxTheApp->{app_config}->get("background_processing"));
|
|
||||||
// $self->{buttons_sizer}->Layout;
|
|
||||||
// }
|
|
||||||
|
|
||||||
camera.set_type(wxGetApp().app_config->get("use_perspective_camera"));
|
camera.set_type(wxGetApp().app_config->get("use_perspective_camera"));
|
||||||
if (wxGetApp().app_config->get("use_free_camera") != "1")
|
if (wxGetApp().app_config->get("use_free_camera") != "1")
|
||||||
camera.recover_from_free_camera();
|
camera.recover_from_free_camera();
|
||||||
|
@ -2498,7 +2508,7 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
|
||||||
selection.add_object((unsigned int)idx, false);
|
selection.add_object((unsigned int)idx, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (view3D->get_canvas3d()->get_gizmos_manager().is_running())
|
if (view3D->get_canvas3d()->get_gizmos_manager().is_enabled())
|
||||||
// this is required because the selected object changed and the flatten on face an sla support gizmos need to be updated accordingly
|
// this is required because the selected object changed and the flatten on face an sla support gizmos need to be updated accordingly
|
||||||
view3D->get_canvas3d()->update_gizmos_on_off_state();
|
view3D->get_canvas3d()->update_gizmos_on_off_state();
|
||||||
}
|
}
|
||||||
|
@ -3223,7 +3233,7 @@ bool Plater::priv::restart_background_process(unsigned int state)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Plater::priv::export_gcode(fs::path output_path, PrintHostJob upload_job)
|
void Plater::priv::export_gcode(fs::path output_path, bool output_path_on_removable_media, PrintHostJob upload_job)
|
||||||
{
|
{
|
||||||
wxCHECK_RET(!(output_path.empty() && upload_job.empty()), "export_gcode: output_path and upload_job empty");
|
wxCHECK_RET(!(output_path.empty() && upload_job.empty()), "export_gcode: output_path and upload_job empty");
|
||||||
|
|
||||||
|
@ -3244,7 +3254,7 @@ void Plater::priv::export_gcode(fs::path output_path, PrintHostJob upload_job)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (! output_path.empty()) {
|
if (! output_path.empty()) {
|
||||||
background_process.schedule_export(output_path.string());
|
background_process.schedule_export(output_path.string(), output_path_on_removable_media);
|
||||||
} else {
|
} else {
|
||||||
background_process.schedule_upload(std::move(upload_job));
|
background_process.schedule_upload(std::move(upload_job));
|
||||||
}
|
}
|
||||||
|
@ -3726,7 +3736,12 @@ void Plater::priv::on_process_completed(wxCommandEvent &evt)
|
||||||
wxString message = evt.GetString();
|
wxString message = evt.GetString();
|
||||||
if (message.IsEmpty())
|
if (message.IsEmpty())
|
||||||
message = _(L("Export failed"));
|
message = _(L("Export failed"));
|
||||||
show_error(q, message);
|
if (q->m_tracking_popup_menu)
|
||||||
|
// We don't want to pop-up a message box when tracking a pop-up menu.
|
||||||
|
// We postpone the error message instead.
|
||||||
|
q->m_tracking_popup_menu_error_message = message;
|
||||||
|
else
|
||||||
|
show_error(q, message);
|
||||||
this->statusbar()->set_status_text(message);
|
this->statusbar()->set_status_text(message);
|
||||||
}
|
}
|
||||||
if (canceled)
|
if (canceled)
|
||||||
|
@ -4915,8 +4930,8 @@ void Plater::export_gcode(bool prefer_removable)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! output_path.empty()) {
|
if (! output_path.empty()) {
|
||||||
p->export_gcode(output_path, PrintHostJob());
|
|
||||||
bool path_on_removable_media = removable_drive_manager.set_and_verify_last_save_path(output_path.string());
|
bool path_on_removable_media = removable_drive_manager.set_and_verify_last_save_path(output_path.string());
|
||||||
|
p->export_gcode(output_path, path_on_removable_media, PrintHostJob());
|
||||||
// Storing a path to AppConfig either as path to removable media or a path to internal media.
|
// Storing a path to AppConfig either as path to removable media or a path to internal media.
|
||||||
// is_path_on_removable_drive() is called with the "true" parameter to update its internal database as the user may have shuffled the external drives
|
// is_path_on_removable_drive() is called with the "true" parameter to update its internal database as the user may have shuffled the external drives
|
||||||
// while the dialog was open.
|
// while the dialog was open.
|
||||||
|
@ -5239,7 +5254,7 @@ void Plater::send_gcode()
|
||||||
upload_job.upload_data.upload_path = dlg.filename();
|
upload_job.upload_data.upload_path = dlg.filename();
|
||||||
upload_job.upload_data.start_print = dlg.start_print();
|
upload_job.upload_data.start_print = dlg.start_print();
|
||||||
|
|
||||||
p->export_gcode(fs::path(), std::move(upload_job));
|
p->export_gcode(fs::path(), false, std::move(upload_job));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5615,7 +5630,7 @@ void Plater::schedule_background_process(bool schedule/* = true*/)
|
||||||
this->p->suppressed_backround_processing_update = false;
|
this->p->suppressed_backround_processing_update = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Plater::is_background_process_running() const
|
bool Plater::is_background_process_update_scheduled() const
|
||||||
{
|
{
|
||||||
return this->p->background_process_timer.IsRunning();
|
return this->p->background_process_timer.IsRunning();
|
||||||
}
|
}
|
||||||
|
@ -5737,15 +5752,34 @@ const UndoRedo::Stack& Plater::undo_redo_stack_main() const { return p->undo_red
|
||||||
void Plater::enter_gizmos_stack() { p->enter_gizmos_stack(); }
|
void Plater::enter_gizmos_stack() { p->enter_gizmos_stack(); }
|
||||||
void Plater::leave_gizmos_stack() { p->leave_gizmos_stack(); }
|
void Plater::leave_gizmos_stack() { p->leave_gizmos_stack(); }
|
||||||
|
|
||||||
SuppressBackgroundProcessingUpdate::SuppressBackgroundProcessingUpdate() :
|
// Wrapper around wxWindow::PopupMenu to suppress error messages popping out while tracking the popup menu.
|
||||||
m_was_running(wxGetApp().plater()->is_background_process_running())
|
bool Plater::PopupMenu(wxMenu *menu, const wxPoint& pos)
|
||||||
{
|
{
|
||||||
wxGetApp().plater()->suppress_background_process(m_was_running);
|
// Don't want to wake up and trigger reslicing while tracking the pop-up menu.
|
||||||
|
SuppressBackgroundProcessingUpdate sbpu;
|
||||||
|
// When tracking a pop-up menu, postpone error messages from the slicing result.
|
||||||
|
m_tracking_popup_menu = true;
|
||||||
|
bool out = this->wxPanel::PopupMenu(menu, pos);
|
||||||
|
m_tracking_popup_menu = false;
|
||||||
|
if (! m_tracking_popup_menu_error_message.empty()) {
|
||||||
|
// Don't know whether the CallAfter is necessary, but it should not hurt.
|
||||||
|
// The menus likely sends out some commands, so we may be safer if the dialog is shown after the menu command is processed.
|
||||||
|
wxString message = std::move(m_tracking_popup_menu_error_message);
|
||||||
|
wxTheApp->CallAfter([message, this]() { show_error(this, message); });
|
||||||
|
m_tracking_popup_menu_error_message.clear();
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
SuppressBackgroundProcessingUpdate::SuppressBackgroundProcessingUpdate() :
|
||||||
|
m_was_scheduled(wxGetApp().plater()->is_background_process_update_scheduled())
|
||||||
|
{
|
||||||
|
wxGetApp().plater()->suppress_background_process(m_was_scheduled);
|
||||||
}
|
}
|
||||||
|
|
||||||
SuppressBackgroundProcessingUpdate::~SuppressBackgroundProcessingUpdate()
|
SuppressBackgroundProcessingUpdate::~SuppressBackgroundProcessingUpdate()
|
||||||
{
|
{
|
||||||
wxGetApp().plater()->schedule_background_process(m_was_running);
|
wxGetApp().plater()->schedule_background_process(m_was_scheduled);
|
||||||
}
|
}
|
||||||
|
|
||||||
}} // namespace Slic3r::GUI
|
}} // namespace Slic3r::GUI
|
||||||
|
|
|
@ -215,7 +215,7 @@ public:
|
||||||
void changed_object(int obj_idx);
|
void changed_object(int obj_idx);
|
||||||
void changed_objects(const std::vector<size_t>& object_idxs);
|
void changed_objects(const std::vector<size_t>& object_idxs);
|
||||||
void schedule_background_process(bool schedule = true);
|
void schedule_background_process(bool schedule = true);
|
||||||
bool is_background_process_running() const;
|
bool is_background_process_update_scheduled() const;
|
||||||
void suppress_background_process(const bool stop_background_process) ;
|
void suppress_background_process(const bool stop_background_process) ;
|
||||||
void fix_through_netfabb(const int obj_idx, const int vol_idx = -1);
|
void fix_through_netfabb(const int obj_idx, const int vol_idx = -1);
|
||||||
void send_gcode();
|
void send_gcode();
|
||||||
|
@ -326,10 +326,20 @@ public:
|
||||||
Plater *m_plater;
|
Plater *m_plater;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Wrapper around wxWindow::PopupMenu to suppress error messages popping out while tracking the popup menu.
|
||||||
|
bool PopupMenu(wxMenu *menu, const wxPoint& pos = wxDefaultPosition);
|
||||||
|
bool PopupMenu(wxMenu *menu, int x, int y) { return this->PopupMenu(menu, wxPoint(x, y)); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct priv;
|
struct priv;
|
||||||
std::unique_ptr<priv> p;
|
std::unique_ptr<priv> p;
|
||||||
|
|
||||||
|
// Set true during PopupMenu() tracking to suppress immediate error message boxes.
|
||||||
|
// The error messages are collected to m_tracking_popup_menu_error_message instead and these error messages
|
||||||
|
// are shown after the pop-up dialog closes.
|
||||||
|
bool m_tracking_popup_menu = false;
|
||||||
|
wxString m_tracking_popup_menu_error_message;
|
||||||
|
|
||||||
void suppress_snapshots();
|
void suppress_snapshots();
|
||||||
void allow_snapshots();
|
void allow_snapshots();
|
||||||
|
|
||||||
|
@ -342,7 +352,7 @@ public:
|
||||||
SuppressBackgroundProcessingUpdate();
|
SuppressBackgroundProcessingUpdate();
|
||||||
~SuppressBackgroundProcessingUpdate();
|
~SuppressBackgroundProcessingUpdate();
|
||||||
private:
|
private:
|
||||||
bool m_was_running;
|
bool m_was_scheduled;
|
||||||
};
|
};
|
||||||
|
|
||||||
}}
|
}}
|
||||||
|
|
|
@ -381,7 +381,7 @@ void Preset::set_visible_from_appconfig(const AppConfig &app_config)
|
||||||
return;
|
return;
|
||||||
is_visible = app_config.get_variant(vendor->id, model, variant);
|
is_visible = app_config.get_variant(vendor->id, model, variant);
|
||||||
} else if (type == TYPE_FILAMENT || type == TYPE_SLA_MATERIAL) {
|
} else if (type == TYPE_FILAMENT || type == TYPE_SLA_MATERIAL) {
|
||||||
const char *section_name = (type == TYPE_FILAMENT) ? "filaments" : "sla_materials";
|
const std::string §ion_name = (type == TYPE_FILAMENT) ? AppConfig::SECTION_FILAMENTS : AppConfig::SECTION_MATERIALS;
|
||||||
if (app_config.has_section(section_name)) {
|
if (app_config.has_section(section_name)) {
|
||||||
// Check whether this profile is marked as "installed" in PrusaSlicer.ini,
|
// Check whether this profile is marked as "installed" in PrusaSlicer.ini,
|
||||||
// or whether a profile is marked as "installed", which this profile may have been renamed from.
|
// or whether a profile is marked as "installed", which this profile may have been renamed from.
|
||||||
|
@ -413,7 +413,7 @@ const std::vector<std::string>& Preset::print_options()
|
||||||
"perimeter_speed", "small_perimeter_speed", "external_perimeter_speed", "infill_speed", "solid_infill_speed",
|
"perimeter_speed", "small_perimeter_speed", "external_perimeter_speed", "infill_speed", "solid_infill_speed",
|
||||||
"top_solid_infill_speed", "support_material_speed", "support_material_xy_spacing", "support_material_interface_speed",
|
"top_solid_infill_speed", "support_material_speed", "support_material_xy_spacing", "support_material_interface_speed",
|
||||||
"bridge_speed", "gap_fill_speed", "travel_speed", "first_layer_speed", "perimeter_acceleration", "infill_acceleration",
|
"bridge_speed", "gap_fill_speed", "travel_speed", "first_layer_speed", "perimeter_acceleration", "infill_acceleration",
|
||||||
"bridge_acceleration", "first_layer_acceleration", "default_acceleration", "skirts", "skirt_distance", "skirt_height",
|
"bridge_acceleration", "first_layer_acceleration", "default_acceleration", "skirts", "skirt_distance", "skirt_height", "draft_shield",
|
||||||
"min_skirt_length", "brim_width", "support_material", "support_material_auto", "support_material_threshold", "support_material_enforce_layers",
|
"min_skirt_length", "brim_width", "support_material", "support_material_auto", "support_material_threshold", "support_material_enforce_layers",
|
||||||
"raft_layers", "support_material_pattern", "support_material_with_sheath", "support_material_spacing",
|
"raft_layers", "support_material_pattern", "support_material_with_sheath", "support_material_spacing",
|
||||||
"support_material_synchronize_layers", "support_material_angle", "support_material_interface_layers",
|
"support_material_synchronize_layers", "support_material_angle", "support_material_interface_layers",
|
||||||
|
@ -1032,6 +1032,14 @@ const std::string& PresetCollection::get_preset_name_by_alias(const std::string&
|
||||||
return alias;
|
return alias;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::string* PresetCollection::get_preset_name_renamed(const std::string &old_name) const
|
||||||
|
{
|
||||||
|
auto it_renamed = m_map_system_profile_renamed.find(old_name);
|
||||||
|
if (it_renamed != m_map_system_profile_renamed.end())
|
||||||
|
return &it_renamed->second;
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
const std::string& PresetCollection::get_suffix_modified() {
|
const std::string& PresetCollection::get_suffix_modified() {
|
||||||
return g_suffix_modified;
|
return g_suffix_modified;
|
||||||
}
|
}
|
||||||
|
|
|
@ -361,7 +361,8 @@ public:
|
||||||
PresetWithVendorProfile get_preset_with_vendor_profile(const Preset &preset) const;
|
PresetWithVendorProfile get_preset_with_vendor_profile(const Preset &preset) const;
|
||||||
PresetWithVendorProfile get_edited_preset_with_vendor_profile() const { return this->get_preset_with_vendor_profile(this->get_edited_preset()); }
|
PresetWithVendorProfile get_edited_preset_with_vendor_profile() const { return this->get_preset_with_vendor_profile(this->get_edited_preset()); }
|
||||||
|
|
||||||
const std::string& get_preset_name_by_alias(const std::string& alias) const;
|
const std::string& get_preset_name_by_alias(const std::string& alias) const;
|
||||||
|
const std::string* get_preset_name_renamed(const std::string &old_name) const;
|
||||||
|
|
||||||
// used to update preset_choice from Tab
|
// used to update preset_choice from Tab
|
||||||
const std::deque<Preset>& get_presets() const { return m_presets; }
|
const std::deque<Preset>& get_presets() const { return m_presets; }
|
||||||
|
|
|
@ -289,17 +289,7 @@ std::string PresetBundle::load_system_presets()
|
||||||
this->reset(false);
|
this->reset(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
this->prints .update_map_system_profile_renamed();
|
this->update_system_maps();
|
||||||
this->sla_prints .update_map_system_profile_renamed();
|
|
||||||
this->filaments .update_map_system_profile_renamed();
|
|
||||||
this->sla_materials.update_map_system_profile_renamed();
|
|
||||||
this->printers .update_map_system_profile_renamed();
|
|
||||||
|
|
||||||
this->prints .update_map_alias_to_profile_name();
|
|
||||||
this->sla_prints .update_map_alias_to_profile_name();
|
|
||||||
this->filaments .update_map_alias_to_profile_name();
|
|
||||||
this->sla_materials.update_map_alias_to_profile_name();
|
|
||||||
|
|
||||||
return errors_cummulative;
|
return errors_cummulative;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -324,6 +314,20 @@ std::vector<std::string> PresetBundle::merge_presets(PresetBundle &&other)
|
||||||
return duplicate_prints;
|
return duplicate_prints;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PresetBundle::update_system_maps()
|
||||||
|
{
|
||||||
|
this->prints .update_map_system_profile_renamed();
|
||||||
|
this->sla_prints .update_map_system_profile_renamed();
|
||||||
|
this->filaments .update_map_system_profile_renamed();
|
||||||
|
this->sla_materials.update_map_system_profile_renamed();
|
||||||
|
this->printers .update_map_system_profile_renamed();
|
||||||
|
|
||||||
|
this->prints .update_map_alias_to_profile_name();
|
||||||
|
this->sla_prints .update_map_alias_to_profile_name();
|
||||||
|
this->filaments .update_map_alias_to_profile_name();
|
||||||
|
this->sla_materials.update_map_alias_to_profile_name();
|
||||||
|
}
|
||||||
|
|
||||||
static inline std::string remove_ini_suffix(const std::string &name)
|
static inline std::string remove_ini_suffix(const std::string &name)
|
||||||
{
|
{
|
||||||
std::string out = name;
|
std::string out = name;
|
||||||
|
@ -337,9 +341,9 @@ static inline std::string remove_ini_suffix(const std::string &name)
|
||||||
// If the "vendor" section is missing, enable all models and variants of the particular vendor.
|
// If the "vendor" section is missing, enable all models and variants of the particular vendor.
|
||||||
void PresetBundle::load_installed_printers(const AppConfig &config)
|
void PresetBundle::load_installed_printers(const AppConfig &config)
|
||||||
{
|
{
|
||||||
for (auto &preset : printers) {
|
this->update_system_maps();
|
||||||
|
for (auto &preset : printers)
|
||||||
preset.set_visible_from_appconfig(config);
|
preset.set_visible_from_appconfig(config);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& PresetBundle::get_preset_name_by_alias( const Preset::Type& preset_type, const std::string& alias) const
|
const std::string& PresetBundle::get_preset_name_by_alias( const Preset::Type& preset_type, const std::string& alias) const
|
||||||
|
@ -367,7 +371,7 @@ void PresetBundle::load_installed_filaments(AppConfig &config)
|
||||||
if (printer.is_visible && printer.printer_technology() == ptFFF) {
|
if (printer.is_visible && printer.printer_technology() == ptFFF) {
|
||||||
const PresetWithVendorProfile printer_with_vendor_profile = printers.get_preset_with_vendor_profile(printer);
|
const PresetWithVendorProfile printer_with_vendor_profile = printers.get_preset_with_vendor_profile(printer);
|
||||||
for (const Preset &filament : filaments)
|
for (const Preset &filament : filaments)
|
||||||
if (is_compatible_with_printer(filaments.get_preset_with_vendor_profile(filament), printer_with_vendor_profile))
|
if (filament.is_system && is_compatible_with_printer(filaments.get_preset_with_vendor_profile(filament), printer_with_vendor_profile))
|
||||||
compatible_filaments.insert(&filament);
|
compatible_filaments.insert(&filament);
|
||||||
}
|
}
|
||||||
// and mark these filaments as installed, therefore this code will not be executed at the next start of the application.
|
// and mark these filaments as installed, therefore this code will not be executed at the next start of the application.
|
||||||
|
@ -390,7 +394,7 @@ void PresetBundle::load_installed_sla_materials(AppConfig &config)
|
||||||
if (printer.is_visible && printer.printer_technology() == ptSLA) {
|
if (printer.is_visible && printer.printer_technology() == ptSLA) {
|
||||||
const PresetWithVendorProfile printer_with_vendor_profile = printers.get_preset_with_vendor_profile(printer);
|
const PresetWithVendorProfile printer_with_vendor_profile = printers.get_preset_with_vendor_profile(printer);
|
||||||
for (const Preset &material : sla_materials)
|
for (const Preset &material : sla_materials)
|
||||||
if (is_compatible_with_printer(sla_materials.get_preset_with_vendor_profile(material), printer_with_vendor_profile))
|
if (material.is_system && is_compatible_with_printer(sla_materials.get_preset_with_vendor_profile(material), printer_with_vendor_profile))
|
||||||
comp_sla_materials.insert(&material);
|
comp_sla_materials.insert(&material);
|
||||||
}
|
}
|
||||||
// and mark these SLA materials as installed, therefore this code will not be executed at the next start of the application.
|
// and mark these SLA materials as installed, therefore this code will not be executed at the next start of the application.
|
||||||
|
@ -1069,7 +1073,11 @@ static void flatten_configbundle_hierarchy(boost::property_tree::ptree &tree, co
|
||||||
// Iterate in a reverse order, so the last change will be placed first in merged.
|
// Iterate in a reverse order, so the last change will be placed first in merged.
|
||||||
for (auto it_inherits = prst->inherits.rbegin(); it_inherits != prst->inherits.rend(); ++ it_inherits)
|
for (auto it_inherits = prst->inherits.rbegin(); it_inherits != prst->inherits.rend(); ++ it_inherits)
|
||||||
for (auto it = (*it_inherits)->node->begin(); it != (*it_inherits)->node->end(); ++ it)
|
for (auto it = (*it_inherits)->node->begin(); it != (*it_inherits)->node->end(); ++ it)
|
||||||
if (prst->node->find(it->first) == prst->node->not_found())
|
if (it->first == "renamed_from") {
|
||||||
|
// Don't inherit "renamed_from" flag, it does not make sense. The "renamed_from" flag only makes sense for a concrete preset.
|
||||||
|
if (boost::starts_with((*it_inherits)->name, "*"))
|
||||||
|
BOOST_LOG_TRIVIAL(error) << boost::format("Nonpublic intermediate preset %1% contains a \"renamed_from\" field, which is ignored") % (*it_inherits)->name;
|
||||||
|
} else if (prst->node->find(it->first) == prst->node->not_found())
|
||||||
prst->node->add_child(it->first, it->second);
|
prst->node->add_child(it->first, it->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,8 @@ public:
|
||||||
PresetCollection sla_prints;
|
PresetCollection sla_prints;
|
||||||
PresetCollection filaments;
|
PresetCollection filaments;
|
||||||
PresetCollection sla_materials;
|
PresetCollection sla_materials;
|
||||||
|
PresetCollection& materials(PrinterTechnology pt) { return pt == ptFFF ? this->filaments : this->sla_materials; }
|
||||||
|
const PresetCollection& materials(PrinterTechnology pt) const { return pt == ptFFF ? this->filaments : this->sla_materials; }
|
||||||
PrinterPresetCollection printers;
|
PrinterPresetCollection printers;
|
||||||
// Filament preset names for a multi-extruder or multi-material print.
|
// Filament preset names for a multi-extruder or multi-material print.
|
||||||
// extruders.size() should be the same as printers.get_edited_preset().config.nozzle_diameter.size()
|
// extruders.size() should be the same as printers.get_edited_preset().config.nozzle_diameter.size()
|
||||||
|
@ -144,6 +146,8 @@ private:
|
||||||
std::string load_system_presets();
|
std::string load_system_presets();
|
||||||
// Merge one vendor's presets with the other vendor's presets, report duplicates.
|
// Merge one vendor's presets with the other vendor's presets, report duplicates.
|
||||||
std::vector<std::string> merge_presets(PresetBundle &&other);
|
std::vector<std::string> merge_presets(PresetBundle &&other);
|
||||||
|
// Update renamed_from and alias maps of system profiles.
|
||||||
|
void update_system_maps();
|
||||||
|
|
||||||
// Set the is_visible flag for filaments and sla materials,
|
// Set the is_visible flag for filaments and sla materials,
|
||||||
// apply defaults based on enabled printers when no filaments/materials are installed.
|
// apply defaults based on enabled printers when no filaments/materials are installed.
|
||||||
|
|
|
@ -56,7 +56,7 @@ std::vector<DriveData> RemovableDriveManager::search_for_removable_drives() cons
|
||||||
volume_name.erase(volume_name.begin() + wcslen(volume_name.c_str()), volume_name.end());
|
volume_name.erase(volume_name.begin() + wcslen(volume_name.c_str()), volume_name.end());
|
||||||
if (! file_system_name.empty()) {
|
if (! file_system_name.empty()) {
|
||||||
ULARGE_INTEGER free_space;
|
ULARGE_INTEGER free_space;
|
||||||
::GetDiskFreeSpaceExA(path.c_str(), &free_space, nullptr, nullptr);
|
::GetDiskFreeSpaceExW(wpath.c_str(), &free_space, nullptr, nullptr);
|
||||||
if (free_space.QuadPart > 0) {
|
if (free_space.QuadPart > 0) {
|
||||||
path += "\\";
|
path += "\\";
|
||||||
current_drives.emplace_back(DriveData{ boost::nowide::narrow(volume_name), path });
|
current_drives.emplace_back(DriveData{ boost::nowide::narrow(volume_name), path });
|
||||||
|
@ -86,9 +86,12 @@ void RemovableDriveManager::eject_drive()
|
||||||
// get handle to device
|
// get handle to device
|
||||||
std::string mpath = "\\\\.\\" + m_last_save_path;
|
std::string mpath = "\\\\.\\" + m_last_save_path;
|
||||||
mpath = mpath.substr(0, mpath.size() - 1);
|
mpath = mpath.substr(0, mpath.size() - 1);
|
||||||
HANDLE handle = CreateFileA(mpath.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr);
|
HANDLE handle = CreateFileW(boost::nowide::widen(mpath).c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr);
|
||||||
if (handle == INVALID_HANDLE_VALUE) {
|
if (handle == INVALID_HANDLE_VALUE) {
|
||||||
std::cerr << "Ejecting " << mpath << " failed " << GetLastError() << " \n";
|
std::cerr << "Ejecting " << mpath << " failed " << GetLastError() << " \n";
|
||||||
|
assert(m_callback_evt_handler);
|
||||||
|
if (m_callback_evt_handler)
|
||||||
|
wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::pair<DriveData, bool>(*it_drive_data, false)));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DWORD deviceControlRetVal(0);
|
DWORD deviceControlRetVal(0);
|
||||||
|
@ -101,12 +104,15 @@ void RemovableDriveManager::eject_drive()
|
||||||
if (error == 0) {
|
if (error == 0) {
|
||||||
CloseHandle(handle);
|
CloseHandle(handle);
|
||||||
BOOST_LOG_TRIVIAL(error) << "Ejecting " << mpath << " failed " << deviceControlRetVal << " " << GetLastError() << " \n";
|
BOOST_LOG_TRIVIAL(error) << "Ejecting " << mpath << " failed " << deviceControlRetVal << " " << GetLastError() << " \n";
|
||||||
|
assert(m_callback_evt_handler);
|
||||||
|
if (m_callback_evt_handler)
|
||||||
|
wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::pair<DriveData, bool>(*it_drive_data, false)));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
CloseHandle(handle);
|
CloseHandle(handle);
|
||||||
assert(m_callback_evt_handler);
|
assert(m_callback_evt_handler);
|
||||||
if (m_callback_evt_handler)
|
if (m_callback_evt_handler)
|
||||||
wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::move(*it_drive_data)));
|
wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::pair< DriveData, bool >(std::move(*it_drive_data), true)));
|
||||||
m_current_drives.erase(it_drive_data);
|
m_current_drives.erase(it_drive_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -122,7 +128,7 @@ std::string RemovableDriveManager::get_removable_drive_path(const std::string &p
|
||||||
return std::string();
|
return std::string();
|
||||||
std::size_t found = path.find_last_of("\\");
|
std::size_t found = path.find_last_of("\\");
|
||||||
std::string new_path = path.substr(0, found);
|
std::string new_path = path.substr(0, found);
|
||||||
int letter = PathGetDriveNumberA(new_path.c_str());
|
int letter = PathGetDriveNumberW(boost::nowide::widen(new_path).c_str());
|
||||||
for (const DriveData &drive_data : m_current_drives) {
|
for (const DriveData &drive_data : m_current_drives) {
|
||||||
char drive = drive_data.path[0];
|
char drive = drive_data.path[0];
|
||||||
if (drive == 'A' + letter)
|
if (drive == 'A' + letter)
|
||||||
|
@ -136,7 +142,7 @@ std::string RemovableDriveManager::get_removable_drive_from_path(const std::stri
|
||||||
tbb::mutex::scoped_lock lock(m_drives_mutex);
|
tbb::mutex::scoped_lock lock(m_drives_mutex);
|
||||||
std::size_t found = path.find_last_of("\\");
|
std::size_t found = path.find_last_of("\\");
|
||||||
std::string new_path = path.substr(0, found);
|
std::string new_path = path.substr(0, found);
|
||||||
int letter = PathGetDriveNumberA(new_path.c_str());
|
int letter = PathGetDriveNumberW(boost::nowide::widen(new_path).c_str());
|
||||||
for (const DriveData &drive_data : m_current_drives) {
|
for (const DriveData &drive_data : m_current_drives) {
|
||||||
assert(! drive_data.path.empty());
|
assert(! drive_data.path.empty());
|
||||||
if (drive_data.path.front() == 'A' + letter)
|
if (drive_data.path.front() == 'A' + letter)
|
||||||
|
@ -145,93 +151,16 @@ std::string RemovableDriveManager::get_removable_drive_from_path(const std::stri
|
||||||
return std::string();
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
// Called by Win32 Volume arrived / detached callback.
|
||||||
// currently not used, left for possible future use
|
void RemovableDriveManager::volumes_changed()
|
||||||
INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
||||||
{
|
{
|
||||||
// here we need to catch messeges about device removal
|
if (m_initialized) {
|
||||||
// problem is that when ejecting usb (how is it implemented above) there is no messege dispached. Only after physical removal of the device.
|
// Signal the worker thread to wake up and enumerate removable drives.
|
||||||
//uncomment register_window() in init() to register and comment update() in GUI_App.cpp (only for windows!) to stop recieving periodical updates
|
m_wakeup = true;
|
||||||
|
m_thread_stop_condition.notify_all();
|
||||||
LRESULT lRet = 1;
|
|
||||||
static HDEVNOTIFY hDeviceNotify;
|
|
||||||
static constexpr GUID WceusbshGUID = { 0x25dbce51, 0x6c8f, 0x4a72, 0x8a,0x6d,0xb5,0x4c,0x2b,0x4f,0xc8,0x35 };
|
|
||||||
|
|
||||||
switch (message)
|
|
||||||
{
|
|
||||||
case WM_CREATE:
|
|
||||||
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
|
|
||||||
|
|
||||||
ZeroMemory(&NotificationFilter, sizeof(NotificationFilter));
|
|
||||||
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
|
|
||||||
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
|
|
||||||
NotificationFilter.dbcc_classguid = WceusbshGUID;
|
|
||||||
|
|
||||||
hDeviceNotify = RegisterDeviceNotification(hWnd, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_DEVICECHANGE:
|
|
||||||
{
|
|
||||||
// here is the important
|
|
||||||
if(wParam == DBT_DEVICEREMOVECOMPLETE)
|
|
||||||
{
|
|
||||||
RemovableDriveManager::get_instance().update(0, true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// Send all other messages on to the default windows handler.
|
|
||||||
lRet = DefWindowProc(hWnd, message, wParam, lParam);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return lRet;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemovableDriveManager::register_window()
|
|
||||||
{
|
|
||||||
//creates new unvisible window that is recieving callbacks from system
|
|
||||||
// structure to register
|
|
||||||
// currently not used, left for possible future use
|
|
||||||
WNDCLASSEX wndClass;
|
|
||||||
wndClass.cbSize = sizeof(WNDCLASSEX);
|
|
||||||
wndClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
|
|
||||||
wndClass.hInstance = reinterpret_cast<HINSTANCE>(GetModuleHandle(0));
|
|
||||||
wndClass.lpfnWndProc = reinterpret_cast<WNDPROC>(WinProcCallback);//this is callback
|
|
||||||
wndClass.cbClsExtra = 0;
|
|
||||||
wndClass.cbWndExtra = 0;
|
|
||||||
wndClass.hIcon = LoadIcon(0, IDI_APPLICATION);
|
|
||||||
wndClass.hbrBackground = CreateSolidBrush(RGB(192, 192, 192));
|
|
||||||
wndClass.hCursor = LoadCursor(0, IDC_ARROW);
|
|
||||||
wndClass.lpszClassName = L"PrusaSlicer_aux_class";
|
|
||||||
wndClass.lpszMenuName = NULL;
|
|
||||||
wndClass.hIconSm = wndClass.hIcon;
|
|
||||||
if(!RegisterClassEx(&wndClass))
|
|
||||||
{
|
|
||||||
DWORD err = GetLastError();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
HWND hWnd = CreateWindowEx(
|
|
||||||
WS_EX_NOACTIVATE,
|
|
||||||
L"PrusaSlicer_aux_class",
|
|
||||||
L"PrusaSlicer_aux_wnd",
|
|
||||||
WS_DISABLED, // style
|
|
||||||
CW_USEDEFAULT, 0,
|
|
||||||
640, 480,
|
|
||||||
NULL, NULL,
|
|
||||||
GetModuleHandle(NULL),
|
|
||||||
NULL);
|
|
||||||
if(hWnd == NULL)
|
|
||||||
{
|
|
||||||
DWORD err = GetLastError();
|
|
||||||
}
|
|
||||||
//ShowWindow(hWnd, SW_SHOWNORMAL);
|
|
||||||
UpdateWindow(hWnd);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
namespace search_for_drives_internal
|
namespace search_for_drives_internal
|
||||||
|
@ -358,16 +287,18 @@ void RemovableDriveManager::eject_drive()
|
||||||
// wait for command to finnish (blocks ui thread)
|
// wait for command to finnish (blocks ui thread)
|
||||||
child.wait();
|
child.wait();
|
||||||
int err = child.exit_code();
|
int err = child.exit_code();
|
||||||
if(err)
|
if (err) {
|
||||||
{
|
|
||||||
BOOST_LOG_TRIVIAL(error) << "Ejecting failed";
|
BOOST_LOG_TRIVIAL(error) << "Ejecting failed";
|
||||||
|
assert(m_callback_evt_handler);
|
||||||
|
if (m_callback_evt_handler)
|
||||||
|
wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::pair<DriveData, bool>(*it_drive_data, false)));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
BOOST_LOG_TRIVIAL(info) << "Ejecting finished";
|
BOOST_LOG_TRIVIAL(info) << "Ejecting finished";
|
||||||
|
|
||||||
assert(m_callback_evt_handler);
|
assert(m_callback_evt_handler);
|
||||||
if (m_callback_evt_handler)
|
if (m_callback_evt_handler)
|
||||||
wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::move(*it_drive_data)));
|
wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::pair<DriveData, bool>(std::move(*it_drive_data), true)));
|
||||||
m_current_drives.erase(it_drive_data);
|
m_current_drives.erase(it_drive_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -416,9 +347,7 @@ void RemovableDriveManager::init(wxEvtHandler *callback_evt_handler)
|
||||||
m_initialized = true;
|
m_initialized = true;
|
||||||
m_callback_evt_handler = callback_evt_handler;
|
m_callback_evt_handler = callback_evt_handler;
|
||||||
|
|
||||||
#if _WIN32
|
#if __APPLE__
|
||||||
//this->register_window_msw();
|
|
||||||
#elif __APPLE__
|
|
||||||
this->register_window_osx();
|
this->register_window_osx();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -432,6 +361,10 @@ void RemovableDriveManager::init(wxEvtHandler *callback_evt_handler)
|
||||||
|
|
||||||
void RemovableDriveManager::shutdown()
|
void RemovableDriveManager::shutdown()
|
||||||
{
|
{
|
||||||
|
#if __APPLE__
|
||||||
|
this->unregister_window_osx();
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
|
#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
|
||||||
if (m_thread.joinable()) {
|
if (m_thread.joinable()) {
|
||||||
// Stop the worker thread, if running.
|
// Stop the worker thread, if running.
|
||||||
|
@ -447,12 +380,6 @@ void RemovableDriveManager::shutdown()
|
||||||
}
|
}
|
||||||
#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
|
#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
|
||||||
|
|
||||||
#if _WIN32
|
|
||||||
//this->unregister_window_msw();
|
|
||||||
#elif __APPLE__
|
|
||||||
this->unregister_window_osx();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
m_initialized = false;
|
m_initialized = false;
|
||||||
m_callback_evt_handler = nullptr;
|
m_callback_evt_handler = nullptr;
|
||||||
}
|
}
|
||||||
|
@ -469,9 +396,6 @@ bool RemovableDriveManager::set_and_verify_last_save_path(const std::string &pat
|
||||||
|
|
||||||
RemovableDriveManager::RemovableDrivesStatus RemovableDriveManager::status()
|
RemovableDriveManager::RemovableDrivesStatus RemovableDriveManager::status()
|
||||||
{
|
{
|
||||||
#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
|
|
||||||
this->update();
|
|
||||||
#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
|
|
||||||
|
|
||||||
RemovableDriveManager::RemovableDrivesStatus out;
|
RemovableDriveManager::RemovableDrivesStatus out;
|
||||||
{
|
{
|
||||||
|
@ -487,28 +411,56 @@ RemovableDriveManager::RemovableDrivesStatus RemovableDriveManager::status()
|
||||||
// Update is called from thread_proc() and from most of the public methods on demand.
|
// Update is called from thread_proc() and from most of the public methods on demand.
|
||||||
void RemovableDriveManager::update()
|
void RemovableDriveManager::update()
|
||||||
{
|
{
|
||||||
std::vector<DriveData> current_drives = this->search_for_removable_drives();
|
tbb::mutex::scoped_lock inside_update_lock;
|
||||||
|
#ifdef _WIN32
|
||||||
// Post update events.
|
// All wake up calls up to now are now consumed when the drive enumeration starts.
|
||||||
tbb::mutex::scoped_lock lock(m_drives_mutex);
|
m_wakeup = false;
|
||||||
std::sort(current_drives.begin(), current_drives.end());
|
#endif // _WIN32
|
||||||
if (current_drives != m_current_drives) {
|
if (inside_update_lock.try_acquire(m_inside_update_mutex)) {
|
||||||
assert(m_callback_evt_handler);
|
// Got the lock without waiting. That means, the update was not running.
|
||||||
if (m_callback_evt_handler)
|
// Run the update.
|
||||||
wxPostEvent(m_callback_evt_handler, RemovableDrivesChangedEvent(EVT_REMOVABLE_DRIVES_CHANGED));
|
std::vector<DriveData> current_drives = this->search_for_removable_drives();
|
||||||
|
// Post update events.
|
||||||
|
tbb::mutex::scoped_lock lock(m_drives_mutex);
|
||||||
|
std::sort(current_drives.begin(), current_drives.end());
|
||||||
|
if (current_drives != m_current_drives) {
|
||||||
|
assert(m_callback_evt_handler);
|
||||||
|
if (m_callback_evt_handler)
|
||||||
|
wxPostEvent(m_callback_evt_handler, RemovableDrivesChangedEvent(EVT_REMOVABLE_DRIVES_CHANGED));
|
||||||
|
}
|
||||||
|
m_current_drives = std::move(current_drives);
|
||||||
|
} else {
|
||||||
|
// Acquiring the m_iniside_update lock failed, therefore another update is running.
|
||||||
|
// Just block until the other instance of update() finishes.
|
||||||
|
inside_update_lock.acquire(m_inside_update_mutex);
|
||||||
}
|
}
|
||||||
m_current_drives = std::move(current_drives);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
|
#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
|
||||||
void RemovableDriveManager::thread_proc()
|
void RemovableDriveManager::thread_proc()
|
||||||
{
|
{
|
||||||
|
// Signal the worker thread to update initially.
|
||||||
|
#ifdef _WIN32
|
||||||
|
m_wakeup = true;
|
||||||
|
#endif // _WIN32
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
// Wait for 2 seconds before running the disk enumeration.
|
// Wait for 2 seconds before running the disk enumeration.
|
||||||
// Cancellable.
|
// Cancellable.
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lck(m_thread_stop_mutex);
|
std::unique_lock<std::mutex> lck(m_thread_stop_mutex);
|
||||||
|
#ifdef _WIN32
|
||||||
|
// Windows do not send an update on insert / eject of an SD card into an external SD card reader.
|
||||||
|
// Windows also do not send an update on software eject of a FLASH drive.
|
||||||
|
// We can likely use the Windows WMI API, but it will be quite time consuming to implement.
|
||||||
|
// https://www.codeproject.com/Articles/10539/Making-WMI-Queries-In-C
|
||||||
|
// https://docs.microsoft.com/en-us/windows/win32/wmisdk/wmi-start-page
|
||||||
|
// https://docs.microsoft.com/en-us/windows/win32/wmisdk/com-api-for-wmi
|
||||||
|
// https://docs.microsoft.com/en-us/windows/win32/wmisdk/example--receiving-event-notifications-through-wmi-
|
||||||
|
m_thread_stop_condition.wait_for(lck, std::chrono::seconds(2), [this]{ return m_stop || m_wakeup; });
|
||||||
|
#else
|
||||||
m_thread_stop_condition.wait_for(lck, std::chrono::seconds(2), [this]{ return m_stop; });
|
m_thread_stop_condition.wait_for(lck, std::chrono::seconds(2), [this]{ return m_stop; });
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
if (m_stop)
|
if (m_stop)
|
||||||
// Stop the worker thread.
|
// Stop the worker thread.
|
||||||
|
|
|
@ -32,7 +32,7 @@ inline bool operator< (const DriveData &lhs, const DriveData &rhs) { return lhs.
|
||||||
inline bool operator> (const DriveData &lhs, const DriveData &rhs) { return lhs.path > rhs.path; }
|
inline bool operator> (const DriveData &lhs, const DriveData &rhs) { return lhs.path > rhs.path; }
|
||||||
inline bool operator==(const DriveData &lhs, const DriveData &rhs) { return lhs.path == rhs.path; }
|
inline bool operator==(const DriveData &lhs, const DriveData &rhs) { return lhs.path == rhs.path; }
|
||||||
|
|
||||||
using RemovableDriveEjectEvent = Event<DriveData>;
|
using RemovableDriveEjectEvent = Event<std::pair<DriveData, bool>>;
|
||||||
wxDECLARE_EVENT(EVT_REMOVABLE_DRIVE_EJECTED, RemovableDriveEjectEvent);
|
wxDECLARE_EVENT(EVT_REMOVABLE_DRIVE_EJECTED, RemovableDriveEjectEvent);
|
||||||
|
|
||||||
using RemovableDrivesChangedEvent = SimpleEvent;
|
using RemovableDrivesChangedEvent = SimpleEvent;
|
||||||
|
@ -69,6 +69,8 @@ public:
|
||||||
// On Windows, the function does not block, and the eject is detected in the background thread.
|
// On Windows, the function does not block, and the eject is detected in the background thread.
|
||||||
void eject_drive();
|
void eject_drive();
|
||||||
|
|
||||||
|
// Status is used to retrieve info for showing UI buttons.
|
||||||
|
// Status is called every time when change of UI buttons is possible therefore should not perform update.
|
||||||
struct RemovableDrivesStatus {
|
struct RemovableDrivesStatus {
|
||||||
bool has_removable_drives { false };
|
bool has_removable_drives { false };
|
||||||
bool has_eject { false };
|
bool has_eject { false };
|
||||||
|
@ -82,6 +84,11 @@ public:
|
||||||
// It would be better to make this method private and friend to RemovableDriveManagerMM, but RemovableDriveManagerMM is an ObjectiveC class.
|
// It would be better to make this method private and friend to RemovableDriveManagerMM, but RemovableDriveManagerMM is an ObjectiveC class.
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
// Called by Win32 Volume arrived / detached callback.
|
||||||
|
void volumes_changed();
|
||||||
|
#endif // _WIN32
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_initialized { false };
|
bool m_initialized { false };
|
||||||
wxEvtHandler* m_callback_evt_handler { nullptr };
|
wxEvtHandler* m_callback_evt_handler { nullptr };
|
||||||
|
@ -93,6 +100,9 @@ private:
|
||||||
std::condition_variable m_thread_stop_condition;
|
std::condition_variable m_thread_stop_condition;
|
||||||
mutable std::mutex m_thread_stop_mutex;
|
mutable std::mutex m_thread_stop_mutex;
|
||||||
bool m_stop { false };
|
bool m_stop { false };
|
||||||
|
#ifdef _WIN32
|
||||||
|
std::atomic<bool> m_wakeup { false };
|
||||||
|
#endif /* _WIN32 */
|
||||||
#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
|
#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
|
||||||
|
|
||||||
// Called from update() to enumerate removable drives.
|
// Called from update() to enumerate removable drives.
|
||||||
|
@ -102,6 +112,8 @@ private:
|
||||||
// sorted ascending by path
|
// sorted ascending by path
|
||||||
std::vector<DriveData> m_current_drives;
|
std::vector<DriveData> m_current_drives;
|
||||||
mutable tbb::mutex m_drives_mutex;
|
mutable tbb::mutex m_drives_mutex;
|
||||||
|
// Locking the update() function to avoid that the function is executed multiple times.
|
||||||
|
mutable tbb::mutex m_inside_update_mutex;
|
||||||
|
|
||||||
// Returns drive path (same as path in DriveData) if exists otherwise empty string.
|
// Returns drive path (same as path in DriveData) if exists otherwise empty string.
|
||||||
std::string get_removable_drive_from_path(const std::string& path);
|
std::string get_removable_drive_from_path(const std::string& path);
|
||||||
|
@ -110,10 +122,7 @@ private:
|
||||||
// Set with set_and_verify_last_save_path() to a removable drive path to be ejected.
|
// Set with set_and_verify_last_save_path() to a removable drive path to be ejected.
|
||||||
std::string m_last_save_path;
|
std::string m_last_save_path;
|
||||||
|
|
||||||
#if _WIN32
|
#if __APPLE__
|
||||||
//registers for notifications by creating invisible window
|
|
||||||
//void register_window_msw();
|
|
||||||
#elif __APPLE__
|
|
||||||
void register_window_osx();
|
void register_window_osx();
|
||||||
void unregister_window_osx();
|
void unregister_window_osx();
|
||||||
void list_devices(std::vector<DriveData> &out) const;
|
void list_devices(std::vector<DriveData> &out) const;
|
||||||
|
|
|
@ -1172,6 +1172,7 @@ void TabPrint::build()
|
||||||
optgroup->append_single_option_line("skirts");
|
optgroup->append_single_option_line("skirts");
|
||||||
optgroup->append_single_option_line("skirt_distance");
|
optgroup->append_single_option_line("skirt_distance");
|
||||||
optgroup->append_single_option_line("skirt_height");
|
optgroup->append_single_option_line("skirt_height");
|
||||||
|
optgroup->append_single_option_line("draft_shield");
|
||||||
optgroup->append_single_option_line("min_skirt_length");
|
optgroup->append_single_option_line("min_skirt_length");
|
||||||
|
|
||||||
optgroup = page->new_optgroup(_(L("Brim")));
|
optgroup = page->new_optgroup(_(L("Brim")));
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
set(SLIC3R_APP_NAME "PrusaSlicer")
|
set(SLIC3R_APP_NAME "PrusaSlicer")
|
||||||
set(SLIC3R_APP_KEY "PrusaSlicer")
|
set(SLIC3R_APP_KEY "PrusaSlicer")
|
||||||
set(SLIC3R_VERSION "2.2.0-rc3")
|
set(SLIC3R_VERSION "2.2.0-rc4")
|
||||||
set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN")
|
set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN")
|
||||||
set(SLIC3R_RC_VERSION "2,2,0,0")
|
set(SLIC3R_RC_VERSION "2,2,0,0")
|
||||||
set(SLIC3R_RC_VERSION_DOTS "2.2.0.0")
|
set(SLIC3R_RC_VERSION_DOTS "2.2.0.0")
|
||||||
|
|